#!/usr/bin/env php
<?php

/*
 * Generated by Humbug Box 4.6.7@190d527.
 *
 * @link https://github.com/humbug/box
 */

Phar::mapPhar('box-auto-generated-alias-d9806f438d9e.phar');

require 'phar://box-auto-generated-alias-d9806f438d9e.phar/.box/bin/check-requirements.php';

$_SERVER['SCRIPT_FILENAME'] = 'phar://box-auto-generated-alias-d9806f438d9e.phar/bin/acli';
require 'phar://box-auto-generated-alias-d9806f438d9e.phar/bin/acli';

__HALT_COMPILER(); ?>
 @              !   vendor/clue/stream-filter/LICENSE:      :  2IF      3   vendor/clue/stream-filter/src/functions_include.php                +   vendor/clue/stream-filter/src/functions.php
      
  ޤ      0   vendor/clue/stream-filter/src/CallbackFilter.php        7ڤ      !   vendor/composer/autoload_real.php              !   vendor/composer/autoload_psr4.phpf      f  zD      #   vendor/composer/autoload_static.php      T8         vendor/composer/LICENSE.      .         "   vendor/composer/autoload_files.php0'      0'  
դ      !   vendor/composer/ca-bundle/LICENSE        *!^`      (   vendor/composer/ca-bundle/res/cacert.pemOz     Oz %ߤ      *   vendor/composer/ca-bundle/src/CaBundle.php>      >  <         vendor/composer/ClassLoader.php?      ?  2@u      '   vendor/composer/autoload_namespaces.php        v2         vendor/composer/installed.phpk      k  Q=      "   vendor/composer/platform_check.php        "J      %   vendor/composer/autoload_classmap.php@     @ Ӏ겤      %   vendor/composer/InstalledVersions.php                 vendor/composer/installed.json;     ; ዅ         vendor/composer/semver/LICENSE        Bh      '   vendor/composer/semver/src/Interval.php        =[i      /   vendor/composer/semver/src/CompilingMatcher.php        9`      (   vendor/composer/semver/src/Intervals.php,      ,  "T      ,   vendor/composer/semver/src/VersionParser.php&.      &.  
X      %   vendor/composer/semver/src/Semver.php        -i      )   vendor/composer/semver/src/Comparator.php#      #  *A      4   vendor/composer/semver/src/Constraint/Constraint.php        3l      /   vendor/composer/semver/src/Constraint/Bound.phpw      w  W4]W      9   vendor/composer/semver/src/Constraint/MultiConstraint.php        x      <   vendor/composer/semver/src/Constraint/MatchAllConstraint.php        E      =   vendor/composer/semver/src/Constraint/MatchNoneConstraint.php        ֯خ      =   vendor/composer/semver/src/Constraint/ConstraintInterface.php        "E         vendor/guzzlehttp/psr7/LICENSEz      z  ^pL      ,   vendor/guzzlehttp/psr7/src/InflateStream.php	      	  -`      $   vendor/guzzlehttp/psr7/src/Utils.php        a      '   vendor/guzzlehttp/psr7/src/MimeType.php>      >  g      .   vendor/guzzlehttp/psr7/src/MultipartStream.phpg      g  6      +   vendor/guzzlehttp/psr7/src/UploadedFile.phpc      c  ԆPu      &   vendor/guzzlehttp/psr7/src/Request.php	      	  p8      *   vendor/guzzlehttp/psr7/src/UriResolver.php        F2I      *   vendor/guzzlehttp/psr7/src/HttpFactory.php	      	        "   vendor/guzzlehttp/psr7/src/Uri.php,      ,  M>      ,   vendor/guzzlehttp/psr7/src/ServerRequest.php        Qq      '   vendor/guzzlehttp/psr7/src/FnStream.phpy	      y	  &      %   vendor/guzzlehttp/psr7/src/Header.phpx      x  J0      *   vendor/guzzlehttp/psr7/src/LimitStream.php        : t      +   vendor/guzzlehttp/psr7/src/MessageTrait.php        YP      $   vendor/guzzlehttp/psr7/src/Query.phpi      i  z      -   vendor/guzzlehttp/psr7/src/LazyOpenStream.php
      
  /^      )   vendor/guzzlehttp/psr7/src/PumpStream.php+	      +	  @      '   vendor/guzzlehttp/psr7/src/Response.phpL      L  =w      %   vendor/guzzlehttp/psr7/src/Stream.php        BA      &   vendor/guzzlehttp/psr7/src/Message.php
      
  ~]      -   vendor/guzzlehttp/psr7/src/DroppingStream.phpk      k  C ?      >   vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php          }ۤ      +   vendor/guzzlehttp/psr7/src/NoSeekStream.phpz      z  Z*      ,   vendor/guzzlehttp/psr7/src/UriComparator.php        yפ      ,   vendor/guzzlehttp/psr7/src/UriNormalizer.php        oi      +   vendor/guzzlehttp/psr7/src/AppendStream.php        .G      3   vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php        N+      ,   vendor/guzzlehttp/psr7/src/CachingStream.php*	      *	  SqK      ,   vendor/guzzlehttp/psr7/src/StreamWrapper.php	      	  EVz      &   vendor/guzzlehttp/psr7/src/Rfc7230.php        \!      +   vendor/guzzlehttp/psr7/src/BufferStream.php        Y)~      "   vendor/guzzlehttp/promises/LICENSE        z*/      *   vendor/guzzlehttp/promises/src/Promise.php        6      (   vendor/guzzlehttp/promises/src/Utils.php        g5      3   vendor/guzzlehttp/promises/src/FulfilledPromise.php7      7  Ia偤      %   vendor/guzzlehttp/promises/src/Is.phpd      d  {G      2   vendor/guzzlehttp/promises/src/RejectedPromise.phpa      a  $Rͤ      8   vendor/guzzlehttp/promises/src/CancellationException.php~       ~         5   vendor/guzzlehttp/promises/src/RejectionException.php        6(.      .   vendor/guzzlehttp/promises/src/EachPromise.php        NP~      5   vendor/guzzlehttp/promises/src/TaskQueueInterface.php                ,   vendor/guzzlehttp/promises/src/Coroutine.php>      >  #@      5   vendor/guzzlehttp/promises/src/AggregateException.php        RY9y      3   vendor/guzzlehttp/promises/src/PromiseInterface.phpw      w  HS      ,   vendor/guzzlehttp/promises/src/TaskQueue.php        #r      )   vendor/guzzlehttp/promises/src/Create.phpT      T  c      4   vendor/guzzlehttp/promises/src/PromisorInterface.php          1R      '   vendor/guzzlehttp/promises/src/Each.php        zF      *   vendor/guzzlehttp/guzzle/package-lock.jsonC       C   Jε          vendor/guzzlehttp/guzzle/LICENSE        Շ      -   vendor/guzzlehttp/guzzle/src/HandlerStack.php{      {  dE      &   vendor/guzzlehttp/guzzle/src/Utils.php	      	  N       2   vendor/guzzlehttp/guzzle/src/functions_include.phpa       a   ޤ      1   vendor/guzzlehttp/guzzle/src/MessageFormatter.php.      .  QCy      *   vendor/guzzlehttp/guzzle/src/functions.phpv      v  :      '   vendor/guzzlehttp/guzzle/src/Client.php.%      .%  f      6   vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php        m?ž      1   vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php        m      1   vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php        h      :   vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php        Xz      8   vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php        t      5   vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php7      7  s\G      .   vendor/guzzlehttp/guzzle/src/TransferStats.php6      6  o      /   vendor/guzzlehttp/guzzle/src/RequestOptions.php        4%      /   vendor/guzzlehttp/guzzle/src/BodySummarizer.php        'HfV      ,   vendor/guzzlehttp/guzzle/src/ClientTrait.php              0   vendor/guzzlehttp/guzzle/src/RetryMiddleware.php        =d      3   vendor/guzzlehttp/guzzle/src/RedirectMiddleware.phpy      y  $t      .   vendor/guzzlehttp/guzzle/src/Handler/Proxy.php%      %  o      6   vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php7      7  w      3   vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php        g,      =   vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php          Yۤ      4   vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.phpE      E  ]10      4   vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php        zؘ      8   vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php        AN      4   vendor/guzzlehttp/guzzle/src/Handler/MockHandler.phpH      H  BY      9   vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php        ?      :   vendor/guzzlehttp/guzzle/src/Exception/ServerException.phpb       b   mx      D   vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.phpe       e   $       ;   vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php        B?'      C   vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php          co      ;   vendor/guzzlehttp/guzzle/src/Exception/RequestException.phph	      h	        ?   vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php9      9  IӤ      <   vendor/guzzlehttp/guzzle/src/Exception/TransferException.phpy       y   /      :   vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php          5O\$      :   vendor/guzzlehttp/guzzle/src/Exception/ClientException.phpb       b   yʤ      +   vendor/guzzlehttp/guzzle/src/Middleware.php        1      :   vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php        Q      0   vendor/guzzlehttp/guzzle/src/ClientInterface.php        q      %   vendor/guzzlehttp/guzzle/src/Pool.php        q      8   vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php          xD[      "   vendor/loophp/phposinfo/rector.php        3&Ƥ         vendor/loophp/phposinfo/LICENSE9      9  _      %   vendor/loophp/phposinfo/renovate.json\       \   !%      /   vendor/loophp/phposinfo/src/OsInfoInterface.php        $Z*      &   vendor/loophp/phposinfo/src/OsInfo.phpz      z  TL      '   vendor/loophp/phposinfo/src/Enum/Os.php        1      )   vendor/loophp/phposinfo/src/Enum/Enum.phpw      w  V{      +   vendor/loophp/phposinfo/src/Enum/Family.php,      ,  D      +   vendor/loophp/phposinfo/src/Enum/OsName.php        F%c      /   vendor/loophp/phposinfo/src/Enum/FamilyName.phpC      C        0   vendor/consolidation/self-update/scripts/releaseQ      Q        (   vendor/consolidation/self-update/LICENSEW      W  !      :   vendor/consolidation/self-update/src/SelfUpdateManager.php              :   vendor/consolidation/self-update/src/SelfUpdateCommand.php        )¤      /   vendor/http-interop/http-factory-guzzle/LICENSE5      5        ?   vendor/http-interop/http-factory-guzzle/src/ResponseFactory.phpy      y  y!n      D   vendor/http-interop/http-factory-guzzle/src/ServerRequestFactory.phpq      q  )iP      >   vendor/http-interop/http-factory-guzzle/src/RequestFactory.phpC      C  g_<      C   vendor/http-interop/http-factory-guzzle/src/UploadedFileFactory.phpe      e  !      :   vendor/http-interop/http-factory-guzzle/src/UriFactory.php        qN      =   vendor/http-interop/http-factory-guzzle/src/StreamFactory.phpc      c  JzA      )   vendor/typhonius/acquia-logstream/LICENSE,      ,  YZ<      :   vendor/typhonius/acquia-logstream/src/LogstreamCommand.phpb      b  n	      :   vendor/typhonius/acquia-logstream/src/LogstreamManager.php        Hq      )   vendor/typhonius/acquia-logstream/VERSION          *ec      /   vendor/typhonius/acquia-logstream/bin/logstream                3   vendor/typhonius/acquia-logstream/bin/logstream.phpw      w  \e      *   vendor/typhonius/acquia-php-sdk-v2/LICENSE,      ,   !!       .   vendor/typhonius/acquia-php-sdk-v2/_config.yml          63䔤      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightCountResponse.php        U:      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/LogstreamResponse.php          %ɤ      D   vendor/typhonius/acquia-php-sdk-v2/src/Response/CodebaseResponse.php        uY      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/TeamResponse.php        V       H   vendor/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentsResponse.phpK      K  3\      L   vendor/typhonius/acquia-php-sdk-v2/src/Response/IdentityProviderResponse.phpY      Y  t      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/ServersResponse.php-      -  +Ut      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/IdesResponse.php        N      K   vendor/typhonius/acquia-php-sdk-v2/src/Response/SslCertificatesResponse.phpQ      Q  Bm      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightResponse.phph      h  eh      G   vendor/typhonius/acquia-php-sdk-v2/src/Response/ApplicationResponse.php        	&      ?   vendor/typhonius/acquia-php-sdk-v2/src/Response/TagResponse.php>      >  8      G   vendor/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentResponse.phpK      K  k-      ?   vendor/typhonius/acquia-php-sdk-v2/src/Response/LogResponse.php8      8  &}B      P   vendor/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentsResponse.phpl      l  N*      A   vendor/typhonius/acquia-php-sdk-v2/src/Response/RolesResponse.php!      !  Yx¸      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/SiteResponse.php        ~o      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNameResponse.php          [      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/CronResponse.php        Fw      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/AccountResponse.phpQ      Q  n      A   vendor/typhonius/acquia-php-sdk-v2/src/Response/SitesResponse.php2      2  _Md      V   vendor/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupResponse.phpl      l  ];      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/OperationResponse.php        1      G   vendor/typhonius/acquia-php-sdk-v2/src/Response/PermissionsResponse.phpE      E  4|ۤ      D   vendor/typhonius/acquia-php-sdk-v2/src/Response/DatabaseResponse.php              G   vendor/typhonius/acquia-php-sdk-v2/src/Response/InvitationsResponse.phpE      E  ))      W   vendor/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupsResponse.phpf      f  M>Ci      J   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightModulesResponse.php;      ;  G      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/BranchResponse.php          Fe      J   vendor/typhonius/acquia-php-sdk-v2/src/Response/SslCertificateResponse.php        Vl      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/OrganizationsResponse.phpQ      Q  4      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/NotificationResponse.phpO      O  p      U   vendor/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationsResponse.phpe      e  j      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertResponse.phpj      j  H8      F   vendor/typhonius/acquia-php-sdk-v2/src/Response/InvitationResponse.phpg      g  P      F   vendor/typhonius/acquia-php-sdk-v2/src/Response/ReferencesResponse.phpP      P  Sä      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/BackupsResponse.php>      >        @   vendor/typhonius/acquia-php-sdk-v2/src/Response/RoleResponse.php         dˤ      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/SshKeysResponse.php-      -  MF      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/DomainsResponse.php-      -  ٮ      F   vendor/typhonius/acquia-php-sdk-v2/src/Response/PermissionResponse.php              P   vendor/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseResponse.php\      \  c      A   vendor/typhonius/acquia-php-sdk-v2/src/Response/CronsResponse.php!      !  N      M   vendor/typhonius/acquia-php-sdk-v2/src/Response/IdentityProvidersResponse.php5      5  s      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/SshKeyResponse.php        @Ed      D   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightsResponse.php3      3  ]      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/MetricsResponse.php-      -  ?Τ      ?   vendor/typhonius/acquia-php-sdk-v2/src/Response/IdeResponse.php        b      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/NotificationsResponse.phpQ      Q  .%      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionResponse.phpy      y  4      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/ServerResponse.php        ʤ      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/VariablesResponse.php9      9  @M      O   vendor/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentResponse.php<      <  KX      C   vendor/typhonius/acquia-php-sdk-v2/src/Response/MembersResponse.php-      -  $ޤ      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceResponse.phpK      K  \0)      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionsResponse.phpQ      Q  .Զ      D   vendor/typhonius/acquia-php-sdk-v2/src/Response/VariableResponse.php              B   vendor/typhonius/acquia-php-sdk-v2/src/Response/DomainResponse.phpP      P  0      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/DatabasesResponse.php9      9  P      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightModuleResponse.php}      }  s      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/TagsResponse.php        z|5      A   vendor/typhonius/acquia-php-sdk-v2/src/Response/TeamsResponse.php!      !  *dU      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/OrganizationResponse.php\      \  Q{      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/BackupResponse.phpQ      Q  *=M      H   vendor/typhonius/acquia-php-sdk-v2/src/Response/ApplicationsResponse.php\      \  U      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNamesResponse.phpA      A  .2      J   vendor/typhonius/acquia-php-sdk-v2/src/Response/BulkCodeSwitchResponse.php        y      I   vendor/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertsResponse.php5      5  }      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/ReferenceResponse.php        j      T   vendor/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationResponse.php        b%      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/MetricResponse.php        	&6Ҥ      E   vendor/typhonius/acquia-php-sdk-v2/src/Response/CodebasesResponse.phps      s  {      @   vendor/typhonius/acquia-php-sdk-v2/src/Response/LogsResponse.php        We      D   vendor/typhonius/acquia-php-sdk-v2/src/Response/BranchesResponse.phpA      A  q"/      B   vendor/typhonius/acquia-php-sdk-v2/src/Response/MemberResponse.php        O^&      F   vendor/typhonius/acquia-php-sdk-v2/src/Exception/ApiErrorException.php'      '  m      G   vendor/typhonius/acquia-php-sdk-v2/src/Connector/ConnectorInterface.php        #HǤ      ;   vendor/typhonius/acquia-php-sdk-v2/src/Connector/Client.phpD      D  W      >   vendor/typhonius/acquia-php-sdk-v2/src/Connector/Connector.php,
      ,
  F      A   vendor/typhonius/acquia-php-sdk-v2/src/Connector/OktaProvider.php9      9  :H      D   vendor/typhonius/acquia-php-sdk-v2/src/Connector/ClientInterface.php        ^}      <   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/SshKeys.php        3      A   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Environments.php        .      D   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/SslCertificates.phpC      C         :   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Roles.php        Db}٤      B   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Notifications.php=      =  _      <   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Account.php        Oê      F   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/IdentityProviders.php        (      9   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Logs.php
      
  X%P      @   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Permissions.phpA      A  to      >   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Variables.php}      }  m0      A   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Applications.php        X̤      <   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Domains.php<      <  [      :   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Sites.php        }t٤      B   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Subscriptions.php)      )  fä      N   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/LogForwardingDestinations.phpf	      f	        :   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Crons.php$      $  zE      >   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Codebases.php        yy*      >   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Databases.php        9J      <   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Metrics.php        Y      A   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiBase.php        B1      9   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Ides.php!      !  [*L      B   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Organizations.php:      :  [      =   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Insights.php        S9      F   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiInterface.php          h      <   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Servers.phpI      I  ;      B   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/SiteInstances.php        S      9   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Code.php        d      :   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/Teams.php        &J      D   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/DatabaseBackups.php        >=}      I   vendor/typhonius/acquia-php-sdk-v2/src/Endpoints/CodebaseEnvironments.php,      ,  Lס      *   vendor/typhonius/acquia-php-sdk-v2/VERSION          ?V      "   vendor/zumba/amplitude-php/LICENSE0      0  to      (   vendor/zumba/amplitude-php/src/Event.php        }      ,   vendor/zumba/amplitude-php/src/Amplitude.php@      @  ȶ      ,   vendor/zumba/amplitude-php/src/Inflector.php        \      1   vendor/zumba/amplitude-php/test/InflectorTest.php        DO퀤      -   vendor/zumba/amplitude-php/test/EventTest.php{      {  Oa      1   vendor/zumba/amplitude-php/test/AmplitudeTest.php)      )  D!      /   vendor/kevinrob/guzzle-cache-middleware/LICENSE9      9  '      ?   vendor/kevinrob/guzzle-cache-middleware/src/CacheMiddleware.php        F"      I   vendor/kevinrob/guzzle-cache-middleware/src/Storage/Psr16CacheStorage.php        NKv      H   vendor/kevinrob/guzzle-cache-middleware/src/Storage/Psr6CacheStorage.phpm      m        V   vendor/kevinrob/guzzle-cache-middleware/src/Storage/CompressedDoctrineCacheStorage.php^      ^  ܆      M   vendor/kevinrob/guzzle-cache-middleware/src/Storage/CacheStorageInterface.php          LIT      S   vendor/kevinrob/guzzle-cache-middleware/src/Storage/WordPressObjectCacheStorage.php        qI      L   vendor/kevinrob/guzzle-cache-middleware/src/Storage/DoctrineCacheStorage.php:      :  L      H   vendor/kevinrob/guzzle-cache-middleware/src/Storage/FlysystemStorage.php        'b      K   vendor/kevinrob/guzzle-cache-middleware/src/Storage/LaravelCacheStorage.php`      `  Ù       N   vendor/kevinrob/guzzle-cache-middleware/src/Storage/VolatileRuntimeStorage.php        O      L   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/GreedyCacheStrategy.php
      
  q{      M   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/PrivateCacheStrategy.php.      .  Ebw      L   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/PublicCacheStrategy.php         [      J   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/NullCacheStrategy.php8      8  "Ԣ7      O   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/CacheStrategyInterface.php        jj      Y   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/RequestMatcherInterface.php                Y   vendor/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/DelegatingCacheStrategy.php        뤮      :   vendor/kevinrob/guzzle-cache-middleware/src/CacheEntry.php        <|      B   vendor/kevinrob/guzzle-cache-middleware/src/KeyValueHttpHeader.php>      >  ,qp      9   vendor/kevinrob/guzzle-cache-middleware/src/BodyStore.php        =.      2   vendor/kevinrob/guzzle-cache-middleware/bmc_qr.png=      =  !<      -   vendor/symfony/polyfill-intl-grapheme/LICENSE,      ,  H      2   vendor/symfony/polyfill-intl-grapheme/Grapheme.php        ǵ-      5   vendor/symfony/polyfill-intl-grapheme/bootstrap80.php<
      <
  NV=      3   vendor/symfony/polyfill-intl-grapheme/bootstrap.phpC      C  v_      (   vendor/symfony/polyfill-mbstring/LICENSE,      ,  H      0   vendor/symfony/polyfill-mbstring/bootstrap80.php%      %  o       F   vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php        y_      B   vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php              @   vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php8[      8[  +R*      @   vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpT      T  +      -   vendor/symfony/polyfill-mbstring/Mbstring.php^      ^  $ݝ-      .   vendor/symfony/polyfill-mbstring/bootstrap.phpm      m  O;      8   vendor/symfony/console/Question/ConfirmationQuestion.php	      	  5      2   vendor/symfony/console/Question/ChoiceQuestion.php;      ;        ,   vendor/symfony/console/Question/Question.php        ov      .   vendor/symfony/console/Attribute/AsCommand.php        3         vendor/symfony/console/LICENSE,      ,  U      (   vendor/symfony/console/ConsoleEvents.php        >cA      2   vendor/symfony/console/CI/GithubActionReporter.php        i      6   vendor/symfony/console/EventListener/ErrorListener.php"      "  	!Τ      8   vendor/symfony/console/SignalRegistry/SignalRegistry.php        )?      3   vendor/symfony/console/SignalRegistry/SignalMap.php        NR      3   vendor/symfony/console/SingleCommandApplication.phpL      L  wH      6   vendor/symfony/console/Event/ConsoleTerminateEvent.php        Ѥ      -   vendor/symfony/console/Event/ConsoleEvent.php
      
  @      3   vendor/symfony/console/Event/ConsoleSignalEvent.php        =      4   vendor/symfony/console/Event/ConsoleCommandEvent.php        a<K      2   vendor/symfony/console/Event/ConsoleErrorEvent.php        E}&      /   vendor/symfony/console/Logger/ConsoleLogger.php        Hx      1   vendor/symfony/console/Helper/HelperInterface.php          Y@q      1   vendor/symfony/console/Helper/FormatterHelper.php        Mh      0   vendor/symfony/console/Helper/QuestionHelper.php>.      >.  +^      2   vendor/symfony/console/Helper/InputAwareHelper.phpc      c        +   vendor/symfony/console/Helper/TableRows.php2      2  ?Ӥ      +   vendor/symfony/console/Helper/TableCell.php[      [         5   vendor/symfony/console/Helper/TerminalInputHelper.phpi      i  Omy      6   vendor/symfony/console/Helper/DebugFormatterHelper.php        ep8ä      2   vendor/symfony/console/Helper/DescriptorHelper.phpO      O  =b      ,   vendor/symfony/console/Helper/TableStyle.php              7   vendor/symfony/console/Helper/SymfonyQuestionHelper.php	      	  K      3   vendor/symfony/console/Helper/ProgressIndicator.php{      {  !      /   vendor/symfony/console/Helper/ProcessHelper.php        ʙ      -   vendor/symfony/console/Helper/ProgressBar.php2      2   5t      (   vendor/symfony/console/Helper/Helper.phpe      e  g      '   vendor/symfony/console/Helper/Table.phpW      W  xUݤ      /   vendor/symfony/console/Helper/OutputWrapper.php;      ;  ٤      0   vendor/symfony/console/Helper/TableSeparator.php                (   vendor/symfony/console/Helper/Dumper.php        v'      +   vendor/symfony/console/Helper/HelperSet.php        N@      0   vendor/symfony/console/Helper/TableCellStyle.php        ez      1   vendor/symfony/console/Output/OutputInterface.phpK      K  ᪤      8   vendor/symfony/console/Output/ConsoleOutputInterface.php$      $  yL,      0   vendor/symfony/console/Output/BufferedOutput.phpy      y  ,7X      /   vendor/symfony/console/Output/ConsoleOutput.php	      	  y_      6   vendor/symfony/console/Output/ConsoleSectionOutput.php        =#Nݤ      (   vendor/symfony/console/Output/Output.php/
      /
  % k<      /   vendor/symfony/console/Output/AnsiColorMode.php        px)      5   vendor/symfony/console/Output/TrimmedBufferOutput.php        YSt      ,   vendor/symfony/console/Output/NullOutput.phpm      m  FE      .   vendor/symfony/console/Output/StreamOutput.php        )٤      =   vendor/symfony/console/CommandLoader/FactoryCommandLoader.php              ?   vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpc      c  $      ?   vendor/symfony/console/CommandLoader/ContainerCommandLoader.php        /q?      /   vendor/symfony/console/Tester/CommandTester.php        J       -   vendor/symfony/console/Tester/TesterTrait.php        u      9   vendor/symfony/console/Tester/CommandCompletionTester.php        
Z
      @   vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php              3   vendor/symfony/console/Tester/ApplicationTester.php        a      !   vendor/symfony/console/Cursor.php#	      #	  \Q      0   vendor/symfony/console/Resources/completion.fish        Keդ      0   vendor/symfony/console/Resources/completion.bash        xe      /   vendor/symfony/console/Resources/completion.zsh        ʤ      4   vendor/symfony/console/Resources/bin/hiddeninput.exe $       $  v      &   vendor/symfony/console/Application.phpw      w  9'      D   vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php        lOߤ      0   vendor/symfony/console/Descriptor/Descriptor.php        6c8      3   vendor/symfony/console/Descriptor/XmlDescriptor.php#      #         <   vendor/symfony/console/Descriptor/ApplicationDescription.php

      

  	      9   vendor/symfony/console/Descriptor/DescriptorInterface.php          WN      4   vendor/symfony/console/Descriptor/TextDescriptor.php"      "  )
      @   vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.phpw      w        8   vendor/symfony/console/Descriptor/MarkdownDescriptor.phpH      H  ˤ      4   vendor/symfony/console/Descriptor/JsonDescriptor.php9      9  P      ?   vendor/symfony/console/Exception/NamespaceNotFoundException.php          n      :   vendor/symfony/console/Exception/MissingInputException.php          S
      ;   vendor/symfony/console/Exception/InvalidOptionException.php          H      3   vendor/symfony/console/Exception/LogicException.php          O\e      7   vendor/symfony/console/Exception/ExceptionInterface.phpy       y   9[&      =   vendor/symfony/console/Exception/InvalidArgumentException.php          ̽Z      =   vendor/symfony/console/Exception/CommandNotFoundException.php              >   vendor/symfony/console/Exception/RunCommandFailedException.php        MЅ      5   vendor/symfony/console/Exception/RuntimeException.php          ,6          vendor/symfony/console/Color.php
      
        8   vendor/symfony/console/Command/DumpCompletionCommand.php        _.      0   vendor/symfony/console/Command/LockableTrait.phpW      W  ĥ      .   vendor/symfony/console/Command/LazyCommand.php        nCG      .   vendor/symfony/console/Command/HelpCommand.phpY      Y  Ҏ0      3   vendor/symfony/console/Command/TraceableCommand.php        =      2   vendor/symfony/console/Command/CompleteCommand.php/      /  Cl      .   vendor/symfony/console/Command/ListCommand.php        v[ؤ      =   vendor/symfony/console/Command/SignalableCommandInterface.php          !@R      *   vendor/symfony/console/Command/Command.php20      20  t      B   vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php        A      >   vendor/symfony/console/Formatter/OutputFormatterStyleStack.php        gB      =   vendor/symfony/console/Formatter/NullOutputFormatterStyle.phpV      V  {      9   vendor/symfony/console/Formatter/OutputFormatterStyle.php        By      8   vendor/symfony/console/Formatter/NullOutputFormatter.php        [w#      4   vendor/symfony/console/Formatter/OutputFormatter.php6      6  +r      F   vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php                =   vendor/symfony/console/Formatter/OutputFormatterInterface.php              +   vendor/symfony/console/Debug/CliRequest.php        Tܤ      =   vendor/symfony/console/DataCollector/CommandDataCollector.php        nJ      &   vendor/symfony/console/Input/Input.php        m@      /   vendor/symfony/console/Input/InputInterface.phpq      q  Hi      .   vendor/symfony/console/Input/InputArgument.php
      
        4   vendor/symfony/console/Input/InputAwareInterface.php          jT      0   vendor/symfony/console/Input/InputDefinition.php	      	  "      *   vendor/symfony/console/Input/ArgvInput.php        :      +   vendor/symfony/console/Input/ArrayInput.php              9   vendor/symfony/console/Input/StreamableInputInterface.php          |      ,   vendor/symfony/console/Input/InputOption.php        UpY0      ,   vendor/symfony/console/Input/StringInput.phpC      C  Y5      6   vendor/symfony/console/Messenger/RunCommandContext.php          5=ԗ      =   vendor/symfony/console/Messenger/RunCommandMessageHandler.php        #      6   vendor/symfony/console/Messenger/RunCommandMessage.php        X=      #   vendor/symfony/console/Terminal.php        *      /   vendor/symfony/console/Style/StyleInterface.php        *2      ,   vendor/symfony/console/Style/OutputStyle.php        \      -   vendor/symfony/console/Style/SymfonyStyle.php(      (  :N5      5   vendor/symfony/console/Completion/CompletionInput.php        
q      @   vendor/symfony/console/Completion/Output/ZshCompletionOutput.phph      h  b      A   vendor/symfony/console/Completion/Output/BashCompletionOutput.phpg      g  W      F   vendor/symfony/console/Completion/Output/CompletionOutputInterface.phpF      F  2nM      A   vendor/symfony/console/Completion/Output/FishCompletionOutput.phpe      e  !M^      0   vendor/symfony/console/Completion/Suggestion.php        ٳפ      ;   vendor/symfony/console/Completion/CompletionSuggestions.php        <      ,   vendor/symfony/deprecation-contracts/LICENSE,      ,  K      1   vendor/symfony/deprecation-contracts/function.phpC      C  '      !   vendor/symfony/filesystem/LICENSE,      ,  U      (   vendor/symfony/filesystem/Filesystem.php7B      7B  v      <   vendor/symfony/filesystem/Exception/IOExceptionInterface.php          +용      3   vendor/symfony/filesystem/Exception/IOException.php        3J      :   vendor/symfony/filesystem/Exception/ExceptionInterface.php|       |   D      @   vendor/symfony/filesystem/Exception/InvalidArgumentException.php          !Ǥ      8   vendor/symfony/filesystem/Exception/RuntimeException.php          UUH      =   vendor/symfony/filesystem/Exception/FileNotFoundException.php        ʤ      "   vendor/symfony/filesystem/Path.phpm'      m'  ֱI      2   vendor/symfony/var-exporter/Internal/Reference.php          ҽ      ;   vendor/symfony/var-exporter/Internal/LazyDecoratorTrait.php        o      8   vendor/symfony/var-exporter/Internal/LazyObjectTrait.phpM      M  @#      1   vendor/symfony/var-exporter/Internal/Exporter.php*      *  {V      8   vendor/symfony/var-exporter/Internal/LazyObjectState.php	      	  ɏ      ;   vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php        +
      1   vendor/symfony/var-exporter/Internal/Registry.php        7      1   vendor/symfony/var-exporter/Internal/Hydrator.php              /   vendor/symfony/var-exporter/Internal/Values.php          m      +   vendor/symfony/var-exporter/ProxyHelper.phpb      b  ,=ܤ      ,   vendor/symfony/var-exporter/Instantiator.php        ߱z      #   vendor/symfony/var-exporter/LICENSE,      ,        .   vendor/symfony/var-exporter/LazyGhostTrait.php&      &  J      .   vendor/symfony/var-exporter/LazyProxyTrait.phpt&      t&  R      +   vendor/symfony/var-exporter/VarExporter.php        ǽ      F   vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php>      >  'ʤ      @   vendor/symfony/var-exporter/Exception/ClassNotFoundException.php1      1  ,b      8   vendor/symfony/var-exporter/Exception/LogicException.php          8      <   vendor/symfony/var-exporter/Exception/ExceptionInterface.phpx       x   󄶤      3   vendor/symfony/var-exporter/LazyObjectInterface.php              (   vendor/symfony/var-exporter/Hydrator.php        ƴߤ         vendor/symfony/flex/LICENSE,      ,  X      )   vendor/symfony/flex/src/SymfonyBundle.php	      	  8)      ;   vendor/symfony/flex/src/Configurator/DotenvConfigurator.php        :q      ?   vendor/symfony/flex/src/Configurator/DockerfileConfigurator.php
      
  nl      =   vendor/symfony/flex/src/Configurator/AbstractConfigurator.php          E      >   vendor/symfony/flex/src/Configurator/GitignoreConfigurator.php	      	  C      8   vendor/symfony/flex/src/Configurator/EnvConfigurator.php        {      =   vendor/symfony/flex/src/Configurator/MakefileConfigurator.php        Y6      >   vendor/symfony/flex/src/Configurator/ContainerConfigurator.php{      {        =   vendor/symfony/flex/src/Configurator/AddLinesConfigurator.phpf      f  N      E   vendor/symfony/flex/src/Configurator/ComposerCommandsConfigurator.php        ؾ      C   vendor/symfony/flex/src/Configurator/CopyFromRecipeConfigurator.php        F)      <   vendor/symfony/flex/src/Configurator/BundlesConfigurator.php        8(㶤      D   vendor/symfony/flex/src/Configurator/ComposerScriptsConfigurator.php        Fp      D   vendor/symfony/flex/src/Configurator/CopyFromPackageConfigurator.php        bI      B   vendor/symfony/flex/src/Configurator/DockerComposeConfigurator.php'      '  `ކ          vendor/symfony/flex/src/Lock.php        Q7      *   vendor/symfony/flex/src/ScriptExecutor.php%      %  1      /   vendor/symfony/flex/src/Update/RecipeUpdate.php6      6        0   vendor/symfony/flex/src/Update/RecipePatcher.phpy      y  Fo      .   vendor/symfony/flex/src/Update/RecipePatch.php        2ɤ      -   vendor/symfony/flex/src/Update/DiffHelper.phpk      k  S      #   vendor/symfony/flex/src/Options.php        )'ߤ          vendor/symfony/flex/src/Flex.phpa      a  m0      0   vendor/symfony/flex/src/SymfonyPackInstaller.php          {K      %   vendor/symfony/flex/src/GithubApi.php"      "  썤      &   vendor/symfony/flex/src/Downloader.phpJ3      J3  9jآ      "   vendor/symfony/flex/src/Recipe.php        
)[      (   vendor/symfony/flex/src/Configurator.php        >ґ4      3   vendor/symfony/flex/src/PackageJsonSynchronizer.php)      )        -   vendor/symfony/flex/src/Event/UpdateEvent.phpw      w        ,   vendor/symfony/flex/src/Unpack/Operation.php=      =  8[      )   vendor/symfony/flex/src/Unpack/Result.phpP      P  d?id      $   vendor/symfony/flex/src/Response.php3      3  $Z)      $   vendor/symfony/flex/src/Unpacker.php        2      )   vendor/symfony/flex/src/PackageFilter.php        e&_          vendor/symfony/flex/src/Path.phpr      r  iڤ      2   vendor/symfony/flex/src/Command/RecipesCommand.php        Y      2   vendor/symfony/flex/src/Command/DumpEnvCommand.php<      <  tH      9   vendor/symfony/flex/src/Command/InstallRecipesCommand.phpc      c        8   vendor/symfony/flex/src/Command/UpdateRecipesCommand.php-      -  }p$      +   vendor/symfony/flex/src/PackageResolver.php        D      0   vendor/symfony/flex/src/InformationOperation.php        @|         vendor/symfony/process/LICENSE,      ,  U      (   vendor/symfony/process/PhpSubprocess.php        ]r      %   vendor/symfony/process/PhpProcess.php        [ZФ      +   vendor/symfony/process/ExecutableFinder.php
      
  U"4Ҥ      .   vendor/symfony/process/PhpExecutableFinder.php!      !  (|E      &   vendor/symfony/process/InputStream.phpu      u  B6j      -   vendor/symfony/process/Pipes/WindowsPipes.phpf      f  #ʙ`      .   vendor/symfony/process/Pipes/AbstractPipes.php        v      /   vendor/symfony/process/Pipes/PipesInterface.php        ݌E      *   vendor/symfony/process/Pipes/UnixPipes.php        켤      ;   vendor/symfony/process/Exception/ProcessFailedException.php        T*      >   vendor/symfony/process/Exception/RunProcessFailedException.phpw      w  k      3   vendor/symfony/process/Exception/LogicException.php                 7   vendor/symfony/process/Exception/ExceptionInterface.phpy       y   qVXJ      =   vendor/symfony/process/Exception/InvalidArgumentException.php          +_      =   vendor/symfony/process/Exception/ProcessTimedOutException.phpC      C  (Ov      5   vendor/symfony/process/Exception/RuntimeException.php          :      =   vendor/symfony/process/Exception/ProcessSignaledException.php        H      "   vendor/symfony/process/Process.phpg      g  C      '   vendor/symfony/process/ProcessUtils.php        a8      =   vendor/symfony/process/Messenger/RunProcessMessageHandler.php        F      6   vendor/symfony/process/Messenger/RunProcessContext.php%      %  9      6   vendor/symfony/process/Messenger/RunProcessMessage.php        df      6   vendor/symfony/http-foundation/ChainRequestMatcher.phpc      c  Y_*      4   vendor/symfony/http-foundation/ResponseHeaderBag.php        vn      ,   vendor/symfony/http-foundation/UriSigner.php'      '  K1<      5   vendor/symfony/http-foundation/BinaryFileResponse.php        B      .   vendor/symfony/http-foundation/ServerEvent.php        #      *   vendor/symfony/http-foundation/Request.phpW      W  '      &   vendor/symfony/http-foundation/LICENSE,      ,  U      /   vendor/symfony/http-foundation/ParameterBag.php        F      ,   vendor/symfony/http-foundation/ServerBag.phpL      L  TF      .   vendor/symfony/http-foundation/HeaderUtils.php        P٤      6   vendor/symfony/http-foundation/EventStreamResponse.php;      ;  @"      3   vendor/symfony/http-foundation/RedirectResponse.php*      *  /X      4   vendor/symfony/http-foundation/File/UploadedFile.php^      ^  :g      .   vendor/symfony/http-foundation/File/Stream.php          ܤ      ?   vendor/symfony/http-foundation/File/Exception/FileException.php          !      A   vendor/symfony/http-foundation/File/Exception/NoFileException.php                J   vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php          i      F   vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php          @cä      G   vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php                A   vendor/symfony/http-foundation/File/Exception/UploadException.php          T      I   vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php8      8  i䀓      F   vendor/symfony/http-foundation/File/Exception/PartialFileException.php          b      G   vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php          V      G   vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php          E	      G   vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php          a      H   vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php          ޾Ϥ      ,   vendor/symfony/http-foundation/File/File.phpF
      F
  8פ      ,   vendor/symfony/http-foundation/UrlHelper.php        ݤ      /   vendor/symfony/http-foundation/AcceptHeader.php5      5  <      L   vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php        'Bz      E   vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php        `       D   vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.phpO      O  3F      M   vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php        "t¤      G   vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php        NQ      E   vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php        u      J   vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php4      4  Ms      I   vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php              J   vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php        K{      G   vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php        ,-      D   vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php        1(Q      /   vendor/symfony/http-foundation/JsonResponse.php        b=      7   vendor/symfony/http-foundation/StreamedJsonResponse.php	      	  >/4      :   vendor/symfony/http-foundation/RequestMatcherInterface.php          Z      J   vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php=      =  +x`      R   vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php=      =  VbT      I   vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php        }o      +   vendor/symfony/http-foundation/Response.php#O      #O  ǃ      *   vendor/symfony/http-foundation/IpUtils.php        S3a      )   vendor/symfony/http-foundation/Cookie.php        v\B      E   vendor/symfony/http-foundation/Exception/SessionNotFoundException.phpj      j  p      F   vendor/symfony/http-foundation/Exception/RequestExceptionInterface.phpt       t   (      E   vendor/symfony/http-foundation/Exception/UnexpectedValueException.php          \	LA      F   vendor/symfony/http-foundation/Exception/ExpiredSignedUriException.php          פ      H   vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php          W      ;   vendor/symfony/http-foundation/Exception/LogicException.php          TO      I   vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php          '!Ӥ      ?   vendor/symfony/http-foundation/Exception/ExceptionInterface.php{       {   +      I   vendor/symfony/http-foundation/Exception/UnverifiedSignedUriException.php          /      A   vendor/symfony/http-foundation/Exception/UnsignedUriException.php          B      :   vendor/symfony/http-foundation/Exception/JsonException.php          ~1Ӥ      @   vendor/symfony/http-foundation/Exception/BadRequestException.php          sP      ?   vendor/symfony/http-foundation/Exception/SignedUriException.php          	j      3   vendor/symfony/http-foundation/AcceptHeaderItem.php        h      3   vendor/symfony/http-foundation/StreamedResponse.php        Xǘ      ,   vendor/symfony/http-foundation/HeaderBag.php        S`Ϣ      *   vendor/symfony/http-foundation/FileBag.php        +դ      A   vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php        M6*      J   vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php        w}      P   vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php3      3  qH      I   vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.phpJ      J  ԅKפ      L   vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php        01      F   vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php        "1u      >   vendor/symfony/http-foundation/Session/Storage/MetadataBag.php        
Ϟl      J   vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
      
  i|      Q   vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php        Xh      Q   vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
      
  zsء      O   vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php        {      R   vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php        Fm@      N   vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php^      ^  ˕ ٤      P   vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php        z      L   vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.phpQ      Q  D      P   vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php        _      T   vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php         o      S   vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.phpo      o  țĮ      M   vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php        vt=      R   vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php	      	  uP      M   vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php        pܤ      J   vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php        2      J   vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php        Lu      G   vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php        Xu      N   vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php)      )  -      Q   vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php          gg      :   vendor/symfony/http-foundation/Session/SessionBagProxy.phpu      u  S      >   vendor/symfony/http-foundation/Session/SessionBagInterface.php        є      ;   vendor/symfony/http-foundation/Session/SessionInterface.phpr      r  NS      2   vendor/symfony/http-foundation/Session/Session.php        Y      7   vendor/symfony/http-foundation/Session/SessionUtils.phpK      K        9   vendor/symfony/http-foundation/Session/SessionFactory.php        ii6j      C   vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php        RH      B   vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php        _0      9   vendor/symfony/http-foundation/Session/Flash/FlashBag.php,      ,  JU      H   vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php              B   vendor/symfony/http-foundation/Session/SessionFactoryInterface.php          /A
      /   vendor/symfony/http-foundation/RequestStack.php?      ?        D   vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php        q4      F   vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.phpb      b  jk      F   vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php        D䁤      F   vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php        N      D   vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php        Qb      C   vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php        qe      J   vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php-      -  U      F   vendor/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php        ?      D   vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php        *      J   vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.phpO      O  ؝U      N   vendor/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php        ä      +   vendor/symfony/http-foundation/InputBag.php        zƤ      3   vendor/symfony/finder/Comparator/DateComparator.php              5   vendor/symfony/finder/Comparator/NumberComparator.php|      |  ?      /   vendor/symfony/finder/Comparator/Comparator.php=      =  $         vendor/symfony/finder/LICENSE,      ,  U      :   vendor/symfony/finder/Iterator/DateRangeFilterIterator.php        4      =   vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php        ,`      ;   vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php9      9  !~      ;   vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.phpU      U  W^      /   vendor/symfony/finder/Iterator/LazyIterator.php_      _  G      7   vendor/symfony/finder/Iterator/CustomFilterIterator.phpa      a  d@      =   vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php$	      $	  *       <   vendor/symfony/finder/Iterator/FilecontentFilterIterator.php        #      3   vendor/symfony/finder/Iterator/SortableIterator.php^      ^  ѹC      9   vendor/symfony/finder/Iterator/FilenameFilterIterator.php        c"y      A   vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php        )      5   vendor/symfony/finder/Iterator/PathFilterIterator.php        i;<      9   vendor/symfony/finder/Iterator/FileTypeFilterIterator.php              :   vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpz      z  +VQ          vendor/symfony/finder/Finder.php+      +  %:      #   vendor/symfony/finder/Gitignore.php        -)̯         vendor/symfony/finder/Glob.php        ˤ      %   vendor/symfony/finder/SplFileInfo.php        vҘ:      >   vendor/symfony/finder/Exception/DirectoryNotFoundException.php          a)      9   vendor/symfony/finder/Exception/AccessDeniedException.php          s      E   vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php              C   vendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php                :   vendor/symfony/http-kernel/Controller/ArgumentResolver.php        .u      E   vendor/symfony/http-kernel/Controller/TraceableControllerResolver.php        P      H   vendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php        QB      <   vendor/symfony/http-kernel/Controller/ControllerResolver.phpJ      J  ~g      9   vendor/symfony/http-kernel/Controller/ErrorController.php*      *  "      =   vendor/symfony/http-kernel/Controller/ControllerReference.php        (      @   vendor/symfony/http-kernel/Controller/ValueResolverInterface.php7      7  *      V   vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php        @'      O   vendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php
      
  a      O   vendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php              [   vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php	      	  @z      R   vendor/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php`      `        O   vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php        6      Q   vendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php        60pP      K   vendor/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php        sO      O   vendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php0      0  S      V   vendor/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.php        O      P   vendor/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php	      	  m Z!      P   vendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php              X   vendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php        "v      E   vendor/symfony/http-kernel/Controller/ControllerResolverInterface.php          AnS      C   vendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php              2   vendor/symfony/http-kernel/RebootableInterface.php          򚥤      7   vendor/symfony/http-kernel/Log/DebugLoggerInterface.php0      0  ٤      :   vendor/symfony/http-kernel/Log/DebugLoggerConfigurator.phpJ      J  [[      )   vendor/symfony/http-kernel/Log/Logger.php,      ,        (   vendor/symfony/http-kernel/UriSigner.php         Cjy      >   vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php        *y      <   vendor/symfony/http-kernel/Fragment/FragmentUriGenerator.phpX	      X	  ңZ      @   vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php        yoǤ      ;   vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php          yĤ      ;   vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php          "Ҥ      I   vendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php)	      )	  罤      7   vendor/symfony/http-kernel/Fragment/FragmentHandler.php|      |  5m      @   vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php        *mF6      E   vendor/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php        xSܤ      A   vendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php              :   vendor/symfony/http-kernel/Attribute/MapQueryParameter.php        *0-t      5   vendor/symfony/http-kernel/Attribute/WithLogLevel.php~      ~  /      6   vendor/symfony/http-kernel/Attribute/ValueResolver.phpF      F  <{      7   vendor/symfony/http-kernel/Attribute/WithHttpStatus.php          5      7   vendor/symfony/http-kernel/Attribute/MapQueryString.php        dDQ      5   vendor/symfony/http-kernel/Attribute/AsController.php          _Lr      4   vendor/symfony/http-kernel/Attribute/MapDateTime.php        %Ra      @   vendor/symfony/http-kernel/Attribute/AsTargetedValueResolver.php          GSr=      :   vendor/symfony/http-kernel/Attribute/MapRequestPayload.phpZ      Z  xe      .   vendor/symfony/http-kernel/Attribute/Cache.php        Jޤ      "   vendor/symfony/http-kernel/LICENSE,      ,  U      .   vendor/symfony/http-kernel/HttpCache/Store.php        @qM      :   vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php        k<      ,   vendor/symfony/http-kernel/HttpCache/Ssi.php        PԘ      ,   vendor/symfony/http-kernel/HttpCache/Esi.php8      8  ܳ      :   vendor/symfony/http-kernel/HttpCache/SubRequestHandler.phpD
      D
  m%̤      7   vendor/symfony/http-kernel/HttpCache/StoreInterface.phpz      z  4<      G   vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php
      
  V      @   vendor/symfony/http-kernel/HttpCache/CacheWasLockedException.php{       {   Z      ;   vendor/symfony/http-kernel/HttpCache/SurrogateInterface.phpn      n  ҵ      >   vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php        0@O      2   vendor/symfony/http-kernel/HttpCache/HttpCache.phpW2      W2  &      .   vendor/symfony/http-kernel/KernelInterface.php.      .  1_      ,   vendor/symfony/http-kernel/Bundle/Bundle.php        n      4   vendor/symfony/http-kernel/Bundle/AbstractBundle.phpr      r   eꈤ      5   vendor/symfony/http-kernel/Bundle/BundleInterface.php        ~      5   vendor/symfony/http-kernel/Bundle/BundleExtension.php        2       <   vendor/symfony/http-kernel/EventListener/SessionListener.php        i~.      C   vendor/symfony/http-kernel/EventListener/CacheAttributeListener.php        ft      D   vendor/symfony/http-kernel/EventListener/ValidateRequestListener.php        pM      :   vendor/symfony/http-kernel/EventListener/ErrorListener.phpL      L  ؿ0      >   vendor/symfony/http-kernel/EventListener/SurrogateListener.php        &vH      B   vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php        tt      ;   vendor/symfony/http-kernel/EventListener/LocaleListener.phpV	      V	  0r      ;   vendor/symfony/http-kernel/EventListener/RouterListener.phpV      V  !      K   vendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php        Fۃ#      =   vendor/symfony/http-kernel/EventListener/FragmentListener.php        o.      @   vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php        XHZ+      E   vendor/symfony/http-kernel/EventListener/StreamedResponseListener.php<      <  Eɤ      =   vendor/symfony/http-kernel/EventListener/ResponseListener.php                =   vendor/symfony/http-kernel/EventListener/ProfilerListener.phpp      p  	Ǥ      D   vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php        Wgʤ      F   vendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php        3Q      9   vendor/symfony/http-kernel/EventListener/DumpListener.php?      ?        /   vendor/symfony/http-kernel/Profiler/Profile.php        X      ;   vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php        )      0   vendor/symfony/http-kernel/Profiler/Profiler.php        3p      @   vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php        nw      2   vendor/symfony/http-kernel/TerminableInterface.php        v|ܤ      +   vendor/symfony/http-kernel/KernelEvents.phph      h  q      R   vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php          V      I   vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php        .      B   vendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php        Ԥ      /   vendor/symfony/http-kernel/HttpClientKernel.php        7       1   vendor/symfony/http-kernel/Config/FileLocator.php        k      7   vendor/symfony/http-kernel/Event/FinishRequestEvent.php{       {   d      .   vendor/symfony/http-kernel/Event/ViewEvent.phpa      a  VJ4      0   vendor/symfony/http-kernel/Event/KernelEvent.phpa      a  ve      3   vendor/symfony/http-kernel/Event/TerminateEvent.php<      <  #`      3   vendor/symfony/http-kernel/Event/ExceptionEvent.phpc      c  ԡ      4   vendor/symfony/http-kernel/Event/ControllerEvent.php
      
  }      =   vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.php        #o      2   vendor/symfony/http-kernel/Event/ResponseEvent.php        ˕L      1   vendor/symfony/http-kernel/Event/RequestEvent.php        Z      %   vendor/symfony/http-kernel/Kernel.php#T      #T  Uݤ      <   vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php{      {  lSH      =   vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.phpy      y  B~d(      A   vendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php          -o      5   vendor/symfony/http-kernel/Resources/welcome.html.php        Ib      Y   vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php        Aֈ      V   vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php6	      6	  ]*      R   vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php        [Ԥ      M   vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php        쑤      H   vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php        MkE      =   vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php        W2      C   vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php        9      G   vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php        _      R   vendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.phpg      g  j      <   vendor/symfony/http-kernel/DependencyInjection/Extension.php        ʤ      Q   vendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.phpV
      V
        H   vendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php        K7y      \   vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php        =L      0   vendor/symfony/http-kernel/HttpKernelBrowser.php        ä      I   vendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php?      ?  m'h{      E   vendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php        ]K      >   vendor/symfony/http-kernel/Exception/ConflictHttpException.php4      4  #Kgn      Q   vendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php        	@      B   vendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php9      9  o      D   vendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php:      :  /      <   vendor/symfony/http-kernel/Exception/LockedHttpException.php2      2  v3֤      J   vendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php@      @        F   vendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php        DvB      B   vendor/symfony/http-kernel/Exception/UnauthorizedHttpException.phpz      z        @   vendor/symfony/http-kernel/Exception/BadRequestHttpException.php6      6  X?      :   vendor/symfony/http-kernel/Exception/GoneHttpException.php0      0  _      C   vendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php9      9  g      6   vendor/symfony/http-kernel/Exception/HttpException.php        d      H   vendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php        N      B   vendor/symfony/http-kernel/Exception/ResolverNotFoundException.php        \      ?   vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php          [ح      J   vendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.phpB      B  t      >   vendor/symfony/http-kernel/Exception/NotFoundHttpException.php4      4  )      A   vendor/symfony/http-kernel/Exception/InvalidMetadataException.php~       ~   <IXA      H   vendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php          Bȟ      H   vendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php>      >  N      )   vendor/symfony/http-kernel/HttpKernel.php        gظ      2   vendor/symfony/http-kernel/HttpKernelInterface.php        F_      6   vendor/symfony/http-kernel/Debug/FileLinkFormatter.php[      [  '[	s      =   vendor/symfony/http-kernel/Debug/ErrorHandlerConfigurator.php	      	  '      =   vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.phpF      F  .'q"      8   vendor/symfony/http-kernel/Debug/VirtualRequestStack.php        Uߤ      C   vendor/symfony/http-kernel/DataCollector/DataCollectorInterface.php        ]e      @   vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php        yK]      ?   vendor/symfony/http-kernel/DataCollector/EventDataCollector.php        n      @   vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php        1Ѥ      >   vendor/symfony/http-kernel/DataCollector/TimeDataCollector.phpM	      M	  Θ      >   vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php        &͝      >   vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php          D      :   vendor/symfony/http-kernel/DataCollector/DataCollector.php        K      A   vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php-      -  r0      @   vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php        pϤ      C   vendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.phpJ      J        G   vendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php          QTդ      @   vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.phph      h  80V:      <   vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php          MU      ?   vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php          M#      6   vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php        1y      ?   vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php>      >   y      %   vendor/symfony/polyfill-php80/LICENSE,      ,  K      '   vendor/symfony/polyfill-php80/Php80.php	      	  [k      <   vendor/symfony/polyfill-php80/Resources/stubs/ValueError.phpT       T   w      E   vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php]       ]   g      <   vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpk       k   +      ;   vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php              :   vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php          ڔݤ      *   vendor/symfony/polyfill-php80/PhpToken.php        xˤ      +   vendor/symfony/polyfill-php80/bootstrap.php              %   vendor/symfony/polyfill-ctype/LICENSE,      ,        -   vendor/symfony/polyfill-ctype/bootstrap80.phph      h  Ky      '   vendor/symfony/polyfill-ctype/Ctype.php
      
  ~d      +   vendor/symfony/polyfill-ctype/bootstrap.php2      2  a8      /   vendor/symfony/polyfill-intl-normalizer/LICENSE,      ,  H      6   vendor/symfony/polyfill-intl-normalizer/Normalizer.php        ie      7   vendor/symfony/polyfill-intl-normalizer/bootstrap80.php        =r      F   vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php.      .  Qs$      R   vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php=      =  *o?      T   vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.phpa      a  R}      X   vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php        oe)      L   vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpt.      t.  qܤ      5   vendor/symfony/polyfill-intl-normalizer/bootstrap.php        PD      >   vendor/symfony/config/Resource/SelfCheckingResourceChecker.php        4&      /   vendor/symfony/config/Resource/FileResource.php        --      4   vendor/symfony/config/Resource/DirectoryResource.php        D鷤      8   vendor/symfony/config/Resource/FileExistenceResource.php9      9  }b      4   vendor/symfony/config/Resource/ResourceInterface.php          
r>٤      9   vendor/symfony/config/Resource/ClassExistenceResource.php        M      :   vendor/symfony/config/Resource/ReflectionClassResource.php"      "  ⹾      @   vendor/symfony/config/Resource/SelfCheckingResourceInterface.php          Tj      /   vendor/symfony/config/Resource/GlobResource.php        K      3   vendor/symfony/config/Resource/ComposerResource.php        +Ѥ      8   vendor/symfony/config/Builder/ConfigBuilderGenerator.php2E      2E  ^\      8   vendor/symfony/config/Builder/ConfigBuilderInterface.php          vݤ      *   vendor/symfony/config/Builder/Property.php        k(      A   vendor/symfony/config/Builder/ConfigBuilderGeneratorInterface.php          C{      (   vendor/symfony/config/Builder/Method.php          Ruq      .   vendor/symfony/config/Builder/ClassBuilder.php        (      '   vendor/symfony/config/Util/XmlUtils.php        X      <   vendor/symfony/config/Util/Exception/XmlParsingException.php          ;NN-      <   vendor/symfony/config/Util/Exception/InvalidXmlException.php          3;         vendor/symfony/config/LICENSE,      ,  U      ,   vendor/symfony/config/ConfigCacheFactory.php        D      .   vendor/symfony/config/ConfigCacheInterface.php1      1  ^rf      %   vendor/symfony/config/ConfigCache.php8      8  jc      .   vendor/symfony/config/FileLocatorInterface.php@      @  .      ;   vendor/symfony/config/ResourceCheckerConfigCacheFactory.php        sZ      2   vendor/symfony/config/ResourceCheckerInterface.php,      ,  YE      N   vendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php        l*      D   vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php        )l4      7   vendor/symfony/config/Exception/LoaderLoadException.php        ޤ      ;   vendor/symfony/config/Definition/PrototypeNodeInterface.php          ce      H   vendor/symfony/config/Definition/Configurator/DefinitionConfigurator.php        P      8   vendor/symfony/config/Definition/Builder/ExprBuilder.php        M@      ;   vendor/symfony/config/Definition/Builder/NodeDefinition.php        w      B   vendor/symfony/config/Definition/Builder/IntegerNodeDefinition.php\      \  '	      B   vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php          y`      J   vendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.phpA      A  	4      C   vendor/symfony/config/Definition/Builder/VariableNodeDefinition.php              @   vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php#      #  T      9   vendor/symfony/config/Definition/Builder/MergeBuilder.phpG      G  lmB      >   vendor/symfony/config/Definition/Builder/ValidationBuilder.php        F      B   vendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php        ,      @   vendor/symfony/config/Definition/Builder/FloatNodeDefinition.phpT      T  @M      A   vendor/symfony/config/Definition/Builder/NormalizationBuilder.php        F      @   vendor/symfony/config/Definition/Builder/NodeParentInterface.phpo       o   vr      ?   vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php        *`      8   vendor/symfony/config/Definition/Builder/NodeBuilder.php^
      ^
  ɤ      A   vendor/symfony/config/Definition/Builder/ScalarNodeDefinition.phpA      A  #+      8   vendor/symfony/config/Definition/Builder/TreeBuilder.php        m      B   vendor/symfony/config/Definition/Builder/NumericNodeDefinition.php        T      2   vendor/symfony/config/Definition/Configuration.php        3Wt      -   vendor/symfony/config/Definition/EnumNode.php~      ~  ä      -   vendor/symfony/config/Definition/BaseNode.php"      "  LHL      2   vendor/symfony/config/Definition/NodeInterface.php        Ũ      .   vendor/symfony/config/Definition/Processor.php        0J      ;   vendor/symfony/config/Definition/ConfigurationInterface.php          [h      /   vendor/symfony/config/Definition/ScalarNode.php        D      0   vendor/symfony/config/Definition/BooleanNode.php        ʤ      0   vendor/symfony/config/Definition/IntegerNode.phpE      E  ¤      I   vendor/symfony/config/Definition/Exception/InvalidDefinitionException.php          1      C   vendor/symfony/config/Definition/Exception/InvalidTypeException.php                L   vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php        D      8   vendor/symfony/config/Definition/Exception/Exception.php}       }         J   vendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php          ۙZ      D   vendor/symfony/config/Definition/Exception/DuplicateKeyException.php          a      @   vendor/symfony/config/Definition/Exception/UnsetKeyException.php~       ~   _      8   vendor/symfony/config/Definition/PrototypedArrayNode.php        eK      .   vendor/symfony/config/Definition/ArrayNode.php        YTc      :   vendor/symfony/config/Definition/ConfigurableInterface.php          !2      1   vendor/symfony/config/Definition/VariableNode.php`      `  
39      0   vendor/symfony/config/Definition/NumericNode.php        7g      .   vendor/symfony/config/Definition/FloatNode.php}      }  O/1      ?   vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.phpi      i  Qդ      >   vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php"      "  T8      @   vendor/symfony/config/Definition/Loader/DefinitionFileLoader.php        |M      5   vendor/symfony/config/ConfigCacheFactoryInterface.php          9      4   vendor/symfony/config/ResourceCheckerConfigCache.php        ~      %   vendor/symfony/config/FileLocator.phpH      H  Py      /   vendor/symfony/config/Loader/GlobFileLoader.php9      9        +   vendor/symfony/config/Loader/FileLoader.php        p^D      0   vendor/symfony/config/Loader/LoaderInterface.phpW      W  Wt      1   vendor/symfony/config/Loader/DelegatingLoader.php              2   vendor/symfony/config/Loader/ParamConfigurator.php          *@      >   vendor/symfony/config/Loader/DirectoryAwareLoaderInterface.php          V       /   vendor/symfony/config/Loader/LoaderResolver.php        X      '   vendor/symfony/config/Loader/Loader.php        :H08      8   vendor/symfony/config/Loader/LoaderResolverInterface.php          ܊i      '   vendor/symfony/string/UnicodeString.php$      $  z*v         vendor/symfony/string/LICENSE,      ,  զ_Ϥ      $   vendor/symfony/string/LazyString.php|      |  hv      )   vendor/symfony/string/CodePointString.php        _      4   vendor/symfony/string/Inflector/EnglishInflector.phpF      F  b      3   vendor/symfony/string/Inflector/FrenchInflector.php
      
  3V,      6   vendor/symfony/string/Inflector/InflectorInterface.php          hD      4   vendor/symfony/string/Inflector/SpanishInflector.php        [@      $   vendor/symfony/string/ByteString.phpy*      y*  ܤ      (   vendor/symfony/string/AbstractString.phpt5      t5  0&Q      /   vendor/symfony/string/AbstractUnicodeString.phpPT      PT  #_      -   vendor/symfony/string/Resources/functions.php        "m      <   vendor/symfony/string/Resources/data/wcswidth_table_wide.php+      +  77B      <   vendor/symfony/string/Resources/data/wcswidth_table_zero.php        څ      6   vendor/symfony/string/Exception/ExceptionInterface.phps       s   qHV      <   vendor/symfony/string/Exception/InvalidArgumentException.php          A      4   vendor/symfony/string/Exception/RuntimeException.php          ug      .   vendor/symfony/string/Slugger/AsciiSlugger.php        &>      2   vendor/symfony/string/Slugger/SluggerInterface.php        k      &   vendor/symfony/string/TruncateMode.php          ڔ      '   vendor/symfony/validator/Validation.php        $Τ      A   vendor/symfony/validator/Violation/ConstraintViolationBuilder.php        `Ѥ      J   vendor/symfony/validator/Violation/ConstraintViolationBuilderInterface.php        u&      '   vendor/symfony/validator/Constraint.php        WF      7   vendor/symfony/validator/ConstraintValidatorFactory.phpL      L  -       9   vendor/symfony/validator/Validator/ValidatorInterface.php        9-'      9   vendor/symfony/validator/Validator/RecursiveValidator.php
      
  s      C   vendor/symfony/validator/Validator/ContextualValidatorInterface.phpi      i  f٤      9   vendor/symfony/validator/Validator/TraceableValidator.phpp      p  M#x      3   vendor/symfony/validator/Validator/LazyProperty.phpX      X  W      C   vendor/symfony/validator/Validator/RecursiveContextualValidator.phpCA      CA  w      8   vendor/symfony/validator/Attribute/HasNamedArguments.php          j3=Ƥ      .   vendor/symfony/validator/Util/PropertyPath.phpz      z  q      9   vendor/symfony/validator/ConstraintViolationInterface.php        Wפ      E   vendor/symfony/validator/Context/ExecutionContextFactoryInterface.php"      "  .ɤ      5   vendor/symfony/validator/Context/ExecutionContext.php        8P      <   vendor/symfony/validator/Context/ExecutionContextFactory.php        s      >   vendor/symfony/validator/Context/ExecutionContextInterface.php        f>V      7   vendor/symfony/validator/ObjectInitializerInterface.php          U          vendor/symfony/validator/LICENSE,      ,  U      6   vendor/symfony/validator/Mapping/TraversalStrategy.php          3OqΤ      5   vendor/symfony/validator/Mapping/PropertyMetadata.phpo      o  ʛ      3   vendor/symfony/validator/Mapping/GetterMetadata.php        ]+      4   vendor/symfony/validator/Mapping/GenericMetadata.phpj      j  wS      6   vendor/symfony/validator/Mapping/CascadingStrategy.php          ۛ      ;   vendor/symfony/validator/Mapping/ClassMetadataInterface.php        C/      6   vendor/symfony/validator/Mapping/MetadataInterface.phpo      o  7      2   vendor/symfony/validator/Mapping/ClassMetadata.php#      #  C      >   vendor/symfony/validator/Mapping/PropertyMetadataInterface.php        H/V      3   vendor/symfony/validator/Mapping/MemberMetadata.php	      	  x      8   vendor/symfony/validator/Mapping/AutoMappingStrategy.php          UVx*      G   vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php        6      E   vendor/symfony/validator/Mapping/Factory/MetadataFactoryInterface.phpq      q        E   vendor/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php        Y/x      ;   vendor/symfony/validator/Mapping/Loader/YamlFilesLoader.php          3Mk      6   vendor/symfony/validator/Mapping/Loader/FileLoader.php        +10       ;   vendor/symfony/validator/Mapping/Loader/LoaderInterface.php          .^      :   vendor/symfony/validator/Mapping/Loader/XmlFilesLoader.php          w      <   vendor/symfony/validator/Mapping/Loader/AutoMappingTrait.phpG      G  [ݸ      9   vendor/symfony/validator/Mapping/Loader/XmlFileLoader.php(      (  y      >   vendor/symfony/validator/Mapping/Loader/PropertyInfoLoader.php        #tc      :   vendor/symfony/validator/Mapping/Loader/YamlFileLoader.php        28)פ      `   vendor/symfony/validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsdk      k  Dә      :   vendor/symfony/validator/Mapping/Loader/AbstractLoader.php        k      ;   vendor/symfony/validator/Mapping/Loader/AttributeLoader.php                <   vendor/symfony/validator/Mapping/Loader/AnnotationLoader.php_      _  -i      7   vendor/symfony/validator/Mapping/Loader/LoaderChain.php5      5  }K      7   vendor/symfony/validator/Mapping/Loader/FilesLoader.php        [1      >   vendor/symfony/validator/Mapping/Loader/StaticMethodLoader.php        \      ;   vendor/symfony/validator/GroupSequenceProviderInterface.php          A      =   vendor/symfony/validator/Test/ConstraintValidatorTestCase.php:      :  ΃      @   vendor/symfony/validator/ContainerConstraintValidatorFactory.php        FAIX      A   vendor/symfony/validator/Resources/translations/validators.sk.xlfٌ      ٌ  Q2      A   vendor/symfony/validator/Resources/translations/validators.lv.xlf:      :  %      A   vendor/symfony/validator/Resources/translations/validators.hu.xlfw      w        A   vendor/symfony/validator/Resources/translations/validators.sq.xlf        6      A   vendor/symfony/validator/Resources/translations/validators.ru.xlf]      ]  (oh      A   vendor/symfony/validator/Resources/translations/validators.bs.xlf3      3  [$G      A   vendor/symfony/validator/Resources/translations/validators.en.xlfs      s  w      A   vendor/symfony/validator/Resources/translations/validators.nn.xlfs      s  =Dq      A   vendor/symfony/validator/Resources/translations/validators.lt.xlf_      _  JA
      A   vendor/symfony/validator/Resources/translations/validators.ja.xlf         a      A   vendor/symfony/validator/Resources/translations/validators.uk.xlf        8      A   vendor/symfony/validator/Resources/translations/validators.cy.xlf        2      A   vendor/symfony/validator/Resources/translations/validators.ro.xlfI      I  -_ˤ      D   vendor/symfony/validator/Resources/translations/validators.pt_BR.xlff      f  OjNC      A   vendor/symfony/validator/Resources/translations/validators.hr.xlf        tv~      A   vendor/symfony/validator/Resources/translations/validators.tr.xlf        e|T      A   vendor/symfony/validator/Resources/translations/validators.hy.xlfE      E  :-Q      A   vendor/symfony/validator/Resources/translations/validators.tl.xlf              A   vendor/symfony/validator/Resources/translations/validators.et.xlfd      d  n      A   vendor/symfony/validator/Resources/translations/validators.it.xlf        Q      A   vendor/symfony/validator/Resources/translations/validators.gl.xlfE      E  𺞤      A   vendor/symfony/validator/Resources/translations/validators.el.xlf        Rɤ      F   vendor/symfony/validator/Resources/translations/validators.sr_Cyrl.xlf        JФ      A   vendor/symfony/validator/Resources/translations/validators.pt.xlfl      l  Im~      A   vendor/symfony/validator/Resources/translations/validators.nb.xlf        d      A   vendor/symfony/validator/Resources/translations/validators.ca.xlfJ      J  qʤ      A   vendor/symfony/validator/Resources/translations/validators.id.xlf؅      ؅  _      A   vendor/symfony/validator/Resources/translations/validators.eu.xlfp      p  E<+      A   vendor/symfony/validator/Resources/translations/validators.es.xlf        XĤ      A   vendor/symfony/validator/Resources/translations/validators.uz.xlf{      {  uߤ      A   vendor/symfony/validator/Resources/translations/validators.fa.xlfn      n  "u7      A   vendor/symfony/validator/Resources/translations/validators.he.xlf        Cݤ      A   vendor/symfony/validator/Resources/translations/validators.af.xlf        <      A   vendor/symfony/validator/Resources/translations/validators.bg.xlf        L|c      A   vendor/symfony/validator/Resources/translations/validators.sv.xlf              A   vendor/symfony/validator/Resources/translations/validators.my.xlf`      `  Rsݤ      A   vendor/symfony/validator/Resources/translations/validators.fi.xlf߇      ߇  P+      A   vendor/symfony/validator/Resources/translations/validators.no.xlf        d      A   vendor/symfony/validator/Resources/translations/validators.cs.xlf)      )  .      A   vendor/symfony/validator/Resources/translations/validators.da.xlf        nיӤ      A   vendor/symfony/validator/Resources/translations/validators.mn.xlf        F      A   vendor/symfony/validator/Resources/translations/validators.lb.xlf              A   vendor/symfony/validator/Resources/translations/validators.be.xlf        P      D   vendor/symfony/validator/Resources/translations/validators.zh_TW.xlf              A   vendor/symfony/validator/Resources/translations/validators.de.xlf              A   vendor/symfony/validator/Resources/translations/validators.th.xlfߨ      ߨ  ȁY      A   vendor/symfony/validator/Resources/translations/validators.ur.xlf        ӋWT      A   vendor/symfony/validator/Resources/translations/validators.ar.xlfƞ      ƞ  0J*      F   vendor/symfony/validator/Resources/translations/validators.sr_Latn.xlf        eƤ      A   vendor/symfony/validator/Resources/translations/validators.mk.xlf)      )  פ      A   vendor/symfony/validator/Resources/translations/validators.sl.xlf        Vn      A   vendor/symfony/validator/Resources/translations/validators.vi.xlfv      v  -      A   vendor/symfony/validator/Resources/translations/validators.pl.xlf֌      ֌  X      A   vendor/symfony/validator/Resources/translations/validators.fr.xlf        {ZA      A   vendor/symfony/validator/Resources/translations/validators.nl.xlf        *l      D   vendor/symfony/validator/Resources/translations/validators.zh_CN.xlf        #\      A   vendor/symfony/validator/Resources/translations/validators.az.xlfӋ      Ӌ  
%      M   vendor/symfony/validator/DependencyInjection/AddValidatorInitializersPass.php        0h9      P   vendor/symfony/validator/DependencyInjection/AddAutoMappingConfigurationPass.php        -?\      L   vendor/symfony/validator/DependencyInjection/AddConstraintValidatorsPass.php        ~s      9   vendor/symfony/validator/ConstraintValidatorInterface.php5      5  OY      >   vendor/symfony/validator/Exception/NoSuchMetadataException.php          S      @   vendor/symfony/validator/Exception/ValidationFailedException.phpa      a  .      ?   vendor/symfony/validator/Exception/GroupDefinitionException.php          ˉ      ?   vendor/symfony/validator/Exception/UnexpectedValueException.php        Z(ۤ      5   vendor/symfony/validator/Exception/LogicException.php                9   vendor/symfony/validator/Exception/ExceptionInterface.php{       {   *|E      >   vendor/symfony/validator/Exception/UnexpectedTypeException.php7      7  R4~      ?   vendor/symfony/validator/Exception/InvalidArgumentException.php          <      C   vendor/symfony/validator/Exception/UnsupportedMetadataException.php          -d      >   vendor/symfony/validator/Exception/InvalidOptionsException.phpP      P  %Ƥ      D   vendor/symfony/validator/Exception/ConstraintDefinitionException.php          ́Ӥ      >   vendor/symfony/validator/Exception/MissingOptionsException.phpP      P  \      =   vendor/symfony/validator/Exception/BadMethodCallException.php          N>5      7   vendor/symfony/validator/Exception/RuntimeException.php          Y      ;   vendor/symfony/validator/Exception/OutOfBoundsException.php          .o      7   vendor/symfony/validator/Exception/MappingException.phpx       x   m"z      9   vendor/symfony/validator/Exception/ValidatorException.phpx       x   	I      0   vendor/symfony/validator/ConstraintViolation.php        4V٤      -   vendor/symfony/validator/ValidatorBuilder.phpO$      O$  gdʤ      1   vendor/symfony/validator/Command/DebugCommand.php        r:      4   vendor/symfony/validator/ConstraintViolationList.php7	      7	  |B      3   vendor/symfony/validator/GroupProviderInterface.php          8g      @   vendor/symfony/validator/ConstraintValidatorFactoryInterface.php          \      -   vendor/symfony/validator/Constraints/When.php        5a>      1   vendor/symfony/validator/Constraints/Callback.php        u(-      9   vendor/symfony/validator/Constraints/PasswordStrength.phpQ      Q  eI      1   vendor/symfony/validator/Constraints/Positive.php,      ,  u      4   vendor/symfony/validator/Constraints/IdenticalTo.php          y6      /   vendor/symfony/validator/Constraints/IsTrue.php        x      :   vendor/symfony/validator/Constraints/EnableAutoMapping.php        V      6   vendor/symfony/validator/Constraints/FileValidator.php        <!L      8   vendor/symfony/validator/Constraints/UniqueValidator.php               7   vendor/symfony/validator/Constraints/RangeValidator.php8      8  M      ;   vendor/symfony/validator/Constraints/DisableAutoMapping.php        g>      H   vendor/symfony/validator/Constraints/NotCompromisedPasswordValidator.php
      
  <=      1   vendor/symfony/validator/Constraints/CssColor.php
      
  QS      6   vendor/symfony/validator/Constraints/UlidValidator.php        >ߤ      7   vendor/symfony/validator/Constraints/NotIdenticalTo.php$      $  ͋Eߤ      /   vendor/symfony/validator/Constraints/Choice.php#	      #	  b      7   vendor/symfony/validator/Constraints/CountValidator.php        ڈ      0   vendor/symfony/validator/Constraints/Country.phpd      d  ҟ      7   vendor/symfony/validator/Constraints/BlankValidator.php        W/_      8   vendor/symfony/validator/Constraints/LengthValidator.php
      
  %̤      9   vendor/symfony/validator/Constraints/EqualToValidator.php>      >        -   vendor/symfony/validator/Constraints/Ulid.phpL      L  U      1   vendor/symfony/validator/Constraints/NotBlank.php        %V      9   vendor/symfony/validator/Constraints/IsFalseValidator.php        Ce      -   vendor/symfony/validator/Constraints/Isin.php        k      7   vendor/symfony/validator/Constraints/ValidValidator.phpa      a  v:"p      3   vendor/symfony/validator/Constraints/CardScheme.phpe      e  `Iq      .   vendor/symfony/validator/Constraints/Count.php
      
  |澤      1   vendor/symfony/validator/Constraints/Compound.php               :   vendor/symfony/validator/Constraints/LessThanValidator.phpR      R  \Y      A   vendor/symfony/validator/Constraints/ExpressionLanguageSyntax.php        䡓9      5   vendor/symfony/validator/Constraints/AllValidator.phpw      w  
ؤ      ?   vendor/symfony/validator/Constraints/NoSuspiciousCharacters.phpk      k  a      6   vendor/symfony/validator/Constraints/UuidValidator.php        %D$      6   vendor/symfony/validator/Constraints/IsinValidator.php        Ko*      7   vendor/symfony/validator/Constraints/EmailValidator.php5      5  ʫ      9   vendor/symfony/validator/Constraints/ExpressionSyntax.php        t      :   vendor/symfony/validator/Constraints/TimezoneValidator.php
      
  I3:       6   vendor/symfony/validator/Constraints/WhenValidator.phpP      P  Z)      0   vendor/symfony/validator/Constraints/NotNull.php        %      6   vendor/symfony/validator/Constraints/JsonValidator.php        .      -   vendor/symfony/validator/Constraints/Json.php              7   vendor/symfony/validator/Constraints/PositiveOrZero.phpH      H  :t      7   vendor/symfony/validator/Constraints/NegativeOrZero.phpE      E  H߂      0   vendor/symfony/validator/Constraints/EqualTo.php        E      :   vendor/symfony/validator/Constraints/CurrencyValidator.php        \      -   vendor/symfony/validator/Constraints/Isbn.php        -      <   vendor/symfony/validator/Constraints/CollectionValidator.php        àO+      7   vendor/symfony/validator/Constraints/ImageValidator.php        !j      2   vendor/symfony/validator/Constraints/Composite.php	      	  {I      .   vendor/symfony/validator/Constraints/Image.php>       >   g}      >   vendor/symfony/validator/Constraints/AtLeastOneOfValidator.php        U      1   vendor/symfony/validator/Constraints/Optional.phpo       o   fH      3   vendor/symfony/validator/Constraints/Expression.php        H}      :   vendor/symfony/validator/Constraints/NotBlankValidator.phpc      c  t      F   vendor/symfony/validator/Constraints/ZeroComparisonConstraintTrait.php/      /  |      4   vendor/symfony/validator/Constraints/GreaterThan.php        Nzʤ      5   vendor/symfony/validator/Constraints/Sequentially.php        edݤ      6   vendor/symfony/validator/Constraints/DateValidator.php        >r      7   vendor/symfony/validator/Constraints/RegexValidator.phpT      T  H?J      6   vendor/symfony/validator/Constraints/TimeValidator.php-      -  E/W      5   vendor/symfony/validator/Constraints/AtLeastOneOf.phpv      v  q^      +   vendor/symfony/validator/Constraints/Ip.php        ?r       -   vendor/symfony/validator/Constraints/Date.phpj      j  ]¤      3   vendor/symfony/validator/Constraints/Collection.phpQ
      Q
        1   vendor/symfony/validator/Constraints/Negative.php)      )  QG      8   vendor/symfony/validator/Constraints/IsTrueValidator.php        BQŕ      ,   vendor/symfony/validator/Constraints/Bic.php
      
  <xդ      C   vendor/symfony/validator/Constraints/ExpressionLanguageProvider.php        o      =   vendor/symfony/validator/Constraints/IdenticalToValidator.phpK      K  Fs      >   vendor/symfony/validator/Constraints/SequentiallyValidator.php        ;P      0   vendor/symfony/validator/Constraints/Cascade.php        MƤ      B   vendor/symfony/validator/Constraints/PasswordStrengthValidator.php^      ^  +-      :   vendor/symfony/validator/Constraints/CssColorValidator.php        7      .   vendor/symfony/validator/Constraints/Blank.php        Ƅp      -   vendor/symfony/validator/Constraints/Uuid.php5
      5
  H      1   vendor/symfony/validator/Constraints/Currency.php        v      .   vendor/symfony/validator/Constraints/Regex.php	      	  :`      .   vendor/symfony/validator/Constraints/Email.phpo
      o
        ;   vendor/symfony/validator/Constraints/GreaterThanOrEqual.php        PG      0   vendor/symfony/validator/Constraints/IsFalse.php        z(      1   vendor/symfony/validator/Constraints/DateTime.php        SR      ?   vendor/symfony/validator/Constraints/NotCompromisedPassword.php,      ,  c      1   vendor/symfony/validator/Constraints/Hostname.phpj      j  ڬ1      9   vendor/symfony/validator/Constraints/NotNullValidator.php        6q      6   vendor/symfony/validator/Constraints/LuhnValidator.phpz      z        =   vendor/symfony/validator/Constraints/DivisibleByValidator.php        N-      6   vendor/symfony/validator/Constraints/TypeValidator.php0      0  8      6   vendor/symfony/validator/Constraints/GroupSequence.phpG      G  ,      /   vendor/symfony/validator/Constraints/Length.php~      ~  3      H   vendor/symfony/validator/Constraints/NoSuspiciousCharactersValidator.phpr      r  m      8   vendor/symfony/validator/Constraints/LessThanOrEqual.php        6      1   vendor/symfony/validator/Constraints/Language.phpj      j  +ʤ      ,   vendor/symfony/validator/Constraints/All.phph      h        B   vendor/symfony/validator/Constraints/ExpressionSyntaxValidator.php        AV      :   vendor/symfony/validator/Constraints/HostnameValidator.php        ZOҤ      2   vendor/symfony/validator/Constraints/Existence.php"      "  V&u      8   vendor/symfony/validator/Constraints/IsNullValidator.php        IU      /   vendor/symfony/validator/Constraints/Unique.php              :   vendor/symfony/validator/Constraints/DateTimeValidator.phpU      U  UѤ      /   vendor/symfony/validator/Constraints/IsNull.php        b3P      -   vendor/symfony/validator/Constraints/Type.php,      ,  _      5   vendor/symfony/validator/Constraints/UrlValidator.php}      }  ^$      -   vendor/symfony/validator/Constraints/Issn.phpZ      Z  >G      /   vendor/symfony/validator/Constraints/Locale.phpw      w  %%      ;   vendor/symfony/validator/Constraints/AbstractComparison.php        L[      D   vendor/symfony/validator/Constraints/GreaterThanOrEqualValidator.phpf      f        <   vendor/symfony/validator/Constraints/NotEqualToValidator.phpC      C  _Z      :   vendor/symfony/validator/Constraints/LanguageValidator.php              -   vendor/symfony/validator/Constraints/Iban.php[      [  x       A   vendor/symfony/validator/Constraints/LessThanOrEqualValidator.phpa      a  .      4   vendor/symfony/validator/Constraints/DivisibleBy.php        :      1   vendor/symfony/validator/Constraints/LessThan.php        ;.N      ,   vendor/symfony/validator/Constraints/Url.phpm      m  S|      <   vendor/symfony/validator/Constraints/CardSchemeValidator.php        Q      .   vendor/symfony/validator/Constraints/Valid.php        "      .   vendor/symfony/validator/Constraints/Range.php        !z      1   vendor/symfony/validator/Constraints/Traverse.php        Z9      :   vendor/symfony/validator/Constraints/CompoundValidator.phpg      g        -   vendor/symfony/validator/Constraints/Time.php        Hݤ      4   vendor/symfony/validator/Constraints/IpValidator.php        vB      6   vendor/symfony/validator/Constraints/IsbnValidator.php        ɤ      8   vendor/symfony/validator/Constraints/ChoiceValidator.php        7      1   vendor/symfony/validator/Constraints/Timezone.php	      	  SI      D   vendor/symfony/validator/Constraints/AbstractComparisonValidator.php        Do      1   vendor/symfony/validator/Constraints/Required.phpo       o   =      :   vendor/symfony/validator/Constraints/CallbackValidator.php        &p      3   vendor/symfony/validator/Constraints/NotEqualTo.php        ѝ      6   vendor/symfony/validator/Constraints/CidrValidator.php        ;      -   vendor/symfony/validator/Constraints/File.phpX      X        -   vendor/symfony/validator/Constraints/Cidr.php        P̑      6   vendor/symfony/validator/Constraints/IssnValidator.php(
      (
  ⦰      J   vendor/symfony/validator/Constraints/ExpressionLanguageSyntaxValidator.php/      /  x      8   vendor/symfony/validator/Constraints/LocaleValidator.phpG      G  g      <   vendor/symfony/validator/Constraints/ExpressionValidator.php        .9}      9   vendor/symfony/validator/Constraints/CountryValidator.php        Am      @   vendor/symfony/validator/Constraints/NotIdenticalToValidator.phpP      P  U2ޤ      -   vendor/symfony/validator/Constraints/Luhn.php{      {  p      5   vendor/symfony/validator/Constraints/BicValidator.phpy      y  Am      =   vendor/symfony/validator/Constraints/GreaterThanValidator.phpW      W  Bؤ      6   vendor/symfony/validator/Constraints/IbanValidator.php        ]i~      >   vendor/symfony/validator/Constraints/GroupSequenceProvider.php        ZZ      0   vendor/symfony/validator/ConstraintValidator.php        H      A   vendor/symfony/validator/DataCollector/ValidatorDataCollector.php%      %  Yg      =   vendor/symfony/validator/ConstraintViolationListInterface.php^      ^  ta      !   vendor/symfony/var-dumper/LICENSE,      ,  .z      )   vendor/symfony/var-dumper/Cloner/Data.php#      #  e      .   vendor/symfony/var-dumper/Cloner/VarCloner.php          kX      3   vendor/symfony/var-dumper/Cloner/AbstractCloner.phpF      F  hQr      +   vendor/symfony/var-dumper/Cloner/Cursor.php        '`      4   vendor/symfony/var-dumper/Cloner/DumperInterface.php        &Sb      )   vendor/symfony/var-dumper/Cloner/Stub.php        hc      4   vendor/symfony/var-dumper/Cloner/ClonerInterface.php          A      5   vendor/symfony/var-dumper/Test/VarDumperTestTrait.php        $      +   vendor/symfony/var-dumper/Caster/Caster.php8      8  nB      6   vendor/symfony/var-dumper/Caster/XmlResourceCaster.php        h      6   vendor/symfony/var-dumper/Caster/UninitializedStub.php        d      .   vendor/symfony/var-dumper/Caster/PdoCaster.phpd	      d	  _?      .   vendor/symfony/var-dumper/Caster/GmpCaster.phpW      W  7Q      2   vendor/symfony/var-dumper/Caster/ImagineCaster.php        5C      ,   vendor/symfony/var-dumper/Caster/CutStub.phpT      T  5ߤ      4   vendor/symfony/var-dumper/Caster/MemcachedCaster.php`      `        /   vendor/symfony/var-dumper/Caster/ScalarStub.php          :C      .   vendor/symfony/var-dumper/Caster/ConstStub.php        @Ĥ      /   vendor/symfony/var-dumper/Caster/UuidCaster.phpZ      Z  v M      2   vendor/symfony/var-dumper/Caster/OpenSSLCaster.php[      [        .   vendor/symfony/var-dumper/Caster/FrameStub.php                ,   vendor/symfony/var-dumper/Caster/ImgStub.php=      =  ,I-F      0   vendor/symfony/var-dumper/Caster/VirtualStub.php*      *  -      .   vendor/symfony/var-dumper/Caster/ClassStub.phpl	      l	  "rߤ      2   vendor/symfony/var-dumper/Caster/RdKafkaCaster.php        !      /   vendor/symfony/var-dumper/Caster/IntlCaster.php        Ф      4   vendor/symfony/var-dumper/Caster/XmlReaderCaster.phpI	      I	  &#      1   vendor/symfony/var-dumper/Caster/SqliteCaster.php        V      /   vendor/symfony/var-dumper/Caster/AmqpCaster.php=      =  -b      /   vendor/symfony/var-dumper/Caster/StubCaster.php              .   vendor/symfony/var-dumper/Caster/FFICaster.php        c'      1   vendor/symfony/var-dumper/Caster/CutArrayStub.phpm      m  m<      3   vendor/symfony/var-dumper/Caster/ResourceCaster.php        㺤      -   vendor/symfony/var-dumper/Caster/LinkStub.php        N+l      5   vendor/symfony/var-dumper/Caster/ReflectionCaster.php,      ,  䬘Q      3   vendor/symfony/var-dumper/Caster/DoctrineCaster.phpG      G  u&W      6   vendor/symfony/var-dumper/Caster/AddressInfoCaster.php/      /  L      /   vendor/symfony/var-dumper/Caster/DsPairStub.php0      0  <&1      .   vendor/symfony/var-dumper/Caster/TraceStub.phpX      X  
pa      2   vendor/symfony/var-dumper/Caster/SymfonyCaster.php
      
  Eb      -   vendor/symfony/var-dumper/Caster/DsCaster.php        "      -   vendor/symfony/var-dumper/Caster/GdCaster.phpw      w        /   vendor/symfony/var-dumper/Caster/DateCaster.php        J/      .   vendor/symfony/var-dumper/Caster/SplCaster.php        J      1   vendor/symfony/var-dumper/Caster/MysqliCaster.phpL      L  P      -   vendor/symfony/var-dumper/Caster/EnumStub.php                0   vendor/symfony/var-dumper/Caster/FiberCaster.phpP      P  |Ѥ      -   vendor/symfony/var-dumper/Caster/ArgsStub.php        Y"      .   vendor/symfony/var-dumper/Caster/DOMCaster.php
      
  ^]ˤ      4   vendor/symfony/var-dumper/Caster/ExceptionCaster.php/      /  Քa/      7   vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php        -൤      0   vendor/symfony/var-dumper/Caster/RedisCaster.phpg      g  k      /   vendor/symfony/var-dumper/Caster/CurlCaster.phpQ      Q  2      0   vendor/symfony/var-dumper/Caster/PgSqlCaster.php        fACh      1   vendor/symfony/var-dumper/Caster/SocketCaster.php        chä      '   vendor/symfony/var-dumper/VarDumper.php        diä      /   vendor/symfony/var-dumper/Server/Connection.php        r      /   vendor/symfony/var-dumper/Server/DumpServer.php        6X      :   vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css        Dva      8   vendor/symfony/var-dumper/Resources/js/htmlDescriptor.jsb      b  h|      6   vendor/symfony/var-dumper/Resources/functions/dump.php        "      7   vendor/symfony/var-dumper/Resources/bin/var-dump-server^      ^  NJ      ?   vendor/symfony/var-dumper/Exception/ThrowingCasterException.php        7      7   vendor/symfony/var-dumper/Command/ServerDumpCommand.php        {rcE      H   vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php<      <  ސ      ?   vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php        ,K      >   vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.phpb      b  &V%      /   vendor/symfony/var-dumper/Dumper/HtmlDumper.phpuy      uy  ;nE      9   vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php        VN      3   vendor/symfony/var-dumper/Dumper/AbstractDumper.php[      [  Ɛ9      1   vendor/symfony/var-dumper/Dumper/ServerDumper.php        MIav      8   vendor/symfony/var-dumper/Dumper/DataDumperInterface.php          SD      .   vendor/symfony/var-dumper/Dumper/CliDumper.php9      9  Na`      K   vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php        fϷ      M   vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php                G   vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php        dꭤ      J   vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php        ara      8   vendor/symfony/error-handler/Internal/TentativeTypes.phpƝ      Ɲ  F3i      1   vendor/symfony/error-handler/DebugClassLoader.phpk      k  lhu      $   vendor/symfony/error-handler/LICENSE,      ,  զ_Ϥ      &   vendor/symfony/error-handler/Debug.phpl      l  G
      E   vendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php          ht      I   vendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php        }      M   vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php        J      K   vendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.phpz      z  EQ{      ;   vendor/symfony/error-handler/Error/UndefinedMethodError.php        CL㓤      7   vendor/symfony/error-handler/Error/OutOfMemoryError.phpo       o         1   vendor/symfony/error-handler/Error/FatalError.php        XL      9   vendor/symfony/error-handler/Error/ClassNotFoundError.php        Wg      =   vendor/symfony/error-handler/Error/UndefinedFunctionError.php        tn      @   vendor/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php        tw      F   vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php        [/G      ?   vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php6      6  s^W      @   vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.phpN      N        E   vendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.phpo      o  >      0   vendor/symfony/error-handler/BufferingLogger.php(      (  J      :   vendor/symfony/error-handler/Resources/views/logs.html.php        yX      A   vendor/symfony/error-handler/Resources/views/traces_text.html.php        R\      ;   vendor/symfony/error-handler/Resources/views/error.html.php3      3  Ky      ?   vendor/symfony/error-handler/Resources/views/exception.html.php        )      <   vendor/symfony/error-handler/Resources/views/traces.html.php	      	  =      D   vendor/symfony/error-handler/Resources/views/exception_full.html.php4      4  [.      ;   vendor/symfony/error-handler/Resources/views/trace.html.php	      	  ;      B   vendor/symfony/error-handler/Resources/assets/images/icon-book.svg              E   vendor/symfony/error-handler/Resources/assets/images/icon-support.svgz      z  S̤      G   vendor/symfony/error-handler/Resources/assets/images/favicon.png.base64        "i^      F   vendor/symfony/error-handler/Resources/assets/images/chevron-right.svg              K   vendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg        -      J   vendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svgQ      Q  p      J   vendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php              I   vendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg        U      L   vendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg        s0      E   vendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg        %0ɤ      B   vendor/symfony/error-handler/Resources/assets/images/icon-copy.svg	      	  "Ȗ      ;   vendor/symfony/error-handler/Resources/assets/css/error.css        %7      D   vendor/symfony/error-handler/Resources/assets/css/exception_full.css
      
  *bc      ?   vendor/symfony/error-handler/Resources/assets/css/exception.css"B      "B  SE
&      =   vendor/symfony/error-handler/Resources/assets/js/exception.js4      4  C#      M   vendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.phpv      v  RB'Q      B   vendor/symfony/error-handler/Resources/bin/patch-type-declarationsp      p  Ҥ      ?   vendor/symfony/error-handler/Exception/SilencedErrorContext.php        h4      ;   vendor/symfony/error-handler/Exception/FlattenException.php~!      ~!  8 I      9   vendor/symfony/error-handler/Command/ErrorDumpCommand.php
      
  GV      /   vendor/symfony/error-handler/ThrowableUtils.php	      	  h      -   vendor/symfony/error-handler/ErrorHandler.php6C      6C  >      3   vendor/symfony/event-dispatcher-contracts/Event.php        {Ty      1   vendor/symfony/event-dispatcher-contracts/LICENSE,      ,        F   vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.phpC      C  \      1   vendor/symfony/dependency-injection/Reference.php        ,t      D   vendor/symfony/dependency-injection/Extension/ExtensionInterface.phpw      w         K   vendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php          aE      P   vendor/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.phpH      H  ;`      @   vendor/symfony/dependency-injection/Extension/ExtensionTrait.phpJ	      J	  Hze      C   vendor/symfony/dependency-injection/Extension/AbstractExtension.php        ;ڤ      ;   vendor/symfony/dependency-injection/Extension/Extension.php	      	  7      Q   vendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.phpO      O  )a      8   vendor/symfony/dependency-injection/ContainerBuilder.php;      ;  z.      6   vendor/symfony/dependency-injection/Attribute/When.php        Wi[/      ?   vendor/symfony/dependency-injection/Attribute/TaggedLocator.php        e      9   vendor/symfony/dependency-injection/Attribute/Exclude.php          g"      ?   vendor/symfony/dependency-injection/Attribute/Autoconfigure.php        E      @   vendor/symfony/dependency-injection/Attribute/TaggedIterator.php        D      >   vendor/symfony/dependency-injection/Attribute/AsTaggedItem.php          =і      C   vendor/symfony/dependency-injection/Attribute/AutowireDecorated.php          CА      9   vendor/symfony/dependency-injection/Attribute/AsAlias.php        x݅      B   vendor/symfony/dependency-injection/Attribute/AutowireCallable.php/      /  |      :   vendor/symfony/dependency-injection/Attribute/Autowire.php        cŤ      B   vendor/symfony/dependency-injection/Attribute/AutoconfigureTag.phpS      S  G      A   vendor/symfony/dependency-injection/Attribute/AutowireLocator.php        `^      =   vendor/symfony/dependency-injection/Attribute/AsDecorator.phpl      l  E      B   vendor/symfony/dependency-injection/Attribute/AutowireIterator.phpc      c        H   vendor/symfony/dependency-injection/Attribute/AutowireServiceClosure.php        JX[      8   vendor/symfony/dependency-injection/Attribute/Target.phpn      n  |%      >   vendor/symfony/dependency-injection/Attribute/MapDecorated.php1      1        V   vendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php        tnP      T   vendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php        Ԥ      V   vendor/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.php"      "  ^DP      =   vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.phpX      X        F   vendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php.      .  9E      K   vendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php              M   vendor/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.phpH      H  e      +   vendor/symfony/dependency-injection/LICENSE,      ,  U      6   vendor/symfony/dependency-injection/TypedReference.php        pӤ      6   vendor/symfony/dependency-injection/ServiceLocator.phpL      L  R      -   vendor/symfony/dependency-injection/Alias.php        1Dd      2   vendor/symfony/dependency-injection/Definition.phpO)      O)  Ҥ      ?   vendor/symfony/dependency-injection/ContainerAwareInterface.php          {h      @   vendor/symfony/dependency-injection/TaggedContainerInterface.php                O   vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.phpz      z  [!      A   vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php        ި<      J   vendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php%      %  $M{      A   vendor/symfony/dependency-injection/ParameterBag/ContainerBag.php        \      G   vendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.phpn      n  {      J   vendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.phpN      N  @Vͤ      8   vendor/symfony/dependency-injection/ReverseContainer.phpC      C  4'      J   vendor/symfony/dependency-injection/Config/ContainerParametersResource.php         8'      Q   vendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.phpU      U  y      B   vendor/symfony/dependency-injection/ExpressionLanguageProvider.php        rǤ      F   vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php_      _  䧤      L   vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php        Q      L   vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php        >j      Q   vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php\      \  %ҭ      R   vendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php        yФ      ;   vendor/symfony/dependency-injection/Compiler/PassConfig.php              P   vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php        ѷT      L   vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php              M   vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php              L   vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.phpx      x  Iݤ      A   vendor/symfony/dependency-injection/Compiler/ResolveClassPass.phpK      K  ?      F   vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php        +)      S   vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php#	      #	        N   vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php        x~l      R   vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php        td      M   vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.phpC	      C	  LƤ      K   vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php        u      I   vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php        c6U      C   vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php"      "  `'!      O   vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php        m!      L   vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php        G      F   vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php                 J   vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php         m      F   vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php        yQ      M   vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.phph      h  `@      J   vendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php        B      N   vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php        ^      H   vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.phpI      I  ( :      K   vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php          ׾e      J   vendor/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.php        a      L   vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php
      
  ;      F   vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php$      $  V      M   vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php        hl8      J   vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php!      !        J   vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.phpV      V  QN      E   vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php              O   vendor/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php        >/      ]   vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.phpr      r  8q      =   vendor/symfony/dependency-injection/Compiler/AutowirePass.phpX      X  %=Y      D   vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php        eS      M   vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php        ػ      H   vendor/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.phpu      u        M   vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php        h0      E   vendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php        f	      O   vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php        qv      T   vendor/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php        '      E   vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php        zڤ      O   vendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php        Yi      R   vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php        3xƤ      J   vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php\      \  N	      9   vendor/symfony/dependency-injection/Compiler/Compiler.php        y      K   vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php        e{W      K   vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php        H       1   vendor/symfony/dependency-injection/Container.php"      "  ݤ      7   vendor/symfony/dependency-injection/ChildDefinition.phpe      e  ]h      0   vendor/symfony/dependency-injection/Variable.php          ʨc"      7   vendor/symfony/dependency-injection/EnvVarProcessor.php $       $        :   vendor/symfony/dependency-injection/ExpressionLanguage.php^      ^  ֤      =   vendor/symfony/dependency-injection/EnvVarLoaderInterface.php          <9-      ;   vendor/symfony/dependency-injection/ContainerAwareTrait.phpJ      J  (S%U      F   vendor/symfony/dependency-injection/Exception/EnvNotFoundException.php          a      U   vendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php        t~      K   vendor/symfony/dependency-injection/Exception/AutowiringFailedException.php3      3  k      S   vendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php^      ^  (#?      O   vendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.phpK      K  Z      @   vendor/symfony/dependency-injection/Exception/LogicException.php          OY      G   vendor/symfony/dependency-injection/Exception/EnvParameterException.php        S-      L   vendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php        dΆF      D   vendor/symfony/dependency-injection/Exception/ExceptionInterface.php          Ѥ      J   vendor/symfony/dependency-injection/Exception/InvalidArgumentException.php          K      J   vendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php        MF      H   vendor/symfony/dependency-injection/Exception/BadMethodCallException.php          hڀ      B   vendor/symfony/dependency-injection/Exception/RuntimeException.php          Cן      F   vendor/symfony/dependency-injection/Exception/OutOfBoundsException.php          T~셤      ?   vendor/symfony/dependency-injection/Argument/ServiceLocator.phpa      a  /,      A   vendor/symfony/dependency-injection/Argument/AbstractArgument.php        Y ,1      G   vendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php        sv      J   vendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php<      <   )      G   vendor/symfony/dependency-injection/Argument/ServiceClosureArgument.phpM      M  μ      A   vendor/symfony/dependency-injection/Argument/IteratorArgument.phpr      r        B   vendor/symfony/dependency-injection/Argument/ArgumentInterface.php          r2F      >   vendor/symfony/dependency-injection/Argument/BoundArgument.php        X      G   vendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php        ¤      <   vendor/symfony/dependency-injection/Argument/LazyClosure.php	      	  C      D   vendor/symfony/dependency-injection/Argument/RewindableGenerator.phpF      F  Js)*      1   vendor/symfony/dependency-injection/Parameter.php          cH      @   vendor/symfony/dependency-injection/EnvVarProcessorInterface.phpC      C  I:      :   vendor/symfony/dependency-injection/ContainerInterface.php        D)      8   vendor/symfony/dependency-injection/Dumper/Preloader.php
      
  G      8   vendor/symfony/dependency-injection/Dumper/PhpDumper.php(     ( s8V      =   vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php        !      >   vendor/symfony/dependency-injection/Dumper/DumperInterface.php          NF      8   vendor/symfony/dependency-injection/Dumper/XmlDumper.phpX5      X5  Uˤ      5   vendor/symfony/dependency-injection/Dumper/Dumper.php3      3  F      9   vendor/symfony/dependency-injection/Dumper/YamlDumper.phpZ*      Z*        =   vendor/symfony/dependency-injection/Loader/GlobFileLoader.php         o      P   vendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php        H7      T   vendor/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.phpc      c  $d      X   vendor/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php                O   vendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.phpt      t  /4ѳ      U   vendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php        8$%      P   vendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php"      "  m      Q   vendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.phpx      x  ˣ      Q   vendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php        y{      K   vendor/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php	      	  U      Q   vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php        *x^      M   vendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php        0,ä      R   vendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php1      1  dt      W   vendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php9      9  BU      R   vendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php        ͗      P   vendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php        '*פ      Q   vendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php~      ~  꿤      M   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php          x8      L   vendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.phpt      t  |      L   vendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.phpI      I  V!      T   vendor/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php        (C      L   vendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php          ־      K   vendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php        z\      U   vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.phpc      c  Jn      S   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.php        ]      O   vendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php              P   vendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php              Q   vendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php          u      N   vendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php8      8  -      P   vendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php                M   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php          ڤ      P   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php        U0      P   vendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php!      !  t      T   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php        7      P   vendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php          :EϤ      N   vendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.phpz      z  +&MN      L   vendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php        
P      <   vendor/symfony/dependency-injection/Loader/IniFileLoader.php        nzeR      9   vendor/symfony/dependency-injection/Loader/FileLoader.php)      )  [ڤ      <   vendor/symfony/dependency-injection/Loader/XmlFileLoader.phpp      p  
s5u      =   vendor/symfony/dependency-injection/Loader/YamlFileLoader.php        y      O   vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsdB      B  o      <   vendor/symfony/dependency-injection/Loader/PhpFileLoader.php;      ;  Q<      >   vendor/symfony/dependency-injection/Loader/DirectoryLoader.php        [7      <   vendor/symfony/dependency-injection/Loader/ClosureLoader.php{      {  ˦      6   vendor/symfony/options-resolver/OptionConfigurator.phpo      o  Z-      '   vendor/symfony/options-resolver/LICENSE,      ,  U      +   vendor/symfony/options-resolver/Options.php{       {   |      =   vendor/symfony/options-resolver/Exception/AccessException.php          5      F   vendor/symfony/options-resolver/Exception/NoConfigurationException.php          jE      @   vendor/symfony/options-resolver/Exception/ExceptionInterface.php          &      F   vendor/symfony/options-resolver/Exception/InvalidArgumentException.php          G      E   vendor/symfony/options-resolver/Exception/InvalidOptionsException.php          k      E   vendor/symfony/options-resolver/Exception/MissingOptionsException.php          =      G   vendor/symfony/options-resolver/Exception/OptionDefinitionException.php          @4      C   vendor/symfony/options-resolver/Exception/NoSuchOptionException.php          g]Ȥ      G   vendor/symfony/options-resolver/Exception/UndefinedOptionsException.php          p͐      3   vendor/symfony/options-resolver/OptionsResolver.php_      _  cr      E   vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.phpF      F  n |         vendor/symfony/dotenv/LICENSE,      ,  X      3   vendor/symfony/dotenv/Exception/FormatException.phpO      O  :b6      :   vendor/symfony/dotenv/Exception/FormatExceptionContext.phpF      F  2      1   vendor/symfony/dotenv/Exception/PathException.phpZ      Z  -Qs      6   vendor/symfony/dotenv/Exception/ExceptionInterface.phpx       x   =!?      .   vendor/symfony/dotenv/Command/DebugCommand.php        f      3   vendor/symfony/dotenv/Command/DotenvDumpCommand.php        Ф          vendor/symfony/dotenv/Dotenv.php`5      `5  pJ      @   vendor/symfony/service-contracts/Attribute/SubscribedService.php        <HE      7   vendor/symfony/service-contracts/Attribute/Required.php          xj네      (   vendor/symfony/service-contracts/LICENSE,      ,        ?   vendor/symfony/service-contracts/ServiceCollectionInterface.php          d      ;   vendor/symfony/service-contracts/ServiceSubscriberTrait.php3      3  17      3   vendor/symfony/service-contracts/ResetInterface.php|       |   Ӥ      8   vendor/symfony/service-contracts/ServiceLocatorTrait.php	      	  R2      ?   vendor/symfony/service-contracts/ServiceSubscriberInterface.php          ߘ      <   vendor/symfony/service-contracts/Test/ServiceLocatorTest.php          mԤ      @   vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php~      ~  ub      B   vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php              =   vendor/symfony/service-contracts/ServiceProviderInterface.phpL      L  ä      ,   vendor/symfony/cache/ResettableInterface.php                +   vendor/symfony/cache/PruneableInterface.phpw       w   	T         vendor/symfony/cache/LICENSE,      ,  X      7   vendor/symfony/cache/Marshaller/MarshallerInterface.php          ?      5   vendor/symfony/cache/Marshaller/DeflateMarshaller.php              4   vendor/symfony/cache/Marshaller/SodiumMarshaller.php        -      6   vendor/symfony/cache/Marshaller/TagAwareMarshaller.php        f#%      5   vendor/symfony/cache/Marshaller/DefaultMarshaller.php	      	  r      :   vendor/symfony/cache/DependencyInjection/CachePoolPass.php          |      @   vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php              ?   vendor/symfony/cache/DependencyInjection/CacheCollectorPass.phpn      n  #f      A   vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php        z      1   vendor/symfony/cache/Exception/CacheException.php        J/      1   vendor/symfony/cache/Exception/LogicException.php        x      ;   vendor/symfony/cache/Exception/InvalidArgumentException.php        ~?      #   vendor/symfony/cache/Psr16Cache.php        +      +   vendor/symfony/cache/Traits/Redis6Proxy.php                ,   vendor/symfony/cache/Traits/ValueWrapper.phpC      C  ^      .   vendor/symfony/cache/Traits/ContractsTrait.php        a(      2   vendor/symfony/cache/Traits/RedisCluster5Proxy.php        Q
      7   vendor/symfony/cache/Traits/RedisCluster6ProxyTrait.php        ػ~      0   vendor/symfony/cache/Traits/Redis6ProxyTrait.php        䔾      *   vendor/symfony/cache/Traits/ProxyTrait.php        G=      *   vendor/symfony/cache/Traits/RedisTrait.phpR      R  =&դ      1   vendor/symfony/cache/Traits/RedisClusterProxy.php        F      5   vendor/symfony/cache/Traits/FilesystemCommonTrait.php        ?&      2   vendor/symfony/cache/Traits/RedisCluster6Proxy.php        q      *   vendor/symfony/cache/Traits/RelayProxy.php        K      *   vendor/symfony/cache/Traits/RedisProxy.php          IT      4   vendor/symfony/cache/Traits/AbstractAdapterTrait.phpW      W  J|      /   vendor/symfony/cache/Traits/FilesystemTrait.php        M2      +   vendor/symfony/cache/Traits/Redis5Proxy.phpx      x  Co      4   vendor/symfony/cache/Traits/Relay/GeosearchTrait.php}      }  _ {      /   vendor/symfony/cache/Traits/Relay/MoveTrait.php        m\̤      /   vendor/symfony/cache/Traits/Relay/HsetTrait.php9      9  
a.      2   vendor/symfony/cache/Traits/Relay/Relay11Trait.php"      "  tsC      -   vendor/symfony/cache/Traits/Relay/FtTrait.php        aځ"      1   vendor/symfony/cache/Traits/Relay/SwapdbTrait.phpq      q  ,G      1   vendor/symfony/cache/Traits/Relay/BgsaveTrait.php$      $        9   vendor/symfony/cache/Traits/Relay/NullableReturnTrait.phpD      D  (      3   vendor/symfony/cache/Traits/Relay/GetrangeTrait.php5      5  c*pV      /   vendor/symfony/cache/Traits/Relay/CopyTrait.php8      8  6}*      2   vendor/symfony/cache/Traits/Relay/PfcountTrait.php)      )  曉X      3   vendor/symfony/cache/Traits/Relay/Relay121Trait.phpb      b  nk      4   vendor/symfony/cache/Traits/Relay/IsTrackedTrait.phpe      e  pb      6   vendor/symfony/cache/Traits/Relay/GetWithMetaTrait.php        b      2   vendor/symfony/cache/Traits/Relay/Relay12Trait.php              4   vendor/symfony/cache/Traits/CachedValueInterface.php          <\      /   vendor/symfony/cache/Traits/RelayProxyTrait.php!      !  E      5   vendor/symfony/cache/Traits/RedisClusterNodeProxy.php        6yӤ      "   vendor/symfony/cache/CacheItem.php        /      7   vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php        ˤ      -   vendor/symfony/cache/Adapter/ProxyAdapter.php              2   vendor/symfony/cache/Adapter/FilesystemAdapter.php        2      ,   vendor/symfony/cache/Adapter/ApcuAdapter.phpk	      k	  T{      8   vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php        Ob^      :   vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php        x3s      4   vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php.      .  H̤      -   vendor/symfony/cache/Adapter/ArrayAdapter.php        G+T      0   vendor/symfony/cache/Adapter/PhpFilesAdapter.php        l      0   vendor/symfony/cache/Adapter/TagAwareAdapter.php        ~Ѥ      ;   vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php^      ^  O      0   vendor/symfony/cache/Adapter/AbstractAdapter.php        Q      -   vendor/symfony/cache/Adapter/RedisAdapter.php        B      1   vendor/symfony/cache/Adapter/TraceableAdapter.php        k      +   vendor/symfony/cache/Adapter/PdoAdapter.phpf,      f,  z٣c      9   vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php        !lФ      ,   vendor/symfony/cache/Adapter/NullAdapter.php        W-L      9   vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php                -   vendor/symfony/cache/Adapter/ChainAdapter.phpo      o  c(t      5   vendor/symfony/cache/Adapter/RedisTagAwareAdapter.phpa       a   Y      1   vendor/symfony/cache/Adapter/AdapterInterface.php        ͇A      4   vendor/symfony/cache/Adapter/ParameterNormalizer.php
      
  AH      -   vendor/symfony/cache/Adapter/Psr16Adapter.php        a      0   vendor/symfony/cache/Adapter/PhpArrayAdapter.php          .4Ϥ      1   vendor/symfony/cache/Adapter/MemcachedAdapter.php!      !  Qv1      9   vendor/symfony/cache/DataCollector/CacheDataCollector.phpS      S  <WW      9   vendor/symfony/cache/Messenger/EarlyExpirationMessage.phpt      t  $I      <   vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php              9   vendor/symfony/cache/Messenger/EarlyExpirationHandler.php        kԤ      %   vendor/symfony/cache/LockRegistry.php        ز      1   vendor/symfony/cache-contracts/CacheInterface.phpg      g  4Pm      &   vendor/symfony/cache-contracts/LICENSE,      ,        -   vendor/symfony/cache-contracts/CacheTrait.php        i       0   vendor/symfony/cache-contracts/ItemInterface.php        ԥ:      4   vendor/symfony/cache-contracts/CallbackInterface.php          _      :   vendor/symfony/cache-contracts/NamespacedPoolInterface.php          ,٤      9   vendor/symfony/cache-contracts/TagAwareCacheInterface.php          @      ,   vendor/symfony/translation-contracts/LICENSE,      ,        <   vendor/symfony/translation-contracts/Test/TranslatorTest.php-      -  'g/      =   vendor/symfony/translation-contracts/LocaleAwareInterface.php          Wݤ      >   vendor/symfony/translation-contracts/TranslatableInterface.php          z@      8   vendor/symfony/translation-contracts/TranslatorTrait.php"      "  %
      <   vendor/symfony/translation-contracts/TranslatorInterface.php&      &  <      <   vendor/symfony/event-dispatcher/EventSubscriberInterface.php          !jcK      =   vendor/symfony/event-dispatcher/Attribute/AsEventListener.phpd      d        3   vendor/symfony/event-dispatcher/EventDispatcher.php        KI      '   vendor/symfony/event-dispatcher/LICENSE,      ,  U      0   vendor/symfony/event-dispatcher/GenericEvent.php6      6  N^      M   vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.phpr      r  RǤ      K   vendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php              <   vendor/symfony/event-dispatcher/EventDispatcherInterface.php#      #  jJL      B   vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php"      "  [      9   vendor/symfony/event-dispatcher/Debug/WrappedListener.php        k೤      <   vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php        ߾ [      J   vendor/symfony/expression-language/ExpressionFunctionProviderInterface.php          
ڕ      ,   vendor/symfony/expression-language/Lexer.php]      ]  {      *   vendor/symfony/expression-language/LICENSE,      ,  U      7   vendor/symfony/expression-language/ParsedExpression.phpr      r  -mr      4   vendor/symfony/expression-language/Node/NameNode.php         R      ;   vendor/symfony/expression-language/Node/ConditionalNode.php        Oq      7   vendor/symfony/expression-language/Node/GetAttrNode.phpU      U  vS      8   vendor/symfony/expression-language/Node/ConstantNode.phpU      U  Zܗ      6   vendor/symfony/expression-language/Node/BinaryNode.php        봤      8   vendor/symfony/expression-language/Node/FunctionNode.phpE      E  HF      9   vendor/symfony/expression-language/Node/ArgumentsNode.php        ,6̤      5   vendor/symfony/expression-language/Node/ArrayNode.php        ;      0   vendor/symfony/expression-language/Node/Node.php              <   vendor/symfony/expression-language/Node/NullCoalesceNode.php|      |  z      5   vendor/symfony/expression-language/Node/UnaryNode.php        {      2   vendor/symfony/expression-language/SyntaxError.php        z      A   vendor/symfony/expression-language/SerializedParsedExpression.php        ֤      1   vendor/symfony/expression-language/Expression.php        Vf      ,   vendor/symfony/expression-language/Token.php1      1  "(H^      -   vendor/symfony/expression-language/Parser.php*      *  ltW      L   vendor/symfony/expression-language/Resources/bin/generate_operator_regex.php        )p      2   vendor/symfony/expression-language/TokenStream.php        tp      9   vendor/symfony/expression-language/ExpressionLanguage.php        zB      9   vendor/symfony/expression-language/ExpressionFunction.phpZ      Z  #8AϤ      /   vendor/symfony/expression-language/Compiler.php        g<{u      %   vendor/symfony/polyfill-php83/LICENSE,      ,  t=      '   vendor/symfony/polyfill-php83/Php83.php        `W      -   vendor/symfony/polyfill-php83/bootstrap81.php              A   vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php]       ]         ;   vendor/symfony/polyfill-php83/Resources/stubs/DateError.phpS       S   п1      O   vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.phpo       o   r      @   vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php\       \   W      ?   vendor/symfony/polyfill-php83/Resources/stubs/DateException.php[       [   K8d      T   vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.phpt       t   ]o      V   vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.phpv       v   $tɤ      B   vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php^       ^   ~Ԟ      N   vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.phpn       n         N   vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.phpn       n   0      :   vendor/symfony/polyfill-php83/Resources/stubs/Override.php          ̐      +   vendor/symfony/polyfill-php83/bootstrap.php        KƤ         vendor/symfony/yaml/LICENSE,      ,  U         vendor/symfony/yaml/Escaper.php        iʄ[         vendor/symfony/yaml/Yaml.php        ~X         vendor/symfony/yaml/Inline.phpV      V  gf         vendor/symfony/yaml/Parser.php|      |  /      !   vendor/symfony/yaml/Unescaper.php>      >  }T      +   vendor/symfony/yaml/Resources/bin/yaml-lint              0   vendor/symfony/yaml/Exception/ParseException.php        k'W      /   vendor/symfony/yaml/Exception/DumpException.phps       s   Ƥ      4   vendor/symfony/yaml/Exception/ExceptionInterface.phpv       v   0ʤ      2   vendor/symfony/yaml/Exception/RuntimeException.php          $      +   vendor/symfony/yaml/Command/LintCommand.phpt      t  8ӫ         vendor/symfony/yaml/Dumper.php_      _  }      '   vendor/symfony/yaml/Tag/TaggedValue.php]      ]  +\ܤ         vendor/brick/math/LICENSEA      A  ݸL      -   vendor/brick/math/src/Internal/Calculator.php        GhV      ;   vendor/brick/math/src/Internal/Calculator/GmpCalculator.php	      	  n^v      >   vendor/brick/math/src/Internal/Calculator/NativeCalculator.php        9      >   vendor/brick/math/src/Internal/Calculator/BcMathCalculator.phpU      U  +m      5   vendor/brick/math/src/Internal/CalculatorRegistry.php        Pe      %   vendor/brick/math/src/BigRational.php        O      $   vendor/brick/math/src/BigDecimal.php/      /  wq̤      &   vendor/brick/math/src/RoundingMode.php/      /  v      $   vendor/brick/math/src/BigInteger.php<      <  ;      #   vendor/brick/math/src/BigNumber.php        鮤      >   vendor/brick/math/src/Exception/RoundingNecessaryException.phpA      A  "<      9   vendor/brick/math/src/Exception/NumberFormatException.php        qS`7      ;   vendor/brick/math/src/Exception/DivisionByZeroException.php/      /  (      <   vendor/brick/math/src/Exception/IntegerOverflowException.php        G>      ;   vendor/brick/math/src/Exception/NegativeNumberException.php          b6      1   vendor/brick/math/src/Exception/MathException.phpw       w   ހv       &   vendor/dflydev/dot-access-data/LICENSE.      .  6w.      +   vendor/dflydev/dot-access-data/src/Data.php        8 \      4   vendor/dflydev/dot-access-data/src/DataInterface.php        >1      E   vendor/dflydev/dot-access-data/src/Exception/MissingPathException.php        n      >   vendor/dflydev/dot-access-data/src/Exception/DataException.php          Mq      E   vendor/dflydev/dot-access-data/src/Exception/InvalidPathException.php          ?1i      +   vendor/dflydev/dot-access-data/src/Util.phpl      l  
=Ѓ         vendor/psr/container/LICENSEy      y  Op      7   vendor/psr/container/src/NotFoundExceptionInterface.phpq       q   R      8   vendor/psr/container/src/ContainerExceptionInterface.phpp       p   ;Z
      /   vendor/psr/container/src/ContainerInterface.php                   vendor/psr/http-client/LICENSE=      =  S      7   vendor/psr/http-client/src/ClientExceptionInterface.php`       `   f      8   vendor/psr/http-client/src/NetworkExceptionInterface.php          Dd      8   vendor/psr/http-client/src/RequestExceptionInterface.php          ɾ      .   vendor/psr/http-client/src/ClientInterface.php          o穤         vendor/psr/log/LICENSE=      =  pO      %   vendor/psr/log/src/AbstractLogger.phpp       p   %WФ      !   vendor/psr/log/src/NullLogger.php          +L      '   vendor/psr/log/src/LoggerAwareTrait.php          ݅Ѥ      /   vendor/psr/log/src/InvalidArgumentException.php`       `    X1         vendor/psr/log/src/LogLevel.php          j8      +   vendor/psr/log/src/LoggerAwareInterface.php~       ~   >      &   vendor/psr/log/src/LoggerInterface.phpa      a  _      "   vendor/psr/log/src/LoggerTrait.php                 vendor/psr/http-factory/LICENSE(      (  }]      8   vendor/psr/http-factory/src/ResponseFactoryInterface.php          C      6   vendor/psr/http-factory/src/StreamFactoryInterface.phpT      T  0(      =   vendor/psr/http-factory/src/ServerRequestFactoryInterface.php          y)=      7   vendor/psr/http-factory/src/RequestFactoryInterface.php          bߤ      <   vendor/psr/http-factory/src/UploadedFileFactoryInterface.php*      *  ,      3   vendor/psr/http-factory/src/UriFactoryInterface.php          Z         vendor/psr/http-message/LICENSE=      =        1   vendor/psr/http-message/src/ResponseInterface.php=      =  #      6   vendor/psr/http-message/src/ServerRequestInterface.php7      7  2_ڤ      5   vendor/psr/http-message/src/UploadedFileInterface.php        ZOP      /   vendor/psr/http-message/src/StreamInterface.php        ě      0   vendor/psr/http-message/src/MessageInterface.phpV      V  jj      ,   vendor/psr/http-message/src/UriInterface.php\      \  S8      0   vendor/psr/http-message/src/RequestInterface.php.      .  y      '   vendor/psr/cache/src/CacheException.phpP       P   n)      /   vendor/psr/cache/src/CacheItemPoolInterface.phpj      j  ^      1   vendor/psr/cache/src/InvalidArgumentException.phpa       a   -      +   vendor/psr/cache/src/CacheItemInterface.php                 vendor/psr/cache/LICENSE.txt8      8  Df      #   vendor/psr/event-dispatcher/LICENSE(      (  }]      <   vendor/psr/event-dispatcher/src/EventDispatcherInterface.php          ISؤ      =   vendor/psr/event-dispatcher/src/ListenerProviderInterface.php          7
      ;   vendor/psr/event-dispatcher/src/StoppableEventInterface.php          .      "   vendor/evenement/evenement/LICENSE          {I=      /   vendor/evenement/evenement/src/EventEmitter.php          "ʵ      4   vendor/evenement/evenement/src/EventEmitterTrait.php        w      8   vendor/evenement/evenement/src/EventEmitterInterface.php        h,o      ,   vendor/grasmash/expander/src/Stringifier.php          8bI      5   vendor/grasmash/expander/src/StringifierInterface.php          Xڤ      )   vendor/grasmash/expander/src/Expander.php              1   vendor/acquia/drupal-environment-detector/LICENSEF      F  FN      Q   vendor/acquia/drupal-environment-detector/src/AcquiaDrupalEnvironmentDetector.php        )|      B   vendor/acquia/drupal-environment-detector/src/EnvironmentNames.php        1      ;   vendor/acquia/drupal-environment-detector/src/FilePaths.php}      }  J      *   vendor/graham-campbell/result-type/LICENSEX      X  %¤      0   vendor/graham-campbell/result-type/src/Error.php1      1  `Q      2   vendor/graham-campbell/result-type/src/Success.php(      (  _O@P      1   vendor/graham-campbell/result-type/src/Result.php        #	Ҥ      #   vendor/league/oauth2-client/LICENSER      R  ~!_      <   vendor/league/oauth2-client/src/Provider/GenericProvider.php        W      A   vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php        &      C   vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php                P   vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.phpc      c  sy      =   vendor/league/oauth2-client/src/Provider/AbstractProvider.php-      -  R      :   vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php          3      ?   vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php        r|Τ      >   vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php;      ;  ⾤      A   vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php        ͠      ;   vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php        $;      >   vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php(      (  2      7   vendor/league/oauth2-client/src/Tool/RequestFactory.php              =   vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php+      +  1.      G   vendor/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php          J1]      >   vendor/league/oauth2-client/src/Token/AccessTokenInterface.php        ;1      K   vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php                5   vendor/league/oauth2-client/src/Token/AccessToken.phpZ      Z  er      N   vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php        [S       I   vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php        &)      J   vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php          [Tb      ;   vendor/league/oauth2-client/src/Grant/ClientCredentials.php          K&      6   vendor/league/oauth2-client/src/Grant/GrantFactory.php              6   vendor/league/oauth2-client/src/Grant/RefreshToken.php          r      ;   vendor/league/oauth2-client/src/Grant/AuthorizationCode.php          eۿŤ      I   vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php                7   vendor/league/oauth2-client/src/Grant/AbstractGrant.php        ⴤ      2   vendor/league/oauth2-client/src/Grant/Password.php                   vendor/league/csv/LICENSEB      B  Lb      %   vendor/league/csv/src/Query/Limit.phpv      v  (      $   vendor/league/csv/src/Query/Sort.php          |;n[      .   vendor/league/csv/src/Query/SortCombinator.php"      "  HP      )   vendor/league/csv/src/Query/Predicate.php                3   vendor/league/csv/src/Query/PredicateCombinator.php        K$      .   vendor/league/csv/src/Query/QueryException.php        )      /   vendor/league/csv/src/Query/Ordering/Column.php\      \  jr      2   vendor/league/csv/src/Query/Ordering/MultiSort.phpo      o  ȓ      #   vendor/league/csv/src/Query/Row.php(      (  չ      3   vendor/league/csv/src/Query/Constraint/Criteria.php
      
  '$;      1   vendor/league/csv/src/Query/Constraint/Column.php        /      1   vendor/league/csv/src/Query/Constraint/Offset.php        5f?      5   vendor/league/csv/src/Query/Constraint/Comparison.php        5eݤ      5   vendor/league/csv/src/Query/Constraint/TwoColumns.php        ;0p      +   vendor/league/csv/src/functions_include.phpk       k   L      %   vendor/league/csv/src/AbstractCsv.phpO-      O-  ͞      %   vendor/league/csv/src/MapIterator.php_      _  瘜6      %   vendor/league/csv/src/HttpHeaders.php        {         vendor/league/csv/src/Info.php        o      #   vendor/league/csv/src/functions.php              %   vendor/league/csv/src/RdbmsResult.php"      "  `      3   vendor/league/csv/src/Serializer/PropertySetter.php        ŧʤ      /   vendor/league/csv/src/Serializer/ArrayShape.php\      \  |!X      :   vendor/league/csv/src/Serializer/TypeCastingTargetType.php        iT      1   vendor/league/csv/src/Serializer/Denormalizer.phpD+      D+  SNj      ,   vendor/league/csv/src/Serializer/MapCell.php        `i.!      4   vendor/league/csv/src/Serializer/CallbackCasting.php!      !  杤      .   vendor/league/csv/src/Serializer/CastToInt.php,      ,  %[      2   vendor/league/csv/src/Serializer/MappingFailed.phpO      O  ]OQ      0   vendor/league/csv/src/Serializer/CastToFloat.php2      2  ̿SȤ      8   vendor/league/csv/src/Serializer/SerializationFailed.php          Ӄ      4   vendor/league/csv/src/Serializer/TypeCastingInfo.phpp
      p
        6   vendor/league/csv/src/Serializer/TypeCastingFailed.phpl      l  je      .   vendor/league/csv/src/Serializer/MapRecord.php        3      1   vendor/league/csv/src/Serializer/CastToString.php        mq      /   vendor/league/csv/src/Serializer/CastToDate.php              /   vendor/league/csv/src/Serializer/CastToBool.php        Ӥ      )   vendor/league/csv/src/Serializer/Type.phpf      f  \      1   vendor/league/csv/src/Serializer/AfterMapping.php        kl      0   vendor/league/csv/src/Serializer/TypeCasting.php          4$      :   vendor/league/csv/src/Serializer/DenormalizationFailed.php        j[      /   vendor/league/csv/src/Serializer/CastToEnum.php              0   vendor/league/csv/src/Serializer/CastToArray.php        <p      '   vendor/league/csv/src/SwapDelimiter.php        m#      (   vendor/league/csv/src/FragmentFinder.php,!      ,!        %   vendor/league/csv/src/SyntaxError.phpU      U  A      +   vendor/league/csv/src/ColumnConsistency.phpB      B  T      #   vendor/league/csv/src/Statement.phpH*      H*  '*̤      &   vendor/league/csv/src/XMLConverter.php        q      *   vendor/league/csv/src/CharsetConverter.phpO"      O"  iMuo      #   vendor/league/csv/src/Exception.php          ̛ߤ      *   vendor/league/csv/src/FragmentNotFound.php          p%G          vendor/league/csv/src/Writer.php        Ի̓      '   vendor/league/csv/src/EscapeFormula.php        4tA֤      %   vendor/league/csv/src/TabularData.php5      5  Ǉ          vendor/league/csv/src/Reader.php/      /  iA<      +   vendor/league/csv/src/TabularDataReader.php        u      '   vendor/league/csv/src/HTMLConverter.php        Jk      &   vendor/league/csv/src/ByteSequence.php        fl`      .   vendor/league/csv/src/CallbackStreamFilter.php        n8      !   vendor/league/csv/src/Warning.php;      ;  {@id      #   vendor/league/csv/src/ResultSet.php4      4  ~cx          vendor/league/csv/src/Stream.php,$      ,$  @      '   vendor/league/csv/src/JsonConverter.php-      -  o      ,   vendor/league/csv/src/CannotInsertRecord.php        JE      &   vendor/league/csv/src/EncloseField.php
      
  &^      +   vendor/league/csv/src/TabularDataWriter.php          u9          vendor/league/csv/src/Buffer.php(      (  -      -   vendor/league/csv/src/TabularDataProvider.php           zZj      ,   vendor/league/csv/src/UnavailableFeature.phpQ      Q  8         vendor/league/csv/src/Bom.php	      	  9      +   vendor/league/csv/src/UnavailableStream.php        LGBa      $   vendor/league/csv/src/JsonFormat.php          :u      &   vendor/league/csv/src/RFC4180Field.phpe      e        )   vendor/league/csv/src/InvalidArgument.php        2e      &   vendor/league/csv/src/StreamFilter.phpf      f  _ı      ,   vendor/league/csv/src/UnableToProcessCsv.php          %         vendor/league/csv/autoload.php/      /  X>      @   vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKey.php                I   vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php          [      ?   vendor/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.phpf       f   (j      6   vendor/laminas/laminas-stdlib/src/JsonSerializable.phpz       z   إG      :   vendor/laminas/laminas-stdlib/src/StringWrapper/Native.phpk      k  5h      I   vendor/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php        <'ߤ      J   vendor/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.phpC      C  L      <   vendor/laminas/laminas-stdlib/src/StringWrapper/MbString.php        ΰ      8   vendor/laminas/laminas-stdlib/src/StringWrapper/Intl.php        Fb      9   vendor/laminas/laminas-stdlib/src/StringWrapper/Iconv.php3      3  x      7   vendor/laminas/laminas-stdlib/src/ResponseInterface.phpu       u   Kä      -   vendor/laminas/laminas-stdlib/src/Request.php{       {   M]       5   vendor/laminas/laminas-stdlib/src/AbstractOptions.php
      
  +ʤ      1   vendor/laminas/laminas-stdlib/src/StringUtils.php        |J,      0   vendor/laminas/laminas-stdlib/src/ArrayUtils.php        ͠      *   vendor/laminas/laminas-stdlib/src/Glob.php1      1  S Ť      >   vendor/laminas/laminas-stdlib/src/ParameterObjectInterface.php        6O      .   vendor/laminas/laminas-stdlib/src/SplQueue.php          LQ      0   vendor/laminas/laminas-stdlib/src/Parameters.php        *	      .   vendor/laminas/laminas-stdlib/src/Response.php}       }   `R      1   vendor/laminas/laminas-stdlib/src/ArrayObject.phpu      u  S,w      @   vendor/laminas/laminas-stdlib/src/ArraySerializableInterface.php          N      .   vendor/laminas/laminas-stdlib/src/SplStack.php        V懤      -   vendor/laminas/laminas-stdlib/src/Message.php        ^fa      9   vendor/laminas/laminas-stdlib/src/ParametersInterface.php]      ]  
2      >   vendor/laminas/laminas-stdlib/src/Exception/LogicException.php                B   vendor/laminas/laminas-stdlib/src/Exception/ExceptionInterface.phpj       j   vտܤ      H   vendor/laminas/laminas-stdlib/src/Exception/InvalidArgumentException.php          ps9      ?   vendor/laminas/laminas-stdlib/src/Exception/DomainException.php          v      F   vendor/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php          \"      @   vendor/laminas/laminas-stdlib/src/Exception/RuntimeException.php          Y      K   vendor/laminas/laminas-stdlib/src/Exception/ExtensionNotLoadedException.php          {Y      3   vendor/laminas/laminas-stdlib/src/PriorityQueue.php\      \  c1      0   vendor/laminas/laminas-stdlib/src/ArrayStack.php        4S      ;   vendor/laminas/laminas-stdlib/src/DispatchableInterface.php          !      3   vendor/laminas/laminas-stdlib/src/ConsoleHelper.php        -Q٤      6   vendor/laminas/laminas-stdlib/src/SplPriorityQueue.php        [ڤ      6   vendor/laminas/laminas-stdlib/src/MessageInterface.php)      )  qg      <   vendor/laminas/laminas-stdlib/src/InitializableInterface.php          y      6   vendor/laminas/laminas-stdlib/src/RequestInterface.phpt       t   Y^r      2   vendor/laminas/laminas-stdlib/src/ErrorHandler.php        3I      2   vendor/laminas/laminas-stdlib/src/PriorityList.php        &ne!      7   vendor/laminas/laminas-stdlib/src/FastPriorityQueue.php         c      ;   vendor/laminas/laminas-stdlib/src/Guard/EmptyGuardTrait.php        z;      H   vendor/laminas/laminas-stdlib/src/Guard/ArrayOrTraversableGuardTrait.phpp      p  ÿ      :   vendor/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php          3Τ      :   vendor/laminas/laminas-stdlib/src/Guard/NullGuardTrait.php        #      F   vendor/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php        ٕ      G   vendor/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php)      )  5N      C   vendor/laminas/laminas-servicemanager/src/AbstractPluginManager.php        i&      F   vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php        \      ?   vendor/laminas/laminas-servicemanager/src/Tool/ConfigDumper.phpH      H  eҤ      A   vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php              H   vendor/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php
      
        S   vendor/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php3      3        \   vendor/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php        ;ڤ      B   vendor/laminas/laminas-servicemanager/src/InitializerInterface.php                K   vendor/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.phpr	      r	  &      F   vendor/laminas/laminas-servicemanager/src/Proxy/LazyServiceFactory.php{      {  L      =   vendor/laminas/laminas-servicemanager/src/ConfigInterface.php        VLN      O   vendor/laminas/laminas-servicemanager/src/Exception/InvalidServiceException.php          \#      L   vendor/laminas/laminas-servicemanager/src/Exception/CyclicAliasException.phpd
      d
  ?      J   vendor/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php          2ۤ      P   vendor/laminas/laminas-servicemanager/src/Exception/InvalidArgumentException.phpf      f  _      P   vendor/laminas/laminas-servicemanager/src/Exception/ServiceNotFoundException.php?      ?  (ul      R   vendor/laminas/laminas-servicemanager/src/Exception/ServiceNotCreatedException.php          r:e      a   vendor/laminas/laminas-servicemanager/src/Exception/ContainerModificationsNotAllowedException.php              <   vendor/laminas/laminas-servicemanager/src/ServiceManager.php6B      6B  \F[      4   vendor/laminas/laminas-servicemanager/src/Config.php        1;      D   vendor/laminas/laminas-servicemanager/src/PluginManagerInterface.phpR      R  :v      N   vendor/laminas/laminas-servicemanager/src/Factory/AbstractFactoryInterface.php        R?UƤ      O   vendor/laminas/laminas-servicemanager/src/Factory/DelegatorFactoryInterface.php        !Oe      F   vendor/laminas/laminas-servicemanager/src/Factory/InvokableFactory.phpp      p  2 ؤ      F   vendor/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php        	J      >   vendor/laminas/laminas-servicemanager/src/FactoryInterface.php          %      E   vendor/laminas/laminas-servicemanager/src/ServiceLocatorInterface.phpc      c  6      6   vendor/laminas/laminas-servicemanager/src/autoload.phpJ      J  k8      N   vendor/laminas/laminas-servicemanager/src/Initializer/InitializerInterface.php          9 ܤ      D   vendor/laminas/laminas-servicemanager/bin/generate-factory-for-classD      D  1      J   vendor/laminas/laminas-servicemanager/bin/generate-deps-for-config-factoryB      B  p      .   vendor/laminas/laminas-validator/renovate.jsonw       w   =( 5      1   vendor/laminas/laminas-validator/src/Callback.php]	      ]	  K!pۤ      3   vendor/laminas/laminas-validator/src/CreditCard.php        Fޤ      7   vendor/laminas/laminas-validator/src/ValidatorChain.php        XE      B   vendor/laminas/laminas-validator/src/HostWithPublicIPv4Address.php              M   vendor/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php          ]Ji      C   vendor/laminas/laminas-validator/src/ValidatorProviderInterface.php          sę[      7   vendor/laminas/laminas-validator/src/ConfigProvider.phpU      U  @U      ?   vendor/laminas/laminas-validator/src/ValidatorPluginManager.php(\      (\  [*      6   vendor/laminas/laminas-validator/src/Db/AbstractDb.php        +      8   vendor/laminas/laminas-validator/src/Db/RecordExists.php        |e      :   vendor/laminas/laminas-validator/src/Db/NoRecordExists.php        'dl      ,   vendor/laminas/laminas-validator/src/Uri.php        Ǥ      0   vendor/laminas/laminas-validator/src/IsArray.phpR      R  $      ;   vendor/laminas/laminas-validator/src/ValidatorInterface.php          Jϋ      1   vendor/laminas/laminas-validator/src/DateStep.phpY$      Y$  %V^      ,   vendor/laminas/laminas-validator/src/Hex.php              <   vendor/laminas/laminas-validator/src/UndisclosedPassword.phpj      j  nl      C   vendor/laminas/laminas-validator/src/Translator/DummyTranslator.php        LT      >   vendor/laminas/laminas-validator/src/Translator/Translator.php        ,y      L   vendor/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php        ֢      E   vendor/laminas/laminas-validator/src/Translator/TranslatorFactory.php%      %  #[Ɣ      G   vendor/laminas/laminas-validator/src/Translator/TranslatorInterface.php                -   vendor/laminas/laminas-validator/src/Isbn.php#      #  h       7   vendor/laminas/laminas-validator/src/File/WordCount.phpW      W  0      7   vendor/laminas/laminas-validator/src/File/NotExists.php        W3"      5   vendor/laminas/laminas-validator/src/File/IsImage.php        P62      4   vendor/laminas/laminas-validator/src/File/Exists.php
      
  5]      6   vendor/laminas/laminas-validator/src/File/MimeType.phpd      d        >   vendor/laminas/laminas-validator/src/File/ExcludeExtension.php          NP      B   vendor/laminas/laminas-validator/src/File/FileInformationTrait.php	      	  I      4   vendor/laminas/laminas-validator/src/File/Upload.php        <v      3   vendor/laminas/laminas-validator/src/File/Count.php        #Y      1   vendor/laminas/laminas-validator/src/File/Md5.php        tպ      8   vendor/laminas/laminas-validator/src/File/UploadFile.phpw      w  k      2   vendor/laminas/laminas-validator/src/File/Sha1.php        
      7   vendor/laminas/laminas-validator/src/File/ImageSize.php>      >  ;s      7   vendor/laminas/laminas-validator/src/File/FilesSize.php        0U      7   vendor/laminas/laminas-validator/src/File/Extension.php        }m      =   vendor/laminas/laminas-validator/src/File/ExcludeMimeType.php(      (  6Q      2   vendor/laminas/laminas-validator/src/File/Hash.php        ?\      2   vendor/laminas/laminas-validator/src/File/Size.phpx      x  PF      3   vendor/laminas/laminas-validator/src/File/Crc32.php        Y      :   vendor/laminas/laminas-validator/src/File/IsCompressed.phpK      K        7   vendor/laminas/laminas-validator/src/DateComparison.php        4o      4   vendor/laminas/laminas-validator/src/GreaterThan.phpF      F  *|      4   vendor/laminas/laminas-validator/src/Isbn/Isbn13.php        WrR      4   vendor/laminas/laminas-validator/src/Isbn/Isbn10.php        uv      +   vendor/laminas/laminas-validator/src/Ip.php        M]}      1   vendor/laminas/laminas-validator/src/NotEmpty.php        Wd4      -   vendor/laminas/laminas-validator/src/Date.php[      [  O      5   vendor/laminas/laminas-validator/src/IsJsonString.php        M      8   vendor/laminas/laminas-validator/src/Barcode/Postnet.php          	@      6   vendor/laminas/laminas-validator/src/Barcode/Ean13.php          ؤ      7   vendor/laminas/laminas-validator/src/Barcode/Code39.phpF      F  1      7   vendor/laminas/laminas-validator/src/Barcode/Gtin12.php          e      7   vendor/laminas/laminas-validator/src/Barcode/Planet.php          R>      8   vendor/laminas/laminas-validator/src/Barcode/Codabar.php        #Ɗڤ      6   vendor/laminas/laminas-validator/src/Barcode/Ean14.php          8&      5   vendor/laminas/laminas-validator/src/Barcode/Ean8.php        Yl      7   vendor/laminas/laminas-validator/src/Barcode/Gtin13.php          BXw      5   vendor/laminas/laminas-validator/src/Barcode/Upce.php        w#      @   vendor/laminas/laminas-validator/src/Barcode/AbstractAdapter.phpQ      Q  /      5   vendor/laminas/laminas-validator/src/Barcode/Ean2.php          px&      6   vendor/laminas/laminas-validator/src/Barcode/Ean12.php          *ʤ      7   vendor/laminas/laminas-validator/src/Barcode/Code25.php          Bݤ      5   vendor/laminas/laminas-validator/src/Barcode/Ean5.php          Z}y      :   vendor/laminas/laminas-validator/src/Barcode/Code93ext.php          "鑤      B   vendor/laminas/laminas-validator/src/Barcode/Code25interleaved.php          YXv      8   vendor/laminas/laminas-validator/src/Barcode/Code128.php"      "  {      :   vendor/laminas/laminas-validator/src/Barcode/Identcode.phpM      M  >BD>      9   vendor/laminas/laminas-validator/src/Barcode/Leitcode.php          Bo      6   vendor/laminas/laminas-validator/src/Barcode/Ean18.php          S>x      A   vendor/laminas/laminas-validator/src/Barcode/AdapterInterface.php        B      @   vendor/laminas/laminas-validator/src/Barcode/Intelligentmail.php          _wIk      :   vendor/laminas/laminas-validator/src/Barcode/Code39ext.php          L      5   vendor/laminas/laminas-validator/src/Barcode/Issn.phpZ      Z  ۤ      7   vendor/laminas/laminas-validator/src/Barcode/Code93.php        ΆP      5   vendor/laminas/laminas-validator/src/Barcode/Sscc.php          }B      7   vendor/laminas/laminas-validator/src/Barcode/Gtin14.php          Û      5   vendor/laminas/laminas-validator/src/Barcode/Upca.php          E3W      6   vendor/laminas/laminas-validator/src/Barcode/Itf14.php          )ߤ      :   vendor/laminas/laminas-validator/src/Barcode/Royalmail.php        Lä      -   vendor/laminas/laminas-validator/src/Csrf.php              0   vendor/laminas/laminas-validator/src/Bitwise.phpQ	      Q	        8   vendor/laminas/laminas-validator/src/StaticValidator.php        V$      2   vendor/laminas/laminas-validator/src/Identical.php        )KO      -   vendor/laminas/laminas-validator/src/Step.php5	      5	  _      -   vendor/laminas/laminas-validator/src/Uuid.php        t_gs      /   vendor/laminas/laminas-validator/src/Module.php@      @  4mӤ      .   vendor/laminas/laminas-validator/src/Regex.php        $      1   vendor/laminas/laminas-validator/src/Hostname.php        3S      9   vendor/laminas/laminas-validator/src/NumberComparison.phph
      h
        4   vendor/laminas/laminas-validator/src/IsCountable.php        0c      F   vendor/laminas/laminas-validator/src/ValidatorPluginManagerFactory.php        sܤ      0   vendor/laminas/laminas-validator/src/Explode.php
      
  +      5   vendor/laminas/laminas-validator/src/EmailAddress.php'#      '#  QLۤ      P   vendor/laminas/laminas-validator/src/Exception/InvalidMagicMimeFileException.php}       }   NYC0      E   vendor/laminas/laminas-validator/src/Exception/ExceptionInterface.phpP       P   ]3O      K   vendor/laminas/laminas-validator/src/Exception/InvalidArgumentException.php          o      I   vendor/laminas/laminas-validator/src/Exception/BadMethodCallException.php          J      C   vendor/laminas/laminas-validator/src/Exception/RuntimeException.php          {      N   vendor/laminas/laminas-validator/src/Exception/ExtensionNotLoadedException.phps       s   yd      :   vendor/laminas/laminas-validator/src/AbstractValidator.php#      #  6w      0   vendor/laminas/laminas-validator/src/Barcode.php1      1  $o"      0   vendor/laminas/laminas-validator/src/Between.php        q      5   vendor/laminas/laminas-validator/src/Hostname/Biz.php`1     `1 F^      5   vendor/laminas/laminas-validator/src/Hostname/Com.php/      /  5!G      4   vendor/laminas/laminas-validator/src/Hostname/Jp.php3      3  8Oۤ      4   vendor/laminas/laminas-validator/src/Hostname/Cn.php=Z      =Z  #֤      -   vendor/laminas/laminas-validator/src/Iban.php        bL+      ?   vendor/laminas/laminas-validator/src/BusinessIdentifierCode.php
      
  Um      1   vendor/laminas/laminas-validator/src/LessThan.php'      '  1Gݤ      /   vendor/laminas/laminas-validator/src/Digits.php(      (        5   vendor/laminas/laminas-validator/src/StringLength.php        e      1   vendor/laminas/laminas-validator/src/Timezone.php        C      9   vendor/laminas/laminas-validator/src/Sitemap/Priority.php        Ф      ;   vendor/laminas/laminas-validator/src/Sitemap/Changefreq.php6      6  x)      8   vendor/laminas/laminas-validator/src/Sitemap/Lastmod.php        כoY      4   vendor/laminas/laminas-validator/src/Sitemap/Loc.php        T      1   vendor/laminas/laminas-validator/src/GpsPoint.phpQ	      Q	  S      5   vendor/laminas/laminas-validator/src/IsInstanceOf.php        y0      0   vendor/laminas/laminas-validator/src/InArray.php        ӌx      B   vendor/laminas/laminas-validator/bin/update_hostname_validator.php              .   vendor/marc-mabe/php-enum/stubs/Stringable.phpb       b   ћ<      )   vendor/marc-mabe/php-enum/src/EnumMap.php        i      &   vendor/marc-mabe/php-enum/src/Enum.php        4c      )   vendor/marc-mabe/php-enum/src/EnumSet.php"7      "7  f,!      7   vendor/marc-mabe/php-enum/src/EnumSerializableTrait.php        ;蟤      %   vendor/marc-mabe/php-enum/LICENSE.txt        CѤ      "   vendor/phpoption/phpoption/LICENSE\,      \,  bE      1   vendor/phpoption/phpoption/src/PhpOption/None.php_      _  L1      1   vendor/phpoption/phpoption/src/PhpOption/Some.php        z      3   vendor/phpoption/phpoption/src/PhpOption/Option.php        "Ѥ      7   vendor/phpoption/phpoption/src/PhpOption/LazyOption.phpS	      S	  ~         vendor/react/socket/LICENSEu      u  {      -   vendor/react/socket/src/FixedUriConnector.phpX      X  
$      2   vendor/react/socket/src/HappyEyeBallsConnector.php        >      .   vendor/react/socket/src/ConnectorInterface.php          Lݺ      &   vendor/react/socket/src/UnixServer.php4
      4
  %Ԥ      (   vendor/react/socket/src/SocketServer.phpm      m  Eg      $   vendor/react/socket/src/FdServer.php        +L.      (   vendor/react/socket/src/TcpConnector.php              (   vendor/react/socket/src/DnsConnector.php@
      @
  q4      +   vendor/react/socket/src/SecureConnector.phpm      m  	R\      )   vendor/react/socket/src/UnixConnector.php        I      *   vendor/react/socket/src/LimitingServer.php              &   vendor/react/socket/src/Connection.php
      
  AD      /   vendor/react/socket/src/ConnectionInterface.php<      <  ck      ,   vendor/react/socket/src/StreamEncryption.php
      
  Qz      +   vendor/react/socket/src/ServerInterface.phpv      v  Ԥ      "   vendor/react/socket/src/Server.phpZ      Z  9      (   vendor/react/socket/src/SecureServer.phpH	      H	  M      %   vendor/react/socket/src/Connector.php        I@      %   vendor/react/socket/src/TcpServer.phpn      n  5.`      :   vendor/react/socket/src/HappyEyeBallsConnectionBuilder.phpl      l  :	      ,   vendor/react/socket/src/TimeoutConnector.php3      3  x         vendor/react/promise/LICENSEg      g  F      $   vendor/react/promise/src/Promise.php        t	      .   vendor/react/promise/src/functions_include.php]       ]   Q<      6   vendor/react/promise/src/Internal/FulfilledPromise.php        ?      5   vendor/react/promise/src/Internal/RejectedPromise.php3      3  p	N      7   vendor/react/promise/src/Internal/CancellationQueue.phpr      r  x_      &   vendor/react/promise/src/functions.php        SdT      %   vendor/react/promise/src/Deferred.phpa      a  U      6   vendor/react/promise/src/Exception/LengthException.php^       ^   ?q      9   vendor/react/promise/src/Exception/CompositeException.php        !      -   vendor/react/promise/src/PromiseInterface.php         {         vendor/react/cache/LICENSEu      u  {      )   vendor/react/cache/src/CacheInterface.phpa      a  {^      %   vendor/react/cache/src/ArrayCache.php	      	  5         vendor/react/stream/LICENSEu      u  {      3   vendor/react/stream/src/WritableStreamInterface.phpP      P  Ws      3   vendor/react/stream/src/ReadableStreamInterface.php        {ˆJ      2   vendor/react/stream/src/WritableResourceStream.php|      |  c      )   vendor/react/stream/src/ThroughStream.php        U      2   vendor/react/stream/src/ReadableResourceStream.php        M'      0   vendor/react/stream/src/DuplexResourceStream.phpY      Y  Ŭ      1   vendor/react/stream/src/DuplexStreamInterface.php          'M      +   vendor/react/stream/src/CompositeStream.php        ћ6          vendor/react/stream/src/Util.php        c/         vendor/react/dns/LICENSEu      u  {      3   vendor/react/dns/src/Query/UdpTransportExecutor.phpG      G  x#      .   vendor/react/dns/src/Query/TimeoutExecutor.php        ͩ      .   vendor/react/dns/src/Query/CachingExecutor.php        LФ      /   vendor/react/dns/src/Query/TimeoutException.phpW       W   8      0   vendor/react/dns/src/Query/HostsFileExecutor.php        pÔ      9   vendor/react/dns/src/Query/SelectiveTransportExecutor.php        2      4   vendor/react/dns/src/Query/CancellationException.phpc       c   k      $   vendor/react/dns/src/Query/Query.php        $Hǉ      0   vendor/react/dns/src/Query/ExecutorInterface.php          ϡq$      3   vendor/react/dns/src/Query/TcpTransportExecutor.php              +   vendor/react/dns/src/Query/CoopExecutor.php}      }  |ͤ      ,   vendor/react/dns/src/Query/RetryExecutor.php        g9      /   vendor/react/dns/src/Query/FallbackExecutor.phpC      C  F*"      *   vendor/react/dns/src/Resolver/Resolver.php+      +  ח      )   vendor/react/dns/src/Resolver/Factory.php5      5  CП      3   vendor/react/dns/src/Resolver/ResolverInterface.php          #      +   vendor/react/dns/src/BadServerException.phpS       S   %Z      )   vendor/react/dns/src/Config/HostsFile.php        񝴤      &   vendor/react/dns/src/Config/Config.php@      @  C*
      (   vendor/react/dns/src/Protocol/Parser.php        Aܞ      .   vendor/react/dns/src/Protocol/BinaryDumper.php\      \  %       0   vendor/react/dns/src/RecordNotFoundException.phpX       X   ykx      %   vendor/react/dns/src/Model/Record.php        O5      &   vendor/react/dns/src/Model/Message.php
      
  ؤ         vendor/react/event-loop/LICENSEu      u  {      ,   vendor/react/event-loop/src/ExtEventLoop.php9      9  _       ,   vendor/react/event-loop/src/ExtLibevLoop.php8      8  &0*      )   vendor/react/event-loop/src/ExtEvLoop.php        :`      4   vendor/react/event-loop/src/Tick/FutureTickQueue.php        %	      .   vendor/react/event-loop/src/TimerInterface.php          }M7      $   vendor/react/event-loop/src/Loop.phpL
      L
  Mͤ      '   vendor/react/event-loop/src/Factory.php        %^      0   vendor/react/event-loop/src/StreamSelectLoop.php        w      /   vendor/react/event-loop/src/ExtLibeventLoop.phpO      O  ,      .   vendor/react/event-loop/src/SignalsHandler.php        Ҥ      -   vendor/react/event-loop/src/LoopInterface.php        #6Y'      )   vendor/react/event-loop/src/ExtUvLoop.php        Nwm      +   vendor/react/event-loop/src/Timer/Timer.php        w      ,   vendor/react/event-loop/src/Timer/Timers.php        4i      &   vendor/ralouphie/getallheaders/LICENSE8      8  Ka      4   vendor/ralouphie/getallheaders/src/getallheaders.phpO      O  }r      .   vendor/ltd-beget/dns-zone-configurator/LICENSE4      4        1   vendor/ltd-beget/dns-zone-configurator/phpdox.xml        @#      M   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/Zone.phpt      t  >      h   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NaptrRecord.php4      4        e   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/MxRecord.phpq      q  TDK      f   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/PtrRecord.php        2      e   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NsRecord.php$      $        g   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/AaaaRecord.php        @#      h   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CnameRecord.php        71&o      f   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CaaRecord.php        r      f   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SoaRecord.phpx      x  U      f   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SrvRecord.php	      	  7q      f   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/TxtRecord.php	      	  <
      d   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/ARecord.php              h   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/base/Record.php	      	  F¤      b   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordsStore.php6      6  .u      d   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordAppender.php&      &  Yn#      Z   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/Node.php        =3n|      b   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNumberCheck.phpP      P  Z      n   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/DnsZoneDomainNameValidator.phpP      P  |n      j   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/ConflictTypesValidator.phpe      e  W-B9      `   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/PtrValidator.phpR      R  hZ      j   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/OutOfZoneDataValidator.php        V,l      e   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/HostnameValidator.phpd      d  粈\      b   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int32Validator.php          w|      `   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/TtlValidator.php          !:]ޤ      d   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/CnameNumberCheck.phpS      S  GR      i   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNotInRootValidator.php'      '  |}      `   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip6Validator.php          :      b   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int16Validator.php          ͺE      `   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip4Validator.php                c   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/traits/RecordsIterateTrait.php        )q      _   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ValidationError.php        ס      [   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ErrorsStore.phpv      v  x#      g   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/PlainDeserializer.phpN      N  M+      g   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/ArrayDeserializer.php	      	  BD      U   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordNotification.php          F      L   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eErrorCode.phpJ      J  *n      M   vendor/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordType.phpr      r  /T      :   vendor/ltd-beget/dns-zone-configurator/dns/zones/zone.conf              E   vendor/ltd-beget/dns-zone-configurator/dns/zones/zone_node_names.conf          Pq      M   vendor/ltd-beget/dns-zone-configurator/dns/zones/zone_node_names_numeric.confF       F   9t      %   vendor/ltd-beget/stringstream/LICENSE4      4        H   vendor/ltd-beget/stringstream/src/LTDBeget/stringstream/StringStream.php        (h      $   vendor/ltd-beget/ascii-table/LICENSE4      4        =   vendor/ltd-beget/ascii-table/src/LTDBeget/ascii/AsciiChar.php        [ɤ      +   vendor/ltd-beget/dns-zone-tokenizer/LICENSE5      5  D      F   vendor/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/Record.php        Է{      E   vendor/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/RData.php        %Ϥ      M   vendor/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/SyntaxErrorException.php         Ҷ      B   vendor/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/Tokenizer.php
      
  w㳊      >   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/example.com        =>դ      B   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/whitespaceAtEnd          =d      ;   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/lifun.ru{      {  R}      @   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/wrong.soa.bug#      #  uWZ      7   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/hell          !      A   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_ok/infinite.check         ۤ      >   vendor/ltd-beget/dns-zone-tokenizer/zone/syntax_error/wtf.zone                      vendor/ramsey/uuid/LICENSE7      7  <[      A   vendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php!      !  "v      ;   vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
      
  )      ;   vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php               ?   vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php        +E*      =   vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php        ɯ      ;   vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php              9   vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php          Q`      ;   vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.phpe      e  c      :   vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.phpU      U  ьV      @   vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php)      )  K      9   vendor/ramsey/uuid/src/Provider/TimeProviderInterface.php          <Ϥ      '   vendor/ramsey/uuid/src/DegradedUuid.php|       |   =פ      5   vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php          FRK      4   vendor/ramsey/uuid/src/Builder/BuilderCollection.php        *RZ      6   vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php        U1d      7   vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.php(      (  %      2   vendor/ramsey/uuid/src/Builder/FallbackBuilder.phpO      O  p      5   vendor/ramsey/uuid/src/Validator/GenericValidator.php        hⴤ      7   vendor/ramsey/uuid/src/Validator/ValidatorInterface.php          a      =   vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php        <eӘ      @   vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php        ~z      :   vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php        59ܤ      ?   vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php                ;   vendor/ramsey/uuid/src/Converter/Time/UnixTimeConverter.phpR      R  .      >   vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php        .t      ;   vendor/ramsey/uuid/src/Converter/TimeConverterInterface.php        xq      B   vendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php        &      >   vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.phpu      u  :b      C   vendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php          1PԤ      $   vendor/ramsey/uuid/src/functions.php        tM      /   vendor/ramsey/uuid/src/UuidFactoryInterface.php        8      &   vendor/ramsey/uuid/src/UuidFactory.php"      "  _      &   vendor/ramsey/uuid/src/BinaryUtils.php`      `  TN      2   vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php        (8I      +   vendor/ramsey/uuid/src/Rfc4122/MaxTrait.phpA      A  YX`      /   vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php         wx      /   vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php        F      )   vendor/ramsey/uuid/src/Rfc4122/UuidV3.phpu      u  q      )   vendor/ramsey/uuid/src/Rfc4122/UuidV6.php          V~      2   vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.phpD      D  ~      )   vendor/ramsey/uuid/src/Rfc4122/UuidV7.php~      ~        )   vendor/ramsey/uuid/src/Rfc4122/UuidV1.phpt      t  lR      )   vendor/ramsey/uuid/src/Rfc4122/Fields.php              ,   vendor/ramsey/uuid/src/Rfc4122/Validator.php        ¦      *   vendor/ramsey/uuid/src/Rfc4122/NilUuid.php                 )   vendor/ramsey/uuid/src/Rfc4122/UuidV2.php        0g      )   vendor/ramsey/uuid/src/Rfc4122/UuidV8.phpm      m  [+      )   vendor/ramsey/uuid/src/Rfc4122/UuidV4.phpb      b  %Ť      ,   vendor/ramsey/uuid/src/Rfc4122/TimeTrait.php        0x      +   vendor/ramsey/uuid/src/Rfc4122/NilTrait.php        Τ      0   vendor/ramsey/uuid/src/Rfc4122/UuidInterface.php          8I      *   vendor/ramsey/uuid/src/Rfc4122/MaxUuid.php          3rf      )   vendor/ramsey/uuid/src/Rfc4122/UuidV5.phpx      x  s\      .   vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.phpA      A  ;      1   vendor/ramsey/uuid/src/Fields/FieldsInterface.php          $      9   vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.phpU      U  6M      B   vendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php        U9      <   vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.phpf      f  *      =   vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.php          _q5J      6   vendor/ramsey/uuid/src/Generator/UnixTimeGenerator.phpa      a  "QF(      9   vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php~
      ~
  v\F      9   vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.php        ߤ      9   vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php        Ӥ      9   vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.php          T      9   vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.phpN      N  5      :   vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php*      *  q<u      2   vendor/ramsey/uuid/src/Generator/CombGenerator.php        d      9   vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.phpM      M  z5      :   vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.phpy      y  z      5   vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php        Vʄ/      ;   vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.php          Z&j      ;   vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php          P7      ;   vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php        V      2   vendor/ramsey/uuid/src/DeprecatedUuidInterface.php        Ũ         vendor/ramsey/uuid/src/Uuid.php"      "  J      -   vendor/ramsey/uuid/src/Nonstandard/UuidV6.php              +   vendor/ramsey/uuid/src/Nonstandard/Uuid.php"      "  ol      -   vendor/ramsey/uuid/src/Nonstandard/Fields.php>      >  v[      2   vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php%      %  CS      ?   vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.php          	      ?   vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.php                B   vendor/ramsey/uuid/src/Exception/UnsupportedOperationException.php                 8   vendor/ramsey/uuid/src/Exception/TimeSourceException.php          <P      9   vendor/ramsey/uuid/src/Exception/DceSecurityException.php          9      =   vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.php          ]¤      =   vendor/ramsey/uuid/src/Exception/InvalidArgumentException.php          gA      6   vendor/ramsey/uuid/src/Exception/DateTimeException.php          o      2   vendor/ramsey/uuid/src/Exception/NodeException.php          ݮL      :   vendor/ramsey/uuid/src/Exception/RandomSourceException.php          &      2   vendor/ramsey/uuid/src/Exception/NameException.php          82      ;   vendor/ramsey/uuid/src/Exception/UuidExceptionInterface.php          ?      :   vendor/ramsey/uuid/src/Exception/InvalidBytesException.php          j;      /   vendor/ramsey/uuid/src/Type/NumberInterface.php          GФ      '   vendor/ramsey/uuid/src/Type/Decimal.php=      =  ~r      '   vendor/ramsey/uuid/src/Type/Integer.php        ["      +   vendor/ramsey/uuid/src/Type/Hexadecimal.php              -   vendor/ramsey/uuid/src/Type/TypeInterface.php-      -        $   vendor/ramsey/uuid/src/Type/Time.php        RZĤ      %   vendor/ramsey/uuid/src/FeatureSet.php        *ia      $   vendor/ramsey/uuid/src/Guid/Guid.php        G      &   vendor/ramsey/uuid/src/Guid/Fields.php        #"      +   vendor/ramsey/uuid/src/Guid/GuidBuilder.php           !      5   vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php              (   vendor/ramsey/uuid/src/UuidInterface.phpG      G        /   vendor/ramsey/uuid/src/Codec/CodecInterface.php        ~      7   vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.php          Ψߤ      0   vendor/ramsey/uuid/src/Codec/GuidStringCodec.php        ?Ѥ      ,   vendor/ramsey/uuid/src/Codec/StringCodec.php        %ɤ      1   vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php0      0  yB      8   vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php        z$;      3   vendor/ramsey/uuid/src/Math/CalculatorInterface.phpK      K  N      ,   vendor/ramsey/uuid/src/Math/RoundingMode.php        k/      3   vendor/ramsey/uuid/src/Math/BrickMathCalculator.phpC      C  ]          vendor/ramsey/collection/LICENSE7      7  ŸԤ      5   vendor/ramsey/collection/src/Map/AbstractTypedMap.php        w&      -   vendor/ramsey/collection/src/Map/TypedMap.php        lᆤ      0   vendor/ramsey/collection/src/Map/AbstractMap.phph	      h	  Q      6   vendor/ramsey/collection/src/Map/NamedParameterMap.php/      /  Jv&~      6   vendor/ramsey/collection/src/Map/TypedMapInterface.php          YS      1   vendor/ramsey/collection/src/Map/MapInterface.php        H      8   vendor/ramsey/collection/src/Map/AssociativeArrayMap.php          \zՈ      &   vendor/ramsey/collection/src/Queue.php        pD      3   vendor/ramsey/collection/src/AbstractCollection.php        EE      %   vendor/ramsey/collection/src/Sort.php          }]o      $   vendor/ramsey/collection/src/Set.phpN      N  2w      9   vendor/ramsey/collection/src/Tool/ValueExtractorTrait.php        w      /   vendor/ramsey/collection/src/Tool/TypeTrait.phpY      Y  (az      8   vendor/ramsey/collection/src/Tool/ValueToStringTrait.php        ʆͤ      /   vendor/ramsey/collection/src/QueueInterface.php        sv      4   vendor/ramsey/collection/src/CollectionInterface.php        j;      +   vendor/ramsey/collection/src/Collection.php        8iP"      -   vendor/ramsey/collection/src/GenericArray.php          `X]^      :   vendor/ramsey/collection/src/DoubleEndedQueueInterface.php        1      B   vendor/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php          ՔI      A   vendor/ramsey/collection/src/Exception/NoSuchElementException.php          &      H   vendor/ramsey/collection/src/Exception/UnsupportedOperationException.php          ~oݤ      >   vendor/ramsey/collection/src/Exception/CollectionException.php          a=+ۤ      C   vendor/ramsey/collection/src/Exception/InvalidArgumentException.php          /_      F   vendor/ramsey/collection/src/Exception/CollectionMismatchException.php          7      ?   vendor/ramsey/collection/src/Exception/OutOfBoundsException.php          ҵ      ,   vendor/ramsey/collection/src/AbstractSet.php        b
      1   vendor/ramsey/collection/src/DoubleEndedQueue.php        tE      /   vendor/ramsey/collection/src/ArrayInterface.phpd      d  DO7      .   vendor/ramsey/collection/src/AbstractArray.php        a      2   vendor/thecodingmachine/safe/generated/openssl.php        7|      /   vendor/thecodingmachine/safe/generated/exec.php        ][j      1   vendor/thecodingmachine/safe/generated/libxml.php        v      3   vendor/thecodingmachine/safe/generated/classobj.php        )      1   vendor/thecodingmachine/safe/generated/ssdeep.php        c      -   vendor/thecodingmachine/safe/generated/ps.php               .   vendor/thecodingmachine/safe/generated/yaz.php        U1c      /   vendor/thecodingmachine/safe/generated/curl.php        n<6      2   vendor/thecodingmachine/safe/generated/session.php        sz      3   vendor/thecodingmachine/safe/generated/funchand.php        r	ޖ      /   vendor/thecodingmachine/safe/generated/zlib.php        U<      /   vendor/thecodingmachine/safe/generated/misc.php        3      1   vendor/thecodingmachine/safe/generated/cubrid.php        sp      4   vendor/thecodingmachine/safe/generated/mailparse.php        %      /   vendor/thecodingmachine/safe/generated/ldap.php        j/l      1   vendor/thecodingmachine/safe/generated/xmlrpc.php        [      1   vendor/thecodingmachine/safe/generated/sqlsrv.php        `I}      0   vendor/thecodingmachine/safe/generated/shmop.php        \{O      .   vendor/thecodingmachine/safe/generated/dir.php        Of      2   vendor/thecodingmachine/safe/generated/gettext.php        9F      1   vendor/thecodingmachine/safe/generated/stream.php              6   vendor/thecodingmachine/safe/generated/8.5/openssl.phpN      N  HS      3   vendor/thecodingmachine/safe/generated/8.5/exec.php        Z      5   vendor/thecodingmachine/safe/generated/8.5/libxml.phpc      c  pc      7   vendor/thecodingmachine/safe/generated/8.5/classobj.php9      9  C      5   vendor/thecodingmachine/safe/generated/8.5/ssdeep.php+      +  O*      1   vendor/thecodingmachine/safe/generated/8.5/ps.php;      ;  ʑXG      2   vendor/thecodingmachine/safe/generated/8.5/yaz.php        9      3   vendor/thecodingmachine/safe/generated/8.5/curl.phpQ      Q  &%t^      6   vendor/thecodingmachine/safe/generated/8.5/session.php        P      7   vendor/thecodingmachine/safe/generated/8.5/funchand.php        )"      3   vendor/thecodingmachine/safe/generated/8.5/zlib.php        u`G      3   vendor/thecodingmachine/safe/generated/8.5/misc.php        "j      5   vendor/thecodingmachine/safe/generated/8.5/cubrid.phpA      A  oQmc      8   vendor/thecodingmachine/safe/generated/8.5/mailparse.php        dw}?      3   vendor/thecodingmachine/safe/generated/8.5/ldap.php*.      *.  KG      5   vendor/thecodingmachine/safe/generated/8.5/xmlrpc.php              5   vendor/thecodingmachine/safe/generated/8.5/sqlsrv.php        ;      4   vendor/thecodingmachine/safe/generated/8.5/shmop.php        cO      2   vendor/thecodingmachine/safe/generated/8.5/dir.phpI      I  ;W      6   vendor/thecodingmachine/safe/generated/8.5/gettext.php        XW(      5   vendor/thecodingmachine/safe/generated/8.5/stream.php          |      2   vendor/thecodingmachine/safe/generated/8.5/com.phph      h  4      2   vendor/thecodingmachine/safe/generated/8.5/ftp.php2      2  D-      =   vendor/thecodingmachine/safe/generated/8.5/rector-migrate.php0      0  S      3   vendor/thecodingmachine/safe/generated/8.5/json.phpX      X  K      5   vendor/thecodingmachine/safe/generated/8.5/apache.phpL      L  /O>!      3   vendor/thecodingmachine/safe/generated/8.5/hash.php        8u      5   vendor/thecodingmachine/safe/generated/8.5/swoole.phps      s  ֥      5   vendor/thecodingmachine/safe/generated/8.5/sodium.php3      3  dB      5   vendor/thecodingmachine/safe/generated/8.5/pspell.phpv      v  l٤      5   vendor/thecodingmachine/safe/generated/8.5/mysqli.php          8      9   vendor/thecodingmachine/safe/generated/8.5/outcontrol.php        L      6   vendor/thecodingmachine/safe/generated/8.5/opcache.php        q      4   vendor/thecodingmachine/safe/generated/8.5/mysql.php          ֳw      2   vendor/thecodingmachine/safe/generated/8.5/rrd.php`      `  &      8   vendor/thecodingmachine/safe/generated/8.5/errorfunc.php        ٥      4   vendor/thecodingmachine/safe/generated/8.5/ibase.php%      %  iä      3   vendor/thecodingmachine/safe/generated/8.5/uopz.php        玮      7   vendor/thecodingmachine/safe/generated/8.5/mbstring.php        S&Q      4   vendor/thecodingmachine/safe/generated/8.5/gnupg.php        S٠      2   vendor/thecodingmachine/safe/generated/8.5/xml.php        &3C      2   vendor/thecodingmachine/safe/generated/8.5/sem.php4      4        2   vendor/thecodingmachine/safe/generated/8.5/spl.phpD      D  1ߤ      4   vendor/thecodingmachine/safe/generated/8.5/xdiff.phpp
      p
  C      3   vendor/thecodingmachine/safe/generated/8.5/yaml.php        rڤ      3   vendor/thecodingmachine/safe/generated/8.5/solr.php          J$      7   vendor/thecodingmachine/safe/generated/8.5/datetime.php\      \  w      3   vendor/thecodingmachine/safe/generated/8.5/imap.php9      9  -fU      6   vendor/thecodingmachine/safe/generated/8.5/network.php        Pʤ      2   vendor/thecodingmachine/safe/generated/8.5/url.php        )      4   vendor/thecodingmachine/safe/generated/8.5/posix.php;      ;  	g      4   vendor/thecodingmachine/safe/generated/8.5/uodbc.php]*      ]*  g      2   vendor/thecodingmachine/safe/generated/8.5/lzf.php        -,      4   vendor/thecodingmachine/safe/generated/8.5/image.phpe      e  ?      7   vendor/thecodingmachine/safe/generated/8.5/readline.phpx      x  t      4   vendor/thecodingmachine/safe/generated/8.5/array.php              9   vendor/thecodingmachine/safe/generated/8.5/filesystem.php3      3  ڇVE      5   vendor/thecodingmachine/safe/generated/8.5/filter.php              3   vendor/thecodingmachine/safe/generated/8.5/oci8.php7+      7+  e      4   vendor/thecodingmachine/safe/generated/8.5/pgsql.php3      3  x      2   vendor/thecodingmachine/safe/generated/8.5/eio.phpX3      X3  }H      6   vendor/thecodingmachine/safe/generated/8.5/sockets.phpH      H        4   vendor/thecodingmachine/safe/generated/8.5/bzip2.phpo      o  BQ      3   vendor/thecodingmachine/safe/generated/8.5/apcu.php        A      3   vendor/thecodingmachine/safe/generated/8.5/pcre.php
      
  R3      2   vendor/thecodingmachine/safe/generated/8.5/gmp.php          (?      2   vendor/thecodingmachine/safe/generated/8.5/var.php        .Ҥ      3   vendor/thecodingmachine/safe/generated/8.5/ssh2.php        "p̤      2   vendor/thecodingmachine/safe/generated/8.5/rnp.php          k^      6   vendor/thecodingmachine/safe/generated/8.5/rpminfo.php        Dzݮ      2   vendor/thecodingmachine/safe/generated/8.5/fpm.php        8NA      6   vendor/thecodingmachine/safe/generated/8.5/inotify.php        c      2   vendor/thecodingmachine/safe/generated/8.5/zip.phpg      g  F4Ӥ      6   vendor/thecodingmachine/safe/generated/8.5/strings.php        #nL      7   vendor/thecodingmachine/safe/generated/8.5/calendar.phpZ      Z  $      4   vendor/thecodingmachine/safe/generated/8.5/pcntl.php        e      4   vendor/thecodingmachine/safe/generated/8.5/iconv.php        ɘ m      3   vendor/thecodingmachine/safe/generated/8.5/info.php        Q      5   vendor/thecodingmachine/safe/generated/8.5/ibmDb2.php        1W      <   vendor/thecodingmachine/safe/generated/8.5/functionsList.phpO      O  "x      7   vendor/thecodingmachine/safe/generated/8.5/fileinfo.phpH      H  ʩ      .   vendor/thecodingmachine/safe/generated/com.php        m2'      .   vendor/thecodingmachine/safe/generated/ftp.php        Za      /   vendor/thecodingmachine/safe/generated/json.php        %      1   vendor/thecodingmachine/safe/generated/apache.php         <Ĥ      /   vendor/thecodingmachine/safe/generated/hash.php        -ɤ      1   vendor/thecodingmachine/safe/generated/swoole.php        :ͤ      1   vendor/thecodingmachine/safe/generated/sodium.php        	Τ      1   vendor/thecodingmachine/safe/generated/pspell.php         3      1   vendor/thecodingmachine/safe/generated/mysqli.php        {ٶ      5   vendor/thecodingmachine/safe/generated/outcontrol.php        гH      2   vendor/thecodingmachine/safe/generated/opcache.php        S      0   vendor/thecodingmachine/safe/generated/mysql.php        ?_      .   vendor/thecodingmachine/safe/generated/rrd.php        :(      4   vendor/thecodingmachine/safe/generated/errorfunc.php        k䐤      0   vendor/thecodingmachine/safe/generated/ibase.php        獋      /   vendor/thecodingmachine/safe/generated/uopz.php        ä      3   vendor/thecodingmachine/safe/generated/mbstring.php        {      0   vendor/thecodingmachine/safe/generated/gnupg.php        <3I      .   vendor/thecodingmachine/safe/generated/xml.php        t4xդ      .   vendor/thecodingmachine/safe/generated/sem.php        
T      .   vendor/thecodingmachine/safe/generated/spl.php        Ky      0   vendor/thecodingmachine/safe/generated/xdiff.php        ޴d      /   vendor/thecodingmachine/safe/generated/yaml.php        *ʑ      /   vendor/thecodingmachine/safe/generated/solr.php        b      3   vendor/thecodingmachine/safe/generated/datetime.php        %X      /   vendor/thecodingmachine/safe/generated/imap.php        >      2   vendor/thecodingmachine/safe/generated/network.php        F      .   vendor/thecodingmachine/safe/generated/url.php        t      6   vendor/thecodingmachine/safe/generated/8.4/openssl.php_M      _M  >      3   vendor/thecodingmachine/safe/generated/8.4/exec.php        Z      5   vendor/thecodingmachine/safe/generated/8.4/libxml.phpc      c  pc      7   vendor/thecodingmachine/safe/generated/8.4/classobj.php9      9  C      5   vendor/thecodingmachine/safe/generated/8.4/ssdeep.php+      +  O*      1   vendor/thecodingmachine/safe/generated/8.4/ps.php;      ;  ʑXG      2   vendor/thecodingmachine/safe/generated/8.4/yaz.php        9      3   vendor/thecodingmachine/safe/generated/8.4/curl.phpQ      Q  &%t^      6   vendor/thecodingmachine/safe/generated/8.4/session.php        P      7   vendor/thecodingmachine/safe/generated/8.4/funchand.php        )"      3   vendor/thecodingmachine/safe/generated/8.4/zlib.php        u`G      3   vendor/thecodingmachine/safe/generated/8.4/misc.php        "j      5   vendor/thecodingmachine/safe/generated/8.4/cubrid.phpA      A  oQmc      8   vendor/thecodingmachine/safe/generated/8.4/mailparse.php        dw}?      3   vendor/thecodingmachine/safe/generated/8.4/ldap.php*.      *.  KG      5   vendor/thecodingmachine/safe/generated/8.4/xmlrpc.php              5   vendor/thecodingmachine/safe/generated/8.4/sqlsrv.php        ;      4   vendor/thecodingmachine/safe/generated/8.4/shmop.php        \%      2   vendor/thecodingmachine/safe/generated/8.4/dir.phpI      I  ;W      6   vendor/thecodingmachine/safe/generated/8.4/gettext.php        XW(      5   vendor/thecodingmachine/safe/generated/8.4/stream.php          |      2   vendor/thecodingmachine/safe/generated/8.4/com.phph      h  4      2   vendor/thecodingmachine/safe/generated/8.4/ftp.php2      2  D-      =   vendor/thecodingmachine/safe/generated/8.4/rector-migrate.phpĽ      Ľ  2<      3   vendor/thecodingmachine/safe/generated/8.4/json.phpX      X  K      5   vendor/thecodingmachine/safe/generated/8.4/apache.phpL      L  /O>!      3   vendor/thecodingmachine/safe/generated/8.4/hash.php        8u      5   vendor/thecodingmachine/safe/generated/8.4/swoole.phps      s  ֥      5   vendor/thecodingmachine/safe/generated/8.4/sodium.php3      3  dB      5   vendor/thecodingmachine/safe/generated/8.4/pspell.phpv      v  l٤      5   vendor/thecodingmachine/safe/generated/8.4/mysqli.php          8      9   vendor/thecodingmachine/safe/generated/8.4/outcontrol.php        L      6   vendor/thecodingmachine/safe/generated/8.4/opcache.php        q      4   vendor/thecodingmachine/safe/generated/8.4/mysql.php          ֳw      2   vendor/thecodingmachine/safe/generated/8.4/rrd.php`      `  &      8   vendor/thecodingmachine/safe/generated/8.4/errorfunc.php        ٥      4   vendor/thecodingmachine/safe/generated/8.4/ibase.php%      %  iä      3   vendor/thecodingmachine/safe/generated/8.4/uopz.php        玮      7   vendor/thecodingmachine/safe/generated/8.4/mbstring.php        S&Q      4   vendor/thecodingmachine/safe/generated/8.4/gnupg.php        S٠      2   vendor/thecodingmachine/safe/generated/8.4/xml.php        &3C      2   vendor/thecodingmachine/safe/generated/8.4/sem.php4      4        2   vendor/thecodingmachine/safe/generated/8.4/spl.phpD      D  1ߤ      4   vendor/thecodingmachine/safe/generated/8.4/xdiff.phpp
      p
  C      3   vendor/thecodingmachine/safe/generated/8.4/yaml.php        rڤ      3   vendor/thecodingmachine/safe/generated/8.4/solr.php          J$      7   vendor/thecodingmachine/safe/generated/8.4/datetime.php\      \  w      3   vendor/thecodingmachine/safe/generated/8.4/imap.php9      9  -fU      6   vendor/thecodingmachine/safe/generated/8.4/network.php        Pʤ      2   vendor/thecodingmachine/safe/generated/8.4/url.php        )      4   vendor/thecodingmachine/safe/generated/8.4/posix.php;      ;  	g      4   vendor/thecodingmachine/safe/generated/8.4/uodbc.phpH(      H(  5!@~      2   vendor/thecodingmachine/safe/generated/8.4/lzf.php        -,      4   vendor/thecodingmachine/safe/generated/8.4/image.phpe      e  T      7   vendor/thecodingmachine/safe/generated/8.4/readline.phpx      x  t      4   vendor/thecodingmachine/safe/generated/8.4/array.php              9   vendor/thecodingmachine/safe/generated/8.4/filesystem.php3      3  ڇVE      5   vendor/thecodingmachine/safe/generated/8.4/filter.php              3   vendor/thecodingmachine/safe/generated/8.4/oci8.php7+      7+  e      4   vendor/thecodingmachine/safe/generated/8.4/pgsql.php3      3  #k      2   vendor/thecodingmachine/safe/generated/8.4/eio.phpX3      X3  }H      6   vendor/thecodingmachine/safe/generated/8.4/sockets.phpH      H        4   vendor/thecodingmachine/safe/generated/8.4/bzip2.phpo      o  BQ      3   vendor/thecodingmachine/safe/generated/8.4/apcu.php        A      3   vendor/thecodingmachine/safe/generated/8.4/pcre.php
      
  R3      2   vendor/thecodingmachine/safe/generated/8.4/gmp.php          (?      2   vendor/thecodingmachine/safe/generated/8.4/var.php        .Ҥ      3   vendor/thecodingmachine/safe/generated/8.4/ssh2.php        "p̤      2   vendor/thecodingmachine/safe/generated/8.4/rnp.php          k^      6   vendor/thecodingmachine/safe/generated/8.4/rpminfo.php          |02      2   vendor/thecodingmachine/safe/generated/8.4/fpm.php        8NA      6   vendor/thecodingmachine/safe/generated/8.4/inotify.php        c      2   vendor/thecodingmachine/safe/generated/8.4/zip.phpg      g  F4Ӥ      6   vendor/thecodingmachine/safe/generated/8.4/strings.php        #nL      7   vendor/thecodingmachine/safe/generated/8.4/calendar.phpZ      Z  $      4   vendor/thecodingmachine/safe/generated/8.4/pcntl.php	      	  &Qh      4   vendor/thecodingmachine/safe/generated/8.4/iconv.php        ɘ m      3   vendor/thecodingmachine/safe/generated/8.4/info.php        Q      5   vendor/thecodingmachine/safe/generated/8.4/ibmDb2.php        1W      <   vendor/thecodingmachine/safe/generated/8.4/functionsList.php}O      }O  K$Ϥ      7   vendor/thecodingmachine/safe/generated/8.4/fileinfo.phpH      H  ʩ      0   vendor/thecodingmachine/safe/generated/posix.php        "/      0   vendor/thecodingmachine/safe/generated/uodbc.php        a      .   vendor/thecodingmachine/safe/generated/lzf.php        si      0   vendor/thecodingmachine/safe/generated/image.php        ptդ      3   vendor/thecodingmachine/safe/generated/readline.php        ?F?r      0   vendor/thecodingmachine/safe/generated/array.php        z      5   vendor/thecodingmachine/safe/generated/filesystem.php        Qf!H      1   vendor/thecodingmachine/safe/generated/filter.php        f      /   vendor/thecodingmachine/safe/generated/oci8.php        ܂      B   vendor/thecodingmachine/safe/generated/Exceptions/FpmException.php              D   vendor/thecodingmachine/safe/generated/Exceptions/ShmopException.php        W      F   vendor/thecodingmachine/safe/generated/Exceptions/RpminfoException.php        ppפ      D   vendor/thecodingmachine/safe/generated/Exceptions/ImageException.php        |      B   vendor/thecodingmachine/safe/generated/Exceptions/FtpException.php        UͲ      D   vendor/thecodingmachine/safe/generated/Exceptions/GnupgException.php        K      C   vendor/thecodingmachine/safe/generated/Exceptions/ZlibException.php        ?6      C   vendor/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php        KNf      C   vendor/thecodingmachine/safe/generated/Exceptions/ExecException.php        10Ĥ      E   vendor/thecodingmachine/safe/generated/Exceptions/SsdeepException.php        C      C   vendor/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php        2      E   vendor/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php        P      E   vendor/thecodingmachine/safe/generated/Exceptions/LibxmlException.php        D      F   vendor/thecodingmachine/safe/generated/Exceptions/NetworkException.php              G   vendor/thecodingmachine/safe/generated/Exceptions/ReadlineException.php        r      F   vendor/thecodingmachine/safe/generated/Exceptions/SocketsException.php        Ѣ      B   vendor/thecodingmachine/safe/generated/Exceptions/RrdException.php        C      G   vendor/thecodingmachine/safe/generated/Exceptions/MbstringException.php        "      C   vendor/thecodingmachine/safe/generated/Exceptions/InfoException.php        ʤ      E   vendor/thecodingmachine/safe/generated/Exceptions/PspellException.php        m_      B   vendor/thecodingmachine/safe/generated/Exceptions/RnpException.php        a      D   vendor/thecodingmachine/safe/generated/Exceptions/UodbcException.php        m      E   vendor/thecodingmachine/safe/generated/Exceptions/MysqliException.php        B      F   vendor/thecodingmachine/safe/generated/Exceptions/StringsException.php        Hq~      H   vendor/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php        Ǡ      B   vendor/thecodingmachine/safe/generated/Exceptions/SplException.php        c/%      E   vendor/thecodingmachine/safe/generated/Exceptions/FilterException.php              E   vendor/thecodingmachine/safe/generated/Exceptions/SodiumException.php        9;է      C   vendor/thecodingmachine/safe/generated/Exceptions/LdapException.php        .      G   vendor/thecodingmachine/safe/generated/Exceptions/FunchandException.php        YG      I   vendor/thecodingmachine/safe/generated/Exceptions/FilesystemException.php        	G      D   vendor/thecodingmachine/safe/generated/Exceptions/ArrayException.php        a_$      E   vendor/thecodingmachine/safe/generated/Exceptions/CubridException.php        q      E   vendor/thecodingmachine/safe/generated/Exceptions/ApacheException.php              F   vendor/thecodingmachine/safe/generated/Exceptions/InotifyException.php        wc      C   vendor/thecodingmachine/safe/generated/Exceptions/SolrException.php        ̤      G   vendor/thecodingmachine/safe/generated/Exceptions/DatetimeException.php        |'      F   vendor/thecodingmachine/safe/generated/Exceptions/OpcacheException.php        <'Ѥ      E   vendor/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php        0\      B   vendor/thecodingmachine/safe/generated/Exceptions/YazException.php              C   vendor/thecodingmachine/safe/generated/Exceptions/YamlException.php              E   vendor/thecodingmachine/safe/generated/Exceptions/SwooleException.php        I      C   vendor/thecodingmachine/safe/generated/Exceptions/ImapException.php        KѤ      D   vendor/thecodingmachine/safe/generated/Exceptions/PcntlException.php        -      B   vendor/thecodingmachine/safe/generated/Exceptions/UrlException.php        a-      C   vendor/thecodingmachine/safe/generated/Exceptions/HashException.php              D   vendor/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php        髗      D   vendor/thecodingmachine/safe/generated/Exceptions/IconvException.php        k      C   vendor/thecodingmachine/safe/generated/Exceptions/MiscException.php              B   vendor/thecodingmachine/safe/generated/Exceptions/EioException.php        @ol      D   vendor/thecodingmachine/safe/generated/Exceptions/IbaseException.php        =g      I   vendor/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php        7      D   vendor/thecodingmachine/safe/generated/Exceptions/MysqlException.php        W'F      F   vendor/thecodingmachine/safe/generated/Exceptions/GettextException.php        pLG      D   vendor/thecodingmachine/safe/generated/Exceptions/PosixException.php        lK%      B   vendor/thecodingmachine/safe/generated/Exceptions/DirException.php        Q      D   vendor/thecodingmachine/safe/generated/Exceptions/XdiffException.php        jFf      E   vendor/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php        n      H   vendor/thecodingmachine/safe/generated/Exceptions/MailparseException.php        %l@      C   vendor/thecodingmachine/safe/generated/Exceptions/ApcuException.php        ['t      G   vendor/thecodingmachine/safe/generated/Exceptions/FileinfoException.php        ,,      F   vendor/thecodingmachine/safe/generated/Exceptions/SessionException.php        t#Q      B   vendor/thecodingmachine/safe/generated/Exceptions/VarException.php        +      B   vendor/thecodingmachine/safe/generated/Exceptions/LzfException.php        so      E   vendor/thecodingmachine/safe/generated/Exceptions/StreamException.php        2      D   vendor/thecodingmachine/safe/generated/Exceptions/PgsqlException.php        \٤      C   vendor/thecodingmachine/safe/generated/Exceptions/UopzException.php        
9      A   vendor/thecodingmachine/safe/generated/Exceptions/PsException.php              B   vendor/thecodingmachine/safe/generated/Exceptions/XmlException.php        3cߎ      B   vendor/thecodingmachine/safe/generated/Exceptions/ZipException.php        @m      G   vendor/thecodingmachine/safe/generated/Exceptions/ClassobjException.php        Ah      B   vendor/thecodingmachine/safe/generated/Exceptions/ComException.php        bg      G   vendor/thecodingmachine/safe/generated/Exceptions/CalendarException.php        (i      B   vendor/thecodingmachine/safe/generated/Exceptions/SemException.php        )D      B   vendor/thecodingmachine/safe/generated/Exceptions/GmpException.php        w¤      0   vendor/thecodingmachine/safe/generated/pgsql.php        ɇ3      .   vendor/thecodingmachine/safe/generated/eio.php              2   vendor/thecodingmachine/safe/generated/sockets.php        'W      0   vendor/thecodingmachine/safe/generated/bzip2.php        iT%      /   vendor/thecodingmachine/safe/generated/apcu.php        TԹv      /   vendor/thecodingmachine/safe/generated/pcre.php        
uX4      .   vendor/thecodingmachine/safe/generated/gmp.php        \      6   vendor/thecodingmachine/safe/generated/8.2/openssl.phpK      K  %:      3   vendor/thecodingmachine/safe/generated/8.2/exec.php        Z      5   vendor/thecodingmachine/safe/generated/8.2/libxml.phpc      c  pc      7   vendor/thecodingmachine/safe/generated/8.2/classobj.php8      8  m+J      5   vendor/thecodingmachine/safe/generated/8.2/ssdeep.php+      +  O*      1   vendor/thecodingmachine/safe/generated/8.2/ps.php;      ;  ʑXG      2   vendor/thecodingmachine/safe/generated/8.2/yaz.php        9      3   vendor/thecodingmachine/safe/generated/8.2/curl.php        K4d      6   vendor/thecodingmachine/safe/generated/8.2/session.php        !Ӥ      7   vendor/thecodingmachine/safe/generated/8.2/funchand.php        )"      3   vendor/thecodingmachine/safe/generated/8.2/zlib.php\      \  	ጤ      3   vendor/thecodingmachine/safe/generated/8.2/misc.php!      !  x      5   vendor/thecodingmachine/safe/generated/8.2/cubrid.phpA      A  oQmc      8   vendor/thecodingmachine/safe/generated/8.2/mailparse.php        dw}?      3   vendor/thecodingmachine/safe/generated/8.2/ldap.phpv.      v.  ~!Y      5   vendor/thecodingmachine/safe/generated/8.2/xmlrpc.php              5   vendor/thecodingmachine/safe/generated/8.2/sqlsrv.php        ;      4   vendor/thecodingmachine/safe/generated/8.2/shmop.php              2   vendor/thecodingmachine/safe/generated/8.2/dir.phpI      I  ;W      6   vendor/thecodingmachine/safe/generated/8.2/gettext.php;      ;  }      5   vendor/thecodingmachine/safe/generated/8.2/stream.php        ,      2   vendor/thecodingmachine/safe/generated/8.2/com.phph      h  4      2   vendor/thecodingmachine/safe/generated/8.2/ftp.php        Le      =   vendor/thecodingmachine/safe/generated/8.2/rector-migrate.php
      
        3   vendor/thecodingmachine/safe/generated/8.2/json.phpX      X  K      5   vendor/thecodingmachine/safe/generated/8.2/apache.phpA      A  "5      3   vendor/thecodingmachine/safe/generated/8.2/hash.php        8u      5   vendor/thecodingmachine/safe/generated/8.2/swoole.phps      s  ֥      5   vendor/thecodingmachine/safe/generated/8.2/sodium.php        Di      5   vendor/thecodingmachine/safe/generated/8.2/pspell.php        -с      5   vendor/thecodingmachine/safe/generated/8.2/mysqli.php          8      9   vendor/thecodingmachine/safe/generated/8.2/outcontrol.php        Izʤ      6   vendor/thecodingmachine/safe/generated/8.2/opcache.php        q      4   vendor/thecodingmachine/safe/generated/8.2/mysql.php          ֳw      2   vendor/thecodingmachine/safe/generated/8.2/rrd.php`      `  &      8   vendor/thecodingmachine/safe/generated/8.2/errorfunc.php        ٥      4   vendor/thecodingmachine/safe/generated/8.2/ibase.php%      %  iä      3   vendor/thecodingmachine/safe/generated/8.2/uopz.php        玮      7   vendor/thecodingmachine/safe/generated/8.2/mbstring.php        t      4   vendor/thecodingmachine/safe/generated/8.2/gnupg.php        S٠      2   vendor/thecodingmachine/safe/generated/8.2/xml.php?      ?        2   vendor/thecodingmachine/safe/generated/8.2/sem.php4      4        2   vendor/thecodingmachine/safe/generated/8.2/spl.php9      9  @E7      4   vendor/thecodingmachine/safe/generated/8.2/xdiff.phpp
      p
  C      3   vendor/thecodingmachine/safe/generated/8.2/yaml.php        rڤ      3   vendor/thecodingmachine/safe/generated/8.2/solr.php          J$      7   vendor/thecodingmachine/safe/generated/8.2/datetime.php        x0Ф      3   vendor/thecodingmachine/safe/generated/8.2/imap.php:      :  Ҁ      6   vendor/thecodingmachine/safe/generated/8.2/network.phpU      U  r5      2   vendor/thecodingmachine/safe/generated/8.2/url.php        )      4   vendor/thecodingmachine/safe/generated/8.2/posix.php        o      4   vendor/thecodingmachine/safe/generated/8.2/uodbc.php(      (  h      2   vendor/thecodingmachine/safe/generated/8.2/lzf.php        -,      4   vendor/thecodingmachine/safe/generated/8.2/image.phpRf      Rf  T      7   vendor/thecodingmachine/safe/generated/8.2/readline.php&      &  C;      4   vendor/thecodingmachine/safe/generated/8.2/array.php        =ʤ      9   vendor/thecodingmachine/safe/generated/8.2/filesystem.php53      53  fhƤ      5   vendor/thecodingmachine/safe/generated/8.2/filter.php        e6Ϳ      3   vendor/thecodingmachine/safe/generated/8.2/oci8.php=+      =+  tGͤ      4   vendor/thecodingmachine/safe/generated/8.2/pgsql.php12      12  O ݤ      2   vendor/thecodingmachine/safe/generated/8.2/eio.phpV3      V3  	+      6   vendor/thecodingmachine/safe/generated/8.2/sockets.php~      ~  Np      4   vendor/thecodingmachine/safe/generated/8.2/bzip2.phpo      o  BQ      3   vendor/thecodingmachine/safe/generated/8.2/apcu.php        A      3   vendor/thecodingmachine/safe/generated/8.2/pcre.php
      
  R3      2   vendor/thecodingmachine/safe/generated/8.2/gmp.php          (?      2   vendor/thecodingmachine/safe/generated/8.2/var.php        .Ҥ      3   vendor/thecodingmachine/safe/generated/8.2/ssh2.php        "p̤      2   vendor/thecodingmachine/safe/generated/8.2/rnp.php          k^      6   vendor/thecodingmachine/safe/generated/8.2/rpminfo.php          |02      2   vendor/thecodingmachine/safe/generated/8.2/fpm.php        8NA      6   vendor/thecodingmachine/safe/generated/8.2/inotify.php        T      2   vendor/thecodingmachine/safe/generated/8.2/zip.phpg      g  F4Ӥ      6   vendor/thecodingmachine/safe/generated/8.2/strings.php        #nL      7   vendor/thecodingmachine/safe/generated/8.2/calendar.phpZ      Z  $      4   vendor/thecodingmachine/safe/generated/8.2/pcntl.php	      	  &Qh      4   vendor/thecodingmachine/safe/generated/8.2/iconv.php        ɘ m      3   vendor/thecodingmachine/safe/generated/8.2/info.php        QZBפ      5   vendor/thecodingmachine/safe/generated/8.2/ibmDb2.php        ߚ~      <   vendor/thecodingmachine/safe/generated/8.2/functionsList.phpS      S  lh      7   vendor/thecodingmachine/safe/generated/8.2/fileinfo.phpH      H  ʩ      .   vendor/thecodingmachine/safe/generated/var.php        ވ V      /   vendor/thecodingmachine/safe/generated/ssh2.php        ]b      .   vendor/thecodingmachine/safe/generated/rnp.php[      [  Tܤ      2   vendor/thecodingmachine/safe/generated/rpminfo.php        6>      .   vendor/thecodingmachine/safe/generated/fpm.php        ̾      2   vendor/thecodingmachine/safe/generated/inotify.php        A#      .   vendor/thecodingmachine/safe/generated/zip.php        pZ      2   vendor/thecodingmachine/safe/generated/strings.php        ɾFǤ      6   vendor/thecodingmachine/safe/generated/8.1/openssl.php1J      1J  d      3   vendor/thecodingmachine/safe/generated/8.1/exec.php        ;=      5   vendor/thecodingmachine/safe/generated/8.1/libxml.phpc      c  pc      7   vendor/thecodingmachine/safe/generated/8.1/classobj.php8      8  m+J      5   vendor/thecodingmachine/safe/generated/8.1/ssdeep.php+      +  O*      1   vendor/thecodingmachine/safe/generated/8.1/ps.php;      ;  ʑXG      2   vendor/thecodingmachine/safe/generated/8.1/yaz.php        9      3   vendor/thecodingmachine/safe/generated/8.1/curl.php          h<      6   vendor/thecodingmachine/safe/generated/8.1/session.php        !Ӥ      7   vendor/thecodingmachine/safe/generated/8.1/funchand.php        )"      3   vendor/thecodingmachine/safe/generated/8.1/zlib.php\      \  	ጤ      3   vendor/thecodingmachine/safe/generated/8.1/misc.phpq      q  tT      5   vendor/thecodingmachine/safe/generated/8.1/cubrid.phpA      A  oQmc      8   vendor/thecodingmachine/safe/generated/8.1/mailparse.php        dw}?      3   vendor/thecodingmachine/safe/generated/8.1/ldap.php.      .  d      5   vendor/thecodingmachine/safe/generated/8.1/xmlrpc.php              5   vendor/thecodingmachine/safe/generated/8.1/sqlsrv.php        ;      4   vendor/thecodingmachine/safe/generated/8.1/shmop.php              2   vendor/thecodingmachine/safe/generated/8.1/dir.phpI      I  ;W      6   vendor/thecodingmachine/safe/generated/8.1/gettext.php;      ;  }      5   vendor/thecodingmachine/safe/generated/8.1/stream.php        kf"      2   vendor/thecodingmachine/safe/generated/8.1/com.phph      h  4      2   vendor/thecodingmachine/safe/generated/8.1/ftp.php        =+      =   vendor/thecodingmachine/safe/generated/8.1/rector-migrate.phpF      F  /d      3   vendor/thecodingmachine/safe/generated/8.1/json.phpS      S  '      5   vendor/thecodingmachine/safe/generated/8.1/apache.phpA      A  "5      3   vendor/thecodingmachine/safe/generated/8.1/hash.php        &       5   vendor/thecodingmachine/safe/generated/8.1/swoole.phps      s  ֥      5   vendor/thecodingmachine/safe/generated/8.1/sodium.phpP      P  JI      5   vendor/thecodingmachine/safe/generated/8.1/pspell.php        -с      5   vendor/thecodingmachine/safe/generated/8.1/mysqli.php        )      9   vendor/thecodingmachine/safe/generated/8.1/outcontrol.php        Izʤ      6   vendor/thecodingmachine/safe/generated/8.1/opcache.php        q      4   vendor/thecodingmachine/safe/generated/8.1/mysql.php          ֳw      2   vendor/thecodingmachine/safe/generated/8.1/rrd.php`      `  &      8   vendor/thecodingmachine/safe/generated/8.1/errorfunc.phpu      u  %      4   vendor/thecodingmachine/safe/generated/8.1/ibase.php%      %  iä      3   vendor/thecodingmachine/safe/generated/8.1/uopz.php        玮      7   vendor/thecodingmachine/safe/generated/8.1/mbstring.php        v٤      4   vendor/thecodingmachine/safe/generated/8.1/gnupg.php        d      2   vendor/thecodingmachine/safe/generated/8.1/xml.php?      ?        2   vendor/thecodingmachine/safe/generated/8.1/sem.php4      4        2   vendor/thecodingmachine/safe/generated/8.1/spl.php9      9  @E7      4   vendor/thecodingmachine/safe/generated/8.1/xdiff.phpp
      p
  C      3   vendor/thecodingmachine/safe/generated/8.1/yaml.php        rڤ      3   vendor/thecodingmachine/safe/generated/8.1/solr.php          J$      7   vendor/thecodingmachine/safe/generated/8.1/datetime.php              3   vendor/thecodingmachine/safe/generated/8.1/imap.phpx:      x:  0      6   vendor/thecodingmachine/safe/generated/8.1/network.php2      2  B      2   vendor/thecodingmachine/safe/generated/8.1/url.php        e      4   vendor/thecodingmachine/safe/generated/8.1/posix.php        o      4   vendor/thecodingmachine/safe/generated/8.1/uodbc.php(      (  h      2   vendor/thecodingmachine/safe/generated/8.1/lzf.php        -,      4   vendor/thecodingmachine/safe/generated/8.1/image.phpf      f  6)I      7   vendor/thecodingmachine/safe/generated/8.1/readline.php&      &  C;      4   vendor/thecodingmachine/safe/generated/8.1/array.php        ھ0      9   vendor/thecodingmachine/safe/generated/8.1/filesystem.phpU3      U3  d      5   vendor/thecodingmachine/safe/generated/8.1/filter.php        e6Ϳ      3   vendor/thecodingmachine/safe/generated/8.1/oci8.php2*      2*        4   vendor/thecodingmachine/safe/generated/8.1/pgsql.php/2      /2  DԤ      2   vendor/thecodingmachine/safe/generated/8.1/eio.phpV3      V3  	+      6   vendor/thecodingmachine/safe/generated/8.1/sockets.php~      ~  Np      4   vendor/thecodingmachine/safe/generated/8.1/bzip2.phpo      o  BQ      3   vendor/thecodingmachine/safe/generated/8.1/apcu.php        A      3   vendor/thecodingmachine/safe/generated/8.1/pcre.php
      
  R3      2   vendor/thecodingmachine/safe/generated/8.1/gmp.php          ֤      2   vendor/thecodingmachine/safe/generated/8.1/var.php        .Ҥ      3   vendor/thecodingmachine/safe/generated/8.1/ssh2.php        %e      6   vendor/thecodingmachine/safe/generated/8.1/rpminfo.php          |02      2   vendor/thecodingmachine/safe/generated/8.1/fpm.php           .      6   vendor/thecodingmachine/safe/generated/8.1/inotify.php        T      2   vendor/thecodingmachine/safe/generated/8.1/zip.phpg      g  F4Ӥ      6   vendor/thecodingmachine/safe/generated/8.1/strings.php        #nL      7   vendor/thecodingmachine/safe/generated/8.1/calendar.phpZ      Z  $      4   vendor/thecodingmachine/safe/generated/8.1/pcntl.php		      		  /ާ      4   vendor/thecodingmachine/safe/generated/8.1/iconv.php        *97      3   vendor/thecodingmachine/safe/generated/8.1/info.php        QZBפ      5   vendor/thecodingmachine/safe/generated/8.1/ibmDb2.php        ߚ~      <   vendor/thecodingmachine/safe/generated/8.1/functionsList.phpP      P  60Xf      7   vendor/thecodingmachine/safe/generated/8.1/fileinfo.phpH      H  ʩ      3   vendor/thecodingmachine/safe/generated/calendar.php              0   vendor/thecodingmachine/safe/generated/pcntl.php        k      0   vendor/thecodingmachine/safe/generated/iconv.php        YD      /   vendor/thecodingmachine/safe/generated/info.php        k      1   vendor/thecodingmachine/safe/generated/ibmDb2.php        jp      8   vendor/thecodingmachine/safe/generated/functionsList.php        ]{      6   vendor/thecodingmachine/safe/generated/8.3/openssl.phpK      K  %:      3   vendor/thecodingmachine/safe/generated/8.3/exec.php        Z      5   vendor/thecodingmachine/safe/generated/8.3/libxml.phpc      c  pc      7   vendor/thecodingmachine/safe/generated/8.3/classobj.php8      8  m+J      5   vendor/thecodingmachine/safe/generated/8.3/ssdeep.php+      +  O*      1   vendor/thecodingmachine/safe/generated/8.3/ps.php;      ;  ʑXG      2   vendor/thecodingmachine/safe/generated/8.3/yaz.php        9      3   vendor/thecodingmachine/safe/generated/8.3/curl.php        K4d      6   vendor/thecodingmachine/safe/generated/8.3/session.php        !Ӥ      7   vendor/thecodingmachine/safe/generated/8.3/funchand.php        )"      3   vendor/thecodingmachine/safe/generated/8.3/zlib.php\      \  	ጤ      3   vendor/thecodingmachine/safe/generated/8.3/misc.php!      !  x      5   vendor/thecodingmachine/safe/generated/8.3/cubrid.phpA      A  oQmc      8   vendor/thecodingmachine/safe/generated/8.3/mailparse.php        dw}?      3   vendor/thecodingmachine/safe/generated/8.3/ldap.phpv.      v.  ~!Y      5   vendor/thecodingmachine/safe/generated/8.3/xmlrpc.php              5   vendor/thecodingmachine/safe/generated/8.3/sqlsrv.php        ;      4   vendor/thecodingmachine/safe/generated/8.3/shmop.php              2   vendor/thecodingmachine/safe/generated/8.3/dir.phpI      I  ;W      6   vendor/thecodingmachine/safe/generated/8.3/gettext.php;      ;  }      5   vendor/thecodingmachine/safe/generated/8.3/stream.php        ,      2   vendor/thecodingmachine/safe/generated/8.3/com.phph      h  4      2   vendor/thecodingmachine/safe/generated/8.3/ftp.php        Le      =   vendor/thecodingmachine/safe/generated/8.3/rector-migrate.php
      
        3   vendor/thecodingmachine/safe/generated/8.3/json.phpX      X  K      5   vendor/thecodingmachine/safe/generated/8.3/apache.phpA      A  "5      3   vendor/thecodingmachine/safe/generated/8.3/hash.php        8u      5   vendor/thecodingmachine/safe/generated/8.3/swoole.phps      s  ֥      5   vendor/thecodingmachine/safe/generated/8.3/sodium.php        Di      5   vendor/thecodingmachine/safe/generated/8.3/pspell.php        -с      5   vendor/thecodingmachine/safe/generated/8.3/mysqli.php          8      9   vendor/thecodingmachine/safe/generated/8.3/outcontrol.php        Izʤ      6   vendor/thecodingmachine/safe/generated/8.3/opcache.php        q      4   vendor/thecodingmachine/safe/generated/8.3/mysql.php          ֳw      2   vendor/thecodingmachine/safe/generated/8.3/rrd.php`      `  &      8   vendor/thecodingmachine/safe/generated/8.3/errorfunc.php        ٥      4   vendor/thecodingmachine/safe/generated/8.3/ibase.php%      %  iä      3   vendor/thecodingmachine/safe/generated/8.3/uopz.php        玮      7   vendor/thecodingmachine/safe/generated/8.3/mbstring.php        t      4   vendor/thecodingmachine/safe/generated/8.3/gnupg.php        S٠      2   vendor/thecodingmachine/safe/generated/8.3/xml.php?      ?        2   vendor/thecodingmachine/safe/generated/8.3/sem.php4      4        2   vendor/thecodingmachine/safe/generated/8.3/spl.php9      9  @E7      4   vendor/thecodingmachine/safe/generated/8.3/xdiff.phpp
      p
  C      3   vendor/thecodingmachine/safe/generated/8.3/yaml.php        rڤ      3   vendor/thecodingmachine/safe/generated/8.3/solr.php          J$      7   vendor/thecodingmachine/safe/generated/8.3/datetime.php        x0Ф      3   vendor/thecodingmachine/safe/generated/8.3/imap.php:      :  Ҁ      6   vendor/thecodingmachine/safe/generated/8.3/network.phpU      U  r5      2   vendor/thecodingmachine/safe/generated/8.3/url.php        )      4   vendor/thecodingmachine/safe/generated/8.3/posix.php        o      4   vendor/thecodingmachine/safe/generated/8.3/uodbc.php(      (  h      2   vendor/thecodingmachine/safe/generated/8.3/lzf.php        -,      4   vendor/thecodingmachine/safe/generated/8.3/image.phpFf      Ff  F2      7   vendor/thecodingmachine/safe/generated/8.3/readline.php&      &  C;      4   vendor/thecodingmachine/safe/generated/8.3/array.php        =ʤ      9   vendor/thecodingmachine/safe/generated/8.3/filesystem.php53      53  fhƤ      5   vendor/thecodingmachine/safe/generated/8.3/filter.php        e6Ϳ      3   vendor/thecodingmachine/safe/generated/8.3/oci8.php=+      =+  tGͤ      4   vendor/thecodingmachine/safe/generated/8.3/pgsql.php12      12  O ݤ      2   vendor/thecodingmachine/safe/generated/8.3/eio.phpV3      V3  	+      6   vendor/thecodingmachine/safe/generated/8.3/sockets.php~      ~  Np      4   vendor/thecodingmachine/safe/generated/8.3/bzip2.phpo      o  BQ      3   vendor/thecodingmachine/safe/generated/8.3/apcu.php        A      3   vendor/thecodingmachine/safe/generated/8.3/pcre.php
      
  R3      2   vendor/thecodingmachine/safe/generated/8.3/gmp.php          (?      2   vendor/thecodingmachine/safe/generated/8.3/var.php        .Ҥ      3   vendor/thecodingmachine/safe/generated/8.3/ssh2.php        "p̤      2   vendor/thecodingmachine/safe/generated/8.3/rnp.php          k^      6   vendor/thecodingmachine/safe/generated/8.3/rpminfo.php          |02      2   vendor/thecodingmachine/safe/generated/8.3/fpm.php        8NA      6   vendor/thecodingmachine/safe/generated/8.3/inotify.php        T      2   vendor/thecodingmachine/safe/generated/8.3/zip.phpg      g  F4Ӥ      6   vendor/thecodingmachine/safe/generated/8.3/strings.php        #nL      7   vendor/thecodingmachine/safe/generated/8.3/calendar.phpZ      Z  $      4   vendor/thecodingmachine/safe/generated/8.3/pcntl.php	      	  &Qh      4   vendor/thecodingmachine/safe/generated/8.3/iconv.php        ɘ m      3   vendor/thecodingmachine/safe/generated/8.3/info.php        QZBפ      5   vendor/thecodingmachine/safe/generated/8.3/ibmDb2.php        ߚ~      <   vendor/thecodingmachine/safe/generated/8.3/functionsList.phpS      S  lh      7   vendor/thecodingmachine/safe/generated/8.3/fileinfo.phpH      H  ʩ      3   vendor/thecodingmachine/safe/generated/fileinfo.php        ň      $   vendor/thecodingmachine/safe/LICENSE0      0  w'W      /   vendor/thecodingmachine/safe/rector-migrate.php-      -  1      2   vendor/thecodingmachine/safe/lib/special_cases.phpZ      Z  ,      6   vendor/thecodingmachine/safe/lib/DateTimeImmutable.php        T|      -   vendor/thecodingmachine/safe/lib/DateTime.php        z$      =   vendor/thecodingmachine/safe/lib/Exceptions/PcreException.php        .h      F   vendor/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php[       [   ANd      @   vendor/thecodingmachine/safe/lib/Exceptions/OpensslException.php          Eܤ      =   vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php          `v      B   vendor/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php              =   vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php          9]w      $   vendor/php-http/cache-plugin/LICENSE:      :  S      0   vendor/php-http/cache-plugin/src/CachePlugin.php&      &  TU      A   vendor/php-http/cache-plugin/src/Cache/Listener/CacheListener.phpK      K  E      J   vendor/php-http/cache-plugin/src/Cache/Listener/AddHeaderCacheListener.php-      -  ҆c      D   vendor/php-http/cache-plugin/src/Cache/Generator/SimpleGenerator.phpe      e  ^Q      L   vendor/php-http/cache-plugin/src/Cache/Generator/HeaderCacheKeyGenerator.phpt      t  R`[      F   vendor/php-http/cache-plugin/src/Cache/Generator/CacheKeyGenerator.php          I      D   vendor/php-http/cache-plugin/src/Exception/RewindStreamException.php          lƶŤ      0   vendor/php-http/multipart-stream-builder/LICENSE5      5  ^@      E   vendor/php-http/multipart-stream-builder/src/ApacheMimetypeHelper.php        Gp      ?   vendor/php-http/multipart-stream-builder/src/MimetypeHelper.php          U      E   vendor/php-http/multipart-stream-builder/src/CustomMimetypeHelper.php=      =  f+      G   vendor/php-http/multipart-stream-builder/src/MultipartStreamBuilder.php        
z`         vendor/php-http/promise/LICENSE:      :  S      '   vendor/php-http/promise/src/Promise.phpZ      Z        0   vendor/php-http/promise/src/FulfilledPromise.phpB      B  %h      /   vendor/php-http/promise/src/RejectedPromise.phpX      X  '      !   vendor/php-http/discovery/LICENSE:      :  S      8   vendor/php-http/discovery/src/StreamFactoryDiscovery.php?      ?  ,ݤ      -   vendor/php-http/discovery/src/Psr18Client.php#      #  "G&      E   vendor/php-http/discovery/src/Strategy/CommonPsr17ClassesStrategy.phpt      t  Ф      <   vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php          /<      ;   vendor/php-http/discovery/src/Strategy/PuliBetaStrategy.php        mB      @   vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php              =   vendor/php-http/discovery/src/Strategy/MockClientStrategy.php        \)      7   vendor/php-http/discovery/src/Psr17FactoryDiscovery.php	      	  J58x      6   vendor/php-http/discovery/src/Psr18ClientDiscovery.phpz      z  "      +   vendor/php-http/discovery/src/Exception.phpR       R   0      1   vendor/php-http/discovery/src/Composer/Plugin.php65      65  f%      :   vendor/php-http/discovery/src/HttpAsyncClientDiscovery.phpD      D  fY      9   vendor/php-http/discovery/src/MessageFactoryDiscovery.php        AQs      3   vendor/php-http/discovery/src/NotFoundException.php          2	zʤ      5   vendor/php-http/discovery/src/UriFactoryDiscovery.php-      -  
       0   vendor/php-http/discovery/src/ClassDiscovery.php        ?ɤ      .   vendor/php-http/discovery/src/Psr17Factory.phpW!      W!  _Y      D   vendor/php-http/discovery/src/Exception/DiscoveryFailedException.php        ä      E   vendor/php-http/discovery/src/Exception/NoCandidateFoundException.php        0      =   vendor/php-http/discovery/src/Exception/NotFoundException.php          $      D   vendor/php-http/discovery/src/Exception/PuliUnavailableException.php          ]X      M   vendor/php-http/discovery/src/Exception/ClassInstantiationFailedException.php          j      H   vendor/php-http/discovery/src/Exception/StrategyUnavailableException.php          f      5   vendor/php-http/discovery/src/HttpClientDiscovery.php!      !  oϤ         vendor/php-http/message/LICENSE:      :  S      !   vendor/php-http/message/puli.jsonY      Y        )   vendor/php-http/message/src/CookieJar.php	      	  B      '   vendor/php-http/message/src/filters.php          G      D   vendor/php-http/message/src/StreamFactory/DiactorosStreamFactory.phpE      E  Nׁ      ?   vendor/php-http/message/src/StreamFactory/SlimStreamFactory.phpX      X  HǤ      A   vendor/php-http/message/src/StreamFactory/GuzzleStreamFactory.php        8      7   vendor/php-http/message/src/Builder/ResponseBuilder.php{      {  xX      F   vendor/php-http/message/src/MessageFactory/DiactorosMessageFactory.php        Vڤ      A   vendor/php-http/message/src/MessageFactory/SlimMessageFactory.php{      {  l C      C   vendor/php-http/message/src/MessageFactory/GuzzleMessageFactory.php        p^      *   vendor/php-http/message/src/CookieUtil.php        *Dt      5   vendor/php-http/message/src/Stream/BufferedStream.php        0      )   vendor/php-http/message/src/Exception.php;       ;         9   vendor/php-http/message/src/Decorator/StreamDecorator.php              :   vendor/php-http/message/src/Decorator/RequestDecorator.phpT      T        :   vendor/php-http/message/src/Decorator/MessageDecorator.phph      h  ړ      ;   vendor/php-http/message/src/Decorator/ResponseDecorator.php        IZ      )   vendor/php-http/message/src/Formatter.php        
R      6   vendor/php-http/message/src/Encoding/InflateStream.php        ^(      9   vendor/php-http/message/src/Encoding/GzipEncodeStream.php        
      7   vendor/php-http/message/src/Encoding/CompressStream.php        ^      9   vendor/php-http/message/src/Encoding/DecompressStream.php              6   vendor/php-http/message/src/Encoding/DeflateStream.php        ty<_      9   vendor/php-http/message/src/Encoding/GzipDecodeStream.php        Ovc      6   vendor/php-http/message/src/Encoding/DechunkStream.php          4S      5   vendor/php-http/message/src/Encoding/Filter/Chunk.php
      
         4   vendor/php-http/message/src/Encoding/ChunkStream.phpI      I  YF      7   vendor/php-http/message/src/Encoding/FilteredStream.php        R2      .   vendor/php-http/message/src/RequestMatcher.php          !      &   vendor/php-http/message/src/Cookie.php        >      B   vendor/php-http/message/src/Exception/UnexpectedValueException.php          y      5   vendor/php-http/message/src/Authentication/Bearer.php        B      A   vendor/php-http/message/src/Authentication/RequestConditional.php~      ~  D>      4   vendor/php-http/message/src/Authentication/Chain.php        (      8   vendor/php-http/message/src/Authentication/BasicAuth.php*      *  M      9   vendor/php-http/message/src/Authentication/QueryParam.phpU      U  U      5   vendor/php-http/message/src/Authentication/Header.php        G'D      7   vendor/php-http/message/src/Authentication/Matching.php        洖      <   vendor/php-http/message/src/Authentication/AutoBasicAuth.php        aK      3   vendor/php-http/message/src/Authentication/Wsse.php;      ;  %z      ;   vendor/php-http/message/src/UriFactory/GuzzleUriFactory.php        L-      9   vendor/php-http/message/src/UriFactory/SlimUriFactory.php        Tݤ      >   vendor/php-http/message/src/UriFactory/DiactorosUriFactory.phpd      d   T      B   vendor/php-http/message/src/Formatter/FullHttpMessageFormatter.php=      =  2      9   vendor/php-http/message/src/Formatter/SimpleFormatter.php        Ѥ      >   vendor/php-http/message/src/Formatter/CurlCommandFormatter.php        $A      .   vendor/php-http/message/src/Authentication.php          w_      B   vendor/php-http/message/src/RequestMatcher/RegexRequestMatcher.php]      ]  ݓ%      =   vendor/php-http/message/src/RequestMatcher/RequestMatcher.php3      3  Dt      E   vendor/php-http/message/src/RequestMatcher/CallbackRequestMatcher.php        .      #   vendor/php-http/message/apigen.neonF       F   Ȥ6      %   vendor/php-http/client-common/LICENSE:      :  S      9   vendor/php-http/client-common/src/VersionBridgeClient.phpp      p  0      9   vendor/php-http/client-common/src/HttpClientDecorator.phpu      u  Ƌ      9   vendor/php-http/client-common/src/PluginClientBuilder.phpX      X  #Lä      9   vendor/php-http/client-common/src/PluginClientFactory.phpz      z  yʤ      E   vendor/php-http/client-common/src/HttpClientPool/RandomClientPool.phpP      P  ͂      H   vendor/php-http/client-common/src/HttpClientPool/LeastUsedClientPool.phpf      f  P      I   vendor/php-http/client-common/src/HttpClientPool/RoundRobinClientPool.php        6      G   vendor/php-http/client-common/src/HttpClientPool/HttpClientPoolItem.php'
      '
  .K      C   vendor/php-http/client-common/src/HttpClientPool/HttpClientPool.php        o:Ǥ      8   vendor/php-http/client-common/src/HttpClientEmulator.php        S<ߤ      7   vendor/php-http/client-common/src/HttpMethodsClient.php        <ۆ      .   vendor/php-http/client-common/src/Deferred.phpR	      R	  `+      1   vendor/php-http/client-common/src/BatchClient.php/      /  H      ?   vendor/php-http/client-common/src/HttpClientRouterInterface.phpf      f  4]      8   vendor/php-http/client-common/src/FlexibleHttpClient.phpA      A  Aa!      @   vendor/php-http/client-common/src/HttpMethodsClientInterface.phpN      N  6Ӥ      1   vendor/php-http/client-common/src/BatchResult.phpW      W  3u      ?   vendor/php-http/client-common/src/Plugin/HeaderRemovePlugin.phpG      G  ]̤      :   vendor/php-http/client-common/src/Plugin/DecoderPlugin.php	      	  #      :   vendor/php-http/client-common/src/Plugin/AddPathPlugin.php        u'      <   vendor/php-http/client-common/src/Plugin/HeaderSetPlugin.php6      6  >Hפ      ?   vendor/php-http/client-common/src/Plugin/HeaderAppendPlugin.phpB      B  ˆx\      4   vendor/php-http/client-common/src/Plugin/Journal.php        Sk      @   vendor/php-http/client-common/src/Plugin/QueryDefaultsPlugin.php        pH      @   vendor/php-http/client-common/src/Plugin/VersionBridgePlugin.php        ,:      A   vendor/php-http/client-common/src/Plugin/AuthenticationPlugin.phpF      F  {Z      8   vendor/php-http/client-common/src/Plugin/ErrorPlugin.php0      0  	I      :   vendor/php-http/client-common/src/Plugin/BaseUriPlugin.php        M       :   vendor/php-http/client-common/src/Plugin/AddHostPlugin.php        a      8   vendor/php-http/client-common/src/Plugin/RetryPlugin.php|      |  '      9   vendor/php-http/client-common/src/Plugin/CookiePlugin.php        o 䊤      ;   vendor/php-http/client-common/src/Plugin/RedirectPlugin.php          Кp      >   vendor/php-http/client-common/src/Plugin/ContentTypePlugin.php        2Vm      ?   vendor/php-http/client-common/src/Plugin/SeekableBodyPlugin.php        &      @   vendor/php-http/client-common/src/Plugin/ContentLengthPlugin.php        e%      A   vendor/php-http/client-common/src/Plugin/RequestMatcherPlugin.php        #      :   vendor/php-http/client-common/src/Plugin/HistoryPlugin.phpI      I  D7      G   vendor/php-http/client-common/src/Plugin/ResponseSeekableBodyPlugin.php        ,ʤ      F   vendor/php-http/client-common/src/Plugin/RequestSeekableBodyPlugin.php        -^      A   vendor/php-http/client-common/src/Plugin/HeaderDefaultsPlugin.phpg      g  Y      =   vendor/php-http/client-common/src/EmulatedHttpAsyncClient.php        *      >   vendor/php-http/client-common/src/Exception/BatchException.php        YI      L   vendor/php-http/client-common/src/Exception/CircularRedirectionException.php                =   vendor/php-http/client-common/src/Exception/LoopException.php          f      K   vendor/php-http/client-common/src/Exception/HttpClientNotFoundException.php          +s      D   vendor/php-http/client-common/src/Exception/ClientErrorException.php          A~      J   vendor/php-http/client-common/src/Exception/HttpClientNoMatchException.php        AmȤ      L   vendor/php-http/client-common/src/Exception/MultipleRedirectionException.php          ?      D   vendor/php-http/client-common/src/Exception/ServerErrorException.php          ]      1   vendor/php-http/client-common/src/PluginChain.phpg      g  Hʤ      =   vendor/php-http/client-common/src/HttpAsyncClientEmulator.php        ӑ*      8   vendor/php-http/client-common/src/EmulatedHttpClient.phpq      q  [Ǥ      2   vendor/php-http/client-common/src/PluginClient.php        >T      4   vendor/php-http/client-common/src/HttpClientPool.phpU      U  	7      >   vendor/php-http/client-common/src/HttpAsyncClientDecorator.phpO      O  5J      ,   vendor/php-http/client-common/src/Plugin.php        ޝ      6   vendor/php-http/client-common/src/HttpClientRouter.php        /o      :   vendor/php-http/client-common/src/BatchClientInterface.php        Y         vendor/php-http/httplug/LICENSEl      l  X!/      !   vendor/php-http/httplug/puli.json          ZT      *   vendor/php-http/httplug/src/HttpClient.php~       ~   j5^      )   vendor/php-http/httplug/src/Exception.php          ~/ޤ      :   vendor/php-http/httplug/src/Exception/NetworkException.php        ˛}d      7   vendor/php-http/httplug/src/Exception/HttpException.php        g      :   vendor/php-http/httplug/src/Exception/RequestException.php        cJ      ;   vendor/php-http/httplug/src/Exception/RequestAwareTrait.php$      $  0L梤      ;   vendor/php-http/httplug/src/Exception/TransferException.php          Ml      /   vendor/php-http/httplug/src/HttpAsyncClient.php          t٤      <   vendor/php-http/httplug/src/Promise/HttpFulfilledPromise.php        sm8      ;   vendor/php-http/httplug/src/Promise/HttpRejectedPromise.php        !         vendor/vlucas/phpdotenv/LICENSE        0z      *   vendor/vlucas/phpdotenv/src/Util/Regex.php        mn      (   vendor/vlucas/phpdotenv/src/Util/Str.php        =	=      1   vendor/vlucas/phpdotenv/src/Store/StringStore.php        +      0   vendor/vlucas/phpdotenv/src/Store/File/Paths.phpr      r  ygg      1   vendor/vlucas/phpdotenv/src/Store/File/Reader.php        3K      /   vendor/vlucas/phpdotenv/src/Store/FileStore.php        yY      4   vendor/vlucas/phpdotenv/src/Store/StoreInterface.phpv       v   Ȥ      2   vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php        O9Ҥ      ,   vendor/vlucas/phpdotenv/src/Parser/Lexer.php              6   vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php                ,   vendor/vlucas/phpdotenv/src/Parser/Value.php        S\      ,   vendor/vlucas/phpdotenv/src/Parser/Entry.php        b      -   vendor/vlucas/phpdotenv/src/Parser/Parser.php        V      2   vendor/vlucas/phpdotenv/src/Parser/EntryParser.php        x9e      ,   vendor/vlucas/phpdotenv/src/Parser/Lines.php        4{      )   vendor/vlucas/phpdotenv/src/Validator.php        }      =   vendor/vlucas/phpdotenv/src/Exception/ValidationException.php                B   vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php          Q      <   vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php          3O      >   vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php          |:8      >   vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php          o      >   vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php$      $  @.      <   vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.phpr      r  U      <   vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php~      ~  !      @   vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php        ?      E   vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php/      /  c      B   vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.phpL      L  B      ?   vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php              B   vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php#      #        @   vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php3      3  Hz      >   vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php        ZF      C   vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php          X:o      B   vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php          dm      B   vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php        ,MM      B   vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php                @   vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.phpT      T  c@&      >   vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php.      .  ;q      &   vendor/vlucas/phpdotenv/src/Dotenv.php        <Hl      /   vendor/vlucas/phpdotenv/src/Loader/Resolver.php        `o|      6   vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php          i      -   vendor/vlucas/phpdotenv/src/Loader/Loader.php!      !  :{      *   vendor/m4tthumphrey/php-gitlab-api/LICENSE        a      1   vendor/m4tthumphrey/php-gitlab-api/src/Client.php        ,      >   vendor/m4tthumphrey/php-gitlab-api/src/Api/RepositoryFiles.php	      	  ʤ      ;   vendor/m4tthumphrey/php-gitlab-api/src/Api/Environments.php        W      :   vendor/m4tthumphrey/php-gitlab-api/src/Api/IssueBoards.php        D"      5   vendor/m4tthumphrey/php-gitlab-api/src/Api/Issues.php%      %  e      B   vendor/m4tthumphrey/php-gitlab-api/src/Api/ResourceStateEvents.phph      h   lؤ      9   vendor/m4tthumphrey/php-gitlab-api/src/Api/IssueLinks.php        LB      :   vendor/m4tthumphrey/php-gitlab-api/src/Api/SystemHooks.php        č      3   vendor/m4tthumphrey/php-gitlab-api/src/Api/Jobs.php              7   vendor/m4tthumphrey/php-gitlab-api/src/Api/Projects.phpˈ      ˈ  V䩓      7   vendor/m4tthumphrey/php-gitlab-api/src/Api/Packages.php
	      
	        4   vendor/m4tthumphrey/php-gitlab-api/src/Api/Users.php#)      #)  Zχ      ?   vendor/m4tthumphrey/php-gitlab-api/src/Api/IssuesStatistics.phpa
      a
  ~      9   vendor/m4tthumphrey/php-gitlab-api/src/Api/Milestones.phpH      H  +&      3   vendor/m4tthumphrey/php-gitlab-api/src/Api/Wiki.phpG      G  ,`p      F   vendor/m4tthumphrey/php-gitlab-api/src/Api/ResourceMilestoneEvents.php|      |         6   vendor/m4tthumphrey/php-gitlab-api/src/Api/Version.php          J      :   vendor/m4tthumphrey/php-gitlab-api/src/Api/AbstractApi.php'      '  ;      F   vendor/m4tthumphrey/php-gitlab-api/src/Api/ResourceIterationEvents.php|      |  {ʤ      5   vendor/m4tthumphrey/php-gitlab-api/src/Api/Search.php        ~`~      3   vendor/m4tthumphrey/php-gitlab-api/src/Api/Tags.php        Iߏ      :   vendor/m4tthumphrey/php-gitlab-api/src/Api/GroupsEpics.phps      s  )      ?   vendor/m4tthumphrey/php-gitlab-api/src/Api/GroupsMilestones.php	      	  *9
      ;   vendor/m4tthumphrey/php-gitlab-api/src/Api/Repositories.phph&      h&  Zo      3   vendor/m4tthumphrey/php-gitlab-api/src/Api/Keys.php                <   vendor/m4tthumphrey/php-gitlab-api/src/Api/MergeRequests.phpz,      z,  G3      @   vendor/m4tthumphrey/php-gitlab-api/src/Api/ProjectNamespaces.php        E/r      C   vendor/m4tthumphrey/php-gitlab-api/src/Api/ResourceWeightEvents.phpk      k  .      :   vendor/m4tthumphrey/php-gitlab-api/src/Api/Deployments.php        P ף      B   vendor/m4tthumphrey/php-gitlab-api/src/Api/ResourceLabelEvents.phph      h  mU      7   vendor/m4tthumphrey/php-gitlab-api/src/Api/Snippets.php!      !  !      8   vendor/m4tthumphrey/php-gitlab-api/src/Api/Schedules.php        E      5   vendor/m4tthumphrey/php-gitlab-api/src/Api/Groups.phpQ      Q  vɤ      ;   vendor/m4tthumphrey/php-gitlab-api/src/Api/GroupsBoards.php        9̤      5   vendor/m4tthumphrey/php-gitlab-api/src/Api/Events.phpS      S  P      9   vendor/m4tthumphrey/php-gitlab-api/src/Api/DeployKeys.php        ܄      6   vendor/m4tthumphrey/php-gitlab-api/src/ResultPager.php>      >  ]      N   vendor/m4tthumphrey/php-gitlab-api/src/Exception/ValidationFailedException.php          "=ʤ      N   vendor/m4tthumphrey/php-gitlab-api/src/Exception/ApiLimitExceededException.php          U;1      C   vendor/m4tthumphrey/php-gitlab-api/src/Exception/ErrorException.php          Vn      G   vendor/m4tthumphrey/php-gitlab-api/src/Exception/ExceptionInterface.php          wj      E   vendor/m4tthumphrey/php-gitlab-api/src/Exception/RuntimeException.php          -Ȗ      ?   vendor/m4tthumphrey/php-gitlab-api/src/ResultPagerInterface.php        _      =   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Builder.php        6      D   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/JsonArray.php        TŤ      M   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/QueryStringBuilder.phpB      B        N   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Message/ResponseMediator.php	      	  {      D   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/History.php        lVx}      M   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/ExceptionThrower.php        ?Y      K   vendor/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/Authentication.php!      !  cG          vendor/bugsnag/bugsnag/packer.shz       z   UL      )   vendor/bugsnag/bugsnag/src/Stacktrace.php        M      $   vendor/bugsnag/bugsnag/src/Utils.phpq      q  |⯤      )   vendor/bugsnag/bugsnag/src/HttpClient.phpI      I  Xd>      4   vendor/bugsnag/bugsnag/src/Internal/GuzzleCompat.phpx      x  U      ;   vendor/bugsnag/bugsnag/src/Internal/FeatureFlagDelegate.php"      "  H%      ,   vendor/bugsnag/bugsnag/src/Configuration.php\$      \$  F      *   vendor/bugsnag/bugsnag/src/FeatureFlag.php        7      %   vendor/bugsnag/bugsnag/src/Report.php(      (  D      %   vendor/bugsnag/bugsnag/src/Client.php,      ,  `      5   vendor/bugsnag/bugsnag/src/Breadcrumbs/Breadcrumb.php        tѤ      3   vendor/bugsnag/bugsnag/src/Breadcrumbs/Recorder.php        sޭm      4   vendor/bugsnag/bugsnag/src/Callbacks/RequestUser.php        ;x      3   vendor/bugsnag/bugsnag/src/Callbacks/CustomUser.php|      |  Uۤ      7   vendor/bugsnag/bugsnag/src/Callbacks/RequestSession.php              8   vendor/bugsnag/bugsnag/src/Callbacks/RequestMetaData.php        %       7   vendor/bugsnag/bugsnag/src/Callbacks/GlobalMetaData.php^      ^  /QK      7   vendor/bugsnag/bugsnag/src/Callbacks/RequestContext.php        ԏ      7   vendor/bugsnag/bugsnag/src/Callbacks/RequestCookies.php        =      8   vendor/bugsnag/bugsnag/src/Callbacks/EnvironmentData.php          D      /   vendor/bugsnag/bugsnag/src/FeatureDataStore.php+      +  ,t      A   vendor/bugsnag/bugsnag/src/Shutdown/ShutdownStrategyInterface.php          ܐU      ;   vendor/bugsnag/bugsnag/src/Shutdown/PhpShutdownStrategy.php          0t      -   vendor/bugsnag/bugsnag/src/SessionTracker.phpL      L  :a      -   vendor/bugsnag/bugsnag/src/DateTime/Clock.php          T      ,   vendor/bugsnag/bugsnag/src/DateTime/Date.php        #
      6   vendor/bugsnag/bugsnag/src/DateTime/ClockInterface.phps       s   #
      "   vendor/bugsnag/bugsnag/src/Env.phpR      R  P      5   vendor/bugsnag/bugsnag/src/Middleware/SessionData.php        @      8   vendor/bugsnag/bugsnag/src/Middleware/DiscardClasses.php        M들      =   vendor/bugsnag/bugsnag/src/Middleware/NotificationSkipper.phpk      k  vj      8   vendor/bugsnag/bugsnag/src/Middleware/CallbackBridge.php        ;f      8   vendor/bugsnag/bugsnag/src/Middleware/BreadcrumbData.php        3'      )   vendor/bugsnag/bugsnag/src/ErrorTypes.php}      }  1٤      2   vendor/bugsnag/bugsnag/src/Request/NullRequest.php        #qo      5   vendor/bugsnag/bugsnag/src/Request/ConsoleRequest.php!      !  K      4   vendor/bugsnag/bugsnag/src/Request/BasicResolver.php        fEM      1   vendor/bugsnag/bugsnag/src/Request/PhpRequest.php        h'^      8   vendor/bugsnag/bugsnag/src/Request/ResolverInterface.phpc       c   M      7   vendor/bugsnag/bugsnag/src/Request/RequestInterface.php        )g      '   vendor/bugsnag/bugsnag/src/Pipeline.phpH      H  Ҧ      &   vendor/bugsnag/bugsnag/src/Handler.php              "   vendor/bugsnag/bugsnag/LICENSE.txt        I      2   vendor/bugsnag/bugsnag/utility/bugsnag-prepend.phpX      X           vendor/ratchet/pawl/LICENSE              -   vendor/ratchet/pawl/src/functions_include.php^       ^   y4q      %   vendor/ratchet/pawl/src/functions.php        c      %   vendor/ratchet/pawl/src/WebSocket.php        e      %   vendor/ratchet/pawl/src/Connector.phpi      i  1S         vendor/ratchet/rfc6455/LICENSE        D-غ      9   vendor/ratchet/rfc6455/src/Handshake/ClientNegotiator.php        Cb      9   vendor/ratchet/rfc6455/src/Handshake/ResponseVerifier.php0      0  3      9   vendor/ratchet/rfc6455/src/Handshake/ServerNegotiator.php9      9        <   vendor/ratchet/rfc6455/src/Handshake/NegotiatorInterface.php%      %  
,+      8   vendor/ratchet/rfc6455/src/Handshake/RequestVerifier.php        +      A   vendor/ratchet/rfc6455/src/Handshake/PermessageDeflateOptions.php        Hy      Q   vendor/ratchet/rfc6455/src/Handshake/InvalidPermessageDeflateOptionsException.phpr       r   5c$Ԥ      6   vendor/ratchet/rfc6455/src/Messaging/DataInterface.php
      
  }ۤ      6   vendor/ratchet/rfc6455/src/Messaging/MessageBuffer.phps0      s0  
      .   vendor/ratchet/rfc6455/src/Messaging/Frame.phpY!      Y!  ;      0   vendor/ratchet/rfc6455/src/Messaging/Message.php        ft<      :   vendor/ratchet/rfc6455/src/Messaging/CloseFrameChecker.php              7   vendor/ratchet/rfc6455/src/Messaging/FrameInterface.php7      7  )      9   vendor/ratchet/rfc6455/src/Messaging/MessageInterface.php        eä         vendor/autoload.php        wN         var/cache/acsf-spec.json.cacheͬ     ͬ {-      6   var/cache/prod/Acquia_Cli_KernelProdContainer.php.meta        W      C   var/cache/prod/Container9ITmE6s/getNewFromDrupal7CommandService.php        IG_      =   var/cache/prod/Container9ITmE6s/getRequireRemoteDbService.php              ;   var/cache/prod/Container9ITmE6s/getConsoleLoggerService.php        9      ?   var/cache/prod/Container9ITmE6s/getExceptionListenerService.php        .      ?   var/cache/prod/Container9ITmE6s/getSshKeyInfoCommandService.php        k      >   var/cache/prod/Container9ITmE6s/getEnvMirrorCommandService.php        %5      D   var/cache/prod/Container9ITmE6s/getIdeXdebugToggleCommandService.php        /)      A   var/cache/prod/Container9ITmE6s/getPushArtifactCommandService.php         #      8   var/cache/prod/Container9ITmE6s/getAliasCacheService.php        DC      B   var/cache/prod/Container9ITmE6s/getAcsfConnectorFactoryService.php_      _  LZ      ?   var/cache/prod/Container9ITmE6s/getAuthLogoutCommandService.php              >   var/cache/prod/Container9ITmE6s/getConnectorFactoryService.php        27'      @   var/cache/prod/Container9ITmE6s/getLocalMachineHelperService.php|      |  IrӤ      ?   var/cache/prod/Container9ITmE6s/getSelfUpdateManagerService.php$      $  02N      >   var/cache/prod/Container9ITmE6s/getApiCommandHelperService.phpy      y  MJ      @   var/cache/prod/Container9ITmE6s/getIdeListMineCommandService.php        -s;      <   var/cache/prod/Container9ITmE6s/getLogTailCommandService.php?      ?  톤      C   var/cache/prod/Container9ITmE6s/getIdeServiceStopCommandService.php        JE      ?   var/cache/prod/Container9ITmE6s/getClearCacheCommandService.php        e!9      J   var/cache/prod/Container9ITmE6s/getIdeWizardDeleteSshKeyCommandService.phpa      a  aĹd      >   var/cache/prod/Container9ITmE6s/getAliasListCommandService.php        wǤ      ;   var/cache/prod/Container9ITmE6s/getClientServiceService.php        =N(      E   var/cache/prod/Container9ITmE6s/getCodeStudioCiCdVariablesService.php!      !  |      <   var/cache/prod/Container9ITmE6s/getIdeOpenCommandService.php        t      A   var/cache/prod/Container9ITmE6s/getPullDatabaseCommandService.phpD      D  2R      >   var/cache/prod/Container9ITmE6s/getEnvDeleteCommandService.php        n      @   var/cache/prod/Container9ITmE6s/getEnvCopyCronCommandService.php              E   var/cache/prod/Container9ITmE6s/getComposerScriptsListenerService.php        0>      G   var/cache/prod/Container9ITmE6s/getSshKeyCreateUploadCommandService.php        *&'      D   var/cache/prod/Container9ITmE6s/getAliasesDownloadCommandService.php        H      B   var/cache/prod/Container9ITmE6s/Acquia_Cli_KernelProdContainer.php:      :  |eY      I   var/cache/prod/Container9ITmE6s/getCodeStudioPhpVersionCommandService.phpU      U  q      9   var/cache/prod/Container9ITmE6s/getListCommandService.php        8(      B   var/cache/prod/Container9ITmE6s/getEnvCertCreateCommandService.php        ޭ      B   var/cache/prod/Container9ITmE6s/getIdePhpVersionCommandService.php        B,      9   var/cache/prod/Container9ITmE6s/getRequireAuthService.php        $      D   var/cache/prod/Container9ITmE6s/getTelemetryEnableCommandService.php        Qj      >   var/cache/prod/Container9ITmE6s/getEnvCreateCommandService.php              9   var/cache/prod/Container9ITmE6s/getApplicationService.php(+      (+  ù      A   var/cache/prod/Container9ITmE6s/getPushDatabaseCommandService.php        ,2      7   var/cache/prod/Container9ITmE6s/getChecklistService.phpd      d  |&      ;   var/cache/prod/Container9ITmE6s/getConsoleOutputService.php	      	  
5¤      B   var/cache/prod/Container9ITmE6s/getAuthAcsfLoginCommandService.php        mm      A   var/cache/prod/Container9ITmE6s/getSshKeyDeleteCommandService.php        {      @   var/cache/prod/Container9ITmE6s/getAcsfCommandFactoryService.php        #      <   var/cache/prod/Container9ITmE6s/getIdeListCommandService.php        G      >   var/cache/prod/Container9ITmE6s/getPushFilesCommandService.php        gf      @   var/cache/prod/Container9ITmE6s/getAcquiaCliDatastoreService.php"      "  -+      @   var/cache/prod/Container9ITmE6s/getPullScriptsCommandService.php        L$Q      E   var/cache/prod/Container9ITmE6s/getTelemetryDisableCommandService.php              ?   var/cache/prod/Container9ITmE6s/getApiCommandFactoryService.php        r      9   var/cache/prod/Container9ITmE6s/getPullCommandService.php        哤      >   var/cache/prod/Container9ITmE6s/getAcsf_CredentialsService.phpN      N  W-t      =   var/cache/prod/Container9ITmE6s/getAcsfCredentialsService.phpb      b  e      ?   var/cache/prod/Container9ITmE6s/getAcsfClientServiceService.php        +;      D   var/cache/prod/Container9ITmE6s/getIdeServiceStartCommandService.php        lS      >   var/cache/prod/Container9ITmE6s/getAuthLoginCommandService.php        h؏@      8   var/cache/prod/Container9ITmE6s/getSshCommandService.php        ξ:      7   var/cache/prod/Container9ITmE6s/getArgvInputService.php        j      =   var/cache/prod/Container9ITmE6s/getSelfInfoCommandService.php        m      :   var/cache/prod/Container9ITmE6s/getDrushCommandService.php        <      A   var/cache/prod/Container9ITmE6s/getAcsfListCommandBaseService.php        A      <   var/cache/prod/Container9ITmE6s/getIdeInfoCommandService.php        ɔ      <   var/cache/prod/Container9ITmE6s/getAppOpenCommandService.php        Aۤ      O   var/cache/prod/Container9ITmE6s/getCodeStudioPipelinesMigrateCommandService.php        TmФ      <   var/cache/prod/Container9ITmE6s/getApiListCommandService.php        p84      9   var/cache/prod/Container9ITmE6s/getDocsCommandService.php        %(      <   var/cache/prod/Container9ITmE6s/getApiBaseCommandService.php        e      >   var/cache/prod/Container9ITmE6s/getLogstreamManagerService.php        d.[      7   var/cache/prod/Container9ITmE6s/getSshHelperService.php[      [  p      A   var/cache/prod/Container9ITmE6s/getSshKeyUploadCommandService.php        k      =   var/cache/prod/Container9ITmE6s/getCloudDataConfigService.php        v*d      >   var/cache/prod/Container9ITmE6s/getTelemetryCommandService.php        \      D   var/cache/prod/Container9ITmE6s/getEnvironmentTransformerService.php        3#      ?   var/cache/prod/Container9ITmE6s/getSshKeyListCommandService.php        M앹      E   var/cache/prod/Container9ITmE6s/getCodeStudioWizardCommandService.php9      9  :O      /   var/cache/prod/Container9ITmE6s/removed-ids.php        $;ߤ      9   var/cache/prod/Container9ITmE6s/getLinkCommandService.php        44	      @   var/cache/prod/Container9ITmE6s/getAcquiaCliExceptionService.php        ,o      ?   var/cache/prod/Container9ITmE6s/getHelloWorldCommandService.php        ktR      5   var/cache/prod/Container9ITmE6s/getClient2Service.php        iD      7   var/cache/prod/Container9ITmE6s/getAmplitudeService.php        W,      =   var/cache/prod/Container9ITmE6s/getAcsfListCommandService.php        .+      =   var/cache/prod/Container9ITmE6s/getIdeShareCommandService.php        l"      5   var/cache/prod/Container9ITmE6s/getSpinnerService.phpo      o  Dl      =   var/cache/prod/Container9ITmE6s/getAcquiaCliConfigService.php        İ      @   var/cache/prod/Container9ITmE6s/getAcsfApiBaseCommandService.phpb      b  /ӟ      =   var/cache/prod/Container9ITmE6s/getPullCodeCommandService.php(      (  >@¤      =   var/cache/prod/Container9ITmE6s/getPushCodeCommandService.php        4$      <   var/cache/prod/Container9ITmE6s/getCloudDataStoreService.php        M%      ?   var/cache/prod/Container9ITmE6s/getCloud_CredentialsService.phpR      R  n      >   var/cache/prod/Container9ITmE6s/getIdeDeleteCommandService.php              ?   var/cache/prod/Container9ITmE6s/getDataStoreContractService.php        l      8   var/cache/prod/Container9ITmE6s/getLoopHelperService.php        pؤ      A   var/cache/prod/Container9ITmE6s/getSshKeyCreateCommandService.php        nĤ      F   var/cache/prod/Container9ITmE6s/getIdeServiceRestartCommandService.php        Z?      @   var/cache/prod/Container9ITmE6s/getApiListCommandBaseService.php        =o      <   var/cache/prod/Container9ITmE6s/getRequireLocalDbService.php        Ҧp      4   var/cache/prod/Container9ITmE6s/getClientService.phpU      U  ^      =   var/cache/prod/Container9ITmE6s/getTaskWaitCommandService.php        9atˤ      8   var/cache/prod/Container9ITmE6s/getAcsfClientService.phpV      V  %      >   var/cache/prod/Container9ITmE6s/getCloudCredentialsService.phpg      g  bwJ      C   var/cache/prod/Container9ITmE6s/getAuthAcsfLogoutCommandService.php        ]      >   var/cache/prod/Container9ITmE6s/getPullFilesCommandService.php/      /  Mؔ      >   var/cache/prod/Container9ITmE6s/getIdeCreateCommandService.php)      )        ;   var/cache/prod/Container9ITmE6s/getUnlinkCommandService.php        xR      8   var/cache/prod/Container9ITmE6s/getAppVcsInfoService.php        ;u      =   var/cache/prod/Container9ITmE6s/getEventDispatcherService.phpq      q  .8t      B   var/cache/prod/Container9ITmE6s/getArchiveExportCommandService.php        2ʤ      8   var/cache/prod/Container9ITmE6s/getNewCommandService.php         T      =   var/cache/prod/Container9ITmE6s/getTelemetryHelperService.php        0      J   var/cache/prod/Container9ITmE6s/getIdeWizardCreateSshKeyCommandService.phpa      a  ŝu      =   var/cache/prod/Container9ITmE6s/getMakeDocsCommandService.php        83      9   var/cache/prod/Acquia_Cli_KernelProdContainer.preload.phpi7      i7  
      1   var/cache/prod/Acquia_Cli_KernelProdContainer.php        ۤ      6   var/cache/prod/Acquia_Cli_KernelProdContainer.php.lock                         var/cache/prod/annotations.map          #          var/cache/acquia-spec.json.cache"'2     "'2 Y[         config/from_d7_config.json9      9  ߩ%Ӥ      #   config/from_d7_recommendations.json|.      |.  |         config/prod/services.yml        |#i         config/dev/services.yml        {         composer.lock;z     ;z vu      &   .box/vendor/composer/autoload_real.php          X}      &   .box/vendor/composer/autoload_psr4.php*      *  _Uo      (   .box/vendor/composer/autoload_static.phpu      u  K         .box/vendor/composer/LICENSE.      .         $   .box/vendor/composer/ClassLoader.php?      ?  2@u      ,   .box/vendor/composer/autoload_namespaces.php          /t      "   .box/vendor/composer/installed.php,      ,  "3      *   .box/vendor/composer/autoload_classmap.php
      
        *   .box/vendor/composer/InstalledVersions.php          `]m      #   .box/vendor/composer/semver/LICENSE        Bh      ,   .box/vendor/composer/semver/src/Interval.php              4   .box/vendor/composer/semver/src/CompilingMatcher.php        Jװ      -   .box/vendor/composer/semver/src/Intervals.php{9      {9        1   .box/vendor/composer/semver/src/VersionParser.php:      :  \Aͤ      *   .box/vendor/composer/semver/src/Semver.php        O
S      .   .box/vendor/composer/semver/src/Comparator.php        [3ݤ      9   .box/vendor/composer/semver/src/Constraint/Constraint.php&      &  )      4   .box/vendor/composer/semver/src/Constraint/Bound.phpl      l  C`֤      >   .box/vendor/composer/semver/src/Constraint/MultiConstraint.phpS      S  9      A   .box/vendor/composer/semver/src/Constraint/MatchAllConstraint.php;      ;  :      B   .box/vendor/composer/semver/src/Constraint/MatchNoneConstraint.phpY      Y  ?8R      B   .box/vendor/composer/semver/src/Constraint/ConstraintInterface.php        9ˤq         .box/vendor/autoload.php        'z         .box/.requirements.php        4%         .box/src/IsFulfilled.php          U         .box/src/Printer.php        0      !   .box/src/IsExtensionFulfilled.php        7L)      "   .box/src/IsPhpVersionFulfilled.php        =Xa         .box/src/Requirement.php        @_      )   .box/src/IsExtensionConflictFulfilled.php        dА         .box/src/IO.php              "   .box/src/RequirementCollection.php        ]Z         .box/src/Terminal.php        Nƿ         .box/src/Checker.php        !wb         .box/bin/check-requirements.php        J         src/Attribute/RequireAuth.php                !   src/Attribute/RequireRemoteDb.php          LY          src/Attribute/RequireLocalDb.php          6QD         src/Helpers/IdeCommandTrait.php        7      "   src/Helpers/LocalMachineHelper.php)      )  *i         src/Helpers/SshCommandTrait.php!      !  t)         src/Helpers/TelemetryHelper.php        :         src/Helpers/AliasCache.phpr      r  ըӤ         src/Helpers/SshHelper.php	      	  sФ         src/Helpers/LoopHelper.php        _^      !   src/Helpers/DataStoreContract.php          ns      -   src/EventListener/ComposerScriptsListener.phpU      U  A      '   src/EventListener/ExceptionListener.php        tb      $   src/AcsfApi/AcsfConnectorFactory.php}      }  {         src/AcsfApi/AcsfClient.php        )Q         src/AcsfApi/AcsfConnector.php        Ϥ      !   src/AcsfApi/AcsfClientService.php                 src/AcsfApi/AcsfCredentials.php.      .  )         src/Config/CloudDataConfig.php        ]         src/Config/AcquiaCliConfig.php        N~         src/Kernel.php7      7  ]c1         src/DataStore/YamlStore.php        Mm         src/DataStore/JsonDataStore.php(      (  $         src/DataStore/Datastore.php        7      $   src/DataStore/DataStoreInterface.php:      :  yKpK          src/DataStore/CloudDataStore.php        %\      $   src/DataStore/AcquiaCliDatastore.php        {         src/ApiCredentialsInterface.php          ũǤ         src/Output/Spinner/Spinner.php                 src/Output/Checklist.php        'f          src/Application.php        nZ1      $   src/Exception/AcquiaCliException.php        ˹         src/CommandFactoryInterface.phpZ      Z  a      !   src/ConnectorFactoryInterface.php          J
      *   src/Transformer/EnvironmentTransformer.php        Sa      !   src/Command/WizardCommandBase.php        [4Ť         src/Command/CommandBase.php^     ^ ;w      '   src/Command/Acsf/AcsfCommandFactory.php        bT      (   src/Command/Acsf/AcsfListCommandBase.php        Cv2פ      $   src/Command/Acsf/AcsfListCommand.php        L      #   src/Command/Remote/DrushCommand.phpR      R  0¤      %   src/Command/Remote/SshBaseCommand.php                 '   src/Command/Remote/AliasListCommand.phpM      M  W      -   src/Command/Remote/AliasesDownloadCommand.php        
      !   src/Command/Remote/SshCommand.php)      )  i         src/Command/DocsCommand.php2      2  xH      !   src/Command/HelloWorldCommand.phpH      H  n      &   src/Command/Auth/AuthLogoutCommand.php
      
  \      )   src/Command/Auth/AuthAcsfLoginCommand.phpa      a  2cŝ      %   src/Command/Auth/AuthLoginCommand.php        s      *   src/Command/Auth/AuthAcsfLogoutCommand.php"      "  +.      "   src/Command/Api/ApiBaseCommand.php30      30  k      $   src/Command/Api/ApiCommandHelper.php<      <  ƃe      "   src/Command/Api/ApiListCommand.phpc      c  jY      &   src/Command/Api/ApiListCommandBase.php        L      %   src/Command/Api/ApiCommandFactory.phpd      d        #   src/Command/Ide/IdeShareCommand.php9      9  5@      ,   src/Command/Ide/IdeServiceRestartCommand.php        Nm      (   src/Command/Ide/IdePhpVersionCommand.php        C      *   src/Command/Ide/IdeXdebugToggleCommand.php	      	  {      $   src/Command/Ide/IdeCreateCommand.php        xm      "   src/Command/Ide/IdeInfoCommand.php        3z      $   src/Command/Ide/IdeDeleteCommand.php        6\H      "   src/Command/Ide/IdeCommandBase.phpi      i  /ߡ֤      7   src/Command/Ide/Wizard/IdeWizardCreateSshKeyCommand.php8      8        /   src/Command/Ide/Wizard/IdeWizardCommandBase.php/      /  zX      7   src/Command/Ide/Wizard/IdeWizardDeleteSshKeyCommand.phpX      X  J0K      "   src/Command/Ide/IdeListCommand.php        l      *   src/Command/Ide/IdeServiceStartCommand.php        ~      "   src/Command/Ide/IdeOpenCommand.php        i@ۤ      )   src/Command/Ide/IdeServiceStopCommand.php        Xւ      &   src/Command/Ide/IdeListMineCommand.php        os      ,   src/Command/Archive/ArchiveExportCommand.php        p      $   src/Command/Push/PushCommandBase.php          @-aɤ      (   src/Command/Push/PushDatabaseCommand.php        1Y+      $   src/Command/Push/PushCodeCommand.phpl      l  f      (   src/Command/Push/PushArtifactCommand.php+H      +H  pi\      %   src/Command/Push/PushFilesCommand.php        A      -   src/Command/Ssh/SshKeyCreateUploadCommand.php-      -  F      '   src/Command/Ssh/SshKeyCreateCommand.php7      7  a      '   src/Command/Ssh/SshKeyUploadCommand.php        JQ      %   src/Command/Ssh/SshKeyInfoCommand.phpz      z  IF      '   src/Command/Ssh/SshKeyDeleteCommand.php&      &  Ĥ      %   src/Command/Ssh/SshKeyListCommand.phpe      e  ٮŤ      %   src/Command/Ssh/SshKeyCommandBase.phpq-      q-  ;Ф      2   src/Command/CodeStudio/CodeStudioWizardCommand.php9      9  J1      1   src/Command/CodeStudio/CodeStudioCommandTrait.php          %      &   src/Command/CodeStudio/drupal_icon.png              "   src/Command/CodeStudio/cs_icon.pngx,      x,  _?&      %   src/Command/CodeStudio/EntityType.php                <   src/Command/CodeStudio/CodeStudioPipelinesMigrateCommand.phpB)      B)  ?      6   src/Command/CodeStudio/CodeStudioPhpVersionCommand.php        :a      2   src/Command/CodeStudio/CodeStudioCiCdVariables.php        ݤ      (   src/Command/Env/EnvCertCreateCommand.php
      
  B9      &   src/Command/Env/EnvCopyCronCommand.php        Ӧț      $   src/Command/Env/EnvMirrorCommand.php        N9      $   src/Command/Env/EnvDeleteCommand.php        g<      $   src/Command/Env/EnvCreateCommand.phpT      T  io         src/Command/App/NewCommand.php        zh      !   src/Command/App/UnlinkCommand.php         %      &   src/Command/App/From/Configuration.php        ɻ      4   src/Command/App/From/SourceSite/Drupal7Extension.php        ɚ0      6   src/Command/App/From/SourceSite/ExtensionInterface.phpx      x  1K      5   src/Command/App/From/SourceSite/SiteInspectorBase.php        :.e6      F   src/Command/App/From/SourceSite/ExportedDrupal7ExtensionsInspector.php        ;      8   src/Command/App/From/SourceSite/Drupal7SiteInspector.phpJ      J  	׫      :   src/Command/App/From/SourceSite/SiteInspectorInterface.php        E/]      0   src/Command/App/From/Composer/ProjectBuilder.php        !g:      =   src/Command/App/From/Recommendation/DefinedRecommendation.php@      @  ^z#      0   src/Command/App/From/Recommendation/Resolver.php+      +        =   src/Command/App/From/Recommendation/NormalizableInterface.php          wOS      A   src/Command/App/From/Recommendation/AbandonmentRecommendation.php        J      7   src/Command/App/From/Recommendation/Recommendations.phpe      e  C%      ?   src/Command/App/From/Recommendation/UniversalRecommendation.php^      ^  cl&      8   src/Command/App/From/Recommendation/NoRecommendation.php}      }  W={      ?   src/Command/App/From/Recommendation/RecommendationInterface.php]      ]  4I      4   src/Command/App/From/Safety/ArrayValidationTrait.phpg      g  쓯      8   src/Command/App/From/Safety/StructuredArrayValidator.php        sPz      0   src/Command/App/From/JsonResourceParserTrait.phpN      N  [      )   src/Command/App/NewFromDrupal7Command.php          P         src/Command/App/AppVcsInfo.php
      
  0ۡ         src/Command/App/LinkCommand.phpa      a  E;q      #   src/Command/App/TaskWaitCommand.phpQ      Q  G      "   src/Command/App/LogTailCommand.php
      
  Y      "   src/Command/App/AppOpenCommand.php$      $  $-3      $   src/Command/Self/SelfInfoCommand.php        -4      &   src/Command/Self/ClearCacheCommand.php        3㊤      %   src/Command/Self/TelemetryCommand.phpw      w            src/Command/Self/ListCommand.php
      
        +   src/Command/Self/TelemetryEnableCommand.php,      ,  kq7      $   src/Command/Self/MakeDocsCommand.php        f3      ,   src/Command/Self/TelemetryDisableCommand.php2      2  Ա      $   src/Command/Pull/PullCommandBase.phpZ      Z  )۸      '   src/Command/Pull/PullScriptsCommand.php        M          src/Command/Pull/PullCommand.php        t      %   src/Command/Pull/PullFilesCommand.php              $   src/Command/Pull/PullCodeCommand.phpt      t  T{O      (   src/Command/Pull/PullDatabaseCommand.php>	      >	  _͖         src/CloudApi/ClientService.phpI      I  b      !   src/CloudApi/CloudCredentials.phpA      A  ["s      !   src/CloudApi/ConnectorFactory.phpW      W  f      %   src/CloudApi/AccessTokenConnector.php        b         .enva       a   ֙         composer.json        8Ϫ         bin/acli        6-      The MIT License (MIT)

Copyright (c) 2015 Christian Lück

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.
<?php

namespace Clue\StreamFilter;


if (!\function_exists(__NAMESPACE__ . '\\append')) {
require __DIR__ . '/functions.php';
}

<?php

namespace Clue\StreamFilter;





































































































function append($stream, $callback, $read_write = STREAM_FILTER_ALL)
{
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errstr) {


$errstr = $error; 
});

try {
$ret = \stream_filter_append($stream, register(), $read_write, $callback);
} catch (\TypeError $e) { 

\restore_error_handler();
throw $e;
} 

\restore_error_handler();



if ($ret === false) {
throw new \RuntimeException('Unable to append filter: ' . $errstr);
}


return $ret;
}





























function prepend($stream, $callback, $read_write = STREAM_FILTER_ALL)
{
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errstr) {


$errstr = $error; 
});

try {
$ret = \stream_filter_prepend($stream, register(), $read_write, $callback);
} catch (\TypeError $e) { 

\restore_error_handler();
throw $e;
} 

\restore_error_handler();



if ($ret === false) {
throw new \RuntimeException('Unable to prepend filter: ' . $errstr);
}


return $ret;
}
















































































function fun($filter, $parameters = null)
{
$fp = \fopen('php://memory', 'w');

$errstr = '';
\set_error_handler(function ($_, $error) use (&$errstr) {


$errstr = $error;
});

if (\func_num_args() === 1) {
$filter = \stream_filter_append($fp, $filter, \STREAM_FILTER_WRITE);
} else {
$filter = \stream_filter_append($fp, $filter, \STREAM_FILTER_WRITE, $parameters);
}

\restore_error_handler();

if ($filter === false) {
\fclose($fp);
throw new \RuntimeException('Unable to access built-in filter: ' . $errstr);
}


$buffer = '';
append($fp, function ($chunk) use (&$buffer) {
$buffer .= $chunk;


return '';
}, \STREAM_FILTER_WRITE);

$closed = false;

return function ($chunk = null) use ($fp, $filter, &$buffer, &$closed) {
if ($closed) {
throw new \RuntimeException('Unable to perform operation on closed stream');
}
if ($chunk === null) {
$closed = true;
$buffer = '';
\fclose($fp);
return $buffer;
}

$buffer = '';
\fwrite($fp, $chunk);


return $buffer;
};
}
















function remove($filter)
{
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errstr) {


$errstr = $error;
});

try {
$ret = \stream_filter_remove($filter);
} catch (\TypeError $e) { 

\restore_error_handler();
throw $e;
} 

\restore_error_handler();

if ($ret === false) {

throw new \RuntimeException('Unable to remove filter: ' . $errstr);
}
}









function register()
{
static $registered = null;
if ($registered === null) {
$registered = 'stream-callback';
\stream_filter_register($registered, __NAMESPACE__ . '\CallbackFilter');
}
return $registered;
}
<?php

namespace Clue\StreamFilter;






class CallbackFilter extends \php_user_filter
{
private $callback;
private $closed = true;
private $supportsClose = false;


#[\ReturnTypeWillChange]
public function onCreate()
{
$this->closed = false;

if (!\is_callable($this->params)) {
throw new \InvalidArgumentException('No valid callback parameter given to stream_filter_(append|prepend)');
}
$this->callback = $this->params;


$ref = new \ReflectionFunction($this->callback);
$this->supportsClose = ($ref->getNumberOfRequiredParameters() === 0);

return true;
}


#[\ReturnTypeWillChange]
public function onClose()
{
$this->closed = true;


if ($this->supportsClose) {
$this->supportsClose = false;

try {
\call_user_func($this->callback);
} catch (\Exception $ignored) {



}
}

$this->callback = null;
}


#[\ReturnTypeWillChange]
public function filter($in, $out, &$consumed, $closing)
{

$data = '';
while ($bucket = \stream_bucket_make_writeable($in)) {
$consumed += $bucket->datalen;
$data .= $bucket->data;
}


if ($this->closed) {
return \PSFS_FEED_ME;
}



if ($data !== '') {
try {
$data = \call_user_func($this->callback, $data);
} catch (\Exception $e) {

$this->onClose();
\trigger_error('Error invoking filter: ' . $e->getMessage(), \E_USER_WARNING);

return \PSFS_ERR_FATAL;
}
}


if ($closing) {
$this->closed = true;


if ($this->supportsClose) {
$this->supportsClose = false;


try {
$data .= \call_user_func($this->callback);
} catch (\Exception $e) {
\trigger_error('Error ending filter: ' . $e->getMessage(), \E_USER_WARNING);

return \PSFS_ERR_FATAL;
}
}
}

if ($data !== '') {


$bucket = @\stream_bucket_new($this->stream, $data);




if ($bucket !== false) {
\stream_bucket_append($out, $bucket);
}
}

return \PSFS_PASS_ON;
}
}
<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit8b629a15c689375da27d72358027e768
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        require __DIR__ . '/platform_check.php';

        spl_autoload_register(array('ComposerAutoloaderInit8b629a15c689375da27d72358027e768', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
        spl_autoload_unregister(array('ComposerAutoloaderInit8b629a15c689375da27d72358027e768', 'loadClassLoader'));

        require __DIR__ . '/autoload_static.php';
        call_user_func(\Composer\Autoload\ComposerStaticInit8b629a15c689375da27d72358027e768::getInitializer($loader));

        $loader->setClassMapAuthoritative(true);
        $loader->register(true);

        $filesToLoad = \Composer\Autoload\ComposerStaticInit8b629a15c689375da27d72358027e768::$files;
        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
                $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

                require $file;
            }
        }, null, null);
        foreach ($filesToLoad as $fileIdentifier => $file) {
            $requireFile($fileIdentifier, $file);
        }

        return $loader;
    }
}
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'loophp\\phposinfo\\' => array($vendorDir . '/loophp/phposinfo/src'),
    'Zumba\\Amplitude\\Test\\' => array($vendorDir . '/zumba/amplitude-php/test'),
    'Zumba\\Amplitude\\' => array($vendorDir . '/zumba/amplitude-php/src'),
    'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'),
    'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
    'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
    'Symfony\\Flex\\' => array($vendorDir . '/symfony/flex/src'),
    'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'),
    'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
    'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'),
    'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'),
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
    'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
    'Symfony\\Component\\Validator\\' => array($vendorDir . '/symfony/validator'),
    'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
    'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
    'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'),
    'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
    'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
    'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
    'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
    'Symfony\\Component\\ExpressionLanguage\\' => array($vendorDir . '/symfony/expression-language'),
    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
    'Symfony\\Component\\ErrorHandler\\' => array($vendorDir . '/symfony/error-handler'),
    'Symfony\\Component\\Dotenv\\' => array($vendorDir . '/symfony/dotenv'),
    'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
    'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
    'SelfUpdate\\' => array($vendorDir . '/consolidation/self-update/src'),
    'React\\Stream\\' => array($vendorDir . '/react/stream/src'),
    'React\\Socket\\' => array($vendorDir . '/react/socket/src'),
    'React\\Promise\\' => array($vendorDir . '/react/promise/src'),
    'React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'),
    'React\\Dns\\' => array($vendorDir . '/react/dns/src'),
    'React\\Cache\\' => array($vendorDir . '/react/cache/src'),
    'Ratchet\\RFC6455\\' => array($vendorDir . '/ratchet/rfc6455/src'),
    'Ratchet\\Client\\' => array($vendorDir . '/ratchet/pawl/src'),
    'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'),
    'Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'),
    'Psr\\Log\\' => array($vendorDir . '/psr/log/src'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
    'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
    'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
    'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
    'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'),
    'MabeEnum\\' => array($vendorDir . '/marc-mabe/php-enum/src'),
    'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src'),
    'League\\Csv\\' => array($vendorDir . '/league/csv/src'),
    'Laminas\\Validator\\' => array($vendorDir . '/laminas/laminas-validator/src'),
    'Laminas\\Stdlib\\' => array($vendorDir . '/laminas/laminas-stdlib/src'),
    'Laminas\\ServiceManager\\' => array($vendorDir . '/laminas/laminas-servicemanager/src'),
    'Kevinrob\\GuzzleCache\\' => array($vendorDir . '/kevinrob/guzzle-cache-middleware/src'),
    'Http\\Promise\\' => array($vendorDir . '/php-http/promise/src'),
    'Http\\Message\\MultipartStream\\' => array($vendorDir . '/php-http/multipart-stream-builder/src'),
    'Http\\Message\\' => array($vendorDir . '/php-http/message/src'),
    'Http\\Factory\\Guzzle\\' => array($vendorDir . '/http-interop/http-factory-guzzle/src'),
    'Http\\Discovery\\' => array($vendorDir . '/php-http/discovery/src'),
    'Http\\Client\\Common\\Plugin\\' => array($vendorDir . '/php-http/cache-plugin/src'),
    'Http\\Client\\Common\\' => array($vendorDir . '/php-http/client-common/src'),
    'Http\\Client\\' => array($vendorDir . '/php-http/httplug/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Grasmash\\Expander\\' => array($vendorDir . '/grasmash/expander/src'),
    'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'),
    'Gitlab\\' => array($vendorDir . '/m4tthumphrey/php-gitlab-api/src'),
    'Evenement\\' => array($vendorDir . '/evenement/evenement/src'),
    'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'),
    'Dflydev\\DotAccessData\\' => array($vendorDir . '/dflydev/dot-access-data/src'),
    'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'),
    'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
    'Clue\\StreamFilter\\' => array($vendorDir . '/clue/stream-filter/src'),
    'Bugsnag\\' => array($vendorDir . '/bugsnag/bugsnag/src'),
    'Brick\\Math\\' => array($vendorDir . '/brick/math/src'),
    'Acquia\\DrupalEnvironmentDetector\\Tests\\' => array($vendorDir . '/acquia/drupal-environment-detector/tests'),
    'Acquia\\DrupalEnvironmentDetector\\' => array($vendorDir . '/acquia/drupal-environment-detector/src'),
    'Acquia\\Cli\\' => array($baseDir . '/src'),
    'AcquiaLogstream\\' => array($vendorDir . '/typhonius/acquia-logstream/src'),
    'AcquiaCloudApi\\Response\\' => array($vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response'),
    'AcquiaCloudApi\\Exception\\' => array($vendorDir . '/typhonius/acquia-php-sdk-v2/src/Exception'),
    'AcquiaCloudApi\\Endpoints\\' => array($vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints'),
    'AcquiaCloudApi\\Connector\\' => array($vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector'),
);
<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit8b629a15c689375da27d72358027e768
{
    public static $files = array (
        '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
        'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
        'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
        '9c67151ae59aff4788964ce8eb2a0f43' => __DIR__ . '/..' . '/clue/stream-filter/src/functions_include.php',
        '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
        'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
        '8cff32064859f4559445b89279f3199c' => __DIR__ . '/..' . '/php-http/message/src/filters.php',
        'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
        '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php',
        'c9d07b32a2e02bc0fc582d4f0c1b56cc' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/autoload.php',
        '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
        '3be16222a6efa6dd226a219eaaff823b' => __DIR__ . '/..' . '/ratchet/pawl/src/functions_include.php',
        '9e4824c5afbdc1482b6025ce3d4dfde8' => __DIR__ . '/..' . '/league/csv/src/functions_include.php',
        'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php',
        '72243e5536b63e298acb6476f01f1aff' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/special_cases.php',
        '3f648889e687f31c52f949ba8a9d0873' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apache.php',
        'eeb4581d958421a4244aaa4167c6a575' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apcu.php',
        '04cb0b3c1dac5b5ddb23c14e3d66dbe9' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/array.php',
        '450b332a74a9a21e043c5e953485a791' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/bzip2.php',
        '6e9b7954ecfd7cbb9ca239319d1acdb6' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/calendar.php',
        '2c6d7e8bd2de9a272a9d4d43b0a4304a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/classobj.php',
        '0b8231c1ad0865447c988a4c16b4001f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/com.php',
        '7643a71fe1c3256058c8fee234cb86e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/cubrid.php',
        '68e1365710575942efc1d55000032cee' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/curl.php',
        '02fd26bca803106c5b942a7197c3ad8b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/datetime.php',
        'f4817dcbd956cd221b1c31f6fbd5749c' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/dir.php',
        '51c3f2d10ca61a70dbcea0e38d8e902d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/eio.php',
        '1d34f34327ca3e81535963016e3be2c3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/errorfunc.php',
        '4fd0ba2d3717b0424d474bebfdafa2b4' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/exec.php',
        '98f4dae054bc7fb19c13be14935cbdd3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/fileinfo.php',
        '5530ae063ba88323eaf0a07904efdf85' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/filesystem.php',
        '633f4f134975d70e97bddad83348e91a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/filter.php',
        'fbd163fc68c5faf73d5ed4002ffd836d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/fpm.php',
        '21b511999d61411fab0692ff8795bbed' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ftp.php',
        '85fbd73fc92365cd90526b0ea03cae3a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/funchand.php',
        'a2e4c6dfdbf36f56f1945ddcbd54e289' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gettext.php',
        '51df9c146e0b7dcbdf358d8abd24dbdc' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gmp.php',
        '93bb7fe678d7dcfb1322f8e3475a48b0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gnupg.php',
        'c171ba99cf316379ff66468392bf4950' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/hash.php',
        '5ab4aad4c28e468209fbfcceb2e5e6a5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ibase.php',
        '4d57409c5e8e576b0c64c08d9d731cfb' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ibmDb2.php',
        'eeb246d5403972a9d62106e4a4883496' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/iconv.php',
        'c28a05f498c01b810a714f7214b7a8da' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/image.php',
        '8063cd92acdf00fd978b5599eb7cc142' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/imap.php',
        '8bd26dbe768e9c9599edad7b198e5446' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/info.php',
        'd4362910bde43c0f956b52527effd7d4' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/inotify.php',
        '696ba49197d9b55f0428a12bb5a818e1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/json.php',
        '9818aaa99c8647c63f8ef62b7a368160' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ldap.php',
        'bcf523ff2a195eb08e0fbb668ed784d0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/libxml.php',
        '68be68a9a8b95bb56cab6109ff03bc88' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/lzf.php',
        'bdca804bb0904ea9f53f328dfc0bb8a5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mailparse.php',
        'b0a3fcac3eaf55445796d6af26b89366' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mbstring.php',
        '98de16b8db03eb0cb4d318b4402215a6' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/misc.php',
        '7cefd81607cd21b8b3a15656eb6465f5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysql.php',
        'aaf438b080089c6d0686679cd34aa72e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqli.php',
        'cbac956836b72483dcff1ac39d5c0a0f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/network.php',
        '6c8f89dfbdc117d7871f572269363f25' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/oci8.php',
        '169a669966a45c06bf55ed029122729b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/opcache.php',
        'def61bf4fecd4d4bca7354919cd69302' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/openssl.php',
        '26bb010649a6d32d4120181458aa6ef2' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/outcontrol.php',
        '002ebcb842e2c0d5b7f67fe64cc93158' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcntl.php',
        '86df38612982dade72c7085ce7eca81f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcre.php',
        '1fc22f445c69ea8706e82fce301c0831' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pgsql.php',
        'c70b42561584f7144bff38cd63c4eef3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/posix.php',
        '9923214639c32ca5173db03a177d3b63' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ps.php',
        '7e9c3f8eae2b5bf42205c4f1295cb7a7' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pspell.php',
        '91aa91f6245c349c2e2e88bd0025f199' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/readline.php',
        'ccf972e9e1fd8935f45f95e13b54ad59' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/rnp.php',
        'd43773cacb9e5e8e897aa255e32007d1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/rpminfo.php',
        'f053a3849e9e8383762b34b91db0320b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/rrd.php',
        '775b964f72f827a1bf87c65ab5b10800' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sem.php',
        '816428bd69c29ab5e1ed622af5dca0cd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/session.php',
        '5093e233bedbefaef0df262bfbab0a5c' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/shmop.php',
        'b080617b1d949683c2e37f8f01dc0e15' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sockets.php',
        '2708aa182ddcfe6ce27c96acaaa40f69' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sodium.php',
        'f1b96cb260a5baeea9a7285cda82a1ec' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/solr.php',
        '3fd8853757d0fe3557c179efb807afeb' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/spl.php',
        '9312ce96a51c846913fcda5f186d58dd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sqlsrv.php',
        'd3eb383ad0b8b962b29dc4afd29d6715' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ssdeep.php',
        '42a09bc448f441a0b9f9367ea975c0bf' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ssh2.php',
        'ef711077d356d1b33ca0b10b67b0be8f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/stream.php',
        '764b09f6df081cbb2807b97c6ace3866' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/strings.php',
        'ef241678769fee4a44aaa288f3b78aa1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/swoole.php',
        '0efc8f6778cba932b9e2a89e28de2452' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/uodbc.php',
        'd383d32907b98af53ee9208c62204fd0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/uopz.php',
        '2fd2e4060f7fe772660f002ce38f0b71' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/url.php',
        '782249e03deebeaf57b9991ff5493aa0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/var.php',
        '344440cd1cd7200fdb4f12af0d3c587f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xdiff.php',
        '3599f369219c658a5fb6c4fe66832f62' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xml.php',
        '7fcd313da9fae337051b091b3492c21b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/xmlrpc.php',
        'd668c74cfa92d893b582356733d9a80e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaml.php',
        '4af1dca6db8c527c6eed27bff85ff0e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaz.php',
        'fe43ca06499ac37bc2dedd823af71eb5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zip.php',
        '356736db98a6834f0a886b8d509b0ecd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zlib.php',
    );

    public static $prefixLengthsPsr4 = array (
        'l' =>
        array (
            'loophp\\phposinfo\\' => 17,
        ),
        'Z' =>
        array (
            'Zumba\\Amplitude\\Test\\' => 21,
            'Zumba\\Amplitude\\' => 16,
        ),
        'S' =>
        array (
            'Symfony\\Polyfill\\Php83\\' => 23,
            'Symfony\\Polyfill\\Php80\\' => 23,
            'Symfony\\Polyfill\\Mbstring\\' => 26,
            'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
            'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
            'Symfony\\Polyfill\\Ctype\\' => 23,
            'Symfony\\Flex\\' => 13,
            'Symfony\\Contracts\\Translation\\' => 30,
            'Symfony\\Contracts\\Service\\' => 26,
            'Symfony\\Contracts\\EventDispatcher\\' => 34,
            'Symfony\\Contracts\\Cache\\' => 24,
            'Symfony\\Component\\Yaml\\' => 23,
            'Symfony\\Component\\VarExporter\\' => 30,
            'Symfony\\Component\\VarDumper\\' => 28,
            'Symfony\\Component\\Validator\\' => 28,
            'Symfony\\Component\\String\\' => 25,
            'Symfony\\Component\\Process\\' => 26,
            'Symfony\\Component\\OptionsResolver\\' => 34,
            'Symfony\\Component\\HttpKernel\\' => 29,
            'Symfony\\Component\\HttpFoundation\\' => 33,
            'Symfony\\Component\\Finder\\' => 25,
            'Symfony\\Component\\Filesystem\\' => 29,
            'Symfony\\Component\\ExpressionLanguage\\' => 37,
            'Symfony\\Component\\EventDispatcher\\' => 34,
            'Symfony\\Component\\ErrorHandler\\' => 31,
            'Symfony\\Component\\Dotenv\\' => 25,
            'Symfony\\Component\\DependencyInjection\\' => 38,
            'Symfony\\Component\\Console\\' => 26,
            'Symfony\\Component\\Config\\' => 25,
            'Symfony\\Component\\Cache\\' => 24,
            'SelfUpdate\\' => 11,
        ),
        'R' =>
        array (
            'React\\Stream\\' => 13,
            'React\\Socket\\' => 13,
            'React\\Promise\\' => 14,
            'React\\EventLoop\\' => 16,
            'React\\Dns\\' => 10,
            'React\\Cache\\' => 12,
            'Ratchet\\RFC6455\\' => 16,
            'Ratchet\\Client\\' => 15,
            'Ramsey\\Uuid\\' => 12,
            'Ramsey\\Collection\\' => 18,
        ),
        'P' =>
        array (
            'Psr\\Log\\' => 8,
            'Psr\\Http\\Message\\' => 17,
            'Psr\\Http\\Client\\' => 16,
            'Psr\\EventDispatcher\\' => 20,
            'Psr\\Container\\' => 14,
            'Psr\\Cache\\' => 10,
            'PhpOption\\' => 10,
        ),
        'M' =>
        array (
            'MabeEnum\\' => 9,
        ),
        'L' =>
        array (
            'League\\OAuth2\\Client\\' => 21,
            'League\\Csv\\' => 11,
            'Laminas\\Validator\\' => 18,
            'Laminas\\Stdlib\\' => 15,
            'Laminas\\ServiceManager\\' => 23,
        ),
        'K' =>
        array (
            'Kevinrob\\GuzzleCache\\' => 21,
        ),
        'H' =>
        array (
            'Http\\Promise\\' => 13,
            'Http\\Message\\MultipartStream\\' => 29,
            'Http\\Message\\' => 13,
            'Http\\Factory\\Guzzle\\' => 20,
            'Http\\Discovery\\' => 15,
            'Http\\Client\\Common\\Plugin\\' => 26,
            'Http\\Client\\Common\\' => 19,
            'Http\\Client\\' => 12,
        ),
        'G' =>
        array (
            'GuzzleHttp\\Psr7\\' => 16,
            'GuzzleHttp\\Promise\\' => 19,
            'GuzzleHttp\\' => 11,
            'Grasmash\\Expander\\' => 18,
            'GrahamCampbell\\ResultType\\' => 26,
            'Gitlab\\' => 7,
        ),
        'E' =>
        array (
            'Evenement\\' => 10,
        ),
        'D' =>
        array (
            'Dotenv\\' => 7,
            'Dflydev\\DotAccessData\\' => 22,
        ),
        'C' =>
        array (
            'Composer\\Semver\\' => 16,
            'Composer\\CaBundle\\' => 18,
            'Clue\\StreamFilter\\' => 18,
        ),
        'B' =>
        array (
            'Bugsnag\\' => 8,
            'Brick\\Math\\' => 11,
        ),
        'A' =>
        array (
            'Acquia\\DrupalEnvironmentDetector\\Tests\\' => 39,
            'Acquia\\DrupalEnvironmentDetector\\' => 33,
            'Acquia\\Cli\\' => 11,
            'AcquiaLogstream\\' => 16,
            'AcquiaCloudApi\\Response\\' => 24,
            'AcquiaCloudApi\\Exception\\' => 25,
            'AcquiaCloudApi\\Endpoints\\' => 25,
            'AcquiaCloudApi\\Connector\\' => 25,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'loophp\\phposinfo\\' =>
        array (
            0 => __DIR__ . '/..' . '/loophp/phposinfo/src',
        ),
        'Zumba\\Amplitude\\Test\\' =>
        array (
            0 => __DIR__ . '/..' . '/zumba/amplitude-php/test',
        ),
        'Zumba\\Amplitude\\' =>
        array (
            0 => __DIR__ . '/..' . '/zumba/amplitude-php/src',
        ),
        'Symfony\\Polyfill\\Php83\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-php83',
        ),
        'Symfony\\Polyfill\\Php80\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
        ),
        'Symfony\\Polyfill\\Mbstring\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
        ),
        'Symfony\\Polyfill\\Intl\\Normalizer\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',
        ),
        'Symfony\\Polyfill\\Intl\\Grapheme\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
        ),
        'Symfony\\Polyfill\\Ctype\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
        ),
        'Symfony\\Flex\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/flex/src',
        ),
        'Symfony\\Contracts\\Translation\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/translation-contracts',
        ),
        'Symfony\\Contracts\\Service\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/service-contracts',
        ),
        'Symfony\\Contracts\\EventDispatcher\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts',
        ),
        'Symfony\\Contracts\\Cache\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/cache-contracts',
        ),
        'Symfony\\Component\\Yaml\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/yaml',
        ),
        'Symfony\\Component\\VarExporter\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/var-exporter',
        ),
        'Symfony\\Component\\VarDumper\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/var-dumper',
        ),
        'Symfony\\Component\\Validator\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/validator',
        ),
        'Symfony\\Component\\String\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/string',
        ),
        'Symfony\\Component\\Process\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/process',
        ),
        'Symfony\\Component\\OptionsResolver\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/options-resolver',
        ),
        'Symfony\\Component\\HttpKernel\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/http-kernel',
        ),
        'Symfony\\Component\\HttpFoundation\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/http-foundation',
        ),
        'Symfony\\Component\\Finder\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/finder',
        ),
        'Symfony\\Component\\Filesystem\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/filesystem',
        ),
        'Symfony\\Component\\ExpressionLanguage\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/expression-language',
        ),
        'Symfony\\Component\\EventDispatcher\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/event-dispatcher',
        ),
        'Symfony\\Component\\ErrorHandler\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/error-handler',
        ),
        'Symfony\\Component\\Dotenv\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/dotenv',
        ),
        'Symfony\\Component\\DependencyInjection\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/dependency-injection',
        ),
        'Symfony\\Component\\Console\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/console',
        ),
        'Symfony\\Component\\Config\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/config',
        ),
        'Symfony\\Component\\Cache\\' =>
        array (
            0 => __DIR__ . '/..' . '/symfony/cache',
        ),
        'SelfUpdate\\' =>
        array (
            0 => __DIR__ . '/..' . '/consolidation/self-update/src',
        ),
        'React\\Stream\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/stream/src',
        ),
        'React\\Socket\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/socket/src',
        ),
        'React\\Promise\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/promise/src',
        ),
        'React\\EventLoop\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/event-loop/src',
        ),
        'React\\Dns\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/dns/src',
        ),
        'React\\Cache\\' =>
        array (
            0 => __DIR__ . '/..' . '/react/cache/src',
        ),
        'Ratchet\\RFC6455\\' =>
        array (
            0 => __DIR__ . '/..' . '/ratchet/rfc6455/src',
        ),
        'Ratchet\\Client\\' =>
        array (
            0 => __DIR__ . '/..' . '/ratchet/pawl/src',
        ),
        'Ramsey\\Uuid\\' =>
        array (
            0 => __DIR__ . '/..' . '/ramsey/uuid/src',
        ),
        'Ramsey\\Collection\\' =>
        array (
            0 => __DIR__ . '/..' . '/ramsey/collection/src',
        ),
        'Psr\\Log\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/log/src',
        ),
        'Psr\\Http\\Message\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/http-factory/src',
            1 => __DIR__ . '/..' . '/psr/http-message/src',
        ),
        'Psr\\Http\\Client\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/http-client/src',
        ),
        'Psr\\EventDispatcher\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/event-dispatcher/src',
        ),
        'Psr\\Container\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/container/src',
        ),
        'Psr\\Cache\\' =>
        array (
            0 => __DIR__ . '/..' . '/psr/cache/src',
        ),
        'PhpOption\\' =>
        array (
            0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption',
        ),
        'MabeEnum\\' =>
        array (
            0 => __DIR__ . '/..' . '/marc-mabe/php-enum/src',
        ),
        'League\\OAuth2\\Client\\' =>
        array (
            0 => __DIR__ . '/..' . '/league/oauth2-client/src',
        ),
        'League\\Csv\\' =>
        array (
            0 => __DIR__ . '/..' . '/league/csv/src',
        ),
        'Laminas\\Validator\\' =>
        array (
            0 => __DIR__ . '/..' . '/laminas/laminas-validator/src',
        ),
        'Laminas\\Stdlib\\' =>
        array (
            0 => __DIR__ . '/..' . '/laminas/laminas-stdlib/src',
        ),
        'Laminas\\ServiceManager\\' =>
        array (
            0 => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src',
        ),
        'Kevinrob\\GuzzleCache\\' =>
        array (
            0 => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src',
        ),
        'Http\\Promise\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/promise/src',
        ),
        'Http\\Message\\MultipartStream\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/multipart-stream-builder/src',
        ),
        'Http\\Message\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/message/src',
        ),
        'Http\\Factory\\Guzzle\\' =>
        array (
            0 => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src',
        ),
        'Http\\Discovery\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/discovery/src',
        ),
        'Http\\Client\\Common\\Plugin\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/cache-plugin/src',
        ),
        'Http\\Client\\Common\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/client-common/src',
        ),
        'Http\\Client\\' =>
        array (
            0 => __DIR__ . '/..' . '/php-http/httplug/src',
        ),
        'GuzzleHttp\\Psr7\\' =>
        array (
            0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
        ),
        'GuzzleHttp\\Promise\\' =>
        array (
            0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
        ),
        'GuzzleHttp\\' =>
        array (
            0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
        ),
        'Grasmash\\Expander\\' =>
        array (
            0 => __DIR__ . '/..' . '/grasmash/expander/src',
        ),
        'GrahamCampbell\\ResultType\\' =>
        array (
            0 => __DIR__ . '/..' . '/graham-campbell/result-type/src',
        ),
        'Gitlab\\' =>
        array (
            0 => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src',
        ),
        'Evenement\\' =>
        array (
            0 => __DIR__ . '/..' . '/evenement/evenement/src',
        ),
        'Dotenv\\' =>
        array (
            0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src',
        ),
        'Dflydev\\DotAccessData\\' =>
        array (
            0 => __DIR__ . '/..' . '/dflydev/dot-access-data/src',
        ),
        'Composer\\Semver\\' =>
        array (
            0 => __DIR__ . '/..' . '/composer/semver/src',
        ),
        'Composer\\CaBundle\\' =>
        array (
            0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
        ),
        'Clue\\StreamFilter\\' =>
        array (
            0 => __DIR__ . '/..' . '/clue/stream-filter/src',
        ),
        'Bugsnag\\' =>
        array (
            0 => __DIR__ . '/..' . '/bugsnag/bugsnag/src',
        ),
        'Brick\\Math\\' =>
        array (
            0 => __DIR__ . '/..' . '/brick/math/src',
        ),
        'Acquia\\DrupalEnvironmentDetector\\Tests\\' =>
        array (
            0 => __DIR__ . '/..' . '/acquia/drupal-environment-detector/tests',
        ),
        'Acquia\\DrupalEnvironmentDetector\\' =>
        array (
            0 => __DIR__ . '/..' . '/acquia/drupal-environment-detector/src',
        ),
        'Acquia\\Cli\\' =>
        array (
            0 => __DIR__ . '/../..' . '/src',
        ),
        'AcquiaLogstream\\' =>
        array (
            0 => __DIR__ . '/..' . '/typhonius/acquia-logstream/src',
        ),
        'AcquiaCloudApi\\Response\\' =>
        array (
            0 => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response',
        ),
        'AcquiaCloudApi\\Exception\\' =>
        array (
            0 => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Exception',
        ),
        'AcquiaCloudApi\\Endpoints\\' =>
        array (
            0 => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints',
        ),
        'AcquiaCloudApi\\Connector\\' =>
        array (
            0 => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector',
        ),
    );

    public static $prefixesPsr0 = array (
        'L' =>
        array (
            'LTDBeget\\stringstream' =>
            array (
                0 => __DIR__ . '/..' . '/ltd-beget/stringstream/src',
            ),
            'LTDBeget\\dns' =>
            array (
                0 => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src',
                1 => __DIR__ . '/..' . '/ltd-beget/dns-zone-tokenizer/src',
            ),
            'LTDBeget\\ascii' =>
            array (
                0 => __DIR__ . '/..' . '/ltd-beget/ascii-table/src',
            ),
        ),
    );

    public static $classMap = array (
        'AcquiaCloudApi\\Connector\\Client' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector/Client.php',
        'AcquiaCloudApi\\Connector\\ClientInterface' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector/ClientInterface.php',
        'AcquiaCloudApi\\Connector\\Connector' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector/Connector.php',
        'AcquiaCloudApi\\Connector\\ConnectorInterface' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector/ConnectorInterface.php',
        'AcquiaCloudApi\\Connector\\OktaProvider' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Connector/OktaProvider.php',
        'AcquiaCloudApi\\Endpoints\\Account' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Account.php',
        'AcquiaCloudApi\\Endpoints\\Applications' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Applications.php',
        'AcquiaCloudApi\\Endpoints\\CloudApiBase' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiBase.php',
        'AcquiaCloudApi\\Endpoints\\CloudApiInterface' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiInterface.php',
        'AcquiaCloudApi\\Endpoints\\Code' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Code.php',
        'AcquiaCloudApi\\Endpoints\\CodebaseEnvironments' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CodebaseEnvironments.php',
        'AcquiaCloudApi\\Endpoints\\Codebases' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Codebases.php',
        'AcquiaCloudApi\\Endpoints\\Crons' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Crons.php',
        'AcquiaCloudApi\\Endpoints\\DatabaseBackups' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/DatabaseBackups.php',
        'AcquiaCloudApi\\Endpoints\\Databases' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Databases.php',
        'AcquiaCloudApi\\Endpoints\\Domains' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Domains.php',
        'AcquiaCloudApi\\Endpoints\\Environments' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Environments.php',
        'AcquiaCloudApi\\Endpoints\\IdentityProviders' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/IdentityProviders.php',
        'AcquiaCloudApi\\Endpoints\\Ides' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Ides.php',
        'AcquiaCloudApi\\Endpoints\\Insights' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Insights.php',
        'AcquiaCloudApi\\Endpoints\\LogForwardingDestinations' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/LogForwardingDestinations.php',
        'AcquiaCloudApi\\Endpoints\\Logs' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Logs.php',
        'AcquiaCloudApi\\Endpoints\\Metrics' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Metrics.php',
        'AcquiaCloudApi\\Endpoints\\Notifications' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Notifications.php',
        'AcquiaCloudApi\\Endpoints\\Organizations' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Organizations.php',
        'AcquiaCloudApi\\Endpoints\\Permissions' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Permissions.php',
        'AcquiaCloudApi\\Endpoints\\Roles' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Roles.php',
        'AcquiaCloudApi\\Endpoints\\Servers' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Servers.php',
        'AcquiaCloudApi\\Endpoints\\SiteInstances' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SiteInstances.php',
        'AcquiaCloudApi\\Endpoints\\Sites' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Sites.php',
        'AcquiaCloudApi\\Endpoints\\SshKeys' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SshKeys.php',
        'AcquiaCloudApi\\Endpoints\\SslCertificates' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SslCertificates.php',
        'AcquiaCloudApi\\Endpoints\\Subscriptions' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Subscriptions.php',
        'AcquiaCloudApi\\Endpoints\\Teams' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Teams.php',
        'AcquiaCloudApi\\Endpoints\\Variables' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Variables.php',
        'AcquiaCloudApi\\Exception\\ApiErrorException' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Exception/ApiErrorException.php',
        'AcquiaCloudApi\\Response\\AccountResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/AccountResponse.php',
        'AcquiaCloudApi\\Response\\ApplicationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ApplicationResponse.php',
        'AcquiaCloudApi\\Response\\ApplicationsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ApplicationsResponse.php',
        'AcquiaCloudApi\\Response\\BackupResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/BackupResponse.php',
        'AcquiaCloudApi\\Response\\BackupsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/BackupsResponse.php',
        'AcquiaCloudApi\\Response\\BranchResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/BranchResponse.php',
        'AcquiaCloudApi\\Response\\BranchesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/BranchesResponse.php',
        'AcquiaCloudApi\\Response\\BulkCodeSwitchResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/BulkCodeSwitchResponse.php',
        'AcquiaCloudApi\\Response\\CodebaseEnvironmentResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentResponse.php',
        'AcquiaCloudApi\\Response\\CodebaseEnvironmentsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentsResponse.php',
        'AcquiaCloudApi\\Response\\CodebaseResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseResponse.php',
        'AcquiaCloudApi\\Response\\CodebasesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CodebasesResponse.php',
        'AcquiaCloudApi\\Response\\CronResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CronResponse.php',
        'AcquiaCloudApi\\Response\\CronsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/CronsResponse.php',
        'AcquiaCloudApi\\Response\\DatabaseNameResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNameResponse.php',
        'AcquiaCloudApi\\Response\\DatabaseNamesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNamesResponse.php',
        'AcquiaCloudApi\\Response\\DatabaseResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseResponse.php',
        'AcquiaCloudApi\\Response\\DatabasesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DatabasesResponse.php',
        'AcquiaCloudApi\\Response\\DomainResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DomainResponse.php',
        'AcquiaCloudApi\\Response\\DomainsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/DomainsResponse.php',
        'AcquiaCloudApi\\Response\\EnvironmentResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentResponse.php',
        'AcquiaCloudApi\\Response\\EnvironmentsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentsResponse.php',
        'AcquiaCloudApi\\Response\\IdeResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/IdeResponse.php',
        'AcquiaCloudApi\\Response\\IdentityProviderResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/IdentityProviderResponse.php',
        'AcquiaCloudApi\\Response\\IdentityProvidersResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/IdentityProvidersResponse.php',
        'AcquiaCloudApi\\Response\\IdesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/IdesResponse.php',
        'AcquiaCloudApi\\Response\\InsightAlertResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertResponse.php',
        'AcquiaCloudApi\\Response\\InsightAlertsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertsResponse.php',
        'AcquiaCloudApi\\Response\\InsightCountResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightCountResponse.php',
        'AcquiaCloudApi\\Response\\InsightModuleResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightModuleResponse.php',
        'AcquiaCloudApi\\Response\\InsightModulesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightModulesResponse.php',
        'AcquiaCloudApi\\Response\\InsightResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightResponse.php',
        'AcquiaCloudApi\\Response\\InsightsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InsightsResponse.php',
        'AcquiaCloudApi\\Response\\InvitationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InvitationResponse.php',
        'AcquiaCloudApi\\Response\\InvitationsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/InvitationsResponse.php',
        'AcquiaCloudApi\\Response\\LogForwardingDestinationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationResponse.php',
        'AcquiaCloudApi\\Response\\LogForwardingDestinationsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationsResponse.php',
        'AcquiaCloudApi\\Response\\LogResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/LogResponse.php',
        'AcquiaCloudApi\\Response\\LogsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/LogsResponse.php',
        'AcquiaCloudApi\\Response\\LogstreamResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/LogstreamResponse.php',
        'AcquiaCloudApi\\Response\\MemberResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/MemberResponse.php',
        'AcquiaCloudApi\\Response\\MembersResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/MembersResponse.php',
        'AcquiaCloudApi\\Response\\MetricResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/MetricResponse.php',
        'AcquiaCloudApi\\Response\\MetricsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/MetricsResponse.php',
        'AcquiaCloudApi\\Response\\NotificationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/NotificationResponse.php',
        'AcquiaCloudApi\\Response\\NotificationsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/NotificationsResponse.php',
        'AcquiaCloudApi\\Response\\OperationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/OperationResponse.php',
        'AcquiaCloudApi\\Response\\OrganizationResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/OrganizationResponse.php',
        'AcquiaCloudApi\\Response\\OrganizationsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/OrganizationsResponse.php',
        'AcquiaCloudApi\\Response\\PermissionResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/PermissionResponse.php',
        'AcquiaCloudApi\\Response\\PermissionsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/PermissionsResponse.php',
        'AcquiaCloudApi\\Response\\ReferenceResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ReferenceResponse.php',
        'AcquiaCloudApi\\Response\\ReferencesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ReferencesResponse.php',
        'AcquiaCloudApi\\Response\\RoleResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/RoleResponse.php',
        'AcquiaCloudApi\\Response\\RolesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/RolesResponse.php',
        'AcquiaCloudApi\\Response\\ServerResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ServerResponse.php',
        'AcquiaCloudApi\\Response\\ServersResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/ServersResponse.php',
        'AcquiaCloudApi\\Response\\SiteInstanceDatabaseBackupResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupResponse.php',
        'AcquiaCloudApi\\Response\\SiteInstanceDatabaseBackupsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupsResponse.php',
        'AcquiaCloudApi\\Response\\SiteInstanceDatabaseResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseResponse.php',
        'AcquiaCloudApi\\Response\\SiteInstanceResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceResponse.php',
        'AcquiaCloudApi\\Response\\SiteResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SiteResponse.php',
        'AcquiaCloudApi\\Response\\SitesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SitesResponse.php',
        'AcquiaCloudApi\\Response\\SshKeyResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SshKeyResponse.php',
        'AcquiaCloudApi\\Response\\SshKeysResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SshKeysResponse.php',
        'AcquiaCloudApi\\Response\\SslCertificateResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SslCertificateResponse.php',
        'AcquiaCloudApi\\Response\\SslCertificatesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SslCertificatesResponse.php',
        'AcquiaCloudApi\\Response\\SubscriptionResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionResponse.php',
        'AcquiaCloudApi\\Response\\SubscriptionsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionsResponse.php',
        'AcquiaCloudApi\\Response\\TagResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/TagResponse.php',
        'AcquiaCloudApi\\Response\\TagsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/TagsResponse.php',
        'AcquiaCloudApi\\Response\\TeamResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/TeamResponse.php',
        'AcquiaCloudApi\\Response\\TeamsResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/TeamsResponse.php',
        'AcquiaCloudApi\\Response\\VariableResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/VariableResponse.php',
        'AcquiaCloudApi\\Response\\VariablesResponse' => __DIR__ . '/..' . '/typhonius/acquia-php-sdk-v2/src/Response/VariablesResponse.php',
        'AcquiaLogstream\\LogstreamCommand' => __DIR__ . '/..' . '/typhonius/acquia-logstream/src/LogstreamCommand.php',
        'AcquiaLogstream\\LogstreamManager' => __DIR__ . '/..' . '/typhonius/acquia-logstream/src/LogstreamManager.php',
        'Acquia\\Cli\\AcsfApi\\AcsfClient' => __DIR__ . '/../..' . '/src/AcsfApi/AcsfClient.php',
        'Acquia\\Cli\\AcsfApi\\AcsfClientService' => __DIR__ . '/../..' . '/src/AcsfApi/AcsfClientService.php',
        'Acquia\\Cli\\AcsfApi\\AcsfConnector' => __DIR__ . '/../..' . '/src/AcsfApi/AcsfConnector.php',
        'Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory' => __DIR__ . '/../..' . '/src/AcsfApi/AcsfConnectorFactory.php',
        'Acquia\\Cli\\AcsfApi\\AcsfCredentials' => __DIR__ . '/../..' . '/src/AcsfApi/AcsfCredentials.php',
        'Acquia\\Cli\\ApiCredentialsInterface' => __DIR__ . '/../..' . '/src/ApiCredentialsInterface.php',
        'Acquia\\Cli\\Application' => __DIR__ . '/../..' . '/src/Application.php',
        'Acquia\\Cli\\Attribute\\RequireAuth' => __DIR__ . '/../..' . '/src/Attribute/RequireAuth.php',
        'Acquia\\Cli\\Attribute\\RequireLocalDb' => __DIR__ . '/../..' . '/src/Attribute/RequireLocalDb.php',
        'Acquia\\Cli\\Attribute\\RequireRemoteDb' => __DIR__ . '/../..' . '/src/Attribute/RequireRemoteDb.php',
        'Acquia\\Cli\\CloudApi\\AccessTokenConnector' => __DIR__ . '/../..' . '/src/CloudApi/AccessTokenConnector.php',
        'Acquia\\Cli\\CloudApi\\ClientService' => __DIR__ . '/../..' . '/src/CloudApi/ClientService.php',
        'Acquia\\Cli\\CloudApi\\CloudCredentials' => __DIR__ . '/../..' . '/src/CloudApi/CloudCredentials.php',
        'Acquia\\Cli\\CloudApi\\ConnectorFactory' => __DIR__ . '/../..' . '/src/CloudApi/ConnectorFactory.php',
        'Acquia\\Cli\\CommandFactoryInterface' => __DIR__ . '/../..' . '/src/CommandFactoryInterface.php',
        'Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory' => __DIR__ . '/../..' . '/src/Command/Acsf/AcsfCommandFactory.php',
        'Acquia\\Cli\\Command\\Acsf\\AcsfListCommand' => __DIR__ . '/../..' . '/src/Command/Acsf/AcsfListCommand.php',
        'Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase' => __DIR__ . '/../..' . '/src/Command/Acsf/AcsfListCommandBase.php',
        'Acquia\\Cli\\Command\\Api\\ApiBaseCommand' => __DIR__ . '/../..' . '/src/Command/Api/ApiBaseCommand.php',
        'Acquia\\Cli\\Command\\Api\\ApiCommandFactory' => __DIR__ . '/../..' . '/src/Command/Api/ApiCommandFactory.php',
        'Acquia\\Cli\\Command\\Api\\ApiCommandHelper' => __DIR__ . '/../..' . '/src/Command/Api/ApiCommandHelper.php',
        'Acquia\\Cli\\Command\\Api\\ApiListCommand' => __DIR__ . '/../..' . '/src/Command/Api/ApiListCommand.php',
        'Acquia\\Cli\\Command\\Api\\ApiListCommandBase' => __DIR__ . '/../..' . '/src/Command/Api/ApiListCommandBase.php',
        'Acquia\\Cli\\Command\\App\\AppOpenCommand' => __DIR__ . '/../..' . '/src/Command/App/AppOpenCommand.php',
        'Acquia\\Cli\\Command\\App\\AppVcsInfo' => __DIR__ . '/../..' . '/src/Command/App/AppVcsInfo.php',
        'Acquia\\Cli\\Command\\App\\From\\Composer\\ProjectBuilder' => __DIR__ . '/../..' . '/src/Command/App/From/Composer/ProjectBuilder.php',
        'Acquia\\Cli\\Command\\App\\From\\Configuration' => __DIR__ . '/../..' . '/src/Command/App/From/Configuration.php',
        'Acquia\\Cli\\Command\\App\\From\\JsonResourceParserTrait' => __DIR__ . '/../..' . '/src/Command/App/From/JsonResourceParserTrait.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\AbandonmentRecommendation' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/AbandonmentRecommendation.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\DefinedRecommendation' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/DefinedRecommendation.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\NoRecommendation' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/NoRecommendation.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\NormalizableInterface' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/NormalizableInterface.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\RecommendationInterface' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/RecommendationInterface.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\Recommendations' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/Recommendations.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\Resolver' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/Resolver.php',
        'Acquia\\Cli\\Command\\App\\From\\Recommendation\\UniversalRecommendation' => __DIR__ . '/../..' . '/src/Command/App/From/Recommendation/UniversalRecommendation.php',
        'Acquia\\Cli\\Command\\App\\From\\Safety\\ArrayValidationTrait' => __DIR__ . '/../..' . '/src/Command/App/From/Safety/ArrayValidationTrait.php',
        'Acquia\\Cli\\Command\\App\\From\\Safety\\StructuredArrayValidator' => __DIR__ . '/../..' . '/src/Command/App/From/Safety/StructuredArrayValidator.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\Drupal7Extension' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/Drupal7Extension.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\Drupal7SiteInspector' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/Drupal7SiteInspector.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\ExportedDrupal7ExtensionsInspector' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/ExportedDrupal7ExtensionsInspector.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\ExtensionInterface' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/ExtensionInterface.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\SiteInspectorBase' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/SiteInspectorBase.php',
        'Acquia\\Cli\\Command\\App\\From\\SourceSite\\SiteInspectorInterface' => __DIR__ . '/../..' . '/src/Command/App/From/SourceSite/SiteInspectorInterface.php',
        'Acquia\\Cli\\Command\\App\\LinkCommand' => __DIR__ . '/../..' . '/src/Command/App/LinkCommand.php',
        'Acquia\\Cli\\Command\\App\\LogTailCommand' => __DIR__ . '/../..' . '/src/Command/App/LogTailCommand.php',
        'Acquia\\Cli\\Command\\App\\NewCommand' => __DIR__ . '/../..' . '/src/Command/App/NewCommand.php',
        'Acquia\\Cli\\Command\\App\\NewFromDrupal7Command' => __DIR__ . '/../..' . '/src/Command/App/NewFromDrupal7Command.php',
        'Acquia\\Cli\\Command\\App\\TaskWaitCommand' => __DIR__ . '/../..' . '/src/Command/App/TaskWaitCommand.php',
        'Acquia\\Cli\\Command\\App\\UnlinkCommand' => __DIR__ . '/../..' . '/src/Command/App/UnlinkCommand.php',
        'Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand' => __DIR__ . '/../..' . '/src/Command/Archive/ArchiveExportCommand.php',
        'Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand' => __DIR__ . '/../..' . '/src/Command/Auth/AuthAcsfLoginCommand.php',
        'Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand' => __DIR__ . '/../..' . '/src/Command/Auth/AuthAcsfLogoutCommand.php',
        'Acquia\\Cli\\Command\\Auth\\AuthLoginCommand' => __DIR__ . '/../..' . '/src/Command/Auth/AuthLoginCommand.php',
        'Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand' => __DIR__ . '/../..' . '/src/Command/Auth/AuthLogoutCommand.php',
        'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCiCdVariables' => __DIR__ . '/../..' . '/src/Command/CodeStudio/CodeStudioCiCdVariables.php',
        'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCommandTrait' => __DIR__ . '/../..' . '/src/Command/CodeStudio/CodeStudioCommandTrait.php',
        'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand' => __DIR__ . '/../..' . '/src/Command/CodeStudio/CodeStudioPhpVersionCommand.php',
        'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand' => __DIR__ . '/../..' . '/src/Command/CodeStudio/CodeStudioPipelinesMigrateCommand.php',
        'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand' => __DIR__ . '/../..' . '/src/Command/CodeStudio/CodeStudioWizardCommand.php',
        'Acquia\\Cli\\Command\\CodeStudio\\EntityType' => __DIR__ . '/../..' . '/src/Command/CodeStudio/EntityType.php',
        'Acquia\\Cli\\Command\\CommandBase' => __DIR__ . '/../..' . '/src/Command/CommandBase.php',
        'Acquia\\Cli\\Command\\DocsCommand' => __DIR__ . '/../..' . '/src/Command/DocsCommand.php',
        'Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand' => __DIR__ . '/../..' . '/src/Command/Env/EnvCertCreateCommand.php',
        'Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand' => __DIR__ . '/../..' . '/src/Command/Env/EnvCopyCronCommand.php',
        'Acquia\\Cli\\Command\\Env\\EnvCreateCommand' => __DIR__ . '/../..' . '/src/Command/Env/EnvCreateCommand.php',
        'Acquia\\Cli\\Command\\Env\\EnvDeleteCommand' => __DIR__ . '/../..' . '/src/Command/Env/EnvDeleteCommand.php',
        'Acquia\\Cli\\Command\\Env\\EnvMirrorCommand' => __DIR__ . '/../..' . '/src/Command/Env/EnvMirrorCommand.php',
        'Acquia\\Cli\\Command\\HelloWorldCommand' => __DIR__ . '/../..' . '/src/Command/HelloWorldCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeCommandBase' => __DIR__ . '/../..' . '/src/Command/Ide/IdeCommandBase.php',
        'Acquia\\Cli\\Command\\Ide\\IdeCreateCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeCreateCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeDeleteCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeInfoCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeInfoCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeListCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeListCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeListMineCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeListMineCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeOpenCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeOpenCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdePhpVersionCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeServiceRestartCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeServiceStartCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeServiceStopCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeShareCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeShareCommand.php',
        'Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand' => __DIR__ . '/../..' . '/src/Command/Ide/IdeXdebugToggleCommand.php',
        'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCommandBase' => __DIR__ . '/../..' . '/src/Command/Ide/Wizard/IdeWizardCommandBase.php',
        'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand' => __DIR__ . '/../..' . '/src/Command/Ide/Wizard/IdeWizardCreateSshKeyCommand.php',
        'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand' => __DIR__ . '/../..' . '/src/Command/Ide/Wizard/IdeWizardDeleteSshKeyCommand.php',
        'Acquia\\Cli\\Command\\Pull\\PullCodeCommand' => __DIR__ . '/../..' . '/src/Command/Pull/PullCodeCommand.php',
        'Acquia\\Cli\\Command\\Pull\\PullCommand' => __DIR__ . '/../..' . '/src/Command/Pull/PullCommand.php',
        'Acquia\\Cli\\Command\\Pull\\PullCommandBase' => __DIR__ . '/../..' . '/src/Command/Pull/PullCommandBase.php',
        'Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand' => __DIR__ . '/../..' . '/src/Command/Pull/PullDatabaseCommand.php',
        'Acquia\\Cli\\Command\\Pull\\PullFilesCommand' => __DIR__ . '/../..' . '/src/Command/Pull/PullFilesCommand.php',
        'Acquia\\Cli\\Command\\Pull\\PullScriptsCommand' => __DIR__ . '/../..' . '/src/Command/Pull/PullScriptsCommand.php',
        'Acquia\\Cli\\Command\\Push\\PushArtifactCommand' => __DIR__ . '/../..' . '/src/Command/Push/PushArtifactCommand.php',
        'Acquia\\Cli\\Command\\Push\\PushCodeCommand' => __DIR__ . '/../..' . '/src/Command/Push/PushCodeCommand.php',
        'Acquia\\Cli\\Command\\Push\\PushCommandBase' => __DIR__ . '/../..' . '/src/Command/Push/PushCommandBase.php',
        'Acquia\\Cli\\Command\\Push\\PushDatabaseCommand' => __DIR__ . '/../..' . '/src/Command/Push/PushDatabaseCommand.php',
        'Acquia\\Cli\\Command\\Push\\PushFilesCommand' => __DIR__ . '/../..' . '/src/Command/Push/PushFilesCommand.php',
        'Acquia\\Cli\\Command\\Remote\\AliasListCommand' => __DIR__ . '/../..' . '/src/Command/Remote/AliasListCommand.php',
        'Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand' => __DIR__ . '/../..' . '/src/Command/Remote/AliasesDownloadCommand.php',
        'Acquia\\Cli\\Command\\Remote\\DrushCommand' => __DIR__ . '/../..' . '/src/Command/Remote/DrushCommand.php',
        'Acquia\\Cli\\Command\\Remote\\SshBaseCommand' => __DIR__ . '/../..' . '/src/Command/Remote/SshBaseCommand.php',
        'Acquia\\Cli\\Command\\Remote\\SshCommand' => __DIR__ . '/../..' . '/src/Command/Remote/SshCommand.php',
        'Acquia\\Cli\\Command\\Self\\ClearCacheCommand' => __DIR__ . '/../..' . '/src/Command/Self/ClearCacheCommand.php',
        'Acquia\\Cli\\Command\\Self\\ListCommand' => __DIR__ . '/../..' . '/src/Command/Self/ListCommand.php',
        'Acquia\\Cli\\Command\\Self\\MakeDocsCommand' => __DIR__ . '/../..' . '/src/Command/Self/MakeDocsCommand.php',
        'Acquia\\Cli\\Command\\Self\\SelfInfoCommand' => __DIR__ . '/../..' . '/src/Command/Self/SelfInfoCommand.php',
        'Acquia\\Cli\\Command\\Self\\TelemetryCommand' => __DIR__ . '/../..' . '/src/Command/Self/TelemetryCommand.php',
        'Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand' => __DIR__ . '/../..' . '/src/Command/Self/TelemetryDisableCommand.php',
        'Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand' => __DIR__ . '/../..' . '/src/Command/Self/TelemetryEnableCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyCommandBase' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyCommandBase.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyCreateCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyCreateUploadCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyDeleteCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyInfoCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyListCommand.php',
        'Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand' => __DIR__ . '/../..' . '/src/Command/Ssh/SshKeyUploadCommand.php',
        'Acquia\\Cli\\Command\\WizardCommandBase' => __DIR__ . '/../..' . '/src/Command/WizardCommandBase.php',
        'Acquia\\Cli\\Config\\AcquiaCliConfig' => __DIR__ . '/../..' . '/src/Config/AcquiaCliConfig.php',
        'Acquia\\Cli\\Config\\CloudDataConfig' => __DIR__ . '/../..' . '/src/Config/CloudDataConfig.php',
        'Acquia\\Cli\\ConnectorFactoryInterface' => __DIR__ . '/../..' . '/src/ConnectorFactoryInterface.php',
        'Acquia\\Cli\\DataStore\\AcquiaCliDatastore' => __DIR__ . '/../..' . '/src/DataStore/AcquiaCliDatastore.php',
        'Acquia\\Cli\\DataStore\\CloudDataStore' => __DIR__ . '/../..' . '/src/DataStore/CloudDataStore.php',
        'Acquia\\Cli\\DataStore\\DataStoreInterface' => __DIR__ . '/../..' . '/src/DataStore/DataStoreInterface.php',
        'Acquia\\Cli\\DataStore\\Datastore' => __DIR__ . '/../..' . '/src/DataStore/Datastore.php',
        'Acquia\\Cli\\DataStore\\JsonDataStore' => __DIR__ . '/../..' . '/src/DataStore/JsonDataStore.php',
        'Acquia\\Cli\\DataStore\\YamlStore' => __DIR__ . '/../..' . '/src/DataStore/YamlStore.php',
        'Acquia\\Cli\\EventListener\\ComposerScriptsListener' => __DIR__ . '/../..' . '/src/EventListener/ComposerScriptsListener.php',
        'Acquia\\Cli\\EventListener\\ExceptionListener' => __DIR__ . '/../..' . '/src/EventListener/ExceptionListener.php',
        'Acquia\\Cli\\Exception\\AcquiaCliException' => __DIR__ . '/../..' . '/src/Exception/AcquiaCliException.php',
        'Acquia\\Cli\\Helpers\\AliasCache' => __DIR__ . '/../..' . '/src/Helpers/AliasCache.php',
        'Acquia\\Cli\\Helpers\\DataStoreContract' => __DIR__ . '/../..' . '/src/Helpers/DataStoreContract.php',
        'Acquia\\Cli\\Helpers\\IdeCommandTrait' => __DIR__ . '/../..' . '/src/Helpers/IdeCommandTrait.php',
        'Acquia\\Cli\\Helpers\\LocalMachineHelper' => __DIR__ . '/../..' . '/src/Helpers/LocalMachineHelper.php',
        'Acquia\\Cli\\Helpers\\LoopHelper' => __DIR__ . '/../..' . '/src/Helpers/LoopHelper.php',
        'Acquia\\Cli\\Helpers\\SshCommandTrait' => __DIR__ . '/../..' . '/src/Helpers/SshCommandTrait.php',
        'Acquia\\Cli\\Helpers\\SshHelper' => __DIR__ . '/../..' . '/src/Helpers/SshHelper.php',
        'Acquia\\Cli\\Helpers\\TelemetryHelper' => __DIR__ . '/../..' . '/src/Helpers/TelemetryHelper.php',
        'Acquia\\Cli\\Kernel' => __DIR__ . '/../..' . '/src/Kernel.php',
        'Acquia\\Cli\\Output\\Checklist' => __DIR__ . '/../..' . '/src/Output/Checklist.php',
        'Acquia\\Cli\\Output\\Spinner\\Spinner' => __DIR__ . '/../..' . '/src/Output/Spinner/Spinner.php',
        'Acquia\\Cli\\Transformer\\EnvironmentTransformer' => __DIR__ . '/../..' . '/src/Transformer/EnvironmentTransformer.php',
        'Acquia\\DrupalEnvironmentDetector\\AcquiaDrupalEnvironmentDetector' => __DIR__ . '/..' . '/acquia/drupal-environment-detector/src/AcquiaDrupalEnvironmentDetector.php',
        'Acquia\\DrupalEnvironmentDetector\\EnvironmentNames' => __DIR__ . '/..' . '/acquia/drupal-environment-detector/src/EnvironmentNames.php',
        'Acquia\\DrupalEnvironmentDetector\\FilePaths' => __DIR__ . '/..' . '/acquia/drupal-environment-detector/src/FilePaths.php',
        'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
        'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php',
        'Brick\\Math\\BigInteger' => __DIR__ . '/..' . '/brick/math/src/BigInteger.php',
        'Brick\\Math\\BigNumber' => __DIR__ . '/..' . '/brick/math/src/BigNumber.php',
        'Brick\\Math\\BigRational' => __DIR__ . '/..' . '/brick/math/src/BigRational.php',
        'Brick\\Math\\Exception\\DivisionByZeroException' => __DIR__ . '/..' . '/brick/math/src/Exception/DivisionByZeroException.php',
        'Brick\\Math\\Exception\\IntegerOverflowException' => __DIR__ . '/..' . '/brick/math/src/Exception/IntegerOverflowException.php',
        'Brick\\Math\\Exception\\MathException' => __DIR__ . '/..' . '/brick/math/src/Exception/MathException.php',
        'Brick\\Math\\Exception\\NegativeNumberException' => __DIR__ . '/..' . '/brick/math/src/Exception/NegativeNumberException.php',
        'Brick\\Math\\Exception\\NumberFormatException' => __DIR__ . '/..' . '/brick/math/src/Exception/NumberFormatException.php',
        'Brick\\Math\\Exception\\RoundingNecessaryException' => __DIR__ . '/..' . '/brick/math/src/Exception/RoundingNecessaryException.php',
        'Brick\\Math\\Internal\\Calculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator.php',
        'Brick\\Math\\Internal\\CalculatorRegistry' => __DIR__ . '/..' . '/brick/math/src/Internal/CalculatorRegistry.php',
        'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/BcMathCalculator.php',
        'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/GmpCalculator.php',
        'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/NativeCalculator.php',
        'Brick\\Math\\RoundingMode' => __DIR__ . '/..' . '/brick/math/src/RoundingMode.php',
        'Bugsnag\\Breadcrumbs\\Breadcrumb' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Breadcrumbs/Breadcrumb.php',
        'Bugsnag\\Breadcrumbs\\Recorder' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Breadcrumbs/Recorder.php',
        'Bugsnag\\Callbacks\\CustomUser' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/CustomUser.php',
        'Bugsnag\\Callbacks\\EnvironmentData' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/EnvironmentData.php',
        'Bugsnag\\Callbacks\\GlobalMetaData' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/GlobalMetaData.php',
        'Bugsnag\\Callbacks\\RequestContext' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/RequestContext.php',
        'Bugsnag\\Callbacks\\RequestCookies' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/RequestCookies.php',
        'Bugsnag\\Callbacks\\RequestMetaData' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/RequestMetaData.php',
        'Bugsnag\\Callbacks\\RequestSession' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/RequestSession.php',
        'Bugsnag\\Callbacks\\RequestUser' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Callbacks/RequestUser.php',
        'Bugsnag\\Client' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Client.php',
        'Bugsnag\\Configuration' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Configuration.php',
        'Bugsnag\\DateTime\\Clock' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/DateTime/Clock.php',
        'Bugsnag\\DateTime\\ClockInterface' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/DateTime/ClockInterface.php',
        'Bugsnag\\DateTime\\Date' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/DateTime/Date.php',
        'Bugsnag\\Env' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Env.php',
        'Bugsnag\\ErrorTypes' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/ErrorTypes.php',
        'Bugsnag\\FeatureDataStore' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/FeatureDataStore.php',
        'Bugsnag\\FeatureFlag' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/FeatureFlag.php',
        'Bugsnag\\Handler' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Handler.php',
        'Bugsnag\\HttpClient' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/HttpClient.php',
        'Bugsnag\\Internal\\FeatureFlagDelegate' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Internal/FeatureFlagDelegate.php',
        'Bugsnag\\Internal\\GuzzleCompat' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Internal/GuzzleCompat.php',
        'Bugsnag\\Middleware\\BreadcrumbData' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Middleware/BreadcrumbData.php',
        'Bugsnag\\Middleware\\CallbackBridge' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Middleware/CallbackBridge.php',
        'Bugsnag\\Middleware\\DiscardClasses' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Middleware/DiscardClasses.php',
        'Bugsnag\\Middleware\\NotificationSkipper' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Middleware/NotificationSkipper.php',
        'Bugsnag\\Middleware\\SessionData' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Middleware/SessionData.php',
        'Bugsnag\\Pipeline' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Pipeline.php',
        'Bugsnag\\Report' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Report.php',
        'Bugsnag\\Request\\BasicResolver' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/BasicResolver.php',
        'Bugsnag\\Request\\ConsoleRequest' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/ConsoleRequest.php',
        'Bugsnag\\Request\\NullRequest' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/NullRequest.php',
        'Bugsnag\\Request\\PhpRequest' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/PhpRequest.php',
        'Bugsnag\\Request\\RequestInterface' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/RequestInterface.php',
        'Bugsnag\\Request\\ResolverInterface' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Request/ResolverInterface.php',
        'Bugsnag\\SessionTracker' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/SessionTracker.php',
        'Bugsnag\\Shutdown\\PhpShutdownStrategy' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Shutdown/PhpShutdownStrategy.php',
        'Bugsnag\\Shutdown\\ShutdownStrategyInterface' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Shutdown/ShutdownStrategyInterface.php',
        'Bugsnag\\Stacktrace' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Stacktrace.php',
        'Bugsnag\\Utils' => __DIR__ . '/..' . '/bugsnag/bugsnag/src/Utils.php',
        'Clue\\StreamFilter\\CallbackFilter' => __DIR__ . '/..' . '/clue/stream-filter/src/CallbackFilter.php',
        'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
        'Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php',
        'Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php',
        'Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php',
        'Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php',
        'Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php',
        'Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php',
        'Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php',
        'Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php',
        'Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php',
        'Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php',
        'Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php',
        'Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php',
        'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php',
        'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php',
        'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php',
        'DateInvalidTimeZoneException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php',
        'DateMalformedIntervalStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php',
        'DateMalformedPeriodStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php',
        'DateMalformedStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php',
        'DateObjectError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php',
        'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php',
        'Dflydev\\DotAccessData\\Data' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Data.php',
        'Dflydev\\DotAccessData\\DataInterface' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/DataInterface.php',
        'Dflydev\\DotAccessData\\Exception\\DataException' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Exception/DataException.php',
        'Dflydev\\DotAccessData\\Exception\\InvalidPathException' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Exception/InvalidPathException.php',
        'Dflydev\\DotAccessData\\Exception\\MissingPathException' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Exception/MissingPathException.php',
        'Dflydev\\DotAccessData\\Util' => __DIR__ . '/..' . '/dflydev/dot-access-data/src/Util.php',
        'Dotenv\\Dotenv' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Dotenv.php',
        'Dotenv\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/ExceptionInterface.php',
        'Dotenv\\Exception\\InvalidEncodingException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php',
        'Dotenv\\Exception\\InvalidFileException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/InvalidFileException.php',
        'Dotenv\\Exception\\InvalidPathException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/InvalidPathException.php',
        'Dotenv\\Exception\\ValidationException' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Exception/ValidationException.php',
        'Dotenv\\Loader\\Loader' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Loader.php',
        'Dotenv\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/LoaderInterface.php',
        'Dotenv\\Loader\\Resolver' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Loader/Resolver.php',
        'Dotenv\\Parser\\Entry' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/Entry.php',
        'Dotenv\\Parser\\EntryParser' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/EntryParser.php',
        'Dotenv\\Parser\\Lexer' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/Lexer.php',
        'Dotenv\\Parser\\Lines' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/Lines.php',
        'Dotenv\\Parser\\Parser' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/Parser.php',
        'Dotenv\\Parser\\ParserInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/ParserInterface.php',
        'Dotenv\\Parser\\Value' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Parser/Value.php',
        'Dotenv\\Repository\\AdapterRepository' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/AdapterRepository.php',
        'Dotenv\\Repository\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php',
        'Dotenv\\Repository\\Adapter\\ApacheAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php',
        'Dotenv\\Repository\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php',
        'Dotenv\\Repository\\Adapter\\EnvConstAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php',
        'Dotenv\\Repository\\Adapter\\GuardedWriter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php',
        'Dotenv\\Repository\\Adapter\\ImmutableWriter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php',
        'Dotenv\\Repository\\Adapter\\MultiReader' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php',
        'Dotenv\\Repository\\Adapter\\MultiWriter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php',
        'Dotenv\\Repository\\Adapter\\PutenvAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php',
        'Dotenv\\Repository\\Adapter\\ReaderInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php',
        'Dotenv\\Repository\\Adapter\\ReplacingWriter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php',
        'Dotenv\\Repository\\Adapter\\ServerConstAdapter' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php',
        'Dotenv\\Repository\\Adapter\\WriterInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php',
        'Dotenv\\Repository\\RepositoryBuilder' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php',
        'Dotenv\\Repository\\RepositoryInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Repository/RepositoryInterface.php',
        'Dotenv\\Store\\FileStore' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/FileStore.php',
        'Dotenv\\Store\\File\\Paths' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/File/Paths.php',
        'Dotenv\\Store\\File\\Reader' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/File/Reader.php',
        'Dotenv\\Store\\StoreBuilder' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/StoreBuilder.php',
        'Dotenv\\Store\\StoreInterface' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/StoreInterface.php',
        'Dotenv\\Store\\StringStore' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Store/StringStore.php',
        'Dotenv\\Util\\Regex' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Util/Regex.php',
        'Dotenv\\Util\\Str' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Util/Str.php',
        'Dotenv\\Validator' => __DIR__ . '/..' . '/vlucas/phpdotenv/src/Validator.php',
        'Evenement\\EventEmitter' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitter.php',
        'Evenement\\EventEmitterInterface' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterInterface.php',
        'Evenement\\EventEmitterTrait' => __DIR__ . '/..' . '/evenement/evenement/src/EventEmitterTrait.php',
        'Gitlab\\Api\\AbstractApi' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/AbstractApi.php',
        'Gitlab\\Api\\DeployKeys' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/DeployKeys.php',
        'Gitlab\\Api\\Deployments' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Deployments.php',
        'Gitlab\\Api\\Environments' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Environments.php',
        'Gitlab\\Api\\Events' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Events.php',
        'Gitlab\\Api\\Groups' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Groups.php',
        'Gitlab\\Api\\GroupsBoards' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsBoards.php',
        'Gitlab\\Api\\GroupsEpics' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsEpics.php',
        'Gitlab\\Api\\GroupsMilestones' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsMilestones.php',
        'Gitlab\\Api\\IssueBoards' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/IssueBoards.php',
        'Gitlab\\Api\\IssueLinks' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/IssueLinks.php',
        'Gitlab\\Api\\Issues' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Issues.php',
        'Gitlab\\Api\\IssuesStatistics' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/IssuesStatistics.php',
        'Gitlab\\Api\\Jobs' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Jobs.php',
        'Gitlab\\Api\\Keys' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Keys.php',
        'Gitlab\\Api\\MergeRequests' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/MergeRequests.php',
        'Gitlab\\Api\\Milestones' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Milestones.php',
        'Gitlab\\Api\\Packages' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Packages.php',
        'Gitlab\\Api\\ProjectNamespaces' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ProjectNamespaces.php',
        'Gitlab\\Api\\Projects' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Projects.php',
        'Gitlab\\Api\\Repositories' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Repositories.php',
        'Gitlab\\Api\\RepositoryFiles' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/RepositoryFiles.php',
        'Gitlab\\Api\\ResourceIterationEvents' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceIterationEvents.php',
        'Gitlab\\Api\\ResourceLabelEvents' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceLabelEvents.php',
        'Gitlab\\Api\\ResourceMilestoneEvents' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceMilestoneEvents.php',
        'Gitlab\\Api\\ResourceStateEvents' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceStateEvents.php',
        'Gitlab\\Api\\ResourceWeightEvents' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceWeightEvents.php',
        'Gitlab\\Api\\Schedules' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Schedules.php',
        'Gitlab\\Api\\Search' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Search.php',
        'Gitlab\\Api\\Snippets' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Snippets.php',
        'Gitlab\\Api\\SystemHooks' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/SystemHooks.php',
        'Gitlab\\Api\\Tags' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Tags.php',
        'Gitlab\\Api\\Users' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Users.php',
        'Gitlab\\Api\\Version' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Version.php',
        'Gitlab\\Api\\Wiki' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Api/Wiki.php',
        'Gitlab\\Client' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Client.php',
        'Gitlab\\Exception\\ApiLimitExceededException' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Exception/ApiLimitExceededException.php',
        'Gitlab\\Exception\\ErrorException' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Exception/ErrorException.php',
        'Gitlab\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Exception/ExceptionInterface.php',
        'Gitlab\\Exception\\RuntimeException' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Exception/RuntimeException.php',
        'Gitlab\\Exception\\ValidationFailedException' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/Exception/ValidationFailedException.php',
        'Gitlab\\HttpClient\\Builder' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Builder.php',
        'Gitlab\\HttpClient\\Message\\ResponseMediator' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Message/ResponseMediator.php',
        'Gitlab\\HttpClient\\Plugin\\Authentication' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/Authentication.php',
        'Gitlab\\HttpClient\\Plugin\\ExceptionThrower' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/ExceptionThrower.php',
        'Gitlab\\HttpClient\\Plugin\\History' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/History.php',
        'Gitlab\\HttpClient\\Util\\JsonArray' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/JsonArray.php',
        'Gitlab\\HttpClient\\Util\\QueryStringBuilder' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/QueryStringBuilder.php',
        'Gitlab\\ResultPager' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/ResultPager.php',
        'Gitlab\\ResultPagerInterface' => __DIR__ . '/..' . '/m4tthumphrey/php-gitlab-api/src/ResultPagerInterface.php',
        'GrahamCampbell\\ResultType\\Error' => __DIR__ . '/..' . '/graham-campbell/result-type/src/Error.php',
        'GrahamCampbell\\ResultType\\Result' => __DIR__ . '/..' . '/graham-campbell/result-type/src/Result.php',
        'GrahamCampbell\\ResultType\\Success' => __DIR__ . '/..' . '/graham-campbell/result-type/src/Success.php',
        'Grasmash\\Expander\\Expander' => __DIR__ . '/..' . '/grasmash/expander/src/Expander.php',
        'Grasmash\\Expander\\Stringifier' => __DIR__ . '/..' . '/grasmash/expander/src/Stringifier.php',
        'Grasmash\\Expander\\StringifierInterface' => __DIR__ . '/..' . '/grasmash/expander/src/StringifierInterface.php',
        'GuzzleHttp\\BodySummarizer' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizer.php',
        'GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
        'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php',
        'GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php',
        'GuzzleHttp\\ClientTrait' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientTrait.php',
        'GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
        'GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
        'GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
        'GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
        'GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
        'GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
        'GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php',
        'GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',
        'GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
        'GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',
        'GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php',
        'GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php',
        'GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
        'GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php',
        'GuzzleHttp\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php',
        'GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
        'GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
        'GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
        'GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
        'GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
        'GuzzleHttp\\Handler\\HeaderProcessor' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php',
        'GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',
        'GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php',
        'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
        'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php',
        'GuzzleHttp\\MessageFormatterInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php',
        'GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php',
        'GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php',
        'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
        'GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php',
        'GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php',
        'GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php',
        'GuzzleHttp\\Promise\\Create' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Create.php',
        'GuzzleHttp\\Promise\\Each' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Each.php',
        'GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php',
        'GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php',
        'GuzzleHttp\\Promise\\Is' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Is.php',
        'GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php',
        'GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php',
        'GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php',
        'GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php',
        'GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php',
        'GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php',
        'GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php',
        'GuzzleHttp\\Promise\\Utils' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Utils.php',
        'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php',
        'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php',
        'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php',
        'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php',
        'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php',
        'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php',
        'GuzzleHttp\\Psr7\\Header' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Header.php',
        'GuzzleHttp\\Psr7\\HttpFactory' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/HttpFactory.php',
        'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php',
        'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php',
        'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php',
        'GuzzleHttp\\Psr7\\Message' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Message.php',
        'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php',
        'GuzzleHttp\\Psr7\\MimeType' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MimeType.php',
        'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php',
        'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php',
        'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php',
        'GuzzleHttp\\Psr7\\Query' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Query.php',
        'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php',
        'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php',
        'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php',
        'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php',
        'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php',
        'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
        'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php',
        'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php',
        'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php',
        'GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php',
        'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php',
        'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php',
        'GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php',
        'GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
        'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php',
        'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
        'GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php',
        'GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php',
        'Http\\Client\\Common\\BatchClient' => __DIR__ . '/..' . '/php-http/client-common/src/BatchClient.php',
        'Http\\Client\\Common\\BatchClientInterface' => __DIR__ . '/..' . '/php-http/client-common/src/BatchClientInterface.php',
        'Http\\Client\\Common\\BatchResult' => __DIR__ . '/..' . '/php-http/client-common/src/BatchResult.php',
        'Http\\Client\\Common\\Deferred' => __DIR__ . '/..' . '/php-http/client-common/src/Deferred.php',
        'Http\\Client\\Common\\EmulatedHttpAsyncClient' => __DIR__ . '/..' . '/php-http/client-common/src/EmulatedHttpAsyncClient.php',
        'Http\\Client\\Common\\EmulatedHttpClient' => __DIR__ . '/..' . '/php-http/client-common/src/EmulatedHttpClient.php',
        'Http\\Client\\Common\\Exception\\BatchException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/BatchException.php',
        'Http\\Client\\Common\\Exception\\CircularRedirectionException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/CircularRedirectionException.php',
        'Http\\Client\\Common\\Exception\\ClientErrorException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/ClientErrorException.php',
        'Http\\Client\\Common\\Exception\\HttpClientNoMatchException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/HttpClientNoMatchException.php',
        'Http\\Client\\Common\\Exception\\HttpClientNotFoundException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/HttpClientNotFoundException.php',
        'Http\\Client\\Common\\Exception\\LoopException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/LoopException.php',
        'Http\\Client\\Common\\Exception\\MultipleRedirectionException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/MultipleRedirectionException.php',
        'Http\\Client\\Common\\Exception\\ServerErrorException' => __DIR__ . '/..' . '/php-http/client-common/src/Exception/ServerErrorException.php',
        'Http\\Client\\Common\\FlexibleHttpClient' => __DIR__ . '/..' . '/php-http/client-common/src/FlexibleHttpClient.php',
        'Http\\Client\\Common\\HttpAsyncClientDecorator' => __DIR__ . '/..' . '/php-http/client-common/src/HttpAsyncClientDecorator.php',
        'Http\\Client\\Common\\HttpAsyncClientEmulator' => __DIR__ . '/..' . '/php-http/client-common/src/HttpAsyncClientEmulator.php',
        'Http\\Client\\Common\\HttpClientDecorator' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientDecorator.php',
        'Http\\Client\\Common\\HttpClientEmulator' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientEmulator.php',
        'Http\\Client\\Common\\HttpClientPool' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool.php',
        'Http\\Client\\Common\\HttpClientPool\\HttpClientPool' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool/HttpClientPool.php',
        'Http\\Client\\Common\\HttpClientPool\\HttpClientPoolItem' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool/HttpClientPoolItem.php',
        'Http\\Client\\Common\\HttpClientPool\\LeastUsedClientPool' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool/LeastUsedClientPool.php',
        'Http\\Client\\Common\\HttpClientPool\\RandomClientPool' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool/RandomClientPool.php',
        'Http\\Client\\Common\\HttpClientPool\\RoundRobinClientPool' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientPool/RoundRobinClientPool.php',
        'Http\\Client\\Common\\HttpClientRouter' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientRouter.php',
        'Http\\Client\\Common\\HttpClientRouterInterface' => __DIR__ . '/..' . '/php-http/client-common/src/HttpClientRouterInterface.php',
        'Http\\Client\\Common\\HttpMethodsClient' => __DIR__ . '/..' . '/php-http/client-common/src/HttpMethodsClient.php',
        'Http\\Client\\Common\\HttpMethodsClientInterface' => __DIR__ . '/..' . '/php-http/client-common/src/HttpMethodsClientInterface.php',
        'Http\\Client\\Common\\Plugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin.php',
        'Http\\Client\\Common\\PluginChain' => __DIR__ . '/..' . '/php-http/client-common/src/PluginChain.php',
        'Http\\Client\\Common\\PluginClient' => __DIR__ . '/..' . '/php-http/client-common/src/PluginClient.php',
        'Http\\Client\\Common\\PluginClientBuilder' => __DIR__ . '/..' . '/php-http/client-common/src/PluginClientBuilder.php',
        'Http\\Client\\Common\\PluginClientFactory' => __DIR__ . '/..' . '/php-http/client-common/src/PluginClientFactory.php',
        'Http\\Client\\Common\\Plugin\\AddHostPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/AddHostPlugin.php',
        'Http\\Client\\Common\\Plugin\\AddPathPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/AddPathPlugin.php',
        'Http\\Client\\Common\\Plugin\\AuthenticationPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/AuthenticationPlugin.php',
        'Http\\Client\\Common\\Plugin\\BaseUriPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/BaseUriPlugin.php',
        'Http\\Client\\Common\\Plugin\\CachePlugin' => __DIR__ . '/..' . '/php-http/cache-plugin/src/CachePlugin.php',
        'Http\\Client\\Common\\Plugin\\Cache\\Generator\\CacheKeyGenerator' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Cache/Generator/CacheKeyGenerator.php',
        'Http\\Client\\Common\\Plugin\\Cache\\Generator\\HeaderCacheKeyGenerator' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Cache/Generator/HeaderCacheKeyGenerator.php',
        'Http\\Client\\Common\\Plugin\\Cache\\Generator\\SimpleGenerator' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Cache/Generator/SimpleGenerator.php',
        'Http\\Client\\Common\\Plugin\\Cache\\Listener\\AddHeaderCacheListener' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Cache/Listener/AddHeaderCacheListener.php',
        'Http\\Client\\Common\\Plugin\\Cache\\Listener\\CacheListener' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Cache/Listener/CacheListener.php',
        'Http\\Client\\Common\\Plugin\\ContentLengthPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/ContentLengthPlugin.php',
        'Http\\Client\\Common\\Plugin\\ContentTypePlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/ContentTypePlugin.php',
        'Http\\Client\\Common\\Plugin\\CookiePlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/CookiePlugin.php',
        'Http\\Client\\Common\\Plugin\\DecoderPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/DecoderPlugin.php',
        'Http\\Client\\Common\\Plugin\\ErrorPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/ErrorPlugin.php',
        'Http\\Client\\Common\\Plugin\\Exception\\RewindStreamException' => __DIR__ . '/..' . '/php-http/cache-plugin/src/Exception/RewindStreamException.php',
        'Http\\Client\\Common\\Plugin\\HeaderAppendPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/HeaderAppendPlugin.php',
        'Http\\Client\\Common\\Plugin\\HeaderDefaultsPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/HeaderDefaultsPlugin.php',
        'Http\\Client\\Common\\Plugin\\HeaderRemovePlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/HeaderRemovePlugin.php',
        'Http\\Client\\Common\\Plugin\\HeaderSetPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/HeaderSetPlugin.php',
        'Http\\Client\\Common\\Plugin\\HistoryPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/HistoryPlugin.php',
        'Http\\Client\\Common\\Plugin\\Journal' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/Journal.php',
        'Http\\Client\\Common\\Plugin\\QueryDefaultsPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/QueryDefaultsPlugin.php',
        'Http\\Client\\Common\\Plugin\\RedirectPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/RedirectPlugin.php',
        'Http\\Client\\Common\\Plugin\\RequestMatcherPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/RequestMatcherPlugin.php',
        'Http\\Client\\Common\\Plugin\\RequestSeekableBodyPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/RequestSeekableBodyPlugin.php',
        'Http\\Client\\Common\\Plugin\\ResponseSeekableBodyPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/ResponseSeekableBodyPlugin.php',
        'Http\\Client\\Common\\Plugin\\RetryPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/RetryPlugin.php',
        'Http\\Client\\Common\\Plugin\\SeekableBodyPlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/SeekableBodyPlugin.php',
        'Http\\Client\\Common\\Plugin\\VersionBridgePlugin' => __DIR__ . '/..' . '/php-http/client-common/src/Plugin/VersionBridgePlugin.php',
        'Http\\Client\\Common\\VersionBridgeClient' => __DIR__ . '/..' . '/php-http/client-common/src/VersionBridgeClient.php',
        'Http\\Client\\Exception' => __DIR__ . '/..' . '/php-http/httplug/src/Exception.php',
        'Http\\Client\\Exception\\HttpException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/HttpException.php',
        'Http\\Client\\Exception\\NetworkException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/NetworkException.php',
        'Http\\Client\\Exception\\RequestAwareTrait' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/RequestAwareTrait.php',
        'Http\\Client\\Exception\\RequestException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/RequestException.php',
        'Http\\Client\\Exception\\TransferException' => __DIR__ . '/..' . '/php-http/httplug/src/Exception/TransferException.php',
        'Http\\Client\\HttpAsyncClient' => __DIR__ . '/..' . '/php-http/httplug/src/HttpAsyncClient.php',
        'Http\\Client\\HttpClient' => __DIR__ . '/..' . '/php-http/httplug/src/HttpClient.php',
        'Http\\Client\\Promise\\HttpFulfilledPromise' => __DIR__ . '/..' . '/php-http/httplug/src/Promise/HttpFulfilledPromise.php',
        'Http\\Client\\Promise\\HttpRejectedPromise' => __DIR__ . '/..' . '/php-http/httplug/src/Promise/HttpRejectedPromise.php',
        'Http\\Discovery\\ClassDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/ClassDiscovery.php',
        'Http\\Discovery\\Exception' => __DIR__ . '/..' . '/php-http/discovery/src/Exception.php',
        'Http\\Discovery\\Exception\\ClassInstantiationFailedException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/ClassInstantiationFailedException.php',
        'Http\\Discovery\\Exception\\DiscoveryFailedException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/DiscoveryFailedException.php',
        'Http\\Discovery\\Exception\\NoCandidateFoundException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/NoCandidateFoundException.php',
        'Http\\Discovery\\Exception\\NotFoundException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/NotFoundException.php',
        'Http\\Discovery\\Exception\\PuliUnavailableException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/PuliUnavailableException.php',
        'Http\\Discovery\\Exception\\StrategyUnavailableException' => __DIR__ . '/..' . '/php-http/discovery/src/Exception/StrategyUnavailableException.php',
        'Http\\Discovery\\HttpAsyncClientDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/HttpAsyncClientDiscovery.php',
        'Http\\Discovery\\HttpClientDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/HttpClientDiscovery.php',
        'Http\\Discovery\\MessageFactoryDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/MessageFactoryDiscovery.php',
        'Http\\Discovery\\NotFoundException' => __DIR__ . '/..' . '/php-http/discovery/src/NotFoundException.php',
        'Http\\Discovery\\Psr17Factory' => __DIR__ . '/..' . '/php-http/discovery/src/Psr17Factory.php',
        'Http\\Discovery\\Psr17FactoryDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/Psr17FactoryDiscovery.php',
        'Http\\Discovery\\Psr18Client' => __DIR__ . '/..' . '/php-http/discovery/src/Psr18Client.php',
        'Http\\Discovery\\Psr18ClientDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/Psr18ClientDiscovery.php',
        'Http\\Discovery\\Strategy\\CommonClassesStrategy' => __DIR__ . '/..' . '/php-http/discovery/src/Strategy/CommonClassesStrategy.php',
        'Http\\Discovery\\Strategy\\CommonPsr17ClassesStrategy' => __DIR__ . '/..' . '/php-http/discovery/src/Strategy/CommonPsr17ClassesStrategy.php',
        'Http\\Discovery\\Strategy\\DiscoveryStrategy' => __DIR__ . '/..' . '/php-http/discovery/src/Strategy/DiscoveryStrategy.php',
        'Http\\Discovery\\Strategy\\MockClientStrategy' => __DIR__ . '/..' . '/php-http/discovery/src/Strategy/MockClientStrategy.php',
        'Http\\Discovery\\Strategy\\PuliBetaStrategy' => __DIR__ . '/..' . '/php-http/discovery/src/Strategy/PuliBetaStrategy.php',
        'Http\\Discovery\\StreamFactoryDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/StreamFactoryDiscovery.php',
        'Http\\Discovery\\UriFactoryDiscovery' => __DIR__ . '/..' . '/php-http/discovery/src/UriFactoryDiscovery.php',
        'Http\\Factory\\Guzzle\\RequestFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/RequestFactory.php',
        'Http\\Factory\\Guzzle\\ResponseFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/ResponseFactory.php',
        'Http\\Factory\\Guzzle\\ServerRequestFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/ServerRequestFactory.php',
        'Http\\Factory\\Guzzle\\StreamFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/StreamFactory.php',
        'Http\\Factory\\Guzzle\\UploadedFileFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/UploadedFileFactory.php',
        'Http\\Factory\\Guzzle\\UriFactory' => __DIR__ . '/..' . '/http-interop/http-factory-guzzle/src/UriFactory.php',
        'Http\\Message\\Authentication' => __DIR__ . '/..' . '/php-http/message/src/Authentication.php',
        'Http\\Message\\Authentication\\AutoBasicAuth' => __DIR__ . '/..' . '/php-http/message/src/Authentication/AutoBasicAuth.php',
        'Http\\Message\\Authentication\\BasicAuth' => __DIR__ . '/..' . '/php-http/message/src/Authentication/BasicAuth.php',
        'Http\\Message\\Authentication\\Bearer' => __DIR__ . '/..' . '/php-http/message/src/Authentication/Bearer.php',
        'Http\\Message\\Authentication\\Chain' => __DIR__ . '/..' . '/php-http/message/src/Authentication/Chain.php',
        'Http\\Message\\Authentication\\Header' => __DIR__ . '/..' . '/php-http/message/src/Authentication/Header.php',
        'Http\\Message\\Authentication\\Matching' => __DIR__ . '/..' . '/php-http/message/src/Authentication/Matching.php',
        'Http\\Message\\Authentication\\QueryParam' => __DIR__ . '/..' . '/php-http/message/src/Authentication/QueryParam.php',
        'Http\\Message\\Authentication\\RequestConditional' => __DIR__ . '/..' . '/php-http/message/src/Authentication/RequestConditional.php',
        'Http\\Message\\Authentication\\Wsse' => __DIR__ . '/..' . '/php-http/message/src/Authentication/Wsse.php',
        'Http\\Message\\Builder\\ResponseBuilder' => __DIR__ . '/..' . '/php-http/message/src/Builder/ResponseBuilder.php',
        'Http\\Message\\Cookie' => __DIR__ . '/..' . '/php-http/message/src/Cookie.php',
        'Http\\Message\\CookieJar' => __DIR__ . '/..' . '/php-http/message/src/CookieJar.php',
        'Http\\Message\\CookieUtil' => __DIR__ . '/..' . '/php-http/message/src/CookieUtil.php',
        'Http\\Message\\Decorator\\MessageDecorator' => __DIR__ . '/..' . '/php-http/message/src/Decorator/MessageDecorator.php',
        'Http\\Message\\Decorator\\RequestDecorator' => __DIR__ . '/..' . '/php-http/message/src/Decorator/RequestDecorator.php',
        'Http\\Message\\Decorator\\ResponseDecorator' => __DIR__ . '/..' . '/php-http/message/src/Decorator/ResponseDecorator.php',
        'Http\\Message\\Decorator\\StreamDecorator' => __DIR__ . '/..' . '/php-http/message/src/Decorator/StreamDecorator.php',
        'Http\\Message\\Encoding\\ChunkStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/ChunkStream.php',
        'Http\\Message\\Encoding\\CompressStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/CompressStream.php',
        'Http\\Message\\Encoding\\DechunkStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/DechunkStream.php',
        'Http\\Message\\Encoding\\DecompressStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/DecompressStream.php',
        'Http\\Message\\Encoding\\DeflateStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/DeflateStream.php',
        'Http\\Message\\Encoding\\Filter\\Chunk' => __DIR__ . '/..' . '/php-http/message/src/Encoding/Filter/Chunk.php',
        'Http\\Message\\Encoding\\FilteredStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/FilteredStream.php',
        'Http\\Message\\Encoding\\GzipDecodeStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/GzipDecodeStream.php',
        'Http\\Message\\Encoding\\GzipEncodeStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/GzipEncodeStream.php',
        'Http\\Message\\Encoding\\InflateStream' => __DIR__ . '/..' . '/php-http/message/src/Encoding/InflateStream.php',
        'Http\\Message\\Exception' => __DIR__ . '/..' . '/php-http/message/src/Exception.php',
        'Http\\Message\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/php-http/message/src/Exception/UnexpectedValueException.php',
        'Http\\Message\\Formatter' => __DIR__ . '/..' . '/php-http/message/src/Formatter.php',
        'Http\\Message\\Formatter\\CurlCommandFormatter' => __DIR__ . '/..' . '/php-http/message/src/Formatter/CurlCommandFormatter.php',
        'Http\\Message\\Formatter\\FullHttpMessageFormatter' => __DIR__ . '/..' . '/php-http/message/src/Formatter/FullHttpMessageFormatter.php',
        'Http\\Message\\Formatter\\SimpleFormatter' => __DIR__ . '/..' . '/php-http/message/src/Formatter/SimpleFormatter.php',
        'Http\\Message\\MessageFactory\\DiactorosMessageFactory' => __DIR__ . '/..' . '/php-http/message/src/MessageFactory/DiactorosMessageFactory.php',
        'Http\\Message\\MessageFactory\\GuzzleMessageFactory' => __DIR__ . '/..' . '/php-http/message/src/MessageFactory/GuzzleMessageFactory.php',
        'Http\\Message\\MessageFactory\\SlimMessageFactory' => __DIR__ . '/..' . '/php-http/message/src/MessageFactory/SlimMessageFactory.php',
        'Http\\Message\\MultipartStream\\ApacheMimetypeHelper' => __DIR__ . '/..' . '/php-http/multipart-stream-builder/src/ApacheMimetypeHelper.php',
        'Http\\Message\\MultipartStream\\CustomMimetypeHelper' => __DIR__ . '/..' . '/php-http/multipart-stream-builder/src/CustomMimetypeHelper.php',
        'Http\\Message\\MultipartStream\\MimetypeHelper' => __DIR__ . '/..' . '/php-http/multipart-stream-builder/src/MimetypeHelper.php',
        'Http\\Message\\MultipartStream\\MultipartStreamBuilder' => __DIR__ . '/..' . '/php-http/multipart-stream-builder/src/MultipartStreamBuilder.php',
        'Http\\Message\\RequestMatcher' => __DIR__ . '/..' . '/php-http/message/src/RequestMatcher.php',
        'Http\\Message\\RequestMatcher\\CallbackRequestMatcher' => __DIR__ . '/..' . '/php-http/message/src/RequestMatcher/CallbackRequestMatcher.php',
        'Http\\Message\\RequestMatcher\\RegexRequestMatcher' => __DIR__ . '/..' . '/php-http/message/src/RequestMatcher/RegexRequestMatcher.php',
        'Http\\Message\\RequestMatcher\\RequestMatcher' => __DIR__ . '/..' . '/php-http/message/src/RequestMatcher/RequestMatcher.php',
        'Http\\Message\\StreamFactory\\DiactorosStreamFactory' => __DIR__ . '/..' . '/php-http/message/src/StreamFactory/DiactorosStreamFactory.php',
        'Http\\Message\\StreamFactory\\GuzzleStreamFactory' => __DIR__ . '/..' . '/php-http/message/src/StreamFactory/GuzzleStreamFactory.php',
        'Http\\Message\\StreamFactory\\SlimStreamFactory' => __DIR__ . '/..' . '/php-http/message/src/StreamFactory/SlimStreamFactory.php',
        'Http\\Message\\Stream\\BufferedStream' => __DIR__ . '/..' . '/php-http/message/src/Stream/BufferedStream.php',
        'Http\\Message\\UriFactory\\DiactorosUriFactory' => __DIR__ . '/..' . '/php-http/message/src/UriFactory/DiactorosUriFactory.php',
        'Http\\Message\\UriFactory\\GuzzleUriFactory' => __DIR__ . '/..' . '/php-http/message/src/UriFactory/GuzzleUriFactory.php',
        'Http\\Message\\UriFactory\\SlimUriFactory' => __DIR__ . '/..' . '/php-http/message/src/UriFactory/SlimUriFactory.php',
        'Http\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/php-http/promise/src/FulfilledPromise.php',
        'Http\\Promise\\Promise' => __DIR__ . '/..' . '/php-http/promise/src/Promise.php',
        'Http\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/php-http/promise/src/RejectedPromise.php',
        'Kevinrob\\GuzzleCache\\BodyStore' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/BodyStore.php',
        'Kevinrob\\GuzzleCache\\CacheEntry' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/CacheEntry.php',
        'Kevinrob\\GuzzleCache\\CacheMiddleware' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/CacheMiddleware.php',
        'Kevinrob\\GuzzleCache\\KeyValueHttpHeader' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/KeyValueHttpHeader.php',
        'Kevinrob\\GuzzleCache\\Storage\\CacheStorageInterface' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/CacheStorageInterface.php',
        'Kevinrob\\GuzzleCache\\Storage\\CompressedDoctrineCacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/CompressedDoctrineCacheStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\DoctrineCacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/DoctrineCacheStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\FlysystemStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/FlysystemStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\LaravelCacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/LaravelCacheStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\Psr16CacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/Psr16CacheStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\Psr6CacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/Psr6CacheStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\VolatileRuntimeStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/VolatileRuntimeStorage.php',
        'Kevinrob\\GuzzleCache\\Storage\\WordPressObjectCacheStorage' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Storage/WordPressObjectCacheStorage.php',
        'Kevinrob\\GuzzleCache\\Strategy\\CacheStrategyInterface' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/CacheStrategyInterface.php',
        'Kevinrob\\GuzzleCache\\Strategy\\Delegate\\DelegatingCacheStrategy' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/DelegatingCacheStrategy.php',
        'Kevinrob\\GuzzleCache\\Strategy\\Delegate\\RequestMatcherInterface' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/RequestMatcherInterface.php',
        'Kevinrob\\GuzzleCache\\Strategy\\GreedyCacheStrategy' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/GreedyCacheStrategy.php',
        'Kevinrob\\GuzzleCache\\Strategy\\NullCacheStrategy' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/NullCacheStrategy.php',
        'Kevinrob\\GuzzleCache\\Strategy\\PrivateCacheStrategy' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/PrivateCacheStrategy.php',
        'Kevinrob\\GuzzleCache\\Strategy\\PublicCacheStrategy' => __DIR__ . '/..' . '/kevinrob/guzzle-cache-middleware/src/Strategy/PublicCacheStrategy.php',
        'LTDBeget\\ascii\\AsciiChar' => __DIR__ . '/..' . '/ltd-beget/ascii-table/src/LTDBeget/ascii/AsciiChar.php',
        'LTDBeget\\dns\\SyntaxErrorException' => __DIR__ . '/..' . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/SyntaxErrorException.php',
        'LTDBeget\\dns\\Tokenizer' => __DIR__ . '/..' . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/Tokenizer.php',
        'LTDBeget\\dns\\configurator\\Zone' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/Zone.php',
        'LTDBeget\\dns\\configurator\\deserializer\\ArrayDeserializer' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/ArrayDeserializer.php',
        'LTDBeget\\dns\\configurator\\deserializer\\PlainDeserializer' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/PlainDeserializer.php',
        'LTDBeget\\dns\\configurator\\errors\\ErrorsStore' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ErrorsStore.php',
        'LTDBeget\\dns\\configurator\\errors\\ValidationError' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ValidationError.php',
        'LTDBeget\\dns\\configurator\\traits\\RecordsIterateTrait' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/traits/RecordsIterateTrait.php',
        'LTDBeget\\dns\\configurator\\validators\\CnameNumberCheck' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/CnameNumberCheck.php',
        'LTDBeget\\dns\\configurator\\validators\\ConflictTypesValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/ConflictTypesValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\DnsZoneDomainNameValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/DnsZoneDomainNameValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\HostnameValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/HostnameValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\Int16Validator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int16Validator.php',
        'LTDBeget\\dns\\configurator\\validators\\Int32Validator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int32Validator.php',
        'LTDBeget\\dns\\configurator\\validators\\Ip4Validator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip4Validator.php',
        'LTDBeget\\dns\\configurator\\validators\\Ip6Validator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip6Validator.php',
        'LTDBeget\\dns\\configurator\\validators\\OutOfZoneDataValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/OutOfZoneDataValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\PtrValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/PtrValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\SoaNotInRootValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNotInRootValidator.php',
        'LTDBeget\\dns\\configurator\\validators\\SoaNumberCheck' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNumberCheck.php',
        'LTDBeget\\dns\\configurator\\validators\\TtlValidator' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/TtlValidator.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\Node' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/Node.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\RecordAppender' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordAppender.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\RecordsStore' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordsStore.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\ARecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/ARecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\AaaaRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/AaaaRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\CaaRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CaaRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\CnameRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CnameRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\MxRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/MxRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\NaptrRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NaptrRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\NsRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NsRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\PtrRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/PtrRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\SoaRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SoaRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\SrvRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SrvRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\TxtRecord' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/TxtRecord.php',
        'LTDBeget\\dns\\configurator\\zoneEntities\\record\\base\\Record' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/base/Record.php',
        'LTDBeget\\dns\\enums\\eErrorCode' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eErrorCode.php',
        'LTDBeget\\dns\\enums\\eRecordNotification' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordNotification.php',
        'LTDBeget\\dns\\enums\\eRecordType' => __DIR__ . '/..' . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordType.php',
        'LTDBeget\\dns\\record\\RData' => __DIR__ . '/..' . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/RData.php',
        'LTDBeget\\dns\\record\\Record' => __DIR__ . '/..' . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/Record.php',
        'LTDBeget\\stringstream\\StringStream' => __DIR__ . '/..' . '/ltd-beget/stringstream/src/LTDBeget/stringstream/StringStream.php',
        'Laminas\\ServiceManager\\AbstractFactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php',
        'Laminas\\ServiceManager\\AbstractFactory\\ConfigAbstractFactory' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php',
        'Laminas\\ServiceManager\\AbstractFactory\\ReflectionBasedAbstractFactory' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php',
        'Laminas\\ServiceManager\\AbstractPluginManager' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/AbstractPluginManager.php',
        'Laminas\\ServiceManager\\Config' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Config.php',
        'Laminas\\ServiceManager\\ConfigInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/ConfigInterface.php',
        'Laminas\\ServiceManager\\DelegatorFactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php',
        'Laminas\\ServiceManager\\Exception\\ContainerModificationsNotAllowedException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/ContainerModificationsNotAllowedException.php',
        'Laminas\\ServiceManager\\Exception\\CyclicAliasException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/CyclicAliasException.php',
        'Laminas\\ServiceManager\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php',
        'Laminas\\ServiceManager\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/InvalidArgumentException.php',
        'Laminas\\ServiceManager\\Exception\\InvalidServiceException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/InvalidServiceException.php',
        'Laminas\\ServiceManager\\Exception\\ServiceNotCreatedException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/ServiceNotCreatedException.php',
        'Laminas\\ServiceManager\\Exception\\ServiceNotFoundException' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Exception/ServiceNotFoundException.php',
        'Laminas\\ServiceManager\\FactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/FactoryInterface.php',
        'Laminas\\ServiceManager\\Factory\\AbstractFactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Factory/AbstractFactoryInterface.php',
        'Laminas\\ServiceManager\\Factory\\DelegatorFactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Factory/DelegatorFactoryInterface.php',
        'Laminas\\ServiceManager\\Factory\\FactoryInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php',
        'Laminas\\ServiceManager\\Factory\\InvokableFactory' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Factory/InvokableFactory.php',
        'Laminas\\ServiceManager\\InitializerInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/InitializerInterface.php',
        'Laminas\\ServiceManager\\Initializer\\InitializerInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Initializer/InitializerInterface.php',
        'Laminas\\ServiceManager\\PluginManagerInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/PluginManagerInterface.php',
        'Laminas\\ServiceManager\\Proxy\\LazyServiceFactory' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Proxy/LazyServiceFactory.php',
        'Laminas\\ServiceManager\\ServiceLocatorInterface' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/ServiceLocatorInterface.php',
        'Laminas\\ServiceManager\\ServiceManager' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/ServiceManager.php',
        'Laminas\\ServiceManager\\Test\\CommonPluginManagerTrait' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.php',
        'Laminas\\ServiceManager\\Tool\\ConfigDumper' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Tool/ConfigDumper.php',
        'Laminas\\ServiceManager\\Tool\\ConfigDumperCommand' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php',
        'Laminas\\ServiceManager\\Tool\\FactoryCreator' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php',
        'Laminas\\ServiceManager\\Tool\\FactoryCreatorCommand' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php',
        'Laminas\\Stdlib\\AbstractOptions' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/AbstractOptions.php',
        'Laminas\\Stdlib\\ArrayObject' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayObject.php',
        'Laminas\\Stdlib\\ArraySerializableInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArraySerializableInterface.php',
        'Laminas\\Stdlib\\ArrayStack' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayStack.php',
        'Laminas\\Stdlib\\ArrayUtils' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayUtils.php',
        'Laminas\\Stdlib\\ArrayUtils\\MergeRemoveKey' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.php',
        'Laminas\\Stdlib\\ArrayUtils\\MergeReplaceKey' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKey.php',
        'Laminas\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php',
        'Laminas\\Stdlib\\ConsoleHelper' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ConsoleHelper.php',
        'Laminas\\Stdlib\\DispatchableInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/DispatchableInterface.php',
        'Laminas\\Stdlib\\ErrorHandler' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ErrorHandler.php',
        'Laminas\\Stdlib\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php',
        'Laminas\\Stdlib\\Exception\\DomainException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/DomainException.php',
        'Laminas\\Stdlib\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/ExceptionInterface.php',
        'Laminas\\Stdlib\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/ExtensionNotLoadedException.php',
        'Laminas\\Stdlib\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/InvalidArgumentException.php',
        'Laminas\\Stdlib\\Exception\\LogicException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/LogicException.php',
        'Laminas\\Stdlib\\Exception\\RuntimeException' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Exception/RuntimeException.php',
        'Laminas\\Stdlib\\FastPriorityQueue' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/FastPriorityQueue.php',
        'Laminas\\Stdlib\\Glob' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Glob.php',
        'Laminas\\Stdlib\\Guard\\AllGuardsTrait' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php',
        'Laminas\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php',
        'Laminas\\Stdlib\\Guard\\EmptyGuardTrait' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Guard/EmptyGuardTrait.php',
        'Laminas\\Stdlib\\Guard\\NullGuardTrait' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Guard/NullGuardTrait.php',
        'Laminas\\Stdlib\\InitializableInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/InitializableInterface.php',
        'Laminas\\Stdlib\\JsonSerializable' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/JsonSerializable.php',
        'Laminas\\Stdlib\\Message' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Message.php',
        'Laminas\\Stdlib\\MessageInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/MessageInterface.php',
        'Laminas\\Stdlib\\ParameterObjectInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ParameterObjectInterface.php',
        'Laminas\\Stdlib\\Parameters' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Parameters.php',
        'Laminas\\Stdlib\\ParametersInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ParametersInterface.php',
        'Laminas\\Stdlib\\PriorityList' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/PriorityList.php',
        'Laminas\\Stdlib\\PriorityQueue' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/PriorityQueue.php',
        'Laminas\\Stdlib\\Request' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Request.php',
        'Laminas\\Stdlib\\RequestInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/RequestInterface.php',
        'Laminas\\Stdlib\\Response' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/Response.php',
        'Laminas\\Stdlib\\ResponseInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/ResponseInterface.php',
        'Laminas\\Stdlib\\SplPriorityQueue' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/SplPriorityQueue.php',
        'Laminas\\Stdlib\\SplQueue' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/SplQueue.php',
        'Laminas\\Stdlib\\SplStack' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/SplStack.php',
        'Laminas\\Stdlib\\StringUtils' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringUtils.php',
        'Laminas\\Stdlib\\StringWrapper\\AbstractStringWrapper' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php',
        'Laminas\\Stdlib\\StringWrapper\\Iconv' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/Iconv.php',
        'Laminas\\Stdlib\\StringWrapper\\Intl' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/Intl.php',
        'Laminas\\Stdlib\\StringWrapper\\MbString' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/MbString.php',
        'Laminas\\Stdlib\\StringWrapper\\Native' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/Native.php',
        'Laminas\\Stdlib\\StringWrapper\\StringWrapperInterface' => __DIR__ . '/..' . '/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.php',
        'Laminas\\Validator\\AbstractValidator' => __DIR__ . '/..' . '/laminas/laminas-validator/src/AbstractValidator.php',
        'Laminas\\Validator\\Barcode' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode.php',
        'Laminas\\Validator\\Barcode\\AbstractAdapter' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/AbstractAdapter.php',
        'Laminas\\Validator\\Barcode\\AdapterInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/AdapterInterface.php',
        'Laminas\\Validator\\Barcode\\Codabar' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Codabar.php',
        'Laminas\\Validator\\Barcode\\Code128' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code128.php',
        'Laminas\\Validator\\Barcode\\Code25' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code25.php',
        'Laminas\\Validator\\Barcode\\Code25interleaved' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code25interleaved.php',
        'Laminas\\Validator\\Barcode\\Code39' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code39.php',
        'Laminas\\Validator\\Barcode\\Code39ext' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code39ext.php',
        'Laminas\\Validator\\Barcode\\Code93' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code93.php',
        'Laminas\\Validator\\Barcode\\Code93ext' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Code93ext.php',
        'Laminas\\Validator\\Barcode\\Ean12' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean12.php',
        'Laminas\\Validator\\Barcode\\Ean13' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean13.php',
        'Laminas\\Validator\\Barcode\\Ean14' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean14.php',
        'Laminas\\Validator\\Barcode\\Ean18' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean18.php',
        'Laminas\\Validator\\Barcode\\Ean2' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean2.php',
        'Laminas\\Validator\\Barcode\\Ean5' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean5.php',
        'Laminas\\Validator\\Barcode\\Ean8' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Ean8.php',
        'Laminas\\Validator\\Barcode\\Gtin12' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Gtin12.php',
        'Laminas\\Validator\\Barcode\\Gtin13' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Gtin13.php',
        'Laminas\\Validator\\Barcode\\Gtin14' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Gtin14.php',
        'Laminas\\Validator\\Barcode\\Identcode' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Identcode.php',
        'Laminas\\Validator\\Barcode\\Intelligentmail' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Intelligentmail.php',
        'Laminas\\Validator\\Barcode\\Issn' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Issn.php',
        'Laminas\\Validator\\Barcode\\Itf14' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Itf14.php',
        'Laminas\\Validator\\Barcode\\Leitcode' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Leitcode.php',
        'Laminas\\Validator\\Barcode\\Planet' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Planet.php',
        'Laminas\\Validator\\Barcode\\Postnet' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Postnet.php',
        'Laminas\\Validator\\Barcode\\Royalmail' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Royalmail.php',
        'Laminas\\Validator\\Barcode\\Sscc' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Sscc.php',
        'Laminas\\Validator\\Barcode\\Upca' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Upca.php',
        'Laminas\\Validator\\Barcode\\Upce' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Barcode/Upce.php',
        'Laminas\\Validator\\Between' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Between.php',
        'Laminas\\Validator\\Bitwise' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Bitwise.php',
        'Laminas\\Validator\\BusinessIdentifierCode' => __DIR__ . '/..' . '/laminas/laminas-validator/src/BusinessIdentifierCode.php',
        'Laminas\\Validator\\Callback' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Callback.php',
        'Laminas\\Validator\\ConfigProvider' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ConfigProvider.php',
        'Laminas\\Validator\\CreditCard' => __DIR__ . '/..' . '/laminas/laminas-validator/src/CreditCard.php',
        'Laminas\\Validator\\Csrf' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Csrf.php',
        'Laminas\\Validator\\Date' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Date.php',
        'Laminas\\Validator\\DateComparison' => __DIR__ . '/..' . '/laminas/laminas-validator/src/DateComparison.php',
        'Laminas\\Validator\\DateStep' => __DIR__ . '/..' . '/laminas/laminas-validator/src/DateStep.php',
        'Laminas\\Validator\\Db\\AbstractDb' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Db/AbstractDb.php',
        'Laminas\\Validator\\Db\\NoRecordExists' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Db/NoRecordExists.php',
        'Laminas\\Validator\\Db\\RecordExists' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Db/RecordExists.php',
        'Laminas\\Validator\\Digits' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Digits.php',
        'Laminas\\Validator\\EmailAddress' => __DIR__ . '/..' . '/laminas/laminas-validator/src/EmailAddress.php',
        'Laminas\\Validator\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/BadMethodCallException.php',
        'Laminas\\Validator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/ExceptionInterface.php',
        'Laminas\\Validator\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/ExtensionNotLoadedException.php',
        'Laminas\\Validator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/InvalidArgumentException.php',
        'Laminas\\Validator\\Exception\\InvalidMagicMimeFileException' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/InvalidMagicMimeFileException.php',
        'Laminas\\Validator\\Exception\\RuntimeException' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Exception/RuntimeException.php',
        'Laminas\\Validator\\Explode' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Explode.php',
        'Laminas\\Validator\\File\\Count' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Count.php',
        'Laminas\\Validator\\File\\Crc32' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Crc32.php',
        'Laminas\\Validator\\File\\ExcludeExtension' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/ExcludeExtension.php',
        'Laminas\\Validator\\File\\ExcludeMimeType' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/ExcludeMimeType.php',
        'Laminas\\Validator\\File\\Exists' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Exists.php',
        'Laminas\\Validator\\File\\Extension' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Extension.php',
        'Laminas\\Validator\\File\\FileInformationTrait' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/FileInformationTrait.php',
        'Laminas\\Validator\\File\\FilesSize' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/FilesSize.php',
        'Laminas\\Validator\\File\\Hash' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Hash.php',
        'Laminas\\Validator\\File\\ImageSize' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/ImageSize.php',
        'Laminas\\Validator\\File\\IsCompressed' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/IsCompressed.php',
        'Laminas\\Validator\\File\\IsImage' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/IsImage.php',
        'Laminas\\Validator\\File\\Md5' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Md5.php',
        'Laminas\\Validator\\File\\MimeType' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/MimeType.php',
        'Laminas\\Validator\\File\\NotExists' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/NotExists.php',
        'Laminas\\Validator\\File\\Sha1' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Sha1.php',
        'Laminas\\Validator\\File\\Size' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Size.php',
        'Laminas\\Validator\\File\\Upload' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/Upload.php',
        'Laminas\\Validator\\File\\UploadFile' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/UploadFile.php',
        'Laminas\\Validator\\File\\WordCount' => __DIR__ . '/..' . '/laminas/laminas-validator/src/File/WordCount.php',
        'Laminas\\Validator\\GpsPoint' => __DIR__ . '/..' . '/laminas/laminas-validator/src/GpsPoint.php',
        'Laminas\\Validator\\GreaterThan' => __DIR__ . '/..' . '/laminas/laminas-validator/src/GreaterThan.php',
        'Laminas\\Validator\\Hex' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Hex.php',
        'Laminas\\Validator\\HostWithPublicIPv4Address' => __DIR__ . '/..' . '/laminas/laminas-validator/src/HostWithPublicIPv4Address.php',
        'Laminas\\Validator\\Hostname' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Hostname.php',
        'Laminas\\Validator\\Iban' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Iban.php',
        'Laminas\\Validator\\Identical' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Identical.php',
        'Laminas\\Validator\\InArray' => __DIR__ . '/..' . '/laminas/laminas-validator/src/InArray.php',
        'Laminas\\Validator\\Ip' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Ip.php',
        'Laminas\\Validator\\IsArray' => __DIR__ . '/..' . '/laminas/laminas-validator/src/IsArray.php',
        'Laminas\\Validator\\IsCountable' => __DIR__ . '/..' . '/laminas/laminas-validator/src/IsCountable.php',
        'Laminas\\Validator\\IsInstanceOf' => __DIR__ . '/..' . '/laminas/laminas-validator/src/IsInstanceOf.php',
        'Laminas\\Validator\\IsJsonString' => __DIR__ . '/..' . '/laminas/laminas-validator/src/IsJsonString.php',
        'Laminas\\Validator\\Isbn' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Isbn.php',
        'Laminas\\Validator\\Isbn\\Isbn10' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Isbn/Isbn10.php',
        'Laminas\\Validator\\Isbn\\Isbn13' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Isbn/Isbn13.php',
        'Laminas\\Validator\\LessThan' => __DIR__ . '/..' . '/laminas/laminas-validator/src/LessThan.php',
        'Laminas\\Validator\\Module' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Module.php',
        'Laminas\\Validator\\NotEmpty' => __DIR__ . '/..' . '/laminas/laminas-validator/src/NotEmpty.php',
        'Laminas\\Validator\\NumberComparison' => __DIR__ . '/..' . '/laminas/laminas-validator/src/NumberComparison.php',
        'Laminas\\Validator\\Regex' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Regex.php',
        'Laminas\\Validator\\Sitemap\\Changefreq' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Sitemap/Changefreq.php',
        'Laminas\\Validator\\Sitemap\\Lastmod' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Sitemap/Lastmod.php',
        'Laminas\\Validator\\Sitemap\\Loc' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Sitemap/Loc.php',
        'Laminas\\Validator\\Sitemap\\Priority' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Sitemap/Priority.php',
        'Laminas\\Validator\\StaticValidator' => __DIR__ . '/..' . '/laminas/laminas-validator/src/StaticValidator.php',
        'Laminas\\Validator\\Step' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Step.php',
        'Laminas\\Validator\\StringLength' => __DIR__ . '/..' . '/laminas/laminas-validator/src/StringLength.php',
        'Laminas\\Validator\\Timezone' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Timezone.php',
        'Laminas\\Validator\\Translator\\DummyTranslator' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Translator/DummyTranslator.php',
        'Laminas\\Validator\\Translator\\Translator' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Translator/Translator.php',
        'Laminas\\Validator\\Translator\\TranslatorAwareInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php',
        'Laminas\\Validator\\Translator\\TranslatorFactory' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Translator/TranslatorFactory.php',
        'Laminas\\Validator\\Translator\\TranslatorInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Translator/TranslatorInterface.php',
        'Laminas\\Validator\\UndisclosedPassword' => __DIR__ . '/..' . '/laminas/laminas-validator/src/UndisclosedPassword.php',
        'Laminas\\Validator\\Uri' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Uri.php',
        'Laminas\\Validator\\Uuid' => __DIR__ . '/..' . '/laminas/laminas-validator/src/Uuid.php',
        'Laminas\\Validator\\ValidatorChain' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorChain.php',
        'Laminas\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorInterface.php',
        'Laminas\\Validator\\ValidatorPluginManager' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorPluginManager.php',
        'Laminas\\Validator\\ValidatorPluginManagerAwareInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php',
        'Laminas\\Validator\\ValidatorPluginManagerFactory' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorPluginManagerFactory.php',
        'Laminas\\Validator\\ValidatorProviderInterface' => __DIR__ . '/..' . '/laminas/laminas-validator/src/ValidatorProviderInterface.php',
        'League\\Csv\\AbstractCsv' => __DIR__ . '/..' . '/league/csv/src/AbstractCsv.php',
        'League\\Csv\\Bom' => __DIR__ . '/..' . '/league/csv/src/Bom.php',
        'League\\Csv\\Buffer' => __DIR__ . '/..' . '/league/csv/src/Buffer.php',
        'League\\Csv\\ByteSequence' => __DIR__ . '/..' . '/league/csv/src/ByteSequence.php',
        'League\\Csv\\CallbackStreamFilter' => __DIR__ . '/..' . '/league/csv/src/CallbackStreamFilter.php',
        'League\\Csv\\CannotInsertRecord' => __DIR__ . '/..' . '/league/csv/src/CannotInsertRecord.php',
        'League\\Csv\\CharsetConverter' => __DIR__ . '/..' . '/league/csv/src/CharsetConverter.php',
        'League\\Csv\\ColumnConsistency' => __DIR__ . '/..' . '/league/csv/src/ColumnConsistency.php',
        'League\\Csv\\EncloseField' => __DIR__ . '/..' . '/league/csv/src/EncloseField.php',
        'League\\Csv\\EscapeFormula' => __DIR__ . '/..' . '/league/csv/src/EscapeFormula.php',
        'League\\Csv\\Exception' => __DIR__ . '/..' . '/league/csv/src/Exception.php',
        'League\\Csv\\FragmentFinder' => __DIR__ . '/..' . '/league/csv/src/FragmentFinder.php',
        'League\\Csv\\FragmentNotFound' => __DIR__ . '/..' . '/league/csv/src/FragmentNotFound.php',
        'League\\Csv\\HTMLConverter' => __DIR__ . '/..' . '/league/csv/src/HTMLConverter.php',
        'League\\Csv\\HttpHeaders' => __DIR__ . '/..' . '/league/csv/src/HttpHeaders.php',
        'League\\Csv\\Info' => __DIR__ . '/..' . '/league/csv/src/Info.php',
        'League\\Csv\\InvalidArgument' => __DIR__ . '/..' . '/league/csv/src/InvalidArgument.php',
        'League\\Csv\\JsonConverter' => __DIR__ . '/..' . '/league/csv/src/JsonConverter.php',
        'League\\Csv\\JsonFormat' => __DIR__ . '/..' . '/league/csv/src/JsonFormat.php',
        'League\\Csv\\MapIterator' => __DIR__ . '/..' . '/league/csv/src/MapIterator.php',
        'League\\Csv\\Query\\Constraint\\Column' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Column.php',
        'League\\Csv\\Query\\Constraint\\Comparison' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Comparison.php',
        'League\\Csv\\Query\\Constraint\\Criteria' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Criteria.php',
        'League\\Csv\\Query\\Constraint\\Offset' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/Offset.php',
        'League\\Csv\\Query\\Constraint\\TwoColumns' => __DIR__ . '/..' . '/league/csv/src/Query/Constraint/TwoColumns.php',
        'League\\Csv\\Query\\Limit' => __DIR__ . '/..' . '/league/csv/src/Query/Limit.php',
        'League\\Csv\\Query\\Ordering\\Column' => __DIR__ . '/..' . '/league/csv/src/Query/Ordering/Column.php',
        'League\\Csv\\Query\\Ordering\\MultiSort' => __DIR__ . '/..' . '/league/csv/src/Query/Ordering/MultiSort.php',
        'League\\Csv\\Query\\Predicate' => __DIR__ . '/..' . '/league/csv/src/Query/Predicate.php',
        'League\\Csv\\Query\\PredicateCombinator' => __DIR__ . '/..' . '/league/csv/src/Query/PredicateCombinator.php',
        'League\\Csv\\Query\\QueryException' => __DIR__ . '/..' . '/league/csv/src/Query/QueryException.php',
        'League\\Csv\\Query\\Row' => __DIR__ . '/..' . '/league/csv/src/Query/Row.php',
        'League\\Csv\\Query\\Sort' => __DIR__ . '/..' . '/league/csv/src/Query/Sort.php',
        'League\\Csv\\Query\\SortCombinator' => __DIR__ . '/..' . '/league/csv/src/Query/SortCombinator.php',
        'League\\Csv\\RFC4180Field' => __DIR__ . '/..' . '/league/csv/src/RFC4180Field.php',
        'League\\Csv\\RdbmsResult' => __DIR__ . '/..' . '/league/csv/src/RdbmsResult.php',
        'League\\Csv\\Reader' => __DIR__ . '/..' . '/league/csv/src/Reader.php',
        'League\\Csv\\ResultSet' => __DIR__ . '/..' . '/league/csv/src/ResultSet.php',
        'League\\Csv\\Serializer\\AfterMapping' => __DIR__ . '/..' . '/league/csv/src/Serializer/AfterMapping.php',
        'League\\Csv\\Serializer\\ArrayShape' => __DIR__ . '/..' . '/league/csv/src/Serializer/ArrayShape.php',
        'League\\Csv\\Serializer\\CallbackCasting' => __DIR__ . '/..' . '/league/csv/src/Serializer/CallbackCasting.php',
        'League\\Csv\\Serializer\\CastToArray' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToArray.php',
        'League\\Csv\\Serializer\\CastToBool' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToBool.php',
        'League\\Csv\\Serializer\\CastToDate' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToDate.php',
        'League\\Csv\\Serializer\\CastToEnum' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToEnum.php',
        'League\\Csv\\Serializer\\CastToFloat' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToFloat.php',
        'League\\Csv\\Serializer\\CastToInt' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToInt.php',
        'League\\Csv\\Serializer\\CastToString' => __DIR__ . '/..' . '/league/csv/src/Serializer/CastToString.php',
        'League\\Csv\\Serializer\\DenormalizationFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/DenormalizationFailed.php',
        'League\\Csv\\Serializer\\Denormalizer' => __DIR__ . '/..' . '/league/csv/src/Serializer/Denormalizer.php',
        'League\\Csv\\Serializer\\MapCell' => __DIR__ . '/..' . '/league/csv/src/Serializer/MapCell.php',
        'League\\Csv\\Serializer\\MapRecord' => __DIR__ . '/..' . '/league/csv/src/Serializer/MapRecord.php',
        'League\\Csv\\Serializer\\MappingFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/MappingFailed.php',
        'League\\Csv\\Serializer\\PropertySetter' => __DIR__ . '/..' . '/league/csv/src/Serializer/PropertySetter.php',
        'League\\Csv\\Serializer\\SerializationFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/SerializationFailed.php',
        'League\\Csv\\Serializer\\Type' => __DIR__ . '/..' . '/league/csv/src/Serializer/Type.php',
        'League\\Csv\\Serializer\\TypeCasting' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCasting.php',
        'League\\Csv\\Serializer\\TypeCastingFailed' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingFailed.php',
        'League\\Csv\\Serializer\\TypeCastingInfo' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingInfo.php',
        'League\\Csv\\Serializer\\TypeCastingTargetType' => __DIR__ . '/..' . '/league/csv/src/Serializer/TypeCastingTargetType.php',
        'League\\Csv\\Statement' => __DIR__ . '/..' . '/league/csv/src/Statement.php',
        'League\\Csv\\Stream' => __DIR__ . '/..' . '/league/csv/src/Stream.php',
        'League\\Csv\\StreamFilter' => __DIR__ . '/..' . '/league/csv/src/StreamFilter.php',
        'League\\Csv\\SwapDelimiter' => __DIR__ . '/..' . '/league/csv/src/SwapDelimiter.php',
        'League\\Csv\\SyntaxError' => __DIR__ . '/..' . '/league/csv/src/SyntaxError.php',
        'League\\Csv\\TabularData' => __DIR__ . '/..' . '/league/csv/src/TabularData.php',
        'League\\Csv\\TabularDataProvider' => __DIR__ . '/..' . '/league/csv/src/TabularDataProvider.php',
        'League\\Csv\\TabularDataReader' => __DIR__ . '/..' . '/league/csv/src/TabularDataReader.php',
        'League\\Csv\\TabularDataWriter' => __DIR__ . '/..' . '/league/csv/src/TabularDataWriter.php',
        'League\\Csv\\UnableToProcessCsv' => __DIR__ . '/..' . '/league/csv/src/UnableToProcessCsv.php',
        'League\\Csv\\UnavailableFeature' => __DIR__ . '/..' . '/league/csv/src/UnavailableFeature.php',
        'League\\Csv\\UnavailableStream' => __DIR__ . '/..' . '/league/csv/src/UnavailableStream.php',
        'League\\Csv\\Warning' => __DIR__ . '/..' . '/league/csv/src/Warning.php',
        'League\\Csv\\Writer' => __DIR__ . '/..' . '/league/csv/src/Writer.php',
        'League\\Csv\\XMLConverter' => __DIR__ . '/..' . '/league/csv/src/XMLConverter.php',
        'League\\OAuth2\\Client\\Grant\\AbstractGrant' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/AbstractGrant.php',
        'League\\OAuth2\\Client\\Grant\\AuthorizationCode' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/AuthorizationCode.php',
        'League\\OAuth2\\Client\\Grant\\ClientCredentials' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/ClientCredentials.php',
        'League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
        'League\\OAuth2\\Client\\Grant\\GrantFactory' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/GrantFactory.php',
        'League\\OAuth2\\Client\\Grant\\Password' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/Password.php',
        'League\\OAuth2\\Client\\Grant\\RefreshToken' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/RefreshToken.php',
        'League\\OAuth2\\Client\\OptionProvider\\HttpBasicAuthOptionProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php',
        'League\\OAuth2\\Client\\OptionProvider\\OptionProviderInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php',
        'League\\OAuth2\\Client\\OptionProvider\\PostAuthOptionProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php',
        'League\\OAuth2\\Client\\Provider\\AbstractProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/AbstractProvider.php',
        'League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
        'League\\OAuth2\\Client\\Provider\\GenericProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/GenericProvider.php',
        'League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/GenericResourceOwner.php',
        'League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
        'League\\OAuth2\\Client\\Token\\AccessToken' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/AccessToken.php',
        'League\\OAuth2\\Client\\Token\\AccessTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/AccessTokenInterface.php',
        'League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
        'League\\OAuth2\\Client\\Token\\SettableRefreshTokenInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php',
        'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
        'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
        'League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
        'League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
        'League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
        'League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
        'League\\OAuth2\\Client\\Tool\\RequestFactory' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/RequestFactory.php',
        'League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
        'MabeEnum\\Enum' => __DIR__ . '/..' . '/marc-mabe/php-enum/src/Enum.php',
        'MabeEnum\\EnumMap' => __DIR__ . '/..' . '/marc-mabe/php-enum/src/EnumMap.php',
        'MabeEnum\\EnumSerializableTrait' => __DIR__ . '/..' . '/marc-mabe/php-enum/src/EnumSerializableTrait.php',
        'MabeEnum\\EnumSet' => __DIR__ . '/..' . '/marc-mabe/php-enum/src/EnumSet.php',
        'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
        'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php',
        'PhpOption\\LazyOption' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/LazyOption.php',
        'PhpOption\\None' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/None.php',
        'PhpOption\\Option' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Option.php',
        'PhpOption\\Some' => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption/Some.php',
        'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
        'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php',
        'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php',
        'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php',
        'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php',
        'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
        'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
        'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
        'Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php',
        'Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php',
        'Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php',
        'Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php',
        'Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php',
        'Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php',
        'Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/RequestExceptionInterface.php',
        'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
        'Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php',
        'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
        'Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php',
        'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
        'Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php',
        'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',
        'Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php',
        'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',
        'Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php',
        'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
        'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php',
        'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
        'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php',
        'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php',
        'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php',
        'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php',
        'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php',
        'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php',
        'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php',
        'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php',
        'Ramsey\\Collection\\AbstractArray' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractArray.php',
        'Ramsey\\Collection\\AbstractCollection' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractCollection.php',
        'Ramsey\\Collection\\AbstractSet' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractSet.php',
        'Ramsey\\Collection\\ArrayInterface' => __DIR__ . '/..' . '/ramsey/collection/src/ArrayInterface.php',
        'Ramsey\\Collection\\Collection' => __DIR__ . '/..' . '/ramsey/collection/src/Collection.php',
        'Ramsey\\Collection\\CollectionInterface' => __DIR__ . '/..' . '/ramsey/collection/src/CollectionInterface.php',
        'Ramsey\\Collection\\DoubleEndedQueue' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueue.php',
        'Ramsey\\Collection\\DoubleEndedQueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueueInterface.php',
        'Ramsey\\Collection\\Exception\\CollectionException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionException.php',
        'Ramsey\\Collection\\Exception\\CollectionMismatchException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionMismatchException.php',
        'Ramsey\\Collection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidArgumentException.php',
        'Ramsey\\Collection\\Exception\\InvalidPropertyOrMethod' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php',
        'Ramsey\\Collection\\Exception\\NoSuchElementException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/NoSuchElementException.php',
        'Ramsey\\Collection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/OutOfBoundsException.php',
        'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/UnsupportedOperationException.php',
        'Ramsey\\Collection\\GenericArray' => __DIR__ . '/..' . '/ramsey/collection/src/GenericArray.php',
        'Ramsey\\Collection\\Map\\AbstractMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractMap.php',
        'Ramsey\\Collection\\Map\\AbstractTypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractTypedMap.php',
        'Ramsey\\Collection\\Map\\AssociativeArrayMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AssociativeArrayMap.php',
        'Ramsey\\Collection\\Map\\MapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/MapInterface.php',
        'Ramsey\\Collection\\Map\\NamedParameterMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/NamedParameterMap.php',
        'Ramsey\\Collection\\Map\\TypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMap.php',
        'Ramsey\\Collection\\Map\\TypedMapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMapInterface.php',
        'Ramsey\\Collection\\Queue' => __DIR__ . '/..' . '/ramsey/collection/src/Queue.php',
        'Ramsey\\Collection\\QueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/QueueInterface.php',
        'Ramsey\\Collection\\Set' => __DIR__ . '/..' . '/ramsey/collection/src/Set.php',
        'Ramsey\\Collection\\Sort' => __DIR__ . '/..' . '/ramsey/collection/src/Sort.php',
        'Ramsey\\Collection\\Tool\\TypeTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/TypeTrait.php',
        'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueExtractorTrait.php',
        'Ramsey\\Collection\\Tool\\ValueToStringTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueToStringTrait.php',
        'Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php',
        'Ramsey\\Uuid\\Builder\\BuilderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/BuilderCollection.php',
        'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
        'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
        'Ramsey\\Uuid\\Builder\\FallbackBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/FallbackBuilder.php',
        'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
        'Ramsey\\Uuid\\Codec\\CodecInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/CodecInterface.php',
        'Ramsey\\Uuid\\Codec\\GuidStringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
        'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
        'Ramsey\\Uuid\\Codec\\StringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/StringCodec.php',
        'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
        'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
        'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
        'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
        'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
        'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php',
        'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
        'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
        'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
        'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php',
        'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
        'Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php',
        'Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php',
        'Ramsey\\Uuid\\DeprecatedUuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidInterface.php',
        'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php',
        'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php',
        'Ramsey\\Uuid\\Exception\\DateTimeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DateTimeException.php',
        'Ramsey\\Uuid\\Exception\\DceSecurityException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DceSecurityException.php',
        'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidArgumentException.php',
        'Ramsey\\Uuid\\Exception\\InvalidBytesException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidBytesException.php',
        'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
        'Ramsey\\Uuid\\Exception\\NameException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NameException.php',
        'Ramsey\\Uuid\\Exception\\NodeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NodeException.php',
        'Ramsey\\Uuid\\Exception\\RandomSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/RandomSourceException.php',
        'Ramsey\\Uuid\\Exception\\TimeSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/TimeSourceException.php',
        'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php',
        'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
        'Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php',
        'Ramsey\\Uuid\\FeatureSet' => __DIR__ . '/..' . '/ramsey/uuid/src/FeatureSet.php',
        'Ramsey\\Uuid\\Fields\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/FieldsInterface.php',
        'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php',
        'Ramsey\\Uuid\\Generator\\CombGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/CombGenerator.php',
        'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php',
        'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php',
        'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php',
        'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
        'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php',
        'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php',
        'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php',
        'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
        'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
        'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
        'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
        'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
        'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
        'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
        'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
        'Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php',
        'Ramsey\\Uuid\\Guid\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Fields.php',
        'Ramsey\\Uuid\\Guid\\Guid' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Guid.php',
        'Ramsey\\Uuid\\Guid\\GuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/GuidBuilder.php',
        'Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => __DIR__ . '/..' . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php',
        'Ramsey\\Uuid\\Math\\BrickMathCalculator' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/BrickMathCalculator.php',
        'Ramsey\\Uuid\\Math\\CalculatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/CalculatorInterface.php',
        'Ramsey\\Uuid\\Math\\RoundingMode' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/RoundingMode.php',
        'Ramsey\\Uuid\\Nonstandard\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Fields.php',
        'Ramsey\\Uuid\\Nonstandard\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Uuid.php',
        'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php',
        'Ramsey\\Uuid\\Nonstandard\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidV6.php',
        'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php',
        'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php',
        'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
        'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
        'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php',
        'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
        'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php',
        'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
        'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
        'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
        'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
        'Ramsey\\Uuid\\Rfc4122\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Fields.php',
        'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php',
        'Ramsey\\Uuid\\Rfc4122\\MaxTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxTrait.php',
        'Ramsey\\Uuid\\Rfc4122\\MaxUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxUuid.php',
        'Ramsey\\Uuid\\Rfc4122\\NilTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilTrait.php',
        'Ramsey\\Uuid\\Rfc4122\\NilUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilUuid.php',
        'Ramsey\\Uuid\\Rfc4122\\TimeTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/TimeTrait.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidInterface.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV1' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV1.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV2' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV2.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV3' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV3.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV4' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV4.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV5' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV5.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV6.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV7' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV7.php',
        'Ramsey\\Uuid\\Rfc4122\\UuidV8' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV8.php',
        'Ramsey\\Uuid\\Rfc4122\\Validator' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Validator.php',
        'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VariantTrait.php',
        'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VersionTrait.php',
        'Ramsey\\Uuid\\Type\\Decimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Decimal.php',
        'Ramsey\\Uuid\\Type\\Hexadecimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Hexadecimal.php',
        'Ramsey\\Uuid\\Type\\Integer' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Integer.php',
        'Ramsey\\Uuid\\Type\\NumberInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/NumberInterface.php',
        'Ramsey\\Uuid\\Type\\Time' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Time.php',
        'Ramsey\\Uuid\\Type\\TypeInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/TypeInterface.php',
        'Ramsey\\Uuid\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Uuid.php',
        'Ramsey\\Uuid\\UuidFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactory.php',
        'Ramsey\\Uuid\\UuidFactoryInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactoryInterface.php',
        'Ramsey\\Uuid\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidInterface.php',
        'Ramsey\\Uuid\\Validator\\GenericValidator' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/GenericValidator.php',
        'Ramsey\\Uuid\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/ValidatorInterface.php',
        'Ratchet\\Client\\Connector' => __DIR__ . '/..' . '/ratchet/pawl/src/Connector.php',
        'Ratchet\\Client\\WebSocket' => __DIR__ . '/..' . '/ratchet/pawl/src/WebSocket.php',
        'Ratchet\\RFC6455\\Handshake\\ClientNegotiator' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/ClientNegotiator.php',
        'Ratchet\\RFC6455\\Handshake\\InvalidPermessageDeflateOptionsException' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/InvalidPermessageDeflateOptionsException.php',
        'Ratchet\\RFC6455\\Handshake\\NegotiatorInterface' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/NegotiatorInterface.php',
        'Ratchet\\RFC6455\\Handshake\\PermessageDeflateOptions' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/PermessageDeflateOptions.php',
        'Ratchet\\RFC6455\\Handshake\\RequestVerifier' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/RequestVerifier.php',
        'Ratchet\\RFC6455\\Handshake\\ResponseVerifier' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/ResponseVerifier.php',
        'Ratchet\\RFC6455\\Handshake\\ServerNegotiator' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Handshake/ServerNegotiator.php',
        'Ratchet\\RFC6455\\Messaging\\CloseFrameChecker' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/CloseFrameChecker.php',
        'Ratchet\\RFC6455\\Messaging\\DataInterface' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/DataInterface.php',
        'Ratchet\\RFC6455\\Messaging\\Frame' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/Frame.php',
        'Ratchet\\RFC6455\\Messaging\\FrameInterface' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/FrameInterface.php',
        'Ratchet\\RFC6455\\Messaging\\Message' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/Message.php',
        'Ratchet\\RFC6455\\Messaging\\MessageBuffer' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/MessageBuffer.php',
        'Ratchet\\RFC6455\\Messaging\\MessageInterface' => __DIR__ . '/..' . '/ratchet/rfc6455/src/Messaging/MessageInterface.php',
        'React\\Cache\\ArrayCache' => __DIR__ . '/..' . '/react/cache/src/ArrayCache.php',
        'React\\Cache\\CacheInterface' => __DIR__ . '/..' . '/react/cache/src/CacheInterface.php',
        'React\\Dns\\BadServerException' => __DIR__ . '/..' . '/react/dns/src/BadServerException.php',
        'React\\Dns\\Config\\Config' => __DIR__ . '/..' . '/react/dns/src/Config/Config.php',
        'React\\Dns\\Config\\HostsFile' => __DIR__ . '/..' . '/react/dns/src/Config/HostsFile.php',
        'React\\Dns\\Model\\Message' => __DIR__ . '/..' . '/react/dns/src/Model/Message.php',
        'React\\Dns\\Model\\Record' => __DIR__ . '/..' . '/react/dns/src/Model/Record.php',
        'React\\Dns\\Protocol\\BinaryDumper' => __DIR__ . '/..' . '/react/dns/src/Protocol/BinaryDumper.php',
        'React\\Dns\\Protocol\\Parser' => __DIR__ . '/..' . '/react/dns/src/Protocol/Parser.php',
        'React\\Dns\\Query\\CachingExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CachingExecutor.php',
        'React\\Dns\\Query\\CancellationException' => __DIR__ . '/..' . '/react/dns/src/Query/CancellationException.php',
        'React\\Dns\\Query\\CoopExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/CoopExecutor.php',
        'React\\Dns\\Query\\ExecutorInterface' => __DIR__ . '/..' . '/react/dns/src/Query/ExecutorInterface.php',
        'React\\Dns\\Query\\FallbackExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/FallbackExecutor.php',
        'React\\Dns\\Query\\HostsFileExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/HostsFileExecutor.php',
        'React\\Dns\\Query\\Query' => __DIR__ . '/..' . '/react/dns/src/Query/Query.php',
        'React\\Dns\\Query\\RetryExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/RetryExecutor.php',
        'React\\Dns\\Query\\SelectiveTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/SelectiveTransportExecutor.php',
        'React\\Dns\\Query\\TcpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TcpTransportExecutor.php',
        'React\\Dns\\Query\\TimeoutException' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutException.php',
        'React\\Dns\\Query\\TimeoutExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/TimeoutExecutor.php',
        'React\\Dns\\Query\\UdpTransportExecutor' => __DIR__ . '/..' . '/react/dns/src/Query/UdpTransportExecutor.php',
        'React\\Dns\\RecordNotFoundException' => __DIR__ . '/..' . '/react/dns/src/RecordNotFoundException.php',
        'React\\Dns\\Resolver\\Factory' => __DIR__ . '/..' . '/react/dns/src/Resolver/Factory.php',
        'React\\Dns\\Resolver\\Resolver' => __DIR__ . '/..' . '/react/dns/src/Resolver/Resolver.php',
        'React\\Dns\\Resolver\\ResolverInterface' => __DIR__ . '/..' . '/react/dns/src/Resolver/ResolverInterface.php',
        'React\\EventLoop\\ExtEvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEvLoop.php',
        'React\\EventLoop\\ExtEventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtEventLoop.php',
        'React\\EventLoop\\ExtLibevLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibevLoop.php',
        'React\\EventLoop\\ExtLibeventLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtLibeventLoop.php',
        'React\\EventLoop\\ExtUvLoop' => __DIR__ . '/..' . '/react/event-loop/src/ExtUvLoop.php',
        'React\\EventLoop\\Factory' => __DIR__ . '/..' . '/react/event-loop/src/Factory.php',
        'React\\EventLoop\\Loop' => __DIR__ . '/..' . '/react/event-loop/src/Loop.php',
        'React\\EventLoop\\LoopInterface' => __DIR__ . '/..' . '/react/event-loop/src/LoopInterface.php',
        'React\\EventLoop\\SignalsHandler' => __DIR__ . '/..' . '/react/event-loop/src/SignalsHandler.php',
        'React\\EventLoop\\StreamSelectLoop' => __DIR__ . '/..' . '/react/event-loop/src/StreamSelectLoop.php',
        'React\\EventLoop\\Tick\\FutureTickQueue' => __DIR__ . '/..' . '/react/event-loop/src/Tick/FutureTickQueue.php',
        'React\\EventLoop\\TimerInterface' => __DIR__ . '/..' . '/react/event-loop/src/TimerInterface.php',
        'React\\EventLoop\\Timer\\Timer' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timer.php',
        'React\\EventLoop\\Timer\\Timers' => __DIR__ . '/..' . '/react/event-loop/src/Timer/Timers.php',
        'React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php',
        'React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php',
        'React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php',
        'React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php',
        'React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php',
        'React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php',
        'React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php',
        'React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php',
        'React\\Socket\\Connection' => __DIR__ . '/..' . '/react/socket/src/Connection.php',
        'React\\Socket\\ConnectionInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectionInterface.php',
        'React\\Socket\\Connector' => __DIR__ . '/..' . '/react/socket/src/Connector.php',
        'React\\Socket\\ConnectorInterface' => __DIR__ . '/..' . '/react/socket/src/ConnectorInterface.php',
        'React\\Socket\\DnsConnector' => __DIR__ . '/..' . '/react/socket/src/DnsConnector.php',
        'React\\Socket\\FdServer' => __DIR__ . '/..' . '/react/socket/src/FdServer.php',
        'React\\Socket\\FixedUriConnector' => __DIR__ . '/..' . '/react/socket/src/FixedUriConnector.php',
        'React\\Socket\\HappyEyeBallsConnectionBuilder' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnectionBuilder.php',
        'React\\Socket\\HappyEyeBallsConnector' => __DIR__ . '/..' . '/react/socket/src/HappyEyeBallsConnector.php',
        'React\\Socket\\LimitingServer' => __DIR__ . '/..' . '/react/socket/src/LimitingServer.php',
        'React\\Socket\\SecureConnector' => __DIR__ . '/..' . '/react/socket/src/SecureConnector.php',
        'React\\Socket\\SecureServer' => __DIR__ . '/..' . '/react/socket/src/SecureServer.php',
        'React\\Socket\\Server' => __DIR__ . '/..' . '/react/socket/src/Server.php',
        'React\\Socket\\ServerInterface' => __DIR__ . '/..' . '/react/socket/src/ServerInterface.php',
        'React\\Socket\\SocketServer' => __DIR__ . '/..' . '/react/socket/src/SocketServer.php',
        'React\\Socket\\StreamEncryption' => __DIR__ . '/..' . '/react/socket/src/StreamEncryption.php',
        'React\\Socket\\TcpConnector' => __DIR__ . '/..' . '/react/socket/src/TcpConnector.php',
        'React\\Socket\\TcpServer' => __DIR__ . '/..' . '/react/socket/src/TcpServer.php',
        'React\\Socket\\TimeoutConnector' => __DIR__ . '/..' . '/react/socket/src/TimeoutConnector.php',
        'React\\Socket\\UnixConnector' => __DIR__ . '/..' . '/react/socket/src/UnixConnector.php',
        'React\\Socket\\UnixServer' => __DIR__ . '/..' . '/react/socket/src/UnixServer.php',
        'React\\Stream\\CompositeStream' => __DIR__ . '/..' . '/react/stream/src/CompositeStream.php',
        'React\\Stream\\DuplexResourceStream' => __DIR__ . '/..' . '/react/stream/src/DuplexResourceStream.php',
        'React\\Stream\\DuplexStreamInterface' => __DIR__ . '/..' . '/react/stream/src/DuplexStreamInterface.php',
        'React\\Stream\\ReadableResourceStream' => __DIR__ . '/..' . '/react/stream/src/ReadableResourceStream.php',
        'React\\Stream\\ReadableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/ReadableStreamInterface.php',
        'React\\Stream\\ThroughStream' => __DIR__ . '/..' . '/react/stream/src/ThroughStream.php',
        'React\\Stream\\Util' => __DIR__ . '/..' . '/react/stream/src/Util.php',
        'React\\Stream\\WritableResourceStream' => __DIR__ . '/..' . '/react/stream/src/WritableResourceStream.php',
        'React\\Stream\\WritableStreamInterface' => __DIR__ . '/..' . '/react/stream/src/WritableStreamInterface.php',
        'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php',
        'Safe\\DateTime' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTime.php',
        'Safe\\DateTimeImmutable' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
        'Safe\\Exceptions\\ApacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
        'Safe\\Exceptions\\ApcuException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
        'Safe\\Exceptions\\ArrayException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
        'Safe\\Exceptions\\Bzip2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
        'Safe\\Exceptions\\CalendarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
        'Safe\\Exceptions\\ClassobjException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
        'Safe\\Exceptions\\ComException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
        'Safe\\Exceptions\\CubridException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
        'Safe\\Exceptions\\CurlException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
        'Safe\\Exceptions\\DatetimeException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
        'Safe\\Exceptions\\DirException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
        'Safe\\Exceptions\\EioException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
        'Safe\\Exceptions\\ErrorfuncException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
        'Safe\\Exceptions\\ExecException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
        'Safe\\Exceptions\\FileinfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
        'Safe\\Exceptions\\FilesystemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
        'Safe\\Exceptions\\FilterException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
        'Safe\\Exceptions\\FpmException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
        'Safe\\Exceptions\\FtpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
        'Safe\\Exceptions\\FunchandException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
        'Safe\\Exceptions\\GettextException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GettextException.php',
        'Safe\\Exceptions\\GmpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
        'Safe\\Exceptions\\GnupgException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
        'Safe\\Exceptions\\HashException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
        'Safe\\Exceptions\\IbaseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
        'Safe\\Exceptions\\IbmDb2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
        'Safe\\Exceptions\\IconvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
        'Safe\\Exceptions\\ImageException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
        'Safe\\Exceptions\\ImapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
        'Safe\\Exceptions\\InfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
        'Safe\\Exceptions\\InotifyException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
        'Safe\\Exceptions\\JsonException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
        'Safe\\Exceptions\\LdapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
        'Safe\\Exceptions\\LibxmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
        'Safe\\Exceptions\\LzfException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
        'Safe\\Exceptions\\MailparseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
        'Safe\\Exceptions\\MbstringException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
        'Safe\\Exceptions\\MiscException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
        'Safe\\Exceptions\\MysqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
        'Safe\\Exceptions\\MysqliException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqliException.php',
        'Safe\\Exceptions\\NetworkException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
        'Safe\\Exceptions\\Oci8Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
        'Safe\\Exceptions\\OpcacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
        'Safe\\Exceptions\\OpensslException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
        'Safe\\Exceptions\\OutcontrolException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
        'Safe\\Exceptions\\PcntlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
        'Safe\\Exceptions\\PcreException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
        'Safe\\Exceptions\\PgsqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
        'Safe\\Exceptions\\PosixException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
        'Safe\\Exceptions\\PsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
        'Safe\\Exceptions\\PspellException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
        'Safe\\Exceptions\\ReadlineException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
        'Safe\\Exceptions\\RnpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RnpException.php',
        'Safe\\Exceptions\\RpminfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
        'Safe\\Exceptions\\RrdException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
        'Safe\\Exceptions\\SafeExceptionInterface' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
        'Safe\\Exceptions\\SemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
        'Safe\\Exceptions\\SessionException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
        'Safe\\Exceptions\\ShmopException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
        'Safe\\Exceptions\\SimplexmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php',
        'Safe\\Exceptions\\SocketsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
        'Safe\\Exceptions\\SodiumException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
        'Safe\\Exceptions\\SolrException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
        'Safe\\Exceptions\\SplException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
        'Safe\\Exceptions\\SqlsrvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
        'Safe\\Exceptions\\SsdeepException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
        'Safe\\Exceptions\\Ssh2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
        'Safe\\Exceptions\\StreamException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
        'Safe\\Exceptions\\StringsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
        'Safe\\Exceptions\\SwooleException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
        'Safe\\Exceptions\\UodbcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
        'Safe\\Exceptions\\UopzException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
        'Safe\\Exceptions\\UrlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
        'Safe\\Exceptions\\VarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
        'Safe\\Exceptions\\XdiffException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
        'Safe\\Exceptions\\XmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
        'Safe\\Exceptions\\XmlrpcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
        'Safe\\Exceptions\\YamlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
        'Safe\\Exceptions\\YazException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
        'Safe\\Exceptions\\ZipException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
        'Safe\\Exceptions\\ZlibException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
        'SelfUpdate\\SelfUpdateCommand' => __DIR__ . '/..' . '/consolidation/self-update/src/SelfUpdateCommand.php',
        'SelfUpdate\\SelfUpdateManager' => __DIR__ . '/..' . '/consolidation/self-update/src/SelfUpdateManager.php',
        'Stringable' => __DIR__ . '/..' . '/marc-mabe/php-enum/stubs/Stringable.php',
        'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php',
        'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => __DIR__ . '/..' . '/symfony/cache/Adapter/ParameterNormalizer.php',
        'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/Psr16Adapter.php',
        'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
        'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php',
        'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
        'Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php',
        'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php',
        'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php',
        'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
        'Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php',
        'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php',
        'Symfony\\Component\\Cache\\LockRegistry' => __DIR__ . '/..' . '/symfony/cache/LockRegistry.php',
        'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DefaultMarshaller.php',
        'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DeflateMarshaller.php',
        'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => __DIR__ . '/..' . '/symfony/cache/Marshaller/MarshallerInterface.php',
        'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/SodiumMarshaller.php',
        'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
        'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
        'Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php',
        'Symfony\\Component\\Cache\\Psr16Cache' => __DIR__ . '/..' . '/symfony/cache/Psr16Cache.php',
        'Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php',
        'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractAdapterTrait.php',
        'Symfony\\Component\\Cache\\Traits\\CachedValueInterface' => __DIR__ . '/..' . '/symfony/cache/Traits/CachedValueInterface.php',
        'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ContractsTrait.php',
        'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php',
        'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php',
        'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Redis5Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis5Proxy.php',
        'Symfony\\Component\\Cache\\Traits\\Redis6Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis6Proxy.php',
        'Symfony\\Component\\Cache\\Traits\\Redis6ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis6ProxyTrait.php',
        'Symfony\\Component\\Cache\\Traits\\RedisCluster5Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster5Proxy.php',
        'Symfony\\Component\\Cache\\Traits\\RedisCluster6Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster6Proxy.php',
        'Symfony\\Component\\Cache\\Traits\\RedisCluster6ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster6ProxyTrait.php',
        'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
        'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterProxy.php',
        'Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php',
        'Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php',
        'Symfony\\Component\\Cache\\Traits\\RelayProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxy.php',
        'Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxyTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\BgsaveTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/BgsaveTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/CopyTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\FtTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/FtTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GeosearchTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\GetWithMetaTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GetWithMetaTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GetrangeTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/HsetTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\IsTrackedTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/IsTrackedTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/MoveTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/NullableReturnTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/PfcountTrait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\Relay11Trait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/Relay11Trait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\Relay121Trait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/Relay121Trait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\Relay12Trait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/Relay12Trait.php',
        'Symfony\\Component\\Cache\\Traits\\Relay\\SwapdbTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/SwapdbTrait.php',
        'Symfony\\Component\\Config\\Builder\\ClassBuilder' => __DIR__ . '/..' . '/symfony/config/Builder/ClassBuilder.php',
        'Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGenerator.php',
        'Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php',
        'Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderInterface.php',
        'Symfony\\Component\\Config\\Builder\\Method' => __DIR__ . '/..' . '/symfony/config/Builder/Method.php',
        'Symfony\\Component\\Config\\Builder\\Property' => __DIR__ . '/..' . '/symfony/config/Builder/Property.php',
        'Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php',
        'Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php',
        'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php',
        'Symfony\\Component\\Config\\ConfigCacheInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheInterface.php',
        'Symfony\\Component\\Config\\Definition\\ArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/ArrayNode.php',
        'Symfony\\Component\\Config\\Definition\\BaseNode' => __DIR__ . '/..' . '/symfony/config/Definition/BaseNode.php',
        'Symfony\\Component\\Config\\Definition\\BooleanNode' => __DIR__ . '/..' . '/symfony/config/Definition/BooleanNode.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ExprBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/MergeBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeParentInterface.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NormalizationBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NumericNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/TreeBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ValidationBuilder.php',
        'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/VariableNodeDefinition.php',
        'Symfony\\Component\\Config\\Definition\\ConfigurableInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurableInterface.php',
        'Symfony\\Component\\Config\\Definition\\Configuration' => __DIR__ . '/..' . '/symfony/config/Definition/Configuration.php',
        'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurationInterface.php',
        'Symfony\\Component\\Config\\Definition\\Configurator\\DefinitionConfigurator' => __DIR__ . '/..' . '/symfony/config/Definition/Configurator/DefinitionConfigurator.php',
        'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php',
        'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php',
        'Symfony\\Component\\Config\\Definition\\EnumNode' => __DIR__ . '/..' . '/symfony/config/Definition/EnumNode.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/DuplicateKeyException.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/Exception.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidConfigurationException.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidDefinitionException.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidTypeException.php',
        'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/UnsetKeyException.php',
        'Symfony\\Component\\Config\\Definition\\FloatNode' => __DIR__ . '/..' . '/symfony/config/Definition/FloatNode.php',
        'Symfony\\Component\\Config\\Definition\\IntegerNode' => __DIR__ . '/..' . '/symfony/config/Definition/IntegerNode.php',
        'Symfony\\Component\\Config\\Definition\\Loader\\DefinitionFileLoader' => __DIR__ . '/..' . '/symfony/config/Definition/Loader/DefinitionFileLoader.php',
        'Symfony\\Component\\Config\\Definition\\NodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/NodeInterface.php',
        'Symfony\\Component\\Config\\Definition\\NumericNode' => __DIR__ . '/..' . '/symfony/config/Definition/NumericNode.php',
        'Symfony\\Component\\Config\\Definition\\Processor' => __DIR__ . '/..' . '/symfony/config/Definition/Processor.php',
        'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypeNodeInterface.php',
        'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypedArrayNode.php',
        'Symfony\\Component\\Config\\Definition\\ScalarNode' => __DIR__ . '/..' . '/symfony/config/Definition/ScalarNode.php',
        'Symfony\\Component\\Config\\Definition\\VariableNode' => __DIR__ . '/..' . '/symfony/config/Definition/VariableNode.php',
        'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
        'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
        'Symfony\\Component\\Config\\Exception\\LoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/LoaderLoadException.php',
        'Symfony\\Component\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/config/FileLocator.php',
        'Symfony\\Component\\Config\\FileLocatorInterface' => __DIR__ . '/..' . '/symfony/config/FileLocatorInterface.php',
        'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/config/Loader/DelegatingLoader.php',
        'Symfony\\Component\\Config\\Loader\\DirectoryAwareLoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/DirectoryAwareLoaderInterface.php',
        'Symfony\\Component\\Config\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/FileLoader.php',
        'Symfony\\Component\\Config\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/GlobFileLoader.php',
        'Symfony\\Component\\Config\\Loader\\Loader' => __DIR__ . '/..' . '/symfony/config/Loader/Loader.php',
        'Symfony\\Component\\Config\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderInterface.php',
        'Symfony\\Component\\Config\\Loader\\LoaderResolver' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolver.php',
        'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolverInterface.php',
        'Symfony\\Component\\Config\\Loader\\ParamConfigurator' => __DIR__ . '/..' . '/symfony/config/Loader/ParamConfigurator.php',
        'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCache.php',
        'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
        'Symfony\\Component\\Config\\ResourceCheckerInterface' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerInterface.php',
        'Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/ClassExistenceResource.php',
        'Symfony\\Component\\Config\\Resource\\ComposerResource' => __DIR__ . '/..' . '/symfony/config/Resource/ComposerResource.php',
        'Symfony\\Component\\Config\\Resource\\DirectoryResource' => __DIR__ . '/..' . '/symfony/config/Resource/DirectoryResource.php',
        'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileExistenceResource.php',
        'Symfony\\Component\\Config\\Resource\\FileResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileResource.php',
        'Symfony\\Component\\Config\\Resource\\GlobResource' => __DIR__ . '/..' . '/symfony/config/Resource/GlobResource.php',
        'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php',
        'Symfony\\Component\\Config\\Resource\\ResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/ResourceInterface.php',
        'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceChecker.php',
        'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceInterface.php',
        'Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/InvalidXmlException.php',
        'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/XmlParsingException.php',
        'Symfony\\Component\\Config\\Util\\XmlUtils' => __DIR__ . '/..' . '/symfony/config/Util/XmlUtils.php',
        'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
        'Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php',
        'Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php',
        'Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php',
        'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
        'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
        'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
        'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
        'Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php',
        'Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php',
        'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
        'Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php',
        'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
        'Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',
        'Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php',
        'Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php',
        'Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php',
        'Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php',
        'Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php',
        'Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php',
        'Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php',
        'Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php',
        'Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php',
        'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',
        'Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php',
        'Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php',
        'Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php',
        'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
        'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',
        'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',
        'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php',
        'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php',
        'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php',
        'Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php',
        'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php',
        'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php',
        'Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php',
        'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',
        'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',
        'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',
        'Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php',
        'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',
        'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',
        'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',
        'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',
        'Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php',
        'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php',
        'Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php',
        'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',
        'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php',
        'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php',
        'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',
        'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',
        'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',
        'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
        'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
        'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',
        'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',
        'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',
        'Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php',
        'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',
        'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',
        'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',
        'Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php',
        'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php',
        'Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php',
        'Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php',
        'Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php',
        'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php',
        'Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php',
        'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',
        'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',
        'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',
        'Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php',
        'Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php',
        'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',
        'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',
        'Symfony\\Component\\Console\\Helper\\TerminalInputHelper' => __DIR__ . '/..' . '/symfony/console/Helper/TerminalInputHelper.php',
        'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',
        'Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php',
        'Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php',
        'Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php',
        'Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php',
        'Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php',
        'Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php',
        'Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php',
        'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php',
        'Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php',
        'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php',
        'Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php',
        'Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php',
        'Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php',
        'Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php',
        'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',
        'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',
        'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',
        'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php',
        'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',
        'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',
        'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',
        'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',
        'Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php',
        'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',
        'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',
        'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',
        'Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php',
        'Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php',
        'Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php',
        'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',
        'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',
        'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',
        'Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',
        'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',
        'Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php',
        'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',
        'Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',
        'Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php',
        'Symfony\\Component\\DependencyInjection\\Alias' => __DIR__ . '/..' . '/symfony/dependency-injection/Alias.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/AbstractArgument.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ArgumentInterface.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/BoundArgument.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/IteratorArgument.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\LazyClosure' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/LazyClosure.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/RewindableGenerator.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocator.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php',
        'Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AsAlias' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsAlias.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AsDecorator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsDecorator.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsTaggedItem.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Autoconfigure.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\Autowire' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Autowire.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireCallable' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireCallable.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireDecorated.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireIterator.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireLocator.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireServiceClosure' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireServiceClosure.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\Exclude' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Exclude.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/MapDecorated.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedIterator.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedLocator.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\Target' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Target.php',
        'Symfony\\Component\\DependencyInjection\\Attribute\\When' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/When.php',
        'Symfony\\Component\\DependencyInjection\\ChildDefinition' => __DIR__ . '/..' . '/symfony/dependency-injection/ChildDefinition.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireAsDecoratorPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowirePass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/Compiler.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PassConfig.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveBuildParametersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveClassPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveServiceSubscribersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveTaggedIteratorArgumentPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceLocatorTagPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php',
        'Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php',
        'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResource.php',
        'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php',
        'Symfony\\Component\\DependencyInjection\\Container' => __DIR__ . '/..' . '/symfony/dependency-injection/Container.php',
        'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerAwareInterface.php',
        'Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerAwareTrait.php',
        'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerBuilder.php',
        'Symfony\\Component\\DependencyInjection\\ContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerInterface.php',
        'Symfony\\Component\\DependencyInjection\\Definition' => __DIR__ . '/..' . '/symfony/dependency-injection/Definition.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Dumper.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/DumperInterface.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/GraphvizDumper.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/PhpDumper.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Preloader.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/XmlDumper.php',
        'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/YamlDumper.php',
        'Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarLoaderInterface.php',
        'Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessor.php',
        'Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessorInterface.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/AutowiringFailedException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/BadMethodCallException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/EnvNotFoundException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/EnvParameterException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ExceptionInterface.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/LogicException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/OutOfBoundsException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ParameterNotFoundException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/RuntimeException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php',
        'Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ServiceNotFoundException.php',
        'Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => __DIR__ . '/..' . '/symfony/dependency-injection/ExpressionLanguage.php',
        'Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/dependency-injection/ExpressionLanguageProvider.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/AbstractExtension.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurableExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\Extension' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/Extension.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ExtensionInterface.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ExtensionTrait.php',
        'Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/PrependExtensionInterface.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\LazyServiceInstantiator' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\LazyServiceDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php',
        'Symfony\\Component\\DependencyInjection\\LazyProxy\\ProxyHelper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/ProxyHelper.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/ClosureLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\FromCallableConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\PrototypeConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ReferenceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServicesConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AbstractTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ArgumentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutoconfigureTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutowireTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\BindTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\CallTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ClassTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConfiguratorTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConstructorTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DecorateTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DeprecateTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FactoryTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FileTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FromCallableTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\LazyTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ParentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PropertyTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PublicTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ShareTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\SyntheticTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\TagTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\DirectoryLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/DirectoryLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/FileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/GlobFileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/IniFileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/PhpFileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/XmlFileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/YamlFileLoader.php',
        'Symfony\\Component\\DependencyInjection\\Parameter' => __DIR__ . '/..' . '/symfony/dependency-injection/Parameter.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBag.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBag.php',
        'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
        'Symfony\\Component\\DependencyInjection\\Reference' => __DIR__ . '/..' . '/symfony/dependency-injection/Reference.php',
        'Symfony\\Component\\DependencyInjection\\ReverseContainer' => __DIR__ . '/..' . '/symfony/dependency-injection/ReverseContainer.php',
        'Symfony\\Component\\DependencyInjection\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/ServiceLocator.php',
        'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/TaggedContainerInterface.php',
        'Symfony\\Component\\DependencyInjection\\TypedReference' => __DIR__ . '/..' . '/symfony/dependency-injection/TypedReference.php',
        'Symfony\\Component\\DependencyInjection\\Variable' => __DIR__ . '/..' . '/symfony/dependency-injection/Variable.php',
        'Symfony\\Component\\Dotenv\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/dotenv/Command/DebugCommand.php',
        'Symfony\\Component\\Dotenv\\Command\\DotenvDumpCommand' => __DIR__ . '/..' . '/symfony/dotenv/Command/DotenvDumpCommand.php',
        'Symfony\\Component\\Dotenv\\Dotenv' => __DIR__ . '/..' . '/symfony/dotenv/Dotenv.php',
        'Symfony\\Component\\Dotenv\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/dotenv/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Dotenv\\Exception\\FormatException' => __DIR__ . '/..' . '/symfony/dotenv/Exception/FormatException.php',
        'Symfony\\Component\\Dotenv\\Exception\\FormatExceptionContext' => __DIR__ . '/..' . '/symfony/dotenv/Exception/FormatExceptionContext.php',
        'Symfony\\Component\\Dotenv\\Exception\\PathException' => __DIR__ . '/..' . '/symfony/dotenv/Exception/PathException.php',
        'Symfony\\Component\\ErrorHandler\\BufferingLogger' => __DIR__ . '/..' . '/symfony/error-handler/BufferingLogger.php',
        'Symfony\\Component\\ErrorHandler\\Command\\ErrorDumpCommand' => __DIR__ . '/..' . '/symfony/error-handler/Command/ErrorDumpCommand.php',
        'Symfony\\Component\\ErrorHandler\\Debug' => __DIR__ . '/..' . '/symfony/error-handler/Debug.php',
        'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/error-handler/DebugClassLoader.php',
        'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php',
        'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php',
        'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php',
        'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php',
        'Symfony\\Component\\ErrorHandler\\ErrorHandler' => __DIR__ . '/..' . '/symfony/error-handler/ErrorHandler.php',
        'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php',
        'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php',
        'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php',
        'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php',
        'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php',
        'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => __DIR__ . '/..' . '/symfony/error-handler/Error/ClassNotFoundError.php',
        'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => __DIR__ . '/..' . '/symfony/error-handler/Error/FatalError.php',
        'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => __DIR__ . '/..' . '/symfony/error-handler/Error/OutOfMemoryError.php',
        'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedFunctionError.php',
        'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedMethodError.php',
        'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/error-handler/Exception/FlattenException.php',
        'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/error-handler/Exception/SilencedErrorContext.php',
        'Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => __DIR__ . '/..' . '/symfony/error-handler/Internal/TentativeTypes.php',
        'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => __DIR__ . '/..' . '/symfony/error-handler/ThrowableUtils.php',
        'Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Attribute/AsEventListener.php',
        'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php',
        'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php',
        'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php',
        'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php',
        'Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php',
        'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php',
        'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php',
        'Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php',
        'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php',
        'Symfony\\Component\\ExpressionLanguage\\Compiler' => __DIR__ . '/..' . '/symfony/expression-language/Compiler.php',
        'Symfony\\Component\\ExpressionLanguage\\Expression' => __DIR__ . '/..' . '/symfony/expression-language/Expression.php',
        'Symfony\\Component\\ExpressionLanguage\\ExpressionFunction' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionFunction.php',
        'Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionFunctionProviderInterface.php',
        'Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage' => __DIR__ . '/..' . '/symfony/expression-language/ExpressionLanguage.php',
        'Symfony\\Component\\ExpressionLanguage\\Lexer' => __DIR__ . '/..' . '/symfony/expression-language/Lexer.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\ArgumentsNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ArgumentsNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\ArrayNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ArrayNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\BinaryNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/BinaryNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\ConditionalNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ConditionalNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\ConstantNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/ConstantNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\FunctionNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/FunctionNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\GetAttrNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/GetAttrNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\NameNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/NameNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\Node' => __DIR__ . '/..' . '/symfony/expression-language/Node/Node.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\NullCoalesceNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/NullCoalesceNode.php',
        'Symfony\\Component\\ExpressionLanguage\\Node\\UnaryNode' => __DIR__ . '/..' . '/symfony/expression-language/Node/UnaryNode.php',
        'Symfony\\Component\\ExpressionLanguage\\ParsedExpression' => __DIR__ . '/..' . '/symfony/expression-language/ParsedExpression.php',
        'Symfony\\Component\\ExpressionLanguage\\Parser' => __DIR__ . '/..' . '/symfony/expression-language/Parser.php',
        'Symfony\\Component\\ExpressionLanguage\\SerializedParsedExpression' => __DIR__ . '/..' . '/symfony/expression-language/SerializedParsedExpression.php',
        'Symfony\\Component\\ExpressionLanguage\\SyntaxError' => __DIR__ . '/..' . '/symfony/expression-language/SyntaxError.php',
        'Symfony\\Component\\ExpressionLanguage\\Token' => __DIR__ . '/..' . '/symfony/expression-language/Token.php',
        'Symfony\\Component\\ExpressionLanguage\\TokenStream' => __DIR__ . '/..' . '/symfony/expression-language/TokenStream.php',
        'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php',
        'Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php',
        'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php',
        'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php',
        'Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php',
        'Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php',
        'Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php',
        'Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php',
        'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php',
        'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php',
        'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php',
        'Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php',
        'Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php',
        'Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php',
        'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php',
        'Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php',
        'Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php',
        'Symfony\\Component\\HttpFoundation\\AcceptHeader' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeader.php',
        'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeaderItem.php',
        'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => __DIR__ . '/..' . '/symfony/http-foundation/BinaryFileResponse.php',
        'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ChainRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\Cookie' => __DIR__ . '/..' . '/symfony/http-foundation/Cookie.php',
        'Symfony\\Component\\HttpFoundation\\EventStreamResponse' => __DIR__ . '/..' . '/symfony/http-foundation/EventStreamResponse.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/BadRequestException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ExceptionInterface.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\ExpiredSignedUriException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ExpiredSignedUriException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/JsonException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/LogicException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SessionNotFoundException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\SignedUriException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SignedUriException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/UnexpectedValueException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\UnsignedUriException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/UnsignedUriException.php',
        'Symfony\\Component\\HttpFoundation\\Exception\\UnverifiedSignedUriException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/UnverifiedSignedUriException.php',
        'Symfony\\Component\\HttpFoundation\\FileBag' => __DIR__ . '/..' . '/symfony/http-foundation/FileBag.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/PartialFileException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
        'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UploadException.php',
        'Symfony\\Component\\HttpFoundation\\File\\File' => __DIR__ . '/..' . '/symfony/http-foundation/File/File.php',
        'Symfony\\Component\\HttpFoundation\\File\\Stream' => __DIR__ . '/..' . '/symfony/http-foundation/File/Stream.php',
        'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => __DIR__ . '/..' . '/symfony/http-foundation/File/UploadedFile.php',
        'Symfony\\Component\\HttpFoundation\\HeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderBag.php',
        'Symfony\\Component\\HttpFoundation\\HeaderUtils' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderUtils.php',
        'Symfony\\Component\\HttpFoundation\\InputBag' => __DIR__ . '/..' . '/symfony/http-foundation/InputBag.php',
        'Symfony\\Component\\HttpFoundation\\IpUtils' => __DIR__ . '/..' . '/symfony/http-foundation/IpUtils.php',
        'Symfony\\Component\\HttpFoundation\\JsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/JsonResponse.php',
        'Symfony\\Component\\HttpFoundation\\ParameterBag' => __DIR__ . '/..' . '/symfony/http-foundation/ParameterBag.php',
        'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
        'Symfony\\Component\\HttpFoundation\\RateLimiter\\PeekableRequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php',
        'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
        'Symfony\\Component\\HttpFoundation\\RedirectResponse' => __DIR__ . '/..' . '/symfony/http-foundation/RedirectResponse.php',
        'Symfony\\Component\\HttpFoundation\\Request' => __DIR__ . '/..' . '/symfony/http-foundation/Request.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcherInterface.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\AttributesRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\HeaderRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\HostRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\IpsRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\IsJsonRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\MethodRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\PathRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\PortRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\QueryParameterRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestMatcher\\SchemeRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php',
        'Symfony\\Component\\HttpFoundation\\RequestStack' => __DIR__ . '/..' . '/symfony/http-foundation/RequestStack.php',
        'Symfony\\Component\\HttpFoundation\\Response' => __DIR__ . '/..' . '/symfony/http-foundation/Response.php',
        'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/ResponseHeaderBag.php',
        'Symfony\\Component\\HttpFoundation\\ServerBag' => __DIR__ . '/..' . '/symfony/http-foundation/ServerBag.php',
        'Symfony\\Component\\HttpFoundation\\ServerEvent' => __DIR__ . '/..' . '/symfony/http-foundation/ServerEvent.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBag.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\FlashBagAwareSessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBag.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Session' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Session.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactory.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactoryInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php',
        'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
        'Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedJsonResponse.php',
        'Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php',
        'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php',
        'Symfony\\Component\\HttpFoundation\\UriSigner' => __DIR__ . '/..' . '/symfony/http-foundation/UriSigner.php',
        'Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsController.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\AsTargetedValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsTargetedValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\Cache' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/Cache.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\MapDateTime' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapDateTime.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\MapQueryParameter' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapQueryParameter.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\MapQueryString' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapQueryString.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\MapRequestPayload' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapRequestPayload.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\ValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/ValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\WithHttpStatus' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/WithHttpStatus.php',
        'Symfony\\Component\\HttpKernel\\Attribute\\WithLogLevel' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/WithLogLevel.php',
        'Symfony\\Component\\HttpKernel\\Bundle\\AbstractBundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/AbstractBundle.php',
        'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/Bundle.php',
        'Symfony\\Component\\HttpKernel\\Bundle\\BundleExtension' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleExtension.php',
        'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleInterface.php',
        'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php',
        'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php',
        'Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php',
        'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php',
        'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php',
        'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php',
        'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php',
        'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/http-kernel/Config/FileLocator.php',
        'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php',
        'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php',
        'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ContainerControllerResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerReference.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolverInterface.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ErrorController.php',
        'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableControllerResolver.php',
        'Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ValueResolverInterface.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DumpDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/EventDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RequestDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RouterDataCollector.php',
        'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/TimeDataCollector.php',
        'Symfony\\Component\\HttpKernel\\Debug\\ErrorHandlerConfigurator' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/ErrorHandlerConfigurator.php',
        'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/FileLinkFormatter.php',
        'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php',
        'Symfony\\Component\\HttpKernel\\Debug\\VirtualRequestStack' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/VirtualRequestStack.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/Extension.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LoggerPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php',
        'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AbstractSessionListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/CacheAttributeListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DebugHandlersListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DumpListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ErrorListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/FragmentListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleAwareListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ProfilerListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ResponseListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/RouterListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SessionListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/StreamedResponseListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SurrogateListener.php',
        'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ValidateRequestListener.php',
        'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ExceptionEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FinishRequestEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/KernelEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/RequestEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ResponseEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/TerminateEvent.php',
        'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ViewEvent.php',
        'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/BadRequestHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ConflictHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/GoneHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpExceptionInterface.php',
        'Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/InvalidMetadataException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\LockedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LockedHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotFoundHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\ResolverNotFoundException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ResolverNotFoundException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php',
        'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentHandler.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\CacheWasLockedException' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/CacheWasLockedException.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Esi.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/HttpCache.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Ssi.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Store.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/StoreInterface.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SubRequestHandler.php',
        'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SurrogateInterface.php',
        'Symfony\\Component\\HttpKernel\\HttpClientKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpClientKernel.php',
        'Symfony\\Component\\HttpKernel\\HttpKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernel.php',
        'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelBrowser.php',
        'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelInterface.php',
        'Symfony\\Component\\HttpKernel\\Kernel' => __DIR__ . '/..' . '/symfony/http-kernel/Kernel.php',
        'Symfony\\Component\\HttpKernel\\KernelEvents' => __DIR__ . '/..' . '/symfony/http-kernel/KernelEvents.php',
        'Symfony\\Component\\HttpKernel\\KernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/KernelInterface.php',
        'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerConfigurator' => __DIR__ . '/..' . '/symfony/http-kernel/Log/DebugLoggerConfigurator.php',
        'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Log/DebugLoggerInterface.php',
        'Symfony\\Component\\HttpKernel\\Log\\Logger' => __DIR__ . '/..' . '/symfony/http-kernel/Log/Logger.php',
        'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/FileProfilerStorage.php',
        'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profile.php',
        'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profiler.php',
        'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php',
        'Symfony\\Component\\HttpKernel\\RebootableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/RebootableInterface.php',
        'Symfony\\Component\\HttpKernel\\TerminableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/TerminableInterface.php',
        'Symfony\\Component\\HttpKernel\\UriSigner' => __DIR__ . '/..' . '/symfony/http-kernel/UriSigner.php',
        'Symfony\\Component\\OptionsResolver\\Debug\\OptionsResolverIntrospector' => __DIR__ . '/..' . '/symfony/options-resolver/Debug/OptionsResolverIntrospector.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/AccessException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/ExceptionInterface.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\InvalidOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/InvalidOptionsException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\MissingOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/MissingOptionsException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\NoConfigurationException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/NoConfigurationException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\NoSuchOptionException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/NoSuchOptionException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\OptionDefinitionException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/OptionDefinitionException.php',
        'Symfony\\Component\\OptionsResolver\\Exception\\UndefinedOptionsException' => __DIR__ . '/..' . '/symfony/options-resolver/Exception/UndefinedOptionsException.php',
        'Symfony\\Component\\OptionsResolver\\OptionConfigurator' => __DIR__ . '/..' . '/symfony/options-resolver/OptionConfigurator.php',
        'Symfony\\Component\\OptionsResolver\\Options' => __DIR__ . '/..' . '/symfony/options-resolver/Options.php',
        'Symfony\\Component\\OptionsResolver\\OptionsResolver' => __DIR__ . '/..' . '/symfony/options-resolver/OptionsResolver.php',
        'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php',
        'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php',
        'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php',
        'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php',
        'Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php',
        'Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php',
        'Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php',
        'Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php',
        'Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php',
        'Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php',
        'Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php',
        'Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php',
        'Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php',
        'Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php',
        'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php',
        'Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php',
        'Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php',
        'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php',
        'Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php',
        'Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php',
        'Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php',
        'Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php',
        'Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php',
        'Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php',
        'Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php',
        'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php',
        'Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php',
        'Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php',
        'Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php',
        'Symfony\\Component\\String\\Inflector\\SpanishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/SpanishInflector.php',
        'Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php',
        'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php',
        'Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php',
        'Symfony\\Component\\String\\TruncateMode' => __DIR__ . '/..' . '/symfony/string/TruncateMode.php',
        'Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php',
        'Symfony\\Component\\Validator\\Attribute\\HasNamedArguments' => __DIR__ . '/..' . '/symfony/validator/Attribute/HasNamedArguments.php',
        'Symfony\\Component\\Validator\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/validator/Command/DebugCommand.php',
        'Symfony\\Component\\Validator\\Constraint' => __DIR__ . '/..' . '/symfony/validator/Constraint.php',
        'Symfony\\Component\\Validator\\ConstraintValidator' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidator.php',
        'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactory.php',
        'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactoryInterface.php',
        'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorInterface.php',
        'Symfony\\Component\\Validator\\ConstraintViolation' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolation.php',
        'Symfony\\Component\\Validator\\ConstraintViolationInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationInterface.php',
        'Symfony\\Component\\Validator\\ConstraintViolationList' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationList.php',
        'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationListInterface.php',
        'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparison.php',
        'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparisonValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\All' => __DIR__ . '/..' . '/symfony/validator/Constraints/All.php',
        'Symfony\\Component\\Validator\\Constraints\\AllValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AllValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\AtLeastOneOf' => __DIR__ . '/..' . '/symfony/validator/Constraints/AtLeastOneOf.php',
        'Symfony\\Component\\Validator\\Constraints\\AtLeastOneOfValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AtLeastOneOfValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Bic' => __DIR__ . '/..' . '/symfony/validator/Constraints/Bic.php',
        'Symfony\\Component\\Validator\\Constraints\\BicValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BicValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Blank' => __DIR__ . '/..' . '/symfony/validator/Constraints/Blank.php',
        'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BlankValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Callback' => __DIR__ . '/..' . '/symfony/validator/Constraints/Callback.php',
        'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CallbackValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\CardScheme' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardScheme.php',
        'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardSchemeValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Cascade' => __DIR__ . '/..' . '/symfony/validator/Constraints/Cascade.php',
        'Symfony\\Component\\Validator\\Constraints\\Choice' => __DIR__ . '/..' . '/symfony/validator/Constraints/Choice.php',
        'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ChoiceValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Cidr' => __DIR__ . '/..' . '/symfony/validator/Constraints/Cidr.php',
        'Symfony\\Component\\Validator\\Constraints\\CidrValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CidrValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Collection' => __DIR__ . '/..' . '/symfony/validator/Constraints/Collection.php',
        'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CollectionValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Composite' => __DIR__ . '/..' . '/symfony/validator/Constraints/Composite.php',
        'Symfony\\Component\\Validator\\Constraints\\Compound' => __DIR__ . '/..' . '/symfony/validator/Constraints/Compound.php',
        'Symfony\\Component\\Validator\\Constraints\\CompoundValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CompoundValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Count' => __DIR__ . '/..' . '/symfony/validator/Constraints/Count.php',
        'Symfony\\Component\\Validator\\Constraints\\CountValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Country' => __DIR__ . '/..' . '/symfony/validator/Constraints/Country.php',
        'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountryValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\CssColor' => __DIR__ . '/..' . '/symfony/validator/Constraints/CssColor.php',
        'Symfony\\Component\\Validator\\Constraints\\CssColorValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CssColorValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Currency' => __DIR__ . '/..' . '/symfony/validator/Constraints/Currency.php',
        'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CurrencyValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Date' => __DIR__ . '/..' . '/symfony/validator/Constraints/Date.php',
        'Symfony\\Component\\Validator\\Constraints\\DateTime' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTime.php',
        'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTimeValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\DateValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping' => __DIR__ . '/..' . '/symfony/validator/Constraints/DisableAutoMapping.php',
        'Symfony\\Component\\Validator\\Constraints\\DivisibleBy' => __DIR__ . '/..' . '/symfony/validator/Constraints/DivisibleBy.php',
        'Symfony\\Component\\Validator\\Constraints\\DivisibleByValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DivisibleByValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Email' => __DIR__ . '/..' . '/symfony/validator/Constraints/Email.php',
        'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EmailValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping' => __DIR__ . '/..' . '/symfony/validator/Constraints/EnableAutoMapping.php',
        'Symfony\\Component\\Validator\\Constraints\\EqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualTo.php',
        'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualToValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Existence' => __DIR__ . '/..' . '/symfony/validator/Constraints/Existence.php',
        'Symfony\\Component\\Validator\\Constraints\\Expression' => __DIR__ . '/..' . '/symfony/validator/Constraints/Expression.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionLanguageProvider.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntax' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionLanguageSyntax.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntaxValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionLanguageSyntaxValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntax' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionSyntax.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntaxValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionSyntaxValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\File' => __DIR__ . '/..' . '/symfony/validator/Constraints/File.php',
        'Symfony\\Component\\Validator\\Constraints\\FileValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/FileValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThan.php',
        'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqual.php',
        'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequence.php',
        'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequenceProvider.php',
        'Symfony\\Component\\Validator\\Constraints\\Hostname' => __DIR__ . '/..' . '/symfony/validator/Constraints/Hostname.php',
        'Symfony\\Component\\Validator\\Constraints\\HostnameValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/HostnameValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Iban' => __DIR__ . '/..' . '/symfony/validator/Constraints/Iban.php',
        'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IbanValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalTo.php',
        'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalToValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Image' => __DIR__ . '/..' . '/symfony/validator/Constraints/Image.php',
        'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ImageValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Ip' => __DIR__ . '/..' . '/symfony/validator/Constraints/Ip.php',
        'Symfony\\Component\\Validator\\Constraints\\IpValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IpValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\IsFalse' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalse.php',
        'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalseValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\IsNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNull.php',
        'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNullValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\IsTrue' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrue.php',
        'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrueValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Isbn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Isbn.php',
        'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsbnValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Isin' => __DIR__ . '/..' . '/symfony/validator/Constraints/Isin.php',
        'Symfony\\Component\\Validator\\Constraints\\IsinValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsinValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Issn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Issn.php',
        'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IssnValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Json' => __DIR__ . '/..' . '/symfony/validator/Constraints/Json.php',
        'Symfony\\Component\\Validator\\Constraints\\JsonValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/JsonValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Language' => __DIR__ . '/..' . '/symfony/validator/Constraints/Language.php',
        'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LanguageValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Length' => __DIR__ . '/..' . '/symfony/validator/Constraints/Length.php',
        'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LengthValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\LessThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThan.php',
        'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqual.php',
        'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqualValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Locale' => __DIR__ . '/..' . '/symfony/validator/Constraints/Locale.php',
        'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LocaleValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Luhn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Luhn.php',
        'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LuhnValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Negative' => __DIR__ . '/..' . '/symfony/validator/Constraints/Negative.php',
        'Symfony\\Component\\Validator\\Constraints\\NegativeOrZero' => __DIR__ . '/..' . '/symfony/validator/Constraints/NegativeOrZero.php',
        'Symfony\\Component\\Validator\\Constraints\\NoSuspiciousCharacters' => __DIR__ . '/..' . '/symfony/validator/Constraints/NoSuspiciousCharacters.php',
        'Symfony\\Component\\Validator\\Constraints\\NoSuspiciousCharactersValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NoSuspiciousCharactersValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\NotBlank' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlank.php',
        'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlankValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\NotCompromisedPassword' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotCompromisedPassword.php',
        'Symfony\\Component\\Validator\\Constraints\\NotCompromisedPasswordValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotCompromisedPasswordValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualTo.php',
        'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualToValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalTo.php',
        'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalToValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\NotNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNull.php',
        'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNullValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Optional' => __DIR__ . '/..' . '/symfony/validator/Constraints/Optional.php',
        'Symfony\\Component\\Validator\\Constraints\\PasswordStrength' => __DIR__ . '/..' . '/symfony/validator/Constraints/PasswordStrength.php',
        'Symfony\\Component\\Validator\\Constraints\\PasswordStrengthValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/PasswordStrengthValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Positive' => __DIR__ . '/..' . '/symfony/validator/Constraints/Positive.php',
        'Symfony\\Component\\Validator\\Constraints\\PositiveOrZero' => __DIR__ . '/..' . '/symfony/validator/Constraints/PositiveOrZero.php',
        'Symfony\\Component\\Validator\\Constraints\\Range' => __DIR__ . '/..' . '/symfony/validator/Constraints/Range.php',
        'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RangeValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Regex' => __DIR__ . '/..' . '/symfony/validator/Constraints/Regex.php',
        'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RegexValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Required' => __DIR__ . '/..' . '/symfony/validator/Constraints/Required.php',
        'Symfony\\Component\\Validator\\Constraints\\Sequentially' => __DIR__ . '/..' . '/symfony/validator/Constraints/Sequentially.php',
        'Symfony\\Component\\Validator\\Constraints\\SequentiallyValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/SequentiallyValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Time' => __DIR__ . '/..' . '/symfony/validator/Constraints/Time.php',
        'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TimeValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Timezone' => __DIR__ . '/..' . '/symfony/validator/Constraints/Timezone.php',
        'Symfony\\Component\\Validator\\Constraints\\TimezoneValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TimezoneValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Traverse' => __DIR__ . '/..' . '/symfony/validator/Constraints/Traverse.php',
        'Symfony\\Component\\Validator\\Constraints\\Type' => __DIR__ . '/..' . '/symfony/validator/Constraints/Type.php',
        'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TypeValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Ulid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Ulid.php',
        'Symfony\\Component\\Validator\\Constraints\\UlidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UlidValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Unique' => __DIR__ . '/..' . '/symfony/validator/Constraints/Unique.php',
        'Symfony\\Component\\Validator\\Constraints\\UniqueValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UniqueValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Url' => __DIR__ . '/..' . '/symfony/validator/Constraints/Url.php',
        'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UrlValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Uuid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Uuid.php',
        'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UuidValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\Valid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Valid.php',
        'Symfony\\Component\\Validator\\Constraints\\ValidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ValidValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\When' => __DIR__ . '/..' . '/symfony/validator/Constraints/When.php',
        'Symfony\\Component\\Validator\\Constraints\\WhenValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/WhenValidator.php',
        'Symfony\\Component\\Validator\\Constraints\\ZeroComparisonConstraintTrait' => __DIR__ . '/..' . '/symfony/validator/Constraints/ZeroComparisonConstraintTrait.php',
        'Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/validator/ContainerConstraintValidatorFactory.php',
        'Symfony\\Component\\Validator\\Context\\ExecutionContext' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContext.php',
        'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactory.php',
        'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactoryInterface.php',
        'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextInterface.php',
        'Symfony\\Component\\Validator\\DataCollector\\ValidatorDataCollector' => __DIR__ . '/..' . '/symfony/validator/DataCollector/ValidatorDataCollector.php',
        'Symfony\\Component\\Validator\\DependencyInjection\\AddAutoMappingConfigurationPass' => __DIR__ . '/..' . '/symfony/validator/DependencyInjection/AddAutoMappingConfigurationPass.php',
        'Symfony\\Component\\Validator\\DependencyInjection\\AddConstraintValidatorsPass' => __DIR__ . '/..' . '/symfony/validator/DependencyInjection/AddConstraintValidatorsPass.php',
        'Symfony\\Component\\Validator\\DependencyInjection\\AddValidatorInitializersPass' => __DIR__ . '/..' . '/symfony/validator/DependencyInjection/AddValidatorInitializersPass.php',
        'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/validator/Exception/BadMethodCallException.php',
        'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/ConstraintDefinitionException.php',
        'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/validator/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/GroupDefinitionException.php',
        'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidArgumentException.php',
        'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidOptionsException.php',
        'Symfony\\Component\\Validator\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/validator/Exception/LogicException.php',
        'Symfony\\Component\\Validator\\Exception\\MappingException' => __DIR__ . '/..' . '/symfony/validator/Exception/MappingException.php',
        'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/MissingOptionsException.php',
        'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/NoSuchMetadataException.php',
        'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/validator/Exception/OutOfBoundsException.php',
        'Symfony\\Component\\Validator\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/validator/Exception/RuntimeException.php',
        'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnexpectedTypeException.php',
        'Symfony\\Component\\Validator\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnexpectedValueException.php',
        'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnsupportedMetadataException.php',
        'Symfony\\Component\\Validator\\Exception\\ValidationFailedException' => __DIR__ . '/..' . '/symfony/validator/Exception/ValidationFailedException.php',
        'Symfony\\Component\\Validator\\Exception\\ValidatorException' => __DIR__ . '/..' . '/symfony/validator/Exception/ValidatorException.php',
        'Symfony\\Component\\Validator\\GroupProviderInterface' => __DIR__ . '/..' . '/symfony/validator/GroupProviderInterface.php',
        'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => __DIR__ . '/..' . '/symfony/validator/GroupSequenceProviderInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\AutoMappingStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/AutoMappingStrategy.php',
        'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/CascadingStrategy.php',
        'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadata.php',
        'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadataInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php',
        'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php',
        'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GenericMetadata.php',
        'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GetterMetadata.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AbstractLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AnnotationLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\AttributeLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AttributeLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\AutoMappingTrait' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AutoMappingTrait.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FileLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FilesLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderChain.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\PropertyInfoLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/PropertyInfoLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFileLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFileLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php',
        'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/MemberMetadata.php',
        'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/MetadataInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadata.php',
        'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadataInterface.php',
        'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/TraversalStrategy.php',
        'Symfony\\Component\\Validator\\ObjectInitializerInterface' => __DIR__ . '/..' . '/symfony/validator/ObjectInitializerInterface.php',
        'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase' => __DIR__ . '/..' . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
        'Symfony\\Component\\Validator\\Util\\PropertyPath' => __DIR__ . '/..' . '/symfony/validator/Util/PropertyPath.php',
        'Symfony\\Component\\Validator\\Validation' => __DIR__ . '/..' . '/symfony/validator/Validation.php',
        'Symfony\\Component\\Validator\\ValidatorBuilder' => __DIR__ . '/..' . '/symfony/validator/ValidatorBuilder.php',
        'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ContextualValidatorInterface.php',
        'Symfony\\Component\\Validator\\Validator\\LazyProperty' => __DIR__ . '/..' . '/symfony/validator/Validator/LazyProperty.php',
        'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveContextualValidator.php',
        'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveValidator.php',
        'Symfony\\Component\\Validator\\Validator\\TraceableValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/TraceableValidator.php',
        'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ValidatorInterface.php',
        'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilder.php',
        'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php',
        'Symfony\\Component\\VarDumper\\Caster\\AddressInfoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AddressInfoCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ClassStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ConstStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\CurlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CurlCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutArrayStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\CutStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsPairStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\FFICaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FFICaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FiberCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\GdCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GdCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImagineCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImgStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MysqliCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\OpenSSLCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/OpenSSLCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RdKafkaCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\ScalarStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ScalarStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\SocketCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SocketCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SplCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\SqliteCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SqliteCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\UninitializedStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UninitializedStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UuidCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\VirtualStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/VirtualStub.php',
        'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php',
        'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php',
        'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php',
        'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/ClonerInterface.php',
        'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Cursor.php',
        'Symfony\\Component\\VarDumper\\Cloner\\Data' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Data.php',
        'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php',
        'Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php',
        'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php',
        'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php',
        'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php',
        'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php',
        'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => __DIR__ . '/..' . '/symfony/var-dumper/Command/ServerDumpCommand.php',
        'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php',
        'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextualizedDumper.php',
        'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php',
        'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php',
        'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ServerDumper.php',
        'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php',
        'Symfony\\Component\\VarDumper\\Server\\Connection' => __DIR__ . '/..' . '/symfony/var-dumper/Server/Connection.php',
        'Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php',
        'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php',
        'Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php',
        'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
        'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ExceptionInterface.php',
        'Symfony\\Component\\VarExporter\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/LogicException.php',
        'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
        'Symfony\\Component\\VarExporter\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Hydrator.php',
        'Symfony\\Component\\VarExporter\\Instantiator' => __DIR__ . '/..' . '/symfony/var-exporter/Instantiator.php',
        'Symfony\\Component\\VarExporter\\Internal\\Exporter' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Exporter.php',
        'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Hydrator.php',
        'Symfony\\Component\\VarExporter\\Internal\\LazyDecoratorTrait' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyDecoratorTrait.php',
        'Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectRegistry.php',
        'Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectState.php',
        'Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectTrait.php',
        'Symfony\\Component\\VarExporter\\Internal\\Reference' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Reference.php',
        'Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php',
        'Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php',
        'Symfony\\Component\\VarExporter\\LazyGhostTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyGhostTrait.php',
        'Symfony\\Component\\VarExporter\\LazyObjectInterface' => __DIR__ . '/..' . '/symfony/var-exporter/LazyObjectInterface.php',
        'Symfony\\Component\\VarExporter\\LazyProxyTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyProxyTrait.php',
        'Symfony\\Component\\VarExporter\\ProxyHelper' => __DIR__ . '/..' . '/symfony/var-exporter/ProxyHelper.php',
        'Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php',
        'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',
        'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',
        'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',
        'Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php',
        'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php',
        'Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php',
        'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php',
        'Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php',
        'Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php',
        'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',
        'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',
        'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',
        'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php',
        'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php',
        'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php',
        'Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/ItemInterface.php',
        'Symfony\\Contracts\\Cache\\NamespacedPoolInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/NamespacedPoolInterface.php',
        'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/TagAwareCacheInterface.php',
        'Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php',
        'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
        'Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php',
        'Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php',
        'Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php',
        'Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php',
        'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php',
        'Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php',
        'Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php',
        'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php',
        'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php',
        'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php',
        'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php',
        'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php',
        'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php',
        'Symfony\\Flex\\Command\\DumpEnvCommand' => __DIR__ . '/..' . '/symfony/flex/src/Command/DumpEnvCommand.php',
        'Symfony\\Flex\\Command\\InstallRecipesCommand' => __DIR__ . '/..' . '/symfony/flex/src/Command/InstallRecipesCommand.php',
        'Symfony\\Flex\\Command\\RecipesCommand' => __DIR__ . '/..' . '/symfony/flex/src/Command/RecipesCommand.php',
        'Symfony\\Flex\\Command\\UpdateRecipesCommand' => __DIR__ . '/..' . '/symfony/flex/src/Command/UpdateRecipesCommand.php',
        'Symfony\\Flex\\Configurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator.php',
        'Symfony\\Flex\\Configurator\\AbstractConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/AbstractConfigurator.php',
        'Symfony\\Flex\\Configurator\\AddLinesConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/AddLinesConfigurator.php',
        'Symfony\\Flex\\Configurator\\BundlesConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/BundlesConfigurator.php',
        'Symfony\\Flex\\Configurator\\ComposerCommandsConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/ComposerCommandsConfigurator.php',
        'Symfony\\Flex\\Configurator\\ComposerScriptsConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/ComposerScriptsConfigurator.php',
        'Symfony\\Flex\\Configurator\\ContainerConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/ContainerConfigurator.php',
        'Symfony\\Flex\\Configurator\\CopyFromPackageConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/CopyFromPackageConfigurator.php',
        'Symfony\\Flex\\Configurator\\CopyFromRecipeConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/CopyFromRecipeConfigurator.php',
        'Symfony\\Flex\\Configurator\\DockerComposeConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/DockerComposeConfigurator.php',
        'Symfony\\Flex\\Configurator\\DockerfileConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/DockerfileConfigurator.php',
        'Symfony\\Flex\\Configurator\\DotenvConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/DotenvConfigurator.php',
        'Symfony\\Flex\\Configurator\\EnvConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/EnvConfigurator.php',
        'Symfony\\Flex\\Configurator\\GitignoreConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/GitignoreConfigurator.php',
        'Symfony\\Flex\\Configurator\\MakefileConfigurator' => __DIR__ . '/..' . '/symfony/flex/src/Configurator/MakefileConfigurator.php',
        'Symfony\\Flex\\Downloader' => __DIR__ . '/..' . '/symfony/flex/src/Downloader.php',
        'Symfony\\Flex\\Event\\UpdateEvent' => __DIR__ . '/..' . '/symfony/flex/src/Event/UpdateEvent.php',
        'Symfony\\Flex\\Flex' => __DIR__ . '/..' . '/symfony/flex/src/Flex.php',
        'Symfony\\Flex\\GithubApi' => __DIR__ . '/..' . '/symfony/flex/src/GithubApi.php',
        'Symfony\\Flex\\InformationOperation' => __DIR__ . '/..' . '/symfony/flex/src/InformationOperation.php',
        'Symfony\\Flex\\Lock' => __DIR__ . '/..' . '/symfony/flex/src/Lock.php',
        'Symfony\\Flex\\Options' => __DIR__ . '/..' . '/symfony/flex/src/Options.php',
        'Symfony\\Flex\\PackageFilter' => __DIR__ . '/..' . '/symfony/flex/src/PackageFilter.php',
        'Symfony\\Flex\\PackageJsonSynchronizer' => __DIR__ . '/..' . '/symfony/flex/src/PackageJsonSynchronizer.php',
        'Symfony\\Flex\\PackageResolver' => __DIR__ . '/..' . '/symfony/flex/src/PackageResolver.php',
        'Symfony\\Flex\\Path' => __DIR__ . '/..' . '/symfony/flex/src/Path.php',
        'Symfony\\Flex\\Recipe' => __DIR__ . '/..' . '/symfony/flex/src/Recipe.php',
        'Symfony\\Flex\\Response' => __DIR__ . '/..' . '/symfony/flex/src/Response.php',
        'Symfony\\Flex\\ScriptExecutor' => __DIR__ . '/..' . '/symfony/flex/src/ScriptExecutor.php',
        'Symfony\\Flex\\SymfonyBundle' => __DIR__ . '/..' . '/symfony/flex/src/SymfonyBundle.php',
        'Symfony\\Flex\\SymfonyPackInstaller' => __DIR__ . '/..' . '/symfony/flex/src/SymfonyPackInstaller.php',
        'Symfony\\Flex\\Unpack\\Operation' => __DIR__ . '/..' . '/symfony/flex/src/Unpack/Operation.php',
        'Symfony\\Flex\\Unpack\\Result' => __DIR__ . '/..' . '/symfony/flex/src/Unpack/Result.php',
        'Symfony\\Flex\\Unpacker' => __DIR__ . '/..' . '/symfony/flex/src/Unpacker.php',
        'Symfony\\Flex\\Update\\DiffHelper' => __DIR__ . '/..' . '/symfony/flex/src/Update/DiffHelper.php',
        'Symfony\\Flex\\Update\\RecipePatch' => __DIR__ . '/..' . '/symfony/flex/src/Update/RecipePatch.php',
        'Symfony\\Flex\\Update\\RecipePatcher' => __DIR__ . '/..' . '/symfony/flex/src/Update/RecipePatcher.php',
        'Symfony\\Flex\\Update\\RecipeUpdate' => __DIR__ . '/..' . '/symfony/flex/src/Update/RecipeUpdate.php',
        'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
        'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php',
        'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php',
        'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
        'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php',
        'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php',
        'Symfony\\Polyfill\\Php83\\Php83' => __DIR__ . '/..' . '/symfony/polyfill-php83/Php83.php',
        'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
        'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
        'Zumba\\Amplitude\\Amplitude' => __DIR__ . '/..' . '/zumba/amplitude-php/src/Amplitude.php',
        'Zumba\\Amplitude\\Event' => __DIR__ . '/..' . '/zumba/amplitude-php/src/Event.php',
        'Zumba\\Amplitude\\Inflector' => __DIR__ . '/..' . '/zumba/amplitude-php/src/Inflector.php',
        'Zumba\\Amplitude\\Test\\AmplitudeTest' => __DIR__ . '/..' . '/zumba/amplitude-php/test/AmplitudeTest.php',
        'Zumba\\Amplitude\\Test\\EventTest' => __DIR__ . '/..' . '/zumba/amplitude-php/test/EventTest.php',
        'Zumba\\Amplitude\\Test\\InflectorTest' => __DIR__ . '/..' . '/zumba/amplitude-php/test/InflectorTest.php',
        'loophp\\phposinfo\\Enum\\Enum' => __DIR__ . '/..' . '/loophp/phposinfo/src/Enum/Enum.php',
        'loophp\\phposinfo\\Enum\\Family' => __DIR__ . '/..' . '/loophp/phposinfo/src/Enum/Family.php',
        'loophp\\phposinfo\\Enum\\FamilyName' => __DIR__ . '/..' . '/loophp/phposinfo/src/Enum/FamilyName.php',
        'loophp\\phposinfo\\Enum\\Os' => __DIR__ . '/..' . '/loophp/phposinfo/src/Enum/Os.php',
        'loophp\\phposinfo\\Enum\\OsName' => __DIR__ . '/..' . '/loophp/phposinfo/src/Enum/OsName.php',
        'loophp\\phposinfo\\OsInfo' => __DIR__ . '/..' . '/loophp/phposinfo/src/OsInfo.php',
        'loophp\\phposinfo\\OsInfoInterface' => __DIR__ . '/..' . '/loophp/phposinfo/src/OsInfoInterface.php',
        '' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit8b629a15c689375da27d72358027e768::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit8b629a15c689375da27d72358027e768::$prefixDirsPsr4;
            $loader->prefixesPsr0 = ComposerStaticInit8b629a15c689375da27d72358027e768::$prefixesPsr0;
            $loader->classMap = ComposerStaticInit8b629a15c689375da27d72358027e768::$classMap;

        }, null, ClassLoader::class);
    }
}

Copyright (c) Nils Adermann, Jordi Boggiano

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.

<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
    'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php',
    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
    'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
    '9c67151ae59aff4788964ce8eb2a0f43' => $vendorDir . '/clue/stream-filter/src/functions_include.php',
    '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
    'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
    '8cff32064859f4559445b89279f3199c' => $vendorDir . '/php-http/message/src/filters.php',
    'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
    '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php',
    'c9d07b32a2e02bc0fc582d4f0c1b56cc' => $vendorDir . '/laminas/laminas-servicemanager/src/autoload.php',
    '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
    '3be16222a6efa6dd226a219eaaff823b' => $vendorDir . '/ratchet/pawl/src/functions_include.php',
    '9e4824c5afbdc1482b6025ce3d4dfde8' => $vendorDir . '/league/csv/src/functions_include.php',
    'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php',
    '72243e5536b63e298acb6476f01f1aff' => $vendorDir . '/thecodingmachine/safe/lib/special_cases.php',
    '3f648889e687f31c52f949ba8a9d0873' => $vendorDir . '/thecodingmachine/safe/generated/apache.php',
    'eeb4581d958421a4244aaa4167c6a575' => $vendorDir . '/thecodingmachine/safe/generated/apcu.php',
    '04cb0b3c1dac5b5ddb23c14e3d66dbe9' => $vendorDir . '/thecodingmachine/safe/generated/array.php',
    '450b332a74a9a21e043c5e953485a791' => $vendorDir . '/thecodingmachine/safe/generated/bzip2.php',
    '6e9b7954ecfd7cbb9ca239319d1acdb6' => $vendorDir . '/thecodingmachine/safe/generated/calendar.php',
    '2c6d7e8bd2de9a272a9d4d43b0a4304a' => $vendorDir . '/thecodingmachine/safe/generated/classobj.php',
    '0b8231c1ad0865447c988a4c16b4001f' => $vendorDir . '/thecodingmachine/safe/generated/com.php',
    '7643a71fe1c3256058c8fee234cb86e5' => $vendorDir . '/thecodingmachine/safe/generated/cubrid.php',
    '68e1365710575942efc1d55000032cee' => $vendorDir . '/thecodingmachine/safe/generated/curl.php',
    '02fd26bca803106c5b942a7197c3ad8b' => $vendorDir . '/thecodingmachine/safe/generated/datetime.php',
    'f4817dcbd956cd221b1c31f6fbd5749c' => $vendorDir . '/thecodingmachine/safe/generated/dir.php',
    '51c3f2d10ca61a70dbcea0e38d8e902d' => $vendorDir . '/thecodingmachine/safe/generated/eio.php',
    '1d34f34327ca3e81535963016e3be2c3' => $vendorDir . '/thecodingmachine/safe/generated/errorfunc.php',
    '4fd0ba2d3717b0424d474bebfdafa2b4' => $vendorDir . '/thecodingmachine/safe/generated/exec.php',
    '98f4dae054bc7fb19c13be14935cbdd3' => $vendorDir . '/thecodingmachine/safe/generated/fileinfo.php',
    '5530ae063ba88323eaf0a07904efdf85' => $vendorDir . '/thecodingmachine/safe/generated/filesystem.php',
    '633f4f134975d70e97bddad83348e91a' => $vendorDir . '/thecodingmachine/safe/generated/filter.php',
    'fbd163fc68c5faf73d5ed4002ffd836d' => $vendorDir . '/thecodingmachine/safe/generated/fpm.php',
    '21b511999d61411fab0692ff8795bbed' => $vendorDir . '/thecodingmachine/safe/generated/ftp.php',
    '85fbd73fc92365cd90526b0ea03cae3a' => $vendorDir . '/thecodingmachine/safe/generated/funchand.php',
    'a2e4c6dfdbf36f56f1945ddcbd54e289' => $vendorDir . '/thecodingmachine/safe/generated/gettext.php',
    '51df9c146e0b7dcbdf358d8abd24dbdc' => $vendorDir . '/thecodingmachine/safe/generated/gmp.php',
    '93bb7fe678d7dcfb1322f8e3475a48b0' => $vendorDir . '/thecodingmachine/safe/generated/gnupg.php',
    'c171ba99cf316379ff66468392bf4950' => $vendorDir . '/thecodingmachine/safe/generated/hash.php',
    '5ab4aad4c28e468209fbfcceb2e5e6a5' => $vendorDir . '/thecodingmachine/safe/generated/ibase.php',
    '4d57409c5e8e576b0c64c08d9d731cfb' => $vendorDir . '/thecodingmachine/safe/generated/ibmDb2.php',
    'eeb246d5403972a9d62106e4a4883496' => $vendorDir . '/thecodingmachine/safe/generated/iconv.php',
    'c28a05f498c01b810a714f7214b7a8da' => $vendorDir . '/thecodingmachine/safe/generated/image.php',
    '8063cd92acdf00fd978b5599eb7cc142' => $vendorDir . '/thecodingmachine/safe/generated/imap.php',
    '8bd26dbe768e9c9599edad7b198e5446' => $vendorDir . '/thecodingmachine/safe/generated/info.php',
    'd4362910bde43c0f956b52527effd7d4' => $vendorDir . '/thecodingmachine/safe/generated/inotify.php',
    '696ba49197d9b55f0428a12bb5a818e1' => $vendorDir . '/thecodingmachine/safe/generated/json.php',
    '9818aaa99c8647c63f8ef62b7a368160' => $vendorDir . '/thecodingmachine/safe/generated/ldap.php',
    'bcf523ff2a195eb08e0fbb668ed784d0' => $vendorDir . '/thecodingmachine/safe/generated/libxml.php',
    '68be68a9a8b95bb56cab6109ff03bc88' => $vendorDir . '/thecodingmachine/safe/generated/lzf.php',
    'bdca804bb0904ea9f53f328dfc0bb8a5' => $vendorDir . '/thecodingmachine/safe/generated/mailparse.php',
    'b0a3fcac3eaf55445796d6af26b89366' => $vendorDir . '/thecodingmachine/safe/generated/mbstring.php',
    '98de16b8db03eb0cb4d318b4402215a6' => $vendorDir . '/thecodingmachine/safe/generated/misc.php',
    '7cefd81607cd21b8b3a15656eb6465f5' => $vendorDir . '/thecodingmachine/safe/generated/mysql.php',
    'aaf438b080089c6d0686679cd34aa72e' => $vendorDir . '/thecodingmachine/safe/generated/mysqli.php',
    'cbac956836b72483dcff1ac39d5c0a0f' => $vendorDir . '/thecodingmachine/safe/generated/network.php',
    '6c8f89dfbdc117d7871f572269363f25' => $vendorDir . '/thecodingmachine/safe/generated/oci8.php',
    '169a669966a45c06bf55ed029122729b' => $vendorDir . '/thecodingmachine/safe/generated/opcache.php',
    'def61bf4fecd4d4bca7354919cd69302' => $vendorDir . '/thecodingmachine/safe/generated/openssl.php',
    '26bb010649a6d32d4120181458aa6ef2' => $vendorDir . '/thecodingmachine/safe/generated/outcontrol.php',
    '002ebcb842e2c0d5b7f67fe64cc93158' => $vendorDir . '/thecodingmachine/safe/generated/pcntl.php',
    '86df38612982dade72c7085ce7eca81f' => $vendorDir . '/thecodingmachine/safe/generated/pcre.php',
    '1fc22f445c69ea8706e82fce301c0831' => $vendorDir . '/thecodingmachine/safe/generated/pgsql.php',
    'c70b42561584f7144bff38cd63c4eef3' => $vendorDir . '/thecodingmachine/safe/generated/posix.php',
    '9923214639c32ca5173db03a177d3b63' => $vendorDir . '/thecodingmachine/safe/generated/ps.php',
    '7e9c3f8eae2b5bf42205c4f1295cb7a7' => $vendorDir . '/thecodingmachine/safe/generated/pspell.php',
    '91aa91f6245c349c2e2e88bd0025f199' => $vendorDir . '/thecodingmachine/safe/generated/readline.php',
    'ccf972e9e1fd8935f45f95e13b54ad59' => $vendorDir . '/thecodingmachine/safe/generated/rnp.php',
    'd43773cacb9e5e8e897aa255e32007d1' => $vendorDir . '/thecodingmachine/safe/generated/rpminfo.php',
    'f053a3849e9e8383762b34b91db0320b' => $vendorDir . '/thecodingmachine/safe/generated/rrd.php',
    '775b964f72f827a1bf87c65ab5b10800' => $vendorDir . '/thecodingmachine/safe/generated/sem.php',
    '816428bd69c29ab5e1ed622af5dca0cd' => $vendorDir . '/thecodingmachine/safe/generated/session.php',
    '5093e233bedbefaef0df262bfbab0a5c' => $vendorDir . '/thecodingmachine/safe/generated/shmop.php',
    'b080617b1d949683c2e37f8f01dc0e15' => $vendorDir . '/thecodingmachine/safe/generated/sockets.php',
    '2708aa182ddcfe6ce27c96acaaa40f69' => $vendorDir . '/thecodingmachine/safe/generated/sodium.php',
    'f1b96cb260a5baeea9a7285cda82a1ec' => $vendorDir . '/thecodingmachine/safe/generated/solr.php',
    '3fd8853757d0fe3557c179efb807afeb' => $vendorDir . '/thecodingmachine/safe/generated/spl.php',
    '9312ce96a51c846913fcda5f186d58dd' => $vendorDir . '/thecodingmachine/safe/generated/sqlsrv.php',
    'd3eb383ad0b8b962b29dc4afd29d6715' => $vendorDir . '/thecodingmachine/safe/generated/ssdeep.php',
    '42a09bc448f441a0b9f9367ea975c0bf' => $vendorDir . '/thecodingmachine/safe/generated/ssh2.php',
    'ef711077d356d1b33ca0b10b67b0be8f' => $vendorDir . '/thecodingmachine/safe/generated/stream.php',
    '764b09f6df081cbb2807b97c6ace3866' => $vendorDir . '/thecodingmachine/safe/generated/strings.php',
    'ef241678769fee4a44aaa288f3b78aa1' => $vendorDir . '/thecodingmachine/safe/generated/swoole.php',
    '0efc8f6778cba932b9e2a89e28de2452' => $vendorDir . '/thecodingmachine/safe/generated/uodbc.php',
    'd383d32907b98af53ee9208c62204fd0' => $vendorDir . '/thecodingmachine/safe/generated/uopz.php',
    '2fd2e4060f7fe772660f002ce38f0b71' => $vendorDir . '/thecodingmachine/safe/generated/url.php',
    '782249e03deebeaf57b9991ff5493aa0' => $vendorDir . '/thecodingmachine/safe/generated/var.php',
    '344440cd1cd7200fdb4f12af0d3c587f' => $vendorDir . '/thecodingmachine/safe/generated/xdiff.php',
    '3599f369219c658a5fb6c4fe66832f62' => $vendorDir . '/thecodingmachine/safe/generated/xml.php',
    '7fcd313da9fae337051b091b3492c21b' => $vendorDir . '/thecodingmachine/safe/generated/xmlrpc.php',
    'd668c74cfa92d893b582356733d9a80e' => $vendorDir . '/thecodingmachine/safe/generated/yaml.php',
    '4af1dca6db8c527c6eed27bff85ff0e5' => $vendorDir . '/thecodingmachine/safe/generated/yaz.php',
    'fe43ca06499ac37bc2dedd823af71eb5' => $vendorDir . '/thecodingmachine/safe/generated/zip.php',
    '356736db98a6834f0a886b8d509b0ecd' => $vendorDir . '/thecodingmachine/safe/generated/zlib.php',
);
Copyright (C) 2016 Composer

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.
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Aug 12 03:12:01 2025 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
##
## 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:
## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt
##
## 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.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: c185b859c19b05f104c50e1b0b2a6c775149a1d9bb731d414d73b1722892a66c
##


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-----

QuoVadis Root CA 2
==================
-----BEGIN CERTIFICATE-----
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----

QuoVadis Root CA 3
==================
-----BEGIN CERTIFICATE-----
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
-----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-----

SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
-----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-----

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-----

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-----

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-----

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-----

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-----

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-----

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-----

Izenpe.com
==========
-----BEGIN CERTIFICATE-----
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----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-----

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-----

Actalis Authentication Root CA
==============================
-----BEGIN CERTIFICATE-----
MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----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-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-----

D-TRUST Root Class 3 CA 2 2009
==============================
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----

D-TRUST Root Class 3 CA 2 EV 2009
=================================
-----BEGIN CERTIFICATE-----
MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
w9y4AyHqnxbxLFS1
-----END CERTIFICATE-----

CA Disig Root R2
================
-----BEGIN CERTIFICATE-----
MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
7+ZtsH8tZ/3zbBt1RqPlShfppNcL
-----END CERTIFICATE-----

ACCVRAIZ1
=========
-----BEGIN CERTIFICATE-----
MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
EfbRD0tVNEYqi4Y7
-----END CERTIFICATE-----

TWCA Global Root CA
===================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
-----END CERTIFICATE-----

TeliaSonera Root CA v1
======================
-----BEGIN CERTIFICATE-----
MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
-----END CERTIFICATE-----

T-TeleSec GlobalRoot Class 2
============================
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
-----END CERTIFICATE-----

Atos TrustedRoot 2011
=====================
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
-----END CERTIFICATE-----

QuoVadis Root CA 1 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
hMJKzRwuJIczYOXD
-----END CERTIFICATE-----

QuoVadis Root CA 2 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
O3jtZsSOeWmD3n+M
-----END CERTIFICATE-----

QuoVadis Root CA 3 G3
=====================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
PpxxVJkES/1Y+Zj0
-----END CERTIFICATE-----

DigiCert Assured ID Root G2
===========================
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----

DigiCert Assured ID Root G3
===========================
-----BEGIN CERTIFICATE-----
MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
1vUhZscv6pZjamVFkpUBtA==
-----END CERTIFICATE-----

DigiCert Global Root G2
=======================
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----

DigiCert Global Root G3
=======================
-----BEGIN CERTIFICATE-----
MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
VOKa5Vt8sycX
-----END CERTIFICATE-----

DigiCert Trusted Root G4
========================
-----BEGIN CERTIFICATE-----
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
82Z+
-----END CERTIFICATE-----

COMODO RSA Certification Authority
==================================
-----BEGIN CERTIFICATE-----
MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
LaZRfyHBNVOFBkpdn627G190
-----END CERTIFICATE-----

USERTrust RSA Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

USERTrust ECC Certification Authority
=====================================
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R5
===========================
-----BEGIN CERTIFICATE-----
MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----

IdenTrust Commercial Root CA 1
==============================
-----BEGIN CERTIFICATE-----
MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
cGzM7vRX+Bi6hG6H
-----END CERTIFICATE-----

IdenTrust Public Sector Root CA 1
=================================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
3Wl9af0AVqW3rLatt8o+Ae+c
-----END CERTIFICATE-----

Entrust Root Certification Authority - G2
=========================================
-----BEGIN CERTIFICATE-----
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
e4pIb4tF9g==
-----END CERTIFICATE-----

Entrust Root Certification Authority - EC1
==========================================
-----BEGIN CERTIFICATE-----
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
-----END CERTIFICATE-----

CFCA EV ROOT
============
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
-----END CERTIFICATE-----

OISTE WISeKey Global Root GB CA
===============================
-----BEGIN CERTIFICATE-----
MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
-----END CERTIFICATE-----

SZAFIR ROOT CA2
===============
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
-----END CERTIFICATE-----

Certum Trusted Network CA 2
===========================
-----BEGIN CERTIFICATE-----
MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
zAYspsbiDrW5viSP
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions RootCA 2015
=======================================================
-----BEGIN CERTIFICATE-----
MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
p/UsQu0yrbYhnr68
-----END CERTIFICATE-----

Hellenic Academic and Research Institutions ECC RootCA 2015
===========================================================
-----BEGIN CERTIFICATE-----
MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
-----END CERTIFICATE-----

ISRG Root X1
============
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

AC RAIZ FNMT-RCM
================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
-----END CERTIFICATE-----

Amazon Root CA 1
================
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----

Amazon Root CA 2
================
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
-----END CERTIFICATE-----

Amazon Root CA 3
================
-----BEGIN CERTIFICATE-----
MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
-----END CERTIFICATE-----

Amazon Root CA 4
================
-----BEGIN CERTIFICATE-----
MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
-----END CERTIFICATE-----

TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
=============================================
-----BEGIN CERTIFICATE-----
MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
-----END CERTIFICATE-----

GDCA TrustAUTH R5 ROOT
======================
-----BEGIN CERTIFICATE-----
MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE-----

SSL.com Root Certification Authority RSA
========================================
-----BEGIN CERTIFICATE-----
MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
-----END CERTIFICATE-----

SSL.com Root Certification Authority ECC
========================================
-----BEGIN CERTIFICATE-----
MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority RSA R2
==============================================
-----BEGIN CERTIFICATE-----
MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
+qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
-----END CERTIFICATE-----

SSL.com EV Root Certification Authority ECC
===========================================
-----BEGIN CERTIFICATE-----
MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
-----END CERTIFICATE-----

GlobalSign Root CA - R6
=======================
-----BEGIN CERTIFICATE-----
MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
-----END CERTIFICATE-----

OISTE WISeKey Global Root GC CA
===============================
-----BEGIN CERTIFICATE-----
MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE-----

UCA Global G2 Root
==================
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
-----END CERTIFICATE-----

UCA Extended Validation Root
============================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
dhh2n1ax
-----END CERTIFICATE-----

Certigna Root CA
================
-----BEGIN CERTIFICATE-----
MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
-----END CERTIFICATE-----

emSign Root CA - G1
===================
-----BEGIN CERTIFICATE-----
MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
iN66zB+Afko=
-----END CERTIFICATE-----

emSign ECC Root CA - G3
=======================
-----BEGIN CERTIFICATE-----
MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
-----END CERTIFICATE-----

emSign Root CA - C1
===================
-----BEGIN CERTIFICATE-----
MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
-----END CERTIFICATE-----

emSign ECC Root CA - C3
=======================
-----BEGIN CERTIFICATE-----
MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
-----END CERTIFICATE-----

Hongkong Post Root CA 3
=======================
-----BEGIN CERTIFICATE-----
MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
dBb9HxEGmpv0
-----END CERTIFICATE-----

Microsoft ECC Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
-----END CERTIFICATE-----

Microsoft RSA Root Certificate Authority 2017
=============================================
-----BEGIN CERTIFICATE-----
MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
+ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
-----END CERTIFICATE-----

e-Szigno Root CA 2017
=====================
-----BEGIN CERTIFICATE-----
MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
svxyqltZ+efcMQ==
-----END CERTIFICATE-----

certSIGN Root CA G2
===================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
-----END CERTIFICATE-----

Trustwave Global Certification Authority
========================================
-----BEGIN CERTIFICATE-----
MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV
UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV
UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29
zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf
LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq
stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o
WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+
OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40
Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE
uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm
+9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj
ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB
BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H
PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H
ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla
4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R
vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd
zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O
856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH
Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu
3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP
29FpHOTKyeC2nOnOcXHebD8WpHk=
-----END CERTIFICATE-----

Trustwave Global ECC P256 Certification Authority
=================================================
-----BEGIN CERTIFICATE-----
MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
-----END CERTIFICATE-----

Trustwave Global ECC P384 Certification Authority
=================================================
-----BEGIN CERTIFICATE-----
MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
-----END CERTIFICATE-----

NAVER Global Root Certification Authority
=========================================
-----BEGIN CERTIFICATE-----
MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG
A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD
DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4
NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT
UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv
biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb
UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW
+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7
XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2
aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4
Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z
VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B
A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai
cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy
YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV
HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK
21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB
jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx
hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg
E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH
D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ
A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY
qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
kpzNNIaRkPpkUZ3+/uul9XXeifdy
-----END CERTIFICATE-----

AC RAIZ FNMT-RCM SERVIDORES SEGUROS
===================================
-----BEGIN CERTIFICATE-----
MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
-----END CERTIFICATE-----

GlobalSign Root R46
===================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
QEUxeCp6
-----END CERTIFICATE-----

GlobalSign Root E46
===================
-----BEGIN CERTIFICATE-----
MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE-----

GLOBALTRUST 2020
================
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
-----END CERTIFICATE-----

ANF Secure Server Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4
NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv
bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg
Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw
MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw
EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz
BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv
T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv
B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse
zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM
VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j
7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z
JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe
8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO
Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ
UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx
j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt
dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM
5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb
5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54
EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H
hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy
g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3
r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
-----END CERTIFICATE-----

Certum EC-384 CA
================
-----BEGIN CERTIFICATE-----
MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
-----END CERTIFICATE-----

Certum Trusted Root CA
======================
-----BEGIN CERTIFICATE-----
MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG
EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew
HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY
QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p
fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52
HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2
fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt
g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4
NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk
fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ
P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY
njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK
HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL
LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s
ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K
h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8
CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA
4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo
WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj
6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT
OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck
bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
-----END CERTIFICATE-----

TunTrust Root CA
================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG
A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj
dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw
NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD
ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz
2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b
bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7
NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd
gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW
VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f
Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ
juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas
DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS
VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI
04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl
0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd
Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY
YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp
adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x
xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP
jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM
MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z
ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r
AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
-----END CERTIFICATE-----

HARICA TLS RSA Root CA 2021
===========================
-----BEGIN CERTIFICATE-----
MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG
EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz
OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl
bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB
IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN
JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu
a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y
Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K
5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv
dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR
0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH
GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm
haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ
CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU
EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq
QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD
QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR
j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5
vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0
qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6
Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/
PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn
kf3/W9b3raYvAwtt41dU63ZTGI0RmLo=
-----END CERTIFICATE-----

HARICA TLS ECC Root CA 2021
===========================
-----BEGIN CERTIFICATE-----
MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH
UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD
QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX
DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj
IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv
b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l
AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b
ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi
rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
-----END CERTIFICATE-----

Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw
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+JIwuwIDAQABo4HvMIHsMB0GA1Ud
DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w
gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A
bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL
4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb
LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il
I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP
cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA
LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A
lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH
9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf
NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE
ZycPvEJdvSRUDewdcAZfpLz6IHxV
-----END CERTIFICATE-----

vTrus ECC Root CA
=================
-----BEGIN CERTIFICATE-----
MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE
BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS
b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa
BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c
ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n
TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT
QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL
YgmRWAD5Tfs0aNoJrSEGGJTO
-----END CERTIFICATE-----

vTrus Root CA
=============
-----BEGIN CERTIFICATE-----
MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG
A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv
b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG
A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots
SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI
ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF
XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA
YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70
kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2
AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu
/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu
1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO
9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg
scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr
jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4
8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn
xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg
icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4
sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW
nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc
SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H
l3s=
-----END CERTIFICATE-----

ISRG Root X2
============
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV
UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT
UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT
MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS
RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb
d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF
cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5
U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----

HiPKI Root CA - G1
==================
-----BEGIN CERTIFICATE-----
MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ
IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT
AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg
Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0
o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k
wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE
YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA
GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd
hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj
1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4
9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/
Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF
8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD
AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl
tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE
wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q
JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv
5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz
jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg
hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb
yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/
yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
-----END CERTIFICATE-----

GlobalSign ECC Root CA - R4
===========================
-----BEGIN CERTIFICATE-----
MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW
ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI
KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg
UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
-----END CERTIFICATE-----

GTS Root R1
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0
xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w
B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW
nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk
9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq
kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A
K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX
V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW
cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD
ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi
ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar
J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci
NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me
LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF
fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+
7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3
FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3
gm3c
-----END CERTIFICATE-----

GTS Root R2
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl
e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb
a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS
+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M
kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG
r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q
S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV
J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL
dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD
ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh
swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel
/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn
jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5
9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M
7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8
0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR
WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW
HYbL
-----END CERTIFICATE-----

GTS Root R3
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq
Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT
L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV
11RZt+cRLInUue4X
-----END CERTIFICATE-----

GTS Root R4
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1
PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C
r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh
4rsUecrNIdSUtUlD
-----END CERTIFICATE-----

Telia Root CA v2
================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT
AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2
MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK
DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7
6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q
9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn
pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl
tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW
5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr
RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E
BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4
M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau
BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W
xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5
tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H
eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C
y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC
QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15
h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70
sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9
xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ
raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=
-----END CERTIFICATE-----

D-TRUST BR Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7
dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu
QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom
AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87
-----END CERTIFICATE-----

D-TRUST EV Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8
ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ
raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
-----END CERTIFICATE-----

DigiCert TLS ECC P384 Root G5
=============================
-----BEGIN CERTIFICATE-----
MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
-----END CERTIFICATE-----

DigiCert TLS RSA4096 Root G5
============================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
bEtoL8pU9ozaMv7Da4M/OMZ+
-----END CERTIFICATE-----

Certainly Root R1
=================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
-----END CERTIFICATE-----

Certainly Root E1
=================
-----BEGIN CERTIFICATE-----
MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
-----END CERTIFICATE-----

Security Communication ECC RootCA1
==================================
-----BEGIN CERTIFICATE-----
MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
N9k=
-----END CERTIFICATE-----

BJCA Global Root CA1
====================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
-----END CERTIFICATE-----

BJCA Global Root CA2
====================
-----BEGIN CERTIFICATE-----
MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
-----END CERTIFICATE-----

Sectigo Public Server Authentication Root E46
=============================================
-----BEGIN CERTIFICATE-----
MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH
QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2
ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5
WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0
aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr
gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0
NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud
DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH
lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U
SAGKcw==
-----END CERTIFICATE-----

Sectigo Public Server Authentication Root R46
=============================================
-----BEGIN CERTIFICATE-----
MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG
EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1
OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k
1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf
GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP
FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu
ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz
Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A
wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF
plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ
EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW
6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI
IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp
E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4
exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M
0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI
84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m
pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd
Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b
E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm
J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
-----END CERTIFICATE-----

SSL.com TLS RSA Root CA 2022
============================
-----BEGIN CERTIFICATE-----
MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG
EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg
Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC
VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv
b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u
9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y
7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac
oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M
R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG
D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW
TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk
8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq
g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk
7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud
EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu
N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN
j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by
iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU
o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo
ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib
MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi
vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7
P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0
9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
-----END CERTIFICATE-----

SSL.com TLS ECC Root CA 2022
============================
-----BEGIN CERTIFICATE-----
MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v
dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx
GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg
Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy
JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1
5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7
81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG
MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w
7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5
Zn6g6g==
-----END CERTIFICATE-----

Atos TrustedRoot Root CA ECC TLS 2021
=====================================
-----BEGIN CERTIFICATE-----
MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB
dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD
VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg
VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT
AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K
DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS
b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX
NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+
uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY
a3cpetskz2VAv9LcjBHo9H1/IISpQuQo
-----END CERTIFICATE-----

Atos TrustedRoot Root CA RSA TLS 2021
=====================================
-----BEGIN CERTIFICATE-----
MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD
DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw
CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0
b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV
BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB
l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG
vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK
ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt
0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK
PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY
sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY
Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+
rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa
fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/
BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G
CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl
Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX
AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G
slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt
afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q
TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj
1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l
PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W
HYMfRsCbvUOZ58SWLs5fyQ==
-----END CERTIFICATE-----

TrustAsia Global Root CA G3
===========================
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG
A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM
G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw
MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu
MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz
lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ
Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V
P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag
dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm
9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc
D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg
WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea
mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF
TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj
7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1
D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T
G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj
duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl
cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys
+TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli
2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y
aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS
ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR
JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH
-----END CERTIFICATE-----

TrustAsia Global Root CA G4
===========================
-----BEGIN CERTIFICATE-----
MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE
BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry
dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa
MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw
IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8
m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF
MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/
pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA
bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk
dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
-----END CERTIFICATE-----

CommScope Public Trust ECC Root-01
==================================
-----BEGIN CERTIFICATE-----
MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx
eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot
6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2
Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW
pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE=
-----END CERTIFICATE-----

CommScope Public Trust ECC Root-02
==================================
-----BEGIN CERTIFICATE-----
MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M
MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE
SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9
Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7
3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag==
-----END CERTIFICATE-----

CommScope Public Trust RSA Root-01
==================================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft
nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6
uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq
ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs
vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c
Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif
BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9
lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo
KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH
+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4
5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM
3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck
jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf
Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W
NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+
o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/
oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc
1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM
6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
-----END CERTIFICATE-----

CommScope Public Trust RSA Root-02
==================================
-----BEGIN CERTIFICATE-----
MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V
rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx
7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC
e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W
Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp
M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf
hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr
eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE
VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t
Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx
cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF
1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa
MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd
gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O
HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm
YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr
dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
-----END CERTIFICATE-----

Telekom Security TLS ECC Root 2020
==================================
-----BEGIN CERTIFICATE-----
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
ga/sf+Rn27iQ7t0l
-----END CERTIFICATE-----

Telekom Security TLS RSA Root 2023
==================================
-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----

FIRMAPROFESIONAL CA ROOT-A WEB
==============================
-----BEGIN CERTIFICATE-----
MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----

TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----

SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----

SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----

SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----

D-TRUST BR Root CA 2 2023
=========================
-----BEGIN CERTIFICATE-----
MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg
MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT
BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT
cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z
sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ
WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6
++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL
QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv
x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV
MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX
/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9
CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y
XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr
d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv
U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4
nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij
YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff
/vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP
pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB
WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/
5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt
n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA==
-----END CERTIFICATE-----

TrustAsia TLS ECC Root CA
=========================
-----BEGIN CERTIFICATE-----
MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMwWDELMAkGA1UE
BhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMTGVRy
dXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBY
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAG
A1UEAxMZVHJ1c3RBc2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/
pVs/AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDpguMqWzJ8
S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAwDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49
BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15K
eAIxAKORh/IRM4PDwYqROkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ==
-----END CERTIFICATE-----

TrustAsia TLS RSA Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEMBQAwWDELMAkG
A1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMT
GVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2
WjBYMQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEi
MCAGA1UEAxMZVHJ1c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+NmDQDIPN
lOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJQ1DNDX3eRA5gEk9bNb2/
mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fk
zv93uMltrOXVmPGZLmzjyUT5tUMnCE32ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYo
zza/+lcK7Fs/6TAWe8TbxNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyr
z2I8sMeXi9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQUNoy
IBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+jTnhMmCWr8n4uIF6C
FabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DTbE3txci3OE9kxJRMT6DNrqXGJyV1
J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnT
q1mt1tve1CuBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZ
ylomkadFK/hTMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3
Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4iqME3mmL5Dw8
veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt7DlK9RME7I10nYEKqG/odv6L
TytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHx
tlotJnMnlvm5P1vQiJ3koP26TpUJg3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp
27RIGAAtvKLEiUUjpQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87q
qA8MpugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongPXvPKnbwb
PKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIweSsCI3zWQzj8C9GRh3sfI
B5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNz
FrwFuHnYWa8G5z9nODmxfKuU4CkUpijy323imttUQ/hHWKNddBWcwauwxzQ=
-----END CERTIFICATE-----

D-TRUST EV Root CA 2 2023
=========================
-----BEGIN CERTIFICATE-----
MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg
MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT
BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1
sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/
MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf
vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM
lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3
YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910
7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo
nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa
QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF
AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y
XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS
Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2
QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD
UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V
4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo
dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi
TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi
S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/
HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L
+KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg==
-----END CERTIFICATE-----

SwissSign RSA TLS Root CA 2022 - 1
==================================
-----BEGIN CERTIFICATE-----
MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UEAxMiU3dpc3NTaWduIFJTQSBU
TFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgxMTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJ
BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0Eg
VExTIFJvb3QgQ0EgMjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmji
C8NXvDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7LCTLf5Im
gKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX5XH8irCRIFucdFJtrhUn
WXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyEEPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlf
GUEGjw5NBuBwQCMBauTLE5tzrE0USJIt/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36q
OTw7D59Ke4LKa2/KIj4x0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLO
EGrOyvi5KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM0ZPl
EuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shdOxtYk8EXlFXIC+OC
eYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrtaclXvyFu1cvh43zcgTFeRc5JzrBh3
Q4IgaezprClG5QtO+DdziZaKHG29777YtvTKwP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQAB
o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow
4UD2p8P98Q+4DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL
BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO310aewCoSPY6W
lkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgzHqp41eZUBDqyggmNzhYzWUUo
8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQiJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zp
y1FVCypM9fJkT6lc/2cyjlUtMoIcgC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3Cjlvr
zG4ngRhZi0Rjn9UMZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6M
OuhFLhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJpzv1/THfQ
wUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/TdAo9QAwKxuDdollDruF/U
KIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0n
hzck5npgL7XTgwSqT0N1osGDsieYK7EOgLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rw
tnu64ZzZ
-----END CERTIFICATE-----
<?php










namespace Composer\CaBundle;

use Psr\Log\LoggerInterface;
use Symfony\Component\Process\PhpProcess;





class CaBundle
{

private static $caPath;

private static $caFileValidity = array();






































public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null)
{
if (self::$caPath !== null) {
return self::$caPath;
}
$caBundlePaths = array();



$caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE');



$caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR');

$caBundlePaths[] = ini_get('openssl.cafile');
$caBundlePaths[] = ini_get('openssl.capath');

$otherLocations = array(
'/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', 
'/etc/pki/tls/certs/ca-bundle.crt', 
'/etc/ssl/certs/ca-certificates.crt', 
'/etc/ssl/ca-bundle.pem', 
'/usr/ssl/certs/ca-bundle.crt', 
'/opt/local/share/curl/curl-ca-bundle.crt', 
'/usr/local/share/curl/curl-ca-bundle.crt', 
'/usr/share/ssl/certs/ca-bundle.crt', 
'/etc/ssl/cert.pem', 
'/usr/local/etc/openssl/cert.pem', 
'/usr/local/etc/openssl@1.1/cert.pem', 
'/opt/homebrew/etc/openssl@3/cert.pem', 
'/opt/homebrew/etc/openssl@1.1/cert.pem', 
'/etc/pki/tls/certs',
'/etc/ssl/certs', 
);

$caBundlePaths = array_merge($caBundlePaths, $otherLocations);

foreach ($caBundlePaths as $caBundle) {
if ($caBundle && self::caFileUsable($caBundle, $logger)) {
return self::$caPath = $caBundle;
}

if ($caBundle && self::caDirUsable($caBundle, $logger)) {
return self::$caPath = $caBundle;
}
}

return self::$caPath = static::getBundledCaBundlePath(); 
}








public static function getBundledCaBundlePath()
{
$caBundleFile = __DIR__.'/../res/cacert.pem';



if (0 === strpos($caBundleFile, 'phar://')) {
$tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-');
if (false === $tempCaBundleFile) {
throw new \RuntimeException('Could not create a temporary file to store the bundled CA file');
}

file_put_contents(
$tempCaBundleFile,
file_get_contents($caBundleFile)
);

register_shutdown_function(function() use ($tempCaBundleFile) {
@unlink($tempCaBundleFile);
});

$caBundleFile = $tempCaBundleFile;
}

return $caBundleFile;
}









public static function validateCaFile($filename, ?LoggerInterface $logger = null)
{
static $warned = false;

if (isset(self::$caFileValidity[$filename])) {
return self::$caFileValidity[$filename];
}

$contents = file_get_contents($filename);

if (is_string($contents) && strlen($contents) > 0) {
$contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents);
if (null === $contents) {

$isValid = false;
} else {
$isValid = (bool) openssl_x509_parse($contents);
}
} else {
$isValid = false;
}

if ($logger) {
$logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid'));
}

return self::$caFileValidity[$filename] = $isValid;
}









public static function isOpensslParseSafe()
{
return true;
}





public static function reset()
{
self::$caFileValidity = array();
self::$caPath = null;
}





private static function getEnvVariable($name)
{
if (isset($_SERVER[$name])) {
return (string) $_SERVER[$name];
}

if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) {
return (string) $value;
}

return false;
}






private static function caFileUsable($certFile, ?LoggerInterface $logger = null)
{
return $certFile
&& self::isFile($certFile, $logger)
&& self::isReadable($certFile, $logger)
&& self::validateCaFile($certFile, $logger);
}






private static function caDirUsable($certDir, ?LoggerInterface $logger = null)
{
return $certDir
&& self::isDir($certDir, $logger)
&& self::isReadable($certDir, $logger)
&& self::glob($certDir . '/*', $logger);
}






private static function isFile($certFile, ?LoggerInterface $logger = null)
{
$isFile = @is_file($certFile);
if (!$isFile && $logger) {
$logger->debug(sprintf('Checked CA file %s does not exist or it is not a file.', $certFile));
}

return $isFile;
}






private static function isDir($certDir, ?LoggerInterface $logger = null)
{
$isDir = @is_dir($certDir);
if (!$isDir && $logger) {
$logger->debug(sprintf('Checked directory %s does not exist or it is not a directory.', $certDir));
}

return $isDir;
}






private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null)
{
$isReadable = @is_readable($certFileOrDir);
if (!$isReadable && $logger) {
$logger->debug(sprintf('Checked file or directory %s is not readable.', $certFileOrDir));
}

return $isReadable;
}






private static function glob($pattern, ?LoggerInterface $logger = null)
{
$certs = glob($pattern);
if ($certs === false) {
if ($logger) {
$logger->debug(sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern));
}
return false;
}

if (count($certs) === 0) {
if ($logger) {
$logger->debug(sprintf("No CA files found for pattern: %s", $pattern));
}
return false;
}

return true;
}
}
<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var \Closure(string):void */
    private static $includeFile;

    /** @var string|null */
    private $vendorDir;

    // PSR-4
    /**
     * @var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array<string, list<string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var list<string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * List of PSR-0 prefixes
     *
     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
     *
     * @var array<string, array<string, list<string>>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var list<string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var array<string, bool>
     */
    private $missingClasses = array();

    /** @var string|null */
    private $apcuPrefix;

    /**
     * @var array<string, self>
     */
    private static $registeredLoaders = array();

    /**
     * @param string|null $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
        self::initializeIncludeClosure();
    }

    /**
     * @return array<string, list<string>>
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array<string, list<string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return list<string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return list<string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return array<string, string> Array of classname => path
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param array<string, string> $classMap Class to filename map
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string              $prefix  The prefix
     * @param list<string>|string $paths   The PSR-0 root directories
     * @param bool                $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        $paths = (array) $paths;
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string              $prefix  The prefix/namespace, with trailing '\\'
     * @param list<string>|string $paths   The PSR-4 base directories
     * @param bool                $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        $paths = (array) $paths;
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string              $prefix The prefix
     * @param list<string>|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string              $prefix The prefix/namespace, with trailing '\\'
     * @param list<string>|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            $includeFile = self::$includeFile;
            $includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders keyed by their corresponding vendor directories.
     *
     * @return array<string, self>
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }

    /**
     * @return void
     */
    private static function initializeIncludeClosure()
    {
        if (self::$includeFile !== null) {
            return;
        }

        /**
         * Scope isolated include.
         *
         * Prevents access to $this/self from included files.
         *
         * @param  string $file
         * @return void
         */
        self::$includeFile = \Closure::bind(static function($file) {
            include $file;
        }, null, null);
    }
}
<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'LTDBeget\\stringstream' => array($vendorDir . '/ltd-beget/stringstream/src'),
    'LTDBeget\\dns' => array($vendorDir . '/ltd-beget/dns-zone-configurator/src', $vendorDir . '/ltd-beget/dns-zone-tokenizer/src'),
    'LTDBeget\\ascii' => array($vendorDir . '/ltd-beget/ascii-table/src'),
);
<?php return array(
'root' => array(
'name' => 'acquia/cli',
'pretty_version' => 'dev-44c7c609b8437330bf5924877e51c0bc10dee646',
'version' => 'dev-44c7c609b8437330bf5924877e51c0bc10dee646',
'reference' => '44c7c609b8437330bf5924877e51c0bc10dee646',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev' => false,
),
'versions' => array(
'acquia/cli' => array(
'pretty_version' => 'dev-44c7c609b8437330bf5924877e51c0bc10dee646',
'version' => 'dev-44c7c609b8437330bf5924877e51c0bc10dee646',
'reference' => '44c7c609b8437330bf5924877e51c0bc10dee646',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev_requirement' => false,
),
'acquia/drupal-environment-detector' => array(
'pretty_version' => '1.7.0',
'version' => '1.7.0.0',
'reference' => '4666ae67b422d209a8b11c9f886e3ef6d3f16778',
'type' => 'library',
'install_path' => __DIR__ . '/../acquia/drupal-environment-detector',
'aliases' => array(),
'dev_requirement' => false,
),
'brick/math' => array(
'pretty_version' => '0.14.0',
'version' => '0.14.0.0',
'reference' => '113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2',
'type' => 'library',
'install_path' => __DIR__ . '/../brick/math',
'aliases' => array(),
'dev_requirement' => false,
),
'bugsnag/bugsnag' => array(
'pretty_version' => 'v3.30.0',
'version' => '3.30.0.0',
'reference' => 'ea174966d8a09424d7963e1e0fe9d570b63ff98c',
'type' => 'library',
'install_path' => __DIR__ . '/../bugsnag/bugsnag',
'aliases' => array(),
'dev_requirement' => false,
),
'clue/stream-filter' => array(
'pretty_version' => 'v1.7.0',
'version' => '1.7.0.0',
'reference' => '049509fef80032cb3f051595029ab75b49a3c2f7',
'type' => 'library',
'install_path' => __DIR__ . '/../clue/stream-filter',
'aliases' => array(),
'dev_requirement' => false,
),
'composer/ca-bundle' => array(
'pretty_version' => '1.5.8',
'version' => '1.5.8.0',
'reference' => '719026bb30813accb68271fee7e39552a58e9f65',
'type' => 'library',
'install_path' => __DIR__ . '/./ca-bundle',
'aliases' => array(),
'dev_requirement' => false,
),
'composer/semver' => array(
'pretty_version' => '3.4.4',
'version' => '3.4.4.0',
'reference' => '198166618906cb2de69b95d7d47e5fa8aa1b2b95',
'type' => 'library',
'install_path' => __DIR__ . '/./semver',
'aliases' => array(),
'dev_requirement' => false,
),
'consolidation/self-update' => array(
'pretty_version' => '3.1.0',
'version' => '3.1.0.0',
'reference' => '3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc',
'type' => 'library',
'install_path' => __DIR__ . '/../consolidation/self-update',
'aliases' => array(),
'dev_requirement' => false,
),
'container-interop/container-interop' => array(
'dev_requirement' => false,
'replaced' => array(
0 => '^1.2.0',
),
),
'dflydev/dot-access-data' => array(
'pretty_version' => 'v3.0.3',
'version' => '3.0.3.0',
'reference' => 'a23a2bf4f31d3518f3ecb38660c95715dfead60f',
'type' => 'library',
'install_path' => __DIR__ . '/../dflydev/dot-access-data',
'aliases' => array(),
'dev_requirement' => false,
),
'evenement/evenement' => array(
'pretty_version' => 'v3.0.2',
'version' => '3.0.2.0',
'reference' => '0a16b0d71ab13284339abb99d9d2bd813640efbc',
'type' => 'library',
'install_path' => __DIR__ . '/../evenement/evenement',
'aliases' => array(),
'dev_requirement' => false,
),
'graham-campbell/result-type' => array(
'pretty_version' => 'v1.1.3',
'version' => '1.1.3.0',
'reference' => '3ba905c11371512af9d9bdd27d99b782216b6945',
'type' => 'library',
'install_path' => __DIR__ . '/../graham-campbell/result-type',
'aliases' => array(),
'dev_requirement' => false,
),
'grasmash/expander' => array(
'pretty_version' => '3.0.1',
'version' => '3.0.1.0',
'reference' => 'eea11b9afb0c32483b18b9009f4ca07b770e39f4',
'type' => 'library',
'install_path' => __DIR__ . '/../grasmash/expander',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
'pretty_version' => '7.10.0',
'version' => '7.10.0.0',
'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
'pretty_version' => '2.3.0',
'version' => '2.3.0.0',
'reference' => '481557b130ef3790cf82b713667b43030dc9c957',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/psr7' => array(
'pretty_version' => '2.8.0',
'version' => '2.8.0.0',
'reference' => '21dc724a0583619cd1652f673303492272778051',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(),
'dev_requirement' => false,
),
'http-interop/http-factory-guzzle' => array(
'pretty_version' => '1.2.0',
'version' => '1.2.0.0',
'reference' => '8f06e92b95405216b237521cc64c804dd44c4a81',
'type' => 'library',
'install_path' => __DIR__ . '/../http-interop/http-factory-guzzle',
'aliases' => array(),
'dev_requirement' => false,
),
'kevinrob/guzzle-cache-middleware' => array(
'pretty_version' => '6.0.0',
'version' => '6.0.0.0',
'reference' => '61305ed694e763e887a04f61e71e2292bb4fbad1',
'type' => 'library',
'install_path' => __DIR__ . '/../kevinrob/guzzle-cache-middleware',
'aliases' => array(),
'dev_requirement' => false,
),
'laminas/laminas-servicemanager' => array(
'pretty_version' => '3.24.0',
'version' => '3.24.0.0',
'reference' => 'b172a0df568bf37ebdfb3658263156eefe3c1e8c',
'type' => 'library',
'install_path' => __DIR__ . '/../laminas/laminas-servicemanager',
'aliases' => array(),
'dev_requirement' => false,
),
'laminas/laminas-stdlib' => array(
'pretty_version' => '3.21.0',
'version' => '3.21.0.0',
'reference' => 'b1c81514cfe158aadf724c42b34d3d0a8164c096',
'type' => 'library',
'install_path' => __DIR__ . '/../laminas/laminas-stdlib',
'aliases' => array(),
'dev_requirement' => false,
),
'laminas/laminas-validator' => array(
'pretty_version' => '2.65.0',
'version' => '2.65.0.0',
'reference' => 'f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49',
'type' => 'library',
'install_path' => __DIR__ . '/../laminas/laminas-validator',
'aliases' => array(),
'dev_requirement' => false,
),
'league/csv' => array(
'pretty_version' => '9.27.1',
'version' => '9.27.1.0',
'reference' => '26de738b8fccf785397d05ee2fc07b6cd8749797',
'type' => 'library',
'install_path' => __DIR__ . '/../league/csv',
'aliases' => array(),
'dev_requirement' => false,
),
'league/oauth2-client' => array(
'pretty_version' => '2.8.1',
'version' => '2.8.1.0',
'reference' => '9df2924ca644736c835fc60466a3a60390d334f9',
'type' => 'library',
'install_path' => __DIR__ . '/../league/oauth2-client',
'aliases' => array(),
'dev_requirement' => false,
),
'loophp/phposinfo' => array(
'pretty_version' => '1.8.0',
'version' => '1.8.0.0',
'reference' => '9faccbfbf5364fd34fbc230961fa6fc51cc66b8f',
'type' => 'library',
'install_path' => __DIR__ . '/../loophp/phposinfo',
'aliases' => array(),
'dev_requirement' => false,
),
'ltd-beget/ascii-table' => array(
'pretty_version' => '1.0.4',
'version' => '1.0.4.0',
'reference' => '4020cf9015ceff6405b7204bc14c8d58cf9879dd',
'type' => 'library',
'install_path' => __DIR__ . '/../ltd-beget/ascii-table',
'aliases' => array(),
'dev_requirement' => false,
),
'ltd-beget/dns-zone-configurator' => array(
'pretty_version' => 'v1.4.0',
'version' => '1.4.0.0',
'reference' => '4e163fdead146e3de6ce7938b99d820395782cdc',
'type' => 'library',
'install_path' => __DIR__ . '/../ltd-beget/dns-zone-configurator',
'aliases' => array(),
'dev_requirement' => false,
),
'ltd-beget/dns-zone-tokenizer' => array(
'pretty_version' => 'v0.0.11',
'version' => '0.0.11.0',
'reference' => 'f57d614a7205a8d4ff0112a4c954a2425c218272',
'type' => 'library',
'install_path' => __DIR__ . '/../ltd-beget/dns-zone-tokenizer',
'aliases' => array(),
'dev_requirement' => false,
),
'ltd-beget/stringstream' => array(
'pretty_version' => 'v2.0.0',
'version' => '2.0.0.0',
'reference' => 'abd5d4f514a916f11f054bf577491e549ecf61ac',
'type' => 'library',
'install_path' => __DIR__ . '/../ltd-beget/stringstream',
'aliases' => array(),
'dev_requirement' => false,
),
'm4tthumphrey/php-gitlab-api' => array(
'pretty_version' => '12.0.0',
'version' => '12.0.0.0',
'reference' => '362450ff932296bc15796f97da8cf57941650037',
'type' => 'library',
'install_path' => __DIR__ . '/../m4tthumphrey/php-gitlab-api',
'aliases' => array(),
'dev_requirement' => false,
),
'marc-mabe/php-enum' => array(
'pretty_version' => 'v4.7.2',
'version' => '4.7.2.0',
'reference' => 'bb426fcdd65c60fb3638ef741e8782508fda7eef',
'type' => 'library',
'install_path' => __DIR__ . '/../marc-mabe/php-enum',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/async-client-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '*',
),
),
'php-http/cache-plugin' => array(
'pretty_version' => '2.0.1',
'version' => '2.0.1.0',
'reference' => '5c591e9e04602cec12307e3e1be3abefeb005e29',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/cache-plugin',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/client-common' => array(
'pretty_version' => '2.7.2',
'version' => '2.7.2.0',
'reference' => '0cfe9858ab9d3b213041b947c881d5b19ceeca46',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/client-common',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/client-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '*',
),
),
'php-http/discovery' => array(
'pretty_version' => '1.20.0',
'version' => '1.20.0.0',
'reference' => '82fe4c73ef3363caed49ff8dd1539ba06044910d',
'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../php-http/discovery',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/httplug' => array(
'pretty_version' => '2.4.1',
'version' => '2.4.1.0',
'reference' => '5cad731844891a4c282f3f3e1b582c46839d22f4',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/httplug',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/message' => array(
'pretty_version' => '1.16.2',
'version' => '1.16.2.0',
'reference' => '06dd5e8562f84e641bf929bfe699ee0f5ce8080a',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/message',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/message-factory-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0',
),
),
'php-http/multipart-stream-builder' => array(
'pretty_version' => '1.4.2',
'version' => '1.4.2.0',
'reference' => '10086e6de6f53489cca5ecc45b6f468604d3460e',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/multipart-stream-builder',
'aliases' => array(),
'dev_requirement' => false,
),
'php-http/promise' => array(
'pretty_version' => '1.3.1',
'version' => '1.3.1.0',
'reference' => 'fc85b1fba37c169a69a07ef0d5a8075770cc1f83',
'type' => 'library',
'install_path' => __DIR__ . '/../php-http/promise',
'aliases' => array(),
'dev_requirement' => false,
),
'phpoption/phpoption' => array(
'pretty_version' => '1.9.4',
'version' => '1.9.4.0',
'reference' => '638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d',
'type' => 'library',
'install_path' => __DIR__ . '/../phpoption/phpoption',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/cache' => array(
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/cache',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/cache-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '2.0|3.0',
),
),
'psr/container' => array(
'pretty_version' => '1.1.2',
'version' => '1.1.2.0',
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/container',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/container-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.1|2.0',
1 => '^1.0',
),
),
'psr/event-dispatcher' => array(
'pretty_version' => '1.0.0',
'version' => '1.0.0.0',
'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/event-dispatcher',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/event-dispatcher-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0',
),
),
'psr/http-client' => array(
'pretty_version' => '1.0.3',
'version' => '1.0.3.0',
'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-client',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-client-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '*',
1 => '1.0',
),
),
'psr/http-factory' => array(
'pretty_version' => '1.1.0',
'version' => '1.1.0.0',
'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-factory',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-factory-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '*',
1 => '1.0',
2 => '^1.0',
),
),
'psr/http-message' => array(
'pretty_version' => '2.0',
'version' => '2.0.0.0',
'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-message',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-message-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '*',
1 => '1.0',
),
),
'psr/log' => array(
'pretty_version' => '3.0.2',
'version' => '3.0.2.0',
'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/log',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/log-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0|2.0|3.0',
),
),
'psr/simple-cache-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0|2.0|3.0',
),
),
'ralouphie/getallheaders' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
'type' => 'library',
'install_path' => __DIR__ . '/../ralouphie/getallheaders',
'aliases' => array(),
'dev_requirement' => false,
),
'ramsey/collection' => array(
'pretty_version' => '2.1.1',
'version' => '2.1.1.0',
'reference' => '344572933ad0181accbf4ba763e85a0306a8c5e2',
'type' => 'library',
'install_path' => __DIR__ . '/../ramsey/collection',
'aliases' => array(),
'dev_requirement' => false,
),
'ramsey/uuid' => array(
'pretty_version' => '4.9.1',
'version' => '4.9.1.0',
'reference' => '81f941f6f729b1e3ceea61d9d014f8b6c6800440',
'type' => 'library',
'install_path' => __DIR__ . '/../ramsey/uuid',
'aliases' => array(),
'dev_requirement' => false,
),
'ratchet/pawl' => array(
'pretty_version' => 'v0.4.3',
'version' => '0.4.3.0',
'reference' => '2c582373c78271de32cb04c755c4c0db7e09c9c0',
'type' => 'library',
'install_path' => __DIR__ . '/../ratchet/pawl',
'aliases' => array(),
'dev_requirement' => false,
),
'ratchet/rfc6455' => array(
'pretty_version' => 'v0.4.0',
'version' => '0.4.0.0',
'reference' => '859d95f85dda0912c6d5b936d036d044e3af47ef',
'type' => 'library',
'install_path' => __DIR__ . '/../ratchet/rfc6455',
'aliases' => array(),
'dev_requirement' => false,
),
'react/cache' => array(
'pretty_version' => 'v1.2.0',
'version' => '1.2.0.0',
'reference' => 'd47c472b64aa5608225f47965a484b75c7817d5b',
'type' => 'library',
'install_path' => __DIR__ . '/../react/cache',
'aliases' => array(),
'dev_requirement' => false,
),
'react/dns' => array(
'pretty_version' => 'v1.13.0',
'version' => '1.13.0.0',
'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5',
'type' => 'library',
'install_path' => __DIR__ . '/../react/dns',
'aliases' => array(),
'dev_requirement' => false,
),
'react/event-loop' => array(
'pretty_version' => 'v1.6.0',
'version' => '1.6.0.0',
'reference' => 'ba276bda6083df7e0050fd9b33f66ad7a4ac747a',
'type' => 'library',
'install_path' => __DIR__ . '/../react/event-loop',
'aliases' => array(),
'dev_requirement' => false,
),
'react/promise' => array(
'pretty_version' => 'v3.3.0',
'version' => '3.3.0.0',
'reference' => '23444f53a813a3296c1368bb104793ce8d88f04a',
'type' => 'library',
'install_path' => __DIR__ . '/../react/promise',
'aliases' => array(),
'dev_requirement' => false,
),
'react/socket' => array(
'pretty_version' => 'v1.16.0',
'version' => '1.16.0.0',
'reference' => '23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1',
'type' => 'library',
'install_path' => __DIR__ . '/../react/socket',
'aliases' => array(),
'dev_requirement' => false,
),
'react/stream' => array(
'pretty_version' => 'v1.4.0',
'version' => '1.4.0.0',
'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d',
'type' => 'library',
'install_path' => __DIR__ . '/../react/stream',
'aliases' => array(),
'dev_requirement' => false,
),
'rhumsaa/uuid' => array(
'dev_requirement' => false,
'replaced' => array(
0 => '4.9.1',
),
),
'symfony/cache' => array(
'pretty_version' => 'v6.4.27',
'version' => '6.4.27.0',
'reference' => '3b9cf252b3bb54d5daddea5704b95ea7117b39f4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/cache-contracts' => array(
'pretty_version' => 'v3.6.0',
'version' => '3.6.0.0',
'reference' => '5d68a57d66910405e5c0b63d6f0af941e66fc868',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/cache-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/cache-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.1|2.0|3.0',
),
),
'symfony/config' => array(
'pretty_version' => 'v6.4.26',
'version' => '6.4.26.0',
'reference' => 'f18dc5926cb203e125956987def795d052ee774e',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/config',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/console' => array(
'pretty_version' => 'v6.4.27',
'version' => '6.4.27.0',
'reference' => '13d3176cf8ad8ced24202844e9f95af11e2959fc',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/console',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/dependency-injection' => array(
'pretty_version' => 'v6.4.26',
'version' => '6.4.26.0',
'reference' => '5f311eaf0b321f8ec640f6bae12da43a14026898',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dependency-injection',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/deprecation-contracts' => array(
'pretty_version' => 'v3.6.0',
'version' => '3.6.0.0',
'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/dotenv' => array(
'pretty_version' => 'v6.4.24',
'version' => '6.4.24.0',
'reference' => '234b6c602f12b00693f4b0d1054386fb30dfc8ff',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dotenv',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/error-handler' => array(
'pretty_version' => 'v7.3.4',
'version' => '7.3.4.0',
'reference' => '99f81bc944ab8e5dae4f21b4ca9972698bbad0e4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/error-handler',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/event-dispatcher' => array(
'pretty_version' => 'v6.4.25',
'version' => '6.4.25.0',
'reference' => 'b0cf3162020603587363f0551cd3be43958611ff',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/event-dispatcher',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/event-dispatcher-contracts' => array(
'pretty_version' => 'v3.6.0',
'version' => '3.6.0.0',
'reference' => '59eb412e93815df44f05f342958efa9f46b1e586',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/event-dispatcher-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '2.0|3.0',
),
),
'symfony/expression-language' => array(
'pretty_version' => 'v6.4.24',
'version' => '6.4.24.0',
'reference' => '1ea0adaa53539ea7e70821ae9de49ebe03ae7091',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/expression-language',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/filesystem' => array(
'pretty_version' => 'v6.4.24',
'version' => '6.4.24.0',
'reference' => '75ae2edb7cdcc0c53766c30b0a2512b8df574bd8',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/filesystem',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/finder' => array(
'pretty_version' => 'v6.4.27',
'version' => '6.4.27.0',
'reference' => 'a1b6aa435d2fba50793b994a839c32b6064f063b',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/finder',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/flex' => array(
'pretty_version' => 'v2.10.0',
'version' => '2.10.0.0',
'reference' => '9cd384775973eabbf6e8b05784dda279fc67c28d',
'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../symfony/flex',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/http-foundation' => array(
'pretty_version' => 'v7.3.7',
'version' => '7.3.7.0',
'reference' => 'db488a62f98f7a81d5746f05eea63a74e55bb7c4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-foundation',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/http-kernel' => array(
'pretty_version' => 'v6.4.27',
'version' => '6.4.27.0',
'reference' => '4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-kernel',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/options-resolver' => array(
'pretty_version' => 'v7.3.3',
'version' => '7.3.3.0',
'reference' => '0ff2f5c3df08a395232bbc3c2eb7e84912df911d',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/options-resolver',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-ctype' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-intl-grapheme' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => '380872130d3a5dd3ace2f4010d95125fde5d5c70',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-intl-normalizer' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => '3833d7255cc303546435cb650316bff708a1c75c',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php80' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php83' => array(
'pretty_version' => 'v1.33.0',
'version' => '1.33.0.0',
'reference' => '17f6f9a6b1735c0f163024d959f700cfbc5155e5',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php83',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/process' => array(
'pretty_version' => 'v6.4.26',
'version' => '6.4.26.0',
'reference' => '48bad913268c8cafabbf7034b39c8bb24fbc5ab8',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/process',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/service-contracts' => array(
'pretty_version' => 'v3.6.0',
'version' => '3.6.0.0',
'reference' => 'f021b05a130d35510bd6b25fe9053c2a8a15d5d4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/service-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/service-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.1|2.0|3.0',
),
),
'symfony/string' => array(
'pretty_version' => 'v7.3.4',
'version' => '7.3.4.0',
'reference' => 'f96476035142921000338bad71e5247fbc138872',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/string',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/translation-contracts' => array(
'pretty_version' => 'v3.6.0',
'version' => '3.6.0.0',
'reference' => 'df210c7a2573f1913b2d17cc95f90f53a73d8f7d',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/translation-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/validator' => array(
'pretty_version' => 'v6.4.27',
'version' => '6.4.27.0',
'reference' => '60dd71e219cd3d76fde906eb6b6c1271db628f5b',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/validator',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/var-dumper' => array(
'pretty_version' => 'v7.3.5',
'version' => '7.3.5.0',
'reference' => '476c4ae17f43a9a36650c69879dcf5b1e6ae724d',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-dumper',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/var-exporter' => array(
'pretty_version' => 'v7.3.4',
'version' => '7.3.4.0',
'reference' => '0f020b544a30a7fe8ba972e53ee48a74c0bc87f4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-exporter',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/yaml' => array(
'pretty_version' => 'v6.4.26',
'version' => '6.4.26.0',
'reference' => '0fc8b966fd0dcaab544ae59bfc3a433f048c17b0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/yaml',
'aliases' => array(),
'dev_requirement' => false,
),
'thecodingmachine/safe' => array(
'pretty_version' => 'v3.0.2',
'version' => '3.0.2.0',
'reference' => '22ffad3248982a784f9870a37aeb2e522bd19645',
'type' => 'library',
'install_path' => __DIR__ . '/../thecodingmachine/safe',
'aliases' => array(
0 => '2.5.0',
),
'dev_requirement' => false,
),
'typhonius/acquia-logstream' => array(
'pretty_version' => '0.0.15',
'version' => '0.0.15.0',
'reference' => '79565fbe10cf57f534145572a8614115111552ae',
'type' => 'library',
'install_path' => __DIR__ . '/../typhonius/acquia-logstream',
'aliases' => array(),
'dev_requirement' => false,
),
'typhonius/acquia-php-sdk-v2' => array(
'pretty_version' => '3.7.3',
'version' => '3.7.3.0',
'reference' => 'eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8',
'type' => 'library',
'install_path' => __DIR__ . '/../typhonius/acquia-php-sdk-v2',
'aliases' => array(),
'dev_requirement' => false,
),
'vlucas/phpdotenv' => array(
'pretty_version' => 'v5.6.2',
'version' => '5.6.2.0',
'reference' => '24ac4c74f91ee2c193fa1aaa5c249cb0822809af',
'type' => 'library',
'install_path' => __DIR__ . '/../vlucas/phpdotenv',
'aliases' => array(),
'dev_requirement' => false,
),
'zumba/amplitude-php' => array(
'pretty_version' => '1.0.8',
'version' => '1.0.8.0',
'reference' => '5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd',
'type' => 'library',
'install_path' => __DIR__ . '/../zumba/amplitude-php',
'aliases' => array(),
'dev_requirement' => false,
),
),
);
<?php

// platform_check.php @generated by Composer

$issues = array();

if (!(PHP_VERSION_ID >= 80200)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.';
}

if ($issues) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    throw new \RuntimeException(
        'Composer detected issues in your platform: ' . implode(' ', $issues)
    );
}
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'AcquiaCloudApi\\Connector\\Client' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector/Client.php',
    'AcquiaCloudApi\\Connector\\ClientInterface' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector/ClientInterface.php',
    'AcquiaCloudApi\\Connector\\Connector' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector/Connector.php',
    'AcquiaCloudApi\\Connector\\ConnectorInterface' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector/ConnectorInterface.php',
    'AcquiaCloudApi\\Connector\\OktaProvider' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Connector/OktaProvider.php',
    'AcquiaCloudApi\\Endpoints\\Account' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Account.php',
    'AcquiaCloudApi\\Endpoints\\Applications' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Applications.php',
    'AcquiaCloudApi\\Endpoints\\CloudApiBase' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiBase.php',
    'AcquiaCloudApi\\Endpoints\\CloudApiInterface' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CloudApiInterface.php',
    'AcquiaCloudApi\\Endpoints\\Code' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Code.php',
    'AcquiaCloudApi\\Endpoints\\CodebaseEnvironments' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/CodebaseEnvironments.php',
    'AcquiaCloudApi\\Endpoints\\Codebases' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Codebases.php',
    'AcquiaCloudApi\\Endpoints\\Crons' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Crons.php',
    'AcquiaCloudApi\\Endpoints\\DatabaseBackups' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/DatabaseBackups.php',
    'AcquiaCloudApi\\Endpoints\\Databases' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Databases.php',
    'AcquiaCloudApi\\Endpoints\\Domains' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Domains.php',
    'AcquiaCloudApi\\Endpoints\\Environments' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Environments.php',
    'AcquiaCloudApi\\Endpoints\\IdentityProviders' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/IdentityProviders.php',
    'AcquiaCloudApi\\Endpoints\\Ides' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Ides.php',
    'AcquiaCloudApi\\Endpoints\\Insights' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Insights.php',
    'AcquiaCloudApi\\Endpoints\\LogForwardingDestinations' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/LogForwardingDestinations.php',
    'AcquiaCloudApi\\Endpoints\\Logs' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Logs.php',
    'AcquiaCloudApi\\Endpoints\\Metrics' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Metrics.php',
    'AcquiaCloudApi\\Endpoints\\Notifications' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Notifications.php',
    'AcquiaCloudApi\\Endpoints\\Organizations' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Organizations.php',
    'AcquiaCloudApi\\Endpoints\\Permissions' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Permissions.php',
    'AcquiaCloudApi\\Endpoints\\Roles' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Roles.php',
    'AcquiaCloudApi\\Endpoints\\Servers' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Servers.php',
    'AcquiaCloudApi\\Endpoints\\SiteInstances' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SiteInstances.php',
    'AcquiaCloudApi\\Endpoints\\Sites' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Sites.php',
    'AcquiaCloudApi\\Endpoints\\SshKeys' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SshKeys.php',
    'AcquiaCloudApi\\Endpoints\\SslCertificates' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/SslCertificates.php',
    'AcquiaCloudApi\\Endpoints\\Subscriptions' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Subscriptions.php',
    'AcquiaCloudApi\\Endpoints\\Teams' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Teams.php',
    'AcquiaCloudApi\\Endpoints\\Variables' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Endpoints/Variables.php',
    'AcquiaCloudApi\\Exception\\ApiErrorException' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Exception/ApiErrorException.php',
    'AcquiaCloudApi\\Response\\AccountResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/AccountResponse.php',
    'AcquiaCloudApi\\Response\\ApplicationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ApplicationResponse.php',
    'AcquiaCloudApi\\Response\\ApplicationsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ApplicationsResponse.php',
    'AcquiaCloudApi\\Response\\BackupResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/BackupResponse.php',
    'AcquiaCloudApi\\Response\\BackupsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/BackupsResponse.php',
    'AcquiaCloudApi\\Response\\BranchResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/BranchResponse.php',
    'AcquiaCloudApi\\Response\\BranchesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/BranchesResponse.php',
    'AcquiaCloudApi\\Response\\BulkCodeSwitchResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/BulkCodeSwitchResponse.php',
    'AcquiaCloudApi\\Response\\CodebaseEnvironmentResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentResponse.php',
    'AcquiaCloudApi\\Response\\CodebaseEnvironmentsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseEnvironmentsResponse.php',
    'AcquiaCloudApi\\Response\\CodebaseResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CodebaseResponse.php',
    'AcquiaCloudApi\\Response\\CodebasesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CodebasesResponse.php',
    'AcquiaCloudApi\\Response\\CronResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CronResponse.php',
    'AcquiaCloudApi\\Response\\CronsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/CronsResponse.php',
    'AcquiaCloudApi\\Response\\DatabaseNameResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNameResponse.php',
    'AcquiaCloudApi\\Response\\DatabaseNamesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseNamesResponse.php',
    'AcquiaCloudApi\\Response\\DatabaseResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DatabaseResponse.php',
    'AcquiaCloudApi\\Response\\DatabasesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DatabasesResponse.php',
    'AcquiaCloudApi\\Response\\DomainResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DomainResponse.php',
    'AcquiaCloudApi\\Response\\DomainsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/DomainsResponse.php',
    'AcquiaCloudApi\\Response\\EnvironmentResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentResponse.php',
    'AcquiaCloudApi\\Response\\EnvironmentsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/EnvironmentsResponse.php',
    'AcquiaCloudApi\\Response\\IdeResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/IdeResponse.php',
    'AcquiaCloudApi\\Response\\IdentityProviderResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/IdentityProviderResponse.php',
    'AcquiaCloudApi\\Response\\IdentityProvidersResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/IdentityProvidersResponse.php',
    'AcquiaCloudApi\\Response\\IdesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/IdesResponse.php',
    'AcquiaCloudApi\\Response\\InsightAlertResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertResponse.php',
    'AcquiaCloudApi\\Response\\InsightAlertsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightAlertsResponse.php',
    'AcquiaCloudApi\\Response\\InsightCountResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightCountResponse.php',
    'AcquiaCloudApi\\Response\\InsightModuleResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightModuleResponse.php',
    'AcquiaCloudApi\\Response\\InsightModulesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightModulesResponse.php',
    'AcquiaCloudApi\\Response\\InsightResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightResponse.php',
    'AcquiaCloudApi\\Response\\InsightsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InsightsResponse.php',
    'AcquiaCloudApi\\Response\\InvitationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InvitationResponse.php',
    'AcquiaCloudApi\\Response\\InvitationsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/InvitationsResponse.php',
    'AcquiaCloudApi\\Response\\LogForwardingDestinationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationResponse.php',
    'AcquiaCloudApi\\Response\\LogForwardingDestinationsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/LogForwardingDestinationsResponse.php',
    'AcquiaCloudApi\\Response\\LogResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/LogResponse.php',
    'AcquiaCloudApi\\Response\\LogsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/LogsResponse.php',
    'AcquiaCloudApi\\Response\\LogstreamResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/LogstreamResponse.php',
    'AcquiaCloudApi\\Response\\MemberResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/MemberResponse.php',
    'AcquiaCloudApi\\Response\\MembersResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/MembersResponse.php',
    'AcquiaCloudApi\\Response\\MetricResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/MetricResponse.php',
    'AcquiaCloudApi\\Response\\MetricsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/MetricsResponse.php',
    'AcquiaCloudApi\\Response\\NotificationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/NotificationResponse.php',
    'AcquiaCloudApi\\Response\\NotificationsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/NotificationsResponse.php',
    'AcquiaCloudApi\\Response\\OperationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/OperationResponse.php',
    'AcquiaCloudApi\\Response\\OrganizationResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/OrganizationResponse.php',
    'AcquiaCloudApi\\Response\\OrganizationsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/OrganizationsResponse.php',
    'AcquiaCloudApi\\Response\\PermissionResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/PermissionResponse.php',
    'AcquiaCloudApi\\Response\\PermissionsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/PermissionsResponse.php',
    'AcquiaCloudApi\\Response\\ReferenceResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ReferenceResponse.php',
    'AcquiaCloudApi\\Response\\ReferencesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ReferencesResponse.php',
    'AcquiaCloudApi\\Response\\RoleResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/RoleResponse.php',
    'AcquiaCloudApi\\Response\\RolesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/RolesResponse.php',
    'AcquiaCloudApi\\Response\\ServerResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ServerResponse.php',
    'AcquiaCloudApi\\Response\\ServersResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/ServersResponse.php',
    'AcquiaCloudApi\\Response\\SiteInstanceDatabaseBackupResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupResponse.php',
    'AcquiaCloudApi\\Response\\SiteInstanceDatabaseBackupsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseBackupsResponse.php',
    'AcquiaCloudApi\\Response\\SiteInstanceDatabaseResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceDatabaseResponse.php',
    'AcquiaCloudApi\\Response\\SiteInstanceResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SiteInstanceResponse.php',
    'AcquiaCloudApi\\Response\\SiteResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SiteResponse.php',
    'AcquiaCloudApi\\Response\\SitesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SitesResponse.php',
    'AcquiaCloudApi\\Response\\SshKeyResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SshKeyResponse.php',
    'AcquiaCloudApi\\Response\\SshKeysResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SshKeysResponse.php',
    'AcquiaCloudApi\\Response\\SslCertificateResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SslCertificateResponse.php',
    'AcquiaCloudApi\\Response\\SslCertificatesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SslCertificatesResponse.php',
    'AcquiaCloudApi\\Response\\SubscriptionResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionResponse.php',
    'AcquiaCloudApi\\Response\\SubscriptionsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/SubscriptionsResponse.php',
    'AcquiaCloudApi\\Response\\TagResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/TagResponse.php',
    'AcquiaCloudApi\\Response\\TagsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/TagsResponse.php',
    'AcquiaCloudApi\\Response\\TeamResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/TeamResponse.php',
    'AcquiaCloudApi\\Response\\TeamsResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/TeamsResponse.php',
    'AcquiaCloudApi\\Response\\VariableResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/VariableResponse.php',
    'AcquiaCloudApi\\Response\\VariablesResponse' => $vendorDir . '/typhonius/acquia-php-sdk-v2/src/Response/VariablesResponse.php',
    'AcquiaLogstream\\LogstreamCommand' => $vendorDir . '/typhonius/acquia-logstream/src/LogstreamCommand.php',
    'AcquiaLogstream\\LogstreamManager' => $vendorDir . '/typhonius/acquia-logstream/src/LogstreamManager.php',
    'Acquia\\Cli\\AcsfApi\\AcsfClient' => $baseDir . '/src/AcsfApi/AcsfClient.php',
    'Acquia\\Cli\\AcsfApi\\AcsfClientService' => $baseDir . '/src/AcsfApi/AcsfClientService.php',
    'Acquia\\Cli\\AcsfApi\\AcsfConnector' => $baseDir . '/src/AcsfApi/AcsfConnector.php',
    'Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory' => $baseDir . '/src/AcsfApi/AcsfConnectorFactory.php',
    'Acquia\\Cli\\AcsfApi\\AcsfCredentials' => $baseDir . '/src/AcsfApi/AcsfCredentials.php',
    'Acquia\\Cli\\ApiCredentialsInterface' => $baseDir . '/src/ApiCredentialsInterface.php',
    'Acquia\\Cli\\Application' => $baseDir . '/src/Application.php',
    'Acquia\\Cli\\Attribute\\RequireAuth' => $baseDir . '/src/Attribute/RequireAuth.php',
    'Acquia\\Cli\\Attribute\\RequireLocalDb' => $baseDir . '/src/Attribute/RequireLocalDb.php',
    'Acquia\\Cli\\Attribute\\RequireRemoteDb' => $baseDir . '/src/Attribute/RequireRemoteDb.php',
    'Acquia\\Cli\\CloudApi\\AccessTokenConnector' => $baseDir . '/src/CloudApi/AccessTokenConnector.php',
    'Acquia\\Cli\\CloudApi\\ClientService' => $baseDir . '/src/CloudApi/ClientService.php',
    'Acquia\\Cli\\CloudApi\\CloudCredentials' => $baseDir . '/src/CloudApi/CloudCredentials.php',
    'Acquia\\Cli\\CloudApi\\ConnectorFactory' => $baseDir . '/src/CloudApi/ConnectorFactory.php',
    'Acquia\\Cli\\CommandFactoryInterface' => $baseDir . '/src/CommandFactoryInterface.php',
    'Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory' => $baseDir . '/src/Command/Acsf/AcsfCommandFactory.php',
    'Acquia\\Cli\\Command\\Acsf\\AcsfListCommand' => $baseDir . '/src/Command/Acsf/AcsfListCommand.php',
    'Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase' => $baseDir . '/src/Command/Acsf/AcsfListCommandBase.php',
    'Acquia\\Cli\\Command\\Api\\ApiBaseCommand' => $baseDir . '/src/Command/Api/ApiBaseCommand.php',
    'Acquia\\Cli\\Command\\Api\\ApiCommandFactory' => $baseDir . '/src/Command/Api/ApiCommandFactory.php',
    'Acquia\\Cli\\Command\\Api\\ApiCommandHelper' => $baseDir . '/src/Command/Api/ApiCommandHelper.php',
    'Acquia\\Cli\\Command\\Api\\ApiListCommand' => $baseDir . '/src/Command/Api/ApiListCommand.php',
    'Acquia\\Cli\\Command\\Api\\ApiListCommandBase' => $baseDir . '/src/Command/Api/ApiListCommandBase.php',
    'Acquia\\Cli\\Command\\App\\AppOpenCommand' => $baseDir . '/src/Command/App/AppOpenCommand.php',
    'Acquia\\Cli\\Command\\App\\AppVcsInfo' => $baseDir . '/src/Command/App/AppVcsInfo.php',
    'Acquia\\Cli\\Command\\App\\From\\Composer\\ProjectBuilder' => $baseDir . '/src/Command/App/From/Composer/ProjectBuilder.php',
    'Acquia\\Cli\\Command\\App\\From\\Configuration' => $baseDir . '/src/Command/App/From/Configuration.php',
    'Acquia\\Cli\\Command\\App\\From\\JsonResourceParserTrait' => $baseDir . '/src/Command/App/From/JsonResourceParserTrait.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\AbandonmentRecommendation' => $baseDir . '/src/Command/App/From/Recommendation/AbandonmentRecommendation.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\DefinedRecommendation' => $baseDir . '/src/Command/App/From/Recommendation/DefinedRecommendation.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\NoRecommendation' => $baseDir . '/src/Command/App/From/Recommendation/NoRecommendation.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\NormalizableInterface' => $baseDir . '/src/Command/App/From/Recommendation/NormalizableInterface.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\RecommendationInterface' => $baseDir . '/src/Command/App/From/Recommendation/RecommendationInterface.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\Recommendations' => $baseDir . '/src/Command/App/From/Recommendation/Recommendations.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\Resolver' => $baseDir . '/src/Command/App/From/Recommendation/Resolver.php',
    'Acquia\\Cli\\Command\\App\\From\\Recommendation\\UniversalRecommendation' => $baseDir . '/src/Command/App/From/Recommendation/UniversalRecommendation.php',
    'Acquia\\Cli\\Command\\App\\From\\Safety\\ArrayValidationTrait' => $baseDir . '/src/Command/App/From/Safety/ArrayValidationTrait.php',
    'Acquia\\Cli\\Command\\App\\From\\Safety\\StructuredArrayValidator' => $baseDir . '/src/Command/App/From/Safety/StructuredArrayValidator.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\Drupal7Extension' => $baseDir . '/src/Command/App/From/SourceSite/Drupal7Extension.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\Drupal7SiteInspector' => $baseDir . '/src/Command/App/From/SourceSite/Drupal7SiteInspector.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\ExportedDrupal7ExtensionsInspector' => $baseDir . '/src/Command/App/From/SourceSite/ExportedDrupal7ExtensionsInspector.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\ExtensionInterface' => $baseDir . '/src/Command/App/From/SourceSite/ExtensionInterface.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\SiteInspectorBase' => $baseDir . '/src/Command/App/From/SourceSite/SiteInspectorBase.php',
    'Acquia\\Cli\\Command\\App\\From\\SourceSite\\SiteInspectorInterface' => $baseDir . '/src/Command/App/From/SourceSite/SiteInspectorInterface.php',
    'Acquia\\Cli\\Command\\App\\LinkCommand' => $baseDir . '/src/Command/App/LinkCommand.php',
    'Acquia\\Cli\\Command\\App\\LogTailCommand' => $baseDir . '/src/Command/App/LogTailCommand.php',
    'Acquia\\Cli\\Command\\App\\NewCommand' => $baseDir . '/src/Command/App/NewCommand.php',
    'Acquia\\Cli\\Command\\App\\NewFromDrupal7Command' => $baseDir . '/src/Command/App/NewFromDrupal7Command.php',
    'Acquia\\Cli\\Command\\App\\TaskWaitCommand' => $baseDir . '/src/Command/App/TaskWaitCommand.php',
    'Acquia\\Cli\\Command\\App\\UnlinkCommand' => $baseDir . '/src/Command/App/UnlinkCommand.php',
    'Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand' => $baseDir . '/src/Command/Archive/ArchiveExportCommand.php',
    'Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand' => $baseDir . '/src/Command/Auth/AuthAcsfLoginCommand.php',
    'Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand' => $baseDir . '/src/Command/Auth/AuthAcsfLogoutCommand.php',
    'Acquia\\Cli\\Command\\Auth\\AuthLoginCommand' => $baseDir . '/src/Command/Auth/AuthLoginCommand.php',
    'Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand' => $baseDir . '/src/Command/Auth/AuthLogoutCommand.php',
    'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCiCdVariables' => $baseDir . '/src/Command/CodeStudio/CodeStudioCiCdVariables.php',
    'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCommandTrait' => $baseDir . '/src/Command/CodeStudio/CodeStudioCommandTrait.php',
    'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand' => $baseDir . '/src/Command/CodeStudio/CodeStudioPhpVersionCommand.php',
    'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand' => $baseDir . '/src/Command/CodeStudio/CodeStudioPipelinesMigrateCommand.php',
    'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand' => $baseDir . '/src/Command/CodeStudio/CodeStudioWizardCommand.php',
    'Acquia\\Cli\\Command\\CodeStudio\\EntityType' => $baseDir . '/src/Command/CodeStudio/EntityType.php',
    'Acquia\\Cli\\Command\\CommandBase' => $baseDir . '/src/Command/CommandBase.php',
    'Acquia\\Cli\\Command\\DocsCommand' => $baseDir . '/src/Command/DocsCommand.php',
    'Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand' => $baseDir . '/src/Command/Env/EnvCertCreateCommand.php',
    'Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand' => $baseDir . '/src/Command/Env/EnvCopyCronCommand.php',
    'Acquia\\Cli\\Command\\Env\\EnvCreateCommand' => $baseDir . '/src/Command/Env/EnvCreateCommand.php',
    'Acquia\\Cli\\Command\\Env\\EnvDeleteCommand' => $baseDir . '/src/Command/Env/EnvDeleteCommand.php',
    'Acquia\\Cli\\Command\\Env\\EnvMirrorCommand' => $baseDir . '/src/Command/Env/EnvMirrorCommand.php',
    'Acquia\\Cli\\Command\\HelloWorldCommand' => $baseDir . '/src/Command/HelloWorldCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeCommandBase' => $baseDir . '/src/Command/Ide/IdeCommandBase.php',
    'Acquia\\Cli\\Command\\Ide\\IdeCreateCommand' => $baseDir . '/src/Command/Ide/IdeCreateCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand' => $baseDir . '/src/Command/Ide/IdeDeleteCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeInfoCommand' => $baseDir . '/src/Command/Ide/IdeInfoCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeListCommand' => $baseDir . '/src/Command/Ide/IdeListCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeListMineCommand' => $baseDir . '/src/Command/Ide/IdeListMineCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeOpenCommand' => $baseDir . '/src/Command/Ide/IdeOpenCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand' => $baseDir . '/src/Command/Ide/IdePhpVersionCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand' => $baseDir . '/src/Command/Ide/IdeServiceRestartCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand' => $baseDir . '/src/Command/Ide/IdeServiceStartCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand' => $baseDir . '/src/Command/Ide/IdeServiceStopCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeShareCommand' => $baseDir . '/src/Command/Ide/IdeShareCommand.php',
    'Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand' => $baseDir . '/src/Command/Ide/IdeXdebugToggleCommand.php',
    'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCommandBase' => $baseDir . '/src/Command/Ide/Wizard/IdeWizardCommandBase.php',
    'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand' => $baseDir . '/src/Command/Ide/Wizard/IdeWizardCreateSshKeyCommand.php',
    'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand' => $baseDir . '/src/Command/Ide/Wizard/IdeWizardDeleteSshKeyCommand.php',
    'Acquia\\Cli\\Command\\Pull\\PullCodeCommand' => $baseDir . '/src/Command/Pull/PullCodeCommand.php',
    'Acquia\\Cli\\Command\\Pull\\PullCommand' => $baseDir . '/src/Command/Pull/PullCommand.php',
    'Acquia\\Cli\\Command\\Pull\\PullCommandBase' => $baseDir . '/src/Command/Pull/PullCommandBase.php',
    'Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand' => $baseDir . '/src/Command/Pull/PullDatabaseCommand.php',
    'Acquia\\Cli\\Command\\Pull\\PullFilesCommand' => $baseDir . '/src/Command/Pull/PullFilesCommand.php',
    'Acquia\\Cli\\Command\\Pull\\PullScriptsCommand' => $baseDir . '/src/Command/Pull/PullScriptsCommand.php',
    'Acquia\\Cli\\Command\\Push\\PushArtifactCommand' => $baseDir . '/src/Command/Push/PushArtifactCommand.php',
    'Acquia\\Cli\\Command\\Push\\PushCodeCommand' => $baseDir . '/src/Command/Push/PushCodeCommand.php',
    'Acquia\\Cli\\Command\\Push\\PushCommandBase' => $baseDir . '/src/Command/Push/PushCommandBase.php',
    'Acquia\\Cli\\Command\\Push\\PushDatabaseCommand' => $baseDir . '/src/Command/Push/PushDatabaseCommand.php',
    'Acquia\\Cli\\Command\\Push\\PushFilesCommand' => $baseDir . '/src/Command/Push/PushFilesCommand.php',
    'Acquia\\Cli\\Command\\Remote\\AliasListCommand' => $baseDir . '/src/Command/Remote/AliasListCommand.php',
    'Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand' => $baseDir . '/src/Command/Remote/AliasesDownloadCommand.php',
    'Acquia\\Cli\\Command\\Remote\\DrushCommand' => $baseDir . '/src/Command/Remote/DrushCommand.php',
    'Acquia\\Cli\\Command\\Remote\\SshBaseCommand' => $baseDir . '/src/Command/Remote/SshBaseCommand.php',
    'Acquia\\Cli\\Command\\Remote\\SshCommand' => $baseDir . '/src/Command/Remote/SshCommand.php',
    'Acquia\\Cli\\Command\\Self\\ClearCacheCommand' => $baseDir . '/src/Command/Self/ClearCacheCommand.php',
    'Acquia\\Cli\\Command\\Self\\ListCommand' => $baseDir . '/src/Command/Self/ListCommand.php',
    'Acquia\\Cli\\Command\\Self\\MakeDocsCommand' => $baseDir . '/src/Command/Self/MakeDocsCommand.php',
    'Acquia\\Cli\\Command\\Self\\SelfInfoCommand' => $baseDir . '/src/Command/Self/SelfInfoCommand.php',
    'Acquia\\Cli\\Command\\Self\\TelemetryCommand' => $baseDir . '/src/Command/Self/TelemetryCommand.php',
    'Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand' => $baseDir . '/src/Command/Self/TelemetryDisableCommand.php',
    'Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand' => $baseDir . '/src/Command/Self/TelemetryEnableCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyCommandBase' => $baseDir . '/src/Command/Ssh/SshKeyCommandBase.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand' => $baseDir . '/src/Command/Ssh/SshKeyCreateCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand' => $baseDir . '/src/Command/Ssh/SshKeyCreateUploadCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand' => $baseDir . '/src/Command/Ssh/SshKeyDeleteCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand' => $baseDir . '/src/Command/Ssh/SshKeyInfoCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand' => $baseDir . '/src/Command/Ssh/SshKeyListCommand.php',
    'Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand' => $baseDir . '/src/Command/Ssh/SshKeyUploadCommand.php',
    'Acquia\\Cli\\Command\\WizardCommandBase' => $baseDir . '/src/Command/WizardCommandBase.php',
    'Acquia\\Cli\\Config\\AcquiaCliConfig' => $baseDir . '/src/Config/AcquiaCliConfig.php',
    'Acquia\\Cli\\Config\\CloudDataConfig' => $baseDir . '/src/Config/CloudDataConfig.php',
    'Acquia\\Cli\\ConnectorFactoryInterface' => $baseDir . '/src/ConnectorFactoryInterface.php',
    'Acquia\\Cli\\DataStore\\AcquiaCliDatastore' => $baseDir . '/src/DataStore/AcquiaCliDatastore.php',
    'Acquia\\Cli\\DataStore\\CloudDataStore' => $baseDir . '/src/DataStore/CloudDataStore.php',
    'Acquia\\Cli\\DataStore\\DataStoreInterface' => $baseDir . '/src/DataStore/DataStoreInterface.php',
    'Acquia\\Cli\\DataStore\\Datastore' => $baseDir . '/src/DataStore/Datastore.php',
    'Acquia\\Cli\\DataStore\\JsonDataStore' => $baseDir . '/src/DataStore/JsonDataStore.php',
    'Acquia\\Cli\\DataStore\\YamlStore' => $baseDir . '/src/DataStore/YamlStore.php',
    'Acquia\\Cli\\EventListener\\ComposerScriptsListener' => $baseDir . '/src/EventListener/ComposerScriptsListener.php',
    'Acquia\\Cli\\EventListener\\ExceptionListener' => $baseDir . '/src/EventListener/ExceptionListener.php',
    'Acquia\\Cli\\Exception\\AcquiaCliException' => $baseDir . '/src/Exception/AcquiaCliException.php',
    'Acquia\\Cli\\Helpers\\AliasCache' => $baseDir . '/src/Helpers/AliasCache.php',
    'Acquia\\Cli\\Helpers\\DataStoreContract' => $baseDir . '/src/Helpers/DataStoreContract.php',
    'Acquia\\Cli\\Helpers\\IdeCommandTrait' => $baseDir . '/src/Helpers/IdeCommandTrait.php',
    'Acquia\\Cli\\Helpers\\LocalMachineHelper' => $baseDir . '/src/Helpers/LocalMachineHelper.php',
    'Acquia\\Cli\\Helpers\\LoopHelper' => $baseDir . '/src/Helpers/LoopHelper.php',
    'Acquia\\Cli\\Helpers\\SshCommandTrait' => $baseDir . '/src/Helpers/SshCommandTrait.php',
    'Acquia\\Cli\\Helpers\\SshHelper' => $baseDir . '/src/Helpers/SshHelper.php',
    'Acquia\\Cli\\Helpers\\TelemetryHelper' => $baseDir . '/src/Helpers/TelemetryHelper.php',
    'Acquia\\Cli\\Kernel' => $baseDir . '/src/Kernel.php',
    'Acquia\\Cli\\Output\\Checklist' => $baseDir . '/src/Output/Checklist.php',
    'Acquia\\Cli\\Output\\Spinner\\Spinner' => $baseDir . '/src/Output/Spinner/Spinner.php',
    'Acquia\\Cli\\Transformer\\EnvironmentTransformer' => $baseDir . '/src/Transformer/EnvironmentTransformer.php',
    'Acquia\\DrupalEnvironmentDetector\\AcquiaDrupalEnvironmentDetector' => $vendorDir . '/acquia/drupal-environment-detector/src/AcquiaDrupalEnvironmentDetector.php',
    'Acquia\\DrupalEnvironmentDetector\\EnvironmentNames' => $vendorDir . '/acquia/drupal-environment-detector/src/EnvironmentNames.php',
    'Acquia\\DrupalEnvironmentDetector\\FilePaths' => $vendorDir . '/acquia/drupal-environment-detector/src/FilePaths.php',
    'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
    'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php',
    'Brick\\Math\\BigInteger' => $vendorDir . '/brick/math/src/BigInteger.php',
    'Brick\\Math\\BigNumber' => $vendorDir . '/brick/math/src/BigNumber.php',
    'Brick\\Math\\BigRational' => $vendorDir . '/brick/math/src/BigRational.php',
    'Brick\\Math\\Exception\\DivisionByZeroException' => $vendorDir . '/brick/math/src/Exception/DivisionByZeroException.php',
    'Brick\\Math\\Exception\\IntegerOverflowException' => $vendorDir . '/brick/math/src/Exception/IntegerOverflowException.php',
    'Brick\\Math\\Exception\\MathException' => $vendorDir . '/brick/math/src/Exception/MathException.php',
    'Brick\\Math\\Exception\\NegativeNumberException' => $vendorDir . '/brick/math/src/Exception/NegativeNumberException.php',
    'Brick\\Math\\Exception\\NumberFormatException' => $vendorDir . '/brick/math/src/Exception/NumberFormatException.php',
    'Brick\\Math\\Exception\\RoundingNecessaryException' => $vendorDir . '/brick/math/src/Exception/RoundingNecessaryException.php',
    'Brick\\Math\\Internal\\Calculator' => $vendorDir . '/brick/math/src/Internal/Calculator.php',
    'Brick\\Math\\Internal\\CalculatorRegistry' => $vendorDir . '/brick/math/src/Internal/CalculatorRegistry.php',
    'Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/BcMathCalculator.php',
    'Brick\\Math\\Internal\\Calculator\\GmpCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/GmpCalculator.php',
    'Brick\\Math\\Internal\\Calculator\\NativeCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/NativeCalculator.php',
    'Brick\\Math\\RoundingMode' => $vendorDir . '/brick/math/src/RoundingMode.php',
    'Bugsnag\\Breadcrumbs\\Breadcrumb' => $vendorDir . '/bugsnag/bugsnag/src/Breadcrumbs/Breadcrumb.php',
    'Bugsnag\\Breadcrumbs\\Recorder' => $vendorDir . '/bugsnag/bugsnag/src/Breadcrumbs/Recorder.php',
    'Bugsnag\\Callbacks\\CustomUser' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/CustomUser.php',
    'Bugsnag\\Callbacks\\EnvironmentData' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/EnvironmentData.php',
    'Bugsnag\\Callbacks\\GlobalMetaData' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/GlobalMetaData.php',
    'Bugsnag\\Callbacks\\RequestContext' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/RequestContext.php',
    'Bugsnag\\Callbacks\\RequestCookies' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/RequestCookies.php',
    'Bugsnag\\Callbacks\\RequestMetaData' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/RequestMetaData.php',
    'Bugsnag\\Callbacks\\RequestSession' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/RequestSession.php',
    'Bugsnag\\Callbacks\\RequestUser' => $vendorDir . '/bugsnag/bugsnag/src/Callbacks/RequestUser.php',
    'Bugsnag\\Client' => $vendorDir . '/bugsnag/bugsnag/src/Client.php',
    'Bugsnag\\Configuration' => $vendorDir . '/bugsnag/bugsnag/src/Configuration.php',
    'Bugsnag\\DateTime\\Clock' => $vendorDir . '/bugsnag/bugsnag/src/DateTime/Clock.php',
    'Bugsnag\\DateTime\\ClockInterface' => $vendorDir . '/bugsnag/bugsnag/src/DateTime/ClockInterface.php',
    'Bugsnag\\DateTime\\Date' => $vendorDir . '/bugsnag/bugsnag/src/DateTime/Date.php',
    'Bugsnag\\Env' => $vendorDir . '/bugsnag/bugsnag/src/Env.php',
    'Bugsnag\\ErrorTypes' => $vendorDir . '/bugsnag/bugsnag/src/ErrorTypes.php',
    'Bugsnag\\FeatureDataStore' => $vendorDir . '/bugsnag/bugsnag/src/FeatureDataStore.php',
    'Bugsnag\\FeatureFlag' => $vendorDir . '/bugsnag/bugsnag/src/FeatureFlag.php',
    'Bugsnag\\Handler' => $vendorDir . '/bugsnag/bugsnag/src/Handler.php',
    'Bugsnag\\HttpClient' => $vendorDir . '/bugsnag/bugsnag/src/HttpClient.php',
    'Bugsnag\\Internal\\FeatureFlagDelegate' => $vendorDir . '/bugsnag/bugsnag/src/Internal/FeatureFlagDelegate.php',
    'Bugsnag\\Internal\\GuzzleCompat' => $vendorDir . '/bugsnag/bugsnag/src/Internal/GuzzleCompat.php',
    'Bugsnag\\Middleware\\BreadcrumbData' => $vendorDir . '/bugsnag/bugsnag/src/Middleware/BreadcrumbData.php',
    'Bugsnag\\Middleware\\CallbackBridge' => $vendorDir . '/bugsnag/bugsnag/src/Middleware/CallbackBridge.php',
    'Bugsnag\\Middleware\\DiscardClasses' => $vendorDir . '/bugsnag/bugsnag/src/Middleware/DiscardClasses.php',
    'Bugsnag\\Middleware\\NotificationSkipper' => $vendorDir . '/bugsnag/bugsnag/src/Middleware/NotificationSkipper.php',
    'Bugsnag\\Middleware\\SessionData' => $vendorDir . '/bugsnag/bugsnag/src/Middleware/SessionData.php',
    'Bugsnag\\Pipeline' => $vendorDir . '/bugsnag/bugsnag/src/Pipeline.php',
    'Bugsnag\\Report' => $vendorDir . '/bugsnag/bugsnag/src/Report.php',
    'Bugsnag\\Request\\BasicResolver' => $vendorDir . '/bugsnag/bugsnag/src/Request/BasicResolver.php',
    'Bugsnag\\Request\\ConsoleRequest' => $vendorDir . '/bugsnag/bugsnag/src/Request/ConsoleRequest.php',
    'Bugsnag\\Request\\NullRequest' => $vendorDir . '/bugsnag/bugsnag/src/Request/NullRequest.php',
    'Bugsnag\\Request\\PhpRequest' => $vendorDir . '/bugsnag/bugsnag/src/Request/PhpRequest.php',
    'Bugsnag\\Request\\RequestInterface' => $vendorDir . '/bugsnag/bugsnag/src/Request/RequestInterface.php',
    'Bugsnag\\Request\\ResolverInterface' => $vendorDir . '/bugsnag/bugsnag/src/Request/ResolverInterface.php',
    'Bugsnag\\SessionTracker' => $vendorDir . '/bugsnag/bugsnag/src/SessionTracker.php',
    'Bugsnag\\Shutdown\\PhpShutdownStrategy' => $vendorDir . '/bugsnag/bugsnag/src/Shutdown/PhpShutdownStrategy.php',
    'Bugsnag\\Shutdown\\ShutdownStrategyInterface' => $vendorDir . '/bugsnag/bugsnag/src/Shutdown/ShutdownStrategyInterface.php',
    'Bugsnag\\Stacktrace' => $vendorDir . '/bugsnag/bugsnag/src/Stacktrace.php',
    'Bugsnag\\Utils' => $vendorDir . '/bugsnag/bugsnag/src/Utils.php',
    'Clue\\StreamFilter\\CallbackFilter' => $vendorDir . '/clue/stream-filter/src/CallbackFilter.php',
    'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php',
    'Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php',
    'Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php',
    'Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php',
    'Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php',
    'Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php',
    'Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php',
    'Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php',
    'Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php',
    'Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php',
    'Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php',
    'Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php',
    'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php',
    'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php',
    'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php',
    'DateInvalidTimeZoneException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php',
    'DateMalformedIntervalStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php',
    'DateMalformedPeriodStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php',
    'DateMalformedStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php',
    'DateObjectError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php',
    'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php',
    'Dflydev\\DotAccessData\\Data' => $vendorDir . '/dflydev/dot-access-data/src/Data.php',
    'Dflydev\\DotAccessData\\DataInterface' => $vendorDir . '/dflydev/dot-access-data/src/DataInterface.php',
    'Dflydev\\DotAccessData\\Exception\\DataException' => $vendorDir . '/dflydev/dot-access-data/src/Exception/DataException.php',
    'Dflydev\\DotAccessData\\Exception\\InvalidPathException' => $vendorDir . '/dflydev/dot-access-data/src/Exception/InvalidPathException.php',
    'Dflydev\\DotAccessData\\Exception\\MissingPathException' => $vendorDir . '/dflydev/dot-access-data/src/Exception/MissingPathException.php',
    'Dflydev\\DotAccessData\\Util' => $vendorDir . '/dflydev/dot-access-data/src/Util.php',
    'Dotenv\\Dotenv' => $vendorDir . '/vlucas/phpdotenv/src/Dotenv.php',
    'Dotenv\\Exception\\ExceptionInterface' => $vendorDir . '/vlucas/phpdotenv/src/Exception/ExceptionInterface.php',
    'Dotenv\\Exception\\InvalidEncodingException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php',
    'Dotenv\\Exception\\InvalidFileException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/InvalidFileException.php',
    'Dotenv\\Exception\\InvalidPathException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/InvalidPathException.php',
    'Dotenv\\Exception\\ValidationException' => $vendorDir . '/vlucas/phpdotenv/src/Exception/ValidationException.php',
    'Dotenv\\Loader\\Loader' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Loader.php',
    'Dotenv\\Loader\\LoaderInterface' => $vendorDir . '/vlucas/phpdotenv/src/Loader/LoaderInterface.php',
    'Dotenv\\Loader\\Resolver' => $vendorDir . '/vlucas/phpdotenv/src/Loader/Resolver.php',
    'Dotenv\\Parser\\Entry' => $vendorDir . '/vlucas/phpdotenv/src/Parser/Entry.php',
    'Dotenv\\Parser\\EntryParser' => $vendorDir . '/vlucas/phpdotenv/src/Parser/EntryParser.php',
    'Dotenv\\Parser\\Lexer' => $vendorDir . '/vlucas/phpdotenv/src/Parser/Lexer.php',
    'Dotenv\\Parser\\Lines' => $vendorDir . '/vlucas/phpdotenv/src/Parser/Lines.php',
    'Dotenv\\Parser\\Parser' => $vendorDir . '/vlucas/phpdotenv/src/Parser/Parser.php',
    'Dotenv\\Parser\\ParserInterface' => $vendorDir . '/vlucas/phpdotenv/src/Parser/ParserInterface.php',
    'Dotenv\\Parser\\Value' => $vendorDir . '/vlucas/phpdotenv/src/Parser/Value.php',
    'Dotenv\\Repository\\AdapterRepository' => $vendorDir . '/vlucas/phpdotenv/src/Repository/AdapterRepository.php',
    'Dotenv\\Repository\\Adapter\\AdapterInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php',
    'Dotenv\\Repository\\Adapter\\ApacheAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php',
    'Dotenv\\Repository\\Adapter\\ArrayAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php',
    'Dotenv\\Repository\\Adapter\\EnvConstAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php',
    'Dotenv\\Repository\\Adapter\\GuardedWriter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php',
    'Dotenv\\Repository\\Adapter\\ImmutableWriter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php',
    'Dotenv\\Repository\\Adapter\\MultiReader' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php',
    'Dotenv\\Repository\\Adapter\\MultiWriter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php',
    'Dotenv\\Repository\\Adapter\\PutenvAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php',
    'Dotenv\\Repository\\Adapter\\ReaderInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php',
    'Dotenv\\Repository\\Adapter\\ReplacingWriter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php',
    'Dotenv\\Repository\\Adapter\\ServerConstAdapter' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php',
    'Dotenv\\Repository\\Adapter\\WriterInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php',
    'Dotenv\\Repository\\RepositoryBuilder' => $vendorDir . '/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php',
    'Dotenv\\Repository\\RepositoryInterface' => $vendorDir . '/vlucas/phpdotenv/src/Repository/RepositoryInterface.php',
    'Dotenv\\Store\\FileStore' => $vendorDir . '/vlucas/phpdotenv/src/Store/FileStore.php',
    'Dotenv\\Store\\File\\Paths' => $vendorDir . '/vlucas/phpdotenv/src/Store/File/Paths.php',
    'Dotenv\\Store\\File\\Reader' => $vendorDir . '/vlucas/phpdotenv/src/Store/File/Reader.php',
    'Dotenv\\Store\\StoreBuilder' => $vendorDir . '/vlucas/phpdotenv/src/Store/StoreBuilder.php',
    'Dotenv\\Store\\StoreInterface' => $vendorDir . '/vlucas/phpdotenv/src/Store/StoreInterface.php',
    'Dotenv\\Store\\StringStore' => $vendorDir . '/vlucas/phpdotenv/src/Store/StringStore.php',
    'Dotenv\\Util\\Regex' => $vendorDir . '/vlucas/phpdotenv/src/Util/Regex.php',
    'Dotenv\\Util\\Str' => $vendorDir . '/vlucas/phpdotenv/src/Util/Str.php',
    'Dotenv\\Validator' => $vendorDir . '/vlucas/phpdotenv/src/Validator.php',
    'Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/EventEmitter.php',
    'Evenement\\EventEmitterInterface' => $vendorDir . '/evenement/evenement/src/EventEmitterInterface.php',
    'Evenement\\EventEmitterTrait' => $vendorDir . '/evenement/evenement/src/EventEmitterTrait.php',
    'Gitlab\\Api\\AbstractApi' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/AbstractApi.php',
    'Gitlab\\Api\\DeployKeys' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/DeployKeys.php',
    'Gitlab\\Api\\Deployments' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Deployments.php',
    'Gitlab\\Api\\Environments' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Environments.php',
    'Gitlab\\Api\\Events' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Events.php',
    'Gitlab\\Api\\Groups' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Groups.php',
    'Gitlab\\Api\\GroupsBoards' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsBoards.php',
    'Gitlab\\Api\\GroupsEpics' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsEpics.php',
    'Gitlab\\Api\\GroupsMilestones' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/GroupsMilestones.php',
    'Gitlab\\Api\\IssueBoards' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/IssueBoards.php',
    'Gitlab\\Api\\IssueLinks' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/IssueLinks.php',
    'Gitlab\\Api\\Issues' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Issues.php',
    'Gitlab\\Api\\IssuesStatistics' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/IssuesStatistics.php',
    'Gitlab\\Api\\Jobs' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Jobs.php',
    'Gitlab\\Api\\Keys' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Keys.php',
    'Gitlab\\Api\\MergeRequests' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/MergeRequests.php',
    'Gitlab\\Api\\Milestones' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Milestones.php',
    'Gitlab\\Api\\Packages' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Packages.php',
    'Gitlab\\Api\\ProjectNamespaces' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ProjectNamespaces.php',
    'Gitlab\\Api\\Projects' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Projects.php',
    'Gitlab\\Api\\Repositories' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Repositories.php',
    'Gitlab\\Api\\RepositoryFiles' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/RepositoryFiles.php',
    'Gitlab\\Api\\ResourceIterationEvents' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceIterationEvents.php',
    'Gitlab\\Api\\ResourceLabelEvents' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceLabelEvents.php',
    'Gitlab\\Api\\ResourceMilestoneEvents' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceMilestoneEvents.php',
    'Gitlab\\Api\\ResourceStateEvents' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceStateEvents.php',
    'Gitlab\\Api\\ResourceWeightEvents' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/ResourceWeightEvents.php',
    'Gitlab\\Api\\Schedules' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Schedules.php',
    'Gitlab\\Api\\Search' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Search.php',
    'Gitlab\\Api\\Snippets' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Snippets.php',
    'Gitlab\\Api\\SystemHooks' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/SystemHooks.php',
    'Gitlab\\Api\\Tags' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Tags.php',
    'Gitlab\\Api\\Users' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Users.php',
    'Gitlab\\Api\\Version' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Version.php',
    'Gitlab\\Api\\Wiki' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Api/Wiki.php',
    'Gitlab\\Client' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Client.php',
    'Gitlab\\Exception\\ApiLimitExceededException' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Exception/ApiLimitExceededException.php',
    'Gitlab\\Exception\\ErrorException' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Exception/ErrorException.php',
    'Gitlab\\Exception\\ExceptionInterface' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Exception/ExceptionInterface.php',
    'Gitlab\\Exception\\RuntimeException' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Exception/RuntimeException.php',
    'Gitlab\\Exception\\ValidationFailedException' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/Exception/ValidationFailedException.php',
    'Gitlab\\HttpClient\\Builder' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Builder.php',
    'Gitlab\\HttpClient\\Message\\ResponseMediator' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Message/ResponseMediator.php',
    'Gitlab\\HttpClient\\Plugin\\Authentication' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/Authentication.php',
    'Gitlab\\HttpClient\\Plugin\\ExceptionThrower' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/ExceptionThrower.php',
    'Gitlab\\HttpClient\\Plugin\\History' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Plugin/History.php',
    'Gitlab\\HttpClient\\Util\\JsonArray' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/JsonArray.php',
    'Gitlab\\HttpClient\\Util\\QueryStringBuilder' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/HttpClient/Util/QueryStringBuilder.php',
    'Gitlab\\ResultPager' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/ResultPager.php',
    'Gitlab\\ResultPagerInterface' => $vendorDir . '/m4tthumphrey/php-gitlab-api/src/ResultPagerInterface.php',
    'GrahamCampbell\\ResultType\\Error' => $vendorDir . '/graham-campbell/result-type/src/Error.php',
    'GrahamCampbell\\ResultType\\Result' => $vendorDir . '/graham-campbell/result-type/src/Result.php',
    'GrahamCampbell\\ResultType\\Success' => $vendorDir . '/graham-campbell/result-type/src/Success.php',
    'Grasmash\\Expander\\Expander' => $vendorDir . '/grasmash/expander/src/Expander.php',
    'Grasmash\\Expander\\Stringifier' => $vendorDir . '/grasmash/expander/src/Stringifier.php',
    'Grasmash\\Expander\\StringifierInterface' => $vendorDir . '/grasmash/expander/src/StringifierInterface.php',
    'GuzzleHttp\\BodySummarizer' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizer.php',
    'GuzzleHttp\\BodySummarizerInterface' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
    'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',
    'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php',
    'GuzzleHttp\\ClientTrait' => $vendorDir . '/guzzlehttp/guzzle/src/ClientTrait.php',
    'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
    'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
    'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
    'GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
    'GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
    'GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
    'GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php',
    'GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',
    'GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
    'GuzzleHttp\\Exception\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',
    'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php',
    'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php',
    'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
    'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php',
    'GuzzleHttp\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php',
    'GuzzleHttp\\Handler\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
    'GuzzleHttp\\Handler\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
    'GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
    'GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
    'GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
    'GuzzleHttp\\Handler\\HeaderProcessor' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php',
    'GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',
    'GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php',
    'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
    'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php',
    'GuzzleHttp\\MessageFormatterInterface' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php',
    'GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php',
    'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php',
    'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
    'GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php',
    'GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php',
    'GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php',
    'GuzzleHttp\\Promise\\Create' => $vendorDir . '/guzzlehttp/promises/src/Create.php',
    'GuzzleHttp\\Promise\\Each' => $vendorDir . '/guzzlehttp/promises/src/Each.php',
    'GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php',
    'GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php',
    'GuzzleHttp\\Promise\\Is' => $vendorDir . '/guzzlehttp/promises/src/Is.php',
    'GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php',
    'GuzzleHttp\\Promise\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php',
    'GuzzleHttp\\Promise\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php',
    'GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php',
    'GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php',
    'GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php',
    'GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php',
    'GuzzleHttp\\Promise\\Utils' => $vendorDir . '/guzzlehttp/promises/src/Utils.php',
    'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php',
    'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php',
    'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php',
    'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php',
    'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => $vendorDir . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php',
    'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php',
    'GuzzleHttp\\Psr7\\Header' => $vendorDir . '/guzzlehttp/psr7/src/Header.php',
    'GuzzleHttp\\Psr7\\HttpFactory' => $vendorDir . '/guzzlehttp/psr7/src/HttpFactory.php',
    'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php',
    'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php',
    'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php',
    'GuzzleHttp\\Psr7\\Message' => $vendorDir . '/guzzlehttp/psr7/src/Message.php',
    'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php',
    'GuzzleHttp\\Psr7\\MimeType' => $vendorDir . '/guzzlehttp/psr7/src/MimeType.php',
    'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php',
    'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php',
    'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php',
    'GuzzleHttp\\Psr7\\Query' => $vendorDir . '/guzzlehttp/psr7/src/Query.php',
    'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php',
    'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php',
    'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php',
    'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php',
    'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php',
    'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
    'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php',
    'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php',
    'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php',
    'GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php',
    'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php',
    'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php',
    'GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php',
    'GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
    'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php',
    'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
    'GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php',
    'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php',
    'Http\\Client\\Common\\BatchClient' => $vendorDir . '/php-http/client-common/src/BatchClient.php',
    'Http\\Client\\Common\\BatchClientInterface' => $vendorDir . '/php-http/client-common/src/BatchClientInterface.php',
    'Http\\Client\\Common\\BatchResult' => $vendorDir . '/php-http/client-common/src/BatchResult.php',
    'Http\\Client\\Common\\Deferred' => $vendorDir . '/php-http/client-common/src/Deferred.php',
    'Http\\Client\\Common\\EmulatedHttpAsyncClient' => $vendorDir . '/php-http/client-common/src/EmulatedHttpAsyncClient.php',
    'Http\\Client\\Common\\EmulatedHttpClient' => $vendorDir . '/php-http/client-common/src/EmulatedHttpClient.php',
    'Http\\Client\\Common\\Exception\\BatchException' => $vendorDir . '/php-http/client-common/src/Exception/BatchException.php',
    'Http\\Client\\Common\\Exception\\CircularRedirectionException' => $vendorDir . '/php-http/client-common/src/Exception/CircularRedirectionException.php',
    'Http\\Client\\Common\\Exception\\ClientErrorException' => $vendorDir . '/php-http/client-common/src/Exception/ClientErrorException.php',
    'Http\\Client\\Common\\Exception\\HttpClientNoMatchException' => $vendorDir . '/php-http/client-common/src/Exception/HttpClientNoMatchException.php',
    'Http\\Client\\Common\\Exception\\HttpClientNotFoundException' => $vendorDir . '/php-http/client-common/src/Exception/HttpClientNotFoundException.php',
    'Http\\Client\\Common\\Exception\\LoopException' => $vendorDir . '/php-http/client-common/src/Exception/LoopException.php',
    'Http\\Client\\Common\\Exception\\MultipleRedirectionException' => $vendorDir . '/php-http/client-common/src/Exception/MultipleRedirectionException.php',
    'Http\\Client\\Common\\Exception\\ServerErrorException' => $vendorDir . '/php-http/client-common/src/Exception/ServerErrorException.php',
    'Http\\Client\\Common\\FlexibleHttpClient' => $vendorDir . '/php-http/client-common/src/FlexibleHttpClient.php',
    'Http\\Client\\Common\\HttpAsyncClientDecorator' => $vendorDir . '/php-http/client-common/src/HttpAsyncClientDecorator.php',
    'Http\\Client\\Common\\HttpAsyncClientEmulator' => $vendorDir . '/php-http/client-common/src/HttpAsyncClientEmulator.php',
    'Http\\Client\\Common\\HttpClientDecorator' => $vendorDir . '/php-http/client-common/src/HttpClientDecorator.php',
    'Http\\Client\\Common\\HttpClientEmulator' => $vendorDir . '/php-http/client-common/src/HttpClientEmulator.php',
    'Http\\Client\\Common\\HttpClientPool' => $vendorDir . '/php-http/client-common/src/HttpClientPool.php',
    'Http\\Client\\Common\\HttpClientPool\\HttpClientPool' => $vendorDir . '/php-http/client-common/src/HttpClientPool/HttpClientPool.php',
    'Http\\Client\\Common\\HttpClientPool\\HttpClientPoolItem' => $vendorDir . '/php-http/client-common/src/HttpClientPool/HttpClientPoolItem.php',
    'Http\\Client\\Common\\HttpClientPool\\LeastUsedClientPool' => $vendorDir . '/php-http/client-common/src/HttpClientPool/LeastUsedClientPool.php',
    'Http\\Client\\Common\\HttpClientPool\\RandomClientPool' => $vendorDir . '/php-http/client-common/src/HttpClientPool/RandomClientPool.php',
    'Http\\Client\\Common\\HttpClientPool\\RoundRobinClientPool' => $vendorDir . '/php-http/client-common/src/HttpClientPool/RoundRobinClientPool.php',
    'Http\\Client\\Common\\HttpClientRouter' => $vendorDir . '/php-http/client-common/src/HttpClientRouter.php',
    'Http\\Client\\Common\\HttpClientRouterInterface' => $vendorDir . '/php-http/client-common/src/HttpClientRouterInterface.php',
    'Http\\Client\\Common\\HttpMethodsClient' => $vendorDir . '/php-http/client-common/src/HttpMethodsClient.php',
    'Http\\Client\\Common\\HttpMethodsClientInterface' => $vendorDir . '/php-http/client-common/src/HttpMethodsClientInterface.php',
    'Http\\Client\\Common\\Plugin' => $vendorDir . '/php-http/client-common/src/Plugin.php',
    'Http\\Client\\Common\\PluginChain' => $vendorDir . '/php-http/client-common/src/PluginChain.php',
    'Http\\Client\\Common\\PluginClient' => $vendorDir . '/php-http/client-common/src/PluginClient.php',
    'Http\\Client\\Common\\PluginClientBuilder' => $vendorDir . '/php-http/client-common/src/PluginClientBuilder.php',
    'Http\\Client\\Common\\PluginClientFactory' => $vendorDir . '/php-http/client-common/src/PluginClientFactory.php',
    'Http\\Client\\Common\\Plugin\\AddHostPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/AddHostPlugin.php',
    'Http\\Client\\Common\\Plugin\\AddPathPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/AddPathPlugin.php',
    'Http\\Client\\Common\\Plugin\\AuthenticationPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/AuthenticationPlugin.php',
    'Http\\Client\\Common\\Plugin\\BaseUriPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/BaseUriPlugin.php',
    'Http\\Client\\Common\\Plugin\\CachePlugin' => $vendorDir . '/php-http/cache-plugin/src/CachePlugin.php',
    'Http\\Client\\Common\\Plugin\\Cache\\Generator\\CacheKeyGenerator' => $vendorDir . '/php-http/cache-plugin/src/Cache/Generator/CacheKeyGenerator.php',
    'Http\\Client\\Common\\Plugin\\Cache\\Generator\\HeaderCacheKeyGenerator' => $vendorDir . '/php-http/cache-plugin/src/Cache/Generator/HeaderCacheKeyGenerator.php',
    'Http\\Client\\Common\\Plugin\\Cache\\Generator\\SimpleGenerator' => $vendorDir . '/php-http/cache-plugin/src/Cache/Generator/SimpleGenerator.php',
    'Http\\Client\\Common\\Plugin\\Cache\\Listener\\AddHeaderCacheListener' => $vendorDir . '/php-http/cache-plugin/src/Cache/Listener/AddHeaderCacheListener.php',
    'Http\\Client\\Common\\Plugin\\Cache\\Listener\\CacheListener' => $vendorDir . '/php-http/cache-plugin/src/Cache/Listener/CacheListener.php',
    'Http\\Client\\Common\\Plugin\\ContentLengthPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/ContentLengthPlugin.php',
    'Http\\Client\\Common\\Plugin\\ContentTypePlugin' => $vendorDir . '/php-http/client-common/src/Plugin/ContentTypePlugin.php',
    'Http\\Client\\Common\\Plugin\\CookiePlugin' => $vendorDir . '/php-http/client-common/src/Plugin/CookiePlugin.php',
    'Http\\Client\\Common\\Plugin\\DecoderPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/DecoderPlugin.php',
    'Http\\Client\\Common\\Plugin\\ErrorPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/ErrorPlugin.php',
    'Http\\Client\\Common\\Plugin\\Exception\\RewindStreamException' => $vendorDir . '/php-http/cache-plugin/src/Exception/RewindStreamException.php',
    'Http\\Client\\Common\\Plugin\\HeaderAppendPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/HeaderAppendPlugin.php',
    'Http\\Client\\Common\\Plugin\\HeaderDefaultsPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/HeaderDefaultsPlugin.php',
    'Http\\Client\\Common\\Plugin\\HeaderRemovePlugin' => $vendorDir . '/php-http/client-common/src/Plugin/HeaderRemovePlugin.php',
    'Http\\Client\\Common\\Plugin\\HeaderSetPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/HeaderSetPlugin.php',
    'Http\\Client\\Common\\Plugin\\HistoryPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/HistoryPlugin.php',
    'Http\\Client\\Common\\Plugin\\Journal' => $vendorDir . '/php-http/client-common/src/Plugin/Journal.php',
    'Http\\Client\\Common\\Plugin\\QueryDefaultsPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/QueryDefaultsPlugin.php',
    'Http\\Client\\Common\\Plugin\\RedirectPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/RedirectPlugin.php',
    'Http\\Client\\Common\\Plugin\\RequestMatcherPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/RequestMatcherPlugin.php',
    'Http\\Client\\Common\\Plugin\\RequestSeekableBodyPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/RequestSeekableBodyPlugin.php',
    'Http\\Client\\Common\\Plugin\\ResponseSeekableBodyPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/ResponseSeekableBodyPlugin.php',
    'Http\\Client\\Common\\Plugin\\RetryPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/RetryPlugin.php',
    'Http\\Client\\Common\\Plugin\\SeekableBodyPlugin' => $vendorDir . '/php-http/client-common/src/Plugin/SeekableBodyPlugin.php',
    'Http\\Client\\Common\\Plugin\\VersionBridgePlugin' => $vendorDir . '/php-http/client-common/src/Plugin/VersionBridgePlugin.php',
    'Http\\Client\\Common\\VersionBridgeClient' => $vendorDir . '/php-http/client-common/src/VersionBridgeClient.php',
    'Http\\Client\\Exception' => $vendorDir . '/php-http/httplug/src/Exception.php',
    'Http\\Client\\Exception\\HttpException' => $vendorDir . '/php-http/httplug/src/Exception/HttpException.php',
    'Http\\Client\\Exception\\NetworkException' => $vendorDir . '/php-http/httplug/src/Exception/NetworkException.php',
    'Http\\Client\\Exception\\RequestAwareTrait' => $vendorDir . '/php-http/httplug/src/Exception/RequestAwareTrait.php',
    'Http\\Client\\Exception\\RequestException' => $vendorDir . '/php-http/httplug/src/Exception/RequestException.php',
    'Http\\Client\\Exception\\TransferException' => $vendorDir . '/php-http/httplug/src/Exception/TransferException.php',
    'Http\\Client\\HttpAsyncClient' => $vendorDir . '/php-http/httplug/src/HttpAsyncClient.php',
    'Http\\Client\\HttpClient' => $vendorDir . '/php-http/httplug/src/HttpClient.php',
    'Http\\Client\\Promise\\HttpFulfilledPromise' => $vendorDir . '/php-http/httplug/src/Promise/HttpFulfilledPromise.php',
    'Http\\Client\\Promise\\HttpRejectedPromise' => $vendorDir . '/php-http/httplug/src/Promise/HttpRejectedPromise.php',
    'Http\\Discovery\\ClassDiscovery' => $vendorDir . '/php-http/discovery/src/ClassDiscovery.php',
    'Http\\Discovery\\Exception' => $vendorDir . '/php-http/discovery/src/Exception.php',
    'Http\\Discovery\\Exception\\ClassInstantiationFailedException' => $vendorDir . '/php-http/discovery/src/Exception/ClassInstantiationFailedException.php',
    'Http\\Discovery\\Exception\\DiscoveryFailedException' => $vendorDir . '/php-http/discovery/src/Exception/DiscoveryFailedException.php',
    'Http\\Discovery\\Exception\\NoCandidateFoundException' => $vendorDir . '/php-http/discovery/src/Exception/NoCandidateFoundException.php',
    'Http\\Discovery\\Exception\\NotFoundException' => $vendorDir . '/php-http/discovery/src/Exception/NotFoundException.php',
    'Http\\Discovery\\Exception\\PuliUnavailableException' => $vendorDir . '/php-http/discovery/src/Exception/PuliUnavailableException.php',
    'Http\\Discovery\\Exception\\StrategyUnavailableException' => $vendorDir . '/php-http/discovery/src/Exception/StrategyUnavailableException.php',
    'Http\\Discovery\\HttpAsyncClientDiscovery' => $vendorDir . '/php-http/discovery/src/HttpAsyncClientDiscovery.php',
    'Http\\Discovery\\HttpClientDiscovery' => $vendorDir . '/php-http/discovery/src/HttpClientDiscovery.php',
    'Http\\Discovery\\MessageFactoryDiscovery' => $vendorDir . '/php-http/discovery/src/MessageFactoryDiscovery.php',
    'Http\\Discovery\\NotFoundException' => $vendorDir . '/php-http/discovery/src/NotFoundException.php',
    'Http\\Discovery\\Psr17Factory' => $vendorDir . '/php-http/discovery/src/Psr17Factory.php',
    'Http\\Discovery\\Psr17FactoryDiscovery' => $vendorDir . '/php-http/discovery/src/Psr17FactoryDiscovery.php',
    'Http\\Discovery\\Psr18Client' => $vendorDir . '/php-http/discovery/src/Psr18Client.php',
    'Http\\Discovery\\Psr18ClientDiscovery' => $vendorDir . '/php-http/discovery/src/Psr18ClientDiscovery.php',
    'Http\\Discovery\\Strategy\\CommonClassesStrategy' => $vendorDir . '/php-http/discovery/src/Strategy/CommonClassesStrategy.php',
    'Http\\Discovery\\Strategy\\CommonPsr17ClassesStrategy' => $vendorDir . '/php-http/discovery/src/Strategy/CommonPsr17ClassesStrategy.php',
    'Http\\Discovery\\Strategy\\DiscoveryStrategy' => $vendorDir . '/php-http/discovery/src/Strategy/DiscoveryStrategy.php',
    'Http\\Discovery\\Strategy\\MockClientStrategy' => $vendorDir . '/php-http/discovery/src/Strategy/MockClientStrategy.php',
    'Http\\Discovery\\Strategy\\PuliBetaStrategy' => $vendorDir . '/php-http/discovery/src/Strategy/PuliBetaStrategy.php',
    'Http\\Discovery\\StreamFactoryDiscovery' => $vendorDir . '/php-http/discovery/src/StreamFactoryDiscovery.php',
    'Http\\Discovery\\UriFactoryDiscovery' => $vendorDir . '/php-http/discovery/src/UriFactoryDiscovery.php',
    'Http\\Factory\\Guzzle\\RequestFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/RequestFactory.php',
    'Http\\Factory\\Guzzle\\ResponseFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/ResponseFactory.php',
    'Http\\Factory\\Guzzle\\ServerRequestFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/ServerRequestFactory.php',
    'Http\\Factory\\Guzzle\\StreamFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/StreamFactory.php',
    'Http\\Factory\\Guzzle\\UploadedFileFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/UploadedFileFactory.php',
    'Http\\Factory\\Guzzle\\UriFactory' => $vendorDir . '/http-interop/http-factory-guzzle/src/UriFactory.php',
    'Http\\Message\\Authentication' => $vendorDir . '/php-http/message/src/Authentication.php',
    'Http\\Message\\Authentication\\AutoBasicAuth' => $vendorDir . '/php-http/message/src/Authentication/AutoBasicAuth.php',
    'Http\\Message\\Authentication\\BasicAuth' => $vendorDir . '/php-http/message/src/Authentication/BasicAuth.php',
    'Http\\Message\\Authentication\\Bearer' => $vendorDir . '/php-http/message/src/Authentication/Bearer.php',
    'Http\\Message\\Authentication\\Chain' => $vendorDir . '/php-http/message/src/Authentication/Chain.php',
    'Http\\Message\\Authentication\\Header' => $vendorDir . '/php-http/message/src/Authentication/Header.php',
    'Http\\Message\\Authentication\\Matching' => $vendorDir . '/php-http/message/src/Authentication/Matching.php',
    'Http\\Message\\Authentication\\QueryParam' => $vendorDir . '/php-http/message/src/Authentication/QueryParam.php',
    'Http\\Message\\Authentication\\RequestConditional' => $vendorDir . '/php-http/message/src/Authentication/RequestConditional.php',
    'Http\\Message\\Authentication\\Wsse' => $vendorDir . '/php-http/message/src/Authentication/Wsse.php',
    'Http\\Message\\Builder\\ResponseBuilder' => $vendorDir . '/php-http/message/src/Builder/ResponseBuilder.php',
    'Http\\Message\\Cookie' => $vendorDir . '/php-http/message/src/Cookie.php',
    'Http\\Message\\CookieJar' => $vendorDir . '/php-http/message/src/CookieJar.php',
    'Http\\Message\\CookieUtil' => $vendorDir . '/php-http/message/src/CookieUtil.php',
    'Http\\Message\\Decorator\\MessageDecorator' => $vendorDir . '/php-http/message/src/Decorator/MessageDecorator.php',
    'Http\\Message\\Decorator\\RequestDecorator' => $vendorDir . '/php-http/message/src/Decorator/RequestDecorator.php',
    'Http\\Message\\Decorator\\ResponseDecorator' => $vendorDir . '/php-http/message/src/Decorator/ResponseDecorator.php',
    'Http\\Message\\Decorator\\StreamDecorator' => $vendorDir . '/php-http/message/src/Decorator/StreamDecorator.php',
    'Http\\Message\\Encoding\\ChunkStream' => $vendorDir . '/php-http/message/src/Encoding/ChunkStream.php',
    'Http\\Message\\Encoding\\CompressStream' => $vendorDir . '/php-http/message/src/Encoding/CompressStream.php',
    'Http\\Message\\Encoding\\DechunkStream' => $vendorDir . '/php-http/message/src/Encoding/DechunkStream.php',
    'Http\\Message\\Encoding\\DecompressStream' => $vendorDir . '/php-http/message/src/Encoding/DecompressStream.php',
    'Http\\Message\\Encoding\\DeflateStream' => $vendorDir . '/php-http/message/src/Encoding/DeflateStream.php',
    'Http\\Message\\Encoding\\Filter\\Chunk' => $vendorDir . '/php-http/message/src/Encoding/Filter/Chunk.php',
    'Http\\Message\\Encoding\\FilteredStream' => $vendorDir . '/php-http/message/src/Encoding/FilteredStream.php',
    'Http\\Message\\Encoding\\GzipDecodeStream' => $vendorDir . '/php-http/message/src/Encoding/GzipDecodeStream.php',
    'Http\\Message\\Encoding\\GzipEncodeStream' => $vendorDir . '/php-http/message/src/Encoding/GzipEncodeStream.php',
    'Http\\Message\\Encoding\\InflateStream' => $vendorDir . '/php-http/message/src/Encoding/InflateStream.php',
    'Http\\Message\\Exception' => $vendorDir . '/php-http/message/src/Exception.php',
    'Http\\Message\\Exception\\UnexpectedValueException' => $vendorDir . '/php-http/message/src/Exception/UnexpectedValueException.php',
    'Http\\Message\\Formatter' => $vendorDir . '/php-http/message/src/Formatter.php',
    'Http\\Message\\Formatter\\CurlCommandFormatter' => $vendorDir . '/php-http/message/src/Formatter/CurlCommandFormatter.php',
    'Http\\Message\\Formatter\\FullHttpMessageFormatter' => $vendorDir . '/php-http/message/src/Formatter/FullHttpMessageFormatter.php',
    'Http\\Message\\Formatter\\SimpleFormatter' => $vendorDir . '/php-http/message/src/Formatter/SimpleFormatter.php',
    'Http\\Message\\MessageFactory\\DiactorosMessageFactory' => $vendorDir . '/php-http/message/src/MessageFactory/DiactorosMessageFactory.php',
    'Http\\Message\\MessageFactory\\GuzzleMessageFactory' => $vendorDir . '/php-http/message/src/MessageFactory/GuzzleMessageFactory.php',
    'Http\\Message\\MessageFactory\\SlimMessageFactory' => $vendorDir . '/php-http/message/src/MessageFactory/SlimMessageFactory.php',
    'Http\\Message\\MultipartStream\\ApacheMimetypeHelper' => $vendorDir . '/php-http/multipart-stream-builder/src/ApacheMimetypeHelper.php',
    'Http\\Message\\MultipartStream\\CustomMimetypeHelper' => $vendorDir . '/php-http/multipart-stream-builder/src/CustomMimetypeHelper.php',
    'Http\\Message\\MultipartStream\\MimetypeHelper' => $vendorDir . '/php-http/multipart-stream-builder/src/MimetypeHelper.php',
    'Http\\Message\\MultipartStream\\MultipartStreamBuilder' => $vendorDir . '/php-http/multipart-stream-builder/src/MultipartStreamBuilder.php',
    'Http\\Message\\RequestMatcher' => $vendorDir . '/php-http/message/src/RequestMatcher.php',
    'Http\\Message\\RequestMatcher\\CallbackRequestMatcher' => $vendorDir . '/php-http/message/src/RequestMatcher/CallbackRequestMatcher.php',
    'Http\\Message\\RequestMatcher\\RegexRequestMatcher' => $vendorDir . '/php-http/message/src/RequestMatcher/RegexRequestMatcher.php',
    'Http\\Message\\RequestMatcher\\RequestMatcher' => $vendorDir . '/php-http/message/src/RequestMatcher/RequestMatcher.php',
    'Http\\Message\\StreamFactory\\DiactorosStreamFactory' => $vendorDir . '/php-http/message/src/StreamFactory/DiactorosStreamFactory.php',
    'Http\\Message\\StreamFactory\\GuzzleStreamFactory' => $vendorDir . '/php-http/message/src/StreamFactory/GuzzleStreamFactory.php',
    'Http\\Message\\StreamFactory\\SlimStreamFactory' => $vendorDir . '/php-http/message/src/StreamFactory/SlimStreamFactory.php',
    'Http\\Message\\Stream\\BufferedStream' => $vendorDir . '/php-http/message/src/Stream/BufferedStream.php',
    'Http\\Message\\UriFactory\\DiactorosUriFactory' => $vendorDir . '/php-http/message/src/UriFactory/DiactorosUriFactory.php',
    'Http\\Message\\UriFactory\\GuzzleUriFactory' => $vendorDir . '/php-http/message/src/UriFactory/GuzzleUriFactory.php',
    'Http\\Message\\UriFactory\\SlimUriFactory' => $vendorDir . '/php-http/message/src/UriFactory/SlimUriFactory.php',
    'Http\\Promise\\FulfilledPromise' => $vendorDir . '/php-http/promise/src/FulfilledPromise.php',
    'Http\\Promise\\Promise' => $vendorDir . '/php-http/promise/src/Promise.php',
    'Http\\Promise\\RejectedPromise' => $vendorDir . '/php-http/promise/src/RejectedPromise.php',
    'Kevinrob\\GuzzleCache\\BodyStore' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/BodyStore.php',
    'Kevinrob\\GuzzleCache\\CacheEntry' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/CacheEntry.php',
    'Kevinrob\\GuzzleCache\\CacheMiddleware' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/CacheMiddleware.php',
    'Kevinrob\\GuzzleCache\\KeyValueHttpHeader' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/KeyValueHttpHeader.php',
    'Kevinrob\\GuzzleCache\\Storage\\CacheStorageInterface' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/CacheStorageInterface.php',
    'Kevinrob\\GuzzleCache\\Storage\\CompressedDoctrineCacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/CompressedDoctrineCacheStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\DoctrineCacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/DoctrineCacheStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\FlysystemStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/FlysystemStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\LaravelCacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/LaravelCacheStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\Psr16CacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/Psr16CacheStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\Psr6CacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/Psr6CacheStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\VolatileRuntimeStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/VolatileRuntimeStorage.php',
    'Kevinrob\\GuzzleCache\\Storage\\WordPressObjectCacheStorage' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Storage/WordPressObjectCacheStorage.php',
    'Kevinrob\\GuzzleCache\\Strategy\\CacheStrategyInterface' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/CacheStrategyInterface.php',
    'Kevinrob\\GuzzleCache\\Strategy\\Delegate\\DelegatingCacheStrategy' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/DelegatingCacheStrategy.php',
    'Kevinrob\\GuzzleCache\\Strategy\\Delegate\\RequestMatcherInterface' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/Delegate/RequestMatcherInterface.php',
    'Kevinrob\\GuzzleCache\\Strategy\\GreedyCacheStrategy' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/GreedyCacheStrategy.php',
    'Kevinrob\\GuzzleCache\\Strategy\\NullCacheStrategy' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/NullCacheStrategy.php',
    'Kevinrob\\GuzzleCache\\Strategy\\PrivateCacheStrategy' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/PrivateCacheStrategy.php',
    'Kevinrob\\GuzzleCache\\Strategy\\PublicCacheStrategy' => $vendorDir . '/kevinrob/guzzle-cache-middleware/src/Strategy/PublicCacheStrategy.php',
    'LTDBeget\\ascii\\AsciiChar' => $vendorDir . '/ltd-beget/ascii-table/src/LTDBeget/ascii/AsciiChar.php',
    'LTDBeget\\dns\\SyntaxErrorException' => $vendorDir . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/SyntaxErrorException.php',
    'LTDBeget\\dns\\Tokenizer' => $vendorDir . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/Tokenizer.php',
    'LTDBeget\\dns\\configurator\\Zone' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/Zone.php',
    'LTDBeget\\dns\\configurator\\deserializer\\ArrayDeserializer' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/ArrayDeserializer.php',
    'LTDBeget\\dns\\configurator\\deserializer\\PlainDeserializer' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/deserializer/PlainDeserializer.php',
    'LTDBeget\\dns\\configurator\\errors\\ErrorsStore' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ErrorsStore.php',
    'LTDBeget\\dns\\configurator\\errors\\ValidationError' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/errors/ValidationError.php',
    'LTDBeget\\dns\\configurator\\traits\\RecordsIterateTrait' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/traits/RecordsIterateTrait.php',
    'LTDBeget\\dns\\configurator\\validators\\CnameNumberCheck' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/CnameNumberCheck.php',
    'LTDBeget\\dns\\configurator\\validators\\ConflictTypesValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/ConflictTypesValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\DnsZoneDomainNameValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/DnsZoneDomainNameValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\HostnameValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/HostnameValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\Int16Validator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int16Validator.php',
    'LTDBeget\\dns\\configurator\\validators\\Int32Validator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Int32Validator.php',
    'LTDBeget\\dns\\configurator\\validators\\Ip4Validator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip4Validator.php',
    'LTDBeget\\dns\\configurator\\validators\\Ip6Validator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/Ip6Validator.php',
    'LTDBeget\\dns\\configurator\\validators\\OutOfZoneDataValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/OutOfZoneDataValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\PtrValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/PtrValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\SoaNotInRootValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNotInRootValidator.php',
    'LTDBeget\\dns\\configurator\\validators\\SoaNumberCheck' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/SoaNumberCheck.php',
    'LTDBeget\\dns\\configurator\\validators\\TtlValidator' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/validators/TtlValidator.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\Node' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/Node.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\RecordAppender' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordAppender.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\RecordsStore' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/RecordsStore.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\ARecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/ARecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\AaaaRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/AaaaRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\CaaRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CaaRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\CnameRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/CnameRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\MxRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/MxRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\NaptrRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NaptrRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\NsRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/NsRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\PtrRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/PtrRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\SoaRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SoaRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\SrvRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/SrvRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\TxtRecord' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/TxtRecord.php',
    'LTDBeget\\dns\\configurator\\zoneEntities\\record\\base\\Record' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/configurator/zoneEntities/record/base/Record.php',
    'LTDBeget\\dns\\enums\\eErrorCode' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eErrorCode.php',
    'LTDBeget\\dns\\enums\\eRecordNotification' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordNotification.php',
    'LTDBeget\\dns\\enums\\eRecordType' => $vendorDir . '/ltd-beget/dns-zone-configurator/src/LTDBeget/dns/enums/eRecordType.php',
    'LTDBeget\\dns\\record\\RData' => $vendorDir . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/RData.php',
    'LTDBeget\\dns\\record\\Record' => $vendorDir . '/ltd-beget/dns-zone-tokenizer/src/LTDBeget/dns/record/Record.php',
    'LTDBeget\\stringstream\\StringStream' => $vendorDir . '/ltd-beget/stringstream/src/LTDBeget/stringstream/StringStream.php',
    'Laminas\\ServiceManager\\AbstractFactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/AbstractFactoryInterface.php',
    'Laminas\\ServiceManager\\AbstractFactory\\ConfigAbstractFactory' => $vendorDir . '/laminas/laminas-servicemanager/src/AbstractFactory/ConfigAbstractFactory.php',
    'Laminas\\ServiceManager\\AbstractFactory\\ReflectionBasedAbstractFactory' => $vendorDir . '/laminas/laminas-servicemanager/src/AbstractFactory/ReflectionBasedAbstractFactory.php',
    'Laminas\\ServiceManager\\AbstractPluginManager' => $vendorDir . '/laminas/laminas-servicemanager/src/AbstractPluginManager.php',
    'Laminas\\ServiceManager\\Config' => $vendorDir . '/laminas/laminas-servicemanager/src/Config.php',
    'Laminas\\ServiceManager\\ConfigInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/ConfigInterface.php',
    'Laminas\\ServiceManager\\DelegatorFactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/DelegatorFactoryInterface.php',
    'Laminas\\ServiceManager\\Exception\\ContainerModificationsNotAllowedException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/ContainerModificationsNotAllowedException.php',
    'Laminas\\ServiceManager\\Exception\\CyclicAliasException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/CyclicAliasException.php',
    'Laminas\\ServiceManager\\Exception\\ExceptionInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/ExceptionInterface.php',
    'Laminas\\ServiceManager\\Exception\\InvalidArgumentException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/InvalidArgumentException.php',
    'Laminas\\ServiceManager\\Exception\\InvalidServiceException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/InvalidServiceException.php',
    'Laminas\\ServiceManager\\Exception\\ServiceNotCreatedException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/ServiceNotCreatedException.php',
    'Laminas\\ServiceManager\\Exception\\ServiceNotFoundException' => $vendorDir . '/laminas/laminas-servicemanager/src/Exception/ServiceNotFoundException.php',
    'Laminas\\ServiceManager\\FactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/FactoryInterface.php',
    'Laminas\\ServiceManager\\Factory\\AbstractFactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/Factory/AbstractFactoryInterface.php',
    'Laminas\\ServiceManager\\Factory\\DelegatorFactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/Factory/DelegatorFactoryInterface.php',
    'Laminas\\ServiceManager\\Factory\\FactoryInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/Factory/FactoryInterface.php',
    'Laminas\\ServiceManager\\Factory\\InvokableFactory' => $vendorDir . '/laminas/laminas-servicemanager/src/Factory/InvokableFactory.php',
    'Laminas\\ServiceManager\\InitializerInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/InitializerInterface.php',
    'Laminas\\ServiceManager\\Initializer\\InitializerInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/Initializer/InitializerInterface.php',
    'Laminas\\ServiceManager\\PluginManagerInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/PluginManagerInterface.php',
    'Laminas\\ServiceManager\\Proxy\\LazyServiceFactory' => $vendorDir . '/laminas/laminas-servicemanager/src/Proxy/LazyServiceFactory.php',
    'Laminas\\ServiceManager\\ServiceLocatorInterface' => $vendorDir . '/laminas/laminas-servicemanager/src/ServiceLocatorInterface.php',
    'Laminas\\ServiceManager\\ServiceManager' => $vendorDir . '/laminas/laminas-servicemanager/src/ServiceManager.php',
    'Laminas\\ServiceManager\\Test\\CommonPluginManagerTrait' => $vendorDir . '/laminas/laminas-servicemanager/src/Test/CommonPluginManagerTrait.php',
    'Laminas\\ServiceManager\\Tool\\ConfigDumper' => $vendorDir . '/laminas/laminas-servicemanager/src/Tool/ConfigDumper.php',
    'Laminas\\ServiceManager\\Tool\\ConfigDumperCommand' => $vendorDir . '/laminas/laminas-servicemanager/src/Tool/ConfigDumperCommand.php',
    'Laminas\\ServiceManager\\Tool\\FactoryCreator' => $vendorDir . '/laminas/laminas-servicemanager/src/Tool/FactoryCreator.php',
    'Laminas\\ServiceManager\\Tool\\FactoryCreatorCommand' => $vendorDir . '/laminas/laminas-servicemanager/src/Tool/FactoryCreatorCommand.php',
    'Laminas\\Stdlib\\AbstractOptions' => $vendorDir . '/laminas/laminas-stdlib/src/AbstractOptions.php',
    'Laminas\\Stdlib\\ArrayObject' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayObject.php',
    'Laminas\\Stdlib\\ArraySerializableInterface' => $vendorDir . '/laminas/laminas-stdlib/src/ArraySerializableInterface.php',
    'Laminas\\Stdlib\\ArrayStack' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayStack.php',
    'Laminas\\Stdlib\\ArrayUtils' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayUtils.php',
    'Laminas\\Stdlib\\ArrayUtils\\MergeRemoveKey' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayUtils/MergeRemoveKey.php',
    'Laminas\\Stdlib\\ArrayUtils\\MergeReplaceKey' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKey.php',
    'Laminas\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => $vendorDir . '/laminas/laminas-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php',
    'Laminas\\Stdlib\\ConsoleHelper' => $vendorDir . '/laminas/laminas-stdlib/src/ConsoleHelper.php',
    'Laminas\\Stdlib\\DispatchableInterface' => $vendorDir . '/laminas/laminas-stdlib/src/DispatchableInterface.php',
    'Laminas\\Stdlib\\ErrorHandler' => $vendorDir . '/laminas/laminas-stdlib/src/ErrorHandler.php',
    'Laminas\\Stdlib\\Exception\\BadMethodCallException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/BadMethodCallException.php',
    'Laminas\\Stdlib\\Exception\\DomainException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/DomainException.php',
    'Laminas\\Stdlib\\Exception\\ExceptionInterface' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/ExceptionInterface.php',
    'Laminas\\Stdlib\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/ExtensionNotLoadedException.php',
    'Laminas\\Stdlib\\Exception\\InvalidArgumentException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/InvalidArgumentException.php',
    'Laminas\\Stdlib\\Exception\\LogicException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/LogicException.php',
    'Laminas\\Stdlib\\Exception\\RuntimeException' => $vendorDir . '/laminas/laminas-stdlib/src/Exception/RuntimeException.php',
    'Laminas\\Stdlib\\FastPriorityQueue' => $vendorDir . '/laminas/laminas-stdlib/src/FastPriorityQueue.php',
    'Laminas\\Stdlib\\Glob' => $vendorDir . '/laminas/laminas-stdlib/src/Glob.php',
    'Laminas\\Stdlib\\Guard\\AllGuardsTrait' => $vendorDir . '/laminas/laminas-stdlib/src/Guard/AllGuardsTrait.php',
    'Laminas\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => $vendorDir . '/laminas/laminas-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php',
    'Laminas\\Stdlib\\Guard\\EmptyGuardTrait' => $vendorDir . '/laminas/laminas-stdlib/src/Guard/EmptyGuardTrait.php',
    'Laminas\\Stdlib\\Guard\\NullGuardTrait' => $vendorDir . '/laminas/laminas-stdlib/src/Guard/NullGuardTrait.php',
    'Laminas\\Stdlib\\InitializableInterface' => $vendorDir . '/laminas/laminas-stdlib/src/InitializableInterface.php',
    'Laminas\\Stdlib\\JsonSerializable' => $vendorDir . '/laminas/laminas-stdlib/src/JsonSerializable.php',
    'Laminas\\Stdlib\\Message' => $vendorDir . '/laminas/laminas-stdlib/src/Message.php',
    'Laminas\\Stdlib\\MessageInterface' => $vendorDir . '/laminas/laminas-stdlib/src/MessageInterface.php',
    'Laminas\\Stdlib\\ParameterObjectInterface' => $vendorDir . '/laminas/laminas-stdlib/src/ParameterObjectInterface.php',
    'Laminas\\Stdlib\\Parameters' => $vendorDir . '/laminas/laminas-stdlib/src/Parameters.php',
    'Laminas\\Stdlib\\ParametersInterface' => $vendorDir . '/laminas/laminas-stdlib/src/ParametersInterface.php',
    'Laminas\\Stdlib\\PriorityList' => $vendorDir . '/laminas/laminas-stdlib/src/PriorityList.php',
    'Laminas\\Stdlib\\PriorityQueue' => $vendorDir . '/laminas/laminas-stdlib/src/PriorityQueue.php',
    'Laminas\\Stdlib\\Request' => $vendorDir . '/laminas/laminas-stdlib/src/Request.php',
    'Laminas\\Stdlib\\RequestInterface' => $vendorDir . '/laminas/laminas-stdlib/src/RequestInterface.php',
    'Laminas\\Stdlib\\Response' => $vendorDir . '/laminas/laminas-stdlib/src/Response.php',
    'Laminas\\Stdlib\\ResponseInterface' => $vendorDir . '/laminas/laminas-stdlib/src/ResponseInterface.php',
    'Laminas\\Stdlib\\SplPriorityQueue' => $vendorDir . '/laminas/laminas-stdlib/src/SplPriorityQueue.php',
    'Laminas\\Stdlib\\SplQueue' => $vendorDir . '/laminas/laminas-stdlib/src/SplQueue.php',
    'Laminas\\Stdlib\\SplStack' => $vendorDir . '/laminas/laminas-stdlib/src/SplStack.php',
    'Laminas\\Stdlib\\StringUtils' => $vendorDir . '/laminas/laminas-stdlib/src/StringUtils.php',
    'Laminas\\Stdlib\\StringWrapper\\AbstractStringWrapper' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/AbstractStringWrapper.php',
    'Laminas\\Stdlib\\StringWrapper\\Iconv' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/Iconv.php',
    'Laminas\\Stdlib\\StringWrapper\\Intl' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/Intl.php',
    'Laminas\\Stdlib\\StringWrapper\\MbString' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/MbString.php',
    'Laminas\\Stdlib\\StringWrapper\\Native' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/Native.php',
    'Laminas\\Stdlib\\StringWrapper\\StringWrapperInterface' => $vendorDir . '/laminas/laminas-stdlib/src/StringWrapper/StringWrapperInterface.php',
    'Laminas\\Validator\\AbstractValidator' => $vendorDir . '/laminas/laminas-validator/src/AbstractValidator.php',
    'Laminas\\Validator\\Barcode' => $vendorDir . '/laminas/laminas-validator/src/Barcode.php',
    'Laminas\\Validator\\Barcode\\AbstractAdapter' => $vendorDir . '/laminas/laminas-validator/src/Barcode/AbstractAdapter.php',
    'Laminas\\Validator\\Barcode\\AdapterInterface' => $vendorDir . '/laminas/laminas-validator/src/Barcode/AdapterInterface.php',
    'Laminas\\Validator\\Barcode\\Codabar' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Codabar.php',
    'Laminas\\Validator\\Barcode\\Code128' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code128.php',
    'Laminas\\Validator\\Barcode\\Code25' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code25.php',
    'Laminas\\Validator\\Barcode\\Code25interleaved' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code25interleaved.php',
    'Laminas\\Validator\\Barcode\\Code39' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code39.php',
    'Laminas\\Validator\\Barcode\\Code39ext' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code39ext.php',
    'Laminas\\Validator\\Barcode\\Code93' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code93.php',
    'Laminas\\Validator\\Barcode\\Code93ext' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Code93ext.php',
    'Laminas\\Validator\\Barcode\\Ean12' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean12.php',
    'Laminas\\Validator\\Barcode\\Ean13' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean13.php',
    'Laminas\\Validator\\Barcode\\Ean14' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean14.php',
    'Laminas\\Validator\\Barcode\\Ean18' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean18.php',
    'Laminas\\Validator\\Barcode\\Ean2' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean2.php',
    'Laminas\\Validator\\Barcode\\Ean5' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean5.php',
    'Laminas\\Validator\\Barcode\\Ean8' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Ean8.php',
    'Laminas\\Validator\\Barcode\\Gtin12' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Gtin12.php',
    'Laminas\\Validator\\Barcode\\Gtin13' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Gtin13.php',
    'Laminas\\Validator\\Barcode\\Gtin14' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Gtin14.php',
    'Laminas\\Validator\\Barcode\\Identcode' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Identcode.php',
    'Laminas\\Validator\\Barcode\\Intelligentmail' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Intelligentmail.php',
    'Laminas\\Validator\\Barcode\\Issn' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Issn.php',
    'Laminas\\Validator\\Barcode\\Itf14' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Itf14.php',
    'Laminas\\Validator\\Barcode\\Leitcode' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Leitcode.php',
    'Laminas\\Validator\\Barcode\\Planet' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Planet.php',
    'Laminas\\Validator\\Barcode\\Postnet' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Postnet.php',
    'Laminas\\Validator\\Barcode\\Royalmail' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Royalmail.php',
    'Laminas\\Validator\\Barcode\\Sscc' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Sscc.php',
    'Laminas\\Validator\\Barcode\\Upca' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Upca.php',
    'Laminas\\Validator\\Barcode\\Upce' => $vendorDir . '/laminas/laminas-validator/src/Barcode/Upce.php',
    'Laminas\\Validator\\Between' => $vendorDir . '/laminas/laminas-validator/src/Between.php',
    'Laminas\\Validator\\Bitwise' => $vendorDir . '/laminas/laminas-validator/src/Bitwise.php',
    'Laminas\\Validator\\BusinessIdentifierCode' => $vendorDir . '/laminas/laminas-validator/src/BusinessIdentifierCode.php',
    'Laminas\\Validator\\Callback' => $vendorDir . '/laminas/laminas-validator/src/Callback.php',
    'Laminas\\Validator\\ConfigProvider' => $vendorDir . '/laminas/laminas-validator/src/ConfigProvider.php',
    'Laminas\\Validator\\CreditCard' => $vendorDir . '/laminas/laminas-validator/src/CreditCard.php',
    'Laminas\\Validator\\Csrf' => $vendorDir . '/laminas/laminas-validator/src/Csrf.php',
    'Laminas\\Validator\\Date' => $vendorDir . '/laminas/laminas-validator/src/Date.php',
    'Laminas\\Validator\\DateComparison' => $vendorDir . '/laminas/laminas-validator/src/DateComparison.php',
    'Laminas\\Validator\\DateStep' => $vendorDir . '/laminas/laminas-validator/src/DateStep.php',
    'Laminas\\Validator\\Db\\AbstractDb' => $vendorDir . '/laminas/laminas-validator/src/Db/AbstractDb.php',
    'Laminas\\Validator\\Db\\NoRecordExists' => $vendorDir . '/laminas/laminas-validator/src/Db/NoRecordExists.php',
    'Laminas\\Validator\\Db\\RecordExists' => $vendorDir . '/laminas/laminas-validator/src/Db/RecordExists.php',
    'Laminas\\Validator\\Digits' => $vendorDir . '/laminas/laminas-validator/src/Digits.php',
    'Laminas\\Validator\\EmailAddress' => $vendorDir . '/laminas/laminas-validator/src/EmailAddress.php',
    'Laminas\\Validator\\Exception\\BadMethodCallException' => $vendorDir . '/laminas/laminas-validator/src/Exception/BadMethodCallException.php',
    'Laminas\\Validator\\Exception\\ExceptionInterface' => $vendorDir . '/laminas/laminas-validator/src/Exception/ExceptionInterface.php',
    'Laminas\\Validator\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/laminas/laminas-validator/src/Exception/ExtensionNotLoadedException.php',
    'Laminas\\Validator\\Exception\\InvalidArgumentException' => $vendorDir . '/laminas/laminas-validator/src/Exception/InvalidArgumentException.php',
    'Laminas\\Validator\\Exception\\InvalidMagicMimeFileException' => $vendorDir . '/laminas/laminas-validator/src/Exception/InvalidMagicMimeFileException.php',
    'Laminas\\Validator\\Exception\\RuntimeException' => $vendorDir . '/laminas/laminas-validator/src/Exception/RuntimeException.php',
    'Laminas\\Validator\\Explode' => $vendorDir . '/laminas/laminas-validator/src/Explode.php',
    'Laminas\\Validator\\File\\Count' => $vendorDir . '/laminas/laminas-validator/src/File/Count.php',
    'Laminas\\Validator\\File\\Crc32' => $vendorDir . '/laminas/laminas-validator/src/File/Crc32.php',
    'Laminas\\Validator\\File\\ExcludeExtension' => $vendorDir . '/laminas/laminas-validator/src/File/ExcludeExtension.php',
    'Laminas\\Validator\\File\\ExcludeMimeType' => $vendorDir . '/laminas/laminas-validator/src/File/ExcludeMimeType.php',
    'Laminas\\Validator\\File\\Exists' => $vendorDir . '/laminas/laminas-validator/src/File/Exists.php',
    'Laminas\\Validator\\File\\Extension' => $vendorDir . '/laminas/laminas-validator/src/File/Extension.php',
    'Laminas\\Validator\\File\\FileInformationTrait' => $vendorDir . '/laminas/laminas-validator/src/File/FileInformationTrait.php',
    'Laminas\\Validator\\File\\FilesSize' => $vendorDir . '/laminas/laminas-validator/src/File/FilesSize.php',
    'Laminas\\Validator\\File\\Hash' => $vendorDir . '/laminas/laminas-validator/src/File/Hash.php',
    'Laminas\\Validator\\File\\ImageSize' => $vendorDir . '/laminas/laminas-validator/src/File/ImageSize.php',
    'Laminas\\Validator\\File\\IsCompressed' => $vendorDir . '/laminas/laminas-validator/src/File/IsCompressed.php',
    'Laminas\\Validator\\File\\IsImage' => $vendorDir . '/laminas/laminas-validator/src/File/IsImage.php',
    'Laminas\\Validator\\File\\Md5' => $vendorDir . '/laminas/laminas-validator/src/File/Md5.php',
    'Laminas\\Validator\\File\\MimeType' => $vendorDir . '/laminas/laminas-validator/src/File/MimeType.php',
    'Laminas\\Validator\\File\\NotExists' => $vendorDir . '/laminas/laminas-validator/src/File/NotExists.php',
    'Laminas\\Validator\\File\\Sha1' => $vendorDir . '/laminas/laminas-validator/src/File/Sha1.php',
    'Laminas\\Validator\\File\\Size' => $vendorDir . '/laminas/laminas-validator/src/File/Size.php',
    'Laminas\\Validator\\File\\Upload' => $vendorDir . '/laminas/laminas-validator/src/File/Upload.php',
    'Laminas\\Validator\\File\\UploadFile' => $vendorDir . '/laminas/laminas-validator/src/File/UploadFile.php',
    'Laminas\\Validator\\File\\WordCount' => $vendorDir . '/laminas/laminas-validator/src/File/WordCount.php',
    'Laminas\\Validator\\GpsPoint' => $vendorDir . '/laminas/laminas-validator/src/GpsPoint.php',
    'Laminas\\Validator\\GreaterThan' => $vendorDir . '/laminas/laminas-validator/src/GreaterThan.php',
    'Laminas\\Validator\\Hex' => $vendorDir . '/laminas/laminas-validator/src/Hex.php',
    'Laminas\\Validator\\HostWithPublicIPv4Address' => $vendorDir . '/laminas/laminas-validator/src/HostWithPublicIPv4Address.php',
    'Laminas\\Validator\\Hostname' => $vendorDir . '/laminas/laminas-validator/src/Hostname.php',
    'Laminas\\Validator\\Iban' => $vendorDir . '/laminas/laminas-validator/src/Iban.php',
    'Laminas\\Validator\\Identical' => $vendorDir . '/laminas/laminas-validator/src/Identical.php',
    'Laminas\\Validator\\InArray' => $vendorDir . '/laminas/laminas-validator/src/InArray.php',
    'Laminas\\Validator\\Ip' => $vendorDir . '/laminas/laminas-validator/src/Ip.php',
    'Laminas\\Validator\\IsArray' => $vendorDir . '/laminas/laminas-validator/src/IsArray.php',
    'Laminas\\Validator\\IsCountable' => $vendorDir . '/laminas/laminas-validator/src/IsCountable.php',
    'Laminas\\Validator\\IsInstanceOf' => $vendorDir . '/laminas/laminas-validator/src/IsInstanceOf.php',
    'Laminas\\Validator\\IsJsonString' => $vendorDir . '/laminas/laminas-validator/src/IsJsonString.php',
    'Laminas\\Validator\\Isbn' => $vendorDir . '/laminas/laminas-validator/src/Isbn.php',
    'Laminas\\Validator\\Isbn\\Isbn10' => $vendorDir . '/laminas/laminas-validator/src/Isbn/Isbn10.php',
    'Laminas\\Validator\\Isbn\\Isbn13' => $vendorDir . '/laminas/laminas-validator/src/Isbn/Isbn13.php',
    'Laminas\\Validator\\LessThan' => $vendorDir . '/laminas/laminas-validator/src/LessThan.php',
    'Laminas\\Validator\\Module' => $vendorDir . '/laminas/laminas-validator/src/Module.php',
    'Laminas\\Validator\\NotEmpty' => $vendorDir . '/laminas/laminas-validator/src/NotEmpty.php',
    'Laminas\\Validator\\NumberComparison' => $vendorDir . '/laminas/laminas-validator/src/NumberComparison.php',
    'Laminas\\Validator\\Regex' => $vendorDir . '/laminas/laminas-validator/src/Regex.php',
    'Laminas\\Validator\\Sitemap\\Changefreq' => $vendorDir . '/laminas/laminas-validator/src/Sitemap/Changefreq.php',
    'Laminas\\Validator\\Sitemap\\Lastmod' => $vendorDir . '/laminas/laminas-validator/src/Sitemap/Lastmod.php',
    'Laminas\\Validator\\Sitemap\\Loc' => $vendorDir . '/laminas/laminas-validator/src/Sitemap/Loc.php',
    'Laminas\\Validator\\Sitemap\\Priority' => $vendorDir . '/laminas/laminas-validator/src/Sitemap/Priority.php',
    'Laminas\\Validator\\StaticValidator' => $vendorDir . '/laminas/laminas-validator/src/StaticValidator.php',
    'Laminas\\Validator\\Step' => $vendorDir . '/laminas/laminas-validator/src/Step.php',
    'Laminas\\Validator\\StringLength' => $vendorDir . '/laminas/laminas-validator/src/StringLength.php',
    'Laminas\\Validator\\Timezone' => $vendorDir . '/laminas/laminas-validator/src/Timezone.php',
    'Laminas\\Validator\\Translator\\DummyTranslator' => $vendorDir . '/laminas/laminas-validator/src/Translator/DummyTranslator.php',
    'Laminas\\Validator\\Translator\\Translator' => $vendorDir . '/laminas/laminas-validator/src/Translator/Translator.php',
    'Laminas\\Validator\\Translator\\TranslatorAwareInterface' => $vendorDir . '/laminas/laminas-validator/src/Translator/TranslatorAwareInterface.php',
    'Laminas\\Validator\\Translator\\TranslatorFactory' => $vendorDir . '/laminas/laminas-validator/src/Translator/TranslatorFactory.php',
    'Laminas\\Validator\\Translator\\TranslatorInterface' => $vendorDir . '/laminas/laminas-validator/src/Translator/TranslatorInterface.php',
    'Laminas\\Validator\\UndisclosedPassword' => $vendorDir . '/laminas/laminas-validator/src/UndisclosedPassword.php',
    'Laminas\\Validator\\Uri' => $vendorDir . '/laminas/laminas-validator/src/Uri.php',
    'Laminas\\Validator\\Uuid' => $vendorDir . '/laminas/laminas-validator/src/Uuid.php',
    'Laminas\\Validator\\ValidatorChain' => $vendorDir . '/laminas/laminas-validator/src/ValidatorChain.php',
    'Laminas\\Validator\\ValidatorInterface' => $vendorDir . '/laminas/laminas-validator/src/ValidatorInterface.php',
    'Laminas\\Validator\\ValidatorPluginManager' => $vendorDir . '/laminas/laminas-validator/src/ValidatorPluginManager.php',
    'Laminas\\Validator\\ValidatorPluginManagerAwareInterface' => $vendorDir . '/laminas/laminas-validator/src/ValidatorPluginManagerAwareInterface.php',
    'Laminas\\Validator\\ValidatorPluginManagerFactory' => $vendorDir . '/laminas/laminas-validator/src/ValidatorPluginManagerFactory.php',
    'Laminas\\Validator\\ValidatorProviderInterface' => $vendorDir . '/laminas/laminas-validator/src/ValidatorProviderInterface.php',
    'League\\Csv\\AbstractCsv' => $vendorDir . '/league/csv/src/AbstractCsv.php',
    'League\\Csv\\Bom' => $vendorDir . '/league/csv/src/Bom.php',
    'League\\Csv\\Buffer' => $vendorDir . '/league/csv/src/Buffer.php',
    'League\\Csv\\ByteSequence' => $vendorDir . '/league/csv/src/ByteSequence.php',
    'League\\Csv\\CallbackStreamFilter' => $vendorDir . '/league/csv/src/CallbackStreamFilter.php',
    'League\\Csv\\CannotInsertRecord' => $vendorDir . '/league/csv/src/CannotInsertRecord.php',
    'League\\Csv\\CharsetConverter' => $vendorDir . '/league/csv/src/CharsetConverter.php',
    'League\\Csv\\ColumnConsistency' => $vendorDir . '/league/csv/src/ColumnConsistency.php',
    'League\\Csv\\EncloseField' => $vendorDir . '/league/csv/src/EncloseField.php',
    'League\\Csv\\EscapeFormula' => $vendorDir . '/league/csv/src/EscapeFormula.php',
    'League\\Csv\\Exception' => $vendorDir . '/league/csv/src/Exception.php',
    'League\\Csv\\FragmentFinder' => $vendorDir . '/league/csv/src/FragmentFinder.php',
    'League\\Csv\\FragmentNotFound' => $vendorDir . '/league/csv/src/FragmentNotFound.php',
    'League\\Csv\\HTMLConverter' => $vendorDir . '/league/csv/src/HTMLConverter.php',
    'League\\Csv\\HttpHeaders' => $vendorDir . '/league/csv/src/HttpHeaders.php',
    'League\\Csv\\Info' => $vendorDir . '/league/csv/src/Info.php',
    'League\\Csv\\InvalidArgument' => $vendorDir . '/league/csv/src/InvalidArgument.php',
    'League\\Csv\\JsonConverter' => $vendorDir . '/league/csv/src/JsonConverter.php',
    'League\\Csv\\JsonFormat' => $vendorDir . '/league/csv/src/JsonFormat.php',
    'League\\Csv\\MapIterator' => $vendorDir . '/league/csv/src/MapIterator.php',
    'League\\Csv\\Query\\Constraint\\Column' => $vendorDir . '/league/csv/src/Query/Constraint/Column.php',
    'League\\Csv\\Query\\Constraint\\Comparison' => $vendorDir . '/league/csv/src/Query/Constraint/Comparison.php',
    'League\\Csv\\Query\\Constraint\\Criteria' => $vendorDir . '/league/csv/src/Query/Constraint/Criteria.php',
    'League\\Csv\\Query\\Constraint\\Offset' => $vendorDir . '/league/csv/src/Query/Constraint/Offset.php',
    'League\\Csv\\Query\\Constraint\\TwoColumns' => $vendorDir . '/league/csv/src/Query/Constraint/TwoColumns.php',
    'League\\Csv\\Query\\Limit' => $vendorDir . '/league/csv/src/Query/Limit.php',
    'League\\Csv\\Query\\Ordering\\Column' => $vendorDir . '/league/csv/src/Query/Ordering/Column.php',
    'League\\Csv\\Query\\Ordering\\MultiSort' => $vendorDir . '/league/csv/src/Query/Ordering/MultiSort.php',
    'League\\Csv\\Query\\Predicate' => $vendorDir . '/league/csv/src/Query/Predicate.php',
    'League\\Csv\\Query\\PredicateCombinator' => $vendorDir . '/league/csv/src/Query/PredicateCombinator.php',
    'League\\Csv\\Query\\QueryException' => $vendorDir . '/league/csv/src/Query/QueryException.php',
    'League\\Csv\\Query\\Row' => $vendorDir . '/league/csv/src/Query/Row.php',
    'League\\Csv\\Query\\Sort' => $vendorDir . '/league/csv/src/Query/Sort.php',
    'League\\Csv\\Query\\SortCombinator' => $vendorDir . '/league/csv/src/Query/SortCombinator.php',
    'League\\Csv\\RFC4180Field' => $vendorDir . '/league/csv/src/RFC4180Field.php',
    'League\\Csv\\RdbmsResult' => $vendorDir . '/league/csv/src/RdbmsResult.php',
    'League\\Csv\\Reader' => $vendorDir . '/league/csv/src/Reader.php',
    'League\\Csv\\ResultSet' => $vendorDir . '/league/csv/src/ResultSet.php',
    'League\\Csv\\Serializer\\AfterMapping' => $vendorDir . '/league/csv/src/Serializer/AfterMapping.php',
    'League\\Csv\\Serializer\\ArrayShape' => $vendorDir . '/league/csv/src/Serializer/ArrayShape.php',
    'League\\Csv\\Serializer\\CallbackCasting' => $vendorDir . '/league/csv/src/Serializer/CallbackCasting.php',
    'League\\Csv\\Serializer\\CastToArray' => $vendorDir . '/league/csv/src/Serializer/CastToArray.php',
    'League\\Csv\\Serializer\\CastToBool' => $vendorDir . '/league/csv/src/Serializer/CastToBool.php',
    'League\\Csv\\Serializer\\CastToDate' => $vendorDir . '/league/csv/src/Serializer/CastToDate.php',
    'League\\Csv\\Serializer\\CastToEnum' => $vendorDir . '/league/csv/src/Serializer/CastToEnum.php',
    'League\\Csv\\Serializer\\CastToFloat' => $vendorDir . '/league/csv/src/Serializer/CastToFloat.php',
    'League\\Csv\\Serializer\\CastToInt' => $vendorDir . '/league/csv/src/Serializer/CastToInt.php',
    'League\\Csv\\Serializer\\CastToString' => $vendorDir . '/league/csv/src/Serializer/CastToString.php',
    'League\\Csv\\Serializer\\DenormalizationFailed' => $vendorDir . '/league/csv/src/Serializer/DenormalizationFailed.php',
    'League\\Csv\\Serializer\\Denormalizer' => $vendorDir . '/league/csv/src/Serializer/Denormalizer.php',
    'League\\Csv\\Serializer\\MapCell' => $vendorDir . '/league/csv/src/Serializer/MapCell.php',
    'League\\Csv\\Serializer\\MapRecord' => $vendorDir . '/league/csv/src/Serializer/MapRecord.php',
    'League\\Csv\\Serializer\\MappingFailed' => $vendorDir . '/league/csv/src/Serializer/MappingFailed.php',
    'League\\Csv\\Serializer\\PropertySetter' => $vendorDir . '/league/csv/src/Serializer/PropertySetter.php',
    'League\\Csv\\Serializer\\SerializationFailed' => $vendorDir . '/league/csv/src/Serializer/SerializationFailed.php',
    'League\\Csv\\Serializer\\Type' => $vendorDir . '/league/csv/src/Serializer/Type.php',
    'League\\Csv\\Serializer\\TypeCasting' => $vendorDir . '/league/csv/src/Serializer/TypeCasting.php',
    'League\\Csv\\Serializer\\TypeCastingFailed' => $vendorDir . '/league/csv/src/Serializer/TypeCastingFailed.php',
    'League\\Csv\\Serializer\\TypeCastingInfo' => $vendorDir . '/league/csv/src/Serializer/TypeCastingInfo.php',
    'League\\Csv\\Serializer\\TypeCastingTargetType' => $vendorDir . '/league/csv/src/Serializer/TypeCastingTargetType.php',
    'League\\Csv\\Statement' => $vendorDir . '/league/csv/src/Statement.php',
    'League\\Csv\\Stream' => $vendorDir . '/league/csv/src/Stream.php',
    'League\\Csv\\StreamFilter' => $vendorDir . '/league/csv/src/StreamFilter.php',
    'League\\Csv\\SwapDelimiter' => $vendorDir . '/league/csv/src/SwapDelimiter.php',
    'League\\Csv\\SyntaxError' => $vendorDir . '/league/csv/src/SyntaxError.php',
    'League\\Csv\\TabularData' => $vendorDir . '/league/csv/src/TabularData.php',
    'League\\Csv\\TabularDataProvider' => $vendorDir . '/league/csv/src/TabularDataProvider.php',
    'League\\Csv\\TabularDataReader' => $vendorDir . '/league/csv/src/TabularDataReader.php',
    'League\\Csv\\TabularDataWriter' => $vendorDir . '/league/csv/src/TabularDataWriter.php',
    'League\\Csv\\UnableToProcessCsv' => $vendorDir . '/league/csv/src/UnableToProcessCsv.php',
    'League\\Csv\\UnavailableFeature' => $vendorDir . '/league/csv/src/UnavailableFeature.php',
    'League\\Csv\\UnavailableStream' => $vendorDir . '/league/csv/src/UnavailableStream.php',
    'League\\Csv\\Warning' => $vendorDir . '/league/csv/src/Warning.php',
    'League\\Csv\\Writer' => $vendorDir . '/league/csv/src/Writer.php',
    'League\\Csv\\XMLConverter' => $vendorDir . '/league/csv/src/XMLConverter.php',
    'League\\OAuth2\\Client\\Grant\\AbstractGrant' => $vendorDir . '/league/oauth2-client/src/Grant/AbstractGrant.php',
    'League\\OAuth2\\Client\\Grant\\AuthorizationCode' => $vendorDir . '/league/oauth2-client/src/Grant/AuthorizationCode.php',
    'League\\OAuth2\\Client\\Grant\\ClientCredentials' => $vendorDir . '/league/oauth2-client/src/Grant/ClientCredentials.php',
    'League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => $vendorDir . '/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
    'League\\OAuth2\\Client\\Grant\\GrantFactory' => $vendorDir . '/league/oauth2-client/src/Grant/GrantFactory.php',
    'League\\OAuth2\\Client\\Grant\\Password' => $vendorDir . '/league/oauth2-client/src/Grant/Password.php',
    'League\\OAuth2\\Client\\Grant\\RefreshToken' => $vendorDir . '/league/oauth2-client/src/Grant/RefreshToken.php',
    'League\\OAuth2\\Client\\OptionProvider\\HttpBasicAuthOptionProvider' => $vendorDir . '/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php',
    'League\\OAuth2\\Client\\OptionProvider\\OptionProviderInterface' => $vendorDir . '/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php',
    'League\\OAuth2\\Client\\OptionProvider\\PostAuthOptionProvider' => $vendorDir . '/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php',
    'League\\OAuth2\\Client\\Provider\\AbstractProvider' => $vendorDir . '/league/oauth2-client/src/Provider/AbstractProvider.php',
    'League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => $vendorDir . '/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
    'League\\OAuth2\\Client\\Provider\\GenericProvider' => $vendorDir . '/league/oauth2-client/src/Provider/GenericProvider.php',
    'League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => $vendorDir . '/league/oauth2-client/src/Provider/GenericResourceOwner.php',
    'League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => $vendorDir . '/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
    'League\\OAuth2\\Client\\Token\\AccessToken' => $vendorDir . '/league/oauth2-client/src/Token/AccessToken.php',
    'League\\OAuth2\\Client\\Token\\AccessTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/AccessTokenInterface.php',
    'League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
    'League\\OAuth2\\Client\\Token\\SettableRefreshTokenInterface' => $vendorDir . '/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php',
    'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => $vendorDir . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
    'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => $vendorDir . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
    'League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => $vendorDir . '/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
    'League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => $vendorDir . '/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
    'League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => $vendorDir . '/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
    'League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => $vendorDir . '/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
    'League\\OAuth2\\Client\\Tool\\RequestFactory' => $vendorDir . '/league/oauth2-client/src/Tool/RequestFactory.php',
    'League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => $vendorDir . '/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
    'MabeEnum\\Enum' => $vendorDir . '/marc-mabe/php-enum/src/Enum.php',
    'MabeEnum\\EnumMap' => $vendorDir . '/marc-mabe/php-enum/src/EnumMap.php',
    'MabeEnum\\EnumSerializableTrait' => $vendorDir . '/marc-mabe/php-enum/src/EnumSerializableTrait.php',
    'MabeEnum\\EnumSet' => $vendorDir . '/marc-mabe/php-enum/src/EnumSet.php',
    'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
    'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php',
    'PhpOption\\LazyOption' => $vendorDir . '/phpoption/phpoption/src/PhpOption/LazyOption.php',
    'PhpOption\\None' => $vendorDir . '/phpoption/phpoption/src/PhpOption/None.php',
    'PhpOption\\Option' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Option.php',
    'PhpOption\\Some' => $vendorDir . '/phpoption/phpoption/src/PhpOption/Some.php',
    'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
    'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php',
    'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php',
    'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php',
    'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php',
    'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
    'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
    'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
    'Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php',
    'Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php',
    'Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php',
    'Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php',
    'Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php',
    'Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php',
    'Psr\\Http\\Client\\RequestExceptionInterface' => $vendorDir . '/psr/http-client/src/RequestExceptionInterface.php',
    'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
    'Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php',
    'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
    'Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php',
    'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
    'Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php',
    'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',
    'Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php',
    'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',
    'Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php',
    'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
    'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php',
    'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
    'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php',
    'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php',
    'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php',
    'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php',
    'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php',
    'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php',
    'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php',
    'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php',
    'Ramsey\\Collection\\AbstractArray' => $vendorDir . '/ramsey/collection/src/AbstractArray.php',
    'Ramsey\\Collection\\AbstractCollection' => $vendorDir . '/ramsey/collection/src/AbstractCollection.php',
    'Ramsey\\Collection\\AbstractSet' => $vendorDir . '/ramsey/collection/src/AbstractSet.php',
    'Ramsey\\Collection\\ArrayInterface' => $vendorDir . '/ramsey/collection/src/ArrayInterface.php',
    'Ramsey\\Collection\\Collection' => $vendorDir . '/ramsey/collection/src/Collection.php',
    'Ramsey\\Collection\\CollectionInterface' => $vendorDir . '/ramsey/collection/src/CollectionInterface.php',
    'Ramsey\\Collection\\DoubleEndedQueue' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueue.php',
    'Ramsey\\Collection\\DoubleEndedQueueInterface' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueueInterface.php',
    'Ramsey\\Collection\\Exception\\CollectionException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionException.php',
    'Ramsey\\Collection\\Exception\\CollectionMismatchException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionMismatchException.php',
    'Ramsey\\Collection\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidArgumentException.php',
    'Ramsey\\Collection\\Exception\\InvalidPropertyOrMethod' => $vendorDir . '/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php',
    'Ramsey\\Collection\\Exception\\NoSuchElementException' => $vendorDir . '/ramsey/collection/src/Exception/NoSuchElementException.php',
    'Ramsey\\Collection\\Exception\\OutOfBoundsException' => $vendorDir . '/ramsey/collection/src/Exception/OutOfBoundsException.php',
    'Ramsey\\Collection\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/collection/src/Exception/UnsupportedOperationException.php',
    'Ramsey\\Collection\\GenericArray' => $vendorDir . '/ramsey/collection/src/GenericArray.php',
    'Ramsey\\Collection\\Map\\AbstractMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractMap.php',
    'Ramsey\\Collection\\Map\\AbstractTypedMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractTypedMap.php',
    'Ramsey\\Collection\\Map\\AssociativeArrayMap' => $vendorDir . '/ramsey/collection/src/Map/AssociativeArrayMap.php',
    'Ramsey\\Collection\\Map\\MapInterface' => $vendorDir . '/ramsey/collection/src/Map/MapInterface.php',
    'Ramsey\\Collection\\Map\\NamedParameterMap' => $vendorDir . '/ramsey/collection/src/Map/NamedParameterMap.php',
    'Ramsey\\Collection\\Map\\TypedMap' => $vendorDir . '/ramsey/collection/src/Map/TypedMap.php',
    'Ramsey\\Collection\\Map\\TypedMapInterface' => $vendorDir . '/ramsey/collection/src/Map/TypedMapInterface.php',
    'Ramsey\\Collection\\Queue' => $vendorDir . '/ramsey/collection/src/Queue.php',
    'Ramsey\\Collection\\QueueInterface' => $vendorDir . '/ramsey/collection/src/QueueInterface.php',
    'Ramsey\\Collection\\Set' => $vendorDir . '/ramsey/collection/src/Set.php',
    'Ramsey\\Collection\\Sort' => $vendorDir . '/ramsey/collection/src/Sort.php',
    'Ramsey\\Collection\\Tool\\TypeTrait' => $vendorDir . '/ramsey/collection/src/Tool/TypeTrait.php',
    'Ramsey\\Collection\\Tool\\ValueExtractorTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueExtractorTrait.php',
    'Ramsey\\Collection\\Tool\\ValueToStringTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueToStringTrait.php',
    'Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php',
    'Ramsey\\Uuid\\Builder\\BuilderCollection' => $vendorDir . '/ramsey/uuid/src/Builder/BuilderCollection.php',
    'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
    'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
    'Ramsey\\Uuid\\Builder\\FallbackBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/FallbackBuilder.php',
    'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => $vendorDir . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
    'Ramsey\\Uuid\\Codec\\CodecInterface' => $vendorDir . '/ramsey/uuid/src/Codec/CodecInterface.php',
    'Ramsey\\Uuid\\Codec\\GuidStringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
    'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => $vendorDir . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
    'Ramsey\\Uuid\\Codec\\StringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/StringCodec.php',
    'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
    'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
    'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
    'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
    'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
    'Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php',
    'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
    'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
    'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
    'Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php',
    'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
    'Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php',
    'Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php',
    'Ramsey\\Uuid\\DeprecatedUuidInterface' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidInterface.php',
    'Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php',
    'Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => $vendorDir . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php',
    'Ramsey\\Uuid\\Exception\\DateTimeException' => $vendorDir . '/ramsey/uuid/src/Exception/DateTimeException.php',
    'Ramsey\\Uuid\\Exception\\DceSecurityException' => $vendorDir . '/ramsey/uuid/src/Exception/DceSecurityException.php',
    'Ramsey\\Uuid\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidArgumentException.php',
    'Ramsey\\Uuid\\Exception\\InvalidBytesException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidBytesException.php',
    'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
    'Ramsey\\Uuid\\Exception\\NameException' => $vendorDir . '/ramsey/uuid/src/Exception/NameException.php',
    'Ramsey\\Uuid\\Exception\\NodeException' => $vendorDir . '/ramsey/uuid/src/Exception/NodeException.php',
    'Ramsey\\Uuid\\Exception\\RandomSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/RandomSourceException.php',
    'Ramsey\\Uuid\\Exception\\TimeSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/TimeSourceException.php',
    'Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => $vendorDir . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php',
    'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
    'Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => $vendorDir . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php',
    'Ramsey\\Uuid\\FeatureSet' => $vendorDir . '/ramsey/uuid/src/FeatureSet.php',
    'Ramsey\\Uuid\\Fields\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Fields/FieldsInterface.php',
    'Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => $vendorDir . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php',
    'Ramsey\\Uuid\\Generator\\CombGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/CombGenerator.php',
    'Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php',
    'Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php',
    'Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php',
    'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
    'Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php',
    'Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php',
    'Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php',
    'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
    'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
    'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
    'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
    'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
    'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
    'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
    'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
    'Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php',
    'Ramsey\\Uuid\\Guid\\Fields' => $vendorDir . '/ramsey/uuid/src/Guid/Fields.php',
    'Ramsey\\Uuid\\Guid\\Guid' => $vendorDir . '/ramsey/uuid/src/Guid/Guid.php',
    'Ramsey\\Uuid\\Guid\\GuidBuilder' => $vendorDir . '/ramsey/uuid/src/Guid/GuidBuilder.php',
    'Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => $vendorDir . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php',
    'Ramsey\\Uuid\\Math\\BrickMathCalculator' => $vendorDir . '/ramsey/uuid/src/Math/BrickMathCalculator.php',
    'Ramsey\\Uuid\\Math\\CalculatorInterface' => $vendorDir . '/ramsey/uuid/src/Math/CalculatorInterface.php',
    'Ramsey\\Uuid\\Math\\RoundingMode' => $vendorDir . '/ramsey/uuid/src/Math/RoundingMode.php',
    'Ramsey\\Uuid\\Nonstandard\\Fields' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Fields.php',
    'Ramsey\\Uuid\\Nonstandard\\Uuid' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Uuid.php',
    'Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php',
    'Ramsey\\Uuid\\Nonstandard\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidV6.php',
    'Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php',
    'Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php',
    'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
    'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
    'Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => $vendorDir . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php',
    'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
    'Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php',
    'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
    'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
    'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
    'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
    'Ramsey\\Uuid\\Rfc4122\\Fields' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Fields.php',
    'Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php',
    'Ramsey\\Uuid\\Rfc4122\\MaxTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxTrait.php',
    'Ramsey\\Uuid\\Rfc4122\\MaxUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxUuid.php',
    'Ramsey\\Uuid\\Rfc4122\\NilTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilTrait.php',
    'Ramsey\\Uuid\\Rfc4122\\NilUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilUuid.php',
    'Ramsey\\Uuid\\Rfc4122\\TimeTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/TimeTrait.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidInterface.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV1' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV1.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV2' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV2.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV3' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV3.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV4' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV4.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV5' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV5.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV6.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV7' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV7.php',
    'Ramsey\\Uuid\\Rfc4122\\UuidV8' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV8.php',
    'Ramsey\\Uuid\\Rfc4122\\Validator' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Validator.php',
    'Ramsey\\Uuid\\Rfc4122\\VariantTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VariantTrait.php',
    'Ramsey\\Uuid\\Rfc4122\\VersionTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VersionTrait.php',
    'Ramsey\\Uuid\\Type\\Decimal' => $vendorDir . '/ramsey/uuid/src/Type/Decimal.php',
    'Ramsey\\Uuid\\Type\\Hexadecimal' => $vendorDir . '/ramsey/uuid/src/Type/Hexadecimal.php',
    'Ramsey\\Uuid\\Type\\Integer' => $vendorDir . '/ramsey/uuid/src/Type/Integer.php',
    'Ramsey\\Uuid\\Type\\NumberInterface' => $vendorDir . '/ramsey/uuid/src/Type/NumberInterface.php',
    'Ramsey\\Uuid\\Type\\Time' => $vendorDir . '/ramsey/uuid/src/Type/Time.php',
    'Ramsey\\Uuid\\Type\\TypeInterface' => $vendorDir . '/ramsey/uuid/src/Type/TypeInterface.php',
    'Ramsey\\Uuid\\Uuid' => $vendorDir . '/ramsey/uuid/src/Uuid.php',
    'Ramsey\\Uuid\\UuidFactory' => $vendorDir . '/ramsey/uuid/src/UuidFactory.php',
    'Ramsey\\Uuid\\UuidFactoryInterface' => $vendorDir . '/ramsey/uuid/src/UuidFactoryInterface.php',
    'Ramsey\\Uuid\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/UuidInterface.php',
    'Ramsey\\Uuid\\Validator\\GenericValidator' => $vendorDir . '/ramsey/uuid/src/Validator/GenericValidator.php',
    'Ramsey\\Uuid\\Validator\\ValidatorInterface' => $vendorDir . '/ramsey/uuid/src/Validator/ValidatorInterface.php',
    'Ratchet\\Client\\Connector' => $vendorDir . '/ratchet/pawl/src/Connector.php',
    'Ratchet\\Client\\WebSocket' => $vendorDir . '/ratchet/pawl/src/WebSocket.php',
    'Ratchet\\RFC6455\\Handshake\\ClientNegotiator' => $vendorDir . '/ratchet/rfc6455/src/Handshake/ClientNegotiator.php',
    'Ratchet\\RFC6455\\Handshake\\InvalidPermessageDeflateOptionsException' => $vendorDir . '/ratchet/rfc6455/src/Handshake/InvalidPermessageDeflateOptionsException.php',
    'Ratchet\\RFC6455\\Handshake\\NegotiatorInterface' => $vendorDir . '/ratchet/rfc6455/src/Handshake/NegotiatorInterface.php',
    'Ratchet\\RFC6455\\Handshake\\PermessageDeflateOptions' => $vendorDir . '/ratchet/rfc6455/src/Handshake/PermessageDeflateOptions.php',
    'Ratchet\\RFC6455\\Handshake\\RequestVerifier' => $vendorDir . '/ratchet/rfc6455/src/Handshake/RequestVerifier.php',
    'Ratchet\\RFC6455\\Handshake\\ResponseVerifier' => $vendorDir . '/ratchet/rfc6455/src/Handshake/ResponseVerifier.php',
    'Ratchet\\RFC6455\\Handshake\\ServerNegotiator' => $vendorDir . '/ratchet/rfc6455/src/Handshake/ServerNegotiator.php',
    'Ratchet\\RFC6455\\Messaging\\CloseFrameChecker' => $vendorDir . '/ratchet/rfc6455/src/Messaging/CloseFrameChecker.php',
    'Ratchet\\RFC6455\\Messaging\\DataInterface' => $vendorDir . '/ratchet/rfc6455/src/Messaging/DataInterface.php',
    'Ratchet\\RFC6455\\Messaging\\Frame' => $vendorDir . '/ratchet/rfc6455/src/Messaging/Frame.php',
    'Ratchet\\RFC6455\\Messaging\\FrameInterface' => $vendorDir . '/ratchet/rfc6455/src/Messaging/FrameInterface.php',
    'Ratchet\\RFC6455\\Messaging\\Message' => $vendorDir . '/ratchet/rfc6455/src/Messaging/Message.php',
    'Ratchet\\RFC6455\\Messaging\\MessageBuffer' => $vendorDir . '/ratchet/rfc6455/src/Messaging/MessageBuffer.php',
    'Ratchet\\RFC6455\\Messaging\\MessageInterface' => $vendorDir . '/ratchet/rfc6455/src/Messaging/MessageInterface.php',
    'React\\Cache\\ArrayCache' => $vendorDir . '/react/cache/src/ArrayCache.php',
    'React\\Cache\\CacheInterface' => $vendorDir . '/react/cache/src/CacheInterface.php',
    'React\\Dns\\BadServerException' => $vendorDir . '/react/dns/src/BadServerException.php',
    'React\\Dns\\Config\\Config' => $vendorDir . '/react/dns/src/Config/Config.php',
    'React\\Dns\\Config\\HostsFile' => $vendorDir . '/react/dns/src/Config/HostsFile.php',
    'React\\Dns\\Model\\Message' => $vendorDir . '/react/dns/src/Model/Message.php',
    'React\\Dns\\Model\\Record' => $vendorDir . '/react/dns/src/Model/Record.php',
    'React\\Dns\\Protocol\\BinaryDumper' => $vendorDir . '/react/dns/src/Protocol/BinaryDumper.php',
    'React\\Dns\\Protocol\\Parser' => $vendorDir . '/react/dns/src/Protocol/Parser.php',
    'React\\Dns\\Query\\CachingExecutor' => $vendorDir . '/react/dns/src/Query/CachingExecutor.php',
    'React\\Dns\\Query\\CancellationException' => $vendorDir . '/react/dns/src/Query/CancellationException.php',
    'React\\Dns\\Query\\CoopExecutor' => $vendorDir . '/react/dns/src/Query/CoopExecutor.php',
    'React\\Dns\\Query\\ExecutorInterface' => $vendorDir . '/react/dns/src/Query/ExecutorInterface.php',
    'React\\Dns\\Query\\FallbackExecutor' => $vendorDir . '/react/dns/src/Query/FallbackExecutor.php',
    'React\\Dns\\Query\\HostsFileExecutor' => $vendorDir . '/react/dns/src/Query/HostsFileExecutor.php',
    'React\\Dns\\Query\\Query' => $vendorDir . '/react/dns/src/Query/Query.php',
    'React\\Dns\\Query\\RetryExecutor' => $vendorDir . '/react/dns/src/Query/RetryExecutor.php',
    'React\\Dns\\Query\\SelectiveTransportExecutor' => $vendorDir . '/react/dns/src/Query/SelectiveTransportExecutor.php',
    'React\\Dns\\Query\\TcpTransportExecutor' => $vendorDir . '/react/dns/src/Query/TcpTransportExecutor.php',
    'React\\Dns\\Query\\TimeoutException' => $vendorDir . '/react/dns/src/Query/TimeoutException.php',
    'React\\Dns\\Query\\TimeoutExecutor' => $vendorDir . '/react/dns/src/Query/TimeoutExecutor.php',
    'React\\Dns\\Query\\UdpTransportExecutor' => $vendorDir . '/react/dns/src/Query/UdpTransportExecutor.php',
    'React\\Dns\\RecordNotFoundException' => $vendorDir . '/react/dns/src/RecordNotFoundException.php',
    'React\\Dns\\Resolver\\Factory' => $vendorDir . '/react/dns/src/Resolver/Factory.php',
    'React\\Dns\\Resolver\\Resolver' => $vendorDir . '/react/dns/src/Resolver/Resolver.php',
    'React\\Dns\\Resolver\\ResolverInterface' => $vendorDir . '/react/dns/src/Resolver/ResolverInterface.php',
    'React\\EventLoop\\ExtEvLoop' => $vendorDir . '/react/event-loop/src/ExtEvLoop.php',
    'React\\EventLoop\\ExtEventLoop' => $vendorDir . '/react/event-loop/src/ExtEventLoop.php',
    'React\\EventLoop\\ExtLibevLoop' => $vendorDir . '/react/event-loop/src/ExtLibevLoop.php',
    'React\\EventLoop\\ExtLibeventLoop' => $vendorDir . '/react/event-loop/src/ExtLibeventLoop.php',
    'React\\EventLoop\\ExtUvLoop' => $vendorDir . '/react/event-loop/src/ExtUvLoop.php',
    'React\\EventLoop\\Factory' => $vendorDir . '/react/event-loop/src/Factory.php',
    'React\\EventLoop\\Loop' => $vendorDir . '/react/event-loop/src/Loop.php',
    'React\\EventLoop\\LoopInterface' => $vendorDir . '/react/event-loop/src/LoopInterface.php',
    'React\\EventLoop\\SignalsHandler' => $vendorDir . '/react/event-loop/src/SignalsHandler.php',
    'React\\EventLoop\\StreamSelectLoop' => $vendorDir . '/react/event-loop/src/StreamSelectLoop.php',
    'React\\EventLoop\\Tick\\FutureTickQueue' => $vendorDir . '/react/event-loop/src/Tick/FutureTickQueue.php',
    'React\\EventLoop\\TimerInterface' => $vendorDir . '/react/event-loop/src/TimerInterface.php',
    'React\\EventLoop\\Timer\\Timer' => $vendorDir . '/react/event-loop/src/Timer/Timer.php',
    'React\\EventLoop\\Timer\\Timers' => $vendorDir . '/react/event-loop/src/Timer/Timers.php',
    'React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php',
    'React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php',
    'React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php',
    'React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php',
    'React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php',
    'React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php',
    'React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php',
    'React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php',
    'React\\Socket\\Connection' => $vendorDir . '/react/socket/src/Connection.php',
    'React\\Socket\\ConnectionInterface' => $vendorDir . '/react/socket/src/ConnectionInterface.php',
    'React\\Socket\\Connector' => $vendorDir . '/react/socket/src/Connector.php',
    'React\\Socket\\ConnectorInterface' => $vendorDir . '/react/socket/src/ConnectorInterface.php',
    'React\\Socket\\DnsConnector' => $vendorDir . '/react/socket/src/DnsConnector.php',
    'React\\Socket\\FdServer' => $vendorDir . '/react/socket/src/FdServer.php',
    'React\\Socket\\FixedUriConnector' => $vendorDir . '/react/socket/src/FixedUriConnector.php',
    'React\\Socket\\HappyEyeBallsConnectionBuilder' => $vendorDir . '/react/socket/src/HappyEyeBallsConnectionBuilder.php',
    'React\\Socket\\HappyEyeBallsConnector' => $vendorDir . '/react/socket/src/HappyEyeBallsConnector.php',
    'React\\Socket\\LimitingServer' => $vendorDir . '/react/socket/src/LimitingServer.php',
    'React\\Socket\\SecureConnector' => $vendorDir . '/react/socket/src/SecureConnector.php',
    'React\\Socket\\SecureServer' => $vendorDir . '/react/socket/src/SecureServer.php',
    'React\\Socket\\Server' => $vendorDir . '/react/socket/src/Server.php',
    'React\\Socket\\ServerInterface' => $vendorDir . '/react/socket/src/ServerInterface.php',
    'React\\Socket\\SocketServer' => $vendorDir . '/react/socket/src/SocketServer.php',
    'React\\Socket\\StreamEncryption' => $vendorDir . '/react/socket/src/StreamEncryption.php',
    'React\\Socket\\TcpConnector' => $vendorDir . '/react/socket/src/TcpConnector.php',
    'React\\Socket\\TcpServer' => $vendorDir . '/react/socket/src/TcpServer.php',
    'React\\Socket\\TimeoutConnector' => $vendorDir . '/react/socket/src/TimeoutConnector.php',
    'React\\Socket\\UnixConnector' => $vendorDir . '/react/socket/src/UnixConnector.php',
    'React\\Socket\\UnixServer' => $vendorDir . '/react/socket/src/UnixServer.php',
    'React\\Stream\\CompositeStream' => $vendorDir . '/react/stream/src/CompositeStream.php',
    'React\\Stream\\DuplexResourceStream' => $vendorDir . '/react/stream/src/DuplexResourceStream.php',
    'React\\Stream\\DuplexStreamInterface' => $vendorDir . '/react/stream/src/DuplexStreamInterface.php',
    'React\\Stream\\ReadableResourceStream' => $vendorDir . '/react/stream/src/ReadableResourceStream.php',
    'React\\Stream\\ReadableStreamInterface' => $vendorDir . '/react/stream/src/ReadableStreamInterface.php',
    'React\\Stream\\ThroughStream' => $vendorDir . '/react/stream/src/ThroughStream.php',
    'React\\Stream\\Util' => $vendorDir . '/react/stream/src/Util.php',
    'React\\Stream\\WritableResourceStream' => $vendorDir . '/react/stream/src/WritableResourceStream.php',
    'React\\Stream\\WritableStreamInterface' => $vendorDir . '/react/stream/src/WritableStreamInterface.php',
    'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php',
    'Safe\\DateTime' => $vendorDir . '/thecodingmachine/safe/lib/DateTime.php',
    'Safe\\DateTimeImmutable' => $vendorDir . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
    'Safe\\Exceptions\\ApacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
    'Safe\\Exceptions\\ApcuException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
    'Safe\\Exceptions\\ArrayException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
    'Safe\\Exceptions\\Bzip2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
    'Safe\\Exceptions\\CalendarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
    'Safe\\Exceptions\\ClassobjException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
    'Safe\\Exceptions\\ComException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
    'Safe\\Exceptions\\CubridException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
    'Safe\\Exceptions\\CurlException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
    'Safe\\Exceptions\\DatetimeException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
    'Safe\\Exceptions\\DirException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
    'Safe\\Exceptions\\EioException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
    'Safe\\Exceptions\\ErrorfuncException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
    'Safe\\Exceptions\\ExecException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
    'Safe\\Exceptions\\FileinfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
    'Safe\\Exceptions\\FilesystemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
    'Safe\\Exceptions\\FilterException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
    'Safe\\Exceptions\\FpmException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
    'Safe\\Exceptions\\FtpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
    'Safe\\Exceptions\\FunchandException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
    'Safe\\Exceptions\\GettextException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GettextException.php',
    'Safe\\Exceptions\\GmpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
    'Safe\\Exceptions\\GnupgException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
    'Safe\\Exceptions\\HashException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
    'Safe\\Exceptions\\IbaseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
    'Safe\\Exceptions\\IbmDb2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
    'Safe\\Exceptions\\IconvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
    'Safe\\Exceptions\\ImageException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
    'Safe\\Exceptions\\ImapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
    'Safe\\Exceptions\\InfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
    'Safe\\Exceptions\\InotifyException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
    'Safe\\Exceptions\\JsonException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
    'Safe\\Exceptions\\LdapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
    'Safe\\Exceptions\\LibxmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
    'Safe\\Exceptions\\LzfException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
    'Safe\\Exceptions\\MailparseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
    'Safe\\Exceptions\\MbstringException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
    'Safe\\Exceptions\\MiscException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
    'Safe\\Exceptions\\MysqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
    'Safe\\Exceptions\\MysqliException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqliException.php',
    'Safe\\Exceptions\\NetworkException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
    'Safe\\Exceptions\\Oci8Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
    'Safe\\Exceptions\\OpcacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
    'Safe\\Exceptions\\OpensslException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
    'Safe\\Exceptions\\OutcontrolException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
    'Safe\\Exceptions\\PcntlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
    'Safe\\Exceptions\\PcreException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
    'Safe\\Exceptions\\PgsqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
    'Safe\\Exceptions\\PosixException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
    'Safe\\Exceptions\\PsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
    'Safe\\Exceptions\\PspellException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
    'Safe\\Exceptions\\ReadlineException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
    'Safe\\Exceptions\\RnpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RnpException.php',
    'Safe\\Exceptions\\RpminfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
    'Safe\\Exceptions\\RrdException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
    'Safe\\Exceptions\\SafeExceptionInterface' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
    'Safe\\Exceptions\\SemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
    'Safe\\Exceptions\\SessionException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
    'Safe\\Exceptions\\ShmopException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
    'Safe\\Exceptions\\SimplexmlException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php',
    'Safe\\Exceptions\\SocketsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
    'Safe\\Exceptions\\SodiumException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
    'Safe\\Exceptions\\SolrException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
    'Safe\\Exceptions\\SplException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
    'Safe\\Exceptions\\SqlsrvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
    'Safe\\Exceptions\\SsdeepException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
    'Safe\\Exceptions\\Ssh2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
    'Safe\\Exceptions\\StreamException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
    'Safe\\Exceptions\\StringsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
    'Safe\\Exceptions\\SwooleException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
    'Safe\\Exceptions\\UodbcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
    'Safe\\Exceptions\\UopzException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
    'Safe\\Exceptions\\UrlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
    'Safe\\Exceptions\\VarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
    'Safe\\Exceptions\\XdiffException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
    'Safe\\Exceptions\\XmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
    'Safe\\Exceptions\\XmlrpcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
    'Safe\\Exceptions\\YamlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
    'Safe\\Exceptions\\YazException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
    'Safe\\Exceptions\\ZipException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
    'Safe\\Exceptions\\ZlibException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
    'SelfUpdate\\SelfUpdateCommand' => $vendorDir . '/consolidation/self-update/src/SelfUpdateCommand.php',
    'SelfUpdate\\SelfUpdateManager' => $vendorDir . '/consolidation/self-update/src/SelfUpdateManager.php',
    'Stringable' => $vendorDir . '/marc-mabe/php-enum/stubs/Stringable.php',
    'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php',
    'Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => $vendorDir . '/symfony/cache/Adapter/ParameterNormalizer.php',
    'Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => $vendorDir . '/symfony/cache/Adapter/Psr16Adapter.php',
    'Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisTagAwareAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php',
    'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php',
    'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php',
    'Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php',
    'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php',
    'Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => $vendorDir . '/symfony/cache/DependencyInjection/CacheCollectorPass.php',
    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php',
    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php',
    'Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php',
    'Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php',
    'Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php',
    'Symfony\\Component\\Cache\\LockRegistry' => $vendorDir . '/symfony/cache/LockRegistry.php',
    'Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DefaultMarshaller.php',
    'Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DeflateMarshaller.php',
    'Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => $vendorDir . '/symfony/cache/Marshaller/MarshallerInterface.php',
    'Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => $vendorDir . '/symfony/cache/Marshaller/SodiumMarshaller.php',
    'Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => $vendorDir . '/symfony/cache/Marshaller/TagAwareMarshaller.php',
    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php',
    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationHandler.php',
    'Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationMessage.php',
    'Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php',
    'Symfony\\Component\\Cache\\Psr16Cache' => $vendorDir . '/symfony/cache/Psr16Cache.php',
    'Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php',
    'Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => $vendorDir . '/symfony/cache/Traits/AbstractAdapterTrait.php',
    'Symfony\\Component\\Cache\\Traits\\CachedValueInterface' => $vendorDir . '/symfony/cache/Traits/CachedValueInterface.php',
    'Symfony\\Component\\Cache\\Traits\\ContractsTrait' => $vendorDir . '/symfony/cache/Traits/ContractsTrait.php',
    'Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php',
    'Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php',
    'Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Redis5Proxy' => $vendorDir . '/symfony/cache/Traits/Redis5Proxy.php',
    'Symfony\\Component\\Cache\\Traits\\Redis6Proxy' => $vendorDir . '/symfony/cache/Traits/Redis6Proxy.php',
    'Symfony\\Component\\Cache\\Traits\\Redis6ProxyTrait' => $vendorDir . '/symfony/cache/Traits/Redis6ProxyTrait.php',
    'Symfony\\Component\\Cache\\Traits\\RedisCluster5Proxy' => $vendorDir . '/symfony/cache/Traits/RedisCluster5Proxy.php',
    'Symfony\\Component\\Cache\\Traits\\RedisCluster6Proxy' => $vendorDir . '/symfony/cache/Traits/RedisCluster6Proxy.php',
    'Symfony\\Component\\Cache\\Traits\\RedisCluster6ProxyTrait' => $vendorDir . '/symfony/cache/Traits/RedisCluster6ProxyTrait.php',
    'Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterNodeProxy.php',
    'Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterProxy.php',
    'Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php',
    'Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php',
    'Symfony\\Component\\Cache\\Traits\\RelayProxy' => $vendorDir . '/symfony/cache/Traits/RelayProxy.php',
    'Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => $vendorDir . '/symfony/cache/Traits/RelayProxyTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\BgsaveTrait' => $vendorDir . '/symfony/cache/Traits/Relay/BgsaveTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => $vendorDir . '/symfony/cache/Traits/Relay/CopyTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\FtTrait' => $vendorDir . '/symfony/cache/Traits/Relay/FtTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GeosearchTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\GetWithMetaTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GetWithMetaTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GetrangeTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => $vendorDir . '/symfony/cache/Traits/Relay/HsetTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\IsTrackedTrait' => $vendorDir . '/symfony/cache/Traits/Relay/IsTrackedTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => $vendorDir . '/symfony/cache/Traits/Relay/MoveTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => $vendorDir . '/symfony/cache/Traits/Relay/NullableReturnTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => $vendorDir . '/symfony/cache/Traits/Relay/PfcountTrait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\Relay11Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay11Trait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\Relay121Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay121Trait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\Relay12Trait' => $vendorDir . '/symfony/cache/Traits/Relay/Relay12Trait.php',
    'Symfony\\Component\\Cache\\Traits\\Relay\\SwapdbTrait' => $vendorDir . '/symfony/cache/Traits/Relay/SwapdbTrait.php',
    'Symfony\\Component\\Config\\Builder\\ClassBuilder' => $vendorDir . '/symfony/config/Builder/ClassBuilder.php',
    'Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGenerator.php',
    'Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php',
    'Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderInterface.php',
    'Symfony\\Component\\Config\\Builder\\Method' => $vendorDir . '/symfony/config/Builder/Method.php',
    'Symfony\\Component\\Config\\Builder\\Property' => $vendorDir . '/symfony/config/Builder/Property.php',
    'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php',
    'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php',
    'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php',
    'Symfony\\Component\\Config\\ConfigCacheInterface' => $vendorDir . '/symfony/config/ConfigCacheInterface.php',
    'Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Definition/ArrayNode.php',
    'Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Definition/BaseNode.php',
    'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => $vendorDir . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/MergeBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NodeBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Definition/Builder/NodeParentInterface.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NormalizationBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NumericNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/TreeBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ValidationBuilder.php',
    'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/VariableNodeDefinition.php',
    'Symfony\\Component\\Config\\Definition\\ConfigurableInterface' => $vendorDir . '/symfony/config/Definition/ConfigurableInterface.php',
    'Symfony\\Component\\Config\\Definition\\Configuration' => $vendorDir . '/symfony/config/Definition/Configuration.php',
    'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Definition/ConfigurationInterface.php',
    'Symfony\\Component\\Config\\Definition\\Configurator\\DefinitionConfigurator' => $vendorDir . '/symfony/config/Definition/Configurator/DefinitionConfigurator.php',
    'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php',
    'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php',
    'Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Definition/EnumNode.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Definition/Exception/DuplicateKeyException.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Definition/Exception/Exception.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidConfigurationException.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidDefinitionException.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidTypeException.php',
    'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Definition/Exception/UnsetKeyException.php',
    'Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Definition/FloatNode.php',
    'Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Definition/IntegerNode.php',
    'Symfony\\Component\\Config\\Definition\\Loader\\DefinitionFileLoader' => $vendorDir . '/symfony/config/Definition/Loader/DefinitionFileLoader.php',
    'Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Definition/NodeInterface.php',
    'Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Definition/NumericNode.php',
    'Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Definition/Processor.php',
    'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Definition/PrototypeNodeInterface.php',
    'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php',
    'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php',
    'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php',
    'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
    'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => $vendorDir . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
    'Symfony\\Component\\Config\\Exception\\LoaderLoadException' => $vendorDir . '/symfony/config/Exception/LoaderLoadException.php',
    'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php',
    'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php',
    'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php',
    'Symfony\\Component\\Config\\Loader\\DirectoryAwareLoaderInterface' => $vendorDir . '/symfony/config/Loader/DirectoryAwareLoaderInterface.php',
    'Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Loader/FileLoader.php',
    'Symfony\\Component\\Config\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/config/Loader/GlobFileLoader.php',
    'Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Loader/Loader.php',
    'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php',
    'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php',
    'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php',
    'Symfony\\Component\\Config\\Loader\\ParamConfigurator' => $vendorDir . '/symfony/config/Loader/ParamConfigurator.php',
    'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php',
    'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
    'Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php',
    'Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => $vendorDir . '/symfony/config/Resource/ClassExistenceResource.php',
    'Symfony\\Component\\Config\\Resource\\ComposerResource' => $vendorDir . '/symfony/config/Resource/ComposerResource.php',
    'Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Resource/DirectoryResource.php',
    'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => $vendorDir . '/symfony/config/Resource/FileExistenceResource.php',
    'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php',
    'Symfony\\Component\\Config\\Resource\\GlobResource' => $vendorDir . '/symfony/config/Resource/GlobResource.php',
    'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php',
    'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php',
    'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php',
    'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php',
    'Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => $vendorDir . '/symfony/config/Util/Exception/InvalidXmlException.php',
    'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => $vendorDir . '/symfony/config/Util/Exception/XmlParsingException.php',
    'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php',
    'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
    'Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php',
    'Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php',
    'Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php',
    'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
    'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
    'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
    'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
    'Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php',
    'Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php',
    'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
    'Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php',
    'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
    'Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',
    'Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php',
    'Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php',
    'Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php',
    'Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php',
    'Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php',
    'Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php',
    'Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php',
    'Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php',
    'Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php',
    'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
    'Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php',
    'Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php',
    'Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php',
    'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
    'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
    'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
    'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',
    'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',
    'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',
    'Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php',
    'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',
    'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',
    'Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php',
    'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
    'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',
    'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
    'Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php',
    'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
    'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
    'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
    'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
    'Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php',
    'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php',
    'Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php',
    'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
    'Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php',
    'Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php',
    'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
    'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
    'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
    'Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php',
    'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
    'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
    'Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php',
    'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
    'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
    'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
    'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',
    'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',
    'Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php',
    'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',
    'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',
    'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',
    'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',
    'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
    'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
    'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
    'Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php',
    'Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php',
    'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
    'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
    'Symfony\\Component\\Console\\Helper\\TerminalInputHelper' => $vendorDir . '/symfony/console/Helper/TerminalInputHelper.php',
    'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
    'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',
    'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php',
    'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',
    'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',
    'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',
    'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',
    'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',
    'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php',
    'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',
    'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',
    'Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php',
    'Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php',
    'Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php',
    'Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php',
    'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
    'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
    'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
    'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php',
    'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
    'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
    'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
    'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
    'Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php',
    'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
    'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
    'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
    'Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php',
    'Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php',
    'Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php',
    'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
    'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
    'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
    'Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',
    'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
    'Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php',
    'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
    'Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php',
    'Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php',
    'Symfony\\Component\\DependencyInjection\\Alias' => $vendorDir . '/symfony/dependency-injection/Alias.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => $vendorDir . '/symfony/dependency-injection/Argument/AbstractArgument.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => $vendorDir . '/symfony/dependency-injection/Argument/ArgumentInterface.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => $vendorDir . '/symfony/dependency-injection/Argument/BoundArgument.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/IteratorArgument.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\LazyClosure' => $vendorDir . '/symfony/dependency-injection/Argument/LazyClosure.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => $vendorDir . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $vendorDir . '/symfony/dependency-injection/Argument/RewindableGenerator.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocator.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php',
    'Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AsAlias' => $vendorDir . '/symfony/dependency-injection/Attribute/AsAlias.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AsDecorator' => $vendorDir . '/symfony/dependency-injection/Attribute/AsDecorator.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => $vendorDir . '/symfony/dependency-injection/Attribute/AsTaggedItem.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => $vendorDir . '/symfony/dependency-injection/Attribute/Autoconfigure.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => $vendorDir . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\Autowire' => $vendorDir . '/symfony/dependency-injection/Attribute/Autowire.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireCallable' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireCallable.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireDecorated.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireIterator.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireLocator.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\AutowireServiceClosure' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireServiceClosure.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\Exclude' => $vendorDir . '/symfony/dependency-injection/Attribute/Exclude.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => $vendorDir . '/symfony/dependency-injection/Attribute/MapDecorated.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedIterator.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedLocator.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\Target' => $vendorDir . '/symfony/dependency-injection/Attribute/Target.php',
    'Symfony\\Component\\DependencyInjection\\Attribute\\When' => $vendorDir . '/symfony/dependency-injection/Attribute/When.php',
    'Symfony\\Component\\DependencyInjection\\ChildDefinition' => $vendorDir . '/symfony/dependency-injection/ChildDefinition.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireAsDecoratorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowirePass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => $vendorDir . '/symfony/dependency-injection/Compiler/Compiler.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Compiler/PassConfig.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => $vendorDir . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveBuildParametersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveClassPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveServiceSubscribersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ResolveTaggedIteratorArgumentPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceLocatorTagPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php',
    'Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php',
    'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResource.php',
    'Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php',
    'Symfony\\Component\\DependencyInjection\\Container' => $vendorDir . '/symfony/dependency-injection/Container.php',
    'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $vendorDir . '/symfony/dependency-injection/ContainerAwareInterface.php',
    'Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => $vendorDir . '/symfony/dependency-injection/ContainerAwareTrait.php',
    'Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $vendorDir . '/symfony/dependency-injection/ContainerBuilder.php',
    'Symfony\\Component\\DependencyInjection\\ContainerInterface' => $vendorDir . '/symfony/dependency-injection/ContainerInterface.php',
    'Symfony\\Component\\DependencyInjection\\Definition' => $vendorDir . '/symfony/dependency-injection/Definition.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => $vendorDir . '/symfony/dependency-injection/Dumper/Dumper.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Dumper/DumperInterface.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/GraphvizDumper.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/PhpDumper.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => $vendorDir . '/symfony/dependency-injection/Dumper/Preloader.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/XmlDumper.php',
    'Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/YamlDumper.php',
    'Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarLoaderInterface.php',
    'Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessor.php',
    'Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessorInterface.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => $vendorDir . '/symfony/dependency-injection/Exception/AutowiringFailedException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/dependency-injection/Exception/BadMethodCallException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/EnvNotFoundException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => $vendorDir . '/symfony/dependency-injection/Exception/EnvParameterException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dependency-injection/Exception/ExceptionInterface.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $vendorDir . '/symfony/dependency-injection/Exception/LogicException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/dependency-injection/Exception/OutOfBoundsException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterNotFoundException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $vendorDir . '/symfony/dependency-injection/Exception/RuntimeException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php',
    'Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceNotFoundException.php',
    'Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguage.php',
    'Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguageProvider.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\AbstractExtension' => $vendorDir . '/symfony/dependency-injection/Extension/AbstractExtension.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurableExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\Extension' => $vendorDir . '/symfony/dependency-injection/Extension/Extension.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ExtensionInterface.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\ExtensionTrait' => $vendorDir . '/symfony/dependency-injection/Extension/ExtensionTrait.php',
    'Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/PrependExtensionInterface.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\LazyServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\LazyServiceDumper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php',
    'Symfony\\Component\\DependencyInjection\\LazyProxy\\ProxyHelper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/ProxyHelper.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => $vendorDir . '/symfony/dependency-injection/Loader/ClosureLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\FromCallableConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\PrototypeConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ReferenceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServicesConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AbstractTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ArgumentTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutoconfigureTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutowireTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\BindTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\CallTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ClassTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConfiguratorTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConstructorTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DecorateTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DeprecateTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FactoryTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FileTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FromCallableTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\LazyTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ParentTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PropertyTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PublicTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ShareTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\SyntheticTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\TagTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/dependency-injection/Loader/DirectoryLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/FileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/GlobFileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/IniFileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/PhpFileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/XmlFileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/YamlFileLoader.php',
    'Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Parameter.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBag.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBag.php',
    'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
    'Symfony\\Component\\DependencyInjection\\Reference' => $vendorDir . '/symfony/dependency-injection/Reference.php',
    'Symfony\\Component\\DependencyInjection\\ReverseContainer' => $vendorDir . '/symfony/dependency-injection/ReverseContainer.php',
    'Symfony\\Component\\DependencyInjection\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/ServiceLocator.php',
    'Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $vendorDir . '/symfony/dependency-injection/TaggedContainerInterface.php',
    'Symfony\\Component\\DependencyInjection\\TypedReference' => $vendorDir . '/symfony/dependency-injection/TypedReference.php',
    'Symfony\\Component\\DependencyInjection\\Variable' => $vendorDir . '/symfony/dependency-injection/Variable.php',
    'Symfony\\Component\\Dotenv\\Command\\DebugCommand' => $vendorDir . '/symfony/dotenv/Command/DebugCommand.php',
    'Symfony\\Component\\Dotenv\\Command\\DotenvDumpCommand' => $vendorDir . '/symfony/dotenv/Command/DotenvDumpCommand.php',
    'Symfony\\Component\\Dotenv\\Dotenv' => $vendorDir . '/symfony/dotenv/Dotenv.php',
    'Symfony\\Component\\Dotenv\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dotenv/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Dotenv\\Exception\\FormatException' => $vendorDir . '/symfony/dotenv/Exception/FormatException.php',
    'Symfony\\Component\\Dotenv\\Exception\\FormatExceptionContext' => $vendorDir . '/symfony/dotenv/Exception/FormatExceptionContext.php',
    'Symfony\\Component\\Dotenv\\Exception\\PathException' => $vendorDir . '/symfony/dotenv/Exception/PathException.php',
    'Symfony\\Component\\ErrorHandler\\BufferingLogger' => $vendorDir . '/symfony/error-handler/BufferingLogger.php',
    'Symfony\\Component\\ErrorHandler\\Command\\ErrorDumpCommand' => $vendorDir . '/symfony/error-handler/Command/ErrorDumpCommand.php',
    'Symfony\\Component\\ErrorHandler\\Debug' => $vendorDir . '/symfony/error-handler/Debug.php',
    'Symfony\\Component\\ErrorHandler\\DebugClassLoader' => $vendorDir . '/symfony/error-handler/DebugClassLoader.php',
    'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php',
    'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php',
    'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php',
    'Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php',
    'Symfony\\Component\\ErrorHandler\\ErrorHandler' => $vendorDir . '/symfony/error-handler/ErrorHandler.php',
    'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php',
    'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => $vendorDir . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php',
    'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter' => $vendorDir . '/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php',
    'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php',
    'Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php',
    'Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => $vendorDir . '/symfony/error-handler/Error/ClassNotFoundError.php',
    'Symfony\\Component\\ErrorHandler\\Error\\FatalError' => $vendorDir . '/symfony/error-handler/Error/FatalError.php',
    'Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => $vendorDir . '/symfony/error-handler/Error/OutOfMemoryError.php',
    'Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => $vendorDir . '/symfony/error-handler/Error/UndefinedFunctionError.php',
    'Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => $vendorDir . '/symfony/error-handler/Error/UndefinedMethodError.php',
    'Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => $vendorDir . '/symfony/error-handler/Exception/FlattenException.php',
    'Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/error-handler/Exception/SilencedErrorContext.php',
    'Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => $vendorDir . '/symfony/error-handler/Internal/TentativeTypes.php',
    'Symfony\\Component\\ErrorHandler\\ThrowableUtils' => $vendorDir . '/symfony/error-handler/ThrowableUtils.php',
    'Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => $vendorDir . '/symfony/event-dispatcher/Attribute/AsEventListener.php',
    'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php',
    'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php',
    'Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php',
    'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php',
    'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php',
    'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php',
    'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php',
    'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php',
    'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php',
    'Symfony\\Component\\ExpressionLanguage\\Compiler' => $vendorDir . '/symfony/expression-language/Compiler.php',
    'Symfony\\Component\\ExpressionLanguage\\Expression' => $vendorDir . '/symfony/expression-language/Expression.php',
    'Symfony\\Component\\ExpressionLanguage\\ExpressionFunction' => $vendorDir . '/symfony/expression-language/ExpressionFunction.php',
    'Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface' => $vendorDir . '/symfony/expression-language/ExpressionFunctionProviderInterface.php',
    'Symfony\\Component\\ExpressionLanguage\\ExpressionLanguage' => $vendorDir . '/symfony/expression-language/ExpressionLanguage.php',
    'Symfony\\Component\\ExpressionLanguage\\Lexer' => $vendorDir . '/symfony/expression-language/Lexer.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\ArgumentsNode' => $vendorDir . '/symfony/expression-language/Node/ArgumentsNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\ArrayNode' => $vendorDir . '/symfony/expression-language/Node/ArrayNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\BinaryNode' => $vendorDir . '/symfony/expression-language/Node/BinaryNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\ConditionalNode' => $vendorDir . '/symfony/expression-language/Node/ConditionalNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\ConstantNode' => $vendorDir . '/symfony/expression-language/Node/ConstantNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\FunctionNode' => $vendorDir . '/symfony/expression-language/Node/FunctionNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\GetAttrNode' => $vendorDir . '/symfony/expression-language/Node/GetAttrNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\NameNode' => $vendorDir . '/symfony/expression-language/Node/NameNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\Node' => $vendorDir . '/symfony/expression-language/Node/Node.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\NullCoalesceNode' => $vendorDir . '/symfony/expression-language/Node/NullCoalesceNode.php',
    'Symfony\\Component\\ExpressionLanguage\\Node\\UnaryNode' => $vendorDir . '/symfony/expression-language/Node/UnaryNode.php',
    'Symfony\\Component\\ExpressionLanguage\\ParsedExpression' => $vendorDir . '/symfony/expression-language/ParsedExpression.php',
    'Symfony\\Component\\ExpressionLanguage\\Parser' => $vendorDir . '/symfony/expression-language/Parser.php',
    'Symfony\\Component\\ExpressionLanguage\\SerializedParsedExpression' => $vendorDir . '/symfony/expression-language/SerializedParsedExpression.php',
    'Symfony\\Component\\ExpressionLanguage\\SyntaxError' => $vendorDir . '/symfony/expression-language/SyntaxError.php',
    'Symfony\\Component\\ExpressionLanguage\\Token' => $vendorDir . '/symfony/expression-language/Token.php',
    'Symfony\\Component\\ExpressionLanguage\\TokenStream' => $vendorDir . '/symfony/expression-language/TokenStream.php',
    'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php',
    'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php',
    'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php',
    'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php',
    'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php',
    'Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php',
    'Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php',
    'Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php',
    'Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php',
    'Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php',
    'Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php',
    'Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php',
    'Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php',
    'Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php',
    'Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php',
    'Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php',
    'Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php',
    'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php',
    'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php',
    'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php',
    'Symfony\\Component\\HttpFoundation\\ChainRequestMatcher' => $vendorDir . '/symfony/http-foundation/ChainRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php',
    'Symfony\\Component\\HttpFoundation\\EventStreamResponse' => $vendorDir . '/symfony/http-foundation/EventStreamResponse.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => $vendorDir . '/symfony/http-foundation/Exception/BadRequestException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/ExceptionInterface.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\ExpiredSignedUriException' => $vendorDir . '/symfony/http-foundation/Exception/ExpiredSignedUriException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => $vendorDir . '/symfony/http-foundation/Exception/JsonException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\LogicException' => $vendorDir . '/symfony/http-foundation/Exception/LogicException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => $vendorDir . '/symfony/http-foundation/Exception/SessionNotFoundException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\SignedUriException' => $vendorDir . '/symfony/http-foundation/Exception/SignedUriException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => $vendorDir . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException' => $vendorDir . '/symfony/http-foundation/Exception/UnexpectedValueException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\UnsignedUriException' => $vendorDir . '/symfony/http-foundation/Exception/UnsignedUriException.php',
    'Symfony\\Component\\HttpFoundation\\Exception\\UnverifiedSignedUriException' => $vendorDir . '/symfony/http-foundation/Exception/UnverifiedSignedUriException.php',
    'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/PartialFileException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
    'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php',
    'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php',
    'Symfony\\Component\\HttpFoundation\\File\\Stream' => $vendorDir . '/symfony/http-foundation/File/Stream.php',
    'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php',
    'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php',
    'Symfony\\Component\\HttpFoundation\\HeaderUtils' => $vendorDir . '/symfony/http-foundation/HeaderUtils.php',
    'Symfony\\Component\\HttpFoundation\\InputBag' => $vendorDir . '/symfony/http-foundation/InputBag.php',
    'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php',
    'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php',
    'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php',
    'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => $vendorDir . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
    'Symfony\\Component\\HttpFoundation\\RateLimiter\\PeekableRequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php',
    'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
    'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php',
    'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/RequestMatcherInterface.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\AttributesRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\HeaderRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\HostRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\IpsRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\IsJsonRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\MethodRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\PathRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\PortRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\QueryParameterRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestMatcher\\SchemeRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php',
    'Symfony\\Component\\HttpFoundation\\RequestStack' => $vendorDir . '/symfony/http-foundation/RequestStack.php',
    'Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Response.php',
    'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/ResponseHeaderBag.php',
    'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php',
    'Symfony\\Component\\HttpFoundation\\ServerEvent' => $vendorDir . '/symfony/http-foundation/ServerEvent.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBag.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\FlashBagAwareSessionInterface' => $vendorDir . '/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBag.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => $vendorDir . '/symfony/http-foundation/Session/SessionFactory.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionFactoryInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php',
    'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
    'Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => $vendorDir . '/symfony/http-foundation/StreamedJsonResponse.php',
    'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php',
    'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php',
    'Symfony\\Component\\HttpFoundation\\UriSigner' => $vendorDir . '/symfony/http-foundation/UriSigner.php',
    'Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => $vendorDir . '/symfony/http-kernel/Attribute/AsController.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\AsTargetedValueResolver' => $vendorDir . '/symfony/http-kernel/Attribute/AsTargetedValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\Cache' => $vendorDir . '/symfony/http-kernel/Attribute/Cache.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\MapDateTime' => $vendorDir . '/symfony/http-kernel/Attribute/MapDateTime.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\MapQueryParameter' => $vendorDir . '/symfony/http-kernel/Attribute/MapQueryParameter.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\MapQueryString' => $vendorDir . '/symfony/http-kernel/Attribute/MapQueryString.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\MapRequestPayload' => $vendorDir . '/symfony/http-kernel/Attribute/MapRequestPayload.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\ValueResolver' => $vendorDir . '/symfony/http-kernel/Attribute/ValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\WithHttpStatus' => $vendorDir . '/symfony/http-kernel/Attribute/WithHttpStatus.php',
    'Symfony\\Component\\HttpKernel\\Attribute\\WithLogLevel' => $vendorDir . '/symfony/http-kernel/Attribute/WithLogLevel.php',
    'Symfony\\Component\\HttpKernel\\Bundle\\AbstractBundle' => $vendorDir . '/symfony/http-kernel/Bundle/AbstractBundle.php',
    'Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Bundle/Bundle.php',
    'Symfony\\Component\\HttpKernel\\Bundle\\BundleExtension' => $vendorDir . '/symfony/http-kernel/Bundle/BundleExtension.php',
    'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Bundle/BundleInterface.php',
    'Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php',
    'Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php',
    'Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php',
    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php',
    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php',
    'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php',
    'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php',
    'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Config/FileLocator.php',
    'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php',
    'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php',
    'Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ContainerControllerResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Controller/ControllerReference.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolverInterface.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => $vendorDir . '/symfony/http-kernel/Controller/ErrorController.php',
    'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableControllerResolver.php',
    'Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ValueResolverInterface.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DumpDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/EventDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RequestDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RouterDataCollector.php',
    'Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/TimeDataCollector.php',
    'Symfony\\Component\\HttpKernel\\Debug\\ErrorHandlerConfigurator' => $vendorDir . '/symfony/http-kernel/Debug/ErrorHandlerConfigurator.php',
    'Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => $vendorDir . '/symfony/http-kernel/Debug/FileLinkFormatter.php',
    'Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php',
    'Symfony\\Component\\HttpKernel\\Debug\\VirtualRequestStack' => $vendorDir . '/symfony/http-kernel/Debug/VirtualRequestStack.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/Extension.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LoggerPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php',
    'Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/AbstractSessionListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => $vendorDir . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener' => $vendorDir . '/symfony/http-kernel/EventListener/CacheAttributeListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => $vendorDir . '/symfony/http-kernel/EventListener/DebugHandlersListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => $vendorDir . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => $vendorDir . '/symfony/http-kernel/EventListener/DumpListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => $vendorDir . '/symfony/http-kernel/EventListener/ErrorListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/EventListener/FragmentListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleAwareListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ProfilerListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/ResponseListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/EventListener/RouterListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SessionListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/StreamedResponseListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => $vendorDir . '/symfony/http-kernel/EventListener/SurrogateListener.php',
    'Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => $vendorDir . '/symfony/http-kernel/EventListener/ValidateRequestListener.php',
    'Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/ExceptionEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => $vendorDir . '/symfony/http-kernel/Event/FinishRequestEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Event/KernelEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => $vendorDir . '/symfony/http-kernel/Event/RequestEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/ResponseEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => $vendorDir . '/symfony/http-kernel/Event/TerminateEvent.php',
    'Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => $vendorDir . '/symfony/http-kernel/Event/ViewEvent.php',
    'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => $vendorDir . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php',
    'Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => $vendorDir . '/symfony/http-kernel/Exception/InvalidMetadataException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\LockedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LockedHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotFoundHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\ResolverNotFoundException' => $vendorDir . '/symfony/http-kernel/Exception/ResolverNotFoundException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => $vendorDir . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php',
    'Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentHandler.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => $vendorDir . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\CacheWasLockedException' => $vendorDir . '/symfony/http-kernel/HttpCache/CacheWasLockedException.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => $vendorDir . '/symfony/http-kernel/HttpCache/Esi.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => $vendorDir . '/symfony/http-kernel/HttpCache/HttpCache.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => $vendorDir . '/symfony/http-kernel/HttpCache/Ssi.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\Store' => $vendorDir . '/symfony/http-kernel/HttpCache/Store.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/StoreInterface.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => $vendorDir . '/symfony/http-kernel/HttpCache/SubRequestHandler.php',
    'Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/SurrogateInterface.php',
    'Symfony\\Component\\HttpKernel\\HttpClientKernel' => $vendorDir . '/symfony/http-kernel/HttpClientKernel.php',
    'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php',
    'Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => $vendorDir . '/symfony/http-kernel/HttpKernelBrowser.php',
    'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php',
    'Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Kernel.php',
    'Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/KernelEvents.php',
    'Symfony\\Component\\HttpKernel\\KernelInterface' => $vendorDir . '/symfony/http-kernel/KernelInterface.php',
    'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerConfigurator' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerConfigurator.php',
    'Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerInterface.php',
    'Symfony\\Component\\HttpKernel\\Log\\Logger' => $vendorDir . '/symfony/http-kernel/Log/Logger.php',
    'Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/FileProfilerStorage.php',
    'Symfony\\Component\\HttpKernel\\Profiler\\Profile' => $vendorDir . '/symfony/http-kernel/Profiler/Profile.php',
    'Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => $vendorDir . '/symfony/http-kernel/Profiler/Profiler.php',
    'Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => $vendorDir . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php',
    'Symfony\\Component\\HttpKernel\\RebootableInterface' => $vendorDir . '/symfony/http-kernel/RebootableInterface.php',
    'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php',
    'Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/UriSigner.php',
    'Symfony\\Component\\OptionsResolver\\Debug\\OptionsResolverIntrospector' => $vendorDir . '/symfony/options-resolver/Debug/OptionsResolverIntrospector.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\AccessException' => $vendorDir . '/symfony/options-resolver/Exception/AccessException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/options-resolver/Exception/ExceptionInterface.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/options-resolver/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\InvalidOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/InvalidOptionsException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\MissingOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/MissingOptionsException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\NoConfigurationException' => $vendorDir . '/symfony/options-resolver/Exception/NoConfigurationException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\NoSuchOptionException' => $vendorDir . '/symfony/options-resolver/Exception/NoSuchOptionException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\OptionDefinitionException' => $vendorDir . '/symfony/options-resolver/Exception/OptionDefinitionException.php',
    'Symfony\\Component\\OptionsResolver\\Exception\\UndefinedOptionsException' => $vendorDir . '/symfony/options-resolver/Exception/UndefinedOptionsException.php',
    'Symfony\\Component\\OptionsResolver\\OptionConfigurator' => $vendorDir . '/symfony/options-resolver/OptionConfigurator.php',
    'Symfony\\Component\\OptionsResolver\\Options' => $vendorDir . '/symfony/options-resolver/Options.php',
    'Symfony\\Component\\OptionsResolver\\OptionsResolver' => $vendorDir . '/symfony/options-resolver/OptionsResolver.php',
    'Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php',
    'Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php',
    'Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php',
    'Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php',
    'Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php',
    'Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php',
    'Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php',
    'Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php',
    'Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php',
    'Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php',
    'Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php',
    'Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php',
    'Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php',
    'Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php',
    'Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php',
    'Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php',
    'Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php',
    'Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php',
    'Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php',
    'Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php',
    'Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php',
    'Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php',
    'Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php',
    'Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php',
    'Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php',
    'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php',
    'Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php',
    'Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php',
    'Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php',
    'Symfony\\Component\\String\\Inflector\\SpanishInflector' => $vendorDir . '/symfony/string/Inflector/SpanishInflector.php',
    'Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php',
    'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php',
    'Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php',
    'Symfony\\Component\\String\\TruncateMode' => $vendorDir . '/symfony/string/TruncateMode.php',
    'Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php',
    'Symfony\\Component\\Validator\\Attribute\\HasNamedArguments' => $vendorDir . '/symfony/validator/Attribute/HasNamedArguments.php',
    'Symfony\\Component\\Validator\\Command\\DebugCommand' => $vendorDir . '/symfony/validator/Command/DebugCommand.php',
    'Symfony\\Component\\Validator\\Constraint' => $vendorDir . '/symfony/validator/Constraint.php',
    'Symfony\\Component\\Validator\\ConstraintValidator' => $vendorDir . '/symfony/validator/ConstraintValidator.php',
    'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => $vendorDir . '/symfony/validator/ConstraintValidatorFactory.php',
    'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorFactoryInterface.php',
    'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorInterface.php',
    'Symfony\\Component\\Validator\\ConstraintViolation' => $vendorDir . '/symfony/validator/ConstraintViolation.php',
    'Symfony\\Component\\Validator\\ConstraintViolationInterface' => $vendorDir . '/symfony/validator/ConstraintViolationInterface.php',
    'Symfony\\Component\\Validator\\ConstraintViolationList' => $vendorDir . '/symfony/validator/ConstraintViolationList.php',
    'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => $vendorDir . '/symfony/validator/ConstraintViolationListInterface.php',
    'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => $vendorDir . '/symfony/validator/Constraints/AbstractComparison.php',
    'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => $vendorDir . '/symfony/validator/Constraints/AbstractComparisonValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\All' => $vendorDir . '/symfony/validator/Constraints/All.php',
    'Symfony\\Component\\Validator\\Constraints\\AllValidator' => $vendorDir . '/symfony/validator/Constraints/AllValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\AtLeastOneOf' => $vendorDir . '/symfony/validator/Constraints/AtLeastOneOf.php',
    'Symfony\\Component\\Validator\\Constraints\\AtLeastOneOfValidator' => $vendorDir . '/symfony/validator/Constraints/AtLeastOneOfValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Bic' => $vendorDir . '/symfony/validator/Constraints/Bic.php',
    'Symfony\\Component\\Validator\\Constraints\\BicValidator' => $vendorDir . '/symfony/validator/Constraints/BicValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Blank' => $vendorDir . '/symfony/validator/Constraints/Blank.php',
    'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => $vendorDir . '/symfony/validator/Constraints/BlankValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Callback' => $vendorDir . '/symfony/validator/Constraints/Callback.php',
    'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => $vendorDir . '/symfony/validator/Constraints/CallbackValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\CardScheme' => $vendorDir . '/symfony/validator/Constraints/CardScheme.php',
    'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => $vendorDir . '/symfony/validator/Constraints/CardSchemeValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Cascade' => $vendorDir . '/symfony/validator/Constraints/Cascade.php',
    'Symfony\\Component\\Validator\\Constraints\\Choice' => $vendorDir . '/symfony/validator/Constraints/Choice.php',
    'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => $vendorDir . '/symfony/validator/Constraints/ChoiceValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Cidr' => $vendorDir . '/symfony/validator/Constraints/Cidr.php',
    'Symfony\\Component\\Validator\\Constraints\\CidrValidator' => $vendorDir . '/symfony/validator/Constraints/CidrValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Collection' => $vendorDir . '/symfony/validator/Constraints/Collection.php',
    'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => $vendorDir . '/symfony/validator/Constraints/CollectionValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Composite' => $vendorDir . '/symfony/validator/Constraints/Composite.php',
    'Symfony\\Component\\Validator\\Constraints\\Compound' => $vendorDir . '/symfony/validator/Constraints/Compound.php',
    'Symfony\\Component\\Validator\\Constraints\\CompoundValidator' => $vendorDir . '/symfony/validator/Constraints/CompoundValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Count' => $vendorDir . '/symfony/validator/Constraints/Count.php',
    'Symfony\\Component\\Validator\\Constraints\\CountValidator' => $vendorDir . '/symfony/validator/Constraints/CountValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Country' => $vendorDir . '/symfony/validator/Constraints/Country.php',
    'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => $vendorDir . '/symfony/validator/Constraints/CountryValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\CssColor' => $vendorDir . '/symfony/validator/Constraints/CssColor.php',
    'Symfony\\Component\\Validator\\Constraints\\CssColorValidator' => $vendorDir . '/symfony/validator/Constraints/CssColorValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Currency' => $vendorDir . '/symfony/validator/Constraints/Currency.php',
    'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => $vendorDir . '/symfony/validator/Constraints/CurrencyValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Date' => $vendorDir . '/symfony/validator/Constraints/Date.php',
    'Symfony\\Component\\Validator\\Constraints\\DateTime' => $vendorDir . '/symfony/validator/Constraints/DateTime.php',
    'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => $vendorDir . '/symfony/validator/Constraints/DateTimeValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\DateValidator' => $vendorDir . '/symfony/validator/Constraints/DateValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping' => $vendorDir . '/symfony/validator/Constraints/DisableAutoMapping.php',
    'Symfony\\Component\\Validator\\Constraints\\DivisibleBy' => $vendorDir . '/symfony/validator/Constraints/DivisibleBy.php',
    'Symfony\\Component\\Validator\\Constraints\\DivisibleByValidator' => $vendorDir . '/symfony/validator/Constraints/DivisibleByValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Email' => $vendorDir . '/symfony/validator/Constraints/Email.php',
    'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => $vendorDir . '/symfony/validator/Constraints/EmailValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping' => $vendorDir . '/symfony/validator/Constraints/EnableAutoMapping.php',
    'Symfony\\Component\\Validator\\Constraints\\EqualTo' => $vendorDir . '/symfony/validator/Constraints/EqualTo.php',
    'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => $vendorDir . '/symfony/validator/Constraints/EqualToValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Existence' => $vendorDir . '/symfony/validator/Constraints/Existence.php',
    'Symfony\\Component\\Validator\\Constraints\\Expression' => $vendorDir . '/symfony/validator/Constraints/Expression.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageProvider' => $vendorDir . '/symfony/validator/Constraints/ExpressionLanguageProvider.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntax' => $vendorDir . '/symfony/validator/Constraints/ExpressionLanguageSyntax.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionLanguageSyntaxValidator' => $vendorDir . '/symfony/validator/Constraints/ExpressionLanguageSyntaxValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntax' => $vendorDir . '/symfony/validator/Constraints/ExpressionSyntax.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionSyntaxValidator' => $vendorDir . '/symfony/validator/Constraints/ExpressionSyntaxValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => $vendorDir . '/symfony/validator/Constraints/ExpressionValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\File' => $vendorDir . '/symfony/validator/Constraints/File.php',
    'Symfony\\Component\\Validator\\Constraints\\FileValidator' => $vendorDir . '/symfony/validator/Constraints/FileValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => $vendorDir . '/symfony/validator/Constraints/GreaterThan.php',
    'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqual.php',
    'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => $vendorDir . '/symfony/validator/Constraints/GroupSequence.php',
    'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => $vendorDir . '/symfony/validator/Constraints/GroupSequenceProvider.php',
    'Symfony\\Component\\Validator\\Constraints\\Hostname' => $vendorDir . '/symfony/validator/Constraints/Hostname.php',
    'Symfony\\Component\\Validator\\Constraints\\HostnameValidator' => $vendorDir . '/symfony/validator/Constraints/HostnameValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Iban' => $vendorDir . '/symfony/validator/Constraints/Iban.php',
    'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => $vendorDir . '/symfony/validator/Constraints/IbanValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => $vendorDir . '/symfony/validator/Constraints/IdenticalTo.php',
    'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/IdenticalToValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Image' => $vendorDir . '/symfony/validator/Constraints/Image.php',
    'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => $vendorDir . '/symfony/validator/Constraints/ImageValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Ip' => $vendorDir . '/symfony/validator/Constraints/Ip.php',
    'Symfony\\Component\\Validator\\Constraints\\IpValidator' => $vendorDir . '/symfony/validator/Constraints/IpValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\IsFalse' => $vendorDir . '/symfony/validator/Constraints/IsFalse.php',
    'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => $vendorDir . '/symfony/validator/Constraints/IsFalseValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\IsNull' => $vendorDir . '/symfony/validator/Constraints/IsNull.php',
    'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => $vendorDir . '/symfony/validator/Constraints/IsNullValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\IsTrue' => $vendorDir . '/symfony/validator/Constraints/IsTrue.php',
    'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => $vendorDir . '/symfony/validator/Constraints/IsTrueValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Isbn' => $vendorDir . '/symfony/validator/Constraints/Isbn.php',
    'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => $vendorDir . '/symfony/validator/Constraints/IsbnValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Isin' => $vendorDir . '/symfony/validator/Constraints/Isin.php',
    'Symfony\\Component\\Validator\\Constraints\\IsinValidator' => $vendorDir . '/symfony/validator/Constraints/IsinValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Issn' => $vendorDir . '/symfony/validator/Constraints/Issn.php',
    'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => $vendorDir . '/symfony/validator/Constraints/IssnValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Json' => $vendorDir . '/symfony/validator/Constraints/Json.php',
    'Symfony\\Component\\Validator\\Constraints\\JsonValidator' => $vendorDir . '/symfony/validator/Constraints/JsonValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Language' => $vendorDir . '/symfony/validator/Constraints/Language.php',
    'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => $vendorDir . '/symfony/validator/Constraints/LanguageValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Length' => $vendorDir . '/symfony/validator/Constraints/Length.php',
    'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => $vendorDir . '/symfony/validator/Constraints/LengthValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\LessThan' => $vendorDir . '/symfony/validator/Constraints/LessThan.php',
    'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqual.php',
    'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqualValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Locale' => $vendorDir . '/symfony/validator/Constraints/Locale.php',
    'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => $vendorDir . '/symfony/validator/Constraints/LocaleValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Luhn' => $vendorDir . '/symfony/validator/Constraints/Luhn.php',
    'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => $vendorDir . '/symfony/validator/Constraints/LuhnValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Negative' => $vendorDir . '/symfony/validator/Constraints/Negative.php',
    'Symfony\\Component\\Validator\\Constraints\\NegativeOrZero' => $vendorDir . '/symfony/validator/Constraints/NegativeOrZero.php',
    'Symfony\\Component\\Validator\\Constraints\\NoSuspiciousCharacters' => $vendorDir . '/symfony/validator/Constraints/NoSuspiciousCharacters.php',
    'Symfony\\Component\\Validator\\Constraints\\NoSuspiciousCharactersValidator' => $vendorDir . '/symfony/validator/Constraints/NoSuspiciousCharactersValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\NotBlank' => $vendorDir . '/symfony/validator/Constraints/NotBlank.php',
    'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => $vendorDir . '/symfony/validator/Constraints/NotBlankValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\NotCompromisedPassword' => $vendorDir . '/symfony/validator/Constraints/NotCompromisedPassword.php',
    'Symfony\\Component\\Validator\\Constraints\\NotCompromisedPasswordValidator' => $vendorDir . '/symfony/validator/Constraints/NotCompromisedPasswordValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => $vendorDir . '/symfony/validator/Constraints/NotEqualTo.php',
    'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => $vendorDir . '/symfony/validator/Constraints/NotEqualToValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalTo.php',
    'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalToValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\NotNull' => $vendorDir . '/symfony/validator/Constraints/NotNull.php',
    'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => $vendorDir . '/symfony/validator/Constraints/NotNullValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Optional' => $vendorDir . '/symfony/validator/Constraints/Optional.php',
    'Symfony\\Component\\Validator\\Constraints\\PasswordStrength' => $vendorDir . '/symfony/validator/Constraints/PasswordStrength.php',
    'Symfony\\Component\\Validator\\Constraints\\PasswordStrengthValidator' => $vendorDir . '/symfony/validator/Constraints/PasswordStrengthValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Positive' => $vendorDir . '/symfony/validator/Constraints/Positive.php',
    'Symfony\\Component\\Validator\\Constraints\\PositiveOrZero' => $vendorDir . '/symfony/validator/Constraints/PositiveOrZero.php',
    'Symfony\\Component\\Validator\\Constraints\\Range' => $vendorDir . '/symfony/validator/Constraints/Range.php',
    'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => $vendorDir . '/symfony/validator/Constraints/RangeValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Regex' => $vendorDir . '/symfony/validator/Constraints/Regex.php',
    'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => $vendorDir . '/symfony/validator/Constraints/RegexValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Required' => $vendorDir . '/symfony/validator/Constraints/Required.php',
    'Symfony\\Component\\Validator\\Constraints\\Sequentially' => $vendorDir . '/symfony/validator/Constraints/Sequentially.php',
    'Symfony\\Component\\Validator\\Constraints\\SequentiallyValidator' => $vendorDir . '/symfony/validator/Constraints/SequentiallyValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Time' => $vendorDir . '/symfony/validator/Constraints/Time.php',
    'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => $vendorDir . '/symfony/validator/Constraints/TimeValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Timezone' => $vendorDir . '/symfony/validator/Constraints/Timezone.php',
    'Symfony\\Component\\Validator\\Constraints\\TimezoneValidator' => $vendorDir . '/symfony/validator/Constraints/TimezoneValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Traverse' => $vendorDir . '/symfony/validator/Constraints/Traverse.php',
    'Symfony\\Component\\Validator\\Constraints\\Type' => $vendorDir . '/symfony/validator/Constraints/Type.php',
    'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => $vendorDir . '/symfony/validator/Constraints/TypeValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Ulid' => $vendorDir . '/symfony/validator/Constraints/Ulid.php',
    'Symfony\\Component\\Validator\\Constraints\\UlidValidator' => $vendorDir . '/symfony/validator/Constraints/UlidValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Unique' => $vendorDir . '/symfony/validator/Constraints/Unique.php',
    'Symfony\\Component\\Validator\\Constraints\\UniqueValidator' => $vendorDir . '/symfony/validator/Constraints/UniqueValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Url' => $vendorDir . '/symfony/validator/Constraints/Url.php',
    'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => $vendorDir . '/symfony/validator/Constraints/UrlValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Uuid' => $vendorDir . '/symfony/validator/Constraints/Uuid.php',
    'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => $vendorDir . '/symfony/validator/Constraints/UuidValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\Valid' => $vendorDir . '/symfony/validator/Constraints/Valid.php',
    'Symfony\\Component\\Validator\\Constraints\\ValidValidator' => $vendorDir . '/symfony/validator/Constraints/ValidValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\When' => $vendorDir . '/symfony/validator/Constraints/When.php',
    'Symfony\\Component\\Validator\\Constraints\\WhenValidator' => $vendorDir . '/symfony/validator/Constraints/WhenValidator.php',
    'Symfony\\Component\\Validator\\Constraints\\ZeroComparisonConstraintTrait' => $vendorDir . '/symfony/validator/Constraints/ZeroComparisonConstraintTrait.php',
    'Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => $vendorDir . '/symfony/validator/ContainerConstraintValidatorFactory.php',
    'Symfony\\Component\\Validator\\Context\\ExecutionContext' => $vendorDir . '/symfony/validator/Context/ExecutionContext.php',
    'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactory.php',
    'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactoryInterface.php',
    'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextInterface.php',
    'Symfony\\Component\\Validator\\DataCollector\\ValidatorDataCollector' => $vendorDir . '/symfony/validator/DataCollector/ValidatorDataCollector.php',
    'Symfony\\Component\\Validator\\DependencyInjection\\AddAutoMappingConfigurationPass' => $vendorDir . '/symfony/validator/DependencyInjection/AddAutoMappingConfigurationPass.php',
    'Symfony\\Component\\Validator\\DependencyInjection\\AddConstraintValidatorsPass' => $vendorDir . '/symfony/validator/DependencyInjection/AddConstraintValidatorsPass.php',
    'Symfony\\Component\\Validator\\DependencyInjection\\AddValidatorInitializersPass' => $vendorDir . '/symfony/validator/DependencyInjection/AddValidatorInitializersPass.php',
    'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/validator/Exception/BadMethodCallException.php',
    'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => $vendorDir . '/symfony/validator/Exception/ConstraintDefinitionException.php',
    'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/validator/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => $vendorDir . '/symfony/validator/Exception/GroupDefinitionException.php',
    'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/validator/Exception/InvalidArgumentException.php',
    'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => $vendorDir . '/symfony/validator/Exception/InvalidOptionsException.php',
    'Symfony\\Component\\Validator\\Exception\\LogicException' => $vendorDir . '/symfony/validator/Exception/LogicException.php',
    'Symfony\\Component\\Validator\\Exception\\MappingException' => $vendorDir . '/symfony/validator/Exception/MappingException.php',
    'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => $vendorDir . '/symfony/validator/Exception/MissingOptionsException.php',
    'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => $vendorDir . '/symfony/validator/Exception/NoSuchMetadataException.php',
    'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/validator/Exception/OutOfBoundsException.php',
    'Symfony\\Component\\Validator\\Exception\\RuntimeException' => $vendorDir . '/symfony/validator/Exception/RuntimeException.php',
    'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/validator/Exception/UnexpectedTypeException.php',
    'Symfony\\Component\\Validator\\Exception\\UnexpectedValueException' => $vendorDir . '/symfony/validator/Exception/UnexpectedValueException.php',
    'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => $vendorDir . '/symfony/validator/Exception/UnsupportedMetadataException.php',
    'Symfony\\Component\\Validator\\Exception\\ValidationFailedException' => $vendorDir . '/symfony/validator/Exception/ValidationFailedException.php',
    'Symfony\\Component\\Validator\\Exception\\ValidatorException' => $vendorDir . '/symfony/validator/Exception/ValidatorException.php',
    'Symfony\\Component\\Validator\\GroupProviderInterface' => $vendorDir . '/symfony/validator/GroupProviderInterface.php',
    'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => $vendorDir . '/symfony/validator/GroupSequenceProviderInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\AutoMappingStrategy' => $vendorDir . '/symfony/validator/Mapping/AutoMappingStrategy.php',
    'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => $vendorDir . '/symfony/validator/Mapping/CascadingStrategy.php',
    'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => $vendorDir . '/symfony/validator/Mapping/ClassMetadata.php',
    'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/ClassMetadataInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php',
    'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php',
    'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => $vendorDir . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => $vendorDir . '/symfony/validator/Mapping/GenericMetadata.php',
    'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => $vendorDir . '/symfony/validator/Mapping/GetterMetadata.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AbstractLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AnnotationLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\AttributeLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AttributeLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\AutoMappingTrait' => $vendorDir . '/symfony/validator/Mapping/Loader/AutoMappingTrait.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FileLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FilesLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderChain.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\PropertyInfoLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/PropertyInfoLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFileLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFileLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php',
    'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => $vendorDir . '/symfony/validator/Mapping/MemberMetadata.php',
    'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => $vendorDir . '/symfony/validator/Mapping/MetadataInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadata.php',
    'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadataInterface.php',
    'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => $vendorDir . '/symfony/validator/Mapping/TraversalStrategy.php',
    'Symfony\\Component\\Validator\\ObjectInitializerInterface' => $vendorDir . '/symfony/validator/ObjectInitializerInterface.php',
    'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase' => $vendorDir . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
    'Symfony\\Component\\Validator\\Util\\PropertyPath' => $vendorDir . '/symfony/validator/Util/PropertyPath.php',
    'Symfony\\Component\\Validator\\Validation' => $vendorDir . '/symfony/validator/Validation.php',
    'Symfony\\Component\\Validator\\ValidatorBuilder' => $vendorDir . '/symfony/validator/ValidatorBuilder.php',
    'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ContextualValidatorInterface.php',
    'Symfony\\Component\\Validator\\Validator\\LazyProperty' => $vendorDir . '/symfony/validator/Validator/LazyProperty.php',
    'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveContextualValidator.php',
    'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveValidator.php',
    'Symfony\\Component\\Validator\\Validator\\TraceableValidator' => $vendorDir . '/symfony/validator/Validator/TraceableValidator.php',
    'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ValidatorInterface.php',
    'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilder.php',
    'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php',
    'Symfony\\Component\\VarDumper\\Caster\\AddressInfoCaster' => $vendorDir . '/symfony/var-dumper/Caster/AddressInfoCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ClassStub' => $vendorDir . '/symfony/var-dumper/Caster/ClassStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\ConstStub' => $vendorDir . '/symfony/var-dumper/Caster/ConstStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\CurlCaster' => $vendorDir . '/symfony/var-dumper/Caster/CurlCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => $vendorDir . '/symfony/var-dumper/Caster/CutArrayStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\CutStub' => $vendorDir . '/symfony/var-dumper/Caster/CutStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\DsCaster' => $vendorDir . '/symfony/var-dumper/Caster/DsCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => $vendorDir . '/symfony/var-dumper/Caster/DsPairStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\FFICaster' => $vendorDir . '/symfony/var-dumper/Caster/FFICaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => $vendorDir . '/symfony/var-dumper/Caster/FiberCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\GdCaster' => $vendorDir . '/symfony/var-dumper/Caster/GdCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => $vendorDir . '/symfony/var-dumper/Caster/ImagineCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ImgStub' => $vendorDir . '/symfony/var-dumper/Caster/ImgStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => $vendorDir . '/symfony/var-dumper/Caster/MysqliCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\OpenSSLCaster' => $vendorDir . '/symfony/var-dumper/Caster/OpenSSLCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => $vendorDir . '/symfony/var-dumper/Caster/RdKafkaCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\ScalarStub' => $vendorDir . '/symfony/var-dumper/Caster/ScalarStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\SocketCaster' => $vendorDir . '/symfony/var-dumper/Caster/SocketCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\SplCaster' => $vendorDir . '/symfony/var-dumper/Caster/SplCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\SqliteCaster' => $vendorDir . '/symfony/var-dumper/Caster/SqliteCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\UninitializedStub' => $vendorDir . '/symfony/var-dumper/Caster/UninitializedStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => $vendorDir . '/symfony/var-dumper/Caster/UuidCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\VirtualStub' => $vendorDir . '/symfony/var-dumper/Caster/VirtualStub.php',
    'Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php',
    'Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php',
    'Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php',
    'Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => $vendorDir . '/symfony/var-dumper/Cloner/ClonerInterface.php',
    'Symfony\\Component\\VarDumper\\Cloner\\Cursor' => $vendorDir . '/symfony/var-dumper/Cloner/Cursor.php',
    'Symfony\\Component\\VarDumper\\Cloner\\Data' => $vendorDir . '/symfony/var-dumper/Cloner/Data.php',
    'Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php',
    'Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php',
    'Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php',
    'Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php',
    'Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php',
    'Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php',
    'Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => $vendorDir . '/symfony/var-dumper/Command/ServerDumpCommand.php',
    'Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php',
    'Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ContextualizedDumper.php',
    'Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php',
    'Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php',
    'Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ServerDumper.php',
    'Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php',
    'Symfony\\Component\\VarDumper\\Server\\Connection' => $vendorDir . '/symfony/var-dumper/Server/Connection.php',
    'Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php',
    'Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php',
    'Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php',
    'Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/var-exporter/Exception/ClassNotFoundException.php',
    'Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/var-exporter/Exception/ExceptionInterface.php',
    'Symfony\\Component\\VarExporter\\Exception\\LogicException' => $vendorDir . '/symfony/var-exporter/Exception/LogicException.php',
    'Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => $vendorDir . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php',
    'Symfony\\Component\\VarExporter\\Hydrator' => $vendorDir . '/symfony/var-exporter/Hydrator.php',
    'Symfony\\Component\\VarExporter\\Instantiator' => $vendorDir . '/symfony/var-exporter/Instantiator.php',
    'Symfony\\Component\\VarExporter\\Internal\\Exporter' => $vendorDir . '/symfony/var-exporter/Internal/Exporter.php',
    'Symfony\\Component\\VarExporter\\Internal\\Hydrator' => $vendorDir . '/symfony/var-exporter/Internal/Hydrator.php',
    'Symfony\\Component\\VarExporter\\Internal\\LazyDecoratorTrait' => $vendorDir . '/symfony/var-exporter/Internal/LazyDecoratorTrait.php',
    'Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectRegistry.php',
    'Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectState.php',
    'Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectTrait.php',
    'Symfony\\Component\\VarExporter\\Internal\\Reference' => $vendorDir . '/symfony/var-exporter/Internal/Reference.php',
    'Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php',
    'Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php',
    'Symfony\\Component\\VarExporter\\LazyGhostTrait' => $vendorDir . '/symfony/var-exporter/LazyGhostTrait.php',
    'Symfony\\Component\\VarExporter\\LazyObjectInterface' => $vendorDir . '/symfony/var-exporter/LazyObjectInterface.php',
    'Symfony\\Component\\VarExporter\\LazyProxyTrait' => $vendorDir . '/symfony/var-exporter/LazyProxyTrait.php',
    'Symfony\\Component\\VarExporter\\ProxyHelper' => $vendorDir . '/symfony/var-exporter/ProxyHelper.php',
    'Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php',
    'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',
    'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
    'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
    'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php',
    'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php',
    'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php',
    'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php',
    'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php',
    'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php',
    'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',
    'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
    'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
    'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php',
    'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php',
    'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php',
    'Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/cache-contracts/ItemInterface.php',
    'Symfony\\Contracts\\Cache\\NamespacedPoolInterface' => $vendorDir . '/symfony/cache-contracts/NamespacedPoolInterface.php',
    'Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/cache-contracts/TagAwareCacheInterface.php',
    'Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php',
    'Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php',
    'Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php',
    'Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php',
    'Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php',
    'Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php',
    'Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php',
    'Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php',
    'Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php',
    'Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php',
    'Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php',
    'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php',
    'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php',
    'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php',
    'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php',
    'Symfony\\Flex\\Command\\DumpEnvCommand' => $vendorDir . '/symfony/flex/src/Command/DumpEnvCommand.php',
    'Symfony\\Flex\\Command\\InstallRecipesCommand' => $vendorDir . '/symfony/flex/src/Command/InstallRecipesCommand.php',
    'Symfony\\Flex\\Command\\RecipesCommand' => $vendorDir . '/symfony/flex/src/Command/RecipesCommand.php',
    'Symfony\\Flex\\Command\\UpdateRecipesCommand' => $vendorDir . '/symfony/flex/src/Command/UpdateRecipesCommand.php',
    'Symfony\\Flex\\Configurator' => $vendorDir . '/symfony/flex/src/Configurator.php',
    'Symfony\\Flex\\Configurator\\AbstractConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/AbstractConfigurator.php',
    'Symfony\\Flex\\Configurator\\AddLinesConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/AddLinesConfigurator.php',
    'Symfony\\Flex\\Configurator\\BundlesConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/BundlesConfigurator.php',
    'Symfony\\Flex\\Configurator\\ComposerCommandsConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/ComposerCommandsConfigurator.php',
    'Symfony\\Flex\\Configurator\\ComposerScriptsConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/ComposerScriptsConfigurator.php',
    'Symfony\\Flex\\Configurator\\ContainerConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/ContainerConfigurator.php',
    'Symfony\\Flex\\Configurator\\CopyFromPackageConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/CopyFromPackageConfigurator.php',
    'Symfony\\Flex\\Configurator\\CopyFromRecipeConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/CopyFromRecipeConfigurator.php',
    'Symfony\\Flex\\Configurator\\DockerComposeConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/DockerComposeConfigurator.php',
    'Symfony\\Flex\\Configurator\\DockerfileConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/DockerfileConfigurator.php',
    'Symfony\\Flex\\Configurator\\DotenvConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/DotenvConfigurator.php',
    'Symfony\\Flex\\Configurator\\EnvConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/EnvConfigurator.php',
    'Symfony\\Flex\\Configurator\\GitignoreConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/GitignoreConfigurator.php',
    'Symfony\\Flex\\Configurator\\MakefileConfigurator' => $vendorDir . '/symfony/flex/src/Configurator/MakefileConfigurator.php',
    'Symfony\\Flex\\Downloader' => $vendorDir . '/symfony/flex/src/Downloader.php',
    'Symfony\\Flex\\Event\\UpdateEvent' => $vendorDir . '/symfony/flex/src/Event/UpdateEvent.php',
    'Symfony\\Flex\\Flex' => $vendorDir . '/symfony/flex/src/Flex.php',
    'Symfony\\Flex\\GithubApi' => $vendorDir . '/symfony/flex/src/GithubApi.php',
    'Symfony\\Flex\\InformationOperation' => $vendorDir . '/symfony/flex/src/InformationOperation.php',
    'Symfony\\Flex\\Lock' => $vendorDir . '/symfony/flex/src/Lock.php',
    'Symfony\\Flex\\Options' => $vendorDir . '/symfony/flex/src/Options.php',
    'Symfony\\Flex\\PackageFilter' => $vendorDir . '/symfony/flex/src/PackageFilter.php',
    'Symfony\\Flex\\PackageJsonSynchronizer' => $vendorDir . '/symfony/flex/src/PackageJsonSynchronizer.php',
    'Symfony\\Flex\\PackageResolver' => $vendorDir . '/symfony/flex/src/PackageResolver.php',
    'Symfony\\Flex\\Path' => $vendorDir . '/symfony/flex/src/Path.php',
    'Symfony\\Flex\\Recipe' => $vendorDir . '/symfony/flex/src/Recipe.php',
    'Symfony\\Flex\\Response' => $vendorDir . '/symfony/flex/src/Response.php',
    'Symfony\\Flex\\ScriptExecutor' => $vendorDir . '/symfony/flex/src/ScriptExecutor.php',
    'Symfony\\Flex\\SymfonyBundle' => $vendorDir . '/symfony/flex/src/SymfonyBundle.php',
    'Symfony\\Flex\\SymfonyPackInstaller' => $vendorDir . '/symfony/flex/src/SymfonyPackInstaller.php',
    'Symfony\\Flex\\Unpack\\Operation' => $vendorDir . '/symfony/flex/src/Unpack/Operation.php',
    'Symfony\\Flex\\Unpack\\Result' => $vendorDir . '/symfony/flex/src/Unpack/Result.php',
    'Symfony\\Flex\\Unpacker' => $vendorDir . '/symfony/flex/src/Unpacker.php',
    'Symfony\\Flex\\Update\\DiffHelper' => $vendorDir . '/symfony/flex/src/Update/DiffHelper.php',
    'Symfony\\Flex\\Update\\RecipePatch' => $vendorDir . '/symfony/flex/src/Update/RecipePatch.php',
    'Symfony\\Flex\\Update\\RecipePatcher' => $vendorDir . '/symfony/flex/src/Update/RecipePatcher.php',
    'Symfony\\Flex\\Update\\RecipeUpdate' => $vendorDir . '/symfony/flex/src/Update/RecipeUpdate.php',
    'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
    'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php',
    'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php',
    'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
    'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php',
    'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php',
    'Symfony\\Polyfill\\Php83\\Php83' => $vendorDir . '/symfony/polyfill-php83/Php83.php',
    'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
    'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
    'Zumba\\Amplitude\\Amplitude' => $vendorDir . '/zumba/amplitude-php/src/Amplitude.php',
    'Zumba\\Amplitude\\Event' => $vendorDir . '/zumba/amplitude-php/src/Event.php',
    'Zumba\\Amplitude\\Inflector' => $vendorDir . '/zumba/amplitude-php/src/Inflector.php',
    'Zumba\\Amplitude\\Test\\AmplitudeTest' => $vendorDir . '/zumba/amplitude-php/test/AmplitudeTest.php',
    'Zumba\\Amplitude\\Test\\EventTest' => $vendorDir . '/zumba/amplitude-php/test/EventTest.php',
    'Zumba\\Amplitude\\Test\\InflectorTest' => $vendorDir . '/zumba/amplitude-php/test/InflectorTest.php',
    'loophp\\phposinfo\\Enum\\Enum' => $vendorDir . '/loophp/phposinfo/src/Enum/Enum.php',
    'loophp\\phposinfo\\Enum\\Family' => $vendorDir . '/loophp/phposinfo/src/Enum/Family.php',
    'loophp\\phposinfo\\Enum\\FamilyName' => $vendorDir . '/loophp/phposinfo/src/Enum/FamilyName.php',
    'loophp\\phposinfo\\Enum\\Os' => $vendorDir . '/loophp/phposinfo/src/Enum/Os.php',
    'loophp\\phposinfo\\Enum\\OsName' => $vendorDir . '/loophp/phposinfo/src/Enum/OsName.php',
    'loophp\\phposinfo\\OsInfo' => $vendorDir . '/loophp/phposinfo/src/OsInfo.php',
    'loophp\\phposinfo\\OsInfoInterface' => $vendorDir . '/loophp/phposinfo/src/OsInfoInterface.php',
    '' => $vendorDir . '/symfony/cache/Traits/ValueWrapper.php',
);
<?php











namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;










class InstalledVersions
{




private static $selfDir = null;

/**
@psalm-var

*/
private static $installed;




private static $installedIsLocalDir;




private static $canGetVendors;

/**
@psalm-var

*/
private static $installedByVendor = array();

/**
@psalm-return



*/
public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}

if (1 === \count($packages)) {
return $packages[0];
}

return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}

/**
@psalm-return




*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();

foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}

return $packagesByType;
}










public static function isInstalled($packageName, $includeDevRequirements = true)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}

return false;
}













public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));

return $provided->matches($constraint);
}










public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}

return implode(' || ', $ranges);
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}

return $installed['versions'][$packageName]['version'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}

return $installed['versions'][$packageName]['pretty_version'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}

return $installed['versions'][$packageName]['reference'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}

/**
@psalm-return

*/
public static function getRootPackage()
{
$installed = self::getInstalled();

return $installed[0]['root'];
}

/**
@psalm-return




*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);

if (null === self::$installed) {


if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}

return self::$installed;
}

/**
@psalm-return



*/
public static function getAllRawData()
{
return self::getInstalled();
}

/**
@psalm-param















*/
public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();





self::$installedIsLocalDir = false;
}




private static function getSelfDir()
{
if (self::$selfDir === null) {
self::$selfDir = strtr(__DIR__, '\\', '/');
}

return self::$selfDir;
}

/**
@psalm-return

*/
private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}

$installed = array();
$copiedLocalDir = false;

if (self::$canGetVendors) {
$selfDir = self::getSelfDir();
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
$vendorDir = strtr($vendorDir, '\\', '/');
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {

$required = require $vendorDir.'/composer/installed.php';
self::$installedByVendor[$vendorDir] = $required;
$installed[] = $required;
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
self::$installed = $required;
self::$installedIsLocalDir = true;
}
}
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
$copiedLocalDir = true;
}
}
}

if (null === self::$installed) {


if (substr(__DIR__, -8, 1) !== 'C') {

$required = require __DIR__ . '/installed.php';
self::$installed = $required;
} else {
self::$installed = array();
}
}

if (self::$installed !== array() && !$copiedLocalDir) {
$installed[] = self::$installed;
}

return $installed;
}
}
{"packages":[{"name":"acquia\/drupal-environment-detector","version":"1.7.0","version_normalized":"1.7.0.0","source":{"type":"git","url":"https:\/\/github.com\/acquia\/drupal-environment-detector.git","reference":"4666ae67b422d209a8b11c9f886e3ef6d3f16778"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/acquia\/drupal-environment-detector\/zipball\/4666ae67b422d209a8b11c9f886e3ef6d3f16778","reference":"4666ae67b422d209a8b11c9f886e3ef6d3f16778","shasum":""},"conflict":{"acquia\/blt":">=12.0.0 <13.5.2"},"require-dev":{"acquia\/coding-standards":"^3.0.1","dealerdirect\/phpcodesniffer-composer-installer":"^1.0.0"},"time":"2024-11-26T19:16:45+00:00","type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"},"phpcodesniffer-search-depth":"4"},"installation-source":"dist","autoload":{"psr-4":{"Acquia\\DrupalEnvironmentDetector\\":"src\/","Acquia\\DrupalEnvironmentDetector\\Tests\\":"tests\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["GPL-2.0-or-later"],"authors":[{"name":"Acquia Engineering","homepage":"https:\/\/www.acquia.com","role":"Maintainer"}],"description":"Provides common methods for detecting the current Acquia environment","support":{"issues":"https:\/\/github.com\/acquia\/drupal-environment-detector\/issues","source":"https:\/\/github.com\/acquia\/drupal-environment-detector\/tree\/1.7.0"},"install-path":"..\/acquia\/drupal-environment-detector"},{"name":"brick\/math","version":"0.14.0","version_normalized":"0.14.0.0","source":{"type":"git","url":"https:\/\/github.com\/brick\/math.git","reference":"113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/brick\/math\/zipball\/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2","reference":"113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2","shasum":""},"require":{"php":"^8.2"},"require-dev":{"php-coveralls\/php-coveralls":"^2.2","phpstan\/phpstan":"2.1.22","phpunit\/phpunit":"^11.5"},"time":"2025-08-29T12:40:03+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Brick\\Math\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Arbitrary-precision arithmetic library","keywords":["Arbitrary-precision","BigInteger","BigRational","arithmetic","bigdecimal","bignum","bignumber","brick","decimal","integer","math","mathematics","rational"],"support":{"issues":"https:\/\/github.com\/brick\/math\/issues","source":"https:\/\/github.com\/brick\/math\/tree\/0.14.0"},"funding":[{"url":"https:\/\/github.com\/BenMorel","type":"github"}],"install-path":"..\/brick\/math"},{"name":"bugsnag\/bugsnag","version":"v3.30.0","version_normalized":"3.30.0.0","source":{"type":"git","url":"https:\/\/github.com\/bugsnag\/bugsnag-php.git","reference":"ea174966d8a09424d7963e1e0fe9d570b63ff98c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/bugsnag\/bugsnag-php\/zipball\/ea174966d8a09424d7963e1e0fe9d570b63ff98c","reference":"ea174966d8a09424d7963e1e0fe9d570b63ff98c","shasum":""},"require":{"composer\/ca-bundle":"^1.0","guzzlehttp\/guzzle":"^5.0|^6.0|^7.0","php":">=5.5"},"require-dev":{"guzzlehttp\/psr7":"^1.3|^2.0","mtdowling\/burgomaster":"dev-master#72151eddf5f0cf101502b94bf5031f9c53501a04","php-mock\/php-mock-phpunit":"^1.1|^2.1","phpunit\/phpunit":"^4.8.36|^7.5.15|^9.3.10","sebastian\/version":">=1.0.3"},"time":"2025-07-08T15:15:58+00:00","type":"library","extra":{"branch-alias":{"dev-master":"3.20-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Bugsnag\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"James Smith","email":"notifiers@bugsnag.com","homepage":"https:\/\/bugsnag.com"}],"description":"Official Bugsnag notifier for PHP applications.","homepage":"https:\/\/github.com\/bugsnag\/bugsnag-php","keywords":["bugsnag","errors","exceptions","logging","tracking"],"support":{"issues":"https:\/\/github.com\/bugsnag\/bugsnag-php\/issues","source":"https:\/\/github.com\/bugsnag\/bugsnag-php\/tree\/v3.30.0"},"install-path":"..\/bugsnag\/bugsnag"},{"name":"clue\/stream-filter","version":"v1.7.0","version_normalized":"1.7.0.0","source":{"type":"git","url":"https:\/\/github.com\/clue\/stream-filter.git","reference":"049509fef80032cb3f051595029ab75b49a3c2f7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/clue\/stream-filter\/zipball\/049509fef80032cb3f051595029ab75b49a3c2f7","reference":"049509fef80032cb3f051595029ab75b49a3c2f7","shasum":""},"require":{"php":">=5.3"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"time":"2023-12-20T15:40:13+00:00","type":"library","installation-source":"dist","autoload":{"files":["src\/functions_include.php"],"psr-4":{"Clue\\StreamFilter\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering"}],"description":"A simple and modern approach to stream filtering in PHP","homepage":"https:\/\/github.com\/clue\/stream-filter","keywords":["bucket brigade","callback","filter","php_user_filter","stream","stream_filter_append","stream_filter_register"],"support":{"issues":"https:\/\/github.com\/clue\/stream-filter\/issues","source":"https:\/\/github.com\/clue\/stream-filter\/tree\/v1.7.0"},"funding":[{"url":"https:\/\/clue.engineering\/support","type":"custom"},{"url":"https:\/\/github.com\/clue","type":"github"}],"install-path":"..\/clue\/stream-filter"},{"name":"composer\/ca-bundle","version":"1.5.8","version_normalized":"1.5.8.0","source":{"type":"git","url":"https:\/\/github.com\/composer\/ca-bundle.git","reference":"719026bb30813accb68271fee7e39552a58e9f65"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/ca-bundle\/zipball\/719026bb30813accb68271fee7e39552a58e9f65","reference":"719026bb30813accb68271fee7e39552a58e9f65","shasum":""},"require":{"ext-openssl":"*","ext-pcre":"*","php":"^7.2 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.10","phpunit\/phpunit":"^8 || ^9","psr\/log":"^1.0 || ^2.0 || ^3.0","symfony\/process":"^4.0 || ^5.0 || ^6.0 || ^7.0"},"time":"2025-08-20T18:49:47+00:00","type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Composer\\CaBundle\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"}],"description":"Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.","keywords":["cabundle","cacert","certificate","ssl","tls"],"support":{"irc":"irc:\/\/irc.freenode.org\/composer","issues":"https:\/\/github.com\/composer\/ca-bundle\/issues","source":"https:\/\/github.com\/composer\/ca-bundle\/tree\/1.5.8"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"install-path":".\/ca-bundle"},{"name":"composer\/semver","version":"3.4.4","version_normalized":"3.4.4.0","source":{"type":"git","url":"https:\/\/github.com\/composer\/semver.git","reference":"198166618906cb2de69b95d7d47e5fa8aa1b2b95"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/semver\/zipball\/198166618906cb2de69b95d7d47e5fa8aa1b2b95","reference":"198166618906cb2de69b95d7d47e5fa8aa1b2b95","shasum":""},"require":{"php":"^5.3.2 || ^7.0 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.11","symfony\/phpunit-bridge":"^3 || ^7"},"time":"2025-08-20T19:15:30+00:00","type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Composer\\Semver\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nils Adermann","email":"naderman@naderman.de","homepage":"http:\/\/www.naderman.de"},{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"},{"name":"Rob Bast","email":"rob.bast@gmail.com","homepage":"http:\/\/robbast.nl"}],"description":"Semver library that offers utilities, version constraint parsing and validation.","keywords":["semantic","semver","validation","versioning"],"support":{"irc":"ircs:\/\/irc.libera.chat:6697\/composer","issues":"https:\/\/github.com\/composer\/semver\/issues","source":"https:\/\/github.com\/composer\/semver\/tree\/3.4.4"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"install-path":".\/semver"},{"name":"consolidation\/self-update","version":"3.1.0","version_normalized":"3.1.0.0","source":{"type":"git","url":"https:\/\/github.com\/consolidation\/self-update.git","reference":"3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/consolidation\/self-update\/zipball\/3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc","reference":"3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc","shasum":""},"require":{"composer\/semver":"^3.2","guzzlehttp\/guzzle":"^7.9","kevinrob\/guzzle-cache-middleware":"^5.1 || ^6","php":"^8.1","symfony\/cache":"^5.4 || ^6.4 || ^7","symfony\/console":"^5.4 || ^6.4 || ^7","symfony\/filesystem":"^5.4 || ^6.4 || ^7"},"time":"2025-10-29T01:41:49+00:00","bin":["scripts\/release"],"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"SelfUpdate\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Alexander Menk","email":"menk@mestrona.net"},{"name":"Greg Anderson","email":"greg.1.anderson@greenknowe.org"}],"description":"Provides a self:update command for Symfony Console applications.","support":{"issues":"https:\/\/github.com\/consolidation\/self-update\/issues","source":"https:\/\/github.com\/consolidation\/self-update\/tree\/3.1.0"},"install-path":"..\/consolidation\/self-update"},{"name":"dflydev\/dot-access-data","version":"v3.0.3","version_normalized":"3.0.3.0","source":{"type":"git","url":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data.git","reference":"a23a2bf4f31d3518f3ecb38660c95715dfead60f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/dflydev\/dflydev-dot-access-data\/zipball\/a23a2bf4f31d3518f3ecb38660c95715dfead60f","reference":"a23a2bf4f31d3518f3ecb38660c95715dfead60f","shasum":""},"require":{"php":"^7.1 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^0.12.42","phpunit\/phpunit":"^7.5 || ^8.5 || ^9.3","scrutinizer\/ocular":"1.6.0","squizlabs\/php_codesniffer":"^3.5","vimeo\/psalm":"^4.0.0"},"time":"2024-07-08T12:26:09+00:00","type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Dflydev\\DotAccessData\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Dragonfly Development Inc.","email":"info@dflydev.com","homepage":"http:\/\/dflydev.com"},{"name":"Beau Simensen","email":"beau@dflydev.com","homepage":"http:\/\/beausimensen.com"},{"name":"Carlos Frutos","email":"carlos@kiwing.it","homepage":"https:\/\/github.com\/cfrutos"},{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com"}],"description":"Given a deep data structure, access data by dot notation.","homepage":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data","keywords":["access","data","dot","notation"],"support":{"issues":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/issues","source":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/tree\/v3.0.3"},"install-path":"..\/dflydev\/dot-access-data"},{"name":"evenement\/evenement","version":"v3.0.2","version_normalized":"3.0.2.0","source":{"type":"git","url":"https:\/\/github.com\/igorw\/evenement.git","reference":"0a16b0d71ab13284339abb99d9d2bd813640efbc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/igorw\/evenement\/zipball\/0a16b0d71ab13284339abb99d9d2bd813640efbc","reference":"0a16b0d71ab13284339abb99d9d2bd813640efbc","shasum":""},"require":{"php":">=7.0"},"require-dev":{"phpunit\/phpunit":"^9 || ^6"},"time":"2023-08-08T05:53:35+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Evenement\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Igor Wiedler","email":"igor@wiedler.ch"}],"description":"\u00c9v\u00e9nement is a very simple event dispatching library for PHP","keywords":["event-dispatcher","event-emitter"],"support":{"issues":"https:\/\/github.com\/igorw\/evenement\/issues","source":"https:\/\/github.com\/igorw\/evenement\/tree\/v3.0.2"},"install-path":"..\/evenement\/evenement"},{"name":"graham-campbell\/result-type","version":"v1.1.3","version_normalized":"1.1.3.0","source":{"type":"git","url":"https:\/\/github.com\/GrahamCampbell\/Result-Type.git","reference":"3ba905c11371512af9d9bdd27d99b782216b6945"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/GrahamCampbell\/Result-Type\/zipball\/3ba905c11371512af9d9bdd27d99b782216b6945","reference":"3ba905c11371512af9d9bdd27d99b782216b6945","shasum":""},"require":{"php":"^7.2.5 || ^8.0","phpoption\/phpoption":"^1.9.3"},"require-dev":{"phpunit\/phpunit":"^8.5.39 || ^9.6.20 || ^10.5.28"},"time":"2024-07-20T21:45:45+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"GrahamCampbell\\ResultType\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"}],"description":"An Implementation Of The Result Type","keywords":["Graham Campbell","GrahamCampbell","Result Type","Result-Type","result"],"support":{"issues":"https:\/\/github.com\/GrahamCampbell\/Result-Type\/issues","source":"https:\/\/github.com\/GrahamCampbell\/Result-Type\/tree\/v1.1.3"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/graham-campbell\/result-type","type":"tidelift"}],"install-path":"..\/graham-campbell\/result-type"},{"name":"grasmash\/expander","version":"3.0.1","version_normalized":"3.0.1.0","source":{"type":"git","url":"https:\/\/github.com\/grasmash\/expander.git","reference":"eea11b9afb0c32483b18b9009f4ca07b770e39f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/grasmash\/expander\/zipball\/eea11b9afb0c32483b18b9009f4ca07b770e39f4","reference":"eea11b9afb0c32483b18b9009f4ca07b770e39f4","shasum":""},"require":{"dflydev\/dot-access-data":"^3.0.0","php":">=8.0","psr\/log":"^2 | ^3"},"require-dev":{"greg-1-anderson\/composer-test-scenarios":"^1","php-coveralls\/php-coveralls":"^2.5","phpunit\/phpunit":"^9","squizlabs\/php_codesniffer":"^3.3"},"time":"2024-11-25T23:28:05+00:00","type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Grasmash\\Expander\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Matthew Grasmick"}],"description":"Expands internal property references in PHP arrays file.","support":{"issues":"https:\/\/github.com\/grasmash\/expander\/issues","source":"https:\/\/github.com\/grasmash\/expander\/tree\/3.0.1"},"install-path":"..\/grasmash\/expander"},{"name":"guzzlehttp\/guzzle","version":"7.10.0","version_normalized":"7.10.0.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/guzzle.git","reference":"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/guzzle\/zipball\/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4","reference":"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4","shasum":""},"require":{"ext-json":"*","guzzlehttp\/promises":"^2.3","guzzlehttp\/psr7":"^2.8","php":"^7.2.5 || ^8.0","psr\/http-client":"^1.0","symfony\/deprecation-contracts":"^2.2 || ^3.0"},"provide":{"psr\/http-client-implementation":"1.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","ext-curl":"*","guzzle\/client-integration-tests":"3.0.2","php-http\/message-factory":"^1.1","phpunit\/phpunit":"^8.5.39 || ^9.6.20","psr\/log":"^1.1 || ^2.0 || ^3.0"},"suggest":{"ext-curl":"Required for CURL handler support","ext-intl":"Required for Internationalized Domain Name (IDN) support","psr\/log":"Required for using the Log middleware"},"time":"2025-08-23T22:36:01+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"installation-source":"dist","autoload":{"files":["src\/functions_include.php"],"psr-4":{"GuzzleHttp\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"Jeremy Lindblom","email":"jeremeamia@gmail.com","homepage":"https:\/\/github.com\/jeremeamia"},{"name":"George Mponos","email":"gmponos@gmail.com","homepage":"https:\/\/github.com\/gmponos"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/github.com\/sagikazarmark"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"}],"description":"Guzzle is a PHP HTTP client library","keywords":["client","curl","framework","http","http client","psr-18","psr-7","rest","web service"],"support":{"issues":"https:\/\/github.com\/guzzle\/guzzle\/issues","source":"https:\/\/github.com\/guzzle\/guzzle\/tree\/7.10.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/guzzle","type":"tidelift"}],"install-path":"..\/guzzlehttp\/guzzle"},{"name":"guzzlehttp\/promises","version":"2.3.0","version_normalized":"2.3.0.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/promises.git","reference":"481557b130ef3790cf82b713667b43030dc9c957"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/promises\/zipball\/481557b130ef3790cf82b713667b43030dc9c957","reference":"481557b130ef3790cf82b713667b43030dc9c957","shasum":""},"require":{"php":"^7.2.5 || ^8.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","phpunit\/phpunit":"^8.5.44 || ^9.6.25"},"time":"2025-08-22T14:34:08+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"installation-source":"dist","autoload":{"psr-4":{"GuzzleHttp\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"}],"description":"Guzzle promises library","keywords":["promise"],"support":{"issues":"https:\/\/github.com\/guzzle\/promises\/issues","source":"https:\/\/github.com\/guzzle\/promises\/tree\/2.3.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/promises","type":"tidelift"}],"install-path":"..\/guzzlehttp\/promises"},{"name":"guzzlehttp\/psr7","version":"2.8.0","version_normalized":"2.8.0.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/psr7.git","reference":"21dc724a0583619cd1652f673303492272778051"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/psr7\/zipball\/21dc724a0583619cd1652f673303492272778051","reference":"21dc724a0583619cd1652f673303492272778051","shasum":""},"require":{"php":"^7.2.5 || ^8.0","psr\/http-factory":"^1.0","psr\/http-message":"^1.1 || ^2.0","ralouphie\/getallheaders":"^3.0"},"provide":{"psr\/http-factory-implementation":"1.0","psr\/http-message-implementation":"1.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","http-interop\/http-factory-tests":"0.9.0","phpunit\/phpunit":"^8.5.44 || ^9.6.25"},"suggest":{"laminas\/laminas-httphandlerrunner":"Emit PSR-7 responses"},"time":"2025-08-23T21:21:41+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"installation-source":"dist","autoload":{"psr-4":{"GuzzleHttp\\Psr7\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"George Mponos","email":"gmponos@gmail.com","homepage":"https:\/\/github.com\/gmponos"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/github.com\/sagikazarmark"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/sagikazarmark.hu"}],"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\/2.8.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/psr7","type":"tidelift"}],"install-path":"..\/guzzlehttp\/psr7"},{"name":"http-interop\/http-factory-guzzle","version":"1.2.0","version_normalized":"1.2.0.0","source":{"type":"git","url":"https:\/\/github.com\/http-interop\/http-factory-guzzle.git","reference":"8f06e92b95405216b237521cc64c804dd44c4a81"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/http-interop\/http-factory-guzzle\/zipball\/8f06e92b95405216b237521cc64c804dd44c4a81","reference":"8f06e92b95405216b237521cc64c804dd44c4a81","shasum":""},"require":{"guzzlehttp\/psr7":"^1.7||^2.0","php":">=7.3","psr\/http-factory":"^1.0"},"provide":{"psr\/http-factory-implementation":"^1.0"},"require-dev":{"http-interop\/http-factory-tests":"^0.9","phpunit\/phpunit":"^9.5"},"suggest":{"guzzlehttp\/psr7":"Includes an HTTP factory starting in version 2.0"},"time":"2021-07-21T13:50:14+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Factory\\Guzzle\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"An HTTP Factory using Guzzle PSR7","keywords":["factory","http","psr-17","psr-7"],"support":{"issues":"https:\/\/github.com\/http-interop\/http-factory-guzzle\/issues","source":"https:\/\/github.com\/http-interop\/http-factory-guzzle\/tree\/1.2.0"},"install-path":"..\/http-interop\/http-factory-guzzle"},{"name":"kevinrob\/guzzle-cache-middleware","version":"6.0.0","version_normalized":"6.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware.git","reference":"61305ed694e763e887a04f61e71e2292bb4fbad1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Kevinrob\/guzzle-cache-middleware\/zipball\/61305ed694e763e887a04f61e71e2292bb4fbad1","reference":"61305ed694e763e887a04f61e71e2292bb4fbad1","shasum":""},"require":{"guzzlehttp\/guzzle":"^7.9.2","guzzlehttp\/promises":"^2.0.3","guzzlehttp\/psr7":"^2.7.0","php":">=8.1"},"require-dev":{"cache\/array-adapter":"^0.4 || ^0.5 || ^1.0","cache\/simple-cache-bridge":"^0.1 || ^1.0","doctrine\/cache":"^1.10","illuminate\/cache":"^5.0","league\/flysystem":"^2.5","phpunit\/phpunit":"^9.6.21","psr\/cache":"^1.0","symfony\/cache":"^4.4 || ^5.0","symfony\/phpunit-bridge":"^7.1.4"},"suggest":{"doctrine\/cache":"This library has a lot of ready-to-use cache storage (to be used with Kevinrob\\GuzzleCache\\Storage\\DoctrineCacheStorage). Use only versions >=1.4.0 < 2.0.0","guzzlehttp\/guzzle":"For using this library. It was created for Guzzle6 (but you can use it with any PSR-7 HTTP client).","laravel\/framework":"To be used with Kevinrob\\GuzzleCache\\Storage\\LaravelCacheStorage","league\/flysystem":"To be used with Kevinrob\\GuzzleCache\\Storage\\FlysystemStorage","psr\/cache":"To be used with Kevinrob\\GuzzleCache\\Storage\\Psr6CacheStorage","psr\/simple-cache":"To be used with Kevinrob\\GuzzleCache\\Storage\\Psr16CacheStorage"},"time":"2024-10-17T09:11:54+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Kevinrob\\GuzzleCache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Kevin Robatel","email":"kevinrob2@gmail.com","homepage":"https:\/\/github.com\/Kevinrob"}],"description":"A HTTP\/1.1 Cache for Guzzle 6. It's a simple Middleware to be added in the HandlerStack. (RFC 7234)","homepage":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware","keywords":["Etag","Flysystem","Guzzle","cache","cache-control","doctrine","expiration","guzzle6","handler","http","http 1.1","middleware","performance","php","promise","psr6","psr7","rfc7234","validation"],"support":{"issues":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware\/issues","source":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware\/tree\/6.0.0"},"install-path":"..\/kevinrob\/guzzle-cache-middleware"},{"name":"laminas\/laminas-servicemanager","version":"3.24.0","version_normalized":"3.24.0.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-servicemanager.git","reference":"b172a0df568bf37ebdfb3658263156eefe3c1e8c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-servicemanager\/zipball\/b172a0df568bf37ebdfb3658263156eefe3c1e8c","reference":"b172a0df568bf37ebdfb3658263156eefe3c1e8c","shasum":""},"require":{"laminas\/laminas-stdlib":"^3.19","php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0","psr\/container":"^1.0"},"conflict":{"ext-psr":"*","laminas\/laminas-code":"<4.10.0","zendframework\/zend-code":"<3.3.1","zendframework\/zend-servicemanager":"*"},"provide":{"psr\/container-implementation":"^1.0"},"replace":{"container-interop\/container-interop":"^1.2.0"},"require-dev":{"composer\/package-versions-deprecated":"^1.11.99.5","friendsofphp\/proxy-manager-lts":"^1.0.18","laminas\/laminas-code":"^4.16.0","laminas\/laminas-coding-standard":"~2.5.0","laminas\/laminas-container-config-test":"^0.8","mikey179\/vfsstream":"^1.6.12","phpbench\/phpbench":"^1.4.1","phpunit\/phpunit":"^10.5.58","psalm\/plugin-phpunit":"^0.18.4","vimeo\/psalm":"^5.26.1"},"suggest":{"friendsofphp\/proxy-manager-lts":"ProxyManager ^2.1.1 to handle lazy initialization of services"},"time":"2025-10-14T09:03:51+00:00","bin":["bin\/generate-deps-for-config-factory","bin\/generate-factory-for-class"],"type":"library","installation-source":"dist","autoload":{"files":["src\/autoload.php"],"psr-4":{"Laminas\\ServiceManager\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"Factory-Driven Dependency Injection Container","homepage":"https:\/\/laminas.dev","keywords":["PSR-11","dependency-injection","di","dic","laminas","service-manager","servicemanager"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-servicemanager\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-servicemanager\/issues","rss":"https:\/\/github.com\/laminas\/laminas-servicemanager\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-servicemanager"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"install-path":"..\/laminas\/laminas-servicemanager"},{"name":"laminas\/laminas-stdlib","version":"3.21.0","version_normalized":"3.21.0.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-stdlib.git","reference":"b1c81514cfe158aadf724c42b34d3d0a8164c096"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-stdlib\/zipball\/b1c81514cfe158aadf724c42b34d3d0a8164c096","reference":"b1c81514cfe158aadf724c42b34d3d0a8164c096","shasum":""},"require":{"php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0"},"conflict":{"zendframework\/zend-stdlib":"*"},"require-dev":{"laminas\/laminas-coding-standard":"^3.1.0","phpbench\/phpbench":"^1.4.1","phpunit\/phpunit":"^11.5.42","psalm\/plugin-phpunit":"^0.19.5","vimeo\/psalm":"^6.13.1"},"time":"2025-10-11T18:13:12+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Laminas\\Stdlib\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"SPL extensions, array utilities, error handlers, and more","homepage":"https:\/\/laminas.dev","keywords":["laminas","stdlib"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-stdlib\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-stdlib\/issues","rss":"https:\/\/github.com\/laminas\/laminas-stdlib\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-stdlib"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"install-path":"..\/laminas\/laminas-stdlib"},{"name":"laminas\/laminas-validator","version":"2.65.0","version_normalized":"2.65.0.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-validator.git","reference":"f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-validator\/zipball\/f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49","reference":"f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49","shasum":""},"require":{"laminas\/laminas-servicemanager":"^3.21.0","laminas\/laminas-stdlib":"^3.19","php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0","psr\/http-message":"^1.0.1 || ^2.0.0"},"conflict":{"zendframework\/zend-validator":"*"},"require-dev":{"laminas\/laminas-coding-standard":"^2.5","laminas\/laminas-db":"^2.20","laminas\/laminas-filter":"^2.41.0","laminas\/laminas-i18n":"^2.30.0","laminas\/laminas-session":"^2.25.1","laminas\/laminas-uri":"^2.13.0","phpunit\/phpunit":"^10.5.58","psalm\/plugin-phpunit":"^0.19.0","psr\/http-client":"^1.0.3","psr\/http-factory":"^1.1.0","vimeo\/psalm":"^5.26.1"},"suggest":{"laminas\/laminas-db":"Laminas\\Db component, required by the (No)RecordExists validator","laminas\/laminas-filter":"Laminas\\Filter component, required by the Digits validator","laminas\/laminas-i18n":"Laminas\\I18n component to allow translation of validation error messages","laminas\/laminas-i18n-resources":"Translations of validator messages","laminas\/laminas-servicemanager":"Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains","laminas\/laminas-session":"Laminas\\Session component, ^2.8; required by the Csrf validator","laminas\/laminas-uri":"Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators","psr\/http-message":"psr\/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators"},"time":"2025-10-13T14:40:30+00:00","type":"library","extra":{"laminas":{"component":"Laminas\\Validator","config-provider":"Laminas\\Validator\\ConfigProvider"}},"installation-source":"dist","autoload":{"psr-4":{"Laminas\\Validator\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria","homepage":"https:\/\/laminas.dev","keywords":["laminas","validator"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-validator\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-validator\/issues","rss":"https:\/\/github.com\/laminas\/laminas-validator\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-validator"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"install-path":"..\/laminas\/laminas-validator"},{"name":"league\/csv","version":"9.27.1","version_normalized":"9.27.1.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/csv.git","reference":"26de738b8fccf785397d05ee2fc07b6cd8749797"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/csv\/zipball\/26de738b8fccf785397d05ee2fc07b6cd8749797","reference":"26de738b8fccf785397d05ee2fc07b6cd8749797","shasum":""},"require":{"ext-filter":"*","php":"^8.1.2"},"require-dev":{"ext-dom":"*","ext-xdebug":"*","friendsofphp\/php-cs-fixer":"^3.75.0","phpbench\/phpbench":"^1.4.1","phpstan\/phpstan":"^1.12.27","phpstan\/phpstan-deprecation-rules":"^1.2.1","phpstan\/phpstan-phpunit":"^1.4.2","phpstan\/phpstan-strict-rules":"^1.6.2","phpunit\/phpunit":"^10.5.16 || ^11.5.22 || ^12.3.6","symfony\/var-dumper":"^6.4.8 || ^7.3.0"},"suggest":{"ext-dom":"Required to use the XMLConverter and the HTMLConverter classes","ext-iconv":"Needed to ease transcoding CSV using iconv stream filters","ext-mbstring":"Needed to ease transcoding CSV using mb stream filters","ext-mysqli":"Requiered to use the package with the MySQLi extension","ext-pdo":"Required to use the package with the PDO extension","ext-pgsql":"Requiered to use the package with the PgSQL extension","ext-sqlite3":"Required to use the package with the SQLite3 extension"},"time":"2025-10-25T08:35:20+00:00","type":"library","extra":{"branch-alias":{"dev-master":"9.x-dev"}},"installation-source":"dist","autoload":{"files":["src\/functions_include.php"],"psr-4":{"League\\Csv\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/github.com\/nyamsprod\/","role":"Developer"}],"description":"CSV data manipulation made easy in PHP","homepage":"https:\/\/csv.thephpleague.com","keywords":["convert","csv","export","filter","import","read","transform","write"],"support":{"docs":"https:\/\/csv.thephpleague.com","issues":"https:\/\/github.com\/thephpleague\/csv\/issues","rss":"https:\/\/github.com\/thephpleague\/csv\/releases.atom","source":"https:\/\/github.com\/thephpleague\/csv"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"install-path":"..\/league\/csv"},{"name":"league\/oauth2-client","version":"2.8.1","version_normalized":"2.8.1.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/oauth2-client.git","reference":"9df2924ca644736c835fc60466a3a60390d334f9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/oauth2-client\/zipball\/9df2924ca644736c835fc60466a3a60390d334f9","reference":"9df2924ca644736c835fc60466a3a60390d334f9","shasum":""},"require":{"ext-json":"*","guzzlehttp\/guzzle":"^6.5.8 || ^7.4.5","php":"^7.1 || >=8.0.0 <8.5.0"},"require-dev":{"mockery\/mockery":"^1.3.5","php-parallel-lint\/php-parallel-lint":"^1.4","phpunit\/phpunit":"^7 || ^8 || ^9 || ^10 || ^11","squizlabs\/php_codesniffer":"^3.11"},"time":"2025-02-26T04:37:30+00:00","type":"library","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.8.1"},"install-path":"..\/league\/oauth2-client"},{"name":"loophp\/phposinfo","version":"1.8.0","version_normalized":"1.8.0.0","source":{"type":"git","url":"https:\/\/github.com\/loophp\/phposinfo.git","reference":"9faccbfbf5364fd34fbc230961fa6fc51cc66b8f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/loophp\/phposinfo\/zipball\/9faccbfbf5364fd34fbc230961fa6fc51cc66b8f","reference":"9faccbfbf5364fd34fbc230961fa6fc51cc66b8f","shasum":""},"require":{"php":"^8"},"require-dev":{"drupol\/php-conventions":"^5.0.0","ext-pcov":"*","friends-of-phpspec\/phpspec-code-coverage":"^6","infection\/infection":"^0.26","infection\/phpspec-adapter":"^0.2.0","phpspec\/phpspec":"^7"},"time":"2022-12-20T20:21:10+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"loophp\\phposinfo\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Pol Dellaiera","email":"pol.dellaiera@protonmail.com"}],"description":"Try to guess the host operating system.","keywords":["operating system detection"],"support":{"issues":"https:\/\/github.com\/loophp\/phposinfo\/issues","source":"https:\/\/github.com\/loophp\/phposinfo"},"funding":[{"url":"https:\/\/github.com\/drupol","type":"github"}],"install-path":"..\/loophp\/phposinfo"},{"name":"ltd-beget\/ascii-table","version":"1.0.4","version_normalized":"1.0.4.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/ascii-table.git","reference":"4020cf9015ceff6405b7204bc14c8d58cf9879dd"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/ascii-table\/zipball\/4020cf9015ceff6405b7204bc14c8d58cf9879dd","reference":"4020cf9015ceff6405b7204bc14c8d58cf9879dd","shasum":""},"require":{"marc-mabe\/php-enum":">=2.2","php":">=7.0"},"time":"2022-01-26T19:08:18+00:00","type":"library","installation-source":"dist","autoload":{"psr-0":{"LTDBeget\\ascii":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php library with ascii table enum.","keywords":["ascii"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/ascii-table\/issues","source":"https:\/\/github.com\/LTD-Beget\/ascii-table\/tree\/1.0.4"},"install-path":"..\/ltd-beget\/ascii-table"},{"name":"ltd-beget\/dns-zone-configurator","version":"v1.4.0","version_normalized":"1.4.0.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator.git","reference":"4e163fdead146e3de6ce7938b99d820395782cdc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/dns-zone-configurator\/zipball\/4e163fdead146e3de6ce7938b99d820395782cdc","reference":"4e163fdead146e3de6ce7938b99d820395782cdc","shasum":""},"require":{"laminas\/laminas-validator":"^2.30.1","ltd-beget\/dns-zone-tokenizer":"~0.0.10","marc-mabe\/php-enum":">=2.2","php":">=8.0"},"require-dev":{"phpunit\/phpunit":"~8.5.33","tideways\/profiler":"~2.0"},"time":"2024-12-04T14:34:28+00:00","type":"library","installation-source":"dist","autoload":{"psr-0":{"LTDBeget\\dns":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php library for parsing and editing dns zones files programmatically with high level abstraction.","keywords":["dns","zone file"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator\/issues","source":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator\/tree\/v1.4.0"},"install-path":"..\/ltd-beget\/dns-zone-configurator"},{"name":"ltd-beget\/dns-zone-tokenizer","version":"v0.0.11","version_normalized":"0.0.11.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer.git","reference":"f57d614a7205a8d4ff0112a4c954a2425c218272"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/dns-zone-tokenizer\/zipball\/f57d614a7205a8d4ff0112a4c954a2425c218272","reference":"f57d614a7205a8d4ff0112a4c954a2425c218272","shasum":""},"require":{"ltd-beget\/stringstream":"^1.0 || ^2.0","php":">=7.1"},"require-dev":{"ext-json":"*","phpunit\/phpunit":"^8.5.1","tideways\/profiler":"^2.0.1"},"time":"2024-12-04T13:57:17+00:00","type":"library","installation-source":"dist","autoload":{"psr-0":{"LTDBeget\\dns":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"tokenize dns zone files and that's all, folks.","keywords":["dns","dns parser","dns zone"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer\/issues","source":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer\/tree\/v0.0.11"},"install-path":"..\/ltd-beget\/dns-zone-tokenizer"},{"name":"ltd-beget\/stringstream","version":"v2.0.0","version_normalized":"2.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/stringstream.git","reference":"abd5d4f514a916f11f054bf577491e549ecf61ac"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/stringstream\/zipball\/abd5d4f514a916f11f054bf577491e549ecf61ac","reference":"abd5d4f514a916f11f054bf577491e549ecf61ac","shasum":""},"require":{"ltd-beget\/ascii-table":"1.* || 2.*","php":">=7.4"},"require-dev":{"phpunit\/phpunit":"^9.5.0"},"time":"2022-01-26T16:24:29+00:00","type":"library","installation-source":"dist","autoload":{"psr-0":{"LTDBeget\\stringstream":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php Stringstream data structure.","keywords":["stream","stringstream"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/stringstream\/issues","source":"https:\/\/github.com\/LTD-Beget\/stringstream\/tree\/v2.0.0"},"install-path":"..\/ltd-beget\/stringstream"},{"name":"m4tthumphrey\/php-gitlab-api","version":"12.0.0","version_normalized":"12.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/GitLabPHP\/Client.git","reference":"362450ff932296bc15796f97da8cf57941650037"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/GitLabPHP\/Client\/zipball\/362450ff932296bc15796f97da8cf57941650037","reference":"362450ff932296bc15796f97da8cf57941650037","shasum":""},"require":{"ext-json":"*","ext-xml":"*","php":"^8.1","php-http\/cache-plugin":"^2.0.1","php-http\/client-common":"^2.7.2","php-http\/discovery":"^1.20.0","php-http\/httplug":"^2.4.1","php-http\/multipart-stream-builder":"^1.4.2","psr\/cache":"^2.0 || ^3.0","psr\/http-client-implementation":"^1.0","psr\/http-factory-implementation":"^1.0","psr\/http-message":"^1.1 || ^2.0","symfony\/options-resolver":"^5.4 || ^6.0 || ^7.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","guzzlehttp\/guzzle":"^7.9.2"},"time":"2025-02-23T20:36:49+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"installation-source":"dist","autoload":{"psr-4":{"Gitlab\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Bourigault","email":"bourigaultfabien@gmail.com","homepage":"https:\/\/github.com\/fbourigault"},{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Matt Humphrey","email":"matth@windsor-telecom.co.uk","homepage":"https:\/\/github.com\/m4tthumphrey"},{"name":"Miguel Piedrafita","email":"github@miguelpiedrafita.com","homepage":"https:\/\/github.com\/m1guelpf"}],"description":"GitLab API v4 client for PHP","keywords":["api","gitlab"],"support":{"issues":"https:\/\/github.com\/GitLabPHP\/Client\/issues","source":"https:\/\/github.com\/GitLabPHP\/Client\/tree\/12.0.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"}],"install-path":"..\/m4tthumphrey\/php-gitlab-api"},{"name":"marc-mabe\/php-enum","version":"v4.7.2","version_normalized":"4.7.2.0","source":{"type":"git","url":"https:\/\/github.com\/marc-mabe\/php-enum.git","reference":"bb426fcdd65c60fb3638ef741e8782508fda7eef"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/marc-mabe\/php-enum\/zipball\/bb426fcdd65c60fb3638ef741e8782508fda7eef","reference":"bb426fcdd65c60fb3638ef741e8782508fda7eef","shasum":""},"require":{"ext-reflection":"*","php":"^7.1 | ^8.0"},"require-dev":{"phpbench\/phpbench":"^0.16.10 || ^1.0.4","phpstan\/phpstan":"^1.3.1","phpunit\/phpunit":"^7.5.20 | ^8.5.22 | ^9.5.11","vimeo\/psalm":"^4.17.0 | ^5.26.1"},"time":"2025-09-14T11:18:39+00:00","type":"library","extra":{"branch-alias":{"dev-3.x":"3.2-dev","dev-master":"4.7-dev"}},"installation-source":"dist","autoload":{"psr-4":{"MabeEnum\\":"src\/"},"classmap":["stubs\/Stringable.php"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Marc Bennewitz","email":"dev@mabe.berlin","homepage":"https:\/\/mabe.berlin\/","role":"Lead"}],"description":"Simple and fast implementation of enumerations with native PHP","homepage":"https:\/\/github.com\/marc-mabe\/php-enum","keywords":["enum","enum-map","enum-set","enumeration","enumerator","enummap","enumset","map","set","type","type-hint","typehint"],"support":{"issues":"https:\/\/github.com\/marc-mabe\/php-enum\/issues","source":"https:\/\/github.com\/marc-mabe\/php-enum\/tree\/v4.7.2"},"install-path":"..\/marc-mabe\/php-enum"},{"name":"php-http\/cache-plugin","version":"2.0.1","version_normalized":"2.0.1.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/cache-plugin.git","reference":"5c591e9e04602cec12307e3e1be3abefeb005e29"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/cache-plugin\/zipball\/5c591e9e04602cec12307e3e1be3abefeb005e29","reference":"5c591e9e04602cec12307e3e1be3abefeb005e29","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/client-common":"^1.9 || ^2.0","psr\/cache":"^1.0 || ^2.0 || ^3.0","psr\/http-factory-implementation":"^1.0","symfony\/options-resolver":"^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"},"require-dev":{"nyholm\/psr7":"^1.6.1","phpspec\/phpspec":"^5.1 || ^6.0 || ^7.0"},"time":"2024-10-02T11:25:38+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Client\\Common\\Plugin\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"PSR-6 Cache plugin for HTTPlug","homepage":"http:\/\/httplug.io","keywords":["cache","http","httplug","plugin"],"support":{"issues":"https:\/\/github.com\/php-http\/cache-plugin\/issues","source":"https:\/\/github.com\/php-http\/cache-plugin\/tree\/2.0.1"},"install-path":"..\/php-http\/cache-plugin"},{"name":"php-http\/client-common","version":"2.7.2","version_normalized":"2.7.2.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/client-common.git","reference":"0cfe9858ab9d3b213041b947c881d5b19ceeca46"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/client-common\/zipball\/0cfe9858ab9d3b213041b947c881d5b19ceeca46","reference":"0cfe9858ab9d3b213041b947c881d5b19ceeca46","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/httplug":"^2.0","php-http\/message":"^1.6","psr\/http-client":"^1.0","psr\/http-factory":"^1.0","psr\/http-message":"^1.0 || ^2.0","symfony\/options-resolver":"~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0","symfony\/polyfill-php80":"^1.17"},"require-dev":{"doctrine\/instantiator":"^1.1","guzzlehttp\/psr7":"^1.4","nyholm\/psr7":"^1.2","phpspec\/phpspec":"^5.1 || ^6.3 || ^7.1","phpspec\/prophecy":"^1.10.2","phpunit\/phpunit":"^7.5.20 || ^8.5.33 || ^9.6.7"},"suggest":{"ext-json":"To detect JSON responses with the ContentTypePlugin","ext-libxml":"To detect XML responses with the ContentTypePlugin","php-http\/cache-plugin":"PSR-6 Cache plugin","php-http\/logger-plugin":"PSR-3 Logger plugin","php-http\/stopwatch-plugin":"Symfony Stopwatch plugin"},"time":"2024-09-24T06:21:48+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Client\\Common\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Common HTTP Client implementations and tools for HTTPlug","homepage":"http:\/\/httplug.io","keywords":["client","common","http","httplug"],"support":{"issues":"https:\/\/github.com\/php-http\/client-common\/issues","source":"https:\/\/github.com\/php-http\/client-common\/tree\/2.7.2"},"install-path":"..\/php-http\/client-common"},{"name":"php-http\/discovery","version":"1.20.0","version_normalized":"1.20.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/discovery.git","reference":"82fe4c73ef3363caed49ff8dd1539ba06044910d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/discovery\/zipball\/82fe4c73ef3363caed49ff8dd1539ba06044910d","reference":"82fe4c73ef3363caed49ff8dd1539ba06044910d","shasum":""},"require":{"composer-plugin-api":"^1.0|^2.0","php":"^7.1 || ^8.0"},"conflict":{"nyholm\/psr7":"<1.0","zendframework\/zend-diactoros":"*"},"provide":{"php-http\/async-client-implementation":"*","php-http\/client-implementation":"*","psr\/http-client-implementation":"*","psr\/http-factory-implementation":"*","psr\/http-message-implementation":"*"},"require-dev":{"composer\/composer":"^1.0.2|^2.0","graham-campbell\/phpspec-skip-example-extension":"^5.0","php-http\/httplug":"^1.0 || ^2.0","php-http\/message-factory":"^1.0","phpspec\/phpspec":"^5.1 || ^6.1 || ^7.3","sebastian\/comparator":"^3.0.5 || ^4.0.8","symfony\/phpunit-bridge":"^6.4.4 || ^7.0.1"},"time":"2024-10-02T11:20:13+00:00","type":"composer-plugin","extra":{"class":"Http\\Discovery\\Composer\\Plugin","plugin-optional":true},"installation-source":"dist","autoload":{"psr-4":{"Http\\Discovery\\":"src\/"},"exclude-from-classmap":["src\/Composer\/Plugin.php"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations","homepage":"http:\/\/php-http.org","keywords":["adapter","client","discovery","factory","http","message","psr17","psr7"],"support":{"issues":"https:\/\/github.com\/php-http\/discovery\/issues","source":"https:\/\/github.com\/php-http\/discovery\/tree\/1.20.0"},"install-path":"..\/php-http\/discovery"},{"name":"php-http\/httplug","version":"2.4.1","version_normalized":"2.4.1.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/httplug.git","reference":"5cad731844891a4c282f3f3e1b582c46839d22f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/httplug\/zipball\/5cad731844891a4c282f3f3e1b582c46839d22f4","reference":"5cad731844891a4c282f3f3e1b582c46839d22f4","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/promise":"^1.1","psr\/http-client":"^1.0","psr\/http-message":"^1.0 || ^2.0"},"require-dev":{"friends-of-phpspec\/phpspec-code-coverage":"^4.1 || ^5.0 || ^6.0","phpspec\/phpspec":"^5.1 || ^6.0 || ^7.0"},"time":"2024-09-23T11:39:58+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Client\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Eric GELOEN","email":"geloen.eric@gmail.com"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/sagikazarmark.hu"}],"description":"HTTPlug, the HTTP client abstraction for PHP","homepage":"http:\/\/httplug.io","keywords":["client","http"],"support":{"issues":"https:\/\/github.com\/php-http\/httplug\/issues","source":"https:\/\/github.com\/php-http\/httplug\/tree\/2.4.1"},"install-path":"..\/php-http\/httplug"},{"name":"php-http\/message","version":"1.16.2","version_normalized":"1.16.2.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/message.git","reference":"06dd5e8562f84e641bf929bfe699ee0f5ce8080a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/message\/zipball\/06dd5e8562f84e641bf929bfe699ee0f5ce8080a","reference":"06dd5e8562f84e641bf929bfe699ee0f5ce8080a","shasum":""},"require":{"clue\/stream-filter":"^1.5","php":"^7.2 || ^8.0","psr\/http-message":"^1.1 || ^2.0"},"provide":{"php-http\/message-factory-implementation":"1.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.6","ext-zlib":"*","guzzlehttp\/psr7":"^1.0 || ^2.0","laminas\/laminas-diactoros":"^2.0 || ^3.0","php-http\/message-factory":"^1.0.2","phpspec\/phpspec":"^5.1 || ^6.3 || ^7.1","slim\/slim":"^3.0"},"suggest":{"ext-zlib":"Used with compressor\/decompressor streams","guzzlehttp\/psr7":"Used with Guzzle PSR-7 Factories","laminas\/laminas-diactoros":"Used with Diactoros Factories","slim\/slim":"Used with Slim Framework PSR-7 implementation"},"time":"2024-10-02T11:34:13+00:00","type":"library","installation-source":"dist","autoload":{"files":["src\/filters.php"],"psr-4":{"Http\\Message\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"HTTP Message related tools","homepage":"http:\/\/php-http.org","keywords":["http","message","psr-7"],"support":{"issues":"https:\/\/github.com\/php-http\/message\/issues","source":"https:\/\/github.com\/php-http\/message\/tree\/1.16.2"},"install-path":"..\/php-http\/message"},{"name":"php-http\/multipart-stream-builder","version":"1.4.2","version_normalized":"1.4.2.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/multipart-stream-builder.git","reference":"10086e6de6f53489cca5ecc45b6f468604d3460e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/multipart-stream-builder\/zipball\/10086e6de6f53489cca5ecc45b6f468604d3460e","reference":"10086e6de6f53489cca5ecc45b6f468604d3460e","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/discovery":"^1.15","psr\/http-factory-implementation":"^1.0"},"require-dev":{"nyholm\/psr7":"^1.0","php-http\/message":"^1.5","php-http\/message-factory":"^1.0.2","phpunit\/phpunit":"^7.5.15 || ^8.5 || ^9.3"},"time":"2024-09-04T13:22:54+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Message\\MultipartStream\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com"}],"description":"A builder class that help you create a multipart stream","homepage":"http:\/\/php-http.org","keywords":["factory","http","message","multipart stream","stream"],"support":{"issues":"https:\/\/github.com\/php-http\/multipart-stream-builder\/issues","source":"https:\/\/github.com\/php-http\/multipart-stream-builder\/tree\/1.4.2"},"install-path":"..\/php-http\/multipart-stream-builder"},{"name":"php-http\/promise","version":"1.3.1","version_normalized":"1.3.1.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/promise.git","reference":"fc85b1fba37c169a69a07ef0d5a8075770cc1f83"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/promise\/zipball\/fc85b1fba37c169a69a07ef0d5a8075770cc1f83","reference":"fc85b1fba37c169a69a07ef0d5a8075770cc1f83","shasum":""},"require":{"php":"^7.1 || ^8.0"},"require-dev":{"friends-of-phpspec\/phpspec-code-coverage":"^4.3.2 || ^6.3","phpspec\/phpspec":"^5.1.2 || ^6.2 || ^7.4"},"time":"2024-03-15T13:55:21+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Http\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Joel Wurtz","email":"joel.wurtz@gmail.com"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Promise used for asynchronous HTTP requests","homepage":"http:\/\/httplug.io","keywords":["promise"],"support":{"issues":"https:\/\/github.com\/php-http\/promise\/issues","source":"https:\/\/github.com\/php-http\/promise\/tree\/1.3.1"},"install-path":"..\/php-http\/promise"},{"name":"phpoption\/phpoption","version":"1.9.4","version_normalized":"1.9.4.0","source":{"type":"git","url":"https:\/\/github.com\/schmittjoh\/php-option.git","reference":"638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/schmittjoh\/php-option\/zipball\/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d","reference":"638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d","shasum":""},"require":{"php":"^7.2.5 || ^8.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","phpunit\/phpunit":"^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"},"time":"2025-08-21T11:53:16+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false},"branch-alias":{"dev-master":"1.9-dev"}},"installation-source":"dist","autoload":{"psr-4":{"PhpOption\\":"src\/PhpOption\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["Apache-2.0"],"authors":[{"name":"Johannes M. Schmitt","email":"schmittjoh@gmail.com","homepage":"https:\/\/github.com\/schmittjoh"},{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"}],"description":"Option Type for PHP","keywords":["language","option","php","type"],"support":{"issues":"https:\/\/github.com\/schmittjoh\/php-option\/issues","source":"https:\/\/github.com\/schmittjoh\/php-option\/tree\/1.9.4"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/phpoption\/phpoption","type":"tidelift"}],"install-path":"..\/phpoption\/phpoption"},{"name":"psr\/cache","version":"3.0.0","version_normalized":"3.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/cache.git","reference":"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/cache\/zipball\/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf","reference":"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf","shasum":""},"require":{"php":">=8.0.0"},"time":"2021-02-03T23:26:27+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":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for caching libraries","keywords":["cache","psr","psr-6"],"support":{"source":"https:\/\/github.com\/php-fig\/cache\/tree\/3.0.0"},"install-path":"..\/psr\/cache"},{"name":"psr\/container","version":"1.1.2","version_normalized":"1.1.2.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/container.git","reference":"513e0666f7216c7459170d56df27dfcefe1689ea"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/container\/zipball\/513e0666f7216c7459170d56df27dfcefe1689ea","reference":"513e0666f7216c7459170d56df27dfcefe1689ea","shasum":""},"require":{"php":">=7.4.0"},"time":"2021-11-05T16:50:12+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Psr\\Container\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common Container Interface (PHP FIG PSR-11)","homepage":"https:\/\/github.com\/php-fig\/container","keywords":["PSR-11","container","container-interface","container-interop","psr"],"support":{"issues":"https:\/\/github.com\/php-fig\/container\/issues","source":"https:\/\/github.com\/php-fig\/container\/tree\/1.1.2"},"install-path":"..\/psr\/container"},{"name":"psr\/event-dispatcher","version":"1.0.0","version_normalized":"1.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/event-dispatcher.git","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/event-dispatcher\/zipball\/dbefd12671e8a14ec7f180cab83036ed26714bb0","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0","shasum":""},"require":{"php":">=7.2.0"},"time":"2019-01-08T18:20:26+00:00","type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Psr\\EventDispatcher\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"Standard interfaces for event handling.","keywords":["events","psr","psr-14"],"support":{"issues":"https:\/\/github.com\/php-fig\/event-dispatcher\/issues","source":"https:\/\/github.com\/php-fig\/event-dispatcher\/tree\/1.0.0"},"install-path":"..\/psr\/event-dispatcher"},{"name":"psr\/http-client","version":"1.0.3","version_normalized":"1.0.3.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-client.git","reference":"bb5906edc1c324c9a05aa0873d40117941e5fa90"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-client\/zipball\/bb5906edc1c324c9a05aa0873d40117941e5fa90","reference":"bb5906edc1c324c9a05aa0873d40117941e5fa90","shasum":""},"require":{"php":"^7.0 || ^8.0","psr\/http-message":"^1.0 || ^2.0"},"time":"2023-09-23T14:17:50+00:00","type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Psr\\Http\\Client\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for HTTP clients","homepage":"https:\/\/github.com\/php-fig\/http-client","keywords":["http","http-client","psr","psr-18"],"support":{"source":"https:\/\/github.com\/php-fig\/http-client"},"install-path":"..\/psr\/http-client"},{"name":"psr\/http-factory","version":"1.1.0","version_normalized":"1.1.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-factory.git","reference":"2b4765fddfe3b508ac62f829e852b1501d3f6e8a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-factory\/zipball\/2b4765fddfe3b508ac62f829e852b1501d3f6e8a","reference":"2b4765fddfe3b508ac62f829e852b1501d3f6e8a","shasum":""},"require":{"php":">=7.1","psr\/http-message":"^1.0 || ^2.0"},"time":"2024-04-15T12:06:14+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":"https:\/\/www.php-fig.org\/"}],"description":"PSR-17: Common interfaces for PSR-7 HTTP message factories","keywords":["factory","http","message","psr","psr-17","psr-7","request","response"],"support":{"source":"https:\/\/github.com\/php-fig\/http-factory"},"install-path":"..\/psr\/http-factory"},{"name":"psr\/http-message","version":"2.0","version_normalized":"2.0.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-message.git","reference":"402d35bcb92c70c026d1a6a9883f06b2ead23d71"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-message\/zipball\/402d35bcb92c70c026d1a6a9883f06b2ead23d71","reference":"402d35bcb92c70c026d1a6a9883f06b2ead23d71","shasum":""},"require":{"php":"^7.2 || ^8.0"},"time":"2023-04-04T09:54:51+00:00","type":"library","extra":{"branch-alias":{"dev-master":"2.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":"https:\/\/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"],"support":{"source":"https:\/\/github.com\/php-fig\/http-message\/tree\/2.0"},"install-path":"..\/psr\/http-message"},{"name":"psr\/log","version":"3.0.2","version_normalized":"3.0.2.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/log.git","reference":"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/log\/zipball\/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3","reference":"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3","shasum":""},"require":{"php":">=8.0.0"},"time":"2024-09-11T13:17:53+00:00","type":"library","extra":{"branch-alias":{"dev-master":"3.x-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Psr\\Log\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/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\/3.0.2"},"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":"ramsey\/collection","version":"2.1.1","version_normalized":"2.1.1.0","source":{"type":"git","url":"https:\/\/github.com\/ramsey\/collection.git","reference":"344572933ad0181accbf4ba763e85a0306a8c5e2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ramsey\/collection\/zipball\/344572933ad0181accbf4ba763e85a0306a8c5e2","reference":"344572933ad0181accbf4ba763e85a0306a8c5e2","shasum":""},"require":{"php":"^8.1"},"require-dev":{"captainhook\/plugin-composer":"^5.3","ergebnis\/composer-normalize":"^2.45","fakerphp\/faker":"^1.24","hamcrest\/hamcrest-php":"^2.0","jangregor\/phpstan-prophecy":"^2.1","mockery\/mockery":"^1.6","php-parallel-lint\/php-console-highlighter":"^1.0","php-parallel-lint\/php-parallel-lint":"^1.4","phpspec\/prophecy-phpunit":"^2.3","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2.1","phpstan\/phpstan-mockery":"^2.0","phpstan\/phpstan-phpunit":"^2.0","phpunit\/phpunit":"^10.5","ramsey\/coding-standard":"^2.3","ramsey\/conventional-commits":"^1.6","roave\/security-advisories":"dev-latest"},"time":"2025-03-22T05:38:12+00:00","type":"library","extra":{"captainhook":{"force-install":true},"ramsey\/conventional-commits":{"configFile":"conventional-commits.json"}},"installation-source":"dist","autoload":{"psr-4":{"Ramsey\\Collection\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ben Ramsey","email":"ben@benramsey.com","homepage":"https:\/\/benramsey.com"}],"description":"A PHP library for representing and manipulating collections.","keywords":["array","collection","hash","map","queue","set"],"support":{"issues":"https:\/\/github.com\/ramsey\/collection\/issues","source":"https:\/\/github.com\/ramsey\/collection\/tree\/2.1.1"},"install-path":"..\/ramsey\/collection"},{"name":"ramsey\/uuid","version":"4.9.1","version_normalized":"4.9.1.0","source":{"type":"git","url":"https:\/\/github.com\/ramsey\/uuid.git","reference":"81f941f6f729b1e3ceea61d9d014f8b6c6800440"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ramsey\/uuid\/zipball\/81f941f6f729b1e3ceea61d9d014f8b6c6800440","reference":"81f941f6f729b1e3ceea61d9d014f8b6c6800440","shasum":""},"require":{"brick\/math":"^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14","php":"^8.0","ramsey\/collection":"^1.2 || ^2.0"},"replace":{"rhumsaa\/uuid":"self.version"},"require-dev":{"captainhook\/captainhook":"^5.25","captainhook\/plugin-composer":"^5.3","dealerdirect\/phpcodesniffer-composer-installer":"^1.0","ergebnis\/composer-normalize":"^2.47","mockery\/mockery":"^1.6","paragonie\/random-lib":"^2","php-mock\/php-mock":"^2.6","php-mock\/php-mock-mockery":"^1.5","php-parallel-lint\/php-parallel-lint":"^1.4.0","phpbench\/phpbench":"^1.2.14","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2.1","phpstan\/phpstan-mockery":"^2.0","phpstan\/phpstan-phpunit":"^2.0","phpunit\/phpunit":"^9.6","slevomat\/coding-standard":"^8.18","squizlabs\/php_codesniffer":"^3.13"},"suggest":{"ext-bcmath":"Enables faster math with arbitrary-precision integers using BCMath.","ext-gmp":"Enables faster math with arbitrary-precision integers using GMP.","ext-uuid":"Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.","paragonie\/random-lib":"Provides RandomLib for use with the RandomLibAdapter","ramsey\/uuid-doctrine":"Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."},"time":"2025-09-04T20:59:21+00:00","type":"library","extra":{"captainhook":{"force-install":true}},"installation-source":"dist","autoload":{"files":["src\/functions.php"],"psr-4":{"Ramsey\\Uuid\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"A PHP library for generating and working with universally unique identifiers (UUIDs).","keywords":["guid","identifier","uuid"],"support":{"issues":"https:\/\/github.com\/ramsey\/uuid\/issues","source":"https:\/\/github.com\/ramsey\/uuid\/tree\/4.9.1"},"install-path":"..\/ramsey\/uuid"},{"name":"ratchet\/pawl","version":"v0.4.3","version_normalized":"0.4.3.0","source":{"type":"git","url":"https:\/\/github.com\/ratchetphp\/Pawl.git","reference":"2c582373c78271de32cb04c755c4c0db7e09c9c0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ratchetphp\/Pawl\/zipball\/2c582373c78271de32cb04c755c4c0db7e09c9c0","reference":"2c582373c78271de32cb04c755c4c0db7e09c9c0","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0","guzzlehttp\/psr7":"^2.0","php":">=7.4","ratchet\/rfc6455":"^0.3.1 || ^0.4.0","react\/socket":"^1.9"},"require-dev":{"phpunit\/phpunit":"^9.3 || ^5.7 || ^4.8"},"suggest":{"reactivex\/rxphp":"~2.0"},"time":"2025-03-19T16:47:38+00:00","type":"library","installation-source":"dist","autoload":{"files":["src\/functions_include.php"],"psr-4":{"Ratchet\\Client\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Asynchronous WebSocket client","keywords":["Ratchet","async","client","websocket","websocket client"],"support":{"issues":"https:\/\/github.com\/ratchetphp\/Pawl\/issues","source":"https:\/\/github.com\/ratchetphp\/Pawl\/tree\/v0.4.3"},"install-path":"..\/ratchet\/pawl"},{"name":"ratchet\/rfc6455","version":"v0.4.0","version_normalized":"0.4.0.0","source":{"type":"git","url":"https:\/\/github.com\/ratchetphp\/RFC6455.git","reference":"859d95f85dda0912c6d5b936d036d044e3af47ef"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ratchetphp\/RFC6455\/zipball\/859d95f85dda0912c6d5b936d036d044e3af47ef","reference":"859d95f85dda0912c6d5b936d036d044e3af47ef","shasum":""},"require":{"php":">=7.4","psr\/http-factory-implementation":"^1.0","symfony\/polyfill-php80":"^1.15"},"require-dev":{"guzzlehttp\/psr7":"^2.7","phpunit\/phpunit":"^9.5","react\/socket":"^1.3"},"time":"2025-02-24T01:18:22+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Ratchet\\RFC6455\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Chris Boden","email":"cboden@gmail.com","role":"Developer"},{"name":"Matt Bonneau","role":"Developer"}],"description":"RFC6455 WebSocket protocol handler","homepage":"http:\/\/socketo.me","keywords":["WebSockets","rfc6455","websocket"],"support":{"chat":"https:\/\/gitter.im\/reactphp\/reactphp","issues":"https:\/\/github.com\/ratchetphp\/RFC6455\/issues","source":"https:\/\/github.com\/ratchetphp\/RFC6455\/tree\/v0.4.0"},"install-path":"..\/ratchet\/rfc6455"},{"name":"react\/cache","version":"v1.2.0","version_normalized":"1.2.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/cache.git","reference":"d47c472b64aa5608225f47965a484b75c7817d5b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/cache\/zipball\/d47c472b64aa5608225f47965a484b75c7817d5b","reference":"d47c472b64aa5608225f47965a484b75c7817d5b","shasum":""},"require":{"php":">=5.3.0","react\/promise":"^3.0 || ^2.0 || ^1.1"},"require-dev":{"phpunit\/phpunit":"^9.5 || ^5.7 || ^4.8.35"},"time":"2022-11-30T15:59:55+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"React\\Cache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async, Promise-based cache interface for ReactPHP","keywords":["cache","caching","promise","reactphp"],"support":{"issues":"https:\/\/github.com\/reactphp\/cache\/issues","source":"https:\/\/github.com\/reactphp\/cache\/tree\/v1.2.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/cache"},{"name":"react\/dns","version":"v1.13.0","version_normalized":"1.13.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/dns.git","reference":"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/dns\/zipball\/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5","reference":"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5","shasum":""},"require":{"php":">=5.3.0","react\/cache":"^1.0 || ^0.6 || ^0.5","react\/event-loop":"^1.2","react\/promise":"^3.2 || ^2.7 || ^1.2.1"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36","react\/async":"^4.3 || ^3 || ^2","react\/promise-timer":"^1.11"},"time":"2024-06-13T14:18:03+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"React\\Dns\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async DNS resolver for ReactPHP","keywords":["async","dns","dns-resolver","reactphp"],"support":{"issues":"https:\/\/github.com\/reactphp\/dns\/issues","source":"https:\/\/github.com\/reactphp\/dns\/tree\/v1.13.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/dns"},{"name":"react\/event-loop","version":"v1.6.0","version_normalized":"1.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/event-loop.git","reference":"ba276bda6083df7e0050fd9b33f66ad7a4ac747a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/event-loop\/zipball\/ba276bda6083df7e0050fd9b33f66ad7a4ac747a","reference":"ba276bda6083df7e0050fd9b33f66ad7a4ac747a","shasum":""},"require":{"php":">=5.3.0"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"suggest":{"ext-pcntl":"For signal handling support when using the StreamSelectLoop"},"time":"2025-11-17T20:46:25+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"React\\EventLoop\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"ReactPHP's core reactor event loop that libraries can use for evented I\/O.","keywords":["asynchronous","event-loop"],"support":{"issues":"https:\/\/github.com\/reactphp\/event-loop\/issues","source":"https:\/\/github.com\/reactphp\/event-loop\/tree\/v1.6.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/event-loop"},{"name":"react\/promise","version":"v3.3.0","version_normalized":"3.3.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/promise.git","reference":"23444f53a813a3296c1368bb104793ce8d88f04a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/promise\/zipball\/23444f53a813a3296c1368bb104793ce8d88f04a","reference":"23444f53a813a3296c1368bb104793ce8d88f04a","shasum":""},"require":{"php":">=7.1.0"},"require-dev":{"phpstan\/phpstan":"1.12.28 || 1.4.10","phpunit\/phpunit":"^9.6 || ^7.5"},"time":"2025-08-19T18:57:03+00:00","type":"library","installation-source":"dist","autoload":{"files":["src\/functions_include.php"],"psr-4":{"React\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"A lightweight implementation of CommonJS Promises\/A for PHP","keywords":["promise","promises"],"support":{"issues":"https:\/\/github.com\/reactphp\/promise\/issues","source":"https:\/\/github.com\/reactphp\/promise\/tree\/v3.3.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/promise"},{"name":"react\/socket","version":"v1.16.0","version_normalized":"1.16.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/socket.git","reference":"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/socket\/zipball\/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1","reference":"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0 || ^1.0","php":">=5.3.0","react\/dns":"^1.13","react\/event-loop":"^1.2","react\/promise":"^3.2 || ^2.6 || ^1.2.1","react\/stream":"^1.4"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36","react\/async":"^4.3 || ^3.3 || ^2","react\/promise-stream":"^1.4","react\/promise-timer":"^1.11"},"time":"2024-07-26T10:38:09+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"React\\Socket\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async, streaming plaintext TCP\/IP and secure TLS socket server and client connections for ReactPHP","keywords":["Connection","Socket","async","reactphp","stream"],"support":{"issues":"https:\/\/github.com\/reactphp\/socket\/issues","source":"https:\/\/github.com\/reactphp\/socket\/tree\/v1.16.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/socket"},{"name":"react\/stream","version":"v1.4.0","version_normalized":"1.4.0.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/stream.git","reference":"1e5b0acb8fe55143b5b426817155190eb6f5b18d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/stream\/zipball\/1e5b0acb8fe55143b5b426817155190eb6f5b18d","reference":"1e5b0acb8fe55143b5b426817155190eb6f5b18d","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0 || ^1.0","php":">=5.3.8","react\/event-loop":"^1.2"},"require-dev":{"clue\/stream-filter":"~1.2","phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"time":"2024-06-11T12:45:25+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"React\\Stream\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Event-driven readable and writable streams for non-blocking I\/O in ReactPHP","keywords":["event-driven","io","non-blocking","pipe","reactphp","readable","stream","writable"],"support":{"issues":"https:\/\/github.com\/reactphp\/stream\/issues","source":"https:\/\/github.com\/reactphp\/stream\/tree\/v1.4.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"install-path":"..\/react\/stream"},{"name":"symfony\/cache","version":"v6.4.27","version_normalized":"6.4.27.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/cache.git","reference":"3b9cf252b3bb54d5daddea5704b95ea7117b39f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/cache\/zipball\/3b9cf252b3bb54d5daddea5704b95ea7117b39f4","reference":"3b9cf252b3bb54d5daddea5704b95ea7117b39f4","shasum":""},"require":{"php":">=8.1","psr\/cache":"^2.0|^3.0","psr\/log":"^1.1|^2|^3","symfony\/cache-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3","symfony\/var-exporter":"^6.3.6|^7.0"},"conflict":{"doctrine\/dbal":"<2.13.1","symfony\/dependency-injection":"<5.4","symfony\/http-kernel":"<5.4","symfony\/var-dumper":"<5.4"},"provide":{"psr\/cache-implementation":"2.0|3.0","psr\/simple-cache-implementation":"1.0|2.0|3.0","symfony\/cache-implementation":"1.1|2.0|3.0"},"require-dev":{"cache\/integration-tests":"dev-master","doctrine\/dbal":"^2.13.1|^3|^4","predis\/predis":"^1.1|^2.0","psr\/simple-cache":"^1.0|^2.0|^3.0","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/filesystem":"^5.4|^6.0|^7.0","symfony\/http-kernel":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/var-dumper":"^5.4|^6.0|^7.0"},"time":"2025-10-17T12:08:26+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Cache\\":""},"classmap":["Traits\/ValueWrapper.php"],"exclude-from-classmap":["\/Tests\/"]},"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":"Provides extended PSR-6, PSR-16 (and tags) implementations","homepage":"https:\/\/symfony.com","keywords":["caching","psr6"],"support":{"source":"https:\/\/github.com\/symfony\/cache\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/cache"},{"name":"symfony\/cache-contracts","version":"v3.6.0","version_normalized":"3.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/cache-contracts.git","reference":"5d68a57d66910405e5c0b63d6f0af941e66fc868"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/cache-contracts\/zipball\/5d68a57d66910405e5c0b63d6f0af941e66fc868","reference":"5d68a57d66910405e5c0b63d6f0af941e66fc868","shasum":""},"require":{"php":">=8.1","psr\/cache":"^3.0"},"time":"2025-03-13T15:25:07+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Symfony\\Contracts\\Cache\\":""}},"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":"Generic abstractions related to caching","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/cache-contracts\/tree\/v3.6.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\/cache-contracts"},{"name":"symfony\/config","version":"v6.4.26","version_normalized":"6.4.26.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/config.git","reference":"f18dc5926cb203e125956987def795d052ee774e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/config\/zipball\/f18dc5926cb203e125956987def795d052ee774e","reference":"f18dc5926cb203e125956987def795d052ee774e","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/filesystem":"^5.4|^6.0|^7.0","symfony\/polyfill-ctype":"~1.8"},"conflict":{"symfony\/finder":"<5.4","symfony\/service-contracts":"<2.5"},"require-dev":{"symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/service-contracts":"^2.5|^3","symfony\/yaml":"^5.4|^6.0|^7.0"},"time":"2025-09-11T09:57:09+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Config\\":""},"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":"Helps you find, load, combine, autofill and validate configuration values of any kind","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/config\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/config"},{"name":"symfony\/console","version":"v6.4.27","version_normalized":"6.4.27.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/console.git","reference":"13d3176cf8ad8ced24202844e9f95af11e2959fc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/13d3176cf8ad8ced24202844e9f95af11e2959fc","reference":"13d3176cf8ad8ced24202844e9f95af11e2959fc","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-mbstring":"~1.0","symfony\/service-contracts":"^2.5|^3","symfony\/string":"^5.4|^6.0|^7.0"},"conflict":{"symfony\/dependency-injection":"<5.4","symfony\/dotenv":"<5.4","symfony\/event-dispatcher":"<5.4","symfony\/lock":"<5.4","symfony\/process":"<5.4"},"provide":{"psr\/log-implementation":"1.0|2.0|3.0"},"require-dev":{"psr\/log":"^1|^2|^3","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/lock":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/process":"^5.4|^6.0|^7.0","symfony\/stopwatch":"^5.4|^6.0|^7.0","symfony\/var-dumper":"^5.4|^6.0|^7.0"},"time":"2025-10-06T10:25:16+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Console\\":""},"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":"Eases the creation of beautiful and testable command line interfaces","homepage":"https:\/\/symfony.com","keywords":["cli","command-line","console","terminal"],"support":{"source":"https:\/\/github.com\/symfony\/console\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/console"},{"name":"symfony\/dependency-injection","version":"v6.4.26","version_normalized":"6.4.26.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dependency-injection.git","reference":"5f311eaf0b321f8ec640f6bae12da43a14026898"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dependency-injection\/zipball\/5f311eaf0b321f8ec640f6bae12da43a14026898","reference":"5f311eaf0b321f8ec640f6bae12da43a14026898","shasum":""},"require":{"php":">=8.1","psr\/container":"^1.1|^2.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3.0","symfony\/var-exporter":"^6.4.20|^7.2.5"},"conflict":{"ext-psr":"<1.1|>=2","symfony\/config":"<6.1","symfony\/finder":"<5.4","symfony\/proxy-manager-bridge":"<6.3","symfony\/yaml":"<5.4"},"provide":{"psr\/container-implementation":"1.1|2.0","symfony\/service-implementation":"1.1|2.0|3.0"},"require-dev":{"symfony\/config":"^6.1|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/yaml":"^5.4|^6.0|^7.0"},"time":"2025-09-11T09:57:09+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\DependencyInjection\\":""},"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":"Allows you to standardize and centralize the way objects are constructed in your application","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/dependency-injection\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/dependency-injection"},{"name":"symfony\/deprecation-contracts","version":"v3.6.0","version_normalized":"3.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/deprecation-contracts.git","reference":"63afe740e99a13ba87ec199bb07bbdee937a5b62"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/63afe740e99a13ba87ec199bb07bbdee937a5b62","reference":"63afe740e99a13ba87ec199bb07bbdee937a5b62","shasum":""},"require":{"php":">=8.1"},"time":"2024-09-25T14:21:43+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"installation-source":"dist","autoload":{"files":["function.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":"A generic function and convention to trigger deprecation notices","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/deprecation-contracts\/tree\/v3.6.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\/deprecation-contracts"},{"name":"symfony\/dotenv","version":"v6.4.24","version_normalized":"6.4.24.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dotenv.git","reference":"234b6c602f12b00693f4b0d1054386fb30dfc8ff"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dotenv\/zipball\/234b6c602f12b00693f4b0d1054386fb30dfc8ff","reference":"234b6c602f12b00693f4b0d1054386fb30dfc8ff","shasum":""},"require":{"php":">=8.1"},"conflict":{"symfony\/console":"<5.4","symfony\/process":"<5.4"},"require-dev":{"symfony\/console":"^5.4|^6.0|^7.0","symfony\/process":"^5.4|^6.0|^7.0"},"time":"2025-07-10T08:14:14+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Dotenv\\":""},"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":"Registers environment variables from a .env file","homepage":"https:\/\/symfony.com","keywords":["dotenv","env","environment"],"support":{"source":"https:\/\/github.com\/symfony\/dotenv\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/dotenv"},{"name":"symfony\/error-handler","version":"v7.3.4","version_normalized":"7.3.4.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/error-handler.git","reference":"99f81bc944ab8e5dae4f21b4ca9972698bbad0e4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/error-handler\/zipball\/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4","reference":"99f81bc944ab8e5dae4f21b4ca9972698bbad0e4","shasum":""},"require":{"php":">=8.2","psr\/log":"^1|^2|^3","symfony\/var-dumper":"^6.4|^7.0"},"conflict":{"symfony\/deprecation-contracts":"<2.5","symfony\/http-kernel":"<6.4"},"require-dev":{"symfony\/console":"^6.4|^7.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/http-kernel":"^6.4|^7.0","symfony\/serializer":"^6.4|^7.0","symfony\/webpack-encore-bundle":"^1.0|^2.0"},"time":"2025-09-11T10:12:26+00:00","bin":["Resources\/bin\/patch-type-declarations"],"type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\ErrorHandler\\":""},"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":"Provides tools to manage errors and ease debugging PHP code","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/error-handler\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/error-handler"},{"name":"symfony\/event-dispatcher","version":"v6.4.25","version_normalized":"6.4.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/event-dispatcher.git","reference":"b0cf3162020603587363f0551cd3be43958611ff"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/event-dispatcher\/zipball\/b0cf3162020603587363f0551cd3be43958611ff","reference":"b0cf3162020603587363f0551cd3be43958611ff","shasum":""},"require":{"php":">=8.1","symfony\/event-dispatcher-contracts":"^2.5|^3"},"conflict":{"symfony\/dependency-injection":"<5.4","symfony\/service-contracts":"<2.5"},"provide":{"psr\/event-dispatcher-implementation":"1.0","symfony\/event-dispatcher-implementation":"2.0|3.0"},"require-dev":{"psr\/log":"^1|^2|^3","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/error-handler":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^5.4|^6.0|^7.0","symfony\/service-contracts":"^2.5|^3","symfony\/stopwatch":"^5.4|^6.0|^7.0"},"time":"2025-08-13T09:41:44+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\EventDispatcher\\":""},"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":"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/event-dispatcher\/tree\/v6.4.25"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/event-dispatcher"},{"name":"symfony\/event-dispatcher-contracts","version":"v3.6.0","version_normalized":"3.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/event-dispatcher-contracts.git","reference":"59eb412e93815df44f05f342958efa9f46b1e586"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/event-dispatcher-contracts\/zipball\/59eb412e93815df44f05f342958efa9f46b1e586","reference":"59eb412e93815df44f05f342958efa9f46b1e586","shasum":""},"require":{"php":">=8.1","psr\/event-dispatcher":"^1"},"time":"2024-09-25T14:21:43+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Symfony\\Contracts\\EventDispatcher\\":""}},"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":"Generic abstractions related to dispatching event","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/event-dispatcher-contracts\/tree\/v3.6.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\/event-dispatcher-contracts"},{"name":"symfony\/expression-language","version":"v6.4.24","version_normalized":"6.4.24.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/expression-language.git","reference":"1ea0adaa53539ea7e70821ae9de49ebe03ae7091"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/expression-language\/zipball\/1ea0adaa53539ea7e70821ae9de49ebe03ae7091","reference":"1ea0adaa53539ea7e70821ae9de49ebe03ae7091","shasum":""},"require":{"php":">=8.1","symfony\/cache":"^5.4|^6.0|^7.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3"},"time":"2025-07-10T08:14:14+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\ExpressionLanguage\\":""},"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":"Provides an engine that can compile and evaluate expressions","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/expression-language\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/expression-language"},{"name":"symfony\/filesystem","version":"v6.4.24","version_normalized":"6.4.24.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/filesystem.git","reference":"75ae2edb7cdcc0c53766c30b0a2512b8df574bd8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8","reference":"75ae2edb7cdcc0c53766c30b0a2512b8df574bd8","shasum":""},"require":{"php":">=8.1","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.8"},"require-dev":{"symfony\/process":"^5.4|^6.4|^7.0"},"time":"2025-07-10T08:14:14+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Filesystem\\":""},"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":"Provides basic utilities for the filesystem","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/filesystem\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/filesystem"},{"name":"symfony\/finder","version":"v6.4.27","version_normalized":"6.4.27.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/finder.git","reference":"a1b6aa435d2fba50793b994a839c32b6064f063b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/a1b6aa435d2fba50793b994a839c32b6064f063b","reference":"a1b6aa435d2fba50793b994a839c32b6064f063b","shasum":""},"require":{"php":">=8.1"},"require-dev":{"symfony\/filesystem":"^6.0|^7.0"},"time":"2025-10-15T18:32:00+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Finder\\":""},"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":"Finds files and directories via an intuitive fluent interface","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/finder\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/finder"},{"name":"symfony\/flex","version":"v2.10.0","version_normalized":"2.10.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/flex.git","reference":"9cd384775973eabbf6e8b05784dda279fc67c28d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/flex\/zipball\/9cd384775973eabbf6e8b05784dda279fc67c28d","reference":"9cd384775973eabbf6e8b05784dda279fc67c28d","shasum":""},"require":{"composer-plugin-api":"^2.1","php":">=8.1"},"conflict":{"composer\/semver":"<1.7.2","symfony\/dotenv":"<5.4"},"require-dev":{"composer\/composer":"^2.1","symfony\/dotenv":"^6.4|^7.4|^8.0","symfony\/filesystem":"^6.4|^7.4|^8.0","symfony\/phpunit-bridge":"^6.4|^7.4|^8.0","symfony\/process":"^6.4|^7.4|^8.0"},"time":"2025-11-16T09:38:19+00:00","type":"composer-plugin","extra":{"class":"Symfony\\Flex\\Flex"},"installation-source":"dist","autoload":{"psr-4":{"Symfony\\Flex\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien.potencier@gmail.com"}],"description":"Composer plugin for Symfony","support":{"issues":"https:\/\/github.com\/symfony\/flex\/issues","source":"https:\/\/github.com\/symfony\/flex\/tree\/v2.10.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/flex"},{"name":"symfony\/http-foundation","version":"v7.3.7","version_normalized":"7.3.7.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-foundation.git","reference":"db488a62f98f7a81d5746f05eea63a74e55bb7c4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-foundation\/zipball\/db488a62f98f7a81d5746f05eea63a74e55bb7c4","reference":"db488a62f98f7a81d5746f05eea63a74e55bb7c4","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3.0","symfony\/polyfill-mbstring":"~1.1","symfony\/polyfill-php83":"^1.27"},"conflict":{"doctrine\/dbal":"<3.6","symfony\/cache":"<6.4.12|>=7.0,<7.1.5"},"require-dev":{"doctrine\/dbal":"^3.6|^4","predis\/predis":"^1.1|^2.0","symfony\/cache":"^6.4.12|^7.1.5","symfony\/clock":"^6.4|^7.0","symfony\/dependency-injection":"^6.4|^7.0","symfony\/expression-language":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/mime":"^6.4|^7.0","symfony\/rate-limiter":"^6.4|^7.0"},"time":"2025-11-08T16:41:12+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\HttpFoundation\\":""},"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":"Defines an object-oriented layer for the HTTP specification","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-foundation\/tree\/v7.3.7"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/http-foundation"},{"name":"symfony\/http-kernel","version":"v6.4.27","version_normalized":"6.4.27.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-kernel.git","reference":"4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-kernel\/zipball\/4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb","reference":"4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb","shasum":""},"require":{"php":">=8.1","psr\/log":"^1|^2|^3","symfony\/deprecation-contracts":"^2.5|^3","symfony\/error-handler":"^6.4|^7.0","symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^6.4|^7.0","symfony\/polyfill-ctype":"^1.8"},"conflict":{"symfony\/browser-kit":"<5.4","symfony\/cache":"<5.4","symfony\/config":"<6.1","symfony\/console":"<5.4","symfony\/dependency-injection":"<6.4","symfony\/doctrine-bridge":"<5.4","symfony\/form":"<5.4","symfony\/http-client":"<5.4","symfony\/http-client-contracts":"<2.5","symfony\/mailer":"<5.4","symfony\/messenger":"<5.4","symfony\/translation":"<5.4","symfony\/translation-contracts":"<2.5","symfony\/twig-bridge":"<5.4","symfony\/validator":"<6.4","symfony\/var-dumper":"<6.3","twig\/twig":"<2.13"},"provide":{"psr\/log-implementation":"1.0|2.0|3.0"},"require-dev":{"psr\/cache":"^1.0|^2.0|^3.0","symfony\/browser-kit":"^5.4|^6.0|^7.0","symfony\/clock":"^6.2|^7.0","symfony\/config":"^6.1|^7.0","symfony\/console":"^5.4|^6.0|^7.0","symfony\/css-selector":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^6.4|^7.0","symfony\/dom-crawler":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/http-client-contracts":"^2.5|^3","symfony\/process":"^5.4|^6.0|^7.0","symfony\/property-access":"^5.4.5|^6.0.5|^7.0","symfony\/routing":"^5.4|^6.0|^7.0","symfony\/serializer":"^6.4.4|^7.0.4","symfony\/stopwatch":"^5.4|^6.0|^7.0","symfony\/translation":"^5.4|^6.0|^7.0","symfony\/translation-contracts":"^2.5|^3","symfony\/uid":"^5.4|^6.0|^7.0","symfony\/validator":"^6.4|^7.0","symfony\/var-dumper":"^5.4|^6.4|^7.0","symfony\/var-exporter":"^6.2|^7.0","twig\/twig":"^2.13|^3.0.4"},"time":"2025-10-28T10:06:47+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\HttpKernel\\":""},"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":"Provides a structured process for converting a Request into a Response","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-kernel\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/http-kernel"},{"name":"symfony\/options-resolver","version":"v7.3.3","version_normalized":"7.3.3.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/options-resolver.git","reference":"0ff2f5c3df08a395232bbc3c2eb7e84912df911d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/options-resolver\/zipball\/0ff2f5c3df08a395232bbc3c2eb7e84912df911d","reference":"0ff2f5c3df08a395232bbc3c2eb7e84912df911d","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3"},"time":"2025-08-05T10:16:07+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\OptionsResolver\\":""},"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":"Provides an improved replacement for the array_replace PHP function","homepage":"https:\/\/symfony.com","keywords":["config","configuration","options"],"support":{"source":"https:\/\/github.com\/symfony\/options-resolver\/tree\/v7.3.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/options-resolver"},{"name":"symfony\/polyfill-ctype","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-ctype.git","reference":"a3cc8b044a6ea513310cbd48ef7333b384945638"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-ctype\/zipball\/a3cc8b044a6ea513310cbd48ef7333b384945638","reference":"a3cc8b044a6ea513310cbd48ef7333b384945638","shasum":""},"require":{"php":">=7.2"},"provide":{"ext-ctype":"*"},"suggest":{"ext-ctype":"For best performance"},"time":"2024-09-09T11:45:10+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Ctype\\":""}},"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.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-ctype"},{"name":"symfony\/polyfill-intl-grapheme","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme.git","reference":"380872130d3a5dd3ace2f4010d95125fde5d5c70"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-grapheme\/zipball\/380872130d3a5dd3ace2f4010d95125fde5d5c70","reference":"380872130d3a5dd3ace2f4010d95125fde5d5c70","shasum":""},"require":{"php":">=7.2"},"suggest":{"ext-intl":"For best performance"},"time":"2025-06-27T09:58:17+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Grapheme\\":""}},"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 grapheme_* functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","grapheme","intl","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-intl-grapheme"},{"name":"symfony\/polyfill-intl-normalizer","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-normalizer.git","reference":"3833d7255cc303546435cb650316bff708a1c75c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/3833d7255cc303546435cb650316bff708a1c75c","reference":"3833d7255cc303546435cb650316bff708a1c75c","shasum":""},"require":{"php":">=7.2"},"suggest":{"ext-intl":"For best performance"},"time":"2024-09-09T11:45:10+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Normalizer\\":""},"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.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-intl-normalizer"},{"name":"symfony\/polyfill-mbstring","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-mbstring.git","reference":"6d857f4d76bd4b343eac26d6b539585d2bc56493"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/6d857f4d76bd4b343eac26d6b539585d2bc56493","reference":"6d857f4d76bd4b343eac26d6b539585d2bc56493","shasum":""},"require":{"ext-iconv":"*","php":">=7.2"},"provide":{"ext-mbstring":"*"},"suggest":{"ext-mbstring":"For best performance"},"time":"2024-12-23T08:48:59+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Mbstring\\":""}},"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 the Mbstring extension","homepage":"https:\/\/symfony.com","keywords":["compatibility","mbstring","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-mbstring"},{"name":"symfony\/polyfill-php80","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php80.git","reference":"0cc9dd0f17f61d8131e7df6b84bd344899fe2608"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php80\/zipball\/0cc9dd0f17f61d8131e7df6b84bd344899fe2608","reference":"0cc9dd0f17f61d8131e7df6b84bd344899fe2608","shasum":""},"require":{"php":">=7.2"},"time":"2025-01-02T08:10:11+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php80\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ion Bazan","email":"ion.bazan@gmail.com"},{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php80\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-php80"},{"name":"symfony\/polyfill-php83","version":"v1.33.0","version_normalized":"1.33.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php83.git","reference":"17f6f9a6b1735c0f163024d959f700cfbc5155e5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php83\/zipball\/17f6f9a6b1735c0f163024d959f700cfbc5155e5","reference":"17f6f9a6b1735c0f163024d959f700cfbc5155e5","shasum":""},"require":{"php":">=7.2"},"time":"2025-07-08T02:45:35+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"installation-source":"dist","autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php83\\":""},"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 backporting some PHP 8.3+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php83\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/polyfill-php83"},{"name":"symfony\/process","version":"v6.4.26","version_normalized":"6.4.26.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/process.git","reference":"48bad913268c8cafabbf7034b39c8bb24fbc5ab8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/48bad913268c8cafabbf7034b39c8bb24fbc5ab8","reference":"48bad913268c8cafabbf7034b39c8bb24fbc5ab8","shasum":""},"require":{"php":">=8.1"},"time":"2025-09-11T09:57:09+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Process\\":""},"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":"Executes commands in sub-processes","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/process\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/process"},{"name":"symfony\/service-contracts","version":"v3.6.0","version_normalized":"3.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/service-contracts.git","reference":"f021b05a130d35510bd6b25fe9053c2a8a15d5d4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/f021b05a130d35510bd6b25fe9053c2a8a15d5d4","reference":"f021b05a130d35510bd6b25fe9053c2a8a15d5d4","shasum":""},"require":{"php":">=8.1","psr\/container":"^1.1|^2.0","symfony\/deprecation-contracts":"^2.5|^3"},"conflict":{"ext-psr":"<1.1|>=2"},"time":"2025-04-25T09:37:31+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Symfony\\Contracts\\Service\\":""},"exclude-from-classmap":["\/Test\/"]},"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":"Generic abstractions related to writing services","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.6.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\/service-contracts"},{"name":"symfony\/string","version":"v7.3.4","version_normalized":"7.3.4.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/string.git","reference":"f96476035142921000338bad71e5247fbc138872"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/string\/zipball\/f96476035142921000338bad71e5247fbc138872","reference":"f96476035142921000338bad71e5247fbc138872","shasum":""},"require":{"php":">=8.2","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-intl-grapheme":"~1.0","symfony\/polyfill-intl-normalizer":"~1.0","symfony\/polyfill-mbstring":"~1.0"},"conflict":{"symfony\/translation-contracts":"<2.5"},"require-dev":{"symfony\/emoji":"^7.1","symfony\/http-client":"^6.4|^7.0","symfony\/intl":"^6.4|^7.0","symfony\/translation-contracts":"^2.5|^3.0","symfony\/var-exporter":"^6.4|^7.0"},"time":"2025-09-11T14:36:48+00:00","type":"library","installation-source":"dist","autoload":{"files":["Resources\/functions.php"],"psr-4":{"Symfony\\Component\\String\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way","homepage":"https:\/\/symfony.com","keywords":["grapheme","i18n","string","unicode","utf-8","utf8"],"support":{"source":"https:\/\/github.com\/symfony\/string\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/string"},{"name":"symfony\/translation-contracts","version":"v3.6.0","version_normalized":"3.6.0.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/translation-contracts.git","reference":"df210c7a2573f1913b2d17cc95f90f53a73d8f7d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/translation-contracts\/zipball\/df210c7a2573f1913b2d17cc95f90f53a73d8f7d","reference":"df210c7a2573f1913b2d17cc95f90f53a73d8f7d","shasum":""},"require":{"php":">=8.1"},"time":"2024-09-27T08:32:26+00:00","type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Symfony\\Contracts\\Translation\\":""},"exclude-from-classmap":["\/Test\/"]},"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":"Generic abstractions related to translation","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/translation-contracts\/tree\/v3.6.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\/translation-contracts"},{"name":"symfony\/validator","version":"v6.4.27","version_normalized":"6.4.27.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/validator.git","reference":"60dd71e219cd3d76fde906eb6b6c1271db628f5b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/validator\/zipball\/60dd71e219cd3d76fde906eb6b6c1271db628f5b","reference":"60dd71e219cd3d76fde906eb6b6c1271db628f5b","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php83":"^1.27","symfony\/translation-contracts":"^2.5|^3"},"conflict":{"doctrine\/annotations":"<1.13","doctrine\/lexer":"<1.1","symfony\/dependency-injection":"<5.4","symfony\/expression-language":"<5.4","symfony\/http-kernel":"<5.4","symfony\/intl":"<5.4","symfony\/property-info":"<5.4","symfony\/translation":"<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3","symfony\/yaml":"<5.4"},"require-dev":{"doctrine\/annotations":"^1.13|^2","egulias\/email-validator":"^2.1.10|^3|^4","symfony\/cache":"^5.4|^6.0|^7.0","symfony\/config":"^5.4|^6.0|^7.0","symfony\/console":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/http-client":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^5.4|^6.0|^7.0","symfony\/http-kernel":"^5.4|^6.0|^7.0","symfony\/intl":"^5.4|^6.0|^7.0","symfony\/mime":"^5.4|^6.0|^7.0","symfony\/property-access":"^5.4|^6.0|^7.0","symfony\/property-info":"^5.4|^6.0|^7.0","symfony\/translation":"^5.4.35|~6.3.12|^6.4.3|^7.0.3","symfony\/yaml":"^5.4|^6.0|^7.0"},"time":"2025-10-23T19:49:35+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\Validator\\":""},"exclude-from-classmap":["\/Tests\/","\/Resources\/bin\/"]},"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":"Provides tools to validate values","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/validator\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/validator"},{"name":"symfony\/var-dumper","version":"v7.3.5","version_normalized":"7.3.5.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-dumper.git","reference":"476c4ae17f43a9a36650c69879dcf5b1e6ae724d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-dumper\/zipball\/476c4ae17f43a9a36650c69879dcf5b1e6ae724d","reference":"476c4ae17f43a9a36650c69879dcf5b1e6ae724d","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-mbstring":"~1.0"},"conflict":{"symfony\/console":"<6.4"},"require-dev":{"symfony\/console":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/process":"^6.4|^7.0","symfony\/uid":"^6.4|^7.0","twig\/twig":"^3.12"},"time":"2025-09-27T09:00:46+00:00","bin":["Resources\/bin\/var-dump-server"],"type":"library","installation-source":"dist","autoload":{"files":["Resources\/functions\/dump.php"],"psr-4":{"Symfony\\Component\\VarDumper\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Provides mechanisms for walking through any arbitrary PHP variable","homepage":"https:\/\/symfony.com","keywords":["debug","dump"],"support":{"source":"https:\/\/github.com\/symfony\/var-dumper\/tree\/v7.3.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/var-dumper"},{"name":"symfony\/var-exporter","version":"v7.3.4","version_normalized":"7.3.4.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-exporter.git","reference":"0f020b544a30a7fe8ba972e53ee48a74c0bc87f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-exporter\/zipball\/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4","reference":"0f020b544a30a7fe8ba972e53ee48a74c0bc87f4","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3"},"require-dev":{"symfony\/property-access":"^6.4|^7.0","symfony\/serializer":"^6.4|^7.0","symfony\/var-dumper":"^6.4|^7.0"},"time":"2025-09-11T10:12:26+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Symfony\\Component\\VarExporter\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Allows exporting any serializable PHP data structure to plain PHP code","homepage":"https:\/\/symfony.com","keywords":["clone","construct","export","hydrate","instantiate","lazy-loading","proxy","serialize"],"support":{"source":"https:\/\/github.com\/symfony\/var-exporter\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/var-exporter"},{"name":"symfony\/yaml","version":"v6.4.26","version_normalized":"6.4.26.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/yaml.git","reference":"0fc8b966fd0dcaab544ae59bfc3a433f048c17b0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/0fc8b966fd0dcaab544ae59bfc3a433f048c17b0","reference":"0fc8b966fd0dcaab544ae59bfc3a433f048c17b0","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-ctype":"^1.8"},"conflict":{"symfony\/console":"<5.4"},"require-dev":{"symfony\/console":"^5.4|^6.0|^7.0"},"time":"2025-09-26T15:07:38+00:00","bin":["Resources\/bin\/yaml-lint"],"type":"library","installation-source":"dist","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":"Loads and dumps YAML files","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/yaml\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"install-path":"..\/symfony\/yaml"},{"name":"thecodingmachine\/safe","version":"v3.0.2","version_normalized":"3.0.2.0","source":{"type":"git","url":"https:\/\/github.com\/thecodingmachine\/safe.git","reference":"22ffad3248982a784f9870a37aeb2e522bd19645"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thecodingmachine\/safe\/zipball\/22ffad3248982a784f9870a37aeb2e522bd19645","reference":"22ffad3248982a784f9870a37aeb2e522bd19645","shasum":""},"require":{"php":"^8.1"},"require-dev":{"php-parallel-lint\/php-parallel-lint":"^1.4","phpstan\/phpstan":"^2","phpunit\/phpunit":"^10","squizlabs\/php_codesniffer":"^3.2"},"time":"2025-02-19T19:23:00+00:00","type":"library","installation-source":"dist","autoload":{"files":["lib\/special_cases.php","generated\/apache.php","generated\/apcu.php","generated\/array.php","generated\/bzip2.php","generated\/calendar.php","generated\/classobj.php","generated\/com.php","generated\/cubrid.php","generated\/curl.php","generated\/datetime.php","generated\/dir.php","generated\/eio.php","generated\/errorfunc.php","generated\/exec.php","generated\/fileinfo.php","generated\/filesystem.php","generated\/filter.php","generated\/fpm.php","generated\/ftp.php","generated\/funchand.php","generated\/gettext.php","generated\/gmp.php","generated\/gnupg.php","generated\/hash.php","generated\/ibase.php","generated\/ibmDb2.php","generated\/iconv.php","generated\/image.php","generated\/imap.php","generated\/info.php","generated\/inotify.php","generated\/json.php","generated\/ldap.php","generated\/libxml.php","generated\/lzf.php","generated\/mailparse.php","generated\/mbstring.php","generated\/misc.php","generated\/mysql.php","generated\/mysqli.php","generated\/network.php","generated\/oci8.php","generated\/opcache.php","generated\/openssl.php","generated\/outcontrol.php","generated\/pcntl.php","generated\/pcre.php","generated\/pgsql.php","generated\/posix.php","generated\/ps.php","generated\/pspell.php","generated\/readline.php","generated\/rnp.php","generated\/rpminfo.php","generated\/rrd.php","generated\/sem.php","generated\/session.php","generated\/shmop.php","generated\/sockets.php","generated\/sodium.php","generated\/solr.php","generated\/spl.php","generated\/sqlsrv.php","generated\/ssdeep.php","generated\/ssh2.php","generated\/stream.php","generated\/strings.php","generated\/swoole.php","generated\/uodbc.php","generated\/uopz.php","generated\/url.php","generated\/var.php","generated\/xdiff.php","generated\/xml.php","generated\/xmlrpc.php","generated\/yaml.php","generated\/yaz.php","generated\/zip.php","generated\/zlib.php"],"classmap":["lib\/DateTime.php","lib\/DateTimeImmutable.php","lib\/Exceptions\/","generated\/Exceptions\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"PHP core functions that throw exceptions instead of returning FALSE on error","support":{"issues":"https:\/\/github.com\/thecodingmachine\/safe\/issues","source":"https:\/\/github.com\/thecodingmachine\/safe\/tree\/v3.0.2"},"funding":[{"url":"https:\/\/github.com\/OskarStark","type":"github"},{"url":"https:\/\/github.com\/shish","type":"github"},{"url":"https:\/\/github.com\/staabm","type":"github"}],"install-path":"..\/thecodingmachine\/safe"},{"name":"typhonius\/acquia-logstream","version":"0.0.15","version_normalized":"0.0.15.0","source":{"type":"git","url":"https:\/\/github.com\/typhonius\/acquia-logstream.git","reference":"79565fbe10cf57f534145572a8614115111552ae"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/typhonius\/acquia-logstream\/zipball\/79565fbe10cf57f534145572a8614115111552ae","reference":"79565fbe10cf57f534145572a8614115111552ae","shasum":""},"require":{"consolidation\/self-update":"^1.2 | ^2.0 | ^3.0","php":"^7.4 | ^8.0.3 | ^8.1","ratchet\/pawl":"~0.4.3","symfony\/console":"^5 | ^6","typhonius\/acquia-php-sdk-v2":"^2 | ^3"},"require-dev":{"php-coveralls\/php-coveralls":"^2.0.0","phpstan\/phpstan":"^2.0.1","phpunit\/phpunit":"^9.4","squizlabs\/php_codesniffer":"^3.1"},"time":"2025-03-25T16:10:58+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"AcquiaLogstream\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Adam Malone","email":"adam@adammalone.net"}],"description":"PHP library to connect to Acquia Logstream service","support":{"issues":"https:\/\/github.com\/typhonius\/acquia-logstream\/issues","source":"https:\/\/github.com\/typhonius\/acquia-logstream\/tree\/0.0.15"},"funding":[{"url":"https:\/\/github.com\/typhonius","type":"github"}],"install-path":"..\/typhonius\/acquia-logstream"},{"name":"typhonius\/acquia-php-sdk-v2","version":"3.7.3","version_normalized":"3.7.3.0","source":{"type":"git","url":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2.git","reference":"eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/typhonius\/acquia-php-sdk-v2\/zipball\/eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8","reference":"eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8","shasum":""},"require":{"guzzlehttp\/guzzle":"^7.2","league\/oauth2-client":"^2.4","php":"^8.0 | ^8.1 | ^8.2","symfony\/cache":"^5 | ^6 | ^7","symfony\/filesystem":"^5.4 | ^6 | ^7"},"require-dev":{"ext-json":"*","overtrue\/phplint":"^9","php-coveralls\/php-coveralls":"^2.0.0","phpstan\/phpstan":"^1.0","phpstan\/phpstan-phpunit":"^1.0","phpunit\/phpunit":"^9","slevomat\/coding-standard":"^8.4","squizlabs\/php_codesniffer":"^3.9.1"},"time":"2025-09-08T15:28:31+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"AcquiaCloudApi\\Response\\":"src\/Response","AcquiaCloudApi\\Connector\\":"src\/Connector","AcquiaCloudApi\\Endpoints\\":"src\/Endpoints","AcquiaCloudApi\\Exception\\":"src\/Exception"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Adam Malone","email":"adam@adammalone.net"}],"description":"A PHP SDK for Acquia CloudAPI v2","support":{"issues":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2\/issues","source":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2\/tree\/3.7.3"},"funding":[{"url":"https:\/\/github.com\/typhonius","type":"github"}],"install-path":"..\/typhonius\/acquia-php-sdk-v2"},{"name":"vlucas\/phpdotenv","version":"v5.6.2","version_normalized":"5.6.2.0","source":{"type":"git","url":"https:\/\/github.com\/vlucas\/phpdotenv.git","reference":"24ac4c74f91ee2c193fa1aaa5c249cb0822809af"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/vlucas\/phpdotenv\/zipball\/24ac4c74f91ee2c193fa1aaa5c249cb0822809af","reference":"24ac4c74f91ee2c193fa1aaa5c249cb0822809af","shasum":""},"require":{"ext-pcre":"*","graham-campbell\/result-type":"^1.1.3","php":"^7.2.5 || ^8.0","phpoption\/phpoption":"^1.9.3","symfony\/polyfill-ctype":"^1.24","symfony\/polyfill-mbstring":"^1.24","symfony\/polyfill-php80":"^1.24"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","ext-filter":"*","phpunit\/phpunit":"^8.5.34 || ^9.6.13 || ^10.4.2"},"suggest":{"ext-filter":"Required to use the boolean validator."},"time":"2025-04-30T23:37:27+00:00","type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false},"branch-alias":{"dev-master":"5.6-dev"}},"installation-source":"dist","autoload":{"psr-4":{"Dotenv\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Vance Lucas","email":"vance@vancelucas.com","homepage":"https:\/\/github.com\/vlucas"}],"description":"Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.","keywords":["dotenv","env","environment"],"support":{"issues":"https:\/\/github.com\/vlucas\/phpdotenv\/issues","source":"https:\/\/github.com\/vlucas\/phpdotenv\/tree\/v5.6.2"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/vlucas\/phpdotenv","type":"tidelift"}],"install-path":"..\/vlucas\/phpdotenv"},{"name":"zumba\/amplitude-php","version":"1.0.8","version_normalized":"1.0.8.0","source":{"type":"git","url":"https:\/\/github.com\/zumba\/amplitude-php.git","reference":"5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/zumba\/amplitude-php\/zipball\/5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd","reference":"5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd","shasum":""},"require":{"ext-curl":"*","ext-json":"*","php":">=7.2","psr\/log":"^1.0 | ^2.0 | ^3.0"},"require-dev":{"php-coveralls\/php-coveralls":"^2.4","phpunit\/phpunit":"8.3.* | ^9","squizlabs\/php_codesniffer":"3.4.*"},"time":"2024-07-11T14:35:33+00:00","type":"library","installation-source":"dist","autoload":{"psr-4":{"Zumba\\Amplitude\\":".\/src\/","Zumba\\Amplitude\\Test\\":".\/test\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Zumba Fitness, LLC","homepage":"https:\/\/tech.zumba.com"},{"name":"Jonathan Foote","email":"jonathan.foote@zumba.com","role":"Developer"}],"description":"PHP SDK for Amplitude","homepage":"https:\/\/github.com\/zumba\/amplitude-php","keywords":["amplitude","analytics","sdk","tracking"],"support":{"issues":"https:\/\/github.com\/zumba\/amplitude-php\/issues","source":"https:\/\/github.com\/zumba\/amplitude-php\/tree\/1.0.8"},"install-path":"..\/zumba\/amplitude-php"}],"dev":false,"dev-package-names":[]}Copyright (C) 2015 Composer

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.
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\Constraint;

class Interval
{

private $start;

private $end;

public function __construct(Constraint $start, Constraint $end)
{
$this->start = $start;
$this->end = $end;
}




public function getStart()
{
return $this->start;
}




public function getEnd()
{
return $this->end;
}




public static function fromZero()
{
static $zero;

if (null === $zero) {
$zero = new Constraint('>=', '0.0.0.0-dev');
}

return $zero;
}




public static function untilPositiveInfinity()
{
static $positiveInfinity;

if (null === $positiveInfinity) {
$positiveInfinity = new Constraint('<', PHP_INT_MAX.'.0.0.0');
}

return $positiveInfinity;
}




public static function any()
{
return new self(self::fromZero(), self::untilPositiveInfinity());
}




public static function anyDev()
{

return array('names' => array(), 'exclude' => true);
}




public static function noDev()
{

return array('names' => array(), 'exclude' => false);
}
}
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\Constraint;
use Composer\Semver\Constraint\ConstraintInterface;




class CompilingMatcher
{
/**
@phpstan-var

*/
private static $compiledCheckerCache = array();
/**
@phpstan-var

*/
private static $resultCache = array();


private static $enabled;

/**
@phpstan-var
*/
private static $transOpInt = array(
Constraint::OP_EQ => Constraint::STR_OP_EQ,
Constraint::OP_LT => Constraint::STR_OP_LT,
Constraint::OP_LE => Constraint::STR_OP_LE,
Constraint::OP_GT => Constraint::STR_OP_GT,
Constraint::OP_GE => Constraint::STR_OP_GE,
Constraint::OP_NE => Constraint::STR_OP_NE,
);






public static function clear()
{
self::$resultCache = array();
self::$compiledCheckerCache = array();
}

/**
@phpstan-param







*/
public static function match(ConstraintInterface $constraint, $operator, $version)
{
$resultCacheKey = $operator.$constraint.';'.$version;

if (isset(self::$resultCache[$resultCacheKey])) {
return self::$resultCache[$resultCacheKey];
}

if (self::$enabled === null) {
self::$enabled = !\in_array('eval', explode(',', (string) ini_get('disable_functions')), true);
}
if (!self::$enabled) {
return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version));
}

$cacheKey = $operator.$constraint;
if (!isset(self::$compiledCheckerCache[$cacheKey])) {
$code = $constraint->compile($operator);
self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return '.$code.';};');
} else {
$function = self::$compiledCheckerCache[$cacheKey];
}

return self::$resultCache[$resultCacheKey] = $function($version, strpos($version, 'dev-') === 0);
}
}
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\Constraint;
use Composer\Semver\Constraint\ConstraintInterface;
use Composer\Semver\Constraint\MatchAllConstraint;
use Composer\Semver\Constraint\MatchNoneConstraint;
use Composer\Semver\Constraint\MultiConstraint;













class Intervals
{
/**
@phpstan-var
*/
private static $intervalsCache = array();

/**
@phpstan-var
*/
private static $opSortOrder = array(
'>=' => -3,
'<' => -2,
'>' => 2,
'<=' => 3,
);






public static function clear()
{
self::$intervalsCache = array();
}






public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint)
{
if ($constraint instanceof MatchAllConstraint) {
return true;
}

if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) {
return false;
}

$intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), true));
$candidateIntervals = self::get($candidate);
if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) {
return false;
}

foreach ($intersectionIntervals['numeric'] as $index => $interval) {
if (!isset($candidateIntervals['numeric'][$index])) {
return false;
}

if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) {
return false;
}

if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) {
return false;
}
}

if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) {
return false;
}
if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) {
return false;
}
foreach ($intersectionIntervals['branches']['names'] as $index => $name) {
if ($name !== $candidateIntervals['branches']['names'][$index]) {
return false;
}
}

return true;
}






public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b)
{
if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) {
return true;
}

if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) {
return false;
}

$intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), true), true);

return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0;
}











public static function compactConstraint(ConstraintInterface $constraint)
{
if (!$constraint instanceof MultiConstraint) {
return $constraint;
}

$intervals = self::generateIntervals($constraint);
$constraints = array();
$hasNumericMatchAll = false;

if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) {
$constraints[] = $intervals['numeric'][0]->getStart();
$hasNumericMatchAll = true;
} else {
$unEqualConstraints = array();
for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) {
$interval = $intervals['numeric'][$i];





if ($interval->getEnd()->getOperator() === '<' && $i+1 < $count) {
$nextInterval = $intervals['numeric'][$i+1];
if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') {



if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) {
$unEqualConstraints[] = $interval->getStart();
}
$unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion());
continue;
}
}

if (\count($unEqualConstraints) > 0) {

if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) {
$unEqualConstraints[] = $interval->getEnd();
}


if (\count($unEqualConstraints) > 1) {
$constraints[] = new MultiConstraint($unEqualConstraints, true);
} else {
$constraints[] = $unEqualConstraints[0];
}

$unEqualConstraints = array();
continue;
}


if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') {
$constraints[] = new Constraint('==', $interval->getStart()->getVersion());
continue;
}

if ((string) $interval->getStart() === (string) Interval::fromZero()) {
$constraints[] = $interval->getEnd();
} elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) {
$constraints[] = $interval->getStart();
} else {
$constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), true);
}
}
}

$devConstraints = array();

if (0 === \count($intervals['branches']['names'])) {
if ($intervals['branches']['exclude']) {
if ($hasNumericMatchAll) {
return new MatchAllConstraint;
}

}
} else {
foreach ($intervals['branches']['names'] as $branchName) {
if ($intervals['branches']['exclude']) {
$devConstraints[] = new Constraint('!=', $branchName);
} else {
$devConstraints[] = new Constraint('==', $branchName);
}
}



if ($intervals['branches']['exclude']) {
if (\count($constraints) > 1) {
return new MultiConstraint(array_merge(
array(new MultiConstraint($constraints, false)),
$devConstraints
), true);
}

if (\count($constraints) === 1 && (string)$constraints[0] === (string)Interval::fromZero()) {
if (\count($devConstraints) > 1) {
return new MultiConstraint($devConstraints, true);
}
return $devConstraints[0];
}

return new MultiConstraint(array_merge($constraints, $devConstraints), true);
}



$constraints = array_merge($constraints, $devConstraints);
}

if (\count($constraints) > 1) {
return new MultiConstraint($constraints, false);
}

if (\count($constraints) === 1) {
return $constraints[0];
}

return new MatchNoneConstraint;
}

/**
@phpstan-return







*/
public static function get(ConstraintInterface $constraint)
{
$key = (string) $constraint;

if (!isset(self::$intervalsCache[$key])) {
self::$intervalsCache[$key] = self::generateIntervals($constraint);
}

return self::$intervalsCache[$key];
}

/**
@phpstan-return


*/
private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = false)
{
if ($constraint instanceof MatchAllConstraint) {
return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev());
}

if ($constraint instanceof MatchNoneConstraint) {
return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => false));
}

if ($constraint instanceof Constraint) {
return self::generateSingleConstraintIntervals($constraint);
}

if (!$constraint instanceof MultiConstraint) {
throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got '.\get_class($constraint).'.');
}

$constraints = $constraint->getConstraints();

$numericGroups = array();
$constraintBranches = array();
foreach ($constraints as $c) {
$res = self::get($c);
$numericGroups[] = $res['numeric'];
$constraintBranches[] = $res['branches'];
}

if ($constraint->isDisjunctive()) {
$branches = Interval::noDev();
foreach ($constraintBranches as $b) {
if ($b['exclude']) {
if ($branches['exclude']) {


$branches['names'] = array_intersect($branches['names'], $b['names']);
} else {


$branches['exclude'] = true;
$branches['names'] = array_diff($b['names'], $branches['names']);
}
} else {
if ($branches['exclude']) {


$branches['names'] = array_diff($branches['names'], $b['names']);
} else {


$branches['names'] = array_merge($branches['names'], $b['names']);
}
}
}
} else {
$branches = Interval::anyDev();
foreach ($constraintBranches as $b) {
if ($b['exclude']) {
if ($branches['exclude']) {


$branches['names'] = array_merge($branches['names'], $b['names']);
} else {


$branches['names'] = array_diff($branches['names'], $b['names']);
}
} else {
if ($branches['exclude']) {


$branches['names'] = array_diff($b['names'], $branches['names']);
$branches['exclude'] = false;
} else {


$branches['names'] = array_intersect($branches['names'], $b['names']);
}
}
}
}

$branches['names'] = array_unique($branches['names']);

if (\count($numericGroups) === 1) {
return array('numeric' => $numericGroups[0], 'branches' => $branches);
}

$borders = array();
foreach ($numericGroups as $group) {
foreach ($group as $interval) {
$borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start');
$borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end');
}
}

$opSortOrder = self::$opSortOrder;
usort($borders, function ($a, $b) use ($opSortOrder) {
$order = version_compare($a['version'], $b['version']);
if ($order === 0) {
return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']];
}

return $order;
});

$activeIntervals = 0;
$intervals = array();
$index = 0;
$activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1;
$start = null;
foreach ($borders as $border) {
if ($border['side'] === 'start') {
$activeIntervals++;
} else {
$activeIntervals--;
}
if (!$start && $activeIntervals >= $activationThreshold) {
$start = new Constraint($border['operator'], $border['version']);
} elseif ($start && $activeIntervals < $activationThreshold) {

if (
version_compare($start->getVersion(), $border['version'], '=')
&& (
($start->getOperator() === '>' && $border['operator'] === '<=')
|| ($start->getOperator() === '>=' && $border['operator'] === '<')
)
) {
unset($intervals[$index]);
} else {
$intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version']));
$index++;

if ($stopOnFirstValidInterval) {
break;
}
}

$start = null;
}
}

return array('numeric' => $intervals, 'branches' => $branches);
}

/**
@phpstan-return
*/
private static function generateSingleConstraintIntervals(Constraint $constraint)
{
$op = $constraint->getOperator();


if (strpos($constraint->getVersion(), 'dev-') === 0) {
$intervals = array();
$branches = array('names' => array(), 'exclude' => false);


if ($op === '!=') {
$intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity());
$branches = array('names' => array($constraint->getVersion()), 'exclude' => true);
} elseif ($op === '==') {
$branches['names'][] = $constraint->getVersion();
}

return array(
'numeric' => $intervals,
'branches' => $branches,
);
}

if ($op[0] === '>') { 
return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev());
}
if ($op[0] === '<') { 
return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev());
}
if ($op === '!=') {

return array('numeric' => array(
new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())),
new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity()),
), 'branches' => Interval::anyDev());
}


return array('numeric' => array(
new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion())),
), 'branches' => Interval::noDev());
}
}
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\ConstraintInterface;
use Composer\Semver\Constraint\MatchAllConstraint;
use Composer\Semver\Constraint\MultiConstraint;
use Composer\Semver\Constraint\Constraint;






class VersionParser
{













private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?';


private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev';

/**
@phpstan-return





*/
public static function parseStability($version)
{
$version = (string) preg_replace('{#.+$}', '', (string) $version);

if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) {
return 'dev';
}

preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match);

if (!empty($match[3])) {
return 'dev';
}

if (!empty($match[1])) {
if ('beta' === $match[1] || 'b' === $match[1]) {
return 'beta';
}
if ('alpha' === $match[1] || 'a' === $match[1]) {
return 'alpha';
}
if ('rc' === $match[1]) {
return 'RC';
}
}

return 'stable';
}

/**
@phpstan-return



*/
public static function normalizeStability($stability)
{
$stability = strtolower((string) $stability);

if (!in_array($stability, array('stable', 'rc', 'beta', 'alpha', 'dev'), true)) {
throw new \InvalidArgumentException('Invalid stability string "'.$stability.'", expected one of stable, RC, beta, alpha or dev');
}

return $stability === 'rc' ? 'RC' : $stability;
}











public function normalize($version, $fullVersion = null)
{
$version = trim((string) $version);
$origVersion = $version;
if (null === $fullVersion) {
$fullVersion = $version;
}


if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) {
$version = $match[1];
}


if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) {
$version = substr($version, 0, strlen($version) - strlen($match[0]));
}


if (\in_array($version, array('master', 'trunk', 'default'), true)) {
$version = 'dev-' . $version;
}


if (stripos($version, 'dev-') === 0) {
return 'dev-' . substr($version, 4);
}


if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) {
$version = $match[1];
}


if (preg_match('{^v?(\d{1,5}+)(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) {
$version = $matches[1]
. (!empty($matches[2]) ? $matches[2] : '.0')
. (!empty($matches[3]) ? $matches[3] : '.0')
. (!empty($matches[4]) ? $matches[4] : '.0');
$index = 5;

} elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) {
$version = (string) preg_replace('{\D}', '.', $matches[1]);
$index = 2;
}


if (isset($index)) {
if (!empty($matches[$index])) {
if ('stable' === $matches[$index]) {
return $version;
}
$version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : '');
}

if (!empty($matches[$index + 2])) {
$version .= '-dev';
}

return $version;
}


if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) {
try {
$normalized = $this->normalizeBranch($match[1]);



if (strpos($normalized, 'dev-') === false) {
return $normalized;
}
} catch (\Exception $e) {
}
}

$extraMessage = '';
if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))?$}', $fullVersion)) {
$extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version';
} elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:'.self::$stabilitiesRegex.'))? +as +}', $fullVersion)) {
$extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-';
}

throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage);
}








public function parseNumericAliasPrefix($branch)
{
if (preg_match('{^(?P<version>(\d++\\.)*\d++)(?:\.x)?-dev$}i', (string) $branch, $matches)) {
return $matches['version'] . '.';
}

return false;
}








public function normalizeBranch($name)
{
$name = trim((string) $name);

if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) {
$version = '';
for ($i = 1; $i < 5; ++$i) {
$version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x';
}

return str_replace('x', '9999999', $version) . '-dev';
}

return 'dev-' . $name;
}










public function normalizeDefaultBranch($name)
{
if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') {
return '9999999-dev';
}

return (string) $name;
}








public function parseConstraints($constraints)
{
$prettyConstraint = (string) $constraints;

$orConstraints = preg_split('{\s*\|\|?\s*}', trim((string) $constraints));
if (false === $orConstraints) {
throw new \RuntimeException('Failed to preg_split string: '.$constraints);
}
$orGroups = array();

foreach ($orConstraints as $orConstraint) {
$andConstraints = preg_split('{(?<!^|as|[=>< ,]) *(?<!-)[, ](?!-) *(?!,|as|$)}', $orConstraint);
if (false === $andConstraints) {
throw new \RuntimeException('Failed to preg_split string: '.$orConstraint);
}
if (\count($andConstraints) > 1) {
$constraintObjects = array();
foreach ($andConstraints as $andConstraint) {
foreach ($this->parseConstraint($andConstraint) as $parsedAndConstraint) {
$constraintObjects[] = $parsedAndConstraint;
}
}
} else {
$constraintObjects = $this->parseConstraint($andConstraints[0]);
}

if (1 === \count($constraintObjects)) {
$constraint = $constraintObjects[0];
} else {
$constraint = new MultiConstraint($constraintObjects);
}

$orGroups[] = $constraint;
}

$parsedConstraint = MultiConstraint::create($orGroups, false);

$parsedConstraint->setPrettyString($prettyConstraint);

return $parsedConstraint;
}

/**
@phpstan-return






*/
private function parseConstraint($constraint)
{

if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $constraint, $match)) {
$constraint = $match[1];
}


if (preg_match('{^([^,\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) {
$constraint = '' !== $match[1] ? $match[1] : '*';
if ($match[2] !== 'stable') {
$stabilityModifier = $match[2];
}
}


if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraint, $match)) {
$constraint = $match[1];
}

if (preg_match('{^(v)?[xX*](\.[xX*])*$}i', $constraint, $match)) {
if (!empty($match[1]) || !empty($match[2])) {
return array(new Constraint('>=', '0.0.0.0-dev'));
}

return array(new MatchAllConstraint());
}

$versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?(?:' . self::$modifierRegex . '|\.([xX*][.-]?dev))(?:\+[^\s]+)?';






if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) {
if (strpos($constraint, '~>') === 0) {
throw new \UnexpectedValueException(
'Could not parse version constraint ' . $constraint . ': ' .
'Invalid operator "~>", you probably meant to use the "~" operator'
);
}


if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) {
$position = 4;
} elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) {
$position = 3;
} elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) {
$position = 2;
} else {
$position = 1;
}


if (!empty($matches[8])) {
$position++;
}


$stabilitySuffix = '';
if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) {
$stabilitySuffix .= '-dev';
}

$lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1));
$lowerBound = new Constraint('>=', $lowVersion);



$highPosition = max(1, $position - 1);
$highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev';
$upperBound = new Constraint('<', $highVersion);

return array(
$lowerBound,
$upperBound,
);
}






if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) {

if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) {
$position = 1;
} elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) {
$position = 2;
} else {
$position = 3;
}


$stabilitySuffix = '';
if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) {
$stabilitySuffix .= '-dev';
}

$lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1));
$lowerBound = new Constraint('>=', $lowVersion);



$highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';
$upperBound = new Constraint('<', $highVersion);

return array(
$lowerBound,
$upperBound,
);
}





if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) {
if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) {
$position = 3;
} elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) {
$position = 2;
} else {
$position = 1;
}

$lowVersion = $this->manipulateVersionString($matches, $position) . '-dev';
$highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';

if ($lowVersion === '0.0.0.0-dev') {
return array(new Constraint('<', $highVersion));
}

return array(
new Constraint('>=', $lowVersion),
new Constraint('<', $highVersion),
);
}







if (preg_match('{^(?P<from>' . $versionRegex . ') +- +(?P<to>' . $versionRegex . ')($)}i', $constraint, $matches)) {

$lowStabilitySuffix = '';
if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) {
$lowStabilitySuffix = '-dev';
}

$lowVersion = $this->normalize($matches['from']);
$lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix);

$empty = function ($x) {
return ($x === 0 || $x === '0') ? false : empty($x);
};

if ((!$empty($matches[12]) && !$empty($matches[13])) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) {
$highVersion = $this->normalize($matches['to']);
$upperBound = new Constraint('<=', $highVersion);
} else {
$highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]);


$this->normalize($matches['to']);

$highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev';
$upperBound = new Constraint('<', $highVersion);
}

return array(
$lowerBound,
$upperBound,
);
}


if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
try {
try {
$version = $this->normalize($matches[2]);
} catch (\UnexpectedValueException $e) {


if (substr($matches[2], -4) === '-dev' && preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) {
$version = $this->normalize('dev-'.substr($matches[2], 0, -4));
} else {
throw $e;
}
}

$op = $matches[1] ?: '=';

if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') {
$version .= '-' . $stabilityModifier;
} elseif ('<' === $op || '>=' === $op) {
if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) {
if (strpos($matches[2], 'dev-') !== 0) {
$version .= '-dev';
}
}
}

return array(new Constraint($matches[1] ?: '=', $version));
} catch (\Exception $e) {
}
}

$message = 'Could not parse version constraint ' . $constraint;
if (isset($e)) {
$message .= ': ' . $e->getMessage();
}

throw new \UnexpectedValueException($message);
}

/**
@phpstan-param











*/
private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0')
{
for ($i = 4; $i > 0; --$i) {
if ($i > $position) {
$matches[$i] = $pad;
} elseif ($i === $position && $increment) {
$matches[$i] += $increment;

if ($matches[$i] < 0) {
$matches[$i] = $pad;
--$position;


if ($i === 1) {
return null;
}
}
}
}

return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4];
}








private function expandStability($stability)
{
$stability = strtolower($stability);

switch ($stability) {
case 'a':
return 'alpha';
case 'b':
return 'beta';
case 'p':
case 'pl':
return 'patch';
case 'rc':
return 'RC';
default:
return $stability;
}
}
}
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\Constraint;

class Semver
{
const SORT_ASC = 1;
const SORT_DESC = -1;


private static $versionParser;









public static function satisfies($version, $constraints)
{
if (null === self::$versionParser) {
self::$versionParser = new VersionParser();
}

$versionParser = self::$versionParser;
$provider = new Constraint('==', $versionParser->normalize($version));
$parsedConstraints = $versionParser->parseConstraints($constraints);

return $parsedConstraints->matches($provider);
}









public static function satisfiedBy(array $versions, $constraints)
{
$versions = array_filter($versions, function ($version) use ($constraints) {
return Semver::satisfies($version, $constraints);
});

return array_values($versions);
}








public static function sort(array $versions)
{
return self::usort($versions, self::SORT_ASC);
}








public static function rsort(array $versions)
{
return self::usort($versions, self::SORT_DESC);
}







private static function usort(array $versions, $direction)
{
if (null === self::$versionParser) {
self::$versionParser = new VersionParser();
}

$versionParser = self::$versionParser;
$normalized = array();



foreach ($versions as $key => $version) {
$normalizedVersion = $versionParser->normalize($version);
$normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion);
$normalized[] = array($normalizedVersion, $key);
}

usort($normalized, function (array $left, array $right) use ($direction) {
if ($left[0] === $right[0]) {
return 0;
}

if (Comparator::lessThan($left[0], $right[0])) {
return -$direction;
}

return $direction;
});


$sorted = array();
foreach ($normalized as $item) {
$sorted[] = $versions[$item[1]];
}

return $sorted;
}
}
<?php










namespace Composer\Semver;

use Composer\Semver\Constraint\Constraint;

class Comparator
{








public static function greaterThan($version1, $version2)
{
return self::compare($version1, '>', $version2);
}









public static function greaterThanOrEqualTo($version1, $version2)
{
return self::compare($version1, '>=', $version2);
}









public static function lessThan($version1, $version2)
{
return self::compare($version1, '<', $version2);
}









public static function lessThanOrEqualTo($version1, $version2)
{
return self::compare($version1, '<=', $version2);
}









public static function equalTo($version1, $version2)
{
return self::compare($version1, '==', $version2);
}









public static function notEqualTo($version1, $version2)
{
return self::compare($version1, '!=', $version2);
}

/**
@phpstan-param








*/
public static function compare($version1, $operator, $version2)
{
$constraint = new Constraint($operator, $version2);

return $constraint->matchSpecific(new Constraint('==', $version1), true);
}
}
<?php










namespace Composer\Semver\Constraint;




class Constraint implements ConstraintInterface
{

const OP_EQ = 0;
const OP_LT = 1;
const OP_LE = 2;
const OP_GT = 3;
const OP_GE = 4;
const OP_NE = 5;


const STR_OP_EQ = '==';
const STR_OP_EQ_ALT = '=';
const STR_OP_LT = '<';
const STR_OP_LE = '<=';
const STR_OP_GT = '>';
const STR_OP_GE = '>=';
const STR_OP_NE = '!=';
const STR_OP_NE_ALT = '<>';

/**
@phpstan-var



*/
private static $transOpStr = array(
'=' => self::OP_EQ,
'==' => self::OP_EQ,
'<' => self::OP_LT,
'<=' => self::OP_LE,
'>' => self::OP_GT,
'>=' => self::OP_GE,
'<>' => self::OP_NE,
'!=' => self::OP_NE,
);

/**
@phpstan-var



*/
private static $transOpInt = array(
self::OP_EQ => '==',
self::OP_LT => '<',
self::OP_LE => '<=',
self::OP_GT => '>',
self::OP_GE => '>=',
self::OP_NE => '!=',
);

/**
@phpstan-var

*/
protected $operator;


protected $version;


protected $prettyString;


protected $lowerBound;


protected $upperBound;

/**
@phpstan-param







*/
public function __construct($operator, $version)
{
if (!isset(self::$transOpStr[$operator])) {
throw new \InvalidArgumentException(sprintf(
'Invalid operator "%s" given, expected one of: %s',
$operator,
implode(', ', self::getSupportedOperators())
));
}

$this->operator = self::$transOpStr[$operator];
$this->version = $version;
}




public function getVersion()
{
return $this->version;
}

/**
@phpstan-return


*/
public function getOperator()
{
return self::$transOpInt[$this->operator];
}






public function matches(ConstraintInterface $provider)
{
if ($provider instanceof self) {
return $this->matchSpecific($provider);
}


return $provider->matches($this);
}




public function setPrettyString($prettyString)
{
$this->prettyString = $prettyString;
}




public function getPrettyString()
{
if ($this->prettyString) {
return $this->prettyString;
}

return $this->__toString();
}

/**
@phpstan-return




*/
public static function getSupportedOperators()
{
return array_keys(self::$transOpStr);
}

/**
@phpstan-param
@phpstan-return



*/
public static function getOperatorConstant($operator)
{
return self::$transOpStr[$operator];
}

/**
@phpstan-param









*/
public function versionCompare($a, $b, $operator, $compareBranches = false)
{
if (!isset(self::$transOpStr[$operator])) {
throw new \InvalidArgumentException(sprintf(
'Invalid operator "%s" given, expected one of: %s',
$operator,
implode(', ', self::getSupportedOperators())
));
}

$aIsBranch = strpos($a, 'dev-') === 0;
$bIsBranch = strpos($b, 'dev-') === 0;

if ($operator === '!=' && ($aIsBranch || $bIsBranch)) {
return $a !== $b;
}

if ($aIsBranch && $bIsBranch) {
return $operator === '==' && $a === $b;
}


if (!$compareBranches && ($aIsBranch || $bIsBranch)) {
return false;
}

return \version_compare($a, $b, $operator);
}




public function compile($otherOperator)
{
if (strpos($this->version, 'dev-') === 0) {
if (self::OP_EQ === $this->operator) {
if (self::OP_EQ === $otherOperator) {
return sprintf('$b && $v === %s', \var_export($this->version, true));
}
if (self::OP_NE === $otherOperator) {
return sprintf('!$b || $v !== %s', \var_export($this->version, true));
}
return 'false';
}

if (self::OP_NE === $this->operator) {
if (self::OP_EQ === $otherOperator) {
return sprintf('!$b || $v !== %s', \var_export($this->version, true));
}
if (self::OP_NE === $otherOperator) {
return 'true';
}
return '!$b';
}

return 'false';
}

if (self::OP_EQ === $this->operator) {
if (self::OP_EQ === $otherOperator) {
return sprintf('\version_compare($v, %s, \'==\')', \var_export($this->version, true));
}
if (self::OP_NE === $otherOperator) {
return sprintf('$b || \version_compare($v, %s, \'!=\')', \var_export($this->version, true));
}

return sprintf('!$b && \version_compare(%s, $v, \'%s\')', \var_export($this->version, true), self::$transOpInt[$otherOperator]);
}

if (self::OP_NE === $this->operator) {
if (self::OP_EQ === $otherOperator) {
return sprintf('$b || (!$b && \version_compare($v, %s, \'!=\'))', \var_export($this->version, true));
}

if (self::OP_NE === $otherOperator) {
return 'true';
}
return '!$b';
}

if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) {
if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) {
return '!$b';
}
} else { 
if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) {
return '!$b';
}
}

if (self::OP_NE === $otherOperator) {
return 'true';
}

$codeComparison = sprintf('\version_compare($v, %s, \'%s\')', \var_export($this->version, true), self::$transOpInt[$this->operator]);
if ($this->operator === self::OP_LE) {
if ($otherOperator === self::OP_GT) {
return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison;
}
} elseif ($this->operator === self::OP_GE) {
if ($otherOperator === self::OP_LT) {
return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, true)) . $codeComparison;
}
}

return sprintf('!$b && %s', $codeComparison);
}







public function matchSpecific(Constraint $provider, $compareBranches = false)
{
$noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]);
$providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]);

$isEqualOp = self::OP_EQ === $this->operator;
$isNonEqualOp = self::OP_NE === $this->operator;
$isProviderEqualOp = self::OP_EQ === $provider->operator;
$isProviderNonEqualOp = self::OP_NE === $provider->operator;



if ($isNonEqualOp || $isProviderNonEqualOp) {
if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && strpos($provider->version, 'dev-') === 0) {
return false;
}

if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && strpos($this->version, 'dev-') === 0) {
return false;
}

if (!$isEqualOp && !$isProviderEqualOp) {
return true;
}
return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches);
}



if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) {
return !(strpos($this->version, 'dev-') === 0 || strpos($provider->version, 'dev-') === 0);
}

$version1 = $isEqualOp ? $this->version : $provider->version;
$version2 = $isEqualOp ? $provider->version : $this->version;
$operator = $isEqualOp ? $provider->operator : $this->operator;

if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) {



return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp
&& self::$transOpInt[$this->operator] !== $noEqualOp
&& \version_compare($provider->version, $this->version, '=='));
}

return false;
}




public function __toString()
{
return self::$transOpInt[$this->operator] . ' ' . $this->version;
}




public function getLowerBound()
{
$this->extractBounds();

return $this->lowerBound;
}




public function getUpperBound()
{
$this->extractBounds();

return $this->upperBound;
}




private function extractBounds()
{
if (null !== $this->lowerBound) {
return;
}


if (strpos($this->version, 'dev-') === 0) {
$this->lowerBound = Bound::zero();
$this->upperBound = Bound::positiveInfinity();

return;
}

switch ($this->operator) {
case self::OP_EQ:
$this->lowerBound = new Bound($this->version, true);
$this->upperBound = new Bound($this->version, true);
break;
case self::OP_LT:
$this->lowerBound = Bound::zero();
$this->upperBound = new Bound($this->version, false);
break;
case self::OP_LE:
$this->lowerBound = Bound::zero();
$this->upperBound = new Bound($this->version, true);
break;
case self::OP_GT:
$this->lowerBound = new Bound($this->version, false);
$this->upperBound = Bound::positiveInfinity();
break;
case self::OP_GE:
$this->lowerBound = new Bound($this->version, true);
$this->upperBound = Bound::positiveInfinity();
break;
case self::OP_NE:
$this->lowerBound = Bound::zero();
$this->upperBound = Bound::positiveInfinity();
break;
}
}
}
<?php










namespace Composer\Semver\Constraint;

class Bound
{



private $version;




private $isInclusive;





public function __construct($version, $isInclusive)
{
$this->version = $version;
$this->isInclusive = $isInclusive;
}




public function getVersion()
{
return $this->version;
}




public function isInclusive()
{
return $this->isInclusive;
}




public function isZero()
{
return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive();
}




public function isPositiveInfinity()
{
return $this->getVersion() === PHP_INT_MAX.'.0.0.0' && !$this->isInclusive();
}









public function compareTo(Bound $other, $operator)
{
if (!\in_array($operator, array('<', '>'), true)) {
throw new \InvalidArgumentException('Does not support any other operator other than > or <.');
}


if ($this == $other) {
return false;
}

$compareResult = version_compare($this->getVersion(), $other->getVersion());


if (0 !== $compareResult) {
return (('>' === $operator) ? 1 : -1) === $compareResult;
}


return '>' === $operator ? $other->isInclusive() : !$other->isInclusive();
}

public function __toString()
{
return sprintf(
'%s [%s]',
$this->getVersion(),
$this->isInclusive() ? 'inclusive' : 'exclusive'
);
}




public static function zero()
{
return new Bound('0.0.0.0-dev', true);
}




public static function positiveInfinity()
{
return new Bound(PHP_INT_MAX.'.0.0.0', false);
}
}
<?php










namespace Composer\Semver\Constraint;




class MultiConstraint implements ConstraintInterface
{
/**
@phpstan-var

*/
protected $constraints;


protected $prettyString;


protected $string;


protected $conjunctive;


protected $lowerBound;


protected $upperBound;







public function __construct(array $constraints, $conjunctive = true)
{
if (\count($constraints) < 2) {
throw new \InvalidArgumentException(
'Must provide at least two constraints for a MultiConstraint. Use '.
'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use '.
'MultiConstraint::create() which optimizes and handles those cases automatically.'
);
}

$this->constraints = $constraints;
$this->conjunctive = $conjunctive;
}




public function getConstraints()
{
return $this->constraints;
}




public function isConjunctive()
{
return $this->conjunctive;
}




public function isDisjunctive()
{
return !$this->conjunctive;
}




public function compile($otherOperator)
{
$parts = array();
foreach ($this->constraints as $constraint) {
$code = $constraint->compile($otherOperator);
if ($code === 'true') {
if (!$this->conjunctive) {
return 'true';
}
} elseif ($code === 'false') {
if ($this->conjunctive) {
return 'false';
}
} else {
$parts[] = '('.$code.')';
}
}

if (!$parts) {
return $this->conjunctive ? 'true' : 'false';
}

return $this->conjunctive ? implode('&&', $parts) : implode('||', $parts);
}






public function matches(ConstraintInterface $provider)
{
if (false === $this->conjunctive) {
foreach ($this->constraints as $constraint) {
if ($provider->matches($constraint)) {
return true;
}
}

return false;
}




if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) {
return $provider->matches($this);
}

foreach ($this->constraints as $constraint) {
if (!$provider->matches($constraint)) {
return false;
}
}

return true;
}




public function setPrettyString($prettyString)
{
$this->prettyString = $prettyString;
}




public function getPrettyString()
{
if ($this->prettyString) {
return $this->prettyString;
}

return (string) $this;
}




public function __toString()
{
if ($this->string !== null) {
return $this->string;
}

$constraints = array();
foreach ($this->constraints as $constraint) {
$constraints[] = (string) $constraint;
}

return $this->string = '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']';
}




public function getLowerBound()
{
$this->extractBounds();

if (null === $this->lowerBound) {
throw new \LogicException('extractBounds should have populated the lowerBound property');
}

return $this->lowerBound;
}




public function getUpperBound()
{
$this->extractBounds();

if (null === $this->upperBound) {
throw new \LogicException('extractBounds should have populated the upperBound property');
}

return $this->upperBound;
}












public static function create(array $constraints, $conjunctive = true)
{
if (0 === \count($constraints)) {
return new MatchAllConstraint();
}

if (1 === \count($constraints)) {
return $constraints[0];
}

$optimized = self::optimizeConstraints($constraints, $conjunctive);
if ($optimized !== null) {
list($constraints, $conjunctive) = $optimized;
if (\count($constraints) === 1) {
return $constraints[0];
}
}

return new self($constraints, $conjunctive);
}

/**
@phpstan-return




*/
private static function optimizeConstraints(array $constraints, $conjunctive)
{



if (!$conjunctive) {
$left = $constraints[0];
$mergedConstraints = array();
$optimized = false;
for ($i = 1, $l = \count($constraints); $i < $l; $i++) {
$right = $constraints[$i];
if (
$left instanceof self
&& $left->conjunctive
&& $right instanceof self
&& $right->conjunctive
&& \count($left->constraints) === 2
&& \count($right->constraints) === 2
&& ($left0 = (string) $left->constraints[0])
&& $left0[0] === '>' && $left0[1] === '='
&& ($left1 = (string) $left->constraints[1])
&& $left1[0] === '<'
&& ($right0 = (string) $right->constraints[0])
&& $right0[0] === '>' && $right0[1] === '='
&& ($right1 = (string) $right->constraints[1])
&& $right1[0] === '<'
&& substr($left1, 2) === substr($right0, 3)
) {
$optimized = true;
$left = new MultiConstraint(
array(
$left->constraints[0],
$right->constraints[1],
),
true);
} else {
$mergedConstraints[] = $left;
$left = $right;
}
}
if ($optimized) {
$mergedConstraints[] = $left;
return array($mergedConstraints, false);
}
}



return null;
}




private function extractBounds()
{
if (null !== $this->lowerBound) {
return;
}

foreach ($this->constraints as $constraint) {
if (null === $this->lowerBound || null === $this->upperBound) {
$this->lowerBound = $constraint->getLowerBound();
$this->upperBound = $constraint->getUpperBound();
continue;
}

if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) {
$this->lowerBound = $constraint->getLowerBound();
}

if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) {
$this->upperBound = $constraint->getUpperBound();
}
}
}
}
<?php










namespace Composer\Semver\Constraint;






class MatchAllConstraint implements ConstraintInterface
{

protected $prettyString;






public function matches(ConstraintInterface $provider)
{
return true;
}




public function compile($otherOperator)
{
return 'true';
}




public function setPrettyString($prettyString)
{
$this->prettyString = $prettyString;
}




public function getPrettyString()
{
if ($this->prettyString) {
return $this->prettyString;
}

return (string) $this;
}




public function __toString()
{
return '*';
}




public function getUpperBound()
{
return Bound::positiveInfinity();
}




public function getLowerBound()
{
return Bound::zero();
}
}
<?php










namespace Composer\Semver\Constraint;




class MatchNoneConstraint implements ConstraintInterface
{

protected $prettyString;






public function matches(ConstraintInterface $provider)
{
return false;
}




public function compile($otherOperator)
{
return 'false';
}




public function setPrettyString($prettyString)
{
$this->prettyString = $prettyString;
}




public function getPrettyString()
{
if ($this->prettyString) {
return $this->prettyString;
}

return (string) $this;
}




public function __toString()
{
return '[]';
}




public function getUpperBound()
{
return new Bound('0.0.0.0-dev', false);
}




public function getLowerBound()
{
return new Bound('0.0.0.0-dev', false);
}
}
<?php










namespace Composer\Semver\Constraint;







interface ConstraintInterface
{







public function matches(ConstraintInterface $provider);

/**
@phpstan-param













*/
public function compile($otherOperator);




public function getUpperBound();




public function getLowerBound();




public function getPrettyString();






public function setPrettyString($prettyString);




public function __toString();
}
The MIT License (MIT)

Copyright (c) 2015 Michael Dowling <mtdowling@gmail.com>
Copyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com>
Copyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk>
Copyright (c) 2016 Tobias Schultze <webmaster@tubo-world.de>
Copyright (c) 2016 George Mponos <gmponos@gmail.com>
Copyright (c) 2018 Tobias Nyholm <tobias.nyholm@gmail.com>

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.
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;












final class InflateStream implements StreamInterface
{
use StreamDecoratorTrait;


private $stream;

public function __construct(StreamInterface $stream)
{
$resource = StreamWrapper::getResource($stream);




stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15 + 32]);
$this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;

final class Utils
{





public static function caselessRemove(array $keys, array $data): array
{
$result = [];

foreach ($keys as &$key) {
$key = strtolower((string) $key);
}

foreach ($data as $k => $v) {
if (!in_array(strtolower((string) $k), $keys)) {
$result[$k] = $v;
}
}

return $result;
}












public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void
{
$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);
}
}
}











public static function copyToString(StreamInterface $stream, int $maxLen = -1): string
{
$buffer = '';

if ($maxLen === -1) {
while (!$stream->eof()) {
$buf = $stream->read(1048576);
if ($buf === '') {
break;
}
$buffer .= $buf;
}

return $buffer;
}

$len = 0;
while (!$stream->eof() && $len < $maxLen) {
$buf = $stream->read($maxLen - $len);
if ($buf === '') {
break;
}
$buffer .= $buf;
$len = strlen($buffer);
}

return $buffer;
}













public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string
{
$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, $rawOutput);
$stream->seek($pos);

return $out;
}



















public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface
{
if (!$changes) {
return $request;
}

$headers = $request->getHeaders();

if (!isset($changes['uri'])) {
$uri = $request->getUri();
} else {

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) {
$new = (new ServerRequest(
$changes['method'] ?? $request->getMethod(),
$uri,
$headers,
$changes['body'] ?? $request->getBody(),
$changes['version'] ?? $request->getProtocolVersion(),
$request->getServerParams()
))
->withParsedBody($request->getParsedBody())
->withQueryParams($request->getQueryParams())
->withCookieParams($request->getCookieParams())
->withUploadedFiles($request->getUploadedFiles());

foreach ($request->getAttributes() as $key => $value) {
$new = $new->withAttribute($key, $value);
}

return $new;
}

return new Request(
$changes['method'] ?? $request->getMethod(),
$uri,
$headers,
$changes['body'] ?? $request->getBody(),
$changes['version'] ?? $request->getProtocolVersion()
);
}







public static function readLine(StreamInterface $stream, ?int $maxLength = null): string
{
$buffer = '';
$size = 0;

while (!$stream->eof()) {
if ('' === ($byte = $stream->read(1))) {
return $buffer;
}
$buffer .= $byte;

if ($byte === "\n" || ++$size === $maxLength - 1) {
break;
}
}

return $buffer;
}




public static function redactUserInfo(UriInterface $uri): UriInterface
{
$userInfo = $uri->getUserInfo();

if (false !== ($pos = \strpos($userInfo, ':'))) {
return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***');
}

return $uri;
}



































public static function streamFor($resource = '', array $options = []): StreamInterface
{
if (is_scalar($resource)) {
$stream = self::tryFopen('php://temp', 'r+');
if ($resource !== '') {
fwrite($stream, (string) $resource);
fseek($stream, 0);
}

return new Stream($stream, $options);
}

switch (gettype($resource)) {
case 'resource':






if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {
$stream = self::tryFopen('php://temp', 'w+');
stream_copy_to_stream($resource, $stream);
fseek($stream, 0);
$resource = $stream;
}

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 self::streamFor((string) $resource, $options);
}
break;
case 'NULL':
return new Stream(self::tryFopen('php://temp', 'r+'), $options);
}

if (is_callable($resource)) {
return new PumpStream($resource, $options);
}

throw new \InvalidArgumentException('Invalid resource type: '.gettype($resource));
}














public static function tryFopen(string $filename, string $mode)
{
$ex = null;
set_error_handler(static function (int $errno, string $errstr) use ($filename, $mode, &$ex): bool {
$ex = new \RuntimeException(sprintf(
'Unable to open "%s" using mode "%s": %s',
$filename,
$mode,
$errstr
));

return true;
});

try {

$handle = fopen($filename, $mode);
} catch (\Throwable $e) {
$ex = new \RuntimeException(sprintf(
'Unable to open "%s" using mode "%s": %s',
$filename,
$mode,
$e->getMessage()
), 0, $e);
}

restore_error_handler();

if ($ex) {

throw $ex;
}

return $handle;
}












public static function tryGetContents($stream): string
{
$ex = null;
set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool {
$ex = new \RuntimeException(sprintf(
'Unable to read stream contents: %s',
$errstr
));

return true;
});

try {

$contents = stream_get_contents($stream);

if ($contents === false) {
$ex = new \RuntimeException('Unable to read stream contents');
}
} catch (\Throwable $e) {
$ex = new \RuntimeException(sprintf(
'Unable to read stream contents: %s',
$e->getMessage()
), 0, $e);
}

restore_error_handler();

if ($ex) {

throw $ex;
}

return $contents;
}












public static function uriFor($uri): UriInterface
{
if ($uri instanceof UriInterface) {
return $uri;
}

if (is_string($uri)) {
return new Uri($uri);
}

throw new \InvalidArgumentException('URI must be a string or UriInterface');
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

final class MimeType
{
private const MIME_TYPES = [
'1km' => 'application/vnd.1000minds.decision-model+xml',
'3dml' => 'text/vnd.in3d.3dml',
'3ds' => 'image/x-3ds',
'3g2' => 'video/3gpp2',
'3gp' => 'video/3gp',
'3gpp' => 'video/3gpp',
'3mf' => 'model/3mf',
'7z' => 'application/x-7z-compressed',
'7zip' => 'application/x-7z-compressed',
'123' => 'application/vnd.lotus-1-2-3',
'aab' => 'application/x-authorware-bin',
'aac' => 'audio/aac',
'aam' => 'application/x-authorware-map',
'aas' => 'application/x-authorware-seg',
'abw' => 'application/x-abiword',
'ac' => 'application/vnd.nokia.n-gage.ac+xml',
'ac3' => 'audio/ac3',
'acc' => 'application/vnd.americandynamics.acc',
'ace' => 'application/x-ace-compressed',
'acu' => 'application/vnd.acucobol',
'acutc' => 'application/vnd.acucorp',
'adp' => 'audio/adpcm',
'adts' => 'audio/aac',
'aep' => 'application/vnd.audiograph',
'afm' => 'application/x-font-type1',
'afp' => 'application/vnd.ibm.modcap',
'age' => 'application/vnd.age',
'ahead' => 'application/vnd.ahead.space',
'ai' => 'application/pdf',
'aif' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'air' => 'application/vnd.adobe.air-application-installer-package+zip',
'ait' => 'application/vnd.dvb.ait',
'ami' => 'application/vnd.amiga.ami',
'aml' => 'application/automationml-aml+xml',
'amlx' => 'application/automationml-amlx+zip',
'amr' => 'audio/amr',
'apk' => 'application/vnd.android.package-archive',
'apng' => 'image/apng',
'appcache' => 'text/cache-manifest',
'appinstaller' => 'application/appinstaller',
'application' => 'application/x-ms-application',
'appx' => 'application/appx',
'appxbundle' => 'application/appxbundle',
'apr' => 'application/vnd.lotus-approach',
'arc' => 'application/x-freearc',
'arj' => 'application/x-arj',
'asc' => 'application/pgp-signature',
'asf' => 'video/x-ms-asf',
'asm' => 'text/x-asm',
'aso' => 'application/vnd.accpac.simply.aso',
'asx' => 'video/x-ms-asf',
'atc' => 'application/vnd.acucorp',
'atom' => 'application/atom+xml',
'atomcat' => 'application/atomcat+xml',
'atomdeleted' => 'application/atomdeleted+xml',
'atomsvc' => 'application/atomsvc+xml',
'atx' => 'application/vnd.antix.game-component',
'au' => 'audio/x-au',
'avci' => 'image/avci',
'avcs' => 'image/avcs',
'avi' => 'video/x-msvideo',
'avif' => 'image/avif',
'aw' => 'application/applixware',
'azf' => 'application/vnd.airzip.filesecure.azf',
'azs' => 'application/vnd.airzip.filesecure.azs',
'azv' => 'image/vnd.airzip.accelerator.azv',
'azw' => 'application/vnd.amazon.ebook',
'b16' => 'image/vnd.pco.b16',
'bat' => 'application/x-msdownload',
'bcpio' => 'application/x-bcpio',
'bdf' => 'application/x-font-bdf',
'bdm' => 'application/vnd.syncml.dm+wbxml',
'bdoc' => 'application/x-bdoc',
'bed' => 'application/vnd.realvnc.bed',
'bh2' => 'application/vnd.fujitsu.oasysprs',
'bin' => 'application/octet-stream',
'blb' => 'application/x-blorb',
'blorb' => 'application/x-blorb',
'bmi' => 'application/vnd.bmi',
'bmml' => 'application/vnd.balsamiq.bmml+xml',
'bmp' => 'image/bmp',
'book' => 'application/vnd.framemaker',
'box' => 'application/vnd.previewsystems.box',
'boz' => 'application/x-bzip2',
'bpk' => 'application/octet-stream',
'bpmn' => 'application/octet-stream',
'bsp' => 'model/vnd.valve.source.compiled-map',
'btf' => 'image/prs.btif',
'btif' => 'image/prs.btif',
'buffer' => 'application/octet-stream',
'bz' => 'application/x-bzip',
'bz2' => 'application/x-bzip2',
'c' => 'text/x-c',
'c4d' => 'application/vnd.clonk.c4group',
'c4f' => 'application/vnd.clonk.c4group',
'c4g' => 'application/vnd.clonk.c4group',
'c4p' => 'application/vnd.clonk.c4group',
'c4u' => 'application/vnd.clonk.c4group',
'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
'cab' => 'application/vnd.ms-cab-compressed',
'caf' => 'audio/x-caf',
'cap' => 'application/vnd.tcpdump.pcap',
'car' => 'application/vnd.curl.car',
'cat' => 'application/vnd.ms-pki.seccat',
'cb7' => 'application/x-cbr',
'cba' => 'application/x-cbr',
'cbr' => 'application/x-cbr',
'cbt' => 'application/x-cbr',
'cbz' => 'application/x-cbr',
'cc' => 'text/x-c',
'cco' => 'application/x-cocoa',
'cct' => 'application/x-director',
'ccxml' => 'application/ccxml+xml',
'cdbcmsg' => 'application/vnd.contact.cmsg',
'cdf' => 'application/x-netcdf',
'cdfx' => 'application/cdfx+xml',
'cdkey' => 'application/vnd.mediastation.cdkey',
'cdmia' => 'application/cdmi-capability',
'cdmic' => 'application/cdmi-container',
'cdmid' => 'application/cdmi-domain',
'cdmio' => 'application/cdmi-object',
'cdmiq' => 'application/cdmi-queue',
'cdr' => 'application/cdr',
'cdx' => 'chemical/x-cdx',
'cdxml' => 'application/vnd.chemdraw+xml',
'cdy' => 'application/vnd.cinderella',
'cer' => 'application/pkix-cert',
'cfs' => 'application/x-cfs-compressed',
'cgm' => 'image/cgm',
'chat' => 'application/x-chat',
'chm' => 'application/vnd.ms-htmlhelp',
'chrt' => 'application/vnd.kde.kchart',
'cif' => 'chemical/x-cif',
'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
'cil' => 'application/vnd.ms-artgalry',
'cjs' => 'application/node',
'cla' => 'application/vnd.claymore',
'class' => 'application/octet-stream',
'cld' => 'model/vnd.cld',
'clkk' => 'application/vnd.crick.clicker.keyboard',
'clkp' => 'application/vnd.crick.clicker.palette',
'clkt' => 'application/vnd.crick.clicker.template',
'clkw' => 'application/vnd.crick.clicker.wordbank',
'clkx' => 'application/vnd.crick.clicker',
'clp' => 'application/x-msclip',
'cmc' => 'application/vnd.cosmocaller',
'cmdf' => 'chemical/x-cmdf',
'cml' => 'chemical/x-cml',
'cmp' => 'application/vnd.yellowriver-custom-menu',
'cmx' => 'image/x-cmx',
'cod' => 'application/vnd.rim.cod',
'coffee' => 'text/coffeescript',
'com' => 'application/x-msdownload',
'conf' => 'text/plain',
'cpio' => 'application/x-cpio',
'cpl' => 'application/cpl+xml',
'cpp' => 'text/x-c',
'cpt' => 'application/mac-compactpro',
'crd' => 'application/x-mscardfile',
'crl' => 'application/pkix-crl',
'crt' => 'application/x-x509-ca-cert',
'crx' => 'application/x-chrome-extension',
'cryptonote' => 'application/vnd.rig.cryptonote',
'csh' => 'application/x-csh',
'csl' => 'application/vnd.citationstyles.style+xml',
'csml' => 'chemical/x-csml',
'csp' => 'application/vnd.commonspace',
'csr' => 'application/octet-stream',
'css' => 'text/css',
'cst' => 'application/x-director',
'csv' => 'text/csv',
'cu' => 'application/cu-seeme',
'curl' => 'text/vnd.curl',
'cwl' => 'application/cwl',
'cww' => 'application/prs.cww',
'cxt' => 'application/x-director',
'cxx' => 'text/x-c',
'dae' => 'model/vnd.collada+xml',
'daf' => 'application/vnd.mobius.daf',
'dart' => 'application/vnd.dart',
'dataless' => 'application/vnd.fdsn.seed',
'davmount' => 'application/davmount+xml',
'dbf' => 'application/vnd.dbf',
'dbk' => 'application/docbook+xml',
'dcr' => 'application/x-director',
'dcurl' => 'text/vnd.curl.dcurl',
'dd2' => 'application/vnd.oma.dd2+xml',
'ddd' => 'application/vnd.fujixerox.ddd',
'ddf' => 'application/vnd.syncml.dmddf+xml',
'dds' => 'image/vnd.ms-dds',
'deb' => 'application/x-debian-package',
'def' => 'text/plain',
'deploy' => 'application/octet-stream',
'der' => 'application/x-x509-ca-cert',
'dfac' => 'application/vnd.dreamfactory',
'dgc' => 'application/x-dgc-compressed',
'dib' => 'image/bmp',
'dic' => 'text/x-c',
'dir' => 'application/x-director',
'dis' => 'application/vnd.mobius.dis',
'disposition-notification' => 'message/disposition-notification',
'dist' => 'application/octet-stream',
'distz' => 'application/octet-stream',
'djv' => 'image/vnd.djvu',
'djvu' => 'image/vnd.djvu',
'dll' => 'application/octet-stream',
'dmg' => 'application/x-apple-diskimage',
'dmn' => 'application/octet-stream',
'dmp' => 'application/vnd.tcpdump.pcap',
'dms' => 'application/octet-stream',
'dna' => 'application/vnd.dna',
'doc' => 'application/msword',
'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'dot' => 'application/msword',
'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'dp' => 'application/vnd.osgi.dp',
'dpg' => 'application/vnd.dpgraph',
'dpx' => 'image/dpx',
'dra' => 'audio/vnd.dra',
'drle' => 'image/dicom-rle',
'dsc' => 'text/prs.lines.tag',
'dssc' => 'application/dssc+der',
'dtb' => 'application/x-dtbook+xml',
'dtd' => 'application/xml-dtd',
'dts' => 'audio/vnd.dts',
'dtshd' => 'audio/vnd.dts.hd',
'dump' => 'application/octet-stream',
'dvb' => 'video/vnd.dvb.file',
'dvi' => 'application/x-dvi',
'dwd' => 'application/atsc-dwd+xml',
'dwf' => 'model/vnd.dwf',
'dwg' => 'image/vnd.dwg',
'dxf' => 'image/vnd.dxf',
'dxp' => 'application/vnd.spotfire.dxp',
'dxr' => 'application/x-director',
'ear' => 'application/java-archive',
'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
'ecma' => 'application/ecmascript',
'edm' => 'application/vnd.novadigm.edm',
'edx' => 'application/vnd.novadigm.edx',
'efif' => 'application/vnd.picsel',
'ei6' => 'application/vnd.pg.osasli',
'elc' => 'application/octet-stream',
'emf' => 'image/emf',
'eml' => 'message/rfc822',
'emma' => 'application/emma+xml',
'emotionml' => 'application/emotionml+xml',
'emz' => 'application/x-msmetafile',
'eol' => 'audio/vnd.digital-winds',
'eot' => 'application/vnd.ms-fontobject',
'eps' => 'application/postscript',
'epub' => 'application/epub+zip',
'es3' => 'application/vnd.eszigno3+xml',
'esa' => 'application/vnd.osgi.subsystem',
'esf' => 'application/vnd.epson.esf',
'et3' => 'application/vnd.eszigno3+xml',
'etx' => 'text/x-setext',
'eva' => 'application/x-eva',
'evy' => 'application/x-envoy',
'exe' => 'application/octet-stream',
'exi' => 'application/exi',
'exp' => 'application/express',
'exr' => 'image/aces',
'ext' => 'application/vnd.novadigm.ext',
'ez' => 'application/andrew-inset',
'ez2' => 'application/vnd.ezpix-album',
'ez3' => 'application/vnd.ezpix-package',
'f' => 'text/x-fortran',
'f4v' => 'video/mp4',
'f77' => 'text/x-fortran',
'f90' => 'text/x-fortran',
'fbs' => 'image/vnd.fastbidsheet',
'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
'fcs' => 'application/vnd.isac.fcs',
'fdf' => 'application/vnd.fdf',
'fdt' => 'application/fdt+xml',
'fe_launch' => 'application/vnd.denovo.fcselayout-link',
'fg5' => 'application/vnd.fujitsu.oasysgp',
'fgd' => 'application/x-director',
'fh' => 'image/x-freehand',
'fh4' => 'image/x-freehand',
'fh5' => 'image/x-freehand',
'fh7' => 'image/x-freehand',
'fhc' => 'image/x-freehand',
'fig' => 'application/x-xfig',
'fits' => 'image/fits',
'flac' => 'audio/x-flac',
'fli' => 'video/x-fli',
'flo' => 'application/vnd.micrografx.flo',
'flv' => 'video/x-flv',
'flw' => 'application/vnd.kde.kivio',
'flx' => 'text/vnd.fmi.flexstor',
'fly' => 'text/vnd.fly',
'fm' => 'application/vnd.framemaker',
'fnc' => 'application/vnd.frogans.fnc',
'fo' => 'application/vnd.software602.filler.form+xml',
'for' => 'text/x-fortran',
'fpx' => 'image/vnd.fpx',
'frame' => 'application/vnd.framemaker',
'fsc' => 'application/vnd.fsc.weblaunch',
'fst' => 'image/vnd.fst',
'ftc' => 'application/vnd.fluxtime.clip',
'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
'fvt' => 'video/vnd.fvt',
'fxp' => 'application/vnd.adobe.fxp',
'fxpl' => 'application/vnd.adobe.fxp',
'fzs' => 'application/vnd.fuzzysheet',
'g2w' => 'application/vnd.geoplan',
'g3' => 'image/g3fax',
'g3w' => 'application/vnd.geospace',
'gac' => 'application/vnd.groove-account',
'gam' => 'application/x-tads',
'gbr' => 'application/rpki-ghostbusters',
'gca' => 'application/x-gca-compressed',
'gdl' => 'model/vnd.gdl',
'gdoc' => 'application/vnd.google-apps.document',
'ged' => 'text/vnd.familysearch.gedcom',
'geo' => 'application/vnd.dynageo',
'geojson' => 'application/geo+json',
'gex' => 'application/vnd.geometry-explorer',
'ggb' => 'application/vnd.geogebra.file',
'ggt' => 'application/vnd.geogebra.tool',
'ghf' => 'application/vnd.groove-help',
'gif' => 'image/gif',
'gim' => 'application/vnd.groove-identity-message',
'glb' => 'model/gltf-binary',
'gltf' => 'model/gltf+json',
'gml' => 'application/gml+xml',
'gmx' => 'application/vnd.gmx',
'gnumeric' => 'application/x-gnumeric',
'gpg' => 'application/gpg-keys',
'gph' => 'application/vnd.flographit',
'gpx' => 'application/gpx+xml',
'gqf' => 'application/vnd.grafeq',
'gqs' => 'application/vnd.grafeq',
'gram' => 'application/srgs',
'gramps' => 'application/x-gramps-xml',
'gre' => 'application/vnd.geometry-explorer',
'grv' => 'application/vnd.groove-injector',
'grxml' => 'application/srgs+xml',
'gsf' => 'application/x-font-ghostscript',
'gsheet' => 'application/vnd.google-apps.spreadsheet',
'gslides' => 'application/vnd.google-apps.presentation',
'gtar' => 'application/x-gtar',
'gtm' => 'application/vnd.groove-tool-message',
'gtw' => 'model/vnd.gtw',
'gv' => 'text/vnd.graphviz',
'gxf' => 'application/gxf',
'gxt' => 'application/vnd.geonext',
'gz' => 'application/gzip',
'gzip' => 'application/gzip',
'h' => 'text/x-c',
'h261' => 'video/h261',
'h263' => 'video/h263',
'h264' => 'video/h264',
'hal' => 'application/vnd.hal+xml',
'hbci' => 'application/vnd.hbci',
'hbs' => 'text/x-handlebars-template',
'hdd' => 'application/x-virtualbox-hdd',
'hdf' => 'application/x-hdf',
'heic' => 'image/heic',
'heics' => 'image/heic-sequence',
'heif' => 'image/heif',
'heifs' => 'image/heif-sequence',
'hej2' => 'image/hej2k',
'held' => 'application/atsc-held+xml',
'hh' => 'text/x-c',
'hjson' => 'application/hjson',
'hlp' => 'application/winhlp',
'hpgl' => 'application/vnd.hp-hpgl',
'hpid' => 'application/vnd.hp-hpid',
'hps' => 'application/vnd.hp-hps',
'hqx' => 'application/mac-binhex40',
'hsj2' => 'image/hsj2',
'htc' => 'text/x-component',
'htke' => 'application/vnd.kenameaapp',
'htm' => 'text/html',
'html' => 'text/html',
'hvd' => 'application/vnd.yamaha.hv-dic',
'hvp' => 'application/vnd.yamaha.hv-voice',
'hvs' => 'application/vnd.yamaha.hv-script',
'i2g' => 'application/vnd.intergeo',
'icc' => 'application/vnd.iccprofile',
'ice' => 'x-conference/x-cooltalk',
'icm' => 'application/vnd.iccprofile',
'ico' => 'image/x-icon',
'ics' => 'text/calendar',
'ief' => 'image/ief',
'ifb' => 'text/calendar',
'ifm' => 'application/vnd.shana.informed.formdata',
'iges' => 'model/iges',
'igl' => 'application/vnd.igloader',
'igm' => 'application/vnd.insors.igm',
'igs' => 'model/iges',
'igx' => 'application/vnd.micrografx.igx',
'iif' => 'application/vnd.shana.informed.interchange',
'img' => 'application/octet-stream',
'imp' => 'application/vnd.accpac.simply.imp',
'ims' => 'application/vnd.ms-ims',
'in' => 'text/plain',
'ini' => 'text/plain',
'ink' => 'application/inkml+xml',
'inkml' => 'application/inkml+xml',
'install' => 'application/x-install-instructions',
'iota' => 'application/vnd.astraea-software.iota',
'ipfix' => 'application/ipfix',
'ipk' => 'application/vnd.shana.informed.package',
'irm' => 'application/vnd.ibm.rights-management',
'irp' => 'application/vnd.irepository.package+xml',
'iso' => 'application/x-iso9660-image',
'itp' => 'application/vnd.shana.informed.formtemplate',
'its' => 'application/its+xml',
'ivp' => 'application/vnd.immervision-ivp',
'ivu' => 'application/vnd.immervision-ivu',
'jad' => 'text/vnd.sun.j2me.app-descriptor',
'jade' => 'text/jade',
'jam' => 'application/vnd.jam',
'jar' => 'application/java-archive',
'jardiff' => 'application/x-java-archive-diff',
'java' => 'text/x-java-source',
'jhc' => 'image/jphc',
'jisp' => 'application/vnd.jisp',
'jls' => 'image/jls',
'jlt' => 'application/vnd.hp-jlyt',
'jng' => 'image/x-jng',
'jnlp' => 'application/x-java-jnlp-file',
'joda' => 'application/vnd.joost.joda-archive',
'jp2' => 'image/jp2',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpf' => 'image/jpx',
'jpg' => 'image/jpeg',
'jpg2' => 'image/jp2',
'jpgm' => 'video/jpm',
'jpgv' => 'video/jpeg',
'jph' => 'image/jph',
'jpm' => 'video/jpm',
'jpx' => 'image/jpx',
'js' => 'application/javascript',
'json' => 'application/json',
'json5' => 'application/json5',
'jsonld' => 'application/ld+json',
'jsonml' => 'application/jsonml+json',
'jsx' => 'text/jsx',
'jt' => 'model/jt',
'jxr' => 'image/jxr',
'jxra' => 'image/jxra',
'jxrs' => 'image/jxrs',
'jxs' => 'image/jxs',
'jxsc' => 'image/jxsc',
'jxsi' => 'image/jxsi',
'jxss' => 'image/jxss',
'kar' => 'audio/midi',
'karbon' => 'application/vnd.kde.karbon',
'kdb' => 'application/octet-stream',
'kdbx' => 'application/x-keepass2',
'key' => 'application/x-iwork-keynote-sffkey',
'kfo' => 'application/vnd.kde.kformula',
'kia' => 'application/vnd.kidspiration',
'kml' => 'application/vnd.google-earth.kml+xml',
'kmz' => 'application/vnd.google-earth.kmz',
'kne' => 'application/vnd.kinar',
'knp' => 'application/vnd.kinar',
'kon' => 'application/vnd.kde.kontour',
'kpr' => 'application/vnd.kde.kpresenter',
'kpt' => 'application/vnd.kde.kpresenter',
'kpxx' => 'application/vnd.ds-keypoint',
'ksp' => 'application/vnd.kde.kspread',
'ktr' => 'application/vnd.kahootz',
'ktx' => 'image/ktx',
'ktx2' => 'image/ktx2',
'ktz' => 'application/vnd.kahootz',
'kwd' => 'application/vnd.kde.kword',
'kwt' => 'application/vnd.kde.kword',
'lasxml' => 'application/vnd.las.las+xml',
'latex' => 'application/x-latex',
'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
'les' => 'application/vnd.hhe.lesson-player',
'less' => 'text/less',
'lgr' => 'application/lgr+xml',
'lha' => 'application/octet-stream',
'link66' => 'application/vnd.route66.link66+xml',
'list' => 'text/plain',
'list3820' => 'application/vnd.ibm.modcap',
'listafp' => 'application/vnd.ibm.modcap',
'litcoffee' => 'text/coffeescript',
'lnk' => 'application/x-ms-shortcut',
'log' => 'text/plain',
'lostxml' => 'application/lost+xml',
'lrf' => 'application/octet-stream',
'lrm' => 'application/vnd.ms-lrm',
'ltf' => 'application/vnd.frogans.ltf',
'lua' => 'text/x-lua',
'luac' => 'application/x-lua-bytecode',
'lvp' => 'audio/vnd.lucent.voice',
'lwp' => 'application/vnd.lotus-wordpro',
'lzh' => 'application/octet-stream',
'm1v' => 'video/mpeg',
'm2a' => 'audio/mpeg',
'm2v' => 'video/mpeg',
'm3a' => 'audio/mpeg',
'm3u' => 'text/plain',
'm3u8' => 'application/vnd.apple.mpegurl',
'm4a' => 'audio/x-m4a',
'm4p' => 'application/mp4',
'm4s' => 'video/iso.segment',
'm4u' => 'application/vnd.mpegurl',
'm4v' => 'video/x-m4v',
'm13' => 'application/x-msmediaview',
'm14' => 'application/x-msmediaview',
'm21' => 'application/mp21',
'ma' => 'application/mathematica',
'mads' => 'application/mads+xml',
'maei' => 'application/mmt-aei+xml',
'mag' => 'application/vnd.ecowin.chart',
'maker' => 'application/vnd.framemaker',
'man' => 'text/troff',
'manifest' => 'text/cache-manifest',
'map' => 'application/json',
'mar' => 'application/octet-stream',
'markdown' => 'text/markdown',
'mathml' => 'application/mathml+xml',
'mb' => 'application/mathematica',
'mbk' => 'application/vnd.mobius.mbk',
'mbox' => 'application/mbox',
'mc1' => 'application/vnd.medcalcdata',
'mcd' => 'application/vnd.mcd',
'mcurl' => 'text/vnd.curl.mcurl',
'md' => 'text/markdown',
'mdb' => 'application/x-msaccess',
'mdi' => 'image/vnd.ms-modi',
'mdx' => 'text/mdx',
'me' => 'text/troff',
'mesh' => 'model/mesh',
'meta4' => 'application/metalink4+xml',
'metalink' => 'application/metalink+xml',
'mets' => 'application/mets+xml',
'mfm' => 'application/vnd.mfmp',
'mft' => 'application/rpki-manifest',
'mgp' => 'application/vnd.osgeo.mapguide.package',
'mgz' => 'application/vnd.proteus.magazine',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mie' => 'application/x-mie',
'mif' => 'application/vnd.mif',
'mime' => 'message/rfc822',
'mj2' => 'video/mj2',
'mjp2' => 'video/mj2',
'mjs' => 'text/javascript',
'mk3d' => 'video/x-matroska',
'mka' => 'audio/x-matroska',
'mkd' => 'text/x-markdown',
'mks' => 'video/x-matroska',
'mkv' => 'video/x-matroska',
'mlp' => 'application/vnd.dolby.mlp',
'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
'mmf' => 'application/vnd.smaf',
'mml' => 'text/mathml',
'mmr' => 'image/vnd.fujixerox.edmics-mmr',
'mng' => 'video/x-mng',
'mny' => 'application/x-msmoney',
'mobi' => 'application/x-mobipocket-ebook',
'mods' => 'application/mods+xml',
'mov' => 'video/quicktime',
'movie' => 'video/x-sgi-movie',
'mp2' => 'audio/mpeg',
'mp2a' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'mp4' => 'video/mp4',
'mp4a' => 'audio/mp4',
'mp4s' => 'application/mp4',
'mp4v' => 'video/mp4',
'mp21' => 'application/mp21',
'mpc' => 'application/vnd.mophun.certificate',
'mpd' => 'application/dash+xml',
'mpe' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'mpf' => 'application/media-policy-dataset+xml',
'mpg' => 'video/mpeg',
'mpg4' => 'video/mp4',
'mpga' => 'audio/mpeg',
'mpkg' => 'application/vnd.apple.installer+xml',
'mpm' => 'application/vnd.blueice.multipass',
'mpn' => 'application/vnd.mophun.application',
'mpp' => 'application/vnd.ms-project',
'mpt' => 'application/vnd.ms-project',
'mpy' => 'application/vnd.ibm.minipay',
'mqy' => 'application/vnd.mobius.mqy',
'mrc' => 'application/marc',
'mrcx' => 'application/marcxml+xml',
'ms' => 'text/troff',
'mscml' => 'application/mediaservercontrol+xml',
'mseed' => 'application/vnd.fdsn.mseed',
'mseq' => 'application/vnd.mseq',
'msf' => 'application/vnd.epson.msf',
'msg' => 'application/vnd.ms-outlook',
'msh' => 'model/mesh',
'msi' => 'application/x-msdownload',
'msix' => 'application/msix',
'msixbundle' => 'application/msixbundle',
'msl' => 'application/vnd.mobius.msl',
'msm' => 'application/octet-stream',
'msp' => 'application/octet-stream',
'msty' => 'application/vnd.muvee.style',
'mtl' => 'model/mtl',
'mts' => 'model/vnd.mts',
'mus' => 'application/vnd.musician',
'musd' => 'application/mmt-usd+xml',
'musicxml' => 'application/vnd.recordare.musicxml+xml',
'mvb' => 'application/x-msmediaview',
'mvt' => 'application/vnd.mapbox-vector-tile',
'mwf' => 'application/vnd.mfer',
'mxf' => 'application/mxf',
'mxl' => 'application/vnd.recordare.musicxml',
'mxmf' => 'audio/mobile-xmf',
'mxml' => 'application/xv+xml',
'mxs' => 'application/vnd.triscape.mxs',
'mxu' => 'video/vnd.mpegurl',
'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
'n3' => 'text/n3',
'nb' => 'application/mathematica',
'nbp' => 'application/vnd.wolfram.player',
'nc' => 'application/x-netcdf',
'ncx' => 'application/x-dtbncx+xml',
'nfo' => 'text/x-nfo',
'ngdat' => 'application/vnd.nokia.n-gage.data',
'nitf' => 'application/vnd.nitf',
'nlu' => 'application/vnd.neurolanguage.nlu',
'nml' => 'application/vnd.enliven',
'nnd' => 'application/vnd.noblenet-directory',
'nns' => 'application/vnd.noblenet-sealer',
'nnw' => 'application/vnd.noblenet-web',
'npx' => 'image/vnd.net-fpx',
'nq' => 'application/n-quads',
'nsc' => 'application/x-conference',
'nsf' => 'application/vnd.lotus-notes',
'nt' => 'application/n-triples',
'ntf' => 'application/vnd.nitf',
'numbers' => 'application/x-iwork-numbers-sffnumbers',
'nzb' => 'application/x-nzb',
'oa2' => 'application/vnd.fujitsu.oasys2',
'oa3' => 'application/vnd.fujitsu.oasys3',
'oas' => 'application/vnd.fujitsu.oasys',
'obd' => 'application/x-msbinder',
'obgx' => 'application/vnd.openblox.game+xml',
'obj' => 'model/obj',
'oda' => 'application/oda',
'odb' => 'application/vnd.oasis.opendocument.database',
'odc' => 'application/vnd.oasis.opendocument.chart',
'odf' => 'application/vnd.oasis.opendocument.formula',
'odft' => 'application/vnd.oasis.opendocument.formula-template',
'odg' => 'application/vnd.oasis.opendocument.graphics',
'odi' => 'application/vnd.oasis.opendocument.image',
'odm' => 'application/vnd.oasis.opendocument.text-master',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'odt' => 'application/vnd.oasis.opendocument.text',
'oga' => 'audio/ogg',
'ogex' => 'model/vnd.opengex',
'ogg' => 'audio/ogg',
'ogv' => 'video/ogg',
'ogx' => 'application/ogg',
'omdoc' => 'application/omdoc+xml',
'onepkg' => 'application/onenote',
'onetmp' => 'application/onenote',
'onetoc' => 'application/onenote',
'onetoc2' => 'application/onenote',
'opf' => 'application/oebps-package+xml',
'opml' => 'text/x-opml',
'oprc' => 'application/vnd.palm',
'opus' => 'audio/ogg',
'org' => 'text/x-org',
'osf' => 'application/vnd.yamaha.openscoreformat',
'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
'osm' => 'application/vnd.openstreetmap.data+xml',
'otc' => 'application/vnd.oasis.opendocument.chart-template',
'otf' => 'font/otf',
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
'oth' => 'application/vnd.oasis.opendocument.text-web',
'oti' => 'application/vnd.oasis.opendocument.image-template',
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
'ott' => 'application/vnd.oasis.opendocument.text-template',
'ova' => 'application/x-virtualbox-ova',
'ovf' => 'application/x-virtualbox-ovf',
'owl' => 'application/rdf+xml',
'oxps' => 'application/oxps',
'oxt' => 'application/vnd.openofficeorg.extension',
'p' => 'text/x-pascal',
'p7a' => 'application/x-pkcs7-signature',
'p7b' => 'application/x-pkcs7-certificates',
'p7c' => 'application/pkcs7-mime',
'p7m' => 'application/pkcs7-mime',
'p7r' => 'application/x-pkcs7-certreqresp',
'p7s' => 'application/pkcs7-signature',
'p8' => 'application/pkcs8',
'p10' => 'application/x-pkcs10',
'p12' => 'application/x-pkcs12',
'pac' => 'application/x-ns-proxy-autoconfig',
'pages' => 'application/x-iwork-pages-sffpages',
'pas' => 'text/x-pascal',
'paw' => 'application/vnd.pawaafile',
'pbd' => 'application/vnd.powerbuilder6',
'pbm' => 'image/x-portable-bitmap',
'pcap' => 'application/vnd.tcpdump.pcap',
'pcf' => 'application/x-font-pcf',
'pcl' => 'application/vnd.hp-pcl',
'pclxl' => 'application/vnd.hp-pclxl',
'pct' => 'image/x-pict',
'pcurl' => 'application/vnd.curl.pcurl',
'pcx' => 'image/x-pcx',
'pdb' => 'application/x-pilot',
'pde' => 'text/x-processing',
'pdf' => 'application/pdf',
'pem' => 'application/x-x509-user-cert',
'pfa' => 'application/x-font-type1',
'pfb' => 'application/x-font-type1',
'pfm' => 'application/x-font-type1',
'pfr' => 'application/font-tdpfr',
'pfx' => 'application/x-pkcs12',
'pgm' => 'image/x-portable-graymap',
'pgn' => 'application/x-chess-pgn',
'pgp' => 'application/pgp',
'phar' => 'application/octet-stream',
'php' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'php4' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'phtml' => 'application/x-httpd-php',
'pic' => 'image/x-pict',
'pkg' => 'application/octet-stream',
'pki' => 'application/pkixcmp',
'pkipath' => 'application/pkix-pkipath',
'pkpass' => 'application/vnd.apple.pkpass',
'pl' => 'application/x-perl',
'plb' => 'application/vnd.3gpp.pic-bw-large',
'plc' => 'application/vnd.mobius.plc',
'plf' => 'application/vnd.pocketlearn',
'pls' => 'application/pls+xml',
'pm' => 'application/x-perl',
'pml' => 'application/vnd.ctc-posml',
'png' => 'image/png',
'pnm' => 'image/x-portable-anymap',
'portpkg' => 'application/vnd.macports.portpkg',
'pot' => 'application/vnd.ms-powerpoint',
'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
'ppa' => 'application/vnd.ms-powerpoint',
'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
'ppd' => 'application/vnd.cups-ppd',
'ppm' => 'image/x-portable-pixmap',
'pps' => 'application/vnd.ms-powerpoint',
'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'ppt' => 'application/powerpoint',
'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'pqa' => 'application/vnd.palm',
'prc' => 'model/prc',
'pre' => 'application/vnd.lotus-freelance',
'prf' => 'application/pics-rules',
'provx' => 'application/provenance+xml',
'ps' => 'application/postscript',
'psb' => 'application/vnd.3gpp.pic-bw-small',
'psd' => 'application/x-photoshop',
'psf' => 'application/x-font-linux-psf',
'pskcxml' => 'application/pskc+xml',
'pti' => 'image/prs.pti',
'ptid' => 'application/vnd.pvi.ptid1',
'pub' => 'application/x-mspublisher',
'pvb' => 'application/vnd.3gpp.pic-bw-var',
'pwn' => 'application/vnd.3m.post-it-notes',
'pya' => 'audio/vnd.ms-playready.media.pya',
'pyo' => 'model/vnd.pytha.pyox',
'pyox' => 'model/vnd.pytha.pyox',
'pyv' => 'video/vnd.ms-playready.media.pyv',
'qam' => 'application/vnd.epson.quickanime',
'qbo' => 'application/vnd.intu.qbo',
'qfx' => 'application/vnd.intu.qfx',
'qps' => 'application/vnd.publishare-delta-tree',
'qt' => 'video/quicktime',
'qwd' => 'application/vnd.quark.quarkxpress',
'qwt' => 'application/vnd.quark.quarkxpress',
'qxb' => 'application/vnd.quark.quarkxpress',
'qxd' => 'application/vnd.quark.quarkxpress',
'qxl' => 'application/vnd.quark.quarkxpress',
'qxt' => 'application/vnd.quark.quarkxpress',
'ra' => 'audio/x-realaudio',
'ram' => 'audio/x-pn-realaudio',
'raml' => 'application/raml+yaml',
'rapd' => 'application/route-apd+xml',
'rar' => 'application/x-rar',
'ras' => 'image/x-cmu-raster',
'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
'rdf' => 'application/rdf+xml',
'rdz' => 'application/vnd.data-vision.rdz',
'relo' => 'application/p2p-overlay+xml',
'rep' => 'application/vnd.businessobjects',
'res' => 'application/x-dtbresource+xml',
'rgb' => 'image/x-rgb',
'rif' => 'application/reginfo+xml',
'rip' => 'audio/vnd.rip',
'ris' => 'application/x-research-info-systems',
'rl' => 'application/resource-lists+xml',
'rlc' => 'image/vnd.fujixerox.edmics-rlc',
'rld' => 'application/resource-lists-diff+xml',
'rm' => 'audio/x-pn-realaudio',
'rmi' => 'audio/midi',
'rmp' => 'audio/x-pn-realaudio-plugin',
'rms' => 'application/vnd.jcp.javame.midlet-rms',
'rmvb' => 'application/vnd.rn-realmedia-vbr',
'rnc' => 'application/relax-ng-compact-syntax',
'rng' => 'application/xml',
'roa' => 'application/rpki-roa',
'roff' => 'text/troff',
'rp9' => 'application/vnd.cloanto.rp9',
'rpm' => 'audio/x-pn-realaudio-plugin',
'rpss' => 'application/vnd.nokia.radio-presets',
'rpst' => 'application/vnd.nokia.radio-preset',
'rq' => 'application/sparql-query',
'rs' => 'application/rls-services+xml',
'rsa' => 'application/x-pkcs7',
'rsat' => 'application/atsc-rsat+xml',
'rsd' => 'application/rsd+xml',
'rsheet' => 'application/urc-ressheet+xml',
'rss' => 'application/rss+xml',
'rtf' => 'text/rtf',
'rtx' => 'text/richtext',
'run' => 'application/x-makeself',
'rusd' => 'application/route-usd+xml',
'rv' => 'video/vnd.rn-realvideo',
's' => 'text/x-asm',
's3m' => 'audio/s3m',
'saf' => 'application/vnd.yamaha.smaf-audio',
'sass' => 'text/x-sass',
'sbml' => 'application/sbml+xml',
'sc' => 'application/vnd.ibm.secure-container',
'scd' => 'application/x-msschedule',
'scm' => 'application/vnd.lotus-screencam',
'scq' => 'application/scvp-cv-request',
'scs' => 'application/scvp-cv-response',
'scss' => 'text/x-scss',
'scurl' => 'text/vnd.curl.scurl',
'sda' => 'application/vnd.stardivision.draw',
'sdc' => 'application/vnd.stardivision.calc',
'sdd' => 'application/vnd.stardivision.impress',
'sdkd' => 'application/vnd.solent.sdkm+xml',
'sdkm' => 'application/vnd.solent.sdkm+xml',
'sdp' => 'application/sdp',
'sdw' => 'application/vnd.stardivision.writer',
'sea' => 'application/octet-stream',
'see' => 'application/vnd.seemail',
'seed' => 'application/vnd.fdsn.seed',
'sema' => 'application/vnd.sema',
'semd' => 'application/vnd.semd',
'semf' => 'application/vnd.semf',
'senmlx' => 'application/senml+xml',
'sensmlx' => 'application/sensml+xml',
'ser' => 'application/java-serialized-object',
'setpay' => 'application/set-payment-initiation',
'setreg' => 'application/set-registration-initiation',
'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
'sfs' => 'application/vnd.spotfire.sfs',
'sfv' => 'text/x-sfv',
'sgi' => 'image/sgi',
'sgl' => 'application/vnd.stardivision.writer-global',
'sgm' => 'text/sgml',
'sgml' => 'text/sgml',
'sh' => 'application/x-sh',
'shar' => 'application/x-shar',
'shex' => 'text/shex',
'shf' => 'application/shf+xml',
'shtml' => 'text/html',
'sid' => 'image/x-mrsid-image',
'sieve' => 'application/sieve',
'sig' => 'application/pgp-signature',
'sil' => 'audio/silk',
'silo' => 'model/mesh',
'sis' => 'application/vnd.symbian.install',
'sisx' => 'application/vnd.symbian.install',
'sit' => 'application/x-stuffit',
'sitx' => 'application/x-stuffitx',
'siv' => 'application/sieve',
'skd' => 'application/vnd.koan',
'skm' => 'application/vnd.koan',
'skp' => 'application/vnd.koan',
'skt' => 'application/vnd.koan',
'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
'slim' => 'text/slim',
'slm' => 'text/slim',
'sls' => 'application/route-s-tsid+xml',
'slt' => 'application/vnd.epson.salt',
'sm' => 'application/vnd.stepmania.stepchart',
'smf' => 'application/vnd.stardivision.math',
'smi' => 'application/smil',
'smil' => 'application/smil',
'smv' => 'video/x-smv',
'smzip' => 'application/vnd.stepmania.package',
'snd' => 'audio/basic',
'snf' => 'application/x-font-snf',
'so' => 'application/octet-stream',
'spc' => 'application/x-pkcs7-certificates',
'spdx' => 'text/spdx',
'spf' => 'application/vnd.yamaha.smaf-phrase',
'spl' => 'application/x-futuresplash',
'spot' => 'text/vnd.in3d.spot',
'spp' => 'application/scvp-vp-response',
'spq' => 'application/scvp-vp-request',
'spx' => 'audio/ogg',
'sql' => 'application/x-sql',
'src' => 'application/x-wais-source',
'srt' => 'application/x-subrip',
'sru' => 'application/sru+xml',
'srx' => 'application/sparql-results+xml',
'ssdl' => 'application/ssdl+xml',
'sse' => 'application/vnd.kodak-descriptor',
'ssf' => 'application/vnd.epson.ssf',
'ssml' => 'application/ssml+xml',
'sst' => 'application/octet-stream',
'st' => 'application/vnd.sailingtracker.track',
'stc' => 'application/vnd.sun.xml.calc.template',
'std' => 'application/vnd.sun.xml.draw.template',
'step' => 'application/STEP',
'stf' => 'application/vnd.wt.stf',
'sti' => 'application/vnd.sun.xml.impress.template',
'stk' => 'application/hyperstudio',
'stl' => 'model/stl',
'stp' => 'application/STEP',
'stpx' => 'model/step+xml',
'stpxz' => 'model/step-xml+zip',
'stpz' => 'model/step+zip',
'str' => 'application/vnd.pg.format',
'stw' => 'application/vnd.sun.xml.writer.template',
'styl' => 'text/stylus',
'stylus' => 'text/stylus',
'sub' => 'text/vnd.dvb.subtitle',
'sus' => 'application/vnd.sus-calendar',
'susp' => 'application/vnd.sus-calendar',
'sv4cpio' => 'application/x-sv4cpio',
'sv4crc' => 'application/x-sv4crc',
'svc' => 'application/vnd.dvb.service',
'svd' => 'application/vnd.svd',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
'swa' => 'application/x-director',
'swf' => 'application/x-shockwave-flash',
'swi' => 'application/vnd.aristanetworks.swi',
'swidtag' => 'application/swid+xml',
'sxc' => 'application/vnd.sun.xml.calc',
'sxd' => 'application/vnd.sun.xml.draw',
'sxg' => 'application/vnd.sun.xml.writer.global',
'sxi' => 'application/vnd.sun.xml.impress',
'sxm' => 'application/vnd.sun.xml.math',
'sxw' => 'application/vnd.sun.xml.writer',
't' => 'text/troff',
't3' => 'application/x-t3vm-image',
't38' => 'image/t38',
'taglet' => 'application/vnd.mynfc',
'tao' => 'application/vnd.tao.intent-module-archive',
'tap' => 'image/vnd.tencent.tap',
'tar' => 'application/x-tar',
'tcap' => 'application/vnd.3gpp2.tcap',
'tcl' => 'application/x-tcl',
'td' => 'application/urc-targetdesc+xml',
'teacher' => 'application/vnd.smart.teacher',
'tei' => 'application/tei+xml',
'teicorpus' => 'application/tei+xml',
'tex' => 'application/x-tex',
'texi' => 'application/x-texinfo',
'texinfo' => 'application/x-texinfo',
'text' => 'text/plain',
'tfi' => 'application/thraud+xml',
'tfm' => 'application/x-tex-tfm',
'tfx' => 'image/tiff-fx',
'tga' => 'image/x-tga',
'tgz' => 'application/x-tar',
'thmx' => 'application/vnd.ms-officetheme',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'tk' => 'application/x-tcl',
'tmo' => 'application/vnd.tmobile-livetv',
'toml' => 'application/toml',
'torrent' => 'application/x-bittorrent',
'tpl' => 'application/vnd.groove-tool-template',
'tpt' => 'application/vnd.trid.tpt',
'tr' => 'text/troff',
'tra' => 'application/vnd.trueapp',
'trig' => 'application/trig',
'trm' => 'application/x-msterminal',
'ts' => 'video/mp2t',
'tsd' => 'application/timestamped-data',
'tsv' => 'text/tab-separated-values',
'ttc' => 'font/collection',
'ttf' => 'font/ttf',
'ttl' => 'text/turtle',
'ttml' => 'application/ttml+xml',
'twd' => 'application/vnd.simtech-mindmapper',
'twds' => 'application/vnd.simtech-mindmapper',
'txd' => 'application/vnd.genomatix.tuxedo',
'txf' => 'application/vnd.mobius.txf',
'txt' => 'text/plain',
'u3d' => 'model/u3d',
'u8dsn' => 'message/global-delivery-status',
'u8hdr' => 'message/global-headers',
'u8mdn' => 'message/global-disposition-notification',
'u8msg' => 'message/global',
'u32' => 'application/x-authorware-bin',
'ubj' => 'application/ubjson',
'udeb' => 'application/x-debian-package',
'ufd' => 'application/vnd.ufdl',
'ufdl' => 'application/vnd.ufdl',
'ulx' => 'application/x-glulx',
'umj' => 'application/vnd.umajin',
'unityweb' => 'application/vnd.unity',
'uo' => 'application/vnd.uoml+xml',
'uoml' => 'application/vnd.uoml+xml',
'uri' => 'text/uri-list',
'uris' => 'text/uri-list',
'urls' => 'text/uri-list',
'usda' => 'model/vnd.usda',
'usdz' => 'model/vnd.usdz+zip',
'ustar' => 'application/x-ustar',
'utz' => 'application/vnd.uiq.theme',
'uu' => 'text/x-uuencode',
'uva' => 'audio/vnd.dece.audio',
'uvd' => 'application/vnd.dece.data',
'uvf' => 'application/vnd.dece.data',
'uvg' => 'image/vnd.dece.graphic',
'uvh' => 'video/vnd.dece.hd',
'uvi' => 'image/vnd.dece.graphic',
'uvm' => 'video/vnd.dece.mobile',
'uvp' => 'video/vnd.dece.pd',
'uvs' => 'video/vnd.dece.sd',
'uvt' => 'application/vnd.dece.ttml+xml',
'uvu' => 'video/vnd.uvvu.mp4',
'uvv' => 'video/vnd.dece.video',
'uvva' => 'audio/vnd.dece.audio',
'uvvd' => 'application/vnd.dece.data',
'uvvf' => 'application/vnd.dece.data',
'uvvg' => 'image/vnd.dece.graphic',
'uvvh' => 'video/vnd.dece.hd',
'uvvi' => 'image/vnd.dece.graphic',
'uvvm' => 'video/vnd.dece.mobile',
'uvvp' => 'video/vnd.dece.pd',
'uvvs' => 'video/vnd.dece.sd',
'uvvt' => 'application/vnd.dece.ttml+xml',
'uvvu' => 'video/vnd.uvvu.mp4',
'uvvv' => 'video/vnd.dece.video',
'uvvx' => 'application/vnd.dece.unspecified',
'uvvz' => 'application/vnd.dece.zip',
'uvx' => 'application/vnd.dece.unspecified',
'uvz' => 'application/vnd.dece.zip',
'vbox' => 'application/x-virtualbox-vbox',
'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',
'vcard' => 'text/vcard',
'vcd' => 'application/x-cdlink',
'vcf' => 'text/x-vcard',
'vcg' => 'application/vnd.groove-vcard',
'vcs' => 'text/x-vcalendar',
'vcx' => 'application/vnd.vcx',
'vdi' => 'application/x-virtualbox-vdi',
'vds' => 'model/vnd.sap.vds',
'vhd' => 'application/x-virtualbox-vhd',
'vis' => 'application/vnd.visionary',
'viv' => 'video/vnd.vivo',
'vlc' => 'application/videolan',
'vmdk' => 'application/x-virtualbox-vmdk',
'vob' => 'video/x-ms-vob',
'vor' => 'application/vnd.stardivision.writer',
'vox' => 'application/x-authorware-bin',
'vrml' => 'model/vrml',
'vsd' => 'application/vnd.visio',
'vsf' => 'application/vnd.vsf',
'vss' => 'application/vnd.visio',
'vst' => 'application/vnd.visio',
'vsw' => 'application/vnd.visio',
'vtf' => 'image/vnd.valve.source.texture',
'vtt' => 'text/vtt',
'vtu' => 'model/vnd.vtu',
'vxml' => 'application/voicexml+xml',
'w3d' => 'application/x-director',
'wad' => 'application/x-doom',
'wadl' => 'application/vnd.sun.wadl+xml',
'war' => 'application/java-archive',
'wasm' => 'application/wasm',
'wav' => 'audio/x-wav',
'wax' => 'audio/x-ms-wax',
'wbmp' => 'image/vnd.wap.wbmp',
'wbs' => 'application/vnd.criticaltools.wbs+xml',
'wbxml' => 'application/wbxml',
'wcm' => 'application/vnd.ms-works',
'wdb' => 'application/vnd.ms-works',
'wdp' => 'image/vnd.ms-photo',
'weba' => 'audio/webm',
'webapp' => 'application/x-web-app-manifest+json',
'webm' => 'video/webm',
'webmanifest' => 'application/manifest+json',
'webp' => 'image/webp',
'wg' => 'application/vnd.pmi.widget',
'wgsl' => 'text/wgsl',
'wgt' => 'application/widget',
'wif' => 'application/watcherinfo+xml',
'wks' => 'application/vnd.ms-works',
'wm' => 'video/x-ms-wm',
'wma' => 'audio/x-ms-wma',
'wmd' => 'application/x-ms-wmd',
'wmf' => 'image/wmf',
'wml' => 'text/vnd.wap.wml',
'wmlc' => 'application/wmlc',
'wmls' => 'text/vnd.wap.wmlscript',
'wmlsc' => 'application/vnd.wap.wmlscriptc',
'wmv' => 'video/x-ms-wmv',
'wmx' => 'video/x-ms-wmx',
'wmz' => 'application/x-msmetafile',
'woff' => 'font/woff',
'woff2' => 'font/woff2',
'word' => 'application/msword',
'wpd' => 'application/vnd.wordperfect',
'wpl' => 'application/vnd.ms-wpl',
'wps' => 'application/vnd.ms-works',
'wqd' => 'application/vnd.wqd',
'wri' => 'application/x-mswrite',
'wrl' => 'model/vrml',
'wsc' => 'message/vnd.wfa.wsc',
'wsdl' => 'application/wsdl+xml',
'wspolicy' => 'application/wspolicy+xml',
'wtb' => 'application/vnd.webturbo',
'wvx' => 'video/x-ms-wvx',
'x3d' => 'model/x3d+xml',
'x3db' => 'model/x3d+fastinfoset',
'x3dbz' => 'model/x3d+binary',
'x3dv' => 'model/x3d-vrml',
'x3dvz' => 'model/x3d+vrml',
'x3dz' => 'model/x3d+xml',
'x32' => 'application/x-authorware-bin',
'x_b' => 'model/vnd.parasolid.transmit.binary',
'x_t' => 'model/vnd.parasolid.transmit.text',
'xaml' => 'application/xaml+xml',
'xap' => 'application/x-silverlight-app',
'xar' => 'application/vnd.xara',
'xav' => 'application/xcap-att+xml',
'xbap' => 'application/x-ms-xbap',
'xbd' => 'application/vnd.fujixerox.docuworks.binder',
'xbm' => 'image/x-xbitmap',
'xca' => 'application/xcap-caps+xml',
'xcs' => 'application/calendar+xml',
'xdf' => 'application/xcap-diff+xml',
'xdm' => 'application/vnd.syncml.dm+xml',
'xdp' => 'application/vnd.adobe.xdp+xml',
'xdssc' => 'application/dssc+xml',
'xdw' => 'application/vnd.fujixerox.docuworks',
'xel' => 'application/xcap-el+xml',
'xenc' => 'application/xenc+xml',
'xer' => 'application/patch-ops-error+xml',
'xfdf' => 'application/xfdf',
'xfdl' => 'application/vnd.xfdl',
'xht' => 'application/xhtml+xml',
'xhtm' => 'application/vnd.pwg-xhtml-print+xml',
'xhtml' => 'application/xhtml+xml',
'xhvml' => 'application/xv+xml',
'xif' => 'image/vnd.xiff',
'xl' => 'application/excel',
'xla' => 'application/vnd.ms-excel',
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
'xlc' => 'application/vnd.ms-excel',
'xlf' => 'application/xliff+xml',
'xlm' => 'application/vnd.ms-excel',
'xls' => 'application/vnd.ms-excel',
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xlt' => 'application/vnd.ms-excel',
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
'xlw' => 'application/vnd.ms-excel',
'xm' => 'audio/xm',
'xml' => 'application/xml',
'xns' => 'application/xcap-ns+xml',
'xo' => 'application/vnd.olpc-sugar',
'xop' => 'application/xop+xml',
'xpi' => 'application/x-xpinstall',
'xpl' => 'application/xproc+xml',
'xpm' => 'image/x-xpixmap',
'xpr' => 'application/vnd.is-xpr',
'xps' => 'application/vnd.ms-xpsdocument',
'xpw' => 'application/vnd.intercon.formnet',
'xpx' => 'application/vnd.intercon.formnet',
'xsd' => 'application/xml',
'xsf' => 'application/prs.xsf+xml',
'xsl' => 'application/xml',
'xslt' => 'application/xslt+xml',
'xsm' => 'application/vnd.syncml+xml',
'xspf' => 'application/xspf+xml',
'xul' => 'application/vnd.mozilla.xul+xml',
'xvm' => 'application/xv+xml',
'xvml' => 'application/xv+xml',
'xwd' => 'image/x-xwindowdump',
'xyz' => 'chemical/x-xyz',
'xz' => 'application/x-xz',
'yaml' => 'text/yaml',
'yang' => 'application/yang',
'yin' => 'application/yin+xml',
'yml' => 'text/yaml',
'ymp' => 'text/x-suse-ymp',
'z' => 'application/x-compress',
'z1' => 'application/x-zmachine',
'z2' => 'application/x-zmachine',
'z3' => 'application/x-zmachine',
'z4' => 'application/x-zmachine',
'z5' => 'application/x-zmachine',
'z6' => 'application/x-zmachine',
'z7' => 'application/x-zmachine',
'z8' => 'application/x-zmachine',
'zaz' => 'application/vnd.zzazz.deck+xml',
'zip' => 'application/zip',
'zir' => 'application/vnd.zul',
'zirz' => 'application/vnd.zul',
'zmm' => 'application/vnd.handheld-entertainment+xml',
'zsh' => 'text/x-scriptzsh',
];






public static function fromFilename(string $filename): ?string
{
return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
}






public static function fromExtension(string $extension): ?string
{
return self::MIME_TYPES[strtolower($extension)] ?? null;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;





final class MultipartStream implements StreamInterface
{
use StreamDecoratorTrait;


private $boundary;


private $stream;













public function __construct(array $elements = [], ?string $boundary = null)
{
$this->boundary = $boundary ?: bin2hex(random_bytes(20));
$this->stream = $this->createStream($elements);
}

public function getBoundary(): string
{
return $this->boundary;
}

public function isWritable(): bool
{
return false;
}






private function getHeaders(array $headers): string
{
$str = '';
foreach ($headers as $key => $value) {
$str .= "{$key}: {$value}\r\n";
}

return "--{$this->boundary}\r\n".trim($str)."\r\n\r\n";
}




protected function createStream(array $elements = []): StreamInterface
{
$stream = new AppendStream();

foreach ($elements as $element) {
if (!is_array($element)) {
throw new \UnexpectedValueException('An array is expected');
}
$this->addElement($stream, $element);
}


$stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n"));

return $stream;
}

private function addElement(AppendStream $stream, array $element): void
{
foreach (['contents', 'name'] as $key) {
if (!array_key_exists($key, $element)) {
throw new \InvalidArgumentException("A '{$key}' key is required");
}
}

$element['contents'] = Utils::streamFor($element['contents']);

if (empty($element['filename'])) {
$uri = $element['contents']->getMetadata('uri');
if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') {
$element['filename'] = $uri;
}
}

[$body, $headers] = $this->createElement(
$element['name'],
$element['contents'],
$element['filename'] ?? null,
$element['headers'] ?? []
);

$stream->addStream(Utils::streamFor($this->getHeaders($headers)));
$stream->addStream($body);
$stream->addStream(Utils::streamFor("\r\n"));
}






private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array
{

$disposition = self::getHeader($headers, 'content-disposition');
if (!$disposition) {
$headers['Content-Disposition'] = ($filename === '0' || $filename)
? sprintf(
'form-data; name="%s"; filename="%s"',
$name,
basename($filename)
)
: "form-data; name=\"{$name}\"";
}


$length = self::getHeader($headers, 'content-length');
if (!$length) {
if ($length = $stream->getSize()) {
$headers['Content-Length'] = (string) $length;
}
}


$type = self::getHeader($headers, 'content-type');
if (!$type && ($filename === '0' || $filename)) {
$headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream';
}

return [$stream, $headers];
}




private static function getHeader(array $headers, string $key): ?string
{
$lowercaseHeader = strtolower($key);
foreach ($headers as $k => $v) {
if (strtolower((string) $k) === $lowercaseHeader) {
return $v;
}
}

return null;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use InvalidArgumentException;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileInterface;
use RuntimeException;

class UploadedFile implements UploadedFileInterface
{
private const ERROR_MAP = [
UPLOAD_ERR_OK => 'UPLOAD_ERR_OK',
UPLOAD_ERR_INI_SIZE => 'UPLOAD_ERR_INI_SIZE',
UPLOAD_ERR_FORM_SIZE => 'UPLOAD_ERR_FORM_SIZE',
UPLOAD_ERR_PARTIAL => 'UPLOAD_ERR_PARTIAL',
UPLOAD_ERR_NO_FILE => 'UPLOAD_ERR_NO_FILE',
UPLOAD_ERR_NO_TMP_DIR => 'UPLOAD_ERR_NO_TMP_DIR',
UPLOAD_ERR_CANT_WRITE => 'UPLOAD_ERR_CANT_WRITE',
UPLOAD_ERR_EXTENSION => 'UPLOAD_ERR_EXTENSION',
];




private $clientFilename;




private $clientMediaType;




private $error;




private $file;




private $moved = false;




private $size;




private $stream;




public function __construct(
$streamOrFile,
?int $size,
int $errorStatus,
?string $clientFilename = null,
?string $clientMediaType = null
) {
$this->setError($errorStatus);
$this->size = $size;
$this->clientFilename = $clientFilename;
$this->clientMediaType = $clientMediaType;

if ($this->isOk()) {
$this->setStreamOrFile($streamOrFile);
}
}








private function setStreamOrFile($streamOrFile): void
{
if (is_string($streamOrFile)) {
$this->file = $streamOrFile;
} elseif (is_resource($streamOrFile)) {
$this->stream = new Stream($streamOrFile);
} elseif ($streamOrFile instanceof StreamInterface) {
$this->stream = $streamOrFile;
} else {
throw new InvalidArgumentException(
'Invalid stream or file provided for UploadedFile'
);
}
}




private function setError(int $error): void
{
if (!isset(UploadedFile::ERROR_MAP[$error])) {
throw new InvalidArgumentException(
'Invalid error status for UploadedFile'
);
}

$this->error = $error;
}

private static function isStringNotEmpty($param): bool
{
return is_string($param) && false === empty($param);
}




private function isOk(): bool
{
return $this->error === UPLOAD_ERR_OK;
}

public function isMoved(): bool
{
return $this->moved;
}




private function validateActive(): void
{
if (false === $this->isOk()) {
throw new RuntimeException(\sprintf('Cannot retrieve stream due to upload error (%s)', self::ERROR_MAP[$this->error]));
}

if ($this->isMoved()) {
throw new RuntimeException('Cannot retrieve stream after it has already been moved');
}
}

public function getStream(): StreamInterface
{
$this->validateActive();

if ($this->stream instanceof StreamInterface) {
return $this->stream;
}


$file = $this->file;

return new LazyOpenStream($file, 'r+');
}

public function moveTo($targetPath): void
{
$this->validateActive();

if (false === self::isStringNotEmpty($targetPath)) {
throw new InvalidArgumentException(
'Invalid path provided for move operation; must be a non-empty string'
);
}

if ($this->file) {
$this->moved = PHP_SAPI === 'cli'
? rename($this->file, $targetPath)
: move_uploaded_file($this->file, $targetPath);
} else {
Utils::copyToStream(
$this->getStream(),
new LazyOpenStream($targetPath, 'w')
);

$this->moved = true;
}

if (false === $this->moved) {
throw new RuntimeException(
sprintf('Uploaded file could not be moved to %s', $targetPath)
);
}
}

public function getSize(): ?int
{
return $this->size;
}

public function getError(): int
{
return $this->error;
}

public function getClientFilename(): ?string
{
return $this->clientFilename;
}

public function getClientMediaType(): ?string
{
return $this->clientMediaType;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use InvalidArgumentException;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;




class Request implements RequestInterface
{
use MessageTrait;


private $method;


private $requestTarget;


private $uri;








public function __construct(
string $method,
$uri,
array $headers = [],
$body = null,
string $version = '1.1'
) {
$this->assertMethod($method);
if (!($uri instanceof UriInterface)) {
$uri = new Uri($uri);
}

$this->method = strtoupper($method);
$this->uri = $uri;
$this->setHeaders($headers);
$this->protocol = $version;

if (!isset($this->headerNames['host'])) {
$this->updateHostFromUri();
}

if ($body !== '' && $body !== null) {
$this->stream = Utils::streamFor($body);
}
}

public function getRequestTarget(): string
{
if ($this->requestTarget !== null) {
return $this->requestTarget;
}

$target = $this->uri->getPath();
if ($target === '') {
$target = '/';
}
if ($this->uri->getQuery() != '') {
$target .= '?'.$this->uri->getQuery();
}

return $target;
}

public function withRequestTarget($requestTarget): RequestInterface
{
if (preg_match('#\s#', $requestTarget)) {
throw new InvalidArgumentException(
'Invalid request target provided; cannot contain whitespace'
);
}

$new = clone $this;
$new->requestTarget = $requestTarget;

return $new;
}

public function getMethod(): string
{
return $this->method;
}

public function withMethod($method): RequestInterface
{
$this->assertMethod($method);
$new = clone $this;
$new->method = strtoupper($method);

return $new;
}

public function getUri(): UriInterface
{
return $this->uri;
}

public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface
{
if ($uri === $this->uri) {
return $this;
}

$new = clone $this;
$new->uri = $uri;

if (!$preserveHost || !isset($this->headerNames['host'])) {
$new->updateHostFromUri();
}

return $new;
}

private function updateHostFromUri(): void
{
$host = $this->uri->getHost();

if ($host == '') {
return;
}

if (($port = $this->uri->getPort()) !== null) {
$host .= ':'.$port;
}

if (isset($this->headerNames['host'])) {
$header = $this->headerNames['host'];
} else {
$header = 'Host';
$this->headerNames['host'] = 'Host';
}


$this->headers = [$header => [$host]] + $this->headers;
}




private function assertMethod($method): void
{
if (!is_string($method) || $method === '') {
throw new InvalidArgumentException('Method must be a non-empty string.');
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\UriInterface;








final class UriResolver
{





public static function removeDotSegments(string $path): string
{
if ($path === '' || $path === '/') {
return $path;
}

$results = [];
$segments = explode('/', $path);
foreach ($segments as $segment) {
if ($segment === '..') {
array_pop($results);
} elseif ($segment !== '.') {
$results[] = $segment;
}
}

$newPath = implode('/', $results);

if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {

$newPath = '/'.$newPath;
} elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {


$newPath .= '/';
}

return $newPath;
}






public static function resolve(UriInterface $base, UriInterface $rel): UriInterface
{
if ((string) $rel === '') {

return $base;
}

if ($rel->getScheme() != '') {
return $rel->withPath(self::removeDotSegments($rel->getPath()));
}

if ($rel->getAuthority() != '') {
$targetAuthority = $rel->getAuthority();
$targetPath = self::removeDotSegments($rel->getPath());
$targetQuery = $rel->getQuery();
} else {
$targetAuthority = $base->getAuthority();
if ($rel->getPath() === '') {
$targetPath = $base->getPath();
$targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
} else {
if ($rel->getPath()[0] === '/') {
$targetPath = $rel->getPath();
} else {
if ($targetAuthority != '' && $base->getPath() === '') {
$targetPath = '/'.$rel->getPath();
} else {
$lastSlashPos = strrpos($base->getPath(), '/');
if ($lastSlashPos === false) {
$targetPath = $rel->getPath();
} else {
$targetPath = substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath();
}
}
}
$targetPath = self::removeDotSegments($targetPath);
$targetQuery = $rel->getQuery();
}
}

return new Uri(Uri::composeComponents(
$base->getScheme(),
$targetAuthority,
$targetPath,
$targetQuery,
$rel->getFragment()
));
}






















public static function relativize(UriInterface $base, UriInterface $target): UriInterface
{
if ($target->getScheme() !== ''
&& ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')
) {
return $target;
}

if (Uri::isRelativePathReference($target)) {



return $target;
}

if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {
return $target->withScheme('');
}




$emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');

if ($base->getPath() !== $target->getPath()) {
return $emptyPathUri->withPath(self::getRelativePath($base, $target));
}

if ($base->getQuery() === $target->getQuery()) {

return $emptyPathUri->withQuery('');
}



if ($target->getQuery() === '') {
$segments = explode('/', $target->getPath());

$lastSegment = end($segments);

return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);
}

return $emptyPathUri;
}

private static function getRelativePath(UriInterface $base, UriInterface $target): string
{
$sourceSegments = explode('/', $base->getPath());
$targetSegments = explode('/', $target->getPath());
array_pop($sourceSegments);
$targetLastSegment = array_pop($targetSegments);
foreach ($sourceSegments as $i => $segment) {
if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {
unset($sourceSegments[$i], $targetSegments[$i]);
} else {
break;
}
}
$targetSegments[] = $targetLastSegment;
$relativePath = str_repeat('../', count($sourceSegments)).implode('/', $targetSegments);




if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {
$relativePath = "./$relativePath";
} elseif ('/' === $relativePath[0]) {
if ($base->getAuthority() != '' && $base->getPath() === '') {

$relativePath = ".$relativePath";
} else {
$relativePath = "./$relativePath";
}
}

return $relativePath;
}

private function __construct()
{

}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Http\Message\UriFactoryInterface;
use Psr\Http\Message\UriInterface;







final class HttpFactory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface
{
public function createUploadedFile(
StreamInterface $stream,
?int $size = null,
int $error = \UPLOAD_ERR_OK,
?string $clientFilename = null,
?string $clientMediaType = null
): UploadedFileInterface {
if ($size === null) {
$size = $stream->getSize();
}

return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType);
}

public function createStream(string $content = ''): StreamInterface
{
return Utils::streamFor($content);
}

public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface
{
try {
$resource = Utils::tryFopen($file, $mode);
} catch (\RuntimeException $e) {
if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) {
throw new \InvalidArgumentException(sprintf('Invalid file opening mode "%s"', $mode), 0, $e);
}

throw $e;
}

return Utils::streamFor($resource);
}

public function createStreamFromResource($resource): StreamInterface
{
return Utils::streamFor($resource);
}

public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
{
if (empty($method)) {
if (!empty($serverParams['REQUEST_METHOD'])) {
$method = $serverParams['REQUEST_METHOD'];
} else {
throw new \InvalidArgumentException('Cannot determine HTTP method');
}
}

return new ServerRequest($method, $uri, [], null, '1.1', $serverParams);
}

public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface
{
return new Response($code, [], null, '1.1', $reasonPhrase);
}

public function createRequest(string $method, $uri): RequestInterface
{
return new Request($method, $uri);
}

public function createUri(string $uri = ''): UriInterface
{
return new Uri($uri);
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use GuzzleHttp\Psr7\Exception\MalformedUriException;
use Psr\Http\Message\UriInterface;








class Uri implements UriInterface, \JsonSerializable
{






private const HTTP_DEFAULT_HOST = 'localhost';

private const DEFAULT_PORTS = [
'http' => 80,
'https' => 443,
'ftp' => 21,
'gopher' => 70,
'nntp' => 119,
'news' => 119,
'telnet' => 23,
'tn3270' => 23,
'imap' => 143,
'pop' => 110,
'ldap' => 389,
];






private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~';






private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];


private $scheme = '';


private $userInfo = '';


private $host = '';


private $port;


private $path = '';


private $query = '';


private $fragment = '';


private $composedComponents;

public function __construct(string $uri = '')
{
if ($uri !== '') {
$parts = self::parse($uri);
if ($parts === false) {
throw new MalformedUriException("Unable to parse URI: $uri");
}
$this->applyParts($parts);
}
}
















private static function parse(string $url)
{

$prefix = '';
if (preg_match('%^(.*://\[[0-9:a-fA-F]+\])(.*?)$%', $url, $matches)) {

$prefix = $matches[1];
$url = $matches[2];
}


$encodedUrl = preg_replace_callback(
'%[^:/@?&=#]+%usD',
static function ($matches) {
return urlencode($matches[0]);
},
$url
);

$result = parse_url($prefix.$encodedUrl);

if ($result === false) {
return false;
}

return array_map('urldecode', $result);
}

public function __toString(): string
{
if ($this->composedComponents === null) {
$this->composedComponents = self::composeComponents(
$this->scheme,
$this->getAuthority(),
$this->path,
$this->query,
$this->fragment
);
}

return $this->composedComponents;
}



















public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string
{
$uri = '';


if ($scheme != '') {
$uri .= $scheme.':';
}

if ($authority != '' || $scheme === 'file') {
$uri .= '//'.$authority;
}

if ($authority != '' && $path != '' && $path[0] != '/') {
$path = '/'.$path;
}

$uri .= $path;

if ($query != '') {
$uri .= '?'.$query;
}

if ($fragment != '') {
$uri .= '#'.$fragment;
}

return $uri;
}







public static function isDefaultPort(UriInterface $uri): bool
{
return $uri->getPort() === null
|| (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]);
}
















public static function isAbsolute(UriInterface $uri): bool
{
return $uri->getScheme() !== '';
}








public static function isNetworkPathReference(UriInterface $uri): bool
{
return $uri->getScheme() === '' && $uri->getAuthority() !== '';
}








public static function isAbsolutePathReference(UriInterface $uri): bool
{
return $uri->getScheme() === ''
&& $uri->getAuthority() === ''
&& isset($uri->getPath()[0])
&& $uri->getPath()[0] === '/';
}








public static function isRelativePathReference(UriInterface $uri): bool
{
return $uri->getScheme() === ''
&& $uri->getAuthority() === ''
&& (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
}













public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool
{
if ($base !== null) {
$uri = UriResolver::resolve($base, $uri);

return ($uri->getScheme() === $base->getScheme())
&& ($uri->getAuthority() === $base->getAuthority())
&& ($uri->getPath() === $base->getPath())
&& ($uri->getQuery() === $base->getQuery());
}

return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
}










public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface
{
$result = self::getFilteredQueryString($uri, [$key]);

return $uri->withQuery(implode('&', $result));
}














public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface
{
$result = self::getFilteredQueryString($uri, [$key]);

$result[] = self::generateQueryString($key, $value);

return $uri->withQuery(implode('&', $result));
}









public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface
{
$result = self::getFilteredQueryString($uri, array_keys($keyValueArray));

foreach ($keyValueArray as $key => $value) {
$result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);
}

return $uri->withQuery(implode('&', $result));
}








public static function fromParts(array $parts): UriInterface
{
$uri = new self();
$uri->applyParts($parts);
$uri->validateState();

return $uri;
}

public function getScheme(): string
{
return $this->scheme;
}

public function getAuthority(): string
{
$authority = $this->host;
if ($this->userInfo !== '') {
$authority = $this->userInfo.'@'.$authority;
}

if ($this->port !== null) {
$authority .= ':'.$this->port;
}

return $authority;
}

public function getUserInfo(): string
{
return $this->userInfo;
}

public function getHost(): string
{
return $this->host;
}

public function getPort(): ?int
{
return $this->port;
}

public function getPath(): string
{
return $this->path;
}

public function getQuery(): string
{
return $this->query;
}

public function getFragment(): string
{
return $this->fragment;
}

public function withScheme($scheme): UriInterface
{
$scheme = $this->filterScheme($scheme);

if ($this->scheme === $scheme) {
return $this;
}

$new = clone $this;
$new->scheme = $scheme;
$new->composedComponents = null;
$new->removeDefaultPort();
$new->validateState();

return $new;
}

public function withUserInfo($user, $password = null): UriInterface
{
$info = $this->filterUserInfoComponent($user);
if ($password !== null) {
$info .= ':'.$this->filterUserInfoComponent($password);
}

if ($this->userInfo === $info) {
return $this;
}

$new = clone $this;
$new->userInfo = $info;
$new->composedComponents = null;
$new->validateState();

return $new;
}

public function withHost($host): UriInterface
{
$host = $this->filterHost($host);

if ($this->host === $host) {
return $this;
}

$new = clone $this;
$new->host = $host;
$new->composedComponents = null;
$new->validateState();

return $new;
}

public function withPort($port): UriInterface
{
$port = $this->filterPort($port);

if ($this->port === $port) {
return $this;
}

$new = clone $this;
$new->port = $port;
$new->composedComponents = null;
$new->removeDefaultPort();
$new->validateState();

return $new;
}

public function withPath($path): UriInterface
{
$path = $this->filterPath($path);

if ($this->path === $path) {
return $this;
}

$new = clone $this;
$new->path = $path;
$new->composedComponents = null;
$new->validateState();

return $new;
}

public function withQuery($query): UriInterface
{
$query = $this->filterQueryAndFragment($query);

if ($this->query === $query) {
return $this;
}

$new = clone $this;
$new->query = $query;
$new->composedComponents = null;

return $new;
}

public function withFragment($fragment): UriInterface
{
$fragment = $this->filterQueryAndFragment($fragment);

if ($this->fragment === $fragment) {
return $this;
}

$new = clone $this;
$new->fragment = $fragment;
$new->composedComponents = null;

return $new;
}

public function jsonSerialize(): string
{
return $this->__toString();
}






private function applyParts(array $parts): void
{
$this->scheme = isset($parts['scheme'])
? $this->filterScheme($parts['scheme'])
: '';
$this->userInfo = isset($parts['user'])
? $this->filterUserInfoComponent($parts['user'])
: '';
$this->host = isset($parts['host'])
? $this->filterHost($parts['host'])
: '';
$this->port = isset($parts['port'])
? $this->filterPort($parts['port'])
: null;
$this->path = isset($parts['path'])
? $this->filterPath($parts['path'])
: '';
$this->query = isset($parts['query'])
? $this->filterQueryAndFragment($parts['query'])
: '';
$this->fragment = isset($parts['fragment'])
? $this->filterQueryAndFragment($parts['fragment'])
: '';
if (isset($parts['pass'])) {
$this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']);
}

$this->removeDefaultPort();
}






private function filterScheme($scheme): string
{
if (!is_string($scheme)) {
throw new \InvalidArgumentException('Scheme must be a string');
}

return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
}






private function filterUserInfoComponent($component): string
{
if (!is_string($component)) {
throw new \InvalidArgumentException('User info must be a string');
}

return preg_replace_callback(
'/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$component
);
}






private function filterHost($host): string
{
if (!is_string($host)) {
throw new \InvalidArgumentException('Host must be a string');
}

return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
}






private function filterPort($port): ?int
{
if ($port === null) {
return null;
}

$port = (int) $port;
if (0 > $port || 0xFFFF < $port) {
throw new \InvalidArgumentException(
sprintf('Invalid port: %d. Must be between 0 and 65535', $port)
);
}

return $port;
}






private static function getFilteredQueryString(UriInterface $uri, array $keys): array
{
$current = $uri->getQuery();

if ($current === '') {
return [];
}

$decodedKeys = array_map(function ($k): string {
return rawurldecode((string) $k);
}, $keys);

return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
});
}

private static function generateQueryString(string $key, ?string $value): string
{



$queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);

if ($value !== null) {
$queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
}

return $queryString;
}

private function removeDefaultPort(): void
{
if ($this->port !== null && self::isDefaultPort($this)) {
$this->port = null;
}
}








private function filterPath($path): string
{
if (!is_string($path)) {
throw new \InvalidArgumentException('Path must be a string');
}

return preg_replace_callback(
'/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$path
);
}








private function filterQueryAndFragment($str): string
{
if (!is_string($str)) {
throw new \InvalidArgumentException('Query and fragment must be a string');
}

return preg_replace_callback(
'/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$str
);
}

private function rawurlencodeMatchZero(array $match): string
{
return rawurlencode($match[0]);
}

private function validateState(): void
{
if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
$this->host = self::HTTP_DEFAULT_HOST;
}

if ($this->getAuthority() === '') {
if (0 === strpos($this->path, '//')) {
throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"');
}
if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon');
}
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use InvalidArgumentException;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Http\Message\UriInterface;















class ServerRequest extends Request implements ServerRequestInterface
{



private $attributes = [];




private $cookieParams = [];




private $parsedBody;




private $queryParams = [];




private $serverParams;




private $uploadedFiles = [];









public function __construct(
string $method,
$uri,
array $headers = [],
$body = null,
string $version = '1.1',
array $serverParams = []
) {
$this->serverParams = $serverParams;

parent::__construct($method, $uri, $headers, $body, $version);
}








public static function normalizeFiles(array $files): array
{
$normalized = [];

foreach ($files as $key => $value) {
if ($value instanceof UploadedFileInterface) {
$normalized[$key] = $value;
} elseif (is_array($value) && isset($value['tmp_name'])) {
$normalized[$key] = self::createUploadedFileFromSpec($value);
} elseif (is_array($value)) {
$normalized[$key] = self::normalizeFiles($value);
continue;
} else {
throw new InvalidArgumentException('Invalid value in files specification');
}
}

return $normalized;
}











private static function createUploadedFileFromSpec(array $value)
{
if (is_array($value['tmp_name'])) {
return self::normalizeNestedFileSpec($value);
}

return new UploadedFile(
$value['tmp_name'],
(int) $value['size'],
(int) $value['error'],
$value['name'],
$value['type']
);
}









private static function normalizeNestedFileSpec(array $files = []): array
{
$normalizedFiles = [];

foreach (array_keys($files['tmp_name']) as $key) {
$spec = [
'tmp_name' => $files['tmp_name'][$key],
'size' => $files['size'][$key] ?? null,
'error' => $files['error'][$key] ?? null,
'name' => $files['name'][$key] ?? null,
'type' => $files['type'][$key] ?? null,
];
$normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
}

return $normalizedFiles;
}









public static function fromGlobals(): ServerRequestInterface
{
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$headers = getallheaders();
$uri = self::getUriFromGlobals();
$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);

return $serverRequest
->withCookieParams($_COOKIE)
->withQueryParams($_GET)
->withParsedBody($_POST)
->withUploadedFiles(self::normalizeFiles($_FILES));
}

private static function extractHostAndPortFromAuthority(string $authority): array
{
$uri = 'http://'.$authority;
$parts = parse_url($uri);
if (false === $parts) {
return [null, null];
}

$host = $parts['host'] ?? null;
$port = $parts['port'] ?? null;

return [$host, $port];
}




public static function getUriFromGlobals(): UriInterface
{
$uri = new Uri('');

$uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');

$hasPort = false;
if (isset($_SERVER['HTTP_HOST'])) {
[$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);
if ($host !== null) {
$uri = $uri->withHost($host);
}

if ($port !== null) {
$hasPort = true;
$uri = $uri->withPort($port);
}
} elseif (isset($_SERVER['SERVER_NAME'])) {
$uri = $uri->withHost($_SERVER['SERVER_NAME']);
} elseif (isset($_SERVER['SERVER_ADDR'])) {
$uri = $uri->withHost($_SERVER['SERVER_ADDR']);
}

if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {
$uri = $uri->withPort($_SERVER['SERVER_PORT']);
}

$hasQuery = false;
if (isset($_SERVER['REQUEST_URI'])) {
$requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2);
$uri = $uri->withPath($requestUriParts[0]);
if (isset($requestUriParts[1])) {
$hasQuery = true;
$uri = $uri->withQuery($requestUriParts[1]);
}
}

if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {
$uri = $uri->withQuery($_SERVER['QUERY_STRING']);
}

return $uri;
}

public function getServerParams(): array
{
return $this->serverParams;
}

public function getUploadedFiles(): array
{
return $this->uploadedFiles;
}

public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface
{
$new = clone $this;
$new->uploadedFiles = $uploadedFiles;

return $new;
}

public function getCookieParams(): array
{
return $this->cookieParams;
}

public function withCookieParams(array $cookies): ServerRequestInterface
{
$new = clone $this;
$new->cookieParams = $cookies;

return $new;
}

public function getQueryParams(): array
{
return $this->queryParams;
}

public function withQueryParams(array $query): ServerRequestInterface
{
$new = clone $this;
$new->queryParams = $query;

return $new;
}




public function getParsedBody()
{
return $this->parsedBody;
}

public function withParsedBody($data): ServerRequestInterface
{
$new = clone $this;
$new->parsedBody = $data;

return $new;
}

public function getAttributes(): array
{
return $this->attributes;
}




public function getAttribute($attribute, $default = null)
{
if (false === array_key_exists($attribute, $this->attributes)) {
return $default;
}

return $this->attributes[$attribute];
}

public function withAttribute($attribute, $value): ServerRequestInterface
{
$new = clone $this;
$new->attributes[$attribute] = $value;

return $new;
}

public function withoutAttribute($attribute): ServerRequestInterface
{
if (false === array_key_exists($attribute, $this->attributes)) {
return $this;
}

$new = clone $this;
unset($new->attributes[$attribute]);

return $new;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;







#[\AllowDynamicProperties]
final class FnStream implements StreamInterface
{
private const SLOTS = [
'__toString', 'close', 'detach', 'rewind',
'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',
'isReadable', 'read', 'getContents', 'getMetadata',
];


private $methods;




public function __construct(array $methods)
{
$this->methods = $methods;


foreach ($methods as $name => $fn) {
$this->{'_fn_'.$name} = $fn;
}
}






public function __get(string $name): void
{
throw new \BadMethodCallException(str_replace('_fn_', '', $name)
.'() is not implemented in the FnStream');
}




public function __destruct()
{
if (isset($this->_fn_close)) {
($this->_fn_close)();
}
}






public function __wakeup(): void
{
throw new \LogicException('FnStream should never be unserialized');
}










public static function decorate(StreamInterface $stream, array $methods)
{


foreach (array_diff(self::SLOTS, array_keys($methods)) as $diff) {

$callable = [$stream, $diff];
$methods[$diff] = $callable;
}

return new self($methods);
}

public function __toString(): string
{
try {

return ($this->_fn___toString)();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);

return '';
}
}

public function close(): void
{
($this->_fn_close)();
}

public function detach()
{
return ($this->_fn_detach)();
}

public function getSize(): ?int
{
return ($this->_fn_getSize)();
}

public function tell(): int
{
return ($this->_fn_tell)();
}

public function eof(): bool
{
return ($this->_fn_eof)();
}

public function isSeekable(): bool
{
return ($this->_fn_isSeekable)();
}

public function rewind(): void
{
($this->_fn_rewind)();
}

public function seek($offset, $whence = SEEK_SET): void
{
($this->_fn_seek)($offset, $whence);
}

public function isWritable(): bool
{
return ($this->_fn_isWritable)();
}

public function write($string): int
{
return ($this->_fn_write)($string);
}

public function isReadable(): bool
{
return ($this->_fn_isReadable)();
}

public function read($length): string
{
return ($this->_fn_read)($length);
}

public function getContents(): string
{
return ($this->_fn_getContents)();
}




public function getMetadata($key = null)
{
return ($this->_fn_getMetadata)($key);
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

final class Header
{








public static function parse($header): array
{
static $trimmed = "\"'  \n\t\r";
$params = $matches = [];

foreach ((array) $header as $value) {
foreach (self::splitList($value) 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;
}









public static function normalize($header): array
{
$result = [];
foreach ((array) $header as $value) {
foreach (self::splitList($value) as $parsed) {
$result[] = $parsed;
}
}

return $result;
}














public static function splitList($values): array
{
if (!\is_array($values)) {
$values = [$values];
}

$result = [];
foreach ($values as $value) {
if (!\is_string($value)) {
throw new \TypeError('$header must either be a string or an array containing strings.');
}

$v = '';
$isQuoted = false;
$isEscaped = false;
for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
if ($isEscaped) {
$v .= $value[$i];
$isEscaped = false;

continue;
}

if (!$isQuoted && $value[$i] === ',') {
$v = \trim($v);
if ($v !== '') {
$result[] = $v;
}

$v = '';
continue;
}

if ($isQuoted && $value[$i] === '\\') {
$isEscaped = true;
$v .= $value[$i];

continue;
}
if ($value[$i] === '"') {
$isQuoted = !$isQuoted;
$v .= $value[$i];

continue;
}

$v .= $value[$i];
}

$v = \trim($v);
if ($v !== '') {
$result[] = $v;
}
}

return $result;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;




final class LimitStream implements StreamInterface
{
use StreamDecoratorTrait;


private $offset;


private $limit;


private $stream;








public function __construct(
StreamInterface $stream,
int $limit = -1,
int $offset = 0
) {
$this->stream = $stream;
$this->setLimit($limit);
$this->setOffset($offset);
}

public function eof(): bool
{

if ($this->stream->eof()) {
return true;
}


if ($this->limit === -1) {
return false;
}

return $this->stream->tell() >= $this->offset + $this->limit;
}




public function getSize(): ?int
{
if (null === ($length = $this->stream->getSize())) {
return null;
} elseif ($this->limit === -1) {
return $length - $this->offset;
} else {
return min($this->limit, $length - $this->offset);
}
}




public function seek($offset, $whence = SEEK_SET): void
{
if ($whence !== SEEK_SET || $offset < 0) {
throw new \RuntimeException(sprintf(
'Cannot seek to offset %s with whence %s',
$offset,
$whence
));
}

$offset += $this->offset;

if ($this->limit !== -1) {
if ($offset > $this->offset + $this->limit) {
$offset = $this->offset + $this->limit;
}
}

$this->stream->seek($offset);
}




public function tell(): int
{
return $this->stream->tell() - $this->offset;
}








public function setOffset(int $offset): void
{
$current = $this->stream->tell();

if ($current !== $offset) {

if ($this->stream->isSeekable()) {
$this->stream->seek($offset);
} elseif ($current > $offset) {
throw new \RuntimeException("Could not seek to stream offset $offset");
} else {
$this->stream->read($offset - $current);
}
}

$this->offset = $offset;
}








public function setLimit(int $limit): void
{
$this->limit = $limit;
}

public function read($length): string
{
if ($this->limit === -1) {
return $this->stream->read($length);
}



$remaining = ($this->offset + $this->limit) - $this->stream->tell();
if ($remaining > 0) {


return $this->stream->read(min($remaining, $length));
}

return '';
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\StreamInterface;




trait MessageTrait
{

private $headers = [];


private $headerNames = [];


private $protocol = '1.1';


private $stream;

public function getProtocolVersion(): string
{
return $this->protocol;
}

public function withProtocolVersion($version): MessageInterface
{
if ($this->protocol === $version) {
return $this;
}

$new = clone $this;
$new->protocol = $version;

return $new;
}

public function getHeaders(): array
{
return $this->headers;
}

public function hasHeader($header): bool
{
return isset($this->headerNames[strtolower($header)]);
}

public function getHeader($header): array
{
$header = strtolower($header);

if (!isset($this->headerNames[$header])) {
return [];
}

$header = $this->headerNames[$header];

return $this->headers[$header];
}

public function getHeaderLine($header): string
{
return implode(', ', $this->getHeader($header));
}

public function withHeader($header, $value): MessageInterface
{
$this->assertHeader($header);
$value = $this->normalizeHeaderValue($value);
$normalized = strtolower($header);

$new = clone $this;
if (isset($new->headerNames[$normalized])) {
unset($new->headers[$new->headerNames[$normalized]]);
}
$new->headerNames[$normalized] = $header;
$new->headers[$header] = $value;

return $new;
}

public function withAddedHeader($header, $value): MessageInterface
{
$this->assertHeader($header);
$value = $this->normalizeHeaderValue($value);
$normalized = strtolower($header);

$new = clone $this;
if (isset($new->headerNames[$normalized])) {
$header = $this->headerNames[$normalized];
$new->headers[$header] = array_merge($this->headers[$header], $value);
} else {
$new->headerNames[$normalized] = $header;
$new->headers[$header] = $value;
}

return $new;
}

public function withoutHeader($header): MessageInterface
{
$normalized = strtolower($header);

if (!isset($this->headerNames[$normalized])) {
return $this;
}

$header = $this->headerNames[$normalized];

$new = clone $this;
unset($new->headers[$header], $new->headerNames[$normalized]);

return $new;
}

public function getBody(): StreamInterface
{
if (!$this->stream) {
$this->stream = Utils::streamFor('');
}

return $this->stream;
}

public function withBody(StreamInterface $body): MessageInterface
{
if ($body === $this->stream) {
return $this;
}

$new = clone $this;
$new->stream = $body;

return $new;
}




private function setHeaders(array $headers): void
{
$this->headerNames = $this->headers = [];
foreach ($headers as $header => $value) {

$header = (string) $header;

$this->assertHeader($header);
$value = $this->normalizeHeaderValue($value);
$normalized = strtolower($header);
if (isset($this->headerNames[$normalized])) {
$header = $this->headerNames[$normalized];
$this->headers[$header] = array_merge($this->headers[$header], $value);
} else {
$this->headerNames[$normalized] = $header;
$this->headers[$header] = $value;
}
}
}






private function normalizeHeaderValue($value): array
{
if (!is_array($value)) {
return $this->trimAndValidateHeaderValues([$value]);
}

return $this->trimAndValidateHeaderValues($value);
}















private function trimAndValidateHeaderValues(array $values): array
{
return array_map(function ($value) {
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)
));
}

$trimmed = trim((string) $value, " \t");
$this->assertValue($trimmed);

return $trimmed;
}, array_values($values));
}






private function assertHeader($header): void
{
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 (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
throw new \InvalidArgumentException(
sprintf('"%s" is not valid header name.', $header)
);
}
}











private function assertValue(string $value): void
{











if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
throw new \InvalidArgumentException(
sprintf('"%s" is not valid header value.', $value)
);
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

final class Query
{











public static function parse(string $str, $urlEncoding = true): array
{
$result = [];

if ($str === '') {
return $result;
}

if ($urlEncoding === true) {
$decoder = function ($value) {
return rawurldecode(str_replace('+', ' ', (string) $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 (!array_key_exists($key, $result)) {
$result[$key] = $value;
} else {
if (!is_array($result[$key])) {
$result[$key] = [$result[$key]];
}
$result[$key][] = $value;
}
}

return $result;
}
















public static function build(array $params, $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string
{
if (!$params) {
return '';
}

if ($encoding === false) {
$encoder = function (string $str): string {
return $str;
};
} elseif ($encoding === PHP_QUERY_RFC3986) {
$encoder = 'rawurlencode';
} elseif ($encoding === PHP_QUERY_RFC1738) {
$encoder = 'urlencode';
} else {
throw new \InvalidArgumentException('Invalid type');
}

$castBool = $treatBoolsAsInts ? static function ($v) { return (int) $v; } : static function ($v) { return $v ? 'true' : 'false'; };

$qs = '';
foreach ($params as $k => $v) {
$k = $encoder((string) $k);
if (!is_array($v)) {
$qs .= $k;
$v = is_bool($v) ? $castBool($v) : $v;
if ($v !== null) {
$qs .= '='.$encoder((string) $v);
}
$qs .= '&';
} else {
foreach ($v as $vv) {
$qs .= $k;
$vv = is_bool($vv) ? $castBool($vv) : $vv;
if ($vv !== null) {
$qs .= '='.$encoder((string) $vv);
}
$qs .= '&';
}
}
}

return $qs ? (string) substr($qs, 0, -1) : '';
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;





final class LazyOpenStream implements StreamInterface
{
use StreamDecoratorTrait;


private $filename;


private $mode;




private $stream;





public function __construct(string $filename, string $mode)
{
$this->filename = $filename;
$this->mode = $mode;



unset($this->stream);
}




protected function createStream(): StreamInterface
{
return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode));
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;











final class PumpStream implements StreamInterface
{

private $source;


private $size;


private $tellPos = 0;


private $metadata;


private $buffer;











public function __construct(callable $source, array $options = [])
{
$this->source = $source;
$this->size = $options['size'] ?? null;
$this->metadata = $options['metadata'] ?? [];
$this->buffer = new BufferStream();
}

public function __toString(): string
{
try {
return Utils::copyToString($this);
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);

return '';
}
}

public function close(): void
{
$this->detach();
}

public function detach()
{
$this->tellPos = 0;
$this->source = null;

return null;
}

public function getSize(): ?int
{
return $this->size;
}

public function tell(): int
{
return $this->tellPos;
}

public function eof(): bool
{
return $this->source === null;
}

public function isSeekable(): bool
{
return false;
}

public function rewind(): void
{
$this->seek(0);
}

public function seek($offset, $whence = SEEK_SET): void
{
throw new \RuntimeException('Cannot seek a PumpStream');
}

public function isWritable(): bool
{
return false;
}

public function write($string): int
{
throw new \RuntimeException('Cannot write to a PumpStream');
}

public function isReadable(): bool
{
return true;
}

public function read($length): string
{
$data = $this->buffer->read($length);
$readLen = strlen($data);
$this->tellPos += $readLen;
$remaining = $length - $readLen;

if ($remaining) {
$this->pump($remaining);
$data .= $this->buffer->read($remaining);
$this->tellPos += strlen($data) - $readLen;
}

return $data;
}

public function getContents(): string
{
$result = '';
while (!$this->eof()) {
$result .= $this->read(1000000);
}

return $result;
}




public function getMetadata($key = null)
{
if (!$key) {
return $this->metadata;
}

return $this->metadata[$key] ?? null;
}

private function pump(int $length): void
{
if ($this->source !== null) {
do {
$data = ($this->source)($length);
if ($data === false || $data === null) {
$this->source = null;

return;
}
$this->buffer->write($data);
$length -= strlen($data);
} while ($length > 0);
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;




class Response implements ResponseInterface
{
use MessageTrait;


private const PHRASES = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-status',
208 => 'Already Reported',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Switch Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Time-out',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Large',
415 => 'Unsupported Media Type',
416 => 'Requested range not satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
451 => 'Unavailable For Legal Reasons',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Time-out',
505 => 'HTTP Version not supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
510 => 'Not Extended',
511 => 'Network Authentication Required',
];


private $reasonPhrase;


private $statusCode;








public function __construct(
int $status = 200,
array $headers = [],
$body = null,
string $version = '1.1',
?string $reason = null
) {
$this->assertStatusCodeRange($status);

$this->statusCode = $status;

if ($body !== '' && $body !== null) {
$this->stream = Utils::streamFor($body);
}

$this->setHeaders($headers);
if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {
$this->reasonPhrase = self::PHRASES[$this->statusCode];
} else {
$this->reasonPhrase = (string) $reason;
}

$this->protocol = $version;
}

public function getStatusCode(): int
{
return $this->statusCode;
}

public function getReasonPhrase(): string
{
return $this->reasonPhrase;
}

public function withStatus($code, $reasonPhrase = ''): ResponseInterface
{
$this->assertStatusCodeIsInteger($code);
$code = (int) $code;
$this->assertStatusCodeRange($code);

$new = clone $this;
$new->statusCode = $code;
if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {
$reasonPhrase = self::PHRASES[$new->statusCode];
}
$new->reasonPhrase = (string) $reasonPhrase;

return $new;
}




private function assertStatusCodeIsInteger($statusCode): void
{
if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) {
throw new \InvalidArgumentException('Status code must be an integer value.');
}
}

private function assertStatusCodeRange(int $statusCode): void
{
if ($statusCode < 100 || $statusCode >= 600) {
throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;




class Stream implements StreamInterface
{




private const READABLE_MODES = '/r|a\+|ab\+|w\+|wb\+|x\+|xb\+|c\+|cb\+/';
private const WRITABLE_MODES = '/a|w|r\+|rb\+|rw|x|c/';


private $stream;

private $size;

private $seekable;

private $readable;

private $writable;

private $uri;

private $customMetadata;















public function __construct($stream, array $options = [])
{
if (!is_resource($stream)) {
throw new \InvalidArgumentException('Stream must be a resource');
}

if (isset($options['size'])) {
$this->size = $options['size'];
}

$this->customMetadata = $options['metadata'] ?? [];
$this->stream = $stream;
$meta = stream_get_meta_data($this->stream);
$this->seekable = $meta['seekable'];
$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 __destruct()
{
$this->close();
}

public function __toString(): string
{
try {
if ($this->isSeekable()) {
$this->seek(0);
}

return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);

return '';
}
}

public function getContents(): string
{
if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}

if (!$this->readable) {
throw new \RuntimeException('Cannot read from non-readable stream');
}

return Utils::tryGetContents($this->stream);
}

public function close(): void
{
if (isset($this->stream)) {
if (is_resource($this->stream)) {
fclose($this->stream);
}
$this->detach();
}
}

public function detach()
{
if (!isset($this->stream)) {
return null;
}

$result = $this->stream;
unset($this->stream);
$this->size = $this->uri = null;
$this->readable = $this->writable = $this->seekable = false;

return $result;
}

public function getSize(): ?int
{
if ($this->size !== null) {
return $this->size;
}

if (!isset($this->stream)) {
return null;
}


if ($this->uri) {
clearstatcache(true, $this->uri);
}

$stats = fstat($this->stream);
if (is_array($stats) && isset($stats['size'])) {
$this->size = $stats['size'];

return $this->size;
}

return null;
}

public function isReadable(): bool
{
return $this->readable;
}

public function isWritable(): bool
{
return $this->writable;
}

public function isSeekable(): bool
{
return $this->seekable;
}

public function eof(): bool
{
if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}

return feof($this->stream);
}

public function tell(): int
{
if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}

$result = ftell($this->stream);

if ($result === false) {
throw new \RuntimeException('Unable to determine stream position');
}

return $result;
}

public function rewind(): void
{
$this->seek(0);
}

public function seek($offset, $whence = SEEK_SET): void
{
$whence = (int) $whence;

if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}
if (!$this->seekable) {
throw new \RuntimeException('Stream is not seekable');
}
if (fseek($this->stream, $offset, $whence) === -1) {
throw new \RuntimeException('Unable to seek to stream position '
.$offset.' with whence '.var_export($whence, true));
}
}

public function read($length): string
{
if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}
if (!$this->readable) {
throw new \RuntimeException('Cannot read from non-readable stream');
}
if ($length < 0) {
throw new \RuntimeException('Length parameter cannot be negative');
}

if (0 === $length) {
return '';
}

try {
$string = fread($this->stream, $length);
} catch (\Exception $e) {
throw new \RuntimeException('Unable to read from stream', 0, $e);
}

if (false === $string) {
throw new \RuntimeException('Unable to read from stream');
}

return $string;
}

public function write($string): int
{
if (!isset($this->stream)) {
throw new \RuntimeException('Stream is detached');
}
if (!$this->writable) {
throw new \RuntimeException('Cannot write to a non-writable stream');
}


$this->size = null;
$result = fwrite($this->stream, $string);

if ($result === false) {
throw new \RuntimeException('Unable to write to stream');
}

return $result;
}




public function getMetadata($key = null)
{
if (!isset($this->stream)) {
return $key ? null : [];
} elseif (!$key) {
return $this->customMetadata + stream_get_meta_data($this->stream);
} elseif (isset($this->customMetadata[$key])) {
return $this->customMetadata[$key];
}

$meta = stream_get_meta_data($this->stream);

return $meta[$key] ?? null;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

final class Message
{





public static function toString(MessageInterface $message): string
{
if ($message instanceof RequestInterface) {
$msg = trim($message->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 (is_string($name) && 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();
}









public static function bodySummary(MessageInterface $message, int $truncateAt = 120): ?string
{
$body = $message->getBody();

if (!$body->isSeekable() || !$body->isReadable()) {
return null;
}

$size = $body->getSize();

if ($size === 0) {
return null;
}

$body->rewind();
$summary = $body->read($truncateAt);
$body->rewind();

if ($size > $truncateAt) {
$summary .= ' (truncated...)';
}



if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary) !== 0) {
return null;
}

return $summary;
}











public static function rewindBody(MessageInterface $message): void
{
$body = $message->getBody();

if ($body->tell()) {
$body->rewind();
}
}










public static function parseMessage(string $message): array
{
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');
}

[$rawHeaders, $body] = $messageParts;
$rawHeaders .= "\r\n"; 
$headerParts = preg_split("/\r?\n/", $rawHeaders, 2);

if ($headerParts === false || count($headerParts) !== 2) {
throw new \InvalidArgumentException('Invalid message: Missing status line');
}

[$startLine, $rawHeaders] = $headerParts;

if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') {

$rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);
}


$count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER);


if ($count !== substr_count($rawHeaders, "\n")) {

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,
];
}







public static function parseRequestUri(string $path, array $headers): string
{
$hostKey = array_filter(array_keys($headers), function ($k) {

$k = (string) $k;

return strtolower($k) === 'host';
});


if (!$hostKey) {
return $path;
}

$host = $headers[reset($hostKey)][0];
$scheme = substr($host, -4) === ':443' ? 'https' : 'http';

return $scheme.'://'.$host.'/'.ltrim($path, '/');
}






public static function parseRequest(string $message): RequestInterface
{
$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]);
}






public static function parseResponse(string $message): ResponseInterface
{
$data = self::parseMessage($message);



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],
$parts[2] ?? null
);
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;





final class DroppingStream implements StreamInterface
{
use StreamDecoratorTrait;


private $maxLength;


private $stream;





public function __construct(StreamInterface $stream, int $maxLength)
{
$this->stream = $stream;
$this->maxLength = $maxLength;
}

public function write($string): int
{
$diff = $this->maxLength - $this->stream->getSize();


if ($diff <= 0) {
return 0;
}


if (strlen($string) < $diff) {
return $this->stream->write($string);
}

return $this->stream->write(substr($string, 0, $diff));
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7\Exception;

use InvalidArgumentException;




class MalformedUriException extends InvalidArgumentException
{
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;




final class NoSeekStream implements StreamInterface
{
use StreamDecoratorTrait;


private $stream;

public function seek($offset, $whence = SEEK_SET): void
{
throw new \RuntimeException('Cannot seek a NoSeekStream');
}

public function isSeekable(): bool
{
return false;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\UriInterface;






final class UriComparator
{




public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool
{
if (\strcasecmp($original->getHost(), $modified->getHost()) !== 0) {
return true;
}

if ($original->getScheme() !== $modified->getScheme()) {
return true;
}

if (self::computePort($original) !== self::computePort($modified)) {
return true;
}

return false;
}

private static function computePort(UriInterface $uri): int
{
$port = $uri->getPort();

if (null !== $port) {
return $port;
}

return 'https' === $uri->getScheme() ? 443 : 80;
}

private function __construct()
{

}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\UriInterface;








final class UriNormalizer
{



public const PRESERVING_NORMALIZATIONS =
self::CAPITALIZE_PERCENT_ENCODING |
self::DECODE_UNRESERVED_CHARACTERS |
self::CONVERT_EMPTY_PATH |
self::REMOVE_DEFAULT_HOST |
self::REMOVE_DEFAULT_PORT |
self::REMOVE_DOT_SEGMENTS;






public const CAPITALIZE_PERCENT_ENCODING = 1;










public const DECODE_UNRESERVED_CHARACTERS = 2;






public const CONVERT_EMPTY_PATH = 4;












public const REMOVE_DEFAULT_HOST = 8;






public const REMOVE_DEFAULT_PORT = 16;









public const REMOVE_DOT_SEGMENTS = 32;










public const REMOVE_DUPLICATE_SLASHES = 64;












public const SORT_QUERY_PARAMETERS = 128;

















public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS): UriInterface
{
if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {
$uri = self::capitalizePercentEncoding($uri);
}

if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {
$uri = self::decodeUnreservedCharacters($uri);
}

if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === ''
&& ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')
) {
$uri = $uri->withPath('/');
}

if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
$uri = $uri->withHost('');
}

if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {
$uri = $uri->withPort(null);
}

if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {
$uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));
}

if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
$uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));
}

if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {
$queryKeyValues = explode('&', $uri->getQuery());
sort($queryKeyValues);
$uri = $uri->withQuery(implode('&', $queryKeyValues));
}

return $uri;
}















public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS): bool
{
return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);
}

private static function capitalizePercentEncoding(UriInterface $uri): UriInterface
{
$regex = '/(?:%[A-Fa-f0-9]{2})++/';

$callback = function (array $match): string {
return strtoupper($match[0]);
};

return
$uri->withPath(
preg_replace_callback($regex, $callback, $uri->getPath())
)->withQuery(
preg_replace_callback($regex, $callback, $uri->getQuery())
);
}

private static function decodeUnreservedCharacters(UriInterface $uri): UriInterface
{
$regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';

$callback = function (array $match): string {
return rawurldecode($match[0]);
};

return
$uri->withPath(
preg_replace_callback($regex, $callback, $uri->getPath())
)->withQuery(
preg_replace_callback($regex, $callback, $uri->getQuery())
);
}

private function __construct()
{

}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;






final class AppendStream implements StreamInterface
{

private $streams = [];


private $seekable = true;


private $current = 0;


private $pos = 0;





public function __construct(array $streams = [])
{
foreach ($streams as $stream) {
$this->addStream($stream);
}
}

public function __toString(): string
{
try {
$this->rewind();

return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);

return '';
}
}








public function addStream(StreamInterface $stream): void
{
if (!$stream->isReadable()) {
throw new \InvalidArgumentException('Each stream must be readable');
}


if (!$stream->isSeekable()) {
$this->seekable = false;
}

$this->streams[] = $stream;
}

public function getContents(): string
{
return Utils::copyToString($this);
}




public function close(): void
{
$this->pos = $this->current = 0;
$this->seekable = true;

foreach ($this->streams as $stream) {
$stream->close();
}

$this->streams = [];
}






public function detach()
{
$this->pos = $this->current = 0;
$this->seekable = true;

foreach ($this->streams as $stream) {
$stream->detach();
}

$this->streams = [];

return null;
}

public function tell(): int
{
return $this->pos;
}







public function getSize(): ?int
{
$size = 0;

foreach ($this->streams as $stream) {
$s = $stream->getSize();
if ($s === null) {
return null;
}
$size += $s;
}

return $size;
}

public function eof(): bool
{
return !$this->streams
|| ($this->current >= count($this->streams) - 1
&& $this->streams[$this->current]->eof());
}

public function rewind(): void
{
$this->seek(0);
}




public function seek($offset, $whence = SEEK_SET): void
{
if (!$this->seekable) {
throw new \RuntimeException('This AppendStream is not seekable');
} elseif ($whence !== SEEK_SET) {
throw new \RuntimeException('The AppendStream can only seek with SEEK_SET');
}

$this->pos = $this->current = 0;


foreach ($this->streams as $i => $stream) {
try {
$stream->rewind();
} catch (\Exception $e) {
throw new \RuntimeException('Unable to seek stream '
.$i.' of the AppendStream', 0, $e);
}
}


while ($this->pos < $offset && !$this->eof()) {
$result = $this->read(min(8096, $offset - $this->pos));
if ($result === '') {
break;
}
}
}




public function read($length): string
{
$buffer = '';
$total = count($this->streams) - 1;
$remaining = $length;
$progressToNext = false;

while ($remaining > 0) {

if ($progressToNext || $this->streams[$this->current]->eof()) {
$progressToNext = false;
if ($this->current === $total) {
break;
}
++$this->current;
}

$result = $this->streams[$this->current]->read($remaining);

if ($result === '') {
$progressToNext = true;
continue;
}

$buffer .= $result;
$remaining = $length - strlen($buffer);
}

$this->pos += strlen($buffer);

return $buffer;
}

public function isReadable(): bool
{
return true;
}

public function isWritable(): bool
{
return false;
}

public function isSeekable(): bool
{
return $this->seekable;
}

public function write($string): int
{
throw new \RuntimeException('Cannot write to an AppendStream');
}




public function getMetadata($key = null)
{
return $key ? null : [];
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;






trait StreamDecoratorTrait
{



public function __construct(StreamInterface $stream)
{
$this->stream = $stream;
}







public function __get(string $name)
{
if ($name === 'stream') {
$this->stream = $this->createStream();

return $this->stream;
}

throw new \UnexpectedValueException("$name not found on class");
}

public function __toString(): string
{
try {
if ($this->isSeekable()) {
$this->seek(0);
}

return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);

return '';
}
}

public function getContents(): string
{
return Utils::copyToString($this);
}






public function __call(string $method, array $args)
{

$callable = [$this->stream, $method];
$result = ($callable)(...$args);


return $result === $this->stream ? $this : $result;
}

public function close(): void
{
$this->stream->close();
}




public function getMetadata($key = null)
{
return $this->stream->getMetadata($key);
}

public function detach()
{
return $this->stream->detach();
}

public function getSize(): ?int
{
return $this->stream->getSize();
}

public function eof(): bool
{
return $this->stream->eof();
}

public function tell(): int
{
return $this->stream->tell();
}

public function isReadable(): bool
{
return $this->stream->isReadable();
}

public function isWritable(): bool
{
return $this->stream->isWritable();
}

public function isSeekable(): bool
{
return $this->stream->isSeekable();
}

public function rewind(): void
{
$this->seek(0);
}

public function seek($offset, $whence = SEEK_SET): void
{
$this->stream->seek($offset, $whence);
}

public function read($length): string
{
return $this->stream->read($length);
}

public function write($string): int
{
return $this->stream->write($string);
}






protected function createStream(): StreamInterface
{
throw new \BadMethodCallException('Not implemented');
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;





final class CachingStream implements StreamInterface
{
use StreamDecoratorTrait;


private $remoteStream;


private $skipReadBytes = 0;




private $stream;







public function __construct(
StreamInterface $stream,
?StreamInterface $target = null
) {
$this->remoteStream = $stream;
$this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));
}

public function getSize(): ?int
{
$remoteSize = $this->remoteStream->getSize();

if (null === $remoteSize) {
return null;
}

return max($this->stream->getSize(), $remoteSize);
}

public function rewind(): void
{
$this->seek(0);
}

public function seek($offset, $whence = SEEK_SET): void
{
if ($whence === SEEK_SET) {
$byte = $offset;
} elseif ($whence === SEEK_CUR) {
$byte = $offset + $this->tell();
} elseif ($whence === SEEK_END) {
$size = $this->remoteStream->getSize();
if ($size === null) {
$size = $this->cacheEntireStream();
}
$byte = $size + $offset;
} else {
throw new \InvalidArgumentException('Invalid whence');
}

$diff = $byte - $this->stream->getSize();

if ($diff > 0) {


while ($diff > 0 && !$this->remoteStream->eof()) {
$this->read($diff);
$diff = $byte - $this->stream->getSize();
}
} else {

$this->stream->seek($byte);
}
}

public function read($length): string
{

$data = $this->stream->read($length);
$remaining = $length - strlen($data);


if ($remaining) {




$remoteData = $this->remoteStream->read(
$remaining + $this->skipReadBytes
);

if ($this->skipReadBytes) {
$len = strlen($remoteData);
$remoteData = substr($remoteData, $this->skipReadBytes);
$this->skipReadBytes = max(0, $this->skipReadBytes - $len);
}

$data .= $remoteData;
$this->stream->write($remoteData);
}

return $data;
}

public function write($string): int
{




$overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
if ($overflow > 0) {
$this->skipReadBytes += $overflow;
}

return $this->stream->write($string);
}

public function eof(): bool
{
return $this->stream->eof() && $this->remoteStream->eof();
}




public function close(): void
{
$this->remoteStream->close();
$this->stream->close();
}

private function cacheEntireStream(): int
{
$target = new FnStream(['write' => 'strlen']);
Utils::copyToStream($this, $target);

return $this->tell();
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;






final class StreamWrapper
{

public $context;


private $stream;


private $mode;










public static function getResource(StreamInterface $stream)
{
self::register();

if ($stream->isReadable()) {
$mode = $stream->isWritable() ? 'r+' : 'r';
} elseif ($stream->isWritable()) {
$mode = 'w';
} else {
throw new \InvalidArgumentException('The stream must be readable, '
.'writable, or both.');
}

return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream));
}






public static function createStreamContext(StreamInterface $stream)
{
return stream_context_create([
'guzzle' => ['stream' => $stream],
]);
}




public static function register(): void
{
if (!in_array('guzzle', stream_get_wrappers())) {
stream_wrapper_register('guzzle', __CLASS__);
}
}

public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool
{
$options = stream_context_get_options($this->context);

if (!isset($options['guzzle']['stream'])) {
return false;
}

$this->mode = $mode;
$this->stream = $options['guzzle']['stream'];

return true;
}

public function stream_read(int $count): string
{
return $this->stream->read($count);
}

public function stream_write(string $data): int
{
return $this->stream->write($data);
}

public function stream_tell(): int
{
return $this->stream->tell();
}

public function stream_eof(): bool
{
return $this->stream->eof();
}

public function stream_seek(int $offset, int $whence): bool
{
$this->stream->seek($offset, $whence);

return true;
}




public function stream_cast(int $cast_as)
{
$stream = clone $this->stream;
$resource = $stream->detach();

return $resource ?? false;
}


















public function stream_stat()
{
if ($this->stream->getSize() === null) {
return false;
}

static $modeMap = [
'r' => 33060,
'rb' => 33060,
'r+' => 33206,
'w' => 33188,
'wb' => 33188,
];

return [
'dev' => 0,
'ino' => 0,
'mode' => $modeMap[$this->mode],
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => $this->stream->getSize() ?: 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0,
];
}


















public function url_stat(string $path, int $flags): array
{
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,
];
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;




final class Rfc7230
{









public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m";
public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)";
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Psr7;

use Psr\Http\Message\StreamInterface;









final class BufferStream implements StreamInterface
{

private $hwm;


private $buffer = '';








public function __construct(int $hwm = 16384)
{
$this->hwm = $hwm;
}

public function __toString(): string
{
return $this->getContents();
}

public function getContents(): string
{
$buffer = $this->buffer;
$this->buffer = '';

return $buffer;
}

public function close(): void
{
$this->buffer = '';
}

public function detach()
{
$this->close();

return null;
}

public function getSize(): ?int
{
return strlen($this->buffer);
}

public function isReadable(): bool
{
return true;
}

public function isWritable(): bool
{
return true;
}

public function isSeekable(): bool
{
return false;
}

public function rewind(): void
{
$this->seek(0);
}

public function seek($offset, $whence = SEEK_SET): void
{
throw new \RuntimeException('Cannot seek a BufferStream');
}

public function eof(): bool
{
return strlen($this->buffer) === 0;
}

public function tell(): int
{
throw new \RuntimeException('Cannot determine the position of a BufferStream');
}




public function read($length): string
{
$currentLength = strlen($this->buffer);

if ($length >= $currentLength) {

$result = $this->buffer;
$this->buffer = '';
} else {

$result = substr($this->buffer, 0, $length);
$this->buffer = substr($this->buffer, $length);
}

return $result;
}




public function write($string): int
{
$this->buffer .= $string;

if (strlen($this->buffer) >= $this->hwm) {
return 0;
}

return strlen($string);
}




public function getMetadata($key = null)
{
if ($key === 'hwm') {
return $this->hwm;
}

return $key ? null : [];
}
}
The MIT License (MIT)

Copyright (c) 2015 Michael Dowling <mtdowling@gmail.com>
Copyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk>
Copyright (c) 2017 Tobias Schultze <webmaster@tubo-world.de>
Copyright (c) 2020 Tobias Nyholm <tobias.nyholm@gmail.com>

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.
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;








class Promise implements PromiseInterface
{
private $state = self::PENDING;
private $result;
private $cancelFn;
private $waitFn;
private $waitList;
private $handlers = [];





public function __construct(
?callable $waitFn = null,
?callable $cancelFn = null
) {
$this->waitFn = $waitFn;
$this->cancelFn = $cancelFn;
}

public function then(
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {
if ($this->state === self::PENDING) {
$p = new Promise(null, [$this, 'cancel']);
$this->handlers[] = [$p, $onFulfilled, $onRejected];
$p->waitList = $this->waitList;
$p->waitList[] = $this;

return $p;
}


if ($this->state === self::FULFILLED) {
$promise = Create::promiseFor($this->result);

return $onFulfilled ? $promise->then($onFulfilled) : $promise;
}



$rejection = Create::rejectionFor($this->result);

return $onRejected ? $rejection->then(null, $onRejected) : $rejection;
}

public function otherwise(callable $onRejected): PromiseInterface
{
return $this->then(null, $onRejected);
}

public function wait(bool $unwrap = true)
{
$this->waitIfPending();

if ($this->result instanceof PromiseInterface) {
return $this->result->wait($unwrap);
}
if ($unwrap) {
if ($this->state === self::FULFILLED) {
return $this->result;
}

throw Create::exceptionFor($this->result);
}
}

public function getState(): string
{
return $this->state;
}

public function cancel(): void
{
if ($this->state !== self::PENDING) {
return;
}

$this->waitFn = $this->waitList = null;

if ($this->cancelFn) {
$fn = $this->cancelFn;
$this->cancelFn = null;
try {
$fn();
} catch (\Throwable $e) {
$this->reject($e);
}
}


/**
@psalm-suppress */
if ($this->state === self::PENDING) {
$this->reject(new CancellationException('Promise has been cancelled'));
}
}

public function resolve($value): void
{
$this->settle(self::FULFILLED, $value);
}

public function reject($reason): void
{
$this->settle(self::REJECTED, $reason);
}

private function settle(string $state, $value): void
{
if ($this->state !== self::PENDING) {

if ($state === $this->state && $value === $this->result) {
return;
}
throw $this->state === $state
? new \LogicException("The promise is already {$state}.")
: new \LogicException("Cannot change a {$this->state} promise to {$state}");
}

if ($value === $this) {
throw new \LogicException('Cannot fulfill or reject a promise with itself');
}


$this->state = $state;
$this->result = $value;
$handlers = $this->handlers;
$this->handlers = null;
$this->waitList = $this->waitFn = null;
$this->cancelFn = null;

if (!$handlers) {
return;
}



if (!is_object($value) || !method_exists($value, 'then')) {
$id = $state === self::FULFILLED ? 1 : 2;

Utils::queue()->add(static function () use ($id, $value, $handlers): void {
foreach ($handlers as $handler) {
self::callHandler($id, $value, $handler);
}
});
} elseif ($value instanceof Promise && Is::pending($value)) {

$value->handlers = array_merge($value->handlers, $handlers);
} else {

$value->then(
static function ($value) use ($handlers): void {
foreach ($handlers as $handler) {
self::callHandler(1, $value, $handler);
}
},
static function ($reason) use ($handlers): void {
foreach ($handlers as $handler) {
self::callHandler(2, $reason, $handler);
}
}
);
}
}








private static function callHandler(int $index, $value, array $handler): void
{

$promise = $handler[0];



if (Is::settled($promise)) {
return;
}

try {
if (isset($handler[$index])) {






$f = $handler[$index];
unset($handler);
$promise->resolve($f($value));
} elseif ($index === 1) {

$promise->resolve($value);
} else {

$promise->reject($value);
}
} catch (\Throwable $reason) {
$promise->reject($reason);
}
}

private function waitIfPending(): void
{
if ($this->state !== self::PENDING) {
return;
} elseif ($this->waitFn) {
$this->invokeWaitFn();
} elseif ($this->waitList) {
$this->invokeWaitList();
} else {

$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.');
}

Utils::queue()->run();

/**
@psalm-suppress */
if ($this->state === self::PENDING) {
$this->reject('Invoking the wait callback did not resolve the promise');
}
}

private function invokeWaitFn(): void
{
try {
$wfn = $this->waitFn;
$this->waitFn = null;
$wfn(true);
} catch (\Throwable $reason) {
if ($this->state === self::PENDING) {


$this->reject($reason);
} else {


throw $reason;
}
}
}

private function invokeWaitList(): void
{
$waitList = $this->waitList;
$this->waitList = null;

foreach ($waitList as $result) {
do {
$result->waitIfPending();
$result = $result->result;
} while ($result instanceof Promise);

if ($result instanceof PromiseInterface) {
$result->wait(false);
}
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

final class Utils
{















public static function queue(?TaskQueueInterface $assign = null): TaskQueueInterface
{
static $queue;

if ($assign) {
$queue = $assign;
} elseif (!$queue) {
$queue = new TaskQueue();
}

return $queue;
}







public static function task(callable $task): PromiseInterface
{
$queue = self::queue();
$promise = new Promise([$queue, 'run']);
$queue->add(function () use ($task, $promise): void {
try {
if (Is::pending($promise)) {
$promise->resolve($task());
}
} catch (\Throwable $e) {
$promise->reject($e);
}
});

return $promise;
}













public static function inspect(PromiseInterface $promise): array
{
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];
}
}











public static function inspectAll($promises): array
{
$results = [];
foreach ($promises as $key => $promise) {
$results[$key] = self::inspect($promise);
}

return $results;
}












public static function unwrap($promises): array
{
$results = [];
foreach ($promises as $key => $promise) {
$results[$key] = $promise->wait();
}

return $results;
}












public static function all($promises, bool $recursive = false): PromiseInterface
{
$results = [];
$promise = Each::of(
$promises,
function ($value, $idx) use (&$results): void {
$results[$idx] = $value;
},
function ($reason, $idx, Promise $aggregate): void {
if (Is::pending($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;
}















public static function some(int $count, $promises): PromiseInterface
{
$results = [];
$rejections = [];

return Each::of(
$promises,
function ($value, $idx, PromiseInterface $p) use (&$results, $count): void {
if (Is::settled($p)) {
return;
}
$results[$idx] = $value;
if (count($results) >= $count) {
$p->resolve(null);
}
},
function ($reason) use (&$rejections): void {
$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);
}
);
}







public static function any($promises): PromiseInterface
{
return self::some(1, $promises)->then(function ($values) {
return $values[0];
});
}











public static function settle($promises): PromiseInterface
{
$results = [];

return Each::of(
$promises,
function ($value, $idx) use (&$results): void {
$results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];
},
function ($reason, $idx) use (&$results): void {
$results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];
}
)->then(function () use (&$results) {
ksort($results);

return $results;
});
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;









class FulfilledPromise implements PromiseInterface
{
private $value;




public function __construct($value)
{
if (is_object($value) && method_exists($value, 'then')) {
throw new \InvalidArgumentException(
'You cannot create a FulfilledPromise with a promise.'
);
}

$this->value = $value;
}

public function then(
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {

if (!$onFulfilled) {
return $this;
}

$queue = Utils::queue();
$p = new Promise([$queue, 'run']);
$value = $this->value;
$queue->add(static function () use ($p, $value, $onFulfilled): void {
if (Is::pending($p)) {
try {
$p->resolve($onFulfilled($value));
} catch (\Throwable $e) {
$p->reject($e);
}
}
});

return $p;
}

public function otherwise(callable $onRejected): PromiseInterface
{
return $this->then(null, $onRejected);
}

public function wait(bool $unwrap = true)
{
return $unwrap ? $this->value : null;
}

public function getState(): string
{
return self::FULFILLED;
}

public function resolve($value): void
{
if ($value !== $this->value) {
throw new \LogicException('Cannot resolve a fulfilled promise');
}
}

public function reject($reason): void
{
throw new \LogicException('Cannot reject a fulfilled promise');
}

public function cancel(): void
{

}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

final class Is
{



public static function pending(PromiseInterface $promise): bool
{
return $promise->getState() === PromiseInterface::PENDING;
}




public static function settled(PromiseInterface $promise): bool
{
return $promise->getState() !== PromiseInterface::PENDING;
}




public static function fulfilled(PromiseInterface $promise): bool
{
return $promise->getState() === PromiseInterface::FULFILLED;
}




public static function rejected(PromiseInterface $promise): bool
{
return $promise->getState() === PromiseInterface::REJECTED;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;









class RejectedPromise implements PromiseInterface
{
private $reason;




public function __construct($reason)
{
if (is_object($reason) && method_exists($reason, 'then')) {
throw new \InvalidArgumentException(
'You cannot create a RejectedPromise with a promise.'
);
}

$this->reason = $reason;
}

public function then(
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {

if (!$onRejected) {
return $this;
}

$queue = Utils::queue();
$reason = $this->reason;
$p = new Promise([$queue, 'run']);
$queue->add(static function () use ($p, $reason, $onRejected): void {
if (Is::pending($p)) {
try {

$p->resolve($onRejected($reason));
} catch (\Throwable $e) {

$p->reject($e);
}
}
});

return $p;
}

public function otherwise(callable $onRejected): PromiseInterface
{
return $this->then(null, $onRejected);
}

public function wait(bool $unwrap = true)
{
if ($unwrap) {
throw Create::exceptionFor($this->reason);
}

return null;
}

public function getState(): string
{
return self::REJECTED;
}

public function resolve($value): void
{
throw new \LogicException('Cannot resolve a rejected promise');
}

public function reject($reason): void
{
if ($reason !== $this->reason) {
throw new \LogicException('Cannot reject a rejected promise');
}
}

public function cancel(): void
{

}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;




class CancellationException extends RejectionException
{
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;






class RejectionException extends \RuntimeException
{

private $reason;





public function __construct($reason, ?string $description = null)
{
$this->reason = $reason;

$message = 'The promise was rejected';

if ($description) {
$message .= ' with reason: '.$description;
} elseif (is_string($reason)
|| (is_object($reason) && method_exists($reason, '__toString'))
) {
$message .= ' with reason: '.$this->reason;
} elseif ($reason instanceof \JsonSerializable) {
$message .= ' with reason: '.json_encode($this->reason, JSON_PRETTY_PRINT);
}

parent::__construct($message);
}






public function getReason()
{
return $this->reason;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;







class EachPromise implements PromisorInterface
{
private $pending = [];

private $nextPendingIndex = 0;


private $iterable;


private $concurrency;


private $onFulfilled;


private $onRejected;


private $aggregate;


private $mutex;






















public function __construct($iterable, array $config = [])
{
$this->iterable = Create::iterFor($iterable);

if (isset($config['concurrency'])) {
$this->concurrency = $config['concurrency'];
}

if (isset($config['fulfilled'])) {
$this->onFulfilled = $config['fulfilled'];
}

if (isset($config['rejected'])) {
$this->onRejected = $config['rejected'];
}
}

/**
@psalm-suppress */
public function promise(): PromiseInterface
{
if ($this->aggregate) {
return $this->aggregate;
}

try {
$this->createPromise();
/**
@psalm-assert */
$this->iterable->rewind();
$this->refillPending();
} catch (\Throwable $e) {
$this->aggregate->reject($e);
}

/**
@psalm-suppress
*/
return $this->aggregate;
}

private function createPromise(): void
{
$this->mutex = false;
$this->aggregate = new Promise(function (): void {
if ($this->checkIfFinished()) {
return;
}
reset($this->pending);


while ($promise = current($this->pending)) {
next($this->pending);
$promise->wait();
if (Is::settled($this->aggregate)) {
return;
}
}
});


$clearFn = function (): void {
$this->iterable = $this->concurrency = $this->pending = null;
$this->onFulfilled = $this->onRejected = null;
$this->nextPendingIndex = 0;
};

$this->aggregate->then($clearFn, $clearFn);
}

private function refillPending(): void
{
if (!$this->concurrency) {

while ($this->addPending() && $this->advanceIterator()) {
}

return;
}


$concurrency = is_callable($this->concurrency)
? ($this->concurrency)(count($this->pending))
: $this->concurrency;
$concurrency = max($concurrency - count($this->pending), 0);

if (!$concurrency) {
return;
}

$this->addPending();




while (--$concurrency
&& $this->advanceIterator()
&& $this->addPending()) {
}
}

private function addPending(): bool
{
if (!$this->iterable || !$this->iterable->valid()) {
return false;
}

$promise = Create::promiseFor($this->iterable->current());
$key = $this->iterable->key();



$idx = $this->nextPendingIndex++;

$this->pending[$idx] = $promise->then(
function ($value) use ($idx, $key): void {
if ($this->onFulfilled) {
($this->onFulfilled)(
$value,
$key,
$this->aggregate
);
}
$this->step($idx);
},
function ($reason) use ($idx, $key): void {
if ($this->onRejected) {
($this->onRejected)(
$reason,
$key,
$this->aggregate
);
}
$this->step($idx);
}
);

return true;
}

private function advanceIterator(): bool
{


if ($this->mutex) {
return false;
}

$this->mutex = true;

try {
$this->iterable->next();
$this->mutex = false;

return true;
} catch (\Throwable $e) {
$this->aggregate->reject($e);
$this->mutex = false;

return false;
}
}

private function step(int $idx): void
{

if (Is::settled($this->aggregate)) {
return;
}

unset($this->pending[$idx]);




if ($this->advanceIterator() && !$this->checkIfFinished()) {

$this->refillPending();
}
}

private function checkIfFinished(): bool
{
if (!$this->pending && !$this->iterable->valid()) {

$this->aggregate->resolve(null);

return true;
}

return false;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

interface TaskQueueInterface
{



public function isEmpty(): bool;





public function add(callable $task): void;




public function run(): void;
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

use Generator;
use Throwable;





































final class Coroutine implements PromiseInterface
{



private $currentPromise;




private $generator;




private $result;

public function __construct(callable $generatorFn)
{
$this->generator = $generatorFn();
$this->result = new Promise(function (): void {
while (isset($this->currentPromise)) {
$this->currentPromise->wait();
}
});
try {
$this->nextCoroutine($this->generator->current());
} catch (Throwable $throwable) {
$this->result->reject($throwable);
}
}




public static function of(callable $generatorFn): self
{
return new self($generatorFn);
}

public function then(
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {
return $this->result->then($onFulfilled, $onRejected);
}

public function otherwise(callable $onRejected): PromiseInterface
{
return $this->result->otherwise($onRejected);
}

public function wait(bool $unwrap = true)
{
return $this->result->wait($unwrap);
}

public function getState(): string
{
return $this->result->getState();
}

public function resolve($value): void
{
$this->result->resolve($value);
}

public function reject($reason): void
{
$this->result->reject($reason);
}

public function cancel(): void
{
$this->currentPromise->cancel();
$this->result->cancel();
}

private function nextCoroutine($yielded): void
{
$this->currentPromise = Create::promiseFor($yielded)
->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
}




public function _handleSuccess($value): void
{
unset($this->currentPromise);
try {
$next = $this->generator->send($value);
if ($this->generator->valid()) {
$this->nextCoroutine($next);
} else {
$this->result->resolve($value);
}
} catch (Throwable $throwable) {
$this->result->reject($throwable);
}
}




public function _handleFailure($reason): void
{
unset($this->currentPromise);
try {
$nextYield = $this->generator->throw(Create::exceptionFor($reason));

$this->nextCoroutine($nextYield);
} catch (Throwable $throwable) {
$this->result->reject($throwable);
}
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;




class AggregateException extends RejectionException
{
public function __construct(string $msg, array $reasons)
{
parent::__construct(
$reasons,
sprintf('%s; %d rejected promises', $msg, count($reasons))
);
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;










interface PromiseInterface
{
public const PENDING = 'pending';
public const FULFILLED = 'fulfilled';
public const REJECTED = 'rejected';








public function then(
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface;









public function otherwise(callable $onRejected): PromiseInterface;







public function getState(): string;








public function resolve($value): void;








public function reject($reason): void;






public function cancel(): void;














public function wait(bool $unwrap = true);
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;












class TaskQueue implements TaskQueueInterface
{
private $enableShutdown = true;
private $queue = [];

public function __construct(bool $withShutdown = true)
{
if ($withShutdown) {
register_shutdown_function(function (): void {
if ($this->enableShutdown) {

$err = error_get_last();
if (!$err || ($err['type'] ^ E_ERROR)) {
$this->run();
}
}
});
}
}

public function isEmpty(): bool
{
return !$this->queue;
}

public function add(callable $task): void
{
$this->queue[] = $task;
}

public function run(): void
{
while ($task = array_shift($this->queue)) {

$task();
}
}












public function disableShutdown(): void
{
$this->enableShutdown = false;
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

final class Create
{





public static function promiseFor($value): PromiseInterface
{
if ($value instanceof PromiseInterface) {
return $value;
}


if (is_object($value) && 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);
}







public static function rejectionFor($reason): PromiseInterface
{
if ($reason instanceof PromiseInterface) {
return $reason;
}

return new RejectedPromise($reason);
}






public static function exceptionFor($reason): \Throwable
{
if ($reason instanceof \Throwable) {
return $reason;
}

return new RejectionException($reason);
}






public static function iterFor($value): \Iterator
{
if ($value instanceof \Iterator) {
return $value;
}

if (is_array($value)) {
return new \ArrayIterator($value);
}

return new \ArrayIterator([$value]);
}
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;




interface PromisorInterface
{



public function promise(): PromiseInterface;
}
<?php

declare(strict_types=1);

namespace GuzzleHttp\Promise;

final class Each
{















public static function of(
$iterable,
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {
return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled,
'rejected' => $onRejected,
]))->promise();
}












public static function ofLimit(
$iterable,
$concurrency,
?callable $onFulfilled = null,
?callable $onRejected = null
): PromiseInterface {
return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled,
'rejected' => $onRejected,
'concurrency' => $concurrency,
]))->promise();
}









public static function ofLimitAll(
$iterable,
$concurrency,
?callable $onFulfilled = null
): PromiseInterface {
return self::ofLimit(
$iterable,
$concurrency,
$onFulfilled,
function ($reason, $idx, PromiseInterface $aggregate): void {
$aggregate->reject($reason);
}
);
}
}
{"name":"guzzle","lockfileVersion":3,"requires":true,"packages":{}}The MIT License (MIT)

Copyright (c) 2011 Michael Dowling <mtdowling@gmail.com>
Copyright (c) 2012 Jeremy Lindblom <jeremeamia@gmail.com>
Copyright (c) 2014 Graham Campbell <hello@gjcampbell.co.uk>
Copyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com>
Copyright (c) 2015 Tobias Schultze <webmaster@tubo-world.de>
Copyright (c) 2016 Tobias Nyholm <tobias.nyholm@gmail.com>
Copyright (c) 2016 George Mponos <gmponos@gmail.com>

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.
<?php

namespace GuzzleHttp;

use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;







class HandlerStack
{



private $handler;




private $stack = [];




private $cached;
















public static function create(?callable $handler = null): self
{
$stack = new self($handler ?: Utils::chooseHandler());
$stack->push(Middleware::httpErrors(), 'http_errors');
$stack->push(Middleware::redirect(), 'allow_redirects');
$stack->push(Middleware::cookies(), 'cookies');
$stack->push(Middleware::prepareBody(), 'prepare_body');

return $stack;
}




public function __construct(?callable $handler = null)
{
$this->handler = $handler;
}






public function __invoke(RequestInterface $request, array $options)
{
$handler = $this->resolve();

return $handler($request, $options);
}






public function __toString()
{
$depth = 0;
$stack = [];

if ($this->handler !== null) {
$stack[] = '0) Handler: '.$this->debugCallable($this->handler);
}

$result = '';
foreach (\array_reverse($this->stack) as $tuple) {
++$depth;
$str = "{$depth}) Name: '{$tuple[1]}', ";
$str .= 'Function: '.$this->debugCallable($tuple[0]);
$result = "> {$str}\n{$result}";
$stack[] = $str;
}

foreach (\array_keys($stack) as $k) {
$result .= "< {$stack[$k]}\n";
}

return $result;
}







public function setHandler(callable $handler): void
{
$this->handler = $handler;
$this->cached = null;
}




public function hasHandler(): bool
{
return $this->handler !== null;
}







public function unshift(callable $middleware, ?string $name = null): void
{
\array_unshift($this->stack, [$middleware, $name]);
$this->cached = null;
}







public function push(callable $middleware, string $name = ''): void
{
$this->stack[] = [$middleware, $name];
$this->cached = null;
}








public function before(string $findName, callable $middleware, string $withName = ''): void
{
$this->splice($findName, $withName, $middleware, true);
}








public function after(string $findName, callable $middleware, string $withName = ''): void
{
$this->splice($findName, $withName, $middleware, false);
}






public function remove($remove): void
{
if (!is_string($remove) && !is_callable($remove)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->cached = null;
$idx = \is_callable($remove) ? 0 : 1;
$this->stack = \array_values(\array_filter(
$this->stack,
static function ($tuple) use ($idx, $remove) {
return $tuple[$idx] !== $remove;
}
));
}






public function resolve(): callable
{
if ($this->cached === null) {
if (($prev = $this->handler) === null) {
throw new \LogicException('No handler has been specified');
}

foreach (\array_reverse($this->stack) as $fn) {

$prev = $fn[0]($prev);
}

$this->cached = $prev;
}

return $this->cached;
}

private function findByName(string $name): int
{
foreach ($this->stack as $k => $v) {
if ($v[1] === $name) {
return $k;
}
}

throw new \InvalidArgumentException("Middleware not found: $name");
}




private function splice(string $findName, string $withName, callable $middleware, bool $before): void
{
$this->cached = null;
$idx = $this->findByName($findName);
$tuple = [$middleware, $withName];

if ($before) {
if ($idx === 0) {
\array_unshift($this->stack, $tuple);
} else {
$replacement = [$tuple, $this->stack[$idx]];
\array_splice($this->stack, $idx, 1, $replacement);
}
} elseif ($idx === \count($this->stack) - 1) {
$this->stack[] = $tuple;
} else {
$replacement = [$this->stack[$idx], $tuple];
\array_splice($this->stack, $idx, 1, $replacement);
}
}






private function debugCallable($fn): string
{
if (\is_string($fn)) {
return "callable({$fn})";
}

if (\is_array($fn)) {
return \is_string($fn[0])
? "callable({$fn[0]}::{$fn[1]})"
: "callable(['".\get_class($fn[0])."', '{$fn[1]}'])";
}


return 'callable('.\spl_object_hash($fn).')';
}
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Exception\InvalidArgumentException;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Handler\CurlMultiHandler;
use GuzzleHttp\Handler\Proxy;
use GuzzleHttp\Handler\StreamHandler;
use Psr\Http\Message\UriInterface;

final class Utils
{








public static function describeType($input): string
{
switch (\gettype($input)) {
case 'object':
return 'object('.\get_class($input).')';
case 'array':
return 'array('.\count($input).')';
default:
\ob_start();
\var_dump($input);


$varDumpContent = \ob_get_clean();

return \str_replace('double(', 'float(', \rtrim($varDumpContent));
}
}







public static function headersFromLines(iterable $lines): array
{
$headers = [];

foreach ($lines as $line) {
$parts = \explode(':', $line, 2);
$headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null;
}

return $headers;
}








public static function debugResource($value = null)
{
if (\is_resource($value)) {
return $value;
}
if (\defined('STDOUT')) {
return \STDOUT;
}

return Psr7\Utils::tryFopen('php://output', 'w');
}










public static function chooseHandler(): callable
{
$handler = null;

if (\defined('CURLOPT_CUSTOMREQUEST') && \function_exists('curl_version') && version_compare(curl_version()['version'], '7.21.2') >= 0) {
if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) {
$handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
} elseif (\function_exists('curl_exec')) {
$handler = new CurlHandler();
} elseif (\function_exists('curl_multi_exec')) {
$handler = new CurlMultiHandler();
}
}

if (\ini_get('allow_url_fopen')) {
$handler = $handler
? Proxy::wrapStreaming($handler, new StreamHandler())
: new StreamHandler();
} elseif (!$handler) {
throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.');
}

return $handler;
}




public static function defaultUserAgent(): string
{
return sprintf('GuzzleHttp/%d', ClientInterface::MAJOR_VERSION);
}
















public static function defaultCaBundle(): string
{
static $cached = null;
static $cafiles = [

'/etc/pki/tls/certs/ca-bundle.crt',

'/etc/ssl/certs/ca-certificates.crt',

'/usr/local/share/certs/ca-root-nss.crt',

'/var/lib/ca-certificates/ca-bundle.pem',

'/usr/local/etc/openssl/cert.pem',

'/etc/ca-certificates.crt',

'C:\\windows\\system32\\curl-ca-bundle.crt',
'C:\\windows\\curl-ca-bundle.crt',
];

if ($cached) {
return $cached;
}

if ($ca = \ini_get('openssl.cafile')) {
return $cached = $ca;
}

if ($ca = \ini_get('curl.cainfo')) {
return $cached = $ca;
}

foreach ($cafiles as $filename) {
if (\file_exists($filename)) {
return $cached = $filename;
}
}

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
supply the path on disk to a certificate bundle to the 'verify' request
option: https://docs.guzzlephp.org/en/latest/request-options.html#verify. If
you do not need a specific certificate bundle, then Mozilla provides a commonly
used CA bundle which can be downloaded here (provided by the maintainer of
cURL): https://curl.haxx.se/ca/cacert.pem. Once you have a CA bundle available
on disk, you can set the 'openssl.cafile' PHP ini setting to point to the path
to the file, allowing you to omit the 'verify' request option. See
https://curl.haxx.se/docs/sslcerts.html for more information.
EOT
);
}





public static function normalizeHeaderKeys(array $headers): array
{
$result = [];
foreach (\array_keys($headers) as $key) {
$result[\strtolower($key)] = $key;
}

return $result;
}




















public static function isHostInNoProxy(string $host, array $noProxyArray): bool
{
if (\strlen($host) === 0) {
throw new InvalidArgumentException('Empty host provided');
}


[$host] = \explode(':', $host, 2);

foreach ($noProxyArray as $area) {

if ($area === '*') {
return true;
}

if (empty($area)) {

continue;
}

if ($area === $host) {

return true;
}


$area = '.'.\ltrim($area, '.');
if (\substr($host, -\strlen($area)) === $area) {
return true;
}
}

return false;
}
















public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
{
$data = \json_decode($json, $assoc, $depth, $options);
if (\JSON_ERROR_NONE !== \json_last_error()) {
throw new InvalidArgumentException('json_decode error: '.\json_last_error_msg());
}

return $data;
}












public static function jsonEncode($value, int $options = 0, int $depth = 512): string
{
$json = \json_encode($value, $options, $depth);
if (\JSON_ERROR_NONE !== \json_last_error()) {
throw new InvalidArgumentException('json_encode error: '.\json_last_error_msg());
}


return $json;
}









public static function currentTime(): float
{
return (float) \function_exists('hrtime') ? \hrtime(true) / 1e9 : \microtime(true);
}






public static function idnUriConvert(UriInterface $uri, int $options = 0): UriInterface
{
if ($uri->getHost()) {
$asciiHost = self::idnToAsci($uri->getHost(), $options, $info);
if ($asciiHost === false) {
$errorBitSet = $info['errors'] ?? 0;

$errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool {
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);
}
if ($uri->getHost() !== $asciiHost) {

$uri = $uri->withHost($asciiHost);
}
}

return $uri;
}




public static function getenv(string $name): ?string
{
if (isset($_SERVER[$name])) {
return (string) $_SERVER[$name];
}

if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== false && $value !== null) {
return (string) $value;
}

return null;
}




private static function idnToAsci(string $domain, int $options, ?array &$info = [])
{
if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) {
return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info);
}

throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old');
}
}
<?php


if (!\function_exists('GuzzleHttp\describe_type')) {
require __DIR__.'/functions.php';
}
<?php

namespace GuzzleHttp;

use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






























class MessageFormatter implements MessageFormatterInterface
{







public const CLF = '{hostname} {req_header_User-Agent} - [{date_common_log}] "{method} {target} HTTP/{version}" {code} {res_header_Content-Length}';
public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';




private $template;




public function __construct(?string $template = self::CLF)
{
$this->template = $template ?: self::CLF;
}








public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string
{
$cache = [];


return \preg_replace_callback(
'/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
function (array $matches) use ($request, $response, $error, &$cache) {
if (isset($cache[$matches[1]])) {
return $cache[$matches[1]];
}

$result = '';
switch ($matches[1]) {
case 'request':
$result = Psr7\Message::toString($request);
break;
case 'response':
$result = $response ? Psr7\Message::toString($response) : '';
break;
case 'req_headers':
$result = \trim($request->getMethod()
.' '.$request->getRequestTarget())
.' HTTP/'.$request->getProtocolVersion()."\r\n"
.$this->headers($request);
break;
case 'res_headers':
$result = $response ?
\sprintf(
'HTTP/%s %d %s',
$response->getProtocolVersion(),
$response->getStatusCode(),
$response->getReasonPhrase()
)."\r\n".$this->headers($response)
: 'NULL';
break;
case 'req_body':
$result = $request->getBody()->__toString();
break;
case 'res_body':
if (!$response instanceof ResponseInterface) {
$result = 'NULL';
break;
}

$body = $response->getBody();

if (!$body->isSeekable()) {
$result = 'RESPONSE_NOT_LOGGEABLE';
break;
}

$result = $response->getBody()->__toString();
break;
case 'ts':
case 'date_iso_8601':
$result = \gmdate('c');
break;
case 'date_common_log':
$result = \date('d/M/Y:H:i:s O');
break;
case 'method':
$result = $request->getMethod();
break;
case 'version':
$result = $request->getProtocolVersion();
break;
case 'uri':
case 'url':
$result = $request->getUri()->__toString();
break;
case 'target':
$result = $request->getRequestTarget();
break;
case 'req_version':
$result = $request->getProtocolVersion();
break;
case 'res_version':
$result = $response
? $response->getProtocolVersion()
: 'NULL';
break;
case 'host':
$result = $request->getHeaderLine('Host');
break;
case 'hostname':
$result = \gethostname();
break;
case 'code':
$result = $response ? $response->getStatusCode() : 'NULL';
break;
case 'phrase':
$result = $response ? $response->getReasonPhrase() : 'NULL';
break;
case 'error':
$result = $error ? $error->getMessage() : 'NULL';
break;
default:

if (\strpos($matches[1], 'req_header_') === 0) {
$result = $request->getHeaderLine(\substr($matches[1], 11));
} elseif (\strpos($matches[1], 'res_header_') === 0) {
$result = $response
? $response->getHeaderLine(\substr($matches[1], 11))
: 'NULL';
}
}

$cache[$matches[1]] = $result;

return $result;
},
$this->template
);
}




private function headers(MessageInterface $message): string
{
$result = '';
foreach ($message->getHeaders() as $name => $values) {
$result .= $name.': '.\implode(', ', $values)."\r\n";
}

return \trim($result);
}
}
<?php

namespace GuzzleHttp;












function describe_type($input): string
{
return Utils::describeType($input);
}









function headers_from_lines(iterable $lines): array
{
return Utils::headersFromLines($lines);
}










function debug_resource($value = null)
{
return Utils::debugResource($value);
}












function choose_handler(): callable
{
return Utils::chooseHandler();
}






function default_user_agent(): string
{
return Utils::defaultUserAgent();
}
















function default_ca_bundle(): string
{
return Utils::defaultCaBundle();
}







function normalize_header_keys(array $headers): array
{
return Utils::normalizeHeaderKeys($headers);
}






















function is_host_in_noproxy(string $host, array $noProxyArray): bool
{
return Utils::isHostInNoProxy($host, $noProxyArray);
}

















function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
{
return Utils::jsonDecode($json, $assoc, $depth, $options);
}













function json_encode($value, int $options = 0, int $depth = 512): string
{
return Utils::jsonEncode($value, $options, $depth);
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\InvalidArgumentException;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;




class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
{
use ClientTrait;




private $config;
































public function __construct(array $config = [])
{
if (!isset($config['handler'])) {
$config['handler'] = HandlerStack::create();
} elseif (!\is_callable($config['handler'])) {
throw new InvalidArgumentException('handler must be a callable');
}


if (isset($config['base_uri'])) {
$config['base_uri'] = Psr7\Utils::uriFor($config['base_uri']);
}

$this->configureDefaults($config);
}









public function __call($method, $args)
{
if (\count($args) < 1) {
throw new InvalidArgumentException('Magic request methods require a URI and optional options array');
}

$uri = $args[0];
$opts = $args[1] ?? [];

return \substr($method, -5) === 'Async'
? $this->requestAsync(\substr($method, 0, -5), $uri, $opts)
: $this->request($method, $uri, $opts);
}







public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface
{

$options = $this->prepareDefaults($options);

return $this->transfer(
$request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),
$options
);
}









public function send(RequestInterface $request, array $options = []): ResponseInterface
{
$options[RequestOptions::SYNCHRONOUS] = true;

return $this->sendAsync($request, $options)->wait();
}






public function sendRequest(RequestInterface $request): ResponseInterface
{
$options[RequestOptions::SYNCHRONOUS] = true;
$options[RequestOptions::ALLOW_REDIRECTS] = false;
$options[RequestOptions::HTTP_ERRORS] = false;

return $this->sendAsync($request, $options)->wait();
}













public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface
{
$options = $this->prepareDefaults($options);

$headers = $options['headers'] ?? [];
$body = $options['body'] ?? null;
$version = $options['version'] ?? '1.1';

$uri = $this->buildUri(Psr7\Utils::uriFor($uri), $options);
if (\is_array($body)) {
throw $this->invalidBody();
}
$request = new Psr7\Request($method, $uri, $headers, $body, $version);

unset($options['headers'], $options['body'], $options['version']);

return $this->transfer($request, $options);
}














public function request(string $method, $uri = '', array $options = []): ResponseInterface
{
$options[RequestOptions::SYNCHRONOUS] = true;

return $this->requestAsync($method, $uri, $options)->wait();
}














public function getConfig(?string $option = null)
{
return $option === null
? $this->config
: ($this->config[$option] ?? null);
}

private function buildUri(UriInterface $uri, array $config): UriInterface
{
if (isset($config['base_uri'])) {
$uri = Psr7\UriResolver::resolve(Psr7\Utils::uriFor($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;
}




private function configureDefaults(array $config): void
{
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false,
'idn_conversion' => false,
];






if (\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) {
$defaults['proxy']['http'] = $proxy;
}

if ($proxy = Utils::getenv('HTTPS_PROXY')) {
$defaults['proxy']['https'] = $proxy;
}

if ($noProxy = Utils::getenv('NO_PROXY')) {
$cleanedNoProxy = \str_replace(' ', '', $noProxy);
$defaults['proxy']['no'] = \explode(',', $cleanedNoProxy);
}

$this->config = $config + $defaults;

if (!empty($config['cookies']) && $config['cookies'] === true) {
$this->config['cookies'] = new CookieJar();
}


if (!isset($this->config['headers'])) {
$this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()];
} else {

foreach (\array_keys($this->config['headers']) as $name) {
if (\strtolower($name) === 'user-agent') {
return;
}
}
$this->config['headers']['User-Agent'] = Utils::defaultUserAgent();
}
}






private function prepareDefaults(array $options): array
{
$defaults = $this->config;

if (!empty($defaults['headers'])) {

$defaults['_conditional'] = $defaults['headers'];
unset($defaults['headers']);
}



if (\array_key_exists('headers', $options)) {

if ($options['headers'] === null) {
$defaults['_conditional'] = [];
unset($options['headers']);
} elseif (!\is_array($options['headers'])) {
throw new InvalidArgumentException('headers must be an array');
}
}


$result = $options + $defaults;


foreach ($result as $k => $v) {
if ($v === null) {
unset($result[$k]);
}
}

return $result;
}









private function transfer(RequestInterface $request, array $options): PromiseInterface
{
$request = $this->applyOptions($request, $options);

$handler = $options['handler'];

try {
return P\Create::promiseFor($handler($request, $options));
} catch (\Exception $e) {
return P\Create::rejectionFor($e);
}
}




private function applyOptions(RequestInterface $request, array &$options): RequestInterface
{
$modify = [
'set_headers' => [],
];

if (isset($options['headers'])) {
if (array_keys($options['headers']) === range(0, count($options['headers']) - 1)) {
throw new InvalidArgumentException('The headers array must have header name as keys.');
}
$modify['set_headers'] = $options['headers'];
unset($options['headers']);
}

if (isset($options['form_params'])) {
if (isset($options['multipart'])) {
throw new InvalidArgumentException('You cannot use '
.'form_params and multipart at the same time. Use the '
.'form_params option if you want to send application/'
.'x-www-form-urlencoded requests, and the multipart '
.'option to send multipart/form-data requests.');
}
$options['body'] = \http_build_query($options['form_params'], '', '&');
unset($options['form_params']);

$options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
$options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
}

if (isset($options['multipart'])) {
$options['body'] = new Psr7\MultipartStream($options['multipart']);
unset($options['multipart']);
}

if (isset($options['json'])) {
$options['body'] = Utils::jsonEncode($options['json']);
unset($options['json']);

$options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
$options['_conditional']['Content-Type'] = 'application/json';
}

if (!empty($options['decode_content'])
&& $options['decode_content'] !== true
) {

$options['_conditional'] = Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']);
$modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
}

if (isset($options['body'])) {
if (\is_array($options['body'])) {
throw $this->invalidBody();
}
$modify['body'] = Psr7\Utils::streamFor($options['body']);
unset($options['body']);
}

if (!empty($options['auth']) && \is_array($options['auth'])) {
$value = $options['auth'];
$type = isset($value[2]) ? \strtolower($value[2]) : 'basic';
switch ($type) {
case 'basic':

$modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']);
$modify['set_headers']['Authorization'] = 'Basic '
.\base64_encode("$value[0]:$value[1]");
break;
case 'digest':

$options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST;
$options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]";
break;
case 'ntlm':
$options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM;
$options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]";
break;
}
}

if (isset($options['query'])) {
$value = $options['query'];
if (\is_array($value)) {
$value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986);
}
if (!\is_string($value)) {
throw new InvalidArgumentException('query must be a string or array');
}
$modify['query'] = $value;
unset($options['query']);
}


if (isset($options['sink'])) {

if (\is_bool($options['sink'])) {
throw new InvalidArgumentException('sink must not be a boolean');
}
}

if (isset($options['version'])) {
$modify['version'] = $options['version'];
}

$request = Psr7\Utils::modifyRequest($request, $modify);
if ($request->getBody() instanceof Psr7\MultipartStream) {


$options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
$options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
.$request->getBody()->getBoundary();
}


if (isset($options['_conditional'])) {

$modify = [];
foreach ($options['_conditional'] as $k => $v) {
if (!$request->hasHeader($k)) {
$modify['set_headers'][$k] = $v;
}
}
$request = Psr7\Utils::modifyRequest($request, $modify);

unset($options['_conditional']);
}

return $request;
}




private function invalidBody(): InvalidArgumentException
{
return new InvalidArgumentException('Passing in the "body" request '
.'option as an array to send a request is not supported. '
.'Please use the "form_params" request option to send a '
.'application/x-www-form-urlencoded request, or the "multipart" '
.'request option to send a multipart/form-data request.');
}
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;







class PrepareBodyMiddleware
{



private $nextHandler;




public function __construct(callable $nextHandler)
{
$this->nextHandler = $nextHandler;
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
$fn = $this->nextHandler;


if ($request->getBody()->getSize() === 0) {
return $fn($request, $options);
}

$modify = [];


if (!$request->hasHeader('Content-Type')) {
if ($uri = $request->getBody()->getMetadata('uri')) {
if (is_string($uri) && $type = Psr7\MimeType::fromFilename($uri)) {
$modify['set_headers']['Content-Type'] = $type;
}
}
}


if (!$request->hasHeader('Content-Length')
&& !$request->hasHeader('Transfer-Encoding')
) {
$size = $request->getBody()->getSize();
if ($size !== null) {
$modify['set_headers']['Content-Length'] = $size;
} else {
$modify['set_headers']['Transfer-Encoding'] = 'chunked';
}
}


$this->addExpectHeader($request, $options, $modify);

return $fn(Psr7\Utils::modifyRequest($request, $modify), $options);
}




private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void
{

if ($request->hasHeader('Expect')) {
return;
}

$expect = $options['expect'] ?? null;


if ($expect === false || $request->getProtocolVersion() === '1.0') {
return;
}


if ($expect === true) {
$modify['set_headers']['Expect'] = '100-Continue';

return;
}


if ($expect === null) {
$expect = 1048576;
}



$body = $request->getBody();
$size = $body->getSize();

if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
$modify['set_headers']['Expect'] = '100-Continue';
}
}
}
<?php

namespace GuzzleHttp\Cookie;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;




class CookieJar implements CookieJarInterface
{



private $cookies = [];




private $strictMode;








public function __construct(bool $strictMode = false, array $cookieArray = [])
{
$this->strictMode = $strictMode;

foreach ($cookieArray as $cookie) {
if (!($cookie instanceof SetCookie)) {
$cookie = new SetCookie($cookie);
}
$this->setCookie($cookie);
}
}







public static function fromArray(array $cookies, string $domain): self
{
$cookieJar = new self();
foreach ($cookies as $name => $value) {
$cookieJar->setCookie(new SetCookie([
'Domain' => $domain,
'Name' => $name,
'Value' => $value,
'Discard' => true,
]));
}

return $cookieJar;
}








public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = false): bool
{
if ($cookie->getExpires() || $allowSessionCookies) {
if (!$cookie->getDiscard()) {
return true;
}
}

return false;
}








public function getCookieByName(string $name): ?SetCookie
{
foreach ($this->cookies as $cookie) {
if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) {
return $cookie;
}
}

return null;
}

public function toArray(): array
{
return \array_map(static function (SetCookie $cookie): array {
return $cookie->toArray();
}, $this->getIterator()->getArrayCopy());
}

public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
{
if (!$domain) {
$this->cookies = [];

return;
} elseif (!$path) {
$this->cookies = \array_filter(
$this->cookies,
static function (SetCookie $cookie) use ($domain): bool {
return !$cookie->matchesDomain($domain);
}
);
} elseif (!$name) {
$this->cookies = \array_filter(
$this->cookies,
static function (SetCookie $cookie) use ($path, $domain): bool {
return !($cookie->matchesPath($path)
&& $cookie->matchesDomain($domain));
}
);
} else {
$this->cookies = \array_filter(
$this->cookies,
static function (SetCookie $cookie) use ($path, $domain, $name) {
return !($cookie->getName() == $name
&& $cookie->matchesPath($path)
&& $cookie->matchesDomain($domain));
}
);
}
}

public function clearSessionCookies(): void
{
$this->cookies = \array_filter(
$this->cookies,
static function (SetCookie $cookie): bool {
return !$cookie->getDiscard() && $cookie->getExpires();
}
);
}

public function setCookie(SetCookie $cookie): bool
{


$name = $cookie->getName();
if (!$name && $name !== '0') {
return false;
}


$result = $cookie->validate();
if ($result !== true) {
if ($this->strictMode) {
throw new \RuntimeException('Invalid cookie: '.$result);
}
$this->removeCookieIfEmpty($cookie);

return false;
}


foreach ($this->cookies as $i => $c) {


if ($c->getPath() != $cookie->getPath()
|| $c->getDomain() != $cookie->getDomain()
|| $c->getName() != $cookie->getName()
) {
continue;
}



if (!$cookie->getDiscard() && $c->getDiscard()) {
unset($this->cookies[$i]);
continue;
}



if ($cookie->getExpires() > $c->getExpires()) {
unset($this->cookies[$i]);
continue;
}


if ($cookie->getValue() !== $c->getValue()) {
unset($this->cookies[$i]);
continue;
}


return false;
}

$this->cookies[] = $cookie;

return true;
}

public function count(): int
{
return \count($this->cookies);
}




public function getIterator(): \ArrayIterator
{
return new \ArrayIterator(\array_values($this->cookies));
}

public function extractCookies(RequestInterface $request, ResponseInterface $response): void
{
if ($cookieHeader = $response->getHeader('Set-Cookie')) {
foreach ($cookieHeader as $cookie) {
$sc = SetCookie::fromString($cookie);
if (!$sc->getDomain()) {
$sc->setDomain($request->getUri()->getHost());
}
if (0 !== \strpos($sc->getPath(), '/')) {
$sc->setPath($this->getCookiePathFromRequest($request));
}
if (!$sc->matchesDomain($request->getUri()->getHost())) {
continue;
}


$this->setCookie($sc);
}
}
}






private function getCookiePathFromRequest(RequestInterface $request): string
{
$uriPath = $request->getUri()->getPath();
if ('' === $uriPath) {
return '/';
}
if (0 !== \strpos($uriPath, '/')) {
return '/';
}
if ('/' === $uriPath) {
return '/';
}
$lastSlashPos = \strrpos($uriPath, '/');
if (0 === $lastSlashPos || false === $lastSlashPos) {
return '/';
}

return \substr($uriPath, 0, $lastSlashPos);
}

public function withCookieHeader(RequestInterface $request): RequestInterface
{
$values = [];
$uri = $request->getUri();
$scheme = $uri->getScheme();
$host = $uri->getHost();
$path = $uri->getPath() ?: '/';

foreach ($this->cookies as $cookie) {
if ($cookie->matchesPath($path)
&& $cookie->matchesDomain($host)
&& !$cookie->isExpired()
&& (!$cookie->getSecure() || $scheme === 'https')
) {
$values[] = $cookie->getName().'='
.$cookie->getValue();
}
}

return $values
? $request->withHeader('Cookie', \implode('; ', $values))
: $request;
}





private function removeCookieIfEmpty(SetCookie $cookie): void
{
$cookieValue = $cookie->getValue();
if ($cookieValue === null || $cookieValue === '') {
$this->clear(
$cookie->getDomain(),
$cookie->getPath(),
$cookie->getName()
);
}
}
}
<?php

namespace GuzzleHttp\Cookie;




class SetCookie
{



private static $defaults = [
'Name' => null,
'Value' => null,
'Domain' => null,
'Path' => '/',
'Max-Age' => null,
'Expires' => null,
'Secure' => false,
'Discard' => false,
'HttpOnly' => false,
];




private $data;






public static function fromString(string $cookie): self
{

$data = self::$defaults;

$pieces = \array_filter(\array_map('trim', \explode(';', $cookie)));

if (!isset($pieces[0]) || \strpos($pieces[0], '=') === false) {
return new self($data);
}


foreach ($pieces as $part) {
$cookieParts = \explode('=', $part, 2);
$key = \trim($cookieParts[0]);
$value = isset($cookieParts[1])
? \trim($cookieParts[1], " \n\r\t\0\x0B")
: true;


if (!isset($data['Name'])) {
$data['Name'] = $key;
$data['Value'] = $value;
} else {
foreach (\array_keys(self::$defaults) as $search) {
if (!\strcasecmp($search, $key)) {
if ($search === 'Max-Age') {
if (is_numeric($value)) {
$data[$search] = (int) $value;
}
} elseif ($search === 'Secure' || $search === 'Discard' || $search === 'HttpOnly') {
if ($value) {
$data[$search] = true;
}
} else {
$data[$search] = $value;
}
continue 2;
}
}
$data[$key] = $value;
}
}

return new self($data);
}




public function __construct(array $data = [])
{
$this->data = self::$defaults;

if (isset($data['Name'])) {
$this->setName($data['Name']);
}

if (isset($data['Value'])) {
$this->setValue($data['Value']);
}

if (isset($data['Domain'])) {
$this->setDomain($data['Domain']);
}

if (isset($data['Path'])) {
$this->setPath($data['Path']);
}

if (isset($data['Max-Age'])) {
$this->setMaxAge($data['Max-Age']);
}

if (isset($data['Expires'])) {
$this->setExpires($data['Expires']);
}

if (isset($data['Secure'])) {
$this->setSecure($data['Secure']);
}

if (isset($data['Discard'])) {
$this->setDiscard($data['Discard']);
}

if (isset($data['HttpOnly'])) {
$this->setHttpOnly($data['HttpOnly']);
}


foreach (array_diff(array_keys($data), array_keys(self::$defaults)) as $key) {
$this->data[$key] = $data[$key];
}


if (!$this->getExpires() && $this->getMaxAge()) {

$this->setExpires(\time() + $this->getMaxAge());
} elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) {
$this->setExpires($expires);
}
}

public function __toString()
{
$str = $this->data['Name'].'='.($this->data['Value'] ?? '').'; ';
foreach ($this->data as $k => $v) {
if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
if ($k === 'Expires') {
$str .= 'Expires='.\gmdate('D, d M Y H:i:s \G\M\T', $v).'; ';
} else {
$str .= ($v === true ? $k : "{$k}={$v}").'; ';
}
}
}

return \rtrim($str, '; ');
}

public function toArray(): array
{
return $this->data;
}






public function getName()
{
return $this->data['Name'];
}






public function setName($name): void
{
if (!is_string($name)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Name'] = (string) $name;
}






public function getValue()
{
return $this->data['Value'];
}






public function setValue($value): void
{
if (!is_string($value)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Value'] = (string) $value;
}






public function getDomain()
{
return $this->data['Domain'];
}






public function setDomain($domain): void
{
if (!is_string($domain) && null !== $domain) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Domain'] = null === $domain ? null : (string) $domain;
}






public function getPath()
{
return $this->data['Path'];
}






public function setPath($path): void
{
if (!is_string($path)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Path'] = (string) $path;
}






public function getMaxAge()
{
return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age'];
}






public function setMaxAge($maxAge): void
{
if (!is_int($maxAge) && null !== $maxAge) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge;
}






public function getExpires()
{
return $this->data['Expires'];
}






public function setExpires($timestamp): void
{
if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp));
}






public function getSecure()
{
return $this->data['Secure'];
}






public function setSecure($secure): void
{
if (!is_bool($secure)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Secure'] = (bool) $secure;
}






public function getDiscard()
{
return $this->data['Discard'];
}






public function setDiscard($discard): void
{
if (!is_bool($discard)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['Discard'] = (bool) $discard;
}






public function getHttpOnly()
{
return $this->data['HttpOnly'];
}






public function setHttpOnly($httpOnly): void
{
if (!is_bool($httpOnly)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}

$this->data['HttpOnly'] = (bool) $httpOnly;
}
















public function matchesPath(string $requestPath): bool
{
$cookiePath = $this->getPath();


if ($cookiePath === '/' || $cookiePath == $requestPath) {
return true;
}


if (0 !== \strpos($requestPath, $cookiePath)) {
return false;
}


if (\substr($cookiePath, -1, 1) === '/') {
return true;
}


return \substr($requestPath, \strlen($cookiePath), 1) === '/';
}






public function matchesDomain(string $domain): bool
{
$cookieDomain = $this->getDomain();
if (null === $cookieDomain) {
return true;
}



$cookieDomain = \ltrim(\strtolower($cookieDomain), '.');

$domain = \strtolower($domain);


if ('' === $cookieDomain || $domain === $cookieDomain) {
return true;
}



if (\filter_var($domain, \FILTER_VALIDATE_IP)) {
return false;
}

return (bool) \preg_match('/\.'.\preg_quote($cookieDomain, '/').'$/', $domain);
}




public function isExpired(): bool
{
return $this->getExpires() !== null && \time() > $this->getExpires();
}






public function validate()
{
$name = $this->getName();
if ($name === '') {
return 'The cookie name must not be empty';
}


if (\preg_match(
'/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/',
$name
)) {
return 'Cookie name must not contain invalid characters: ASCII '
.'Control characters (0-31;127), space, tab and the '
.'following characters: ()<>@,;:\"/?={}';
}



$value = $this->getValue();
if ($value === null) {
return 'The cookie value must not be empty';
}



$domain = $this->getDomain();
if ($domain === null || $domain === '') {
return 'The cookie domain must not be empty';
}

return true;
}
}
<?php

namespace GuzzleHttp\Cookie;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

/**
@extends









*/
interface CookieJarInterface extends \Countable, \IteratorAggregate
{










public function withCookieHeader(RequestInterface $request): RequestInterface;







public function extractCookies(RequestInterface $request, ResponseInterface $response): void;








public function setCookie(SetCookie $cookie): bool;















public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void;








public function clearSessionCookies(): void;




public function toArray(): array;
}
<?php

namespace GuzzleHttp\Cookie;




class SessionCookieJar extends CookieJar
{



private $sessionKey;




private $storeSessionCookies;









public function __construct(string $sessionKey, bool $storeSessionCookies = false)
{
parent::__construct();
$this->sessionKey = $sessionKey;
$this->storeSessionCookies = $storeSessionCookies;
$this->load();
}




public function __destruct()
{
$this->save();
}




public function save(): void
{
$json = [];

foreach ($this as $cookie) {
if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
$json[] = $cookie->toArray();
}
}

$_SESSION[$this->sessionKey] = \json_encode($json);
}




protected function load(): void
{
if (!isset($_SESSION[$this->sessionKey])) {
return;
}
$data = \json_decode($_SESSION[$this->sessionKey], true);
if (\is_array($data)) {
foreach ($data as $cookie) {
$this->setCookie(new SetCookie($cookie));
}
} elseif (\strlen($data)) {
throw new \RuntimeException('Invalid cookie data');
}
}
}
<?php

namespace GuzzleHttp\Cookie;

use GuzzleHttp\Utils;




class FileCookieJar extends CookieJar
{



private $filename;




private $storeSessionCookies;










public function __construct(string $cookieFile, bool $storeSessionCookies = false)
{
parent::__construct();
$this->filename = $cookieFile;
$this->storeSessionCookies = $storeSessionCookies;

if (\file_exists($cookieFile)) {
$this->load($cookieFile);
}
}




public function __destruct()
{
$this->save($this->filename);
}








public function save(string $filename): void
{
$json = [];

foreach ($this as $cookie) {
if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
$json[] = $cookie->toArray();
}
}

$jsonStr = Utils::jsonEncode($json);
if (false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) {
throw new \RuntimeException("Unable to save file {$filename}");
}
}










public function load(string $filename): void
{
$json = \file_get_contents($filename);
if (false === $json) {
throw new \RuntimeException("Unable to load file {$filename}");
}
if ($json === '') {
return;
}

$data = Utils::jsonDecode($json, true);
if (\is_array($data)) {
foreach ($data as $cookie) {
$this->setCookie(new SetCookie($cookie));
}
} elseif (\is_scalar($data) && !empty($data)) {
throw new \RuntimeException("Invalid cookie file: {$filename}");
}
}
}
<?php

namespace GuzzleHttp;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;





final class TransferStats
{



private $request;




private $response;




private $transferTime;




private $handlerStats;




private $handlerErrorData;








public function __construct(
RequestInterface $request,
?ResponseInterface $response = null,
?float $transferTime = null,
$handlerErrorData = null,
array $handlerStats = []
) {
$this->request = $request;
$this->response = $response;
$this->transferTime = $transferTime;
$this->handlerErrorData = $handlerErrorData;
$this->handlerStats = $handlerStats;
}

public function getRequest(): RequestInterface
{
return $this->request;
}




public function getResponse(): ?ResponseInterface
{
return $this->response;
}




public function hasResponse(): bool
{
return $this->response !== null;
}










public function getHandlerErrorData()
{
return $this->handlerErrorData;
}




public function getEffectiveUri(): UriInterface
{
return $this->request->getUri();
}






public function getTransferTime(): ?float
{
return $this->transferTime;
}




public function getHandlerStats(): array
{
return $this->handlerStats;
}








public function getHandlerStat(string $stat)
{
return $this->handlerStats[$stat] ?? null;
}
}
<?php

namespace GuzzleHttp;






final class RequestOptions
{





















public const ALLOW_REDIRECTS = 'allow_redirects';








public const AUTH = 'auth';





public const BODY = 'body';








public const CERT = 'cert';








public const COOKIES = 'cookies';






public const CONNECT_TIMEOUT = 'connect_timeout';











public const CRYPTO_METHOD = 'crypto_method';






public const DEBUG = 'debug';






public const DECODE_CONTENT = 'decode_content';




public const DELAY = 'delay';

















public const EXPECT = 'expect';







public const FORM_PARAMS = 'form_params';





public const HEADERS = 'headers';







public const HTTP_ERRORS = 'http_errors';







public const IDN_CONVERSION = 'idn_conversion';






public const JSON = 'json';










public const MULTIPART = 'multipart';






public const ON_HEADERS = 'on_headers';










public const ON_STATS = 'on_stats';








public const PROGRESS = 'progress';






public const PROXY = 'proxy';







public const QUERY = 'query';






public const SINK = 'sink';







public const SYNCHRONOUS = 'synchronous';







public const SSL_KEY = 'ssl_key';





public const STREAM = 'stream';









public const VERIFY = 'verify';





public const TIMEOUT = 'timeout';





public const READ_TIMEOUT = 'read_timeout';




public const VERSION = 'version';




public const FORCE_IP_RESOLVE = 'force_ip_resolve';
}
<?php

namespace GuzzleHttp;

use Psr\Http\Message\MessageInterface;

final class BodySummarizer implements BodySummarizerInterface
{



private $truncateAt;

public function __construct(?int $truncateAt = null)
{
$this->truncateAt = $truncateAt;
}




public function summarize(MessageInterface $message): ?string
{
return $this->truncateAt === null
? Psr7\Message::bodySummary($message)
: Psr7\Message::bodySummary($message, $this->truncateAt);
}
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;




trait ClientTrait
{













abstract public function request(string $method, $uri, array $options = []): ResponseInterface;













public function get($uri, array $options = []): ResponseInterface
{
return $this->request('GET', $uri, $options);
}













public function head($uri, array $options = []): ResponseInterface
{
return $this->request('HEAD', $uri, $options);
}













public function put($uri, array $options = []): ResponseInterface
{
return $this->request('PUT', $uri, $options);
}













public function post($uri, array $options = []): ResponseInterface
{
return $this->request('POST', $uri, $options);
}













public function patch($uri, array $options = []): ResponseInterface
{
return $this->request('PATCH', $uri, $options);
}













public function delete($uri, array $options = []): ResponseInterface
{
return $this->request('DELETE', $uri, $options);
}













abstract public function requestAsync(string $method, $uri, array $options = []): PromiseInterface;












public function getAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('GET', $uri, $options);
}












public function headAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('HEAD', $uri, $options);
}












public function putAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('PUT', $uri, $options);
}












public function postAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('POST', $uri, $options);
}












public function patchAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('PATCH', $uri, $options);
}












public function deleteAsync($uri, array $options = []): PromiseInterface
{
return $this->requestAsync('DELETE', $uri, $options);
}
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;







class RetryMiddleware
{



private $nextHandler;




private $decider;

/**
@@var callable(int)
*/
private $delay;











public function __construct(callable $decider, callable $nextHandler, ?callable $delay = null)
{
$this->decider = $decider;
$this->nextHandler = $nextHandler;
$this->delay = $delay ?: __CLASS__.'::exponentialDelay';
}






public static function exponentialDelay(int $retries): int
{
return (int) 2 ** ($retries - 1) * 1000;
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
if (!isset($options['retries'])) {
$options['retries'] = 0;
}

$fn = $this->nextHandler;

return $fn($request, $options)
->then(
$this->onFulfilled($request, $options),
$this->onRejected($request, $options)
);
}




private function onFulfilled(RequestInterface $request, array $options): callable
{
return function ($value) use ($request, $options) {
if (!($this->decider)(
$options['retries'],
$request,
$value,
null
)) {
return $value;
}

return $this->doRetry($request, $options, $value);
};
}




private function onRejected(RequestInterface $req, array $options): callable
{
return function ($reason) use ($req, $options) {
if (!($this->decider)(
$options['retries'],
$req,
null,
$reason
)) {
return P\Create::rejectionFor($reason);
}

return $this->doRetry($req, $options);
};
}

private function doRetry(RequestInterface $request, array $options, ?ResponseInterface $response = null): PromiseInterface
{
$options['delay'] = ($this->delay)(++$options['retries'], $response, $request);

return $this($request, $options);
}
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\TooManyRedirectsException;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;









class RedirectMiddleware
{
public const HISTORY_HEADER = 'X-Guzzle-Redirect-History';

public const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';




public static $defaultSettings = [
'max' => 5,
'protocols' => ['http', 'https'],
'strict' => false,
'referer' => false,
'track_redirects' => false,
];




private $nextHandler;




public function __construct(callable $nextHandler)
{
$this->nextHandler = $nextHandler;
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
$fn = $this->nextHandler;

if (empty($options['allow_redirects'])) {
return $fn($request, $options);
}

if ($options['allow_redirects'] === true) {
$options['allow_redirects'] = self::$defaultSettings;
} elseif (!\is_array($options['allow_redirects'])) {
throw new \InvalidArgumentException('allow_redirects must be true, false, or array');
} else {

$options['allow_redirects'] += self::$defaultSettings;
}

if (empty($options['allow_redirects']['max'])) {
return $fn($request, $options);
}

return $fn($request, $options)
->then(function (ResponseInterface $response) use ($request, $options) {
return $this->checkRedirect($request, $options, $response);
});
}




public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response)
{
if (\strpos((string) $response->getStatusCode(), '3') !== 0
|| !$response->hasHeader('Location')
) {
return $response;
}

$this->guardMax($request, $response, $options);
$nextRequest = $this->modifyRequest($request, $options, $response);


if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) {
unset(
$options['curl'][\CURLOPT_HTTPAUTH],
$options['curl'][\CURLOPT_USERPWD]
);
}

if (isset($options['allow_redirects']['on_redirect'])) {
($options['allow_redirects']['on_redirect'])(
$request,
$response,
$nextRequest->getUri()
);
}

$promise = $this($nextRequest, $options);


if (!empty($options['allow_redirects']['track_redirects'])) {
return $this->withTracking(
$promise,
(string) $nextRequest->getUri(),
$response->getStatusCode()
);
}

return $promise;
}




private function withTracking(PromiseInterface $promise, string $uri, int $statusCode): PromiseInterface
{
return $promise->then(
static function (ResponseInterface $response) use ($uri, $statusCode) {



$historyHeader = $response->getHeader(self::HISTORY_HEADER);
$statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);
\array_unshift($historyHeader, $uri);
\array_unshift($statusHeader, (string) $statusCode);

return $response->withHeader(self::HISTORY_HEADER, $historyHeader)
->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);
}
);
}






private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options): void
{
$current = $options['__redirect_count']
?? 0;
$options['__redirect_count'] = $current + 1;
$max = $options['allow_redirects']['max'];

if ($options['__redirect_count'] > $max) {
throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response);
}
}

public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response): RequestInterface
{

$modify = [];
$protocols = $options['allow_redirects']['protocols'];




$statusCode = $response->getStatusCode();
if ($statusCode == 303
|| ($statusCode <= 302 && !$options['allow_redirects']['strict'])
) {
$safeMethods = ['GET', 'HEAD', 'OPTIONS'];
$requestMethod = $request->getMethod();

$modify['method'] = in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET';
$modify['body'] = '';
}

$uri = self::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\Message::rewindBody($request);



if ($options['allow_redirects']['referer']
&& $modify['uri']->getScheme() === $request->getUri()->getScheme()
) {
$uri = $request->getUri()->withUserInfo('');
$modify['set_headers']['Referer'] = (string) $uri;
} else {
$modify['remove_headers'][] = 'Referer';
}


if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {
$modify['remove_headers'][] = 'Authorization';
$modify['remove_headers'][] = 'Cookie';
}

return Psr7\Utils::modifyRequest($request, $modify);
}




private static function redirectUri(
RequestInterface $request,
ResponseInterface $response,
array $protocols
): UriInterface {
$location = Psr7\UriResolver::resolve(
$request->getUri(),
new Psr7\Uri($response->getHeaderLine('Location'))
);


if (!\in_array($location->getScheme(), $protocols)) {
throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response);
}

return $location;
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\RequestOptions;
use Psr\Http\Message\RequestInterface;






class Proxy
{









public static function wrapSync(callable $default, callable $sync): callable
{
return static function (RequestInterface $request, array $options) use ($default, $sync): PromiseInterface {
return empty($options[RequestOptions::SYNCHRONOUS]) ? $default($request, $options) : $sync($request, $options);
};
}














public static function wrapStreaming(callable $default, callable $streaming): callable
{
return static function (RequestInterface $request, array $options) use ($default, $streaming): PromiseInterface {
return empty($options['stream']) ? $default($request, $options) : $streaming($request, $options);
};
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\FulfilledPromise;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Psr7;
use GuzzleHttp\TransferStats;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;






class StreamHandler
{



private $lastHeaders = [];







public function __invoke(RequestInterface $request, array $options): PromiseInterface
{

if (isset($options['delay'])) {
\usleep($options['delay'] * 1000);
}

$protocolVersion = $request->getProtocolVersion();

if ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) {
throw new ConnectException(sprintf('HTTP/%s is not supported by the stream handler.', $protocolVersion), $request);
}

$startTime = isset($options['on_stats']) ? Utils::currentTime() : null;

try {

$request = $request->withoutHeader('Expect');



if (
(
0 === \strcasecmp('PUT', $request->getMethod())
|| 0 === \strcasecmp('POST', $request->getMethod())
)
&& 0 === $request->getBody()->getSize()
) {
$request = $request->withHeader('Content-Length', '0');
}

return $this->createResponse(
$request,
$options,
$this->createStream($request, $options),
$startTime
);
} catch (\InvalidArgumentException $e) {
throw $e;
} catch (\Exception $e) {

$message = $e->getMessage();

if (false !== \strpos($message, 'getaddrinfo') 
|| false !== \strpos($message, 'Connection refused')
|| false !== \strpos($message, "couldn't connect to host") 
|| false !== \strpos($message, 'connection attempt failed')
) {
$e = new ConnectException($e->getMessage(), $request, $e);
} else {
$e = RequestException::wrapException($request, $e);
}
$this->invokeStats($options, $request, $startTime, null, $e);

return P\Create::rejectionFor($e);
}
}

private function invokeStats(
array $options,
RequestInterface $request,
?float $startTime,
?ResponseInterface $response = null,
?\Throwable $error = null
): void {
if (isset($options['on_stats'])) {
$stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []);
($options['on_stats'])($stats);
}
}




private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime): PromiseInterface
{
$hdrs = $this->lastHeaders;
$this->lastHeaders = [];

try {
[$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs);
} catch (\Exception $e) {
return P\Create::rejectionFor(
new RequestException('An error was encountered while creating the response', $request, null, $e)
);
}

[$stream, $headers] = $this->checkDecode($options, $headers, $stream);
$stream = Psr7\Utils::streamFor($stream);
$sink = $stream;

if (\strcasecmp('HEAD', $request->getMethod())) {
$sink = $this->createSink($stream, $options);
}

try {
$response = new Psr7\Response($status, $headers, $sink, $ver, $reason);
} catch (\Exception $e) {
return P\Create::rejectionFor(
new RequestException('An error was encountered while creating the response', $request, null, $e)
);
}

if (isset($options['on_headers'])) {
try {
$options['on_headers']($response);
} catch (\Exception $e) {
return P\Create::rejectionFor(
new RequestException('An error was encountered during the on_headers event', $request, $response, $e)
);
}
}



if ($sink !== $stream) {
$this->drain($stream, $sink, $response->getHeaderLine('Content-Length'));
}

$this->invokeStats($options, $request, $startTime, $response, null);

return new FulfilledPromise($response);
}

private function createSink(StreamInterface $stream, array $options): StreamInterface
{
if (!empty($options['stream'])) {
return $stream;
}

$sink = $options['sink'] ?? Psr7\Utils::tryFopen('php://temp', 'r+');

return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\Utils::streamFor($sink);
}




private function checkDecode(array $options, array $headers, $stream): array
{

if (!empty($options['decode_content'])) {
$normalizedKeys = Utils::normalizeHeaderKeys($headers);
if (isset($normalizedKeys['content-encoding'])) {
$encoding = $headers[$normalizedKeys['content-encoding']];
if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {
$stream = new Psr7\InflateStream(Psr7\Utils::streamFor($stream));
$headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];


unset($headers[$normalizedKeys['content-encoding']]);


if (isset($normalizedKeys['content-length'])) {
$headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];
$length = (int) $stream->getSize();
if ($length === 0) {
unset($headers[$normalizedKeys['content-length']]);
} else {
$headers[$normalizedKeys['content-length']] = [$length];
}
}
}
}
}

return [$stream, $headers];
}









private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength): StreamInterface
{




Psr7\Utils::copyToStream(
$source,
$sink,
(\strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1
);

$sink->seek(0);
$source->close();

return $sink;
}










private function createResource(callable $callback)
{
$errors = [];
\set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool {
$errors[] = [
'message' => $msg,
'file' => $file,
'line' => $line,
];

return true;
});

try {
$resource = $callback();
} finally {
\restore_error_handler();
}

if (!$resource) {
$message = 'Error creating resource: ';
foreach ($errors as $err) {
foreach ($err as $key => $value) {
$message .= "[$key] $value".\PHP_EOL;
}
}
throw new \RuntimeException(\trim($message));
}

return $resource;
}




private function createStream(RequestInterface $request, array $options)
{
static $methods;
if (!$methods) {
$methods = \array_flip(\get_class_methods(__CLASS__));
}

if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) {
throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request);
}



if ($request->getProtocolVersion() === '1.1'
&& !$request->hasHeader('Connection')
) {
$request = $request->withHeader('Connection', 'close');
}


if (!isset($options['verify'])) {
$options['verify'] = true;
}

$params = [];
$context = $this->getDefaultContext($request);

if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) {
throw new \InvalidArgumentException('on_headers must be callable');
}

if (!empty($options)) {
foreach ($options as $key => $value) {
$method = "add_{$key}";
if (isset($methods[$method])) {
$this->{$method}($request, $context, $value, $params);
}
}
}

if (isset($options['stream_context'])) {
if (!\is_array($options['stream_context'])) {
throw new \InvalidArgumentException('stream_context must be an array');
}
$context = \array_replace_recursive($context, $options['stream_context']);
}


if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) {
throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
}

$uri = $this->resolveHost($request, $options);

$contextResource = $this->createResource(
static function () use ($context, $params) {
return \stream_context_create($context, $params);
}
);

return $this->createResource(
function () use ($uri, $contextResource, $context, $options, $request) {
$resource = @\fopen((string) $uri, 'r', false, $contextResource);


if (function_exists('http_get_last_response_headers')) {

$http_response_header = \http_get_last_response_headers();
}

$this->lastHeaders = $http_response_header ?? [];

if (false === $resource) {
throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context);
}

if (isset($options['read_timeout'])) {
$readTimeout = $options['read_timeout'];
$sec = (int) $readTimeout;
$usec = ($readTimeout - $sec) * 100000;
\stream_set_timeout($resource, $sec, $usec);
}

return $resource;
}
);
}

private function resolveHost(RequestInterface $request, array $options): UriInterface
{
$uri = $request->getUri();

if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) {
if ('v4' === $options['force_ip_resolve']) {
$records = \dns_get_record($uri->getHost(), \DNS_A);
if (false === $records || !isset($records[0]['ip'])) {
throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
}

return $uri->withHost($records[0]['ip']);
}
if ('v6' === $options['force_ip_resolve']) {
$records = \dns_get_record($uri->getHost(), \DNS_AAAA);
if (false === $records || !isset($records[0]['ipv6'])) {
throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
}

return $uri->withHost('['.$records[0]['ipv6'].']');
}
}

return $uri;
}

private function getDefaultContext(RequestInterface $request): array
{
$headers = '';
foreach ($request->getHeaders() as $name => $value) {
foreach ($value as $val) {
$headers .= "$name: $val\r\n";
}
}

$context = [
'http' => [
'method' => $request->getMethod(),
'header' => $headers,
'protocol_version' => $request->getProtocolVersion(),
'ignore_errors' => true,
'follow_location' => 0,
],
'ssl' => [
'peer_name' => $request->getUri()->getHost(),
],
];

$body = (string) $request->getBody();

if ('' !== $body) {
$context['http']['content'] = $body;

if (!$request->hasHeader('Content-Type')) {
$context['http']['header'] .= "Content-Type:\r\n";
}
}

$context['http']['header'] = \rtrim($context['http']['header']);

return $context;
}




private function add_proxy(RequestInterface $request, array &$options, $value, array &$params): void
{
$uri = null;

if (!\is_array($value)) {
$uri = $value;
} else {
$scheme = $request->getUri()->getScheme();
if (isset($value[$scheme])) {
if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) {
$uri = $value[$scheme];
}
}
}

if (!$uri) {
return;
}

$parsed = $this->parse_proxy($uri);
$options['http']['proxy'] = $parsed['proxy'];

if ($parsed['auth']) {
if (!isset($options['http']['header'])) {
$options['http']['header'] = [];
}
$options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}";
}
}




private function parse_proxy(string $url): array
{
$parsed = \parse_url($url);

if ($parsed !== false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') {
if (isset($parsed['host']) && isset($parsed['port'])) {
$auth = null;
if (isset($parsed['user']) && isset($parsed['pass'])) {
$auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}");
}

return [
'proxy' => "tcp://{$parsed['host']}:{$parsed['port']}",
'auth' => $auth ? "Basic {$auth}" : null,
];
}
}


return [
'proxy' => $url,
'auth' => null,
];
}




private function add_timeout(RequestInterface $request, array &$options, $value, array &$params): void
{
if ($value > 0) {
$options['http']['timeout'] = $value;
}
}




private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params): void
{
if (
$value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
|| $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
|| $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
|| (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT)
) {
$options['http']['crypto_method'] = $value;

return;
}

throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
}




private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void
{
if ($value === false) {
$options['ssl']['verify_peer'] = false;
$options['ssl']['verify_peer_name'] = false;

return;
}

if (\is_string($value)) {
$options['ssl']['cafile'] = $value;
if (!\file_exists($value)) {
throw new \RuntimeException("SSL CA bundle not found: $value");
}
} elseif ($value !== true) {
throw new \InvalidArgumentException('Invalid verify request option');
}

$options['ssl']['verify_peer'] = true;
$options['ssl']['verify_peer_name'] = true;
$options['ssl']['allow_self_signed'] = false;
}




private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void
{
if (\is_array($value)) {
$options['ssl']['passphrase'] = $value[1];
$value = $value[0];
}

if (!\file_exists($value)) {
throw new \RuntimeException("SSL certificate not found: {$value}");
}

$options['ssl']['local_cert'] = $value;
}




private function add_progress(RequestInterface $request, array &$options, $value, array &$params): void
{
self::addNotification(
$params,
static function ($code, $a, $b, $c, $transferred, $total) use ($value) {
if ($code == \STREAM_NOTIFY_PROGRESS) {


$value($total, $transferred, 0, 0);
}
}
);
}




private function add_debug(RequestInterface $request, array &$options, $value, array &$params): void
{
if ($value === false) {
return;
}

static $map = [
\STREAM_NOTIFY_CONNECT => 'CONNECT',
\STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
\STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
\STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
\STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
\STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
\STREAM_NOTIFY_PROGRESS => 'PROGRESS',
\STREAM_NOTIFY_FAILURE => 'FAILURE',
\STREAM_NOTIFY_COMPLETED => 'COMPLETED',
\STREAM_NOTIFY_RESOLVE => 'RESOLVE',
];
static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];

$value = Utils::debugResource($value);
$ident = $request->getMethod().' '.$request->getUri()->withFragment('');
self::addNotification(
$params,
static function (int $code, ...$passed) use ($ident, $value, $map, $args): void {
\fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
foreach (\array_filter($passed) as $i => $v) {
\fwrite($value, $args[$i].': "'.$v.'" ');
}
\fwrite($value, "\n");
}
);
}

private static function addNotification(array &$params, callable $notify): void
{

if (!isset($params['notification'])) {
$params['notification'] = $notify;
} else {
$params['notification'] = self::callArray([
$params['notification'],
$notify,
]);
}
}

private static function callArray(array $functions): callable
{
return static function (...$args) use ($functions) {
foreach ($functions as $fn) {
$fn(...$args);
}
};
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;






final class EasyHandle
{



public $handle;




public $sink;




public $headers = [];




public $response;




public $request;




public $options = [];




public $errno = 0;




public $onHeadersException;




public $createResponseException;







public function createResponse(): void
{
[$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($this->headers);

$normalizedKeys = Utils::normalizeHeaderKeys($headers);

if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) {
$headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];
unset($headers[$normalizedKeys['content-encoding']]);
if (isset($normalizedKeys['content-length'])) {
$headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];

$bodyLength = (int) $this->sink->getSize();
if ($bodyLength) {
$headers[$normalizedKeys['content-length']] = $bodyLength;
} else {
unset($headers[$normalizedKeys['content-length']]);
}
}
}


$this->response = new Response(
$status,
$headers,
$this->sink,
$ver,
$reason
);
}








public function __get($name)
{
$msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: '.$name;
throw new \BadMethodCallException($msg);
}
}
<?php

namespace GuzzleHttp\Handler;

use Psr\Http\Message\RequestInterface;

interface CurlFactoryInterface
{








public function create(RequestInterface $request, array $options): EasyHandle;






public function release(EasyHandle $easy): void;
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\FulfilledPromise;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Psr7\LazyOpenStream;
use GuzzleHttp\TransferStats;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;






class CurlFactory implements CurlFactoryInterface
{
public const CURL_VERSION_STR = 'curl_version';




public const LOW_CURL_VERSION_NUMBER = '7.21.2';




private $handles = [];




private $maxHandles;




public function __construct(int $maxHandles)
{
$this->maxHandles = $maxHandles;
}

public function create(RequestInterface $request, array $options): EasyHandle
{
$protocolVersion = $request->getProtocolVersion();

if ('2' === $protocolVersion || '2.0' === $protocolVersion) {
if (!self::supportsHttp2()) {
throw new ConnectException('HTTP/2 is supported by the cURL handler, however libcurl is built without HTTP/2 support.', $request);
}
} elseif ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) {
throw new ConnectException(sprintf('HTTP/%s is not supported by the cURL handler.', $protocolVersion), $request);
}

if (isset($options['curl']['body_as_string'])) {
$options['_body_as_string'] = $options['curl']['body_as_string'];
unset($options['curl']['body_as_string']);
}

$easy = new EasyHandle();
$easy->request = $request;
$easy->options = $options;
$conf = $this->getDefaultConf($easy);
$this->applyMethod($easy, $conf);
$this->applyHandlerOptions($easy, $conf);
$this->applyHeaders($easy, $conf);
unset($conf['_headers']);


if (isset($options['curl'])) {
$conf = \array_replace($conf, $options['curl']);
}

$conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
$easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init();
curl_setopt_array($easy->handle, $conf);

return $easy;
}

private static function supportsHttp2(): bool
{
static $supportsHttp2 = null;

if (null === $supportsHttp2) {
$supportsHttp2 = self::supportsTls12()
&& defined('CURL_VERSION_HTTP2')
&& (\CURL_VERSION_HTTP2 & \curl_version()['features']);
}

return $supportsHttp2;
}

private static function supportsTls12(): bool
{
static $supportsTls12 = null;

if (null === $supportsTls12) {
$supportsTls12 = \CURL_SSLVERSION_TLSv1_2 & \curl_version()['features'];
}

return $supportsTls12;
}

private static function supportsTls13(): bool
{
static $supportsTls13 = null;

if (null === $supportsTls13) {
$supportsTls13 = defined('CURL_SSLVERSION_TLSv1_3')
&& (\CURL_SSLVERSION_TLSv1_3 & \curl_version()['features']);
}

return $supportsTls13;
}

public function release(EasyHandle $easy): void
{
$resource = $easy->handle;
unset($easy->handle);

if (\count($this->handles) >= $this->maxHandles) {
if (PHP_VERSION_ID < 80000) {
\curl_close($resource);
}
} else {




\curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null);
\curl_setopt($resource, \CURLOPT_READFUNCTION, null);
\curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null);
\curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null);
\curl_reset($resource);
$this->handles[] = $resource;
}
}








public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface
{
if (isset($easy->options['on_stats'])) {
self::invokeStats($easy);
}

if (!$easy->response || $easy->errno) {
return self::finishError($handler, $easy, $factory);
}


$factory->release($easy);


$body = $easy->response->getBody();
if ($body->isSeekable()) {
$body->rewind();
}

return new FulfilledPromise($easy->response);
}

private static function invokeStats(EasyHandle $easy): void
{
$curlStats = \curl_getinfo($easy->handle);
$curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME);
$stats = new TransferStats(
$easy->request,
$easy->response,
$curlStats['total_time'],
$easy->errno,
$curlStats
);
($easy->options['on_stats'])($stats);
}




private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface
{

$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] = self::getCurlVersion();
$factory->release($easy);


if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) {
return self::retryFailedRewind($handler, $easy, $ctx);
}

return self::createRejection($easy, $ctx);
}

private static function getCurlVersion(): string
{
static $curlVersion = null;

if (null === $curlVersion) {
$curlVersion = \curl_version()['version'];
}

return $curlVersion;
}

private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface
{
static $connectionErrors = [
\CURLE_OPERATION_TIMEOUTED => true,
\CURLE_COULDNT_RESOLVE_HOST => true,
\CURLE_COULDNT_CONNECT => true,
\CURLE_SSL_CONNECT_ERROR => true,
\CURLE_GOT_NOTHING => true,
];

if ($easy->createResponseException) {
return P\Create::rejectionFor(
new RequestException(
'An error was encountered while creating the response',
$easy->request,
$easy->response,
$easy->createResponseException,
$ctx
)
);
}



if ($easy->onHeadersException) {
return P\Create::rejectionFor(
new RequestException(
'An error was encountered during the on_headers event',
$easy->request,
$easy->response,
$easy->onHeadersException,
$ctx
)
);
}

$uri = $easy->request->getUri();

$sanitizedError = self::sanitizeCurlError($ctx['error'] ?? '', $uri);

$message = \sprintf(
'cURL error %s: %s (%s)',
$ctx['errno'],
$sanitizedError,
'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'
);

if ('' !== $sanitizedError) {
$redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($uri)->__toString();
if ($redactedUriString !== '' && false === \strpos($sanitizedError, $redactedUriString)) {
$message .= \sprintf(' for %s', $redactedUriString);
}
}


$error = isset($connectionErrors[$easy->errno])
? new ConnectException($message, $easy->request, null, $ctx)
: new RequestException($message, $easy->request, $easy->response, null, $ctx);

return P\Create::rejectionFor($error);
}

private static function sanitizeCurlError(string $error, UriInterface $uri): string
{
if ('' === $error) {
return $error;
}

$baseUri = $uri->withQuery('')->withFragment('');
$baseUriString = $baseUri->__toString();

if ('' === $baseUriString) {
return $error;
}

$redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($baseUri)->__toString();

return str_replace($baseUriString, $redactedUriString, $error);
}




private function getDefaultConf(EasyHandle $easy): array
{
$conf = [
'_headers' => $easy->request->getHeaders(),
\CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
\CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
\CURLOPT_RETURNTRANSFER => false,
\CURLOPT_HEADER => false,
\CURLOPT_CONNECTTIMEOUT => 300,
];

if (\defined('CURLOPT_PROTOCOLS')) {
$conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS;
}

$version = $easy->request->getProtocolVersion();

if ('2' === $version || '2.0' === $version) {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0;
} elseif ('1.1' === $version) {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1;
} else {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0;
}

return $conf;
}

private function applyMethod(EasyHandle $easy, array &$conf): void
{
$body = $easy->request->getBody();
$size = $body->getSize();

if ($size === null || $size > 0) {
$this->applyBody($easy->request, $easy->options, $conf);

return;
}

$method = $easy->request->getMethod();
if ($method === 'PUT' || $method === 'POST') {

if (!$easy->request->hasHeader('Content-Length')) {
$conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
}
} elseif ($method === 'HEAD') {
$conf[\CURLOPT_NOBODY] = true;
unset(
$conf[\CURLOPT_WRITEFUNCTION],
$conf[\CURLOPT_READFUNCTION],
$conf[\CURLOPT_FILE],
$conf[\CURLOPT_INFILE]
);
}
}

private function applyBody(RequestInterface $request, array $options, array &$conf): void
{
$size = $request->hasHeader('Content-Length')
? (int) $request->getHeaderLine('Content-Length')
: null;



if (($size !== null && $size < 1000000) || !empty($options['_body_as_string'])) {
$conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody();

$this->removeHeader('Content-Length', $conf);
$this->removeHeader('Transfer-Encoding', $conf);
} else {
$conf[\CURLOPT_UPLOAD] = true;
if ($size !== null) {
$conf[\CURLOPT_INFILESIZE] = $size;
$this->removeHeader('Content-Length', $conf);
}
$body = $request->getBody();
if ($body->isSeekable()) {
$body->rewind();
}
$conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) {
return $body->read($length);
};
}


if (!$request->hasHeader('Expect')) {
$conf[\CURLOPT_HTTPHEADER][] = 'Expect:';
}


if (!$request->hasHeader('Content-Type')) {
$conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:';
}
}

private function applyHeaders(EasyHandle $easy, array &$conf): void
{
foreach ($conf['_headers'] as $name => $values) {
foreach ($values as $value) {
$value = (string) $value;
if ($value === '') {


$conf[\CURLOPT_HTTPHEADER][] = "$name;";
} else {
$conf[\CURLOPT_HTTPHEADER][] = "$name: $value";
}
}
}


if (!$easy->request->hasHeader('Accept')) {
$conf[\CURLOPT_HTTPHEADER][] = 'Accept:';
}
}







private function removeHeader(string $name, array &$options): void
{
foreach (\array_keys($options['_headers']) as $key) {
if (!\strcasecmp($key, $name)) {
unset($options['_headers'][$key]);

return;
}
}
}

private function applyHandlerOptions(EasyHandle $easy, array &$conf): void
{
$options = $easy->options;
if (isset($options['verify'])) {
if ($options['verify'] === false) {
unset($conf[\CURLOPT_CAINFO]);
$conf[\CURLOPT_SSL_VERIFYHOST] = 0;
$conf[\CURLOPT_SSL_VERIFYPEER] = false;
} else {
$conf[\CURLOPT_SSL_VERIFYHOST] = 2;
$conf[\CURLOPT_SSL_VERIFYPEER] = true;
if (\is_string($options['verify'])) {

if (!\file_exists($options['verify'])) {
throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}");
}


if (
\is_dir($options['verify'])
|| (
\is_link($options['verify']) === true
&& ($verifyLink = \readlink($options['verify'])) !== false
&& \is_dir($verifyLink)
)
) {
$conf[\CURLOPT_CAPATH] = $options['verify'];
} else {
$conf[\CURLOPT_CAINFO] = $options['verify'];
}
}
}
}

if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) {
$accept = $easy->request->getHeaderLine('Accept-Encoding');
if ($accept) {
$conf[\CURLOPT_ENCODING] = $accept;
} else {


$conf[\CURLOPT_ENCODING] = '';




$conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
}
}

if (!isset($options['sink'])) {

$options['sink'] = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+');
}
$sink = $options['sink'];
if (!\is_string($sink)) {
$sink = \GuzzleHttp\Psr7\Utils::streamFor($sink);
} elseif (!\is_dir(\dirname($sink))) {

throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink));
} else {
$sink = new LazyOpenStream($sink, 'w+');
}
$easy->sink = $sink;
$conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink): int {
return $sink->write($write);
};

$timeoutRequiresNoSignal = false;
if (isset($options['timeout'])) {
$timeoutRequiresNoSignal |= $options['timeout'] < 1;
$conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
}


if (isset($options['force_ip_resolve'])) {
if ('v4' === $options['force_ip_resolve']) {
$conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4;
} elseif ('v6' === $options['force_ip_resolve']) {
$conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6;
}
}

if (isset($options['connect_timeout'])) {
$timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
$conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
}

if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') {
$conf[\CURLOPT_NOSIGNAL] = true;
}

if (isset($options['proxy'])) {
if (!\is_array($options['proxy'])) {
$conf[\CURLOPT_PROXY] = $options['proxy'];
} else {
$scheme = $easy->request->getUri()->getScheme();
if (isset($options['proxy'][$scheme])) {
$host = $easy->request->getUri()->getHost();
if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) {
unset($conf[\CURLOPT_PROXY]);
} else {
$conf[\CURLOPT_PROXY] = $options['proxy'][$scheme];
}
}
}
}

if (isset($options['crypto_method'])) {
$protocolVersion = $easy->request->getProtocolVersion();


if ('2' === $protocolVersion || '2.0' === $protocolVersion) {
if (
\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']
|| \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']
|| \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']
) {
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
} elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
if (!self::supportsTls13()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
}
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
} else {
throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
}
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1;
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
if (!self::supportsTls12()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');
}
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
} elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
if (!self::supportsTls13()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
}
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
} else {
throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
}
}

if (isset($options['cert'])) {
$cert = $options['cert'];
if (\is_array($cert)) {
$conf[\CURLOPT_SSLCERTPASSWD] = $cert[1];
$cert = $cert[0];
}
if (!\file_exists($cert)) {
throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
}


$ext = pathinfo($cert, \PATHINFO_EXTENSION);
if (preg_match('#^(der|p12)$#i', $ext)) {
$conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
}
$conf[\CURLOPT_SSLCERT] = $cert;
}

if (isset($options['ssl_key'])) {
if (\is_array($options['ssl_key'])) {
if (\count($options['ssl_key']) === 2) {
[$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key'];
} else {
[$sslKey] = $options['ssl_key'];
}
}

$sslKey = $sslKey ?? $options['ssl_key'];

if (!\file_exists($sslKey)) {
throw new \InvalidArgumentException("SSL private key not found: {$sslKey}");
}
$conf[\CURLOPT_SSLKEY] = $sslKey;
}

if (isset($options['progress'])) {
$progress = $options['progress'];
if (!\is_callable($progress)) {
throw new \InvalidArgumentException('progress client option must be callable');
}
$conf[\CURLOPT_NOPROGRESS] = false;
$conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) {
$progress($downloadSize, $downloaded, $uploadSize, $uploaded);
};
}

if (!empty($options['debug'])) {
$conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']);
$conf[\CURLOPT_VERBOSE] = true;
}
}












private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx): PromiseInterface
{
try {

$body = $easy->request->getBody();
if ($body->tell() > 0) {
$body->rewind();
}
} catch (\RuntimeException $e) {
$ctx['error'] = 'The connection unexpectedly failed without '
.'providing an error. The request would have been retried, '
.'but attempting to rewind the request body failed. '
.'Exception: '.$e;

return self::createRejection($easy, $ctx);
}


if (!isset($easy->options['_curl_retries'])) {
$easy->options['_curl_retries'] = 1;
} elseif ($easy->options['_curl_retries'] == 2) {
$ctx['error'] = 'The cURL request was retried 3 times '
.'and did not succeed. The most likely reason for the failure '
.'is that cURL was unable to rewind the body of the request '
.'and subsequent retries resulted in the same error. Turn on '
.'the debug option to see what went wrong. See '
.'https://bugs.php.net/bug.php?id=47204 for more information.';

return self::createRejection($easy, $ctx);
} else {
++$easy->options['_curl_retries'];
}

return $handler($easy->request, $easy->options);
}

private function createHeaderFn(EasyHandle $easy): callable
{
if (isset($easy->options['on_headers'])) {
$onHeaders = $easy->options['on_headers'];

if (!\is_callable($onHeaders)) {
throw new \InvalidArgumentException('on_headers must be callable');
}
} else {
$onHeaders = null;
}

return static function ($ch, $h) use (
$onHeaders,
$easy,
&$startingResponse
) {
$value = \trim($h);
if ($value === '') {
$startingResponse = true;
try {
$easy->createResponse();
} catch (\Exception $e) {
$easy->createResponseException = $e;

return -1;
}
if ($onHeaders !== null) {
try {
$onHeaders($easy->response);
} catch (\Exception $e) {


$easy->onHeadersException = $e;

return -1;
}
}
} elseif ($startingResponse) {
$startingResponse = false;
$easy->headers = [$value];
} else {
$easy->headers[] = $value;
}

return \strlen($h);
};
}

public function __destruct()
{
foreach ($this->handles as $id => $handle) {
if (PHP_VERSION_ID < 80000) {
\curl_close($handle);
}

unset($this->handles[$id]);
}
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;










class CurlHandler
{



private $factory;








public function __construct(array $options = [])
{
$this->factory = $options['handle_factory']
?? new CurlFactory(3);
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
if (isset($options['delay'])) {
\usleep($options['delay'] * 1000);
}

$easy = $this->factory->create($request, $options);
\curl_exec($easy->handle);
$easy->errno = \curl_errno($easy->handle);

return CurlFactory::finish($this, $easy, $this->factory);
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Utils;




final class HeaderProcessor
{









public static function parseHeaders(array $headers): array
{
if ($headers === []) {
throw new \RuntimeException('Expected a non-empty array of header data');
}

$parts = \explode(' ', \array_shift($headers), 3);
$version = \explode('/', $parts[0])[1] ?? null;

if ($version === null) {
throw new \RuntimeException('HTTP version missing from header data');
}

$status = $parts[1] ?? null;

if ($status === null) {
throw new \RuntimeException('HTTP status code missing from header data');
}

return [$version, (int) $status, $parts[2] ?? null, Utils::headersFromLines($headers)];
}
}
<?php

namespace GuzzleHttp\Handler;

use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\TransferStats;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;






class MockHandler implements \Countable
{



private $queue = [];




private $lastRequest;




private $lastOptions = [];




private $onFulfilled;




private $onRejected;









public static function createWithMiddleware(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null): HandlerStack
{
return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
}










public function __construct(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null)
{
$this->onFulfilled = $onFulfilled;
$this->onRejected = $onRejected;

if ($queue) {

$this->append(...array_values($queue));
}
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
if (!$this->queue) {
throw new \OutOfBoundsException('Mock queue is empty');
}

if (isset($options['delay']) && \is_numeric($options['delay'])) {
\usleep((int) $options['delay'] * 1000);
}

$this->lastRequest = $request;
$this->lastOptions = $options;
$response = \array_shift($this->queue);

if (isset($options['on_headers'])) {
if (!\is_callable($options['on_headers'])) {
throw new \InvalidArgumentException('on_headers must be callable');
}
try {
$options['on_headers']($response);
} catch (\Exception $e) {
$msg = 'An error was encountered during the on_headers event';
$response = new RequestException($msg, $request, $response, $e);
}
}

if (\is_callable($response)) {
$response = $response($request, $options);
}

$response = $response instanceof \Throwable
? P\Create::rejectionFor($response)
: P\Create::promiseFor($response);

return $response->then(
function (?ResponseInterface $value) use ($request, $options) {
$this->invokeStats($request, $options, $value);
if ($this->onFulfilled) {
($this->onFulfilled)($value);
}

if ($value !== null && isset($options['sink'])) {
$contents = (string) $value->getBody();
$sink = $options['sink'];

if (\is_resource($sink)) {
\fwrite($sink, $contents);
} elseif (\is_string($sink)) {
\file_put_contents($sink, $contents);
} elseif ($sink instanceof StreamInterface) {
$sink->write($contents);
}
}

return $value;
},
function ($reason) use ($request, $options) {
$this->invokeStats($request, $options, null, $reason);
if ($this->onRejected) {
($this->onRejected)($reason);
}

return P\Create::rejectionFor($reason);
}
);
}







public function append(...$values): void
{
foreach ($values as $value) {
if ($value instanceof ResponseInterface
|| $value instanceof \Throwable
|| $value instanceof PromiseInterface
|| \is_callable($value)
) {
$this->queue[] = $value;
} else {
throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found '.Utils::describeType($value));
}
}
}




public function getLastRequest(): ?RequestInterface
{
return $this->lastRequest;
}




public function getLastOptions(): array
{
return $this->lastOptions;
}




public function count(): int
{
return \count($this->queue);
}

public function reset(): void
{
$this->queue = [];
}




private function invokeStats(
RequestInterface $request,
array $options,
?ResponseInterface $response = null,
$reason = null
): void {
if (isset($options['on_stats'])) {
$transferTime = $options['transfer_time'] ?? 0;
$stats = new TransferStats($request, $response, $transferTime, $reason);
($options['on_stats'])($stats);
}
}
}
<?php

namespace GuzzleHttp\Handler;

use Closure;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface;










class CurlMultiHandler
{



private $factory;




private $selectTimeout;




private $active = 0;






private $handles = [];






private $delays = [];




private $options = [];


private $_mh;










public function __construct(array $options = [])
{
$this->factory = $options['handle_factory'] ?? new CurlFactory(50);

if (isset($options['select_timeout'])) {
$this->selectTimeout = $options['select_timeout'];
} elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {
@trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED);
$this->selectTimeout = (int) $selectTimeout;
} else {
$this->selectTimeout = 1;
}

$this->options = $options['options'] ?? [];



unset($this->_mh);
}









public function __get($name)
{
if ($name !== '_mh') {
throw new \BadMethodCallException("Can not get other property as '_mh'.");
}

$multiHandle = \curl_multi_init();

if (false === $multiHandle) {
throw new \RuntimeException('Can not initialize curl multi handle.');
}

$this->_mh = $multiHandle;

foreach ($this->options as $option => $value) {

curl_multi_setopt($this->_mh, $option, $value);
}

return $this->_mh;
}

public function __destruct()
{
if (isset($this->_mh)) {
\curl_multi_close($this->_mh);
unset($this->_mh);
}
}

public function __invoke(RequestInterface $request, array $options): PromiseInterface
{
$easy = $this->factory->create($request, $options);
$id = (int) $easy->handle;

$promise = new Promise(
[$this, 'execute'],
function () use ($id) {
return $this->cancel($id);
}
);

$this->addRequest(['easy' => $easy, 'deferred' => $promise]);

return $promise;
}




public function tick(): void
{

if ($this->delays) {
$currentTime = Utils::currentTime();
foreach ($this->delays as $id => $delay) {
if ($currentTime >= $delay) {
unset($this->delays[$id]);
\curl_multi_add_handle(
$this->_mh,
$this->handles[$id]['easy']->handle
);
}
}
}


P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue']));


P\Utils::queue()->run();

if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) {


\usleep(250);
}

while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {

\curl_multi_select($this->_mh, $this->selectTimeout);
}

$this->processMessages();
}




private function tickInQueue(): void
{
if (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
\curl_multi_select($this->_mh, 0);
P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue']));
}
}




public function execute(): void
{
$queue = P\Utils::queue();

while ($this->handles || !$queue->isEmpty()) {

if (!$this->active && $this->delays) {
\usleep($this->timeToNext());
}
$this->tick();
}
}

private function addRequest(array $entry): void
{
$easy = $entry['easy'];
$id = (int) $easy->handle;
$this->handles[$id] = $entry;
if (empty($easy->options['delay'])) {
\curl_multi_add_handle($this->_mh, $easy->handle);
} else {
$this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000);
}
}








private function cancel($id): bool
{
if (!is_int($id)) {
trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
}


if (!isset($this->handles[$id])) {
return false;
}

$handle = $this->handles[$id]['easy']->handle;
unset($this->delays[$id], $this->handles[$id]);
\curl_multi_remove_handle($this->_mh, $handle);

if (PHP_VERSION_ID < 80000) {
\curl_close($handle);
}

return true;
}

private function processMessages(): void
{
while ($done = \curl_multi_info_read($this->_mh)) {
if ($done['msg'] !== \CURLMSG_DONE) {

continue;
}
$id = (int) $done['handle'];
\curl_multi_remove_handle($this->_mh, $done['handle']);

if (!isset($this->handles[$id])) {

continue;
}

$entry = $this->handles[$id];
unset($this->handles[$id], $this->delays[$id]);
$entry['easy']->errno = $done['result'];
$entry['deferred']->resolve(
CurlFactory::finish($this, $entry['easy'], $this->factory)
);
}
}

private function timeToNext(): int
{
$currentTime = Utils::currentTime();
$nextTime = \PHP_INT_MAX;
foreach ($this->delays as $time) {
if ($time < $nextTime) {
$nextTime = $time;
}
}

return ((int) \max(0, $nextTime - $currentTime)) * 1000000;
}
}
<?php

namespace GuzzleHttp\Exception;




class ServerException extends BadResponseException
{
}
<?php

namespace GuzzleHttp\Exception;

class TooManyRedirectsException extends RequestException
{
}
<?php

namespace GuzzleHttp\Exception;

use Psr\Http\Client\NetworkExceptionInterface;
use Psr\Http\Message\RequestInterface;






class ConnectException extends TransferException implements NetworkExceptionInterface
{



private $request;




private $handlerContext;

public function __construct(
string $message,
RequestInterface $request,
?\Throwable $previous = null,
array $handlerContext = []
) {
parent::__construct($message, 0, $previous);
$this->request = $request;
$this->handlerContext = $handlerContext;
}




public function getRequest(): RequestInterface
{
return $this->request;
}









public function getHandlerContext(): array
{
return $this->handlerContext;
}
}
<?php

namespace GuzzleHttp\Exception;

final class InvalidArgumentException extends \InvalidArgumentException implements GuzzleException
{
}
<?php

namespace GuzzleHttp\Exception;

use GuzzleHttp\BodySummarizer;
use GuzzleHttp\BodySummarizerInterface;
use Psr\Http\Client\RequestExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;




class RequestException extends TransferException implements RequestExceptionInterface
{



private $request;




private $response;




private $handlerContext;

public function __construct(
string $message,
RequestInterface $request,
?ResponseInterface $response = null,
?\Throwable $previous = null,
array $handlerContext = []
) {

$code = $response ? $response->getStatusCode() : 0;
parent::__construct($message, $code, $previous);
$this->request = $request;
$this->response = $response;
$this->handlerContext = $handlerContext;
}




public static function wrapException(RequestInterface $request, \Throwable $e): RequestException
{
return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e);
}










public static function create(
RequestInterface $request,
?ResponseInterface $response = null,
?\Throwable $previous = null,
array $handlerContext = [],
?BodySummarizerInterface $bodySummarizer = null
): self {
if (!$response) {
return new self(
'Error completing request',
$request,
null,
$previous,
$handlerContext
);
}

$level = (int) \floor($response->getStatusCode() / 100);
if ($level === 4) {
$label = 'Client error';
$className = ClientException::class;
} elseif ($level === 5) {
$label = 'Server error';
$className = ServerException::class;
} else {
$label = 'Unsuccessful request';
$className = __CLASS__;
}

$uri = \GuzzleHttp\Psr7\Utils::redactUserInfo($request->getUri());



$message = \sprintf(
'%s: `%s %s` resulted in a `%s %s` response',
$label,
$request->getMethod(),
$uri->__toString(),
$response->getStatusCode(),
$response->getReasonPhrase()
);

$summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response);

if ($summary !== null) {
$message .= ":\n{$summary}\n";
}

return new $className($message, $request, $response, $previous, $handlerContext);
}




public function getRequest(): RequestInterface
{
return $this->request;
}




public function getResponse(): ?ResponseInterface
{
return $this->response;
}




public function hasResponse(): bool
{
return $this->response !== null;
}









public function getHandlerContext(): array
{
return $this->handlerContext;
}
}
<?php

namespace GuzzleHttp\Exception;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;




class BadResponseException extends RequestException
{
public function __construct(
string $message,
RequestInterface $request,
ResponseInterface $response,
?\Throwable $previous = null,
array $handlerContext = []
) {
parent::__construct($message, $request, $response, $previous, $handlerContext);
}




public function hasResponse(): bool
{
return true;
}




public function getResponse(): ResponseInterface
{

return parent::getResponse();
}
}
<?php

namespace GuzzleHttp\Exception;

class TransferException extends \RuntimeException implements GuzzleException
{
}
<?php

namespace GuzzleHttp\Exception;

use Psr\Http\Client\ClientExceptionInterface;

interface GuzzleException extends ClientExceptionInterface
{
}
<?php

namespace GuzzleHttp\Exception;




class ClientException extends BadResponseException
{
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Cookie\CookieJarInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;




final class Middleware
{








public static function cookies(): callable
{
return static function (callable $handler): callable {
return static function ($request, array $options) use ($handler) {
if (empty($options['cookies'])) {
return $handler($request, $options);
} elseif (!($options['cookies'] instanceof CookieJarInterface)) {
throw new \InvalidArgumentException('cookies must be an instance of GuzzleHttp\Cookie\CookieJarInterface');
}
$cookieJar = $options['cookies'];
$request = $cookieJar->withCookieHeader($request);

return $handler($request, $options)
->then(
static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface {
$cookieJar->extractCookies($request, $response);

return $response;
}
);
};
};
}









public static function httpErrors(?BodySummarizerInterface $bodySummarizer = null): callable
{
return static function (callable $handler) use ($bodySummarizer): callable {
return static function ($request, array $options) use ($handler, $bodySummarizer) {
if (empty($options['http_errors'])) {
return $handler($request, $options);
}

return $handler($request, $options)->then(
static function (ResponseInterface $response) use ($request, $bodySummarizer) {
$code = $response->getStatusCode();
if ($code < 400) {
return $response;
}
throw RequestException::create($request, $response, null, [], $bodySummarizer);
}
);
};
};
}










public static function history(&$container): callable
{
if (!\is_array($container) && !$container instanceof \ArrayAccess) {
throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess');
}

return static function (callable $handler) use (&$container): callable {
return static function (RequestInterface $request, array $options) use ($handler, &$container) {
return $handler($request, $options)->then(
static function ($value) use ($request, &$container, $options) {
$container[] = [
'request' => $request,
'response' => $value,
'error' => null,
'options' => $options,
];

return $value;
},
static function ($reason) use ($request, &$container, $options) {
$container[] = [
'request' => $request,
'response' => null,
'error' => $reason,
'options' => $options,
];

return P\Create::rejectionFor($reason);
}
);
};
};
}














public static function tap(?callable $before = null, ?callable $after = null): callable
{
return static function (callable $handler) use ($before, $after): callable {
return static function (RequestInterface $request, array $options) use ($handler, $before, $after) {
if ($before) {
$before($request, $options);
}
$response = $handler($request, $options);
if ($after) {
$after($request, $options, $response);
}

return $response;
};
};
}






public static function redirect(): callable
{
return static function (callable $handler): RedirectMiddleware {
return new RedirectMiddleware($handler);
};
}
















public static function retry(callable $decider, ?callable $delay = null): callable
{
return static function (callable $handler) use ($decider, $delay): RetryMiddleware {
return new RetryMiddleware($decider, $handler, $delay);
};
}

/**
@phpstan-param









*/
public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable
{

if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) {
throw new \LogicException(sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class));
}

return static function (callable $handler) use ($logger, $formatter, $logLevel): callable {
return static function (RequestInterface $request, array $options = []) use ($handler, $logger, $formatter, $logLevel) {
return $handler($request, $options)->then(
static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface {
$message = $formatter->format($request, $response);
$logger->log($logLevel, $message);

return $response;
},
static function ($reason) use ($logger, $request, $formatter): PromiseInterface {
$response = $reason instanceof RequestException ? $reason->getResponse() : null;
$message = $formatter->format($request, $response, P\Create::exceptionFor($reason));
$logger->error($message);

return P\Create::rejectionFor($reason);
}
);
};
};
}





public static function prepareBody(): callable
{
return static function (callable $handler): PrepareBodyMiddleware {
return new PrepareBodyMiddleware($handler);
};
}








public static function mapRequest(callable $fn): callable
{
return static function (callable $handler) use ($fn): callable {
return static function (RequestInterface $request, array $options) use ($handler, $fn) {
return $handler($fn($request), $options);
};
};
}








public static function mapResponse(callable $fn): callable
{
return static function (callable $handler) use ($fn): callable {
return static function (RequestInterface $request, array $options) use ($handler, $fn) {
return $handler($request, $options)->then($fn);
};
};
}
}
<?php

namespace GuzzleHttp;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

interface MessageFormatterInterface
{







public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string;
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;




interface ClientInterface
{



public const MAJOR_VERSION = 7;










public function send(RequestInterface $request, array $options = []): ResponseInterface;








public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface;














public function request(string $method, $uri, array $options = []): ResponseInterface;













public function requestAsync(string $method, $uri, array $options = []): PromiseInterface;














public function getConfig(?string $option = null);
}
<?php

namespace GuzzleHttp;

use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\EachPromise;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Promise\PromisorInterface;
use Psr\Http\Message\RequestInterface;














class Pool implements PromisorInterface
{



private $each;











public function __construct(ClientInterface $client, $requests, array $config = [])
{
if (!isset($config['concurrency'])) {
$config['concurrency'] = 25;
}

if (isset($config['options'])) {
$opts = $config['options'];
unset($config['options']);
} else {
$opts = [];
}

$iterable = P\Create::iterFor($requests);
$requests = static function () use ($iterable, $client, $opts) {
foreach ($iterable as $key => $rfn) {
if ($rfn instanceof RequestInterface) {
yield $key => $client->sendAsync($rfn, $opts);
} elseif (\is_callable($rfn)) {
yield $key => $rfn($opts);
} else {
throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\Http\Message\RequestInterface or a callable that returns a promise that fulfills with a Psr7\Message\Http\ResponseInterface object.');
}
}
};

$this->each = new EachPromise($requests(), $config);
}




public function promise(): PromiseInterface
{
return $this->each->promise();
}



















public static function batch(ClientInterface $client, $requests, array $options = []): array
{
$res = [];
self::cmpCallback($options, 'fulfilled', $res);
self::cmpCallback($options, 'rejected', $res);
$pool = new static($client, $requests, $options);
$pool->promise()->wait();
\ksort($res);

return $res;
}




private static function cmpCallback(array &$options, string $name, array &$results): void
{
if (!isset($options[$name])) {
$options[$name] = static function ($v, $k) use (&$results) {
$results[$k] = $v;
};
} else {
$currentFn = $options[$name];
$options[$name] = static function ($v, $k) use (&$results, $currentFn) {
$currentFn($v, $k);
$results[$k] = $v;
};
}
}
}
<?php

namespace GuzzleHttp;

use Psr\Http\Message\MessageInterface;

interface BodySummarizerInterface
{



public function summarize(MessageInterface $message): ?string;
}
<?php

declare(strict_types=1);

use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector;
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;

return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/spec',
__DIR__ . '/src',
__DIR__ . '/tests',
]);





$rectorConfig->sets([
LevelSetList::UP_TO_PHP_80,
]);
};
The MIT License (MIT)

Copyright (c) 2022 License holder

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.
{"$schema":"https:\/\/docs.renovatebot.com\/renovate-schema.json","extends":["config:base"]}<?php






declare(strict_types=1);

namespace loophp\phposinfo;

interface OsInfoInterface
{
public static function arch(): string;

public static function family(): string;

public static function hostname(): string;

public static function isApple(): bool;

public static function isBSD(): bool;

public static function isFamily(int|string $family): bool;

public static function isOs(int|string $os): bool;

public static function isUnix(): bool;

public static function isWindows(): bool;

public static function os(): string;




public static function register(): void;

public static function release(): string;











public static function uuid(): ?string;

public static function version(): string;
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo;

use Exception;
use loophp\phposinfo\Enum\Family;
use loophp\phposinfo\Enum\FamilyName;
use loophp\phposinfo\Enum\Os;
use loophp\phposinfo\Enum\OsName;

use function define;
use function defined;
use function is_string;

use const PHP_OS;
use const PHP_OS_FAMILY;

final class OsInfo implements OsInfoInterface
{
public static function arch(): string
{
return php_uname('m');
}

public static function family(): string
{
return sprintf('%s', FamilyName::value(Family::key(self::detectFamily())));
}

public static function hostname(): string
{
return php_uname('n');
}

public static function isApple(): bool
{
return self::isFamily(Family::DARWIN);
}

public static function isBSD(): bool
{
return self::isFamily(Family::BSD);
}

public static function isFamily($family): bool
{
$detectedFamily = self::detectFamily();

if (true === is_string($family)) {
$family = self::normalizeConst($family);

if (false === Family::has($family)) {
return false;
}

$family = Family::value($family);
}

return $detectedFamily === $family;
}

public static function isOs($os): bool
{
$detectedOs = self::detectOs();

if (true === is_string($os)) {
$os = self::normalizeConst($os);

if (false === Os::has($os)) {
return false;
}

$os = Os::value($os);
}

return $detectedOs === $os;
}

public static function isUnix(): bool
{
return self::isFamily(Family::LINUX);
}

public static function isWindows(): bool
{
return self::isFamily(Family::WINDOWS);
}

public static function os(): string
{
return sprintf('%s', OsName::value(Os::key(self::detectOs())));
}

public static function register(): void
{
$family = self::family();
$os = self::os();

if (false === defined('PHP_OS_FAMILY')) {
define('PHP_OS_FAMILY', $family);
}

if (false === defined('PHP_OS')) {
define('PHP_OS', $os);
}

if (false === defined('PHPOSINFO_OS_FAMILY')) {
define('PHPOSINFO_OS_FAMILY', $family);
}

if (false === defined('PHPOSINFO_OS')) {
define('PHPOSINFO_OS', $os);
}
}

public static function release(): string
{
return php_uname('r');
}

public static function uuid(): ?string
{
$uuidGenerator = 'shell_exec';
$uuidCommand = null;

switch (self::family()) {
case FamilyName::LINUX:
$uuidCommand = '( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :';

break;

case FamilyName::DARWIN:
$uuidCommand = 'ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID';
$uuidGenerator = static function (string $command) use ($uuidGenerator): ?string {
$output = $uuidGenerator($command);
$uuid = null;

if (null !== $output) {
$parts = explode('=', str_replace('"', '', $output));
$uuid = strtolower(trim($parts[1]));
}

return $uuid;
};

break;

case FamilyName::WINDOWS:
$uuidCommand = '%windir%\\System32\\reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid';

break;

case FamilyName::BSD:
$uuidCommand = 'kenv -q smbios.system.uuid';

break;

default:
$uuidGenerator = static fn (?string $command): ?string => $command;
}

return null !== $uuidCommand ? $uuidGenerator($uuidCommand) : null;
}

public static function version(): string
{
return php_uname('v');
}




private static function detectFamily(?int $os = null): int
{
$os ??= self::detectOs();


$family = $os - (($os >> 16) << 16);

if (true === Family::isValid($family)) {
return $family;
}

if (true === defined(PHP_OS_FAMILY)) {
$phpOsFamily = self::normalizeConst(PHP_OS_FAMILY);

if (true === Family::has($phpOsFamily)) {
return (int) Family::value($phpOsFamily);
}
}

throw self::errorMessage();
}




private static function detectOs(): int
{
foreach ([php_uname('s'), PHP_OS] as $os) {
$os = self::normalizeConst($os);

if (true === Os::has($os)) {
return (int) Os::value($os);
}
}

throw self::errorMessage();
}




private static function errorMessage(): Exception
{
$uname = php_uname();
$os = php_uname('s');

$message = <<<EOF
            Unable to find a proper information for this operating system.

            Please open an issue on https://github.com/loophp/phposinfo and attach the
            following information so I can update the library:

            ---8<---
            php_uname(): {$uname}
            php_uname('s'): {$os}
            --->8---

            Thanks.

            EOF;

throw new Exception($message);
}

private static function normalizeConst(string $name): string
{
return strtoupper(
str_replace('-.', '', (string) preg_replace('/[^a-zA-Z0-9]/', '', $name))
);
}
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo\Enum;

final class Os extends Enum
{
public const AIX = 0x00010005;

public const BEOS = 0x00020005;

public const CYGWIN = 0x00030006;

public const CYGWINNT51 = 0x00040006;

public const CYGWINNT61 = 0x00050006;

public const CYGWINNT61WOW64 = 0x00060006;

public const DARWIN = 0x00070004;

public const DEBIANFREEBSD = 0x00080003;

public const DRAGONFLY = 0x00090003;

public const FREEBSD = 0x000A0003;

public const GNU = 0x000B0005;

public const GNUFREEBSD = 0x000C0003;

public const GNUKFREEBSD = 0x000D0003;

public const GNULINUX = 0x000E0005;

public const HAIKU = 0x000F0001;

public const HPUX = 0x00100005;

public const INTERIX = 0x00110002;

public const IRIX = 0x00120005;

public const IRIX64 = 0x00130005;

public const KOS = 0x00140005;

public const LINUX = 0x00150005;

public const MINGW = 0x00160006;

public const MINGW32NT61 = 0x00170006;

public const MINIX = 0x00180005;

public const MSYSNT61 = 0x00190006;

public const NETBSD = 0x001A0003;

public const NONSTOP = 0x001B0001;

public const NONSTOPKERNEL = 0x001C0001;

public const OPENBSD = 0x001D0003;

public const OS390 = 0x001E0005;

public const OS400 = 0x001F0005;

public const OSF1 = 0x00200005;

public const QNX = 0x00210005;

public const RELIANTUNIXY = 0x00220005;

public const SCOSV = 0x00230005;

public const SINIXY = 0x00240005;

public const SN5176 = 0x00250005;

public const SOLARIS = 0x00260005;

public const SUNOS = 0x00270005;

public const ULTRIX = 0x00280005;

public const UNIXWARE = 0x00290005;

public const UWIN = 0x002A0002;

public const UWINW7 = 0x002B0002;

public const WIN32 = 0x002C0002;

public const WINDOWS = 0x002D0002;

public const WINDOWSNT = 0x002E0002;

public const WINNT = 0x002F0002;

public const ZOS = 0x00300005;
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo\Enum;

use Exception;
use Generator;
use ReflectionClass;
use ReflectionException;

use function constant;

abstract class Enum
{



final public static function getIterator(): Generator
{
$reflection = null;

try {
$reflection = new ReflectionClass(static::class);
} catch (ReflectionException) {

}

if (null !== $reflection) {
yield from $reflection->getConstants();
}
}

final public static function has(string $key): bool
{
foreach (static::getIterator() as $keyConst => $valueConst) {
if ($key !== $keyConst) {
continue;
}

return true;
}

return false;
}

final public static function isValid(int|string $value): bool
{
foreach (static::getIterator() as $valueConst) {
if ($value !== $valueConst) {
continue;
}

return true;
}

return false;
}




final public static function key(int|string $value): string
{
foreach (static::getIterator() as $keyConst => $valueConst) {
if ($value === $valueConst) {
return $keyConst;
}
}

throw new Exception('No such key.');
}

final public static function value(string $value): int|string
{
return constant('static::' . $value);
}
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo\Enum;

final class Family extends Enum
{
public const BSD = 0x0003;

public const DARWIN = 0x0004;

public const LINUX = 0x0005;

public const UNIX_ON_WINDOWS = 0x0006;

public const UNKNOWN = 0x0001;

public const WINDOWS = 0x0002;
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo\Enum;

final class OsName extends Enum
{
public const AIX = 'AIX';

public const BEOS = 'BE OS';

public const CYGWIN = 'Cygwin';

public const CYGWINNT51 = 'Cygwin Win NT 5.1';

public const CYGWINNT61 = 'Cygwin Win NT 6.1';

public const CYGWINNT61WOW64 = 'Cygwin Win NT 6.1 WOW 64';

public const DARWIN = 'Darwin';

public const DEBIANFREEBSD = 'Debian/FreeBSD';

public const DRAGONFLY = 'Dragonfly';

public const FREEBSD = 'FreeBSD';

public const GNU = 'GNU';

public const GNUFREEBSD = 'GNU/FreeBSD';

public const GNUKFREEBSD = 'GNU/KFreeBSD';

public const GNULINUX = 'GNU/Linux';

public const HAIKU = 'Haiky';

public const HPUX = 'HP UX';

public const INTERIX = 'Interix';

public const IRIX = 'Irix';

public const IRIX64 = 'Irix 64';

public const KOS = 'K/OS';

public const LINUX = 'Linux';

public const MINGW = 'MingW';

public const MINGW32NT61 = 'MingW 32 NT 6.1';

public const MINIX = 'Minux';

public const MSYSNT61 = 'Msys NT 6.1';

public const NETBSD = 'NetBSD';

public const NONSTOP = 'Nonstop';

public const NONSTOPKERNEL = 'Nonstop kernel';

public const OPENBSD = 'OpenBSD';

public const OS390 = 'OS/390';

public const OS400 = 'OS/400';

public const OSF1 = 'OSF1';

public const QNX = 'QNX';

public const RELIANTUNIXY = 'ReliantUnix-Y';

public const SCOSV = 'SCO SV';

public const SINIXY = 'Sinix Y';

public const SN5176 = 'SN5176';

public const SOLARIS = 'Solaris';

public const SUNOS = 'Sun OS';

public const ULTRIX = 'Ultrix';

public const UNIXWARE = 'Unixware';

public const UWIN = 'Uwin';

public const UWINW7 = 'Uwin W7';

public const WIN32 = 'Win 32';

public const WINDOWS = 'Windows';

public const WINDOWSNT = 'Windows NT';

public const WINNT = 'Win NT';

public const ZOS = 'Z/OS';
}
<?php






declare(strict_types=1);

namespace loophp\phposinfo\Enum;

final class FamilyName extends Enum
{
public const BSD = 'BSD';

public const DARWIN = 'Darwin';

public const LINUX = 'Linux';

public const UNIX_ON_WINDOWS = 'Unix on Windows';

public const UNKNOWN = 'Unknown';

public const WINDOWS = 'Windows';
}
#!/usr/bin/env php
<?php

/**
 * Usage:
 *
 * ./vendor/bin/release VERSION
 */

$semverRegEx = '(?<version>[0-9]+\.[0-9]+\.[0-9]+)(?<prerelease>-[0-9a-zA-Z.]+)?(?<build>\+[0-9a-zA-Z.]*)?';

$optind = null;
$options = getopt ("dvy", [
  'pattern:',
  'simulate',
  'yes',
], $optind) + [
  'pattern' => "^SEMVER$",
];
$simulate = array_key_exists('simulate', $options);
$yes = array_key_exists('yes', $options) || array_key_exists('y', $options);

$pos_args = array_slice($argv, $optind);
$path = array_shift($pos_args);

if (empty($path)) {
    print "Path to version file must be specified as a commandline argument\n";
    exit(1);
}

if (!file_exists($path)) {
    print "Version file not found at $path\n";
    exit(1);
}

// The --pattern option is expected to contain the string SEMVER
$regex = str_replace('SEMVER', "$semverRegEx", $options['pattern']);
if ($regex == $options['pattern']) {
    print "Pattern '$regex' must contain the string 'SEMVER'.\n";
    exit(1);
}

// Read the contents of the version file and find the version string
$contents = file_get_contents($path);
if (!preg_match("#$regex#m", $contents, $matches)) {
    print "A semver version not found in $path\n";
    exit(1);
}
$matches += ['prerelease' => '', 'build' => ''];

// Calculate the stable and next version strings
$original_version_match = $matches[0];
$original_version = $matches['version'] . $matches['prerelease'] . $matches['build'];
$stable_version = $matches['version'] . (has_prerelease($matches) ? $matches['prerelease'] : '');
$next_version = next_version($matches);

$stable_version_replacement = str_replace($original_version, $stable_version, $original_version_match);
$next_version_replacement = str_replace($original_version, $next_version, $original_version_match);

$stable_version_contents = str_replace($original_version_match, $stable_version_replacement, $contents);
$next_version_contents = str_replace($original_version_match, $next_version_replacement, $contents);

$composerContents = file_get_contents('composer.json');
$composerData = json_decode($composerContents, true);
$project = $composerData['name'];

$msg = "Release $project version $stable_version";
$dashes = str_pad('', strlen($msg) + 8, '-', STR_PAD_LEFT);

print "\n$dashes\n\n";
print "    $msg\n";
print "\n$dashes\n\n";

// Write the stable version into the version file, tag and push the release
if (!$simulate) {
    file_put_contents($path, $stable_version_contents);
}
else {
    print "Replace stable version in $path:\n> $stable_version_replacement\n";
}

run('git add {path}', ['{path}' => $path], $simulate);
run('git commit -m "Version {version}"', ['{version}' => $stable_version], $simulate);
run('git tag {version}', ['{version}' => $stable_version], $simulate);
run('git push origin {version}', ['{version}' => $stable_version], $simulate);

// Put the next version into the version file and push the result back to master
if (!$simulate) {
    file_put_contents($path, $next_version_contents);
}
else {
    print "Replace next version in $path:\n> $next_version_replacement\n";
}

run('git add {path}', ['{path}' => $path], $simulate);
run('git commit -m "[ci skip] Back to {version}"', ['{version}' => $next_version], $simulate);
run('git push origin master', [], $simulate);

exit(0);

/**
 * inflect replaces the placeholders in the command with the provided parameter values
 * @param string $cmd
 * @param array $parameters
 * @return string
 */
function inflect($cmd, $parameters = [])
{
    if (!empty($parameters)) {
        return str_replace(array_keys($parameters), array_values($parameters), $cmd);
    }
    return $cmd;
}

/**
 * Run the specified command. Abort most rudely if an error is encountered
 */
function run($cmd, $parameters = [], $simulate = false)
{
    $cmd = inflect($cmd, $parameters);
    if ($simulate) {
        print "$cmd\n";
        return;
    }
    passthru($cmd, $status);
    if ($status) {
        exit($status);
    }
}

/**
 * Determine the next version after the current release
 */
function next_version($matches)
{
    $version = $matches['version'];

    $next_version = next_version_prerelease($matches);
    if ($next_version !== false) {
        return $next_version;
    }
    return next_version_stable($matches);
}

/**
 * Determine the next version given that the current version is stable
 */
function next_version_stable($matches)
{
    $version_parts = explode('.', $matches['version']);
    $last_version = array_pop($version_parts);
    $last_version++;
    $version_parts[] = $last_version;

    return implode('.', $version_parts) . (empty($matches['prerelease']) ? '-dev' : $matches['prerelease']);
}

function has_prerelease($matches)
{
    if (empty($matches['prerelease'])) {
        return false;
    }

    return is_numeric(substr($matches['prerelease'], -1));
}

/**
 * Determine the next version given that the current version has a pre-release
 * (e.g. '-alpha5').
 */
function next_version_prerelease($version_parts)
{
    if (!preg_match('#(.*?)([0-9]+)$#', $version_parts['prerelease'], $matches)) {
        return false;
    }
    $next = $matches[2] + 1;
    return $version_parts['version'] . $matches[1] . $next . '+dev';
}
The MIT License (MIT)

Copyright (c) 2014 Codegyre Developers Team, Consolidation Team

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.
<?php

namespace SelfUpdate;

use Composer\Semver\Comparator;
use Composer\Semver\VersionParser;
use Composer\Semver\Semver;
use GuzzleHttp\HandlerStack;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Storage\Psr6CacheStorage;
use Kevinrob\GuzzleCache\Strategy\PublicCacheStrategy;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use UnexpectedValueException;






class SelfUpdateManager
{





public function __construct(public string $applicationName, public string $currentVersion, public string $gitHubRepository){
$this->currentVersion = (new VersionParser())->normalize($this->currentVersion);
}




public function isUpToDate(array $options = []): bool {
$latestRelease = $this->getLatestReleaseFromGithub($options);
return NULL === $latestRelease || Comparator::greaterThanOrEqualTo($this->currentVersion, $latestRelease['version']);
}










public function getLatestReleaseFromGithub(array $options = []): ?array
{
$options = array_merge([
'preview' => false,
'compatible' => false,
'version_constraint' => null,
], $options);

foreach ($this->getReleasesFromGithub() as $releaseVersion => $release) {

$pharAsset = null;
if (isset($release['assets']) && is_array($release['assets'])) {
foreach ($release['assets'] as $asset) {
if (is_object($asset) && isset($asset->content_type) && $asset->content_type === 'application/octet-stream') {
$pharAsset = $asset;
break;
}
}
}

if (!$pharAsset) {
continue;
}

if ($options['compatible'] && !$this->satisfiesMajorVersionConstraint($releaseVersion)) {

continue;
}

if (!$options['preview'] && ((VersionParser::parseStability($releaseVersion) !== 'stable') || $release['prerelease'])) {

continue;
}

if (null !== $options['version_constraint'] && !Semver::satisfies($releaseVersion, $options['version_constraint'])) {

continue;
}

return [
'version' => $releaseVersion,
'tag_name' => $release['tag_name'],
'download_url' => $pharAsset->browser_download_url,
];
}

return null;
}











private function getReleasesFromGithub(): array
{
$version_parser = new VersionParser();
$stack = HandlerStack::create();
$stack->push(
new CacheMiddleware(
new PublicCacheStrategy(
new Psr6CacheStorage(
new FilesystemAdapter('self-update')
)
)
),
'cache'
);
$opts = [
'handler' => $stack,
'headers' => [
'User-Agent' => $this->applicationName . ' (' . $this->gitHubRepository . ')' . ' Self-Update (PHP)',
],
];
$client = new \GuzzleHttp\Client($opts);
$response = $client->request(
'GET',
'https://api.github.com/repos/' . $this->gitHubRepository . '/releases'
);

$releases = json_decode($response->getBody(), FALSE, 512, JSON_THROW_ON_ERROR);

if (!isset($releases[0])) {
throw new \RuntimeException('API error - no release found at GitHub repository ' . $this->gitHubRepository);
}
$parsed_releases = [];
foreach ($releases as $release) {
try {
$normalized = $version_parser->normalize($release->tag_name);
} catch (UnexpectedValueException) {

continue;
}

$parsed_releases[$normalized] = [
'tag_name' => $release->tag_name,
'assets' => $release->assets,
'prerelease' => $release->prerelease,
];
}
$sorted_versions = Semver::rsort(array_keys($parsed_releases));
$sorted_releases = [];
foreach ($sorted_versions as $version) {
$sorted_releases[$version] = $parsed_releases[$version];
}
return $sorted_releases;
}




private function satisfiesMajorVersionConstraint(string $releaseVersion): bool
{
if (preg_match('/^v?(\d+)/', $this->currentVersion, $matches)) {
return Semver::satisfies($releaseVersion , '^' . $matches[1]);
}

return false;
}

}
<?php

namespace SelfUpdate;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem as sfFilesystem;
use UnexpectedValueException;






class SelfUpdateCommand extends Command
{
public const SELF_UPDATE_COMMAND_NAME = 'self:update';

public function __construct(private readonly SelfUpdateManager $selfUpdateManager, private readonly bool $ignorePharRunningCheck = false)
{
parent::__construct(self::SELF_UPDATE_COMMAND_NAME);
}




protected function configure(): void
{
$app = $this->selfUpdateManager->applicationName;


$this
->setAliases(array('update', 'self-update'))
->setDescription("Updates $app to the latest version.")
->addArgument('version_constraint', InputArgument::OPTIONAL, 'Apply version constraint')
->addOption('stable', NULL, InputOption::VALUE_NONE, 'Use stable releases (default)')
->addOption('preview', NULL, InputOption::VALUE_NONE, 'Preview unstable (e.g., alpha, beta, etc.) releases')
->addOption('compatible', NULL, InputOption::VALUE_NONE, 'Stay on current major version')
->setHelp(
<<<EOT
The <info>self-update</info> command checks GitHub for newer
versions of $app and if found, installs the latest.
EOT
);
}







protected function execute(InputInterface $input, OutputInterface $output): int
{
if (!$this->ignorePharRunningCheck && empty(\Phar::running())) {
throw new \RuntimeException(self::SELF_UPDATE_COMMAND_NAME . ' only works when running the phar version of ' . $this->selfUpdateManager->applicationName . '.');
}

$localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0];
$programName = basename($localFilename);
$tempFilename = dirname($localFilename) . '/' . basename($localFilename, '.phar') . '-temp.phar';


if (! is_writable($tempDirectory = dirname($tempFilename))) {
throw new \RuntimeException(
$programName . ' update failed: the "' . $tempDirectory .
'" directory used to download the temp file could not be written'
);
}

if (!is_writable($localFilename)) {
throw new \RuntimeException(
$programName . ' update failed: the "' . $localFilename . '" file could not be written (execute with sudo)'
);
}

$isPreviewOptionSet = $input->getOption('preview');
$isStable = $input->getOption('stable') || !$isPreviewOptionSet;
if ($isPreviewOptionSet && $isStable) {
throw new \RuntimeException(self::SELF_UPDATE_COMMAND_NAME . ' support either stable or preview, not both.');
}

$isCompatibleOptionSet = $input->getOption('compatible');
$versionConstraintArg = $input->getArgument('version_constraint');

$options = [
'preview' => $isPreviewOptionSet,
'compatible' => $isCompatibleOptionSet,
'version_constraint' => $versionConstraintArg,
];

if ($this->selfUpdateManager->isUpToDate($options)) {
$output->writeln('No update available');
return Command::SUCCESS;
}

$latestRelease = $this->selfUpdateManager->getLatestReleaseFromGithub($options);

$fs = new sfFilesystem();

$output->writeln('Downloading ' . $this->selfUpdateManager->applicationName . ' (' . $this->selfUpdateManager->gitHubRepository . ') ' . $latestRelease['tag_name']);

$fs->copy($latestRelease['download_url'], $tempFilename);

$output->writeln('Download finished');

try {
\error_reporting(E_ALL); 

@chmod($tempFilename, 0777 & ~umask());

$phar = new \Phar($tempFilename);

unset($phar);
@rename($tempFilename, $localFilename);
$output->writeln('<info>Successfully updated ' . $programName . '</info>');

$this->_exit();
} catch (\Exception $e) {
@unlink($tempFilename);
if (! $e instanceof UnexpectedValueException && ! $e instanceof \PharException) {
throw $e;
}
$output->writeln('<error>The download is corrupted (' . $e->getMessage() . ').</error>');
$output->writeln('<error>Please re-run the self-update command to try again.</error>');

return Command::FAILURE;
}

return Command::SUCCESS;
}









protected function _exit(): void {
exit;
}
}
The MIT License (MIT)

Copyright (c) 2016 Woody Gilk

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.
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;

class ResponseFactory implements ResponseFactoryInterface
{
public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface
{
return new Response($code, [], null, '1.1', $reasonPhrase);
}
}
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\ServerRequest;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\ServerRequestInterface;

class ServerRequestFactory implements ServerRequestFactoryInterface
{
public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
{

if (empty($method)) {
if (!empty($serverParams['REQUEST_METHOD'])) {
$method = $serverParams['REQUEST_METHOD'];
} else {
throw new \InvalidArgumentException('Cannot determine HTTP method');
}
}

return new ServerRequest($method, $uri, [], null, '1.1', $serverParams);
}
}
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\Request;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;

class RequestFactory implements RequestFactoryInterface
{
public function createRequest(string $method, $uri): RequestInterface
{
return new Request($method, $uri);
}
}
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\UploadedFile;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileInterface;

class UploadedFileFactory implements UploadedFileFactoryInterface
{
public function createUploadedFile(
StreamInterface $stream,
int $size = null,
int $error = \UPLOAD_ERR_OK,
string $clientFilename = null,
string $clientMediaType = null
): UploadedFileInterface {
if ($size === null) {
$size = $stream->getSize();
}

return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType);
}
}
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\Uri;
use Psr\Http\Message\UriFactoryInterface;
use Psr\Http\Message\UriInterface;

class UriFactory implements UriFactoryInterface
{
public function createUri(string $uri = ''): UriInterface
{
return new Uri($uri);
}
}
<?php

namespace Http\Factory\Guzzle;

use GuzzleHttp\Psr7\Stream;
use GuzzleHttp\Psr7\Utils;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;

class StreamFactory implements StreamFactoryInterface
{
public function createStream(string $content = ''): StreamInterface
{
return Utils::streamFor($content);
}

public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface
{
return $this->createStreamFromResource(Utils::tryFopen($file, $mode));
}

public function createStreamFromResource($resource): StreamInterface
{
return new Stream($resource);
}
}
MIT License

Copyright (c) 2019 Adam Malone

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.
<?php

namespace AcquiaLogstream;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Connector\Connector;
use AcquiaCloudApi\Endpoints\Logs;






class LogstreamCommand extends Command
{
protected static $defaultName = 'acquia:logstream';




protected function configure()
{
$this
->setAliases(['logstream', 'stream'])
->setDescription('Streams logs directly from the Acquia Cloud')
->addArgument('key', InputArgument::REQUIRED, 'Acquia API key')
->addArgument('secret', InputArgument::REQUIRED, 'Acquia API secret')
->addArgument('environmentUuid', InputArgument::REQUIRED, 'UUID of the environment to stream')
->addOption(
'logtypes',
't',
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'Log types to stream',
array_keys(LogstreamManager::AVAILABLE_TYPES)
)
->addOption(
'servers',
's',
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'Servers to stream logs from e.g. web-1234.'
)
->addOption(
'colourise',
'c',
InputOption::VALUE_NONE,
'Colorise the output based on HTTP status code.'
);
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
$config = [
'key' => $input->getArgument('key'),
'secret' => $input->getArgument('secret')
];

$connector = new Connector($config);
$client = Client::factory($connector);

$client->addOption('headers', [
'User-Agent' => sprintf(
"%s/%s (https://github.com/typhonius/acquia-logstream)",
$this->getApplication()->getName(),
$this->getApplication()->getVersion()
)
]);

$logs = new Logs($client);

$stream = $logs->stream($input->getArgument('environmentUuid'));

$logstream = new LogstreamManager($input, $output);
$logstream->setParams($stream->logstream->params);

$logstream->setLogTypeFilter($input->getOption('logtypes'));
$logstream->setLogServerFilter($input->getOption('servers'));
$logstream->setColourise($input->getOption('colourise'));
$logstream->stream();
return 0;
}
}
<?php

namespace AcquiaLogstream;

use React\Socket\Connector as React;
use Ratchet\Client\Connector as Ratchet;
use Ratchet\Client\WebSocket;
use Ratchet\RFC6455\Messaging\MessageInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use React\EventLoop\Factory as EventLoop;

class LogstreamManager
{
public const LOGSTREAM_URI = 'wss://logstream.acquia.com:443/ah_websocket/logstream/v1';


public const AVAILABLE_TYPES = [
'bal-request' => 'Balancer request',
'varnish-request' => 'Varnish request',
'apache-request' => 'Apache request',
'apache-error' => 'Apache error',
'php-error' => 'PHP error',
'drupal-watchdog' => 'Drupal watchdog',
'drupal-request' => 'Drupal request',
'mysql-slow' => 'MySQL slow query',
];


private $input; 
private $output;
private $logTypes = [];
private $servers = [];
private $site;
private $hmac;
private $time;
private $environment;
private $dns = '1.1.1.1';
private $timeout = 10;
private $colourise = false;
private $requiredParams = ['site', 'hmac', 't', 'environment'];







public function __construct(InputInterface $input, OutputInterface $output)
{
$this->input = $input;
$this->output = $output;
}


















public function setParams(\stdClass $params): void
{
array_walk(
$this->requiredParams,
function ($param, $key, $params) {
if (!property_exists($params, $param)) {
throw new \Exception(sprintf('Missing parameter: (%s)', $param));
}
},
$params
);

$this->site = $params->site;
$this->hmac = $params->hmac;
$this->time = $params->t;
$this->environment = $params->environment;
}






public function setLogServerFilter(array $servers): void
{
$this->servers = $servers;
}






public function getLogServerFilter(): array
{
return $this->servers;
}








public function setLogTypeFilter(array $types): void
{
foreach ($types as $type) {
if (!array_key_exists($type, self::AVAILABLE_TYPES)) {
throw new \RuntimeException(sprintf('Invalid log type: (%s)', $type));
}
}
$this->logTypes = $types;
}






public function getLogTypeFilter(): array
{
return $this->logTypes;
}






public function setDns($dns): void
{
$this->dns = $dns;
}






public function getDns(): string
{
return $this->dns;
}






public function setTimeout($timeout): void
{
$this->timeout = $timeout;
}






public function getTimeout(): int
{
return $this->timeout;
}






public function setColourise(bool $colourise): void
{
$this->colourise = $colourise;
}






public function getColourise(): bool
{
return $this->colourise;
}




public function stream()
{

$loop = EventLoop::create();
$reactConnector = new React(
$loop,
[
'dns' => $this->dns,
'timeout' => $this->timeout
]
);

$connector = new Ratchet($loop, $reactConnector);

$connector(self::LOGSTREAM_URI)
->then(
function (WebSocket $conn) {
$conn->on(
'message',
function (MessageInterface $msg) use ($conn) {
if ($send = $this->processMessage($msg)) {
$conn->send($send);
}
}
);

$conn->on(
'close',
function ($code = null, $reason = null) {
echo "Connection closed ({$code} - {$reason})\n";
}
);

$conn->send(json_encode($this->getAuthArray()));
},
function (\Throwable $e) use ($loop) {
echo "Could not connect: {$e->getMessage()}\n";
$loop->stop();
}
);

$loop->run();
}

protected function processMessage($msg)
{
$message = json_decode($msg);

if ($message->cmd === 'available') {
if (empty($this->logTypes) || in_array($message->type, $this->logTypes)) {
if (empty($this->servers) || in_array($message->server, $this->servers)) {
$enable = [
'cmd' => 'enable',
'type' => $message->type,
'server' => $message->server
];

return json_encode($enable);
}
}
} elseif ($message->cmd === 'line') {
$colour = $this->pickColour($message);

if ($this->output->isVeryVerbose()) {
$this->output->writeln(sprintf('<%s>%s</>', $colour, $msg));
} elseif ($this->output->isVerbose()) {
$this->output->writeln(
sprintf(
'<%s>%s %s %s</>',
$colour,
$message->log_type,
$message->server,
$message->text
)
);
} else {
$this->output->writeln(sprintf('<%s>%s</>', $colour, $message->text));
}
} elseif ($message->cmd === 'error') {
$this->output->writeln(sprintf('<%s>%s</>', 'fg=red', $msg));
} else {
if ($this->output->isDebug()) {
$this->output->writeln($msg);
}
}
}






protected function getAuthArray(): array
{
return [
'site' => $this->site,
'd' => $this->hmac,
't' => $this->time,
'env' => $this->environment,
'cmd' => 'stream-environment'
];
}







protected function pickColour($message): string
{
$colour = '/';
if (!$this->colourise) {
return $colour;
}

if (isset($message->log_type)) {
switch ($message->log_type) {
case 'apache-error':
case 'php-error':
case 'mysql-slow':
$colour = 'fg=red';
break;
case 'apache-request':
case 'drupal-request':
$colour = 'fg=yellow';
break;
case 'bal-request':
case 'varnish-request':
$colour = 'fg=green';
break;
}
}
return $colour;
}
}
0.0.10-dev
#!/usr/bin/env php
<?php
/**
 * @file This file is a simply shell wrapper for running Acquia Logstream command.
 *
 * Having a wrapper permits other non-shell files to directly require
 * logstream.php.
 */

// Shell wrapper for Acquia Logstream.
require_once __DIR__ . '/logstream.php';
<?php

use AcquiaLogstream\LogstreamCommand;
use Symfony\Component\Console\Application;
use SelfUpdate\SelfUpdateCommand;

$pharPath = \Phar::running(true);
if ($pharPath) {
$autoloaderPath = "$pharPath/vendor/autoload.php";
} else {
if (file_exists(dirname(__DIR__) . '/vendor/autoload.php')) {
$autoloaderPath = dirname(__DIR__) . '/vendor/autoload.php';
} elseif (file_exists(dirname(__DIR__) . '/../../autoload.php')) {
$autoloaderPath = dirname(__DIR__) . '/../../autoload.php';
} else {
die("Could not find autoloader. Run 'composer install'.");
}
}
$classLoader = require $autoloaderPath;

$version = trim(file_get_contents(dirname(__DIR__) . '/VERSION'));
$application = new Application('Logstream', $version);
$application->add(new LogstreamCommand());

if (class_exists('\SelfUpdate\SelfUpdateManager')) {
$selfUpdateManager = new \SelfUpdate\SelfUpdateManager('Logstream', $version, 'typhonius/acquia-logstream');
$selfUpdate = new SelfUpdateCommand($selfUpdateManager);
} else {
$selfUpdate = new SelfUpdateCommand('Logstream', $version, 'typhonius/acquia-logstream');
}
$application->add($selfUpdate);

$application->run();
exit;
MIT License

Copyright (c) 2020 Adam Malone

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.
theme: jekyll-theme-slate<?php

namespace AcquiaCloudApi\Response;

class InsightCountResponse
{
public string $name;

public int $pass;

public int $fail;

public int $ignored;

public int $total;

public int $percent;

public function __construct(string $name, object $insightCount)
{
$this->name = $name;
$this->pass = $insightCount->pass;
$this->fail = $insightCount->fail;
$this->ignored = $insightCount->ignored;
$this->total = $insightCount->total;
$this->percent = $insightCount->percent;
}
}
<?php

namespace AcquiaCloudApi\Response;

class LogstreamResponse
{
public object $logstream;

public object $links;

public function __construct(object $logstream)
{
$this->logstream = $logstream->logstream;
$this->links = $logstream->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class CodebaseResponse
{
public string $id;

public string $label;

public string $region;

public string $vcs_url;

public string $repository_id;

public string $created_at;

public string $updated_at;

public string $description;

public ?object $flags = null;

public string $hash;

public int $applications_total;

public object $links;

public ?object $embedded = null;




public function __construct(object $codebase)
{
$this->id = $codebase->id;
$this->label = $codebase->label;
$this->region = $codebase->region;
$this->vcs_url = $codebase->vcs_url;
$this->repository_id = $codebase->repository_id;
$this->created_at = $codebase->created_at;
$this->updated_at = $codebase->updated_at;
$this->description = $codebase->description;
$this->flags = $codebase->flags;
$this->hash = $codebase->hash;
$this->applications_total = $codebase->applications_total;
$this->links = $codebase->_links;
$this->embedded = $codebase->_embedded ?? null;
}
}
<?php

namespace AcquiaCloudApi\Response;

class TeamResponse
{
public string $uuid;

public string $name;

public ?string $created_at;

public ?string $updated_at;

public ?object $organization;

public object $links;

public function __construct(object $team)
{
$this->uuid = $team->uuid;
$this->name = $team->name;
if (property_exists($team, 'created_at')) {
$this->created_at = $team->created_at;
}
if (property_exists($team, 'updated_at')) {
$this->updated_at = $team->updated_at;
}
if (property_exists($team, 'organization')) {
$this->organization = $team->organization;
}
if (property_exists($team, '_links')) {
$this->links = $team->_links;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class EnvironmentsResponse extends \ArrayObject
{



public function __construct(array $environments)
{
parent::__construct(
array_map(
static function ($environment) {
return new EnvironmentResponse($environment);
},
$environments
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class IdentityProviderResponse
{
public string $uuid;

public string $label;

public string $idp_entity_id;

public string $sp_entity_id;

public string $sso_url;

public string $certificate;

public string $status;

public object $links;

public function __construct(object $idp)
{
$this->uuid = $idp->uuid;
$this->label = $idp->label;
$this->idp_entity_id = $idp->idp_entity_id;
$this->sp_entity_id = $idp->sp_entity_id;
$this->sso_url = $idp->sso_url;
$this->certificate = $idp->certificate;
$this->status = $idp->status;
$this->links = $idp->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class ServersResponse extends \ArrayObject
{



public function __construct(array $servers)
{
parent::__construct(
array_map(
static function ($server) {
return new ServerResponse($server);
},
$servers
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class IdesResponse extends \ArrayObject
{



public function __construct(array $ides)
{
parent::__construct(
array_map(
static function ($ide) {
return new IdeResponse($ide);
},
$ides
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class SslCertificatesResponse extends \ArrayObject
{



public function __construct(array $certificates)
{
parent::__construct(
array_map(
static function ($certificate) {
return new SslCertificateResponse($certificate);
},
$certificates
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

use stdClass;

class InsightResponse
{
public string $uuid;

public string $label;

public string $hostname;

public string $status;

public string $updatedAt;

public string $lastConnectedAt;

public object $scores;

public object $counts;

public object $flags;

public object $links;

public function __construct(object $insight)
{
$this->uuid = $insight->uuid;
$this->label = $insight->label;
$this->hostname = $insight->hostname;
$this->status = $insight->status;
$this->updatedAt = $insight->updated_at;
$this->lastConnectedAt = $insight->last_connected_at;
$this->scores = $insight->scores;
$this->flags = $insight->flags;
$this->links = $insight->_links;

$scores = new stdClass();
foreach ($insight->counts as $name => $counts) {
$scores->$name = new InsightCountResponse($name, $counts);
}
$this->counts = $scores;
}
}
<?php

namespace AcquiaCloudApi\Response;

class ApplicationResponse
{
public int $id;

public string $uuid;

public string $name;

public ?object $hosting;

public object $subscription;

public object $organization;

public ?string $type;

public object $flags;

public string $status;

public object $links;

public function __construct(object $application)
{
$this->id = $application->id;
$this->uuid = $application->uuid;
$this->name = $application->name;
$this->hosting = $application->hosting;
$this->subscription = $application->subscription;
$this->organization = $application->organization;
if (property_exists($application, 'type')) {
$this->type = $application->type;
}
$this->flags = $application->flags;
$this->status = $application->status;
$this->links = $application->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class TagResponse
{
public string $name;

public string $color;

public object $context;

public object $links;

public function __construct(object $tag)
{
$this->name = $tag->name;
$this->color = $tag->color;
$this->context = $tag->context;
$this->links = $tag->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class EnvironmentResponse
{
public string $uuid;

public string $label;

public string $name;

public object $application;




public array $domains;

public string $active_domain;

public string $default_domain;

public ?string $image_url;

public ?string $sshUrl;




public array $ips;

public ?string $region;

public string $status;

public string $type;

public object $vcs;

public object $flags;

public ?object $configuration;

public object $links;

public string $platform;

public string $balancer;

public ?object $artifact;

public ?object $gardener;

public function __construct(object $environment)
{
$this->uuid = $environment->id;
$this->label = $environment->label;
$this->name = $environment->name;
$this->application = $environment->application;
$this->domains = $environment->domains;
$this->active_domain = $environment->active_domain;
$this->default_domain = $environment->default_domain;
$this->image_url = $environment->image_url;
if (property_exists($environment, 'ssh_url')) {
$this->sshUrl = $environment->ssh_url;
}
$this->ips = $environment->ips;
$this->region = $environment->region;
$this->balancer = $environment->balancer;
$this->platform = $environment->platform;
$this->status = $environment->status;
$this->type = $environment->type;
$this->vcs = $environment->vcs;
$this->configuration = $environment->configuration;
$this->flags = $environment->flags;
$this->artifact = $environment->artifact;
$this->links = $environment->_links;
if (property_exists($environment, 'gardener')) {
$this->gardener = $environment->gardener;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

class LogResponse
{
public string $type;

public string $label;

public object $flags;

public object $links;

public function __construct(object $log)
{
$this->type = $log->type;
$this->label = $log->label;
$this->flags = $log->flags;
$this->links = $log->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class CodebaseEnvironmentsResponse extends ArrayObject
{



public function __construct(array $environments)
{
parent::__construct(
array_map(
static function ($environment) {
return new CodebaseEnvironmentResponse($environment);
},
$environments
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class RolesResponse extends \ArrayObject
{



public function __construct(array $roles)
{
parent::__construct(
array_map(
static function ($role) {
return new RoleResponse($role);
},
$roles
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class SiteResponse
{
public string $id;

public string $name;

public string $label;

public ?string $description;

public ?string $codebaseId;

public object $links;




public function __construct(object $site)
{
$this->id = $site->id;
$this->name = $site->name;
$this->label = $site->label;
$this->description = $site->description ?? null;
$this->codebaseId = $site->codebase_id ?? null;
$this->links = $site->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class DatabaseNameResponse
{
public string $name;
public function __construct(object $database)
{
$this->name = $database->name;
}
}
<?php

namespace AcquiaCloudApi\Response;

class CronResponse
{
public string $id;




public array|object $server;

public string $command;

public string $minute;

public string $hour;

public string $dayMonth;

public string $month;

public string $dayWeek;

public ?string $label;

public object $flags;

public object $environment;

public object $links;

public function __construct(object $cron)
{
$this->id = $cron->id;
$this->server = $cron->server;
$this->command = $cron->command;
$this->minute = $cron->minute;
$this->hour = $cron->hour;
$this->dayMonth = $cron->day_month;
$this->month = $cron->month;
$this->dayWeek = $cron->day_week;
$this->label = $cron->label;
$this->flags = $cron->flags;
$this->environment = $cron->environment;
$this->links = $cron->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class AccountResponse
{
public int $id;

public string $uuid;

public string $name;

public string $first_name;

public string $last_name;

public string $last_login_at;

public string $created_at;

public string $mail;

public object $phone;

public ?string $job_title;

public ?string $job_function;

public ?string $company;

public ?string $country;

public ?string $state;

public string $timezone;

public string $picture_url;




public array $features;

public object $flags;

public object $metadata;

public object $links;

public function __construct(object $account)
{
$this->id = $account->id;
$this->uuid = $account->uuid;
$this->name = $account->name;
$this->first_name = $account->first_name;
$this->last_name = $account->last_name;
$this->last_login_at = $account->last_login_at;
$this->created_at = $account->created_at;
$this->mail = $account->mail;
$this->phone = $account->phone;
$this->job_title = $account->job_title;
$this->job_function = $account->job_function;
$this->company = $account->company;
$this->country = $account->country;
$this->state = $account->state;
$this->timezone = $account->timezone;
$this->picture_url = $account->picture_url;
$this->features = $account->features;
$this->flags = $account->flags;
$this->metadata = $account->metadata;
$this->links = $account->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class SitesResponse extends ArrayObject
{



public function __construct(array $sites)
{
parent::__construct(
array_map(
static function ($site) {
return new SiteResponse($site);
},
$sites
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class SiteInstanceDatabaseBackupResponse
{
public string $id;
public string $database_id;
public string $created_at;
public object $links;

public function __construct(object $data)
{
$this->id = $data->id;
$this->database_id = $data->database_id;
$this->created_at = $data->created_at;
$this->links = $data->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class OperationResponse
{
public string $message;

public ?object $links;

public function __construct(object $operation)
{
$this->message = $operation->message;
if (isset($operation->_links)) {
$this->links = $operation->_links;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class PermissionsResponse extends \ArrayObject
{



public function __construct(array $permissions)
{
parent::__construct(
array_map(
static function ($permission) {
return new PermissionResponse($permission);
},
$permissions
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class DatabaseResponse
{
public string $id;
public string $name;


public ?string $user_name;
public ?string $password;
public ?string $url;
public string $db_host;
public ?string $ssh_host;
public object $flags;
public object $environment;

public function __construct(object $database)
{
$this->id = $database->id;
$this->name = $database->name;
$this->user_name = $database->user_name ?? null;
$this->password = $database->password ?? null;
$this->url = $database->url ?? null;
$this->db_host = $database->db_host;
$this->ssh_host = $database->ssh_host ?? null;
$this->flags = $database->flags;
$this->environment = $database->environment;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class InvitationsResponse extends \ArrayObject
{



public function __construct(array $invitations)
{
parent::__construct(
array_map(
static function ($invitation) {
return new InvitationResponse($invitation);
},
$invitations
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class SiteInstanceDatabaseBackupsResponse extends ArrayObject
{



public function __construct(array $backups)
{
parent::__construct(
array_map(
static function ($backup) {
return new SiteInstanceDatabaseBackupResponse($backup);
},
$backups
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class InsightModulesResponse extends \ArrayObject
{



public function __construct(array $modules)
{
parent::__construct(
array_map(
static function ($module) {
return new InsightModuleResponse($module);
},
$modules
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class BranchResponse
{
public string $name;

public object $flags;

public function __construct(object $branch)
{
$this->name = $branch->name;
$this->flags = $branch->flags;
}
}
<?php

namespace AcquiaCloudApi\Response;






class SslCertificateResponse
{
public int $id;

public ?string $label;

public string $certificate;

public ?string $private_key;

public string $ca;

public object $flags;

public string $expires_at;




public array $domains;

public object $environment;

public object $links;




public function __construct(object $certificate)
{
$this->id = $certificate->id;
$this->label = $certificate->label;
$this->certificate = $certificate->certificate;
$this->private_key = $certificate->private_key;
$this->ca = $certificate->ca;
$this->flags = $certificate->flags;
$this->expires_at = $certificate->expires_at;
$this->domains = $certificate->domains;
$this->environment = $certificate->environment;
$this->links = $certificate->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class OrganizationsResponse extends \ArrayObject
{



public function __construct(array $organizations)
{
parent::__construct(
array_map(
static function ($organization) {
return new OrganizationResponse($organization);
},
$organizations
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class NotificationResponse
{
public string $uuid;

public string $event;

public string $label;

public string $description;

public string $created_at;

public ?string $completed_at;

public string $status;

public int $progress;

public object $context;

public ?object $links;

public function __construct(object $notification)
{
$this->uuid = $notification->uuid;
$this->event = $notification->event;
$this->label = $notification->label;
$this->description = $notification->description;
$this->created_at = $notification->created_at;
$this->completed_at = $notification->completed_at;
$this->status = $notification->status;
$this->progress = $notification->progress;
$this->context = $notification->context;
if (property_exists($notification, '_links')) {
$this->links = $notification->_links;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class LogForwardingDestinationsResponse extends \ArrayObject
{



public function __construct(array $destinations)
{
parent::__construct(
array_map(
static function ($destination) {
return new LogForwardingDestinationResponse($destination);
},
$destinations
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class InsightAlertResponse
{
public int $alert_id;

public string $uuid;

public string $name;

public string $message;

public string $article_link;

public int $severity;

public string $severity_label;

public string $failed_value;

public string $fix_details;




public array $categories;

public object $flags;

public object $links;

public function __construct(object $alert)
{
$this->alert_id = $alert->alert_id;
$this->uuid = $alert->uuid;
$this->name = $alert->name;
$this->message = $alert->message;
$this->article_link = $alert->article_link;
$this->severity = $alert->severity;
$this->severity_label = $alert->severity_label;
$this->failed_value = $alert->failed_value;
$this->fix_details = $alert->fix_details;
$this->categories = $alert->categories;
$this->flags = $alert->flags;
$this->links = $alert->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class InvitationResponse
{
public string $uuid;

public string $email;

public MemberResponse $author;

public object $applications;

public object $organization;




public array $roles;

public TeamResponse $team;

public string $created_at;

public string $token;

public object $flags;

public object $links;

public function __construct(object $invitation)
{
$this->uuid = $invitation->uuid;
$this->email = $invitation->email;
$this->author = new MemberResponse($invitation->author);
$this->applications = $invitation->applications;
$this->organization = $invitation->organization;
$this->roles = $invitation->roles;
$this->team = new TeamResponse($invitation->team);
$this->created_at = $invitation->created_at;
$this->token = $invitation->token;
$this->flags = $invitation->flags;
$this->links = $invitation->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class ReferencesResponse extends ArrayObject
{



public function __construct(array $references)
{
parent::__construct(
array_map(
static function ($reference) {
return new ReferenceResponse($reference);
},
$references
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class BackupsResponse extends ArrayObject
{



public function __construct(array $backups)
{
parent::__construct(
array_map(
static function ($backup) {
return new BackupResponse($backup);
},
$backups
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class RoleResponse
{
public string $uuid;

public string $name;

public string $description;

public ?object $last_edited;




public PermissionsResponse $permissions;

public function __construct(object $role)
{
$this->uuid = $role->uuid;
$this->name = $role->name;
$this->description = $role->description;
$this->last_edited = $role->last_edited;
$this->permissions = new PermissionsResponse($role->permissions);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class SshKeysResponse extends \ArrayObject
{



public function __construct(array $sshkeys)
{
parent::__construct(
array_map(
static function ($sshkey) {
return new SshKeyResponse($sshkey);
},
$sshkeys
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class DomainsResponse extends \ArrayObject
{



public function __construct(array $domains)
{
parent::__construct(
array_map(
static function ($domain) {
return new DomainResponse($domain);
},
$domains
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class PermissionResponse
{
public string $name;

public string $label;

public ?string $description;

public string $group_label;

public function __construct(object $permission)
{
$this->name = $permission->name;
$this->label = $permission->label;
$this->description = $permission->description;
$this->group_label = $permission->group_label;
}
}
<?php

namespace AcquiaCloudApi\Response;

class SiteInstanceDatabaseResponse
{
public string $databaseHost;

public string $databaseName;

public string $databaseRole;

public string $databaseUserName;

public string $databasePassword;

public object $links;

public function __construct(object $database)
{
$this->databaseHost = $database->database_host;
$this->databaseName = $database->database_name;
$this->databaseRole = $database->database_role;
$this->databaseUserName = $database->database_user_name;
$this->databasePassword = $database->database_password;
$this->links = $database->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class CronsResponse extends \ArrayObject
{



public function __construct(array $crons)
{
parent::__construct(
array_map(
static function ($cron) {
return new CronResponse($cron);
},
$crons
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class IdentityProvidersResponse extends \ArrayObject
{



public function __construct(array $idps)
{
parent::__construct(
array_map(
static function ($idp) {
return new IdentityProviderResponse($idp);
},
$idps
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;






class SshKeyResponse
{
public string $uuid;

public string $label;

public string $public_key;

public string $fingerprint;

public string $created_at;

public object $links;





public function __construct(object $sshkey)
{
$this->uuid = $sshkey->uuid;
$this->label = $sshkey->label;
$this->public_key = $sshkey->public_key;
$this->fingerprint = $sshkey->fingerprint;
$this->created_at = $sshkey->created_at;
$this->links = $sshkey->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class InsightsResponse extends \ArrayObject
{



public function __construct(array $insights)
{
parent::__construct(
array_map(
static function ($insight) {
return new InsightResponse($insight);
},
$insights
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class MetricsResponse extends \ArrayObject
{



public function __construct(array $metrics)
{
parent::__construct(
array_map(
static function ($metric) {
return new MetricResponse($metric);
},
$metrics
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class IdeResponse
{
public string $uuid;

public string $label;

public object $links;

public MemberResponse $owner;

public function __construct(object $ide)
{
$this->uuid = $ide->uuid;
$this->label = $ide->label;
$this->links = $ide->_links;
if (isset($ide->_embedded->owner)) {
$this->owner = new MemberResponse($ide->_embedded->owner);
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class NotificationsResponse extends \ArrayObject
{



public function __construct(array $notifications)
{
parent::__construct(
array_map(
static function ($notification) {
return new NotificationResponse($notification);
},
$notifications
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class SubscriptionResponse
{
public int $id;

public string $uuid;

public string $name;

public ?string $start_at;

public string $expire_at;

public object $product;

public int $applications_total;

public int $applications_used;

public object $organization;

public object $flags;

public object $links;

public function __construct(object $subscription)
{
$this->id = $subscription->id;
$this->uuid = $subscription->uuid;
$this->name = $subscription->name;
$this->start_at = $subscription->start_at;
$this->expire_at = $subscription->expire_at;
$this->product = $subscription->product;
$this->applications_total = $subscription->applications_total;
$this->applications_used = $subscription->applications_used;
$this->organization = $subscription->organization;
$this->flags = $subscription->flags;
$this->links = $subscription->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class ServerResponse
{
public string $id;

public string $name;

public string $hostname;

public string $ip;

public string $status;

public string $region;




public array $roles;

public string $amiType;

public object $configuration;

public object $flags;

public function __construct(object $server)
{
$this->id = $server->id;
$this->name = $server->name;
$this->hostname = $server->hostname;
$this->ip = $server->ip;
$this->status = $server->status;
$this->region = $server->region;
$this->roles = $server->roles;
$this->amiType = $server->ami_type;
$this->configuration = $server->configuration;
$this->flags = $server->flags;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class VariablesResponse extends \ArrayObject
{



public function __construct(array $variables)
{
parent::__construct(
array_map(
static function ($variable) {
return new VariableResponse($variable);
},
$variables
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class CodebaseEnvironmentResponse
{
public object $links;

public string $id;

public string $name;

public string $label;

public string $description;

public string $status;

public string $reference;

public string $code_switch_status;

public string $ssh_url;

public object $flags;




public array $properties;

public object $codebase;

public ?string $codebase_uuid = null;

public function __construct(object $environment)
{
$this->links = $environment->_links;
$this->id = $environment->id;
$this->name = $environment->name;
$this->label = $environment->label;
$this->description = $environment->description;
$this->status = $environment->status;
$this->reference = $environment->reference;
$this->code_switch_status = $environment->code_switch_status ?? 'IDLE';
$this->ssh_url = $environment->ssh_url ?? '';
$this->flags = $environment->flags;
$this->properties = (array) ($environment->properties ?? []);


$this->codebase = new \stdClass();


if (isset($environment->_embedded->codebase)) {
$hasId = isset($environment->_embedded->codebase->id);
$this->codebase_uuid = $hasId ? $environment->_embedded->codebase->id : null;
} elseif (isset($environment->codebase)) {
$hasId = isset($environment->codebase->id);
$this->codebase_uuid = $hasId ? $environment->codebase->id : null;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class MembersResponse extends \ArrayObject
{



public function __construct(array $members)
{
parent::__construct(
array_map(
static function ($member) {
return new MemberResponse($member);
},
$members
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;






class SiteInstanceResponse
{



public string $site_id;




public string $environment_id;











public string $status;






public ?object $health_status;






public ?array $domains;




public ?SiteResponse $site = null;




public ?CodebaseEnvironmentResponse $environment = null;





public object $links;




public function __construct(object $siteInstance)
{
$this->site_id = $siteInstance->site_id;
$this->environment_id = $siteInstance->environment_id;
$this->status = $siteInstance->status;


$health_status = $siteInstance->health_status ?? [];
$this->health_status = is_object($health_status) ? $health_status : (object) $health_status;

$this->domains = $siteInstance->domains ?? [];

$links = $siteInstance->_links ?? [];
$this->links = is_object($links) ? $links : (object) $links;


if (property_exists($siteInstance, 'site')) {
$this->site = new SiteResponse($siteInstance->site);
}

if (property_exists($siteInstance, 'environment')) {
$this->environment = new CodebaseEnvironmentResponse($siteInstance->environment);
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class SubscriptionsResponse extends \ArrayObject
{



public function __construct(array $subscriptions)
{
parent::__construct(
array_map(
static function ($subscription) {
return new SubscriptionResponse($subscription);
},
$subscriptions
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class VariableResponse
{
public string $name;

public string $value;

public object $links;

public function __construct(object $variable)
{
$this->name = $variable->name;
$this->value = $variable->value;
$this->links = $variable->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class DomainResponse
{
public string $hostname;

public object $flags;




public ?array $ip_addresses;




public ?array $cnames;

public object $environment;

public object $links;

public function __construct(object $domain)
{
$this->hostname = $domain->hostname;
$this->flags = $domain->flags;
$this->environment = $domain->environment;
if (property_exists($domain, 'ip_addresses')) {
$this->ip_addresses = $domain->ip_addresses;
}
if (property_exists($domain, 'cnames')) {
$this->cnames = $domain->cnames;
}
$this->links = $domain->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class DatabasesResponse extends \ArrayObject
{



public function __construct(array $databases)
{
parent::__construct(
array_map(
static function ($database) {
return new DatabaseResponse($database);
},
$databases
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class InsightModuleResponse
{
public int $module_id;

public string $name;

public string $filename;

public string $version;

public ?string $supported_majors;

public ?string $recommended_major;

public string $package;

public string $core;

public string $project;

public ?string $release_date;

public object $flags;




public array $tags;

public function __construct(object $module)
{
$this->module_id = $module->module_id;
$this->name = $module->name;
$this->filename = $module->filename;
$this->version = $module->version;
$this->supported_majors = $module->supported_majors;
$this->recommended_major = $module->recommended_major;
$this->package = $module->package;
$this->core = $module->core;
$this->project = $module->project;
$this->release_date = $module->release_date;
$this->flags = $module->flags;
$this->tags = $module->tags;
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class TagsResponse extends \ArrayObject
{



public function __construct(array $tags)
{
parent::__construct(
array_map(
static function ($tag) {
return new TagResponse($tag);
},
$tags
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class TeamsResponse extends \ArrayObject
{



public function __construct(array $teams)
{
parent::__construct(
array_map(
static function ($team) {
return new TeamResponse($team);
},
$teams
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class OrganizationResponse
{
public string $id;

public string $uuid;

public string $name;

public MemberResponse $owner;

public ?string $subscriptions_total;

public string $admins_total;

public string $users_total;

public string $teams_total;

public string $roles_total;

public object $links;

public function __construct(object $organization)
{
$this->id = $organization->id;
$this->uuid = $organization->uuid;
$this->name = $organization->name;
$this->owner = new MemberResponse($organization->owner);
$this->subscriptions_total = $organization->subscriptions_total;
$this->admins_total = $organization->admins_total;
$this->users_total = $organization->users_total;
$this->teams_total = $organization->teams_total;
$this->roles_total = $organization->roles_total;
$this->links = $organization->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class BackupResponse
{
public int $id;

public object $database;

public string $type;

public string $startedAt;

public string $completedAt;

public object $flags;

public object $environment;

public object $links;

public function __construct(object $backup)
{
$this->id = $backup->id;
$this->database = $backup->database;
$this->type = $backup->type;
$this->startedAt = $backup->started_at;
$this->completedAt = $backup->completed_at;
$this->flags = $backup->flags;
$this->environment = $backup->environment;
$this->links = $backup->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class ApplicationsResponse extends ArrayObject
{



public function __construct(array $applications)
{
parent::__construct(
array_map(
static function ($application) {
return new ApplicationResponse($application);
},
$applications
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class DatabaseNamesResponse extends \ArrayObject
{



public function __construct(array $databases)
{
parent::__construct(
array_map(
static function ($database) {
return new DatabaseNameResponse($database);
},
$databases
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class BulkCodeSwitchResponse extends ArrayObject
{



public function __construct(array|object $bulkCodeSwitch)
{
if (is_array($bulkCodeSwitch)) {

parent::__construct(
array_map(
static function ($item) {
return (object) $item;
},
$bulkCodeSwitch
),
self::ARRAY_AS_PROPS
);
} else {

parent::__construct(
[$bulkCodeSwitch],
self::ARRAY_AS_PROPS
);
}
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class InsightAlertsResponse extends \ArrayObject
{



public function __construct(array $alerts)
{
parent::__construct(
array_map(
static function ($alert) {
return new InsightAlertResponse($alert);
},
$alerts
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class ReferenceResponse
{
public string $id;

public string $name;

public string $type;

public ?string $commit_id = null;

public ?string $commit_message = null;

public ?string $commit_author = null;

public ?string $commit_date = null;

public object $links;




public function __construct(object $reference)
{
$this->id = $reference->id;
$this->name = $reference->name;
$this->type = $reference->type;
$this->commit_id = $reference->commit_id ?? null;
$this->commit_message = $reference->commit_message ?? null;
$this->commit_author = $reference->commit_author ?? null;
$this->commit_date = $reference->commit_date ?? null;
$this->links = $reference->_links;
}
}
<?php

namespace AcquiaCloudApi\Response;

class LogForwardingDestinationResponse
{
public string $uuid;

public string $label;

public string $address;

public string $consumer;

public object $credentials;




public array $sources;

public string $status;

public object $flags;

public object $health;

public object $environment;

public function __construct(object $destination)
{
$this->uuid = $destination->uuid;
$this->label = $destination->label;
$this->address = $destination->address;
$this->consumer = $destination->consumer;
$this->credentials = $destination->credentials;
$this->sources = $destination->sources;
$this->status = $destination->status;
$this->flags = $destination->flags;
$this->health = $destination->health;
$this->environment = $destination->environment;
}
}
<?php

namespace AcquiaCloudApi\Response;

class MetricResponse
{
public string $metric;




public array $datapoints;

public ?string $last_data_at;

public object $metadata;

public ?object $links;

public function __construct(object $metric)
{
$this->metric = $metric->metric;
$this->datapoints = $metric->datapoints;
if (property_exists($metric, 'last_data_at')) {
$this->last_data_at = $metric->last_data_at;
}
$this->metadata = $metric->metadata;
if (property_exists($metric, '_links')) {
$this->links = $metric->_links;
}
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class CodebasesResponse extends \ArrayObject
{



public function __construct(array $codebases)
{
$codebaseResponses = [];
foreach ($codebases as $codebase) {
$codebaseResponses[] = new CodebaseResponse($codebase);
}

parent::__construct($codebaseResponses, self::ARRAY_AS_PROPS);
}
}
<?php

namespace AcquiaCloudApi\Response;

/**
@template-extends
*/
class LogsResponse extends \ArrayObject
{



public function __construct(array $logs)
{
parent::__construct(
array_map(
static function ($log) {
return new LogResponse($log);
},
$logs
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

use ArrayObject;

/**
@template-extends
*/
class BranchesResponse extends ArrayObject
{



public function __construct(array $branches)
{
parent::__construct(
array_map(
static function ($branch) {
return new BranchResponse($branch);
},
$branches
),
self::ARRAY_AS_PROPS
);
}
}
<?php

namespace AcquiaCloudApi\Response;

class MemberResponse
{
public string $uuid;




public ?TeamsResponse $teams;

public string $first_name;

public string $last_name;

public ?string $mail;

public string $picture_url;

public string $username;

public ?object $flags;

public ?object $links;

public function __construct(object $member)
{
$this->uuid = $member->uuid;
$this->first_name = $member->first_name;
$this->last_name = $member->last_name;

if (property_exists($member, 'mail')) {
$this->mail = $member->mail;
} elseif (property_exists($member, 'email')) {
$this->mail = $member->email;
}
$this->picture_url = $member->picture_url;
$this->username = $member->username;

if (property_exists($member, 'teams')) {
$this->teams = new TeamsResponse($member->teams);
}
if (property_exists($member, 'flags')) {
$this->links = $member->flags;
}
if (property_exists($member, '_links')) {
$this->links = $member->_links;
}
}
}
<?php

namespace AcquiaCloudApi\Exception;

use Exception;




class ApiErrorException extends Exception
{
private object $responseBody;

private string $errorType;




public function __construct(object $response_body, string $message = "", int $code = 0, ?Exception $previous = null)
{
parent::__construct($message, $code, $previous);

$this->setResponseBody($response_body);
$this->setError($response_body);
}




public function __toString(): string
{
return __CLASS__ . ": [{$this->errorType}]: {$this->message}\n";
}




private function setError(object $response_body): void
{
if (is_array($response_body->message) || is_object($response_body->message)) {
$output = '';
foreach ($response_body->message as $message) {
$output .= $message . PHP_EOL;
}
$this->message = $output;
} else {
$this->errorType = $response_body->error;
$this->message = $response_body->message;
}
}

public function getResponseBody(): object
{
return $this->responseBody;
}

private function setResponseBody(object $response_body): void
{
$this->responseBody = $response_body;
}
}
<?php

namespace AcquiaCloudApi\Connector;

use League\OAuth2\Client\Provider\GenericProvider;
use League\OAuth2\Client\Token\AccessTokenInterface;
use GuzzleHttp\Client as GuzzleClient;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\RequestInterface;






interface ConnectorInterface
{



public const BASE_URI = 'https://cloud.acquia.com/api';




public const URL_ACCESS_TOKEN = 'https://accounts.acquia.com/api/auth/oauth/token';




public function createRequest(string $verb, string $path): RequestInterface;






public function sendRequest(string $verb, string $path, array $options): ResponseInterface;

public function getBaseUri(): string;

public function getUrlAccessToken(): string;
}
<?php

namespace AcquiaCloudApi\Connector;

use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\BadResponseException;
use AcquiaCloudApi\Exception\ApiErrorException;
use Psr\Http\Message\StreamInterface;
use RuntimeException;






class Client implements ClientInterface
{



protected ConnectorInterface $connector;




protected array $query = [];




protected array $options = [];




private array $requestOptions = [];




final public function __construct(ConnectorInterface $connector)
{
$this->connector = $connector;
}






public static function factory(ConnectorInterface $connector): static
{
return new static(
$connector
);
}




public function getVersion(): string
{
return self::VERSION;
}




public function modifyOptions(): array
{

$options = $this->options + $this->requestOptions;







$userAgent = sprintf(
"%s/%s (https://github.com/typhonius/acquia-php-sdk-v2)",
'acquia-php-sdk-v2',
$this->getVersion()
);
if (isset($options['headers']['User-Agent']) && is_array($options['headers']['User-Agent'])) {
array_unshift($options['headers']['User-Agent'], $userAgent);
$options['headers']['User-Agent'] = implode(' ', array_unique($options['headers']['User-Agent']));
} else {
$options['headers']['User-Agent'] = $userAgent;
}

$options['query'] = $this->query;
if (!empty($options['query']['filter']) && is_array($options['query']['filter'])) {

$options['query']['filter'] = implode(',', $options['query']['filter']);
}

return $options;
}





public function request(string $verb, string $path, array $options = []): mixed
{


$this->requestOptions = $options;



$modifiedOptions = $this->modifyOptions();

$response = $this->makeRequest($verb, $path, $modifiedOptions);

return $this->processResponse($response);
}




public function stream(string $verb, string $path, array $options = []): StreamInterface
{


$this->requestOptions = $options;



$modifiedOptions = $this->modifyOptions();

return $this->makeRequest($verb, $path, $modifiedOptions)->getBody();
}




public function makeRequest(string $verb, string $path, array $options = []): ResponseInterface
{
try {
$response = $this->connector->sendRequest($verb, $path, $options);
} catch (BadResponseException $e) {
$response = $e->getResponse();
}

return $response;
}






public function processResponse(ResponseInterface $response): mixed
{

if ($response->getStatusCode() === 500) {
throw new RuntimeException(
'Cloud API internal server error. Status '
. $response->getStatusCode()
. '. Request ID '
. $response->getHeaderLine('X-Request-Id')
);
}
$body_json = $response->getBody();
$body = json_decode($body_json, null, 512, JSON_THROW_ON_ERROR);

if (is_null($body)) {
throw new RuntimeException(
'Response contained an empty body. Status '
. $response->getStatusCode()
. '. Request ID '
. $response->getHeaderLine('X-Request-Id')
);
}

if (property_exists($body, '_embedded') && property_exists($body->_embedded, 'items')) {
return $body->_embedded->items;
}

if (property_exists($body, 'error') && property_exists($body, 'message')) {
throw new ApiErrorException($body);
}

return $body;
}




public function getQuery(): array
{
return $this->query;
}




public function clearQuery(): void
{
$this->query = [];
}




public function addQuery(string $name, int|string $value): void
{
$this->query = array_merge_recursive($this->query, [$name => $value]);
}




public function getOptions(): array
{
return $this->options;
}




public function clearOptions(): void
{
$this->options = [];
}




public function addOption(string $name, mixed $value): void
{
$this->options = array_merge_recursive($this->options, [$name => $value]);
}
}
<?php

namespace AcquiaCloudApi\Connector;

use AcquiaCloudApi\Connector\OktaProvider;
use League\OAuth2\Client\Provider\AbstractProvider;
use League\OAuth2\Client\Provider\GenericProvider;
use League\OAuth2\Client\Token\AccessTokenInterface;
use GuzzleHttp\Client as GuzzleClient;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Filesystem\Path;






class Connector implements ConnectorInterface
{



private string $baseUri;




private string $urlAccessToken;




private ?string $clientId;




protected AbstractProvider $provider;




protected GuzzleClient $client;




protected ?AccessTokenInterface $accessToken;




public function __construct(array $config, ?string $base_uri = null, ?string $url_access_token = null)
{
$this->baseUri = ConnectorInterface::BASE_URI;
if ($base_uri) {
$this->baseUri = $base_uri;
}

$this->urlAccessToken = ConnectorInterface::URL_ACCESS_TOKEN;
if ($url_access_token) {
$this->urlAccessToken = $url_access_token;
}

$this->clientId = $config['key'];

$this->provider = new OktaProvider(
[
'clientId' => $config['key'],
'clientSecret' => $config['secret'],
'urlAuthorize' => '',
'urlAccessToken' => $this->getUrlAccessToken(),
'urlResourceOwnerDetails' => '',
]
);

$this->client = new GuzzleClient();
}

public function getBaseUri(): string
{
return $this->baseUri;
}

public function getUrlAccessToken(): string
{
return $this->urlAccessToken;
}





public function createRequest(string $verb, string $path): RequestInterface
{
if (!isset($this->accessToken) || $this->accessToken->hasExpired()) {
$xdgCacheHome = getenv('XDG_CACHE_HOME');
if (!$xdgCacheHome) {
$xdgCacheHome = Path::join(Path::getHomeDirectory(), '.cache');
}
$directory = Path::join($xdgCacheHome, 'acquia-php-sdk-v2');
/**
@infection-ignore-all */
$cache = new FilesystemAdapter('cache', 300, $directory);
$orgUuid = getenv('AH_ORGANIZATION_UUID');
$cacheKey = 'cloudapi-token-' . $this->clientId . $orgUuid;
$accessToken = $cache->get($cacheKey, function () use ($orgUuid) {
$options = [];
if ($orgUuid) {
$options['scope'] = 'organization:' . $orgUuid;
}
return $this->provider->getAccessToken('client_credentials', $options);
});

$this->accessToken = $accessToken;
}

return $this->provider->getAuthenticatedRequest(
$verb,
$this->getBaseUri() . $path,
$this->accessToken
);
}






public function sendRequest(string $verb, string $path, array $options): ResponseInterface
{
$request = $this->createRequest($verb, $path);
return $this->client->send($request, $options);
}
}
<?php

namespace AcquiaCloudApi\Connector;

use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use League\OAuth2\Client\Provider\GenericProvider;
use Psr\Http\Message\ResponseInterface;

class OktaProvider extends GenericProvider
{






protected function checkResponse(ResponseInterface $response, mixed $data): void
{
if (!empty($data['errorCode'])) {
$error = $data['errorCode'];
if (!is_string($error)) {
$error = var_export($error, true);
}
throw new IdentityProviderException($error, 0, $data);
}
parent::checkResponse($response, $data);
}
}
<?php

namespace AcquiaCloudApi\Connector;

use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\BadResponseException;
use AcquiaCloudApi\Exception\ApiErrorException;
use Psr\Http\Message\StreamInterface;






interface ClientInterface
{



public const VERSION = '2.0.16-dev';






public function getVersion(): string;






public function modifyOptions(): array;






public function request(string $verb, string $path, array $options = []): mixed;






public function stream(string $verb, string $path, array $options = []): StreamInterface;




public function makeRequest(string $verb, string $path, array $options = []): ResponseInterface;






public function processResponse(ResponseInterface $response): mixed;






public function getQuery(): array;




public function clearQuery(): void;




public function addQuery(string $name, int|string $value): void;






public function getOptions(): array;




public function clearOptions(): void;




public function addOption(string $name, mixed $value): void;
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\SshKeyResponse;
use AcquiaCloudApi\Response\SshKeysResponse;






class SshKeys extends CloudApiBase
{





public function getAll(): SshKeysResponse
{
return new SshKeysResponse(
$this->client->request(
'get',
"/account/ssh-keys"
)
);
}




public function get(string $keyId): SshKeyResponse
{
return new SshKeyResponse(
$this->client->request(
'get',
"/account/ssh-keys/$keyId"
)
);
}




public function create(string $label, string $public_key): OperationResponse
{

$options = [
'json' => [
'label' => $label,
'public_key' => $public_key,
],
];

return new OperationResponse(
$this->client->request('post', "/account/ssh-keys", $options)
);
}




public function delete(string $keyId): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/account/ssh-keys/$keyId")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\EnvironmentsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Environments extends CloudApiBase
{



public function copyFiles(string $environmentUuidFrom, string $environmentUuidTo): OperationResponse
{
$options = [
'json' => [
'source' => $environmentUuidFrom,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuidTo/files", $options)
);
}




public function get(string $environmentUuid): EnvironmentResponse
{
return new EnvironmentResponse(
$this->client->request(
'get',
"/environments/$environmentUuid"
)
);
}






public function getAll(string $applicationUuid): EnvironmentsResponse
{
return new EnvironmentsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/environments"
)
);
}






public function update(string $environmentUuid, array $config): OperationResponse
{

$options = [
'json' => $config,
];

return new OperationResponse(
$this->client->request(
'put',
"/environments/$environmentUuid",
$options
)
);
}




public function rename(string $environmentUuid, string $label): OperationResponse
{

$options = [
'json' => [
'label' => $label,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/actions/change-label",
$options
)
);
}




public function enableLiveDev(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/livedev/actions/enable")
);
}




public function disableLiveDev(string $environmentUuid): OperationResponse
{

$options = [
'json' => [
'discard' => 1,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/livedev/actions/disable",
$options
)
);
}




public function enableProductionMode(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/production-mode/actions/enable"
)
);
}




public function disableProductionMode(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/production-mode/actions/disable"
)
);
}




public function enableEmail(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/email/actions/enable"
)
);
}




public function disableEmail(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/email/actions/disable"
)
);
}






public function create(string $applicationUuid, string $label, string $branch, array $databases): OperationResponse
{
$options = [
'json' => [
'label' => $label,
'branch' => $branch,
'databases' => $databases,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/applications/$applicationUuid/environments",
$options
)
);
}




public function delete(string $environmentUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'delete',
"/environments/$environmentUuid"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\SslCertificateResponse;
use AcquiaCloudApi\Response\SslCertificatesResponse;






class SslCertificates extends CloudApiBase
{






public function getAll(string $environmentUuid): SslCertificatesResponse
{
return new SslCertificatesResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/ssl/certificates"
)
);
}






public function get(string $environmentUuid, int $certificateId): SslCertificateResponse
{
return new SslCertificateResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/ssl/certificates/$certificateId"
)
);
}




public function create(
string $envUuid,
string $label,
string $cert,
string $key,
?string $ca = null,
?int $csr = null,
bool $legacy = false
): OperationResponse {

$options = [
'json' => [
'label' => $label,
'certificate' => $cert,
'private_key' => $key,
'ca_certificates' => $ca,
'csr_id' => $csr,
'legacy' => $legacy,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$envUuid/ssl/certificates", $options)
);
}




public function delete(string $environmentUuid, int $certificateId): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/environments/$environmentUuid/ssl/certificates/$certificateId")
);
}




public function disable(string $environmentUuid, int $certificateId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/ssl/certificates/$certificateId/actions/deactivate"
)
);
}




public function enable(string $environmentUuid, int $certificateId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/ssl/certificates/$certificateId/actions/activate"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\RoleResponse;
use AcquiaCloudApi\Response\RolesResponse;






class Roles extends CloudApiBase
{





public function getAll(string $organizationUuid): RolesResponse
{
return new RolesResponse(
$this->client->request('get', "/organizations/$organizationUuid/roles")
);
}




public function get(string $roleUuid): RoleResponse
{
return new RoleResponse(
$this->client->request('get', "/roles/$roleUuid")
);
}






public function create(
string $organizationUuid,
string $name,
array $permissions,
?string $description = null
): OperationResponse {
$options = [
'json' => [
'name' => $name,
'permissions' => $permissions,
'description' => $description,
],
];

return new OperationResponse(
$this->client->request('post', "/organizations/$organizationUuid/roles", $options)
);
}






public function update(string $roleUuid, array $permissions): OperationResponse
{
$options = [
'json' => [
'permissions' => $permissions,
],
];

return new OperationResponse(
$this->client->request('put', "/roles/$roleUuid", $options)
);
}




public function delete(string $roleUuid): OperationResponse
{
return new OperationResponse($this->client->request('delete', "/roles/$roleUuid"));
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\NotificationResponse;
use AcquiaCloudApi\Response\NotificationsResponse;






class Notifications extends CloudApiBase
{



public function get(string $notificationUuid): NotificationResponse
{
return new NotificationResponse(
$this->client->request(
'get',
"/notifications/$notificationUuid"
)
);
}






public function getAll(string $applicationUuid): NotificationsResponse
{
return new NotificationsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/notifications"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\AccountResponse;
use Psr\Http\Message\StreamInterface;






class Account extends CloudApiBase
{



public function get(): AccountResponse
{
return new AccountResponse($this->client->request('get', '/account'));
}




public function getDrushAliases(): StreamInterface
{
return $this->client->stream('get', '/account/drush-aliases/download');
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\IdentityProviderResponse;
use AcquiaCloudApi\Response\IdentityProvidersResponse;
use AcquiaCloudApi\Response\OperationResponse;






class IdentityProviders extends CloudApiBase
{





public function getAll(): IdentityProvidersResponse
{
return new IdentityProvidersResponse(
$this->client->request(
'get',
"/identity-providers"
)
);
}






public function get(string $idpUuid): IdentityProviderResponse
{
return new IdentityProviderResponse(
$this->client->request(
'get',
"/identity-providers/$idpUuid"
)
);
}




public function delete(string $idpUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'delete',
"/identity-providers/$idpUuid"
)
);
}




public function disable(string $idpUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/identity-providers/$idpUuid/actions/disable"
)
);
}




public function enable(string $idpUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/identity-providers/$idpUuid/actions/enable"
)
);
}




public function update(
string $idpUuid,
string $label,
string $entityId,
string $ssoUrl,
string $certificate
): OperationResponse {

$options = [
'json' => [
'label' => $label,
'entity_id' => $entityId,
'sso_url' => $ssoUrl,
'certificate' => $certificate,
],
];

return new OperationResponse(
$this->client->request(
'put',
"/identity-providers/$idpUuid",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\LogResponse;
use AcquiaCloudApi\Response\LogsResponse;
use AcquiaCloudApi\Response\LogstreamResponse;
use AcquiaCloudApi\Response\OperationResponse;
use Psr\Http\Message\StreamInterface;






class Logs extends CloudApiBase
{





public function getAll(string $environmentUuid): LogsResponse
{
return new LogsResponse(
$this->client->request('get', "/environments/$environmentUuid/logs")
);
}




public function download(string $environmentUuid, string $logType): StreamInterface
{
return $this->client->stream('get', "/environments/$environmentUuid/logs/$logType");
}




public function stream(string $environmentUuid): LogstreamResponse
{
return new LogstreamResponse(
$this->client->request('get', "/environments/$environmentUuid/logstream")
);
}




public function snapshot(string $environmentUuid, string $logType): OperationResponse
{
return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/logs/$logType")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\PermissionResponse;
use AcquiaCloudApi\Response\PermissionsResponse;






class Permissions extends CloudApiBase
{





public function get(): PermissionsResponse
{
return new PermissionsResponse($this->client->request('get', '/permissions'));
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\VariableResponse;
use AcquiaCloudApi\Response\VariablesResponse;






class Variables extends CloudApiBase
{





public function getAll(string $environmentUuid): VariablesResponse
{
return new VariablesResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/variables"
)
);
}




public function get(string $environmentUuid, string $name): VariableResponse
{
return new VariableResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/variables/$name"
)
);
}




public function create(string $environmentUuid, string $name, string $value): OperationResponse
{
$options = [
'json' => [
'name' => $name,
'value' => $value,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/variables", $options)
);
}




public function update(string $environmentUuid, string $name, string $value): OperationResponse
{
$options = [
'json' => [
'name' => $name,
'value' => $value,
],
];

return new OperationResponse(
$this->client->request('put', "/environments/$environmentUuid/variables/$name", $options)
);
}




public function delete(string $environmentUuid, string $name): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/environments/$environmentUuid/variables/$name")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\ApplicationResponse;
use AcquiaCloudApi\Response\ApplicationsResponse;
use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\TagResponse;
use AcquiaCloudApi\Response\TagsResponse;






class Applications extends CloudApiBase
{





public function getAll(): ApplicationsResponse
{
return new ApplicationsResponse($this->client->request('get', '/applications'));
}




public function get(string $applicationUuid): ApplicationResponse
{
return new ApplicationResponse(
$this->client->request(
'get',
"/applications/$applicationUuid"
)
);
}




public function rename(string $applicationUuid, string $name): OperationResponse
{

$options = [
'json' => [
'name' => $name,
],
];

return new OperationResponse(
$this->client->request(
'put',
"/applications/$applicationUuid",
$options
)
);
}






public function getAllTags(string $applicationUuid): TagsResponse
{

return new TagsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/tags"
)
);
}




public function createTag(string $applicationUuid, string $name, string $color): OperationResponse
{

$options = [
'json' => [
'name' => $name,
'color' => $color,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/applications/$applicationUuid/tags",
$options
)
);
}




public function deleteTag(string $applicationUuid, string $tagName): OperationResponse
{

return new OperationResponse(
$this->client->request(
'delete',
"/applications/$applicationUuid/tags/$tagName"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\DomainResponse;
use AcquiaCloudApi\Response\DomainsResponse;
use AcquiaCloudApi\Response\MetricResponse;
use AcquiaCloudApi\Response\MetricsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Domains extends CloudApiBase
{





public function getAll(string $environmentUuid): DomainsResponse
{
return new DomainsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/domains"
)
);
}




public function get(string $environmentUuid, string $domain): DomainResponse
{
return new DomainResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/domains/$domain"
)
);
}




public function create(string $environmentUuid, string $hostname): OperationResponse
{

$options = [
'json' => [
'hostname' => $hostname,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/domains", $options)
);
}




public function delete(string $environmentUuid, string $domain): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/environments/$environmentUuid/domains/$domain")
);
}






public function purge(string $environmentUuid, array $domains): OperationResponse
{
$options = [
'json' => [
'domains' => $domains,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/actions/clear-caches",
$options
)
);
}




public function clearDomainCache(string $environmentUuid, string $domain): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/domains/$domain/actions/clear-caches"
)
);
}







public function metrics(string $environmentUuid, string $domain): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/domains/$domain/metrics/uptime"
)
);
}




public function status(string $environmentUuid, string $domain): DomainResponse
{
return new DomainResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/domains/$domain/status"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\SiteResponse;
use AcquiaCloudApi\Response\SitesResponse;
use AcquiaCloudApi\Response\CodebaseEnvironmentsResponse;






class Sites extends CloudApiBase
{





public function getAll(): SitesResponse
{
return new SitesResponse($this->client->request('get', '/sites'));
}




public function get(string $siteId): SiteResponse
{
return new SiteResponse(
$this->client->request(
'get',
"/sites/$siteId"
)
);
}




public function create(
string $name,
string $label,
string $codebaseId,
?string $description = null
): OperationResponse {
$options = [
'json' => [
'name' => $name,
'label' => $label,
'codebase_id' => $codebaseId,
],
];

if ($description !== null) {
$options['json']['description'] = $description;
}

return new OperationResponse(
$this->client->request('post', '/sites', $options)
);
}




public function update(
string $siteId,
?string $name = null,
?string $label = null,
?string $description = null
): OperationResponse {
$options = ['json' => []];

if ($name !== null) {
$options['json']['name'] = $name;
}

if ($label !== null) {
$options['json']['label'] = $label;
}

if ($description !== null) {
$options['json']['description'] = $description;
}

return new OperationResponse(
$this->client->request('put', "/sites/$siteId", $options)
);
}




public function delete(string $siteId): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/sites/$siteId")
);
}






public function getByEnvironment(string $environmentId): SitesResponse
{
return new SitesResponse(
$this->client->request('get', "/environments/$environmentId/sites")
);
}






public function getByOrganization(string $organizationUuid): SitesResponse
{
return new SitesResponse(
$this->client->request('get', "/organizations/$organizationUuid/sites")
);
}






public function getByTeam(string $teamId): SitesResponse
{
return new SitesResponse(
$this->client->request('get', "/teams/$teamId/sites")
);
}




public function getEnvironments(string $siteId): CodebaseEnvironmentsResponse
{
return new CodebaseEnvironmentsResponse(
$this->client->request('get', "/sites/$siteId/environments")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\SubscriptionResponse;
use AcquiaCloudApi\Response\SubscriptionsResponse;

class Subscriptions extends CloudApiBase
{





public function getAll(): SubscriptionsResponse
{
return new SubscriptionsResponse($this->client->request('get', '/subscriptions'));
}




public function get(string $subscriptionUuid): SubscriptionResponse
{
return new SubscriptionResponse(
$this->client->request(
'get',
"/subscriptions/$subscriptionUuid"
)
);
}




public function rename(string $subscriptionUuid, string $name): OperationResponse
{

$options = [
'json' => [
'name' => $name,
],
];

return new OperationResponse(
$this->client->request(
'put',
"/subscriptions/$subscriptionUuid",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\LogForwardingDestinationResponse;
use AcquiaCloudApi\Response\LogForwardingDestinationsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class LogForwardingDestinations extends CloudApiBase
{






public function getAll(string $environmentUuid): LogForwardingDestinationsResponse
{
return new LogForwardingDestinationsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/log-forwarding-destinations"
)
);
}






public function get(string $environmentUuid, int $destinationId): LogForwardingDestinationResponse
{
return new LogForwardingDestinationResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/log-forwarding-destinations/$destinationId"
)
);
}







public function create(
string $environmentUuid,
string $label,
array $sources,
string $consumer,
array $credentials,
string $address
): OperationResponse {

$options = [
'json' => [
'label' => $label,
'sources' => $sources,
'consumer' => $consumer,
'credentials' => $credentials,
'address' => $address,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/log-forwarding-destinations", $options)
);
}




public function delete(string $environmentUuid, int $destId): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/environments/$environmentUuid/log-forwarding-destinations/$destId")
);
}




public function disable(string $environmentUuid, int $destId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/log-forwarding-destinations/$destId/actions/disable"
)
);
}




public function enable(string $environmentUuid, int $destId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/log-forwarding-destinations/$destId/actions/enable"
)
);
}







public function update(
string $environmentUuid,
int $destId,
string $label,
array $sources,
string $consumer,
array $creds,
string $address
): OperationResponse {
$options = [
'json' => [
'label' => $label,
'sources' => $sources,
'consumer' => $consumer,
'credentials' => $creds,
'address' => $address,
],
];

return new OperationResponse(
$this->client->request(
'put',
"/environments/$environmentUuid/log-forwarding-destinations/$destId",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\CronResponse;
use AcquiaCloudApi\Response\CronsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Crons extends CloudApiBase
{






public function getAll(string $environmentUuid): CronsResponse
{
return new CronsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/crons"
)
);
}






public function get(string $environmentUuid, string $cronId): CronResponse
{
return new CronResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/crons/$cronId"
)
);
}




public function create(
string $environmentUuid,
string $command,
string $frequency,
string $label,
?string $serverId = null
): OperationResponse {

$options = [
'json' => [
'command' => $command,
'frequency' => $frequency,
'label' => $label,
'server_id' => $serverId,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentUuid/crons", $options)
);
}




public function update(
string $environmentUuid,
string $cronId,
string $command,
string $frequency,
string $label,
?string $serverId = null
): OperationResponse {

$options = [
'json' => [
'command' => $command,
'frequency' => $frequency,
'label' => $label,
],
];
if ($serverId) {
$options['json']['server_id'] = $serverId;
}

return new OperationResponse(
$this->client->request('put', "/environments/$environmentUuid/crons/$cronId", $options)
);
}




public function delete(string $environmentUuid, string $cronId): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/environments/$environmentUuid/crons/$cronId")
);
}




public function disable(string $environmentUuid, string $cronId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/crons/$cronId/actions/disable"
)
);
}




public function enable(string $environmentUuid, string $cronId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/crons/$cronId/actions/enable"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\CodebasesResponse;
use AcquiaCloudApi\Response\CodebaseResponse;
use AcquiaCloudApi\Response\ApplicationsResponse;
use AcquiaCloudApi\Response\ReferencesResponse;
use AcquiaCloudApi\Response\ReferenceResponse;
use AcquiaCloudApi\Response\BulkCodeSwitchResponse;
use AcquiaCloudApi\Response\CodebaseEnvironmentsResponse;
use AcquiaCloudApi\Response\SitesResponse;
use AcquiaCloudApi\Response\OperationResponse;

class Codebases extends CloudApiBase
{



public function getAll(): CodebasesResponse
{
return new CodebasesResponse(
$this->client->request(
'get',
"/codebases"
)
);
}






public function get(string $codebaseUuid): CodebaseResponse
{
return new CodebaseResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid"
)
);
}






public function getBySubscription(string $subscriptionUuid): CodebasesResponse
{
return new CodebasesResponse(
$this->client->request(
'get',
"/subscriptions/$subscriptionUuid/codebases"
)
);
}






public function getApplications(string $codebaseUuid): ApplicationsResponse
{
return new ApplicationsResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/applications"
)
);
}






public function getReferences(string $codebaseUuid): ReferencesResponse
{
return new ReferencesResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/references"
)
);
}







public function getReference(string $codebaseUuid, string $referenceName): ReferenceResponse
{
return new ReferenceResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/references/$referenceName"
)
);
}






public function getSites(string $codebaseUuid): SitesResponse
{
return new SitesResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/sites"
)
);
}





public function getEnvironments(string $codebaseUuid): CodebaseEnvironmentsResponse
{
return new CodebaseEnvironmentsResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/environments"
)
);
}







public function getBulkCodeSwitches(string $codebaseUuid, array $options = []): BulkCodeSwitchResponse
{
$path = "/codebases/$codebaseUuid/bulk-code-switch";
return new BulkCodeSwitchResponse(
$this->client->request('get', $path, $options)
);
}







public function getBulkCodeSwitch(string $codebaseUuid, string $bulkCodeSwitchId): BulkCodeSwitchResponse
{
return new BulkCodeSwitchResponse(
$this->client->request(
'get',
"/codebases/$codebaseUuid/bulk-code-switch/$bulkCodeSwitchId"
)
);
}









public function createBulkCodeSwitch(
string $codebaseUuid,
string $reference,
array $targets,
array $cloudActions = []
): OperationResponse {
$data = [
'reference' => $reference,
'targets' => $targets,
];

if (!empty($cloudActions)) {
$data['cloud_actions'] = $cloudActions;
}

$options = [
'json' => $data,
];

return new OperationResponse(
$this->client->request(
'post',
"/codebases/$codebaseUuid/bulk-code-switch",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\DatabaseNameResponse;
use AcquiaCloudApi\Response\DatabaseNamesResponse;
use AcquiaCloudApi\Response\DatabasesResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Databases extends CloudApiBase
{





public function getNames(string $applicationUuid): DatabaseNamesResponse
{
return new DatabaseNamesResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/databases"
)
);
}




public function getAll(string $environmentUuid): DatabasesResponse
{
return new DatabasesResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/databases"
)
);
}




public function create(string $applicationUuid, string $name): OperationResponse
{
$options = [
'json' => [
'name' => $name,
],
];

return new OperationResponse(
$this->client->request('post', "/applications/$applicationUuid/databases", $options)
);
}




public function delete(string $applicationUuid, string $name): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/applications/$applicationUuid/databases/$name")
);
}







public function truncate(string $applicationUuid, string $name): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/applications/$applicationUuid/databases/$name/actions/erase"
)
);
}




public function copy(string $environmentFromUuid, string $dbName, string $environmentToUuid): OperationResponse
{
$options = [
'json' => [
'name' => $dbName,
'source' => $environmentFromUuid,
],
];

return new OperationResponse(
$this->client->request('post', "/environments/$environmentToUuid/databases", $options)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\MetricResponse;
use AcquiaCloudApi\Response\MetricsResponse;






class Metrics extends CloudApiBase
{





public function getAggregateData(string $applicationUuid): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/metrics/usage/data"
)
);
}




public function getAggregateUsageMetrics(string $applicationUuid, string $usageMetric): MetricResponse
{
return new MetricResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/metrics/usage/$usageMetric"
)
);
}






public function getDataByEnvironment(string $applicationUuid): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/metrics/usage/data-by-environment"
)
);
}






public function getViewsByEnvironment(string $applicationUuid): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/metrics/usage/views-by-environment"
)
);
}






public function getVisitsByEnvironment(string $applicationUuid): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/metrics/usage/visits-by-environment"
)
);
}








public function getStackMetricsData(string $environmentUuid): MetricsResponse
{
return new MetricsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/metrics/stackmetrics/data"
)
);
}




public function getStackMetricsDataByMetric(string $environmentUuid, string $metricType): MetricResponse
{
return new MetricResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/metrics/stackmetrics/$metricType"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Connector\ClientInterface;






abstract class CloudApiBase implements CloudApiInterface
{



protected ClientInterface $client;




public function __construct(ClientInterface $client)
{
$this->client = $client;
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\IdeResponse;
use AcquiaCloudApi\Response\IdesResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Ides extends CloudApiBase
{






public function getAll(string $applicationUuid): IdesResponse
{
return new IdesResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/ides"
)
);
}






public function getMine(): IdesResponse
{
return new IdesResponse(
$this->client->request(
'get',
'/account/ides'
)
);
}






public function get(string $ideUuid): IdeResponse
{
return new IdeResponse(
$this->client->request(
'get',
"/ides/$ideUuid"
)
);
}




public function create(string $applicationUuid, string $label): OperationResponse
{

$options = [
'json' => [
'label' => $label,
],
];

return new OperationResponse(
$this->client->request('post', "/applications/$applicationUuid/ides", $options)
);
}




public function delete(string $ideUuid): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/ides/$ideUuid")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\ApplicationResponse;
use AcquiaCloudApi\Response\ApplicationsResponse;
use AcquiaCloudApi\Response\InvitationResponse;
use AcquiaCloudApi\Response\InvitationsResponse;
use AcquiaCloudApi\Response\MemberResponse;
use AcquiaCloudApi\Response\MembersResponse;
use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\OrganizationResponse;
use AcquiaCloudApi\Response\OrganizationsResponse;
use AcquiaCloudApi\Response\TeamResponse;
use AcquiaCloudApi\Response\TeamsResponse;






class Organizations extends CloudApiBase
{





public function getAll(): OrganizationsResponse
{
return new OrganizationsResponse($this->client->request('get', '/organizations'));
}






public function getApplications(string $organizationUuid): ApplicationsResponse
{
return new ApplicationsResponse(
$this->client->request('get', "/organizations/$organizationUuid/applications")
);
}






public function getMembers(string $organizationUuid): MembersResponse
{
return new MembersResponse(
$this->client->request('get', "/organizations/$organizationUuid/members")
);
}




public function getMember(string $organizationUuid, string $memberUuid): MemberResponse
{
return new MemberResponse(
$this->client->request('get', "/organizations/$organizationUuid/members/$memberUuid")
);
}






public function getAdmins(string $organizationUuid): MembersResponse
{
return new MembersResponse(
$this->client->request('get', "/organizations/$organizationUuid/admins")
);
}




public function getAdmin(string $organizationUuid, string $memberUuid): MemberResponse
{
return new MemberResponse(
$this->client->request('get', "/organizations/$organizationUuid/admins/$memberUuid")
);
}






public function getMemberInvitations(string $organizationUuid): InvitationsResponse
{
return new InvitationsResponse(
$this->client->request('get', "/organizations/$organizationUuid/team-invites")
);
}




public function deleteMember(string $organizationUuid, string $memberUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'delete',
"/organizations/$organizationUuid/members/$memberUuid"
)
);
}




public function leaveOrganization(string $organizationUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/organizations/$organizationUuid/actions/leave"
)
);
}




public function changeOwner(string $organizationUuid, string $newOwnerUuid): OperationResponse
{
$options = [
'json' => [
'user_uuid' => $newOwnerUuid,
],
];
return new OperationResponse(
$this->client->request(
'post',
"/organizations/$organizationUuid/actions/change-owner",
$options
)
);
}






public function getTeams(string $organizationUuid): TeamsResponse
{
return new TeamsResponse(
$this->client->request('get', "/organizations/$organizationUuid/teams")
);
}




public function inviteAdmin(string $organizationUuid, string $email): OperationResponse
{
$options = [
'json' => [
'email' => $email,
],
];

return new OperationResponse(
$this->client->request('post', "/organizations/$organizationUuid/admin-invites", $options)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\InsightAlertResponse;
use AcquiaCloudApi\Response\InsightAlertsResponse;
use AcquiaCloudApi\Response\InsightModuleResponse;
use AcquiaCloudApi\Response\InsightModulesResponse;
use AcquiaCloudApi\Response\InsightResponse;
use AcquiaCloudApi\Response\InsightsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Insights extends CloudApiBase
{






public function getAll(string $applicationUuid): InsightsResponse
{
return new InsightsResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/insight"
)
);
}







public function getEnvironment(string $environmentUuid): InsightsResponse
{
return new InsightsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/insight"
)
);
}




public function get(string $siteId): InsightResponse
{
return new InsightResponse(
$this->client->request(
'get',
"/insight/$siteId"
)
);
}






public function getAllAlerts(string $siteId): InsightAlertsResponse
{
return new InsightAlertsResponse(
$this->client->request(
'get',
"/insight/$siteId/alerts"
)
);
}




public function getAlert(string $siteId, string $alertUuid): InsightAlertResponse
{
return new InsightAlertResponse(
$this->client->request(
'get',
"/insight/$siteId/alerts/$alertUuid"
)
);
}





public function ignoreAlert(string $siteId, string $alertUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/insight/$siteId/alerts/$alertUuid/actions/ignore"
)
);
}





public function restoreAlert(string $siteId, string $alertUuid): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/insight/$siteId/alerts/$alertUuid/actions/restore"
)
);
}





public function revoke(string $siteId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/insight/$siteId/actions/revoke"
)
);
}






public function unrevoke(string $siteId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/insight/$siteId/actions/unrevoke"
)
);
}






public function getModules(string $siteId): InsightModulesResponse
{
return new InsightModulesResponse(
$this->client->request(
'get',
"/insight/$siteId/modules"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Connector\ClientInterface;




interface CloudApiInterface
{



public function __construct(ClientInterface $client);
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\ServerResponse;
use AcquiaCloudApi\Response\ServersResponse;






class Servers extends CloudApiBase
{



public function get(string $environmentUuid, string $serverId): ServerResponse
{
return new ServerResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/servers/$serverId"
)
);
}






public function update(string $environmentUuid, string $serverId, array $config): OperationResponse
{
return new OperationResponse(
$this->client->request(
'put',
"/environments/$environmentUuid/servers/$serverId",
$config
)
);
}






public function getAll(string $environmentUuid): ServersResponse
{
return new ServersResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/servers"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\DomainResponse;
use AcquiaCloudApi\Response\DomainsResponse;
use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupsResponse;
use AcquiaCloudApi\Response\SiteInstanceResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;






class SiteInstances extends CloudApiBase
{



public function get(string $siteId, string $environmentId): SiteInstanceResponse
{
return new SiteInstanceResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId"
)
);
}




public function getDatabase(string $siteId, string $environmentId): SiteInstanceDatabaseResponse
{
return new SiteInstanceDatabaseResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/database"
)
);
}




public function copyDatabase(string $siteId, string $environmentId, string $sourceEnvironmentId): OperationResponse
{
$options = [
'json' => [
'source' => $sourceEnvironmentId,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/site-instances/$siteId.$environmentId/database",
$options
)
);
}






public function getDatabaseBackups(string $siteId, string $environmentId): SiteInstanceDatabaseBackupsResponse
{
return new SiteInstanceDatabaseBackupsResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/database/backups"
)
);
}




public function createDatabaseBackup(string $siteId, string $environmentId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/site-instances/$siteId.$environmentId/database/backups"
)
);
}




public function getDatabaseBackup(
string $siteId,
string $environmentId,
string $backupId
): SiteInstanceDatabaseBackupResponse {
return new SiteInstanceDatabaseBackupResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/database/backups/$backupId"
)
);
}




public function downloadDatabaseBackup(string $siteId, string $environmentId, string $backupId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/database/backups/$backupId/actions/download"
)
);
}




public function restoreDatabaseBackup(string $siteId, string $environmentId, string $backupId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/site-instances/$siteId.$environmentId/database/backups/$backupId/actions/restore"
)
);
}






public function getDomains(string $siteId, string $environmentId): DomainsResponse
{
return new DomainsResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/domains"
)
);
}




public function getDomain(string $siteId, string $environmentId, string $domainName): DomainResponse
{
return new DomainResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/domains/$domainName"
)
);
}




public function getDomainStatus(string $siteId, string $environmentId, string $domainName): DomainResponse
{
return new DomainResponse(
$this->client->request(
'get',
"/site-instances/$siteId.$environmentId/domains/$domainName/status"
)
);
}




public function copyFiles(string $siteId, string $environmentId, string $sourceEnvironmentId): OperationResponse
{
$options = [
'json' => [
'source' => $sourceEnvironmentId,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/site-instances/$siteId.$environmentId/files",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\BranchesResponse;
use AcquiaCloudApi\Response\BranchResponse;
use AcquiaCloudApi\Response\OperationResponse;






class Code extends CloudApiBase
{





public function getAll(string $applicationUuid): BranchesResponse
{
return new BranchesResponse(
$this->client->request(
'get',
"/applications/$applicationUuid/code"
)
);
}




public function switch(string $environmentUuid, string $branch): OperationResponse
{

$options = [
'json' => [
'branch' => $branch,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/code/actions/switch",
$options
)
);
}




public function deploy(
string $environmentFromUuid,
string $environmentToUuid,
?string $commitMessage = null
): OperationResponse {

$options = [
'json' => [
'source' => $environmentFromUuid,
'message' => $commitMessage,
],
];

return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentToUuid/code",
$options
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\ApplicationResponse;
use AcquiaCloudApi\Response\ApplicationsResponse;
use AcquiaCloudApi\Response\OperationResponse;
use AcquiaCloudApi\Response\TeamResponse;
use AcquiaCloudApi\Response\TeamsResponse;






class Teams extends CloudApiBase
{



public function create(string $organizationUuid, string $name): OperationResponse
{
$options = [
'json' => [
'name' => $name,
],
];

return new OperationResponse(
$this->client->request('post', "/organizations/$organizationUuid/teams", $options)
);
}






public function getAll(): TeamsResponse
{
return new TeamsResponse(
$this->client->request('get', '/teams')
);
}




public function rename(string $teamUuid, string $name): OperationResponse
{
$options = [
'json' => [
'name' => $name,
],
];

return new OperationResponse(
$this->client->request('put', "/teams/$teamUuid", $options)
);
}





public function delete(string $teamUuid): OperationResponse
{
return new OperationResponse(
$this->client->request('delete', "/teams/$teamUuid")
);
}




public function addApplication(string $teamUuid, string $applicationUuid): OperationResponse
{
$options = [
'json' => [
'uuid' => $applicationUuid,
],
];

return new OperationResponse(
$this->client->request('post', "/teams/$teamUuid/applications", $options)
);
}






public function invite(string $teamUuid, string $email, array $roles): OperationResponse
{
$options = [
'json' => [
'email' => $email,
'roles' => $roles,
],
];

return new OperationResponse(
$this->client->request('post', "/teams/$teamUuid/invites", $options)
);
}






public function getApplications(string $teamUuid): ApplicationsResponse
{
return new ApplicationsResponse(
$this->client->request('get', "/teams/$teamUuid/applications")
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\BackupResponse;
use AcquiaCloudApi\Response\BackupsResponse;
use AcquiaCloudApi\Response\OperationResponse;
use Psr\Http\Message\StreamInterface;






class DatabaseBackups extends CloudApiBase
{



public function create(string $environmentUuid, string $dbName): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/databases/$dbName/backups"
)
);
}






public function getAll(string $environmentUuid, string $dbName): BackupsResponse
{
return new BackupsResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/databases/$dbName/backups"
)
);
}




public function get(string $environmentUuid, string $dbName, int $backupId): BackupResponse
{
return new BackupResponse(
$this->client->request(
'get',
"/environments/$environmentUuid/databases/$dbName/backups/$backupId"
)
);
}




public function restore(string $environmentUuid, string $dbName, int $backupId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'post',
"/environments/$environmentUuid/databases/$dbName/backups/$backupId/actions/restore"
)
);
}




public function download(string $environmentUuid, string $dbName, int $backupId): StreamInterface
{
return $this->client->stream(
'get',
"/environments/$environmentUuid/databases/$dbName/backups/$backupId/actions/download"
);
}




public function delete(string $environmentUuid, string $dbName, int $backupId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'delete',
"/environments/$environmentUuid/databases/$dbName/backups/$backupId"
)
);
}
}
<?php

namespace AcquiaCloudApi\Endpoints;

use AcquiaCloudApi\Response\CodebaseEnvironmentResponse;
use AcquiaCloudApi\Response\CodebaseEnvironmentsResponse;
use AcquiaCloudApi\Response\OperationResponse;






class CodebaseEnvironments extends CloudApiBase
{



public function getAll(string $codebaseId): CodebaseEnvironmentsResponse
{
return new CodebaseEnvironmentsResponse(
$this->client->request(
'get',
"/codebases/$codebaseId/environments"
)
);
}




public function get(string $codebaseId, string $environmentId): CodebaseEnvironmentResponse
{
return new CodebaseEnvironmentResponse(
$this->client->request(
'get',
"/codebases/$codebaseId/environments/$environmentId"
)
);
}




public function getById(string $environmentId): CodebaseEnvironmentResponse
{
return new CodebaseEnvironmentResponse(
$this->client->request(
'get',
"/v3/environments/$environmentId"
)
);
}






public function update(string $environmentId, array $properties): OperationResponse
{
$options = [
'json' => [
'properties' => $properties
],
];

return new OperationResponse(
$this->client->request(
'put',
"/v3/environments/$environmentId",
$options
)
);
}




public function associatePrivateNetwork(string $environmentId, string $privateNetworkId): OperationResponse
{
$options = [
'json' => [
'private_network_id' => $privateNetworkId
],
];

return new OperationResponse(
$this->client->request(
'put',
"/v3/environments/$environmentId/private-network",
$options
)
);
}




public function disassociatePrivateNetwork(string $environmentId): OperationResponse
{
return new OperationResponse(
$this->client->request(
'delete',
"/v3/environments/$environmentId/private-network"
)
);
}




public function getByPrivateNetwork(string $privateNetworkId): CodebaseEnvironmentsResponse
{
return new CodebaseEnvironmentsResponse(
$this->client->request(
'get',
"/v3/private-networks/$privateNetworkId/environments"
)
);
}




public function getBySite(string $siteId): CodebaseEnvironmentsResponse
{
return new CodebaseEnvironmentsResponse(
$this->client->request(
'get',
"/sites/$siteId/environments"
)
);
}
}
2.0.16-dev
The MIT License (MIT)

Copyright (c) 2016 Zumba

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.
<?php
namespace Zumba\Amplitude;






































class Event implements \JsonSerializable
{





protected $data = [];









protected $availableVars = [
'user_id' => 'string',
'device_id' => 'string',
'event_type' => 'string',
'time' => 'int',
'event_properties' => 'array',
'user_properties' => 'array',
'app_version' => 'string',
'platform' => 'string',
'os_name' => 'string',
'os_version' => 'string',
'session_id' => 'string',
'device_brand' => 'string',
'device_manufacturer' => 'string',
'device_model' => 'string',
'device_type' => 'string',
'carrier' => 'string',
'country' => 'string',
'region' => 'string',
'city' => 'string',
'dma' => 'string',
'language' => 'string',
'price' => 'float',
'quantity' => 'int',
'revenue' => 'float',
'productId' => 'string',
'revenueType' => 'string',
'location_lat' => 'float',
'location_lng' => 'float',
'ip' => 'string',
'idfa' => 'string',
'adid' => 'string',
'user_agent' => 'string',
];






public function __construct(array $data = [])
{
if (!empty($data)) {
$this->set($data);
}
}






public function setUserProperties(array $userProperties)
{
$props = $this->userProperties ?: [];
$this->userProperties = array_merge($props, $userProperties);
return $this;
}





















public function set($name, $value = null)
{
if (is_array($name)) {
foreach ($name as $key => $val) {
$this->set($key, $val);
}
return $this;
}
$name = $this->normalize($name);
if (!isset($this->availableVars[$name])) {

$this->data['event_properties'][$name] = $value;
return $this;
}

switch ($this->availableVars[$name]) {
case 'string':
$value = (string)$value;
break;
case 'int':
$value = (int)$value;
break;
case 'float':
$value = (float)$value;
break;
case 'array':
$value = (array)$value;
break;
}
$this->data[$name] = $value;
return $this;
}












public function get($name)
{
$name = $this->normalize($name);
if (isset($this->data[$name])) {
return $this->data[$name];
} elseif (isset($this->data['event_properties'][$name])) {
return $this->data['event_properties'][$name];
}
return null;
}










public function unsetProperty($name)
{
$name = $this->normalize($name);
if (isset($this->availableVars[$name])) {
unset($this->data[$name]);
} elseif (isset($this->data['event_properties'])) {
unset($this->data['event_properties'][$name]);
}
return $this;
}










public function isPropertySet($name)
{
$name = $this->normalize($name);
return isset($this->data[$name]) || isset($this->data['event_properties'][$name]);
}










public function __set($name, $value)
{
$this->set($name, $value);
}









public function __get($name)
{
return $this->get($name);
}








public function __unset($name)
{
$this->unsetProperty($name);
}










public function __isset($name)
{
return $this->isPropertySet($name);
}










protected function normalize($name)
{
if (isset($this->availableVars[$name])) {
return $name;
}
if (preg_match('/^[a-zA-Z_]+$/', $name)) {


$underscore = Inflector::underscore($name);
if (isset($this->availableVars[$underscore])) {
return $underscore;
}

$camel = Inflector::camelCase($name);
if (isset($this->availableVars[$camel])) {
return $camel;
}
}

return $name;
}






public function toArray()
{
return $this->data;
}






public function jsonSerialize(): array
{
return $this->data;
}
}
<?php
namespace Zumba\Amplitude;

use Psr\Log;

class Amplitude
{
use Log\LoggerAwareTrait;

const AMPLITUDE_API_URL = 'https://api.amplitude.com/httpapi';

const EXCEPTION_MSG_NO_API_KEY = 'API Key is required to log an event';
const EXCEPTION_MSG_NO_EVENT_TYPE = 'Event Type is required to log or queue an event';
const EXCEPTION_MSG_NO_USER_OR_DEVICE = 'Either user_id or device_id required to log an event';






protected $apiKey;







protected $apiUrl;






protected $event;






protected $userId;






protected $userProperties = [];






protected $deviceId;






protected $queue = [];






protected $optOut = false;






protected $debugResponse = false;






protected $lastHttpResponse;






private static $instances = [];
























public static function getInstance($instanceName = 'default')
{
if (empty(self::$instances[$instanceName])) {
self::$instances[$instanceName] = new static();
}
return self::$instances[$instanceName];
}







public function __construct($apiKey = null, $apiUrl = null)
{
if (!empty($apiKey)) {
$this->apiKey = (string)$apiKey;
}
if (!empty($apiUrl)) {
$this->apiUrl = (string)$apiUrl;
}

$this->setLogger(new Log\NullLogger());
}











public function init($apiKey, $userId = null, $apiUrl = null)
{
$this->apiKey = (string)$apiKey;
$this->apiUrl = (string)$apiUrl;
if ($userId !== null) {
$this->setUserId($userId);
}
return $this;
}









public function logQueuedEvents()
{
if (empty($this->queue)) {
return $this;
}
foreach ($this->queue as $event) {
$this->event = $event;
$this->logEvent();
}
return $this->resetEvent()
->resetQueue();
}






public function resetQueue()
{
$this->queue = [];
return $this;
}











public function event($event = null)
{
if (!empty($event) && $event instanceof \Zumba\Amplitude\Event) {
$this->event = $event;
} elseif (empty($this->event)) {

$this->event = new Event();
}
if (!empty($event) && is_array($event)) {

$this->event->set($event);
}
return $this->event;
}






public function resetEvent()
{
$this->event = null;
return $this;
}















public function logEvent($eventType = '', array $eventProperties = [])
{
if ($this->optOut) {
return $this;
}

if (empty($this->apiKey)) {
throw new \LogicException(static::EXCEPTION_MSG_NO_API_KEY);
}
$event = $this->event();
$event->set($eventProperties);
$event->eventType = $eventType ?: $event->eventType;

$this->setPersistentEventData();

if (empty($event->eventType)) {
throw new \LogicException(static::EXCEPTION_MSG_NO_EVENT_TYPE);
}
if (empty($event->userId) && empty($event->deviceId)) {
throw new \LogicException(static::EXCEPTION_MSG_NO_USER_OR_DEVICE);
}

$this->sendEvent();


$this->resetEvent();

return $this;
}






protected function setPersistentEventData()
{
$event = $this->event();
if (!empty($this->userId)) {
$event->userId = $this->userId;
}
if (!empty($this->deviceId)) {
$event->deviceId = $this->deviceId;
}
if (!empty($this->userProperties)) {
$event->setUserProperties($this->userProperties);
$this->resetUserProperties();
}
}






















public function queueEvent($eventType = '', array $eventProperties = [])
{
if ($this->optOut) {
return $this;
}
$event = $this->event();
$event->set($eventProperties);
$event->eventType = $eventType ?: $event->eventType;


if (empty($event->eventType)) {
throw new \LogicException(static::EXCEPTION_MSG_NO_EVENT_TYPE);
}
if (empty($this->queue) && !empty($this->apiKey) && (!empty($this->userId) || !empty($this->deviceId))) {

return $this->logEvent();
}
$this->queue[] = $event;
$this->resetEvent();

return $this;
}









public function setUserId($userId)
{
$this->userId = (string)$userId;
return $this;
}









public function setDeviceId($deviceId)
{
$this->deviceId = (string)$deviceId;
return $this;
}











public function setUserProperties(array $userProperties)
{
$this->userProperties = array_merge($this->userProperties, $userProperties);
return $this;
}






public function resetUserProperties()
{
$this->userProperties = [];
return $this;
}






public function hasQueuedEvents()
{
return !empty($this->queue);
}













public function resetUser()
{
$this->setUserId(null);
$this->setDeviceId(null);
$this->resetUserProperties();
return $this;
}









public function setOptOut($optOut)
{
$this->optOut = (bool)$optOut;
return $this;
}






public function getApiKey()
{
return $this->apiKey;
}






public function getUserId()
{
return $this->userId;
}






public function getDeviceId()
{
return $this->deviceId;
}








public function getUserProperties()
{
return $this->userProperties;
}






public function getOptOut()
{
return $this->optOut;
}









protected function sendEvent()
{
if (empty($this->event) || empty($this->apiKey)) {
throw new \InternalErrorException('Event or api key not set, cannot send event');
}
$url = empty($this->apiUrl) ? static::AMPLITUDE_API_URL : $this->apiUrl;
$ch = curl_init($url);
if (!$ch) {

$this->logger->critical(
'Call to curl_init(' . $url . ') failed, unable to send Amplitude event'
);
return;
}
$postFields = [
'api_key' => $this->apiKey,
'event' => json_encode($this->event),
];
curl_setopt($ch, \CURLOPT_POSTFIELDS, $postFields);

curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$curlErrno = curl_errno($ch);
if ($curlErrno) {
$this->logger->critical(
'Curl error: ' . curl_error($ch),
compact('curlErrno', 'response', 'postFields')
);
} else {
$httpCode = curl_getinfo($ch, \CURLINFO_HTTP_CODE);
$this->logger->log(
$httpCode === 200 ? Log\LogLevel::INFO : Log\LogLevel::ERROR,
'Amplitude HTTP API response: ' . $response,
compact('httpCode', 'response', 'postFields')
);
}
curl_close($ch);
}
}
<?php
namespace Zumba\Amplitude;

class Inflector
{





protected static $cache = array();









protected static function cache($method, $key, $value = null)
{
if (is_null($value)) {
$value = isset(static::$cache[$method][$key]) ? static::$cache[$method][$key] : null;
} else {
static::$cache[$method][$key] = $value;
}

return $value;
}







public static function underscore($value = '')
{
$result = static::cache(__FUNCTION__, $value);
if (!$result) {
$result = strtolower(preg_replace('/([A-Z])/', '_\1', $value));
static::cache(__FUNCTION__, $value, $result);
}
return $result;
}









public static function camelCase($value = '')
{
$result = static::cache(__FUNCTION__, $value);
if (!$result) {
$newValue = ucwords(str_replace('_', ' ', $value));
$result = str_replace(' ', '', strtolower($newValue[0]) . substr($newValue, 1));
static::cache(__FUNCTION__, $value, $result);
}
return $result;
}
}
<?php

namespace Zumba\Amplitude\Test;

use PHPUnit\Framework\TestCase;
use \Zumba\Amplitude\Inflector;

/**
@group
*/
class InflectorTest extends TestCase
{
public function testCamelCase()
{
$this->assertEquals('ok', Inflector::camelCase('ok'));
$this->assertEquals('camelCased', Inflector::camelCase('camelCased'));
$this->assertEquals('doubleCamelCased', Inflector::camelCase('doubleCamelCased'));
$this->assertEquals('underScored', Inflector::camelCase('under_scored'));
$this->assertEquals('doubleUnderScored', Inflector::camelCase('double_under_scored'));
}

public function testUnderscore()
{
$this->assertEquals('ok', Inflector::underscore('ok'));
$this->assertEquals('camel_cased', Inflector::underscore('camelCased'));
$this->assertEquals('double_camel_cased', Inflector::underscore('doubleCamelCased'));
$this->assertEquals('under_scored', Inflector::underscore('under_scored'));
$this->assertEquals('double_under_scored', Inflector::underscore('double_under_scored'));
}
}
<?php

namespace Zumba\Amplitude\Test;

use PHPUnit\Framework\TestCase;
use \Zumba\Amplitude\Event;

/**
@group
*/
class EventTest extends TestCase
{
/**
@dataProvider
*/
public function testSet($name, $value, $expected, $msg)
{
$event = new Event();
$result = $event->set($name, $value);
$this->assertInstanceOf('\Zumba\Amplitude\Event', $result, 'get should return instance of itself');
$this->assertEquals(json_encode($expected), json_encode($event), $msg);
}

public function setDataProvider()
{
return [
[
'user_id',
'underscore',
['user_id' => 'underscore'],
'Set built-in property directly',
],
[
'userId',
'camel',
['user_id' => 'camel'],
'Set built-in property using camelcase, but setting the value using underscore',
],
[
'productId',
'camel',
['productId' => 'camel'],
'Set camelcase built-in property using camelcase',
],
[
'product_id',
'under',
['productId' => 'under'],
'Set camelcase built-in property using underscore, still sets camelcase version',
],
[
'revenue_type',
'under',
['revenueType' => 'under'],
'Set camelcase built-in property using underscore, still sets camelcase version',
],
[
'customProp',
'custom',
['event_properties' => ['customProp' => 'custom']],
'Set not-built-in property in event_properties without changing name',
],
[
'Custom With Space',
'Some value',
['event_properties' => ['Custom With Space' => 'Some value']],
'Set not-built-in property in event_properties without changing name',
],
];
}

public function testSetArray()
{
$event = new Event();

$event->set(
[
'deviceId' => 'device',
'user_id' => 'user',
'product_id' => 'product',
'some property' => 'some value',
]
);
$expected = [
'device_id' => 'device',
'user_id' => 'user',
'productId' => 'product',
'event_properties' => [
'some property' => 'some value',
],
];
$this->assertEquals(
json_encode($expected),
json_encode($event),
'Set should accept array of values to set, normalizing built in property names'
);
}

public function testSetCasting()
{
$event = new Event();
$event->set('quantity', '10.5');
$event->set('price', '1234.350');

$eventData = $event->toArray();
$this->assertSame(10, $eventData['quantity']);
$this->assertSame(1234.35, $eventData['price']);
}

/**
@dataProvider
*/
public function testGet($eventData, $getName, $expected, $msg)
{
$event = new Event($eventData);
$this->assertEquals($expected, $event->get($getName), $msg);
}

public function getDataProvider()
{
return [
[
['user_id' => 'underscore'],
'user_id',
'underscore',
'Get built-in property directly',
],
[
['user_id' => 'camel'],
'userId',
'camel',
'Get built-in property using camelcase',
],
[
['productId' => 'camel'],
'productId',
'camel',
'Get camelcase built-in property using camelcase',
],
[
['productId' => 'under'],
'product_id',
'under',
'Get camelcase built-in property using underscore, still gets camelcase version',
],
[
['revenueType' => 'under'],
'revenue_type',
'under',
'Get camelcase built-in property using underscore, still gets camelcase version',
],
[
['event_properties' => ['customProp' => 'custom']],
'customProp',
'custom',
'Get not-built-in property in event_properties without changing name',
],
[
['event_properties' => ['custom_prop' => 'custom']],
'customProp',
null,
'Should not get custom property with camelcase name (if not initially set with camelcase),
                    that should only work on built-in properties',
],
[
['event_properties' => ['Custom With Space' => 'Some value']],
'Custom With Space',
'Some value',
'Get not-built-in property in event_properties without changing name',
],
];
}

public function testUnsetProperty()
{
$event = new Event();
$event->set('custom prop', 'value');
$event->userId = 'user';
$event->quantity = 50;
$event->userProperties = ['prop' => 'value'];
$this->assertEquals(
[
'event_properties' => ['custom prop' => 'value'],
'user_id' => 'user',
'quantity' => 50,
'user_properties' => ['prop' => 'value']
],
$event->toArray(),
'Initialization Check'
);

$event->unsetProperty('invalid');
unset($event->invalid);


$this->assertNotEmpty($event->get('custom prop'), 'Initialization check');
$event->unsetProperty('custom prop');
$this->assertEmpty($event->get('custom prop'), 'Should be able to unset custom properties');


$this->assertNotEmpty($event->userId, 'Initialization check');
unset($event->userId);
$this->assertEmpty($event->userId, 'Should unset built-in properties with magic unset');
}

public function testSetUserProperties()
{
$userProps = ['dob' => 'tomorrow', 'gender' => 'f'];
$event = new Event();
$event->setUserProperties($userProps);
$this->assertSame(
['user_properties' => $userProps],
$event->toArray(),
'Should set user properties in user_properties'
);
$userProps2 = ['dob' => 'yesterday', 'name' => 'Baby'];
$expected = [
'dob' => 'yesterday',
'gender' => 'f',
'name' => 'Baby',
];
$event->setUserProperties($userProps2);
$this->assertSame(
['user_properties' => $expected],
$event->toArray(),
'Second call to setUserProperties should update properties, not remove existing'
);
}
}
<?php

namespace Zumba\Amplitude\Test;

use PHPUnit\Framework\TestCase;
use Zumba\Amplitude\Amplitude;
use Zumba\Amplitude\Event;

/**
@group
*/
class AmplitudeTest extends TestCase
{
public function testGetInstance()
{
$default = Amplitude::getInstance();
$this->assertSame($default, Amplitude::getInstance());

$named = Amplitude::getInstance('named');
$this->assertNotSame($named, $default);
$this->assertSame($named, Amplitude::getInstance('named'));
}

public function testConstructSetsApiKey()
{
$amplitude = new Amplitude('api-key');
$this->assertEquals('api-key', $amplitude->getApiKey());
}

public function testInit()
{
$amplitude = new Amplitude();
$this->assertNull($amplitude->getApiKey(), 'Initial value should be null');
$amplitude->init('API-KEY', 'USER-ID');
$this->assertEquals('API-KEY', $amplitude->getApiKey(), 'Init should set api key');
$this->assertEquals('USER-ID', $amplitude->getUserId(), 'Init should set user ID');
}

public function testLogQueuedEvents()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;

$amplitude->expects($this->exactly(3))
->method('logEvent')
;

$amplitude->queueEvent('Event 1')
->queueEvent('Event 2', ['customProp' => 'value'])
->queueEvent('Event 3')
;

$this->assertTrue($amplitude->hasQueuedEvents(), 'Initialization check, should have queued events');

$amplitude->init('APIKEY', 'USER-ID')
->logQueuedEvents()
;

$this->assertFalse($amplitude->hasQueuedEvents(), 'logQueuedEvents should reset the queue afterwards');
}

public function testLogQueuedEventsEmptyQueue()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('logEvent')
;

$this->assertFalse($amplitude->hasQueuedEvents(), 'Initialization check, should not have queued events');

$result = $amplitude->init('APIKEY', 'USER-ID')
->logQueuedEvents()
;

$this->assertSame($amplitude, $result, 'Should return itself');
}

public function testEvent()
{
$event = new Event();
$amplitude = new Amplitude();
$newEvent = $amplitude->event();
$this->assertNotSame($newEvent, $event, 'Initialization check');
$amplitude->event($event);
$this->assertSame($event, $amplitude->event(), 'Event passed in should persist until it is used or reset');
$this->assertNotSame($newEvent, $event, 'Should not keep using old event if pass in a new one');

$addPropertyEvent = $amplitude->event(['new property' => 'value']);
$this->assertSame($addPropertyEvent, $event, 'Should keep using same event, have not set the event yet');
$this->assertEquals(
'value',
$addPropertyEvent->get('new property'),
'Should allow passing in event properties to set them on the event'
);
}

public function testLogEvent()
{
$props = ['event property' => 'value'];
$userId = 'USERID';
$deviceId = 'DEVICEID';
$eventType = 'Event Type';
$secondEventType = 'Second Event';

$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;
$event = $amplitude->event();
$result = $amplitude->init('APIKEY', $userId)
->setDeviceId($deviceId)
->logEvent($eventType, $props)
;

$eventData = $event->toArray();

$this->assertEquals($eventType, $eventData['event_type'], 'logEvent should set the event_type on the event');
$this->assertEquals(
$props,
$eventData['event_properties'],
'logEvent should set event_properties on the event'
);
$this->assertEquals($userId, $eventData['user_id'], 'logEvent should set the user_id on the event');
$this->assertEquals($deviceId, $eventData['device_id'], 'logEvent should set device_id on the event');

$this->assertSame($amplitude, $result, 'Should return itself');

$event2 = $amplitude->event();
$this->assertNotSame($event2, $event, 'Should have created a new event once the original was logged');
$amplitude->logEvent($secondEventType);
$eventData = $event2->toArray();

$this->assertEquals(
$secondEventType,
$eventData['event_type'],
'logEvent should set the event_type on the event'
);
$this->assertArrayNotHasKey(
'event_properties',
$eventData,
'logEvent should not have set event_properties with nothing passed in'
);
$this->assertArrayNotHasKey(
'user_properties',
$eventData,
'logEvent should not persist user properties after they are sent in first event'
);
$this->assertEquals($userId, $eventData['user_id'], 'logEvent should persist the user_id for every event sent');
$this->assertEquals(
$deviceId,
$eventData['device_id'],
'logEvent should persist the device_id for every event sent'
);
}

public function testLogEventUserPropertiesMerged()
{
$props = ['event property' => 'value'];
$props2 = ['second prop' => 'second val'];
$userId = 'USERID';
$eventType = 'Event Type';

$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;
$event = $amplitude->event();
$event->userProperties = $props;
$result = $amplitude->init('APIKEY', $userId)
->setUserProperties($props2)
->logEvent($eventType)
;

$eventData = $event->toArray();

$this->assertEquals(
array_merge($props, $props2),
$eventData['user_properties'],
'logEvent should merge any pending user properties with any properties set on the event already'
);
}

public function testLogEventNoApiKey()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('sendEvent')
;

$this->expectException(\LogicException::class, Amplitude::EXCEPTION_MSG_NO_API_KEY);
$amplitude->logEvent();
}

public function testLogEventNoEventType()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('sendEvent')
;

$amplitude->init('APIKEY', 'USER');
$this->expectException(\LogicException::class, Amplitude::EXCEPTION_MSG_NO_EVENT_TYPE);
$amplitude->logEvent();
}

public function testLogEventEventInitializedEarly()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;

$amplitude->expects($this->once())
->method('sendEvent')
;

$event = $amplitude->event();
$event->eventType = 'Event Type';
$event->userId = 'USER';

$amplitude->init('APIKEY');
$amplitude->logEvent();


}

public function testLogEventNoUserNoDevice()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('sendEvent')
;

$amplitude->init('APIKEY');
$this->expectException(\LogicException::class, Amplitude::EXCEPTION_MSG_NO_USER_OR_DEVICE);
$amplitude->logEvent('Event');
}

public function testQueueEvent()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('logEvent')
;

$event = $amplitude->event();
$amplitude->setUserId('USER');
$this->assertFalse($amplitude->hasQueuedEvents(), 'Initialization check, should not have queue starting out');
$result = $amplitude->queueEvent('Event', ['prop' => 'val']);

$this->assertSame($amplitude, $result, 'Should return itself');


$eventData = $event->toArray();
$this->assertEquals('Event', $eventData['event_type'], 'should save the event type on the event');
$this->assertEquals(['prop' => 'val'], $eventData['event_properties'], 'should save event properties on event');
$this->assertArrayNotHasKey(
'user_id',
$eventData,
'should not set user ID at time event is queued, even if user ID is set at time of being queued'
);
$this->assertTrue($amplitude->hasQueuedEvents(), 'Should have queued the event');
$this->assertNotSame($event, $amplitude->event(), 'Should be creating a new event once one has been queued');
}

public function testQueueEventAlreadyInitRunImmediately()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;
$amplitude->expects($this->once())
->method('logEvent')
;

$this->assertFalse($amplitude->hasQueuedEvents(), 'Initialization check, should not have queue starting out');
$amplitude->init('APIKEY', 'USER')
->queueEvent('Event')
;
$this->assertFalse(
$amplitude->hasQueuedEvents(),
'Should have sent event right away since amplitude was already initialized'
);
}

public function testQueueEventInitEarly()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;
$amplitude->expects($this->never())
->method('logEvent')
;

$event = $amplitude->event();
$event->eventType = 'Event';
$result = $amplitude->queueEvent();
$this->assertTrue(
$amplitude->hasQueuedEvents(),
'Should have queued the event without throwing exception since event type set prior to being queued'
);

$this->assertSame($amplitude, $result, 'Should return itself');
}

public function testQueueEventNoEventType()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['logEvent'])
->getMock()
;
$amplitude->expects($this->never())
->method('logEvent')
;

$this->expectException(\LogicException::class, Amplitude::EXCEPTION_MSG_NO_EVENT_TYPE);
$amplitude->queueEvent();
}

public function testResetUser()
{
$amplitude = new Amplitude();
$amplitude->setUserId('User')
->setDeviceId('device')
->setUserProperties(['user props'])
;
$this->assertNotEmpty($amplitude->getUserId(), 'Initialization check');
$this->assertNotEmpty($amplitude->getDeviceId(), 'Initialization check');
$this->assertNotEmpty($amplitude->getUserProperties(), 'Initialization check');

$amplitude->resetUser();

$this->assertEmpty($amplitude->getUserId(), 'Should have cleared user ID');
$this->assertEmpty($amplitude->getDeviceId(), 'Should have cleared device ID');
$this->assertEmpty($amplitude->getUserProperties(), 'Should have cleared user properties');
}

public function testOptOut()
{
$amplitude = $this->getMockBuilder(Amplitude::class)
->onlyMethods(['sendEvent'])
->getMock()
;

$amplitude->expects($this->never())
->method('sendEvent')
;


$amplitude->setOptOut(true);

$amplitude->queueEvent('Queued Event');

$amplitude->init('API', 'USER')
->setOptOut(true)
->logQueuedEvents()
;

$amplitude->logEvent('Another Event')
->queueEvent('Another Queued Event')
;
$this->assertTrue($amplitude->getOptOut());
}

public function testSetUserProperties()
{
$userProps = ['dob' => 'tomorrow',
'gender' => 'f',
];
$amplitude = new Amplitude();
$amplitude->setUserProperties($userProps);
$this->assertSame($userProps, $amplitude->getUserProperties());
$userProps2 = ['dob' => 'yesterday',
'name' => 'Baby',
];
$expected = [
'dob' => 'yesterday',
'gender' => 'f',
'name' => 'Baby',
];
$amplitude->setUserProperties($userProps2);
$this->assertSame(
$expected,
$amplitude->getUserProperties(),
'Second call to setUserProperties should set properties, without removing existing'
);
}
}
The MIT License (MIT)

Copyright (c) 2015 Kevin Robatel

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.

<?php

namespace Kevinrob\GuzzleCache;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\TransferException;
use GuzzleHttp\Promise\FulfilledPromise;
use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\RejectedPromise;
use GuzzleHttp\Psr7\Response;
use Kevinrob\GuzzleCache\Strategy\CacheStrategyInterface;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;




class CacheMiddleware
{
const HEADER_RE_VALIDATION = 'X-Kevinrob-GuzzleCache-ReValidation';
const HEADER_INVALIDATION = 'X-Kevinrob-GuzzleCache-Invalidation';
const HEADER_CACHE_INFO = 'X-Kevinrob-Cache';
const HEADER_CACHE_HIT = 'HIT';
const HEADER_CACHE_MISS = 'MISS';
const HEADER_CACHE_STALE = 'STALE';




protected $waitingRevalidate = [];




protected $client;




protected $cacheStorage;








protected $httpMethods = ['GET' => true];








protected $safeMethods = ['GET' => true, 'HEAD' => true, 'OPTIONS' => true, 'TRACE' => true];




public function __construct(?CacheStrategyInterface $cacheStrategy = null)
{
$this->cacheStorage = $cacheStrategy !== null ? $cacheStrategy : new PrivateCacheStrategy();

register_shutdown_function([$this, 'purgeReValidation']);
}




public function setClient(Client $client)
{
$this->client = $client;
}




public function setCacheStorage(CacheStrategyInterface $cacheStorage)
{
$this->cacheStorage = $cacheStorage;
}




public function getCacheStorage()
{
return $this->cacheStorage;
}




public function setHttpMethods(array $methods)
{
$this->httpMethods = $methods;
}

public function getHttpMethods()
{
return $this->httpMethods;
}




public function purgeReValidation()
{
\GuzzleHttp\Promise\Utils::inspectAll($this->waitingRevalidate);
}






public function __invoke(callable $handler)
{
return function (RequestInterface $request, array $options) use (&$handler) {
if (!isset($this->httpMethods[strtoupper($request->getMethod())])) {


return $handler($request, $options)->then(
function (ResponseInterface $response) use ($request) {
if (!isset($this->safeMethods[$request->getMethod()])) {

$response = $this->invalidateCache($request, $response);
}

return $response->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_MISS);
}
);
}

if ($request->hasHeader(static::HEADER_RE_VALIDATION)) {

return $handler($request->withoutHeader(static::HEADER_RE_VALIDATION), $options);
}


$reqCacheControl = new KeyValueHttpHeader($request->getHeader('Cache-Control'));
$onlyFromCache = $reqCacheControl->has('only-if-cached');
$staleResponse = $reqCacheControl->has('max-stale')
&& $reqCacheControl->get('max-stale') === '';
$maxStaleCache = $reqCacheControl->get('max-stale', null);
$minFreshCache = $reqCacheControl->get('min-fresh', null);


$cacheEntry = $this->cacheStorage->fetch($request);
if ($cacheEntry instanceof CacheEntry) {
$body = $cacheEntry->getResponse()->getBody();
if ($body->tell() > 0) {
$body->rewind();
}

if ($cacheEntry->isFresh()
&& ($minFreshCache === null || $cacheEntry->getStaleAge() + (int)$minFreshCache <= 0)
) {

return new FulfilledPromise(
$cacheEntry->getResponse()->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_HIT)
);
} elseif ($staleResponse
|| ($maxStaleCache !== null && $cacheEntry->getStaleAge() <= $maxStaleCache)
) {

return new FulfilledPromise(
$cacheEntry->getResponse()->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_HIT)
);
} elseif ($cacheEntry->hasValidationInformation() && !$onlyFromCache) {

$request = static::getRequestWithReValidationHeader($request, $cacheEntry);

if ($cacheEntry->staleWhileValidate()) {
static::addReValidationRequest($request, $this->cacheStorage, $cacheEntry);

return new FulfilledPromise(
$cacheEntry->getResponse()
->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_STALE)
);
}
}
} else {
$cacheEntry = null;
}

if ($cacheEntry === null && $onlyFromCache) {

return new FulfilledPromise(
new Response(504)
);
}


$promise = $handler($request, $options);

return $promise->then(
function (ResponseInterface $response) use ($request, $cacheEntry) {

if ($response->getStatusCode() >= 500) {
$responseStale = static::getStaleResponse($cacheEntry);
if ($responseStale instanceof ResponseInterface) {
return $responseStale;
}
}

$update = false;

if ($response->getStatusCode() == 304 && $cacheEntry instanceof CacheEntry) {


$response = $response
->withStatus($cacheEntry->getResponse()->getStatusCode())
->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_HIT);
$response = $response->withBody($cacheEntry->getResponse()->getBody());






foreach ($cacheEntry->getOriginalResponse()->getHeaders() as $headerName => $headerValue) {
if (!$response->hasHeader($headerName) && $headerName !== static::HEADER_CACHE_INFO) {
$response = $response->withHeader($headerName, $headerValue);
}
}

$update = true;
} else {
$response = $response->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_MISS);
}

return static::addToCache($this->cacheStorage, $request, $response, $update);
},
function ($reason) use ($cacheEntry) {
$response = static::getStaleResponse($cacheEntry);
if ($response instanceof ResponseInterface) {
return $response;
}

return new RejectedPromise($reason);
}
);
};
}








protected static function addToCache(
CacheStrategyInterface $cache,
RequestInterface $request,
ResponseInterface $response,
$update = false
) {
$body = $response->getBody();


if (!$body->isSeekable()) {
$response = $response->withBody(
\GuzzleHttp\Psr7\Utils::streamFor($body->getContents())
);
}

if ($update) {
$cache->update($request, $response);
} else {
$cache->cache($request, $response);
}


if ($body->isSeekable()) {
$response->getBody()->rewind();
}

return $response;
}








protected function addReValidationRequest(
RequestInterface $request,
CacheStrategyInterface &$cacheStorage,
CacheEntry $cacheEntry
) {

if ($this->client !== null) {

$request = $request->withHeader(static::HEADER_RE_VALIDATION, '1');
$this->waitingRevalidate[] = $this->client
->sendAsync($request)
->then(function (ResponseInterface $response) use ($request, &$cacheStorage, $cacheEntry) {
$update = false;

if ($response->getStatusCode() == 304) {


$response = $response->withStatus($cacheEntry->getResponse()->getStatusCode());
$response = $response->withBody($cacheEntry->getResponse()->getBody());


foreach ($cacheEntry->getResponse()->getHeaders() as $headerName => $headerValue) {
if (!$response->hasHeader($headerName)) {
$response = $response->withHeader($headerName, $headerValue);
}
}

$update = true;
}

static::addToCache($cacheStorage, $request, $response, $update);
});

return true;
}

return false;
}






protected static function getStaleResponse(?CacheEntry $cacheEntry = null)
{

if ($cacheEntry instanceof CacheEntry && $cacheEntry->serveStaleIfError()) {
return $cacheEntry->getResponse()
->withHeader(static::HEADER_CACHE_INFO, static::HEADER_CACHE_STALE);
}

return;
}







protected static function getRequestWithReValidationHeader(RequestInterface $request, ?CacheEntry $cacheEntry)
{
if ($cacheEntry->getResponse()->hasHeader('Last-Modified')) {
$request = $request->withHeader(
'If-Modified-Since',
$cacheEntry->getResponse()->getHeader('Last-Modified')
);
}
if ($cacheEntry->getResponse()->hasHeader('Etag')) {
$request = $request->withHeader(
'If-None-Match',
$cacheEntry->getResponse()->getHeader('Etag')
);
}

return $request;
}








public static function getMiddleware(?CacheStrategyInterface $cacheStorage = null)
{
return new self($cacheStorage);
}








private function invalidateCache(RequestInterface $request, ResponseInterface $response)
{
foreach (array_keys($this->httpMethods) as $method) {
$this->cacheStorage->delete($request->withMethod($method));
}

return $response->withHeader(static::HEADER_INVALIDATION, true);
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Kevinrob\GuzzleCache\CacheEntry;
use Psr\SimpleCache\CacheInterface;

class Psr16CacheStorage implements CacheStorageInterface
{



private $cache;

public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}




public function fetch($key)
{
$data = $this->cache->get($key);
if ($data instanceof CacheEntry) {
return $data;
}

return null;
}




public function save($key, CacheEntry $data)
{
$ttl = $data->getTTL();
if ($ttl === 0) {
return $this->cache->set($key, $data);
}
return $this->cache->set($key, $data, $data->getTTL());
}




public function delete($key)
{
return $this->cache->delete($key);
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Kevinrob\GuzzleCache\CacheEntry;

class Psr6CacheStorage implements CacheStorageInterface
{





protected $cachePool;









protected $lastItem;




public function __construct(CacheItemPoolInterface $cachePool)
{
$this->cachePool = $cachePool;
}




public function fetch($key)
{
$item = $this->cachePool->getItem($key);
$this->lastItem = $item;

$cache = $item->get();

if ($cache instanceof CacheEntry) {
return $cache;
}

return null;
}




public function save($key, CacheEntry $data)
{
if ($this->lastItem && $this->lastItem->getKey() == $key) {
$item = $this->lastItem;
} else {
$item = $this->cachePool->getItem($key);
}

$this->lastItem = null;

$item->set($data);

$ttl = $data->getTTL();
if ($ttl === 0) {

$item->expiresAfter(null);
} else {
$item->expiresAfter($ttl);
}

return $this->cachePool->save($item);
}






public function delete($key)
{
if (null !== $this->lastItem && $this->lastItem->getKey() === $key) {
$this->lastItem = null;
}

return $this->cachePool->deleteItem($key);
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Doctrine\Common\Cache\Cache;
use Kevinrob\GuzzleCache\CacheEntry;

class CompressedDoctrineCacheStorage implements CacheStorageInterface
{



protected $cache;




public function __construct(Cache $cache)
{
$this->cache = $cache;
}




public function fetch($key)
{
try {
$cache = unserialize(gzuncompress($this->cache->fetch($key)));
if ($cache instanceof CacheEntry) {
return $cache;
}
} catch (\Exception $ignored) {
return;
}

return;
}




public function save($key, CacheEntry $data)
{
try {
$lifeTime = $data->getTTL();
if ($lifeTime >= 0) {
return $this->cache->save(
$key,
gzcompress(serialize($data)),
$lifeTime
);
}
} catch (\Exception $ignored) {

}

return false;
}




public function delete($key)
{
try {
return $this->cache->delete($key);
} catch (\Exception $ignored) {

}

return false;
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Kevinrob\GuzzleCache\CacheEntry;

interface CacheStorageInterface
{





public function fetch($key);







public function save($key, CacheEntry $data);






public function delete($key);
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Kevinrob\GuzzleCache\CacheEntry;

class WordPressObjectCacheStorage implements CacheStorageInterface
{



private $group;




public function __construct($group = 'guzzle')
{
$this->group = $group;
}






public function fetch($key)
{
try {
$cache = unserialize(wp_cache_get($key, $this->group));
if ($cache instanceof CacheEntry) {
return $cache;
}
} catch (\Exception $ignored) {

}

return null;
}







public function save($key, CacheEntry $data)
{
try {
return wp_cache_set($key, serialize($data), $this->group, $data->getTTL());
} catch (\Exception $ignored) {

}

return false;
}






public function delete($key)
{
try {
return wp_cache_delete($key, $this->group);
} catch (\Exception $ignored) {

}

return false;
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Doctrine\Common\Cache\Cache;
use Kevinrob\GuzzleCache\CacheEntry;

class DoctrineCacheStorage implements CacheStorageInterface
{



protected $cache;




public function __construct(Cache $cache)
{
$this->cache = $cache;
}




public function fetch($key)
{
try {
$cache = unserialize($this->cache->fetch($key));
if ($cache instanceof CacheEntry) {
return $cache;
}
} catch (\Exception $ignored) {
return;
}

return;
}




public function save($key, CacheEntry $data)
{
try {
$lifeTime = $data->getTTL();
if ($lifeTime >= 0) {
return $this->cache->save(
$key,
serialize($data),
$lifeTime
);
}
} catch (\Exception $ignored) {

}

return false;
}




public function delete($key)
{
try {
return $this->cache->delete($key);
} catch (\Exception $ignored) {

}

return false;
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Kevinrob\GuzzleCache\CacheEntry;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\FilesystemException;

class FlysystemStorage implements CacheStorageInterface
{




protected $filesystem;

public function __construct(FilesystemAdapter $adapter)
{
$this->filesystem = new Filesystem($adapter);
}




public function fetch($key)
{
if ($this->filesystem->fileExists($key)) {

$data = @unserialize(
$this->filesystem->read($key)
);

if ($data instanceof CacheEntry) {
return $data;
}
}

return;
}




public function save($key, CacheEntry $data)
{
try {
$this->filesystem->write($key, serialize($data));
return true;
} catch (FilesystemException $e) {
return false;
}
}




public function delete($key)
{
try {
$this->filesystem->delete($key);
return true;
} catch (FilesystemException $ex) {
return true;
}
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Illuminate\Contracts\Cache\Repository as Cache;
use Kevinrob\GuzzleCache\CacheEntry;

class LaravelCacheStorage implements CacheStorageInterface
{



protected $cache;




public function __construct(Cache $cache)
{
$this->cache = $cache;
}




public function fetch($key)
{
try {
$cache = unserialize($this->cache->get($key, ''));
if ($cache instanceof CacheEntry) {
return $cache;
}
} catch (\Exception $ignored) {
return;
}

return;
}




public function save($key, CacheEntry $data)
{
try {
$lifeTime = $this->getLifeTime($data);
if ($lifeTime === 0) {
return $this->cache->forever(
$key,
serialize($data)
);
} else if ($lifeTime > 0) {
return $this->cache->add(
$key,
serialize($data),
$lifeTime
);
}
} catch (\Exception $ignored) {

}

return false;
}




public function delete($key)
{
return $this->cache->forget($key);
}

protected function getLifeTime(CacheEntry $data)
{
$version = app()->version();
if (preg_match('/^\d+(\.\d+)?(\.\d+)?/', $version) && version_compare($version, '5.8.0') < 0) {

return $data->getTTL() / 60;
}

return $data->getTTL();
}
}
<?php

namespace Kevinrob\GuzzleCache\Storage;

use Kevinrob\GuzzleCache\CacheEntry;




class VolatileRuntimeStorage implements CacheStorageInterface
{




protected $cache = [];






public function fetch($key)
{
if (isset($this->cache[$key])) {
return $this->cache[$key];
}

return;
}







public function save($key, CacheEntry $data)
{
$this->cache[$key] = $data;

return true;
}






public function delete($key)
{
if (true === array_key_exists($key, $this->cache)) {
unset($this->cache[$key]);

return true;
}

return false;
}
}
<?php

namespace Kevinrob\GuzzleCache\Strategy;

use Kevinrob\GuzzleCache\CacheEntry;
use Kevinrob\GuzzleCache\KeyValueHttpHeader;
use Kevinrob\GuzzleCache\Storage\CacheStorageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;










class GreedyCacheStrategy extends PrivateCacheStrategy
{
const HEADER_TTL = 'X-Kevinrob-GuzzleCache-TTL';




protected $defaultTtl;




private $varyHeaders;

public function __construct(
?CacheStorageInterface $cache = null,
$defaultTtl = 60,
?KeyValueHttpHeader $varyHeaders = null,
) {
$this->defaultTtl = $defaultTtl;
$this->varyHeaders = $varyHeaders;
parent::__construct($cache);
}

protected function getCacheKey(RequestInterface $request, ?KeyValueHttpHeader $varyHeaders = null)
{
if (null === $varyHeaders || $varyHeaders->isEmpty()) {
return hash(
'sha256',
'greedy'.$request->getMethod().$request->getUri()
);
}

$cacheHeaders = [];
foreach ($varyHeaders as $key => $value) {
if ($request->hasHeader($key)) {
$cacheHeaders[$key] = $request->getHeader($key);
}
}

return hash(
'sha256',
'greedy'.$request->getMethod().$request->getUri().json_encode($cacheHeaders)
);
}

public function cache(RequestInterface $request, ResponseInterface $response)
{
$warningMessage = sprintf('%d - "%s" "%s"',
299,
'Cached although the response headers indicate not to do it!',
(new \DateTime())->format(\DateTime::RFC1123)
);

$response = $response->withAddedHeader('Warning', $warningMessage);

if ($cacheObject = $this->getCacheObject($request, $response)) {
return $this->storage->save(
$this->getCacheKey($request, $this->varyHeaders),
$cacheObject
);
}

return false;
}

protected function getCacheObject(RequestInterface $request, ResponseInterface $response)
{
if (!array_key_exists($response->getStatusCode(), $this->statusAccepted)) {

return null;
}

if (null !== $this->varyHeaders && $this->varyHeaders->has('*')) {

return;
}

$response = $response->withoutHeader('Etag')->withoutHeader('Last-Modified');

$ttl = $this->defaultTtl;
if ($request->hasHeader(static::HEADER_TTL)) {
$ttlHeaderValues = $request->getHeader(static::HEADER_TTL);
$ttl = (int)reset($ttlHeaderValues);
}

return new CacheEntry($request->withoutHeader(static::HEADER_TTL), $response, new \DateTime(sprintf('%+d seconds', $ttl)));
}

public function fetch(RequestInterface $request)
{
$cache = $this->storage->fetch($this->getCacheKey($request, $this->varyHeaders));
return $cache;
}




public function delete(RequestInterface $request)
{
return $this->storage->delete($this->getCacheKey($request));
}
}
<?php

namespace Kevinrob\GuzzleCache\Strategy;

use Kevinrob\GuzzleCache\CacheEntry;
use Kevinrob\GuzzleCache\KeyValueHttpHeader;
use Kevinrob\GuzzleCache\Storage\CacheStorageInterface;
use Kevinrob\GuzzleCache\Storage\VolatileRuntimeStorage;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;












class PrivateCacheStrategy implements CacheStrategyInterface
{



protected $storage;




protected $statusAccepted = [
200 => 200,
203 => 203,
204 => 204,
300 => 300,
301 => 301,
404 => 404,
405 => 405,
410 => 410,
414 => 414,
418 => 418,
501 => 501,
];




protected $ageKey = [
'max-age',
];

public function __construct(?CacheStorageInterface $cache = null)
{
$this->storage = $cache !== null ? $cache : new VolatileRuntimeStorage();
}






protected function getCacheObject(RequestInterface $request, ResponseInterface $response)
{
if (!isset($this->statusAccepted[$response->getStatusCode()])) {

return;
}

$cacheControl = new KeyValueHttpHeader($response->getHeader('Cache-Control'));
$varyHeader = new KeyValueHttpHeader($response->getHeader('Vary'));

if ($varyHeader->has('*')) {

return;
}

if ($cacheControl->has('no-store')) {

return;
}

if ($cacheControl->has('no-cache')) {

$entry = new CacheEntry($request, $response, new \DateTime('-1 seconds'));

return $entry->hasValidationInformation() ? $entry : null;
}

foreach ($this->ageKey as $key) {
if ($cacheControl->has($key)) {
return new CacheEntry(
$request,
$response,
new \DateTime('+'.(int) $cacheControl->get($key).'seconds')
);
}
}

if ($response->hasHeader('Expires')) {
$expireAt = \DateTime::createFromFormat(\DateTime::RFC1123, $response->getHeaderLine('Expires'));
if ($expireAt !== false) {
return new CacheEntry(
$request,
$response,
$expireAt
);
}
}

return new CacheEntry($request, $response, new \DateTime('-1 seconds'));
}









protected function getCacheKey(RequestInterface $request, ?KeyValueHttpHeader $varyHeaders = null)
{
if (!$varyHeaders) {
return hash('sha256', $request->getMethod().$request->getUri());
}

$cacheHeaders = [];

foreach ($varyHeaders as $key => $value) {
if ($request->hasHeader($key)) {
$cacheHeaders[$key] = $request->getHeader($key);
}
}

return hash('sha256', $request->getMethod().$request->getUri().json_encode($cacheHeaders));
}








public function fetch(RequestInterface $request)
{

$maxAge = null;

if ($request->hasHeader('Cache-Control')) {
$reqCacheControl = new KeyValueHttpHeader($request->getHeader('Cache-Control'));
if ($reqCacheControl->has('no-cache')) {

return null;
}

$maxAge = $reqCacheControl->get('max-age', null);
} elseif ($request->hasHeader('Pragma')) {
$pragma = new KeyValueHttpHeader($request->getHeader('Pragma'));
if ($pragma->has('no-cache')) {

return null;
}
}

$cache = $this->storage->fetch($this->getCacheKey($request));
if ($cache !== null) {
$varyHeaders = $cache->getVaryHeaders();


if (!$varyHeaders->isEmpty()) {
$cache = $this->storage->fetch($this->getCacheKey($request, $varyHeaders));

if (!$cache) {
return null;
}
}

if ((string)$cache->getOriginalRequest()->getUri() !== (string)$request->getUri()) {
return null;
}

if ($maxAge !== null) {
if ($cache->getAge() > $maxAge) {

return null;
}
}

if (!$cache->isVaryEquals($request)) {
return null;
}
}

return $cache;
}







public function cache(RequestInterface $request, ResponseInterface $response)
{
$reqCacheControl = new KeyValueHttpHeader($request->getHeader('Cache-Control'));
if ($reqCacheControl->has('no-store')) {

return false;
}

$cacheObject = $this->getCacheObject($request, $response);
if ($cacheObject !== null) {

$success = $this->storage->save(
$this->getCacheKey($request),
$cacheObject
);

$varyHeaders = $cacheObject->getVaryHeaders();

if (!$varyHeaders->isEmpty()) {

$success = $this->storage->save(
$this->getCacheKey($request, $varyHeaders),
$cacheObject
);
}

return $success;
}

return false;
}







public function update(RequestInterface $request, ResponseInterface $response)
{
return $this->cache($request, $response);
}




public function delete(RequestInterface $request)
{
return $this->storage->delete($this->getCacheKey($request));
}
}
<?php

namespace Kevinrob\GuzzleCache\Strategy;

use Kevinrob\GuzzleCache\KeyValueHttpHeader;
use Kevinrob\GuzzleCache\Storage\CacheStorageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;












class PublicCacheStrategy extends PrivateCacheStrategy
{
public function __construct(?CacheStorageInterface $cache = null)
{
parent::__construct($cache);

array_unshift($this->ageKey, 's-maxage');
}




protected function getCacheObject(RequestInterface $request, ResponseInterface $response)
{
$cacheControl = new KeyValueHttpHeader($response->getHeader('Cache-Control'));
if ($cacheControl->has('private')) {
return;
}

return parent::getCacheObject($request, $response);
}
}
<?php

namespace Kevinrob\GuzzleCache\Strategy;

use Kevinrob\GuzzleCache\CacheEntry;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class NullCacheStrategy implements CacheStrategyInterface
{




public function fetch(RequestInterface $request)
{
return null;
}




public function cache(RequestInterface $request, ResponseInterface $response)
{
return true;
}




public function update(RequestInterface $request, ResponseInterface $response)
{
return true;
}




public function delete(RequestInterface $request)
{
return true;
}
}
<?php

namespace Kevinrob\GuzzleCache\Strategy;

use Kevinrob\GuzzleCache\CacheEntry;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

interface CacheStrategyInterface
{







public function fetch(RequestInterface $request);







public function cache(RequestInterface $request, ResponseInterface $response);







public function update(RequestInterface $request, ResponseInterface $response);






public function delete(RequestInterface $request);
}
<?php

namespace Kevinrob\GuzzleCache\Strategy\Delegate;

use Psr\Http\Message\RequestInterface;

interface RequestMatcherInterface
{





public function matches(RequestInterface $request);
}
<?php

namespace Kevinrob\GuzzleCache\Strategy\Delegate;

use Kevinrob\GuzzleCache\Strategy\CacheStrategyInterface;
use Kevinrob\GuzzleCache\Strategy\NullCacheStrategy;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class DelegatingCacheStrategy implements CacheStrategyInterface
{



private $requestMatchers = [];




private $defaultCacheStrategy;




public function __construct(?CacheStrategyInterface $defaultCacheStrategy = null)
{
$this->defaultCacheStrategy = $defaultCacheStrategy ?: new NullCacheStrategy();
}




public function setDefaultCacheStrategy(CacheStrategyInterface $defaultCacheStrategy)
{
$this->defaultCacheStrategy = $defaultCacheStrategy;
}





final public function registerRequestMatcher(RequestMatcherInterface $requestMatcher, CacheStrategyInterface $cacheStrategy)
{
$this->requestMatchers[] = [
$requestMatcher,
$cacheStrategy,
];
}





private function getStrategyFor(RequestInterface $request)
{




foreach ($this->requestMatchers as $requestMatcher) {
list($requestMatcher, $cacheStrategy) = $requestMatcher;
if ($requestMatcher->matches($request)) {
return $cacheStrategy;
}
}

return $this->defaultCacheStrategy;
}




public function fetch(RequestInterface $request)
{
return $this->getStrategyFor($request)->fetch($request);
}




public function cache(RequestInterface $request, ResponseInterface $response)
{
return $this->getStrategyFor($request)->cache($request, $response);
}




public function update(RequestInterface $request, ResponseInterface $response)
{
return $this->getStrategyFor($request)->update($request, $response);
}




public function delete(RequestInterface $request)
{
return $this->getStrategyFor($request)->delete($request);
}
}
<?php

namespace Kevinrob\GuzzleCache;

use GuzzleHttp\Psr7\PumpStream;
use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class CacheEntry implements \Serializable
{



protected $request;




protected $response;




protected $staleAt;




protected $staleIfErrorTo;




protected $staleWhileRevalidateTo;




protected $dateCreated;






protected $timestampStale;








public function __construct(
RequestInterface $request,
ResponseInterface $response,
\DateTime $staleAt,
?\DateTime $staleIfErrorTo = null,
?\DateTime $staleWhileRevalidateTo = null
) {
$this->dateCreated = new \DateTime();

$this->request = $request;
$this->response = $response;
$this->staleAt = $staleAt;

$values = new KeyValueHttpHeader($response->getHeader('Cache-Control'));

if ($staleIfErrorTo === null && $values->has('stale-if-error')) {
$this->staleIfErrorTo = (new \DateTime(
'@'.($this->staleAt->getTimestamp() + (int) $values->get('stale-if-error'))
));
} else {
$this->staleIfErrorTo = $staleIfErrorTo;
}

if ($staleWhileRevalidateTo === null && $values->has('stale-while-revalidate')) {
$this->staleWhileRevalidateTo = new \DateTime(
'@'.($this->staleAt->getTimestamp() + (int) $values->get('stale-while-revalidate'))
);
} else {
$this->staleWhileRevalidateTo = $staleWhileRevalidateTo;
}
}




public function getResponse()
{
return $this->response
->withHeader('Age', $this->getAge());
}




public function getOriginalResponse()
{
return $this->response;
}




public function getOriginalRequest()
{
return $this->request;
}





public function isVaryEquals(RequestInterface $request)
{
if ($this->response->hasHeader('Vary')) {
if ($this->request === null) {
return false;
}

foreach ($this->getVaryHeaders() as $key => $value) {
if (!$this->request->hasHeader($key)
&& !$request->hasHeader($key)
) {

continue;
} elseif ($this->request->getHeaderLine($key)
== $request->getHeaderLine($key)
) {

continue;
}

return false;
}
}

return true;
}






public function getVaryHeaders()
{
return new KeyValueHttpHeader($this->response->getHeader('Vary'));
}




public function getStaleAt()
{
return $this->staleAt;
}




public function isFresh()
{
return !$this->isStale();
}




public function isStale()
{
return $this->getStaleAge() > 0;
}




public function getStaleAge()
{

if ($this->timestampStale === null) {
$this->timestampStale = $this->staleAt->getTimestamp();
}

return time() - $this->timestampStale;
}




public function serveStaleIfError()
{
return $this->staleIfErrorTo !== null
&& $this->staleIfErrorTo->getTimestamp() >= (new \DateTime())->getTimestamp();
}




public function staleWhileValidate()
{
return $this->staleWhileRevalidateTo !== null
&& $this->staleWhileRevalidateTo->getTimestamp() >= (new \DateTime())->getTimestamp();
}




public function hasValidationInformation()
{
return $this->response->hasHeader('Etag') || $this->response->hasHeader('Last-Modified');
}










public function getTTL()
{
if ($this->hasValidationInformation()) {

return 0;
}

$ttl = 0;


if ($this->staleIfErrorTo !== null) {
$ttl = max($ttl, $this->staleIfErrorTo->getTimestamp() - time());
}


if ($this->staleWhileRevalidateTo !== null) {
$ttl = max($ttl, $this->staleWhileRevalidateTo->getTimestamp() - time());
}


$ttl = max($ttl, $this->staleAt->getTimestamp() - time());


return $ttl !== 0 ? (int) $ttl : -1;
}




public function getAge()
{
return time() - $this->dateCreated->getTimestamp();
}

public function __serialize(): array
{
return [
'request' => self::toSerializeableMessage($this->request),
'response' => $this->response !== null ? self::toSerializeableMessage($this->response) : null,
'staleAt' => $this->staleAt,
'staleIfErrorTo' => $this->staleIfErrorTo,
'staleWhileRevalidateTo' => $this->staleWhileRevalidateTo,
'dateCreated' => $this->dateCreated,
'timestampStale' => $this->timestampStale,
];
}

public function __unserialize(array $data): void
{
$prefix = '';
if (isset($data["\0*\0request"])) {

$prefix = "\0*\0";
}
$this->request = self::restoreStreamBody($data[$prefix.'request']);
$this->response = $data[$prefix.'response'] !== null ? self::restoreStreamBody($data[$prefix.'response']) : null;
$this->staleAt = $data[$prefix.'staleAt'];
$this->staleIfErrorTo = $data[$prefix.'staleIfErrorTo'];
$this->staleWhileRevalidateTo = $data[$prefix.'staleWhileRevalidateTo'];
$this->dateCreated = $data[$prefix.'dateCreated'];
$this->timestampStale = $data[$prefix.'timestampStale'];
}

/**
@template





*/
private static function toSerializeableMessage(MessageInterface $message): MessageInterface
{
$bodyString = (string)$message->getBody();

return $message->withBody(
new PumpStream(
new BodyStore($bodyString),
[
'size' => mb_strlen($bodyString),
]
)
);
}

/**
@template



*/
private static function restoreStreamBody(MessageInterface $message): MessageInterface
{
return $message->withBody(
\GuzzleHttp\Psr7\Utils::streamFor((string) $message->getBody())
);
}

public function serialize()
{
return serialize($this->__serialize());
}

public function unserialize($data)
{
$this->__unserialize(unserialize($data));
}
}
<?php

namespace Kevinrob\GuzzleCache;

class KeyValueHttpHeader implements \Iterator
{



const REGEX_SPLIT = '/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\\\]|\\\\.)*)\")))?/';




protected $values = [];




public function __construct(array $values)
{
foreach ($values as $value) {
$matches = [];
if (preg_match_all(self::REGEX_SPLIT, $value, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$val = '';
if (count($match) == 3) {
$val = $match[2];
} elseif (count($match) > 3) {
$val = $match[3];
}

$this->values[$match[1]] = $val;
}
}
}
}






public function has($key)
{


return isset($this->values[$key]) || array_key_exists($key, $this->values);
}






public function get($key, $default = '')
{
if ($this->has($key)) {
return $this->values[$key];
}

return $default;
}




public function isEmpty()
{
return count($this->values) === 0;
}







#[\ReturnTypeWillChange]
public function current()
{
return current($this->values);
}







public function next(): void
{
next($this->values);
}








#[\ReturnTypeWillChange]
public function key()
{
return key($this->values);
}








public function valid(): bool
{
return key($this->values) !== null;
}







public function rewind(): void
{
reset($this->values);
}
}
<?php

namespace Kevinrob\GuzzleCache;







class BodyStore
{
private $body;

private $read = 0;

private $toRead;

public function __construct(string $body)
{
$this->body = $body;
$this->toRead = mb_strlen($this->body);
}





public function __invoke(int $length)
{
if ($this->toRead <= 0) {
return false;
}

$length = min($length, $this->toRead);

$body = mb_substr(
$this->body,
$this->read,
$length
);
$this->toRead -= $length;
$this->read += $length;
return $body;
}
}
PNG

   IHDR       lC   sRGB     IDATx^	]U6ޚSS2N`EI7bCkjZ¶VID[@D,V;Alhp
ضQ0n?۶( *LǚܐJjz=:syZZ{^d2_΀38΀384e wFrgpgp8΀38΀300)x{{{qOgAww7闕UWW#	~K_%K𫲲ҊK6-3+bʕhhh^:>Nd<w+Vj8\{>vɇ<kBر> q㡇*[h3fXgy&.\	կ܌M6MԪU҂)pw+#6Z3v9C^dͪ}pwE.g:,:sqꩧgׯGSSS𭭭hll(=
f0-Vq%+gcزC"%xك{'xmܸ139Νd@o&,^V0Hj8YɢqFh>/DQ!O>$o/e{I'X_.][n5̼>lgHw3mTD \":W:oeP[[.LaOٝmYZb	V0gTn8\Fj3wPtHAp7nmGGqq1.\y~Ȁ"ZlrzwQOH71\xwpCBWU~ٳ8_5kn:5*V^kת1|20=F9ψ8ߏG]0U.	Mr-ؕOU~{e֐|rlٲE͒e˖ajxL b6Ln3bd3ιd8:v!t]+/-dM7݄h5HJh]Rzt£6Ln3bd3ιdw!Zp8a}{}*-o	D^*<k DBd2 dΰ1bO8]D_Ch?q vzs_Wmo{[`rZ`r](1\~.E}sCL0tE~_N-󴖱ʺ6_ÛgRxc乤Gȥ(uCt',4Q7p>Oōg>\{ʨхcT`e2wҠq^	#:ֹ͝X:DU~ӟ_67ޞ2]w$qgZ9䌟ës#%<$F.Eqs7Bc5IVH6ƹw+gN8VdB0bUzCQwpFA;\p"b4\_hfVY3v9됨DBMݰa?|]-2yhhh=,C֯_[[[ؘ|BMVĳ2bTHm! }-$9*Z&#7b7w+QK๤>u-uH\YSC,x|s۳`G?Q,镯eiӦ)YjZZZP__?n`nB|F+|8Rؾ	¶IJ^Tu9Z-.dG#(+er`Gw(kw+a8Fh]Sa|uHւWjR؍J7?3̝;7x͛7oO+!߳gvލ#{/~ӟF)',:`GD7VraL+	]d-x/RH%B^"r;<s98iJ(m?s{p]w\J[o5jTmߝB2`%vZ,d~d6l^!۳Ad%xo\~幱S/ފ=D?_)m۶8r7.+HFӦ鍛aJ3촂i%|됰:$c~uYx'Be;-tݢEBm;ʍm߾=i-]d	~_`(:mt8U {cJ3촂YȲaYCr5P	' UP¾ۇ탷dÀgi3x^a:$L3oˊHʬʧ0._}F7%>oo]0^3L.-XyV0md3,]tD]d$xeݮ	+nݺ0m^7xc(:^Y%WX\{{=ZL$*(VraV'd(L]t(ʪ)|rg`dd$+s<>O?s_O~Iqq1z
/YFÐtʵky\;3L+c#Fa:$pEQL)xRrg]Lx@
sF~زeK˖-͛fJ3.;QXYT>ngg'd2Iŏ3x"_[[tIv\ڒgZTNc綖O<Nvg`ZC1
w!ǾIoss3>QٖR/RꫯFKKǁ#P?lgؙm>jea(]ΔƢC&Rbկ~5vA!@@F2qF5pB׿J:3/3LN{z3`%v2fcarjd9#Fl]hD>Q!
o~iL}_UW]Ew|+_G?Q-7/נQqiˀg)A5z͈{G:dB+3Ў9	\rIPqL3/˻8eJ3씨)z͈!z
R!uȸiFG*ɧB/LwRP9Z>o۶>SO=-ϑӖ+9ϰS6#Fsx]>JH!
^٨&~fiFٸ&ؘJAL^{2`%vZ}>Ya1[xBq/ΊS5 k_ڠ0^ɍcOO<N+V2'w!,f[(r}p	'P]
Y2?]=8㳶)֯_lsokk+s~tfJ3촂vN\m9!ڌF:oox{ޣΎS3 w]_uζe`Lƀgi3j93=>5}wf4
Cq73䳻tu-Ӈ9YkiӦ)YjUP~{g XyV0;GSw!ZLF'lr]t)#h_&3Ԇux!kn/[nՆOvoذmmm.RTK+Wġ:9N,iJ2w!2huۋ*uDjncHTwYQ$ӃJmPoL);߭`Z3v2|O?r{<kU<N?tudZ4h].xu)G=xk^cd(Zv20[gdnS`)x!cwމwLI'W'|'|(p9v20[gdnSb)x!cg?Y\{,vULztJ%#Lp5hBұr}SI6L;߭`Z3v2|ُ\hbaX:d袋pw2ĨW/Dj6^x!nv=#Hv20[gdnSfTO[C׿Nw[o%\		ztvmK dgL0FM&LV0g;[GCa13΀l8Ҽ.]҄t}wy6>>C,0Y!_h];ژcV8Y%+vJhw+a*kްtWL>Ӽ|WMїOԚl~	IZf֭[z Ksڵj6:$@F;
&#FCH"K-;i{1r).xoSO=U!e-\˗/ǖ-[L]lYyf5@q]L #FVrɊn#!DV[C^NݭH{n̝;W{y TWW,\JKT3ξIdJ.Y߭`2b:4(jްtHv*
;Z%qKLF;qi%FV2pt]KGqv2e̠1fg3)qKLF;
&#FqC0DLF$/hI1˚h:A(dg;
&#>=a]a`X!.x6&"P]bҠ&9\:>
#?|NF%QtZ§/iЉwP&Za9Ҥ.{Th1KVdw+dUoskV-4ǵ$ξG9'#qL\rͨ>UW?VJJqY/<&1bg;[%ڌY!.xsh5Ѩ(_MMM9#q̜ALV0g;[G.x5`Y!.x9@Ch4Bs}sOb`*|a'L+|NV0^-&y8Vu^^NP&|܌M6Mj*~{S;96mgdnS`aU:DS'(7l؀6ttte]]V\dCɠa'L+|NV0G.xa/gZ+VM rX;23c|Y:o8֊DS#V2fI38 +vZ.x5XbX!.xyn5ԉp@g@+v*Q8ag1HNZLp [M4
@B*lX1̓qggL+1Ҵ&,:/'hVF;92``9R6c;i%FvfTϪqTDF%RagtM8cNIx70Iqͨ>UW?VJ;Y2 ;WXSfeBRdJvͤ:oa&֭&Z֎ 5k`ݺuj-^:vZ5@qw+1bW{Z!.xSh5Ѹ83˗/ǖ-[{h-[͛NřOFܭĈa^hUUO.D@v.'N-ęOFܭĈa^hUUO.D@v0Tpw[C
P[#Ro!%6&Z.΀:qdřO힌V7uYh;]rl5(d83#q^sXwg>%n[N9j!>fU1I4h;3@O`쬏3ڧsXNZǪq	
D@X٩qSRPe+1b7A-Ǭ!&FSVMwp4`TcˊV#m;]j3gU*D@WҥKsxr#[nE}}}V0vz +[Jtͨ>UW?VJ;92~z4554ڊ1[I;HNlr|ZM4!@g<6
fԍ߭i%FZvbcUjQpPg@6mqժUhii9a`Np7X݊9`GOh7̀bU-pdۼDO(rֆTʕ+Ѐlw[dmw+vZQ>v͇pC\jXM45bY1:!V0u1Y5]ƗfUedj1(Wr_t>uYfiSIOQnhVu^F61&6%'6Zs>u
.<4<ku^X3Ьl bZM4MJr6L^N+XΧn|Zeg.r}woUₗDLE	x-,8QciSIO|wsUₗDLE	,mqOݨ1$'Z]dՍ9ͪq"DӠDvXB*hoo)# |Xlje>s4FNT{͛[hY;:k֬u4իWcڵjxրO݈1si1b#|2Ьl bZM4J/_-[h@˖-͛9c)j<J?b}G.xudY!.x@Ĵh.٩gOP;V#Fn?r'ͪq"DӠ@kΧ.>u-1%ﺑ#L9h;^Veiݘ;w*&U`ډg̛7OjYqqQ!0SUXraD_Ӫ#x-Z;v2cSNQtGo[zz .\۷b
Xߩ|SO1ꅊ#_ëAr'M[CW~3\Rmmmx_O~;ULku2OuJ)F)zbOiЋ 品-x!cg~Xz׻T1]w O?=*Mu2OuJ)F9zbՋ 品-x!cּnV\r%pGm݆K/TfefqY|2
.<4<ku-:D74m#x/"qꫯVtG>9477qb,Ԃ8Nu>ueiSIO|wsKgqת7W7MOn5\y$Ԕ3~kk+s~~=|FL]&yh>y"Gw!fiްt{w~:?>,N<D5\:T>sxK^v=aMOFԎg?iFw$(M#xy`ÑuM7C^*+;E6>5Q=P6mUVAOyo\op>u#
.<4<ku834o:dEUU:?\ꄈ5XӃJ#3@6l6\vttE/򺺺`]CC]-Χ.>`2CcɳV9jэ/MSC^!fٲe#*1#qYX9EL̓&ԟlcƧvoddNfɗAχC/}Kl]wu?뀹1 s{x>qd|d
fddNC6N:{=sUgiŐR6Я2 emq9dp
fddNC4ٌ&V!$    IDATt1wǎ4Q*j^fz*,2˚m$^paa̡\ M{kS>°9#8H?Lm]h3=Bc"|~_3䳼fTuYg]^v20[3\bd:j4pCi}-oafFbT-FM&LV0'w&#v20-W>c8(,/֌@ĀG}zjFD&^b96&X8p2#F\bX%!^UxBqPw7n#e_2 tovJ2s]f֭[ի,m̵kת٘d 1b}7u:v.abRL(xo/1sWX؍7HYrZr~\ژrgߵd1b%߽onQu\rH ZL(xكWՐݒ<>O_O~Ƈ_sΥ*i]RM.mN-wu2I1r>wc;\0zVa0C&BIssspyI9س>Dx.꫃k/+e5K9g߭*#F\ba'8~t\06\̨IO>ec3N'tRtI2Eҝ2f%Yϵen%?:DG'*:dR+\COpf-wtt`ɒ%tuk$,_w^wzPR;g}/\hpqCrP򎌌Й]߯5dw+*..fwM}'m	*h	Oz-
[8>^UDQL)x/rK(L}_UW]J[ӱ|+G?k]vnPb5g})qp1+q<;UV3ξOCC4{+:$#+l,B> hѢPڛaR_z(̞=;(?Ʋ	CCL;߭`ƙOLF.1d`2|uHXLNuHFWg^&K/u;IIz뭁ݶm[өD4<3et;NfFLӛ'w&#v20O:$L3oˊXʧ0/]kdVWfwew\R)gwZ[[!d98Ƀ;߭`ƙOLF.1d`2|uHXLg֎5e)ĕo}[qgH??B=yY+wەxb7;N&w+q;K;tcUd%x}Ybpmq"|/BfCCxwBW%\,|'oڴiJWZܘ
pNfMG'w&#v20:$,_lg:萬 qZb׼y!%wލ#?я ;vp-o	)++9T6@*YR*XYRvg`2H`dn3|2|g`2ra'C8Ow@d>S5r^fev;uSt>>2Bd".QDW$xǁ+})g|%vꦍ|N@ˍ3CrSꐜ&GaɚN7f[eeӅ۩5Χm('{=?3eJ>!z\FIC%xnԧ̓ۖgp恠ho*iKzt;uc|:0},kVQ6v[!y^.à˦Q,.atS7O3n:i*{~ÞγCtxQ.z"ۣd["Ҙnf̇Yӻq| &}FmV.z+7k5+};	6r\9'd+joohLw;3a){̹N32̜0t6:DU
rvg[0pwgFZf֭[fիvZ54۩K|j0k!,C%I-,_/_[lтòe˰yf5<N$+|jyWpq:"x9+JNa7tS=ڙڠ%:;;㸝:ΧmNcd	^F*JbnlK`Qv4DBd2vR|:Zxb2SB!|2!T+Hkrh_b@-++aX3}ar>O|̩Gca4%rnF<:,9J,YW^y%.천1
5hnnv8ΧfXO:nv؅!	^bWW̞=;![|nĜOS?VFNN:!
42+W9^\\@Į|zys>O<k?\#p.Q!i㷾-|ߦ7kMl>jY0=Fl;g>x{ޏɢ>:tHAo'|2ڱc/\0:餓^^7Χ[n~':>kO]3CsOE	&pϞ={yv2s9kܹף)9?ngLevO|fTf9\(H	#i~pwe~ON;sqꩧNcOǺKXb7m۩ΧgJ?&֌{]dƪY{$/ڂ< Z&W}}=>l\2xq"ȃflڴiJdaKK׉p;OV78Y5eu]fnvbۋ/m3Ϡ;(=+?/+./NU;RhviR7]>I^H|(hhh^왨!S7Χ=ҏTu.aaměƛ %LL8g>qwLg bTܦ1: a';;3ξǙOF2.x-T9Rv203030{d137rBa 7qg`2`ddqwt,0BF*v203030{d1+) ,(A N&w&wf}3;3`V"vR+VPnoo1Ǫwg>C1.xY:	֬Yu֩ٺz Ksڵj6: ̧7c93b/Y5˱e5[-[`icn޼Y4P}W'@{&ca#tXe1&*i]RM.mN-wu2ęO+ǹo2F?rLgŀ^kD"ad2ng}W'@;#V&NpbqM0`ef1;gg>3wLg.xmɭ$1`e!c]}gS=c93b/Y5qqӊC1.xY:	8C3ξ33|Z]3c93b/Y5 A(N&w&wf}3;3`V"vկ~K捿uV8̼a';;3ξǙOF^+r;_MMM9ڊ130s6pv203030{d1%1r}Of`2`ddqwt΀ިG6mUV2``Ni\70d`ZAadð
>v:3e\F9:n[]6l@[[:::RR6+WDCCdİg'#Di%x<h1|g`2:;nOV0N+\rߣπ]wH3B2$9Ű
>v20=_v\biJ|#FL+q7/x;iw+|2촂i%vZd}<ٟp4foVM\,MfX3촂H\;q=|2nJ|u0+x|x8w&YӊVdiJ.1촂%=xu6#nVƹ<$w&#yiw+|2촂i%vZd}<S9Uxύ7NuM
^b
=#2ia;3#
'L|+ӊޏq?#?}qw͚5XnZW^kת᥁v
L+|2TO$ Vr߽12?d#{uݸ]|9l٢e˖ajxi ;
;	\biwG̏>&#?}q7.xkkkWZTԂ;ðS}g`Zaz"K>d'1tߣC<o"Pa2Tdةn$	
;Z%V|g
;|20iO]7<|frO;HLO.=qgd'#v23|>ëѧX߲OkeN	b kucQc}
;O+|ﾆWO^lrP\~JFXsX7J.1v[7ɰя§4hދM
^+g1sx5eƢX%V|gM+|2d#&#?9}UaZ,i'T8aiS#a';3ξǙOFܭ`Z;OV1w30+5vZXG0|gdqw+V}_7[nE}}}8aXY+]~=rqkk+s~>vZ̔lcM;N+VdiK{G_ȴG%vD)&
&cbΰg'#V0ĝ[=P֛ikiVZ|}
&1|gdqw+V}sܧMPvnذmmmJʁuuuXr%ݯ;`2:wL8g>qi%>8ƽ`Jp;B31ruX̧nYLLqƌzBVp;_ƙO^C#i%F
^+NFb9F8+yhVb`;;{1HMi2v2W31r߳!qSWЬĈ w&w&8cZQPNFb9FqSWЬĈ w&w&8cZёv"xs;)S;8Uɱ7nn3S[/LLqƴPX\b7픣Nр#!5;q䡕gtz]}J[%V0u5k`ݺuj9zj]V/vS	qGq;; +݊Vr>|2b:˱e^l6oެr;)Us̸#8Knw+9g>1b`Z肷6xuIN-8n:q~qI߭n%'#FLc]&	M&n:q: #L+|2di[agsLFtkSS:wY|+w+9g>1b`Z:,1b9F¤'g>t"3J⻕310cH.xu;Ì.fc$L):$'ęOkȌE߭n%'#FLF^+g)aF31&^|'MȌE߭n%'#FLF^!Q)NqMGV'g<LLqƴ#E2M3v;b9FҼi֭pgD`%F:3030JBԔ3GhllLt;3ep9Fg>׃kJ*303w1|3&#>v2Ûn,WGn'#}9q%={;g>9SJ=}h:|d<JPokfl4z<Ysr+HaWnggVc!q3W'Ĉw&w&8cZQ7M۰aMuuuXr%	m`l8}Cg=7(7&;;{1i%xhqqwFpgJq=ti]kp<{88a11q=TX0Ècd`2|3&#F83X8g%BNv:fbw:Ɉc:@0ƺoZcn 3\rLg 0:q3ξKƹ>sSn^uc@Qsi;@a`KOlg}UN+Vo{{{:Z3
eºnLrql'C/Y}w͚5XnZ_zu:Zsڵ:NQ<uᝁ1=v2˱elٲ 1u(͛u&xw+q';c11{d%1ڠ%rLF-٩4s^[;9l'C/Y]&uR7&d҄aw]>l'#ƈ.xXSwV'S%c0%+qgc:Qf11{^F肗v&1u]2dbx撕3r1(3=vZy/#Ft)StA?A#Q<rDg z0:' hD'C/Y]2ο 9sxux<s*Gt czƫFt|2ͨᘺ̬1aO+v3opg1doO8~df"xus=|;n݊.+|tH VbgHafg KcH&dt{팳^iphjj(1ǻc3$
AO9|ޜ3d c˰nq=$˕Įc!b:(W=gCM;$0:q3ξK.*xAZonnƦMSA]jZZZ>Q;f<dLOd1g c]Vg;{7zqÆhkkCGGGP*Xaʕhhh@;3|2Dn~2b΀3?.Eq}Z	^qdywLgp 
&#q=ttF:2d`zh΀3Di8iu>ueќg&
&#"q]MJt:av;uYnp`V0gX8f#릯}>HIGsg ;!ξF(馰}>HIGsg ;!ξ*xe'+bޞqe4vfRęOaBgMpp`w0dfGf+|2|?5knݺL=Wڵk37lؚ8)Xw8΀3.Ƙm]|9l٢c-[͛7᥁N]Jn>    IDAŢ0i!u#h΀3 㽃1&30h+.xkkk*jZTcԂ;vRg>I9qhɔQ =c;S+$+;?Ą{cLf`Z6V|]&|2yJq p;ɔbw]&i1B3TL 9$ ! 1
00$Sʿɳ"h%!C$K[C~?K@@1 >|D)[qgtuG`siʾï@2E@(P8N0;gE0de|Z)̾OAXL*F .` 0ݕs/7ڛz7q+E@\dTx!P2t	Prh|?Ipec2ӊf{肗:3k^L?= COiݚL#|Ct  %:l)P(?#1ѱ-)V4CVv2<C:Y,Oi=00k~
H<Afgr1,ZL5@i@")04cLf`ZV|]2΀cvꎰqS9#s@@fs;dn29Z<(eMj|D<2 VC ƙO+qYpFN`t_0301  JOvb cq}?Oz	iQǙn.qӊYE\6ut~sԃfg Gz	nJ-k2?`2gCԔs,[[[ؘ>vfTfřO+O?9./g`n끙*^
nÌ
&83tcu;,;!Vr~#{W=?0IGurahP/wȅ?0O+w3T+zss36m4e<WZOyn.qӊc">w5CEtќ5n HT:P4`V0t e'ֆʕ+ Ǝl̖3V|G #uh Ӏ_bb1~ZdPG&x+1b0]vB;3RxǁWEaj1*)y4}Z^}}hGN10u干@7_ވ:!1Pu>pR%CVvߣK/c6h.&#FL]?~?WR04f!L_p߳?-+<0-xsM4ad.#FL=!%m
lVv@gXxwz100Pg/vK\2+x)3v;b2b@u!s::a@fz}ЙjJCcsJG"r4Hlݺ fm! Q*O#qN10uN[:3EO(]EƵ100O}Tb7n8mI+;+WXFj{{;4S-D4 Fg72ˁ#@?YqQ865k֬u2uF^k׮lnr;a02b$D:?x00{@Q`Η
zr\ʘod{6q}Z˗c˖-SG:;-[͛71b$D6?#W@ֽigP*^(2j7vRF~OfÉBٴ.٩wTT#12eǚ:q L&kI L Lt9$RF"DQQK{ы"1䣜ذ@	!5}3('|24CVNexs}7!WRɔ/SP#F3>ٗ#&<08?*p{^ zRad$R&?Xr/"pJFPHl#(+IbFPQT *g 5߫$JKSϕ2O04뤆0q)(0Tx	kx|bq;CcH,eA֜x6%ᔐ:$`E=xؾ+?l^lߓ]5ؾ;=2;vcq8a^x	QbLD!q,"$5SQ ~Ijb3.>O)x͘V֤JbHL޾o0Hb2ڰ}@gwD `w.;]]{˰g9zͬb#X4X8EC8~0gjFQU	G;NZW҆^B)x͘VvJbHL)$#+#@*ÿIg~=;cx80݊̨HbV^uRVы3(EFP[=,%^2` BbR1)x+v*f*	#15R<<Ab1:vb<-=Ub<;L?:Oaƫ?Sx(f֌wm{ıkXK!1JM⻕)nRa1b`L޿FќF]{𿏔G?ߖ*u~e8fXKN
<o[8@iKq{5J]l3!#F̜L ϝ?QHfmxRo3{gf7u/śΒq#(-ir_DOl`!L+Y/;T[nE}}}80+xף)gZ[[ؘ>vfTcĈ5C]v_<mKL?-Z"8̯3so{cx\{'ca`iPwߣԂ=iK9ϵ͈3+F^8߬rަ
|cHѕ%eٸo)R,*RlGa}qEy+SދW/׺y@#CVgEo:#_U477cӦרZ
---w;Yiˈ3#j&?\KYwQzPZ2#*Ap%ߋߊ"|S?(j
m,ߑd"&y[SayI"}skGp[X`ZZn?ݟ'cL}#M#;17l؀6tttK຺:\Jʺ10'^`4p2oLKo
J%QY1A9+|VCYӃ5IV3kUD f4%pE oP6E+EKDܡAB=RɭPEt@Wt(&G'WT9c lzK#(}9dqca`aOKQ0H4&L,+[p}^*Õcv<WǫrZ[ FUgBJ&qKzʗuI''.*adA2~xb<,lQ^"K? ez\CY`9oWX\J`ׁQs㌩@3h`ةe|d$ӊV61l[	R1wk.z>y<-.ޏW/*7;T%3=ضvʿ}[J14٦%}'3r i{k._z1j:i͈]Gc0d`*x``Z݊*FQM6M뗏Oǳr[` ]X0U3c%ũc鵹QOD=^;L@fKJRe,{H`"o)m&~D(rwqv#ټe:713Pw);{h7Wo L+[s? >p+y6/o_l?w ܍_KscvjJ-/JlQfKӛ֊yDI߇k ^'eI,;0sGQtq"VֻokmW٤%ηt㟮߅\5LQ-? Es213 LqgPð=8H߭9-c]@Es~`gO-aVbWf}++#7jj3=()jay(!4N8l2z%"@XѢÛ׆+dcɕkwWۛ8(-Iba{q9R=m8h?}IwV;7gvE9߈D>bem1ƺ8cfi #zv20=(d$ӊVv1 O0\m<m//% jF\5c(-I :LQA; )$W!9e]Aڎsuh{`5CkOUNHXǯ?uENƯOpY6qgưv+VP㻽=ƌqe;3<{
{w=}TO_jpfa6e[b/?a ^ˁ1&,ϕf?y Ʊ^Ɍ'+/^?hmk/	Hd^_qV0G:GaO<w5kn:LYzuvZ5@>[:`gE@g7K5Yر$Xߚ9s0Gf]kO1n7	 z	Csq{Dg1;=
&(nc\bɰGN˗/ǖ-[gٲe6͛ld1dnNF
s{E`'?xrl]ټt.Gj؍/_}\n{vT[ҿُ5u,	-csel3`2ޏ2fodO<w୭*i]R9M.mN-8>[|=0J^#O[eDӥعCRL7gh7ּX+ǕO/Ğ}<,y\{EgA/6׉@+3vqV0G72r'NF~;]&ҵ;HS54=(OV*/r{A}<y>ӧ3qo{-QK-ȑ^UH7~u]?Zڃ2=X.i*&tQ*MkcVm\6X_7ezFϸix#
M\bɰ}^k`2	aFL(hvƂSxj~~vc߁w+5<.',]Љ{sE}	ݗ#䈳[n؅GM{@.+V$a'#?Cᵺ#VV0d1:y`ߧ 3\3)35`{~?U=e[HCeeC/)QWQ>Ø;go~]']={Yn\<iL_sJc$xj8]ާb8qdq##|2dgkx"GC];+hvto`50L]w l+ƶػ8( Rԡ$8+CUDFE$G@uE,?,܊YT)ZQtۡjnRݭTI̘1
9Wj5?o '/;!UyK쾿]h/?t'sN̏})|gwi\$"+V$a'#?C?ymYh2rNNF
2܊!b&J?X!O~%ן*!ǢQ_R1-1PZ"65;[-Ee D6Q[HcAyf-O?*9xRs3H3kk؃k8v۴M ǭd"Kg[2gY%;9z3,V|b'#]
M<3aӌ-§kueIOqk.Uq /[F3fOqgİyMk>2L+[sht w1noϝJݟ,׮ۉ%'~sO(ϸeXǧ72Πa'3t+_MMM9ڊ130s60nNFB}sK D0#̮?xƽh:3*p<YXtVGYzcKuc\'NfPfxӍxbi1dnN `z`ŁkF0*S*+~}_m;gLl;5E=3nZ_v13 Lqgð)*xAnnnƦM~ժUhiiA}_-104."7X݊{.VWN:OgeuG~at!YX</Jba̙5@m5PV.Щ	#H׾m+GW⅝哶U9cTׇ??g0^zKrF1Լ?'=Θ9a<Ĉ;ola#(,erJ444 ݅LFr00nN1:e`spxlU6G%\6U^>=x$^zp$qV)' T *EY/9K^%%crt$upz%RP[{۪Lz4ّ|'x :;c-+NCq73?W3ƺ8c3Πa&fFWA0ɰ3Θ<_LXr?Ub	ϴ&ɝQ1ٵ];5߫Q[=d0,ɲ9K(ƌtr~qiXLmGffR4DϾta)Q~9F-vG ]E8]btv'pػ/XiIQBJF7oN>wN0yV;O+qT2̰
;ȥc0G0昍HA__e&~j?EI}HW-Kꦋ@TUbA̮ÜYØY%BYIT(dPT^RH8dBxܩ@btTx*o#roL_9wht8Y=*@i0.5/TKѬu~;/&3E-Ʊ2~8 qLF'EVֶ
;㌩G?l0Z7|=0s%,feIhPBFAέ`dbI`p0v`(%RbO
ZH`VWDk.9}q_`qP\zZӮAV}giw}\kci2';U
vZag15shJ'm+Sk|}&a6vFw˶S^ه.ދwe Xm G]2~2>`2>
ZvZag1'cǁ"xeHo|b\22/;TW`    IDAT?'/ߏ?<`|+'8
&#G~evBVdgLg73~$7~jsF1>$k[8hVX8љL';O+O(xe7܊+Ըiooh1# dOBv.Y8=T
l;Hv8CU|vWЖ6ɚV%i͍B	Y\(L6͞Z7īf`}ެ11wLȈ9fw͚5XnCWڵkYaJ;`$^xMۻ7@N^(ԇQ/ar]	=X)5Kp !NTcV0fʱcr<|#̊狱{䱑Sbe6¢CÂS`,2&3ƺ8VzGF܏1wزe˖-͛YaJ;`$6DY&e7bS]x_C^r JG1,PzzUxaG1vIg*Muدd"8+.W"Lv4) 1cfaQ̙ļFx N\$/`q@iYJ];nt~I.\z`,2&3ƺ8h<?q?:?ڠ%:;;XaK;`$LҐ1O`9'k
'Ltvr?;qڒI2Jcv}xiYr
Dwo=%+@RA8?YQpf+QLV:$*̨(OVUr5@MME}A-J')swP[;N|y}vQ	HL>+c2c|ˈ9F&擙,l'6$Zkt߬YΘpy=]=3^C:S|/UǤYW2t/UKJ?P(eU#efg WQTreP%?+AMjFqW55Y=jj,̈?X>^9c^̘}0ʖoQM%6>p1ƺ8^dH>KvX4gie6a'cc8x}#k^GW1jՌ|Cq;J	rf&y)Q,`wE0;[0%sZO)RYTTg+IJ`v43Q[3U7+%bSK/a,NJi"|mq4-݃iD e,hN߶Z{A-"2>ok("m(fXakxCIT# VؠnS?Y>Ν=_{KO|9eJi,B*鲾񮴸@
6-+EPM^)+}ğr#KlPv>0;﬌ɾ7fzIKnzlwVd)L)!f{ bzM,8;;>vFEeCYO%>x|dU?>y>}5@	y1Oi50r~S8-Na'NbCCgoŷ3i9sl7.̝3pII?A~>\XZXtPdWJ0Fɰ3Θa+',lY,>!,>Cy>vx6~A\}X`YU(VOAqLF܏ZVײ
;㌩?oҍr:BGms5&><4%e,?^3Lᤶz~3*rT$UZoedg|Zd}R+\~=r樵9??'8c}jZ*Bb+]s<LNzR|tvO,xD nT0%^}a'{11:f7Mt?Uɰ3Θ\ogwbJO"x_ՃZ9!F!9qgp5X9x6ryA|#P7Y?rr;O+
^L/777cӦMSj*~{z>v3|7,x娫|rksjaW4ԃ&u|_\Dvv%%w=O??Aȳjp_G}IFtg|Zd}R&FvmذmmmJJ຺:\`ִl'8cf'Yw/ϳz$*79Z|9|:O O僘?W
/bά̙9_3JW]95Tэ=cw9~z=Zmʦ0h .}>|懒WNɞDVOqL͸g$xh:gߙjb3b<sOIAhX2/^/:wҝiQWRzbA??EUCFuP]*[^*[Z:TA,EJ7RC~Jidy'+e"tv"<#wػ4Xn"K^я^罵/f*=	@3=
3:fV03'{BiL-}qg>#Fc1,xŗG+^GW>ƵL(mgbV`0;Ti*"+JbTUbFfN(h[ ʫ/b(ww'6t+}EYDJkoqg.mlc$S,~P@$CB@8@ E!t% &J$*zs$+m՜w=ܙ;7&x*Kc)2d'2KWX;Z"B4mLlc}>#|ڟ<Vk
nV9S3_uofV FbNW#~sӇaٽAvf Y@GԱhUK+<u@|5/Ԍlw:X̪?;]O/::3љή4j-tklm:|[u^tuyxgx{z0co݃#Q֠~"/[mcc`M,I70KdIX%`2wVex˻Bݲ8G7L@ݛ#EPj`u*՟@#n'ٯ}YU`WEiήPqbWmB3hmB[{::҆4#dbh9'nG6 'p19c3F:Io.)#/{3a@C6Ps~G̈z@*'>Bo{DrQB7TߍWa>|3v^ԂCr˽<ćῒKc!9w)C/
#/8HC7Pts^G̔/x_{CY]:|Vff۪Gv /7xP8VXJc0:ܥ`=M9shQWW'f4k3Hxη=Y-g}S/Ǔh]獺3٧lZ1j;Zuق7Sfm虔8RTVVj5QRR
mxL 3uՉHxη=Nivx1ϼ<'_fc]7Vo-Za~l5w}:0mRo,>YH3)qhhhjb٨׆2;SWT||߁X]x{4nŗjl@gffrՋ{ӧtc^L׃S{ߩyOO-xcQ=eX:FIӠ?̦R'|>]pTSHxη=
QwA_WlKw#4 kfً=Xj`aXמng5ب{G{cD?Ə1T=Nʌu=Az!pK" LT7.#1*9連!@ԟ,[	,]	,[+G`Mں`u-3xVmVIEwwZ$1!CKL)v,.AP{zz<hiR{o+.}7אcmKnYHѓ!E8o,vW" #?wCXW7P@-PnKYX.*U٪Ԟ4E0DW*~9B!Cv9ٽX͸rrcXNڴ{YxXꍚ3ӧt(:3x03&2eMI 6eIkx58o!
0S:wc1(N/:ɬ7=4v
]UT᫶ISwfˋδeP5;?SpNFSBWXHoxWu"V*f,,3:"+K@V9Y(duBzqLEN =]?45'_GsAkǂs{>H"ظ*xoF&ݐ2KLgR>4xD/xo]48o!
0S:KC*giE7Xmp	5OfjP:"KX_@Nv47OlʡNu{vX|UvՎ.Yg:[aXH3gR>4O/x!LWW߇/*WuZ*H|%w偞%|e_;ϼy܂vu2LHuжŒ?c!@)z&3NW8CwG Lj=iPCfY:Q:>:miًlӍ]
ExwVPDomWvmO9U,XO1KdkH8Ǚ-.|ҐiPkb|'<5ultuaxN/vضsWE&_:
Zj!_4l+dcpޑWFqqq|PTTɼd=g3<b`z7x(Df_7^<mmfnՉUkvA;f[esoa^е@Sw+;/e10:&SR0u)cP^&[*pg&NlGA9:E"_9+VgڋvoV3[m.{,y$֩σ_v;)FRdcNlw):uтW=XMaQ9f͊VBKX}Źt|T vxѧҁԺ3/}3tV) rό>3:ܥ`2<r FAmm-GcgΜ̝;RvcǫU3<b`w3dɕߜ?G)x32x/0a-xR?L~d~#[&->110H.SG1&
SMz259N)Xs#\yoM:.
ߺG8̥&f9w+x~z~oh}~Z\zcw;pC
캓-x)c3^goD̈SߌfiԻ<FGnh8l*F.xsPڟWҲ H;
Hi_j}]z[F],_ڊEރwn|Moi#eqh1<23lkf)Sw
8pwC?LaL5/EGse Ӂ[ Н ooqF_	>3\q3xa;ƴ ꥵsJ)c3.[ҘɘADEȊv``&%x&){kh9Tv-˖{qqSͲwi/P?\Ga@}mt3Hx5?@i%{xYY}8x_*/nB^i;\x1@ޅ1-eqli2<2s
^Ag7qJ櫁p54zDI"6Vu-H 22w Of[pgO4bx/i3aرSe|1dxd2憎oV#vz#\ےx\#-v<q
_ͧS퀌BT3&N8K]G෇5V3Xa%I|1Ʃ?Fdxd2f؂W7gmtcJٮ'qL~:û7?ze4{[M1\zҀ@ {_ k'׿&Dww^|<^v0'Ռ3OhEh6ꊽ5y4i~n4[ZZJm>tcVTTh	Г8S&?[ʁJN<<=]{̽`˩}?gћdOjCůW{{z8R\S&f|t2
 /z2y4mi~nT磡AgbƬ#'qL~6_4_LgWb Wh_݃n~^ddvC榍H裋qk>Ԍcٚ/	ISH=}E(L?M<	4`3N
Q<LץNNSnLϧ+D*COwL43u޼\?oBPmi<gbM YjF`;Y"<EPSamgtciM8m<F=&&1K8)F')?mVaD'qF51aht\\1X~/q{'cx$"G5>C!)@zU69`ժ5QqmQS\`Ǚd3xGva&Ndpg)s3DLFГMQ45}xq.i	ZVV&!	- }Co:%t:Y@ qHxO.*xӶމGr'ݧ[,[7Vށoڱa+--vhǂsW`]65S4eK1cxqWƺ!FW`nrXcnp^qX&~zqegӎG`ǭTֳvun7L?!UEm2|3J}շfMxe{چy,^O?%g̈kx!x3=MS\8ifEW\r<\8tdg81b1կ>\vɵX ~me+0u2?.=!#F2r'3.RcH^&ǩ|O}.x?{4|m䂷_kca.F    IDATS|1.8JacNO9m|F加9^O?4'\K8)U$H6&CO!KPXXEqx5AO'_fㆻ=gW#77{Z;/oV̌ ~_z/Na	c/x%!R:)q2: ɘzR\f$s!Kd̚5+##[@O7c,y+x>{ѣ?RT[_N:pTJuq{1m-eq1-ɘ^(..Nڪ*mt?3 Q
w=l<ë;lDR?_&~j7nWQ|X*|1;~L7NvGK<."28ݒc`xd2қV21ݟMHz2T,`S/GO</'7_5]ji;pq-C
2׎C|ЛECdLeG؂W/++L5Mkʱۥp79N)7Kڦke=[pSՖhDNN4N؂WhѿpFC۪,A?vNœXd2ISG=`F,xToԠձ3gDAAΝxd`2)qJ>?/x;p[+ᅗwii!fy`EuU..hƋaq$^2?7*H)#nǌetvpmb2W^=g:FR? ==L0&{U;?1vmǽaҤdGۂw(Z㼍SD&CO)QJNi 8=74+`XིO[sĨ>/^L۫qF^`uf/eqmmzd/x,f.%Nw&CA1/x:]+"';\,C+>%g\7ljf=xסڕOPb *3285jcgT\@th(/y4wFF2│3,f|jG鶇}|ڋ7dt_w1x%KGѱ}־zעY`<qAƩWU^=hb^))3cp';gDL'硶~4z{ÿǍ<^XoՍ\K4u^PRޑWO6؂WQyܥdiȪ|p<tu/x>zyy[_8)dwEdWJClzSWO6ȂW9gmtcƻU[,ܥ3jn^\t0Dtt/xdm9ŸxO<xvt1睼Ӣv=dXgrq5g\l,---Eeee7$ucVTThq ]J=&-xqðΉhk/q{ֶϻ2b:͜х+JV/x<9j3yLfuVϨ)W)zE*"|444$HyfϞ18 .%NGLQxa8[}~׬x׬iߏk6~;Wc5yLfuVϨ}\,xsssԩqҍt]J=&R,jTnK9J{\ddD,մZl%n6~kuXjiiޱ`v۱+$q11Y=HJ3*Cn"U$\ΪO4~w)q&1ʡjy~fܠ>'^8Vf tE%(=kqO|շQaH޳pk6TN(b/xMcSo^փ,xX1K3``^'^0}q/O>̨RO>Kaiee^5jZ*Kc2czƛKS/*xkR<vߣ:rN[3j^p#>mѨ'xFsex?OY?s0y܇6 7Kkήz:1ڈeuĶ4K9)I=3-MDmY^eOK%FKe96fpYa=rԇ+J7y!fx,*c݅~=v4D}唖v^!#)Gufm欨RASp7|Ǟު0y݃>8qa`H?~s4!ӗ F2ow}44Y*ތN<8#bXOԫLpt/xwfltc
ޮ.<|=2|Ұ)2&Ϗ?4!-n)f#R:^詗hb^L&dw+TNd<Htu/xgl%a9|8+z՚MߋӎmRM=
^)c3zƣVۊ-xt(.*UUU(**M=,f]}vi(17~,|V.mmxĹ\uma>~>׍:S|/AXXg=Mt;Afbw@D#&Ddpg`2|`{[tXa9x۱Oz׊q\x^9̭:pER[v*.U>u\285jcgT\@|TTV(++ŋZXXr̚5+b[fh`rl{U_񷧁3ߺoZZ.<ㅛqםokڮ-E)qI&>?2;!6θ5^GKw@5lMMjkk<*X<sL`ܹmM&edpg`2|_`1GH O=pt4"/|}e8_#=݌ㅗ/_믻wv_Dw{%M1ck`5	#c)cSR:!Lb3Ɉ+#Nzm5_13%r{0xau%3\QFC(bn2N"_yH`Rd's3ΐDf:`Cf`4xO>%g\ڗ_w;y	
^uDvAܷ;jLS
w6`xe,)%CɈ#N۟ƐEf?l*>*jpnCvv(~8RGa!p؁cD:elLz>.NڼqJ>DEhЂ7ч(v_8d	LG⹷X^ȐF792;c18%o#8+W
g^n7~W!sglLZ7Ƌ1踚qbmV26R)%oɈ#NfD]/)eѧ';cG^)*@ 7^M߉ӎ]ӏ3}^7`	Z=ڬeA'SJHѓ'#F?3yqcTtt_z/c	)pww{eyjj'N]u'+MS
MmT̙M x+&R@֣8\QY`O#qP^|yR6<Jϼ$oӉ?{ڂ71D	Md!5enq"?7*xKKKQYycx-))	6YQQ^Q`~zqS5V=g܀'֬i߇nnw+W`mmOCq2G	ؚ28hhh&ٳX0fY+EϨzg8he7ؔ?|bٲXxڒl:p</yaǱ1D	P59NF([S's7777x:Kr.	>Om*HR􌚟]oO@і•)vyFĭZ ⋯qxjsaLO`pU0v!d O =s1$jO_'ax)sQQ_ԛ.^5?	oUνh<8a?/Vߟ7kZN /WXHIOS>1DQڼq& W[E}h
7p"?/ 5-[/=r c~{v^ĽxwuG<)}P;ߞ/:#ȃq>Lڢ'RmcH5ϣlM[OZk,e=c1gikN0Q"뀓WƠ7ᅗ1c}x7q\X|exǌűlƅ`Y,cGj&cx)siwi v%MFcLICQs`imκ*5-&⩧V[m{vuu_i\իJ:al/Nu3<̌DO2w7c8q5enq"?> ~RcUz{%K3j~~,$eD\ήcQ󷻱j/|X,9r+锉8fP%&77j1$jL([S'ӞVXEJi$R0Fw5bC;7bޞAGgB6/o~=Suyd..ֵk?]zܘ1ǔ{i(C=379N)5Ua{Y8X
'#NG8WOcH$ʛƢ-tqmQxȁPGܼUcU7kPjsmft:RQ9e	l<ɉ^{LQm8pOڔfR	XUU0io'#NԌ8aWkU3YT&Y0-gee/1Z{-@	Um:g~=t"0%s;cj&)+ӣAޡ$JiL)#EOFq20r_}໅!8^`^4i@]ep-[_w+㾰pnr춣89g*x߂fGCW,J15\VVŋG5kVĶR0vI)z2dX9(2eCq Gn#Vz<̿Ldf>'IW^q~艰aw]qe˱I숱ږ,˱@lbrRbѷ3<XޞAmm-GfΜ̝;7]`J)z2dxĈM#y\ٗ@I[boGa/FN
n>쳯0r<úP{;\ƹd48].&)&E(N0g8dΉT `)%Z-<'0bİTG䌋`Qur{IlQćC")fR0XSO^4ɘR7`ő̝>τڦ,ܵx;SyA}}1+3,\	yIH
XL\S
z:Z2")%qIh/~l~=i"ꇣ3>'o]}}}xwqoOo7jGڂkoI5	`ܟ⾟110&B70)Fco{'n$ߥpw<oDt<=ˆᯋ&''}cǎN^'ua2q\'N;f9<nI^K1cg`E*3)J)x	)%qIប8{ W;3x1iĔu~OO/^x{u̘ҁ.Q$%kбΊ96XP
6d)S=7H8.dL)H
|1@oRﶇ(rֵ/x=Q,֎?N;~u`)#110c&zJb'COG^ݜ9s]WW2s֦%L]#b:/ {<o6uFADJWSS\ueEDZn߁,6K%C2Q`10:gLѦ9O---EeeeLG,JJJLŬNa.@ՖeBpӃW,8r}K.;%'˗ĵނn?-{ځ?-ň\7X<i삘`u8O);ãMs^磡!#Fg63>~TR;f	t|<i!?#;^믿Eeߞ
_MjW;2:^ 2&>dg)#}gxil.uL|0|*l$@t뭤9rI6¯{[*]~8zXZY}8dVܽpu*QanҧĄq&R<2wG<MAbf.R'͟@/ 㹤>o$^zcz/'O<,?x>ܙxNYkY)u? c*O0cCOO);ãMs^2vƷ )R3|1hņV=[sZ͛?{&^^~\	ƥ"{cFwģVS틎 Ȼ0\`u#O);#gx2TR51Ii5h Z.nnh"#/P}湇djf7A?Jl1%ǯƼڂw}w/08q&R<2wGeyxM~8f} kWJMDGgآ#Sfkn<8GLSqi1ڢȎ}GX3yɾ3<r|j*)>1@Ii}$c6Y`Q:^yr,ou_̔Pu~	]ziD>3Vc9	H2<`u8O);#U2N038%eՁ0xm^{0i:NrjXy'ndiC'p5v۱[>i> fuLI`)Sg=7NiM=q>ɘRIS@݋WyLp$,_H;ߌ}?xpyW6Ֆd?ڣ`&cz6"G1:f\R1CO)RdxX]]_Ԡ*mMƔpOZKt&nz{$|eNp@.    IDATĽxձ';W_S&ĵ.pVɥ曥a1ԇ[ZcU
Yxߓ110nS
fŏ1 vdwaص1f1|w-Tw{s0Uks&ᵷ
)7w$x)zwXx͸}a՞<%ǯ,%Qi{ڡahc3*'=`&[XS=тW=PMYaQf͊d̨"#Ps_;5g .pD@UcТ<tDw޾n=Eڵ7emDwA'f).g
d<,eu!~3CO)Rcx; z#hll9s&


0w\VɘRF /{pӣԠ8㠃W;kœO<e+dѣQtj\zF(fBbu̡|?CO)R|ө-x%NIa R4-}G+E{h4CN}4*:ށdeebO?22_9[,#?/>:b`Ym~j]C)"ZgL}DDK.T'&#N۹;^2KnR@Q@?3qSy?=T;~XvA8S1vhWJ܂GYGg_}}*boZpqkJZIF\cx19*hГA'S
wG^Bd&<&Ō'_)^07jjNx{%Q^^x	&`3a=:/oC$65`/[͆wjŪ`2mXx*lk~gwwc@vƍ/eLXn`ɠ)ӱ7Qtj[2yL)z8/#|̹_,- z>TnVyjN`
ƷhUY7yFa̸ј8iFa99Hz-XfF&3ByYY㋽^/6^*فjU+Z^bZgG'zzzqzN\}*kMvrZ|-kW`z@2~H0dpg}$F қ06f`jKapC{3[dɒ;0/ݖ­{z{?O􄘪bՓA*\WU!uә=`ߦÁ~&[߂]Uqnl;OY;4qӨ3
100]%Z`pgdΎӑ^qqLLw}h^m-Zl37C[ 97tu?{'imf䰊*vgLF	kpO;0bxr'7`\Ŕ100]%Z`pgdΎ^7̙M nx@F(N )z2<23\Sְa7k Zn8jvUcde6W@`9 F&z)|J3dpgܔ}8oii)*+$UtcVTT8{=p~=	<&p)zWw7<dd/IC1܏ъSiF}Ȱo}c\eq>qaz23d|nJi7??{A,ݘbdIѓɘC?ڟaHl<W2Sbgwۭ:p8p.LKPD`@K8?qAz23d|nJi7777xKƦ.ݘ>OWT)z2<2sHپX FM%1U.[{ߞ5-iho'dsW3Y}E'~yDƏ_Ns`dO F_;CHГ'sS
MNS8Y0SKDC@7P3E=ix}I&~|#м6S:2jZ'ܵ{ڃwjǖSʴntwBzg919=FzIio,D'[ɘCF6@)
_5]@WO} 46 0ntv~ NCvV j[4o i\S'ӈ$eQHP=q2>7pw|5),EO]:k1f*п/;?}EKm{ԉ}}<h6u+=iAoOZp}pWw@߃M9U-C +ˏz1bX`\0q`t^ @zZhmv^q*70i1#C-=q2>7pw|o&7#&EOEBN&cjy+ֿX71#5=;TkַSN	u'Nj	U+q^˸Uz23d|nJ.&+RTul2};_ Pze0Q{ wj\8m\"!COwFM)߇W8=Is-f
.VkJ
Q;	.ɮ?@8Ro'50LLwZd	f͚a9  =  -U
!NVp1 )?&o "#&wvJj'QUU6pn1O*`U1O3>*<YF'H)cr'#Nq:V 0&20-fE/*r )&Kʘ,EV8R8-xՔuYY/fMNX&D&4(?{>
#=-U 
%j)Z 2&K';#N¨kjjP[[Q3g sEo20F20-!2j!#5-U y
)0ڕ%"19nɸ'#N۹'u0]
&ItGSw]*l r mXLHh$ec)cd3%
^=S
Ձ+]KĄl
l@ڈjg8R:F)cb
a_2a30S8ףRc)38nkZVl<V
}v''ficr,6U;S$MT[;qe=4]^V+fuGs56c\HaKb^̤eS
zkza
Q9X8Iu8ݘf6`0j/<ɝ̔=X{5iвDRA/ww.6:mAXǈ3LAB^ޜ9sP]]]K7f۪i# )YcL@/t	f7fVY{N|H;~&Ax5RTVVjǒ n̊
m1J=
tߝv8͇@t  ȻPGe67IMk0o~~>ٳX1(HG3s	`]5ג *0ޱwf+n\v4f$5Ȃ7777x2K.ݘ>OWpxd}bj7E@ӡY_!P H {Y>x(s({
HMk0a?0C_GZdoW׀ r gHm1) ]'uND-v~Rsbot/+s@'@_:gt}]Z#@7iiVT_,˷GT0
=d ,甾>PzF icQYo''@^*`OnV@J~#nN`ݱIHkuOmN@j?`Uw?BmT
Ul,b?CmXg>C`-h1Si%l@q5Pzo\U?8;AFch]O^J~^o>5(#EΡxe
Y;~YB@T@J~.R#력x/.}l@VL}xU60N``>s2IB[( eci)2|g`n(ȗƙLY==`A6{U*`W;3%
^E	gFUU6p)p#CO))``
$Q)c#$ntHT]&fͤxĈ3%V`KR0>(a$Wʰx⨦f͊ؖ5nS
f
jY( ec逼CT;3%
ԛ555Eccc`ul̙3QPPsbӷTwR0SW*`+ ecW>a
0|׉RP~b3s)MS
wFKn;aГ)%-w
0|g`eCcp׉i03Եq2TՋuƩWU)ze-+,w
0r5iAr@"l);F'%N)ܥiԛQR:fǿQ1030Ld@BHM,G8R8/zl?$~Ri;0118dx:fԫ=K^9˚P[nX;&#mUb2<b`eBqUUzY%]g`eCcpg`ڂwPoΙ3G[vtcƻZ,M3mg.Dn#3=:&%?p2~Z=SkQZZJmQRRҍYQQ- wn G6?:#3=:&%?p2~Z=mY磡A[n̞=;^[@&ǩ  l~uGfzuMJ~J.ezڂw̦R'K7zwn G6?:#3=:&%?p2~Z=mYx<F^h1MSAj@Ze59?S`^UM]!4^U7ӮחW7@w;32<~l?2#㧔\rXߤ^}ݍc>!1#F~JS;!4]{*⻔ׂ4nocON1<b䧔8BDO)K?,{}xu7G}N1^1SJz	YzgߥVO[S>q2TՋuƩWU)ze-+,w
0r5vIj0qf`2RPU/&#^!4^U詗\*y^<4w-x#@uu5Β*mt?3 nrRS4)Yz`˚P
>X; d^LGLCh6NJS/kYdULyhL-x䁚Z/++ŋfJaa!1k֬mQK3!SR:fcxddpg`230m}VoMMjkk<*X<sL`ܹMU&#mUb2<b`eBqUUzY%]g`eCcp׉S<9&sgz%OXR<21|g`Zdx7B_#)eȌ8R3d`2<l%`2d`Jѓ=e-֝8y+<)qJdL}7gx$z~1XKSqMv+)8#NNXRɘ&n2w)9H
N1<b 
^ƿDgwC)qJdL}7gx$z~1XKsCt	ψ8Rɘ&n2w)9H
N1<bg؂W	8gmŽeW,gĩk*xU#F)3rI
&#n2w110MG=K87hRTVVj󱤤q*lS3<n: )3rI
&#n2w110MG=K8#hhhٳQ__o 6;#;#`2rI&s79?c~ГHʸĈ3b<ILץN$|0Trgxt R|gLF.Id&'cc`܏z20IqF,x=vvLFڃ ;#NR|gp%)~dGR%FvwW3ь
7) ;w1<#3d`2<buL)߲;F/~D0v/cՇO&c2aIdRrᑾdr?*#q70v}O&c2޴ܥ<#X41d`2<b伔8#&2>LF~2|7M.%H&#1r^J^RN`C=M4wKyGR0Gw87RGfd$8pgi2ɾ]J3<i=rSUX]]5BQQQz##Nf|i'%x8ږbkmΎuRQ"^=#;ZJ7D8dNdxd1/zm6IGqI
N1<bUʰx:f͊VwFLݼ%y$;w1MdRrLbx`-%Έ0ꍼ֢1x:a̙(((ܹsx0^cq20K{)q%6w;}ҏsRn2<bv{1anLW"mzs'So.IѓLzD+e:&cWF?aPU/&#w=f&W҂iݩn2n=-w
0|aPU/&#])zLCO7QQlrsn2NoiUV:=~JSG=-ft~ГL&wMu%ɘ|G^0fdy&-YdnTR2i zn؂WvrdL]l#EO]FBq2TՋbFb5jEãhl"^ޜ9syTWWmb!ஞ[O)xdbo]G&{ޒKRdmb)[V׉,xKKKQYYC FII	***1U]Gޞ]G&ǩ7Bh\2&8mmOV׉,xРC ٳQ__	խLR<TR<29NYBc䒔1ik}jNd<MץN|8*`zJd.#]oWe.#ԛE!4F.ImѧDGa@wFR0Krכߥxdrz(%F
0&5#7.e|eP0oߥxdߥxdrzyRr~S"^&4FR08^}nI1<K8!1<2y79)w/V[ƌ]iwi9okGRr;$G&&s797.eQG128>ܒ#-wHJ.17r|pD    IDATqd&E*y'r01]&ceC)zZz`7^LGӞ7K1s3ڨdLФiUyirR3b<d,YYf>;C \JWFqqqVTUU(y#ɘ/iUCh6Nz1YL5=f&@bgx$*bɝLFp7zJƩ7z209o1=d_*jG_SXX>`$&ɘiUCh6Nz1YL5=f&gJ7[kjjP[[qx3g s΅7M#w1?RKm,wK͓XK3.apz=ͽdשgJ2>7
K)1d(ʈS
=q203│)EO^dLƯ<&[S
&w)qJѓ'SGL)z-xo1
030B=`2l=q20xqڂ@v v``REp98CO)kpg)EOFL)130iL]Il1ݩ ccj;s&*R0
KΈS8R<bpg`Jr2zŤ)8zI@ 0CO){pg)EOFL)130i/#-&QV9s=.3UEx)IKކn23$Rq~穝=m$+PZZJmQtcVTThQnzJ&sכE!4)z8mIV ??ڞ2{ nzm1J߭z{ CO)dz(&EO-xo1
OuSԥ
QnzJ&sכE!4)z8mIV񐟠>"#߭zb]/MSNi2zŤ(*e"(TGR|zMRvWGRФ䒍JS6`ERv4߭rS!1kxz$MJ.8m+O87P񶩂4K3)I/7COK^I%-x)
0Tv^}i&#)[=Bbi4)d>eDƉ1Lc)8Ɉ)#w=m!Kk^`1i
0g` S
&)qJѓ'SGL)z8m(..NIUUU(**~f=`2=q20x2b:@wbw \R=`2L=q20xq%췘(~MSVVŋG}^aa!1k֬mQK=`2l=q20xqڂQ[555Eccc`ul̙3QPPs"7ⲇ1ɰB
wFRd;S&)moo6?}K[.X?~	1b~T>}tlvmgذa[L
0-&C^FR0z2d`tR<by"
˗_G]]7ԩ(vp=&MV_K10L%L=6?q2rڂ?\ꫯ2^{>~dIDV##N)Vwf*COO.#Fga]z5xϢEXSWm.}aƍ<M&5-٤pgyFR0z20M֓dh 履~{'/kh
e'pBg뭷5
06g`2c)%XdIZ 6?qjNwGZ*T>&=$77|IH8ЗLgmi}IO.#F=)UowF]R*&׋O>gyfp{S@Q^Tu@ե3b#%m#%w)q2&CxH"-xM7w{9ѣqg_w{Q.))	bƬ VO3S{R8c'mX{뭷]5k*fyU{)$7GCCC5={vnhߥpzq't7Hy)]J13n1&􂷻~zpܥZ?	
Fj=:TEץ7QnLZ|)ܭf槮>!ߥC=hSLj{	.	(p	moqJԣ@ 0Y
wX=So!4)9Г]J\b`2dXSO>	CP{^=boe*`g|?{(e&EJ.IѓxĘcp'#=ȑ;
`/Y
e''t֮sPvM)i3֜JHʸG+%\D
\|d9[@kwJw]D0wK~D-x/2\~NmATK/^Q=^U}IDa1z;cX)IVb	{-z:'1Na`'v8`ƣSmpgFnddrLlL-4<8cرZ|ǅSq: #N)Vϝ,%KnK;e \WUBtBGysuQ1(P]]Zޤ
EEE#3 #ȈS
So3d`tR<by&
^[2q-zㅊ$сkbw#N)VH9ГiK'#Y	jݟ笸,?au'WTeeeXxqԨ
Q^^W̨%Ѐz8L\&dLU'b*ĝp
UzSXձ3gDAAAp9Jo(301│iԛ=6?q2r^'fowwwuq/<@7.3~)kXj6Sgŋ/|tbUfff|ML]zJdvl=bpg͈.L{w;o<y"#aiӦ%3G_'c=Ww;;CLL4mwR0+U1#wF^0d`2Kd)SGqz+N=Ԥpb-ު"w]wMJnx[o,~K.MJHrN9唤<{ࡦ/->CO)gGq20ܥ`2)#goss3k/|G(tɓ}lٲLk2
*FM7u
S
Na;FLw)=`Jh Θ^ORnlW:nWqR0*)d3d`2Kd)SGSfu쮚u:cpB;ت=q}qWM쮚UN^Dj3WIYh&{p']
&CO)R<Uv]'3<N<*%QRRonjZԥT3gŽe #f[.m!H8m?օ@\bxd^wG:ëwm7~z<W_}5.sR\s.B:M׋7|3)--eH}98J_XGL뻾II1rK8m?;DKQ^f쳏ތ4W^	<GCC6JgF}}6<i@==b`Z#)1rK8x$e=ƂO?|>j*J?7778˻[SճIb.u";uaI\b)#X=Ƃ,`zLB:^qϟrPŻ_zғ@$0<b伔8V13d`2r'Sa4cmwi',_W'z#^\-ZC=I&_HgF͘aj'c6i}3:DRGGvaƉ'cLgM÷+psΡr]ww_3L1QESgj4 %wFdp'o2R%GLU3jfq#Ō'<qz5cϼo2ްfjҠ%XR|gMw)q2& 2rS>vaJԷ{L0Eވp
tҥ{~)
uSeC.%NFdpe^dF.1<b`J}ЂW^Xc\8Zu, hzy1NavlR03>=bpgxň.L)m:F^j4n@,{<ny1gvlR03>=bpgxň.L)E,xwYVo?Tf:h~LIAT#E?K27VVf}iEs?A%8uD3}@A~l}=s:0z\uyo]i"gyo9rdڜҹVҹ˵555RZZv#BO/e:"tOZOfu=`zޯJ{188k.iƀY/R}ьzcF3՜B;"G<ؽ`"#y]3Ȇc쮹}D.YD>>qKfӏ5p^^0C\#D\BD`"b+x'LMO:x*~5Mfkkٺ:ihh=YN")))_*!g!bGD̤{ԥ=4ȜH?׺;wNh{C<`vD=mMawObNxIGR>|X&Mdދ\4X56JZ
EܡCdĉ6${@AN:PO[sgzzKiк۷oyvq5j.^)O8!G넲m6;w9ng@Ă~(ᄃSO[gzzG^}ұh]
5kʕ+M{Ե,xS%mղb
K.X ܩ56Ugzz=iѺ,[8}ESϟ/[l#		)7PikSO/#xsB^?Aȋ}: ]
3fD_[M6-!7oED;#ݻq"PikSO/#xm1{{*t={Dyѳ'OȲرCfϞm	ɂP͝;wʜ9s%
K/t	Uӥ6!oWF=22SO/#xc21mq=7cƌ̲LY6ک3:oCcǎYBFXR]]m[^^.UUUfxހc3L=੎[Ĵ}!R1BLG7n)&^;99"ǏÇ_lݦL"MMMfr3<o@1^|GTǭdbھzz}ov)xtgϚZNCb൓2l0;@<xptڙu3|ooozZE=ӋXc21ޝ(=7BҥK+4w VP/zqyQ{'"Ѽ؈
Z-P*SO/#xr667Yڎp^4k,zZxz<q{ċ^ߛ,xmr56^W^6H8iU^|GTǹKMA^dk\"EQObP0;:}xm^&^\%WEFBy	zښB=ӋIkO=/N[r/qQN@Q3L=I	}Nf)((p砳 7^ծV2FJKK3?nR0;'1mG^}h,x,vOGi2?mt=iCXBg{USOeeX֮]{FGR0;'1mG^}qh,xqBY^/~}\WW'uG*KQQׯJ!I(Uz<i>nƂ^S("^WC`Z8 <B`"AD`"bG`z=ddkfX,x"'$DXCGxD8DĎ{<#0dPɂ'n	 b9&2#&O&"vC扈O&^ \a3:t-ؽ`"<B`"DD`"bG`z=dDbEfk/j}#bw(lDGLKLDL/;hLhY
:qܦ}<5&"q+';K!DĎD'/Zac|ꗪӦM3mll1۪!bG43!£KTEy'"?9-&8T6"RQQ!f5fUU D;Dxr~z\B<!D';"Yơ*N2E@#,kq BĎi#@G!秗)%2OD~"0#ro`k+n^^^t2U޴Yc[Q<pGBO/#RK=dD`"|G<8TV~;H؄2?n MDԈ\B2OL,xP"Ѽ0Y	^~F7DnY`"<
9?n;b r	Lg>XڊX/֧PјaG;"k9Cxw 0#ro`k+.`e]l}
*|Gky"Lg>XڊQr^[BEc~G6"؏5dw;"Yơ*"NA`G9
3dLD.!0!x"0#02ODLD~1yZac|Ƃq}<CD';K!DĎD'/Zac|ƂW[[+eeeHiiiF/<{DxDDĎ{<#0dT͂ j2=a"LGLLDL/;(L(eA,xA^;*..kJAAA"0{%^xfZ܂%y"bG`"ɂ*/PNp]]444HkkktT/EEERRR"~D'"v/=<^b'"v&"?-1YZEF<#.B(IN=mU3DX%UA`"B(iN=mU3dX'e=
9vDSO[Ug#9
Gcya-	2{=vr3z#y
GEl'B`Qȱ#ҜzڪJ='=^\^"HD`!B(iN=mUדҘB.xiӦ)aYc]Y@9
݋G!ǎHgi*L|]3
G୨j3#,k̪*3AţcG>Uz&_OXfih!SL&3#,kq$w/;"Z  IDAT3zǂ6KcDˋN<jzr6kv+^<
9vDSO[Ug;mƈrۯ_μ+G'w/;"s3z2e6.kxuٳ:uJjxL	2l0Sƃ65 MoCsbUAC%9VU|`wĈf`KK7G5T0z1^sLsEnB%IVU|ݠ3f?~{JQQ)&^;9dƌv"2zh9v)!V\`n) w`js	aU'q7(x'O,2upǎ2{lSLvrܹS̙c("&Mb*bG>V"|>9&QO[UzwWgtϲmڴI.\h	),xܼy,ZP$י}DCD2f;"穧3zңuhmuVS֮]+˗/7dk'o)v"2|ٲe)fLp&$AC()O=mUדuSYFV\i}'?)&^;9~ Edղb
S`RVV1~MMv1Aح!{rǁzڪJ='=fw2o<[D?[nz6`Pm&s5ǵ(z+v;p3z x;"թ3zQ%>8nׯg}~,]~8qDsk4׾Ex-Wr -B(J/)
e3ER'3p~Y2h sRXXXΠΝ;'!~ZWW}pzGЕH_#0S@{)3eRz$S!D`P.R*BȖRMb8KVgau:릘9XK1xLUl_'K^x"<"fQ1+x_z%ywyk믛03ԋUVevsw;s̸4k?=ʩ<^b1\yݽ{̚5˜M7$z_̖]_=ɓDv%3g4ǍfZӂ׵L/{ȓ'#|G<G0+x`E*L/[vЙ]lÇnU\[!xf WVn;'ab<3b719;W;|~'~9k.iڀ{':[ClӋW=#x"0'#bNWvAg xቈm8}#E[3>j8U/.zC_>zZ%v/<&{ݎrϞ=e={?g&enޖ;!85%P_e)qIE:#=m43:tj3)M G<%v/<3cDLsOG5MbW=Nw˖-Nүj.#,UUUfq#!bGD䒗ؽDxD^9#oX~SO^liQ ##Z['|"O>$UXXk󀩻xh#x"rK^x"<"fЄ'91ݰ=}u]6[o%/2
)o+Cwe_dС>PyyylVMOx*l(#D\1K~"xB| ^R6d`O"h}E"ˣ<6S|]t<pOs"%v/<3
xO='NDϢC!AuVK5j. Y9Č"vO/#b#Ĵ5Vc{8=J#GJ~~~l2vXx|b{YwFZ"vO/#b#Ĵ]%?<^^Ygy/^pVׯ;l[݂tW0|/_֫ ;?xz"vO/#b#ĴK~"x^`^^ɒ%qF0</ŋeÆީ޾^gDxӋC;1m17W豱gΜA~iYj1"r=TBOc	gȐ!q,@8&Z[+|V: x"0'#b򤵾SKTj#iTOdwѢE,|{8-t7m'O-7sh^0cK>vг%v/<sBonng	v'"v4f,Xvv
]e:俲é=ɮsq1߈'K^x"<"fd/3Wu7}eԩ٠>/}]3u~7Z/m`z'"vOؽDxD޸d/	3W%7ojZj;|#u֨Ղ7m\m$=pcFJm
/^<E艈%v/<3cDv{yODcmgذa])УO:%oDNB{">H(ռN$@X
cuh=D&TXCp@!x"0'#b&LILՀ~ߓ)pGwaH/@^ĠT!!!#;%|ʨUۨeC-vz0u%O&E*@y	9v <ʸhu+,]ɖ
m"-
 >bIFddA@
<{eʣ>իW_	T7ސ+W&Y2:0eT ,BCBK#=s"}(̥%{!y.@y	9e\z==2)xYgY&%Qɋ @)r|E{dVj_|E7.ot1i̢jllL{[5	D@
<{쉖aqxdZj}ܹs3e[۷G{̲%K
6#U^^.UUUfxT 
<{*8<2/xYzIyMwSL&3r3<Q*lBCB=Yy]A
^A]t)pmznˋN{jzj\{{q H!!!ǞB/`F'iћc'O=.X]կ_oK.c
Pd*rYՐ.\zx[CC0`@u
/eT wy	9v/GC7ʺuѣ^Ycǎe˖ŋs6\,MT!!!ã
^̙3QDfW!CDs='o6?
5Ȕ
Pty	9t$[Qo:˫.sxb._bWgw)T!c*@RU 1$S͏l_GY)x;c>38 tM?.O< z d
O3E@
<{YhZvHrĉ՟̔]W>|xTϨQL(>g<GdbT
@ǐc@=JDaӧeϞ={x̙3C&)P[[+eeeHiiiF*@|+r^Q
ΆȮ]U<nBw֬Y2~g+b7~#H!!!Ǟ\ʣE!ٷowMN>]#G*Eq3PYY)P\\,k׮:^T BCBK#<rQ^k祵ʏٳgW?^<xt豯n-U!??D1(_E39ȽvAGBCBKZzbyR*@ T
d_ T
P*@
Kh*@ T
P+7T
P*@ P|W	#    IENDB`Copyright (c) 2015-present 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.
<?php










namespace Symfony\Polyfill\Intl\Grapheme;

\define('SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39) ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX);




















final class Grapheme
{


public const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';

private const CASE_FOLD = [
['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'],
];

public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
{
if (0 > $start) {
$start = \strlen($s) + $start;
}

if (!\is_scalar($s)) {
$hasError = false;
set_error_handler(function () use (&$hasError) { $hasError = true; });
$next = substr($s, $start);
restore_error_handler();
if ($hasError) {
substr($s, $start);
$s = '';
} else {
$s = $next;
}
} else {
$s = substr($s, $start);
}
$size = (int) $size;
$type = (int) $type;
$start = (int) $start;

if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) {
if (80000 > \PHP_VERSION_ID) {
return false;
}

throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS');
}

if (!isset($s[0]) || 0 > $size || 0 > $start) {
return false;
}
if (0 === $size) {
return '';
}

$next = $start;

$s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE);

if (!isset($s[1])) {
return false;
}

$i = 1;
$ret = '';

do {
if (\GRAPHEME_EXTR_COUNT === $type) {
--$size;
} elseif (\GRAPHEME_EXTR_MAXBYTES === $type) {
$size -= \strlen($s[$i]);
} else {
$size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
}

if ($size >= 0) {
$ret .= $s[$i];
}
} while (isset($s[++$i]) && $size > 0);

$next += \strlen($ret);

return $ret;
}

public static function grapheme_strlen($s)
{
preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);

return 0 === $len && '' !== $s ? null : $len;
}

public static function grapheme_substr($s, $start, $len = null)
{
if (null === $len) {
$len = 2147483647;
}

preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s);

$slen = \count($s[0]);
$start = (int) $start;

if (0 > $start) {
$start += $slen;
}
if (0 > $start) {
if (\PHP_VERSION_ID < 80000) {
return false;
}

$start = 0;
}
if ($start >= $slen) {
return \PHP_VERSION_ID >= 80000 ? '' : false;
}

$rem = $slen - $start;

if (0 > $len) {
$len += $rem;
}
if (0 === $len) {
return '';
}
if (0 > $len) {
return \PHP_VERSION_ID >= 80000 ? '' : false;
}
if ($len > $rem) {
$len = $rem;
}

return implode('', \array_slice($s[0], $start, $len));
}

public static function grapheme_strpos($s, $needle, $offset = 0)
{
return self::grapheme_position($s, $needle, $offset, 0);
}

public static function grapheme_stripos($s, $needle, $offset = 0)
{
return self::grapheme_position($s, $needle, $offset, 1);
}

public static function grapheme_strrpos($s, $needle, $offset = 0)
{
return self::grapheme_position($s, $needle, $offset, 2);
}

public static function grapheme_strripos($s, $needle, $offset = 0)
{
return self::grapheme_position($s, $needle, $offset, 3);
}

public static function grapheme_stristr($s, $needle, $beforeNeedle = false)
{
return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');
}

public static function grapheme_strstr($s, $needle, $beforeNeedle = false)
{
return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');
}

public static function grapheme_str_split($s, $len = 1)
{
if (0 > $len || 1073741823 < $len) {
if (80000 > \PHP_VERSION_ID) {
return false;
}

throw new \ValueError('grapheme_str_split(): Argument #2 ($length) must be greater than 0 and less than or equal to 1073741823.');
}

if ('' === $s) {
return [];
}

if (!preg_match_all('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', $s, $matches)) {
return false;
}

if (1 === $len) {
return $matches[0];
}

$chunks = array_chunk($matches[0], $len);

foreach ($chunks as &$chunk) {
$chunk = implode('', $chunk);
}

return $chunks;
}

private static function grapheme_position($s, $needle, $offset, $mode)
{
$needle = (string) $needle;
if (80000 > \PHP_VERSION_ID && !preg_match('/./us', $needle)) {
return false;
}
$s = (string) $s;
if (!preg_match('/./us', $s)) {
return false;
}
if ($offset > 0) {
$s = self::grapheme_substr($s, $offset);
} elseif ($offset < 0) {
if (2 > $mode) {
$offset += self::grapheme_strlen($s);
$s = self::grapheme_substr($s, $offset);
if (0 > $offset) {
$offset = 0;
}
} elseif (0 > $offset += self::grapheme_strlen($needle)) {
$s = self::grapheme_substr($s, 0, $offset);
$offset = 0;
} else {
$offset = 0;
}
}




$caseInsensitive = $mode & 1;
$reverse = $mode & 2;
if ($caseInsensitive) {



$mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_LOWER;
$s = mb_convert_case($s, $mode, 'UTF-8');
$needle = mb_convert_case($needle, $mode, 'UTF-8');

if (!\defined('MB_CASE_FOLD_SIMPLE')) {
$s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s);
$needle = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle);
}
}
if ($reverse) {
$needlePos = strrpos($s, $needle);
} else {
$needlePos = strpos($s, $needle);
}

return false !== $needlePos ? self::grapheme_strlen(substr($s, 0, $needlePos)) + $offset : false;
}
}
<?php










use Symfony\Polyfill\Intl\Grapheme as p;

if (!function_exists('grapheme_str_split')) {
function grapheme_str_split(string $string, int $length = 1): array|false { return p\Grapheme::grapheme_str_split($string, $length); }
}

if (extension_loaded('intl')) {
return;
}

if (!defined('GRAPHEME_EXTR_COUNT')) {
define('GRAPHEME_EXTR_COUNT', 0);
}
if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
define('GRAPHEME_EXTR_MAXBYTES', 1);
}
if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
define('GRAPHEME_EXTR_MAXCHARS', 2);
}

if (!function_exists('grapheme_extract')) {
function grapheme_extract(?string $haystack, ?int $size, ?int $type = GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null): string|false { return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); }
}
if (!function_exists('grapheme_stripos')) {
function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_stristr')) {
function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
}
if (!function_exists('grapheme_strlen')) {
function grapheme_strlen(?string $string): int|false|null { return p\Grapheme::grapheme_strlen((string) $string); }
}
if (!function_exists('grapheme_strpos')) {
function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strripos')) {
function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strrpos')) {
function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0): int|false { return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); }
}
if (!function_exists('grapheme_strstr')) {
function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false): string|false { return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
}
if (!function_exists('grapheme_substr')) {
function grapheme_substr(?string $string, ?int $offset, ?int $length = null): string|false { return p\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); }
}
<?php










use Symfony\Polyfill\Intl\Grapheme as p;

if (\PHP_VERSION_ID >= 80000) {
return require __DIR__.'/bootstrap80.php';
}

if (!defined('GRAPHEME_EXTR_COUNT')) {
define('GRAPHEME_EXTR_COUNT', 0);
}
if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
define('GRAPHEME_EXTR_MAXBYTES', 1);
}
if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
define('GRAPHEME_EXTR_MAXCHARS', 2);
}

if (!function_exists('grapheme_extract')) {
function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); }
}
if (!function_exists('grapheme_stripos')) {
function grapheme_stripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_stristr')) {
function grapheme_stristr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); }
}
if (!function_exists('grapheme_strlen')) {
function grapheme_strlen($input) { return p\Grapheme::grapheme_strlen($input); }
}
if (!function_exists('grapheme_strpos')) {
function grapheme_strpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strripos')) {
function grapheme_strripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strrpos')) {
function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); }
}
if (!function_exists('grapheme_strstr')) {
function grapheme_strstr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); }
}
if (!function_exists('grapheme_substr')) {
function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); }
}
if (!function_exists('grapheme_str_split')) {
function grapheme_str_split($string, $length = 1) { return p\Grapheme::grapheme_str_split($string, $length); }
}
Copyright (c) 2015-present 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.
<?php










use Symfony\Polyfill\Mbstring as p;

if (!function_exists('mb_convert_encoding')) {
function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); }
}
if (!function_exists('mb_decode_mimeheader')) {
function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); }
}
if (!function_exists('mb_encode_mimeheader')) {
function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); }
}
if (!function_exists('mb_decode_numericentity')) {
function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }
}
if (!function_exists('mb_encode_numericentity')) {
function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); }
}
if (!function_exists('mb_convert_case')) {
function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }
}
if (!function_exists('mb_internal_encoding')) {
function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); }
}
if (!function_exists('mb_language')) {
function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); }
}
if (!function_exists('mb_list_encodings')) {
function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); }
}
if (!function_exists('mb_encoding_aliases')) {
function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); }
}
if (!function_exists('mb_check_encoding')) {
function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); }
}
if (!function_exists('mb_detect_encoding')) {
function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); }
}
if (!function_exists('mb_detect_order')) {
function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); }
}
if (!function_exists('mb_parse_str')) {
function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }
}
if (!function_exists('mb_strlen')) {
function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); }
}
if (!function_exists('mb_strpos')) {
function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strtolower')) {
function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); }
}
if (!function_exists('mb_strtoupper')) {
function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); }
}
if (!function_exists('mb_substitute_character')) {
function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); }
}
if (!function_exists('mb_substr')) {
function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); }
}
if (!function_exists('mb_stripos')) {
function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_stristr')) {
function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strrchr')) {
function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strrichr')) {
function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_strripos')) {
function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strrpos')) {
function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
}
if (!function_exists('mb_strstr')) {
function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
}
if (!function_exists('mb_get_info')) {
function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); }
}
if (!function_exists('mb_http_output')) {
function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); }
}
if (!function_exists('mb_strwidth')) {
function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); }
}
if (!function_exists('mb_substr_count')) {
function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }
}
if (!function_exists('mb_output_handler')) {
function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); }
}
if (!function_exists('mb_http_input')) {
function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); }
}

if (!function_exists('mb_convert_variables')) {
function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); }
}

if (!function_exists('mb_ord')) {
function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); }
}
if (!function_exists('mb_chr')) {
function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); }
}
if (!function_exists('mb_scrub')) {
function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); }
}
if (!function_exists('mb_str_split')) {
function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }
}

if (!function_exists('mb_str_pad')) {
function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}

if (!function_exists('mb_ucfirst')) {
function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
}

if (!function_exists('mb_lcfirst')) {
function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
}

if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); }
}

if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); }
}

if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); }
}

if (extension_loaded('mbstring')) {
return;
}

if (!defined('MB_CASE_UPPER')) {
define('MB_CASE_UPPER', 0);
}
if (!defined('MB_CASE_LOWER')) {
define('MB_CASE_LOWER', 1);
}
if (!defined('MB_CASE_TITLE')) {
define('MB_CASE_TITLE', 2);
}
<?php



return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
<?php

return [
'İ' => 'i̇',
'µ' => 'μ',
'ſ' => 's',
'ͅ' => 'ι',
'ς' => 'σ',
'ϐ' => 'β',
'ϑ' => 'θ',
'ϕ' => 'φ',
'ϖ' => 'π',
'ϰ' => 'κ',
'ϱ' => 'ρ',
'ϵ' => 'ε',
'ẛ' => 'ṡ',
'ι' => 'ι',
'ß' => 'ss',
'ŉ' => 'ʼn',
'ǰ' => 'ǰ',
'ΐ' => 'ΐ',
'ΰ' => 'ΰ',
'և' => 'եւ',
'ẖ' => 'ẖ',
'ẗ' => 'ẗ',
'ẘ' => 'ẘ',
'ẙ' => 'ẙ',
'ẚ' => 'aʾ',
'ẞ' => 'ss',
'ὐ' => 'ὐ',
'ὒ' => 'ὒ',
'ὔ' => 'ὔ',
'ὖ' => 'ὖ',
'ᾀ' => 'ἀι',
'ᾁ' => 'ἁι',
'ᾂ' => 'ἂι',
'ᾃ' => 'ἃι',
'ᾄ' => 'ἄι',
'ᾅ' => 'ἅι',
'ᾆ' => 'ἆι',
'ᾇ' => 'ἇι',
'ᾈ' => 'ἀι',
'ᾉ' => 'ἁι',
'ᾊ' => 'ἂι',
'ᾋ' => 'ἃι',
'ᾌ' => 'ἄι',
'ᾍ' => 'ἅι',
'ᾎ' => 'ἆι',
'ᾏ' => 'ἇι',
'ᾐ' => 'ἠι',
'ᾑ' => 'ἡι',
'ᾒ' => 'ἢι',
'ᾓ' => 'ἣι',
'ᾔ' => 'ἤι',
'ᾕ' => 'ἥι',
'ᾖ' => 'ἦι',
'ᾗ' => 'ἧι',
'ᾘ' => 'ἠι',
'ᾙ' => 'ἡι',
'ᾚ' => 'ἢι',
'ᾛ' => 'ἣι',
'ᾜ' => 'ἤι',
'ᾝ' => 'ἥι',
'ᾞ' => 'ἦι',
'ᾟ' => 'ἧι',
'ᾠ' => 'ὠι',
'ᾡ' => 'ὡι',
'ᾢ' => 'ὢι',
'ᾣ' => 'ὣι',
'ᾤ' => 'ὤι',
'ᾥ' => 'ὥι',
'ᾦ' => 'ὦι',
'ᾧ' => 'ὧι',
'ᾨ' => 'ὠι',
'ᾩ' => 'ὡι',
'ᾪ' => 'ὢι',
'ᾫ' => 'ὣι',
'ᾬ' => 'ὤι',
'ᾭ' => 'ὥι',
'ᾮ' => 'ὦι',
'ᾯ' => 'ὧι',
'ᾲ' => 'ὰι',
'ᾳ' => 'αι',
'ᾴ' => 'άι',
'ᾶ' => 'ᾶ',
'ᾷ' => 'ᾶι',
'ᾼ' => 'αι',
'ῂ' => 'ὴι',
'ῃ' => 'ηι',
'ῄ' => 'ήι',
'ῆ' => 'ῆ',
'ῇ' => 'ῆι',
'ῌ' => 'ηι',
'ῒ' => 'ῒ',
'ῖ' => 'ῖ',
'ῗ' => 'ῗ',
'ῢ' => 'ῢ',
'ῤ' => 'ῤ',
'ῦ' => 'ῦ',
'ῧ' => 'ῧ',
'ῲ' => 'ὼι',
'ῳ' => 'ωι',
'ῴ' => 'ώι',
'ῶ' => 'ῶ',
'ῷ' => 'ῶι',
'ῼ' => 'ωι',
'ﬀ' => 'ff',
'ﬁ' => 'fi',
'ﬂ' => 'fl',
'ﬃ' => 'ffi',
'ﬄ' => 'ffl',
'ﬅ' => 'st',
'ﬆ' => 'st',
'ﬓ' => 'մն',
'ﬔ' => 'մե',
'ﬕ' => 'մի',
'ﬖ' => 'վն',
'ﬗ' => 'մխ',
];
<?php

return array (
'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',
'µ' => 'Μ',
'à' => 'À',
'á' => 'Á',
'â' => 'Â',
'ã' => 'Ã',
'ä' => 'Ä',
'å' => 'Å',
'æ' => 'Æ',
'ç' => 'Ç',
'è' => 'È',
'é' => 'É',
'ê' => 'Ê',
'ë' => 'Ë',
'ì' => 'Ì',
'í' => 'Í',
'î' => 'Î',
'ï' => 'Ï',
'ð' => 'Ð',
'ñ' => 'Ñ',
'ò' => 'Ò',
'ó' => 'Ó',
'ô' => 'Ô',
'õ' => 'Õ',
'ö' => 'Ö',
'ø' => 'Ø',
'ù' => 'Ù',
'ú' => 'Ú',
'û' => 'Û',
'ü' => 'Ü',
'ý' => 'Ý',
'þ' => 'Þ',
'ÿ' => 'Ÿ',
'ā' => 'Ā',
'ă' => 'Ă',
'ą' => 'Ą',
'ć' => 'Ć',
'ĉ' => 'Ĉ',
'ċ' => 'Ċ',
'č' => 'Č',
'ď' => 'Ď',
'đ' => 'Đ',
'ē' => 'Ē',
'ĕ' => 'Ĕ',
'ė' => 'Ė',
'ę' => 'Ę',
'ě' => 'Ě',
'ĝ' => 'Ĝ',
'ğ' => 'Ğ',
'ġ' => 'Ġ',
'ģ' => 'Ģ',
'ĥ' => 'Ĥ',
'ħ' => 'Ħ',
'ĩ' => 'Ĩ',
'ī' => 'Ī',
'ĭ' => 'Ĭ',
'į' => 'Į',
'ı' => 'I',
'ĳ' => 'Ĳ',
'ĵ' => 'Ĵ',
'ķ' => 'Ķ',
'ĺ' => 'Ĺ',
'ļ' => 'Ļ',
'ľ' => 'Ľ',
'ŀ' => 'Ŀ',
'ł' => 'Ł',
'ń' => 'Ń',
'ņ' => 'Ņ',
'ň' => 'Ň',
'ŋ' => 'Ŋ',
'ō' => 'Ō',
'ŏ' => 'Ŏ',
'ő' => 'Ő',
'œ' => 'Œ',
'ŕ' => 'Ŕ',
'ŗ' => 'Ŗ',
'ř' => 'Ř',
'ś' => 'Ś',
'ŝ' => 'Ŝ',
'ş' => 'Ş',
'š' => 'Š',
'ţ' => 'Ţ',
'ť' => 'Ť',
'ŧ' => 'Ŧ',
'ũ' => 'Ũ',
'ū' => 'Ū',
'ŭ' => 'Ŭ',
'ů' => 'Ů',
'ű' => 'Ű',
'ų' => 'Ų',
'ŵ' => 'Ŵ',
'ŷ' => 'Ŷ',
'ź' => 'Ź',
'ż' => 'Ż',
'ž' => 'Ž',
'ſ' => 'S',
'ƀ' => 'Ƀ',
'ƃ' => 'Ƃ',
'ƅ' => 'Ƅ',
'ƈ' => 'Ƈ',
'ƌ' => 'Ƌ',
'ƒ' => 'Ƒ',
'ƕ' => 'Ƕ',
'ƙ' => 'Ƙ',
'ƚ' => 'Ƚ',
'ƞ' => 'Ƞ',
'ơ' => 'Ơ',
'ƣ' => 'Ƣ',
'ƥ' => 'Ƥ',
'ƨ' => 'Ƨ',
'ƭ' => 'Ƭ',
'ư' => 'Ư',
'ƴ' => 'Ƴ',
'ƶ' => 'Ƶ',
'ƹ' => 'Ƹ',
'ƽ' => 'Ƽ',
'ƿ' => 'Ƿ',
'ǅ' => 'Ǆ',
'ǆ' => 'Ǆ',
'ǈ' => 'Ǉ',
'ǉ' => 'Ǉ',
'ǋ' => 'Ǌ',
'ǌ' => 'Ǌ',
'ǎ' => 'Ǎ',
'ǐ' => 'Ǐ',
'ǒ' => 'Ǒ',
'ǔ' => 'Ǔ',
'ǖ' => 'Ǖ',
'ǘ' => 'Ǘ',
'ǚ' => 'Ǚ',
'ǜ' => 'Ǜ',
'ǝ' => 'Ǝ',
'ǟ' => 'Ǟ',
'ǡ' => 'Ǡ',
'ǣ' => 'Ǣ',
'ǥ' => 'Ǥ',
'ǧ' => 'Ǧ',
'ǩ' => 'Ǩ',
'ǫ' => 'Ǫ',
'ǭ' => 'Ǭ',
'ǯ' => 'Ǯ',
'ǲ' => 'Ǳ',
'ǳ' => 'Ǳ',
'ǵ' => 'Ǵ',
'ǹ' => 'Ǹ',
'ǻ' => 'Ǻ',
'ǽ' => 'Ǽ',
'ǿ' => 'Ǿ',
'ȁ' => 'Ȁ',
'ȃ' => 'Ȃ',
'ȅ' => 'Ȅ',
'ȇ' => 'Ȇ',
'ȉ' => 'Ȉ',
'ȋ' => 'Ȋ',
'ȍ' => 'Ȍ',
'ȏ' => 'Ȏ',
'ȑ' => 'Ȑ',
'ȓ' => 'Ȓ',
'ȕ' => 'Ȕ',
'ȗ' => 'Ȗ',
'ș' => 'Ș',
'ț' => 'Ț',
'ȝ' => 'Ȝ',
'ȟ' => 'Ȟ',
'ȣ' => 'Ȣ',
'ȥ' => 'Ȥ',
'ȧ' => 'Ȧ',
'ȩ' => 'Ȩ',
'ȫ' => 'Ȫ',
'ȭ' => 'Ȭ',
'ȯ' => 'Ȯ',
'ȱ' => 'Ȱ',
'ȳ' => 'Ȳ',
'ȼ' => 'Ȼ',
'ȿ' => 'Ȿ',
'ɀ' => 'Ɀ',
'ɂ' => 'Ɂ',
'ɇ' => 'Ɇ',
'ɉ' => 'Ɉ',
'ɋ' => 'Ɋ',
'ɍ' => 'Ɍ',
'ɏ' => 'Ɏ',
'ɐ' => 'Ɐ',
'ɑ' => 'Ɑ',
'ɒ' => 'Ɒ',
'ɓ' => 'Ɓ',
'ɔ' => 'Ɔ',
'ɖ' => 'Ɖ',
'ɗ' => 'Ɗ',
'ə' => 'Ə',
'ɛ' => 'Ɛ',
'ɜ' => 'Ɜ',
'ɠ' => 'Ɠ',
'ɡ' => 'Ɡ',
'ɣ' => 'Ɣ',
'ɥ' => 'Ɥ',
'ɦ' => 'Ɦ',
'ɨ' => 'Ɨ',
'ɩ' => 'Ɩ',
'ɪ' => 'Ɪ',
'ɫ' => 'Ɫ',
'ɬ' => 'Ɬ',
'ɯ' => 'Ɯ',
'ɱ' => 'Ɱ',
'ɲ' => 'Ɲ',
'ɵ' => 'Ɵ',
'ɽ' => 'Ɽ',
'ʀ' => 'Ʀ',
'ʂ' => 'Ʂ',
'ʃ' => 'Ʃ',
'ʇ' => 'Ʇ',
'ʈ' => 'Ʈ',
'ʉ' => 'Ʉ',
'ʊ' => 'Ʊ',
'ʋ' => 'Ʋ',
'ʌ' => 'Ʌ',
'ʒ' => 'Ʒ',
'ʝ' => 'Ʝ',
'ʞ' => 'Ʞ',
'ͅ' => 'Ι',
'ͱ' => 'Ͱ',
'ͳ' => 'Ͳ',
'ͷ' => 'Ͷ',
'ͻ' => 'Ͻ',
'ͼ' => 'Ͼ',
'ͽ' => 'Ͽ',
'ά' => 'Ά',
'έ' => 'Έ',
'ή' => 'Ή',
'ί' => 'Ί',
'α' => 'Α',
'β' => 'Β',
'γ' => 'Γ',
'δ' => 'Δ',
'ε' => 'Ε',
'ζ' => 'Ζ',
'η' => 'Η',
'θ' => 'Θ',
'ι' => 'Ι',
'κ' => 'Κ',
'λ' => 'Λ',
'μ' => 'Μ',
'ν' => 'Ν',
'ξ' => 'Ξ',
'ο' => 'Ο',
'π' => 'Π',
'ρ' => 'Ρ',
'ς' => 'Σ',
'σ' => 'Σ',
'τ' => 'Τ',
'υ' => 'Υ',
'φ' => 'Φ',
'χ' => 'Χ',
'ψ' => 'Ψ',
'ω' => 'Ω',
'ϊ' => 'Ϊ',
'ϋ' => 'Ϋ',
'ό' => 'Ό',
'ύ' => 'Ύ',
'ώ' => 'Ώ',
'ϐ' => 'Β',
'ϑ' => 'Θ',
'ϕ' => 'Φ',
'ϖ' => 'Π',
'ϗ' => 'Ϗ',
'ϙ' => 'Ϙ',
'ϛ' => 'Ϛ',
'ϝ' => 'Ϝ',
'ϟ' => 'Ϟ',
'ϡ' => 'Ϡ',
'ϣ' => 'Ϣ',
'ϥ' => 'Ϥ',
'ϧ' => 'Ϧ',
'ϩ' => 'Ϩ',
'ϫ' => 'Ϫ',
'ϭ' => 'Ϭ',
'ϯ' => 'Ϯ',
'ϰ' => 'Κ',
'ϱ' => 'Ρ',
'ϲ' => 'Ϲ',
'ϳ' => 'Ϳ',
'ϵ' => 'Ε',
'ϸ' => 'Ϸ',
'ϻ' => 'Ϻ',
'а' => 'А',
'б' => 'Б',
'в' => 'В',
'г' => 'Г',
'д' => 'Д',
'е' => 'Е',
'ж' => 'Ж',
'з' => 'З',
'и' => 'И',
'й' => 'Й',
'к' => 'К',
'л' => 'Л',
'м' => 'М',
'н' => 'Н',
'о' => 'О',
'п' => 'П',
'р' => 'Р',
'с' => 'С',
'т' => 'Т',
'у' => 'У',
'ф' => 'Ф',
'х' => 'Х',
'ц' => 'Ц',
'ч' => 'Ч',
'ш' => 'Ш',
'щ' => 'Щ',
'ъ' => 'Ъ',
'ы' => 'Ы',
'ь' => 'Ь',
'э' => 'Э',
'ю' => 'Ю',
'я' => 'Я',
'ѐ' => 'Ѐ',
'ё' => 'Ё',
'ђ' => 'Ђ',
'ѓ' => 'Ѓ',
'є' => 'Є',
'ѕ' => 'Ѕ',
'і' => 'І',
'ї' => 'Ї',
'ј' => 'Ј',
'љ' => 'Љ',
'њ' => 'Њ',
'ћ' => 'Ћ',
'ќ' => 'Ќ',
'ѝ' => 'Ѝ',
'ў' => 'Ў',
'џ' => 'Џ',
'ѡ' => 'Ѡ',
'ѣ' => 'Ѣ',
'ѥ' => 'Ѥ',
'ѧ' => 'Ѧ',
'ѩ' => 'Ѩ',
'ѫ' => 'Ѫ',
'ѭ' => 'Ѭ',
'ѯ' => 'Ѯ',
'ѱ' => 'Ѱ',
'ѳ' => 'Ѳ',
'ѵ' => 'Ѵ',
'ѷ' => 'Ѷ',
'ѹ' => 'Ѹ',
'ѻ' => 'Ѻ',
'ѽ' => 'Ѽ',
'ѿ' => 'Ѿ',
'ҁ' => 'Ҁ',
'ҋ' => 'Ҋ',
'ҍ' => 'Ҍ',
'ҏ' => 'Ҏ',
'ґ' => 'Ґ',
'ғ' => 'Ғ',
'ҕ' => 'Ҕ',
'җ' => 'Җ',
'ҙ' => 'Ҙ',
'қ' => 'Қ',
'ҝ' => 'Ҝ',
'ҟ' => 'Ҟ',
'ҡ' => 'Ҡ',
'ң' => 'Ң',
'ҥ' => 'Ҥ',
'ҧ' => 'Ҧ',
'ҩ' => 'Ҩ',
'ҫ' => 'Ҫ',
'ҭ' => 'Ҭ',
'ү' => 'Ү',
'ұ' => 'Ұ',
'ҳ' => 'Ҳ',
'ҵ' => 'Ҵ',
'ҷ' => 'Ҷ',
'ҹ' => 'Ҹ',
'һ' => 'Һ',
'ҽ' => 'Ҽ',
'ҿ' => 'Ҿ',
'ӂ' => 'Ӂ',
'ӄ' => 'Ӄ',
'ӆ' => 'Ӆ',
'ӈ' => 'Ӈ',
'ӊ' => 'Ӊ',
'ӌ' => 'Ӌ',
'ӎ' => 'Ӎ',
'ӏ' => 'Ӏ',
'ӑ' => 'Ӑ',
'ӓ' => 'Ӓ',
'ӕ' => 'Ӕ',
'ӗ' => 'Ӗ',
'ә' => 'Ә',
'ӛ' => 'Ӛ',
'ӝ' => 'Ӝ',
'ӟ' => 'Ӟ',
'ӡ' => 'Ӡ',
'ӣ' => 'Ӣ',
'ӥ' => 'Ӥ',
'ӧ' => 'Ӧ',
'ө' => 'Ө',
'ӫ' => 'Ӫ',
'ӭ' => 'Ӭ',
'ӯ' => 'Ӯ',
'ӱ' => 'Ӱ',
'ӳ' => 'Ӳ',
'ӵ' => 'Ӵ',
'ӷ' => 'Ӷ',
'ӹ' => 'Ӹ',
'ӻ' => 'Ӻ',
'ӽ' => 'Ӽ',
'ӿ' => 'Ӿ',
'ԁ' => 'Ԁ',
'ԃ' => 'Ԃ',
'ԅ' => 'Ԅ',
'ԇ' => 'Ԇ',
'ԉ' => 'Ԉ',
'ԋ' => 'Ԋ',
'ԍ' => 'Ԍ',
'ԏ' => 'Ԏ',
'ԑ' => 'Ԑ',
'ԓ' => 'Ԓ',
'ԕ' => 'Ԕ',
'ԗ' => 'Ԗ',
'ԙ' => 'Ԙ',
'ԛ' => 'Ԛ',
'ԝ' => 'Ԝ',
'ԟ' => 'Ԟ',
'ԡ' => 'Ԡ',
'ԣ' => 'Ԣ',
'ԥ' => 'Ԥ',
'ԧ' => 'Ԧ',
'ԩ' => 'Ԩ',
'ԫ' => 'Ԫ',
'ԭ' => 'Ԭ',
'ԯ' => 'Ԯ',
'ա' => 'Ա',
'բ' => 'Բ',
'գ' => 'Գ',
'դ' => 'Դ',
'ե' => 'Ե',
'զ' => 'Զ',
'է' => 'Է',
'ը' => 'Ը',
'թ' => 'Թ',
'ժ' => 'Ժ',
'ի' => 'Ի',
'լ' => 'Լ',
'խ' => 'Խ',
'ծ' => 'Ծ',
'կ' => 'Կ',
'հ' => 'Հ',
'ձ' => 'Ձ',
'ղ' => 'Ղ',
'ճ' => 'Ճ',
'մ' => 'Մ',
'յ' => 'Յ',
'ն' => 'Ն',
'շ' => 'Շ',
'ո' => 'Ո',
'չ' => 'Չ',
'պ' => 'Պ',
'ջ' => 'Ջ',
'ռ' => 'Ռ',
'ս' => 'Ս',
'վ' => 'Վ',
'տ' => 'Տ',
'ր' => 'Ր',
'ց' => 'Ց',
'ւ' => 'Ւ',
'փ' => 'Փ',
'ք' => 'Ք',
'օ' => 'Օ',
'ֆ' => 'Ֆ',
'ა' => 'Ა',
'ბ' => 'Ბ',
'გ' => 'Გ',
'დ' => 'Დ',
'ე' => 'Ე',
'ვ' => 'Ვ',
'ზ' => 'Ზ',
'თ' => 'Თ',
'ი' => 'Ი',
'კ' => 'Კ',
'ლ' => 'Ლ',
'მ' => 'Მ',
'ნ' => 'Ნ',
'ო' => 'Ო',
'პ' => 'Პ',
'ჟ' => 'Ჟ',
'რ' => 'Რ',
'ს' => 'Ს',
'ტ' => 'Ტ',
'უ' => 'Უ',
'ფ' => 'Ფ',
'ქ' => 'Ქ',
'ღ' => 'Ღ',
'ყ' => 'Ყ',
'შ' => 'Შ',
'ჩ' => 'Ჩ',
'ც' => 'Ც',
'ძ' => 'Ძ',
'წ' => 'Წ',
'ჭ' => 'Ჭ',
'ხ' => 'Ხ',
'ჯ' => 'Ჯ',
'ჰ' => 'Ჰ',
'ჱ' => 'Ჱ',
'ჲ' => 'Ჲ',
'ჳ' => 'Ჳ',
'ჴ' => 'Ჴ',
'ჵ' => 'Ჵ',
'ჶ' => 'Ჶ',
'ჷ' => 'Ჷ',
'ჸ' => 'Ჸ',
'ჹ' => 'Ჹ',
'ჺ' => 'Ჺ',
'ჽ' => 'Ჽ',
'ჾ' => 'Ჾ',
'ჿ' => 'Ჿ',
'ᏸ' => 'Ᏸ',
'ᏹ' => 'Ᏹ',
'ᏺ' => 'Ᏺ',
'ᏻ' => 'Ᏻ',
'ᏼ' => 'Ᏼ',
'ᏽ' => 'Ᏽ',
'ᲀ' => 'В',
'ᲁ' => 'Д',
'ᲂ' => 'О',
'ᲃ' => 'С',
'ᲄ' => 'Т',
'ᲅ' => 'Т',
'ᲆ' => 'Ъ',
'ᲇ' => 'Ѣ',
'ᲈ' => 'Ꙋ',
'ᵹ' => 'Ᵹ',
'ᵽ' => 'Ᵽ',
'ᶎ' => 'Ᶎ',
'ḁ' => 'Ḁ',
'ḃ' => 'Ḃ',
'ḅ' => 'Ḅ',
'ḇ' => 'Ḇ',
'ḉ' => 'Ḉ',
'ḋ' => 'Ḋ',
'ḍ' => 'Ḍ',
'ḏ' => 'Ḏ',
'ḑ' => 'Ḑ',
'ḓ' => 'Ḓ',
'ḕ' => 'Ḕ',
'ḗ' => 'Ḗ',
'ḙ' => 'Ḙ',
'ḛ' => 'Ḛ',
'ḝ' => 'Ḝ',
'ḟ' => 'Ḟ',
'ḡ' => 'Ḡ',
'ḣ' => 'Ḣ',
'ḥ' => 'Ḥ',
'ḧ' => 'Ḧ',
'ḩ' => 'Ḩ',
'ḫ' => 'Ḫ',
'ḭ' => 'Ḭ',
'ḯ' => 'Ḯ',
'ḱ' => 'Ḱ',
'ḳ' => 'Ḳ',
'ḵ' => 'Ḵ',
'ḷ' => 'Ḷ',
'ḹ' => 'Ḹ',
'ḻ' => 'Ḻ',
'ḽ' => 'Ḽ',
'ḿ' => 'Ḿ',
'ṁ' => 'Ṁ',
'ṃ' => 'Ṃ',
'ṅ' => 'Ṅ',
'ṇ' => 'Ṇ',
'ṉ' => 'Ṉ',
'ṋ' => 'Ṋ',
'ṍ' => 'Ṍ',
'ṏ' => 'Ṏ',
'ṑ' => 'Ṑ',
'ṓ' => 'Ṓ',
'ṕ' => 'Ṕ',
'ṗ' => 'Ṗ',
'ṙ' => 'Ṙ',
'ṛ' => 'Ṛ',
'ṝ' => 'Ṝ',
'ṟ' => 'Ṟ',
'ṡ' => 'Ṡ',
'ṣ' => 'Ṣ',
'ṥ' => 'Ṥ',
'ṧ' => 'Ṧ',
'ṩ' => 'Ṩ',
'ṫ' => 'Ṫ',
'ṭ' => 'Ṭ',
'ṯ' => 'Ṯ',
'ṱ' => 'Ṱ',
'ṳ' => 'Ṳ',
'ṵ' => 'Ṵ',
'ṷ' => 'Ṷ',
'ṹ' => 'Ṹ',
'ṻ' => 'Ṻ',
'ṽ' => 'Ṽ',
'ṿ' => 'Ṿ',
'ẁ' => 'Ẁ',
'ẃ' => 'Ẃ',
'ẅ' => 'Ẅ',
'ẇ' => 'Ẇ',
'ẉ' => 'Ẉ',
'ẋ' => 'Ẋ',
'ẍ' => 'Ẍ',
'ẏ' => 'Ẏ',
'ẑ' => 'Ẑ',
'ẓ' => 'Ẓ',
'ẕ' => 'Ẕ',
'ẛ' => 'Ṡ',
'ạ' => 'Ạ',
'ả' => 'Ả',
'ấ' => 'Ấ',
'ầ' => 'Ầ',
'ẩ' => 'Ẩ',
'ẫ' => 'Ẫ',
'ậ' => 'Ậ',
'ắ' => 'Ắ',
'ằ' => 'Ằ',
'ẳ' => 'Ẳ',
'ẵ' => 'Ẵ',
'ặ' => 'Ặ',
'ẹ' => 'Ẹ',
'ẻ' => 'Ẻ',
'ẽ' => 'Ẽ',
'ế' => 'Ế',
'ề' => 'Ề',
'ể' => 'Ể',
'ễ' => 'Ễ',
'ệ' => 'Ệ',
'ỉ' => 'Ỉ',
'ị' => 'Ị',
'ọ' => 'Ọ',
'ỏ' => 'Ỏ',
'ố' => 'Ố',
'ồ' => 'Ồ',
'ổ' => 'Ổ',
'ỗ' => 'Ỗ',
'ộ' => 'Ộ',
'ớ' => 'Ớ',
'ờ' => 'Ờ',
'ở' => 'Ở',
'ỡ' => 'Ỡ',
'ợ' => 'Ợ',
'ụ' => 'Ụ',
'ủ' => 'Ủ',
'ứ' => 'Ứ',
'ừ' => 'Ừ',
'ử' => 'Ử',
'ữ' => 'Ữ',
'ự' => 'Ự',
'ỳ' => 'Ỳ',
'ỵ' => 'Ỵ',
'ỷ' => 'Ỷ',
'ỹ' => 'Ỹ',
'ỻ' => 'Ỻ',
'ỽ' => 'Ỽ',
'ỿ' => 'Ỿ',
'ἀ' => 'Ἀ',
'ἁ' => 'Ἁ',
'ἂ' => 'Ἂ',
'ἃ' => 'Ἃ',
'ἄ' => 'Ἄ',
'ἅ' => 'Ἅ',
'ἆ' => 'Ἆ',
'ἇ' => 'Ἇ',
'ἐ' => 'Ἐ',
'ἑ' => 'Ἑ',
'ἒ' => 'Ἒ',
'ἓ' => 'Ἓ',
'ἔ' => 'Ἔ',
'ἕ' => 'Ἕ',
'ἠ' => 'Ἠ',
'ἡ' => 'Ἡ',
'ἢ' => 'Ἢ',
'ἣ' => 'Ἣ',
'ἤ' => 'Ἤ',
'ἥ' => 'Ἥ',
'ἦ' => 'Ἦ',
'ἧ' => 'Ἧ',
'ἰ' => 'Ἰ',
'ἱ' => 'Ἱ',
'ἲ' => 'Ἲ',
'ἳ' => 'Ἳ',
'ἴ' => 'Ἴ',
'ἵ' => 'Ἵ',
'ἶ' => 'Ἶ',
'ἷ' => 'Ἷ',
'ὀ' => 'Ὀ',
'ὁ' => 'Ὁ',
'ὂ' => 'Ὂ',
'ὃ' => 'Ὃ',
'ὄ' => 'Ὄ',
'ὅ' => 'Ὅ',
'ὑ' => 'Ὑ',
'ὓ' => 'Ὓ',
'ὕ' => 'Ὕ',
'ὗ' => 'Ὗ',
'ὠ' => 'Ὠ',
'ὡ' => 'Ὡ',
'ὢ' => 'Ὢ',
'ὣ' => 'Ὣ',
'ὤ' => 'Ὤ',
'ὥ' => 'Ὥ',
'ὦ' => 'Ὦ',
'ὧ' => 'Ὧ',
'ὰ' => 'Ὰ',
'ά' => 'Ά',
'ὲ' => 'Ὲ',
'έ' => 'Έ',
'ὴ' => 'Ὴ',
'ή' => 'Ή',
'ὶ' => 'Ὶ',
'ί' => 'Ί',
'ὸ' => 'Ὸ',
'ό' => 'Ό',
'ὺ' => 'Ὺ',
'ύ' => 'Ύ',
'ὼ' => 'Ὼ',
'ώ' => 'Ώ',
'ᾀ' => 'ἈΙ',
'ᾁ' => 'ἉΙ',
'ᾂ' => 'ἊΙ',
'ᾃ' => 'ἋΙ',
'ᾄ' => 'ἌΙ',
'ᾅ' => 'ἍΙ',
'ᾆ' => 'ἎΙ',
'ᾇ' => 'ἏΙ',
'ᾐ' => 'ἨΙ',
'ᾑ' => 'ἩΙ',
'ᾒ' => 'ἪΙ',
'ᾓ' => 'ἫΙ',
'ᾔ' => 'ἬΙ',
'ᾕ' => 'ἭΙ',
'ᾖ' => 'ἮΙ',
'ᾗ' => 'ἯΙ',
'ᾠ' => 'ὨΙ',
'ᾡ' => 'ὩΙ',
'ᾢ' => 'ὪΙ',
'ᾣ' => 'ὫΙ',
'ᾤ' => 'ὬΙ',
'ᾥ' => 'ὭΙ',
'ᾦ' => 'ὮΙ',
'ᾧ' => 'ὯΙ',
'ᾰ' => 'Ᾰ',
'ᾱ' => 'Ᾱ',
'ᾳ' => 'ΑΙ',
'ι' => 'Ι',
'ῃ' => 'ΗΙ',
'ῐ' => 'Ῐ',
'ῑ' => 'Ῑ',
'ῠ' => 'Ῠ',
'ῡ' => 'Ῡ',
'ῥ' => 'Ῥ',
'ῳ' => 'ΩΙ',
'ⅎ' => 'Ⅎ',
'ⅰ' => 'Ⅰ',
'ⅱ' => 'Ⅱ',
'ⅲ' => 'Ⅲ',
'ⅳ' => 'Ⅳ',
'ⅴ' => 'Ⅴ',
'ⅵ' => 'Ⅵ',
'ⅶ' => 'Ⅶ',
'ⅷ' => 'Ⅷ',
'ⅸ' => 'Ⅸ',
'ⅹ' => 'Ⅹ',
'ⅺ' => 'Ⅺ',
'ⅻ' => 'Ⅻ',
'ⅼ' => 'Ⅼ',
'ⅽ' => 'Ⅽ',
'ⅾ' => 'Ⅾ',
'ⅿ' => 'Ⅿ',
'ↄ' => 'Ↄ',
'ⓐ' => 'Ⓐ',
'ⓑ' => 'Ⓑ',
'ⓒ' => 'Ⓒ',
'ⓓ' => 'Ⓓ',
'ⓔ' => 'Ⓔ',
'ⓕ' => 'Ⓕ',
'ⓖ' => 'Ⓖ',
'ⓗ' => 'Ⓗ',
'ⓘ' => 'Ⓘ',
'ⓙ' => 'Ⓙ',
'ⓚ' => 'Ⓚ',
'ⓛ' => 'Ⓛ',
'ⓜ' => 'Ⓜ',
'ⓝ' => 'Ⓝ',
'ⓞ' => 'Ⓞ',
'ⓟ' => 'Ⓟ',
'ⓠ' => 'Ⓠ',
'ⓡ' => 'Ⓡ',
'ⓢ' => 'Ⓢ',
'ⓣ' => 'Ⓣ',
'ⓤ' => 'Ⓤ',
'ⓥ' => 'Ⓥ',
'ⓦ' => 'Ⓦ',
'ⓧ' => 'Ⓧ',
'ⓨ' => 'Ⓨ',
'ⓩ' => 'Ⓩ',
'ⰰ' => 'Ⰰ',
'ⰱ' => 'Ⰱ',
'ⰲ' => 'Ⰲ',
'ⰳ' => 'Ⰳ',
'ⰴ' => 'Ⰴ',
'ⰵ' => 'Ⰵ',
'ⰶ' => 'Ⰶ',
'ⰷ' => 'Ⰷ',
'ⰸ' => 'Ⰸ',
'ⰹ' => 'Ⰹ',
'ⰺ' => 'Ⰺ',
'ⰻ' => 'Ⰻ',
'ⰼ' => 'Ⰼ',
'ⰽ' => 'Ⰽ',
'ⰾ' => 'Ⰾ',
'ⰿ' => 'Ⰿ',
'ⱀ' => 'Ⱀ',
'ⱁ' => 'Ⱁ',
'ⱂ' => 'Ⱂ',
'ⱃ' => 'Ⱃ',
'ⱄ' => 'Ⱄ',
'ⱅ' => 'Ⱅ',
'ⱆ' => 'Ⱆ',
'ⱇ' => 'Ⱇ',
'ⱈ' => 'Ⱈ',
'ⱉ' => 'Ⱉ',
'ⱊ' => 'Ⱊ',
'ⱋ' => 'Ⱋ',
'ⱌ' => 'Ⱌ',
'ⱍ' => 'Ⱍ',
'ⱎ' => 'Ⱎ',
'ⱏ' => 'Ⱏ',
'ⱐ' => 'Ⱐ',
'ⱑ' => 'Ⱑ',
'ⱒ' => 'Ⱒ',
'ⱓ' => 'Ⱓ',
'ⱔ' => 'Ⱔ',
'ⱕ' => 'Ⱕ',
'ⱖ' => 'Ⱖ',
'ⱗ' => 'Ⱗ',
'ⱘ' => 'Ⱘ',
'ⱙ' => 'Ⱙ',
'ⱚ' => 'Ⱚ',
'ⱛ' => 'Ⱛ',
'ⱜ' => 'Ⱜ',
'ⱝ' => 'Ⱝ',
'ⱞ' => 'Ⱞ',
'ⱡ' => 'Ⱡ',
'ⱥ' => 'Ⱥ',
'ⱦ' => 'Ⱦ',
'ⱨ' => 'Ⱨ',
'ⱪ' => 'Ⱪ',
'ⱬ' => 'Ⱬ',
'ⱳ' => 'Ⱳ',
'ⱶ' => 'Ⱶ',
'ⲁ' => 'Ⲁ',
'ⲃ' => 'Ⲃ',
'ⲅ' => 'Ⲅ',
'ⲇ' => 'Ⲇ',
'ⲉ' => 'Ⲉ',
'ⲋ' => 'Ⲋ',
'ⲍ' => 'Ⲍ',
'ⲏ' => 'Ⲏ',
'ⲑ' => 'Ⲑ',
'ⲓ' => 'Ⲓ',
'ⲕ' => 'Ⲕ',
'ⲗ' => 'Ⲗ',
'ⲙ' => 'Ⲙ',
'ⲛ' => 'Ⲛ',
'ⲝ' => 'Ⲝ',
'ⲟ' => 'Ⲟ',
'ⲡ' => 'Ⲡ',
'ⲣ' => 'Ⲣ',
'ⲥ' => 'Ⲥ',
'ⲧ' => 'Ⲧ',
'ⲩ' => 'Ⲩ',
'ⲫ' => 'Ⲫ',
'ⲭ' => 'Ⲭ',
'ⲯ' => 'Ⲯ',
'ⲱ' => 'Ⲱ',
'ⲳ' => 'Ⲳ',
'ⲵ' => 'Ⲵ',
'ⲷ' => 'Ⲷ',
'ⲹ' => 'Ⲹ',
'ⲻ' => 'Ⲻ',
'ⲽ' => 'Ⲽ',
'ⲿ' => 'Ⲿ',
'ⳁ' => 'Ⳁ',
'ⳃ' => 'Ⳃ',
'ⳅ' => 'Ⳅ',
'ⳇ' => 'Ⳇ',
'ⳉ' => 'Ⳉ',
'ⳋ' => 'Ⳋ',
'ⳍ' => 'Ⳍ',
'ⳏ' => 'Ⳏ',
'ⳑ' => 'Ⳑ',
'ⳓ' => 'Ⳓ',
'ⳕ' => 'Ⳕ',
'ⳗ' => 'Ⳗ',
'ⳙ' => 'Ⳙ',
'ⳛ' => 'Ⳛ',
'ⳝ' => 'Ⳝ',
'ⳟ' => 'Ⳟ',
'ⳡ' => 'Ⳡ',
'ⳣ' => 'Ⳣ',
'ⳬ' => 'Ⳬ',
'ⳮ' => 'Ⳮ',
'ⳳ' => 'Ⳳ',
'ⴀ' => 'Ⴀ',
'ⴁ' => 'Ⴁ',
'ⴂ' => 'Ⴂ',
'ⴃ' => 'Ⴃ',
'ⴄ' => 'Ⴄ',
'ⴅ' => 'Ⴅ',
'ⴆ' => 'Ⴆ',
'ⴇ' => 'Ⴇ',
'ⴈ' => 'Ⴈ',
'ⴉ' => 'Ⴉ',
'ⴊ' => 'Ⴊ',
'ⴋ' => 'Ⴋ',
'ⴌ' => 'Ⴌ',
'ⴍ' => 'Ⴍ',
'ⴎ' => 'Ⴎ',
'ⴏ' => 'Ⴏ',
'ⴐ' => 'Ⴐ',
'ⴑ' => 'Ⴑ',
'ⴒ' => 'Ⴒ',
'ⴓ' => 'Ⴓ',
'ⴔ' => 'Ⴔ',
'ⴕ' => 'Ⴕ',
'ⴖ' => 'Ⴖ',
'ⴗ' => 'Ⴗ',
'ⴘ' => 'Ⴘ',
'ⴙ' => 'Ⴙ',
'ⴚ' => 'Ⴚ',
'ⴛ' => 'Ⴛ',
'ⴜ' => 'Ⴜ',
'ⴝ' => 'Ⴝ',
'ⴞ' => 'Ⴞ',
'ⴟ' => 'Ⴟ',
'ⴠ' => 'Ⴠ',
'ⴡ' => 'Ⴡ',
'ⴢ' => 'Ⴢ',
'ⴣ' => 'Ⴣ',
'ⴤ' => 'Ⴤ',
'ⴥ' => 'Ⴥ',
'ⴧ' => 'Ⴧ',
'ⴭ' => 'Ⴭ',
'ꙁ' => 'Ꙁ',
'ꙃ' => 'Ꙃ',
'ꙅ' => 'Ꙅ',
'ꙇ' => 'Ꙇ',
'ꙉ' => 'Ꙉ',
'ꙋ' => 'Ꙋ',
'ꙍ' => 'Ꙍ',
'ꙏ' => 'Ꙏ',
'ꙑ' => 'Ꙑ',
'ꙓ' => 'Ꙓ',
'ꙕ' => 'Ꙕ',
'ꙗ' => 'Ꙗ',
'ꙙ' => 'Ꙙ',
'ꙛ' => 'Ꙛ',
'ꙝ' => 'Ꙝ',
'ꙟ' => 'Ꙟ',
'ꙡ' => 'Ꙡ',
'ꙣ' => 'Ꙣ',
'ꙥ' => 'Ꙥ',
'ꙧ' => 'Ꙧ',
'ꙩ' => 'Ꙩ',
'ꙫ' => 'Ꙫ',
'ꙭ' => 'Ꙭ',
'ꚁ' => 'Ꚁ',
'ꚃ' => 'Ꚃ',
'ꚅ' => 'Ꚅ',
'ꚇ' => 'Ꚇ',
'ꚉ' => 'Ꚉ',
'ꚋ' => 'Ꚋ',
'ꚍ' => 'Ꚍ',
'ꚏ' => 'Ꚏ',
'ꚑ' => 'Ꚑ',
'ꚓ' => 'Ꚓ',
'ꚕ' => 'Ꚕ',
'ꚗ' => 'Ꚗ',
'ꚙ' => 'Ꚙ',
'ꚛ' => 'Ꚛ',
'ꜣ' => 'Ꜣ',
'ꜥ' => 'Ꜥ',
'ꜧ' => 'Ꜧ',
'ꜩ' => 'Ꜩ',
'ꜫ' => 'Ꜫ',
'ꜭ' => 'Ꜭ',
'ꜯ' => 'Ꜯ',
'ꜳ' => 'Ꜳ',
'ꜵ' => 'Ꜵ',
'ꜷ' => 'Ꜷ',
'ꜹ' => 'Ꜹ',
'ꜻ' => 'Ꜻ',
'ꜽ' => 'Ꜽ',
'ꜿ' => 'Ꜿ',
'ꝁ' => 'Ꝁ',
'ꝃ' => 'Ꝃ',
'ꝅ' => 'Ꝅ',
'ꝇ' => 'Ꝇ',
'ꝉ' => 'Ꝉ',
'ꝋ' => 'Ꝋ',
'ꝍ' => 'Ꝍ',
'ꝏ' => 'Ꝏ',
'ꝑ' => 'Ꝑ',
'ꝓ' => 'Ꝓ',
'ꝕ' => 'Ꝕ',
'ꝗ' => 'Ꝗ',
'ꝙ' => 'Ꝙ',
'ꝛ' => 'Ꝛ',
'ꝝ' => 'Ꝝ',
'ꝟ' => 'Ꝟ',
'ꝡ' => 'Ꝡ',
'ꝣ' => 'Ꝣ',
'ꝥ' => 'Ꝥ',
'ꝧ' => 'Ꝧ',
'ꝩ' => 'Ꝩ',
'ꝫ' => 'Ꝫ',
'ꝭ' => 'Ꝭ',
'ꝯ' => 'Ꝯ',
'ꝺ' => 'Ꝺ',
'ꝼ' => 'Ꝼ',
'ꝿ' => 'Ꝿ',
'ꞁ' => 'Ꞁ',
'ꞃ' => 'Ꞃ',
'ꞅ' => 'Ꞅ',
'ꞇ' => 'Ꞇ',
'ꞌ' => 'Ꞌ',
'ꞑ' => 'Ꞑ',
'ꞓ' => 'Ꞓ',
'ꞔ' => 'Ꞔ',
'ꞗ' => 'Ꞗ',
'ꞙ' => 'Ꞙ',
'ꞛ' => 'Ꞛ',
'ꞝ' => 'Ꞝ',
'ꞟ' => 'Ꞟ',
'ꞡ' => 'Ꞡ',
'ꞣ' => 'Ꞣ',
'ꞥ' => 'Ꞥ',
'ꞧ' => 'Ꞧ',
'ꞩ' => 'Ꞩ',
'ꞵ' => 'Ꞵ',
'ꞷ' => 'Ꞷ',
'ꞹ' => 'Ꞹ',
'ꞻ' => 'Ꞻ',
'ꞽ' => 'Ꞽ',
'ꞿ' => 'Ꞿ',
'ꟃ' => 'Ꟃ',
'ꟈ' => 'Ꟈ',
'ꟊ' => 'Ꟊ',
'ꟶ' => 'Ꟶ',
'ꭓ' => 'Ꭓ',
'ꭰ' => 'Ꭰ',
'ꭱ' => 'Ꭱ',
'ꭲ' => 'Ꭲ',
'ꭳ' => 'Ꭳ',
'ꭴ' => 'Ꭴ',
'ꭵ' => 'Ꭵ',
'ꭶ' => 'Ꭶ',
'ꭷ' => 'Ꭷ',
'ꭸ' => 'Ꭸ',
'ꭹ' => 'Ꭹ',
'ꭺ' => 'Ꭺ',
'ꭻ' => 'Ꭻ',
'ꭼ' => 'Ꭼ',
'ꭽ' => 'Ꭽ',
'ꭾ' => 'Ꭾ',
'ꭿ' => 'Ꭿ',
'ꮀ' => 'Ꮀ',
'ꮁ' => 'Ꮁ',
'ꮂ' => 'Ꮂ',
'ꮃ' => 'Ꮃ',
'ꮄ' => 'Ꮄ',
'ꮅ' => 'Ꮅ',
'ꮆ' => 'Ꮆ',
'ꮇ' => 'Ꮇ',
'ꮈ' => 'Ꮈ',
'ꮉ' => 'Ꮉ',
'ꮊ' => 'Ꮊ',
'ꮋ' => 'Ꮋ',
'ꮌ' => 'Ꮌ',
'ꮍ' => 'Ꮍ',
'ꮎ' => 'Ꮎ',
'ꮏ' => 'Ꮏ',
'ꮐ' => 'Ꮐ',
'ꮑ' => 'Ꮑ',
'ꮒ' => 'Ꮒ',
'ꮓ' => 'Ꮓ',
'ꮔ' => 'Ꮔ',
'ꮕ' => 'Ꮕ',
'ꮖ' => 'Ꮖ',
'ꮗ' => 'Ꮗ',
'ꮘ' => 'Ꮘ',
'ꮙ' => 'Ꮙ',
'ꮚ' => 'Ꮚ',
'ꮛ' => 'Ꮛ',
'ꮜ' => 'Ꮜ',
'ꮝ' => 'Ꮝ',
'ꮞ' => 'Ꮞ',
'ꮟ' => 'Ꮟ',
'ꮠ' => 'Ꮠ',
'ꮡ' => 'Ꮡ',
'ꮢ' => 'Ꮢ',
'ꮣ' => 'Ꮣ',
'ꮤ' => 'Ꮤ',
'ꮥ' => 'Ꮥ',
'ꮦ' => 'Ꮦ',
'ꮧ' => 'Ꮧ',
'ꮨ' => 'Ꮨ',
'ꮩ' => 'Ꮩ',
'ꮪ' => 'Ꮪ',
'ꮫ' => 'Ꮫ',
'ꮬ' => 'Ꮬ',
'ꮭ' => 'Ꮭ',
'ꮮ' => 'Ꮮ',
'ꮯ' => 'Ꮯ',
'ꮰ' => 'Ꮰ',
'ꮱ' => 'Ꮱ',
'ꮲ' => 'Ꮲ',
'ꮳ' => 'Ꮳ',
'ꮴ' => 'Ꮴ',
'ꮵ' => 'Ꮵ',
'ꮶ' => 'Ꮶ',
'ꮷ' => 'Ꮷ',
'ꮸ' => 'Ꮸ',
'ꮹ' => 'Ꮹ',
'ꮺ' => 'Ꮺ',
'ꮻ' => 'Ꮻ',
'ꮼ' => 'Ꮼ',
'ꮽ' => 'Ꮽ',
'ꮾ' => 'Ꮾ',
'ꮿ' => 'Ꮿ',
'ａ' => 'Ａ',
'ｂ' => 'Ｂ',
'ｃ' => 'Ｃ',
'ｄ' => 'Ｄ',
'ｅ' => 'Ｅ',
'ｆ' => 'Ｆ',
'ｇ' => 'Ｇ',
'ｈ' => 'Ｈ',
'ｉ' => 'Ｉ',
'ｊ' => 'Ｊ',
'ｋ' => 'Ｋ',
'ｌ' => 'Ｌ',
'ｍ' => 'Ｍ',
'ｎ' => 'Ｎ',
'ｏ' => 'Ｏ',
'ｐ' => 'Ｐ',
'ｑ' => 'Ｑ',
'ｒ' => 'Ｒ',
'ｓ' => 'Ｓ',
'ｔ' => 'Ｔ',
'ｕ' => 'Ｕ',
'ｖ' => 'Ｖ',
'ｗ' => 'Ｗ',
'ｘ' => 'Ｘ',
'ｙ' => 'Ｙ',
'ｚ' => 'Ｚ',
'𐐨' => '𐐀',
'𐐩' => '𐐁',
'𐐪' => '𐐂',
'𐐫' => '𐐃',
'𐐬' => '𐐄',
'𐐭' => '𐐅',
'𐐮' => '𐐆',
'𐐯' => '𐐇',
'𐐰' => '𐐈',
'𐐱' => '𐐉',
'𐐲' => '𐐊',
'𐐳' => '𐐋',
'𐐴' => '𐐌',
'𐐵' => '𐐍',
'𐐶' => '𐐎',
'𐐷' => '𐐏',
'𐐸' => '𐐐',
'𐐹' => '𐐑',
'𐐺' => '𐐒',
'𐐻' => '𐐓',
'𐐼' => '𐐔',
'𐐽' => '𐐕',
'𐐾' => '𐐖',
'𐐿' => '𐐗',
'𐑀' => '𐐘',
'𐑁' => '𐐙',
'𐑂' => '𐐚',
'𐑃' => '𐐛',
'𐑄' => '𐐜',
'𐑅' => '𐐝',
'𐑆' => '𐐞',
'𐑇' => '𐐟',
'𐑈' => '𐐠',
'𐑉' => '𐐡',
'𐑊' => '𐐢',
'𐑋' => '𐐣',
'𐑌' => '𐐤',
'𐑍' => '𐐥',
'𐑎' => '𐐦',
'𐑏' => '𐐧',
'𐓘' => '𐒰',
'𐓙' => '𐒱',
'𐓚' => '𐒲',
'𐓛' => '𐒳',
'𐓜' => '𐒴',
'𐓝' => '𐒵',
'𐓞' => '𐒶',
'𐓟' => '𐒷',
'𐓠' => '𐒸',
'𐓡' => '𐒹',
'𐓢' => '𐒺',
'𐓣' => '𐒻',
'𐓤' => '𐒼',
'𐓥' => '𐒽',
'𐓦' => '𐒾',
'𐓧' => '𐒿',
'𐓨' => '𐓀',
'𐓩' => '𐓁',
'𐓪' => '𐓂',
'𐓫' => '𐓃',
'𐓬' => '𐓄',
'𐓭' => '𐓅',
'𐓮' => '𐓆',
'𐓯' => '𐓇',
'𐓰' => '𐓈',
'𐓱' => '𐓉',
'𐓲' => '𐓊',
'𐓳' => '𐓋',
'𐓴' => '𐓌',
'𐓵' => '𐓍',
'𐓶' => '𐓎',
'𐓷' => '𐓏',
'𐓸' => '𐓐',
'𐓹' => '𐓑',
'𐓺' => '𐓒',
'𐓻' => '𐓓',
'𐳀' => '𐲀',
'𐳁' => '𐲁',
'𐳂' => '𐲂',
'𐳃' => '𐲃',
'𐳄' => '𐲄',
'𐳅' => '𐲅',
'𐳆' => '𐲆',
'𐳇' => '𐲇',
'𐳈' => '𐲈',
'𐳉' => '𐲉',
'𐳊' => '𐲊',
'𐳋' => '𐲋',
'𐳌' => '𐲌',
'𐳍' => '𐲍',
'𐳎' => '𐲎',
'𐳏' => '𐲏',
'𐳐' => '𐲐',
'𐳑' => '𐲑',
'𐳒' => '𐲒',
'𐳓' => '𐲓',
'𐳔' => '𐲔',
'𐳕' => '𐲕',
'𐳖' => '𐲖',
'𐳗' => '𐲗',
'𐳘' => '𐲘',
'𐳙' => '𐲙',
'𐳚' => '𐲚',
'𐳛' => '𐲛',
'𐳜' => '𐲜',
'𐳝' => '𐲝',
'𐳞' => '𐲞',
'𐳟' => '𐲟',
'𐳠' => '𐲠',
'𐳡' => '𐲡',
'𐳢' => '𐲢',
'𐳣' => '𐲣',
'𐳤' => '𐲤',
'𐳥' => '𐲥',
'𐳦' => '𐲦',
'𐳧' => '𐲧',
'𐳨' => '𐲨',
'𐳩' => '𐲩',
'𐳪' => '𐲪',
'𐳫' => '𐲫',
'𐳬' => '𐲬',
'𐳭' => '𐲭',
'𐳮' => '𐲮',
'𐳯' => '𐲯',
'𐳰' => '𐲰',
'𐳱' => '𐲱',
'𐳲' => '𐲲',
'𑣀' => '𑢠',
'𑣁' => '𑢡',
'𑣂' => '𑢢',
'𑣃' => '𑢣',
'𑣄' => '𑢤',
'𑣅' => '𑢥',
'𑣆' => '𑢦',
'𑣇' => '𑢧',
'𑣈' => '𑢨',
'𑣉' => '𑢩',
'𑣊' => '𑢪',
'𑣋' => '𑢫',
'𑣌' => '𑢬',
'𑣍' => '𑢭',
'𑣎' => '𑢮',
'𑣏' => '𑢯',
'𑣐' => '𑢰',
'𑣑' => '𑢱',
'𑣒' => '𑢲',
'𑣓' => '𑢳',
'𑣔' => '𑢴',
'𑣕' => '𑢵',
'𑣖' => '𑢶',
'𑣗' => '𑢷',
'𑣘' => '𑢸',
'𑣙' => '𑢹',
'𑣚' => '𑢺',
'𑣛' => '𑢻',
'𑣜' => '𑢼',
'𑣝' => '𑢽',
'𑣞' => '𑢾',
'𑣟' => '𑢿',
'𖹠' => '𖹀',
'𖹡' => '𖹁',
'𖹢' => '𖹂',
'𖹣' => '𖹃',
'𖹤' => '𖹄',
'𖹥' => '𖹅',
'𖹦' => '𖹆',
'𖹧' => '𖹇',
'𖹨' => '𖹈',
'𖹩' => '𖹉',
'𖹪' => '𖹊',
'𖹫' => '𖹋',
'𖹬' => '𖹌',
'𖹭' => '𖹍',
'𖹮' => '𖹎',
'𖹯' => '𖹏',
'𖹰' => '𖹐',
'𖹱' => '𖹑',
'𖹲' => '𖹒',
'𖹳' => '𖹓',
'𖹴' => '𖹔',
'𖹵' => '𖹕',
'𖹶' => '𖹖',
'𖹷' => '𖹗',
'𖹸' => '𖹘',
'𖹹' => '𖹙',
'𖹺' => '𖹚',
'𖹻' => '𖹛',
'𖹼' => '𖹜',
'𖹽' => '𖹝',
'𖹾' => '𖹞',
'𖹿' => '𖹟',
'𞤢' => '𞤀',
'𞤣' => '𞤁',
'𞤤' => '𞤂',
'𞤥' => '𞤃',
'𞤦' => '𞤄',
'𞤧' => '𞤅',
'𞤨' => '𞤆',
'𞤩' => '𞤇',
'𞤪' => '𞤈',
'𞤫' => '𞤉',
'𞤬' => '𞤊',
'𞤭' => '𞤋',
'𞤮' => '𞤌',
'𞤯' => '𞤍',
'𞤰' => '𞤎',
'𞤱' => '𞤏',
'𞤲' => '𞤐',
'𞤳' => '𞤑',
'𞤴' => '𞤒',
'𞤵' => '𞤓',
'𞤶' => '𞤔',
'𞤷' => '𞤕',
'𞤸' => '𞤖',
'𞤹' => '𞤗',
'𞤺' => '𞤘',
'𞤻' => '𞤙',
'𞤼' => '𞤚',
'𞤽' => '𞤛',
'𞤾' => '𞤜',
'𞤿' => '𞤝',
'𞥀' => '𞤞',
'𞥁' => '𞤟',
'𞥂' => '𞤠',
'𞥃' => '𞤡',
'ß' => 'SS',
'ﬀ' => 'FF',
'ﬁ' => 'FI',
'ﬂ' => 'FL',
'ﬃ' => 'FFI',
'ﬄ' => 'FFL',
'ﬅ' => 'ST',
'ﬆ' => 'ST',
'և' => 'ԵՒ',
'ﬓ' => 'ՄՆ',
'ﬔ' => 'ՄԵ',
'ﬕ' => 'ՄԻ',
'ﬖ' => 'ՎՆ',
'ﬗ' => 'ՄԽ',
'ŉ' => 'ʼN',
'ΐ' => 'Ϊ́',
'ΰ' => 'Ϋ́',
'ǰ' => 'J̌',
'ẖ' => 'H̱',
'ẗ' => 'T̈',
'ẘ' => 'W̊',
'ẙ' => 'Y̊',
'ẚ' => 'Aʾ',
'ὐ' => 'Υ̓',
'ὒ' => 'Υ̓̀',
'ὔ' => 'Υ̓́',
'ὖ' => 'Υ̓͂',
'ᾶ' => 'Α͂',
'ῆ' => 'Η͂',
'ῒ' => 'Ϊ̀',
'ΐ' => 'Ϊ́',
'ῖ' => 'Ι͂',
'ῗ' => 'Ϊ͂',
'ῢ' => 'Ϋ̀',
'ΰ' => 'Ϋ́',
'ῤ' => 'Ρ̓',
'ῦ' => 'Υ͂',
'ῧ' => 'Ϋ͂',
'ῶ' => 'Ω͂',
'ᾈ' => 'ἈΙ',
'ᾉ' => 'ἉΙ',
'ᾊ' => 'ἊΙ',
'ᾋ' => 'ἋΙ',
'ᾌ' => 'ἌΙ',
'ᾍ' => 'ἍΙ',
'ᾎ' => 'ἎΙ',
'ᾏ' => 'ἏΙ',
'ᾘ' => 'ἨΙ',
'ᾙ' => 'ἩΙ',
'ᾚ' => 'ἪΙ',
'ᾛ' => 'ἫΙ',
'ᾜ' => 'ἬΙ',
'ᾝ' => 'ἭΙ',
'ᾞ' => 'ἮΙ',
'ᾟ' => 'ἯΙ',
'ᾨ' => 'ὨΙ',
'ᾩ' => 'ὩΙ',
'ᾪ' => 'ὪΙ',
'ᾫ' => 'ὫΙ',
'ᾬ' => 'ὬΙ',
'ᾭ' => 'ὭΙ',
'ᾮ' => 'ὮΙ',
'ᾯ' => 'ὯΙ',
'ᾼ' => 'ΑΙ',
'ῌ' => 'ΗΙ',
'ῼ' => 'ΩΙ',
'ᾲ' => 'ᾺΙ',
'ᾴ' => 'ΆΙ',
'ῂ' => 'ῊΙ',
'ῄ' => 'ΉΙ',
'ῲ' => 'ῺΙ',
'ῴ' => 'ΏΙ',
'ᾷ' => 'Α͂Ι',
'ῇ' => 'Η͂Ι',
'ῷ' => 'Ω͂Ι',
);
<?php

return array (
'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',
'À' => 'à',
'Á' => 'á',
'Â' => 'â',
'Ã' => 'ã',
'Ä' => 'ä',
'Å' => 'å',
'Æ' => 'æ',
'Ç' => 'ç',
'È' => 'è',
'É' => 'é',
'Ê' => 'ê',
'Ë' => 'ë',
'Ì' => 'ì',
'Í' => 'í',
'Î' => 'î',
'Ï' => 'ï',
'Ð' => 'ð',
'Ñ' => 'ñ',
'Ò' => 'ò',
'Ó' => 'ó',
'Ô' => 'ô',
'Õ' => 'õ',
'Ö' => 'ö',
'Ø' => 'ø',
'Ù' => 'ù',
'Ú' => 'ú',
'Û' => 'û',
'Ü' => 'ü',
'Ý' => 'ý',
'Þ' => 'þ',
'Ā' => 'ā',
'Ă' => 'ă',
'Ą' => 'ą',
'Ć' => 'ć',
'Ĉ' => 'ĉ',
'Ċ' => 'ċ',
'Č' => 'č',
'Ď' => 'ď',
'Đ' => 'đ',
'Ē' => 'ē',
'Ĕ' => 'ĕ',
'Ė' => 'ė',
'Ę' => 'ę',
'Ě' => 'ě',
'Ĝ' => 'ĝ',
'Ğ' => 'ğ',
'Ġ' => 'ġ',
'Ģ' => 'ģ',
'Ĥ' => 'ĥ',
'Ħ' => 'ħ',
'Ĩ' => 'ĩ',
'Ī' => 'ī',
'Ĭ' => 'ĭ',
'Į' => 'į',
'İ' => 'i̇',
'Ĳ' => 'ĳ',
'Ĵ' => 'ĵ',
'Ķ' => 'ķ',
'Ĺ' => 'ĺ',
'Ļ' => 'ļ',
'Ľ' => 'ľ',
'Ŀ' => 'ŀ',
'Ł' => 'ł',
'Ń' => 'ń',
'Ņ' => 'ņ',
'Ň' => 'ň',
'Ŋ' => 'ŋ',
'Ō' => 'ō',
'Ŏ' => 'ŏ',
'Ő' => 'ő',
'Œ' => 'œ',
'Ŕ' => 'ŕ',
'Ŗ' => 'ŗ',
'Ř' => 'ř',
'Ś' => 'ś',
'Ŝ' => 'ŝ',
'Ş' => 'ş',
'Š' => 'š',
'Ţ' => 'ţ',
'Ť' => 'ť',
'Ŧ' => 'ŧ',
'Ũ' => 'ũ',
'Ū' => 'ū',
'Ŭ' => 'ŭ',
'Ů' => 'ů',
'Ű' => 'ű',
'Ų' => 'ų',
'Ŵ' => 'ŵ',
'Ŷ' => 'ŷ',
'Ÿ' => 'ÿ',
'Ź' => 'ź',
'Ż' => 'ż',
'Ž' => 'ž',
'Ɓ' => 'ɓ',
'Ƃ' => 'ƃ',
'Ƅ' => 'ƅ',
'Ɔ' => 'ɔ',
'Ƈ' => 'ƈ',
'Ɖ' => 'ɖ',
'Ɗ' => 'ɗ',
'Ƌ' => 'ƌ',
'Ǝ' => 'ǝ',
'Ə' => 'ə',
'Ɛ' => 'ɛ',
'Ƒ' => 'ƒ',
'Ɠ' => 'ɠ',
'Ɣ' => 'ɣ',
'Ɩ' => 'ɩ',
'Ɨ' => 'ɨ',
'Ƙ' => 'ƙ',
'Ɯ' => 'ɯ',
'Ɲ' => 'ɲ',
'Ɵ' => 'ɵ',
'Ơ' => 'ơ',
'Ƣ' => 'ƣ',
'Ƥ' => 'ƥ',
'Ʀ' => 'ʀ',
'Ƨ' => 'ƨ',
'Ʃ' => 'ʃ',
'Ƭ' => 'ƭ',
'Ʈ' => 'ʈ',
'Ư' => 'ư',
'Ʊ' => 'ʊ',
'Ʋ' => 'ʋ',
'Ƴ' => 'ƴ',
'Ƶ' => 'ƶ',
'Ʒ' => 'ʒ',
'Ƹ' => 'ƹ',
'Ƽ' => 'ƽ',
'Ǆ' => 'ǆ',
'ǅ' => 'ǆ',
'Ǉ' => 'ǉ',
'ǈ' => 'ǉ',
'Ǌ' => 'ǌ',
'ǋ' => 'ǌ',
'Ǎ' => 'ǎ',
'Ǐ' => 'ǐ',
'Ǒ' => 'ǒ',
'Ǔ' => 'ǔ',
'Ǖ' => 'ǖ',
'Ǘ' => 'ǘ',
'Ǚ' => 'ǚ',
'Ǜ' => 'ǜ',
'Ǟ' => 'ǟ',
'Ǡ' => 'ǡ',
'Ǣ' => 'ǣ',
'Ǥ' => 'ǥ',
'Ǧ' => 'ǧ',
'Ǩ' => 'ǩ',
'Ǫ' => 'ǫ',
'Ǭ' => 'ǭ',
'Ǯ' => 'ǯ',
'Ǳ' => 'ǳ',
'ǲ' => 'ǳ',
'Ǵ' => 'ǵ',
'Ƕ' => 'ƕ',
'Ƿ' => 'ƿ',
'Ǹ' => 'ǹ',
'Ǻ' => 'ǻ',
'Ǽ' => 'ǽ',
'Ǿ' => 'ǿ',
'Ȁ' => 'ȁ',
'Ȃ' => 'ȃ',
'Ȅ' => 'ȅ',
'Ȇ' => 'ȇ',
'Ȉ' => 'ȉ',
'Ȋ' => 'ȋ',
'Ȍ' => 'ȍ',
'Ȏ' => 'ȏ',
'Ȑ' => 'ȑ',
'Ȓ' => 'ȓ',
'Ȕ' => 'ȕ',
'Ȗ' => 'ȗ',
'Ș' => 'ș',
'Ț' => 'ț',
'Ȝ' => 'ȝ',
'Ȟ' => 'ȟ',
'Ƞ' => 'ƞ',
'Ȣ' => 'ȣ',
'Ȥ' => 'ȥ',
'Ȧ' => 'ȧ',
'Ȩ' => 'ȩ',
'Ȫ' => 'ȫ',
'Ȭ' => 'ȭ',
'Ȯ' => 'ȯ',
'Ȱ' => 'ȱ',
'Ȳ' => 'ȳ',
'Ⱥ' => 'ⱥ',
'Ȼ' => 'ȼ',
'Ƚ' => 'ƚ',
'Ⱦ' => 'ⱦ',
'Ɂ' => 'ɂ',
'Ƀ' => 'ƀ',
'Ʉ' => 'ʉ',
'Ʌ' => 'ʌ',
'Ɇ' => 'ɇ',
'Ɉ' => 'ɉ',
'Ɋ' => 'ɋ',
'Ɍ' => 'ɍ',
'Ɏ' => 'ɏ',
'Ͱ' => 'ͱ',
'Ͳ' => 'ͳ',
'Ͷ' => 'ͷ',
'Ϳ' => 'ϳ',
'Ά' => 'ά',
'Έ' => 'έ',
'Ή' => 'ή',
'Ί' => 'ί',
'Ό' => 'ό',
'Ύ' => 'ύ',
'Ώ' => 'ώ',
'Α' => 'α',
'Β' => 'β',
'Γ' => 'γ',
'Δ' => 'δ',
'Ε' => 'ε',
'Ζ' => 'ζ',
'Η' => 'η',
'Θ' => 'θ',
'Ι' => 'ι',
'Κ' => 'κ',
'Λ' => 'λ',
'Μ' => 'μ',
'Ν' => 'ν',
'Ξ' => 'ξ',
'Ο' => 'ο',
'Π' => 'π',
'Ρ' => 'ρ',
'Σ' => 'σ',
'Τ' => 'τ',
'Υ' => 'υ',
'Φ' => 'φ',
'Χ' => 'χ',
'Ψ' => 'ψ',
'Ω' => 'ω',
'Ϊ' => 'ϊ',
'Ϋ' => 'ϋ',
'Ϗ' => 'ϗ',
'Ϙ' => 'ϙ',
'Ϛ' => 'ϛ',
'Ϝ' => 'ϝ',
'Ϟ' => 'ϟ',
'Ϡ' => 'ϡ',
'Ϣ' => 'ϣ',
'Ϥ' => 'ϥ',
'Ϧ' => 'ϧ',
'Ϩ' => 'ϩ',
'Ϫ' => 'ϫ',
'Ϭ' => 'ϭ',
'Ϯ' => 'ϯ',
'ϴ' => 'θ',
'Ϸ' => 'ϸ',
'Ϲ' => 'ϲ',
'Ϻ' => 'ϻ',
'Ͻ' => 'ͻ',
'Ͼ' => 'ͼ',
'Ͽ' => 'ͽ',
'Ѐ' => 'ѐ',
'Ё' => 'ё',
'Ђ' => 'ђ',
'Ѓ' => 'ѓ',
'Є' => 'є',
'Ѕ' => 'ѕ',
'І' => 'і',
'Ї' => 'ї',
'Ј' => 'ј',
'Љ' => 'љ',
'Њ' => 'њ',
'Ћ' => 'ћ',
'Ќ' => 'ќ',
'Ѝ' => 'ѝ',
'Ў' => 'ў',
'Џ' => 'џ',
'А' => 'а',
'Б' => 'б',
'В' => 'в',
'Г' => 'г',
'Д' => 'д',
'Е' => 'е',
'Ж' => 'ж',
'З' => 'з',
'И' => 'и',
'Й' => 'й',
'К' => 'к',
'Л' => 'л',
'М' => 'м',
'Н' => 'н',
'О' => 'о',
'П' => 'п',
'Р' => 'р',
'С' => 'с',
'Т' => 'т',
'У' => 'у',
'Ф' => 'ф',
'Х' => 'х',
'Ц' => 'ц',
'Ч' => 'ч',
'Ш' => 'ш',
'Щ' => 'щ',
'Ъ' => 'ъ',
'Ы' => 'ы',
'Ь' => 'ь',
'Э' => 'э',
'Ю' => 'ю',
'Я' => 'я',
'Ѡ' => 'ѡ',
'Ѣ' => 'ѣ',
'Ѥ' => 'ѥ',
'Ѧ' => 'ѧ',
'Ѩ' => 'ѩ',
'Ѫ' => 'ѫ',
'Ѭ' => 'ѭ',
'Ѯ' => 'ѯ',
'Ѱ' => 'ѱ',
'Ѳ' => 'ѳ',
'Ѵ' => 'ѵ',
'Ѷ' => 'ѷ',
'Ѹ' => 'ѹ',
'Ѻ' => 'ѻ',
'Ѽ' => 'ѽ',
'Ѿ' => 'ѿ',
'Ҁ' => 'ҁ',
'Ҋ' => 'ҋ',
'Ҍ' => 'ҍ',
'Ҏ' => 'ҏ',
'Ґ' => 'ґ',
'Ғ' => 'ғ',
'Ҕ' => 'ҕ',
'Җ' => 'җ',
'Ҙ' => 'ҙ',
'Қ' => 'қ',
'Ҝ' => 'ҝ',
'Ҟ' => 'ҟ',
'Ҡ' => 'ҡ',
'Ң' => 'ң',
'Ҥ' => 'ҥ',
'Ҧ' => 'ҧ',
'Ҩ' => 'ҩ',
'Ҫ' => 'ҫ',
'Ҭ' => 'ҭ',
'Ү' => 'ү',
'Ұ' => 'ұ',
'Ҳ' => 'ҳ',
'Ҵ' => 'ҵ',
'Ҷ' => 'ҷ',
'Ҹ' => 'ҹ',
'Һ' => 'һ',
'Ҽ' => 'ҽ',
'Ҿ' => 'ҿ',
'Ӏ' => 'ӏ',
'Ӂ' => 'ӂ',
'Ӄ' => 'ӄ',
'Ӆ' => 'ӆ',
'Ӈ' => 'ӈ',
'Ӊ' => 'ӊ',
'Ӌ' => 'ӌ',
'Ӎ' => 'ӎ',
'Ӑ' => 'ӑ',
'Ӓ' => 'ӓ',
'Ӕ' => 'ӕ',
'Ӗ' => 'ӗ',
'Ә' => 'ә',
'Ӛ' => 'ӛ',
'Ӝ' => 'ӝ',
'Ӟ' => 'ӟ',
'Ӡ' => 'ӡ',
'Ӣ' => 'ӣ',
'Ӥ' => 'ӥ',
'Ӧ' => 'ӧ',
'Ө' => 'ө',
'Ӫ' => 'ӫ',
'Ӭ' => 'ӭ',
'Ӯ' => 'ӯ',
'Ӱ' => 'ӱ',
'Ӳ' => 'ӳ',
'Ӵ' => 'ӵ',
'Ӷ' => 'ӷ',
'Ӹ' => 'ӹ',
'Ӻ' => 'ӻ',
'Ӽ' => 'ӽ',
'Ӿ' => 'ӿ',
'Ԁ' => 'ԁ',
'Ԃ' => 'ԃ',
'Ԅ' => 'ԅ',
'Ԇ' => 'ԇ',
'Ԉ' => 'ԉ',
'Ԋ' => 'ԋ',
'Ԍ' => 'ԍ',
'Ԏ' => 'ԏ',
'Ԑ' => 'ԑ',
'Ԓ' => 'ԓ',
'Ԕ' => 'ԕ',
'Ԗ' => 'ԗ',
'Ԙ' => 'ԙ',
'Ԛ' => 'ԛ',
'Ԝ' => 'ԝ',
'Ԟ' => 'ԟ',
'Ԡ' => 'ԡ',
'Ԣ' => 'ԣ',
'Ԥ' => 'ԥ',
'Ԧ' => 'ԧ',
'Ԩ' => 'ԩ',
'Ԫ' => 'ԫ',
'Ԭ' => 'ԭ',
'Ԯ' => 'ԯ',
'Ա' => 'ա',
'Բ' => 'բ',
'Գ' => 'գ',
'Դ' => 'դ',
'Ե' => 'ե',
'Զ' => 'զ',
'Է' => 'է',
'Ը' => 'ը',
'Թ' => 'թ',
'Ժ' => 'ժ',
'Ի' => 'ի',
'Լ' => 'լ',
'Խ' => 'խ',
'Ծ' => 'ծ',
'Կ' => 'կ',
'Հ' => 'հ',
'Ձ' => 'ձ',
'Ղ' => 'ղ',
'Ճ' => 'ճ',
'Մ' => 'մ',
'Յ' => 'յ',
'Ն' => 'ն',
'Շ' => 'շ',
'Ո' => 'ո',
'Չ' => 'չ',
'Պ' => 'պ',
'Ջ' => 'ջ',
'Ռ' => 'ռ',
'Ս' => 'ս',
'Վ' => 'վ',
'Տ' => 'տ',
'Ր' => 'ր',
'Ց' => 'ց',
'Ւ' => 'ւ',
'Փ' => 'փ',
'Ք' => 'ք',
'Օ' => 'օ',
'Ֆ' => 'ֆ',
'Ⴀ' => 'ⴀ',
'Ⴁ' => 'ⴁ',
'Ⴂ' => 'ⴂ',
'Ⴃ' => 'ⴃ',
'Ⴄ' => 'ⴄ',
'Ⴅ' => 'ⴅ',
'Ⴆ' => 'ⴆ',
'Ⴇ' => 'ⴇ',
'Ⴈ' => 'ⴈ',
'Ⴉ' => 'ⴉ',
'Ⴊ' => 'ⴊ',
'Ⴋ' => 'ⴋ',
'Ⴌ' => 'ⴌ',
'Ⴍ' => 'ⴍ',
'Ⴎ' => 'ⴎ',
'Ⴏ' => 'ⴏ',
'Ⴐ' => 'ⴐ',
'Ⴑ' => 'ⴑ',
'Ⴒ' => 'ⴒ',
'Ⴓ' => 'ⴓ',
'Ⴔ' => 'ⴔ',
'Ⴕ' => 'ⴕ',
'Ⴖ' => 'ⴖ',
'Ⴗ' => 'ⴗ',
'Ⴘ' => 'ⴘ',
'Ⴙ' => 'ⴙ',
'Ⴚ' => 'ⴚ',
'Ⴛ' => 'ⴛ',
'Ⴜ' => 'ⴜ',
'Ⴝ' => 'ⴝ',
'Ⴞ' => 'ⴞ',
'Ⴟ' => 'ⴟ',
'Ⴠ' => 'ⴠ',
'Ⴡ' => 'ⴡ',
'Ⴢ' => 'ⴢ',
'Ⴣ' => 'ⴣ',
'Ⴤ' => 'ⴤ',
'Ⴥ' => 'ⴥ',
'Ⴧ' => 'ⴧ',
'Ⴭ' => 'ⴭ',
'Ꭰ' => 'ꭰ',
'Ꭱ' => 'ꭱ',
'Ꭲ' => 'ꭲ',
'Ꭳ' => 'ꭳ',
'Ꭴ' => 'ꭴ',
'Ꭵ' => 'ꭵ',
'Ꭶ' => 'ꭶ',
'Ꭷ' => 'ꭷ',
'Ꭸ' => 'ꭸ',
'Ꭹ' => 'ꭹ',
'Ꭺ' => 'ꭺ',
'Ꭻ' => 'ꭻ',
'Ꭼ' => 'ꭼ',
'Ꭽ' => 'ꭽ',
'Ꭾ' => 'ꭾ',
'Ꭿ' => 'ꭿ',
'Ꮀ' => 'ꮀ',
'Ꮁ' => 'ꮁ',
'Ꮂ' => 'ꮂ',
'Ꮃ' => 'ꮃ',
'Ꮄ' => 'ꮄ',
'Ꮅ' => 'ꮅ',
'Ꮆ' => 'ꮆ',
'Ꮇ' => 'ꮇ',
'Ꮈ' => 'ꮈ',
'Ꮉ' => 'ꮉ',
'Ꮊ' => 'ꮊ',
'Ꮋ' => 'ꮋ',
'Ꮌ' => 'ꮌ',
'Ꮍ' => 'ꮍ',
'Ꮎ' => 'ꮎ',
'Ꮏ' => 'ꮏ',
'Ꮐ' => 'ꮐ',
'Ꮑ' => 'ꮑ',
'Ꮒ' => 'ꮒ',
'Ꮓ' => 'ꮓ',
'Ꮔ' => 'ꮔ',
'Ꮕ' => 'ꮕ',
'Ꮖ' => 'ꮖ',
'Ꮗ' => 'ꮗ',
'Ꮘ' => 'ꮘ',
'Ꮙ' => 'ꮙ',
'Ꮚ' => 'ꮚ',
'Ꮛ' => 'ꮛ',
'Ꮜ' => 'ꮜ',
'Ꮝ' => 'ꮝ',
'Ꮞ' => 'ꮞ',
'Ꮟ' => 'ꮟ',
'Ꮠ' => 'ꮠ',
'Ꮡ' => 'ꮡ',
'Ꮢ' => 'ꮢ',
'Ꮣ' => 'ꮣ',
'Ꮤ' => 'ꮤ',
'Ꮥ' => 'ꮥ',
'Ꮦ' => 'ꮦ',
'Ꮧ' => 'ꮧ',
'Ꮨ' => 'ꮨ',
'Ꮩ' => 'ꮩ',
'Ꮪ' => 'ꮪ',
'Ꮫ' => 'ꮫ',
'Ꮬ' => 'ꮬ',
'Ꮭ' => 'ꮭ',
'Ꮮ' => 'ꮮ',
'Ꮯ' => 'ꮯ',
'Ꮰ' => 'ꮰ',
'Ꮱ' => 'ꮱ',
'Ꮲ' => 'ꮲ',
'Ꮳ' => 'ꮳ',
'Ꮴ' => 'ꮴ',
'Ꮵ' => 'ꮵ',
'Ꮶ' => 'ꮶ',
'Ꮷ' => 'ꮷ',
'Ꮸ' => 'ꮸ',
'Ꮹ' => 'ꮹ',
'Ꮺ' => 'ꮺ',
'Ꮻ' => 'ꮻ',
'Ꮼ' => 'ꮼ',
'Ꮽ' => 'ꮽ',
'Ꮾ' => 'ꮾ',
'Ꮿ' => 'ꮿ',
'Ᏸ' => 'ᏸ',
'Ᏹ' => 'ᏹ',
'Ᏺ' => 'ᏺ',
'Ᏻ' => 'ᏻ',
'Ᏼ' => 'ᏼ',
'Ᏽ' => 'ᏽ',
'Ა' => 'ა',
'Ბ' => 'ბ',
'Გ' => 'გ',
'Დ' => 'დ',
'Ე' => 'ე',
'Ვ' => 'ვ',
'Ზ' => 'ზ',
'Თ' => 'თ',
'Ი' => 'ი',
'Კ' => 'კ',
'Ლ' => 'ლ',
'Მ' => 'მ',
'Ნ' => 'ნ',
'Ო' => 'ო',
'Პ' => 'პ',
'Ჟ' => 'ჟ',
'Რ' => 'რ',
'Ს' => 'ს',
'Ტ' => 'ტ',
'Უ' => 'უ',
'Ფ' => 'ფ',
'Ქ' => 'ქ',
'Ღ' => 'ღ',
'Ყ' => 'ყ',
'Შ' => 'შ',
'Ჩ' => 'ჩ',
'Ც' => 'ც',
'Ძ' => 'ძ',
'Წ' => 'წ',
'Ჭ' => 'ჭ',
'Ხ' => 'ხ',
'Ჯ' => 'ჯ',
'Ჰ' => 'ჰ',
'Ჱ' => 'ჱ',
'Ჲ' => 'ჲ',
'Ჳ' => 'ჳ',
'Ჴ' => 'ჴ',
'Ჵ' => 'ჵ',
'Ჶ' => 'ჶ',
'Ჷ' => 'ჷ',
'Ჸ' => 'ჸ',
'Ჹ' => 'ჹ',
'Ჺ' => 'ჺ',
'Ჽ' => 'ჽ',
'Ჾ' => 'ჾ',
'Ჿ' => 'ჿ',
'Ḁ' => 'ḁ',
'Ḃ' => 'ḃ',
'Ḅ' => 'ḅ',
'Ḇ' => 'ḇ',
'Ḉ' => 'ḉ',
'Ḋ' => 'ḋ',
'Ḍ' => 'ḍ',
'Ḏ' => 'ḏ',
'Ḑ' => 'ḑ',
'Ḓ' => 'ḓ',
'Ḕ' => 'ḕ',
'Ḗ' => 'ḗ',
'Ḙ' => 'ḙ',
'Ḛ' => 'ḛ',
'Ḝ' => 'ḝ',
'Ḟ' => 'ḟ',
'Ḡ' => 'ḡ',
'Ḣ' => 'ḣ',
'Ḥ' => 'ḥ',
'Ḧ' => 'ḧ',
'Ḩ' => 'ḩ',
'Ḫ' => 'ḫ',
'Ḭ' => 'ḭ',
'Ḯ' => 'ḯ',
'Ḱ' => 'ḱ',
'Ḳ' => 'ḳ',
'Ḵ' => 'ḵ',
'Ḷ' => 'ḷ',
'Ḹ' => 'ḹ',
'Ḻ' => 'ḻ',
'Ḽ' => 'ḽ',
'Ḿ' => 'ḿ',
'Ṁ' => 'ṁ',
'Ṃ' => 'ṃ',
'Ṅ' => 'ṅ',
'Ṇ' => 'ṇ',
'Ṉ' => 'ṉ',
'Ṋ' => 'ṋ',
'Ṍ' => 'ṍ',
'Ṏ' => 'ṏ',
'Ṑ' => 'ṑ',
'Ṓ' => 'ṓ',
'Ṕ' => 'ṕ',
'Ṗ' => 'ṗ',
'Ṙ' => 'ṙ',
'Ṛ' => 'ṛ',
'Ṝ' => 'ṝ',
'Ṟ' => 'ṟ',
'Ṡ' => 'ṡ',
'Ṣ' => 'ṣ',
'Ṥ' => 'ṥ',
'Ṧ' => 'ṧ',
'Ṩ' => 'ṩ',
'Ṫ' => 'ṫ',
'Ṭ' => 'ṭ',
'Ṯ' => 'ṯ',
'Ṱ' => 'ṱ',
'Ṳ' => 'ṳ',
'Ṵ' => 'ṵ',
'Ṷ' => 'ṷ',
'Ṹ' => 'ṹ',
'Ṻ' => 'ṻ',
'Ṽ' => 'ṽ',
'Ṿ' => 'ṿ',
'Ẁ' => 'ẁ',
'Ẃ' => 'ẃ',
'Ẅ' => 'ẅ',
'Ẇ' => 'ẇ',
'Ẉ' => 'ẉ',
'Ẋ' => 'ẋ',
'Ẍ' => 'ẍ',
'Ẏ' => 'ẏ',
'Ẑ' => 'ẑ',
'Ẓ' => 'ẓ',
'Ẕ' => 'ẕ',
'ẞ' => 'ß',
'Ạ' => 'ạ',
'Ả' => 'ả',
'Ấ' => 'ấ',
'Ầ' => 'ầ',
'Ẩ' => 'ẩ',
'Ẫ' => 'ẫ',
'Ậ' => 'ậ',
'Ắ' => 'ắ',
'Ằ' => 'ằ',
'Ẳ' => 'ẳ',
'Ẵ' => 'ẵ',
'Ặ' => 'ặ',
'Ẹ' => 'ẹ',
'Ẻ' => 'ẻ',
'Ẽ' => 'ẽ',
'Ế' => 'ế',
'Ề' => 'ề',
'Ể' => 'ể',
'Ễ' => 'ễ',
'Ệ' => 'ệ',
'Ỉ' => 'ỉ',
'Ị' => 'ị',
'Ọ' => 'ọ',
'Ỏ' => 'ỏ',
'Ố' => 'ố',
'Ồ' => 'ồ',
'Ổ' => 'ổ',
'Ỗ' => 'ỗ',
'Ộ' => 'ộ',
'Ớ' => 'ớ',
'Ờ' => 'ờ',
'Ở' => 'ở',
'Ỡ' => 'ỡ',
'Ợ' => 'ợ',
'Ụ' => 'ụ',
'Ủ' => 'ủ',
'Ứ' => 'ứ',
'Ừ' => 'ừ',
'Ử' => 'ử',
'Ữ' => 'ữ',
'Ự' => 'ự',
'Ỳ' => 'ỳ',
'Ỵ' => 'ỵ',
'Ỷ' => 'ỷ',
'Ỹ' => 'ỹ',
'Ỻ' => 'ỻ',
'Ỽ' => 'ỽ',
'Ỿ' => 'ỿ',
'Ἀ' => 'ἀ',
'Ἁ' => 'ἁ',
'Ἂ' => 'ἂ',
'Ἃ' => 'ἃ',
'Ἄ' => 'ἄ',
'Ἅ' => 'ἅ',
'Ἆ' => 'ἆ',
'Ἇ' => 'ἇ',
'Ἐ' => 'ἐ',
'Ἑ' => 'ἑ',
'Ἒ' => 'ἒ',
'Ἓ' => 'ἓ',
'Ἔ' => 'ἔ',
'Ἕ' => 'ἕ',
'Ἠ' => 'ἠ',
'Ἡ' => 'ἡ',
'Ἢ' => 'ἢ',
'Ἣ' => 'ἣ',
'Ἤ' => 'ἤ',
'Ἥ' => 'ἥ',
'Ἦ' => 'ἦ',
'Ἧ' => 'ἧ',
'Ἰ' => 'ἰ',
'Ἱ' => 'ἱ',
'Ἲ' => 'ἲ',
'Ἳ' => 'ἳ',
'Ἴ' => 'ἴ',
'Ἵ' => 'ἵ',
'Ἶ' => 'ἶ',
'Ἷ' => 'ἷ',
'Ὀ' => 'ὀ',
'Ὁ' => 'ὁ',
'Ὂ' => 'ὂ',
'Ὃ' => 'ὃ',
'Ὄ' => 'ὄ',
'Ὅ' => 'ὅ',
'Ὑ' => 'ὑ',
'Ὓ' => 'ὓ',
'Ὕ' => 'ὕ',
'Ὗ' => 'ὗ',
'Ὠ' => 'ὠ',
'Ὡ' => 'ὡ',
'Ὢ' => 'ὢ',
'Ὣ' => 'ὣ',
'Ὤ' => 'ὤ',
'Ὥ' => 'ὥ',
'Ὦ' => 'ὦ',
'Ὧ' => 'ὧ',
'ᾈ' => 'ᾀ',
'ᾉ' => 'ᾁ',
'ᾊ' => 'ᾂ',
'ᾋ' => 'ᾃ',
'ᾌ' => 'ᾄ',
'ᾍ' => 'ᾅ',
'ᾎ' => 'ᾆ',
'ᾏ' => 'ᾇ',
'ᾘ' => 'ᾐ',
'ᾙ' => 'ᾑ',
'ᾚ' => 'ᾒ',
'ᾛ' => 'ᾓ',
'ᾜ' => 'ᾔ',
'ᾝ' => 'ᾕ',
'ᾞ' => 'ᾖ',
'ᾟ' => 'ᾗ',
'ᾨ' => 'ᾠ',
'ᾩ' => 'ᾡ',
'ᾪ' => 'ᾢ',
'ᾫ' => 'ᾣ',
'ᾬ' => 'ᾤ',
'ᾭ' => 'ᾥ',
'ᾮ' => 'ᾦ',
'ᾯ' => 'ᾧ',
'Ᾰ' => 'ᾰ',
'Ᾱ' => 'ᾱ',
'Ὰ' => 'ὰ',
'Ά' => 'ά',
'ᾼ' => 'ᾳ',
'Ὲ' => 'ὲ',
'Έ' => 'έ',
'Ὴ' => 'ὴ',
'Ή' => 'ή',
'ῌ' => 'ῃ',
'Ῐ' => 'ῐ',
'Ῑ' => 'ῑ',
'Ὶ' => 'ὶ',
'Ί' => 'ί',
'Ῠ' => 'ῠ',
'Ῡ' => 'ῡ',
'Ὺ' => 'ὺ',
'Ύ' => 'ύ',
'Ῥ' => 'ῥ',
'Ὸ' => 'ὸ',
'Ό' => 'ό',
'Ὼ' => 'ὼ',
'Ώ' => 'ώ',
'ῼ' => 'ῳ',
'Ω' => 'ω',
'K' => 'k',
'Å' => 'å',
'Ⅎ' => 'ⅎ',
'Ⅰ' => 'ⅰ',
'Ⅱ' => 'ⅱ',
'Ⅲ' => 'ⅲ',
'Ⅳ' => 'ⅳ',
'Ⅴ' => 'ⅴ',
'Ⅵ' => 'ⅵ',
'Ⅶ' => 'ⅶ',
'Ⅷ' => 'ⅷ',
'Ⅸ' => 'ⅸ',
'Ⅹ' => 'ⅹ',
'Ⅺ' => 'ⅺ',
'Ⅻ' => 'ⅻ',
'Ⅼ' => 'ⅼ',
'Ⅽ' => 'ⅽ',
'Ⅾ' => 'ⅾ',
'Ⅿ' => 'ⅿ',
'Ↄ' => 'ↄ',
'Ⓐ' => 'ⓐ',
'Ⓑ' => 'ⓑ',
'Ⓒ' => 'ⓒ',
'Ⓓ' => 'ⓓ',
'Ⓔ' => 'ⓔ',
'Ⓕ' => 'ⓕ',
'Ⓖ' => 'ⓖ',
'Ⓗ' => 'ⓗ',
'Ⓘ' => 'ⓘ',
'Ⓙ' => 'ⓙ',
'Ⓚ' => 'ⓚ',
'Ⓛ' => 'ⓛ',
'Ⓜ' => 'ⓜ',
'Ⓝ' => 'ⓝ',
'Ⓞ' => 'ⓞ',
'Ⓟ' => 'ⓟ',
'Ⓠ' => 'ⓠ',
'Ⓡ' => 'ⓡ',
'Ⓢ' => 'ⓢ',
'Ⓣ' => 'ⓣ',
'Ⓤ' => 'ⓤ',
'Ⓥ' => 'ⓥ',
'Ⓦ' => 'ⓦ',
'Ⓧ' => 'ⓧ',
'Ⓨ' => 'ⓨ',
'Ⓩ' => 'ⓩ',
'Ⰰ' => 'ⰰ',
'Ⰱ' => 'ⰱ',
'Ⰲ' => 'ⰲ',
'Ⰳ' => 'ⰳ',
'Ⰴ' => 'ⰴ',
'Ⰵ' => 'ⰵ',
'Ⰶ' => 'ⰶ',
'Ⰷ' => 'ⰷ',
'Ⰸ' => 'ⰸ',
'Ⰹ' => 'ⰹ',
'Ⰺ' => 'ⰺ',
'Ⰻ' => 'ⰻ',
'Ⰼ' => 'ⰼ',
'Ⰽ' => 'ⰽ',
'Ⰾ' => 'ⰾ',
'Ⰿ' => 'ⰿ',
'Ⱀ' => 'ⱀ',
'Ⱁ' => 'ⱁ',
'Ⱂ' => 'ⱂ',
'Ⱃ' => 'ⱃ',
'Ⱄ' => 'ⱄ',
'Ⱅ' => 'ⱅ',
'Ⱆ' => 'ⱆ',
'Ⱇ' => 'ⱇ',
'Ⱈ' => 'ⱈ',
'Ⱉ' => 'ⱉ',
'Ⱊ' => 'ⱊ',
'Ⱋ' => 'ⱋ',
'Ⱌ' => 'ⱌ',
'Ⱍ' => 'ⱍ',
'Ⱎ' => 'ⱎ',
'Ⱏ' => 'ⱏ',
'Ⱐ' => 'ⱐ',
'Ⱑ' => 'ⱑ',
'Ⱒ' => 'ⱒ',
'Ⱓ' => 'ⱓ',
'Ⱔ' => 'ⱔ',
'Ⱕ' => 'ⱕ',
'Ⱖ' => 'ⱖ',
'Ⱗ' => 'ⱗ',
'Ⱘ' => 'ⱘ',
'Ⱙ' => 'ⱙ',
'Ⱚ' => 'ⱚ',
'Ⱛ' => 'ⱛ',
'Ⱜ' => 'ⱜ',
'Ⱝ' => 'ⱝ',
'Ⱞ' => 'ⱞ',
'Ⱡ' => 'ⱡ',
'Ɫ' => 'ɫ',
'Ᵽ' => 'ᵽ',
'Ɽ' => 'ɽ',
'Ⱨ' => 'ⱨ',
'Ⱪ' => 'ⱪ',
'Ⱬ' => 'ⱬ',
'Ɑ' => 'ɑ',
'Ɱ' => 'ɱ',
'Ɐ' => 'ɐ',
'Ɒ' => 'ɒ',
'Ⱳ' => 'ⱳ',
'Ⱶ' => 'ⱶ',
'Ȿ' => 'ȿ',
'Ɀ' => 'ɀ',
'Ⲁ' => 'ⲁ',
'Ⲃ' => 'ⲃ',
'Ⲅ' => 'ⲅ',
'Ⲇ' => 'ⲇ',
'Ⲉ' => 'ⲉ',
'Ⲋ' => 'ⲋ',
'Ⲍ' => 'ⲍ',
'Ⲏ' => 'ⲏ',
'Ⲑ' => 'ⲑ',
'Ⲓ' => 'ⲓ',
'Ⲕ' => 'ⲕ',
'Ⲗ' => 'ⲗ',
'Ⲙ' => 'ⲙ',
'Ⲛ' => 'ⲛ',
'Ⲝ' => 'ⲝ',
'Ⲟ' => 'ⲟ',
'Ⲡ' => 'ⲡ',
'Ⲣ' => 'ⲣ',
'Ⲥ' => 'ⲥ',
'Ⲧ' => 'ⲧ',
'Ⲩ' => 'ⲩ',
'Ⲫ' => 'ⲫ',
'Ⲭ' => 'ⲭ',
'Ⲯ' => 'ⲯ',
'Ⲱ' => 'ⲱ',
'Ⲳ' => 'ⲳ',
'Ⲵ' => 'ⲵ',
'Ⲷ' => 'ⲷ',
'Ⲹ' => 'ⲹ',
'Ⲻ' => 'ⲻ',
'Ⲽ' => 'ⲽ',
'Ⲿ' => 'ⲿ',
'Ⳁ' => 'ⳁ',
'Ⳃ' => 'ⳃ',
'Ⳅ' => 'ⳅ',
'Ⳇ' => 'ⳇ',
'Ⳉ' => 'ⳉ',
'Ⳋ' => 'ⳋ',
'Ⳍ' => 'ⳍ',
'Ⳏ' => 'ⳏ',
'Ⳑ' => 'ⳑ',
'Ⳓ' => 'ⳓ',
'Ⳕ' => 'ⳕ',
'Ⳗ' => 'ⳗ',
'Ⳙ' => 'ⳙ',
'Ⳛ' => 'ⳛ',
'Ⳝ' => 'ⳝ',
'Ⳟ' => 'ⳟ',
'Ⳡ' => 'ⳡ',
'Ⳣ' => 'ⳣ',
'Ⳬ' => 'ⳬ',
'Ⳮ' => 'ⳮ',
'Ⳳ' => 'ⳳ',
'Ꙁ' => 'ꙁ',
'Ꙃ' => 'ꙃ',
'Ꙅ' => 'ꙅ',
'Ꙇ' => 'ꙇ',
'Ꙉ' => 'ꙉ',
'Ꙋ' => 'ꙋ',
'Ꙍ' => 'ꙍ',
'Ꙏ' => 'ꙏ',
'Ꙑ' => 'ꙑ',
'Ꙓ' => 'ꙓ',
'Ꙕ' => 'ꙕ',
'Ꙗ' => 'ꙗ',
'Ꙙ' => 'ꙙ',
'Ꙛ' => 'ꙛ',
'Ꙝ' => 'ꙝ',
'Ꙟ' => 'ꙟ',
'Ꙡ' => 'ꙡ',
'Ꙣ' => 'ꙣ',
'Ꙥ' => 'ꙥ',
'Ꙧ' => 'ꙧ',
'Ꙩ' => 'ꙩ',
'Ꙫ' => 'ꙫ',
'Ꙭ' => 'ꙭ',
'Ꚁ' => 'ꚁ',
'Ꚃ' => 'ꚃ',
'Ꚅ' => 'ꚅ',
'Ꚇ' => 'ꚇ',
'Ꚉ' => 'ꚉ',
'Ꚋ' => 'ꚋ',
'Ꚍ' => 'ꚍ',
'Ꚏ' => 'ꚏ',
'Ꚑ' => 'ꚑ',
'Ꚓ' => 'ꚓ',
'Ꚕ' => 'ꚕ',
'Ꚗ' => 'ꚗ',
'Ꚙ' => 'ꚙ',
'Ꚛ' => 'ꚛ',
'Ꜣ' => 'ꜣ',
'Ꜥ' => 'ꜥ',
'Ꜧ' => 'ꜧ',
'Ꜩ' => 'ꜩ',
'Ꜫ' => 'ꜫ',
'Ꜭ' => 'ꜭ',
'Ꜯ' => 'ꜯ',
'Ꜳ' => 'ꜳ',
'Ꜵ' => 'ꜵ',
'Ꜷ' => 'ꜷ',
'Ꜹ' => 'ꜹ',
'Ꜻ' => 'ꜻ',
'Ꜽ' => 'ꜽ',
'Ꜿ' => 'ꜿ',
'Ꝁ' => 'ꝁ',
'Ꝃ' => 'ꝃ',
'Ꝅ' => 'ꝅ',
'Ꝇ' => 'ꝇ',
'Ꝉ' => 'ꝉ',
'Ꝋ' => 'ꝋ',
'Ꝍ' => 'ꝍ',
'Ꝏ' => 'ꝏ',
'Ꝑ' => 'ꝑ',
'Ꝓ' => 'ꝓ',
'Ꝕ' => 'ꝕ',
'Ꝗ' => 'ꝗ',
'Ꝙ' => 'ꝙ',
'Ꝛ' => 'ꝛ',
'Ꝝ' => 'ꝝ',
'Ꝟ' => 'ꝟ',
'Ꝡ' => 'ꝡ',
'Ꝣ' => 'ꝣ',
'Ꝥ' => 'ꝥ',
'Ꝧ' => 'ꝧ',
'Ꝩ' => 'ꝩ',
'Ꝫ' => 'ꝫ',
'Ꝭ' => 'ꝭ',
'Ꝯ' => 'ꝯ',
'Ꝺ' => 'ꝺ',
'Ꝼ' => 'ꝼ',
'Ᵹ' => 'ᵹ',
'Ꝿ' => 'ꝿ',
'Ꞁ' => 'ꞁ',
'Ꞃ' => 'ꞃ',
'Ꞅ' => 'ꞅ',
'Ꞇ' => 'ꞇ',
'Ꞌ' => 'ꞌ',
'Ɥ' => 'ɥ',
'Ꞑ' => 'ꞑ',
'Ꞓ' => 'ꞓ',
'Ꞗ' => 'ꞗ',
'Ꞙ' => 'ꞙ',
'Ꞛ' => 'ꞛ',
'Ꞝ' => 'ꞝ',
'Ꞟ' => 'ꞟ',
'Ꞡ' => 'ꞡ',
'Ꞣ' => 'ꞣ',
'Ꞥ' => 'ꞥ',
'Ꞧ' => 'ꞧ',
'Ꞩ' => 'ꞩ',
'Ɦ' => 'ɦ',
'Ɜ' => 'ɜ',
'Ɡ' => 'ɡ',
'Ɬ' => 'ɬ',
'Ɪ' => 'ɪ',
'Ʞ' => 'ʞ',
'Ʇ' => 'ʇ',
'Ʝ' => 'ʝ',
'Ꭓ' => 'ꭓ',
'Ꞵ' => 'ꞵ',
'Ꞷ' => 'ꞷ',
'Ꞹ' => 'ꞹ',
'Ꞻ' => 'ꞻ',
'Ꞽ' => 'ꞽ',
'Ꞿ' => 'ꞿ',
'Ꟃ' => 'ꟃ',
'Ꞔ' => 'ꞔ',
'Ʂ' => 'ʂ',
'Ᶎ' => 'ᶎ',
'Ꟈ' => 'ꟈ',
'Ꟊ' => 'ꟊ',
'Ꟶ' => 'ꟶ',
'Ａ' => 'ａ',
'Ｂ' => 'ｂ',
'Ｃ' => 'ｃ',
'Ｄ' => 'ｄ',
'Ｅ' => 'ｅ',
'Ｆ' => 'ｆ',
'Ｇ' => 'ｇ',
'Ｈ' => 'ｈ',
'Ｉ' => 'ｉ',
'Ｊ' => 'ｊ',
'Ｋ' => 'ｋ',
'Ｌ' => 'ｌ',
'Ｍ' => 'ｍ',
'Ｎ' => 'ｎ',
'Ｏ' => 'ｏ',
'Ｐ' => 'ｐ',
'Ｑ' => 'ｑ',
'Ｒ' => 'ｒ',
'Ｓ' => 'ｓ',
'Ｔ' => 'ｔ',
'Ｕ' => 'ｕ',
'Ｖ' => 'ｖ',
'Ｗ' => 'ｗ',
'Ｘ' => 'ｘ',
'Ｙ' => 'ｙ',
'Ｚ' => 'ｚ',
'𐐀' => '𐐨',
'𐐁' => '𐐩',
'𐐂' => '𐐪',
'𐐃' => '𐐫',
'𐐄' => '𐐬',
'𐐅' => '𐐭',
'𐐆' => '𐐮',
'𐐇' => '𐐯',
'𐐈' => '𐐰',
'𐐉' => '𐐱',
'𐐊' => '𐐲',
'𐐋' => '𐐳',
'𐐌' => '𐐴',
'𐐍' => '𐐵',
'𐐎' => '𐐶',
'𐐏' => '𐐷',
'𐐐' => '𐐸',
'𐐑' => '𐐹',
'𐐒' => '𐐺',
'𐐓' => '𐐻',
'𐐔' => '𐐼',
'𐐕' => '𐐽',
'𐐖' => '𐐾',
'𐐗' => '𐐿',
'𐐘' => '𐑀',
'𐐙' => '𐑁',
'𐐚' => '𐑂',
'𐐛' => '𐑃',
'𐐜' => '𐑄',
'𐐝' => '𐑅',
'𐐞' => '𐑆',
'𐐟' => '𐑇',
'𐐠' => '𐑈',
'𐐡' => '𐑉',
'𐐢' => '𐑊',
'𐐣' => '𐑋',
'𐐤' => '𐑌',
'𐐥' => '𐑍',
'𐐦' => '𐑎',
'𐐧' => '𐑏',
'𐒰' => '𐓘',
'𐒱' => '𐓙',
'𐒲' => '𐓚',
'𐒳' => '𐓛',
'𐒴' => '𐓜',
'𐒵' => '𐓝',
'𐒶' => '𐓞',
'𐒷' => '𐓟',
'𐒸' => '𐓠',
'𐒹' => '𐓡',
'𐒺' => '𐓢',
'𐒻' => '𐓣',
'𐒼' => '𐓤',
'𐒽' => '𐓥',
'𐒾' => '𐓦',
'𐒿' => '𐓧',
'𐓀' => '𐓨',
'𐓁' => '𐓩',
'𐓂' => '𐓪',
'𐓃' => '𐓫',
'𐓄' => '𐓬',
'𐓅' => '𐓭',
'𐓆' => '𐓮',
'𐓇' => '𐓯',
'𐓈' => '𐓰',
'𐓉' => '𐓱',
'𐓊' => '𐓲',
'𐓋' => '𐓳',
'𐓌' => '𐓴',
'𐓍' => '𐓵',
'𐓎' => '𐓶',
'𐓏' => '𐓷',
'𐓐' => '𐓸',
'𐓑' => '𐓹',
'𐓒' => '𐓺',
'𐓓' => '𐓻',
'𐲀' => '𐳀',
'𐲁' => '𐳁',
'𐲂' => '𐳂',
'𐲃' => '𐳃',
'𐲄' => '𐳄',
'𐲅' => '𐳅',
'𐲆' => '𐳆',
'𐲇' => '𐳇',
'𐲈' => '𐳈',
'𐲉' => '𐳉',
'𐲊' => '𐳊',
'𐲋' => '𐳋',
'𐲌' => '𐳌',
'𐲍' => '𐳍',
'𐲎' => '𐳎',
'𐲏' => '𐳏',
'𐲐' => '𐳐',
'𐲑' => '𐳑',
'𐲒' => '𐳒',
'𐲓' => '𐳓',
'𐲔' => '𐳔',
'𐲕' => '𐳕',
'𐲖' => '𐳖',
'𐲗' => '𐳗',
'𐲘' => '𐳘',
'𐲙' => '𐳙',
'𐲚' => '𐳚',
'𐲛' => '𐳛',
'𐲜' => '𐳜',
'𐲝' => '𐳝',
'𐲞' => '𐳞',
'𐲟' => '𐳟',
'𐲠' => '𐳠',
'𐲡' => '𐳡',
'𐲢' => '𐳢',
'𐲣' => '𐳣',
'𐲤' => '𐳤',
'𐲥' => '𐳥',
'𐲦' => '𐳦',
'𐲧' => '𐳧',
'𐲨' => '𐳨',
'𐲩' => '𐳩',
'𐲪' => '𐳪',
'𐲫' => '𐳫',
'𐲬' => '𐳬',
'𐲭' => '𐳭',
'𐲮' => '𐳮',
'𐲯' => '𐳯',
'𐲰' => '𐳰',
'𐲱' => '𐳱',
'𐲲' => '𐳲',
'𑢠' => '𑣀',
'𑢡' => '𑣁',
'𑢢' => '𑣂',
'𑢣' => '𑣃',
'𑢤' => '𑣄',
'𑢥' => '𑣅',
'𑢦' => '𑣆',
'𑢧' => '𑣇',
'𑢨' => '𑣈',
'𑢩' => '𑣉',
'𑢪' => '𑣊',
'𑢫' => '𑣋',
'𑢬' => '𑣌',
'𑢭' => '𑣍',
'𑢮' => '𑣎',
'𑢯' => '𑣏',
'𑢰' => '𑣐',
'𑢱' => '𑣑',
'𑢲' => '𑣒',
'𑢳' => '𑣓',
'𑢴' => '𑣔',
'𑢵' => '𑣕',
'𑢶' => '𑣖',
'𑢷' => '𑣗',
'𑢸' => '𑣘',
'𑢹' => '𑣙',
'𑢺' => '𑣚',
'𑢻' => '𑣛',
'𑢼' => '𑣜',
'𑢽' => '𑣝',
'𑢾' => '𑣞',
'𑢿' => '𑣟',
'𖹀' => '𖹠',
'𖹁' => '𖹡',
'𖹂' => '𖹢',
'𖹃' => '𖹣',
'𖹄' => '𖹤',
'𖹅' => '𖹥',
'𖹆' => '𖹦',
'𖹇' => '𖹧',
'𖹈' => '𖹨',
'𖹉' => '𖹩',
'𖹊' => '𖹪',
'𖹋' => '𖹫',
'𖹌' => '𖹬',
'𖹍' => '𖹭',
'𖹎' => '𖹮',
'𖹏' => '𖹯',
'𖹐' => '𖹰',
'𖹑' => '𖹱',
'𖹒' => '𖹲',
'𖹓' => '𖹳',
'𖹔' => '𖹴',
'𖹕' => '𖹵',
'𖹖' => '𖹶',
'𖹗' => '𖹷',
'𖹘' => '𖹸',
'𖹙' => '𖹹',
'𖹚' => '𖹺',
'𖹛' => '𖹻',
'𖹜' => '𖹼',
'𖹝' => '𖹽',
'𖹞' => '𖹾',
'𖹟' => '𖹿',
'𞤀' => '𞤢',
'𞤁' => '𞤣',
'𞤂' => '𞤤',
'𞤃' => '𞤥',
'𞤄' => '𞤦',
'𞤅' => '𞤧',
'𞤆' => '𞤨',
'𞤇' => '𞤩',
'𞤈' => '𞤪',
'𞤉' => '𞤫',
'𞤊' => '𞤬',
'𞤋' => '𞤭',
'𞤌' => '𞤮',
'𞤍' => '𞤯',
'𞤎' => '𞤰',
'𞤏' => '𞤱',
'𞤐' => '𞤲',
'𞤑' => '𞤳',
'𞤒' => '𞤴',
'𞤓' => '𞤵',
'𞤔' => '𞤶',
'𞤕' => '𞤷',
'𞤖' => '𞤸',
'𞤗' => '𞤹',
'𞤘' => '𞤺',
'𞤙' => '𞤻',
'𞤚' => '𞤼',
'𞤛' => '𞤽',
'𞤜' => '𞤾',
'𞤝' => '𞤿',
'𞤞' => '𞥀',
'𞤟' => '𞥁',
'𞤠' => '𞥂',
'𞤡' => '𞥃',
);
<?php










namespace Symfony\Polyfill\Mbstring;




























































final class Mbstring
{
public const MB_CASE_FOLD = \PHP_INT_MAX;

private const SIMPLE_CASE_FOLD = [
['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'],
];

private static $encodingList = ['ASCII', 'UTF-8'];
private static $language = 'neutral';
private static $internalEncoding = 'UTF-8';

public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{
if (\is_array($s)) {
$r = [];
foreach ($s as $str) {
$r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding);
}

return $r;
}

if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
} else {
$fromEncoding = self::getEncoding($fromEncoding);
}

$toEncoding = self::getEncoding($toEncoding);

if ('BASE64' === $fromEncoding) {
$s = base64_decode($s);
$fromEncoding = $toEncoding;
}

if ('BASE64' === $toEncoding) {
return base64_encode($s);
}

if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
$fromEncoding = 'Windows-1252';
}
if ('UTF-8' !== $fromEncoding) {
$s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
}

return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
}

if ('HTML-ENTITIES' === $fromEncoding) {
$s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8');
$fromEncoding = 'UTF-8';
}

return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
}

public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
{
$ok = true;
array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
$ok = false;
}
});

return $ok ? $fromEncoding : false;
}

public static function mb_decode_mimeheader($s)
{
return iconv_mime_decode($s, 2, self::$internalEncoding);
}

public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
{
trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING);
}

public static function mb_decode_numericentity($s, $convmap, $encoding = null)
{
if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);

return null;
}

if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
return false;
}

if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);

return ''; 
}

$s = (string) $s;
if ('' === $s) {
return '';
}

$encoding = self::getEncoding($encoding);

if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
$s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
$s = iconv($encoding, 'UTF-8//IGNORE', $s);
}

$cnt = floor(\count($convmap) / 4) * 4;

for ($i = 0; $i < $cnt; $i += 4) {

$convmap[$i] += $convmap[$i + 2];
$convmap[$i + 1] += $convmap[$i + 2];
}

$s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
$c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
for ($i = 0; $i < $cnt; $i += 4) {
if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
return self::mb_chr($c - $convmap[$i + 2]);
}
}

return $m[0];
}, $s);

if (null === $encoding) {
return $s;
}

return iconv('UTF-8', $encoding.'//IGNORE', $s);
}

public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
{
if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);

return null;
}

if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
return false;
}

if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);

return null; 
}

if (null !== $is_hex && !\is_scalar($is_hex)) {
trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);

return null;
}

$s = (string) $s;
if ('' === $s) {
return '';
}

$encoding = self::getEncoding($encoding);

if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
$s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
$s = iconv($encoding, 'UTF-8//IGNORE', $s);
}

static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];

$cnt = floor(\count($convmap) / 4) * 4;
$i = 0;
$len = \strlen($s);
$result = '';

while ($i < $len) {
$ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
$uchr = substr($s, $i, $ulen);
$i += $ulen;
$c = self::mb_ord($uchr);

for ($j = 0; $j < $cnt; $j += 4) {
if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
$cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
$result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
continue 2;
}
}
$result .= $uchr;
}

if (null === $encoding) {
return $result;
}

return iconv('UTF-8', $encoding.'//IGNORE', $result);
}

public static function mb_convert_case($s, $mode, $encoding = null)
{
$s = (string) $s;
if ('' === $s) {
return '';
}

$encoding = self::getEncoding($encoding);

if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
$s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
$s = iconv($encoding, 'UTF-8//IGNORE', $s);
}

if (\MB_CASE_TITLE == $mode) {
static $titleRegexp = null;
if (null === $titleRegexp) {
$titleRegexp = self::getData('titleCaseRegexp');
}
$s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);
} else {
if (\MB_CASE_UPPER == $mode) {
static $upper = null;
if (null === $upper) {
$upper = self::getData('upperCase');
}
$map = $upper;
} else {
if (self::MB_CASE_FOLD === $mode) {
static $caseFolding = null;
if (null === $caseFolding) {
$caseFolding = self::getData('caseFolding');
}
$s = strtr($s, $caseFolding);
}

static $lower = null;
if (null === $lower) {
$lower = self::getData('lowerCase');
}
$map = $lower;
}

static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];

$i = 0;
$len = \strlen($s);

while ($i < $len) {
$ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
$uchr = substr($s, $i, $ulen);
$i += $ulen;

if (isset($map[$uchr])) {
$uchr = $map[$uchr];
$nlen = \strlen($uchr);

if ($nlen == $ulen) {
$nlen = $i;
do {
$s[--$nlen] = $uchr[--$ulen];
} while ($ulen);
} else {
$s = substr_replace($s, $uchr, $i - $ulen, $ulen);
$len += $nlen - $ulen;
$i += $nlen - $ulen;
}
}
}
}

if (null === $encoding) {
return $s;
}

return iconv('UTF-8', $encoding.'//IGNORE', $s);
}

public static function mb_internal_encoding($encoding = null)
{
if (null === $encoding) {
return self::$internalEncoding;
}

$normalizedEncoding = self::getEncoding($encoding);

if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
self::$internalEncoding = $normalizedEncoding;

return true;
}

if (80000 > \PHP_VERSION_ID) {
return false;
}

throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding));
}

public static function mb_language($lang = null)
{
if (null === $lang) {
return self::$language;
}

switch ($normalizedLang = strtolower($lang)) {
case 'uni':
case 'neutral':
self::$language = $normalizedLang;

return true;
}

if (80000 > \PHP_VERSION_ID) {
return false;
}

throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang));
}

public static function mb_list_encodings()
{
return ['UTF-8'];
}

public static function mb_encoding_aliases($encoding)
{
switch (strtoupper($encoding)) {
case 'UTF8':
case 'UTF-8':
return ['utf8'];
}

return false;
}

public static function mb_check_encoding($var = null, $encoding = null)
{
if (null === $encoding) {
if (null === $var) {
return false;
}
$encoding = self::$internalEncoding;
}

if (!\is_array($var)) {
return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);
}

foreach ($var as $key => $value) {
if (!self::mb_check_encoding($key, $encoding)) {
return false;
}
if (!self::mb_check_encoding($value, $encoding)) {
return false;
}
}

return true;
}

public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
{
if (null === $encodingList) {
$encodingList = self::$encodingList;
} else {
if (!\is_array($encodingList)) {
$encodingList = array_map('trim', explode(',', $encodingList));
}
$encodingList = array_map('strtoupper', $encodingList);
}

foreach ($encodingList as $enc) {
switch ($enc) {
case 'ASCII':
if (!preg_match('/[\x80-\xFF]/', $str)) {
return $enc;
}
break;

case 'UTF8':
case 'UTF-8':
if (preg_match('//u', $str)) {
return 'UTF-8';
}
break;

default:
if (0 === strncmp($enc, 'ISO-8859-', 9)) {
return $enc;
}
}
}

return false;
}

public static function mb_detect_order($encodingList = null)
{
if (null === $encodingList) {
return self::$encodingList;
}

if (!\is_array($encodingList)) {
$encodingList = array_map('trim', explode(',', $encodingList));
}
$encodingList = array_map('strtoupper', $encodingList);

foreach ($encodingList as $enc) {
switch ($enc) {
default:
if (strncmp($enc, 'ISO-8859-', 9)) {
return false;
}

case 'ASCII':
case 'UTF8':
case 'UTF-8':
}
}

self::$encodingList = $encodingList;

return true;
}

public static function mb_strlen($s, $encoding = null)
{
$encoding = self::getEncoding($encoding);
if ('CP850' === $encoding || 'ASCII' === $encoding) {
return \strlen($s);
}

return @iconv_strlen($s, $encoding);
}

public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
{
$encoding = self::getEncoding($encoding);
if ('CP850' === $encoding || 'ASCII' === $encoding) {
return strpos($haystack, $needle, $offset);
}

$needle = (string) $needle;
if ('' === $needle) {
if (80000 > \PHP_VERSION_ID) {
trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING);

return false;
}

return 0;
}

return iconv_strpos($haystack, $needle, $offset, $encoding);
}

public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
{
$encoding = self::getEncoding($encoding);
if ('CP850' === $encoding || 'ASCII' === $encoding) {
return strrpos($haystack, $needle, $offset);
}

if ($offset != (int) $offset) {
$offset = 0;
} elseif ($offset = (int) $offset) {
if ($offset < 0) {
if (0 > $offset += self::mb_strlen($needle)) {
$haystack = self::mb_substr($haystack, 0, $offset, $encoding);
}
$offset = 0;
} else {
$haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
}
}

$pos = '' !== $needle || 80000 > \PHP_VERSION_ID
? iconv_strrpos($haystack, $needle, $encoding)
: self::mb_strlen($haystack, $encoding);

return false !== $pos ? $offset + $pos : false;
}

public static function mb_str_split($string, $split_length = 1, $encoding = null)
{
if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);

return null;
}

if (1 > $split_length = (int) $split_length) {
if (80000 > \PHP_VERSION_ID) {
trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);

return false;
}

throw new \ValueError('Argument #2 ($length) must be greater than 0');
}

if (null === $encoding) {
$encoding = mb_internal_encoding();
}

if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
$rx = '/(';
while (65535 < $split_length) {
$rx .= '.{65535}';
$split_length -= 65535;
}
$rx .= '.{'.$split_length.'})/us';

return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
}

$result = [];
$length = mb_strlen($string, $encoding);

for ($i = 0; $i < $length; $i += $split_length) {
$result[] = mb_substr($string, $i, $split_length, $encoding);
}

return $result;
}

public static function mb_strtolower($s, $encoding = null)
{
return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding);
}

public static function mb_strtoupper($s, $encoding = null)
{
return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding);
}

public static function mb_substitute_character($c = null)
{
if (null === $c) {
return 'none';
}
if (0 === strcasecmp($c, 'none')) {
return true;
}
if (80000 > \PHP_VERSION_ID) {
return false;
}
if (\is_int($c) || 'long' === $c || 'entity' === $c) {
return false;
}

throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint');
}

public static function mb_substr($s, $start, $length = null, $encoding = null)
{
$encoding = self::getEncoding($encoding);
if ('CP850' === $encoding || 'ASCII' === $encoding) {
return (string) substr($s, $start, null === $length ? 2147483647 : $length);
}

if ($start < 0) {
$start = iconv_strlen($s, $encoding) + $start;
if ($start < 0) {
$start = 0;
}
}

if (null === $length) {
$length = 2147483647;
} elseif ($length < 0) {
$length = iconv_strlen($s, $encoding) + $length - $start;
if ($length < 0) {
return '';
}
}

return (string) iconv_substr($s, $start, $length, $encoding);
}

public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
{
[$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [
self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding),
self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding),
]);

return self::mb_strpos($haystack, $needle, $offset, $encoding);
}

public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
{
$pos = self::mb_stripos($haystack, $needle, 0, $encoding);

return self::getSubpart($pos, $part, $haystack, $encoding);
}

public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
{
$encoding = self::getEncoding($encoding);
if ('CP850' === $encoding || 'ASCII' === $encoding) {
$pos = strrpos($haystack, $needle);
} else {
$needle = self::mb_substr($needle, 0, 1, $encoding);
$pos = iconv_strrpos($haystack, $needle, $encoding);
}

return self::getSubpart($pos, $part, $haystack, $encoding);
}

public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
{
$needle = self::mb_substr($needle, 0, 1, $encoding);
$pos = self::mb_strripos($haystack, $needle, $encoding);

return self::getSubpart($pos, $part, $haystack, $encoding);
}

public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
{
$haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding);
$needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding);

$haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack);
$needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle);

return self::mb_strrpos($haystack, $needle, $offset, $encoding);
}

public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
{
$pos = strpos($haystack, $needle);
if (false === $pos) {
return false;
}
if ($part) {
return substr($haystack, 0, $pos);
}

return substr($haystack, $pos);
}

public static function mb_get_info($type = 'all')
{
$info = [
'internal_encoding' => self::$internalEncoding,
'http_output' => 'pass',
'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
'func_overload' => 0,
'func_overload_list' => 'no overload',
'mail_charset' => 'UTF-8',
'mail_header_encoding' => 'BASE64',
'mail_body_encoding' => 'BASE64',
'illegal_chars' => 0,
'encoding_translation' => 'Off',
'language' => self::$language,
'detect_order' => self::$encodingList,
'substitute_character' => 'none',
'strict_detection' => 'Off',
];

if ('all' === $type) {
return $info;
}
if (isset($info[$type])) {
return $info[$type];
}

return false;
}

public static function mb_http_input($type = '')
{
return false;
}

public static function mb_http_output($encoding = null)
{
return null !== $encoding ? 'pass' === $encoding : 'pass';
}

public static function mb_strwidth($s, $encoding = null)
{
$encoding = self::getEncoding($encoding);

if ('UTF-8' !== $encoding) {
$s = iconv($encoding, 'UTF-8//IGNORE', $s);
}

$s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);

return ($wide << 1) + iconv_strlen($s, 'UTF-8');
}

public static function mb_substr_count($haystack, $needle, $encoding = null)
{
return substr_count($haystack, $needle);
}

public static function mb_output_handler($contents, $status)
{
return $contents;
}

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 = self::getEncoding($encoding)) {
$s = mb_convert_encoding($s, $encoding, 'UTF-8');
}

return $s;
}

public static function mb_ord($s, $encoding = null)
{
if ('UTF-8' !== $encoding = self::getEncoding($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;
}

public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string
{
if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) {
throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');
}

if (null === $encoding) {
$encoding = self::mb_internal_encoding();
} else {
self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given');
}

if (self::mb_strlen($pad_string, $encoding) <= 0) {
throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');
}

$paddingRequired = $length - self::mb_strlen($string, $encoding);

if ($paddingRequired < 1) {
return $string;
}

switch ($pad_type) {
case \STR_PAD_LEFT:
return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;
case \STR_PAD_RIGHT:
return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);
default:
$leftPaddingLength = floor($paddingRequired / 2);
$rightPaddingLength = $paddingRequired - $leftPaddingLength;

return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);
}
}

public static function mb_ucfirst(string $string, ?string $encoding = null): string
{
if (null === $encoding) {
$encoding = self::mb_internal_encoding();
} else {
self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
}

$firstChar = mb_substr($string, 0, 1, $encoding);
$firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding);

return $firstChar.mb_substr($string, 1, null, $encoding);
}

public static function mb_lcfirst(string $string, ?string $encoding = null): string
{
if (null === $encoding) {
$encoding = self::mb_internal_encoding();
} else {
self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
}

$firstChar = mb_substr($string, 0, 1, $encoding);
$firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding);

return $firstChar.mb_substr($string, 1, null, $encoding);
}

private static function getSubpart($pos, $part, $haystack, $encoding)
{
if (false === $pos) {
return false;
}
if ($part) {
return self::mb_substr($haystack, 0, $pos, $encoding);
}

return self::mb_substr($haystack, $pos, null, $encoding);
}

private static function html_encoding_callback(array $m)
{
$i = 1;
$entities = '';
$m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8'));

while (isset($m[$i])) {
if (0x80 > $m[$i]) {
$entities .= \chr($m[$i++]);
continue;
}
if (0xF0 <= $m[$i]) {
$c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
} elseif (0xE0 <= $m[$i]) {
$c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
} else {
$c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
}

$entities .= '&#'.$c.';';
}

return $entities;
}

private static function title_case(array $s)
{
return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8');
}

private static function getData($file)
{
if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
return require $file;
}

return false;
}

private static function getEncoding($encoding)
{
if (null === $encoding) {
return self::$internalEncoding;
}

if ('UTF-8' === $encoding) {
return 'UTF-8';
}

$encoding = strtoupper($encoding);

if ('8BIT' === $encoding || 'BINARY' === $encoding) {
return 'CP850';
}

if ('UTF8' === $encoding) {
return 'UTF-8';
}

return $encoding;
}

public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__);
}

public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__);
}

public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string
{
return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__);
}

private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string
{
if (null === $encoding) {
$encoding = self::mb_internal_encoding();
} else {
self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given');
}

if ('' === $characters) {
return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding);
}

if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $string)) {
$string = @iconv('UTF-8', 'UTF-8//IGNORE', $string);
}
if (null !== $characters && !preg_match('//u', $characters)) {
$characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters);
}
} else {
$string = iconv($encoding, 'UTF-8//IGNORE', $string);

if (null !== $characters) {
$characters = iconv($encoding, 'UTF-8//IGNORE', $characters);
}
}

if (null === $characters) {
$characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}";
} else {
$characters = preg_quote($characters);
}

$string = preg_replace(sprintf($regex, $characters), '', $string);

if (null === $encoding) {
return $string;
}

return iconv('UTF-8', $encoding.'//IGNORE', $string);
}

private static function assertEncoding(string $encoding, string $errorFormat): void
{
try {
$validEncoding = @self::mb_check_encoding('', $encoding);
} catch (\ValueError $e) {
throw new \ValueError(sprintf($errorFormat, $encoding));
}


if (!$validEncoding) {
throw new \ValueError(sprintf($errorFormat, $encoding));
}
}
}
<?php










use Symfony\Polyfill\Mbstring as p;

if (\PHP_VERSION_ID >= 80000) {
return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('mb_convert_encoding')) {
function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
}
if (!function_exists('mb_decode_mimeheader')) {
function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
}
if (!function_exists('mb_encode_mimeheader')) {
function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
}
if (!function_exists('mb_decode_numericentity')) {
function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
}
if (!function_exists('mb_encode_numericentity')) {
function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
}
if (!function_exists('mb_convert_case')) {
function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
}
if (!function_exists('mb_internal_encoding')) {
function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
}
if (!function_exists('mb_language')) {
function mb_language($language = null) { return p\Mbstring::mb_language($language); }
}
if (!function_exists('mb_list_encodings')) {
function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
}
if (!function_exists('mb_encoding_aliases')) {
function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
}
if (!function_exists('mb_check_encoding')) {
function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
}
if (!function_exists('mb_detect_encoding')) {
function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
}
if (!function_exists('mb_detect_order')) {
function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
}
if (!function_exists('mb_parse_str')) {
function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }
}
if (!function_exists('mb_strlen')) {
function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
}
if (!function_exists('mb_strpos')) {
function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strtolower')) {
function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
}
if (!function_exists('mb_strtoupper')) {
function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
}
if (!function_exists('mb_substitute_character')) {
function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
}
if (!function_exists('mb_substr')) {
function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
}
if (!function_exists('mb_stripos')) {
function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_stristr')) {
function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strrchr')) {
function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strrichr')) {
function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_strripos')) {
function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strrpos')) {
function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
}
if (!function_exists('mb_strstr')) {
function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
}
if (!function_exists('mb_get_info')) {
function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
}
if (!function_exists('mb_http_output')) {
function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
}
if (!function_exists('mb_strwidth')) {
function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
}
if (!function_exists('mb_substr_count')) {
function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
}
if (!function_exists('mb_output_handler')) {
function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
}
if (!function_exists('mb_http_input')) {
function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); }
}

if (!function_exists('mb_convert_variables')) {
function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
}

if (!function_exists('mb_ord')) {
function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
}
if (!function_exists('mb_chr')) {
function mb_chr($codepoint, $encoding = null) { return p\Mbstring::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); }
}
if (!function_exists('mb_str_split')) {
function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
}

if (!function_exists('mb_str_pad')) {
function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}

if (!function_exists('mb_ucfirst')) {
function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
}

if (!function_exists('mb_lcfirst')) {
function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
}

if (!function_exists('mb_trim')) {
function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); }
}

if (!function_exists('mb_ltrim')) {
function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); }
}

if (!function_exists('mb_rtrim')) {
function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); }
}


if (extension_loaded('mbstring')) {
return;
}

if (!defined('MB_CASE_UPPER')) {
define('MB_CASE_UPPER', 0);
}
if (!defined('MB_CASE_LOWER')) {
define('MB_CASE_LOWER', 1);
}
if (!defined('MB_CASE_TITLE')) {
define('MB_CASE_TITLE', 2);
}
<?php










namespace Symfony\Component\Console\Question;






class ConfirmationQuestion extends Question
{
private string $trueAnswerRegex;






public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i')
{
parent::__construct($question, $default);

$this->trueAnswerRegex = $trueAnswerRegex;
$this->setNormalizer($this->getDefaultNormalizer());
}




private function getDefaultNormalizer(): callable
{
$default = $this->getDefault();
$regex = $this->trueAnswerRegex;

return function ($answer) use ($default, $regex) {
if (\is_bool($answer)) {
return $answer;
}

$answerIsTrue = (bool) preg_match($regex, $answer);
if (false === $default) {
return $answer && $answerIsTrue;
}

return '' === $answer || $answerIsTrue;
};
}
}
<?php










namespace Symfony\Component\Console\Question;

use Symfony\Component\Console\Exception\InvalidArgumentException;






class ChoiceQuestion extends Question
{
private array $choices;
private bool $multiselect = false;
private string $prompt = ' > ';
private string $errorMessage = 'Value "%s" is invalid';






public function __construct(string $question, array $choices, string|bool|int|float|null $default = null)
{
if (!$choices) {
throw new \LogicException('Choice question must have at least 1 choice available.');
}

parent::__construct($question, $default);

$this->choices = $choices;
$this->setValidator($this->getDefaultValidator());
$this->setAutocompleterValues($choices);
}




public function getChoices(): array
{
return $this->choices;
}








public function setMultiselect(bool $multiselect): static
{
$this->multiselect = $multiselect;
$this->setValidator($this->getDefaultValidator());

return $this;
}




public function isMultiselect(): bool
{
return $this->multiselect;
}




public function getPrompt(): string
{
return $this->prompt;
}






public function setPrompt(string $prompt): static
{
$this->prompt = $prompt;

return $this;
}








public function setErrorMessage(string $errorMessage): static
{
$this->errorMessage = $errorMessage;
$this->setValidator($this->getDefaultValidator());

return $this;
}

private function getDefaultValidator(): callable
{
$choices = $this->choices;
$errorMessage = $this->errorMessage;
$multiselect = $this->multiselect;
$isAssoc = $this->isAssoc($choices);

return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
if ($multiselect) {

if (!preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) {
throw new InvalidArgumentException(\sprintf($errorMessage, $selected));
}

$selectedChoices = explode(',', (string) $selected);
} else {
$selectedChoices = [$selected];
}

if ($this->isTrimmable()) {
foreach ($selectedChoices as $k => $v) {
$selectedChoices[$k] = trim((string) $v);
}
}

$multiselectChoices = [];
foreach ($selectedChoices as $value) {
$results = [];
foreach ($choices as $key => $choice) {
if ($choice === $value) {
$results[] = $key;
}
}

if (\count($results) > 1) {
throw new InvalidArgumentException(\sprintf('The provided answer is ambiguous. Value should be one of "%s".', implode('" or "', $results)));
}

$result = array_search($value, $choices);

if (!$isAssoc) {
if (false !== $result) {
$result = $choices[$result];
} elseif (isset($choices[$value])) {
$result = $choices[$value];
}
} elseif (false === $result && isset($choices[$value])) {
$result = $value;
}

if (false === $result) {
throw new InvalidArgumentException(\sprintf($errorMessage, $value));
}


$multiselectChoices[] = $isAssoc ? (string) $result : $result;
}

if ($multiselect) {
return $multiselectChoices;
}

return current($multiselectChoices);
};
}
}
<?php










namespace Symfony\Component\Console\Question;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;






class Question
{
private string $question;
private ?int $attempts = null;
private bool $hidden = false;
private bool $hiddenFallback = true;
private ?\Closure $autocompleterCallback = null;
private ?\Closure $validator = null;
private string|int|bool|float|null $default;
private ?\Closure $normalizer = null;
private bool $trimmable = true;
private bool $multiline = false;





public function __construct(string $question, string|bool|int|float|null $default = null)
{
$this->question = $question;
$this->default = $default;
}




public function getQuestion(): string
{
return $this->question;
}




public function getDefault(): string|bool|int|float|null
{
return $this->default;
}




public function isMultiline(): bool
{
return $this->multiline;
}






public function setMultiline(bool $multiline): static
{
$this->multiline = $multiline;

return $this;
}




public function isHidden(): bool
{
return $this->hidden;
}








public function setHidden(bool $hidden): static
{
if ($this->autocompleterCallback) {
throw new LogicException('A hidden question cannot use the autocompleter.');
}

$this->hidden = $hidden;

return $this;
}




public function isHiddenFallback(): bool
{
return $this->hiddenFallback;
}






public function setHiddenFallback(bool $fallback): static
{
$this->hiddenFallback = $fallback;

return $this;
}




public function getAutocompleterValues(): ?iterable
{
$callback = $this->getAutocompleterCallback();

return $callback ? $callback('') : null;
}








public function setAutocompleterValues(?iterable $values): static
{
if (\is_array($values)) {
$values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);

$callback = static fn () => $values;
} elseif ($values instanceof \Traversable) {
$callback = static function () use ($values) {
static $valueCache;

return $valueCache ??= iterator_to_array($values, false);
};
} else {
$callback = null;
}

return $this->setAutocompleterCallback($callback);
}




public function getAutocompleterCallback(): ?callable
{
return $this->autocompleterCallback;
}








public function setAutocompleterCallback(?callable $callback = null): static
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
if ($this->hidden && null !== $callback) {
throw new LogicException('A hidden question cannot use the autocompleter.');
}

$this->autocompleterCallback = null === $callback ? null : $callback(...);

return $this;
}






public function setValidator(?callable $validator = null): static
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->validator = null === $validator ? null : $validator(...);

return $this;
}




public function getValidator(): ?callable
{
return $this->validator;
}










public function setMaxAttempts(?int $attempts): static
{
if (null !== $attempts && $attempts < 1) {
throw new InvalidArgumentException('Maximum number of attempts must be a positive value.');
}

$this->attempts = $attempts;

return $this;
}






public function getMaxAttempts(): ?int
{
return $this->attempts;
}








public function setNormalizer(callable $normalizer): static
{
$this->normalizer = $normalizer(...);

return $this;
}






public function getNormalizer(): ?callable
{
return $this->normalizer;
}




protected function isAssoc(array $array)
{
return (bool) \count(array_filter(array_keys($array), 'is_string'));
}

public function isTrimmable(): bool
{
return $this->trimmable;
}




public function setTrimmable(bool $trimmable): static
{
$this->trimmable = $trimmable;

return $this;
}
}
<?php










namespace Symfony\Component\Console\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class AsCommand
{
public function __construct(
public string $name,
public ?string $description = null,
array $aliases = [],
bool $hidden = false,
) {
if (!$hidden && !$aliases) {
return;
}

$name = explode('|', $name);
$name = array_merge($name, $aliases);

if ($hidden && '' !== $name[0]) {
array_unshift($name, '');
}

$this->name = implode('|', $name);
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleSignalEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;






final class ConsoleEvents
{
/**
@Event("Symfony\Component\Console\Event\ConsoleCommandEvent")




*/
public const COMMAND = 'console.command';

/**
@Event("Symfony\Component\Console\Event\ConsoleSignalEvent")



*/
public const SIGNAL = 'console.signal';

/**
@Event("Symfony\Component\Console\Event\ConsoleTerminateEvent")



*/
public const TERMINATE = 'console.terminate';

/**
@Event("Symfony\Component\Console\Event\ConsoleErrorEvent")





*/
public const ERROR = 'console.error';






public const ALIASES = [
ConsoleCommandEvent::class => self::COMMAND,
ConsoleErrorEvent::class => self::ERROR,
ConsoleSignalEvent::class => self::SIGNAL,
ConsoleTerminateEvent::class => self::TERMINATE,
];
}
<?php










namespace Symfony\Component\Console\CI;

use Symfony\Component\Console\Output\OutputInterface;






class GithubActionReporter
{
private OutputInterface $output;




private const ESCAPED_DATA = [
'%' => '%25',
"\r" => '%0D',
"\n" => '%0A',
];




private const ESCAPED_PROPERTIES = [
'%' => '%25',
"\r" => '%0D',
"\n" => '%0A',
':' => '%3A',
',' => '%2C',
];

public function __construct(OutputInterface $output)
{
$this->output = $output;
}

public static function isGithubActionEnvironment(): bool
{
return false !== getenv('GITHUB_ACTIONS');
}






public function error(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void
{
$this->log('error', $message, $file, $line, $col);
}






public function warning(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void
{
$this->log('warning', $message, $file, $line, $col);
}






public function debug(string $message, ?string $file = null, ?int $line = null, ?int $col = null): void
{
$this->log('debug', $message, $file, $line, $col);
}

private function log(string $type, string $message, ?string $file = null, ?int $line = null, ?int $col = null): void
{

$message = strtr($message, self::ESCAPED_DATA);

if (!$file) {

$this->output->writeln(\sprintf('::%s::%s', $type, $message));

return;
}

$this->output->writeln(\sprintf('::%s file=%s,line=%s,col=%s::%s', $type, strtr($file, self::ESCAPED_PROPERTIES), strtr($line ?? 1, self::ESCAPED_PROPERTIES), strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message));
}
}
<?php










namespace Symfony\Component\Console\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;





class ErrorListener implements EventSubscriberInterface
{
private ?LoggerInterface $logger;

public function __construct(?LoggerInterface $logger = null)
{
$this->logger = $logger;
}




public function onConsoleError(ConsoleErrorEvent $event)
{
if (null === $this->logger) {
return;
}

$error = $event->getError();

if (!$inputString = $this->getInputString($event)) {
$this->logger->critical('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]);

return;
}

$this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]);
}




public function onConsoleTerminate(ConsoleTerminateEvent $event)
{
if (null === $this->logger) {
return;
}

$exitCode = $event->getExitCode();

if (0 === $exitCode) {
return;
}

if (!$inputString = $this->getInputString($event)) {
$this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]);

return;
}

$this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]);
}

public static function getSubscribedEvents(): array
{
return [
ConsoleEvents::ERROR => ['onConsoleError', -128],
ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128],
];
}

private static function getInputString(ConsoleEvent $event): ?string
{
$commandName = $event->getCommand()?->getName();
$input = $event->getInput();

if ($input instanceof \Stringable) {
if ($commandName) {
return str_replace(["'$commandName'", "\"$commandName\""], $commandName, (string) $input);
}

return (string) $input;
}

return $commandName;
}
}
<?php










namespace Symfony\Component\Console\SignalRegistry;

final class SignalRegistry
{
private array $signalHandlers = [];

public function __construct()
{
if (\function_exists('pcntl_async_signals')) {
pcntl_async_signals(true);
}
}

public function register(int $signal, callable $signalHandler): void
{
if (!isset($this->signalHandlers[$signal])) {
$previousCallback = pcntl_signal_get_handler($signal);

if (\is_callable($previousCallback)) {
$this->signalHandlers[$signal][] = $previousCallback;
}
}

$this->signalHandlers[$signal][] = $signalHandler;

pcntl_signal($signal, $this->handle(...));
}

public static function isSupported(): bool
{
return \function_exists('pcntl_signal');
}




public function handle(int $signal): void
{
$count = \count($this->signalHandlers[$signal]);

foreach ($this->signalHandlers[$signal] as $i => $signalHandler) {
$hasNext = $i !== $count - 1;
$signalHandler($signal, $hasNext);
}
}
}
<?php










namespace Symfony\Component\Console\SignalRegistry;




class SignalMap
{
private static array $map;

public static function getSignalName(int $signal): ?string
{
if (!\extension_loaded('pcntl')) {
return null;
}

if (!isset(self::$map)) {
$r = new \ReflectionExtension('pcntl');
$c = $r->getConstants();
$map = array_filter($c, fn ($k) => str_starts_with($k, 'SIG') && !str_starts_with($k, 'SIG_') && 'SIGBABY' !== $k, \ARRAY_FILTER_USE_KEY);
self::$map = array_flip($map);
}

return self::$map[$signal] ?? null;
}
}
<?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;




class SingleCommandApplication extends Command
{
private string $version = 'UNKNOWN';
private bool $autoExit = true;
private bool $running = false;




public function setVersion(string $version): static
{
$this->version = $version;

return $this;
}






public function setAutoExit(bool $autoExit): static
{
$this->autoExit = $autoExit;

return $this;
}

public function run(?InputInterface $input = null, ?OutputInterface $output = null): int
{
if ($this->running) {
return parent::run($input, $output);
}


$application = new Application($this->getName() ?: 'UNKNOWN', $this->version);
$application->setAutoExit($this->autoExit);

$this->setName($_SERVER['argv'][0]);
$application->add($this);
$application->setDefaultCommand($this->getName(), true);

$this->running = true;
try {
$ret = $application->run($input, $output);
} finally {
$this->running = false;
}

return $ret ?? 1;
}
}
<?php










namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;







final class ConsoleTerminateEvent extends ConsoleEvent
{
public function __construct(
Command $command,
InputInterface $input,
OutputInterface $output,
private int $exitCode,
private readonly ?int $interruptingSignal = null,
) {
parent::__construct($command, $input, $output);
}

public function setExitCode(int $exitCode): void
{
$this->exitCode = $exitCode;
}

public function getExitCode(): int
{
return $this->exitCode;
}

public function getInterruptingSignal(): ?int
{
return $this->interruptingSignal;
}
}
<?php










namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Contracts\EventDispatcher\Event;






class ConsoleEvent extends Event
{
protected $command;

private InputInterface $input;
private OutputInterface $output;

public function __construct(?Command $command, InputInterface $input, OutputInterface $output)
{
$this->command = $command;
$this->input = $input;
$this->output = $output;
}




public function getCommand(): ?Command
{
return $this->command;
}




public function getInput(): InputInterface
{
return $this->input;
}




public function getOutput(): OutputInterface
{
return $this->output;
}
}
<?php










namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;




final class ConsoleSignalEvent extends ConsoleEvent
{
private int $handlingSignal;
private int|false $exitCode;

public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal, int|false $exitCode = 0)
{
parent::__construct($command, $input, $output);
$this->handlingSignal = $handlingSignal;
$this->exitCode = $exitCode;
}

public function getHandlingSignal(): int
{
return $this->handlingSignal;
}

public function setExitCode(int $exitCode): void
{
if ($exitCode < 0 || $exitCode > 255) {
throw new \InvalidArgumentException('Exit code must be between 0 and 255.');
}

$this->exitCode = $exitCode;
}

public function abortExit(): void
{
$this->exitCode = false;
}

public function getExitCode(): int|false
{
return $this->exitCode;
}
}
<?php










namespace Symfony\Component\Console\Event;









final class ConsoleCommandEvent extends ConsoleEvent
{



public const RETURN_CODE_DISABLED = 113;




private bool $commandShouldRun = true;




public function disableCommand(): bool
{
return $this->commandShouldRun = false;
}

public function enableCommand(): bool
{
return $this->commandShouldRun = true;
}




public function commandShouldRun(): bool
{
return $this->commandShouldRun;
}
}
<?php










namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;






final class ConsoleErrorEvent extends ConsoleEvent
{
private \Throwable $error;
private int $exitCode;

public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, ?Command $command = null)
{
parent::__construct($command, $input, $output);

$this->error = $error;
}

public function getError(): \Throwable
{
return $this->error;
}

public function setError(\Throwable $error): void
{
$this->error = $error;
}

public function setExitCode(int $exitCode): void
{
$this->exitCode = $exitCode;

$r = new \ReflectionProperty($this->error, 'code');
$r->setValue($this->error, $this->exitCode);
}

public function getExitCode(): int
{
return $this->exitCode ?? (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1);
}
}
<?php










namespace Symfony\Component\Console\Logger;

use Psr\Log\AbstractLogger;
use Psr\Log\InvalidArgumentException;
use Psr\Log\LogLevel;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;








class ConsoleLogger extends AbstractLogger
{
public const INFO = 'info';
public const ERROR = 'error';

private OutputInterface $output;
private array $verbosityLevelMap = [
LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
];
private array $formatLevelMap = [
LogLevel::EMERGENCY => self::ERROR,
LogLevel::ALERT => self::ERROR,
LogLevel::CRITICAL => self::ERROR,
LogLevel::ERROR => self::ERROR,
LogLevel::WARNING => self::INFO,
LogLevel::NOTICE => self::INFO,
LogLevel::INFO => self::INFO,
LogLevel::DEBUG => self::INFO,
];
private bool $errored = false;

public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = [])
{
$this->output = $output;
$this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
$this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
}

public function log($level, $message, array $context = []): void
{
if (!isset($this->verbosityLevelMap[$level])) {
throw new InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $level));
}

$output = $this->output;


if (self::ERROR === $this->formatLevelMap[$level]) {
if ($this->output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}
$this->errored = true;
}



if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) {
$output->writeln(\sprintf('<%1$s>[%2$s] %3$s</%1$s>', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]);
}
}




public function hasErrored(): bool
{
return $this->errored;
}






private function interpolate(string $message, array $context): string
{
if (!str_contains($message, '{')) {
return $message;
}

$replacements = [];
foreach ($context as $key => $val) {
if (null === $val || \is_scalar($val) || $val instanceof \Stringable) {
$replacements["{{$key}}"] = $val;
} elseif ($val instanceof \DateTimeInterface) {
$replacements["{{$key}}"] = $val->format(\DateTimeInterface::RFC3339);
} elseif (\is_object($val)) {
$replacements["{{$key}}"] = '[object '.$val::class.']';
} else {
$replacements["{{$key}}"] = '['.\gettype($val).']';
}
}

return strtr($message, $replacements);
}
}
<?php










namespace Symfony\Component\Console\Helper;






interface HelperInterface
{





public function setHelperSet(?HelperSet $helperSet);




public function getHelperSet(): ?HelperSet;






public function getName();
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatter;






class FormatterHelper extends Helper
{



public function formatSection(string $section, string $message, string $style = 'info'): string
{
return \sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
}




public function formatBlock(string|array $messages, string $style, bool $large = false): string
{
if (!\is_array($messages)) {
$messages = [$messages];
}

$len = 0;
$lines = [];
foreach ($messages as $message) {
$message = OutputFormatter::escape($message);
$lines[] = \sprintf($large ? '  %s  ' : ' %s ', $message);
$len = max(self::width($message) + ($large ? 4 : 2), $len);
}

$messages = $large ? [str_repeat(' ', $len)] : [];
for ($i = 0; isset($lines[$i]); ++$i) {
$messages[] = $lines[$i].str_repeat(' ', $len - self::width($lines[$i]));
}
if ($large) {
$messages[] = str_repeat(' ', $len);
}

for ($i = 0; isset($messages[$i]); ++$i) {
$messages[$i] = \sprintf('<%s>%s</%s>', $style, $messages[$i], $style);
}

return implode("\n", $messages);
}




public function truncate(string $message, int $length, string $suffix = '...'): string
{
$computedLength = $length - self::width($suffix);

if ($computedLength > self::width($message)) {
return $message;
}

return self::substr($message, 0, $length).$suffix;
}

public function getName(): string
{
return 'formatter';
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Cursor;
use Symfony\Component\Console\Exception\MissingInputException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\StreamableInputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Terminal;

use function Symfony\Component\String\s;






class QuestionHelper extends Helper
{



private $inputStream;

private static bool $stty = true;
private static bool $stdinIsInteractive;








public function ask(InputInterface $input, OutputInterface $output, Question $question): mixed
{
if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}

if (!$input->isInteractive()) {
return $this->getDefaultAnswer($question);
}

if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) {
$this->inputStream = $stream;
}

try {
if (!$question->getValidator()) {
return $this->doAsk($output, $question);
}

$interviewer = fn () => $this->doAsk($output, $question);

return $this->validateAttempts($interviewer, $output, $question);
} catch (MissingInputException $exception) {
$input->setInteractive(false);

if (null === $fallbackOutput = $this->getDefaultAnswer($question)) {
throw $exception;
}

return $fallbackOutput;
}
}

public function getName(): string
{
return 'question';
}






public static function disableStty()
{
self::$stty = false;
}






private function doAsk(OutputInterface $output, Question $question): mixed
{
$this->writePrompt($output, $question);

$inputStream = $this->inputStream ?: \STDIN;
$autocomplete = $question->getAutocompleterCallback();

if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) {
$ret = false;
if ($question->isHidden()) {
try {
$hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable());
$ret = $question->isTrimmable() ? trim($hiddenResponse) : $hiddenResponse;
} catch (RuntimeException $e) {
if (!$question->isHiddenFallback()) {
throw $e;
}
}
}

if (false === $ret) {
$isBlocked = stream_get_meta_data($inputStream)['blocked'] ?? true;

if (!$isBlocked) {
stream_set_blocking($inputStream, true);
}

$ret = $this->readInput($inputStream, $question);

if (!$isBlocked) {
stream_set_blocking($inputStream, false);
}

if (false === $ret) {
throw new MissingInputException('Aborted.');
}
if ($question->isTrimmable()) {
$ret = trim($ret);
}
}
} else {
$autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete);
$ret = $question->isTrimmable() ? trim($autocomplete) : $autocomplete;
}

if ($output instanceof ConsoleSectionOutput) {
$output->addContent(''); 
$output->addContent($ret);
}

$ret = \strlen($ret) > 0 ? $ret : $question->getDefault();

if ($normalizer = $question->getNormalizer()) {
return $normalizer($ret);
}

return $ret;
}

private function getDefaultAnswer(Question $question): mixed
{
$default = $question->getDefault();

if (null === $default) {
return $default;
}

if ($validator = $question->getValidator()) {
return \call_user_func($validator, $default);
} elseif ($question instanceof ChoiceQuestion) {
$choices = $question->getChoices();

if (!$question->isMultiselect()) {
return $choices[$default] ?? $default;
}

$default = explode(',', $default);
foreach ($default as $k => $v) {
$v = $question->isTrimmable() ? trim($v) : $v;
$default[$k] = $choices[$v] ?? $v;
}
}

return $default;
}






protected function writePrompt(OutputInterface $output, Question $question)
{
$message = $question->getQuestion();

if ($question instanceof ChoiceQuestion) {
$output->writeln(array_merge([
$question->getQuestion(),
], $this->formatChoiceQuestionChoices($question, 'info')));

$message = $question->getPrompt();
}

$output->write($message);
}




protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag): array
{
$messages = [];

$maxWidth = max(array_map([__CLASS__, 'width'], array_keys($choices = $question->getChoices())));

foreach ($choices as $key => $value) {
$padding = str_repeat(' ', $maxWidth - self::width($key));

$messages[] = \sprintf("  [<$tag>%s$padding</$tag>] %s", $key, $value);
}

return $messages;
}






protected function writeError(OutputInterface $output, \Exception $error)
{
if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) {
$message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error');
} else {
$message = '<error>'.$error->getMessage().'</error>';
}

$output->writeln($message);
}






private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete): string
{
$cursor = new Cursor($output, $inputStream);

$fullChoice = '';
$ret = '';

$i = 0;
$ofs = -1;
$matches = $autocomplete($ret);
$numMatches = \count($matches);
$inputHelper = new TerminalInputHelper($inputStream);


shell_exec('stty -icanon -echo');


$output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));


while (!feof($inputStream)) {
$inputHelper->waitForInput();
$c = fread($inputStream, 1);


if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) {

$inputHelper->finish();
throw new MissingInputException('Aborted.');
} elseif ("\177" === $c) { 
if (0 === $numMatches && 0 !== $i) {
--$i;
$cursor->moveLeft(s($fullChoice)->slice(-1)->width(false));

$fullChoice = self::substr($fullChoice, 0, $i);
}

if (0 === $i) {
$ofs = -1;
$matches = $autocomplete($ret);
$numMatches = \count($matches);
} else {
$numMatches = 0;
}


$ret = self::substr($ret, 0, $i);
} elseif ("\033" === $c) {

$c .= fread($inputStream, 2);


if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
if ('A' === $c[2] && -1 === $ofs) {
$ofs = 0;
}

if (0 === $numMatches) {
continue;
}

$ofs += ('A' === $c[2]) ? -1 : 1;
$ofs = ($numMatches + $ofs) % $numMatches;
}
} elseif ('' === $c || \ord($c) < 32) {
if ("\t" === $c || "\n" === $c) {
if ($numMatches > 0 && -1 !== $ofs) {
$ret = (string) $matches[$ofs];

$remainingCharacters = substr($ret, \strlen(trim($this->mostRecentlyEnteredValue($fullChoice))));
$output->write($remainingCharacters);
$fullChoice .= $remainingCharacters;
$i = (false === $encoding = mb_detect_encoding($fullChoice, null, true)) ? \strlen($fullChoice) : mb_strlen($fullChoice, $encoding);

$matches = array_filter(
$autocomplete($ret),
fn ($match) => '' === $ret || str_starts_with($match, $ret)
);
$numMatches = \count($matches);
$ofs = -1;
}

if ("\n" === $c) {
$output->write($c);
break;
}

$numMatches = 0;
}

continue;
} else {
if ("\x80" <= $c) {
$c .= fread($inputStream, ["\xC0" => 1, "\xD0" => 1, "\xE0" => 2, "\xF0" => 3][$c & "\xF0"]);
}

$output->write($c);
$ret .= $c;
$fullChoice .= $c;
++$i;

$tempRet = $ret;

if ($question instanceof ChoiceQuestion && $question->isMultiselect()) {
$tempRet = $this->mostRecentlyEnteredValue($fullChoice);
}

$numMatches = 0;
$ofs = 0;

foreach ($autocomplete($ret) as $value) {

if (str_starts_with($value, $tempRet)) {
$matches[$numMatches++] = $value;
}
}
}

$cursor->clearLineAfter();

if ($numMatches > 0 && -1 !== $ofs) {
$cursor->savePosition();

$charactersEntered = \strlen(trim($this->mostRecentlyEnteredValue($fullChoice)));
$output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $charactersEntered)).'</hl>');
$cursor->restorePosition();
}
}


$inputHelper->finish();

return $fullChoice;
}

private function mostRecentlyEnteredValue(string $entered): string
{

if (!str_contains($entered, ',')) {
return $entered;
}

$choices = explode(',', $entered);
if ('' !== $lastChoice = trim($choices[\count($choices) - 1])) {
return $lastChoice;
}

return $entered;
}









private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = true): string
{
if ('\\' === \DIRECTORY_SEPARATOR) {
$exe = __DIR__.'/../Resources/bin/hiddeninput.exe';


if (str_starts_with(__FILE__, 'phar:')) {
$tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
copy($exe, $tmpExe);
$exe = $tmpExe;
}

$sExec = shell_exec('"'.$exe.'"');
$value = $trimmable ? rtrim($sExec) : $sExec;
$output->writeln('');

if (isset($tmpExe)) {
unlink($tmpExe);
}

return $value;
}

$inputHelper = null;

if (self::$stty && Terminal::hasSttyAvailable()) {
$inputHelper = new TerminalInputHelper($inputStream);
shell_exec('stty -echo');
} elseif ($this->isInteractiveInput($inputStream)) {
throw new RuntimeException('Unable to hide the response.');
}

$inputHelper?->waitForInput();

$value = fgets($inputStream, 4096);

if (4095 === \strlen($value)) {
$errOutput = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output;
$errOutput->warning('The value was possibly truncated by your shell or terminal emulator');
}


$inputHelper?->finish();

if (false === $value) {
throw new MissingInputException('Aborted.');
}
if ($trimmable) {
$value = trim($value);
}
$output->writeln('');

return $value;
}








private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question): mixed
{
$error = null;
$attempts = $question->getMaxAttempts();

while (null === $attempts || $attempts--) {
if (null !== $error) {
$this->writeError($output, $error);
}

try {
return $question->getValidator()($interviewer());
} catch (RuntimeException $e) {
throw $e;
} catch (\Exception $error) {
}
}

throw $error;
}

private function isInteractiveInput($inputStream): bool
{
if ('php://stdin' !== (stream_get_meta_data($inputStream)['uri'] ?? null)) {
return false;
}

if (isset(self::$stdinIsInteractive)) {
return self::$stdinIsInteractive;
}

return self::$stdinIsInteractive = @stream_isatty(fopen('php://stdin', 'r'));
}







private function readInput($inputStream, Question $question): string|false
{
if (!$question->isMultiline()) {
$cp = $this->setIOCodepage();
$ret = fgets($inputStream, 4096);

return $this->resetIOCodepage($cp, $ret);
}

$multiLineStreamReader = $this->cloneInputStream($inputStream);
if (null === $multiLineStreamReader) {
return false;
}

$ret = '';
$cp = $this->setIOCodepage();
while (false !== ($char = fgetc($multiLineStreamReader))) {
if ("\x4" === $char || \PHP_EOL === "{$ret}{$char}") {
break;
}
$ret .= $char;
}

if (stream_get_meta_data($inputStream)['seekable']) {
fseek($inputStream, ftell($multiLineStreamReader));
}

return $this->resetIOCodepage($cp, $ret);
}

private function setIOCodepage(): int
{
if (\function_exists('sapi_windows_cp_set')) {
$cp = sapi_windows_cp_get();
sapi_windows_cp_set(sapi_windows_cp_get('oem'));

return $cp;
}

return 0;
}




private function resetIOCodepage(int $cp, string|false $input): string|false
{
if (0 !== $cp) {
sapi_windows_cp_set($cp);

if (false !== $input && '' !== $input) {
$input = sapi_windows_cp_conv(sapi_windows_cp_get('oem'), $cp, $input);
}
}

return $input;
}









private function cloneInputStream($inputStream)
{
$streamMetaData = stream_get_meta_data($inputStream);
$seekable = $streamMetaData['seekable'] ?? false;
$mode = $streamMetaData['mode'] ?? 'rb';
$uri = $streamMetaData['uri'] ?? null;

if (null === $uri) {
return null;
}

$cloneStream = fopen($uri, $mode);



if (true === $seekable && !\in_array($mode, ['r', 'rb', 'rt'])) {
$offset = ftell($inputStream);
rewind($inputStream);
stream_copy_to_stream($inputStream, $cloneStream);
fseek($inputStream, $offset);
fseek($cloneStream, $offset);
}

return $cloneStream;
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Input\InputAwareInterface;
use Symfony\Component\Console\Input\InputInterface;






abstract class InputAwareHelper extends Helper implements InputAwareInterface
{
protected $input;




public function setInput(InputInterface $input)
{
$this->input = $input;
}
}
<?php










namespace Symfony\Component\Console\Helper;




class TableRows implements \IteratorAggregate
{
private \Closure $generator;

public function __construct(\Closure $generator)
{
$this->generator = $generator;
}

public function getIterator(): \Traversable
{
return ($this->generator)();
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;




class TableCell
{
private string $value;
private array $options = [
'rowspan' => 1,
'colspan' => 1,
'style' => null,
];

public function __construct(string $value = '', array $options = [])
{
$this->value = $value;


if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
throw new InvalidArgumentException(\sprintf('The TableCell does not support the following options: \'%s\'.', implode('\', \'', $diff)));
}

if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) {
throw new InvalidArgumentException('The style option must be an instance of "TableCellStyle".');
}

$this->options = array_merge($this->options, $options);
}




public function __toString(): string
{
return $this->value;
}




public function getColspan(): int
{
return (int) $this->options['colspan'];
}




public function getRowspan(): int
{
return (int) $this->options['rowspan'];
}

public function getStyle(): ?TableCellStyle
{
return $this->options['style'];
}
}
<?php










namespace Symfony\Component\Console\Helper;






















final class TerminalInputHelper
{

private $inputStream;
private bool $isStdin;
private string $initialState;
private int $signalToKill = 0;
private array $signalHandlers = [];
private array $targetSignals = [];






public function __construct($inputStream)
{
if (!\is_string($state = shell_exec('stty -g'))) {
throw new \RuntimeException('Unable to read the terminal settings.');
}
$this->inputStream = $inputStream;
$this->initialState = $state;
$this->isStdin = 'php://stdin' === stream_get_meta_data($inputStream)['uri'];
$this->createSignalHandlers();
}




public function waitForInput(): void
{
if ($this->isStdin) {
$r = [$this->inputStream];
$w = [];




while (0 === @stream_select($r, $w, $w, 0, 100)) {
$r = [$this->inputStream];
}
}
$this->checkForKillSignal();
}




public function finish(): void
{

$this->checkForKillSignal();
shell_exec('stty '.$this->initialState);
$this->signalToKill = 0;

foreach ($this->signalHandlers as $signal => $originalHandler) {
pcntl_signal($signal, $originalHandler);
}
$this->signalHandlers = [];
$this->targetSignals = [];
}

private function createSignalHandlers(): void
{
if (!\function_exists('pcntl_async_signals') || !\function_exists('pcntl_signal')) {
return;
}

pcntl_async_signals(true);
$this->targetSignals = [\SIGINT, \SIGQUIT, \SIGTERM];

foreach ($this->targetSignals as $signal) {
$this->signalHandlers[$signal] = pcntl_signal_get_handler($signal);

pcntl_signal($signal, function ($signal) {

$currentState = shell_exec('stty -g');
shell_exec('stty '.$this->initialState);
$originalHandler = $this->signalHandlers[$signal];

if (\is_callable($originalHandler)) {
$originalHandler($signal);

shell_exec('stty '.$currentState);

return;
}


if (\SIG_DFL === $originalHandler) {
$this->signalToKill = $signal;
}
});
}
}

private function checkForKillSignal(): void
{
if (\in_array($this->signalToKill, $this->targetSignals, true)) {

if (\function_exists('posix_kill')) {
pcntl_signal($this->signalToKill, \SIG_DFL);
posix_kill(getmypid(), $this->signalToKill);
}


exit(128 + $this->signalToKill);
}
}
}
<?php










namespace Symfony\Component\Console\Helper;








class DebugFormatterHelper extends Helper
{
private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default'];
private array $started = [];
private int $count = -1;




public function start(string $id, string $message, string $prefix = 'RUN'): string
{
$this->started[$id] = ['border' => ++$this->count % \count(self::COLORS)];

return \sprintf("%s<bg=blue;fg=white> %s </> <fg=blue>%s</>\n", $this->getBorder($id), $prefix, $message);
}




public function progress(string $id, string $buffer, bool $error = false, string $prefix = 'OUT', string $errorPrefix = 'ERR'): string
{
$message = '';

if ($error) {
if (isset($this->started[$id]['out'])) {
$message .= "\n";
unset($this->started[$id]['out']);
}
if (!isset($this->started[$id]['err'])) {
$message .= \sprintf('%s<bg=red;fg=white> %s </> ', $this->getBorder($id), $errorPrefix);
$this->started[$id]['err'] = true;
}

$message .= str_replace("\n", \sprintf("\n%s<bg=red;fg=white> %s </> ", $this->getBorder($id), $errorPrefix), $buffer);
} else {
if (isset($this->started[$id]['err'])) {
$message .= "\n";
unset($this->started[$id]['err']);
}
if (!isset($this->started[$id]['out'])) {
$message .= \sprintf('%s<bg=green;fg=white> %s </> ', $this->getBorder($id), $prefix);
$this->started[$id]['out'] = true;
}

$message .= str_replace("\n", \sprintf("\n%s<bg=green;fg=white> %s </> ", $this->getBorder($id), $prefix), $buffer);
}

return $message;
}




public function stop(string $id, string $message, bool $successful, string $prefix = 'RES'): string
{
$trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : '';

if ($successful) {
return \sprintf("%s%s<bg=green;fg=white> %s </> <fg=green>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);
}

$message = \sprintf("%s%s<bg=red;fg=white> %s </> <fg=red>%s</>\n", $trailingEOL, $this->getBorder($id), $prefix, $message);

unset($this->started[$id]['out'], $this->started[$id]['err']);

return $message;
}

private function getBorder(string $id): string
{
return \sprintf('<bg=%s> </>', self::COLORS[$this->started[$id]['border']]);
}

public function getName(): string
{
return 'debug_formatter';
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Descriptor\DescriptorInterface;
use Symfony\Component\Console\Descriptor\JsonDescriptor;
use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
use Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor;
use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Output\OutputInterface;






class DescriptorHelper extends Helper
{



private array $descriptors = [];

public function __construct()
{
$this
->register('txt', new TextDescriptor())
->register('xml', new XmlDescriptor())
->register('json', new JsonDescriptor())
->register('md', new MarkdownDescriptor())
->register('rst', new ReStructuredTextDescriptor())
;
}












public function describe(OutputInterface $output, ?object $object, array $options = [])
{
$options = array_merge([
'raw_text' => false,
'format' => 'txt',
], $options);

if (!isset($this->descriptors[$options['format']])) {
throw new InvalidArgumentException(\sprintf('Unsupported format "%s".', $options['format']));
}

$descriptor = $this->descriptors[$options['format']];
$descriptor->describe($output, $object, $options);
}






public function register(string $format, DescriptorInterface $descriptor): static
{
$this->descriptors[$format] = $descriptor;

return $this;
}

public function getName(): string
{
return 'descriptor';
}

public function getFormats(): array
{
return array_keys($this->descriptors);
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;








class TableStyle
{
private string $paddingChar = ' ';
private string $horizontalOutsideBorderChar = '-';
private string $horizontalInsideBorderChar = '-';
private string $verticalOutsideBorderChar = '|';
private string $verticalInsideBorderChar = '|';
private string $crossingChar = '+';
private string $crossingTopRightChar = '+';
private string $crossingTopMidChar = '+';
private string $crossingTopLeftChar = '+';
private string $crossingMidRightChar = '+';
private string $crossingBottomRightChar = '+';
private string $crossingBottomMidChar = '+';
private string $crossingBottomLeftChar = '+';
private string $crossingMidLeftChar = '+';
private string $crossingTopLeftBottomChar = '+';
private string $crossingTopMidBottomChar = '+';
private string $crossingTopRightBottomChar = '+';
private string $headerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private string $footerTitleFormat = '<fg=black;bg=white;options=bold> %s </>';
private string $cellHeaderFormat = '<info>%s</info>';
private string $cellRowFormat = '%s';
private string $cellRowContentFormat = ' %s ';
private string $borderFormat = '%s';
private int $padType = \STR_PAD_RIGHT;






public function setPaddingChar(string $paddingChar): static
{
if (!$paddingChar) {
throw new LogicException('The padding char must not be empty.');
}

$this->paddingChar = $paddingChar;

return $this;
}




public function getPaddingChar(): string
{
return $this->paddingChar;
}

















public function setHorizontalBorderChars(string $outside, ?string $inside = null): static
{
$this->horizontalOutsideBorderChar = $outside;
$this->horizontalInsideBorderChar = $inside ?? $outside;

return $this;
}


















public function setVerticalBorderChars(string $outside, ?string $inside = null): static
{
$this->verticalOutsideBorderChar = $outside;
$this->verticalInsideBorderChar = $inside ?? $outside;

return $this;
}






public function getBorderChars(): array
{
return [
$this->horizontalOutsideBorderChar,
$this->verticalOutsideBorderChar,
$this->horizontalInsideBorderChar,
$this->verticalInsideBorderChar,
];
}
































public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, ?string $topLeftBottom = null, ?string $topMidBottom = null, ?string $topRightBottom = null): static
{
$this->crossingChar = $cross;
$this->crossingTopLeftChar = $topLeft;
$this->crossingTopMidChar = $topMid;
$this->crossingTopRightChar = $topRight;
$this->crossingMidRightChar = $midRight;
$this->crossingBottomRightChar = $bottomRight;
$this->crossingBottomMidChar = $bottomMid;
$this->crossingBottomLeftChar = $bottomLeft;
$this->crossingMidLeftChar = $midLeft;
$this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft;
$this->crossingTopMidBottomChar = $topMidBottom ?? $cross;
$this->crossingTopRightBottomChar = $topRightBottom ?? $midRight;

return $this;
}






public function setDefaultCrossingChar(string $char): self
{
return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char);
}




public function getCrossingChar(): string
{
return $this->crossingChar;
}






public function getCrossingChars(): array
{
return [
$this->crossingChar,
$this->crossingTopLeftChar,
$this->crossingTopMidChar,
$this->crossingTopRightChar,
$this->crossingMidRightChar,
$this->crossingBottomRightChar,
$this->crossingBottomMidChar,
$this->crossingBottomLeftChar,
$this->crossingMidLeftChar,
$this->crossingTopLeftBottomChar,
$this->crossingTopMidBottomChar,
$this->crossingTopRightBottomChar,
];
}






public function setCellHeaderFormat(string $cellHeaderFormat): static
{
$this->cellHeaderFormat = $cellHeaderFormat;

return $this;
}




public function getCellHeaderFormat(): string
{
return $this->cellHeaderFormat;
}






public function setCellRowFormat(string $cellRowFormat): static
{
$this->cellRowFormat = $cellRowFormat;

return $this;
}




public function getCellRowFormat(): string
{
return $this->cellRowFormat;
}






public function setCellRowContentFormat(string $cellRowContentFormat): static
{
$this->cellRowContentFormat = $cellRowContentFormat;

return $this;
}




public function getCellRowContentFormat(): string
{
return $this->cellRowContentFormat;
}






public function setBorderFormat(string $borderFormat): static
{
$this->borderFormat = $borderFormat;

return $this;
}




public function getBorderFormat(): string
{
return $this->borderFormat;
}






public function setPadType(int $padType): static
{
if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], true)) {
throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).');
}

$this->padType = $padType;

return $this;
}




public function getPadType(): int
{
return $this->padType;
}

public function getHeaderTitleFormat(): string
{
return $this->headerTitleFormat;
}




public function setHeaderTitleFormat(string $format): static
{
$this->headerTitleFormat = $format;

return $this;
}

public function getFooterTitleFormat(): string
{
return $this->footerTitleFormat;
}




public function setFooterTitleFormat(string $format): static
{
$this->footerTitleFormat = $format;

return $this;
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Style\SymfonyStyle;






class SymfonyQuestionHelper extends QuestionHelper
{



protected function writePrompt(OutputInterface $output, Question $question)
{
$text = OutputFormatter::escapeTrailingBackslash($question->getQuestion());
$default = $question->getDefault();

if ($question->isMultiline()) {
$text .= \sprintf(' (press %s to continue)', $this->getEofShortcut());
}

switch (true) {
case null === $default:
$text = \sprintf(' <info>%s</info>:', $text);

break;

case $question instanceof ConfirmationQuestion:
$text = \sprintf(' <info>%s (yes/no)</info> [<comment>%s</comment>]:', $text, $default ? 'yes' : 'no');

break;

case $question instanceof ChoiceQuestion && $question->isMultiselect():
$choices = $question->getChoices();
$default = explode(',', $default);

foreach ($default as $key => $value) {
$default[$key] = $choices[trim($value)];
}

$text = \sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape(implode(', ', $default)));

break;

case $question instanceof ChoiceQuestion:
$choices = $question->getChoices();
$text = \sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($choices[$default] ?? $default));

break;

default:
$text = \sprintf(' <info>%s</info> [<comment>%s</comment>]:', $text, OutputFormatter::escape($default));
}

$output->writeln($text);

$prompt = ' > ';

if ($question instanceof ChoiceQuestion) {
$output->writeln($this->formatChoiceQuestionChoices($question, 'comment'));

$prompt = $question->getPrompt();
}

$output->write($prompt);
}




protected function writeError(OutputInterface $output, \Exception $error)
{
if ($output instanceof SymfonyStyle) {
$output->newLine();
$output->error($error->getMessage());

return;
}

parent::writeError($output, $error);
}

private function getEofShortcut(): string
{
if ('Windows' === \PHP_OS_FAMILY) {
return '<comment>Ctrl+Z</comment> then <comment>Enter</comment>';
}

return '<comment>Ctrl+D</comment>';
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Output\OutputInterface;




class ProgressIndicator
{
private const FORMATS = [
'normal' => ' %indicator% %message%',
'normal_no_ansi' => ' %message%',

'verbose' => ' %indicator% %message% (%elapsed:6s%)',
'verbose_no_ansi' => ' %message% (%elapsed:6s%)',

'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)',
'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)',
];

private OutputInterface $output;
private int $startTime;
private ?string $format = null;
private ?string $message = null;
private array $indicatorValues;
private int $indicatorCurrent;
private int $indicatorChangeInterval;
private float $indicatorUpdateTime;
private bool $started = false;




private static array $formatters;





public function __construct(OutputInterface $output, ?string $format = null, int $indicatorChangeInterval = 100, ?array $indicatorValues = null)
{
$this->output = $output;

$format ??= $this->determineBestFormat();
$indicatorValues ??= ['-', '\\', '|', '/'];
$indicatorValues = array_values($indicatorValues);

if (2 > \count($indicatorValues)) {
throw new InvalidArgumentException('Must have at least 2 indicator value characters.');
}

$this->format = self::getFormatDefinition($format);
$this->indicatorChangeInterval = $indicatorChangeInterval;
$this->indicatorValues = $indicatorValues;
$this->startTime = time();
}






public function setMessage(?string $message)
{
$this->message = $message;

$this->display();
}






public function start(string $message)
{
if ($this->started) {
throw new LogicException('Progress indicator already started.');
}

$this->message = $message;
$this->started = true;
$this->startTime = time();
$this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval;
$this->indicatorCurrent = 0;

$this->display();
}






public function advance()
{
if (!$this->started) {
throw new LogicException('Progress indicator has not yet been started.');
}

if (!$this->output->isDecorated()) {
return;
}

$currentTime = $this->getCurrentTimeInMilliseconds();

if ($currentTime < $this->indicatorUpdateTime) {
return;
}

$this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval;
++$this->indicatorCurrent;

$this->display();
}






public function finish(string $message)
{
if (!$this->started) {
throw new LogicException('Progress indicator has not yet been started.');
}

$this->message = $message;
$this->display();
$this->output->writeln('');
$this->started = false;
}




public static function getFormatDefinition(string $name): ?string
{
return self::FORMATS[$name] ?? null;
}








public static function setPlaceholderFormatterDefinition(string $name, callable $callable)
{
self::$formatters ??= self::initPlaceholderFormatters();

self::$formatters[$name] = $callable;
}




public static function getPlaceholderFormatterDefinition(string $name): ?callable
{
self::$formatters ??= self::initPlaceholderFormatters();

return self::$formatters[$name] ?? null;
}

private function display(): void
{
if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
return;
}

$this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) {
if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) {
return $formatter($this);
}

return $matches[0];
}, $this->format ?? ''));
}

private function determineBestFormat(): string
{
return match ($this->output->getVerbosity()) {

OutputInterface::VERBOSITY_VERBOSE => $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi',
OutputInterface::VERBOSITY_VERY_VERBOSE,
OutputInterface::VERBOSITY_DEBUG => $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi',
default => $this->output->isDecorated() ? 'normal' : 'normal_no_ansi',
};
}




private function overwrite(string $message): void
{
if ($this->output->isDecorated()) {
$this->output->write("\x0D\x1B[2K");
$this->output->write($message);
} else {
$this->output->writeln($message);
}
}

private function getCurrentTimeInMilliseconds(): float
{
return round(microtime(true) * 1000);
}




private static function initPlaceholderFormatters(): array
{
return [
'indicator' => fn (self $indicator) => $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)],
'message' => fn (self $indicator) => $indicator->message,
'elapsed' => fn (self $indicator) => Helper::formatTime(time() - $indicator->startTime, 2),
'memory' => fn () => Helper::formatMemory(memory_get_usage(true)),
];
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;








class ProcessHelper extends Helper
{







public function run(OutputInterface $output, array|Process $cmd, ?string $error = null, ?callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE): Process
{
if (!class_exists(Process::class)) {
throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".');
}

if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}

$formatter = $this->getHelperSet()->get('debug_formatter');

if ($cmd instanceof Process) {
$cmd = [$cmd];
}

if (\is_string($cmd[0] ?? null)) {
$process = new Process($cmd);
$cmd = [];
} elseif (($cmd[0] ?? null) instanceof Process) {
$process = $cmd[0];
unset($cmd[0]);
} else {
throw new \InvalidArgumentException(\sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__));
}

if ($verbosity <= $output->getVerbosity()) {
$output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine())));
}

if ($output->isDebug()) {
$callback = $this->wrapCallback($output, $process, $callback);
}

$process->run($callback, $cmd);

if ($verbosity <= $output->getVerbosity()) {
$message = $process->isSuccessful() ? 'Command ran successfully' : \sprintf('%s Command did not run successfully', $process->getExitCode());
$output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful()));
}

if (!$process->isSuccessful() && null !== $error) {
$output->writeln(\sprintf('<error>%s</error>', $this->escapeString($error)));
}

return $process;
}















public function mustRun(OutputInterface $output, array|Process $cmd, ?string $error = null, ?callable $callback = null): Process
{
$process = $this->run($output, $cmd, $error, $callback);

if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}

return $process;
}




public function wrapCallback(OutputInterface $output, Process $process, ?callable $callback = null): callable
{
if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}

$formatter = $this->getHelperSet()->get('debug_formatter');

return function ($type, $buffer) use ($output, $process, $callback, $formatter) {
$output->write($formatter->progress(spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type));

if (null !== $callback) {
$callback($type, $buffer);
}
};
}

private function escapeString(string $str): string
{
return str_replace('<', '\\<', $str);
}

public function getName(): string
{
return 'process';
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Cursor;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Terminal;







final class ProgressBar
{
public const FORMAT_VERBOSE = 'verbose';
public const FORMAT_VERY_VERBOSE = 'very_verbose';
public const FORMAT_DEBUG = 'debug';
public const FORMAT_NORMAL = 'normal';

private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax';
private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax';
private const FORMAT_DEBUG_NOMAX = 'debug_nomax';
private const FORMAT_NORMAL_NOMAX = 'normal_nomax';

private int $barWidth = 28;
private string $barChar;
private string $emptyBarChar = '-';
private string $progressChar = '>';
private ?string $format = null;
private ?string $internalFormat = null;
private ?int $redrawFreq = 1;
private int $writeCount = 0;
private float $lastWriteTime = 0;
private float $minSecondsBetweenRedraws = 0;
private float $maxSecondsBetweenRedraws = 1;
private OutputInterface $output;
private int $step = 0;
private int $startingStep = 0;
private ?int $max = null;
private int $startTime;
private int $stepWidth;
private float $percent = 0.0;
private array $messages = [];
private bool $overwrite = true;
private Terminal $terminal;
private ?string $previousMessage = null;
private Cursor $cursor;
private array $placeholders = [];

private static array $formatters;
private static array $formats;




public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25)
{
if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}

$this->output = $output;
$this->setMaxSteps($max);
$this->terminal = new Terminal();

if (0 < $minSecondsBetweenRedraws) {
$this->redrawFreq = null;
$this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws;
}

if (!$this->output->isDecorated()) {

$this->overwrite = false;


$this->redrawFreq = null;
}

$this->startTime = time();
$this->cursor = new Cursor($output);
}









public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void
{
self::$formatters ??= self::initPlaceholderFormatters();

self::$formatters[$name] = $callable;
}






public static function getPlaceholderFormatterDefinition(string $name): ?callable
{
self::$formatters ??= self::initPlaceholderFormatters();

return self::$formatters[$name] ?? null;
}






public function setPlaceholderFormatter(string $name, callable $callable): void
{
$this->placeholders[$name] = $callable;
}






public function getPlaceholderFormatter(string $name): ?callable
{
return $this->placeholders[$name] ?? $this::getPlaceholderFormatterDefinition($name);
}









public static function setFormatDefinition(string $name, string $format): void
{
self::$formats ??= self::initFormats();

self::$formats[$name] = $format;
}






public static function getFormatDefinition(string $name): ?string
{
self::$formats ??= self::initFormats();

return self::$formats[$name] ?? null;
}











public function setMessage(string $message, string $name = 'message'): void
{
$this->messages[$name] = $message;
}

public function getMessage(string $name = 'message'): ?string
{
return $this->messages[$name] ?? null;
}

public function getStartTime(): int
{
return $this->startTime;
}

public function getMaxSteps(): int
{
return $this->max;
}

public function getProgress(): int
{
return $this->step;
}

private function getStepWidth(): int
{
return $this->stepWidth;
}

public function getProgressPercent(): float
{
return $this->percent;
}

public function getBarOffset(): float
{
return floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth);
}

public function getEstimated(): float
{
if (0 === $this->step || $this->step === $this->startingStep) {
return 0;
}

return round((time() - $this->startTime) / ($this->step - $this->startingStep) * $this->max);
}

public function getRemaining(): float
{
if (0 === $this->step || $this->step === $this->startingStep) {
return 0;
}

return round((time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step));
}

public function setBarWidth(int $size): void
{
$this->barWidth = max(1, $size);
}

public function getBarWidth(): int
{
return $this->barWidth;
}

public function setBarCharacter(string $char): void
{
$this->barChar = $char;
}

public function getBarCharacter(): string
{
return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar);
}

public function setEmptyBarCharacter(string $char): void
{
$this->emptyBarChar = $char;
}

public function getEmptyBarCharacter(): string
{
return $this->emptyBarChar;
}

public function setProgressCharacter(string $char): void
{
$this->progressChar = $char;
}

public function getProgressCharacter(): string
{
return $this->progressChar;
}

public function setFormat(string $format): void
{
$this->format = null;
$this->internalFormat = $format;
}






public function setRedrawFrequency(?int $freq): void
{
$this->redrawFreq = null !== $freq ? max(1, $freq) : null;
}

public function minSecondsBetweenRedraws(float $seconds): void
{
$this->minSecondsBetweenRedraws = $seconds;
}

public function maxSecondsBetweenRedraws(float $seconds): void
{
$this->maxSecondsBetweenRedraws = $seconds;
}

/**
@template
@template







*/
public function iterate(iterable $iterable, ?int $max = null): iterable
{
$this->start($max ?? (is_countable($iterable) ? \count($iterable) : 0));

foreach ($iterable as $key => $value) {
yield $key => $value;

$this->advance();
}

$this->finish();
}







public function start(?int $max = null, int $startAt = 0): void
{
$this->startTime = time();
$this->step = $startAt;
$this->startingStep = $startAt;

$startAt > 0 ? $this->setProgress($startAt) : $this->percent = 0.0;

if (null !== $max) {
$this->setMaxSteps($max);
}

$this->display();
}






public function advance(int $step = 1): void
{
$this->setProgress($this->step + $step);
}




public function setOverwrite(bool $overwrite): void
{
$this->overwrite = $overwrite;
}

public function setProgress(int $step): void
{
if ($this->max && $step > $this->max) {
$this->max = $step;
} elseif ($step < 0) {
$step = 0;
}

$redrawFreq = $this->redrawFreq ?? (($this->max ?: 10) / 10);
$prevPeriod = (int) ($this->step / $redrawFreq);
$currPeriod = (int) ($step / $redrawFreq);
$this->step = $step;
$this->percent = $this->max ? (float) $this->step / $this->max : 0;
$timeInterval = microtime(true) - $this->lastWriteTime;


if ($this->max === $step) {
$this->display();

return;
}


if ($timeInterval < $this->minSecondsBetweenRedraws) {
return;
}


if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) {
$this->display();
}
}

public function setMaxSteps(int $max): void
{
$this->format = null;
$this->max = max(0, $max);
$this->stepWidth = $this->max ? Helper::width((string) $this->max) : 4;
}




public function finish(): void
{
if (!$this->max) {
$this->max = $this->step;
}

if ($this->step === $this->max && !$this->overwrite) {

return;
}

$this->setProgress($this->max);
}




public function display(): void
{
if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) {
return;
}

if (null === $this->format) {
$this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
}

$this->overwrite($this->buildLine());
}








public function clear(): void
{
if (!$this->overwrite) {
return;
}

if (null === $this->format) {
$this->setRealFormat($this->internalFormat ?: $this->determineBestFormat());
}

$this->overwrite('');
}

private function setRealFormat(string $format): void
{

if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) {
$this->format = self::getFormatDefinition($format.'_nomax');
} elseif (null !== self::getFormatDefinition($format)) {
$this->format = self::getFormatDefinition($format);
} else {
$this->format = $format;
}
}




private function overwrite(string $message): void
{
if ($this->previousMessage === $message) {
return;
}

$originalMessage = $message;

if ($this->overwrite) {
if (null !== $this->previousMessage) {
if ($this->output instanceof ConsoleSectionOutput) {
$messageLines = explode("\n", $this->previousMessage);
$lineCount = \count($messageLines);

$lastLineWithoutDecoration = Helper::removeDecoration($this->output->getFormatter(), end($messageLines) ?? '');


if ('' === $lastLineWithoutDecoration) {
--$lineCount;
}

foreach ($messageLines as $messageLine) {
$messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine));
if ($messageLineLength > $this->terminal->getWidth()) {
$lineCount += floor($messageLineLength / $this->terminal->getWidth());
}
}

$this->output->clear($lineCount);
} else {
$lineCount = substr_count($this->previousMessage, "\n");
for ($i = 0; $i < $lineCount; ++$i) {
$this->cursor->moveToColumn(1);
$this->cursor->clearLine();
$this->cursor->moveUp();
}

$this->cursor->moveToColumn(1);
$this->cursor->clearLine();
}
}
} elseif ($this->step > 0) {
$message = \PHP_EOL.$message;
}

$this->previousMessage = $originalMessage;
$this->lastWriteTime = microtime(true);

$this->output->write($message);
++$this->writeCount;
}

private function determineBestFormat(): string
{
return match ($this->output->getVerbosity()) {

OutputInterface::VERBOSITY_VERBOSE => $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX,
OutputInterface::VERBOSITY_VERY_VERBOSE => $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX,
OutputInterface::VERBOSITY_DEBUG => $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX,
default => $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX,
};
}

private static function initPlaceholderFormatters(): array
{
return [
'bar' => function (self $bar, OutputInterface $output) {
$completeBars = $bar->getBarOffset();
$display = str_repeat($bar->getBarCharacter(), $completeBars);
if ($completeBars < $bar->getBarWidth()) {
$emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter()));
$display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars);
}

return $display;
},
'elapsed' => fn (self $bar) => Helper::formatTime(time() - $bar->getStartTime(), 2),
'remaining' => function (self $bar) {
if (!$bar->getMaxSteps()) {
throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.');
}

return Helper::formatTime($bar->getRemaining(), 2);
},
'estimated' => function (self $bar) {
if (!$bar->getMaxSteps()) {
throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.');
}

return Helper::formatTime($bar->getEstimated(), 2);
},
'memory' => fn (self $bar) => Helper::formatMemory(memory_get_usage(true)),
'current' => fn (self $bar) => str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT),
'max' => fn (self $bar) => $bar->getMaxSteps(),
'percent' => fn (self $bar) => floor($bar->getProgressPercent() * 100),
];
}

private static function initFormats(): array
{
return [
self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%',
self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]',

self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%',
self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',

self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%',
self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%',

self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%',
self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%',
];
}

private function buildLine(): string
{
\assert(null !== $this->format);

$regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i";
$callback = function ($matches) {
if ($formatter = $this->getPlaceholderFormatter($matches[1])) {
$text = $formatter($this, $this->output);
} elseif (isset($this->messages[$matches[1]])) {
$text = $this->messages[$matches[1]];
} else {
return $matches[0];
}

if (isset($matches[2])) {
$text = \sprintf('%'.$matches[2], $text);
}

return $text;
};
$line = preg_replace_callback($regex, $callback, $this->format);


$linesLength = array_map(fn ($subLine) => Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r"))), explode("\n", $line));

$linesWidth = max($linesLength);

$terminalWidth = $this->terminal->getWidth();
if ($linesWidth <= $terminalWidth) {
return $line;
}

$this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth);

return preg_replace_callback($regex, $callback, $this->format);
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\String\UnicodeString;






abstract class Helper implements HelperInterface
{
protected $helperSet;




public function setHelperSet(?HelperSet $helperSet = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->helperSet = $helperSet;
}

public function getHelperSet(): ?HelperSet
{
return $this->helperSet;
}





public static function width(?string $string): int
{
$string ??= '';

if (preg_match('//u', $string)) {
$string = preg_replace('/[\p{Cc}\x7F]++/u', '', $string, -1, $count);

return (new UnicodeString($string))->width(false) + $count;
}

if (false === $encoding = mb_detect_encoding($string, null, true)) {
return \strlen($string);
}

return mb_strwidth($string, $encoding);
}





public static function length(?string $string): int
{
$string ??= '';

if (preg_match('//u', $string)) {
return (new UnicodeString($string))->length();
}

if (false === $encoding = mb_detect_encoding($string, null, true)) {
return \strlen($string);
}

return mb_strlen($string, $encoding);
}




public static function substr(?string $string, int $from, ?int $length = null): string
{
$string ??= '';

if (preg_match('//u', $string)) {
return (new UnicodeString($string))->slice($from, $length);
}

if (false === $encoding = mb_detect_encoding($string, null, true)) {
return substr($string, $from, $length);
}

return mb_substr($string, $from, $length, $encoding);
}




public static function formatTime(int|float $secs, int $precision = 1)
{
$secs = (int) floor($secs);

if (0 === $secs) {
return '< 1 sec';
}

static $timeFormats = [
[1, '1 sec', 'secs'],
[60, '1 min', 'mins'],
[3600, '1 hr', 'hrs'],
[86400, '1 day', 'days'],
];

$times = [];
foreach ($timeFormats as $index => $format) {
$seconds = isset($timeFormats[$index + 1]) ? $secs % $timeFormats[$index + 1][0] : $secs;

if (isset($times[$index - $precision])) {
unset($times[$index - $precision]);
}

if (0 === $seconds) {
continue;
}

$unitCount = ($seconds / $format[0]);
$times[$index] = 1 === $unitCount ? $format[1] : $unitCount.' '.$format[2];

if ($secs === $seconds) {
break;
}

$secs -= $seconds;
}

return implode(', ', array_reverse($times));
}




public static function formatMemory(int $memory)
{
if ($memory >= 1024 * 1024 * 1024) {
return \sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024);
}

if ($memory >= 1024 * 1024) {
return \sprintf('%.1f MiB', $memory / 1024 / 1024);
}

if ($memory >= 1024) {
return \sprintf('%d KiB', $memory / 1024);
}

return \sprintf('%d B', $memory);
}




public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string)
{
$isDecorated = $formatter->isDecorated();
$formatter->setDecorated(false);

$string = $formatter->format($string ?? '');

$string = preg_replace("/\033\[[^m]*m/", '', $string ?? '');

$string = preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? '');
$formatter->setDecorated($isDecorated);

return $string;
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;










class Table
{
private const SEPARATOR_TOP = 0;
private const SEPARATOR_TOP_BOTTOM = 1;
private const SEPARATOR_MID = 2;
private const SEPARATOR_BOTTOM = 3;
private const BORDER_OUTSIDE = 0;
private const BORDER_INSIDE = 1;
private const DISPLAY_ORIENTATION_DEFAULT = 'default';
private const DISPLAY_ORIENTATION_HORIZONTAL = 'horizontal';
private const DISPLAY_ORIENTATION_VERTICAL = 'vertical';

private ?string $headerTitle = null;
private ?string $footerTitle = null;
private array $headers = [];
private array $rows = [];
private array $effectiveColumnWidths = [];
private int $numberOfColumns;
private OutputInterface $output;
private TableStyle $style;
private array $columnStyles = [];
private array $columnWidths = [];
private array $columnMaxWidths = [];
private bool $rendered = false;
private string $displayOrientation = self::DISPLAY_ORIENTATION_DEFAULT;

private static array $styles;

public function __construct(OutputInterface $output)
{
$this->output = $output;

self::$styles ??= self::initStyles();

$this->setStyle('default');
}






public static function setStyleDefinition(string $name, TableStyle $style)
{
self::$styles ??= self::initStyles();

self::$styles[$name] = $style;
}




public static function getStyleDefinition(string $name): TableStyle
{
self::$styles ??= self::initStyles();

return self::$styles[$name] ?? throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name));
}






public function setStyle(TableStyle|string $name): static
{
$this->style = $this->resolveStyle($name);

return $this;
}




public function getStyle(): TableStyle
{
return $this->style;
}








public function setColumnStyle(int $columnIndex, TableStyle|string $name): static
{
$this->columnStyles[$columnIndex] = $this->resolveStyle($name);

return $this;
}






public function getColumnStyle(int $columnIndex): TableStyle
{
return $this->columnStyles[$columnIndex] ?? $this->getStyle();
}






public function setColumnWidth(int $columnIndex, int $width): static
{
$this->columnWidths[$columnIndex] = $width;

return $this;
}






public function setColumnWidths(array $widths): static
{
$this->columnWidths = [];
foreach ($widths as $index => $width) {
$this->setColumnWidth($index, $width);
}

return $this;
}









public function setColumnMaxWidth(int $columnIndex, int $width): static
{
if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) {
throw new \LogicException(\sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, get_debug_type($this->output->getFormatter())));
}

$this->columnMaxWidths[$columnIndex] = $width;

return $this;
}




public function setHeaders(array $headers): static
{
$headers = array_values($headers);
if ($headers && !\is_array($headers[0])) {
$headers = [$headers];
}

$this->headers = $headers;

return $this;
}




public function setRows(array $rows)
{
$this->rows = [];

return $this->addRows($rows);
}




public function addRows(array $rows): static
{
foreach ($rows as $row) {
$this->addRow($row);
}

return $this;
}




public function addRow(TableSeparator|array $row): static
{
if ($row instanceof TableSeparator) {
$this->rows[] = $row;

return $this;
}

$this->rows[] = array_values($row);

return $this;
}






public function appendRow(TableSeparator|array $row): static
{
if (!$this->output instanceof ConsoleSectionOutput) {
throw new RuntimeException(\sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__));
}

if ($this->rendered) {
$this->output->clear($this->calculateRowCount());
}

$this->addRow($row);
$this->render();

return $this;
}




public function setRow(int|string $column, array $row): static
{
$this->rows[$column] = $row;

return $this;
}




public function setHeaderTitle(?string $title): static
{
$this->headerTitle = $title;

return $this;
}




public function setFooterTitle(?string $title): static
{
$this->footerTitle = $title;

return $this;
}




public function setHorizontal(bool $horizontal = true): static
{
$this->displayOrientation = $horizontal ? self::DISPLAY_ORIENTATION_HORIZONTAL : self::DISPLAY_ORIENTATION_DEFAULT;

return $this;
}




public function setVertical(bool $vertical = true): static
{
$this->displayOrientation = $vertical ? self::DISPLAY_ORIENTATION_VERTICAL : self::DISPLAY_ORIENTATION_DEFAULT;

return $this;
}
















public function render()
{
$divider = new TableSeparator();
$isCellWithColspan = static fn ($cell) => $cell instanceof TableCell && $cell->getColspan() >= 2;

$horizontal = self::DISPLAY_ORIENTATION_HORIZONTAL === $this->displayOrientation;
$vertical = self::DISPLAY_ORIENTATION_VERTICAL === $this->displayOrientation;

$rows = [];
if ($horizontal) {
foreach ($this->headers[0] ?? [] as $i => $header) {
$rows[$i] = [$header];
foreach ($this->rows as $row) {
if ($row instanceof TableSeparator) {
continue;
}
if (isset($row[$i])) {
$rows[$i][] = $row[$i];
} elseif ($isCellWithColspan($rows[$i][0])) {

} else {
$rows[$i][] = null;
}
}
}
} elseif ($vertical) {
$formatter = $this->output->getFormatter();
$maxHeaderLength = array_reduce($this->headers[0] ?? [], static fn ($max, $header) => max($max, Helper::width(Helper::removeDecoration($formatter, $header))), 0);

foreach ($this->rows as $row) {
if ($row instanceof TableSeparator) {
continue;
}

if ($rows) {
$rows[] = [$divider];
}

$containsColspan = false;
foreach ($row as $cell) {
if ($containsColspan = $isCellWithColspan($cell)) {
break;
}
}

$headers = $this->headers[0] ?? [];
$maxRows = max(\count($headers), \count($row));
for ($i = 0; $i < $maxRows; ++$i) {
$cell = (string) ($row[$i] ?? '');

$eol = str_contains($cell, "\r\n") ? "\r\n" : "\n";
$parts = explode($eol, $cell);
foreach ($parts as $idx => $part) {
if ($headers && !$containsColspan) {
if (0 === $idx) {
$rows[] = [\sprintf(
'<comment>%s%s</>: %s',
str_repeat(' ', $maxHeaderLength - Helper::width(Helper::removeDecoration($formatter, $headers[$i] ?? ''))),
$headers[$i] ?? '',
$part
)];
} else {
$rows[] = [\sprintf(
'%s  %s',
str_pad('', $maxHeaderLength, ' ', \STR_PAD_LEFT),
$part
)];
}
} elseif ('' !== $cell) {
$rows[] = [$part];
}
}
}
}
} else {
$rows = array_merge($this->headers, [$divider], $this->rows);
}

$this->calculateNumberOfColumns($rows);

$rowGroups = $this->buildTableRows($rows);
$this->calculateColumnsWidth($rowGroups);

$isHeader = !$horizontal;
$isFirstRow = $horizontal;
$hasTitle = (bool) $this->headerTitle;

foreach ($rowGroups as $rowGroup) {
$isHeaderSeparatorRendered = false;

foreach ($rowGroup as $row) {
if ($divider === $row) {
$isHeader = false;
$isFirstRow = true;

continue;
}

if ($row instanceof TableSeparator) {
$this->renderRowSeparator();

continue;
}

if (!$row) {
continue;
}

if ($isHeader && !$isHeaderSeparatorRendered) {
$this->renderRowSeparator(
self::SEPARATOR_TOP,
$hasTitle ? $this->headerTitle : null,
$hasTitle ? $this->style->getHeaderTitleFormat() : null
);
$hasTitle = false;
$isHeaderSeparatorRendered = true;
}

if ($isFirstRow) {
$this->renderRowSeparator(
$horizontal ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM,
$hasTitle ? $this->headerTitle : null,
$hasTitle ? $this->style->getHeaderTitleFormat() : null
);
$isFirstRow = false;
$hasTitle = false;
}

if ($vertical) {
$isHeader = false;
$isFirstRow = false;
}

if ($horizontal) {
$this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat());
} else {
$this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat());
}
}
}
$this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat());

$this->cleanup();
$this->rendered = true;
}








private function renderRowSeparator(int $type = self::SEPARATOR_MID, ?string $title = null, ?string $titleFormat = null): void
{
if (!$count = $this->numberOfColumns) {
return;
}

$borders = $this->style->getBorderChars();
if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) {
return;
}

$crossings = $this->style->getCrossingChars();
if (self::SEPARATOR_MID === $type) {
[$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]];
} elseif (self::SEPARATOR_TOP === $type) {
[$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]];
} elseif (self::SEPARATOR_TOP_BOTTOM === $type) {
[$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]];
} else {
[$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]];
}

$markup = $leftChar;
for ($column = 0; $column < $count; ++$column) {
$markup .= str_repeat($horizontal, $this->effectiveColumnWidths[$column]);
$markup .= $column === $count - 1 ? $rightChar : $midChar;
}

if (null !== $title) {
$titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = \sprintf($titleFormat, $title)));
$markupLength = Helper::width($markup);
if ($titleLength > $limit = $markupLength - 4) {
$titleLength = $limit;
$formatLength = Helper::width(Helper::removeDecoration($formatter, \sprintf($titleFormat, '')));
$formattedTitle = \sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3).'...');
}

$titleStart = intdiv($markupLength - $titleLength, 2);
if (false === mb_detect_encoding($markup, null, true)) {
$markup = substr_replace($markup, $formattedTitle, $titleStart, $titleLength);
} else {
$markup = mb_substr($markup, 0, $titleStart).$formattedTitle.mb_substr($markup, $titleStart + $titleLength);
}
}

$this->output->writeln(\sprintf($this->style->getBorderFormat(), $markup));
}




private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string
{
$borders = $this->style->getBorderChars();

return \sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]);
}








private function renderRow(array $row, string $cellFormat, ?string $firstCellFormat = null): void
{
$rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE);
$columns = $this->getRowColumns($row);
$last = \count($columns) - 1;
foreach ($columns as $i => $column) {
if ($firstCellFormat && 0 === $i) {
$rowContent .= $this->renderCell($row, $column, $firstCellFormat);
} else {
$rowContent .= $this->renderCell($row, $column, $cellFormat);
}
$rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE);
}
$this->output->writeln($rowContent);
}




private function renderCell(array $row, int $column, string $cellFormat): string
{
$cell = $row[$column] ?? '';
$width = $this->effectiveColumnWidths[$column];
if ($cell instanceof TableCell && $cell->getColspan() > 1) {

foreach (range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) {
$width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn];
}
}


$width += \strlen($cell) - Helper::width($cell) - substr_count($cell, "\0");
$style = $this->getColumnStyle($column);

if ($cell instanceof TableSeparator) {
return \sprintf($style->getBorderFormat(), str_repeat($style->getBorderChars()[2], $width));
}

$width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell));
$content = \sprintf($style->getCellRowContentFormat(), $cell);

$padType = $style->getPadType();
if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) {
$isNotStyledByTag = !preg_match('/^<(\w+|(\w+=[\w,]+;?)*)>.+<\/(\w+|(\w+=\w+;?)*)?>$/', $cell);
if ($isNotStyledByTag) {
$cellFormat = $cell->getStyle()->getCellFormat();
if (!\is_string($cellFormat)) {
$tag = http_build_query($cell->getStyle()->getTagOptions(), '', ';');
$cellFormat = '<'.$tag.'>%s</>';
}

if (str_contains($content, '</>')) {
$content = str_replace('</>', '', $content);
$width -= 3;
}
if (str_contains($content, '<fg=default;bg=default>')) {
$content = str_replace('<fg=default;bg=default>', '', $content);
$width -= \strlen('<fg=default;bg=default>');
}
}

$padType = $cell->getStyle()->getPadByAlign();
}

return \sprintf($cellFormat, str_pad($content, $width, $style->getPaddingChar(), $padType));
}




private function calculateNumberOfColumns(array $rows): void
{
$columns = [0];
foreach ($rows as $row) {
if ($row instanceof TableSeparator) {
continue;
}

$columns[] = $this->getNumberOfColumns($row);
}

$this->numberOfColumns = max($columns);
}

private function buildTableRows(array $rows): TableRows
{

$formatter = $this->output->getFormatter();
$unmergedRows = [];
for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) {
$rows = $this->fillNextRows($rows, $rowKey);


foreach ($rows[$rowKey] as $column => $cell) {
$colspan = $cell instanceof TableCell ? $cell->getColspan() : 1;

$minWrappedWidth = 0;
$widthApplied = [];
$lengthColumnBorder = $this->getColumnSeparatorWidth() + Helper::width($this->style->getCellRowContentFormat()) - 2;
for ($i = $column; $i < ($column + $colspan); ++$i) {
if (isset($this->columnMaxWidths[$i])) {
$minWrappedWidth += $this->columnMaxWidths[$i];
$widthApplied[] = ['type' => 'max', 'column' => $i];
} elseif (($this->columnWidths[$i] ?? 0) > 0 && $colspan > 1) {
$minWrappedWidth += $this->columnWidths[$i];
$widthApplied[] = ['type' => 'min', 'column' => $i];
}
}
if (1 === \count($widthApplied)) {
if ($colspan > 1) {
$minWrappedWidth *= $colspan; 
}
} elseif (\count($widthApplied) > 1) {
$minWrappedWidth += (\count($widthApplied) - 1) * $lengthColumnBorder;
}

$cellWidth = Helper::width(Helper::removeDecoration($formatter, $cell));
if ($minWrappedWidth && $cellWidth > $minWrappedWidth) {
$cell = $formatter->formatAndWrap($cell, $minWrappedWidth);
}

if ($colspan > 1 && $minWrappedWidth > 0) {
$columnsMinWidthProcessed = [];
$cellWidth = min($cellWidth, $minWrappedWidth);
foreach ($widthApplied as $item) {
if ('max' === $item['type'] && $cellWidth >= $this->columnMaxWidths[$item['column']]) {
$minWidthColumn = $this->columnMaxWidths[$item['column']];
$this->columnWidths[$item['column']] = $minWidthColumn;
$columnsMinWidthProcessed[$item['column']] = true;
$cellWidth -= $minWidthColumn + $lengthColumnBorder;
}
}
for ($i = $column; $i < ($column + $colspan); ++$i) {
if (isset($columnsMinWidthProcessed[$i])) {
continue;
}
$this->columnWidths[$i] = $cellWidth + $lengthColumnBorder;
}
}
if (!str_contains($cell ?? '', "\n")) {
continue;
}
$eol = str_contains($cell ?? '', "\r\n") ? "\r\n" : "\n";
$escaped = implode($eol, array_map(OutputFormatter::escapeTrailingBackslash(...), explode($eol, $cell)));
$cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped;
$lines = explode($eol, str_replace($eol, '<fg=default;bg=default></>'.$eol, $cell));
foreach ($lines as $lineKey => $line) {
if ($colspan > 1) {
$line = new TableCell($line, ['colspan' => $colspan]);
}
if (0 === $lineKey) {
$rows[$rowKey][$column] = $line;
} else {
if (!\array_key_exists($rowKey, $unmergedRows) || !\array_key_exists($lineKey, $unmergedRows[$rowKey])) {
$unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey);
}
$unmergedRows[$rowKey][$lineKey][$column] = $line;
}
}
}
}

return new TableRows(function () use ($rows, $unmergedRows): \Traversable {
foreach ($rows as $rowKey => $row) {
$rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)];

if (isset($unmergedRows[$rowKey])) {
foreach ($unmergedRows[$rowKey] as $row) {
$rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row);
}
}
yield $rowGroup;
}
});
}

private function calculateRowCount(): int
{
$numberOfRows = \count(iterator_to_array($this->buildTableRows(array_merge($this->headers, [new TableSeparator()], $this->rows))));

if ($this->headers) {
++$numberOfRows; 
}

if ($this->rows) {
++$numberOfRows; 
}

return $numberOfRows;
}






private function fillNextRows(array $rows, int $line): array
{
$unmergedRows = [];
foreach ($rows[$line] as $column => $cell) {
if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !$cell instanceof \Stringable) {
throw new InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', get_debug_type($cell)));
}
if ($cell instanceof TableCell && $cell->getRowspan() > 1) {
$nbLines = $cell->getRowspan() - 1;
$lines = [$cell];
if (str_contains($cell, "\n")) {
$eol = str_contains($cell, "\r\n") ? "\r\n" : "\n";
$lines = explode($eol, str_replace($eol, '<fg=default;bg=default>'.$eol.'</>', $cell));
$nbLines = \count($lines) > $nbLines ? substr_count($cell, $eol) : $nbLines;

$rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);
unset($lines[0]);
}


$unmergedRows = array_replace_recursive(array_fill($line + 1, $nbLines, []), $unmergedRows);
foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {
$value = $lines[$unmergedRowKey - $line] ?? '';
$unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]);
if ($nbLines === $unmergedRowKey - $line) {
break;
}
}
}
}

foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) {

if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && ($this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns)) {
foreach ($unmergedRow as $cellKey => $cell) {

array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]);
}
} else {
$row = $this->copyRow($rows, $unmergedRowKey - 1);
foreach ($unmergedRow as $column => $cell) {
if (!empty($cell)) {
$row[$column] = $unmergedRow[$column];
}
}
array_splice($rows, $unmergedRowKey, 0, [$row]);
}
}

return $rows;
}




private function fillCells(iterable $row): iterable
{
$newRow = [];

foreach ($row as $column => $cell) {
$newRow[] = $cell;
if ($cell instanceof TableCell && $cell->getColspan() > 1) {
foreach (range($column + 1, $column + $cell->getColspan() - 1) as $position) {

$newRow[] = '';
}
}
}

return $newRow ?: $row;
}

private function copyRow(array $rows, int $line): array
{
$row = $rows[$line];
foreach ($row as $cellKey => $cellValue) {
$row[$cellKey] = '';
if ($cellValue instanceof TableCell) {
$row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]);
}
}

return $row;
}




private function getNumberOfColumns(array $row): int
{
$columns = \count($row);
foreach ($row as $column) {
$columns += $column instanceof TableCell ? ($column->getColspan() - 1) : 0;
}

return $columns;
}




private function getRowColumns(array $row): array
{
$columns = range(0, $this->numberOfColumns - 1);
foreach ($row as $cellKey => $cell) {
if ($cell instanceof TableCell && $cell->getColspan() > 1) {

$columns = array_diff($columns, range($cellKey + 1, $cellKey + $cell->getColspan() - 1));
}
}

return $columns;
}




private function calculateColumnsWidth(iterable $groups): void
{
for ($column = 0; $column < $this->numberOfColumns; ++$column) {
$lengths = [];
foreach ($groups as $group) {
foreach ($group as $row) {
if ($row instanceof TableSeparator) {
continue;
}

foreach ($row as $i => $cell) {
if ($cell instanceof TableCell) {
$textContent = Helper::removeDecoration($this->output->getFormatter(), $cell);
$textLength = Helper::width($textContent);
if ($textLength > 0) {
$contentColumns = mb_str_split($textContent, ceil($textLength / $cell->getColspan()));
foreach ($contentColumns as $position => $content) {
$row[$i + $position] = $content;
}
}
}
}

$lengths[] = $this->getCellWidth($row, $column);
}
}

$this->effectiveColumnWidths[$column] = max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2;
}
}

private function getColumnSeparatorWidth(): int
{
return Helper::width(\sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3]));
}

private function getCellWidth(array $row, int $column): int
{
$cellWidth = 0;

if (isset($row[$column])) {
$cell = $row[$column];
$cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell));
}

$columnWidth = $this->columnWidths[$column] ?? 0;
$cellWidth = max($cellWidth, $columnWidth);

return isset($this->columnMaxWidths[$column]) ? min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth;
}




private function cleanup(): void
{
$this->effectiveColumnWidths = [];
unset($this->numberOfColumns);
}




private static function initStyles(): array
{
$borderless = new TableStyle();
$borderless
->setHorizontalBorderChars('=')
->setVerticalBorderChars(' ')
->setDefaultCrossingChar(' ')
;

$compact = new TableStyle();
$compact
->setHorizontalBorderChars('')
->setVerticalBorderChars('')
->setDefaultCrossingChar('')
->setCellRowContentFormat('%s ')
;

$styleGuide = new TableStyle();
$styleGuide
->setHorizontalBorderChars('-')
->setVerticalBorderChars(' ')
->setDefaultCrossingChar(' ')
->setCellHeaderFormat('%s')
;

$box = (new TableStyle())
->setHorizontalBorderChars('─')
->setVerticalBorderChars('│')
->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├')
;

$boxDouble = (new TableStyle())
->setHorizontalBorderChars('═', '─')
->setVerticalBorderChars('║', '│')
->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣')
;

return [
'default' => new TableStyle(),
'borderless' => $borderless,
'compact' => $compact,
'symfony-style-guide' => $styleGuide,
'box' => $box,
'box-double' => $boxDouble,
];
}

private function resolveStyle(TableStyle|string $name): TableStyle
{
if ($name instanceof TableStyle) {
return $name;
}

return self::$styles[$name] ?? throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name));
}
}
<?php










namespace Symfony\Component\Console\Helper;
































final class OutputWrapper
{
private const TAG_OPEN_REGEX_SEGMENT = '[a-z](?:[^\\\\<>]*+ | \\\\.)*';
private const TAG_CLOSE_REGEX_SEGMENT = '[a-z][^<>]*+';
private const URL_PATTERN = 'https?://\S+';

public function __construct(
private bool $allowCutUrls = false,
) {
}

public function wrap(string $text, int $width, string $break = "\n"): string
{
if (!$width) {
return $text;
}

$tagPattern = \sprintf('<(?:(?:%s)|/(?:%s)?)>', self::TAG_OPEN_REGEX_SEGMENT, self::TAG_CLOSE_REGEX_SEGMENT);
$limitPattern = "{1,$width}";
$patternBlocks = [$tagPattern];
if (!$this->allowCutUrls) {
$patternBlocks[] = self::URL_PATTERN;
}
$patternBlocks[] = '.';
$blocks = implode('|', $patternBlocks);
$rowPattern = "(?:$blocks)$limitPattern";
$pattern = \sprintf('#(?:((?>(%1$s)((?<=[^\S\r\n])[^\S\r\n]?|(?=\r?\n)|$|[^\S\r\n]))|(%1$s))(?:\r?\n)?|(?:\r?\n|$))#imux', $rowPattern);
$output = rtrim(preg_replace($pattern, '\\1'.$break, $text), $break);

return str_replace(' '.$break, $break, $output);
}
}
<?php










namespace Symfony\Component\Console\Helper;






class TableSeparator extends TableCell
{
public function __construct(array $options = [])
{
parent::__construct('', $options);
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;




final class Dumper
{
private OutputInterface $output;
private ?CliDumper $dumper;
private ?ClonerInterface $cloner;
private \Closure $handler;

public function __construct(OutputInterface $output, ?CliDumper $dumper = null, ?ClonerInterface $cloner = null)
{
$this->output = $output;
$this->dumper = $dumper;
$this->cloner = $cloner;

if (class_exists(CliDumper::class)) {
$this->handler = function ($var): string {
$dumper = $this->dumper ??= new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR);
$dumper->setColors($this->output->isDecorated());

return rtrim($dumper->dump(($this->cloner ??= new VarCloner())->cloneVar($var)->withRefHandles(false), true));
};
} else {
$this->handler = fn ($var): string => match (true) {
null === $var => 'null',
true === $var => 'true',
false === $var => 'false',
\is_string($var) => '"'.$var.'"',
default => rtrim(print_r($var, true)),
};
}
}

public function __invoke(mixed $var): string
{
return ($this->handler)($var);
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;

/**
@implements




*/
class HelperSet implements \IteratorAggregate
{

private array $helpers = [];




public function __construct(array $helpers = [])
{
foreach ($helpers as $alias => $helper) {
$this->set($helper, \is_int($alias) ? null : $alias);
}
}




public function set(HelperInterface $helper, ?string $alias = null)
{
$this->helpers[$helper->getName()] = $helper;
if (null !== $alias) {
$this->helpers[$alias] = $helper;
}

$helper->setHelperSet($this);
}




public function has(string $name): bool
{
return isset($this->helpers[$name]);
}






public function get(string $name): HelperInterface
{
if (!$this->has($name)) {
throw new InvalidArgumentException(\sprintf('The helper "%s" is not defined.', $name));
}

return $this->helpers[$name];
}

public function getIterator(): \Traversable
{
return new \ArrayIterator($this->helpers);
}
}
<?php










namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Exception\InvalidArgumentException;




class TableCellStyle
{
public const DEFAULT_ALIGN = 'left';

private const TAG_OPTIONS = [
'fg',
'bg',
'options',
];

private const ALIGN_MAP = [
'left' => \STR_PAD_RIGHT,
'center' => \STR_PAD_BOTH,
'right' => \STR_PAD_LEFT,
];

private array $options = [
'fg' => 'default',
'bg' => 'default',
'options' => null,
'align' => self::DEFAULT_ALIGN,
'cellFormat' => null,
];

public function __construct(array $options = [])
{
if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
throw new InvalidArgumentException(\sprintf('The TableCellStyle does not support the following options: \'%s\'.', implode('\', \'', $diff)));
}

if (isset($options['align']) && !\array_key_exists($options['align'], self::ALIGN_MAP)) {
throw new InvalidArgumentException(\sprintf('Wrong align value. Value must be following: \'%s\'.', implode('\', \'', array_keys(self::ALIGN_MAP))));
}

$this->options = array_merge($this->options, $options);
}

public function getOptions(): array
{
return $this->options;
}






public function getTagOptions(): array
{
return array_filter(
$this->getOptions(),
fn ($key) => \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]),
\ARRAY_FILTER_USE_KEY
);
}

public function getPadByAlign(): int
{
return self::ALIGN_MAP[$this->getOptions()['align']];
}

public function getCellFormat(): ?string
{
return $this->getOptions()['cellFormat'];
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;






interface OutputInterface
{
public const VERBOSITY_QUIET = 16;
public const VERBOSITY_NORMAL = 32;
public const VERBOSITY_VERBOSE = 64;
public const VERBOSITY_VERY_VERBOSE = 128;
public const VERBOSITY_DEBUG = 256;

public const OUTPUT_NORMAL = 1;
public const OUTPUT_RAW = 2;
public const OUTPUT_PLAIN = 4;










public function write(string|iterable $messages, bool $newline = false, int $options = 0);









public function writeln(string|iterable $messages, int $options = 0);








public function setVerbosity(int $level);






public function getVerbosity(): int;




public function isQuiet(): bool;




public function isVerbose(): bool;




public function isVeryVerbose(): bool;




public function isDebug(): bool;






public function setDecorated(bool $decorated);




public function isDecorated(): bool;




public function setFormatter(OutputFormatterInterface $formatter);




public function getFormatter(): OutputFormatterInterface;
}
<?php










namespace Symfony\Component\Console\Output;







interface ConsoleOutputInterface extends OutputInterface
{



public function getErrorOutput(): OutputInterface;




public function setErrorOutput(OutputInterface $error);

public function section(): ConsoleSectionOutput;
}
<?php










namespace Symfony\Component\Console\Output;




class BufferedOutput extends Output
{
private string $buffer = '';




public function fetch(): string
{
$content = $this->buffer;
$this->buffer = '';

return $content;
}




protected function doWrite(string $message, bool $newline)
{
$this->buffer .= $message;

if ($newline) {
$this->buffer .= \PHP_EOL;
}
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;















class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
{
private OutputInterface $stderr;
private array $consoleSectionOutputs = [];






public function __construct(int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null)
{
parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);

if (null === $formatter) {

$this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated);

return;
}

$actualDecorated = $this->isDecorated();
$this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());

if (null === $decorated) {
$this->setDecorated($actualDecorated && $this->stderr->isDecorated());
}
}




public function section(): ConsoleSectionOutput
{
return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter());
}




public function setDecorated(bool $decorated)
{
parent::setDecorated($decorated);
$this->stderr->setDecorated($decorated);
}




public function setFormatter(OutputFormatterInterface $formatter)
{
parent::setFormatter($formatter);
$this->stderr->setFormatter($formatter);
}




public function setVerbosity(int $level)
{
parent::setVerbosity($level);
$this->stderr->setVerbosity($level);
}

public function getErrorOutput(): OutputInterface
{
return $this->stderr;
}




public function setErrorOutput(OutputInterface $error)
{
$this->stderr = $error;
}





protected function hasStdoutSupport(): bool
{
return false === $this->isRunningOS400();
}





protected function hasStderrSupport(): bool
{
return false === $this->isRunningOS400();
}





private function isRunningOS400(): bool
{
$checks = [
\function_exists('php_uname') ? php_uname('s') : '',
getenv('OSTYPE'),
\PHP_OS,
];

return false !== stripos(implode(';', $checks), 'OS400');
}




private function openOutputStream()
{
if (!$this->hasStdoutSupport()) {
return fopen('php://output', 'w');
}


return \defined('STDOUT') ? \STDOUT : (@fopen('php://stdout', 'w') ?: fopen('php://output', 'w'));
}




private function openErrorStream()
{
if (!$this->hasStderrSupport()) {
return fopen('php://output', 'w');
}


return \defined('STDERR') ? \STDERR : (@fopen('php://stderr', 'w') ?: fopen('php://output', 'w'));
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Terminal;





class ConsoleSectionOutput extends StreamOutput
{
private array $content = [];
private int $lines = 0;
private array $sections;
private Terminal $terminal;
private int $maxHeight = 0;





public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter)
{
parent::__construct($stream, $verbosity, $decorated, $formatter);
array_unshift($sections, $this);
$this->sections = &$sections;
$this->terminal = new Terminal();
}







public function setMaxHeight(int $maxHeight): void
{

$previousMaxHeight = $this->maxHeight;
$this->maxHeight = $maxHeight;
$existingContent = $this->popStreamContentUntilCurrentSection($previousMaxHeight ? min($previousMaxHeight, $this->lines) : $this->lines);

parent::doWrite($this->getVisibleContent(), false);
parent::doWrite($existingContent, false);
}








public function clear(?int $lines = null)
{
if (empty($this->content) || !$this->isDecorated()) {
return;
}

if ($lines) {
array_splice($this->content, -$lines);
} else {
$lines = $this->lines;
$this->content = [];
}

$this->lines -= $lines;

parent::doWrite($this->popStreamContentUntilCurrentSection($this->maxHeight ? min($this->maxHeight, $lines) : $lines), false);
}






public function overwrite(string|iterable $message)
{
$this->clear();
$this->writeln($message);
}

public function getContent(): string
{
return implode('', $this->content);
}

public function getVisibleContent(): string
{
if (0 === $this->maxHeight) {
return $this->getContent();
}

return implode('', \array_slice($this->content, -$this->maxHeight));
}




public function addContent(string $input, bool $newline = true): int
{
$width = $this->terminal->getWidth();
$lines = explode(\PHP_EOL, $input);
$linesAdded = 0;
$count = \count($lines) - 1;
foreach ($lines as $i => $lineContent) {



if ($i < $count || $newline) {
$lineContent .= \PHP_EOL;
}


if ('' === $lineContent) {
continue;
}



if (0 === $i
&& (false !== $lastLine = end($this->content))
&& !str_ends_with($lastLine, \PHP_EOL)
) {

$this->lines -= (int) ceil($this->getDisplayLength($lastLine) / $width) ?: 1;

$lineContent = $lastLine.$lineContent;

array_splice($this->content, -1, 1, $lineContent);
} else {

$this->content[] = $lineContent;
}

$linesAdded += (int) ceil($this->getDisplayLength($lineContent) / $width) ?: 1;
}

$this->lines += $linesAdded;

return $linesAdded;
}




public function addNewLineOfInputSubmit(): void
{
$this->content[] = \PHP_EOL;
++$this->lines;
}




protected function doWrite(string $message, bool $newline)
{

if (!$newline && str_ends_with($message, \PHP_EOL)) {
$message = substr($message, 0, -\strlen(\PHP_EOL));
$newline = true;
}

if (!$this->isDecorated()) {
parent::doWrite($message, $newline);

return;
}



$linesToClear = $deleteLastLine = ($lastLine = end($this->content) ?: '') && !str_ends_with($lastLine, \PHP_EOL) ? 1 : 0;

$linesAdded = $this->addContent($message, $newline);

if ($lineOverflow = $this->maxHeight > 0 && $this->lines > $this->maxHeight) {

$linesToClear = $this->maxHeight;
}

$erasedContent = $this->popStreamContentUntilCurrentSection($linesToClear);

if ($lineOverflow) {

$previousLinesOfSection = \array_slice($this->content, $this->lines - $this->maxHeight, $this->maxHeight - $linesAdded);
parent::doWrite(implode('', $previousLinesOfSection), false);
}



parent::doWrite($deleteLastLine ? $lastLine.$message : $message, true);
parent::doWrite($erasedContent, false);
}





private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0): string
{
$numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection;
$erasedContent = [];

foreach ($this->sections as $section) {
if ($section === $this) {
break;
}

$numberOfLinesToClear += $section->maxHeight ? min($section->lines, $section->maxHeight) : $section->lines;
if ('' !== $sectionContent = $section->getVisibleContent()) {
if (!str_ends_with($sectionContent, \PHP_EOL)) {
$sectionContent .= \PHP_EOL;
}
$erasedContent[] = $sectionContent;
}
}

if ($numberOfLinesToClear > 0) {

parent::doWrite(\sprintf("\x1b[%dA", $numberOfLinesToClear), false);

parent::doWrite("\x1b[0J", false);
}

return implode('', array_reverse($erasedContent));
}

private function getDisplayLength(string $text): int
{
return Helper::width(Helper::removeDecoration($this->getFormatter(), str_replace("\t", '        ', $text)));
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;














abstract class Output implements OutputInterface
{
private int $verbosity;
private OutputFormatterInterface $formatter;






public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, ?OutputFormatterInterface $formatter = null)
{
$this->verbosity = $verbosity ?? self::VERBOSITY_NORMAL;
$this->formatter = $formatter ?? new OutputFormatter();
$this->formatter->setDecorated($decorated);
}




public function setFormatter(OutputFormatterInterface $formatter)
{
$this->formatter = $formatter;
}

public function getFormatter(): OutputFormatterInterface
{
return $this->formatter;
}




public function setDecorated(bool $decorated)
{
$this->formatter->setDecorated($decorated);
}

public function isDecorated(): bool
{
return $this->formatter->isDecorated();
}




public function setVerbosity(int $level)
{
$this->verbosity = $level;
}

public function getVerbosity(): int
{
return $this->verbosity;
}

public function isQuiet(): bool
{
return self::VERBOSITY_QUIET === $this->verbosity;
}

public function isVerbose(): bool
{
return self::VERBOSITY_VERBOSE <= $this->verbosity;
}

public function isVeryVerbose(): bool
{
return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
}

public function isDebug(): bool
{
return self::VERBOSITY_DEBUG <= $this->verbosity;
}




public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL)
{
$this->write($messages, true, $options);
}




public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL)
{
if (!is_iterable($messages)) {
$messages = [$messages];
}

$types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN;
$type = $types & $options ?: self::OUTPUT_NORMAL;

$verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG;
$verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL;

if ($verbosity > $this->getVerbosity()) {
return;
}

foreach ($messages as $message) {
switch ($type) {
case OutputInterface::OUTPUT_NORMAL:
$message = $this->formatter->format($message);
break;
case OutputInterface::OUTPUT_RAW:
break;
case OutputInterface::OUTPUT_PLAIN:
$message = strip_tags($this->formatter->format($message));
break;
}

$this->doWrite($message ?? '', $newline);
}
}






abstract protected function doWrite(string $message, bool $newline);
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Exception\InvalidArgumentException;





enum AnsiColorMode
{




case Ansi4;






case Ansi8;






case Ansi24;




public function convertFromHexToAnsiColorCode(string $hexColor): string
{
$hexColor = str_replace('#', '', $hexColor);

if (3 === \strlen($hexColor)) {
$hexColor = $hexColor[0].$hexColor[0].$hexColor[1].$hexColor[1].$hexColor[2].$hexColor[2];
}

if (6 !== \strlen($hexColor)) {
throw new InvalidArgumentException(\sprintf('Invalid "#%s" color.', $hexColor));
}

$color = hexdec($hexColor);

$r = ($color >> 16) & 255;
$g = ($color >> 8) & 255;
$b = $color & 255;

return match ($this) {
self::Ansi4 => (string) $this->convertFromRGB($r, $g, $b),
self::Ansi8 => '8;5;'.((string) $this->convertFromRGB($r, $g, $b)),
self::Ansi24 => \sprintf('8;2;%d;%d;%d', $r, $g, $b),
};
}

private function convertFromRGB(int $r, int $g, int $b): int
{
return match ($this) {
self::Ansi4 => $this->degradeHexColorToAnsi4($r, $g, $b),
self::Ansi8 => $this->degradeHexColorToAnsi8($r, $g, $b),
default => throw new InvalidArgumentException("RGB cannot be converted to {$this->name}."),
};
}

private function degradeHexColorToAnsi4(int $r, int $g, int $b): int
{
return round($b / 255) << 2 | (round($g / 255) << 1) | round($r / 255);
}




private function degradeHexColorToAnsi8(int $r, int $g, int $b): int
{
if ($r === $g && $g === $b) {
if ($r < 8) {
return 16;
}

if ($r > 248) {
return 231;
}

return (int) round(($r - 8) / 247 * 24) + 232;
} else {
return 16 +
(36 * (int) round($r / 255 * 5)) +
(6 * (int) round($g / 255 * 5)) +
(int) round($b / 255 * 5);
}
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;






class TrimmedBufferOutput extends Output
{
private int $maxLength;
private string $buffer = '';

public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = false, ?OutputFormatterInterface $formatter = null)
{
if ($maxLength <= 0) {
throw new InvalidArgumentException(\sprintf('"%s()" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength));
}

parent::__construct($verbosity, $decorated, $formatter);
$this->maxLength = $maxLength;
}




public function fetch(): string
{
$content = $this->buffer;
$this->buffer = '';

return $content;
}




protected function doWrite(string $message, bool $newline)
{
$this->buffer .= $message;

if ($newline) {
$this->buffer .= \PHP_EOL;
}

$this->buffer = substr($this->buffer, 0 - $this->maxLength);
}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\NullOutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;









class NullOutput implements OutputInterface
{
private NullOutputFormatter $formatter;




public function setFormatter(OutputFormatterInterface $formatter)
{

}

public function getFormatter(): OutputFormatterInterface
{

return $this->formatter ??= new NullOutputFormatter();
}




public function setDecorated(bool $decorated)
{

}

public function isDecorated(): bool
{
return false;
}




public function setVerbosity(int $level)
{

}

public function getVerbosity(): int
{
return self::VERBOSITY_QUIET;
}

public function isQuiet(): bool
{
return true;
}

public function isVerbose(): bool
{
return false;
}

public function isVeryVerbose(): bool
{
return false;
}

public function isDebug(): bool
{
return false;
}




public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL)
{

}




public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL)
{

}
}
<?php










namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;














class StreamOutput extends Output
{

private $stream;









public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null)
{
if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) {
throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
}

$this->stream = $stream;

$decorated ??= $this->hasColorSupport();

parent::__construct($verbosity, $decorated, $formatter);
}






public function getStream()
{
return $this->stream;
}




protected function doWrite(string $message, bool $newline)
{
if ($newline) {
$message .= \PHP_EOL;
}

@fwrite($this->stream, $message);

fflush($this->stream);
}














protected function hasColorSupport(): bool
{

if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) {
return false;
}



if (!@stream_isatty($this->stream) && !\in_array(strtoupper((string) getenv('MSYSTEM')), ['MINGW32', 'MINGW64'], true)) {
return false;
}

if ('\\' === \DIRECTORY_SEPARATOR && @sapi_windows_vt100_support($this->stream)) {
return true;
}

if ('Hyper' === getenv('TERM_PROGRAM')
|| false !== getenv('COLORTERM')
|| false !== getenv('ANSICON')
|| 'ON' === getenv('ConEmuANSI')
) {
return true;
}

if ('dumb' === $term = (string) getenv('TERM')) {
return false;
}


return preg_match('/^((screen|xterm|vt100|vt220|putty|rxvt|ansi|cygwin|linux).*)|(.*-256(color)?(-bce)?)$/', $term);
}
}
<?php










namespace Symfony\Component\Console\CommandLoader;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;






class FactoryCommandLoader implements CommandLoaderInterface
{
private array $factories;




public function __construct(array $factories)
{
$this->factories = $factories;
}

public function has(string $name): bool
{
return isset($this->factories[$name]);
}

public function get(string $name): Command
{
if (!isset($this->factories[$name])) {
throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name));
}

$factory = $this->factories[$name];

return $factory();
}

public function getNames(): array
{
return array_keys($this->factories);
}
}
<?php










namespace Symfony\Component\Console\CommandLoader;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;




interface CommandLoaderInterface
{





public function get(string $name): Command;




public function has(string $name): bool;




public function getNames(): array;
}
<?php










namespace Symfony\Component\Console\CommandLoader;

use Psr\Container\ContainerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;






class ContainerCommandLoader implements CommandLoaderInterface
{
private ContainerInterface $container;
private array $commandMap;




public function __construct(ContainerInterface $container, array $commandMap)
{
$this->container = $container;
$this->commandMap = $commandMap;
}

public function get(string $name): Command
{
if (!$this->has($name)) {
throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name));
}

return $this->container->get($this->commandMap[$name]);
}

public function has(string $name): bool
{
return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]);
}

public function getNames(): array
{
return array_keys($this->commandMap);
}
}
<?php










namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;







class CommandTester
{
use TesterTrait;

private Command $command;

public function __construct(Command $command)
{
$this->command = $command;
}
















public function execute(array $input, array $options = []): int
{


if (!isset($input['command'])
&& (null !== $application = $this->command->getApplication())
&& $application->getDefinition()->hasArgument('command')
) {
$input = array_merge(['command' => $this->command->getName()], $input);
}

$this->input = new ArrayInput($input);

$this->input->setStream(self::createStream($this->inputs));

if (isset($options['interactive'])) {
$this->input->setInteractive($options['interactive']);
}

if (!isset($options['decorated'])) {
$options['decorated'] = false;
}

$this->initOutput($options);

return $this->statusCode = $this->command->run($this->input, $this->output);
}
}
<?php










namespace Symfony\Component\Console\Tester;

use PHPUnit\Framework\Assert;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful;




trait TesterTrait
{
private StreamOutput $output;
private array $inputs = [];
private bool $captureStreamsIndependently = false;
private InputInterface $input;
private int $statusCode;






public function getDisplay(bool $normalize = false): string
{
if (!isset($this->output)) {
throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?');
}

rewind($this->output->getStream());

$display = stream_get_contents($this->output->getStream());

if ($normalize) {
$display = str_replace(\PHP_EOL, "\n", $display);
}

return $display;
}






public function getErrorOutput(bool $normalize = false): string
{
if (!$this->captureStreamsIndependently) {
throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.');
}

rewind($this->output->getErrorOutput()->getStream());

$display = stream_get_contents($this->output->getErrorOutput()->getStream());

if ($normalize) {
$display = str_replace(\PHP_EOL, "\n", $display);
}

return $display;
}




public function getInput(): InputInterface
{
return $this->input;
}




public function getOutput(): OutputInterface
{
return $this->output;
}






public function getStatusCode(): int
{
return $this->statusCode ?? throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?');
}

public function assertCommandIsSuccessful(string $message = ''): void
{
Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message);
}









public function setInputs(array $inputs): static
{
$this->inputs = $inputs;

return $this;
}










private function initOutput(array $options): void
{
$this->captureStreamsIndependently = $options['capture_stderr_separately'] ?? false;
if (!$this->captureStreamsIndependently) {
$this->output = new StreamOutput(fopen('php://memory', 'w', false));
if (isset($options['decorated'])) {
$this->output->setDecorated($options['decorated']);
}
if (isset($options['verbosity'])) {
$this->output->setVerbosity($options['verbosity']);
}
} else {
$this->output = new ConsoleOutput(
$options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL,
$options['decorated'] ?? null
);

$errorOutput = new StreamOutput(fopen('php://memory', 'w', false));
$errorOutput->setFormatter($this->output->getFormatter());
$errorOutput->setVerbosity($this->output->getVerbosity());
$errorOutput->setDecorated($this->output->isDecorated());

$reflectedOutput = new \ReflectionObject($this->output);
$strErrProperty = $reflectedOutput->getProperty('stderr');
$strErrProperty->setValue($this->output, $errorOutput);

$reflectedParent = $reflectedOutput->getParentClass();
$streamProperty = $reflectedParent->getProperty('stream');
$streamProperty->setValue($this->output, fopen('php://memory', 'w', false));
}
}




private static function createStream(array $inputs)
{
$stream = fopen('php://memory', 'r+', false);

foreach ($inputs as $input) {
fwrite($stream, $input);

if (!str_ends_with($input, "\x4")) {
fwrite($stream, \PHP_EOL);
}
}

rewind($stream);

return $stream;
}
}
<?php










namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;






class CommandCompletionTester
{
private Command $command;

public function __construct(Command $command)
{
$this->command = $command;
}




public function complete(array $input): array
{
$currentIndex = \count($input);
if ('' === end($input)) {
array_pop($input);
}
array_unshift($input, $this->command->getName());

$completionInput = CompletionInput::fromTokens($input, $currentIndex);
$completionInput->bind($this->command->getDefinition());
$suggestions = new CompletionSuggestions();

$this->command->complete($completionInput, $suggestions);

$options = [];
foreach ($suggestions->getOptionSuggestions() as $option) {
$options[] = '--'.$option->getName();
}

return array_map('strval', array_merge($options, $suggestions->getValueSuggestions()));
}
}
<?php










namespace Symfony\Component\Console\Tester\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\Console\Command\Command;

final class CommandIsSuccessful extends Constraint
{
public function toString(): string
{
return 'is successful';
}

protected function matches($other): bool
{
return Command::SUCCESS === $other;
}

protected function failureDescription($other): string
{
return 'the command '.$this->toString();
}

protected function additionalFailureDescription($other): string
{
$mapping = [
Command::FAILURE => 'Command failed.',
Command::INVALID => 'Command was invalid.',
];

return $mapping[$other] ?? \sprintf('Command returned exit status %d.', $other);
}
}
<?php










namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;











class ApplicationTester
{
use TesterTrait;

private Application $application;

public function __construct(Application $application)
{
$this->application = $application;
}













public function run(array $input, array $options = []): int
{
$prevShellVerbosity = getenv('SHELL_VERBOSITY');

try {
$this->input = new ArrayInput($input);
if (isset($options['interactive'])) {
$this->input->setInteractive($options['interactive']);
}

if ($this->inputs) {
$this->input->setStream(self::createStream($this->inputs));
}

$this->initOutput($options);

return $this->statusCode = $this->application->run($this->input, $this->output);
} finally {


if (false === $prevShellVerbosity) {
if (\function_exists('putenv')) {
@putenv('SHELL_VERBOSITY');
}
unset($_ENV['SHELL_VERBOSITY']);
unset($_SERVER['SHELL_VERBOSITY']);
} else {
if (\function_exists('putenv')) {
@putenv('SHELL_VERBOSITY='.$prevShellVerbosity);
}
$_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity;
$_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity;
}
}
}
}
<?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Output\OutputInterface;




final class Cursor
{
private OutputInterface $output;

private $input;




public function __construct(OutputInterface $output, $input = null)
{
$this->output = $output;
$this->input = $input ?? (\defined('STDIN') ? \STDIN : fopen('php://input', 'r+'));
}




public function moveUp(int $lines = 1): static
{
$this->output->write(\sprintf("\x1b[%dA", $lines));

return $this;
}




public function moveDown(int $lines = 1): static
{
$this->output->write(\sprintf("\x1b[%dB", $lines));

return $this;
}




public function moveRight(int $columns = 1): static
{
$this->output->write(\sprintf("\x1b[%dC", $columns));

return $this;
}




public function moveLeft(int $columns = 1): static
{
$this->output->write(\sprintf("\x1b[%dD", $columns));

return $this;
}




public function moveToColumn(int $column): static
{
$this->output->write(\sprintf("\x1b[%dG", $column));

return $this;
}




public function moveToPosition(int $column, int $row): static
{
$this->output->write(\sprintf("\x1b[%d;%dH", $row + 1, $column));

return $this;
}




public function savePosition(): static
{
$this->output->write("\x1b7");

return $this;
}




public function restorePosition(): static
{
$this->output->write("\x1b8");

return $this;
}




public function hide(): static
{
$this->output->write("\x1b[?25l");

return $this;
}




public function show(): static
{
$this->output->write("\x1b[?25h\x1b[?0c");

return $this;
}






public function clearLine(): static
{
$this->output->write("\x1b[2K");

return $this;
}




public function clearLineAfter(): self
{
$this->output->write("\x1b[K");

return $this;
}






public function clearOutput(): static
{
$this->output->write("\x1b[0J");

return $this;
}






public function clearScreen(): static
{
$this->output->write("\x1b[2J");

return $this;
}




public function getCurrentPosition(): array
{
static $isTtySupported;

if (!$isTtySupported ??= '/' === \DIRECTORY_SEPARATOR && stream_isatty(\STDOUT)) {
return [1, 1];
}

$sttyMode = shell_exec('stty -g');
shell_exec('stty -icanon -echo');

@fwrite($this->input, "\033[6n");

$code = trim(fread($this->input, 1024));

shell_exec(\sprintf('stty %s', $sttyMode));

sscanf($code, "\033[%d;%dR", $row, $col);

return [$col, $row];
}
}
# This file is part of the Symfony package.
#
# (c) Fabien Potencier <fabien@symfony.com>
#
# For the full copyright and license information, please view
# https://symfony.com/doc/current/contributing/code/license.html

function _sf_{{ COMMAND_NAME }}
    set sf_cmd (commandline -o)
    set c (count (commandline -oc))

    set completecmd "$sf_cmd[1]" "_complete" "--no-interaction" "-sfish" "-a{{ VERSION }}"

    for i in $sf_cmd
        if [ $i != "" ]
            set completecmd $completecmd "-i$i"
        end
    end

    set completecmd $completecmd "-c$c"

    set sfcomplete ($completecmd)

    for i in $sfcomplete
        echo $i
    end
end

complete -c '{{ COMMAND_NAME }}' -a '(_sf_{{ COMMAND_NAME }})' -f
# This file is part of the Symfony package.
#
# (c) Fabien Potencier <fabien@symfony.com>
#
# For the full copyright and license information, please view
# https://symfony.com/doc/current/contributing/code/license.html

_sf_{{ COMMAND_NAME }}() {

    # Use the default completion for shell redirect operators.
    for w in '>' '>>' '&>' '<'; do
        if [[ $w = "${COMP_WORDS[COMP_CWORD-1]}" ]]; then
            compopt -o filenames
            COMPREPLY=($(compgen -f -- "${COMP_WORDS[COMP_CWORD]}"))
            return 0
        fi
    done

    # Use newline as only separator to allow space in completion values
    local IFS=$'\n'
    local sf_cmd="${COMP_WORDS[0]}"

    # for an alias, get the real script behind it
    sf_cmd_type=$(type -t $sf_cmd)
    if [[ $sf_cmd_type == "alias" ]]; then
        sf_cmd=$(alias $sf_cmd | sed -E "s/alias $sf_cmd='(.*)'/\1/")
    elif [[ $sf_cmd_type == "file" ]]; then
        sf_cmd=$(type -p $sf_cmd)
    fi

    if [[ $sf_cmd_type != "function" && ! -x $sf_cmd ]]; then
        return 1
    fi

    local cur prev words cword
    _get_comp_words_by_ref -n := cur prev words cword

    local completecmd=("$sf_cmd" "_complete" "--no-interaction" "-sbash" "-c$cword" "-a{{ VERSION }}")
    for w in ${words[@]}; do
        w="${w//\\\\/\\}"
        # remove quotes from typed values
        quote="${w:0:1}"
        if [ "$quote" == \' ]; then
            w="${w%\'}"
            w="${w#\'}"
        elif [ "$quote" == \" ]; then
            w="${w%\"}"
            w="${w#\"}"
        fi
        # empty values are ignored
        if [ ! -z "$w" ]; then
            completecmd+=("-i$w")
        fi
    done

    local sfcomplete
    if sfcomplete=$(${completecmd[@]} 2>&1); then
        local quote suggestions
        quote=${cur:0:1}

        # Use single quotes by default if suggestions contains backslash (FQCN)
        if [ "$quote" == '' ] && [[ "$sfcomplete" =~ \\ ]]; then
            quote=\'
        fi

        if [ "$quote" == \' ]; then
            # single quotes: no additional escaping (does not accept ' in values)
            suggestions=$(for s in $sfcomplete; do printf $'%q%q%q\n' "$quote" "$s" "$quote"; done)
        elif [ "$quote" == \" ]; then
            # double quotes: double escaping for \ $ ` "
            suggestions=$(for s in $sfcomplete; do
                s=${s//\\/\\\\}
                s=${s//\$/\\\$}
                s=${s//\`/\\\`}
                s=${s//\"/\\\"}
                printf $'%q%q%q\n' "$quote" "$s" "$quote";
            done)
        else
            # no quotes: double escaping
            suggestions=$(for s in $sfcomplete; do printf $'%q\n' $(printf '%q' "$s"); done)
        fi
        COMPREPLY=($(IFS=$'\n' compgen -W "$suggestions" -- $(printf -- "%q" "$cur")))
        __ltrim_colon_completions "$cur"
    else
        if [[ "$sfcomplete" != *"Command \"_complete\" is not defined."* ]]; then
            >&2 echo
            >&2 echo $sfcomplete
        fi

        return 1
    fi
}

complete -F _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }}
#compdef {{ COMMAND_NAME }}

# This file is part of the Symfony package.
#
# (c) Fabien Potencier <fabien@symfony.com>
#
# For the full copyright and license information, please view
# https://symfony.com/doc/current/contributing/code/license.html

#
# zsh completions for {{ COMMAND_NAME }}
#
# References:
#   - https://github.com/spf13/cobra/blob/master/zsh_completions.go
#   - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash
#
_sf_{{ COMMAND_NAME }}() {
    local lastParam flagPrefix requestComp out comp
    local -a completions

    # The user could have moved the cursor backwards on the command-line.
    # We need to trigger completion from the $CURRENT location, so we need
    # to truncate the command-line ($words) up to the $CURRENT location.
    # (We cannot use $CURSOR as its value does not work when a command is an alias.)
    words=("${=words[1,CURRENT]}") lastParam=${words[-1]}

    # For zsh, when completing a flag with an = (e.g., {{ COMMAND_NAME }} -n=<TAB>)
    # completions must be prefixed with the flag
    setopt local_options BASH_REMATCH
    if [[ "${lastParam}" =~ '-.*=' ]]; then
        # We are dealing with a flag with an =
        flagPrefix="-P ${BASH_REMATCH}"
    fi

    # Prepare the command to obtain completions
    requestComp="${words[0]} ${words[1]} _complete --no-interaction -szsh -a{{ VERSION }} -c$((CURRENT-1))" i=""
    for w in ${words[@]}; do
        w=$(printf -- '%b' "$w")
        # remove quotes from typed values
        quote="${w:0:1}"
        if [ "$quote" = \' ]; then
            w="${w%\'}"
            w="${w#\'}"
        elif [ "$quote" = \" ]; then
            w="${w%\"}"
            w="${w#\"}"
        fi
        # empty values are ignored
        if [ ! -z "$w" ]; then
            i="${i}-i${w} "
        fi
    done

    # Ensure at least 1 input
    if [ "${i}" = "" ]; then
        requestComp="${requestComp} -i\" \""
    else
        requestComp="${requestComp} ${i}"
    fi

    # Use eval to handle any environment variables and such
    out=$(eval ${requestComp} 2>/dev/null)

    while IFS='\n' read -r comp; do
        if [ -n "$comp" ]; then
            # If requested, completions are returned with a description.
            # The description is preceded by a TAB character.
            # For zsh's _describe, we need to use a : instead of a TAB.
            # We first need to escape any : as part of the completion itself.
            comp=${comp//:/\\:}
            local tab=$(printf '\t')
            comp=${comp//$tab/:}
            completions+=${comp}
        fi
    done < <(printf "%s\n" "${out[@]}")

    # Let inbuilt _describe handle completions
    eval _describe "completions" completions $flagPrefix
    return $?
}

compdef _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }}
MZ                @                                       	!L!This program cannot be run in DOS mode.
$       ,;B;B;B2מ:B2-B2ƞ9B2ў?Ba98B;CB2Ȟ:B2֞:B2Ӟ:BRich;B        PE  L MoO         	  
         8           @                      `     ?   @                           "  P    @                      P  p   !                             8!  @                                          .text   	      
                    `.rdata  	       
                 @  @.data      0                    @  .rsrc       @                    @  @.reloc     P      "              @  B                                                                                                                                                                                                                                                                                                                                                        j$@ x  j @ e EPV  @ EЃPV @ MX @ e EP5H @ L @ YY5\ @ EP5` @ D @ YYP @ MMT @ 3H  ; 0@ u  h@   l3@ $40@ 5h3@ 40@ h$0@ h(0@ h 0@  @ 00@ }j  Yjh"@   3ۉ]d   p]俀3@ SVW0 @ ;t;u3Fuh  4 @ 3F|3@ ;u
j\  Y;|3@ u,5|3@ h @ h @   YYtE      5<0@ |3@ ;uh @ h @ l  YY|3@    9]uSW8 @ 93@ th3@   Yt
SjS3@ $0@  @ 5$0@ 5(0@ 5 0@ 80@ 9,0@ u7P @ E	MPQ  YYËeE80@ 39,0@ uPh @ 9<0@ u @ E80@   øMZ  f9  @ t3M< @   @ 8PE  uH  t  uՃ   v39   xtv39   j,0@ p @ jl @ YY3@ 3@  @ t3@  @ p3@  @  x3@ V    =0@  uh@  @ Yg  =0@ u	j @ Y3{  U(  H1@ D1@ @1@ <1@ 581@ =41@ f`1@ fT1@ f01@ f,1@ f%(1@ f-$1@ X1@ E L1@ EP1@ E\1@ 0@   P1@ L0@ @0@ 	 D0@     0@ 0@  @ 0@ j?  Yj   @ h!@ $ @ =0@  uj  Yh	 ( @ P, @ ËUE 8csmu*xu$@= t=!t="t= @u  3] hH@   @ 3% @ jh("@ b  53@ 5 @ YEuu @ Ygj  Ye 53@ ։E53@ YYEEPEPu5l @ YPU  Eu֣3@ uփ3@ E	   E  j  YËUuNYH]ËV!@ !@ W;stЃ;r_^ËV"@ "@ W;stЃ;r_^% @ ̋UMMZ  f9t3]ËA<8PE  u3ҹ  f9H]̋UEH<ASVq3WDv}H;r	X;r
B(;r3_^[]̋UjhH"@ he@ d    PSVW 0@ 1E3PEd    eE    h  @ *tUE-  @ Ph  @ Pt;@$ЃEMd    Y_^[]ËE3=  ËeE3Md    Y_^[]% @ % @ he@ d5    D$l$l$+SVW 0@ 1E3PeuEEEEd    ËMd    Y__^[]QËUuuuuh@ h 0@    ]ËVh   h   3V   tVVVVV   ^3ËU 0@ e e SWN@  ;tt	У0@ `VEP< @ u3u @ 3 @ 3 @ 3EP @ E3E3;uO@u5 0@ ։50@ ^_[%t @ %x @ %| @ % @ % @ % @ % @ % @ % @ Pd5    D$+d$SVW( 0@ 3PEuEEd    ËMd    Y__^[]QËM3M%T @ T$BJ3J3l"@ s                                                                                                                                                                                                                                                     #  #  #  )  r)  b)  H)  4)  )  (  (  (  (  (  (  )      #  $  %  %  &  d&  &  $      ('  '  '  '  '  (  ((  6(  '  H(  Z(  t(  (  '  '   '  '  '  l'  ^'  R'  F'  >'  >(  0'  '  )          @         W@ @                     MoO       l   !    @0@ 0@ bad allocation      H                                                            0@ !@    RSDSьJ!LZ    c:\users\seld\documents\visual studio 2010\Projects\hiddeninp\Release\hiddeninp.pdb     e                            @ @                 :@             @ @ @ "   d"@                        "          #      $#          &  D   H#          (  h                       #  #  #  )  r)  b)  H)  4)  )  (  (  (  (  (  (  )      #  $  %  %  &  d&  &  $      ('  '  '  '  '  (  ((  6(  '  H(  Z(  t(  (  '  '   '  '  '  l'  ^'  R'  F'  >'  >(  0'  '  )      GetConsoleMode  SetConsoleMode  ;GetStdHandle  KERNEL32.dll   ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A  J?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A  ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z  _??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ  {??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ  ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z  MSVCP90.dll _amsg_exit   __getmainargs ,_cexit  |_exit f _XcptFilter exit   __initenv _initterm _initterm_e <_configthreadlocale  __setusermatherr  _adjust_fdiv   __p__commode   __p__fmode  j_encode_pointer  __set_app_type  K_crt_debugger_hook  C ?terminate@@YAXXZ MSVCR90.dll _unlock  __dllonexit v_lock _onexit `_decode_pointer s_except_handler4_common _invoke_watson  ?_controlfp_s  InterlockedExchange !Sleep InterlockedCompareExchange  -TerminateProcess  GetCurrentProcess >UnhandledExceptionFilter  SetUnhandledExceptionFilter IsDebuggerPresent TQueryPerformanceCounter fGetTickCount  GetCurrentThreadId  GetCurrentProcessId OGetSystemTimeAsFileTime s __CxxFrameHandler3                                                    N@D   $!@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            8                   P                   h                	                   	     @  (        C  V        (4   V S _ V E R S I O N _ I N F O                                                  S t r i n g F i l e I n f o   b   0 4 0 9 0 4 b 0    Q  F i l e D e s c r i p t i o n     R e a d s   f r o m   s t d i n   w i t h o u t   l e a k i n g   i n f o   t o   t h e   t e r m i n a l   a n d   o u t p u t s   b a c k   t o   s t d o u t     6   F i l e V e r s i o n     1 ,   0 ,   0 ,   0     8   I n t e r n a l N a m e   h i d d e n i n p u t   P   L e g a l C o p y r i g h t   J o r d i   B o g g i a n o   -   2 0 1 2   H   O r i g i n a l F i l e n a m e   h i d d e n i n p u t . e x e   :   P r o d u c t N a m e     H i d d e n   I n p u t     :   P r o d u c t V e r s i o n   1 ,   0 ,   0 ,   0     D    V a r F i l e I n f o     $    T r a n s l a t i o n     	<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING   @  00!0/080F0L0T0^0d0n0{000000000000001#1-1@1J1O1T1v1{1111111111111112"2*23292A2M2_2j2p222222222222333%303N3T3Z3`3f3l3s3z333333333333333334444%4;4B444444444445!5^5c5555H6M6_6}666 777*7w7|77777888=8E8P8V8\8b8h8n8t8z88889      $   0001 1t1x12 2@2\2`2h2t2 0     0                                                                                                                                                  <?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\CompleteCommand;
use Symfony\Component\Console\Command\DumpCompletionCommand;
use Symfony\Component\Console\Command\HelpCommand;
use Symfony\Component\Console\Command\LazyCommand;
use Symfony\Component\Console\Command\ListCommand;
use Symfony\Component\Console\Command\SignalableCommandInterface;
use Symfony\Component\Console\CommandLoader\CommandLoaderInterface;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleSignalEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Exception\NamespaceNotFoundException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\DebugFormatterHelper;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\ProcessHelper;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputAwareInterface;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\SignalRegistry\SignalRegistry;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\ErrorHandler\ErrorHandler;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\Service\ResetInterface;
















class Application implements ResetInterface
{
private array $commands = [];
private bool $wantHelps = false;
private ?Command $runningCommand = null;
private string $name;
private string $version;
private ?CommandLoaderInterface $commandLoader = null;
private bool $catchExceptions = true;
private bool $catchErrors = false;
private bool $autoExit = true;
private InputDefinition $definition;
private HelperSet $helperSet;
private ?EventDispatcherInterface $dispatcher = null;
private Terminal $terminal;
private string $defaultCommand;
private bool $singleCommand = false;
private bool $initialized = false;
private ?SignalRegistry $signalRegistry = null;
private array $signalsToDispatchEvent = [];

public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN')
{
$this->name = $name;
$this->version = $version;
$this->terminal = new Terminal();
$this->defaultCommand = 'list';
if (\defined('SIGINT') && SignalRegistry::isSupported()) {
$this->signalRegistry = new SignalRegistry();
$this->signalsToDispatchEvent = [\SIGINT, \SIGTERM, \SIGUSR1, \SIGUSR2];
}
}




public function setDispatcher(EventDispatcherInterface $dispatcher): void
{
$this->dispatcher = $dispatcher;
}




public function setCommandLoader(CommandLoaderInterface $commandLoader)
{
$this->commandLoader = $commandLoader;
}

public function getSignalRegistry(): SignalRegistry
{
if (!$this->signalRegistry) {
throw new RuntimeException('Signals are not supported. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.');
}

return $this->signalRegistry;
}




public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent)
{
$this->signalsToDispatchEvent = $signalsToDispatchEvent;
}








public function run(?InputInterface $input = null, ?OutputInterface $output = null): int
{
if (\function_exists('putenv')) {
@putenv('LINES='.$this->terminal->getHeight());
@putenv('COLUMNS='.$this->terminal->getWidth());
}

$input ??= new ArgvInput();
$output ??= new ConsoleOutput();

$renderException = function (\Throwable $e) use ($output) {
if ($output instanceof ConsoleOutputInterface) {
$this->renderThrowable($e, $output->getErrorOutput());
} else {
$this->renderThrowable($e, $output);
}
};
if ($phpHandler = set_exception_handler($renderException)) {
restore_exception_handler();
if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) {
$errorHandler = true;
} elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) {
$phpHandler[0]->setExceptionHandler($errorHandler);
}
}

try {
$this->configureIO($input, $output);

$exitCode = $this->doRun($input, $output);
} catch (\Throwable $e) {
if ($e instanceof \Exception && !$this->catchExceptions) {
throw $e;
}
if (!$e instanceof \Exception && !$this->catchErrors) {
throw $e;
}

$renderException($e);

$exitCode = $e->getCode();
if (is_numeric($exitCode)) {
$exitCode = (int) $exitCode;
if ($exitCode <= 0) {
$exitCode = 1;
}
} else {
$exitCode = 1;
}
} finally {


if (!$phpHandler) {
if (set_exception_handler($renderException) === $renderException) {
restore_exception_handler();
}
restore_exception_handler();
} elseif (!$errorHandler) {
$finalHandler = $phpHandler[0]->setExceptionHandler(null);
if ($finalHandler !== $renderException) {
$phpHandler[0]->setExceptionHandler($finalHandler);
}
}
}

if ($this->autoExit) {
if ($exitCode > 255) {
$exitCode = 255;
}

exit($exitCode);
}

return $exitCode;
}






public function doRun(InputInterface $input, OutputInterface $output)
{
if (true === $input->hasParameterOption(['--version', '-V'], true)) {
$output->writeln($this->getLongVersion());

return 0;
}

try {

$input->bind($this->getDefinition());
} catch (ExceptionInterface) {

}

$name = $this->getCommandName($input);
if (true === $input->hasParameterOption(['--help', '-h'], true)) {
if (!$name) {
$name = 'help';
$input = new ArrayInput(['command_name' => $this->defaultCommand]);
} else {
$this->wantHelps = true;
}
}

if (!$name) {
$name = $this->defaultCommand;
$definition = $this->getDefinition();
$definition->setArguments(array_merge(
$definition->getArguments(),
[
'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),
]
));
}

try {
$this->runningCommand = null;

$command = $this->find($name);
} catch (\Throwable $e) {
if (($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) && 1 === \count($alternatives = $e->getAlternatives()) && $input->isInteractive()) {
$alternative = $alternatives[0];

$style = new SymfonyStyle($input, $output);
$output->writeln('');
$formattedBlock = (new FormatterHelper())->formatBlock(\sprintf('Command "%s" is not defined.', $name), 'error', true);
$output->writeln($formattedBlock);
if (!$style->confirm(\sprintf('Do you want to run "%s" instead? ', $alternative), false)) {
if (null !== $this->dispatcher) {
$event = new ConsoleErrorEvent($input, $output, $e);
$this->dispatcher->dispatch($event, ConsoleEvents::ERROR);

return $event->getExitCode();
}

return 1;
}

$command = $this->find($alternative);
} else {
if (null !== $this->dispatcher) {
$event = new ConsoleErrorEvent($input, $output, $e);
$this->dispatcher->dispatch($event, ConsoleEvents::ERROR);

if (0 === $event->getExitCode()) {
return 0;
}

$e = $event->getError();
}

try {
if ($e instanceof CommandNotFoundException && $namespace = $this->findNamespace($name)) {
$helper = new DescriptorHelper();
$helper->describe($output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output, $this, [
'format' => 'txt',
'raw_text' => false,
'namespace' => $namespace,
'short' => false,
]);

return isset($event) ? $event->getExitCode() : 1;
}

throw $e;
} catch (NamespaceNotFoundException) {
throw $e;
}
}
}

if ($command instanceof LazyCommand) {
$command = $command->getCommand();
}

$this->runningCommand = $command;
$exitCode = $this->doRunCommand($command, $input, $output);
$this->runningCommand = null;

return $exitCode;
}




public function reset()
{
}




public function setHelperSet(HelperSet $helperSet)
{
$this->helperSet = $helperSet;
}




public function getHelperSet(): HelperSet
{
return $this->helperSet ??= $this->getDefaultHelperSet();
}




public function setDefinition(InputDefinition $definition)
{
$this->definition = $definition;
}




public function getDefinition(): InputDefinition
{
$this->definition ??= $this->getDefaultInputDefinition();

if ($this->singleCommand) {
$inputDefinition = $this->definition;
$inputDefinition->setArguments();

return $inputDefinition;
}

return $this->definition;
}




public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if (
CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType()
&& 'command' === $input->getCompletionName()
) {
foreach ($this->all() as $name => $command) {

if ($command->isHidden() || $command->getName() !== $name) {
continue;
}
$suggestions->suggestValue(new Suggestion($command->getName(), $command->getDescription()));
foreach ($command->getAliases() as $name) {
$suggestions->suggestValue(new Suggestion($name, $command->getDescription()));
}
}

return;
}

if (CompletionInput::TYPE_OPTION_NAME === $input->getCompletionType()) {
$suggestions->suggestOptions($this->getDefinition()->getOptions());

return;
}
}




public function getHelp(): string
{
return $this->getLongVersion();
}




public function areExceptionsCaught(): bool
{
return $this->catchExceptions;
}






public function setCatchExceptions(bool $boolean)
{
$this->catchExceptions = $boolean;
}




public function setCatchErrors(bool $catchErrors = true): void
{
$this->catchErrors = $catchErrors;
}




public function isAutoExitEnabled(): bool
{
return $this->autoExit;
}






public function setAutoExit(bool $boolean)
{
$this->autoExit = $boolean;
}




public function getName(): string
{
return $this->name;
}






public function setName(string $name)
{
$this->name = $name;
}




public function getVersion(): string
{
return $this->version;
}






public function setVersion(string $version)
{
$this->version = $version;
}






public function getLongVersion()
{
if ('UNKNOWN' !== $this->getName()) {
if ('UNKNOWN' !== $this->getVersion()) {
return \sprintf('%s <info>%s</info>', $this->getName(), $this->getVersion());
}

return $this->getName();
}

return 'Console Tool';
}




public function register(string $name): Command
{
return $this->add(new Command($name));
}










public function addCommands(array $commands)
{
foreach ($commands as $command) {
$this->add($command);
}
}









public function add(Command $command)
{
$this->init();

$command->setApplication($this);

if (!$command->isEnabled()) {
$command->setApplication(null);

return null;
}

if (!$command instanceof LazyCommand) {

$command->getDefinition();
}

if (!$command->getName()) {
throw new LogicException(\sprintf('The command defined in "%s" cannot have an empty name.', get_debug_type($command)));
}

$this->commands[$command->getName()] = $command;

foreach ($command->getAliases() as $alias) {
$this->commands[$alias] = $command;
}

return $command;
}








public function get(string $name)
{
$this->init();

if (!$this->has($name)) {
throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name));
}


if (!isset($this->commands[$name])) {
throw new CommandNotFoundException(\sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name));
}

$command = $this->commands[$name];

if ($this->wantHelps) {
$this->wantHelps = false;

$helpCommand = $this->get('help');
$helpCommand->setCommand($command);

return $helpCommand;
}

return $command;
}




public function has(string $name): bool
{
$this->init();

return isset($this->commands[$name]) || ($this->commandLoader?->has($name) && $this->add($this->commandLoader->get($name)));
}








public function getNamespaces(): array
{
$namespaces = [];
foreach ($this->all() as $command) {
if ($command->isHidden()) {
continue;
}

$namespaces[] = $this->extractAllNamespaces($command->getName());

foreach ($command->getAliases() as $alias) {
$namespaces[] = $this->extractAllNamespaces($alias);
}
}

return array_values(array_unique(array_filter(array_merge([], ...$namespaces))));
}






public function findNamespace(string $namespace): string
{
$allNamespaces = $this->getNamespaces();
$expr = implode('[^:]*:', array_map('preg_quote', explode(':', $namespace))).'[^:]*';
$namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);

if (empty($namespaces)) {
$message = \sprintf('There are no commands defined in the "%s" namespace.', $namespace);

if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) {
if (1 == \count($alternatives)) {
$message .= "\n\nDid you mean this?\n    ";
} else {
$message .= "\n\nDid you mean one of these?\n    ";
}

$message .= implode("\n    ", $alternatives);
}

throw new NamespaceNotFoundException($message, $alternatives);
}

$exact = \in_array($namespace, $namespaces, true);
if (\count($namespaces) > 1 && !$exact) {
throw new NamespaceNotFoundException(\sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))), array_values($namespaces));
}

return $exact ? $namespace : reset($namespaces);
}











public function find(string $name)
{
$this->init();

$aliases = [];

foreach ($this->commands as $command) {
foreach ($command->getAliases() as $alias) {
if (!$this->has($alias)) {
$this->commands[$alias] = $command;
}
}
}

if ($this->has($name)) {
return $this->get($name);
}

$allCommands = $this->commandLoader ? array_merge($this->commandLoader->getNames(), array_keys($this->commands)) : array_keys($this->commands);
$expr = implode('[^:]*:', array_map('preg_quote', explode(':', $name))).'[^:]*';
$commands = preg_grep('{^'.$expr.'}', $allCommands);

if (empty($commands)) {
$commands = preg_grep('{^'.$expr.'}i', $allCommands);
}


if (empty($commands) || \count(preg_grep('{^'.$expr.'$}i', $commands)) < 1) {
if (false !== $pos = strrpos($name, ':')) {

$this->findNamespace(substr($name, 0, $pos));
}

$message = \sprintf('Command "%s" is not defined.', $name);

if ($alternatives = $this->findAlternatives($name, $allCommands)) {

$alternatives = array_filter($alternatives, fn ($name) => !$this->get($name)->isHidden());

if (1 == \count($alternatives)) {
$message .= "\n\nDid you mean this?\n    ";
} else {
$message .= "\n\nDid you mean one of these?\n    ";
}
$message .= implode("\n    ", $alternatives);
}

throw new CommandNotFoundException($message, array_values($alternatives));
}


if (\count($commands) > 1) {
$commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands;
$commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) {
if (!$commandList[$nameOrAlias] instanceof Command) {
$commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias);
}

$commandName = $commandList[$nameOrAlias]->getName();

$aliases[$nameOrAlias] = $commandName;

return $commandName === $nameOrAlias || !\in_array($commandName, $commands);
}));
}

if (\count($commands) > 1) {
$usableWidth = $this->terminal->getWidth() - 10;
$abbrevs = array_values($commands);
$maxLen = 0;
foreach ($abbrevs as $abbrev) {
$maxLen = max(Helper::width($abbrev), $maxLen);
}
$abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) {
if ($commandList[$cmd]->isHidden()) {
unset($commands[array_search($cmd, $commands)]);

return false;
}

$abbrev = str_pad($cmd, $maxLen, ' ').' '.$commandList[$cmd]->getDescription();

return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3).'...' : $abbrev;
}, array_values($commands));

if (\count($commands) > 1) {
$suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs));

throw new CommandNotFoundException(\sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands));
}
}

$command = $this->get(reset($commands));

if ($command->isHidden()) {
throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name));
}

return $command;
}








public function all(?string $namespace = null)
{
$this->init();

if (null === $namespace) {
if (!$this->commandLoader) {
return $this->commands;
}

$commands = $this->commands;
foreach ($this->commandLoader->getNames() as $name) {
if (!isset($commands[$name]) && $this->has($name)) {
$commands[$name] = $this->get($name);
}
}

return $commands;
}

$commands = [];
foreach ($this->commands as $name => $command) {
if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {
$commands[$name] = $command;
}
}

if ($this->commandLoader) {
foreach ($this->commandLoader->getNames() as $name) {
if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1) && $this->has($name)) {
$commands[$name] = $this->get($name);
}
}
}

return $commands;
}






public static function getAbbreviations(array $names): array
{
$abbrevs = [];
foreach ($names as $name) {
for ($len = \strlen($name); $len > 0; --$len) {
$abbrev = substr($name, 0, $len);
$abbrevs[$abbrev][] = $name;
}
}

return $abbrevs;
}

public function renderThrowable(\Throwable $e, OutputInterface $output): void
{
$output->writeln('', OutputInterface::VERBOSITY_QUIET);

$this->doRenderThrowable($e, $output);

if (null !== $this->runningCommand) {
$output->writeln(\sprintf('<info>%s</info>', OutputFormatter::escape(\sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET);
$output->writeln('', OutputInterface::VERBOSITY_QUIET);
}
}

protected function doRenderThrowable(\Throwable $e, OutputInterface $output): void
{
do {
$message = trim($e->getMessage());
if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
$class = get_debug_type($e);
$title = \sprintf('  [%s%s]  ', $class, 0 !== ($code = $e->getCode()) ? ' ('.$code.')' : '');
$len = Helper::width($title);
} else {
$len = 0;
}

if (str_contains($message, "@anonymous\0")) {
$message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message);
}

$width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX;
$lines = [];
foreach ('' !== $message ? preg_split('/\r?\n/', $message) : [] as $line) {
foreach ($this->splitStringByWidth($line, $width - 4) as $line) {

$lineLength = Helper::width($line) + 4;
$lines[] = [$line, $lineLength];

$len = max($lineLength, $len);
}
}

$messages = [];
if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
$messages[] = \sprintf('<comment>%s</comment>', OutputFormatter::escape(\sprintf('In %s line %s:', basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a')));
}
$messages[] = $emptyLine = \sprintf('<error>%s</error>', str_repeat(' ', $len));
if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
$messages[] = \sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - Helper::width($title))));
}
foreach ($lines as $line) {
$messages[] = \sprintf('<error>  %s  %s</error>', OutputFormatter::escape($line[0]), str_repeat(' ', $len - $line[1]));
}
$messages[] = $emptyLine;
$messages[] = '';

$output->writeln($messages, OutputInterface::VERBOSITY_QUIET);

if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
$output->writeln('<comment>Exception trace:</comment>', OutputInterface::VERBOSITY_QUIET);


$trace = $e->getTrace();

array_unshift($trace, [
'function' => '',
'file' => $e->getFile() ?: 'n/a',
'line' => $e->getLine() ?: 'n/a',
'args' => [],
]);

for ($i = 0, $count = \count($trace); $i < $count; ++$i) {
$class = $trace[$i]['class'] ?? '';
$type = $trace[$i]['type'] ?? '';
$function = $trace[$i]['function'] ?? '';
$file = $trace[$i]['file'] ?? 'n/a';
$line = $trace[$i]['line'] ?? 'n/a';

$output->writeln(\sprintf(' %s%s at <info>%s:%s</info>', $class, $function ? $type.$function.'()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET);
}

$output->writeln('', OutputInterface::VERBOSITY_QUIET);
}
} while ($e = $e->getPrevious());
}






protected function configureIO(InputInterface $input, OutputInterface $output)
{
if (true === $input->hasParameterOption(['--ansi'], true)) {
$output->setDecorated(true);
} elseif (true === $input->hasParameterOption(['--no-ansi'], true)) {
$output->setDecorated(false);
}

if (true === $input->hasParameterOption(['--no-interaction', '-n'], true)) {
$input->setInteractive(false);
}

switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) {
case -1:
$output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
break;
case 1:
$output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
break;
case 2:
$output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
break;
case 3:
$output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
break;
default:
$shellVerbosity = 0;
break;
}

if (true === $input->hasParameterOption(['--quiet', '-q'], true)) {
$output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
$shellVerbosity = -1;
} else {
if ($input->hasParameterOption('-vvv', true) || $input->hasParameterOption('--verbose=3', true) || 3 === $input->getParameterOption('--verbose', false, true)) {
$output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
$shellVerbosity = 3;
} elseif ($input->hasParameterOption('-vv', true) || $input->hasParameterOption('--verbose=2', true) || 2 === $input->getParameterOption('--verbose', false, true)) {
$output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
$shellVerbosity = 2;
} elseif ($input->hasParameterOption('-v', true) || $input->hasParameterOption('--verbose=1', true) || $input->hasParameterOption('--verbose', true) || $input->getParameterOption('--verbose', false, true)) {
$output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
$shellVerbosity = 1;
}
}

if (-1 === $shellVerbosity) {
$input->setInteractive(false);
}

if (\function_exists('putenv')) {
@putenv('SHELL_VERBOSITY='.$shellVerbosity);
}
$_ENV['SHELL_VERBOSITY'] = $shellVerbosity;
$_SERVER['SHELL_VERBOSITY'] = $shellVerbosity;
}









protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
{
foreach ($command->getHelperSet() as $helper) {
if ($helper instanceof InputAwareInterface) {
$helper->setInput($input);
}
}

$commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : [];
if ($commandSignals || $this->dispatcher && $this->signalsToDispatchEvent) {
if (!$this->signalRegistry) {
throw new RuntimeException('Unable to subscribe to signal events. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.');
}

if ($this->dispatcher) {

foreach ($this->signalsToDispatchEvent as $signal) {
$event = new ConsoleSignalEvent($command, $input, $output, $signal);

$this->signalRegistry->register($signal, function ($signal) use ($event, $command, $commandSignals) {
$this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL);
$exitCode = $event->getExitCode();


if (\in_array($signal, $commandSignals, true)) {
$exitCode = $command->handleSignal($signal, $exitCode);

if (null === $exitCode) {
trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command));
$exitCode = 0;
}
}

if (false !== $exitCode) {
$event = new ConsoleTerminateEvent($command, $event->getInput(), $event->getOutput(), $exitCode, $signal);
$this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE);

exit($event->getExitCode());
}
});
}


$commandSignals = array_diff($commandSignals, $this->signalsToDispatchEvent);
}

foreach ($commandSignals as $signal) {
$this->signalRegistry->register($signal, function (int $signal) use ($command): void {
$exitCode = $command->handleSignal($signal);

if (null === $exitCode) {
trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command));
$exitCode = 0;
}

if (false !== $exitCode) {
exit($exitCode);
}
});
}
}

if (null === $this->dispatcher) {
return $command->run($input, $output);
}


try {
$command->mergeApplicationDefinition();
$input->bind($command->getDefinition());
} catch (ExceptionInterface) {

}

$event = new ConsoleCommandEvent($command, $input, $output);
$e = null;

try {
$this->dispatcher->dispatch($event, ConsoleEvents::COMMAND);

if ($event->commandShouldRun()) {
$exitCode = $command->run($input, $output);
} else {
$exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;
}
} catch (\Throwable $e) {
$event = new ConsoleErrorEvent($input, $output, $e, $command);
$this->dispatcher->dispatch($event, ConsoleEvents::ERROR);
$e = $event->getError();

if (0 === $exitCode = $event->getExitCode()) {
$e = null;
}
}

$event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
$this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE);

if (null !== $e) {
throw $e;
}

return $event->getExitCode();
}




protected function getCommandName(InputInterface $input): ?string
{
return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument();
}




protected function getDefaultInputDefinition(): InputDefinition
{
return new InputDefinition([
new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),
new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the <info>'.$this->defaultCommand.'</info> command'),
new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'),
new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),
new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', null),
new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),
]);
}






protected function getDefaultCommands(): array
{
return [new HelpCommand(), new ListCommand(), new CompleteCommand(), new DumpCompletionCommand()];
}




protected function getDefaultHelperSet(): HelperSet
{
return new HelperSet([
new FormatterHelper(),
new DebugFormatterHelper(),
new ProcessHelper(),
new QuestionHelper(),
]);
}




private function getAbbreviationSuggestions(array $abbrevs): string
{
return '    '.implode("\n    ", $abbrevs);
}






public function extractNamespace(string $name, ?int $limit = null): string
{
$parts = explode(':', $name, -1);

return implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit));
}







private function findAlternatives(string $name, iterable $collection): array
{
$threshold = 1e3;
$alternatives = [];

$collectionParts = [];
foreach ($collection as $item) {
$collectionParts[$item] = explode(':', $item);
}

foreach (explode(':', $name) as $i => $subname) {
foreach ($collectionParts as $collectionName => $parts) {
$exists = isset($alternatives[$collectionName]);
if (!isset($parts[$i]) && $exists) {
$alternatives[$collectionName] += $threshold;
continue;
} elseif (!isset($parts[$i])) {
continue;
}

$lev = levenshtein($subname, $parts[$i]);
if ($lev <= \strlen($subname) / 3 || '' !== $subname && str_contains($parts[$i], $subname)) {
$alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
} elseif ($exists) {
$alternatives[$collectionName] += $threshold;
}
}
}

foreach ($collection as $item) {
$lev = levenshtein($name, $item);
if ($lev <= \strlen($name) / 3 || str_contains($item, $name)) {
$alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
}
}

$alternatives = array_filter($alternatives, fn ($lev) => $lev < 2 * $threshold);
ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE);

return array_keys($alternatives);
}






public function setDefaultCommand(string $commandName, bool $isSingleCommand = false): static
{
$this->defaultCommand = explode('|', ltrim($commandName, '|'))[0];

if ($isSingleCommand) {

$this->find($commandName);

$this->singleCommand = true;
}

return $this;
}




public function isSingleCommand(): bool
{
return $this->singleCommand;
}

private function splitStringByWidth(string $string, int $width): array
{



if (false === $encoding = mb_detect_encoding($string, null, true)) {
return str_split($string, $width);
}

$utf8String = mb_convert_encoding($string, 'utf8', $encoding);
$lines = [];
$line = '';

$offset = 0;
while (preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) {
$offset += \strlen($m[0]);

foreach (preg_split('//u', $m[0]) as $char) {

if (Helper::width($line.$char) <= $width) {
$line .= $char;
continue;
}

$lines[] = str_pad($line, $width);
$line = $char;
}
}

$lines[] = \count($lines) ? str_pad($line, $width) : $line;

mb_convert_variables($encoding, 'utf8', $lines);

return $lines;
}






private function extractAllNamespaces(string $name): array
{

$parts = explode(':', $name, -1);
$namespaces = [];

foreach ($parts as $part) {
if (\count($namespaces)) {
$namespaces[] = end($namespaces).':'.$part;
} else {
$namespaces[] = $part;
}
}

return $namespaces;
}

private function init(): void
{
if ($this->initialized) {
return;
}
$this->initialized = true;

foreach ($this->getDefaultCommands() as $command) {
$this->add($command);
}
}
}
<?php










namespace Symfony\Component\Console\DependencyInjection;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\LazyCommand;
use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;






class AddConsoleCommandPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
$commandServices = $container->findTaggedServiceIds('console.command', true);
$lazyCommandMap = [];
$lazyCommandRefs = [];
$serviceIds = [];

foreach ($commandServices as $id => $tags) {
$definition = $container->getDefinition($id);
$definition->addTag('container.no_preload');
$class = $container->getParameterBag()->resolveValue($definition->getClass());

if (isset($tags[0]['command'])) {
$aliases = $tags[0]['command'];
} else {
if (!$r = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}
if (!$r->isSubclassOf(Command::class)) {
throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, 'console.command', Command::class));
}
$aliases = str_replace('%', '%%', $class::getDefaultName() ?? '');
}

$aliases = explode('|', $aliases ?? '');
$commandName = array_shift($aliases);

if ($isHidden = '' === $commandName) {
$commandName = array_shift($aliases);
}

if (null === $commandName) {
if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag('container.private')) {
$commandId = 'console.command.public_alias.'.$id;
$container->setAlias($commandId, $id)->setPublic(true);
$id = $commandId;
}
$serviceIds[] = $id;

continue;
}

$description = $tags[0]['description'] ?? null;

unset($tags[0]);
$lazyCommandMap[$commandName] = $id;
$lazyCommandRefs[$id] = new TypedReference($id, $class);

foreach ($aliases as $alias) {
$lazyCommandMap[$alias] = $id;
}

foreach ($tags as $tag) {
if (isset($tag['command'])) {
$aliases[] = $tag['command'];
$lazyCommandMap[$tag['command']] = $id;
}

$description ??= $tag['description'] ?? null;
}

$definition->addMethodCall('setName', [$commandName]);

if ($aliases) {
$definition->addMethodCall('setAliases', [$aliases]);
}

if ($isHidden) {
$definition->addMethodCall('setHidden', [true]);
}

if (!$description) {
if (!$r = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}
if (!$r->isSubclassOf(Command::class)) {
throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, 'console.command', Command::class));
}
$description = str_replace('%', '%%', $class::getDefaultDescription() ?? '');
}

if ($description) {
$definition->addMethodCall('setDescription', [$description]);

$container->register('.'.$id.'.lazy', LazyCommand::class)
->setArguments([$commandName, $aliases, $description, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]);

$lazyCommandRefs[$id] = new Reference('.'.$id.'.lazy');
}
}

$container
->register('console.command_loader', ContainerCommandLoader::class)
->setPublic(true)
->addTag('container.no_preload')
->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]);

$container->setParameter('console.command.ids', $serviceIds);
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;






abstract class Descriptor implements DescriptorInterface
{
protected OutputInterface $output;

public function describe(OutputInterface $output, object $object, array $options = []): void
{
$this->output = $output;

match (true) {
$object instanceof InputArgument => $this->describeInputArgument($object, $options),
$object instanceof InputOption => $this->describeInputOption($object, $options),
$object instanceof InputDefinition => $this->describeInputDefinition($object, $options),
$object instanceof Command => $this->describeCommand($object, $options),
$object instanceof Application => $this->describeApplication($object, $options),
default => throw new InvalidArgumentException(\sprintf('Object of type "%s" is not describable.', get_debug_type($object))),
};
}

protected function write(string $content, bool $decorated = false): void
{
$this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
}




abstract protected function describeInputArgument(InputArgument $argument, array $options = []): void;




abstract protected function describeInputOption(InputOption $option, array $options = []): void;




abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []): void;




abstract protected function describeCommand(Command $command, array $options = []): void;




abstract protected function describeApplication(Application $application, array $options = []): void;
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;








class XmlDescriptor extends Descriptor
{
public function getInputDefinitionDocument(InputDefinition $definition): \DOMDocument
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->appendChild($definitionXML = $dom->createElement('definition'));

$definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
foreach ($definition->getArguments() as $argument) {
$this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
}

$definitionXML->appendChild($optionsXML = $dom->createElement('options'));
foreach ($definition->getOptions() as $option) {
$this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
}

return $dom;
}

public function getCommandDocument(Command $command, bool $short = false): \DOMDocument
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->appendChild($commandXML = $dom->createElement('command'));

$commandXML->setAttribute('id', $command->getName());
$commandXML->setAttribute('name', $command->getName());
$commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0);

$commandXML->appendChild($usagesXML = $dom->createElement('usages'));

$commandXML->appendChild($descriptionXML = $dom->createElement('description'));
$descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));

if ($short) {
foreach ($command->getAliases() as $usage) {
$usagesXML->appendChild($dom->createElement('usage', $usage));
}
} else {
$command->mergeApplicationDefinition(false);

foreach (array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) {
$usagesXML->appendChild($dom->createElement('usage', $usage));
}

$commandXML->appendChild($helpXML = $dom->createElement('help'));
$helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));

$definitionXML = $this->getInputDefinitionDocument($command->getDefinition());
$this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));
}

return $dom;
}

public function getApplicationDocument(Application $application, ?string $namespace = null, bool $short = false): \DOMDocument
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->appendChild($rootXml = $dom->createElement('symfony'));

if ('UNKNOWN' !== $application->getName()) {
$rootXml->setAttribute('name', $application->getName());
if ('UNKNOWN' !== $application->getVersion()) {
$rootXml->setAttribute('version', $application->getVersion());
}
}

$rootXml->appendChild($commandsXML = $dom->createElement('commands'));

$description = new ApplicationDescription($application, $namespace, true);

if ($namespace) {
$commandsXML->setAttribute('namespace', $namespace);
}

foreach ($description->getCommands() as $command) {
$this->appendDocument($commandsXML, $this->getCommandDocument($command, $short));
}

if (!$namespace) {
$rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));

foreach ($description->getNamespaces() as $namespaceDescription) {
$namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
$namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);

foreach ($namespaceDescription['commands'] as $name) {
$namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
$commandXML->appendChild($dom->createTextNode($name));
}
}
}

return $dom;
}

protected function describeInputArgument(InputArgument $argument, array $options = []): void
{
$this->writeDocument($this->getInputArgumentDocument($argument));
}

protected function describeInputOption(InputOption $option, array $options = []): void
{
$this->writeDocument($this->getInputOptionDocument($option));
}

protected function describeInputDefinition(InputDefinition $definition, array $options = []): void
{
$this->writeDocument($this->getInputDefinitionDocument($definition));
}

protected function describeCommand(Command $command, array $options = []): void
{
$this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false));
}

protected function describeApplication(Application $application, array $options = []): void
{
$this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false));
}




private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent): void
{
foreach ($importedParent->childNodes as $childNode) {
$parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
}
}




private function writeDocument(\DOMDocument $dom): void
{
$dom->formatOutput = true;
$this->write($dom->saveXML());
}

private function getInputArgumentDocument(InputArgument $argument): \DOMDocument
{
$dom = new \DOMDocument('1.0', 'UTF-8');

$dom->appendChild($objectXML = $dom->createElement('argument'));
$objectXML->setAttribute('name', $argument->getName());
$objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
$objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
$objectXML->appendChild($descriptionXML = $dom->createElement('description'));
$descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));

$objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
$defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [var_export($argument->getDefault(), true)] : ($argument->getDefault() ? [$argument->getDefault()] : []));
foreach ($defaults as $default) {
$defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
$defaultXML->appendChild($dom->createTextNode($default));
}

return $dom;
}

private function getInputOptionDocument(InputOption $option): \DOMDocument
{
$dom = new \DOMDocument('1.0', 'UTF-8');

$dom->appendChild($objectXML = $dom->createElement('option'));
$objectXML->setAttribute('name', '--'.$option->getName());
$pos = strpos($option->getShortcut() ?? '', '|');
if (false !== $pos) {
$objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
$objectXML->setAttribute('shortcuts', '-'.str_replace('|', '|-', $option->getShortcut()));
} else {
$objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
}
$objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
$objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
$objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
$objectXML->appendChild($descriptionXML = $dom->createElement('description'));
$descriptionXML->appendChild($dom->createTextNode($option->getDescription()));

if ($option->acceptValue()) {
$defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [var_export($option->getDefault(), true)] : ($option->getDefault() ? [$option->getDefault()] : []));
$objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));

if (!empty($defaults)) {
foreach ($defaults as $default) {
$defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
$defaultXML->appendChild($dom->createTextNode($default));
}
}
}

if ($option->isNegatable()) {
$dom->appendChild($objectXML = $dom->createElement('option'));
$objectXML->setAttribute('name', '--no-'.$option->getName());
$objectXML->setAttribute('shortcut', '');
$objectXML->setAttribute('accept_value', 0);
$objectXML->setAttribute('is_value_required', 0);
$objectXML->setAttribute('is_multiple', 0);
$objectXML->appendChild($descriptionXML = $dom->createElement('description'));
$descriptionXML->appendChild($dom->createTextNode('Negate the "--'.$option->getName().'" option'));
}

return $dom;
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\CommandNotFoundException;






class ApplicationDescription
{
public const GLOBAL_NAMESPACE = '_global';

private Application $application;
private ?string $namespace;
private bool $showHidden;
private array $namespaces;




private array $commands;




private array $aliases = [];

public function __construct(Application $application, ?string $namespace = null, bool $showHidden = false)
{
$this->application = $application;
$this->namespace = $namespace;
$this->showHidden = $showHidden;
}

public function getNamespaces(): array
{
if (!isset($this->namespaces)) {
$this->inspectApplication();
}

return $this->namespaces;
}




public function getCommands(): array
{
if (!isset($this->commands)) {
$this->inspectApplication();
}

return $this->commands;
}




public function getCommand(string $name): Command
{
if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name));
}

return $this->commands[$name] ?? $this->aliases[$name];
}

private function inspectApplication(): void
{
$this->commands = [];
$this->namespaces = [];

$all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
foreach ($this->sortCommands($all) as $namespace => $commands) {
$names = [];


foreach ($commands as $name => $command) {
if (!$command->getName() || (!$this->showHidden && $command->isHidden())) {
continue;
}

if ($command->getName() === $name) {
$this->commands[$name] = $command;
} else {
$this->aliases[$name] = $command;
}

$names[] = $name;
}

$this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names];
}
}

private function sortCommands(array $commands): array
{
$namespacedCommands = [];
$globalCommands = [];
$sortedCommands = [];
foreach ($commands as $name => $command) {
$key = $this->application->extractNamespace($name, 1);
if (\in_array($key, ['', self::GLOBAL_NAMESPACE], true)) {
$globalCommands[$name] = $command;
} else {
$namespacedCommands[$key][$name] = $command;
}
}

if ($globalCommands) {
ksort($globalCommands);
$sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands;
}

if ($namespacedCommands) {
ksort($namespacedCommands, \SORT_STRING);
foreach ($namespacedCommands as $key => $commandsSet) {
ksort($commandsSet);
$sortedCommands[$key] = $commandsSet;
}
}

return $sortedCommands;
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Output\OutputInterface;






interface DescriptorInterface
{



public function describe(OutputInterface $output, object $object, array $options = []);
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;








class TextDescriptor extends Descriptor
{
protected function describeInputArgument(InputArgument $argument, array $options = []): void
{
if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) {
$default = \sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($argument->getDefault()));
} else {
$default = '';
}

$totalWidth = $options['total_width'] ?? Helper::width($argument->getName());
$spacingWidth = $totalWidth - \strlen($argument->getName());

$this->writeText(\sprintf('  <info>%s</info>  %s%s%s',
$argument->getName(),
str_repeat(' ', $spacingWidth),

preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $argument->getDescription()),
$default
), $options);
}

protected function describeInputOption(InputOption $option, array $options = []): void
{
if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) {
$default = \sprintf('<comment> [default: %s]</comment>', $this->formatDefaultValue($option->getDefault()));
} else {
$default = '';
}

$value = '';
if ($option->acceptValue()) {
$value = '='.strtoupper($option->getName());

if ($option->isValueOptional()) {
$value = '['.$value.']';
}
}

$totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]);
$synopsis = \sprintf('%s%s',
$option->getShortcut() ? \sprintf('-%s, ', $option->getShortcut()) : '    ',
\sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value)
);

$spacingWidth = $totalWidth - Helper::width($synopsis);

$this->writeText(\sprintf('  <info>%s</info>  %s%s%s%s',
$synopsis,
str_repeat(' ', $spacingWidth),

preg_replace('/\s*[\r\n]\s*/', "\n".str_repeat(' ', $totalWidth + 4), $option->getDescription()),
$default,
$option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
), $options);
}

protected function describeInputDefinition(InputDefinition $definition, array $options = []): void
{
$totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions());
foreach ($definition->getArguments() as $argument) {
$totalWidth = max($totalWidth, Helper::width($argument->getName()));
}

if ($definition->getArguments()) {
$this->writeText('<comment>Arguments:</comment>', $options);
$this->writeText("\n");
foreach ($definition->getArguments() as $argument) {
$this->describeInputArgument($argument, array_merge($options, ['total_width' => $totalWidth]));
$this->writeText("\n");
}
}

if ($definition->getArguments() && $definition->getOptions()) {
$this->writeText("\n");
}

if ($definition->getOptions()) {
$laterOptions = [];

$this->writeText('<comment>Options:</comment>', $options);
foreach ($definition->getOptions() as $option) {
if (\strlen($option->getShortcut() ?? '') > 1) {
$laterOptions[] = $option;
continue;
}
$this->writeText("\n");
$this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));
}
foreach ($laterOptions as $option) {
$this->writeText("\n");
$this->describeInputOption($option, array_merge($options, ['total_width' => $totalWidth]));
}
}
}

protected function describeCommand(Command $command, array $options = []): void
{
$command->mergeApplicationDefinition(false);

if ($description = $command->getDescription()) {
$this->writeText('<comment>Description:</comment>', $options);
$this->writeText("\n");
$this->writeText('  '.$description);
$this->writeText("\n\n");
}

$this->writeText('<comment>Usage:</comment>', $options);
foreach (array_merge([$command->getSynopsis(true)], $command->getAliases(), $command->getUsages()) as $usage) {
$this->writeText("\n");
$this->writeText('  '.OutputFormatter::escape($usage), $options);
}
$this->writeText("\n");

$definition = $command->getDefinition();
if ($definition->getOptions() || $definition->getArguments()) {
$this->writeText("\n");
$this->describeInputDefinition($definition, $options);
$this->writeText("\n");
}

$help = $command->getProcessedHelp();
if ($help && $help !== $description) {
$this->writeText("\n");
$this->writeText('<comment>Help:</comment>', $options);
$this->writeText("\n");
$this->writeText('  '.str_replace("\n", "\n  ", $help), $options);
$this->writeText("\n");
}
}

protected function describeApplication(Application $application, array $options = []): void
{
$describedNamespace = $options['namespace'] ?? null;
$description = new ApplicationDescription($application, $describedNamespace);

if (isset($options['raw_text']) && $options['raw_text']) {
$width = $this->getColumnWidth($description->getCommands());

foreach ($description->getCommands() as $command) {
$this->writeText(\sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options);
$this->writeText("\n");
}
} else {
if ('' != $help = $application->getHelp()) {
$this->writeText("$help\n\n", $options);
}

$this->writeText("<comment>Usage:</comment>\n", $options);
$this->writeText("  command [options] [arguments]\n\n", $options);

$this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options);

$this->writeText("\n");
$this->writeText("\n");

$commands = $description->getCommands();
$namespaces = $description->getNamespaces();
if ($describedNamespace && $namespaces) {

$describedNamespaceInfo = reset($namespaces);
foreach ($describedNamespaceInfo['commands'] as $name) {
$commands[$name] = $description->getCommand($name);
}
}


$width = $this->getColumnWidth(array_merge(...array_values(array_map(fn ($namespace) => array_intersect($namespace['commands'], array_keys($commands)), array_values($namespaces)))));

if ($describedNamespace) {
$this->writeText(\sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace), $options);
} else {
$this->writeText('<comment>Available commands:</comment>', $options);
}

foreach ($namespaces as $namespace) {
$namespace['commands'] = array_filter($namespace['commands'], fn ($name) => isset($commands[$name]));

if (!$namespace['commands']) {
continue;
}

if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
$this->writeText("\n");
$this->writeText(' <comment>'.$namespace['id'].'</comment>', $options);
}

foreach ($namespace['commands'] as $name) {
$this->writeText("\n");
$spacingWidth = $width - Helper::width($name);
$command = $commands[$name];
$commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : '';
$this->writeText(\sprintf('  <info>%s</info>%s%s', $name, str_repeat(' ', $spacingWidth), $commandAliases.$command->getDescription()), $options);
}
}

$this->writeText("\n");
}
}

private function writeText(string $content, array $options = []): void
{
$this->write(
isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
isset($options['raw_output']) ? !$options['raw_output'] : true
);
}




private function getCommandAliasesText(Command $command): string
{
$text = '';
$aliases = $command->getAliases();

if ($aliases) {
$text = '['.implode('|', $aliases).'] ';
}

return $text;
}




private function formatDefaultValue(mixed $default): string
{
if (\INF === $default) {
return 'INF';
}

if (\is_string($default)) {
$default = OutputFormatter::escape($default);
} elseif (\is_array($default)) {
foreach ($default as $key => $value) {
if (\is_string($value)) {
$default[$key] = OutputFormatter::escape($value);
}
}
}

return str_replace('\\\\', '\\', json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
}




private function getColumnWidth(array $commands): int
{
$widths = [];

foreach ($commands as $command) {
if ($command instanceof Command) {
$widths[] = Helper::width($command->getName());
foreach ($command->getAliases() as $alias) {
$widths[] = Helper::width($alias);
}
} else {
$widths[] = Helper::width($command);
}
}

return $widths ? max($widths) + 2 : 0;
}




private function calculateTotalWidthForOptions(array $options): int
{
$totalWidth = 0;
foreach ($options as $option) {

$nameLength = 1 + max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName());
if ($option->isNegatable()) {
$nameLength += 6 + Helper::width($option->getName()); 
} elseif ($option->acceptValue()) {
$valueLength = 1 + Helper::width($option->getName()); 
$valueLength += $option->isValueOptional() ? 2 : 0; 

$nameLength += $valueLength;
}
$totalWidth = max($totalWidth, $nameLength);
}

return $totalWidth;
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\String\UnicodeString;

class ReStructuredTextDescriptor extends Descriptor
{

private string $partChar = '=';

private string $chapterChar = '-';

private string $sectionChar = '~';

private string $subsectionChar = '.';

private string $subsubsectionChar = '^';

private string $paragraphsChar = '"';

private array $visibleNamespaces = [];

public function describe(OutputInterface $output, object $object, array $options = []): void
{
$decorated = $output->isDecorated();
$output->setDecorated(false);

parent::describe($output, $object, $options);

$output->setDecorated($decorated);
}




protected function write(string $content, bool $decorated = true): void
{
parent::write($content, $decorated);
}

protected function describeInputArgument(InputArgument $argument, array $options = []): void
{
$this->write(
$argument->getName() ?: '<none>'."\n".str_repeat($this->paragraphsChar, Helper::width($argument->getName()))."\n\n"
.($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '')
.'- **Is required**: '.($argument->isRequired() ? 'yes' : 'no')."\n"
.'- **Is array**: '.($argument->isArray() ? 'yes' : 'no')."\n"
.'- **Default**: ``'.str_replace("\n", '', var_export($argument->getDefault(), true)).'``'
);
}

protected function describeInputOption(InputOption $option, array $options = []): void
{
$name = '\-\-'.$option->getName();
if ($option->isNegatable()) {
$name .= '|\-\-no-'.$option->getName();
}
if ($option->getShortcut()) {
$name .= '|-'.str_replace('|', '|-', $option->getShortcut());
}

$optionDescription = $option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n\n", $option->getDescription())."\n\n" : '';
$optionDescription = (new UnicodeString($optionDescription))->ascii();
$this->write(
$name."\n".str_repeat($this->paragraphsChar, Helper::width($name))."\n\n"
.$optionDescription
.'- **Accept value**: '.($option->acceptValue() ? 'yes' : 'no')."\n"
.'- **Is value required**: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
.'- **Is multiple**: '.($option->isArray() ? 'yes' : 'no')."\n"
.'- **Is negatable**: '.($option->isNegatable() ? 'yes' : 'no')."\n"
.'- **Default**: ``'.str_replace("\n", '', var_export($option->getDefault(), true)).'``'."\n"
);
}

protected function describeInputDefinition(InputDefinition $definition, array $options = []): void
{
if ($showArguments = ((bool) $definition->getArguments())) {
$this->write("Arguments\n".str_repeat($this->subsubsectionChar, 9))."\n\n";
foreach ($definition->getArguments() as $argument) {
$this->write("\n\n");
$this->describeInputArgument($argument);
}
}

if ($nonDefaultOptions = $this->getNonDefaultOptions($definition)) {
if ($showArguments) {
$this->write("\n\n");
}

$this->write("Options\n".str_repeat($this->subsubsectionChar, 7)."\n\n");
foreach ($nonDefaultOptions as $option) {
$this->describeInputOption($option);
$this->write("\n");
}
}
}

protected function describeCommand(Command $command, array $options = []): void
{
if ($options['short'] ?? false) {
$this->write(
'``'.$command->getName()."``\n"
.str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n"
.($command->getDescription() ? $command->getDescription()."\n\n" : '')
."Usage\n".str_repeat($this->paragraphsChar, 5)."\n\n"
.array_reduce($command->getAliases(), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'."\n")
);

return;
}

$command->mergeApplicationDefinition(false);

foreach ($command->getAliases() as $alias) {
$this->write('.. _'.$alias.":\n\n");
}
$this->write(
$command->getName()."\n"
.str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n"
.($command->getDescription() ? $command->getDescription()."\n\n" : '')
."Usage\n".str_repeat($this->subsubsectionChar, 5)."\n\n"
.array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'."\n")
);

if ($help = $command->getProcessedHelp()) {
$this->write("\n");
$this->write($help);
}

$definition = $command->getDefinition();
if ($definition->getOptions() || $definition->getArguments()) {
$this->write("\n\n");
$this->describeInputDefinition($definition);
}
}

protected function describeApplication(Application $application, array $options = []): void
{
$description = new ApplicationDescription($application, $options['namespace'] ?? null);
$title = $this->getApplicationTitle($application);

$this->write($title."\n".str_repeat($this->partChar, Helper::width($title)));
$this->createTableOfContents($description, $application);
$this->describeCommands($application, $options);
}

private function getApplicationTitle(Application $application): string
{
if ('UNKNOWN' === $application->getName()) {
return 'Console Tool';
}
if ('UNKNOWN' !== $application->getVersion()) {
return \sprintf('%s %s', $application->getName(), $application->getVersion());
}

return $application->getName();
}

private function describeCommands($application, array $options): void
{
$title = 'Commands';
$this->write("\n\n$title\n".str_repeat($this->chapterChar, Helper::width($title))."\n\n");
foreach ($this->visibleNamespaces as $namespace) {
if ('_global' === $namespace) {
$commands = $application->all('');
$this->write('Global'."\n".str_repeat($this->sectionChar, Helper::width('Global'))."\n\n");
} else {
$commands = $application->all($namespace);
$this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n");
}

foreach ($this->removeAliasesAndHiddenCommands($commands) as $command) {
$this->describeCommand($command, $options);
$this->write("\n\n");
}
}
}

private function createTableOfContents(ApplicationDescription $description, Application $application): void
{
$this->setVisibleNamespaces($description);
$chapterTitle = 'Table of Contents';
$this->write("\n\n$chapterTitle\n".str_repeat($this->chapterChar, Helper::width($chapterTitle))."\n\n");
foreach ($this->visibleNamespaces as $namespace) {
if ('_global' === $namespace) {
$commands = $application->all('');
} else {
$commands = $application->all($namespace);
$this->write("\n\n");
$this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n");
}
$commands = $this->removeAliasesAndHiddenCommands($commands);

$this->write("\n\n");
$this->write(implode("\n", array_map(static fn ($commandName) => \sprintf('- `%s`_', $commandName), array_keys($commands))));
}
}

private function getNonDefaultOptions(InputDefinition $definition): array
{
$globalOptions = [
'help',
'quiet',
'verbose',
'version',
'ansi',
'no-interaction',
];
$nonDefaultOptions = [];
foreach ($definition->getOptions() as $option) {

if (!\in_array($option->getName(), $globalOptions)) {
$nonDefaultOptions[] = $option;
}
}

return $nonDefaultOptions;
}

private function setVisibleNamespaces(ApplicationDescription $description): void
{
$commands = $description->getCommands();
foreach ($description->getNamespaces() as $namespace) {
try {
$namespaceCommands = $namespace['commands'];
foreach ($namespaceCommands as $key => $commandName) {
if (!\array_key_exists($commandName, $commands)) {

unset($namespaceCommands[$key]);
} elseif ($commands[$commandName]->isHidden()) {
unset($namespaceCommands[$key]);
}
}
if (!$namespaceCommands) {

continue;
}
} catch (\Exception) {
}
$this->visibleNamespaces[] = $namespace['id'];
}
}

private function removeAliasesAndHiddenCommands(array $commands): array
{
foreach ($commands as $key => $command) {
if ($command->isHidden() || \in_array($key, $command->getAliases(), true)) {
unset($commands[$key]);
}
}
unset($commands['completion']);

return $commands;
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;








class MarkdownDescriptor extends Descriptor
{
public function describe(OutputInterface $output, object $object, array $options = []): void
{
$decorated = $output->isDecorated();
$output->setDecorated(false);

parent::describe($output, $object, $options);

$output->setDecorated($decorated);
}

protected function write(string $content, bool $decorated = true): void
{
parent::write($content, $decorated);
}

protected function describeInputArgument(InputArgument $argument, array $options = []): void
{
$this->write(
'#### `'.($argument->getName() ?: '<none>')."`\n\n"
.($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '')
.'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
.'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
.'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
);
}

protected function describeInputOption(InputOption $option, array $options = []): void
{
$name = '--'.$option->getName();
if ($option->isNegatable()) {
$name .= '|--no-'.$option->getName();
}
if ($option->getShortcut()) {
$name .= '|-'.str_replace('|', '|-', $option->getShortcut()).'';
}

$this->write(
'#### `'.$name.'`'."\n\n"
.($option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $option->getDescription())."\n\n" : '')
.'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
.'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
.'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
.'* Is negatable: '.($option->isNegatable() ? 'yes' : 'no')."\n"
.'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
);
}

protected function describeInputDefinition(InputDefinition $definition, array $options = []): void
{
if ($showArguments = \count($definition->getArguments()) > 0) {
$this->write('### Arguments');
foreach ($definition->getArguments() as $argument) {
$this->write("\n\n");
$this->describeInputArgument($argument);
}
}

if (\count($definition->getOptions()) > 0) {
if ($showArguments) {
$this->write("\n\n");
}

$this->write('### Options');
foreach ($definition->getOptions() as $option) {
$this->write("\n\n");
$this->describeInputOption($option);
}
}
}

protected function describeCommand(Command $command, array $options = []): void
{
if ($options['short'] ?? false) {
$this->write(
'`'.$command->getName()."`\n"
.str_repeat('-', Helper::width($command->getName()) + 2)."\n\n"
.($command->getDescription() ? $command->getDescription()."\n\n" : '')
.'### Usage'."\n\n"
.array_reduce($command->getAliases(), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n")
);

return;
}

$command->mergeApplicationDefinition(false);

$this->write(
'`'.$command->getName()."`\n"
.str_repeat('-', Helper::width($command->getName()) + 2)."\n\n"
.($command->getDescription() ? $command->getDescription()."\n\n" : '')
.'### Usage'."\n\n"
.array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n")
);

if ($help = $command->getProcessedHelp()) {
$this->write("\n");
$this->write($help);
}

$definition = $command->getDefinition();
if ($definition->getOptions() || $definition->getArguments()) {
$this->write("\n\n");
$this->describeInputDefinition($definition);
}
}

protected function describeApplication(Application $application, array $options = []): void
{
$describedNamespace = $options['namespace'] ?? null;
$description = new ApplicationDescription($application, $describedNamespace);
$title = $this->getApplicationTitle($application);

$this->write($title."\n".str_repeat('=', Helper::width($title)));

foreach ($description->getNamespaces() as $namespace) {
if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
$this->write("\n\n");
$this->write('**'.$namespace['id'].':**');
}

$this->write("\n\n");
$this->write(implode("\n", array_map(fn ($commandName) => \sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())), $namespace['commands'])));
}

foreach ($description->getCommands() as $command) {
$this->write("\n\n");
$this->describeCommand($command, $options);
}
}

private function getApplicationTitle(Application $application): string
{
if ('UNKNOWN' !== $application->getName()) {
if ('UNKNOWN' !== $application->getVersion()) {
return \sprintf('%s %s', $application->getName(), $application->getVersion());
}

return $application->getName();
}

return 'Console Tool';
}
}
<?php










namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;








class JsonDescriptor extends Descriptor
{
protected function describeInputArgument(InputArgument $argument, array $options = []): void
{
$this->writeData($this->getInputArgumentData($argument), $options);
}

protected function describeInputOption(InputOption $option, array $options = []): void
{
$this->writeData($this->getInputOptionData($option), $options);
if ($option->isNegatable()) {
$this->writeData($this->getInputOptionData($option, true), $options);
}
}

protected function describeInputDefinition(InputDefinition $definition, array $options = []): void
{
$this->writeData($this->getInputDefinitionData($definition), $options);
}

protected function describeCommand(Command $command, array $options = []): void
{
$this->writeData($this->getCommandData($command, $options['short'] ?? false), $options);
}

protected function describeApplication(Application $application, array $options = []): void
{
$describedNamespace = $options['namespace'] ?? null;
$description = new ApplicationDescription($application, $describedNamespace, true);
$commands = [];

foreach ($description->getCommands() as $command) {
$commands[] = $this->getCommandData($command, $options['short'] ?? false);
}

$data = [];
if ('UNKNOWN' !== $application->getName()) {
$data['application']['name'] = $application->getName();
if ('UNKNOWN' !== $application->getVersion()) {
$data['application']['version'] = $application->getVersion();
}
}

$data['commands'] = $commands;

if ($describedNamespace) {
$data['namespace'] = $describedNamespace;
} else {
$data['namespaces'] = array_values($description->getNamespaces());
}

$this->writeData($data, $options);
}




private function writeData(array $data, array $options): void
{
$flags = $options['json_encoding'] ?? 0;

$this->write(json_encode($data, $flags));
}

private function getInputArgumentData(InputArgument $argument): array
{
return [
'name' => $argument->getName(),
'is_required' => $argument->isRequired(),
'is_array' => $argument->isArray(),
'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $argument->getDescription()),
'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault(),
];
}

private function getInputOptionData(InputOption $option, bool $negated = false): array
{
return $negated ? [
'name' => '--no-'.$option->getName(),
'shortcut' => '',
'accept_value' => false,
'is_value_required' => false,
'is_multiple' => false,
'description' => 'Negate the "--'.$option->getName().'" option',
'default' => null === $option->getDefault() ? null : !$option->getDefault(),
] : [
'name' => '--'.$option->getName(),
'shortcut' => $option->getShortcut() ? '-'.str_replace('|', '|-', $option->getShortcut()) : '',
'accept_value' => $option->acceptValue(),
'is_value_required' => $option->isValueRequired(),
'is_multiple' => $option->isArray(),
'description' => preg_replace('/\s*[\r\n]\s*/', ' ', $option->getDescription()),
'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault(),
];
}

private function getInputDefinitionData(InputDefinition $definition): array
{
$inputArguments = [];
foreach ($definition->getArguments() as $name => $argument) {
$inputArguments[$name] = $this->getInputArgumentData($argument);
}

$inputOptions = [];
foreach ($definition->getOptions() as $name => $option) {
$inputOptions[$name] = $this->getInputOptionData($option);
if ($option->isNegatable()) {
$inputOptions['no-'.$name] = $this->getInputOptionData($option, true);
}
}

return ['arguments' => $inputArguments, 'options' => $inputOptions];
}

private function getCommandData(Command $command, bool $short = false): array
{
$data = [
'name' => $command->getName(),
'description' => $command->getDescription(),
];

if ($short) {
$data += [
'usage' => $command->getAliases(),
];
} else {
$command->mergeApplicationDefinition(false);

$data += [
'usage' => array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()),
'help' => $command->getProcessedHelp(),
'definition' => $this->getInputDefinitionData($command->getDefinition()),
];
}

$data['hidden'] = $command->isHidden();

return $data;
}
}
<?php










namespace Symfony\Component\Console\Exception;






class NamespaceNotFoundException extends CommandNotFoundException
{
}
<?php










namespace Symfony\Component\Console\Exception;






class MissingInputException extends RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Console\Exception;






class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Console\Exception;




class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Console\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Console\Exception;




class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Console\Exception;






class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface
{
private array $alternatives;







public function __construct(string $message, array $alternatives = [], int $code = 0, ?\Throwable $previous = null)
{
parent::__construct($message, $code, $previous);

$this->alternatives = $alternatives;
}




public function getAlternatives(): array
{
return $this->alternatives;
}
}
<?php










namespace Symfony\Component\Console\Exception;

use Symfony\Component\Console\Messenger\RunCommandContext;




final class RunCommandFailedException extends RuntimeException
{
public function __construct(\Throwable|string $exception, public readonly RunCommandContext $context)
{
parent::__construct(
$exception instanceof \Throwable ? $exception->getMessage() : $exception,
$exception instanceof \Throwable ? $exception->getCode() : 0,
$exception instanceof \Throwable ? $exception : null,
);
}
}
<?php










namespace Symfony\Component\Console\Exception;




class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Exception\InvalidArgumentException;




final class Color
{
private const COLORS = [
'black' => 0,
'red' => 1,
'green' => 2,
'yellow' => 3,
'blue' => 4,
'magenta' => 5,
'cyan' => 6,
'white' => 7,
'default' => 9,
];

private const BRIGHT_COLORS = [
'gray' => 0,
'bright-red' => 1,
'bright-green' => 2,
'bright-yellow' => 3,
'bright-blue' => 4,
'bright-magenta' => 5,
'bright-cyan' => 6,
'bright-white' => 7,
];

private const AVAILABLE_OPTIONS = [
'bold' => ['set' => 1, 'unset' => 22],
'underscore' => ['set' => 4, 'unset' => 24],
'blink' => ['set' => 5, 'unset' => 25],
'reverse' => ['set' => 7, 'unset' => 27],
'conceal' => ['set' => 8, 'unset' => 28],
];

private string $foreground;
private string $background;
private array $options = [];

public function __construct(string $foreground = '', string $background = '', array $options = [])
{
$this->foreground = $this->parseColor($foreground);
$this->background = $this->parseColor($background, true);

foreach ($options as $option) {
if (!isset(self::AVAILABLE_OPTIONS[$option])) {
throw new InvalidArgumentException(\sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, implode(', ', array_keys(self::AVAILABLE_OPTIONS))));
}

$this->options[$option] = self::AVAILABLE_OPTIONS[$option];
}
}

public function apply(string $text): string
{
return $this->set().$text.$this->unset();
}

public function set(): string
{
$setCodes = [];
if ('' !== $this->foreground) {
$setCodes[] = $this->foreground;
}
if ('' !== $this->background) {
$setCodes[] = $this->background;
}
foreach ($this->options as $option) {
$setCodes[] = $option['set'];
}
if (0 === \count($setCodes)) {
return '';
}

return \sprintf("\033[%sm", implode(';', $setCodes));
}

public function unset(): string
{
$unsetCodes = [];
if ('' !== $this->foreground) {
$unsetCodes[] = 39;
}
if ('' !== $this->background) {
$unsetCodes[] = 49;
}
foreach ($this->options as $option) {
$unsetCodes[] = $option['unset'];
}
if (0 === \count($unsetCodes)) {
return '';
}

return \sprintf("\033[%sm", implode(';', $unsetCodes));
}

private function parseColor(string $color, bool $background = false): string
{
if ('' === $color) {
return '';
}

if ('#' === $color[0]) {
return ($background ? '4' : '3').Terminal::getColorMode()->convertFromHexToAnsiColorCode($color);
}

if (isset(self::COLORS[$color])) {
return ($background ? '4' : '3').self::COLORS[$color];
}

if (isset(self::BRIGHT_COLORS[$color])) {
return ($background ? '10' : '9').self::BRIGHT_COLORS[$color];
}

throw new InvalidArgumentException(\sprintf('Invalid "%s" color; expected one of (%s).', $color, implode(', ', array_merge(array_keys(self::COLORS), array_keys(self::BRIGHT_COLORS)))));
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Process;






#[AsCommand(name: 'completion', description: 'Dump the shell completion script')]
final class DumpCompletionCommand extends Command
{



protected static $defaultName = 'completion';




protected static $defaultDescription = 'Dump the shell completion script';

private array $supportedShells;

protected function configure(): void
{
$fullCommand = $_SERVER['PHP_SELF'];
$commandName = basename($fullCommand);
$fullCommand = @realpath($fullCommand) ?: $fullCommand;

$shell = $this->guessShell();
[$rcFile, $completionFile] = match ($shell) {
'fish' => ['~/.config/fish/config.fish', "/etc/fish/completions/$commandName.fish"],
'zsh' => ['~/.zshrc', '$fpath[1]/_'.$commandName],
default => ['~/.bashrc', "/etc/bash_completion.d/$commandName"],
};

$supportedShells = implode(', ', $this->getSupportedShells());

$this
->setHelp(<<<EOH
The <info>%command.name%</> command dumps the shell completion script required
to use shell autocompletion (currently, {$supportedShells} completion are supported).

<comment>Static installation
-------------------</>

Dump the script to a global completion file and restart your shell:

    <info>%command.full_name% {$shell} | sudo tee {$completionFile}</>

Or dump the script to a local file and source it:

    <info>%command.full_name% {$shell} > completion.sh</>

    <comment># source the file whenever you use the project</>
    <info>source completion.sh</>

    <comment># or add this line at the end of your "{$rcFile}" file:</>
    <info>source /path/to/completion.sh</>

<comment>Dynamic installation
--------------------</>

Add this to the end of your shell configuration file (e.g. <info>"{$rcFile}"</>):

    <info>eval "$({$fullCommand} completion {$shell})"</>
EOH
)
->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. "bash"), the value of the "$SHELL" env var will be used if this is not given', null, $this->getSupportedShells(...))
->addOption('debug', null, InputOption::VALUE_NONE, 'Tail the completion debug log')
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$commandName = basename($_SERVER['argv'][0]);

if ($input->getOption('debug')) {
$this->tailDebugLog($commandName, $output);

return 0;
}

$shell = $input->getArgument('shell') ?? self::guessShell();
$completionFile = __DIR__.'/../Resources/completion.'.$shell;
if (!file_exists($completionFile)) {
$supportedShells = $this->getSupportedShells();

if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}
if ($shell) {
$output->writeln(\sprintf('<error>Detected shell "%s", which is not supported by Symfony shell completion (supported shells: "%s").</>', $shell, implode('", "', $supportedShells)));
} else {
$output->writeln(\sprintf('<error>Shell not detected, Symfony shell completion only supports "%s").</>', implode('", "', $supportedShells)));
}

return 2;
}

$output->write(str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, CompleteCommand::COMPLETION_API_VERSION], file_get_contents($completionFile)));

return 0;
}

private static function guessShell(): string
{
return basename($_SERVER['SHELL'] ?? '');
}

private function tailDebugLog(string $commandName, OutputInterface $output): void
{
$debugFile = sys_get_temp_dir().'/sf_'.$commandName.'.log';
if (!file_exists($debugFile)) {
touch($debugFile);
}
$process = new Process(['tail', '-f', $debugFile], null, null, null, 0);
$process->run(function (string $type, string $line) use ($output): void {
$output->write($line);
});
}




private function getSupportedShells(): array
{
if (isset($this->supportedShells)) {
return $this->supportedShells;
}

$shells = [];

foreach (new \DirectoryIterator(__DIR__.'/../Resources/') as $file) {
if (str_starts_with($file->getBasename(), 'completion.') && $file->isFile()) {
$shells[] = $file->getExtension();
}
}
sort($shells);

return $this->supportedShells = $shells;
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\LockInterface;
use Symfony\Component\Lock\Store\FlockStore;
use Symfony\Component\Lock\Store\SemaphoreStore;






trait LockableTrait
{
private ?LockInterface $lock = null;




private function lock(?string $name = null, bool $blocking = false): bool
{
if (!class_exists(SemaphoreStore::class)) {
throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running "composer require symfony/lock".');
}

if (null !== $this->lock) {
throw new LogicException('A lock is already in place.');
}

if (SemaphoreStore::isSupported()) {
$store = new SemaphoreStore();
} else {
$store = new FlockStore();
}

$this->lock = (new LockFactory($store))->createLock($name ?: $this->getName());
if (!$this->lock->acquire($blocking)) {
$this->lock = null;

return false;
}

return true;
}




private function release(): void
{
if ($this->lock) {
$this->lock->release();
$this->lock = null;
}
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Helper\HelperInterface;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;




final class LazyCommand extends Command
{
private \Closure|Command $command;
private ?bool $isEnabled;

public function __construct(string $name, array $aliases, string $description, bool $isHidden, \Closure $commandFactory, ?bool $isEnabled = true)
{
$this->setName($name)
->setAliases($aliases)
->setHidden($isHidden)
->setDescription($description);

$this->command = $commandFactory;
$this->isEnabled = $isEnabled;
}

public function ignoreValidationErrors(): void
{
$this->getCommand()->ignoreValidationErrors();
}

public function setApplication(?Application $application = null): void
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
if ($this->command instanceof parent) {
$this->command->setApplication($application);
}

parent::setApplication($application);
}

public function setHelperSet(HelperSet $helperSet): void
{
if ($this->command instanceof parent) {
$this->command->setHelperSet($helperSet);
}

parent::setHelperSet($helperSet);
}

public function isEnabled(): bool
{
return $this->isEnabled ?? $this->getCommand()->isEnabled();
}

public function run(InputInterface $input, OutputInterface $output): int
{
return $this->getCommand()->run($input, $output);
}

public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
$this->getCommand()->complete($input, $suggestions);
}

public function setCode(callable $code): static
{
$this->getCommand()->setCode($code);

return $this;
}




public function mergeApplicationDefinition(bool $mergeArgs = true): void
{
$this->getCommand()->mergeApplicationDefinition($mergeArgs);
}

public function setDefinition(array|InputDefinition $definition): static
{
$this->getCommand()->setDefinition($definition);

return $this;
}

public function getDefinition(): InputDefinition
{
return $this->getCommand()->getDefinition();
}

public function getNativeDefinition(): InputDefinition
{
return $this->getCommand()->getNativeDefinition();
}




public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null ): static
{
$suggestedValues = 5 <= \func_num_args() ? func_get_arg(4) : [];
$this->getCommand()->addArgument($name, $mode, $description, $default, $suggestedValues);

return $this;
}




public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null ): static
{
$suggestedValues = 6 <= \func_num_args() ? func_get_arg(5) : [];
$this->getCommand()->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);

return $this;
}

public function setProcessTitle(string $title): static
{
$this->getCommand()->setProcessTitle($title);

return $this;
}

public function setHelp(string $help): static
{
$this->getCommand()->setHelp($help);

return $this;
}

public function getHelp(): string
{
return $this->getCommand()->getHelp();
}

public function getProcessedHelp(): string
{
return $this->getCommand()->getProcessedHelp();
}

public function getSynopsis(bool $short = false): string
{
return $this->getCommand()->getSynopsis($short);
}

public function addUsage(string $usage): static
{
$this->getCommand()->addUsage($usage);

return $this;
}

public function getUsages(): array
{
return $this->getCommand()->getUsages();
}

public function getHelper(string $name): HelperInterface
{
return $this->getCommand()->getHelper($name);
}

public function getCommand(): parent
{
if (!$this->command instanceof \Closure) {
return $this->command;
}

$command = $this->command = ($this->command)();
$command->setApplication($this->getApplication());

if (null !== $this->getHelperSet()) {
$command->setHelperSet($this->getHelperSet());
}

$command->setName($this->getName())
->setAliases($this->getAliases())
->setHidden($this->isHidden())
->setDescription($this->getDescription());


$command->getDefinition();

return $command;
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Descriptor\ApplicationDescription;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;






class HelpCommand extends Command
{
private Command $command;




protected function configure()
{
$this->ignoreValidationErrors();

$this
->setName('help')
->setDefinition([
new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', fn () => array_keys((new ApplicationDescription($this->getApplication()))->getCommands())),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()),
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
])
->setDescription('Display help for a command')
->setHelp(<<<'EOF'
The <info>%command.name%</info> command displays help for a given command:

  <info>%command.full_name% list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>%command.full_name% --format=xml list</info>

To display the list of available commands, please use the <info>list</info> command.
EOF
)
;
}




public function setCommand(Command $command)
{
$this->command = $command;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->command ??= $this->getApplication()->find($input->getArgument('command_name'));

$helper = new DescriptorHelper();
$helper->describe($output, $this->command, [
'format' => $input->getOption('format'),
'raw_text' => $input->getOption('raw'),
]);

unset($this->command);

return 0;
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Helper\HelperInterface;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Stopwatch\Stopwatch;






final class TraceableCommand extends Command implements SignalableCommandInterface
{
public readonly Command $command;
public int $exitCode;
public ?int $interruptedBySignal = null;
public bool $ignoreValidation;
public bool $isInteractive = false;
public string $duration = 'n/a';
public string $maxMemoryUsage = 'n/a';
public InputInterface $input;
public OutputInterface $output;

public array $arguments;

public array $options;

public array $interactiveInputs = [];
public array $handledSignals = [];

public function __construct(
Command $command,
private readonly Stopwatch $stopwatch,
) {
if ($command instanceof LazyCommand) {
$command = $command->getCommand();
}

$this->command = $command;


$this->setDescription($command->getDescription());

parent::__construct($command->getName());


[$code, $processTitle, $ignoreValidationErrors] = \Closure::bind(function () {
return [$this->code, $this->processTitle, $this->ignoreValidationErrors];
}, $command, Command::class)();

if (\is_callable($code)) {
$this->setCode($code);
}

if ($processTitle) {
parent::setProcessTitle($processTitle);
}

if ($ignoreValidationErrors) {
parent::ignoreValidationErrors();
}

$this->ignoreValidation = $ignoreValidationErrors;
}

public function __call(string $name, array $arguments): mixed
{
return $this->command->{$name}(...$arguments);
}

public function getSubscribedSignals(): array
{
return $this->command instanceof SignalableCommandInterface ? $this->command->getSubscribedSignals() : [];
}

public function handleSignal(int $signal, int|false $previousExitCode = 0): int|false
{
if (!$this->command instanceof SignalableCommandInterface) {
return false;
}

$event = $this->stopwatch->start($this->getName().'.handle_signal');

$exit = $this->command->handleSignal($signal, $previousExitCode);

$event->stop();

if (!isset($this->handledSignals[$signal])) {
$this->handledSignals[$signal] = [
'handled' => 0,
'duration' => 0,
'memory' => 0,
];
}

++$this->handledSignals[$signal]['handled'];
$this->handledSignals[$signal]['duration'] += $event->getDuration();
$this->handledSignals[$signal]['memory'] = max(
$this->handledSignals[$signal]['memory'],
$event->getMemory() >> 20
);

return $exit;
}






public function ignoreValidationErrors(): void
{
$this->ignoreValidation = true;
$this->command->ignoreValidationErrors();

parent::ignoreValidationErrors();
}

public function setApplication(?Application $application = null): void
{
$this->command->setApplication($application);
}

public function getApplication(): ?Application
{
return $this->command->getApplication();
}

public function setHelperSet(HelperSet $helperSet): void
{
$this->command->setHelperSet($helperSet);
}

public function getHelperSet(): ?HelperSet
{
return $this->command->getHelperSet();
}

public function isEnabled(): bool
{
return $this->command->isEnabled();
}

public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
$this->command->complete($input, $suggestions);
}






public function setCode(callable $code): static
{
$this->command->setCode($code);

return parent::setCode(function (InputInterface $input, OutputInterface $output) use ($code): int {
$event = $this->stopwatch->start($this->getName().'.code');

$this->exitCode = $code($input, $output);

$event->stop();

return $this->exitCode;
});
}




public function mergeApplicationDefinition(bool $mergeArgs = true): void
{
$this->command->mergeApplicationDefinition($mergeArgs);
}

public function setDefinition(array|InputDefinition $definition): static
{
$this->command->setDefinition($definition);

return $this;
}

public function getDefinition(): InputDefinition
{
return $this->command->getDefinition();
}

public function getNativeDefinition(): InputDefinition
{
return $this->command->getNativeDefinition();
}

public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null, array|\Closure $suggestedValues = []): static
{
$this->command->addArgument($name, $mode, $description, $default, $suggestedValues);

return $this;
}

public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null, array|\Closure $suggestedValues = []): static
{
$this->command->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);

return $this;
}






public function setProcessTitle(string $title): static
{
$this->command->setProcessTitle($title);

return parent::setProcessTitle($title);
}

public function setHelp(string $help): static
{
$this->command->setHelp($help);

return $this;
}

public function getHelp(): string
{
return $this->command->getHelp();
}

public function getProcessedHelp(): string
{
return $this->command->getProcessedHelp();
}

public function getSynopsis(bool $short = false): string
{
return $this->command->getSynopsis($short);
}

public function addUsage(string $usage): static
{
$this->command->addUsage($usage);

return $this;
}

public function getUsages(): array
{
return $this->command->getUsages();
}

public function getHelper(string $name): HelperInterface
{
return $this->command->getHelper($name);
}

public function run(InputInterface $input, OutputInterface $output): int
{
$this->input = $input;
$this->output = $output;
$this->arguments = $input->getArguments();
$this->options = $input->getOptions();
$event = $this->stopwatch->start($this->getName(), 'command');

try {
$this->exitCode = $this->command->run($input, $output);
} finally {
$event->stop();

if ($output instanceof ConsoleOutputInterface && $output->isDebug()) {
$output->getErrorOutput()->writeln((string) $event);
}

$this->duration = $event->getDuration().' ms';
$this->maxMemoryUsage = ($event->getMemory() >> 20).' MiB';

if ($this->isInteractive) {
$this->extractInteractiveInputs($input->getArguments(), $input->getOptions());
}
}

return $this->exitCode;
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
$event = $this->stopwatch->start($this->getName().'.init', 'command');

$this->command->initialize($input, $output);

$event->stop();
}

protected function interact(InputInterface $input, OutputInterface $output): void
{
if (!$this->isInteractive = Command::class !== (new \ReflectionMethod($this->command, 'interact'))->getDeclaringClass()->getName()) {
return;
}

$event = $this->stopwatch->start($this->getName().'.interact', 'command');

$this->command->interact($input, $output);

$event->stop();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$event = $this->stopwatch->start($this->getName().'.execute', 'command');

$exitCode = $this->command->execute($input, $output);

$event->stop();

return $exitCode;
}

private function extractInteractiveInputs(array $arguments, array $options): void
{
foreach ($arguments as $argName => $argValue) {
if (\array_key_exists($argName, $this->arguments) && $this->arguments[$argName] === $argValue) {
continue;
}

$this->interactiveInputs[$argName] = $argValue;
}

foreach ($options as $optName => $optValue) {
if (\array_key_exists($optName, $this->options) && $this->options[$optName] === $optValue) {
continue;
}

$this->interactiveInputs['--'.$optName] = $optValue;
}
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Output\BashCompletionOutput;
use Symfony\Component\Console\Completion\Output\CompletionOutputInterface;
use Symfony\Component\Console\Completion\Output\FishCompletionOutput;
use Symfony\Component\Console\Completion\Output\ZshCompletionOutput;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;






#[AsCommand(name: '|_complete', description: 'Internal command to provide shell completion suggestions')]
final class CompleteCommand extends Command
{
public const COMPLETION_API_VERSION = '1';




protected static $defaultName = '|_complete';




protected static $defaultDescription = 'Internal command to provide shell completion suggestions';

private array $completionOutputs;

private bool $isDebug = false;




public function __construct(array $completionOutputs = [])
{

$this->completionOutputs = $completionOutputs + [
'bash' => BashCompletionOutput::class,
'fish' => FishCompletionOutput::class,
'zsh' => ZshCompletionOutput::class,
];

parent::__construct();
}

protected function configure(): void
{
$this
->addOption('shell', 's', InputOption::VALUE_REQUIRED, 'The shell type ("'.implode('", "', array_keys($this->completionOutputs)).'")')
->addOption('input', 'i', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'An array of input tokens (e.g. COMP_WORDS or argv)')
->addOption('current', 'c', InputOption::VALUE_REQUIRED, 'The index of the "input" array that the cursor is in (e.g. COMP_CWORD)')
->addOption('api-version', 'a', InputOption::VALUE_REQUIRED, 'The API version of the completion script')
->addOption('symfony', 'S', InputOption::VALUE_REQUIRED, 'deprecated')
;
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
$this->isDebug = filter_var(getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOL);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
try {

$version = $input->getOption('symfony') ? '1' : $input->getOption('api-version');
if ($version && version_compare($version, self::COMPLETION_API_VERSION, '<')) {
$message = \sprintf('Completion script version is not supported ("%s" given, ">=%s" required).', $version, self::COMPLETION_API_VERSION);
$this->log($message);

$output->writeln($message.' Install the Symfony completion script again by using the "completion" command.');

return 126;
}

$shell = $input->getOption('shell');
if (!$shell) {
throw new \RuntimeException('The "--shell" option must be set.');
}

if (!$completionOutput = $this->completionOutputs[$shell] ?? false) {
throw new \RuntimeException(\sprintf('Shell completion is not supported for your shell: "%s" (supported: "%s").', $shell, implode('", "', array_keys($this->completionOutputs))));
}

$completionInput = $this->createCompletionInput($input);
$suggestions = new CompletionSuggestions();

$this->log([
'',
'<comment>'.date('Y-m-d H:i:s').'</>',
'<info>Input:</> <comment>("|" indicates the cursor position)</>',
'  '.(string) $completionInput,
'<info>Command:</>',
'  '.(string) implode(' ', $_SERVER['argv']),
'<info>Messages:</>',
]);

$command = $this->findCommand($completionInput, $output);
if (null === $command) {
$this->log('  No command found, completing using the Application class.');

$this->getApplication()->complete($completionInput, $suggestions);
} elseif (
$completionInput->mustSuggestArgumentValuesFor('command')
&& $command->getName() !== $completionInput->getCompletionValue()
&& !\in_array($completionInput->getCompletionValue(), $command->getAliases(), true)
) {
$this->log('  No command found, completing using the Application class.');


$suggestions->suggestValues(array_filter(array_merge([$command->getName()], $command->getAliases())));
} else {
$command->mergeApplicationDefinition();
$completionInput->bind($command->getDefinition());

if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) {
$this->log('  Completing option names for the <comment>'.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.'</> command.');

$suggestions->suggestOptions($command->getDefinition()->getOptions());
} else {
$this->log([
'  Completing using the <comment>'.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.'</> class.',
'  Completing <comment>'.$completionInput->getCompletionType().'</> for <comment>'.$completionInput->getCompletionName().'</>',
]);
if (null !== $compval = $completionInput->getCompletionValue()) {
$this->log('  Current value: <comment>'.$compval.'</>');
}

$command->complete($completionInput, $suggestions);
}
}


$completionOutput = new $completionOutput();

$this->log('<info>Suggestions:</>');
if ($options = $suggestions->getOptionSuggestions()) {
$this->log('  --'.implode(' --', array_map(fn ($o) => $o->getName(), $options)));
} elseif ($values = $suggestions->getValueSuggestions()) {
$this->log('  '.implode(' ', $values));
} else {
$this->log('  <comment>No suggestions were provided</>');
}

$completionOutput->write($suggestions, $output);
} catch (\Throwable $e) {
$this->log([
'<error>Error!</error>',
(string) $e,
]);

if ($output->isDebug()) {
throw $e;
}

return 2;
}

return 0;
}

private function createCompletionInput(InputInterface $input): CompletionInput
{
$currentIndex = $input->getOption('current');
if (!$currentIndex || !ctype_digit($currentIndex)) {
throw new \RuntimeException('The "--current" option must be set and it must be an integer.');
}

$completionInput = CompletionInput::fromTokens($input->getOption('input'), (int) $currentIndex);

try {
$completionInput->bind($this->getApplication()->getDefinition());
} catch (ExceptionInterface) {
}

return $completionInput;
}

private function findCommand(CompletionInput $completionInput, OutputInterface $output): ?Command
{
try {
$inputName = $completionInput->getFirstArgument();
if (null === $inputName) {
return null;
}

return $this->getApplication()->find($inputName);
} catch (CommandNotFoundException) {
}

return null;
}

private function log($messages): void
{
if (!$this->isDebug) {
return;
}

$commandName = basename($_SERVER['argv'][0]);
file_put_contents(sys_get_temp_dir().'/sf_'.$commandName.'.log', implode(\PHP_EOL, (array) $messages).\PHP_EOL, \FILE_APPEND);
}
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Descriptor\ApplicationDescription;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;






class ListCommand extends Command
{



protected function configure()
{
$this
->setName('list')
->setDefinition([
new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn () => array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())),
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()),
new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments'),
])
->setDescription('List commands')
->setHelp(<<<'EOF'
The <info>%command.name%</info> command lists all commands:

  <info>%command.full_name%</info>

You can also display the commands for a specific namespace:

  <info>%command.full_name% test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>%command.full_name% --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>%command.full_name% --raw</info>
EOF
)
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$helper = new DescriptorHelper();
$helper->describe($output, $this->getApplication(), [
'format' => $input->getOption('format'),
'raw_text' => $input->getOption('raw'),
'namespace' => $input->getArgument('namespace'),
'short' => $input->getOption('short'),
]);

return 0;
}
}
<?php










namespace Symfony\Component\Console\Command;






interface SignalableCommandInterface
{



public function getSubscribedSignals(): array;








public function handleSignal(int $signal);
}
<?php










namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Exception\ExceptionInterface;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Helper\HelperInterface;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;






class Command
{

public const SUCCESS = 0;
public const FAILURE = 1;
public const INVALID = 2;






protected static $defaultName;






protected static $defaultDescription;

private ?Application $application = null;
private ?string $name = null;
private ?string $processTitle = null;
private array $aliases = [];
private InputDefinition $definition;
private bool $hidden = false;
private string $help = '';
private string $description = '';
private ?InputDefinition $fullDefinition = null;
private bool $ignoreValidationErrors = false;
private ?\Closure $code = null;
private array $synopsis = [];
private array $usages = [];
private ?HelperSet $helperSet = null;

public static function getDefaultName(): ?string
{
$class = static::class;

if ($attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) {
return $attribute[0]->newInstance()->name;
}

$r = new \ReflectionProperty($class, 'defaultName');

if ($class !== $r->class || null === static::$defaultName) {
return null;
}

trigger_deprecation('symfony/console', '6.1', 'Relying on the static property "$defaultName" for setting a command name is deprecated. Add the "%s" attribute to the "%s" class instead.', AsCommand::class, static::class);

return static::$defaultName;
}

public static function getDefaultDescription(): ?string
{
$class = static::class;

if ($attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class)) {
return $attribute[0]->newInstance()->description;
}

$r = new \ReflectionProperty($class, 'defaultDescription');

if ($class !== $r->class || null === static::$defaultDescription) {
return null;
}

trigger_deprecation('symfony/console', '6.1', 'Relying on the static property "$defaultDescription" for setting a command description is deprecated. Add the "%s" attribute to the "%s" class instead.', AsCommand::class, static::class);

return static::$defaultDescription;
}






public function __construct(?string $name = null)
{
$this->definition = new InputDefinition();

if (null === $name && null !== $name = static::getDefaultName()) {
$aliases = explode('|', $name);

if ('' === $name = array_shift($aliases)) {
$this->setHidden(true);
$name = array_shift($aliases);
}

$this->setAliases($aliases);
}

if (null !== $name) {
$this->setName($name);
}

if ('' === $this->description) {
$this->setDescription(static::getDefaultDescription() ?? '');
}

$this->configure();
}








public function ignoreValidationErrors()
{
$this->ignoreValidationErrors = true;
}




public function setApplication(?Application $application = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->application = $application;
if ($application) {
$this->setHelperSet($application->getHelperSet());
} else {
$this->helperSet = null;
}

$this->fullDefinition = null;
}




public function setHelperSet(HelperSet $helperSet)
{
$this->helperSet = $helperSet;
}




public function getHelperSet(): ?HelperSet
{
return $this->helperSet;
}




public function getApplication(): ?Application
{
return $this->application;
}









public function isEnabled()
{
return true;
}






protected function configure()
{
}















protected function execute(InputInterface $input, OutputInterface $output)
{
throw new LogicException('You must override the execute() method in the concrete command class.');
}










protected function interact(InputInterface $input, OutputInterface $output)
{
}













protected function initialize(InputInterface $input, OutputInterface $output)
{
}















public function run(InputInterface $input, OutputInterface $output): int
{

$this->mergeApplicationDefinition();


try {
$input->bind($this->getDefinition());
} catch (ExceptionInterface $e) {
if (!$this->ignoreValidationErrors) {
throw $e;
}
}

$this->initialize($input, $output);

if (null !== $this->processTitle) {
if (\function_exists('cli_set_process_title')) {
if (!@cli_set_process_title($this->processTitle)) {
if ('Darwin' === \PHP_OS) {
$output->writeln('<comment>Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.</comment>', OutputInterface::VERBOSITY_VERY_VERBOSE);
} else {
cli_set_process_title($this->processTitle);
}
}
} elseif (\function_exists('setproctitle')) {
setproctitle($this->processTitle);
} elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
$output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
}
}

if ($input->isInteractive()) {
$this->interact($input, $output);
}




if ($input->hasArgument('command') && null === $input->getArgument('command')) {
$input->setArgument('command', $this->getName());
}

$input->validate();

if ($this->code) {
$statusCode = ($this->code)($input, $output);
} else {
$statusCode = $this->execute($input, $output);

if (!\is_int($statusCode)) {
throw new \TypeError(\sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, get_debug_type($statusCode)));
}
}

return is_numeric($statusCode) ? (int) $statusCode : 0;
}




public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
$definition = $this->getDefinition();
if (CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType() && $definition->hasOption($input->getCompletionName())) {
$definition->getOption($input->getCompletionName())->complete($input, $suggestions);
} elseif (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && $definition->hasArgument($input->getCompletionName())) {
$definition->getArgument($input->getCompletionName())->complete($input, $suggestions);
}
}















public function setCode(callable $code): static
{
if ($code instanceof \Closure) {
$r = new \ReflectionFunction($code);
if (null === $r->getClosureThis()) {
set_error_handler(static function () {});
try {
if ($c = \Closure::bind($code, $this)) {
$code = $c;
}
} finally {
restore_error_handler();
}
}
} else {
$code = $code(...);
}

$this->code = $code;

return $this;
}










public function mergeApplicationDefinition(bool $mergeArgs = true): void
{
if (null === $this->application) {
return;
}

$this->fullDefinition = new InputDefinition();
$this->fullDefinition->setOptions($this->definition->getOptions());
$this->fullDefinition->addOptions($this->application->getDefinition()->getOptions());

if ($mergeArgs) {
$this->fullDefinition->setArguments($this->application->getDefinition()->getArguments());
$this->fullDefinition->addArguments($this->definition->getArguments());
} else {
$this->fullDefinition->setArguments($this->definition->getArguments());
}
}






public function setDefinition(array|InputDefinition $definition): static
{
if ($definition instanceof InputDefinition) {
$this->definition = $definition;
} else {
$this->definition->setDefinition($definition);
}

$this->fullDefinition = null;

return $this;
}




public function getDefinition(): InputDefinition
{
return $this->fullDefinition ?? $this->getNativeDefinition();
}









public function getNativeDefinition(): InputDefinition
{
return $this->definition ?? throw new LogicException(\sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class));
}












public function addArgument(string $name, ?int $mode = null, string $description = '', mixed $default = null ): static
{
$suggestedValues = 5 <= \func_num_args() ? func_get_arg(4) : [];
if (!\is_array($suggestedValues) && !$suggestedValues instanceof \Closure) {
throw new \TypeError(\sprintf('Argument 5 passed to "%s()" must be array or \Closure, "%s" given.', __METHOD__, get_debug_type($suggestedValues)));
}
$this->definition->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues));
$this->fullDefinition?->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues));

return $this;
}













public function addOption(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', mixed $default = null ): static
{
$suggestedValues = 6 <= \func_num_args() ? func_get_arg(5) : [];
if (!\is_array($suggestedValues) && !$suggestedValues instanceof \Closure) {
throw new \TypeError(\sprintf('Argument 5 passed to "%s()" must be array or \Closure, "%s" given.', __METHOD__, get_debug_type($suggestedValues)));
}
$this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues));
$this->fullDefinition?->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues));

return $this;
}













public function setName(string $name): static
{
$this->validateName($name);

$this->name = $name;

return $this;
}









public function setProcessTitle(string $title): static
{
$this->processTitle = $title;

return $this;
}




public function getName(): ?string
{
return $this->name;
}






public function setHidden(bool $hidden = true): static
{
$this->hidden = $hidden;

return $this;
}




public function isHidden(): bool
{
return $this->hidden;
}






public function setDescription(string $description): static
{
$this->description = $description;

return $this;
}




public function getDescription(): string
{
return $this->description;
}






public function setHelp(string $help): static
{
$this->help = $help;

return $this;
}




public function getHelp(): string
{
return $this->help;
}





public function getProcessedHelp(): string
{
$name = $this->name;
$isSingleCommand = $this->application?->isSingleCommand();

$placeholders = [
'%command.name%',
'%command.full_name%',
];
$replacements = [
$name,
$isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'].' '.$name,
];

return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());
}










public function setAliases(iterable $aliases): static
{
$list = [];

foreach ($aliases as $alias) {
$this->validateName($alias);
$list[] = $alias;
}

$this->aliases = \is_array($aliases) ? $aliases : $list;

return $this;
}




public function getAliases(): array
{
return $this->aliases;
}






public function getSynopsis(bool $short = false): string
{
$key = $short ? 'short' : 'long';

if (!isset($this->synopsis[$key])) {
$this->synopsis[$key] = trim(\sprintf('%s %s', $this->name, $this->definition->getSynopsis($short)));
}

return $this->synopsis[$key];
}






public function addUsage(string $usage): static
{
if (!str_starts_with($usage, $this->name)) {
$usage = \sprintf('%s %s', $this->name, $usage);
}

$this->usages[] = $usage;

return $this;
}




public function getUsages(): array
{
return $this->usages;
}









public function getHelper(string $name): mixed
{
if (null === $this->helperSet) {
throw new LogicException(\sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name));
}

return $this->helperSet->get($name);
}








private function validateName(string $name): void
{
if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) {
throw new InvalidArgumentException(\sprintf('Command name "%s" is invalid.', $name));
}
}
}
<?php










namespace Symfony\Component\Console\Formatter;






interface OutputFormatterStyleInterface
{





public function setForeground(?string $color);






public function setBackground(?string $color);






public function setOption(string $option);






public function unsetOption(string $option);






public function setOptions(array $options);




public function apply(string $text): string;
}
<?php










namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Contracts\Service\ResetInterface;




class OutputFormatterStyleStack implements ResetInterface
{



private array $styles = [];

private OutputFormatterStyleInterface $emptyStyle;

public function __construct(?OutputFormatterStyleInterface $emptyStyle = null)
{
$this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle();
$this->reset();
}






public function reset()
{
$this->styles = [];
}






public function push(OutputFormatterStyleInterface $style)
{
$this->styles[] = $style;
}






public function pop(?OutputFormatterStyleInterface $style = null): OutputFormatterStyleInterface
{
if (!$this->styles) {
return $this->emptyStyle;
}

if (null === $style) {
return array_pop($this->styles);
}

foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
if ($style->apply('') === $stackedStyle->apply('')) {
$this->styles = \array_slice($this->styles, 0, $index);

return $stackedStyle;
}
}

throw new InvalidArgumentException('Incorrectly nested style tag found.');
}




public function getCurrent(): OutputFormatterStyleInterface
{
if (!$this->styles) {
return $this->emptyStyle;
}

return $this->styles[\count($this->styles) - 1];
}




public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle): static
{
$this->emptyStyle = $emptyStyle;

return $this;
}

public function getEmptyStyle(): OutputFormatterStyleInterface
{
return $this->emptyStyle;
}
}
<?php










namespace Symfony\Component\Console\Formatter;




final class NullOutputFormatterStyle implements OutputFormatterStyleInterface
{
public function apply(string $text): string
{
return $text;
}

public function setBackground(?string $color = null): void
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}

}

public function setForeground(?string $color = null): void
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}

}

public function setOption(string $option): void
{

}

public function setOptions(array $options): void
{

}

public function unsetOption(string $option): void
{

}
}
<?php










namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Color;






class OutputFormatterStyle implements OutputFormatterStyleInterface
{
private Color $color;
private string $foreground;
private string $background;
private array $options;
private ?string $href = null;
private bool $handlesHrefGracefully;







public function __construct(?string $foreground = null, ?string $background = null, array $options = [])
{
$this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options);
}




public function setForeground(?string $color = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options);
}




public function setBackground(?string $color = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options);
}

public function setHref(string $url): void
{
$this->href = $url;
}




public function setOption(string $option)
{
$this->options[] = $option;
$this->color = new Color($this->foreground, $this->background, $this->options);
}




public function unsetOption(string $option)
{
$pos = array_search($option, $this->options);
if (false !== $pos) {
unset($this->options[$pos]);
}

$this->color = new Color($this->foreground, $this->background, $this->options);
}




public function setOptions(array $options)
{
$this->color = new Color($this->foreground, $this->background, $this->options = $options);
}

public function apply(string $text): string
{
$this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR')
&& (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100)
&& !isset($_SERVER['IDEA_INITIAL_DIRECTORY']);

if (null !== $this->href && $this->handlesHrefGracefully) {
$text = "\033]8;;$this->href\033\\$text\033]8;;\033\\";
}

return $this->color->apply($text);
}
}
<?php










namespace Symfony\Component\Console\Formatter;




final class NullOutputFormatter implements OutputFormatterInterface
{
private NullOutputFormatterStyle $style;

public function format(?string $message): ?string
{
return null;
}

public function getStyle(string $name): OutputFormatterStyleInterface
{

return $this->style ??= new NullOutputFormatterStyle();
}

public function hasStyle(string $name): bool
{
return false;
}

public function isDecorated(): bool
{
return false;
}

public function setDecorated(bool $decorated): void
{

}

public function setStyle(string $name, OutputFormatterStyleInterface $style): void
{

}
}
<?php










namespace Symfony\Component\Console\Formatter;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Helper\Helper;

use function Symfony\Component\String\b;







class OutputFormatter implements WrappableOutputFormatterInterface
{
private bool $decorated;
private array $styles = [];
private OutputFormatterStyleStack $styleStack;

public function __clone()
{
$this->styleStack = clone $this->styleStack;
foreach ($this->styles as $key => $value) {
$this->styles[$key] = clone $value;
}
}




public static function escape(string $text): string
{
$text = preg_replace('/([^\\\\]|^)([<>])/', '$1\\\\$2', $text);

return self::escapeTrailingBackslash($text);
}






public static function escapeTrailingBackslash(string $text): string
{
if (str_ends_with($text, '\\')) {
$len = \strlen($text);
$text = rtrim($text, '\\');
$text = str_replace("\0", '', $text);
$text .= str_repeat("\0", $len - \strlen($text));
}

return $text;
}






public function __construct(bool $decorated = false, array $styles = [])
{
$this->decorated = $decorated;

$this->setStyle('error', new OutputFormatterStyle('white', 'red'));
$this->setStyle('info', new OutputFormatterStyle('green'));
$this->setStyle('comment', new OutputFormatterStyle('yellow'));
$this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));

foreach ($styles as $name => $style) {
$this->setStyle($name, $style);
}

$this->styleStack = new OutputFormatterStyleStack();
}




public function setDecorated(bool $decorated)
{
$this->decorated = $decorated;
}

public function isDecorated(): bool
{
return $this->decorated;
}




public function setStyle(string $name, OutputFormatterStyleInterface $style)
{
$this->styles[strtolower($name)] = $style;
}

public function hasStyle(string $name): bool
{
return isset($this->styles[strtolower($name)]);
}

public function getStyle(string $name): OutputFormatterStyleInterface
{
if (!$this->hasStyle($name)) {
throw new InvalidArgumentException(\sprintf('Undefined style: "%s".', $name));
}

return $this->styles[strtolower($name)];
}

public function format(?string $message): ?string
{
return $this->formatAndWrap($message, 0);
}




public function formatAndWrap(?string $message, int $width)
{
if (null === $message) {
return '';
}

$offset = 0;
$output = '';
$openTagRegex = '[a-z](?:[^\\\\<>]*+ | \\\\.)*';
$closeTagRegex = '[a-z][^<>]*+';
$currentLineLength = 0;
preg_match_all("#<(($openTagRegex) | /($closeTagRegex)?)>#ix", $message, $matches, \PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $i => $match) {
$pos = $match[1];
$text = $match[0];

if (0 != $pos && '\\' == $message[$pos - 1]) {
continue;
}


$pos = Helper::length(substr($message, 0, $pos));

$output .= $this->applyCurrentStyle(Helper::substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength);
$offset = $pos + Helper::length($text);


if ($open = '/' !== $text[1]) {
$tag = $matches[1][$i][0];
} else {
$tag = $matches[3][$i][0] ?? '';
}

if (!$open && !$tag) {

$this->styleStack->pop();
} elseif (null === $style = $this->createStyleFromString($tag)) {
$output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength);
} elseif ($open) {
$this->styleStack->push($style);
} else {
$this->styleStack->pop($style);
}
}

$output .= $this->applyCurrentStyle(Helper::substr($message, $offset), $output, $width, $currentLineLength);

return strtr($output, ["\0" => '\\', '\\<' => '<', '\\>' => '>']);
}

public function getStyleStack(): OutputFormatterStyleStack
{
return $this->styleStack;
}




private function createStyleFromString(string $string): ?OutputFormatterStyleInterface
{
if (isset($this->styles[$string])) {
return $this->styles[$string];
}

if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) {
return null;
}

$style = new OutputFormatterStyle();
foreach ($matches as $match) {
array_shift($match);
$match[0] = strtolower($match[0]);

if ('fg' == $match[0]) {
$style->setForeground(strtolower($match[1]));
} elseif ('bg' == $match[0]) {
$style->setBackground(strtolower($match[1]));
} elseif ('href' === $match[0]) {
$url = preg_replace('{\\\\([<>])}', '$1', $match[1]);
$style->setHref($url);
} elseif ('options' === $match[0]) {
preg_match_all('([^,;]+)', strtolower($match[1]), $options);
$options = array_shift($options);
foreach ($options as $option) {
$style->setOption($option);
}
} else {
return null;
}
}

return $style;
}




private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength): string
{
if ('' === $text) {
return '';
}

if (!$width) {
return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text;
}

if (!$currentLineLength && '' !== $current) {
$text = ltrim($text);
}

if ($currentLineLength) {
$lines = explode("\n", $text, 2);
$prefix = Helper::substr($lines[0], 0, $i = $width - $currentLineLength)."\n";
$text = Helper::substr($lines[0], $i);

if (isset($lines[1])) {

if ('' !== $text) {
$text .= "\n";
}

$text .= $lines[1];
}
} else {
$prefix = '';
}

preg_match('~(\\n)$~', $text, $matches);
$text = $prefix.$this->addLineBreaks($text, $width);
$text = rtrim($text, "\n").($matches[1] ?? '');

if (!$currentLineLength && '' !== $current && !str_ends_with($current, "\n")) {
$text = "\n".$text;
}

$lines = explode("\n", $text);

foreach ($lines as $i => $line) {
$currentLineLength = 0 === $i ? $currentLineLength + Helper::length($line) : Helper::length($line);
if ($width <= $currentLineLength) {
$currentLineLength = 0;
}
}

if ($this->isDecorated()) {
foreach ($lines as $i => $line) {
$lines[$i] = $this->styleStack->getCurrent()->apply($line);
}
}

return implode("\n", $lines);
}

private function addLineBreaks(string $text, int $width): string
{
$encoding = mb_detect_encoding($text, null, true) ?: 'UTF-8';

return b($text)->toUnicodeString($encoding)->wordwrap($width, "\n", true)->toByteString($encoding);
}
}
<?php










namespace Symfony\Component\Console\Formatter;






interface WrappableOutputFormatterInterface extends OutputFormatterInterface
{





public function formatAndWrap(?string $message, int $width);
}
<?php










namespace Symfony\Component\Console\Formatter;






interface OutputFormatterInterface
{





public function setDecorated(bool $decorated);




public function isDecorated(): bool;






public function setStyle(string $name, OutputFormatterStyleInterface $style);




public function hasStyle(string $name): bool;






public function getStyle(string $name): OutputFormatterStyleInterface;




public function format(?string $message): ?string;
}
<?php










namespace Symfony\Component\Console\Debug;

use Symfony\Component\Console\Command\TraceableCommand;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;




final class CliRequest extends Request
{
public function __construct(
public readonly TraceableCommand $command,
) {
parent::__construct(
attributes: ['_controller' => \get_class($command->command), '_virtual_type' => 'command'],
server: $_SERVER,
);
}


public function getUri(): string
{
if ($this->server->has('SYMFONY_CLI_BINARY_NAME')) {
$binary = $this->server->get('SYMFONY_CLI_BINARY_NAME').' console';
} else {
$binary = $this->server->get('argv')[0];
}

return $binary.' '.$this->command->input;
}

public function getMethod(): string
{
return $this->command->isInteractive ? 'INTERACTIVE' : 'BATCH';
}

public function getResponse(): Response
{
return new class($this->command->exitCode) extends Response {
public function __construct(private readonly int $exitCode)
{
parent::__construct();
}

public function getStatusCode(): int
{
return $this->exitCode;
}
};
}

public function getClientIp(): string
{
$application = $this->command->getApplication();

return $application->getName().' '.$application->getVersion();
}
}
<?php










namespace Symfony\Component\Console\DataCollector;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Debug\CliRequest;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\SignalRegistry\SignalMap;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\VarDumper\Cloner\Data;






final class CommandDataCollector extends DataCollector
{
public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
if (!$request instanceof CliRequest) {
return;
}

$command = $request->command;
$application = $command->getApplication();

$this->data = [
'command' => $this->cloneVar($command->command),
'exit_code' => $command->exitCode,
'interrupted_by_signal' => $command->interruptedBySignal,
'duration' => $command->duration,
'max_memory_usage' => $command->maxMemoryUsage,
'verbosity_level' => match ($command->output->getVerbosity()) {
OutputInterface::VERBOSITY_QUIET => 'quiet',
OutputInterface::VERBOSITY_NORMAL => 'normal',
OutputInterface::VERBOSITY_VERBOSE => 'verbose',
OutputInterface::VERBOSITY_VERY_VERBOSE => 'very verbose',
OutputInterface::VERBOSITY_DEBUG => 'debug',
},
'interactive' => $command->isInteractive,
'validate_input' => !$command->ignoreValidation,
'enabled' => $command->isEnabled(),
'visible' => !$command->isHidden(),
'input' => $this->cloneVar($command->input),
'output' => $this->cloneVar($command->output),
'interactive_inputs' => array_map($this->cloneVar(...), $command->interactiveInputs),
'signalable' => $command->getSubscribedSignals(),
'handled_signals' => $command->handledSignals,
'helper_set' => array_map($this->cloneVar(...), iterator_to_array($command->getHelperSet())),
];

$baseDefinition = $application->getDefinition();

foreach ($command->arguments as $argName => $argValue) {
if ($baseDefinition->hasArgument($argName)) {
$this->data['application_inputs'][$argName] = $this->cloneVar($argValue);
} else {
$this->data['arguments'][$argName] = $this->cloneVar($argValue);
}
}

foreach ($command->options as $optName => $optValue) {
if ($baseDefinition->hasOption($optName)) {
$this->data['application_inputs']['--'.$optName] = $this->cloneVar($optValue);
} else {
$this->data['options'][$optName] = $this->cloneVar($optValue);
}
}
}

public function getName(): string
{
return 'command';
}









public function getCommand(): array
{
$class = $this->data['command']->getType();
$r = new \ReflectionMethod($class, 'execute');

if (Command::class !== $r->getDeclaringClass()) {
return [
'executor' => $class.'::'.$r->name,
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];
}

$r = new \ReflectionClass($class);

return [
'class' => $class,
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];
}

public function getInterruptedBySignal(): ?string
{
if (isset($this->data['interrupted_by_signal'])) {
return \sprintf('%s (%d)', SignalMap::getSignalName($this->data['interrupted_by_signal']), $this->data['interrupted_by_signal']);
}

return null;
}

public function getDuration(): string
{
return $this->data['duration'];
}

public function getMaxMemoryUsage(): string
{
return $this->data['max_memory_usage'];
}

public function getVerbosityLevel(): string
{
return $this->data['verbosity_level'];
}

public function getInteractive(): bool
{
return $this->data['interactive'];
}

public function getValidateInput(): bool
{
return $this->data['validate_input'];
}

public function getEnabled(): bool
{
return $this->data['enabled'];
}

public function getVisible(): bool
{
return $this->data['visible'];
}

public function getInput(): Data
{
return $this->data['input'];
}

public function getOutput(): Data
{
return $this->data['output'];
}




public function getArguments(): array
{
return $this->data['arguments'] ?? [];
}




public function getOptions(): array
{
return $this->data['options'] ?? [];
}




public function getApplicationInputs(): array
{
return $this->data['application_inputs'] ?? [];
}




public function getInteractiveInputs(): array
{
return $this->data['interactive_inputs'] ?? [];
}

public function getSignalable(): array
{
return array_map(
static fn (int $signal): string => \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal),
$this->data['signalable']
);
}

public function getHandledSignals(): array
{
$keys = array_map(
static fn (int $signal): string => \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal),
array_keys($this->data['handled_signals'])
);

return array_combine($keys, array_values($this->data['handled_signals']));
}




public function getHelperSet(): array
{
return $this->data['helper_set'] ?? [];
}

public function reset(): void
{
$this->data = [];
}
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;












abstract class Input implements InputInterface, StreamableInputInterface
{
protected $definition;

protected $stream;
protected $options = [];
protected $arguments = [];
protected $interactive = true;

public function __construct(?InputDefinition $definition = null)
{
if (null === $definition) {
$this->definition = new InputDefinition();
} else {
$this->bind($definition);
$this->validate();
}
}




public function bind(InputDefinition $definition)
{
$this->arguments = [];
$this->options = [];
$this->definition = $definition;

$this->parse();
}






abstract protected function parse();




public function validate()
{
$definition = $this->definition;
$givenArguments = $this->arguments;

$missingArguments = array_filter(array_keys($definition->getArguments()), fn ($argument) => !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired());

if (\count($missingArguments) > 0) {
throw new RuntimeException(\sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments)));
}
}

public function isInteractive(): bool
{
return $this->interactive;
}




public function setInteractive(bool $interactive)
{
$this->interactive = $interactive;
}

public function getArguments(): array
{
return array_merge($this->definition->getArgumentDefaults(), $this->arguments);
}

public function getArgument(string $name): mixed
{
if (!$this->definition->hasArgument($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
}

return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault();
}




public function setArgument(string $name, mixed $value)
{
if (!$this->definition->hasArgument($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
}

$this->arguments[$name] = $value;
}

public function hasArgument(string $name): bool
{
return $this->definition->hasArgument($name);
}

public function getOptions(): array
{
return array_merge($this->definition->getOptionDefaults(), $this->options);
}

public function getOption(string $name): mixed
{
if ($this->definition->hasNegation($name)) {
if (null === $value = $this->getOption($this->definition->negationToName($name))) {
return $value;
}

return !$value;
}

if (!$this->definition->hasOption($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name));
}

return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
}




public function setOption(string $name, mixed $value)
{
if ($this->definition->hasNegation($name)) {
$this->options[$this->definition->negationToName($name)] = !$value;

return;
} elseif (!$this->definition->hasOption($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name));
}

$this->options[$name] = $value;
}

public function hasOption(string $name): bool
{
return $this->definition->hasOption($name) || $this->definition->hasNegation($name);
}




public function escapeToken(string $token): string
{
return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
}






public function setStream($stream)
{
$this->stream = $stream;
}




public function getStream()
{
return $this->stream;
}
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;









interface InputInterface
{



public function getFirstArgument(): ?string;












public function hasParameterOption(string|array $values, bool $onlyParams = false): bool;















public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false);








public function bind(InputDefinition $definition);








public function validate();






public function getArguments(): array;








public function getArgument(string $name);








public function setArgument(string $name, mixed $value);




public function hasArgument(string $name): bool;






public function getOptions(): array;








public function getOption(string $name);








public function setOption(string $name, mixed $value);




public function hasOption(string $name): bool;




public function isInteractive(): bool;






public function setInteractive(bool $interactive);
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;






class InputArgument
{
public const REQUIRED = 1;
public const OPTIONAL = 2;
public const IS_ARRAY = 4;

private string $name;
private int $mode;
private string|int|bool|array|float|null $default;
private array|\Closure $suggestedValues;
private string $description;










public function __construct(string $name, ?int $mode = null, string $description = '', string|bool|int|float|array|null $default = null, \Closure|array $suggestedValues = [])
{
if (null === $mode) {
$mode = self::OPTIONAL;
} elseif ($mode > 7 || $mode < 1) {
throw new InvalidArgumentException(\sprintf('Argument mode "%s" is not valid.', $mode));
}

$this->name = $name;
$this->mode = $mode;
$this->description = $description;
$this->suggestedValues = $suggestedValues;

$this->setDefault($default);
}




public function getName(): string
{
return $this->name;
}






public function isRequired(): bool
{
return self::REQUIRED === (self::REQUIRED & $this->mode);
}






public function isArray(): bool
{
return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
}








public function setDefault(string|bool|int|float|array|null $default = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
if ($this->isRequired() && null !== $default) {
throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
}

if ($this->isArray()) {
if (null === $default) {
$default = [];
} elseif (!\is_array($default)) {
throw new LogicException('A default value for an array argument must be an array.');
}
}

$this->default = $default;
}




public function getDefault(): string|bool|int|float|array|null
{
return $this->default;
}

public function hasCompletion(): bool
{
return [] !== $this->suggestedValues;
}






public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
$values = $this->suggestedValues;
if ($values instanceof \Closure && !\is_array($values = $values($input))) {
throw new LogicException(\sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->name, get_debug_type($values)));
}
if ($values) {
$suggestions->suggestValues($values);
}
}




public function getDescription(): string
{
return $this->description;
}
}
<?php










namespace Symfony\Component\Console\Input;







interface InputAwareInterface
{





public function setInput(InputInterface $input);
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;













class InputDefinition
{
private array $arguments = [];
private int $requiredCount = 0;
private ?InputArgument $lastArrayArgument = null;
private ?InputArgument $lastOptionalArgument = null;
private array $options = [];
private array $negations = [];
private array $shortcuts = [];




public function __construct(array $definition = [])
{
$this->setDefinition($definition);
}






public function setDefinition(array $definition)
{
$arguments = [];
$options = [];
foreach ($definition as $item) {
if ($item instanceof InputOption) {
$options[] = $item;
} else {
$arguments[] = $item;
}
}

$this->setArguments($arguments);
$this->setOptions($options);
}








public function setArguments(array $arguments = [])
{
$this->arguments = [];
$this->requiredCount = 0;
$this->lastOptionalArgument = null;
$this->lastArrayArgument = null;
$this->addArguments($arguments);
}








public function addArguments(?array $arguments = [])
{
if (null !== $arguments) {
foreach ($arguments as $argument) {
$this->addArgument($argument);
}
}
}






public function addArgument(InputArgument $argument)
{
if (isset($this->arguments[$argument->getName()])) {
throw new LogicException(\sprintf('An argument with name "%s" already exists.', $argument->getName()));
}

if (null !== $this->lastArrayArgument) {
throw new LogicException(\sprintf('Cannot add a required argument "%s" after an array argument "%s".', $argument->getName(), $this->lastArrayArgument->getName()));
}

if ($argument->isRequired() && null !== $this->lastOptionalArgument) {
throw new LogicException(\sprintf('Cannot add a required argument "%s" after an optional one "%s".', $argument->getName(), $this->lastOptionalArgument->getName()));
}

if ($argument->isArray()) {
$this->lastArrayArgument = $argument;
}

if ($argument->isRequired()) {
++$this->requiredCount;
} else {
$this->lastOptionalArgument = $argument;
}

$this->arguments[$argument->getName()] = $argument;
}






public function getArgument(string|int $name): InputArgument
{
if (!$this->hasArgument($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
}

$arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments;

return $arguments[$name];
}




public function hasArgument(string|int $name): bool
{
$arguments = \is_int($name) ? array_values($this->arguments) : $this->arguments;

return isset($arguments[$name]);
}






public function getArguments(): array
{
return $this->arguments;
}




public function getArgumentCount(): int
{
return null !== $this->lastArrayArgument ? \PHP_INT_MAX : \count($this->arguments);
}




public function getArgumentRequiredCount(): int
{
return $this->requiredCount;
}




public function getArgumentDefaults(): array
{
$values = [];
foreach ($this->arguments as $argument) {
$values[$argument->getName()] = $argument->getDefault();
}

return $values;
}








public function setOptions(array $options = [])
{
$this->options = [];
$this->shortcuts = [];
$this->negations = [];
$this->addOptions($options);
}








public function addOptions(array $options = [])
{
foreach ($options as $option) {
$this->addOption($option);
}
}






public function addOption(InputOption $option)
{
if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName()));
}
if (isset($this->negations[$option->getName()])) {
throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName()));
}

if ($option->getShortcut()) {
foreach (explode('|', $option->getShortcut()) as $shortcut) {
if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {
throw new LogicException(\sprintf('An option with shortcut "%s" already exists.', $shortcut));
}
}
}

$this->options[$option->getName()] = $option;
if ($option->getShortcut()) {
foreach (explode('|', $option->getShortcut()) as $shortcut) {
$this->shortcuts[$shortcut] = $option->getName();
}
}

if ($option->isNegatable()) {
$negatedName = 'no-'.$option->getName();
if (isset($this->options[$negatedName])) {
throw new LogicException(\sprintf('An option named "%s" already exists.', $negatedName));
}
$this->negations[$negatedName] = $option->getName();
}
}






public function getOption(string $name): InputOption
{
if (!$this->hasOption($name)) {
throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $name));
}

return $this->options[$name];
}







public function hasOption(string $name): bool
{
return isset($this->options[$name]);
}






public function getOptions(): array
{
return $this->options;
}




public function hasShortcut(string $name): bool
{
return isset($this->shortcuts[$name]);
}




public function hasNegation(string $name): bool
{
return isset($this->negations[$name]);
}




public function getOptionForShortcut(string $shortcut): InputOption
{
return $this->getOption($this->shortcutToName($shortcut));
}




public function getOptionDefaults(): array
{
$values = [];
foreach ($this->options as $option) {
$values[$option->getName()] = $option->getDefault();
}

return $values;
}








public function shortcutToName(string $shortcut): string
{
if (!isset($this->shortcuts[$shortcut])) {
throw new InvalidArgumentException(\sprintf('The "-%s" option does not exist.', $shortcut));
}

return $this->shortcuts[$shortcut];
}








public function negationToName(string $negation): string
{
if (!isset($this->negations[$negation])) {
throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $negation));
}

return $this->negations[$negation];
}




public function getSynopsis(bool $short = false): string
{
$elements = [];

if ($short && $this->getOptions()) {
$elements[] = '[options]';
} elseif (!$short) {
foreach ($this->getOptions() as $option) {
$value = '';
if ($option->acceptValue()) {
$value = \sprintf(
' %s%s%s',
$option->isValueOptional() ? '[' : '',
strtoupper($option->getName()),
$option->isValueOptional() ? ']' : ''
);
}

$shortcut = $option->getShortcut() ? \sprintf('-%s|', $option->getShortcut()) : '';
$negation = $option->isNegatable() ? \sprintf('|--no-%s', $option->getName()) : '';
$elements[] = \sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation);
}
}

if (\count($elements) && $this->getArguments()) {
$elements[] = '[--]';
}

$tail = '';
foreach ($this->getArguments() as $argument) {
$element = '<'.$argument->getName().'>';
if ($argument->isArray()) {
$element .= '...';
}

if (!$argument->isRequired()) {
$element = '['.$element;
$tail .= ']';
}

$elements[] = $element;
}

return implode(' ', $elements).$tail;
}
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\RuntimeException;


























class ArgvInput extends Input
{
private array $tokens;
private array $parsed;

public function __construct(?array $argv = null, ?InputDefinition $definition = null)
{
$argv ??= $_SERVER['argv'] ?? [];


array_shift($argv);

$this->tokens = $argv;

parent::__construct($definition);
}




protected function setTokens(array $tokens)
{
$this->tokens = $tokens;
}




protected function parse()
{
$parseOptions = true;
$this->parsed = $this->tokens;
while (null !== $token = array_shift($this->parsed)) {
$parseOptions = $this->parseToken($token, $parseOptions);
}
}

protected function parseToken(string $token, bool $parseOptions): bool
{
if ($parseOptions && '' == $token) {
$this->parseArgument($token);
} elseif ($parseOptions && '--' == $token) {
return false;
} elseif ($parseOptions && str_starts_with($token, '--')) {
$this->parseLongOption($token);
} elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
$this->parseShortOption($token);
} else {
$this->parseArgument($token);
}

return $parseOptions;
}




private function parseShortOption(string $token): void
{
$name = substr($token, 1);

if (\strlen($name) > 1) {
if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {

$this->addShortOption($name[0], substr($name, 1));
} else {
$this->parseShortOptionSet($name);
}
} else {
$this->addShortOption($name, null);
}
}






private function parseShortOptionSet(string $name): void
{
$len = \strlen($name);
for ($i = 0; $i < $len; ++$i) {
if (!$this->definition->hasShortcut($name[$i])) {
$encoding = mb_detect_encoding($name, null, true);
throw new RuntimeException(\sprintf('The "-%s" option does not exist.', false === $encoding ? $name[$i] : mb_substr($name, $i, 1, $encoding)));
}

$option = $this->definition->getOptionForShortcut($name[$i]);
if ($option->acceptValue()) {
$this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));

break;
} else {
$this->addLongOption($option->getName(), null);
}
}
}




private function parseLongOption(string $token): void
{
$name = substr($token, 2);

if (false !== $pos = strpos($name, '=')) {
if ('' === $value = substr($name, $pos + 1)) {
array_unshift($this->parsed, $value);
}
$this->addLongOption(substr($name, 0, $pos), $value);
} else {
$this->addLongOption($name, null);
}
}






private function parseArgument(string $token): void
{
$c = \count($this->arguments);


if ($this->definition->hasArgument($c)) {
$arg = $this->definition->getArgument($c);
$this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token;


} elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
$arg = $this->definition->getArgument($c - 1);
$this->arguments[$arg->getName()][] = $token;


} else {
$all = $this->definition->getArguments();
$symfonyCommandName = null;
if (($inputArgument = $all[$key = array_key_first($all) ?? ''] ?? null) && 'command' === $inputArgument->getName()) {
$symfonyCommandName = $this->arguments['command'] ?? null;
unset($all[$key]);
}

if (\count($all)) {
if ($symfonyCommandName) {
$message = \sprintf('Too many arguments to "%s" command, expected arguments "%s".', $symfonyCommandName, implode('" "', array_keys($all)));
} else {
$message = \sprintf('Too many arguments, expected arguments "%s".', implode('" "', array_keys($all)));
}
} elseif ($symfonyCommandName) {
$message = \sprintf('No arguments expected for "%s" command, got "%s".', $symfonyCommandName, $token);
} else {
$message = \sprintf('No arguments expected, got "%s".', $token);
}

throw new RuntimeException($message);
}
}






private function addShortOption(string $shortcut, mixed $value): void
{
if (!$this->definition->hasShortcut($shortcut)) {
throw new RuntimeException(\sprintf('The "-%s" option does not exist.', $shortcut));
}

$this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
}






private function addLongOption(string $name, mixed $value): void
{
if (!$this->definition->hasOption($name)) {
if (!$this->definition->hasNegation($name)) {
throw new RuntimeException(\sprintf('The "--%s" option does not exist.', $name));
}

$optionName = $this->definition->negationToName($name);
if (null !== $value) {
throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name));
}
$this->options[$optionName] = false;

return;
}

$option = $this->definition->getOption($name);

if (null !== $value && !$option->acceptValue()) {
throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name));
}

if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) {


$next = array_shift($this->parsed);
if ((isset($next[0]) && '-' !== $next[0]) || \in_array($next, ['', null], true)) {
$value = $next;
} else {
array_unshift($this->parsed, $next);
}
}

if (null === $value) {
if ($option->isValueRequired()) {
throw new RuntimeException(\sprintf('The "--%s" option requires a value.', $name));
}

if (!$option->isArray() && !$option->isValueOptional()) {
$value = true;
}
}

if ($option->isArray()) {
$this->options[$name][] = $value;
} else {
$this->options[$name] = $value;
}
}

public function getFirstArgument(): ?string
{
$isOption = false;
foreach ($this->tokens as $i => $token) {
if ($token && '-' === $token[0]) {
if (str_contains($token, '=') || !isset($this->tokens[$i + 1])) {
continue;
}



$name = '-' === $token[1] ? substr($token, 2) : substr($token, -1);
if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) {

} elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) {
$isOption = true;
}

continue;
}

if ($isOption) {
$isOption = false;
continue;
}

return $token;
}

return null;
}

public function hasParameterOption(string|array $values, bool $onlyParams = false): bool
{
$values = (array) $values;

foreach ($this->tokens as $token) {
if ($onlyParams && '--' === $token) {
return false;
}
foreach ($values as $value) {



$leading = str_starts_with($value, '--') ? $value.'=' : $value;
if ($token === $value || '' !== $leading && str_starts_with($token, $leading)) {
return true;
}
}
}

return false;
}

public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false): mixed
{
$values = (array) $values;
$tokens = $this->tokens;

while (0 < \count($tokens)) {
$token = array_shift($tokens);
if ($onlyParams && '--' === $token) {
return $default;
}

foreach ($values as $value) {
if ($token === $value) {
return array_shift($tokens);
}



$leading = str_starts_with($value, '--') ? $value.'=' : $value;
if ('' !== $leading && str_starts_with($token, $leading)) {
return substr($token, \strlen($leading));
}
}
}

return $default;
}




public function __toString(): string
{
$tokens = array_map(function ($token) {
if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {
return $match[1].$this->escapeToken($match[2]);
}

if ($token && '-' !== $token[0]) {
return $this->escapeToken($token);
}

return $token;
}, $this->tokens);

return implode(' ', $tokens);
}
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\InvalidOptionException;










class ArrayInput extends Input
{
private array $parameters;

public function __construct(array $parameters, ?InputDefinition $definition = null)
{
$this->parameters = $parameters;

parent::__construct($definition);
}

public function getFirstArgument(): ?string
{
foreach ($this->parameters as $param => $value) {
if ($param && \is_string($param) && '-' === $param[0]) {
continue;
}

return $value;
}

return null;
}

public function hasParameterOption(string|array $values, bool $onlyParams = false): bool
{
$values = (array) $values;

foreach ($this->parameters as $k => $v) {
if (!\is_int($k)) {
$v = $k;
}

if ($onlyParams && '--' === $v) {
return false;
}

if (\in_array($v, $values)) {
return true;
}
}

return false;
}

public function getParameterOption(string|array $values, string|bool|int|float|array|null $default = false, bool $onlyParams = false): mixed
{
$values = (array) $values;

foreach ($this->parameters as $k => $v) {
if ($onlyParams && ('--' === $k || (\is_int($k) && '--' === $v))) {
return $default;
}

if (\is_int($k)) {
if (\in_array($v, $values)) {
return true;
}
} elseif (\in_array($k, $values)) {
return $v;
}
}

return $default;
}




public function __toString(): string
{
$params = [];
foreach ($this->parameters as $param => $val) {
if ($param && \is_string($param) && '-' === $param[0]) {
$glue = ('-' === $param[1]) ? '=' : ' ';
if (\is_array($val)) {
foreach ($val as $v) {
$params[] = $param.('' != $v ? $glue.$this->escapeToken($v) : '');
}
} else {
$params[] = $param.('' != $val ? $glue.$this->escapeToken($val) : '');
}
} else {
$params[] = \is_array($val) ? implode(' ', array_map($this->escapeToken(...), $val)) : $this->escapeToken($val);
}
}

return implode(' ', $params);
}




protected function parse()
{
foreach ($this->parameters as $key => $value) {
if ('--' === $key) {
return;
}
if (str_starts_with($key, '--')) {
$this->addLongOption(substr($key, 2), $value);
} elseif (str_starts_with($key, '-')) {
$this->addShortOption(substr($key, 1), $value);
} else {
$this->addArgument($key, $value);
}
}
}






private function addShortOption(string $shortcut, mixed $value): void
{
if (!$this->definition->hasShortcut($shortcut)) {
throw new InvalidOptionException(\sprintf('The "-%s" option does not exist.', $shortcut));
}

$this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
}







private function addLongOption(string $name, mixed $value): void
{
if (!$this->definition->hasOption($name)) {
if (!$this->definition->hasNegation($name)) {
throw new InvalidOptionException(\sprintf('The "--%s" option does not exist.', $name));
}

$optionName = $this->definition->negationToName($name);
$this->options[$optionName] = false;

return;
}

$option = $this->definition->getOption($name);

if (null === $value) {
if ($option->isValueRequired()) {
throw new InvalidOptionException(\sprintf('The "--%s" option requires a value.', $name));
}

if (!$option->isValueOptional()) {
$value = true;
}
}

$this->options[$name] = $value;
}






private function addArgument(string|int $name, mixed $value): void
{
if (!$this->definition->hasArgument($name)) {
throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name));
}

$this->arguments[$name] = $value;
}
}
<?php










namespace Symfony\Component\Console\Input;







interface StreamableInputInterface extends InputInterface
{









public function setStream($stream);






public function getStream();
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Completion\Suggestion;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\LogicException;






class InputOption
{



public const VALUE_NONE = 1;




public const VALUE_REQUIRED = 2;




public const VALUE_OPTIONAL = 4;




public const VALUE_IS_ARRAY = 8;




public const VALUE_NEGATABLE = 16;

private string $name;
private string|array|null $shortcut;
private int $mode;
private string|int|bool|array|float|null $default;
private array|\Closure $suggestedValues;
private string $description;









public function __construct(string $name, string|array|null $shortcut = null, ?int $mode = null, string $description = '', string|bool|int|float|array|null $default = null, array|\Closure $suggestedValues = [])
{
if (str_starts_with($name, '--')) {
$name = substr($name, 2);
}

if (empty($name)) {
throw new InvalidArgumentException('An option name cannot be empty.');
}

if ('' === $shortcut || [] === $shortcut || false === $shortcut) {
$shortcut = null;
}

if (null !== $shortcut) {
if (\is_array($shortcut)) {
$shortcut = implode('|', $shortcut);
}
$shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
$shortcuts = array_filter($shortcuts, 'strlen');
$shortcut = implode('|', $shortcuts);

if ('' === $shortcut) {
throw new InvalidArgumentException('An option shortcut cannot be empty.');
}
}

if (null === $mode) {
$mode = self::VALUE_NONE;
} elseif ($mode >= (self::VALUE_NEGATABLE << 1) || $mode < 1) {
throw new InvalidArgumentException(\sprintf('Option mode "%s" is not valid.', $mode));
}

$this->name = $name;
$this->shortcut = $shortcut;
$this->mode = $mode;
$this->description = $description;
$this->suggestedValues = $suggestedValues;

if ($suggestedValues && !$this->acceptValue()) {
throw new LogicException('Cannot set suggested values if the option does not accept a value.');
}
if ($this->isArray() && !$this->acceptValue()) {
throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
}
if ($this->isNegatable() && $this->acceptValue()) {
throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.');
}

$this->setDefault($default);
}




public function getShortcut(): ?string
{
return $this->shortcut;
}




public function getName(): string
{
return $this->name;
}






public function acceptValue(): bool
{
return $this->isValueRequired() || $this->isValueOptional();
}






public function isValueRequired(): bool
{
return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
}






public function isValueOptional(): bool
{
return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
}






public function isArray(): bool
{
return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
}

public function isNegatable(): bool
{
return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode);
}




public function setDefault(string|bool|int|float|array|null $default = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
}

if ($this->isArray()) {
if (null === $default) {
$default = [];
} elseif (!\is_array($default)) {
throw new LogicException('A default value for an array option must be an array.');
}
}

$this->default = $this->acceptValue() || $this->isNegatable() ? $default : false;
}




public function getDefault(): string|bool|int|float|array|null
{
return $this->default;
}




public function getDescription(): string
{
return $this->description;
}

public function hasCompletion(): bool
{
return [] !== $this->suggestedValues;
}






public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
$values = $this->suggestedValues;
if ($values instanceof \Closure && !\is_array($values = $values($input))) {
throw new LogicException(\sprintf('Closure for option "%s" must return an array. Got "%s".', $this->name, get_debug_type($values)));
}
if ($values) {
$suggestions->suggestValues($values);
}
}




public function equals(self $option): bool
{
return $option->getName() === $this->getName()
&& $option->getShortcut() === $this->getShortcut()
&& $option->getDefault() === $this->getDefault()
&& $option->isNegatable() === $this->isNegatable()
&& $option->isArray() === $this->isArray()
&& $option->isValueRequired() === $this->isValueRequired()
&& $option->isValueOptional() === $this->isValueOptional()
;
}
}
<?php










namespace Symfony\Component\Console\Input;

use Symfony\Component\Console\Exception\InvalidArgumentException;










class StringInput extends ArgvInput
{



public const REGEX_STRING = '([^\s]+?)(?:\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
public const REGEX_UNQUOTED_STRING = '([^\s\\\\]+?)';
public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';




public function __construct(string $input)
{
parent::__construct([]);

$this->setTokens($this->tokenize($input));
}






private function tokenize(string $input): array
{
$tokens = [];
$length = \strlen($input);
$cursor = 0;
$token = null;
while ($cursor < $length) {
if ('\\' === $input[$cursor]) {
$token .= $input[++$cursor] ?? '';
++$cursor;
continue;
}

if (preg_match('/\s+/A', $input, $match, 0, $cursor)) {
if (null !== $token) {
$tokens[] = $token;
$token = null;
}
} elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, 0, $cursor)) {
$token .= $match[1].$match[2].stripcslashes(str_replace(['"\'', '\'"', '\'\'', '""'], '', substr($match[3], 1, -1)));
} elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, 0, $cursor)) {
$token .= stripcslashes(substr($match[0], 1, -1));
} elseif (preg_match('/'.self::REGEX_UNQUOTED_STRING.'/A', $input, $match, 0, $cursor)) {
$token .= $match[1];
} else {

throw new InvalidArgumentException(\sprintf('Unable to parse input near "... %s ...".', substr($input, $cursor, 10)));
}

$cursor += \strlen($match[0]);
}

if (null !== $token) {
$tokens[] = $token;
}

return $tokens;
}
}
<?php










namespace Symfony\Component\Console\Messenger;




final class RunCommandContext
{
public function __construct(
public readonly RunCommandMessage $message,
public readonly int $exitCode,
public readonly string $output,
) {
}
}
<?php










namespace Symfony\Component\Console\Messenger;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\RunCommandFailedException;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Messenger\Exception\RecoverableExceptionInterface;
use Symfony\Component\Messenger\Exception\UnrecoverableExceptionInterface;




final class RunCommandMessageHandler
{
public function __construct(private readonly Application $application)
{
}

public function __invoke(RunCommandMessage $message): RunCommandContext
{
$input = new StringInput($message->input);
$output = new BufferedOutput();

$this->application->setCatchExceptions($message->catchExceptions);

try {
$exitCode = $this->application->run($input, $output);
} catch (UnrecoverableExceptionInterface|RecoverableExceptionInterface $e) {
throw $e;
} catch (\Throwable $e) {
throw new RunCommandFailedException($e, new RunCommandContext($message, Command::FAILURE, $output->fetch()));
}

if ($message->throwOnFailure && Command::SUCCESS !== $exitCode) {
throw new RunCommandFailedException(\sprintf('Command "%s" exited with code "%s".', $message->input, $exitCode), new RunCommandContext($message, $exitCode, $output->fetch()));
}

return new RunCommandContext($message, $exitCode, $output->fetch());
}
}
<?php










namespace Symfony\Component\Console\Messenger;

use Symfony\Component\Console\Exception\RunCommandFailedException;




class RunCommandMessage implements \Stringable
{




public function __construct(
public readonly string $input,
public readonly bool $throwOnFailure = true,
public readonly bool $catchExceptions = false,
) {
}

public function __toString(): string
{
return $this->input;
}
}
<?php










namespace Symfony\Component\Console;

use Symfony\Component\Console\Output\AnsiColorMode;

class Terminal
{
public const DEFAULT_COLOR_MODE = AnsiColorMode::Ansi4;

private static ?AnsiColorMode $colorMode = null;
private static ?int $width = null;
private static ?int $height = null;
private static ?bool $stty = null;





public static function getColorMode(): AnsiColorMode
{

if (null !== self::$colorMode) {
return self::$colorMode;
}


if (\is_string($colorterm = getenv('COLORTERM'))) {
$colorterm = strtolower($colorterm);

if (str_contains($colorterm, 'truecolor')) {
self::setColorMode(AnsiColorMode::Ansi24);

return self::$colorMode;
}

if (str_contains($colorterm, '256color')) {
self::setColorMode(AnsiColorMode::Ansi8);

return self::$colorMode;
}
}


if (\is_string($term = getenv('TERM'))) {
$term = strtolower($term);

if (str_contains($term, 'truecolor')) {
self::setColorMode(AnsiColorMode::Ansi24);

return self::$colorMode;
}

if (str_contains($term, '256color')) {
self::setColorMode(AnsiColorMode::Ansi8);

return self::$colorMode;
}
}

self::setColorMode(self::DEFAULT_COLOR_MODE);

return self::$colorMode;
}




public static function setColorMode(?AnsiColorMode $colorMode): void
{
self::$colorMode = $colorMode;
}




public function getWidth(): int
{
$width = getenv('COLUMNS');
if (false !== $width) {
return (int) trim($width);
}

if (null === self::$width) {
self::initDimensions();
}

return self::$width ?: 80;
}




public function getHeight(): int
{
$height = getenv('LINES');
if (false !== $height) {
return (int) trim($height);
}

if (null === self::$height) {
self::initDimensions();
}

return self::$height ?: 50;
}




public static function hasSttyAvailable(): bool
{
if (null !== self::$stty) {
return self::$stty;
}


if (!\function_exists('shell_exec')) {
return false;
}

return self::$stty = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null'));
}

private static function initDimensions(): void
{
if ('\\' === \DIRECTORY_SEPARATOR) {
$ansicon = getenv('ANSICON');
if (false !== $ansicon && preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim($ansicon), $matches)) {


self::$width = (int) $matches[1];
self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];
} elseif (!self::hasVt100Support() && self::hasSttyAvailable()) {


self::initDimensionsUsingStty();
} elseif (null !== $dimensions = self::getConsoleMode()) {

self::$width = (int) $dimensions[0];
self::$height = (int) $dimensions[1];
}
} else {
self::initDimensionsUsingStty();
}
}




private static function hasVt100Support(): bool
{
return \function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'w'));
}




private static function initDimensionsUsingStty(): void
{
if ($sttyString = self::getSttyColumns()) {
if (preg_match('/rows.(\d+);.columns.(\d+);/is', $sttyString, $matches)) {

self::$width = (int) $matches[2];
self::$height = (int) $matches[1];
} elseif (preg_match('/;.(\d+).rows;.(\d+).columns/is', $sttyString, $matches)) {

self::$width = (int) $matches[2];
self::$height = (int) $matches[1];
}
}
}






private static function getConsoleMode(): ?array
{
$info = self::readFromProcess('mode CON');

if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
return null;
}

return [(int) $matches[2], (int) $matches[1]];
}




private static function getSttyColumns(): ?string
{
return self::readFromProcess(['stty', '-a']);
}

private static function readFromProcess(string|array $command): ?string
{
if (!\function_exists('proc_open')) {
return null;
}

$descriptorspec = [
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
];

$cp = \function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0;

if (!$process = @proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true])) {
return null;
}

$info = stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

if ($cp) {
sapi_windows_cp_set($cp);
}

return $info;
}
}
<?php










namespace Symfony\Component\Console\Style;






interface StyleInterface
{





public function title(string $message);






public function section(string $message);






public function listing(array $elements);






public function text(string|array $message);






public function success(string|array $message);






public function error(string|array $message);






public function warning(string|array $message);






public function note(string|array $message);






public function caution(string|array $message);






public function table(array $headers, array $rows);




public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed;




public function askHidden(string $question, ?callable $validator = null): mixed;




public function confirm(string $question, bool $default = true): bool;




public function choice(string $question, array $choices, mixed $default = null): mixed;






public function newLine(int $count = 1);






public function progressStart(int $max = 0);






public function progressAdvance(int $step = 1);






public function progressFinish();
}
<?php










namespace Symfony\Component\Console\Style;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;






abstract class OutputStyle implements OutputInterface, StyleInterface
{
private OutputInterface $output;

public function __construct(OutputInterface $output)
{
$this->output = $output;
}




public function newLine(int $count = 1)
{
$this->output->write(str_repeat(\PHP_EOL, $count));
}

public function createProgressBar(int $max = 0): ProgressBar
{
return new ProgressBar($this->output, $max);
}




public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL)
{
$this->output->write($messages, $newline, $type);
}




public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL)
{
$this->output->writeln($messages, $type);
}




public function setVerbosity(int $level)
{
$this->output->setVerbosity($level);
}

public function getVerbosity(): int
{
return $this->output->getVerbosity();
}




public function setDecorated(bool $decorated)
{
$this->output->setDecorated($decorated);
}

public function isDecorated(): bool
{
return $this->output->isDecorated();
}




public function setFormatter(OutputFormatterInterface $formatter)
{
$this->output->setFormatter($formatter);
}

public function getFormatter(): OutputFormatterInterface
{
return $this->output->getFormatter();
}

public function isQuiet(): bool
{
return $this->output->isQuiet();
}

public function isVerbose(): bool
{
return $this->output->isVerbose();
}

public function isVeryVerbose(): bool
{
return $this->output->isVeryVerbose();
}

public function isDebug(): bool
{
return $this->output->isDebug();
}




protected function getErrorOutput()
{
if (!$this->output instanceof ConsoleOutputInterface) {
return $this->output;
}

return $this->output->getErrorOutput();
}
}
<?php










namespace Symfony\Component\Console\Style;

use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\OutputWrapper;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableCell;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\TrimmedBufferOutput;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Terminal;






class SymfonyStyle extends OutputStyle
{
public const MAX_LINE_LENGTH = 120;

private InputInterface $input;
private OutputInterface $output;
private SymfonyQuestionHelper $questionHelper;
private ProgressBar $progressBar;
private int $lineLength;
private TrimmedBufferOutput $bufferedOutput;

public function __construct(InputInterface $input, OutputInterface $output)
{
$this->input = $input;
$this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), false, clone $output->getFormatter());

$width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH;
$this->lineLength = min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH);

parent::__construct($this->output = $output);
}






public function block(string|array $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true)
{
$messages = \is_array($messages) ? array_values($messages) : [$messages];

$this->autoPrependBlock();
$this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape));
$this->newLine();
}




public function title(string $message)
{
$this->autoPrependBlock();
$this->writeln([
\sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
\sprintf('<comment>%s</>', str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
]);
$this->newLine();
}




public function section(string $message)
{
$this->autoPrependBlock();
$this->writeln([
\sprintf('<comment>%s</>', OutputFormatter::escapeTrailingBackslash($message)),
\sprintf('<comment>%s</>', str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message)))),
]);
$this->newLine();
}




public function listing(array $elements)
{
$this->autoPrependText();
$elements = array_map(fn ($element) => \sprintf(' * %s', $element), $elements);

$this->writeln($elements);
$this->newLine();
}




public function text(string|array $message)
{
$this->autoPrependText();

$messages = \is_array($message) ? array_values($message) : [$message];
foreach ($messages as $message) {
$this->writeln(\sprintf(' %s', $message));
}
}






public function comment(string|array $message)
{
$this->block($message, null, null, '<fg=default;bg=default> // </>', false, false);
}




public function success(string|array $message)
{
$this->block($message, 'OK', 'fg=black;bg=green', ' ', true);
}




public function error(string|array $message)
{
$this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true);
}




public function warning(string|array $message)
{
$this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true);
}




public function note(string|array $message)
{
$this->block($message, 'NOTE', 'fg=yellow', ' ! ');
}






public function info(string|array $message)
{
$this->block($message, 'INFO', 'fg=green', ' ', true);
}




public function caution(string|array $message)
{
$this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true);
}




public function table(array $headers, array $rows)
{
$this->createTable()
->setHeaders($headers)
->setRows($rows)
->render()
;

$this->newLine();
}






public function horizontalTable(array $headers, array $rows)
{
$this->createTable()
->setHorizontal(true)
->setHeaders($headers)
->setRows($rows)
->render()
;

$this->newLine();
}











public function definitionList(string|array|TableSeparator ...$list)
{
$headers = [];
$row = [];
foreach ($list as $value) {
if ($value instanceof TableSeparator) {
$headers[] = $value;
$row[] = $value;
continue;
}
if (\is_string($value)) {
$headers[] = new TableCell($value, ['colspan' => 2]);
$row[] = null;
continue;
}
if (!\is_array($value)) {
throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.');
}
$headers[] = key($value);
$row[] = current($value);
}

$this->horizontalTable($headers, [$row]);
}

public function ask(string $question, ?string $default = null, ?callable $validator = null): mixed
{
$question = new Question($question, $default);
$question->setValidator($validator);

return $this->askQuestion($question);
}

public function askHidden(string $question, ?callable $validator = null): mixed
{
$question = new Question($question);

$question->setHidden(true);
$question->setValidator($validator);

return $this->askQuestion($question);
}

public function confirm(string $question, bool $default = true): bool
{
return $this->askQuestion(new ConfirmationQuestion($question, $default));
}

public function choice(string $question, array $choices, mixed $default = null, bool $multiSelect = false): mixed
{
if (null !== $default) {
$values = array_flip($choices);
$default = $values[$default] ?? $default;
}

$questionChoice = new ChoiceQuestion($question, $choices, $default);
$questionChoice->setMultiselect($multiSelect);

return $this->askQuestion($questionChoice);
}




public function progressStart(int $max = 0)
{
$this->progressBar = $this->createProgressBar($max);
$this->progressBar->start();
}




public function progressAdvance(int $step = 1)
{
$this->getProgressBar()->advance($step);
}




public function progressFinish()
{
$this->getProgressBar()->finish();
$this->newLine(2);
unset($this->progressBar);
}

public function createProgressBar(int $max = 0): ProgressBar
{
$progressBar = parent::createProgressBar($max);

if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === getenv('TERM_PROGRAM')) {
$progressBar->setEmptyBarCharacter('░'); 
$progressBar->setProgressCharacter('');
$progressBar->setBarCharacter('▓'); 
}

return $progressBar;
}

/**
@template
@template







*/
public function progressIterate(iterable $iterable, ?int $max = null): iterable
{
yield from $this->createProgressBar()->iterate($iterable, $max);

$this->newLine(2);
}

public function askQuestion(Question $question): mixed
{
if ($this->input->isInteractive()) {
$this->autoPrependBlock();
}

$this->questionHelper ??= new SymfonyQuestionHelper();

$answer = $this->questionHelper->ask($this->input, $this, $question);

if ($this->input->isInteractive()) {
if ($this->output instanceof ConsoleSectionOutput) {


$this->output->addNewLineOfInputSubmit();
}
$this->newLine();
$this->bufferedOutput->write("\n");
}

return $answer;
}




public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL)
{
if (!is_iterable($messages)) {
$messages = [$messages];
}

foreach ($messages as $message) {
parent::writeln($message, $type);
$this->writeBuffer($message, true, $type);
}
}




public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL)
{
if (!is_iterable($messages)) {
$messages = [$messages];
}

foreach ($messages as $message) {
parent::write($message, $newline, $type);
$this->writeBuffer($message, $newline, $type);
}
}




public function newLine(int $count = 1)
{
parent::newLine($count);
$this->bufferedOutput->write(str_repeat("\n", $count));
}




public function getErrorStyle(): self
{
return new self($this->input, $this->getErrorOutput());
}

public function createTable(): Table
{
$output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output;
$style = clone Table::getStyleDefinition('symfony-style-guide');
$style->setCellHeaderFormat('<info>%s</info>');

return (new Table($output))->setStyle($style);
}

private function getProgressBar(): ProgressBar
{
return $this->progressBar
?? throw new RuntimeException('The ProgressBar is not started.');
}

private function autoPrependBlock(): void
{
$chars = substr(str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2);

if (!isset($chars[0])) {
$this->newLine(); 

return;
}

$this->newLine(2 - substr_count($chars, "\n"));
}

private function autoPrependText(): void
{
$fetched = $this->bufferedOutput->fetch();

if ($fetched && !str_ends_with($fetched, "\n")) {
$this->newLine();
}
}

private function writeBuffer(string $message, bool $newLine, int $type): void
{

$this->bufferedOutput->write($message, $newLine, $type);
}

private function createBlock(iterable $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = false): array
{
$indentLength = 0;
$prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix));
$lines = [];

if (null !== $type) {
$type = \sprintf('[%s] ', $type);
$indentLength = Helper::width($type);
$lineIndentation = str_repeat(' ', $indentLength);
}


$outputWrapper = new OutputWrapper();
foreach ($messages as $key => $message) {
if ($escape) {
$message = OutputFormatter::escape($message);
}

$lines = array_merge(
$lines,
explode(\PHP_EOL, $outputWrapper->wrap(
$message,
$this->lineLength - $prefixLength - $indentLength,
\PHP_EOL
))
);

if (\count($messages) > 1 && $key < \count($messages) - 1) {
$lines[] = '';
}
}

$firstLineIndex = 0;
if ($padding && $this->isDecorated()) {
$firstLineIndex = 1;
array_unshift($lines, '');
$lines[] = '';
}

foreach ($lines as $i => &$line) {
if (null !== $type) {
$line = $firstLineIndex === $i ? $type.$line : $lineIndentation.$line;
}

$line = $prefix.$line;
$line .= str_repeat(' ', max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0));

if ($style) {
$line = \sprintf('<%s>%s</>', $style, $line);
}
}

return $lines;
}
}
<?php










namespace Symfony\Component\Console\Completion;

use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;









final class CompletionInput extends ArgvInput
{
public const TYPE_ARGUMENT_VALUE = 'argument_value';
public const TYPE_OPTION_VALUE = 'option_value';
public const TYPE_OPTION_NAME = 'option_name';
public const TYPE_NONE = 'none';

private array $tokens;
private int $currentIndex;
private string $completionType;
private ?string $completionName = null;
private string $completionValue = '';






public static function fromString(string $inputStr, int $currentIndex): self
{
preg_match_all('/(?<=^|\s)([\'"]?)(.+?)(?<!\\\\)\1(?=$|\s)/', $inputStr, $tokens);

return self::fromTokens($tokens[0], $currentIndex);
}







public static function fromTokens(array $tokens, int $currentIndex): self
{
$input = new self($tokens);
$input->tokens = $tokens;
$input->currentIndex = $currentIndex;

return $input;
}

public function bind(InputDefinition $definition): void
{
parent::bind($definition);

$relevantToken = $this->getRelevantToken();
if ('-' === $relevantToken[0]) {

[$optionToken, $optionValue] = explode('=', $relevantToken, 2) + ['', ''];

$option = $this->getOptionFromToken($optionToken);
if (null === $option && !$this->isCursorFree()) {
$this->completionType = self::TYPE_OPTION_NAME;
$this->completionValue = $relevantToken;

return;
}

if ($option?->acceptValue()) {
$this->completionType = self::TYPE_OPTION_VALUE;
$this->completionName = $option->getName();
$this->completionValue = $optionValue ?: (!str_starts_with($optionToken, '--') ? substr($optionToken, 2) : '');

return;
}
}

$previousToken = $this->tokens[$this->currentIndex - 1];
if ('-' === $previousToken[0] && '' !== trim($previousToken, '-')) {

$previousOption = $this->getOptionFromToken($previousToken);
if ($previousOption?->acceptValue()) {
$this->completionType = self::TYPE_OPTION_VALUE;
$this->completionName = $previousOption->getName();
$this->completionValue = $relevantToken;

return;
}
}


$this->completionType = self::TYPE_ARGUMENT_VALUE;

foreach ($this->definition->getArguments() as $argumentName => $argument) {
if (!isset($this->arguments[$argumentName])) {
break;
}

$argumentValue = $this->arguments[$argumentName];
$this->completionName = $argumentName;
if (\is_array($argumentValue)) {
$this->completionValue = $argumentValue ? $argumentValue[array_key_last($argumentValue)] : null;
} else {
$this->completionValue = $argumentValue;
}
}

if ($this->currentIndex >= \count($this->tokens)) {
if (!isset($this->arguments[$argumentName]) || $this->definition->getArgument($argumentName)->isArray()) {
$this->completionName = $argumentName;
$this->completionValue = '';
} else {

$this->completionType = self::TYPE_NONE;
$this->completionName = null;
$this->completionValue = '';
}
}
}













public function getCompletionType(): string
{
return $this->completionType;
}






public function getCompletionName(): ?string
{
return $this->completionName;
}




public function getCompletionValue(): string
{
return $this->completionValue;
}

public function mustSuggestOptionValuesFor(string $optionName): bool
{
return self::TYPE_OPTION_VALUE === $this->getCompletionType() && $optionName === $this->getCompletionName();
}

public function mustSuggestArgumentValuesFor(string $argumentName): bool
{
return self::TYPE_ARGUMENT_VALUE === $this->getCompletionType() && $argumentName === $this->getCompletionName();
}

protected function parseToken(string $token, bool $parseOptions): bool
{
try {
return parent::parseToken($token, $parseOptions);
} catch (RuntimeException) {

}

return $parseOptions;
}

private function getOptionFromToken(string $optionToken): ?InputOption
{
$optionName = ltrim($optionToken, '-');
if (!$optionName) {
return null;
}

if ('-' === ($optionToken[1] ?? ' ')) {

return $this->definition->hasOption($optionName) ? $this->definition->getOption($optionName) : null;
}


return $this->definition->hasShortcut($optionName[0]) ? $this->definition->getOptionForShortcut($optionName[0]) : null;
}




private function getRelevantToken(): string
{
return $this->tokens[$this->isCursorFree() ? $this->currentIndex - 1 : $this->currentIndex];
}




private function isCursorFree(): bool
{
$nrOfTokens = \count($this->tokens);
if ($this->currentIndex > $nrOfTokens) {
throw new \LogicException('Current index is invalid, it must be the number of input tokens or one more.');
}

return $this->currentIndex >= $nrOfTokens;
}

public function __toString()
{
$str = '';
foreach ($this->tokens as $i => $token) {
$str .= $token;

if ($this->currentIndex === $i) {
$str .= '|';
}

$str .= ' ';
}

if ($this->currentIndex > $i) {
$str .= '|';
}

return rtrim($str);
}
}
<?php










namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;




class ZshCompletionOutput implements CompletionOutputInterface
{
public function write(CompletionSuggestions $suggestions, OutputInterface $output): void
{
$values = [];
foreach ($suggestions->getValueSuggestions() as $value) {
$values[] = $value->getValue().($value->getDescription() ? "\t".$value->getDescription() : '');
}
foreach ($suggestions->getOptionSuggestions() as $option) {
$values[] = '--'.$option->getName().($option->getDescription() ? "\t".$option->getDescription() : '');
if ($option->isNegatable()) {
$values[] = '--no-'.$option->getName().($option->getDescription() ? "\t".$option->getDescription() : '');
}
}
$output->write(implode("\n", $values)."\n");
}
}
<?php










namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;




class BashCompletionOutput implements CompletionOutputInterface
{
public function write(CompletionSuggestions $suggestions, OutputInterface $output): void
{
$values = $suggestions->getValueSuggestions();
foreach ($suggestions->getOptionSuggestions() as $option) {
$values[] = '--'.$option->getName();
if ($option->isNegatable()) {
$values[] = '--no-'.$option->getName();
}
}
$output->writeln(implode("\n", $values));
}
}
<?php










namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;






interface CompletionOutputInterface
{
public function write(CompletionSuggestions $suggestions, OutputInterface $output): void;
}
<?php










namespace Symfony\Component\Console\Completion\Output;

use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Output\OutputInterface;




class FishCompletionOutput implements CompletionOutputInterface
{
public function write(CompletionSuggestions $suggestions, OutputInterface $output): void
{
$values = $suggestions->getValueSuggestions();
foreach ($suggestions->getOptionSuggestions() as $option) {
$values[] = '--'.$option->getName();
if ($option->isNegatable()) {
$values[] = '--no-'.$option->getName();
}
}
$output->write(implode("\n", $values));
}
}
<?php










namespace Symfony\Component\Console\Completion;






class Suggestion implements \Stringable
{
public function __construct(
private readonly string $value,
private readonly string $description = '',
) {
}

public function getValue(): string
{
return $this->value;
}

public function getDescription(): string
{
return $this->description;
}

public function __toString(): string
{
return $this->getValue();
}
}
<?php










namespace Symfony\Component\Console\Completion;

use Symfony\Component\Console\Input\InputOption;






final class CompletionSuggestions
{
private array $valueSuggestions = [];
private array $optionSuggestions = [];






public function suggestValue(string|Suggestion $value): static
{
$this->valueSuggestions[] = !$value instanceof Suggestion ? new Suggestion($value) : $value;

return $this;
}








public function suggestValues(array $values): static
{
foreach ($values as $value) {
$this->suggestValue($value);
}

return $this;
}






public function suggestOption(InputOption $option): static
{
$this->optionSuggestions[] = $option;

return $this;
}








public function suggestOptions(array $options): static
{
foreach ($options as $option) {
$this->suggestOption($option);
}

return $this;
}




public function getOptionSuggestions(): array
{
return $this->optionSuggestions;
}




public function getValueSuggestions(): array
{
return $this->valueSuggestions;
}
}
Copyright (c) 2020-present 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.
<?php










if (!function_exists('trigger_deprecation')) {










function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void
{
@trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Filesystem;

use Symfony\Component\Filesystem\Exception\FileNotFoundException;
use Symfony\Component\Filesystem\Exception\InvalidArgumentException;
use Symfony\Component\Filesystem\Exception\IOException;






class Filesystem
{
private static ?string $lastError = null;













public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false)
{
$originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://');
if ($originIsLocal && !is_file($originFile)) {
throw new FileNotFoundException(\sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile);
}

$this->mkdir(\dirname($targetFile));

$doCopy = true;
if (!$overwriteNewerFiles && !parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) {
$doCopy = filemtime($originFile) > filemtime($targetFile);
}

if ($doCopy) {

if (!$source = self::box('fopen', $originFile, 'r')) {
throw new IOException(\sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile);
}


if (!$target = self::box('fopen', $targetFile, 'w', false, stream_context_create(['ftp' => ['overwrite' => true]]))) {
throw new IOException(\sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile);
}

$bytesCopied = stream_copy_to_stream($source, $target);
fclose($source);
fclose($target);
unset($source, $target);

if (!is_file($targetFile)) {
throw new IOException(\sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile);
}

if ($originIsLocal) {

self::box('chmod', $targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111));


self::box('touch', $targetFile, filemtime($originFile));

if ($bytesCopied !== $bytesOrigin = filesize($originFile)) {
throw new IOException(\sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile);
}
}
}
}








public function mkdir(string|iterable $dirs, int $mode = 0777)
{
foreach ($this->toIterable($dirs) as $dir) {
if (is_dir($dir)) {
continue;
}

if (!self::box('mkdir', $dir, $mode, true) && !is_dir($dir)) {
throw new IOException(\sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir);
}
}
}




public function exists(string|iterable $files): bool
{
$maxPathLength = \PHP_MAXPATHLEN - 2;

foreach ($this->toIterable($files) as $file) {
if (\strlen($file) > $maxPathLength) {
throw new IOException(\sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file);
}

if (!file_exists($file)) {
return false;
}
}

return true;
}











public function touch(string|iterable $files, ?int $time = null, ?int $atime = null)
{
foreach ($this->toIterable($files) as $file) {
if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) {
throw new IOException(\sprintf('Failed to touch "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}








public function remove(string|iterable $files)
{
if ($files instanceof \Traversable) {
$files = iterator_to_array($files, false);
} elseif (!\is_array($files)) {
$files = [$files];
}

self::doRemove($files, false);
}

private static function doRemove(array $files, bool $isRecursive): void
{
$files = array_reverse($files);
foreach ($files as $file) {
if (is_link($file)) {

if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && file_exists($file)) {
throw new IOException(\sprintf('Failed to remove symlink "%s": ', $file).self::$lastError);
}
} elseif (is_dir($file)) {
if (!$isRecursive) {
$tmpName = \dirname(realpath($file)).'/.!'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-!'));

if (file_exists($tmpName)) {
try {
self::doRemove([$tmpName], true);
} catch (IOException) {
}
}

if (!file_exists($tmpName) && self::box('rename', $file, $tmpName)) {
$origFile = $file;
$file = $tmpName;
} else {
$origFile = null;
}
}

$filesystemIterator = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS);
self::doRemove(iterator_to_array($filesystemIterator, true), true);

if (!self::box('rmdir', $file) && file_exists($file) && !$isRecursive) {
$lastError = self::$lastError;

if (null !== $origFile && self::box('rename', $file, $origFile)) {
$file = $origFile;
}

throw new IOException(\sprintf('Failed to remove directory "%s": ', $file).$lastError);
}
} elseif (!self::box('unlink', $file) && ((self::$lastError && str_contains(self::$lastError, 'Permission denied')) || file_exists($file))) {
throw new IOException(\sprintf('Failed to remove file "%s": ', $file).self::$lastError);
}
}
}












public function chmod(string|iterable $files, int $mode, int $umask = 0000, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
if (!self::box('chmod', $file, $mode & ~$umask)) {
throw new IOException(\sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file);
}
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chmod(new \FilesystemIterator($file), $mode, $umask, true);
}
}
}















public function chown(string|iterable $files, string|int $user, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chown(new \FilesystemIterator($file), $user, true);
}
if (is_link($file) && \function_exists('lchown')) {
if (!self::box('lchown', $file, $user)) {
throw new IOException(\sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file);
}
} else {
if (!self::box('chown', $file, $user)) {
throw new IOException(\sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}
}















public function chgrp(string|iterable $files, string|int $group, bool $recursive = false)
{
foreach ($this->toIterable($files) as $file) {
if ($recursive && is_dir($file) && !is_link($file)) {
$this->chgrp(new \FilesystemIterator($file), $group, true);
}
if (is_link($file) && \function_exists('lchgrp')) {
if (!self::box('lchgrp', $file, $group)) {
throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file);
}
} else {
if (!self::box('chgrp', $file, $group)) {
throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file);
}
}
}
}









public function rename(string $origin, string $target, bool $overwrite = false)
{

if (!$overwrite && $this->isReadable($target)) {
throw new IOException(\sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
}

if (!self::box('rename', $origin, $target)) {
if (is_dir($origin)) {

$this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]);
$this->remove($origin);

return;
}
throw new IOException(\sprintf('Cannot rename "%s" to "%s": ', $origin, $target).self::$lastError, 0, null, $target);
}
}






private function isReadable(string $filename): bool
{
$maxPathLength = \PHP_MAXPATHLEN - 2;

if (\strlen($filename) > $maxPathLength) {
throw new IOException(\sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename);
}

return is_readable($filename);
}








public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false)
{
self::assertFunctionExists('symlink');

if ('\\' === \DIRECTORY_SEPARATOR) {
$originDir = strtr($originDir, '/', '\\');
$targetDir = strtr($targetDir, '/', '\\');

if ($copyOnWindows) {
$this->mirror($originDir, $targetDir);

return;
}
}

$this->mkdir(\dirname($targetDir));

if (is_link($targetDir)) {
if (readlink($targetDir) === $originDir) {
return;
}
$this->remove($targetDir);
}

if (!self::box('symlink', $originDir, $targetDir)) {
$this->linkException($originDir, $targetDir, 'symbolic');
}
}











public function hardlink(string $originFile, string|iterable $targetFiles)
{
self::assertFunctionExists('link');

if (!$this->exists($originFile)) {
throw new FileNotFoundException(null, 0, null, $originFile);
}

if (!is_file($originFile)) {
throw new FileNotFoundException(\sprintf('Origin file "%s" is not a file.', $originFile));
}

foreach ($this->toIterable($targetFiles) as $targetFile) {
if (is_file($targetFile)) {
if (fileinode($originFile) === fileinode($targetFile)) {
continue;
}
$this->remove($targetFile);
}

if (!self::box('link', $originFile, $targetFile)) {
$this->linkException($originFile, $targetFile, 'hard');
}
}
}




private function linkException(string $origin, string $target, string $linkType): never
{
if (self::$lastError) {
if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) {
throw new IOException(\sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target);
}
}
throw new IOException(\sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target).self::$lastError, 0, null, $target);
}












public function readlink(string $path, bool $canonicalize = false): ?string
{
if (!$canonicalize && !is_link($path)) {
return null;
}

if ($canonicalize) {
if (!$this->exists($path)) {
return null;
}

return realpath($path);
}

return readlink($path);
}




public function makePathRelative(string $endPath, string $startPath): string
{
if (!$this->isAbsolutePath($startPath)) {
throw new InvalidArgumentException(\sprintf('The start path "%s" is not absolute.', $startPath));
}

if (!$this->isAbsolutePath($endPath)) {
throw new InvalidArgumentException(\sprintf('The end path "%s" is not absolute.', $endPath));
}


if ('\\' === \DIRECTORY_SEPARATOR) {
$endPath = str_replace('\\', '/', $endPath);
$startPath = str_replace('\\', '/', $startPath);
}

$splitDriveLetter = fn ($path) => (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0]))
? [substr($path, 2), strtoupper($path[0])]
: [$path, null];

$splitPath = function ($path) {
$result = [];

foreach (explode('/', trim($path, '/')) as $segment) {
if ('..' === $segment) {
array_pop($result);
} elseif ('.' !== $segment && '' !== $segment) {
$result[] = $segment;
}
}

return $result;
};

[$endPath, $endDriveLetter] = $splitDriveLetter($endPath);
[$startPath, $startDriveLetter] = $splitDriveLetter($startPath);

$startPathArr = $splitPath($startPath);
$endPathArr = $splitPath($endPath);

if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) {

return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : '');
}


$index = 0;
while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) {
++$index;
}


if (1 === \count($startPathArr) && '' === $startPathArr[0]) {
$depth = 0;
} else {
$depth = \count($startPathArr) - $index;
}


$traverser = str_repeat('../', $depth);

$endPathRemainder = implode('/', \array_slice($endPathArr, $index));


$relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : '');

return '' === $relativePath ? './' : $relativePath;
}




















public function mirror(string $originDir, string $targetDir, ?\Traversable $iterator = null, array $options = [])
{
$targetDir = rtrim($targetDir, '/\\');
$originDir = rtrim($originDir, '/\\');
$originDirLen = \strlen($originDir);

if (!$this->exists($originDir)) {
throw new IOException(\sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir);
}


if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
$deleteIterator = $iterator;
if (null === $deleteIterator) {
$flags = \FilesystemIterator::SKIP_DOTS;
$deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST);
}
$targetDirLen = \strlen($targetDir);
foreach ($deleteIterator as $file) {
$origin = $originDir.substr($file->getPathname(), $targetDirLen);
if (!$this->exists($origin)) {
$this->remove($file);
}
}
}

$copyOnWindows = $options['copy_on_windows'] ?? false;

if (null === $iterator) {
$flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS;
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
}

$this->mkdir($targetDir);
$filesCreatedWhileMirroring = [];

foreach ($iterator as $file) {
if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) {
continue;
}

$target = $targetDir.substr($file->getPathname(), $originDirLen);
$filesCreatedWhileMirroring[$target] = true;

if (!$copyOnWindows && is_link($file)) {
$this->symlink($file->getLinkTarget(), $target);
} elseif (is_dir($file)) {
$this->mkdir($target);
} elseif (is_file($file)) {
$this->copy($file, $target, $options['override'] ?? false);
} else {
throw new IOException(\sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
}
}
}




public function isAbsolutePath(string $file): bool
{
return '' !== $file && (strspn($file, '/\\', 0, 1)
|| (\strlen($file) > 3 && ctype_alpha($file[0])
&& ':' === $file[1]
&& strspn($file, '/\\', 2, 1)
)
|| null !== parse_url($file, \PHP_URL_SCHEME)
);
}










public function tempnam(string $dir, string $prefix, string $suffix = ''): string
{
[$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir);


if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) {

if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) {
if (null !== $scheme && 'gs' !== $scheme) {
return $scheme.'://'.$tmpFile;
}

return $tmpFile;
}

throw new IOException('A temporary file could not be created: '.self::$lastError);
}


for ($i = 0; $i < 10; ++$i) {

$tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true).$suffix;



if (!$handle = self::box('fopen', $tmpFile, 'x+')) {
continue;
}


self::box('fclose', $handle);

return $tmpFile;
}

throw new IOException('A temporary file could not be created: '.self::$lastError);
}










public function dumpFile(string $filename, $content)
{
if (\is_array($content)) {
throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__));
}

$dir = \dirname($filename);

if (is_link($filename) && $linkTarget = $this->readlink($filename)) {
$this->dumpFile(Path::makeAbsolute($linkTarget, $dir), $content);

return;
}

if (!is_dir($dir)) {
$this->mkdir($dir);
}



$tmpFile = $this->tempnam($dir, basename($filename));

try {
if (false === self::box('file_put_contents', $tmpFile, $content)) {
throw new IOException(\sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename);
}

self::box('chmod', $tmpFile, self::box('fileperms', $filename) ?: 0666 & ~umask());

$this->rename($tmpFile, $filename, true);
} finally {
if (file_exists($tmpFile)) {
if ('\\' === \DIRECTORY_SEPARATOR && !is_writable($tmpFile)) {
self::box('chmod', $tmpFile, self::box('fileperms', $tmpFile) | 0200);
}

self::box('unlink', $tmpFile);
}
}
}











public function appendToFile(string $filename, $content)
{
if (\is_array($content)) {
throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__));
}

$dir = \dirname($filename);

if (!is_dir($dir)) {
$this->mkdir($dir);
}

$lock = \func_num_args() > 2 && func_get_arg(2);

if (false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) {
throw new IOException(\sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename);
}
}

private function toIterable(string|iterable $files): iterable
{
return is_iterable($files) ? $files : [$files];
}




private function getSchemeAndHierarchy(string $filename): array
{
$components = explode('://', $filename, 2);

return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]];
}

private static function assertFunctionExists(string $func): void
{
if (!\function_exists($func)) {
throw new IOException(\sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func));
}
}

private static function box(string $func, mixed ...$args): mixed
{
self::assertFunctionExists($func);

self::$lastError = null;
set_error_handler(self::handleError(...));
try {
return $func(...$args);
} finally {
restore_error_handler();
}
}




public static function handleError(int $type, string $msg): void
{
self::$lastError = $msg;
}
}
<?php










namespace Symfony\Component\Filesystem\Exception;






interface IOExceptionInterface extends ExceptionInterface
{



public function getPath(): ?string;
}
<?php










namespace Symfony\Component\Filesystem\Exception;








class IOException extends \RuntimeException implements IOExceptionInterface
{
private ?string $path;

public function __construct(string $message, int $code = 0, ?\Throwable $previous = null, ?string $path = null)
{
$this->path = $path;

parent::__construct($message, $code, $previous);
}

public function getPath(): ?string
{
return $this->path;
}
}
<?php










namespace Symfony\Component\Filesystem\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Filesystem\Exception;




class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Filesystem\Exception;




class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Filesystem\Exception;







class FileNotFoundException extends IOException
{
public function __construct(?string $message = null, int $code = 0, ?\Throwable $previous = null, ?string $path = null)
{
if (null === $message) {
if (null === $path) {
$message = 'File could not be found.';
} else {
$message = \sprintf('File "%s" could not be found.', $path);
}
}

parent::__construct($message, $code, $previous, $path);
}
}
<?php










namespace Symfony\Component\Filesystem;

use Symfony\Component\Filesystem\Exception\InvalidArgumentException;
use Symfony\Component\Filesystem\Exception\RuntimeException;












final class Path
{



private const CLEANUP_THRESHOLD = 1250;




private const CLEANUP_SIZE = 1000;






private static array $buffer = [];

private static int $bufferSize = 0;


















public static function canonicalize(string $path): string
{
if ('' === $path) {
return '';
}




if (isset(self::$buffer[$path])) {
return self::$buffer[$path];
}


if ('~' === $path[0]) {
$path = self::getHomeDirectory().substr($path, 1);
}

$path = self::normalize($path);

[$root, $pathWithoutRoot] = self::split($path);

$canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot);


self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts);
++self::$bufferSize;


if (self::$bufferSize > self::CLEANUP_THRESHOLD) {
self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true);
self::$bufferSize = self::CLEANUP_SIZE;
}

return $canonicalPath;
}












public static function normalize(string $path): string
{
return str_replace('\\', '/', $path);
}
























public static function getDirectory(string $path): string
{
if ('' === $path) {
return '';
}

$path = self::canonicalize($path);


if (false !== $schemeSeparatorPosition = strpos($path, '://')) {
$scheme = substr($path, 0, $schemeSeparatorPosition + 3);
$path = substr($path, $schemeSeparatorPosition + 3);
} else {
$scheme = '';
}

if (false === $dirSeparatorPosition = strrpos($path, '/')) {
return '';
}


if (0 === $dirSeparatorPosition) {
return $scheme.'/';
}


if (2 === $dirSeparatorPosition && ctype_alpha($path[0]) && ':' === $path[1]) {
return $scheme.substr($path, 0, 3);
}

return $scheme.substr($path, 0, $dirSeparatorPosition);
}















public static function getHomeDirectory(): string
{

if (getenv('HOME')) {
return self::canonicalize(getenv('HOME'));
}


if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) {
return self::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH'));
}

throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported.");
}









public static function getRoot(string $path): string
{
if ('' === $path) {
return '';
}


if (false !== $schemeSeparatorPosition = strpos($path, '://')) {
$scheme = substr($path, 0, $schemeSeparatorPosition + 3);
$path = substr($path, $schemeSeparatorPosition + 3);
} else {
$scheme = '';
}

$firstCharacter = $path[0];


if ('/' === $firstCharacter || '\\' === $firstCharacter) {
return $scheme.'/';
}

$length = \strlen($path);


if ($length > 1 && ':' === $path[1] && ctype_alpha($firstCharacter)) {

if (2 === $length) {
return $scheme.$path.'/';
}


if ('/' === $path[2] || '\\' === $path[2]) {
return $scheme.$firstCharacter.$path[1].'/';
}
}

return '';
}







public static function getFilenameWithoutExtension(string $path, ?string $extension = null): string
{
if ('' === $path) {
return '';
}

if (null !== $extension) {

return rtrim(basename($path, $extension), '.');
}

return pathinfo($path, \PATHINFO_FILENAME);
}






public static function getExtension(string $path, bool $forceLowerCase = false): string
{
if ('' === $path) {
return '';
}

$extension = pathinfo($path, \PATHINFO_EXTENSION);

if ($forceLowerCase) {
$extension = self::toLower($extension);
}

return $extension;
}












public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = false): bool
{
if ('' === $path) {
return false;
}

$actualExtension = self::getExtension($path, $ignoreCase);


if ([] === $extensions || null === $extensions) {
return '' !== $actualExtension;
}

if (\is_string($extensions)) {
$extensions = [$extensions];
}

foreach ($extensions as $key => $extension) {
if ($ignoreCase) {
$extension = self::toLower($extension);
}


$extensions[$key] = ltrim($extension, '.');
}

return \in_array($actualExtension, $extensions, true);
}









public static function changeExtension(string $path, string $extension): string
{
if ('' === $path) {
return '';
}

$actualExtension = self::getExtension($path);
$extension = ltrim($extension, '.');


if ('/' === substr($path, -1)) {
return $path;
}


if (empty($actualExtension)) {
return $path.('.' === substr($path, -1) ? '' : '.').$extension;
}

return substr($path, 0, -\strlen($actualExtension)).$extension;
}

public static function isAbsolute(string $path): bool
{
if ('' === $path) {
return false;
}


if (false !== ($schemeSeparatorPosition = strpos($path, '://')) && 1 !== $schemeSeparatorPosition) {
$path = substr($path, $schemeSeparatorPosition + 3);
}

$firstCharacter = $path[0];


if ('/' === $firstCharacter || '\\' === $firstCharacter) {
return true;
}


if (\strlen($path) > 1 && ctype_alpha($firstCharacter) && ':' === $path[1]) {

if (2 === \strlen($path)) {
return true;
}


if ('/' === $path[2] || '\\' === $path[2]) {
return true;
}
}

return false;
}

public static function isRelative(string $path): bool
{
return !self::isAbsolute($path);
}






































public static function makeAbsolute(string $path, string $basePath): string
{
if ('' === $basePath) {
throw new InvalidArgumentException(\sprintf('The base path must be a non-empty string. Got: "%s".', $basePath));
}

if (!self::isAbsolute($basePath)) {
throw new InvalidArgumentException(\sprintf('The base path "%s" is not an absolute path.', $basePath));
}

if (self::isAbsolute($path)) {
return self::canonicalize($path);
}

if (false !== $schemeSeparatorPosition = strpos($basePath, '://')) {
$scheme = substr($basePath, 0, $schemeSeparatorPosition + 3);
$basePath = substr($basePath, $schemeSeparatorPosition + 3);
} else {
$scheme = '';
}

return $scheme.self::canonicalize(rtrim($basePath, '/\\').'/'.$path);
}



















































public static function makeRelative(string $path, string $basePath): string
{
$path = self::canonicalize($path);
$basePath = self::canonicalize($basePath);

[$root, $relativePath] = self::split($path);
[$baseRoot, $relativeBasePath] = self::split($basePath);




if ('' === $root && '' !== $baseRoot) {

if ('' === $relativeBasePath) {
$relativePath = ltrim($relativePath, './\\');
}

return $relativePath;
}



if ('' !== $root && '' === $baseRoot) {
throw new InvalidArgumentException(\sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath));
}


if ($baseRoot && $root !== $baseRoot) {
throw new InvalidArgumentException(\sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot));
}

if ('' === $relativeBasePath) {
return $relativePath;
}


$parts = explode('/', $relativePath);
$baseParts = explode('/', $relativeBasePath);
$dotDotPrefix = '';



$match = true;

foreach ($baseParts as $index => $basePart) {
if ($match && isset($parts[$index]) && $basePart === $parts[$index]) {
unset($parts[$index]);

continue;
}

$match = false;
$dotDotPrefix .= '../';
}

return rtrim($dotDotPrefix.implode('/', $parts), '/');
}




public static function isLocal(string $path): bool
{
return '' !== $path && !str_contains($path, '://');
}





































public static function getLongestCommonBasePath(string ...$paths): ?string
{
[$bpRoot, $basePath] = self::split(self::canonicalize(reset($paths)));

for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) {
[$root, $path] = self::split(self::canonicalize(current($paths)));



if ($root !== $bpRoot) {
return null;
}


while (true) {
if ('.' === $basePath) {

$basePath = '';


continue 2;
}



if (str_starts_with($path.'/', $basePath.'/')) {

continue 2;
}

$basePath = \dirname($basePath);
}
}

return $bpRoot.$basePath;
}




public static function join(string ...$paths): string
{
$finalPath = null;
$wasScheme = false;

foreach ($paths as $path) {
if ('' === $path) {
continue;
}

if (null === $finalPath) {

$finalPath = $path;
$wasScheme = str_contains($path, '://');
continue;
}


if (!\in_array(substr($finalPath, -1), ['/', '\\'])) {
$finalPath .= '/';
}


$finalPath .= $wasScheme ? $path : ltrim($path, '/');
$wasScheme = false;
}

if (null === $finalPath) {
return '';
}

return self::canonicalize($finalPath);
}





















public static function isBasePath(string $basePath, string $ofPath): bool
{
$basePath = self::canonicalize($basePath);
$ofPath = self::canonicalize($ofPath);






return str_starts_with($ofPath.'/', rtrim($basePath, '/').'/');
}




private static function findCanonicalParts(string $root, string $pathWithoutRoot): array
{
$parts = explode('/', $pathWithoutRoot);

$canonicalParts = [];


foreach ($parts as $part) {
if ('.' === $part || '' === $part) {
continue;
}



if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) {
array_pop($canonicalParts);

continue;
}


if ('..' !== $part || '' === $root) {
$canonicalParts[] = $part;
}
}

return $canonicalParts;
}


















private static function split(string $path): array
{
if ('' === $path) {
return ['', ''];
}


if (false !== $schemeSeparatorPosition = strpos($path, '://')) {
$root = substr($path, 0, $schemeSeparatorPosition + 3);
$path = substr($path, $schemeSeparatorPosition + 3);
} else {
$root = '';
}

$length = \strlen($path);


if (str_starts_with($path, '/')) {
$root .= '/';
$path = $length > 1 ? substr($path, 1) : '';
} elseif ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) {
if (2 === $length) {

$root .= $path.'/';
$path = '';
} elseif ('/' === $path[2]) {

$root .= substr($path, 0, 3);
$path = $length > 3 ? substr($path, 3) : '';
}
}

return [$root, $path];
}

private static function toLower(string $string): string
{
if (false !== $encoding = mb_detect_encoding($string, null, true)) {
return mb_strtolower($string, $encoding);
}

return strtolower($string);
}

private function __construct()
{
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;






class Reference
{
public int $count = 0;

public function __construct(
public readonly int $id,
public readonly mixed $value = null,
) {
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\Serializer\Attribute\Ignore;
use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry;




trait LazyDecoratorTrait
{
#[Ignore]
private readonly LazyObjectState $lazyObjectState;







public static function createLazyProxy(\Closure $initializer, ?object $instance = null): static
{
$class = $instance ? $instance::class : static::class;

if (self::class === $class && \defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) {
Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES;
}

$instance ??= (Registry::$classReflectors[$class] ??= ($r = new \ReflectionClass($class))->hasProperty('lazyObjectState')
? $r
: throw new \LogicException('Cannot create a lazy proxy for a non-decorator object.')
)->newInstanceWithoutConstructor();

$state = $instance->lazyObjectState ??= new LazyObjectState();
$state->initializer = null;
unset($state->realInstance);

foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) {
$reset($instance, []);
}
$state->initializer = $initializer;

return $instance;
}

public function __construct(...$args)
{
self::createLazyProxy(static fn () => new parent(...$args), $this);
}

public function __destruct()
{
}

#[Ignore]
public function isLazyObjectInitialized(bool $partial = false): bool
{
return isset($this->lazyObjectState->realInstance);
}

public function initializeLazyObject(): parent
{
return $this->lazyObjectState->realInstance;
}

public function resetLazyObject(): bool
{
if (!isset($this->lazyObjectState->initializer)) {
return false;
}
unset($this->lazyObjectState->realInstance);

return true;
}

public function &__get($name): mixed
{
$instance = $this->lazyObjectState->realInstance;
$class = $this::class;

$propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);
$notByRef = 0;

if ([, , , $access] = $propertyScopes[$name] ?? null) {
$notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF || ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET;
}

if ($notByRef || 2 !== ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['get'] ?: 2)) {
$value = $instance->$name;

return $value;
}

try {
return $instance->$name;
} catch (\Error $e) {
if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) {
throw $e;
}

try {
$instance->$name = [];

return $instance->$name;
} catch (\Error) {
if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) {
throw new \Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious());
}

throw $e;
}
}
}

public function __set($name, $value): void
{
$this->lazyObjectState->realInstance->$name = $value;
}

public function __isset($name): bool
{
return isset($this->lazyObjectState->realInstance->$name);
}

public function __unset($name): void
{
if ($this->lazyObjectState->initializer) {
unset($this->lazyObjectState->realInstance->$name);
}
}

public function __serialize(): array
{
return [$this->lazyObjectState->realInstance];
}

public function __unserialize($data): void
{
$this->lazyObjectState = new LazyObjectState();
$this->lazyObjectState->realInstance = $data[0];
}

public function __clone(): void
{
$this->lazyObjectState->realInstance; 
$this->lazyObjectState = clone $this->lazyObjectState;
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\Serializer\Attribute\Ignore;

if (\PHP_VERSION_ID >= 80300) {



trait LazyObjectTrait
{
#[Ignore]
private readonly LazyObjectState $lazyObjectState;
}
} else {



trait LazyObjectTrait
{
#[Ignore]
private LazyObjectState $lazyObjectState;
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;






class Exporter
{















public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic)
{
$refs = $values;
foreach ($values as $k => $value) {
if (\is_resource($value)) {
throw new NotInstantiableTypeException(get_resource_type($value).' resource');
}
$refs[$k] = $objectsPool;

if ($isRef = !$valueIsStatic = $values[$k] !== $objectsPool) {
$values[$k] = &$value; 
unset($value); 
$refs[$k] = $value = $values[$k];
if ($value instanceof Reference && 0 > $value->id) {
$valuesAreStatic = false;
++$value->count;
continue;
}
$refsPool[] = [&$refs[$k], $value, &$value];
$refs[$k] = $values[$k] = new Reference(-\count($refsPool), $value);
}

if (\is_array($value)) {
if ($value) {
$value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);
}
goto handle_value;
} elseif (!\is_object($value) || $value instanceof \UnitEnum) {
goto handle_value;
}

$valueIsStatic = false;
if (isset($objectsPool[$value])) {
++$objectsCount;
$value = new Reference($objectsPool[$value][0]);
goto handle_value;
}

$class = $value::class;
$reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class);
$properties = [];
$sleep = null;
$proto = Registry::$prototypes[$class];

if ($reflector->hasMethod('__serialize')) {
if (!$reflector->getMethod('__serialize')->isPublic()) {
throw new \Error(\sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class));
}

if (!\is_array($arrayValue = $value->__serialize())) {
throw new \TypeError($class.'::__serialize() must return an array');
}

if ($reflector->hasMethod('__unserialize')) {
$properties = $arrayValue;
goto prepare_value;
}
} elseif (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) {


[$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto);


Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]);
} elseif ($value instanceof \SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) {


foreach (clone $value as $v) {
$properties[] = $v;
$properties[] = $value[$v];
}
$properties = ['SplObjectStorage' => ["\0" => $properties]];
$arrayValue = (array) $value;
} elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class) {
++$objectsCount;
$objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0];
$value = new Reference($id);
goto handle_value;
} else {
if (method_exists($class, '__sleep')) {
if (!\is_array($sleep = $value->__sleep())) {
trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \E_USER_NOTICE);
$value = null;
goto handle_value;
}
$sleep = array_flip($sleep);
}

$arrayValue = (array) $value;
}

$proto = (array) $proto;

foreach ($arrayValue as $name => $v) {
$i = 0;
$n = (string) $name;
if ('' === $n || "\0" !== $n[0]) {
$parent = $reflector;
do {
$p = $parent->hasProperty($n) ? $parent->getProperty($n) : null;
} while (!$p && $parent = $parent->getParentClass());

$c = $p && (!$p->isPublic() || (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly())) ? $p->class : 'stdClass';
} elseif ('*' === $n[1]) {
$n = substr($n, 3);
$c = $reflector->getProperty($n)->class;
} else {
$i = strpos($n, "\0", 2);
$c = substr($n, 1, $i - 1);
$n = substr($n, 1 + $i);
}
if (null !== $sleep) {
if (!isset($sleep[$name]) && (!isset($sleep[$n]) || ($i && $c !== $class))) {
unset($arrayValue[$name]);
continue;
}
unset($sleep[$name], $sleep[$n]);
}
if ("\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) {
$properties[$c][$n] = $v;
} elseif (!\array_key_exists($name, $proto) || $proto[$name] !== $v) {
$properties[match ($c) {
'Error' => 'TypeError',
'Exception' => 'ErrorException',
default => $c,
}][$n] = $v;
}
}
if ($sleep) {
foreach ($sleep as $n => $v) {
trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE);
}
}
if (method_exists($class, '__unserialize')) {
$properties = $arrayValue;
}

prepare_value:
$objectsPool[$value] = [$id = \count($objectsPool)];
$properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic);
++$objectsCount;
$objectsPool[$value] = [$id, $class, $properties, method_exists($class, '__unserialize') ? -$objectsCount : (method_exists($class, '__wakeup') ? $objectsCount : 0)];

$value = new Reference($id);

handle_value:
if ($isRef) {
unset($value); 
} elseif (!$valueIsStatic) {
$values[$k] = $value;
}
$valuesAreStatic = $valueIsStatic && $valuesAreStatic;
}

return $values;
}

public static function export($value, $indent = '')
{
switch (true) {
case \is_int($value) || \is_float($value): return var_export($value, true);
case [] === $value: return '[]';
case false === $value: return 'false';
case true === $value: return 'true';
case null === $value: return 'null';
case '' === $value: return "''";
case $value instanceof \UnitEnum: return '\\'.ltrim(var_export($value, true), '\\');
}

if ($value instanceof Reference) {
if (0 <= $value->id) {
return '$o['.$value->id.']';
}
if (!$value->count) {
return self::export($value->value, $indent);
}
$value = -$value->id;

return '&$r['.$value.']';
}
$subIndent = $indent.'    ';

if (\is_string($value)) {
$code = \sprintf("'%s'", addcslashes($value, "'\\"));

$code = preg_replace_callback("/((?:[\\0\\r\\n]|\u{202A}|\u{202B}|\u{202D}|\u{202E}|\u{2066}|\u{2067}|\u{2068}|\u{202C}|\u{2069})++)(.)/", function ($m) use ($subIndent) {
$m[1] = \sprintf('\'."%s".\'', str_replace(
["\0", "\r", "\n", "\u{202A}", "\u{202B}", "\u{202D}", "\u{202E}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{202C}", "\u{2069}", '\n\\'],
['\0', '\r', '\n', '\u{202A}', '\u{202B}', '\u{202D}', '\u{202E}', '\u{2066}', '\u{2067}', '\u{2068}', '\u{202C}', '\u{2069}', '\n"'."\n".$subIndent.'."\\'],
$m[1]
));

if ("'" === $m[2]) {
return substr($m[1], 0, -2);
}

if (str_ends_with($m[1], 'n".\'')) {
return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2);
}

return $m[1].$m[2];
}, $code, -1, $count);

if ($count && str_starts_with($code, "''.")) {
$code = substr($code, 3);
}

return $code;
}

if (\is_array($value)) {
$j = -1;
$code = '';
foreach ($value as $k => $v) {
$code .= $subIndent;
if (!\is_int($k) || 1 !== $k - $j) {
$code .= self::export($k, $subIndent).' => ';
}
if (\is_int($k) && $k > $j) {
$j = $k;
}
$code .= self::export($v, $subIndent).",\n";
}

return "[\n".$code.$indent.']';
}

if ($value instanceof Values) {
$code = $subIndent."\$r = [],\n";
foreach ($value->values as $k => $v) {
$code .= $subIndent.'$r['.$k.'] = '.self::export($v, $subIndent).",\n";
}

return "[\n".$code.$indent.']';
}

if ($value instanceof Registry) {
return self::exportRegistry($value, $indent, $subIndent);
}

if ($value instanceof Hydrator) {
return self::exportHydrator($value, $indent, $subIndent);
}

throw new \UnexpectedValueException(\sprintf('Cannot export value of type "%s".', get_debug_type($value)));
}

private static function exportRegistry(Registry $value, string $indent, string $subIndent): string
{
$code = '';
$serializables = [];
$seen = [];
$prototypesAccess = 0;
$factoriesAccess = 0;
$r = '\\'.Registry::class;
$j = -1;

foreach ($value->classes as $k => $class) {
if (':' === ($class[1] ?? null)) {
$serializables[$k] = $class;
continue;
}
if (!Registry::$instantiableWithoutConstructor[$class]) {
if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) {
$serializables[$k] = 'C:'.\strlen($class).':"'.$class.'":0:{}';
} else {
$serializables[$k] = 'O:'.\strlen($class).':"'.$class.'":0:{}';
}
if (is_subclass_of($class, 'Throwable')) {
$eol = is_subclass_of($class, 'Error') ? "\0Error\0" : "\0Exception\0";
$serializables[$k] = substr_replace($serializables[$k], '1:{s:'.(5 + \strlen($eol)).':"'.$eol.'trace";a:0:{}}', -4);
}
continue;
}
$code .= $subIndent.(1 !== $k - $j ? $k.' => ' : '');
$j = $k;
$eol = ",\n";
$c = '['.self::export($class).']';

if ($seen[$class] ?? false) {
if (Registry::$cloneable[$class]) {
++$prototypesAccess;
$code .= 'clone $p'.$c;
} else {
++$factoriesAccess;
$code .= '$f'.$c.'()';
}
} else {
$seen[$class] = true;
if (Registry::$cloneable[$class]) {
$code .= 'clone ('.($prototypesAccess++ ? '$p' : '($p = &'.$r.'::$prototypes)').$c.' ?? '.$r.'::p';
} else {
$code .= '('.($factoriesAccess++ ? '$f' : '($f = &'.$r.'::$factories)').$c.' ?? '.$r.'::f';
$eol = '()'.$eol;
}
$code .= '('.substr($c, 1, -1).'))';
}
$code .= $eol;
}

if (1 === $prototypesAccess) {
$code = str_replace('($p = &'.$r.'::$prototypes)', $r.'::$prototypes', $code);
}
if (1 === $factoriesAccess) {
$code = str_replace('($f = &'.$r.'::$factories)', $r.'::$factories', $code);
}
if ('' !== $code) {
$code = "\n".$code.$indent;
}

if ($serializables) {
$code = $r.'::unserialize(['.$code.'], '.self::export($serializables, $indent).')';
} else {
$code = '['.$code.']';
}

return '$o = '.$code;
}

private static function exportHydrator(Hydrator $value, string $indent, string $subIndent): string
{
$code = '';
foreach ($value->properties as $class => $properties) {
$code .= $subIndent.'    '.self::export($class).' => '.self::export($properties, $subIndent.'    ').",\n";
}

$code = [
self::export($value->registry, $subIndent),
self::export($value->values, $subIndent),
'' !== $code ? "[\n".$code.$subIndent.']' : '[]',
self::export($value->value, $subIndent),
self::export($value->wakeups, $subIndent),
];

return '\\'.$value::class."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')';
}





private static function getArrayObjectProperties($value, $proto): array
{
$reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject';
$reflector = Registry::$reflectors[$reflector] ??= Registry::getClassReflector($reflector);

$properties = [
$arrayValue = (array) $value,
$reflector->getMethod('getFlags')->invoke($value),
$value instanceof \ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator',
];

$reflector = $reflector->getMethod('setFlags');
$reflector->invoke($proto, \ArrayObject::STD_PROP_LIST);

if ($properties[1] & \ArrayObject::STD_PROP_LIST) {
$reflector->invoke($value, 0);
$properties[0] = (array) $value;
} else {
$reflector->invoke($value, \ArrayObject::STD_PROP_LIST);
$arrayValue = (array) $value;
}
$reflector->invoke($value, $properties[1]);

if ([[], 0, 'ArrayIterator'] === $properties) {
$properties = [];
} else {
if ('ArrayIterator' === $properties[2]) {
unset($properties[2]);
}
$properties = [$reflector->class => ["\0" => $properties]];
}

return [$arrayValue, $properties];
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\VarExporter\Hydrator as PublicHydrator;








class LazyObjectState
{
public const STATUS_UNINITIALIZED_FULL = 1;
public const STATUS_UNINITIALIZED_PARTIAL = 2;
public const STATUS_INITIALIZED_FULL = 3;
public const STATUS_INITIALIZED_PARTIAL = 4;




public int $status = self::STATUS_UNINITIALIZED_FULL;

public object $realInstance;
public object $cloneInstance;




public function __construct(
public ?\Closure $initializer = null,
public array $skippedProperties = [],
) {
}

public function initialize($instance, $propertyName, $writeScope)
{
if (self::STATUS_UNINITIALIZED_FULL !== $this->status) {
return $this->status;
}

$this->status = self::STATUS_INITIALIZED_PARTIAL;

try {
if ($defaultProperties = array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) {
PublicHydrator::hydrate($instance, $defaultProperties);
}

($this->initializer)($instance);
} catch (\Throwable $e) {
$this->status = self::STATUS_UNINITIALIZED_FULL;
$this->reset($instance);

throw $e;
}

return $this->status = self::STATUS_INITIALIZED_FULL;
}

public function reset($instance): void
{
$class = $instance::class;
$propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);
$skippedProperties = $this->skippedProperties;
$properties = (array) $instance;

foreach ($propertyScopes as $key => [$scope, $name, , $access]) {
$propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name;

if ($k === $key && ($access & Hydrator::PROPERTY_HAS_HOOKS || ($access >> 2) & \ReflectionProperty::IS_READONLY || !\array_key_exists($k, $properties))) {
$skippedProperties[$k] = true;
}
}

foreach (LazyObjectRegistry::$classResetters[$class] as $reset) {
$reset($instance, $skippedProperties);
}

foreach ((array) $instance as $name => $value) {
if ("\0" !== ($name[0] ?? '') && !\array_key_exists($name, $skippedProperties)) {
unset($instance->$name);
}
}

$this->status = self::STATUS_UNINITIALIZED_FULL;
}

public function __clone()
{
if (isset($this->cloneInstance)) {
try {
$this->realInstance = $this->cloneInstance;
} finally {
unset($this->cloneInstance);
}
} elseif (isset($this->realInstance)) {
$this->realInstance = clone $this->realInstance;
}
}

public function __get($name)
{
if ('realInstance' !== $name) {
throw new \BadMethodCallException(\sprintf('No such property "%s::$%s"', self::class, $name));
}

return $this->realInstance = ($this->initializer)();
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;








class LazyObjectRegistry
{



public static array $classReflectors = [];




public static array $defaultProperties = [];




public static array $classResetters = [];




public static array $classAccessors = [];




public static array $parentMethods = [];

public static ?\Closure $noInitializerState = null;

public static function getClassResetters($class)
{
$classProperties = [];
$hookedProperties = [];

if ((self::$classReflectors[$class] ??= new \ReflectionClass($class))->isInternal()) {
$propertyScopes = [];
} else {
$propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class);
}

foreach ($propertyScopes as $key => [$scope, $name, $writeScope, $access]) {
$propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name;

if ($k !== $key || "\0$class\0lazyObjectState" === $k) {
continue;
}

if ($access & Hydrator::PROPERTY_HAS_HOOKS) {
$hookedProperties[$k] = true;
} else {
$classProperties[$writeScope ?? $scope][$name] = $key;
}
}

$resetters = [];
foreach ($classProperties as $scope => $properties) {
$resetters[] = \Closure::bind(static function ($instance, $skippedProperties) use ($properties) {
foreach ($properties as $name => $key) {
if (!\array_key_exists($key, $skippedProperties)) {
unset($instance->$name);
}
}
}, null, $scope);
}

return $resetters;
}

public static function getClassAccessors($class)
{
return \Closure::bind(static fn () => [
'get' => static function &($instance, $name, $notByRef) {
if (!$notByRef) {
return $instance->$name;
}
$value = $instance->$name;

return $value;
},
'set' => static function ($instance, $name, $value) {
$instance->$name = $value;
},
'isset' => static fn ($instance, $name) => isset($instance->$name),
'unset' => static function ($instance, $name) {
unset($instance->$name);
},
], null, \Closure::class === $class ? null : $class)();
}

public static function getParentMethods($class)
{
$parent = get_parent_class($class);
$methods = [];

foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) {
if (!$parent || !method_exists($parent, '__'.$method)) {
$methods[$method] = false;
} else {
$m = new \ReflectionMethod($parent, '__'.$method);
$methods[$method] = !$m->isAbstract() && !$m->isPrivate();
}
}

$methods['get'] = $methods['get'] ? ($m->returnsReference() ? 2 : 1) : 0;

return $methods;
}

public static function getScopeForRead($propertyScopes, $class, $property)
{
if (!isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) {
return null;
}
$frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];

if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) {
$scope = $frame['object']->class;
}
if ('*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
return null;
}

return $scope;
}

public static function getScopeForWrite($propertyScopes, $class, $property, $flags)
{
if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET | \ReflectionProperty::IS_PROTECTED_SET : 0)))) {
return null;
}
$frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];

if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) {
$scope = $frame['object']->class;
}
if ($flags & (\ReflectionProperty::IS_PRIVATE | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY))) {
return $scope;
}
if ($flags & (\ReflectionProperty::IS_PROTECTED | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PROTECTED_SET : 0)) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
return null;
}

return $scope;
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\VarExporter\Exception\ClassNotFoundException;
use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;






class Registry
{
public static array $reflectors = [];
public static array $prototypes = [];
public static array $factories = [];
public static array $cloneable = [];
public static array $instantiableWithoutConstructor = [];

public function __construct(
public readonly array $classes,
) {
}

public static function unserialize($objects, $serializables)
{
$unserializeCallback = ini_set('unserialize_callback_func', __CLASS__.'::getClassReflector');

try {
foreach ($serializables as $k => $v) {
$objects[$k] = unserialize($v);
}
} finally {
ini_set('unserialize_callback_func', $unserializeCallback);
}

return $objects;
}

public static function p($class)
{
self::getClassReflector($class, true, true);

return self::$prototypes[$class];
}

public static function f($class)
{
$reflector = self::$reflectors[$class] ??= self::getClassReflector($class, true, false);

return self::$factories[$class] = $reflector->newInstanceWithoutConstructor(...);
}

public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null)
{
if (!($isClass = class_exists($class)) && !interface_exists($class, false) && !trait_exists($class, false)) {
throw new ClassNotFoundException($class);
}
$reflector = new \ReflectionClass($class);

if ($instantiableWithoutConstructor) {
$proto = $reflector->newInstanceWithoutConstructor();
} elseif (!$isClass || $reflector->isAbstract()) {
throw new NotInstantiableTypeException($class);
} elseif ($reflector->name !== $class) {
$reflector = self::$reflectors[$name = $reflector->name] ??= self::getClassReflector($name, false, $cloneable);
self::$cloneable[$class] = self::$cloneable[$name];
self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name];
self::$prototypes[$class] = self::$prototypes[$name];

return $reflector;
} else {
try {
$proto = $reflector->newInstanceWithoutConstructor();
$instantiableWithoutConstructor = true;
} catch (\ReflectionException) {
$proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:';
if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) {
$proto = null;
} else {
try {
$proto = @unserialize($proto.\strlen($class).':"'.$class.'":0:{}');
} catch (\Exception $e) {
if (__FILE__ !== $e->getFile()) {
throw $e;
}
throw new NotInstantiableTypeException($class, $e);
}
if (false === $proto) {
throw new NotInstantiableTypeException($class);
}
}
}
if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) {
try {
serialize($proto);
} catch (\Exception $e) {
throw new NotInstantiableTypeException($class, $e);
}
}
}

if (null === $cloneable) {
if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && !method_exists($class, '__unserialize'))) {
throw new NotInstantiableTypeException($class);
}

$cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone');
}

self::$cloneable[$class] = $cloneable;
self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor;
self::$prototypes[$class] = $proto;

if ($proto instanceof \Throwable) {
static $setTrace;

if (null === $setTrace) {
$setTrace = [
new \ReflectionProperty(\Error::class, 'trace'),
new \ReflectionProperty(\Exception::class, 'trace'),
];
$setTrace[0] = $setTrace[0]->setValue(...);
$setTrace[1] = $setTrace[1]->setValue(...);
}

$setTrace[$proto instanceof \Exception]($proto, []);
}

return $reflector;
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;

use Symfony\Component\VarExporter\Exception\ClassNotFoundException;






class Hydrator
{
public const PROPERTY_HAS_HOOKS = 1;
public const PROPERTY_NOT_BY_REF = 2;

public static array $hydrators = [];
public static array $simpleHydrators = [];
public static array $propertyScopes = [];

public function __construct(
public readonly Registry $registry,
public readonly ?Values $values,
public readonly array $properties,
public readonly mixed $value,
public readonly array $wakeups,
) {
}

public static function hydrate($objects, $values, $properties, $value, $wakeups)
{
foreach ($properties as $class => $vars) {
(self::$hydrators[$class] ??= self::getHydrator($class))($vars, $objects);
}
foreach ($wakeups as $k => $v) {
if (\is_array($v)) {
$objects[-$k]->__unserialize($v);
} else {
$objects[$v]->__wakeup();
}
}

return $value;
}

public static function getHydrator($class)
{
$baseHydrator = self::$hydrators['stdClass'] ??= static function ($properties, $objects) {
foreach ($properties as $name => $values) {
foreach ($values as $i => $v) {
$objects[$i]->$name = $v;
}
}
};

switch ($class) {
case 'stdClass':
return $baseHydrator;

case 'ErrorException':
return $baseHydrator->bindTo(null, new class extends \ErrorException {
});

case 'TypeError':
return $baseHydrator->bindTo(null, new class extends \Error {
});

case 'SplObjectStorage':
return static function ($properties, $objects) {
foreach ($properties as $name => $values) {
if ("\0" === $name) {
foreach ($values as $i => $v) {
for ($j = 0; $j < \count($v); ++$j) {
$objects[$i][$v[$j]] = $v[++$j];
}
}
continue;
}
foreach ($values as $i => $v) {
$objects[$i]->$name = $v;
}
}
};
}

if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
throw new ClassNotFoundException($class);
}
$classReflector = new \ReflectionClass($class);

switch ($class) {
case 'ArrayIterator':
case 'ArrayObject':
$constructor = $classReflector->getConstructor()->invokeArgs(...);

return static function ($properties, $objects) use ($constructor) {
foreach ($properties as $name => $values) {
if ("\0" !== $name) {
foreach ($values as $i => $v) {
$objects[$i]->$name = $v;
}
}
}
foreach ($properties["\0"] ?? [] as $i => $v) {
$constructor($objects[$i], $v);
}
};
}

if (!$classReflector->isInternal()) {
return $baseHydrator->bindTo(null, $class);
}

if ($classReflector->name !== $class) {
return self::$hydrators[$classReflector->name] ??= self::getHydrator($classReflector->name);
}

$propertySetters = [];
foreach ($classReflector->getProperties() as $propertyReflector) {
if (!$propertyReflector->isStatic()) {
$propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...);
}
}

if (!$propertySetters) {
return $baseHydrator;
}

return static function ($properties, $objects) use ($propertySetters) {
foreach ($properties as $name => $values) {
if ($setValue = $propertySetters[$name] ?? null) {
foreach ($values as $i => $v) {
$setValue($objects[$i], $v);
}
continue;
}
foreach ($values as $i => $v) {
$objects[$i]->$name = $v;
}
}
};
}

public static function getSimpleHydrator($class)
{
$baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) {
$notByRef = (array) $this;

foreach ($properties as $name => &$value) {
if (!$noRef = $notByRef[$name] ?? false) {
$object->$name = $value;
$object->$name = &$value;
} elseif (true !== $noRef) {
$noRef($object, $value);
} else {
$object->$name = $value;
}
}
})->bindTo(new \stdClass());

switch ($class) {
case 'stdClass':
return $baseHydrator;

case 'ErrorException':
return $baseHydrator->bindTo(new \stdClass(), new class extends \ErrorException {
});

case 'TypeError':
return $baseHydrator->bindTo(new \stdClass(), new class extends \Error {
});

case 'SplObjectStorage':
return static function ($properties, $object) {
foreach ($properties as $name => &$value) {
if ("\0" !== $name) {
$object->$name = $value;
$object->$name = &$value;
continue;
}
for ($i = 0; $i < \count($value); ++$i) {
$object[$value[$i]] = $value[++$i];
}
}
};
}

if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
throw new ClassNotFoundException($class);
}
$classReflector = new \ReflectionClass($class);

switch ($class) {
case 'ArrayIterator':
case 'ArrayObject':
$constructor = $classReflector->getConstructor()->invokeArgs(...);

return static function ($properties, $object) use ($constructor) {
foreach ($properties as $name => &$value) {
if ("\0" === $name) {
$constructor($object, $value);
} else {
$object->$name = $value;
$object->$name = &$value;
}
}
};
}

if (!$classReflector->isInternal()) {
$notByRef = new \stdClass();
foreach ($classReflector->getProperties() as $propertyReflector) {
if ($propertyReflector->isStatic()) {
continue;
}
if (\PHP_VERSION_ID >= 80400 && !$propertyReflector->isAbstract() && $propertyReflector->getHooks()) {
$notByRef->{$propertyReflector->name} = $propertyReflector->setRawValue(...);
} elseif ($propertyReflector->isReadOnly()) {
$notByRef->{$propertyReflector->name} = true;
}
}

return $baseHydrator->bindTo($notByRef, $class);
}

if ($classReflector->name !== $class) {
return self::$simpleHydrators[$classReflector->name] ??= self::getSimpleHydrator($classReflector->name);
}

$propertySetters = [];
foreach ($classReflector->getProperties() as $propertyReflector) {
if (!$propertyReflector->isStatic()) {
$propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...);
}
}

if (!$propertySetters) {
return $baseHydrator;
}

return static function ($properties, $object) use ($propertySetters) {
foreach ($properties as $name => &$value) {
if ($setValue = $propertySetters[$name] ?? null) {
$setValue($object, $value);
} else {
$object->$name = $value;
$object->$name = &$value;
}
}
};
}

public static function getPropertyScopes($class): array
{
$propertyScopes = [];
$r = new \ReflectionClass($class);

foreach ($r->getProperties() as $property) {
$flags = $property->getModifiers();

if (\ReflectionProperty::IS_STATIC & $flags) {
continue;
}
$name = $property->name;
$access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0);

if (\PHP_VERSION_ID >= 80400 && !$property->isAbstract() && $h = $property->getHooks()) {
$access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0);
}

if (\ReflectionProperty::IS_PRIVATE & $flags) {
$propertyScopes["\0$class\0$name"] = $propertyScopes[$name] = [$class, $name, null, $access, $property];

continue;
}

$propertyScopes[$name] = [$class, $name, null, $access, $property];

if ($flags & (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY)) {
$propertyScopes[$name][2] = $property->class;
}

if (\ReflectionProperty::IS_PROTECTED & $flags) {
$propertyScopes["\0*\0$name"] = $propertyScopes[$name];
}
}

while ($r = $r->getParentClass()) {
$class = $r->name;

foreach ($r->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) {
$flags = $property->getModifiers();

if (\ReflectionProperty::IS_STATIC & $flags) {
continue;
}
$name = $property->name;
$access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0);

if (\PHP_VERSION_ID >= 80400 && $h = $property->getHooks()) {
$access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0);
}

$propertyScopes["\0$class\0$name"] = [$class, $name, null, $access, $property];
$propertyScopes[$name] ??= $propertyScopes["\0$class\0$name"];
}
}

return $propertyScopes;
}
}
<?php










namespace Symfony\Component\VarExporter\Internal;






class Values
{
public function __construct(
public readonly array $values,
) {
}
}
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\VarExporter\Exception\LogicException;
use Symfony\Component\VarExporter\Internal\Hydrator;
use Symfony\Component\VarExporter\Internal\LazyDecoratorTrait;
use Symfony\Component\VarExporter\Internal\LazyObjectRegistry;




final class ProxyHelper
{







public static function generateLazyGhost(\ReflectionClass $class): string
{
if (\PHP_VERSION_ID >= 80400) {
trigger_deprecation('symfony/var-exporter', '7.3', 'Using ProxyHelper::generateLazyGhost() is deprecated, use native lazy objects instead.');
}
if (\PHP_VERSION_ID < 80300 && $class->isReadOnly()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost with PHP < 8.3: class "%s" is readonly.', $class->name));
}
if ($class->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name));
}
if ($class->isInterface() || $class->isAbstract() || $class->isTrait()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: "%s" is not a concrete class.', $class->name));
}
if (\stdClass::class !== $class->name && $class->isInternal()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is internal.', $class->name));
}
if ($class->hasMethod('__get') && 'mixed' !== (self::exportType($class->getMethod('__get')) ?? 'mixed')) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: return type of method "%s::__get()" should be "mixed".', $class->name));
}

static $traitMethods;
$traitMethods ??= (new \ReflectionClass(LazyGhostTrait::class))->getMethods();

foreach ($traitMethods as $method) {
if ($class->hasMethod($method->name) && $class->getMethod($method->name)->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: method "%s::%s()" is final.', $class->name, $method->name));
}
}

$parent = $class;
while ($parent = $parent->getParentClass()) {
if (\stdClass::class !== $parent->name && $parent->isInternal()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" extends "%s" which is internal.', $class->name, $parent->name));
}
}

$hooks = '';
$propertyScopes = Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name);
foreach ($propertyScopes as $key => [$scope, $name, , $access]) {
$propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name;
$flags = $access >> 2;

if ($k !== $key || !($access & Hydrator::PROPERTY_HAS_HOOKS) || $flags & \ReflectionProperty::IS_VIRTUAL) {
continue;
}

if ($flags & (\ReflectionProperty::IS_FINAL | \ReflectionProperty::IS_PRIVATE)) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: property "%s::$%s" is final or private(set).', $class->name, $name));
}

$p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name);

$type = self::exportType($p);
$hooks .= "\n    "
.($p->isProtected() ? 'protected' : 'public')
.($p->isProtectedSet() ? ' protected(set)' : '')
." {$type} \${$name}"
.($p->hasDefaultValue() ? ' = '.VarExporter::export($p->getDefaultValue()) : '')
." {\n";

foreach ($p->getHooks() as $hook => $method) {
if ('get' === $hook) {
$ref = ($method->returnsReference() ? '&' : '');
$hooks .= "        {$ref}get { \$this->initializeLazyObject(); return parent::\${$name}::get(); }\n";
} elseif ('set' === $hook) {
$parameters = self::exportParameters($method, true);
$arg = '$'.$method->getParameters()[0]->name;
$hooks .= "        set({$parameters}) { \$this->initializeLazyObject(); parent::\${$name}::set({$arg}); }\n";
} else {
throw new LogicException(\sprintf('Cannot generate lazy ghost: hook "%s::%s()" is not supported.', $class->name, $method->name));
}
}

$hooks .= "    }\n";
}

$propertyScopes = self::exportPropertyScopes($class->name, $propertyScopes);

return <<<EOPHP
             extends \\{$class->name} implements \Symfony\Component\VarExporter\LazyObjectInterface
            {
                use \Symfony\Component\VarExporter\LazyGhostTrait;

                private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes};
            {$hooks}}

            // Help opcache.preload discover always-needed symbols
            class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
            class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
            class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);

            EOPHP;
}








public static function generateLazyProxy(?\ReflectionClass $class, array $interfaces = []): string
{
if (!class_exists($class?->name ?? \stdClass::class, false)) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not a class.', $class->name));
}
if ($class?->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: class "%s" is final.', $class->name));
}
if (\PHP_VERSION_ID < 80400) {
return self::generateLegacyLazyProxy($class, $interfaces);
}

if ($class && !$class->isAbstract()) {
$parent = $class;
do {
$extendsInternalClass = $parent->isInternal();
} while (!$extendsInternalClass && $parent = $parent->getParentClass());

if (!$extendsInternalClass) {
trigger_deprecation('symfony/var-exporter', '7.3', 'Generating lazy proxy for class "%s" is deprecated; leverage native lazy objects instead.', $class->name);

}
}

$propertyScopes = $class ? Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name) : [];
$abstractProperties = [];
$hookedProperties = [];
foreach ($propertyScopes as $key => [$scope, $name, , $access]) {
$propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name;
$flags = $access >> 2;

if ($k !== $key || $flags & \ReflectionProperty::IS_PRIVATE) {
continue;
}

if ($flags & \ReflectionProperty::IS_ABSTRACT) {
$abstractProperties[$name] = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name);
continue;
}
$abstractProperties[$name] = false;

if (!($access & Hydrator::PROPERTY_HAS_HOOKS)) {
continue;
}

if ($flags & \ReflectionProperty::IS_FINAL) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: property "%s::$%s" is final.', $class->name, $name));
}

$p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name);
$hookedProperties[$name] = [$p, $p->getHooks()];
}

$methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []];
foreach ($interfaces as $interface) {
if (!$interface->isInterface()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name));
}
$methodReflectors[] = $interface->getMethods();

foreach ($interface->getProperties() as $p) {
$abstractProperties[$p->name] ??= $p;
$hookedProperties[$p->name] ??= [$p, []];
$hookedProperties[$p->name][1] += $p->getHooks();
}
}

$hooks = '';

foreach (array_filter($abstractProperties) as $name => $p) {
$type = self::exportType($p);
$hooks .= "\n    "
.($p->isProtected() ? 'protected' : 'public')
.($p->isProtectedSet() ? ' protected(set)' : '')
." {$type} \${$name};\n";
}

foreach ($hookedProperties as $name => [$p, $methods]) {
if ($abstractProperties[$p->name] ?? false) {
continue;
}
$type = self::exportType($p);
$hooks .= "\n    "
.($p->isProtected() ? 'protected' : 'public')
.($p->isProtectedSet() ? ' protected(set)' : '')
." {$type} \${$name} {\n";

foreach ($methods as $hook => $method) {
if ('get' === $hook) {
$ref = ($method->returnsReference() ? '&' : '');
$hooks .= <<<EOPHP
                            {$ref}get {
                                return \$this->lazyObjectState->realInstance->{$p->name};
                            }

                    EOPHP;
} elseif ('set' === $hook) {
$parameters = self::exportParameters($method, true);
$arg = '$'.$method->getParameters()[0]->name;
$hooks .= <<<EOPHP
                            set({$parameters}) {
                                \$this->lazyObjectState->realInstance->{$p->name} = {$arg};
                            }

                    EOPHP;
} else {
throw new LogicException(\sprintf('Cannot generate lazy proxy: hook "%s::%s()" is not supported.', $class->name, $method->name));
}
}

$hooks .= "    }\n";
}

$methods = [];
$methodReflectors = array_merge(...$methodReflectors);

foreach ($methodReflectors as $method) {
if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) {
continue;
}
$trait = new \ReflectionMethod(LazyDecoratorTrait::class, '__get');
$body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
$body[0] = str_replace('): mixed', '): '.$type, $body[0]);
$methods['__get'] = strtr(implode('', $body).'    }', [
'Hydrator' => '\\'.Hydrator::class,
'Registry' => '\\'.LazyObjectRegistry::class,
]);
break;
}

foreach ($methodReflectors as $method) {
if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) {
continue;
}
if ($method->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name));
}
if (method_exists(LazyDecoratorTrait::class, $method->name)) {
continue;
}

$signature = self::exportSignature($method, true, $args);

if ($method->isStatic()) {
$body = "        throw new \BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".');";
} elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) {
$body = <<<EOPHP
                        \$this->lazyObjectState->realInstance->{$method->name}({$args});
                EOPHP;
} else {
$mayReturnThis = false;
foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) {
if (\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) {
$mayReturnThis = true;
break;
}
foreach ([$class, ...$interfaces] as $r) {
if ($r && is_a($r->name, $type, true)) {
$mayReturnThis = true;
break 2;
}
}
}

if ($method->returnsReference() || !$mayReturnThis) {
$body = <<<EOPHP
                            return \$this->lazyObjectState->realInstance->{$method->name}({$args});
                    EOPHP;
} else {
$body = <<<EOPHP
                            \${0} = \$this->lazyObjectState->realInstance;
                            \${1} = \${0}->{$method->name}({$args});

                            return match (true) {
                                \${1} === \${0} => \$this,
                                !\${1} instanceof \${0} || !\${0} instanceof \${1} => \${1},
                                null !== \$this->lazyObjectState->cloneInstance =& \${1} => clone \$this,
                            };
                    EOPHP;
}
}
$methods[$lcName] = "    {$signature}\n    {\n{$body}\n    }";
}

$types = $interfaces = array_unique(array_column($interfaces, 'name'));
$interfaces[] = LazyObjectInterface::class;
$interfaces = implode(', \\', $interfaces);
$parent = $class ? ' extends \\'.$class->name : '';
array_unshift($types, $class ? 'parent' : '');
$type = ltrim(implode('&\\', $types), '&');

if (!$class) {
$trait = new \ReflectionMethod(LazyDecoratorTrait::class, 'initializeLazyObject');
$body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
$body[0] = str_replace('): parent', '): '.$type, $body[0]);
$methods = ['initializeLazyObject' => implode('', $body).'    }'] + $methods;
}
$body = $methods ? "\n".implode("\n\n", $methods)."\n" : '';
$propertyScopes = $class ? self::exportPropertyScopes($class->name, $propertyScopes) : '[]';
$lazyProxyTraitStatement = [];

if (
$class?->hasMethod('__unserialize')
&& !$class->getMethod('__unserialize')->getParameters()[0]->getType()
) {

$lazyProxyTraitStatement[] = '__unserialize as private __doUnserialize;';

$body .= <<<EOPHP

                    public function __unserialize(\$data): void
                    {
                        \$this->__doUnserialize(\$data);
                    }

                EOPHP;
}

if ($lazyProxyTraitStatement) {
$lazyProxyTraitStatement = implode("\n        ", $lazyProxyTraitStatement);
$lazyProxyTraitStatement = <<<EOPHP
            use \Symfony\Component\VarExporter\Internal\LazyDecoratorTrait {
                    {$lazyProxyTraitStatement}
                }
            EOPHP;
} else {
$lazyProxyTraitStatement = <<<EOPHP
            use \Symfony\Component\VarExporter\Internal\LazyDecoratorTrait;
            EOPHP;
}

return <<<EOPHP
            {$parent} implements \\{$interfaces}
            {
                {$lazyProxyTraitStatement}

                private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes};
            {$hooks}{$body}}

            // Help opcache.preload discover always-needed symbols
            class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
            class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);

            EOPHP;
}

private static function generateLegacyLazyProxy(?\ReflectionClass $class, array $interfaces): string
{
if (\PHP_VERSION_ID < 80300 && $class?->isReadOnly()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy with PHP < 8.3: class "%s" is readonly.', $class->name));
}

$propertyScopes = $class ? Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name) : [];
$methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []];
foreach ($interfaces as $interface) {
if (!$interface->isInterface()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name));
}
$methodReflectors[] = $interface->getMethods();
}

$extendsInternalClass = false;
if ($parent = $class) {
do {
$extendsInternalClass = \stdClass::class !== $parent->name && $parent->isInternal();
} while (!$extendsInternalClass && $parent = $parent->getParentClass());
}
$methodsHaveToBeProxied = $extendsInternalClass;
$methods = [];
$methodReflectors = array_merge(...$methodReflectors);

foreach ($methodReflectors as $method) {
if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) {
continue;
}
$methodsHaveToBeProxied = true;
$trait = new \ReflectionMethod(LazyProxyTrait::class, '__get');
$body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
$body[0] = str_replace('): mixed', '): '.$type, $body[0]);
$methods['__get'] = strtr(implode('', $body).'    }', [
'Hydrator' => '\\'.Hydrator::class,
'Registry' => '\\'.LazyObjectRegistry::class,
]);
break;
}

foreach ($methodReflectors as $method) {
if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) {
continue;
}
if ($method->isFinal()) {
if ($extendsInternalClass || $methodsHaveToBeProxied || method_exists(LazyProxyTrait::class, $method->name)) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name));
}
continue;
}
if (method_exists(LazyProxyTrait::class, $method->name) || ($method->isProtected() && !$method->isAbstract())) {
continue;
}

$signature = self::exportSignature($method, true, $args);
$parentCall = $method->isAbstract() ? "throw new \BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".')" : "parent::{$method->name}({$args})";

if ($method->isStatic()) {
$body = "        $parentCall;";
} elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) {
$body = <<<EOPHP
                        if (isset(\$this->lazyObjectState)) {
                            (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args});
                        } else {
                            {$parentCall};
                        }
                EOPHP;
} else {
if (!$methodsHaveToBeProxied && !$method->isAbstract()) {

foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) {
if (\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) {
continue 2;
}
foreach ([$class, ...$interfaces] as $r) {
if ($r && is_a($r->name, $type, true)) {
continue 3;
}
}
}
}

$body = <<<EOPHP
                        if (isset(\$this->lazyObjectState)) {
                            return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args});
                        }

                        return {$parentCall};
                EOPHP;
}
$methods[$lcName] = "    {$signature}\n    {\n{$body}\n    }";
}

$types = $interfaces = array_unique(array_column($interfaces, 'name'));
$interfaces[] = LazyObjectInterface::class;
$interfaces = implode(', \\', $interfaces);
$parent = $class ? ' extends \\'.$class->name : '';
array_unshift($types, $class ? 'parent' : '');
$type = ltrim(implode('&\\', $types), '&');

if (!$class) {
$trait = new \ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject');
$body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
$body[0] = str_replace('): parent', '): '.$type, $body[0]);
$methods = ['initializeLazyObject' => implode('', $body).'    }'] + $methods;
}
$body = $methods ? "\n".implode("\n\n", $methods)."\n" : '';
$propertyScopes = $class ? self::exportPropertyScopes($class->name, $propertyScopes) : '[]';

if (
$class?->hasMethod('__unserialize')
&& !$class->getMethod('__unserialize')->getParameters()[0]->getType()
) {

$lazyProxyTraitStatement = <<<EOPHP
            use \Symfony\Component\VarExporter\LazyProxyTrait {
                    __unserialize as private __doUnserialize;
                }
            EOPHP;

$body .= <<<EOPHP

                    public function __unserialize(\$data): void
                    {
                        \$this->__doUnserialize(\$data);
                    }

                EOPHP;
} else {
$lazyProxyTraitStatement = <<<EOPHP
            use \Symfony\Component\VarExporter\LazyProxyTrait;
            EOPHP;
}

return <<<EOPHP
            {$parent} implements \\{$interfaces}
            {
                {$lazyProxyTraitStatement}

                private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes};
            {$body}}

            // Help opcache.preload discover always-needed symbols
            class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
            class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
            class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);

            EOPHP;
}

public static function exportParameters(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string
{
$byRefIndex = 0;
$args = '';
$param = null;
$parameters = [];
$namespace = $function instanceof \ReflectionMethod ? $function->class : $function->getNamespaceName().'\\';
$namespace = substr($namespace, 0, strrpos($namespace, '\\') ?: 0);
foreach ($function->getParameters() as $param) {
$parameters[] = ($param->getAttributes(\SensitiveParameter::class) ? '#[\SensitiveParameter] ' : '')
.($withParameterTypes && $param->hasType() ? self::exportType($param).' ' : '')
.($param->isPassedByReference() ? '&' : '')
.($param->isVariadic() ? '...' : '').'$'.$param->name
.($param->isOptional() && !$param->isVariadic() ? ' = '.self::exportDefault($param, $namespace) : '');
if ($param->isPassedByReference()) {
$byRefIndex = 1 + $param->getPosition();
}
$args .= ($param->isVariadic() ? '...$' : '$').$param->name.', ';
}

if (!$param || !$byRefIndex) {
$args = '...\func_get_args()';
} elseif ($param->isVariadic()) {
$args = substr($args, 0, -2);
} else {
$args = explode(', ', $args, 1 + $byRefIndex);
$args[$byRefIndex] = \sprintf('...\array_slice(\func_get_args(), %d)', $byRefIndex);
$args = implode(', ', $args);
}

return implode(', ', $parameters);
}

public static function exportSignature(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string
{
$parameters = self::exportParameters($function, $withParameterTypes, $args);

$signature = 'function '.($function->returnsReference() ? '&' : '')
.($function->isClosure() ? '' : $function->name).'('.$parameters.')';

if ($function instanceof \ReflectionMethod) {
$signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private '))
.($function->isStatic() ? 'static ' : '').$signature;
}
if ($function->hasReturnType()) {
$signature .= ': '.self::exportType($function);
}

static $getPrototype;
$getPrototype ??= (new \ReflectionMethod(\ReflectionMethod::class, 'getPrototype'))->invoke(...);

while ($function) {
if ($function->hasTentativeReturnType()) {
return '#[\ReturnTypeWillChange] '.$signature;
}

try {
$function = $function instanceof \ReflectionMethod && $function->isAbstract() ? false : $getPrototype($function);
} catch (\ReflectionException) {
break;
}
}

return $signature;
}

public static function exportType(\ReflectionFunctionAbstract|\ReflectionProperty|\ReflectionParameter $owner, bool $noBuiltin = false, ?\ReflectionType $type = null): ?string
{
if (!$type ??= $owner instanceof \ReflectionFunctionAbstract ? $owner->getReturnType() : $owner->getType()) {
return null;
}
$class = null;
$types = [];
if ($type instanceof \ReflectionUnionType) {
$reflectionTypes = $type->getTypes();
$glue = '|';
} elseif ($type instanceof \ReflectionIntersectionType) {
$reflectionTypes = $type->getTypes();
$glue = '&';
} else {
$reflectionTypes = [$type];
$glue = null;
}

foreach ($reflectionTypes as $type) {
if ($type instanceof \ReflectionIntersectionType) {
if ('' !== $name = '('.self::exportType($owner, $noBuiltin, $type).')') {
$types[] = $name;
}
continue;
}
$name = $type->getName();

if ($noBuiltin && $type->isBuiltin()) {
continue;
}
if (\in_array($name, ['parent', 'self'], true) && $class ??= $owner->getDeclaringClass()) {
$name = 'parent' === $name ? ($class->getParentClass() ?: null)?->name ?? 'parent' : $class->name;
}

$types[] = ($noBuiltin || $type->isBuiltin() || 'static' === $name ? '' : '\\').$name;
}

if (!$types) {
return '';
}
if (null === $glue) {
$defaultNull = $owner instanceof \ReflectionParameter && 'NULL' === rtrim(substr(explode('$'.$owner->name.' = ', (string) $owner, 2)[1] ?? '', 0, -2));

return (!$noBuiltin && ($type->allowsNull() || $defaultNull) && !\in_array($name, ['mixed', 'null'], true) ? '?' : '').$types[0];
}
sort($types);

return implode($glue, $types);
}

private static function exportPropertyScopes(string $parent, array $propertyScopes): string
{
uksort($propertyScopes, 'strnatcmp');
foreach ($propertyScopes as $k => $v) {
unset($propertyScopes[$k][4]);
}
$propertyScopes = VarExporter::export($propertyScopes);
$propertyScopes = str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes);
$propertyScopes = preg_replace("/(?|(,)\n( )       |\n        |,\n    (\]))/", '$1$2', $propertyScopes);

return str_replace("\n", "\n    ", $propertyScopes);
}

private static function exportDefault(\ReflectionParameter $param, $namespace): string
{
$default = rtrim(substr(explode('$'.$param->name.' = ', (string) $param, 2)[1] ?? '', 0, -2));

if (\in_array($default, ['<default>', 'NULL'], true)) {
return 'null';
}
if (str_ends_with($default, "...'") && preg_match("/^'(?:[^'\\\\]*+(?:\\\\.)*+)*+'$/", $default)) {
return VarExporter::export($param->getDefaultValue());
}

$regexp = "/(\"(?:[^\"\\\\]*+(?:\\\\.)*+)*+\"|'(?:[^'\\\\]*+(?:\\\\.)*+)*+')/";
$parts = preg_split($regexp, $default, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);

$regexp = '/([\[\( ]|^)([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z0-9_\x7f-\xff]++)*+)(\(?)(?!: )/';
$callback = (false !== strpbrk($default, "\\:('") && $class = $param->getDeclaringClass())
? fn ($m) => $m[1].match ($m[2]) {
'new', 'false', 'true', 'null' => $m[2],
'NULL' => 'null',
'self' => '\\'.$class->name,
'namespace\\parent',
'parent' => ($parent = $class->getParentClass()) ? '\\'.$parent->name : 'parent',
default => self::exportSymbol($m[2], '(' !== $m[3], $namespace),
}.$m[3]
: fn ($m) => $m[1].match ($m[2]) {
'new', 'false', 'true', 'null', 'self', 'parent' => $m[2],
'NULL' => 'null',
default => self::exportSymbol($m[2], '(' !== $m[3], $namespace),
}.$m[3];

return implode('', array_map(fn ($part) => match ($part[0]) {
'"' => $part, 
"'" => false !== strpbrk($part, "\\\0\r\n") ? '"'.substr(str_replace(['$', "\0", "\r", "\n"], ['\$', '\0', '\r', '\n'], $part), 1, -1).'"' : $part,
default => preg_replace_callback($regexp, $callback, $part),
}, $parts));
}

private static function exportSymbol(string $symbol, bool $mightBeRootConst, string $namespace): string
{
if (!$mightBeRootConst
|| false === ($ns = strrpos($symbol, '\\'))
|| substr($symbol, 0, $ns) !== $namespace
|| \defined($symbol)
|| !\defined(substr($symbol, $ns + 1))
) {
return '\\'.$symbol;
}

return '\\'.substr($symbol, $ns + 1);
}
}
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\VarExporter\Exception\ExceptionInterface;
use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;
use Symfony\Component\VarExporter\Internal\Registry;






final class Instantiator
{
/**
@template













*/
public static function instantiate(string $class, array $properties = [], array $scopedProperties = []): object
{
$reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class);

if (Registry::$cloneable[$class]) {
$instance = clone Registry::$prototypes[$class];
} elseif (Registry::$instantiableWithoutConstructor[$class]) {
$instance = $reflector->newInstanceWithoutConstructor();
} elseif (null === Registry::$prototypes[$class]) {
throw new NotInstantiableTypeException($class);
} elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) {
$instance = unserialize('C:'.\strlen($class).':"'.$class.'":0:{}');
} else {
$instance = unserialize('O:'.\strlen($class).':"'.$class.'":0:{}');
}

return $properties || $scopedProperties ? Hydrator::hydrate($instance, $properties, $scopedProperties) : $instance;
}
}
Copyright (c) 2018-present 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.
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\Serializer\Attribute\Ignore;
use Symfony\Component\VarExporter\Internal\Hydrator;
use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry;
use Symfony\Component\VarExporter\Internal\LazyObjectState;
use Symfony\Component\VarExporter\Internal\LazyObjectTrait;

if (\PHP_VERSION_ID >= 80400) {
trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyGhostTrait::class);
}




trait LazyGhostTrait
{
use LazyObjectTrait;












public static function createLazyGhost(\Closure $initializer, ?array $skippedProperties = null, ?object $instance = null): static
{
if (self::class !== $class = $instance ? $instance::class : static::class) {
$skippedProperties["\0".self::class."\0lazyObjectState"] = true;
}

if (!isset(Registry::$defaultProperties[$class])) {
Registry::$classReflectors[$class] ??= new \ReflectionClass($class);
$instance ??= Registry::$classReflectors[$class]->newInstanceWithoutConstructor();
Registry::$defaultProperties[$class] ??= (array) $instance;
Registry::$classResetters[$class] ??= Registry::getClassResetters($class);

if (self::class === $class && \defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) {
Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES;
}
} else {
$instance ??= Registry::$classReflectors[$class]->newInstanceWithoutConstructor();
}

if (isset($instance->lazyObjectState)) {
$instance->lazyObjectState->initializer = $initializer;
$instance->lazyObjectState->skippedProperties = $skippedProperties ??= [];

if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $instance->lazyObjectState->status) {
$instance->lazyObjectState->reset($instance);
}

return $instance;
}

$instance->lazyObjectState = new LazyObjectState($initializer, $skippedProperties ??= []);

foreach (Registry::$classResetters[$class] as $reset) {
$reset($instance, $skippedProperties);
}

return $instance;
}






#[Ignore]
public function isLazyObjectInitialized(bool $partial = false): bool
{
if (!$state = $this->lazyObjectState ?? null) {
return true;
}

return LazyObjectState::STATUS_INITIALIZED_FULL === $state->status;
}




public function initializeLazyObject(): static
{
if (!$state = $this->lazyObjectState ?? null) {
return $this;
}

if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {
$state->initialize($this, '', null);
}

return $this;
}




public function resetLazyObject(): bool
{
if (!$state = $this->lazyObjectState ?? null) {
return false;
}

if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $state->status) {
$state->reset($this);
}

return true;
}

public function &__get($name): mixed
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;
$notByRef = 0;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForRead($propertyScopes, $class, $name);
$state = $this->lazyObjectState ?? null;

if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"]))) {
$notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF;

if (LazyObjectState::STATUS_INITIALIZED_FULL === $state->status) {

$property = null === $scope ? $name : "\0$scope\0$name";
$property = $propertyScopes[$property][4]
?? Hydrator::$propertyScopes[$this::class][$property][4] = new \ReflectionProperty($scope ?? $class, $name);
} else {
$property = null;
}
if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
$scope ??= $writeScope;
}

if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope)) {
goto get_in_scope;
}
}
}

if ($parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']) {
if (2 === $parent) {
return parent::__get($name);
}
$value = parent::__get($name);

return $value;
}

if (null === $class) {
$frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];
trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $this::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE);
}

get_in_scope:

try {
if (null === $scope) {
if (!$notByRef) {
return $this->$name;
}
$value = $this->$name;

return $value;
}
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);

return $accessor['get']($this, $name, $notByRef);
} catch (\Error $e) {
if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) {
throw $e;
}

try {
if (null === $scope) {
$this->$name = [];

return $this->$name;
}

$accessor['set']($this, $name, []);

return $accessor['get']($this, $name, $notByRef);
} catch (\Error) {
if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) {
throw new \Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious());
}

throw $e;
}
}
}

public function __set($name, $value): void
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2);
$state = $this->lazyObjectState ?? null;

if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"]))
&& LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status
) {
if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {
$state->initialize($this, $name, $writeScope ?? $scope);
}
goto set_in_scope;
}
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) {
parent::__set($name, $value);

return;
}

set_in_scope:

if (null === $scope) {
$this->$name = $value;
} else {
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);
$accessor['set']($this, $name, $value);
}
}

public function __isset($name): bool
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;

if ([$class, , $writeScope] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForRead($propertyScopes, $class, $name);
$state = $this->lazyObjectState ?? null;

if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"]))
&& LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status
&& LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope)
) {
goto isset_in_scope;
}
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) {
return parent::__isset($name);
}

isset_in_scope:

if (null === $scope) {
return isset($this->$name);
}
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);

return $accessor['isset']($this, $name);
}

public function __unset($name): void
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2);
$state = $this->lazyObjectState ?? null;

if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"]))
&& LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status
) {
if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) {
$state->initialize($this, $name, $writeScope ?? $scope);
}
goto unset_in_scope;
}
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) {
parent::__unset($name);

return;
}

unset_in_scope:

if (null === $scope) {
unset($this->$name);
} else {
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);
$accessor['unset']($this, $name);
}
}

public function __clone(): void
{
if ($state = $this->lazyObjectState ?? null) {
$this->lazyObjectState = clone $state;
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) {
parent::__clone();
}
}

public function __serialize(): array
{
$class = self::class;

if ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) {
$properties = parent::__serialize();
} else {
$this->initializeLazyObject();
$properties = (array) $this;
}
unset($properties["\0$class\0lazyObjectState"]);

if (Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) {
return $properties;
}

$scope = get_parent_class($class);
$data = [];

foreach (parent::__sleep() as $name) {
$value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null;

if (null === $k) {
trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE);
} else {
$data[$k] = $value;
}
}

return $data;
}

public function __destruct()
{
$state = $this->lazyObjectState ?? null;

if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state?->status) {
return;
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) {
parent::__destruct();
}
}

#[Ignore]
private function setLazyObjectAsInitialized(bool $initialized): void
{
if ($state = $this->lazyObjectState ?? null) {
$state->status = $initialized ? LazyObjectState::STATUS_INITIALIZED_FULL : LazyObjectState::STATUS_UNINITIALIZED_FULL;
}
}
}
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\Serializer\Attribute\Ignore;
use Symfony\Component\VarExporter\Hydrator as PublicHydrator;
use Symfony\Component\VarExporter\Internal\Hydrator;
use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry;
use Symfony\Component\VarExporter\Internal\LazyObjectState;
use Symfony\Component\VarExporter\Internal\LazyObjectTrait;

if (\PHP_VERSION_ID >= 80400) {
trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyProxyTrait::class);
}




trait LazyProxyTrait
{
use LazyObjectTrait;







public static function createLazyProxy(\Closure $initializer, ?object $instance = null): static
{
if (self::class !== $class = $instance ? $instance::class : static::class) {
$skippedProperties = ["\0".self::class."\0lazyObjectState" => true];
}

if (!isset(Registry::$defaultProperties[$class])) {
Registry::$classReflectors[$class] ??= new \ReflectionClass($class);
$instance ??= Registry::$classReflectors[$class]->newInstanceWithoutConstructor();
Registry::$defaultProperties[$class] ??= (array) $instance;

if (self::class === $class && \defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) {
Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES;
}

Registry::$classResetters[$class] ??= Registry::getClassResetters($class);
} else {
$instance ??= Registry::$classReflectors[$class]->newInstanceWithoutConstructor();
}

if (isset($instance->lazyObjectState)) {
$instance->lazyObjectState->initializer = $initializer;
unset($instance->lazyObjectState->realInstance);

return $instance;
}

$instance->lazyObjectState = new LazyObjectState($initializer);

foreach (Registry::$classResetters[$class] as $reset) {
$reset($instance, $skippedProperties ??= []);
}

return $instance;
}






#[Ignore]
public function isLazyObjectInitialized(bool $partial = false): bool
{
return !isset($this->lazyObjectState) || isset($this->lazyObjectState->realInstance) || Registry::$noInitializerState === $this->lazyObjectState->initializer;
}




public function initializeLazyObject(): parent
{
if ($state = $this->lazyObjectState ?? null) {
return $state->realInstance ??= ($state->initializer)();
}

return $this;
}




public function resetLazyObject(): bool
{
if (!isset($this->lazyObjectState) || Registry::$noInitializerState === $this->lazyObjectState->initializer) {
return false;
}

unset($this->lazyObjectState->realInstance);

return true;
}

public function &__get($name): mixed
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;
$instance = $this;
$notByRef = 0;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF;
$scope = Registry::getScopeForRead($propertyScopes, $class, $name);

if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) {
if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
}
if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
$scope ??= $writeScope;
}
$parent = 2;
goto get_in_scope;
}
}
$parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get'];

if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
} else {
if (2 === $parent) {
return parent::__get($name);
}
$value = parent::__get($name);

return $value;
}

if (!$parent && null === $class && !\array_key_exists($name, (array) $instance)) {
$frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];
trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $instance::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE);
}

get_in_scope:
$notByRef = $notByRef || 1 === $parent;

try {
if (null === $scope) {
if (!$notByRef) {
return $instance->$name;
}
$value = $instance->$name;

return $value;
}
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);

return $accessor['get']($instance, $name, $notByRef);
} catch (\Error $e) {
if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) {
throw $e;
}

try {
if (null === $scope) {
$instance->$name = [];

return $instance->$name;
}

$accessor['set']($instance, $name, []);

return $accessor['get']($instance, $name, $notByRef);
} catch (\Error) {
throw $e;
}
}
}

public function __set($name, $value): void
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;
$instance = $this;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2);

if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) {
if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
}
goto set_in_scope;
}
}

if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
} elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) {
parent::__set($name, $value);

return;
}

set_in_scope:

if (null === $scope) {
$instance->$name = $value;
} else {
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);
$accessor['set']($instance, $name, $value);
}
}

public function __isset($name): bool
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;
$instance = $this;

if ([$class] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForRead($propertyScopes, $class, $name);

if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) {
if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
}
goto isset_in_scope;
}
}

if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
} elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) {
return parent::__isset($name);
}

isset_in_scope:

if (null === $scope) {
return isset($instance->$name);
}
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);

return $accessor['isset']($instance, $name);
}

public function __unset($name): void
{
$propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class);
$scope = null;
$instance = $this;

if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) {
$scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2);

if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) {
if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
}
goto unset_in_scope;
}
}

if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
} elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) {
parent::__unset($name);

return;
}

unset_in_scope:

if (null === $scope) {
unset($instance->$name);
} else {
$accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope);
$accessor['unset']($instance, $name);
}
}

public function __clone(): void
{
if (!isset($this->lazyObjectState)) {
if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) {
parent::__clone();
}

return;
}

$this->lazyObjectState = clone $this->lazyObjectState;
}

public function __serialize(): array
{
$class = self::class;
$state = $this->lazyObjectState ?? null;

if (!$state && (Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) {
$properties = parent::__serialize();
} else {
$properties = (array) $this;

if ($state) {
unset($properties["\0$class\0lazyObjectState"]);
$properties["\0$class\0lazyObjectReal"] = $state->realInstance ??= ($state->initializer)();
}
}

if ($state || Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) {
return $properties;
}

$scope = get_parent_class($class);
$data = [];

foreach (parent::__sleep() as $name) {
$value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null;

if (null === $k) {
trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE);
} else {
$data[$k] = $value;
}
}

return $data;
}

public function __unserialize(array $data): void
{
$class = self::class;

if ($instance = $data["\0$class\0lazyObjectReal"] ?? null) {
unset($data["\0$class\0lazyObjectReal"]);

foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) {
$reset($this, $data);
}

if ($data) {
PublicHydrator::hydrate($this, $data);
}
$this->lazyObjectState = new LazyObjectState(Registry::$noInitializerState ??= static fn () => throw new \LogicException('Lazy proxy has no initializer.'));
$this->lazyObjectState->realInstance = $instance;
} elseif ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['unserialize']) {
parent::__unserialize($data);
} else {
PublicHydrator::hydrate($this, $data);

if (Registry::$parentMethods[$class]['wakeup']) {
parent::__wakeup();
}
}
}

public function __destruct()
{
if (isset($this->lazyObjectState)) {
return;
}

if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) {
parent::__destruct();
}
}
}
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\VarExporter\Exception\ExceptionInterface;
use Symfony\Component\VarExporter\Internal\Exporter;
use Symfony\Component\VarExporter\Internal\Hydrator;
use Symfony\Component\VarExporter\Internal\Registry;
use Symfony\Component\VarExporter\Internal\Values;











final class VarExporter
{








public static function export(mixed $value, ?bool &$isStaticValue = null, array &$foundClasses = []): string
{
$isStaticValue = true;

if (!\is_object($value) && !(\is_array($value) && $value) && !\is_resource($value) || $value instanceof \UnitEnum) {
return Exporter::export($value);
}

$objectsPool = new \SplObjectStorage();
$refsPool = [];
$objectsCount = 0;

try {
$value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0];
} finally {
$references = [];
foreach ($refsPool as $i => $v) {
if ($v[0]->count) {
$references[1 + $i] = $v[2];
}
$v[0] = $v[1];
}
}

if ($isStaticValue) {
return Exporter::export($value);
}

$classes = [];
$values = [];
$states = [];
foreach ($objectsPool as $i => $v) {
[, $class, $values[], $wakeup] = $objectsPool[$v];
$foundClasses[$class] = $classes[] = $class;

if (0 < $wakeup) {
$states[$wakeup] = $i;
} elseif (0 > $wakeup) {
$states[-$wakeup] = [$i, array_pop($values)];
$values[] = [];
}
}
ksort($states);

$wakeups = [null];
foreach ($states as $v) {
if (\is_array($v)) {
$wakeups[-$v[0]] = $v[1];
} else {
$wakeups[] = $v;
}
}

if (null === $wakeups[0]) {
unset($wakeups[0]);
}

$properties = [];
foreach ($values as $i => $vars) {
foreach ($vars as $class => $values) {
foreach ($values as $name => $v) {
$properties[$class][$name][$i] = $v;
}
}
}

if ($classes || $references) {
$value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups);
} else {
$isStaticValue = true;
}

return Exporter::export($value);
}
}
<?php










namespace Symfony\Component\VarExporter\Exception;

class NotInstantiableTypeException extends \Exception implements ExceptionInterface
{
public function __construct(string $type, ?\Throwable $previous = null)
{
parent::__construct(\sprintf('Type "%s" is not instantiable.', $type), 0, $previous);
}
}
<?php










namespace Symfony\Component\VarExporter\Exception;

class ClassNotFoundException extends \Exception implements ExceptionInterface
{
public function __construct(string $class, ?\Throwable $previous = null)
{
parent::__construct(\sprintf('Class "%s" not found.', $class), 0, $previous);
}
}
<?php










namespace Symfony\Component\VarExporter\Exception;

class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\VarExporter\Exception;

interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\VarExporter;

interface LazyObjectInterface
{





public function isLazyObjectInitialized(bool $partial = false): bool;




public function initializeLazyObject(): object;




public function resetLazyObject(): bool;
}
<?php










namespace Symfony\Component\VarExporter;

use Symfony\Component\VarExporter\Internal\Hydrator as InternalHydrator;






final class Hydrator
{
/**
@template































*/
public static function hydrate(object $instance, array $properties = [], array $scopedProperties = []): object
{
if ($properties) {
$class = $instance::class;
$propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class);

foreach ($properties as $name => &$value) {
[$scope, $name, $writeScope] = $propertyScopes[$name] ?? [$class, $name, $class];
$scopedProperties[$writeScope ?? $scope][$name] = &$value;
}
unset($value);
}

foreach ($scopedProperties as $scope => $properties) {
if ($properties) {
(InternalHydrator::$simpleHydrators[$scope] ??= InternalHydrator::getSimpleHydrator($scope))($properties, $instance);
}
}

return $instance;
}
}
Copyright (c) 2016-present 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.
<?php










namespace Symfony\Flex;

use Composer\Composer;
use Composer\Package\PackageInterface;




class SymfonyBundle
{
private $package;
private $operation;
private $vendorDir;

public function __construct(Composer $composer, PackageInterface $package, string $operation)
{
$this->package = $package;
$this->operation = $operation;
$this->vendorDir = rtrim($composer->getConfig()->get('vendor-dir'), '/');
}

public function getClassNames(): array
{
$uninstall = 'uninstall' === $this->operation;
$classes = [];
$autoload = $this->package->getAutoload();
$isSyliusPlugin = 'sylius-plugin' === $this->package->getType();
foreach (['psr-4' => true, 'psr-0' => false] as $psr => $isPsr4) {
if (!isset($autoload[$psr])) {
continue;
}

foreach ($autoload[$psr] as $namespace => $paths) {
if (!\is_array($paths)) {
$paths = [$paths];
}
foreach ($paths as $path) {
foreach ($this->extractClassNames($namespace, $isSyliusPlugin) as $class) {


if (!$uninstall && !$this->isBundleClass($class, $path, $isPsr4)) {
continue;
}

$classes[] = $class;
}
}
}
}

return $classes;
}

private function extractClassNames(string $namespace, bool $isSyliusPlugin): array
{
$namespace = trim($namespace, '\\');
$class = $namespace.'\\';
$parts = explode('\\', $namespace);
$suffix = $parts[\count($parts) - 1];
$endOfWord = substr($suffix, -6);

if ($isSyliusPlugin) {
if ('Bundle' !== $endOfWord && 'Plugin' !== $endOfWord) {
$suffix .= 'Bundle';
}
} elseif ('Bundle' !== $endOfWord) {
$suffix .= 'Bundle';
}

$classes = [$class.$suffix];
$acc = '';
foreach (\array_slice($parts, 0, -1) as $part) {
if ('Bundle' === $part || ($isSyliusPlugin && 'Plugin' === $part)) {
continue;
}
$classes[] = $class.$part.$suffix;
$acc .= $part;
$classes[] = $class.$acc.$suffix;
}

return array_unique($classes);
}

private function isBundleClass(string $class, string $path, bool $isPsr4): bool
{
$classPath = ($this->vendorDir ? $this->vendorDir.'/' : '').$this->package->getPrettyName().'/'.$path.'/';
$parts = explode('\\', $class);
$class = $parts[\count($parts) - 1];
if (!$isPsr4) {
$classPath .= str_replace('\\', '', implode('/', \array_slice($parts, 0, -1))).'/';
}
$classPath .= str_replace('\\', '/', $class).'.php';

if (!file_exists($classPath)) {
return false;
}


$classContents = file_get_contents($classPath);

return str_contains($classContents, 'Symfony\Component\HttpKernel\Bundle\Bundle')
|| str_contains($classContents, 'Symfony\Component\HttpKernel\Bundle\AbstractBundle');
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;

class DotenvConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $vars, Lock $lock, array $options = [])
{
foreach ($vars as $suffix => $vars) {
$configurator = new EnvConfigurator($this->composer, $this->io, $this->options, $suffix);
$configurator->configure($recipe, $vars, $lock, $options);
}
}

public function unconfigure(Recipe $recipe, $vars, Lock $lock)
{
foreach ($vars as $suffix => $vars) {
$configurator = new EnvConfigurator($this->composer, $this->io, $this->options, $suffix);
$configurator->unconfigure($recipe, $vars, $lock);
}
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
foreach ($originalConfig as $suffix => $vars) {
$configurator = new EnvConfigurator($this->composer, $this->io, $this->options, $suffix);
$configurator->update($recipeUpdate, $vars, $newConfig[$suffix] ?? []);
}

foreach ($newConfig as $suffix => $vars) {
if (!isset($originalConfig[$suffix])) {
$configurator = new EnvConfigurator($this->composer, $this->io, $this->options, $suffix);
$configurator->update($recipeUpdate, [], $vars);
}
}
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;






class DockerfileConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $config, Lock $lock, array $options = [])
{
if (!DockerComposeConfigurator::shouldConfigureDockerRecipe($this->composer, $this->io, $recipe)) {
return;
}

$this->configureDockerfile($recipe, $config, $options['force'] ?? false);
}

public function unconfigure(Recipe $recipe, $config, Lock $lock)
{
if (!file_exists($dockerfile = $this->options->get('root-dir').'/Dockerfile')) {
return;
}

$name = $recipe->getName();
$contents = preg_replace(\sprintf('{%s+###> %s ###.*?###< %s ###%s+}s', "\n", $name, $name, "\n"), "\n", file_get_contents($dockerfile), -1, $count);
if (!$count) {
return;
}

$this->write('Removing Dockerfile entries');
file_put_contents($dockerfile, ltrim($contents, "\n"));
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
if (!DockerComposeConfigurator::shouldConfigureDockerRecipe($this->composer, $this->io, $recipeUpdate->getNewRecipe())) {
return;
}

$recipeUpdate->setOriginalFile(
'Dockerfile',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getOriginalRecipe(), $originalConfig)
);

$recipeUpdate->setNewFile(
'Dockerfile',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getNewRecipe(), $newConfig)
);
}

private function configureDockerfile(Recipe $recipe, array $config, bool $update, bool $writeOutput = true): void
{
$dockerfile = $this->options->get('root-dir').'/Dockerfile';
if (!file_exists($dockerfile) || (!$update && $this->isFileMarked($recipe, $dockerfile))) {
return;
}

if ($writeOutput) {
$this->write('Adding Dockerfile entries');
}

$data = ltrim($this->markData($recipe, implode("\n", $config)), "\n");
if ($this->updateData($dockerfile, $data)) {

return;
}

$lines = [];
foreach (file($dockerfile) as $line) {
$lines[] = $line;
if (!preg_match('/^###> recipes ###$/', $line)) {
continue;
}

$lines[] = $data;
}

file_put_contents($dockerfile, implode('', $lines));
}

private function getContentsAfterApplyingRecipe(Recipe $recipe, array $config): ?string
{
if (0 === \count($config)) {
return null;
}

$dockerfile = $this->options->get('root-dir').'/Dockerfile';
$originalContents = file_exists($dockerfile) ? file_get_contents($dockerfile) : null;

$this->configureDockerfile(
$recipe,
$config,
true,
false
);

$updatedContents = file_exists($dockerfile) ? file_get_contents($dockerfile) : null;

if (null === $originalContents) {
if (file_exists($dockerfile)) {
unlink($dockerfile);
}
} else {
file_put_contents($dockerfile, $originalContents);
}

return $updatedContents;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Composer\Composer;
use Composer\IO\IOInterface;
use Symfony\Flex\Lock;
use Symfony\Flex\Options;
use Symfony\Flex\Path;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




abstract class AbstractConfigurator
{
protected $composer;
protected $io;
protected $options;
protected $path;

public function __construct(Composer $composer, IOInterface $io, Options $options)
{
$this->composer = $composer;
$this->io = $io;
$this->options = $options;
$this->path = new Path($options->get('root-dir'));
}

abstract public function configure(Recipe $recipe, $config, Lock $lock, array $options = []);

abstract public function unconfigure(Recipe $recipe, $config, Lock $lock);

abstract public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void;

protected function write($messages, $verbosity = IOInterface::VERBOSE)
{
if (!\is_array($messages)) {
$messages = [$messages];
}
foreach ($messages as $i => $message) {
$messages[$i] = '    '.$message;
}
$this->io->writeError($messages, true, $verbosity);
}

protected function isFileMarked(Recipe $recipe, string $file): bool
{
return is_file($file) && str_contains(file_get_contents($file), \sprintf('###> %s ###', $recipe->getName()));
}

protected function markData(Recipe $recipe, string $data): string
{
return "\n".\sprintf('###> %s ###%s%s%s###< %s ###%s', $recipe->getName(), "\n", rtrim($data, "\r\n"), "\n", $recipe->getName(), "\n");
}

protected function isFileXmlMarked(Recipe $recipe, string $file): bool
{
return is_file($file) && str_contains(file_get_contents($file), \sprintf('###+ %s ###', $recipe->getName()));
}

protected function markXmlData(Recipe $recipe, string $data): string
{
return "\n".\sprintf('        <!-- ###+ %s ### -->%s%s%s        <!-- ###- %s ### -->%s', $recipe->getName(), "\n", rtrim($data, "\r\n"), "\n", $recipe->getName(), "\n");
}




protected function updateData(string $file, string $data): bool
{
if (!file_exists($file)) {
return false;
}

$contents = file_get_contents($file);

$newContents = $this->updateDataString($contents, $data);
if (null === $newContents) {
return false;
}

file_put_contents($file, $newContents);

return true;
}




protected function updateDataString(string $contents, string $data): ?string
{
$pieces = explode("\n", trim($data));
$startMark = trim(reset($pieces));
$endMark = trim(end($pieces));

if (!str_contains($contents, $startMark) || !str_contains($contents, $endMark)) {
return null;
}

$pattern = '/'.preg_quote($startMark, '/').'.*?'.preg_quote($endMark, '/').'/s';

return preg_replace($pattern, trim($data), $contents);
}

protected function extractSection(Recipe $recipe, string $contents): ?string
{
$section = $this->markData($recipe, '----');

$pieces = explode("\n", trim($section));
$startMark = trim(reset($pieces));
$endMark = trim(end($pieces));

$pattern = '/'.preg_quote($startMark, '/').'.*?'.preg_quote($endMark, '/').'/s';

$matches = [];
preg_match($pattern, $contents, $matches);

return $matches[0] ?? null;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class GitignoreConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $vars, Lock $lock, array $options = [])
{
$this->write('Adding entries to .gitignore');

$this->configureGitignore($recipe, $vars, $options['force'] ?? false);
}

public function unconfigure(Recipe $recipe, $vars, Lock $lock)
{
$file = $this->options->get('root-dir').'/.gitignore';
if (!file_exists($file)) {
return;
}

$contents = preg_replace(\sprintf('{%s*###> %s ###.*###< %s ###%s+}s', "\n", $recipe->getName(), $recipe->getName(), "\n"), "\n", file_get_contents($file), -1, $count);
if (!$count) {
return;
}

$this->write('Removing entries in .gitignore');
file_put_contents($file, ltrim($contents, "\r\n"));
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$recipeUpdate->setOriginalFile(
'.gitignore',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getOriginalRecipe(), $originalConfig)
);

$recipeUpdate->setNewFile(
'.gitignore',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getNewRecipe(), $newConfig)
);
}

private function configureGitignore(Recipe $recipe, array $vars, bool $update)
{
$gitignore = $this->options->get('root-dir').'/.gitignore';
if (!$update && $this->isFileMarked($recipe, $gitignore)) {
return;
}

$data = '';
foreach ($vars as $value) {
$value = $this->options->expandTargetDir($value);
$data .= "$value\n";
}
$data = "\n".ltrim($this->markData($recipe, $data), "\r\n");

if (!$this->updateData($gitignore, $data)) {
file_put_contents($gitignore, $data, \FILE_APPEND);
}
}

private function getContentsAfterApplyingRecipe(string $rootDir, Recipe $recipe, $vars): ?string
{
if (0 === \count($vars)) {
return null;
}

$file = $rootDir.'/.gitignore';
$originalContents = file_exists($file) ? file_get_contents($file) : null;

$this->configureGitignore(
$recipe,
$vars,
true
);

$updatedContents = file_exists($file) ? file_get_contents($file) : null;

if (null === $originalContents) {
if (file_exists($file)) {
unlink($file);
}
} else {
file_put_contents($file, $originalContents);
}

return $updatedContents;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Composer\Composer;
use Composer\IO\IOInterface;
use Symfony\Flex\Lock;
use Symfony\Flex\Options;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class EnvConfigurator extends AbstractConfigurator
{
private string $suffix;

public function __construct(Composer $composer, IOInterface $io, Options $options, string $suffix = '')
{
parent::__construct($composer, $io, $options);
$this->suffix = $suffix;
}

public function configure(Recipe $recipe, $vars, Lock $lock, array $options = [])
{
$this->write('Adding environment variable defaults'.('' === $this->suffix ? '' : ' ('.$this->suffix.')'));

$this->configureEnvDist($recipe, $vars, $options['force'] ?? false);

if ('' !== $this->suffix) {
return;
}

if (!file_exists($this->options->get('root-dir').'/'.($this->options->get('runtime')['dotenv_path'] ?? '.env').'.test')) {
$this->configurePhpUnit($recipe, $vars, $options['force'] ?? false);
}
}

public function unconfigure(Recipe $recipe, $vars, Lock $lock)
{
$this->unconfigureEnvFiles($recipe, $vars);
$this->unconfigurePhpUnit($recipe, $vars);
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$recipeUpdate->addOriginalFiles(
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getOriginalRecipe(), $originalConfig)
);

$recipeUpdate->addNewFiles(
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getNewRecipe(), $newConfig)
);
}

private function configureEnvDist(Recipe $recipe, $vars, bool $update)
{
$dotenvPath = $this->options->get('runtime')['dotenv_path'] ?? '.env';
$files = '' === $this->suffix ? [$dotenvPath.'.dist', $dotenvPath] : [$dotenvPath.'.'.$this->suffix];

foreach ($files as $file) {
$env = $this->options->get('root-dir').'/'.$file;
if (!is_file($env)) {
continue;
}

if (!$update && $this->isFileMarked($recipe, $env)) {
continue;
}

$data = '';
foreach ($vars as $key => $value) {
$existingValue = $update ? $this->findExistingValue($key, $env, $recipe) : null;
$value = $this->evaluateValue($value, $existingValue);
if ('#' === $key[0] && is_numeric(substr($key, 1))) {
if ('' === $value) {
$data .= "#\n";
} else {
$data .= '# '.$value."\n";
}

continue;
}

$value = $this->options->expandTargetDir($value);
if (false !== strpbrk($value, " \t\n&!\"")) {
$value = '"'.str_replace(['\\', '"', "\t", "\n"], ['\\\\', '\\"', '\t', '\n'], $value).'"';
}
$data .= "$key=$value\n";
}
$data = $this->markData($recipe, $data);

if (!$this->updateData($env, $data)) {
file_put_contents($env, $data, \FILE_APPEND);
}
}
}

private function configurePhpUnit(Recipe $recipe, $vars, bool $update)
{
foreach (['phpunit.xml.dist', 'phpunit.dist.xml', 'phpunit.xml'] as $file) {
$phpunit = $this->options->get('root-dir').'/'.$file;
if (!is_file($phpunit)) {
continue;
}

if (!$update && $this->isFileXmlMarked($recipe, $phpunit)) {
continue;
}

$data = '';
foreach ($vars as $key => $value) {
$value = $this->evaluateValue($value);
if ('#' === $key[0]) {
if (is_numeric(substr($key, 1))) {
$doc = new \DOMDocument();
$data .= '        '.$doc->saveXML($doc->createComment(' '.$value.' '))."\n";
} else {
$value = $this->options->expandTargetDir($value);
$doc = new \DOMDocument();
$fragment = $doc->createElement('env');
$fragment->setAttribute('name', substr($key, 1));
$fragment->setAttribute('value', $value);
$data .= '        '.str_replace(['<', '/>'], ['<!-- ', ' -->'], $doc->saveXML($fragment))."\n";
}
} else {
$value = $this->options->expandTargetDir($value);
$doc = new \DOMDocument();
$fragment = $doc->createElement('env');
$fragment->setAttribute('name', $key);
$fragment->setAttribute('value', $value);
$data .= '        '.$doc->saveXML($fragment)."\n";
}
}
$data = $this->markXmlData($recipe, $data);

if (!$this->updateData($phpunit, $data)) {
file_put_contents($phpunit, preg_replace('{^(\s+</php>)}m', $data.'$1', file_get_contents($phpunit)));
}
}
}

private function unconfigureEnvFiles(Recipe $recipe, $vars)
{
$dotenvPath = $this->options->get('runtime')['dotenv_path'] ?? '.env';
$files = '' === $this->suffix ? [$dotenvPath, $dotenvPath.'.dist'] : [$dotenvPath.'.'.$this->suffix];

foreach ($files as $file) {
$env = $this->options->get('root-dir').'/'.$file;
if (!file_exists($env)) {
continue;
}

$contents = preg_replace(\sprintf('{%s*###> %s ###.*###< %s ###%s+}s', "\n", $recipe->getName(), $recipe->getName(), "\n"), "\n", file_get_contents($env), -1, $count);
if (!$count) {
continue;
}

$this->write(\sprintf('Removing environment variables from %s', $file));
file_put_contents($env, $contents);
}
}

private function unconfigurePhpUnit(Recipe $recipe, $vars)
{
foreach (['phpunit.dist.xml', 'phpunit.xml.dist', 'phpunit.xml'] as $file) {
$phpunit = $this->options->get('root-dir').'/'.$file;
if (!is_file($phpunit)) {
continue;
}

$contents = preg_replace(\sprintf('{%s*\s+<!-- ###\+ %s ### -->.*<!-- ###- %s ### -->%s+}s', "\n", $recipe->getName(), $recipe->getName(), "\n"), "\n", file_get_contents($phpunit), -1, $count);
if (!$count) {
continue;
}

$this->write(\sprintf('Removing environment variables from %s', $file));
file_put_contents($phpunit, $contents);
}
}







private function evaluateValue($value, ?string $originalValue = null)
{
if ('%generate(secret)%' === $value) {
if (null !== $originalValue) {
return $originalValue;
}

return $this->generateRandomBytes();
}
if (preg_match('~^%generate\(secret,\s*([0-9]+)\)%$~', $value, $matches)) {
if (null !== $originalValue) {
return $originalValue;
}

return $this->generateRandomBytes($matches[1]);
}

return $value;
}

private function generateRandomBytes($length = 16)
{
return bin2hex(random_bytes($length));
}

private function getContentsAfterApplyingRecipe(string $rootDir, Recipe $recipe, array $vars): array
{
$dotenvPath = $this->options->get('runtime')['dotenv_path'] ?? '.env';
$files = '' === $this->suffix ? [$dotenvPath, $dotenvPath.'.dist', 'phpunit.dist.xml', 'phpunit.xml.dist', 'phpunit.xml'] : [$dotenvPath.'.'.$this->suffix];

if (0 === \count($vars)) {
return array_fill_keys($files, null);
}

$originalContents = [];
foreach ($files as $file) {
$originalContents[$file] = file_exists($rootDir.'/'.$file) ? file_get_contents($rootDir.'/'.$file) : null;
}

$this->configureEnvDist(
$recipe,
$vars,
true
);

if ('' === $this->suffix && !file_exists($rootDir.'/'.$dotenvPath.'.test')) {
$this->configurePhpUnit(
$recipe,
$vars,
true
);
}

$updatedContents = [];
foreach ($files as $file) {
$updatedContents[$file] = file_exists($rootDir.'/'.$file) ? file_get_contents($rootDir.'/'.$file) : null;
}

foreach ($originalContents as $file => $contents) {
if (null === $contents) {
if (file_exists($rootDir.'/'.$file)) {
unlink($rootDir.'/'.$file);
}
} else {
file_put_contents($rootDir.'/'.$file, $contents);
}
}

return $updatedContents;
}




private function findExistingValue(string $var, string $filename, Recipe $recipe): ?string
{
if (!file_exists($filename)) {
return null;
}

$contents = file_get_contents($filename);
$section = $this->extractSection($recipe, $contents);
if (!$section) {
return null;
}

$lines = explode("\n", $section);
foreach ($lines as $line) {
if (!str_starts_with($line, \sprintf('%s=', $var))) {
continue;
}

return trim(substr($line, \strlen($var) + 1));
}

return null;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class MakefileConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $definitions, Lock $lock, array $options = [])
{
$this->write('Adding Makefile entries');

$this->configureMakefile($recipe, $definitions, $options['force'] ?? false);
}

public function unconfigure(Recipe $recipe, $vars, Lock $lock)
{
if (!file_exists($makefile = $this->options->get('root-dir').'/Makefile')) {
return;
}

$contents = preg_replace(\sprintf('{%s*###> %s ###.*###< %s ###%s+}s', "\n", $recipe->getName(), $recipe->getName(), "\n"), "\n", file_get_contents($makefile), -1, $count);
if (!$count) {
return;
}

$this->write(\sprintf('Removing Makefile entries from %s', $makefile));
if (!trim($contents)) {
@unlink($makefile);
} else {
file_put_contents($makefile, ltrim($contents, "\r\n"));
}
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$recipeUpdate->setOriginalFile(
'Makefile',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getOriginalRecipe(), $originalConfig)
);

$recipeUpdate->setNewFile(
'Makefile',
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getNewRecipe(), $newConfig)
);
}

private function configureMakefile(Recipe $recipe, array $definitions, bool $update)
{
$makefile = $this->options->get('root-dir').'/Makefile';
if (!$update && $this->isFileMarked($recipe, $makefile)) {
return;
}

$data = $this->options->expandTargetDir(implode("\n", $definitions));
$data = $this->markData($recipe, $data);
$data = "\n".ltrim($data, "\r\n");

if (!file_exists($makefile)) {
$envKey = $this->options->get('runtime')['env_var_name'] ?? 'APP_ENV';
$dotenvPath = $this->options->get('runtime')['dotenv_path'] ?? '.env';
file_put_contents(
$this->options->get('root-dir').'/Makefile',
<<<EOF
                    ifndef {$envKey}
                        include {$dotenvPath}
                    endif

                    .DEFAULT_GOAL := help
                    .PHONY: help
                    help:
                        @awk 'BEGIN {FS = ":.*?## "}; /^[a-zA-Z-]+:.*?## .*$$/ {printf "\033[32m%-15s\033[0m %s\\n", $$1, $$2}' Makefile | sort

                    EOF
);
}

if (!$this->updateData($makefile, $data)) {
file_put_contents($makefile, $data, \FILE_APPEND);
}
}

private function getContentsAfterApplyingRecipe(string $rootDir, Recipe $recipe, array $definitions): ?string
{
if (0 === \count($definitions)) {
return null;
}

$file = $rootDir.'/Makefile';
$originalContents = file_exists($file) ? file_get_contents($file) : null;

$this->configureMakefile(
$recipe,
$definitions,
true
);

$updatedContents = file_exists($file) ? file_get_contents($file) : null;

if (null === $originalContents) {
if (file_exists($file)) {
unlink($file);
}
} else {
file_put_contents($file, $originalContents);
}

return $updatedContents;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class ContainerConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $parameters, Lock $lock, array $options = [])
{
$this->write('Setting parameters');
$contents = $this->configureParameters($parameters);

if (null !== $contents) {
file_put_contents($this->options->get('root-dir').'/'.$this->getServicesPath(), $contents);
}
}

public function unconfigure(Recipe $recipe, $parameters, Lock $lock)
{
$this->write('Unsetting parameters');
$target = $this->options->get('root-dir').'/'.$this->getServicesPath();
$lines = $this->removeParametersFromLines(file($target), $parameters);
file_put_contents($target, implode('', $lines));
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$recipeUpdate->setOriginalFile(
$this->getServicesPath(),
$this->configureParameters($originalConfig, true)
);


$removedParameters = [];
foreach ($originalConfig as $name => $value) {
if (!isset($newConfig[$name])) {
$removedParameters[$name] = $value;
}
}

$updatedFile = $this->configureParameters($newConfig, true);
$lines = $this->removeParametersFromLines(explode("\n", $updatedFile), $removedParameters);

$recipeUpdate->setNewFile(
$this->getServicesPath(),
implode("\n", $lines)
);
}

private function configureParameters(array $parameters, bool $update = false): string
{
$target = $this->options->get('root-dir').'/'.$this->getServicesPath();
$endAt = 0;
$isParameters = false;
$lines = [];
foreach (file($target) as $i => $line) {
$lines[] = $line;
if (!$isParameters && !preg_match('/^parameters:/', $line)) {
continue;
}
if (!$isParameters) {
$isParameters = true;
continue;
}
if (!preg_match('/^\s+.*/', $line) && '' !== trim($line)) {
$endAt = $i - 1;
$isParameters = false;
continue;
}
foreach ($parameters as $key => $value) {
$matches = [];
if (preg_match(\sprintf('/^\s+%s\:/', preg_quote($key, '/')), $line, $matches)) {
if ($update) {
$lines[$i] = substr($line, 0, \strlen($matches[0])).' '.str_replace("'", "''", $value)."\n";
}

unset($parameters[$key]);
}
}
}

if ($parameters) {
$parametersLines = [];
if (!$endAt) {
$parametersLines[] = "parameters:\n";
}
foreach ($parameters as $key => $value) {
if (\is_array($value)) {
$parametersLines[] = \sprintf("    %s:\n%s", $key, $this->dumpYaml(2, $value));
continue;
}
$parametersLines[] = \sprintf("    %s: '%s'%s", $key, str_replace("'", "''", $value), "\n");
}
if (!$endAt) {
$parametersLines[] = "\n";
}
array_splice($lines, $endAt, 0, $parametersLines);
}

return implode('', $lines);
}

private function removeParametersFromLines(array $sourceLines, array $parameters): array
{
$lines = [];
foreach ($sourceLines as $line) {
if ($this->removeParameters(1, $parameters, $line)) {
continue;
}
$lines[] = $line;
}

return $lines;
}

private function removeParameters($level, $params, $line)
{
foreach ($params as $key => $value) {
if (\is_array($value) && $this->removeParameters($level + 1, $value, $line)) {
return true;
}
if (preg_match(\sprintf('/^(\s{%d}|\t{%d})+%s\:/', 4 * $level, $level, preg_quote($key, '/')), $line)) {
return true;
}
}

return false;
}

private function dumpYaml($level, $array): string
{
$line = '';
foreach ($array as $key => $value) {
$line .= str_repeat('    ', $level);
if (!\is_array($value)) {
$line .= \sprintf("%s: '%s'\n", $key, str_replace("'", "''", $value));
continue;
}
$line .= \sprintf("%s:\n", $key).$this->dumpYaml($level + 1, $value);
}

return $line;
}

private function getServicesPath(): string
{
return $this->options->expandTargetDir('%CONFIG_DIR%/services.yaml');
}
}
<?php

namespace Symfony\Flex\Configurator;

use Composer\IO\IOInterface;
use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;





class AddLinesConfigurator extends AbstractConfigurator
{
private const POSITION_TOP = 'top';
private const POSITION_BOTTOM = 'bottom';
private const POSITION_AFTER_TARGET = 'after_target';

private const VALID_POSITIONS = [
self::POSITION_TOP,
self::POSITION_BOTTOM,
self::POSITION_AFTER_TARGET,
];








private $fileContents = [];

public function configure(Recipe $recipe, $config, Lock $lock, array $options = []): void
{
$this->fileContents = [];
$this->executeConfigure($recipe, $config);

foreach ($this->fileContents as $file => $contents) {
$this->write(\sprintf('[add-lines] Patching file "%s"', $this->relativize($file)));
file_put_contents($file, $contents);
}
}

public function unconfigure(Recipe $recipe, $config, Lock $lock): void
{
$this->fileContents = [];
$this->executeUnconfigure($recipe, $config);

foreach ($this->fileContents as $file => $change) {
$this->write(\sprintf('[add-lines] Reverting file "%s"', $this->relativize($file)));
file_put_contents($file, $change);
}
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{

$originalConfig = array_filter($originalConfig, function ($item) {
return !isset($item['requires']) || $this->isPackageInstalled($item['requires']);
});


$this->fileContents = [];
$this->executeUnconfigure($recipeUpdate->getOriginalRecipe(), $originalConfig);
$this->executeConfigure($recipeUpdate->getNewRecipe(), $newConfig);
$newFiles = [];
$originalFiles = [];
foreach ($this->fileContents as $file => $contents) {

$originalFiles[$this->relativize($file)] = file_get_contents($file);

$newFiles[$this->relativize($file)] = $contents;
}
$recipeUpdate->addOriginalFiles($originalFiles);
$recipeUpdate->addNewFiles($newFiles);
}

public function executeConfigure(Recipe $recipe, $config): void
{
foreach ($config as $patch) {
if (!isset($patch['file'])) {
$this->write(\sprintf('The "file" key is required for the "add-lines" configurator for recipe "%s". Skipping', $recipe->getName()));

continue;
}

if (isset($patch['requires']) && !$this->isPackageInstalled($patch['requires'])) {
continue;
}

if (!isset($patch['content'])) {
$this->write(\sprintf('The "content" key is required for the "add-lines" configurator for recipe "%s". Skipping', $recipe->getName()));

continue;
}
$content = $patch['content'];

$file = $this->path->concatenate([$this->options->get('root-dir'), $this->options->expandTargetDir($patch['file'])]);
$warnIfMissing = isset($patch['warn_if_missing']) && $patch['warn_if_missing'];
if (!is_file($file)) {
$this->write([
\sprintf('Could not add lines to file <info>%s</info> as it does not exist. Missing lines:', $patch['file']),
'<comment>"""</comment>',
$content,
'<comment>"""</comment>',
'',
], $warnIfMissing ? IOInterface::NORMAL : IOInterface::VERBOSE);

continue;
}

if (!isset($patch['position'])) {
$this->write(\sprintf('The "position" key is required for the "add-lines" configurator for recipe "%s". Skipping', $recipe->getName()));

continue;
}
$position = $patch['position'];
if (!\in_array($position, self::VALID_POSITIONS, true)) {
$this->write(\sprintf('The "position" key must be one of "%s" for the "add-lines" configurator for recipe "%s". Skipping', implode('", "', self::VALID_POSITIONS), $recipe->getName()));

continue;
}

if (self::POSITION_AFTER_TARGET === $position && !isset($patch['target'])) {
$this->write(\sprintf('The "target" key is required when "position" is "%s" for the "add-lines" configurator for recipe "%s". Skipping', self::POSITION_AFTER_TARGET, $recipe->getName()));

continue;
}
$target = isset($patch['target']) ? $patch['target'] : null;

$newContents = $this->getPatchedContents($file, $content, $position, $target, $warnIfMissing);
$this->fileContents[$file] = $newContents;
}
}

public function executeUnconfigure(Recipe $recipe, $config): void
{
foreach ($config as $patch) {
if (!isset($patch['file'])) {
$this->write(\sprintf('The "file" key is required for the "add-lines" configurator for recipe "%s". Skipping', $recipe->getName()));

continue;
}




$file = $this->path->concatenate([$this->options->get('root-dir'), $this->options->expandTargetDir($patch['file'])]);
if (!is_file($file)) {
continue;
}

if (!isset($patch['content'])) {
$this->write(\sprintf('The "content" key is required for the "add-lines" configurator for recipe "%s". Skipping', $recipe->getName()));

continue;
}
$value = $patch['content'];

$newContents = $this->getUnPatchedContents($file, $value);
$this->fileContents[$file] = $newContents;
}
}

private function getPatchedContents(string $file, string $value, string $position, ?string $target, bool $warnIfMissing): string
{
$fileContents = $this->readFile($file);

if (str_contains($fileContents, $value)) {
return $fileContents; 
}

switch ($position) {
case self::POSITION_BOTTOM:
$fileContents .= "\n".$value;

break;
case self::POSITION_TOP:
$fileContents = $value."\n".$fileContents;

break;
case self::POSITION_AFTER_TARGET:
$lines = explode("\n", $fileContents);
$targetFound = false;
foreach ($lines as $key => $line) {
if (str_contains($line, $target)) {
array_splice($lines, $key + 1, 0, $value);
$targetFound = true;

break;
}
}
$fileContents = implode("\n", $lines);

if (!$targetFound) {
$this->write([
\sprintf('Could not add lines after "%s" as no such string was found in "%s". Missing lines:', $target, $file),
'<comment>"""</comment>',
$value,
'<comment>"""</comment>',
'',
], $warnIfMissing ? IOInterface::NORMAL : IOInterface::VERBOSE);
}

break;
}

return $fileContents;
}

private function getUnPatchedContents(string $file, $value): string
{
$fileContents = $this->readFile($file);

if (!str_contains($fileContents, $value)) {
return $fileContents; 
}

if (str_contains($fileContents, "\n".$value)) {
$value = "\n".$value;
} elseif (str_contains($fileContents, $value."\n")) {
$value .= "\n";
}

$position = strpos($fileContents, $value);

return substr_replace($fileContents, '', $position, \strlen($value));
}

private function isPackageInstalled($packages): bool
{
if (\is_string($packages)) {
$packages = [$packages];
}

$installedRepo = $this->composer->getRepositoryManager()->getLocalRepository();

foreach ($packages as $package) {
$package = explode(':', $package, 2);
$packageName = $package[0];
$constraint = $package[1] ?? '*';

if (null === $installedRepo->findPackage($packageName, $constraint)) {
return false;
}
}

return true;
}

private function relativize(string $path): string
{
$rootDir = $this->options->get('root-dir');
if (str_starts_with($path, $rootDir)) {
$path = substr($path, \strlen($rootDir) + 1);
}

return ltrim($path, '/\\');
}

private function readFile(string $file): string
{
if (isset($this->fileContents[$file])) {
return $this->fileContents[$file];
}

$fileContents = file_get_contents($file);
$this->fileContents[$file] = $fileContents;

return $fileContents;
}
}
<?php










namespace Symfony\Flex\Configurator;

use Composer\Factory;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class ComposerCommandsConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $scripts, Lock $lock, array $options = [])
{
$json = new JsonFile(Factory::getComposerFile());

file_put_contents($json->getPath(), $this->configureScripts($scripts, $json));
}

public function unconfigure(Recipe $recipe, $scripts, Lock $lock)
{
$json = new JsonFile(Factory::getComposerFile());

$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
foreach ($scripts as $key => $command) {
$manipulator->removeSubNode('scripts', $key);
}

file_put_contents($json->getPath(), $manipulator->getContents());
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$json = new JsonFile(Factory::getComposerFile());
$jsonPath = $json->getPath();
if (str_starts_with($jsonPath, $recipeUpdate->getRootDir())) {
$jsonPath = substr($jsonPath, \strlen($recipeUpdate->getRootDir()));
}
$jsonPath = ltrim($jsonPath, '/\\');

$recipeUpdate->setOriginalFile(
$jsonPath,
$this->configureScripts($originalConfig, $json)
);
$recipeUpdate->setNewFile(
$jsonPath,
$this->configureScripts($newConfig, $json)
);
}

private function configureScripts(array $scripts, JsonFile $json): string
{
$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
foreach ($scripts as $cmdName => $script) {
$manipulator->addSubNode('scripts', $cmdName, $script);
}

return $manipulator->getContents();
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class CopyFromRecipeConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $config, Lock $lock, array $options = [])
{
$this->write('Copying files from recipe');
$options = array_merge($this->options->toArray(), $options);

$lock->add($recipe->getName(), ['files' => $this->copyFiles($config, $recipe->getFiles(), $options)]);
}

public function unconfigure(Recipe $recipe, $config, Lock $lock)
{
$this->write('Removing files from recipe');
$rootDir = $this->options->get('root-dir');

foreach ($this->options->getRemovableFiles($recipe, $lock) as $file) {
if ('.git' !== $file) { 
$this->removeFile($this->path->concatenate([$rootDir, $file]));
}
}
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
foreach ($recipeUpdate->getOriginalRecipe()->getFiles() as $filename => $data) {
$filename = $this->resolveTargetFolder($filename, $originalConfig);
$recipeUpdate->setOriginalFile($filename, $data['contents']);
}

$files = [];
foreach ($recipeUpdate->getNewRecipe()->getFiles() as $filename => $data) {
$filename = $this->resolveTargetFolder($filename, $newConfig);
$recipeUpdate->setNewFile($filename, $data['contents']);

$files[] = $this->getLocalFilePath($recipeUpdate->getRootDir(), $filename);
}

$recipeUpdate->getLock()->add($recipeUpdate->getPackageName(), ['files' => $files]);
}




private function resolveTargetFolder(string $path, array $config): string
{
foreach ($config as $key => $target) {
if (str_starts_with($path, $key)) {
return $this->options->expandTargetDir($target).substr($path, \strlen($key));
}
}

return $path;
}

private function copyFiles(array $manifest, array $files, array $options): array
{
$copiedFiles = [];
$to = $options['root-dir'] ?? '.';

foreach ($manifest as $source => $target) {
$target = $this->options->expandTargetDir($target);
if ('/' === substr($source, -1)) {
$copiedFiles = array_merge(
$copiedFiles,
$this->copyDir($source, $this->path->concatenate([$to, $target]), $files, $options)
);
} else {
$copiedFiles[] = $this->copyFile($this->path->concatenate([$to, $target]), $files[$source]['contents'], $files[$source]['executable'], $options);
}
}

return $copiedFiles;
}

private function copyDir(string $source, string $target, array $files, array $options): array
{
$copiedFiles = [];
foreach ($files as $file => $data) {
if (str_starts_with($file, $source)) {
$file = $this->path->concatenate([$target, substr($file, \strlen($source))]);
$copiedFiles[] = $this->copyFile($file, $data['contents'], $data['executable'], $options);
}
}

return $copiedFiles;
}

private function copyFile(string $to, string $contents, bool $executable, array $options): string
{
$basePath = $options['root-dir'] ?? '.';
$copiedFile = $this->getLocalFilePath($basePath, $to);

if (!$this->options->shouldWriteFile($to, $options['force'] ?? false, $options['assumeYesForPrompts'] ?? false)) {
return $copiedFile;
}

if (!is_dir(\dirname($to))) {
mkdir(\dirname($to), 0777, true);
}

file_put_contents($to, $this->options->expandTargetDir($contents));
if ($executable) {
@chmod($to, fileperms($to) | 0111);
}

$this->write(\sprintf('  Created <fg=green>"%s"</>', $this->path->relativize($to)));

return $copiedFile;
}

private function removeFile(string $to)
{
if (!file_exists($to)) {
return;
}

@unlink($to);
$this->write(\sprintf('  Removed <fg=green>"%s"</>', $this->path->relativize($to)));

if (0 === \count(glob(\dirname($to).'/*', \GLOB_NOSORT))) {
@rmdir(\dirname($to));
}
}

private function getLocalFilePath(string $basePath, $destination): string
{
return str_replace($basePath.\DIRECTORY_SEPARATOR, '', $destination);
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class BundlesConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $bundles, Lock $lock, array $options = [])
{
$this->write('Enabling the package as a Symfony bundle');
$registered = $this->configureBundles($bundles);
$this->dump($this->getConfFile(), $registered);
}

public function unconfigure(Recipe $recipe, $bundles, Lock $lock)
{
$this->write('Disabling the Symfony bundle');
$file = $this->getConfFile();
if (!file_exists($file)) {
return;
}

$registered = $this->load($file);
foreach (array_keys($this->prepareBundles($bundles)) as $class) {
unset($registered[$class]);
}
$this->dump($file, $registered);
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$originalBundles = $this->configureBundles($originalConfig, true);
$recipeUpdate->setOriginalFile(
$this->getLocalConfFile(),
$this->buildContents($originalBundles)
);

$newBundles = $this->configureBundles($newConfig, true);
$recipeUpdate->setNewFile(
$this->getLocalConfFile(),
$this->buildContents($newBundles)
);
}

private function configureBundles(array $bundles, bool $resetEnvironments = false): array
{
$file = $this->getConfFile();
$registered = $this->load($file);
$classes = $this->prepareBundles($bundles);
if (isset($classes[$fwb = 'Symfony\Bundle\FrameworkBundle\FrameworkBundle'])) {
foreach ($classes[$fwb] as $env) {
$registered[$fwb][$env] = true;
}
unset($classes[$fwb]);
}
foreach ($classes as $class => $envs) {

if (!isset($registered[$class]) || $resetEnvironments) {
if ($resetEnvironments) {




$registered[$class] = [];
}

foreach ($envs as $env) {
$registered[$class][$env] = true;
}
}
}

return $registered;
}

private function prepareBundles(array $bundles): array
{
foreach ($bundles as $class => $envs) {
$bundles[ltrim($class, '\\')] = $envs;
}

return $bundles;
}

private function load(string $file): array
{
$bundles = file_exists($file) ? (require $file) : [];
if (!\is_array($bundles)) {
$bundles = [];
}

return $bundles;
}

private function dump(string $file, array $bundles)
{
$contents = $this->buildContents($bundles);

if (!is_dir(\dirname($file))) {
mkdir(\dirname($file), 0777, true);
}

file_put_contents($file, $contents);

if (\function_exists('opcache_invalidate')) {
@opcache_invalidate($file);
}
}

private function buildContents(array $bundles): string
{
$contents = "<?php\n\nreturn [\n";
foreach ($bundles as $class => $envs) {
$contents .= "    $class::class => [";
foreach ($envs as $env => $value) {
$booleanValue = var_export($value, true);
$contents .= "'$env' => $booleanValue, ";
}
$contents = substr($contents, 0, -2)."],\n";
}
$contents .= "];\n";

return $contents;
}

private function getConfFile(): string
{
return $this->options->get('root-dir').'/'.$this->getLocalConfFile();
}

private function getLocalConfFile(): string
{
return $this->options->expandTargetDir('%CONFIG_DIR%/bundles.php');
}
}
<?php










namespace Symfony\Flex\Configurator;

use Composer\Factory;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class ComposerScriptsConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $scripts, Lock $lock, array $options = [])
{
$json = new JsonFile(Factory::getComposerFile());

file_put_contents($json->getPath(), $this->configureScripts($scripts, $json));
}

public function unconfigure(Recipe $recipe, $scripts, Lock $lock)
{
$json = new JsonFile(Factory::getComposerFile());

$jsonContents = $json->read();
$autoScripts = $jsonContents['scripts']['auto-scripts'] ?? [];
foreach (array_keys($scripts) as $cmd) {
unset($autoScripts[$cmd]);
}

$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
$manipulator->addSubNode('scripts', 'auto-scripts', $autoScripts);

file_put_contents($json->getPath(), $manipulator->getContents());
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$json = new JsonFile(Factory::getComposerFile());
$jsonPath = $json->getPath();
if (str_starts_with($jsonPath, $recipeUpdate->getRootDir())) {
$jsonPath = substr($jsonPath, \strlen($recipeUpdate->getRootDir()));
}
$jsonPath = ltrim($jsonPath, '/\\');

$recipeUpdate->setOriginalFile(
$jsonPath,
$this->configureScripts($originalConfig, $json)
);
$recipeUpdate->setNewFile(
$jsonPath,
$this->configureScripts($newConfig, $json)
);
}

private function configureScripts(array $scripts, JsonFile $json): string
{
$jsonContents = $json->read();
$autoScripts = $jsonContents['scripts']['auto-scripts'] ?? [];
$autoScripts = array_merge($autoScripts, $scripts);

$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
$manipulator->addSubNode('scripts', 'auto-scripts', $autoScripts);

return $manipulator->getContents();
}
}
<?php










namespace Symfony\Flex\Configurator;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;




class CopyFromPackageConfigurator extends AbstractConfigurator
{
public function configure(Recipe $recipe, $config, Lock $lock, array $options = [])
{
$this->write('Copying files from package');
$packageDir = $this->composer->getInstallationManager()->getInstallPath($recipe->getPackage());
$options = array_merge($this->options->toArray(), $options);

$files = $this->getFilesToCopy($config, $packageDir);
foreach ($files as $source => $target) {
$this->copyFile($source, $target, $options);
}
}

public function unconfigure(Recipe $recipe, $config, Lock $lock)
{
$this->write('Removing files from package');
$packageDir = $this->composer->getInstallationManager()->getInstallPath($recipe->getPackage());
$this->removeFiles($config, $packageDir, $this->options->get('root-dir'));
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
$packageDir = $this->composer->getInstallationManager()->getInstallPath($recipeUpdate->getNewRecipe()->getPackage());
foreach ($originalConfig as $source => $target) {
if (isset($newConfig[$source])) {

$recipeUpdate->addCopyFromPackagePath(
$packageDir.'/'.$source,
$this->options->expandTargetDir($target)
);

unset($newConfig[$source]);
}


}


foreach ($this->getFilesToCopy($newConfig, $packageDir) as $source => $target) {
if (!file_exists($source)) {
throw new \LogicException(\sprintf('File "%s" does not exist!', $source));
}

$recipeUpdate->setNewFile($target, file_get_contents($source));
}
}

private function getFilesToCopy(array $manifest, string $from): array
{
$files = [];
foreach ($manifest as $source => $target) {
$target = $this->options->expandTargetDir($target);
if ('/' === substr($source, -1)) {
$files = array_merge($files, $this->getFilesForDir($this->path->concatenate([$from, $source]), $target));

continue;
}

$files[$this->path->concatenate([$from, $source])] = $target;
}

return $files;
}

private function removeFiles(array $manifest, string $from, string $to)
{
foreach ($manifest as $source => $target) {
$target = $this->options->expandTargetDir($target);
if ('/' === substr($source, -1)) {
$this->removeFilesFromDir($this->path->concatenate([$from, $source]), $this->path->concatenate([$to, $target]));
} else {
$targetPath = $this->path->concatenate([$to, $target]);
if (file_exists($targetPath)) {
@unlink($targetPath);
$this->write(\sprintf('  Removed <fg=green>"%s"</>', $this->path->relativize($targetPath)));
}
}
}
}

private function getFilesForDir(string $source, string $target): array
{
$iterator = $this->createSourceIterator($source, \RecursiveIteratorIterator::SELF_FIRST);
$files = [];
foreach ($iterator as $item) {
$targetPath = $this->path->concatenate([$target, $iterator->getSubPathName()]);

$files[(string) $item] = $targetPath;
}

return $files;
}





public function copyFile(string $source, string $target, array $options)
{
$target = $this->options->get('root-dir').'/'.$this->options->expandTargetDir($target);
if (is_dir($source)) {

return;
}

if (!$this->options->shouldWriteFile($target, $options['force'] ?? false, $options['assumeYesForPrompts'] ?? false)) {
return;
}

if (!file_exists($source)) {
throw new \LogicException(\sprintf('File "%s" does not exist!', $source));
}

if (!file_exists(\dirname($target))) {
mkdir(\dirname($target), 0777, true);
$this->write(\sprintf('  Created <fg=green>"%s"</>', $this->path->relativize(\dirname($target))));
}

file_put_contents($target, $this->options->expandTargetDir(file_get_contents($source)));
@chmod($target, fileperms($target) | (fileperms($source) & 0111));
$this->write(\sprintf('  Created <fg=green>"%s"</>', $this->path->relativize($target)));
}

private function removeFilesFromDir(string $source, string $target)
{
if (!is_dir($source)) {
return;
}
$iterator = $this->createSourceIterator($source, \RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iterator as $item) {
$targetPath = $this->path->concatenate([$target, $iterator->getSubPathName()]);
if ($item->isDir()) {

@rmdir($targetPath);
$this->write(\sprintf('  Removed directory <fg=green>"%s"</>', $this->path->relativize($targetPath)));
} else {
@unlink($targetPath);
$this->write(\sprintf('  Removed <fg=green>"%s"</>', $this->path->relativize($targetPath)));
}
}
}

private function createSourceIterator(string $source, int $mode): \RecursiveIteratorIterator
{
return new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), $mode);
}
}
<?php










namespace Symfony\Flex\Configurator;

use Composer\Composer;
use Composer\Factory;
use Composer\IO\IOInterface;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Flex\Lock;
use Symfony\Flex\Options;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipeUpdate;






class DockerComposeConfigurator extends AbstractConfigurator
{
private $filesystem;

public static $configureDockerRecipes;

public function __construct(Composer $composer, IOInterface $io, Options $options)
{
parent::__construct($composer, $io, $options);

$this->filesystem = new Filesystem();
}

public function configure(Recipe $recipe, $config, Lock $lock, array $options = [])
{
if (!self::shouldConfigureDockerRecipe($this->composer, $this->io, $recipe)) {
return;
}

$this->configureDockerCompose($recipe, $config, $options['force'] ?? false);

$this->write('Docker Compose definitions have been modified. Please run "docker compose up --build" again to apply the changes.');
}

public function unconfigure(Recipe $recipe, $config, Lock $lock)
{
$rootDir = $this->options->get('root-dir');
foreach ($this->normalizeConfig($config) as $file => $extra) {
if (null === $dockerComposeFile = $this->findDockerComposeFile($rootDir, $file)) {
continue;
}

$name = $recipe->getName();

$contents = preg_replace(\sprintf('{%s+###> %s ###.*?###< %s ###%s+}s', "\n", $name, $name, "\n"), \PHP_EOL.\PHP_EOL, file_get_contents($dockerComposeFile), -1, $count);
if (!$count) {
return;
}

foreach ($extra as $key => $value) {
if (0 === preg_match(\sprintf('{^%s:[ \t\r\n]*([ \t]+\w|#)}m', $key), $contents, $matches)) {
$contents = preg_replace(\sprintf('{\n?^%s:[ \t\r\n]*}sm', $key), '', $contents, -1, $count);
}
}

$this->write(\sprintf('Removing Docker Compose entries from "%s"', $dockerComposeFile));
file_put_contents($dockerComposeFile, ltrim($contents, "\n"));
}

$this->write('Docker Compose definitions have been modified. Please run "docker compose up" again to apply the changes.');
}

public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
{
if (!self::shouldConfigureDockerRecipe($this->composer, $this->io, $recipeUpdate->getNewRecipe())) {
return;
}

$recipeUpdate->addOriginalFiles(
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getOriginalRecipe(), $originalConfig)
);

$recipeUpdate->addNewFiles(
$this->getContentsAfterApplyingRecipe($recipeUpdate->getRootDir(), $recipeUpdate->getNewRecipe(), $newConfig)
);
}

public static function shouldConfigureDockerRecipe(Composer $composer, IOInterface $io, Recipe $recipe): bool
{
if (null !== self::$configureDockerRecipes) {
return self::$configureDockerRecipes;
}

if (null !== $dockerPreference = $composer->getPackage()->getExtra()['symfony']['docker'] ?? null) {
self::$configureDockerRecipes = filter_var($dockerPreference, \FILTER_VALIDATE_BOOLEAN);

return self::$configureDockerRecipes;
}

if ('install' !== $recipe->getJob()) {

return false;
}

if (!isset($_SERVER['SYMFONY_DOCKER'])) {
$answer = self::askDockerSupport($io, $recipe);
} elseif (filter_var($_SERVER['SYMFONY_DOCKER'], \FILTER_VALIDATE_BOOLEAN)) {
$answer = 'p';
} else {
$answer = 'x';
}

if ('n' === $answer) {
self::$configureDockerRecipes = false;

return self::$configureDockerRecipes;
}
if ('y' === $answer) {
self::$configureDockerRecipes = true;

return self::$configureDockerRecipes;
}


self::$configureDockerRecipes = 'p' === $answer;
$json = new JsonFile(Factory::getComposerFile());
$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
$manipulator->addSubNode('extra', 'symfony.docker', self::$configureDockerRecipes);
file_put_contents($json->getPath(), $manipulator->getContents());

return self::$configureDockerRecipes;
}




private function normalizeConfig(array $config): array
{
foreach ($config as $key => $val) {

if (isset($val[0])) {
return ['compose.yaml' => $config];
}

if (!str_starts_with($key, 'docker-')) {
continue;
}


$newKey = pathinfo(substr($key, 7), \PATHINFO_FILENAME).'.yaml';
$config[$newKey] = $val;
unset($config[$key]);
}

return $config;
}




private function findDockerComposeFile(string $rootDir, string $file): ?string
{
if (isset($_SERVER['COMPOSE_FILE'])) {
$filenameToFind = pathinfo($file, \PATHINFO_FILENAME);
$separator = $_SERVER['COMPOSE_PATH_SEPARATOR'] ?? ('\\' === \DIRECTORY_SEPARATOR ? ';' : ':');

$files = explode($separator, $_SERVER['COMPOSE_FILE']);
foreach ($files as $f) {
$filename = pathinfo($f, \PATHINFO_FILENAME);
if ($filename !== $filenameToFind && "docker-$filenameToFind" !== $filename) {
continue;
}

if (!$this->filesystem->isAbsolutePath($f)) {
$f = realpath(\sprintf('%s/%s', $rootDir, $f));
}

if ($this->filesystem->exists($f)) {
return $f;
}
}
}


$dir = $rootDir;
do {
if (
$this->filesystem->exists($dockerComposeFile = \sprintf('%s/%s', $dir, $file))

|| $this->filesystem->exists($dockerComposeFile = substr($dockerComposeFile, 0, -3).'ml')

|| $this->filesystem->exists($dockerComposeFile = \sprintf('%s/docker-%s', $dir, $file))
|| $this->filesystem->exists($dockerComposeFile = substr($dockerComposeFile, 0, -3).'ml')
) {
return $dockerComposeFile;
}

$previousDir = $dir;
$dir = \dirname($dir);
} while ($dir !== $previousDir);

return null;
}

private function parse($level, $indent, $services): string
{
$line = '';
foreach ($services as $key => $value) {
$line .= str_repeat(' ', $indent * $level);
if (!\is_array($value)) {
if (\is_string($key)) {
$line .= \sprintf('%s:', $key);
}
$line .= \sprintf("%s\n", $value);
continue;
}
$line .= \sprintf("%s:\n", $key).$this->parse($level + 1, $indent, $value);
}

return $line;
}

private function configureDockerCompose(Recipe $recipe, array $config, bool $update): void
{
$rootDir = $this->options->get('root-dir');
foreach ($this->normalizeConfig($config) as $file => $extra) {
$dockerComposeFile = $this->findDockerComposeFile($rootDir, $file);
if (null === $dockerComposeFile) {
$dockerComposeFile = $rootDir.'/'.$file;
file_put_contents($dockerComposeFile, '');
$this->write(\sprintf('  Created <fg=green>"%s"</>', $file));
}

if (!$update && $this->isFileMarked($recipe, $dockerComposeFile)) {
continue;
}

$this->write(\sprintf('Adding Docker Compose definitions to "%s"', $dockerComposeFile));

$offset = 2;
$node = null;
$endAt = [];
$startAt = [];
$lines = [];
$nodesLines = [];
foreach (file($dockerComposeFile) as $i => $line) {
$lines[] = $line;
$ltrimedLine = ltrim($line, ' ');
if (null !== $node) {
$nodesLines[$node][$i] = $line;
}


if (('' !== $ltrimedLine && str_starts_with($ltrimedLine, '#')) || '' === trim($line)) {
continue;
}


if (!preg_match('/^[\'"]?([a-zA-Z0-9]+)[\'"]?:\s*$/', $line, $matches)) {

$offestLine = \strlen($line) - \strlen($ltrimedLine);
if ($offset > $offestLine && 0 !== $offestLine) {
$offset = $offestLine;
}
continue;
}


$endAt[$node] = !$i || '' !== trim($lines[$i - 1]) ? $i : $i - 1;
$node = $matches[1];
if (!isset($nodesLines[$node])) {
$nodesLines[$node] = [];
}
if (!isset($startAt[$node])) {

$startAt[$node] = $i + 1;
}
}
$endAt[$node] = \count($lines) + 1;

foreach ($extra as $key => $value) {
if (isset($endAt[$key])) {
$data = $this->markData($recipe, $this->parse(1, $offset, $value));
$updatedContents = $this->updateDataString(implode('', $nodesLines[$key]), $data);
if (null === $updatedContents) {

array_splice($lines, $endAt[$key], 0, $data);

continue;
}

$originalEndAt = $endAt[$key];
$length = $endAt[$key] - $startAt[$key];
array_splice($lines, $startAt[$key], $length, ltrim($updatedContents, "\n"));


foreach ($startAt as $sectionKey => $at) {
if ($at > $originalEndAt) {
$startAt[$sectionKey] = $at - $length - 1;
}
}
foreach ($endAt as $sectionKey => $at) {
if ($at > $originalEndAt) {
$endAt[$sectionKey] = $at - $length;
}
}

continue;
}

$lines[] = \sprintf("\n%s:", $key);
$lines[] = $this->markData($recipe, $this->parse(1, $offset, $value));
}

file_put_contents($dockerComposeFile, implode('', $lines));
}
}

private function getContentsAfterApplyingRecipe(string $rootDir, Recipe $recipe, array $config): array
{
if (0 === \count($config)) {
return [];
}

$files = array_filter(array_map(function ($file) use ($rootDir) {
return $this->findDockerComposeFile($rootDir, $file);
}, array_keys($config)));

$originalContents = [];
foreach ($files as $file) {
$originalContents[$file] = file_exists($file) ? file_get_contents($file) : null;
}

$this->configureDockerCompose(
$recipe,
$config,
true
);

$updatedContents = [];
foreach ($files as $file) {
$localPath = $file;
if (str_starts_with($file, $rootDir)) {
$localPath = substr($file, \strlen($rootDir) + 1);
}
$localPath = ltrim($localPath, '/\\');
$updatedContents[$localPath] = file_exists($file) ? file_get_contents($file) : null;
}

foreach ($originalContents as $file => $contents) {
if (null === $contents) {
if (file_exists($file)) {
unlink($file);
}
} else {
file_put_contents($file, $contents);
}
}

return $updatedContents;
}

private static function askDockerSupport(IOInterface $io, Recipe $recipe): string
{
$warning = $io->isInteractive() ? 'WARNING' : 'IGNORING';
$io->writeError(\sprintf('  - <warning> %s </> %s', $warning, $recipe->getFormattedOrigin()));
$question = '    The recipe for this package contains some Docker configuration.

    This may create/update <comment>compose.yaml</comment> or update <comment>Dockerfile</comment> (if it exists).

    Do you want to include Docker configuration from recipes?
    [<comment>y</>] Yes
    [<comment>n</>] No
    [<comment>p</>] Yes permanently, never ask again for this project
    [<comment>x</>] No permanently, never ask again for this project
    (defaults to <comment>y</>): ';

return $io->askAndValidate(
$question,
function ($value) {
if (null === $value) {
return 'y';
}
$value = strtolower($value[0]);
if (!\in_array($value, ['y', 'n', 'p', 'x'], true)) {
throw new \InvalidArgumentException('Invalid choice.');
}

return $value;
},
null,
'y'
);
}
}
<?php










namespace Symfony\Flex;

use Composer\Json\JsonFile;




class Lock
{
private $json;
private $lock = [];
private $changed = false;

public function __construct($lockFile)
{
$this->json = new JsonFile($lockFile);
if ($this->json->exists()) {
$this->lock = $this->json->read();
}
}

public function has($name): bool
{
return \array_key_exists($name, $this->lock);
}

public function add($name, $data)
{
$current = $this->lock[$name] ?? [];
$this->lock[$name] = array_merge($current, $data);
$this->changed = true;
}

public function get($name)
{
return $this->lock[$name] ?? null;
}

public function set($name, $data)
{
if (!\array_key_exists($name, $this->lock) || $data !== $this->lock[$name]) {
$this->lock[$name] = $data;
$this->changed = true;
}
}

public function remove($name)
{
if (\array_key_exists($name, $this->lock)) {
unset($this->lock[$name]);
$this->changed = true;
}
}

public function write()
{
if (!$this->changed) {
return;
}

if ($this->lock) {
ksort($this->lock);
$this->json->write($this->lock);
} elseif ($this->json->exists()) {
@unlink($this->json->getPath());
}
}

public function delete()
{
@unlink($this->json->getPath());
}

public function all(): array
{
return $this->lock;
}
}
<?php










namespace Symfony\Flex;

use Composer\Composer;
use Composer\EventDispatcher\ScriptExecutionException;
use Composer\IO\IOInterface;
use Composer\Semver\Constraint\MatchAllConstraint;
use Composer\Util\ProcessExecutor;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Process\PhpExecutableFinder;




class ScriptExecutor
{
private $composer;
private $io;
private $options;
private $executor;

public function __construct(Composer $composer, IOInterface $io, Options $options, ?ProcessExecutor $executor = null)
{
$this->composer = $composer;
$this->io = $io;
$this->options = $options;
$this->executor = $executor ?: new ProcessExecutor();
}




public function execute(string $type, string $cmd, array $arguments = [])
{
$parsedCmd = $this->options->expandTargetDir($cmd);
if (null === $expandedCmd = $this->expandCmd($type, $parsedCmd, $arguments)) {
return;
}

$cmdOutput = new StreamOutput(fopen('php://temp', 'rw'), OutputInterface::VERBOSITY_VERBOSE, $this->io->isDecorated());
$outputHandler = function ($type, $buffer) use ($cmdOutput) {
$cmdOutput->write($buffer, false, OutputInterface::OUTPUT_RAW);
};

$this->io->writeError(\sprintf('Executing script %s', $parsedCmd), $this->io->isVerbose());
$exitCode = $this->executor->execute($expandedCmd, $outputHandler);

$code = 0 === $exitCode ? ' <info>[OK]</>' : ' <error>[KO]</>';

if ($this->io->isVerbose()) {
$this->io->writeError(\sprintf('Executed script %s %s', $cmd, $code));
} else {
$this->io->writeError($code);
}

if (0 !== $exitCode) {
$this->io->writeError(' <error>[KO]</>');
$this->io->writeError(\sprintf('<error>Script %s returned with error code %s</>', $cmd, $exitCode));
fseek($cmdOutput->getStream(), 0);
foreach (explode("\n", stream_get_contents($cmdOutput->getStream())) as $line) {
$this->io->writeError('!!  '.$line);
}

throw new ScriptExecutionException($cmd, $exitCode);
}
}

private function expandCmd(string $type, string $cmd, array $arguments)
{
switch ($type) {
case 'symfony-cmd':
return $this->expandSymfonyCmd($cmd, $arguments);
case 'php-script':
return $this->expandPhpScript($cmd, $arguments);
case 'script':
return $cmd;
default:
throw new \InvalidArgumentException(\sprintf('Invalid symfony/flex auto-script in composer.json: "%s" is not a valid type of command.', $type));
}
}

private function expandSymfonyCmd(string $cmd, array $arguments)
{
$repo = $this->composer->getRepositoryManager()->getLocalRepository();
if (!$repo->findPackage('symfony/console', new MatchAllConstraint())) {
$this->io->writeError(\sprintf('<warning>Skipping "%s" (needs symfony/console to run).</>', $cmd));

return null;
}

$console = ProcessExecutor::escape($this->options->get('root-dir').'/'.$this->options->get('bin-dir').'/console');
if ($this->io->isDecorated()) {
$console .= ' --ansi';
}

return $this->expandPhpScript($console.' '.$cmd, $arguments);
}

private function expandPhpScript(string $cmd, array $scriptArguments): string
{
$phpFinder = new PhpExecutableFinder();
if (!$php = $phpFinder->find(false)) {
throw new \RuntimeException('The PHP executable could not be found, add it to your PATH and try again.');
}

$arguments = $phpFinder->findArguments();

if ($env = (string) getenv('COMPOSER_ORIGINAL_INIS')) {
$paths = explode(\PATH_SEPARATOR, $env);
$ini = array_shift($paths);
} else {
$ini = php_ini_loaded_file();
}

if ($ini) {
$arguments[] = '--php-ini='.$ini;
}

if ($memoryLimit = (string) getenv('COMPOSER_MEMORY_LIMIT')) {
$arguments[] = "-d memory_limit={$memoryLimit}";
}

$phpArgs = implode(' ', array_map([ProcessExecutor::class, 'escape'], $arguments));
$scriptArgs = implode(' ', array_map([ProcessExecutor::class, 'escape'], $scriptArguments));

return ProcessExecutor::escape($php).($phpArgs ? ' '.$phpArgs : '').' '.$cmd.($scriptArgs ? ' '.$scriptArgs : '');
}
}
<?php










namespace Symfony\Flex\Update;

use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;

class RecipeUpdate
{
private $originalRecipe;
private $newRecipe;
private $lock;
private $rootDir;


private $originalRecipeFiles = [];

private $newRecipeFiles = [];
private $copyFromPackagePaths = [];

public function __construct(Recipe $originalRecipe, Recipe $newRecipe, Lock $lock, string $rootDir)
{
$this->originalRecipe = $originalRecipe;
$this->newRecipe = $newRecipe;
$this->lock = $lock;
$this->rootDir = $rootDir;
}

public function getOriginalRecipe(): Recipe
{
return $this->originalRecipe;
}

public function getNewRecipe(): Recipe
{
return $this->newRecipe;
}

public function getLock(): Lock
{
return $this->lock;
}

public function getRootDir(): string
{
return $this->rootDir;
}

public function getPackageName(): string
{
return $this->originalRecipe->getName();
}

public function setOriginalFile(string $filename, ?string $contents): void
{
$this->originalRecipeFiles[$filename] = $contents;
}

public function setNewFile(string $filename, ?string $contents): void
{
$this->newRecipeFiles[$filename] = $contents;
}

public function addOriginalFiles(array $files)
{
foreach ($files as $file => $contents) {
if (null === $contents) {
continue;
}

$this->setOriginalFile($file, $contents);
}
}

public function addNewFiles(array $files)
{
foreach ($files as $file => $contents) {
if (null === $contents) {
continue;
}

$this->setNewFile($file, $contents);
}
}

public function getOriginalFiles(): array
{
return $this->originalRecipeFiles;
}

public function getNewFiles(): array
{
return $this->newRecipeFiles;
}

public function getCopyFromPackagePaths(): array
{
return $this->copyFromPackagePaths;
}

public function addCopyFromPackagePath(string $source, string $target)
{
$this->copyFromPackagePaths[$source] = $target;
}
}
<?php










namespace Symfony\Flex\Update;

use Composer\IO\IOInterface;
use Composer\Util\ProcessExecutor;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Flex\Lock;

class RecipePatcher
{
private $rootDir;
private $filesystem;
private $io;
private $processExecutor;
private $symfonyLock;

public function __construct(string $rootDir, IOInterface $io, Lock $symfonyLock)
{
$this->rootDir = $rootDir;
$this->filesystem = new Filesystem();
$this->io = $io;
$this->symfonyLock = $symfonyLock;
$this->processExecutor = new ProcessExecutor($io);
}






public function applyPatch(RecipePatch $patch, ?string $packageName = null): bool
{
$withConflicts = $this->_applyPatchFile($patch);
$lockedFiles = $packageName ? array_count_values(array_merge(...array_column(array_filter($this->symfonyLock->all(), fn ($package) => $package !== $packageName, \ARRAY_FILTER_USE_KEY), 'files'))) : [];

$nonRemovableFiles = [];
foreach ($patch->getDeletedFiles() as $deletedFile) {
if (!file_exists($this->rootDir.'/'.$deletedFile)) {
continue;
}

if (isset($lockedFiles[$deletedFile])) {
$nonRemovableFiles[] = $deletedFile;

continue;
}

$this->execute(\sprintf('git rm %s', ProcessExecutor::escape($deletedFile)), $this->rootDir);
}

if ($nonRemovableFiles) {
$this->io->writeError('  <warning>The following files were removed in the recipe, but are still referenced by other recipes. You might need to adjust them manually:</warning>');
foreach ($nonRemovableFiles as $file) {
$this->io->writeError('      - '.$file);
}

$this->io->writeError('');
}

return $withConflicts;
}

public function generatePatch(array $originalFiles, array $newFiles): RecipePatch
{
$ignoredFiles = $this->getIgnoredFiles(array_keys($originalFiles) + array_keys($newFiles));


$originalFiles = array_filter($originalFiles, function ($file, $fileName) use ($ignoredFiles) {
return null !== $file && !\in_array($fileName, $ignoredFiles);
}, \ARRAY_FILTER_USE_BOTH);

$newFiles = array_filter($newFiles, function ($file, $fileName) use ($ignoredFiles) {
return null !== $file && !\in_array($fileName, $ignoredFiles);
}, \ARRAY_FILTER_USE_BOTH);

$deletedFiles = [];


foreach ($originalFiles as $file => $contents) {
if (!isset($newFiles[$file])) {
$deletedFiles[] = $file;
unset($originalFiles[$file]);
}
}




$modifiedFiles = array_intersect_key(array_keys($originalFiles), array_keys($newFiles));
$deletedModifiedFiles = [];
foreach ($modifiedFiles as $modifiedFile) {
if (!file_exists($this->rootDir.'/'.$modifiedFile) && $originalFiles[$modifiedFile] !== $newFiles[$modifiedFile]) {
$deletedModifiedFiles[] = $modifiedFile;
}
}


$prefix = trim($this->execute('git rev-parse --show-prefix', $this->rootDir));
$tmpPath = sys_get_temp_dir().'/_flex_recipe_update'.uniqid(mt_rand(), true);
$this->filesystem->mkdir($tmpPath);

try {
$this->execute('git init', $tmpPath);
$this->execute('git config commit.gpgsign false', $tmpPath);
$this->execute('git config user.name "Flex Updater"', $tmpPath);
$this->execute('git config user.email ""', $tmpPath);

$blobs = [];
if (\count($originalFiles) > 0) {
$this->writeFiles($originalFiles, $tmpPath);
$this->execute('git add -A', $tmpPath);
$this->execute('git commit -n -m "original files"', $tmpPath);

$blobs = $this->generateBlobs($originalFiles, $tmpPath);
}

$this->writeFiles($newFiles, $tmpPath);
$this->execute('git add -A', $tmpPath);

$patchString = $this->execute(\sprintf('git diff --cached --src-prefix "a/%s" --dst-prefix "b/%s"', $prefix, $prefix), $tmpPath);
$removedPatches = [];
$patchString = DiffHelper::removeFilesFromPatch($patchString, $deletedModifiedFiles, $removedPatches);

return new RecipePatch(
$patchString,
$blobs,
$deletedFiles,
$removedPatches
);
} finally {
try {
$this->filesystem->remove($tmpPath);
} catch (IOException $e) {


}
}
}

private function writeFiles(array $files, string $directory): void
{
foreach ($files as $filename => $contents) {
$path = $directory.'/'.$filename;
if (null === $contents) {
if (file_exists($path)) {
unlink($path);
}

continue;
}

if (!file_exists(\dirname($path))) {
$this->filesystem->mkdir(\dirname($path));
}
file_put_contents($path, $contents);
}
}

private function execute(string $command, string $cwd): string
{
$output = '';
$statusCode = $this->processExecutor->execute($command, $output, $cwd);

if (0 !== $statusCode) {
throw new \LogicException(\sprintf('Command "%s" failed: "%s". Output: "%s".', $command, $this->processExecutor->getErrorOutput(), $output));
}

return $output;
}









private function addMissingBlobs(array $blobs): array
{
$addedBlobs = [];
foreach ($blobs as $hash => $contents) {
$blobPath = $this->getBlobPath($this->rootDir, $hash);
if (file_exists($blobPath)) {
continue;
}

$addedBlobs[] = $blobPath;
if (!file_exists(\dirname($blobPath))) {
$this->filesystem->mkdir(\dirname($blobPath));
}
file_put_contents($blobPath, $contents);
}

return $addedBlobs;
}

private function generateBlobs(array $originalFiles, string $originalFilesRoot): array
{
$addedBlobs = [];
foreach ($originalFiles as $filename => $contents) {

if (!file_exists($originalFilesRoot.'/'.$filename)) {
continue;
}

$hash = trim($this->execute('git hash-object '.ProcessExecutor::escape($filename), $originalFilesRoot));
$addedBlobs[$hash] = file_get_contents($this->getBlobPath($originalFilesRoot, $hash));
}

return $addedBlobs;
}

private function getBlobPath(string $gitRoot, string $hash): string
{
$gitDir = trim($this->execute('git rev-parse --absolute-git-dir', $gitRoot));

$hashStart = substr($hash, 0, 2);
$hashEnd = substr($hash, 2);

return $gitDir.'/objects/'.$hashStart.'/'.$hashEnd;
}

private function _applyPatchFile(RecipePatch $patch)
{
if (!$patch->getPatch()) {

return true;
}

$addedBlobs = $this->addMissingBlobs($patch->getBlobs());

$patchPath = $this->rootDir.'/_flex_recipe_update.patch';
file_put_contents($patchPath, $patch->getPatch());

try {
$this->execute('git update-index --refresh', $this->rootDir);

$output = '';
$statusCode = $this->processExecutor->execute('git apply "_flex_recipe_update.patch" -3', $output, $this->rootDir);

if (0 === $statusCode) {

return true;
}

if (str_contains($this->processExecutor->getErrorOutput(), 'with conflicts')) {

return false;
}

throw new \LogicException('Error applying the patch: '.$this->processExecutor->getErrorOutput());
} finally {
unlink($patchPath);

foreach ($addedBlobs as $filename) {
unlink($filename);
}
}
}

private function getIgnoredFiles(array $fileNames): array
{
$args = implode(' ', array_map([ProcessExecutor::class, 'escape'], $fileNames));
$output = '';
$this->processExecutor->execute(\sprintf('git check-ignore %s', $args), $output, $this->rootDir);

return $this->processExecutor->splitLines($output);
}
}
<?php










namespace Symfony\Flex\Update;

class RecipePatch
{
private $patch;
private $blobs;
private $deletedFiles;
private $removedPatches;

public function __construct(string $patch, array $blobs, array $deletedFiles, array $removedPatches = [])
{
$this->patch = $patch;
$this->blobs = $blobs;
$this->deletedFiles = $deletedFiles;
$this->removedPatches = $removedPatches;
}

public function getPatch(): string
{
return $this->patch;
}

public function getBlobs(): array
{
return $this->blobs;
}

public function getDeletedFiles(): array
{
return $this->deletedFiles;
}





public function getRemovedPatches(): array
{
return $this->removedPatches;
}
}
<?php










namespace Symfony\Flex\Update;

class DiffHelper
{
public static function removeFilesFromPatch(string $patch, array $files, array &$removedPatches): string
{
foreach ($files as $filename) {
$start = strpos($patch, \sprintf('diff --git a/%s b/%s', $filename, $filename));
if (false === $start) {
throw new \LogicException(\sprintf('Could not find file "%s" in the patch.', $filename));
}

$end = strpos($patch, 'diff --git a/', $start + 1);
$contentBefore = substr($patch, 0, $start);
if (false === $end) {

$removedPatches[$filename] = rtrim(substr($patch, $start), "\n");
$patch = rtrim($contentBefore, "\n");

continue;
}

$removedPatches[$filename] = rtrim(substr($patch, $start, $end - $start), "\n");
$patch = $contentBefore.substr($patch, $end);
}


if ($patch && "\n" !== substr($patch, \strlen($patch) - 1, 1)) {
$patch .= "\n";
}

return $patch;
}
}
<?php










namespace Symfony\Flex;

use Composer\IO\IOInterface;
use Composer\Util\ProcessExecutor;




class Options
{
private $options;
private $writtenFiles = [];
private $io;
private $lockData;

public function __construct(array $options = [], ?IOInterface $io = null, ?Lock $lock = null)
{
$this->options = $options;
$this->io = $io;
$this->lockData = $lock?->all() ?? [];
}

public function get(string $name)
{
return $this->options[$name] ?? null;
}

public function expandTargetDir(string $target): string
{
$result = preg_replace_callback('{%(.+?)%}', function ($matches) {
$option = str_replace('_', '-', strtolower($matches[1]));
if (!isset($this->options[$option])) {
return $matches[0];
}

return rtrim($this->options[$option], '/');
}, $target);

$phpunitDistFiles = [
'phpunit.xml.dist' => true,
'phpunit.dist.xml' => true,
];

$rootDir = $this->get('root-dir');

if (null === $rootDir || !isset($phpunitDistFiles[$result]) || !is_dir($rootDir) || file_exists($rootDir.'/'.$result)) {
return $result;
}

unset($phpunitDistFiles[$result]);
$otherPhpunitDistFile = key($phpunitDistFiles);

return file_exists($rootDir.'/'.$otherPhpunitDistFile) ? $otherPhpunitDistFile : $result;
}

public function shouldWriteFile(string $file, bool $overwrite, bool $skipQuestion): bool
{
if (isset($this->writtenFiles[$file])) {
return false;
}
$this->writtenFiles[$file] = true;

if (!file_exists($file)) {
return true;
}

if (!$overwrite) {
return false;
}

if (!filesize($file)) {
return true;
}

if ($skipQuestion) {
return true;
}

exec('git status --short --ignored --untracked-files=all -- '.ProcessExecutor::escape($file).' 2>&1', $output, $status);

if (0 !== $status) {
return $this->io && $this->io->askConfirmation(\sprintf('Cannot determine the state of the "%s" file, overwrite anyway? [y/N] ', $file), false);
}

if (empty($output[0]) || preg_match('/^[ AMDRCU][ D][ \t]/', $output[0])) {
return true;
}

$name = basename($file);
$name = \strlen($output[0]) - \strlen($name) === strrpos($output[0], $name) ? substr($output[0], 3) : $name;

return $this->io && $this->io->askConfirmation(\sprintf('File "%s" has uncommitted changes, overwrite? [y/N] ', $name), false);
}

public function getRemovableFiles(Recipe $recipe, Lock $lock): array
{
if (null === $removableFiles = $this->lockData[$recipe->getName()]['files'] ?? null) {
$removableFiles = [];
foreach (array_keys($recipe->getFiles()) as $source => $target) {
if (str_ends_with($source, '/')) {
$removableFiles[] = $this->expandTargetDir($target);
}
}
}

unset($this->lockData[$recipe->getName()]);
$lockedFiles = array_count_values(array_merge(...array_column($lock->all(), 'files')));

$nonRemovableFiles = [];
foreach ($removableFiles as $i => $file) {
if (isset($lockedFiles[$file])) {
$nonRemovableFiles[] = $file;
unset($removableFiles[$i]);
}
}

if ($nonRemovableFiles && $this->io) {
$this->io?->writeError('    <warning>The following files are still referenced by other recipes, you might need to adjust them manually:</warning>');
foreach ($nonRemovableFiles as $file) {
$this->io?->writeError('      - '.$file);
}
}

return array_values($removableFiles);
}

public function toArray(): array
{
return $this->options;
}
}
<?php










namespace Symfony\Flex;

use Composer\Command\BaseConfigCommand;
use Composer\Command\GlobalCommand;
use Composer\Composer;
use Composer\Console\Application;
use Composer\DependencyResolver\Operation\InstallOperation;
use Composer\DependencyResolver\Operation\OperationInterface;
use Composer\DependencyResolver\Operation\UninstallOperation;
use Composer\DependencyResolver\Operation\UpdateOperation;
use Composer\DependencyResolver\Transaction;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\Factory;
use Composer\Installer;
use Composer\Installer\InstallerEvent;
use Composer\Installer\InstallerEvents;
use Composer\Installer\PackageEvent;
use Composer\Installer\PackageEvents;
use Composer\Installer\SuggestedPackagesReporter;
use Composer\IO\IOInterface;
use Composer\IO\NullIO;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Composer\Package\Locker;
use Composer\Package\Package;
use Composer\Plugin\PluginEvents;
use Composer\Plugin\PluginInterface;
use Composer\Plugin\PrePoolCreateEvent;
use Composer\Script\Event;
use Composer\Script\ScriptEvents;
use Composer\Semver\VersionParser;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Flex\Event\UpdateEvent;
use Symfony\Flex\Unpack\Operation;
use Symfony\Thanks\Thanks;





class Flex implements PluginInterface, EventSubscriberInterface
{
public static $storedOperations = [];




private $composer;




private $io;

private $config;
private $options;
private $configurator;
private $downloader;




private $installer;
private $postInstallOutput = [''];
private $operations = [];
private $lock;
private $displayThanksReminder = 0;
private $ignorePreleases = false;
private $reinstall;
private static $activated = true;
private static $aliasResolveCommands = [
'require' => true,
'update' => false,
'remove' => false,
];
private $filter;




public function activate(Composer $composer, IOInterface $io)
{
if (!\extension_loaded('openssl')) {
self::$activated = false;
$io->writeError('<warning>Symfony Flex has been disabled. You must enable the openssl extension in your "php.ini" file.</>');

return;
}



foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(__DIR__, \FilesystemIterator::SKIP_DOTS)) as $file) {
if ('.php' === substr($file, -4)) {
class_exists(__NAMESPACE__.str_replace('/', '\\', substr($file, \strlen(__DIR__), -4)));
}
}

$composer->getInstallationManager()->addInstaller(new SymfonyPackInstaller($io));

$this->composer = $composer;
$this->io = $io;
$this->config = $composer->getConfig();

$composerFile = Factory::getComposerFile();
$composerLock = 'json' === pathinfo($composerFile, \PATHINFO_EXTENSION) ? substr($composerFile, 0, -4).'lock' : $composerFile.'.lock';
$symfonyLock = str_replace('composer', 'symfony', basename($composerLock));

$this->lock = new Lock(getenv('SYMFONY_LOCKFILE') ?: \dirname($composerLock).'/'.(basename($composerLock) !== $symfonyLock ? $symfonyLock : 'symfony.lock'));
$this->options = $this->initOptions();



if (property_exists(Flex::class, 'storedOperations') && Flex::$storedOperations) {
$this->operations = Flex::$storedOperations;
Flex::$storedOperations = [];
}

$rfs = $composer->getLoop()->getHttpDownloader();
$this->downloader = $downloader = new Downloader($composer, $io, $rfs);
$this->configurator = new Configurator($composer, $io, $this->options);

$disable = true;
foreach (array_merge($composer->getPackage()->getRequires() ?? [], $composer->getPackage()->getDevRequires() ?? []) as $link) {

if ('symfony/flex' === $link->getTarget()) {
$disable = false;
break;
}
}
if ($disable) {
$downloader->disable();
}

$backtrace = $this->configureInstaller();

foreach ($backtrace as $trace) {
if (!isset($trace['object']) || !isset($trace['args'][0])) {
continue;
}

if (!$trace['object'] instanceof Application || !$trace['args'][0] instanceof ArgvInput) {
continue;
}



$input = $trace['args'][0];
$app = $trace['object'];

$resolver = new PackageResolver($this->downloader);

try {
$command = $input->getFirstArgument();
$command = $command ? $app->find($command)->getName() : null;
} catch (\InvalidArgumentException $e) {
}

if ('create-project' === $command) {
if ($input->hasOption('remove-vcs')) {
$input->setOption('remove-vcs', true);
}
} elseif ('update' === $command) {
$this->displayThanksReminder = 1;
} elseif ('outdated' === $command) {
$symfonyRequire = null;
}

if (isset(self::$aliasResolveCommands[$command])) {
if ($input->hasArgument('packages')) {
$input->setArgument('packages', $resolver->resolve($input->getArgument('packages'), self::$aliasResolveCommands[$command]));
}
}

if (class_exists(BaseConfigCommand::class)) {

$_SERVER['COMPOSER_PREFER_DEV_OVER_PRERELEASE'] = '1';
} else {
$this->ignorePreleases = $input->hasParameterOption('--prefer-lowest', true) && $input->hasParameterOption('--prefer-stable', true);
}

$addCommand = 'add'.(method_exists($app, 'addCommand') ? 'Command' : '');
$app->$addCommand(new Command\RecipesCommand($this, $this->lock, $rfs));
$app->$addCommand(new Command\InstallRecipesCommand($this, $this->options->get('root-dir'), $this->options->get('runtime')['dotenv_path'] ?? '.env'));
$app->$addCommand(new Command\UpdateRecipesCommand($this, $this->downloader, $rfs, $this->configurator, $this->options->get('root-dir')));
$app->$addCommand(new Command\DumpEnvCommand($this->config, $this->options));

break;
}

$symfonyRequire = preg_replace('/\.x$/', '.x-dev', getenv('SYMFONY_REQUIRE') ?: ($composer->getPackage()->getExtra()['symfony']['require'] ?? ''));

if ($symfonyRequire || $this->ignorePreleases) {
$this->filter = new PackageFilter($io, $symfonyRequire, $this->downloader, $this->ignorePreleases);
}
}




public function deactivate(Composer $composer, IOInterface $io)
{


Flex::$storedOperations = $this->operations;
self::$activated = false;
}

public function configureInstaller()
{
$backtrace = debug_backtrace();
foreach ($backtrace as $trace) {
if (isset($trace['object']) && $trace['object'] instanceof Installer) {
$this->installer = $trace['object']->setSuggestedPackagesReporter(new SuggestedPackagesReporter(new NullIO()));
}

if (isset($trace['object']) && $trace['object'] instanceof GlobalCommand) {
$this->downloader->disable();
}
}

return $backtrace;
}

public function configureProject(Event $event)
{
if (!$this->downloader->isEnabled()) {
$this->io->writeError('<warning>Project configuration is disabled: "symfony/flex" not found in the root composer.json</>');

return;
}


@unlink('LICENSE');


$file = Factory::getComposerFile();
$contents = file_get_contents($file);
$manipulator = new JsonManipulator($contents);


$manipulator->addMainKey('license', 'proprietary');


$manipulator->removeSubNode('extra', 'branch-alias');



$contents = preg_replace(['{^\s*+"name":.*,$\n}m', '{^\s*+"description":.*,$\n}m'], '', $manipulator->getContents(), 1);
file_put_contents($file, $contents);

$this->updateComposerLock();
}

public function recordFlexInstall(PackageEvent $event)
{
if (null === $this->reinstall && 'symfony/flex' === $event->getOperation()->getPackage()->getName()) {
$this->reinstall = true;
}
}

public function record(PackageEvent $event)
{
if ($this->shouldRecordOperation($event->getOperation(), $event->isDevMode(), $event->getComposer())) {
$this->operations[] = $event->getOperation();
}
}

public function recordOperations(InstallerEvent $event)
{
if (!$event->isExecutingOperations()) {
return;
}

$versionParser = new VersionParser();
$packages = [];
foreach ($this->lock->all() as $name => $info) {
if ('9999999.9999999' === $info['version']) {

$info['version'] = '99999.9999999';
}
$packages[] = new Package($name, $versionParser->normalize($info['version']), $info['version']);
}

$transation = \Closure::bind(function () use ($packages, $event) {
return new Transaction($packages, $event->getTransaction()->resultPackageMap);
}, null, Transaction::class)();

foreach ($transation->getOperations() as $operation) {
if (!$operation instanceof UninstallOperation && $this->shouldRecordOperation($operation, $event->isDevMode(), $event->getComposer())) {
$this->operations[] = $operation;
}
}
}

public function update(Event $event, $operations = [])
{
if ($operations) {
$this->operations = $operations;
}

$this->install($event);

$file = Factory::getComposerFile();
$contents = file_get_contents($file);
$json = JsonFile::parseJson($contents);

if (!$this->reinstall && !isset($json['flex-require']) && !isset($json['flex-require-dev'])) {
$this->unpack($event);

return;
}


$manipulator = new JsonManipulator($contents);
$sortPackages = $this->composer->getConfig()->get('sort-packages');
$symfonyVersion = $json['extra']['symfony']['require'] ?? null;
$versions = $symfonyVersion ? $this->downloader->getVersions() : null;
foreach (['require', 'require-dev'] as $type) {
if (!isset($json['flex-'.$type])) {
continue;
}
foreach ($json['flex-'.$type] as $package => $constraint) {
if ($symfonyVersion && '*' === $constraint && isset($versions['splits'][$package])) {

$constraint = $symfonyVersion;
}
$manipulator->addLink($type, $package, $constraint, $sortPackages);
}

$manipulator->removeMainKey('flex-'.$type);
}

file_put_contents($file, $manipulator->getContents());

$this->reinstall($event);
}

public function install(Event $event)
{
$rootDir = $this->options->get('root-dir');
$runtime = $this->options->get('runtime');
$dotenvPath = $rootDir.'/'.($runtime['dotenv_path'] ?? '.env');

if (!file_exists($dotenvPath) && !file_exists($dotenvPath.'.local') && file_exists($dotenvPath.'.dist') && !str_contains(file_get_contents($dotenvPath.'.dist'), '.env.local')) {
copy($dotenvPath.'.dist', $dotenvPath);
}


$recipes = ScriptEvents::POST_UPDATE_CMD === $event->getName() ? $this->fetchRecipes($this->operations, $event instanceof UpdateEvent && $event->reset()) : [];
$this->operations = []; 

if (2 === $this->displayThanksReminder) {
$love = '\\' === \DIRECTORY_SEPARATOR ? 'love' : '💖 ';
$star = '\\' === \DIRECTORY_SEPARATOR ? 'star' : '★ ';

$this->io->writeError('');
$this->io->writeError('What about running <comment>composer global require symfony/thanks && composer thanks</> now?');
$this->io->writeError(\sprintf('This will spread some %s by sending a %s to the GitHub repositories of your fellow package maintainers.', $love, $star));
}

$this->io->writeError('');

if (!$recipes) {
if (ScriptEvents::POST_UPDATE_CMD === $event->getName()) {
$this->finish($rootDir);
}

if ($this->downloader->isEnabled()) {
$this->io->writeError('Run <comment>composer recipes</> at any time to see the status of your Symfony recipes.');
$this->io->writeError('');
}

return;
}

$this->io->writeError(\sprintf('<info>Symfony operations: %d recipe%s (%s)</>', \count($recipes), \count($recipes) > 1 ? 's' : '', $this->downloader->getSessionId()));
$installContribs = $this->composer->getPackage()->getExtra()['symfony']['allow-contrib'] ?? false;
$manifest = null;
$originalComposerJsonHash = $this->getComposerJsonHash();
$postInstallRecipes = [];
foreach ($recipes as $recipe) {
if ('install' === $recipe->getJob() && !$installContribs && $recipe->isContrib()) {
$warning = $this->io->isInteractive() ? 'WARNING' : 'IGNORING';
$this->io->writeError(\sprintf('  - <warning> %s </> %s', $warning, $this->formatOrigin($recipe)));
$question = \sprintf('    The recipe for this package comes from the "contrib" repository, which is open to community contributions.
    Review the recipe at %s

    Do you want to execute this recipe?
    [<comment>y</>] Yes
    [<comment>n</>] No
    [<comment>a</>] Yes for all packages, only for the current installation session
    [<comment>p</>] Yes permanently, never ask again for this project
    (defaults to <comment>n</>): ', $recipe->getURL());
$answer = $this->io->askAndValidate(
$question,
function ($value) {
if (null === $value) {
return 'n';
}
$value = strtolower($value[0]);
if (!\in_array($value, ['y', 'n', 'a', 'p'])) {
throw new \InvalidArgumentException('Invalid choice.');
}

return $value;
},
null,
'n'
);
if ('n' === $answer) {
continue;
}
if ('a' === $answer) {
$installContribs = true;
}
if ('p' === $answer) {
$installContribs = true;
$json = new JsonFile(Factory::getComposerFile());
$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
$manipulator->addSubNode('extra', 'symfony.allow-contrib', true);
file_put_contents($json->getPath(), $manipulator->getContents());
}
}

switch ($recipe->getJob()) {
case 'install':
$postInstallRecipes[] = $recipe;
$this->io->writeError(\sprintf('  - Configuring %s', $this->formatOrigin($recipe)));
$this->configurator->install($recipe, $this->lock, [
'force' => $event instanceof UpdateEvent && $event->force(),
'assumeYesForPrompts' => $event instanceof UpdateEvent && $event->assumeYesForPrompts(),
]);
$manifest = $recipe->getManifest();
if (isset($manifest['post-install-output'])) {
$this->postInstallOutput[] = \sprintf('<bg=yellow;fg=white> %s </> instructions:', $recipe->getName());
$this->postInstallOutput[] = '';
foreach ($manifest['post-install-output'] as $line) {
$this->postInstallOutput[] = $this->options->expandTargetDir($line);
}
$this->postInstallOutput[] = '';
}
break;
case 'update':
break;
case 'uninstall':
$this->io->writeError(\sprintf('  - Unconfiguring %s', $this->formatOrigin($recipe)));
$this->configurator->unconfigure($recipe, $this->lock);
break;
}
}

if (method_exists($this->configurator, 'postInstall')) {
foreach ($postInstallRecipes as $recipe) {
$this->configurator->postInstall($recipe, $this->lock, [
'force' => $event instanceof UpdateEvent && $event->force(),
'assumeYesForPrompts' => $event instanceof UpdateEvent && $event->assumeYesForPrompts(),
]);
}
}

if (null !== $manifest) {
array_unshift(
$this->postInstallOutput,
'<bg=blue;fg=white>              </>',
'<bg=blue;fg=white> What\'s next? </>',
'<bg=blue;fg=white>              </>',
'',
'<info>Some files have been created and/or updated to configure your new packages.</>',
'Please <comment>review</>, <comment>edit</> and <comment>commit</> them: these files are <comment>yours</>.'
);
}

$this->finish($rootDir, $originalComposerJsonHash);
}

public function finish(string $rootDir, ?string $originalComposerJsonHash = null): void
{
$this->synchronizePackageJson($rootDir);
$this->lock->write();

if ($originalComposerJsonHash && $this->getComposerJsonHash() !== $originalComposerJsonHash) {
$this->updateComposerLock();
}
}

private function synchronizePackageJson(string $rootDir)
{
if (!($this->composer->getPackage()->getExtra()['symfony/flex']['synchronize_package_json'] ?? true)) {
$this->io->writeError('<info>Skip synchronizing package.json with PHP packages</>');

return;
}

if (!$this->downloader->isEnabled()) {
$this->io->writeError('<warning>Synchronizing package.json is disabled: "symfony/flex" not found in the root composer.json</>');

return;
}

$rootDir = realpath($rootDir);
$vendorDir = trim((new Filesystem())->makePathRelative($this->config->get('vendor-dir'), $rootDir), '/');

$executor = new ScriptExecutor($this->composer, $this->io, $this->options);
$synchronizer = new PackageJsonSynchronizer($rootDir, $vendorDir, $executor, $this->io);

if ($synchronizer->shouldSynchronize()) {
$lockData = $this->composer->getLocker()->getLockData();

if ($synchronizer->synchronize(array_merge($lockData['packages'] ?? [], $lockData['packages-dev'] ?? []))) {
$this->io->writeError('<info>Synchronizing package.json with PHP packages</>');
$this->io->writeError('<warning>Don\'t forget to run npm install --force or yarn install --force to refresh your JavaScript dependencies!</>');
$this->io->writeError('');
}
}
}




public function uninstall(Composer $composer, IOInterface $io)
{
$this->lock->delete();
}

public function enableThanksReminder()
{
if (1 === $this->displayThanksReminder) {
$this->displayThanksReminder = !class_exists(Thanks::class, false) ? 2 : 0;
}
}

public function executeAutoScripts(Event $event)
{
$event->stopPropagation();


$json = new JsonFile(Factory::getComposerFile());
$jsonContents = $json->read();

$executor = new ScriptExecutor($this->composer, $this->io, $this->options);
foreach ($jsonContents['scripts']['auto-scripts'] as $cmd => $type) {
$executor->execute($type, $cmd);
}

$this->io->write($this->postInstallOutput);
$this->postInstallOutput = [];
}




public function fetchRecipes(array $operations, bool $reset): array
{
if (!$this->downloader->isEnabled()) {
$this->io->writeError('<warning>Symfony recipes are disabled: "symfony/flex" not found in the root composer.json</>');

return [];
}
$devPackages = null;
$data = $this->downloader->getRecipes($operations);
$manifests = $data['manifests'] ?? [];
$locks = $data['locks'] ?? [];

$flexRecipe = [];

$recipes = [
'symfony/framework-bundle' => null,
];
$packRecipes = [];
$metaRecipes = [];

foreach ($operations as $operation) {
if ($operation instanceof UpdateOperation) {
$package = $operation->getTargetPackage();
} else {
$package = $operation->getPackage();
}


$name = $package->getName();
$job = method_exists($operation, 'getOperationType') ? $operation->getOperationType() : $operation->getJobType();

if (!isset($manifests[$name]) && isset($data['conflicts'][$name])) {
$this->io->writeError(\sprintf('  - Skipping recipe for %s: all versions of the recipe conflict with your package versions.', $name));
continue;
}

while ($this->doesRecipeConflict($manifests[$name] ?? [], $operation)) {
$this->downloader->removeRecipeFromIndex($name, $manifests[$name]['version']);
$newData = $this->downloader->getRecipes([$operation]);
$newManifests = $newData['manifests'] ?? [];

if (!isset($newManifests[$name])) {

$this->io->writeError(\sprintf('  - Skipping recipe for %s: all versions of the recipe conflict with your package versions.', $name));

continue 2;
}


$manifests[$name] = $newManifests[$name];
$locks[$name] = $newData['locks'][$name];
}

if ($operation instanceof InstallOperation && isset($locks[$name])) {
$ref = $this->lock->get($name)['recipe']['ref'] ?? null;
if (!$reset && $ref && ($locks[$name]['recipe']['ref'] ?? null) === $ref) {
continue;
}
$this->lock->set($name, $locks[$name]);
} elseif ($operation instanceof UninstallOperation) {
if (!$this->lock->has($name)) {
continue;
}
$this->lock->remove($name);
}

if (isset($manifests[$name])) {
$recipe = new Recipe($package, $name, $job, $manifests[$name], $locks[$name] ?? []);

if ('symfony-pack' === $package->getType()) {
$packRecipes[$name] = $recipe;
} elseif ('metapackage' === $package->getType()) {
$metaRecipes[$name] = $recipe;
} elseif ('symfony/flex' === $name) {
$flexRecipe = [$name => $recipe];
} else {
$recipes[$name] = $recipe;
}
} else {
$bundles = [];

if (null === $devPackages) {
$devPackages = array_column($this->composer->getLocker()->getLockData()['packages-dev'], 'name');
}
$envs = \in_array($name, $devPackages) ? ['dev', 'test'] : ['all'];
$bundle = new SymfonyBundle($this->composer, $package, $job);
foreach ($bundle->getClassNames() as $bundleClass) {
$bundles[$bundleClass] = $envs;
}

if ($bundles) {
$manifest = [
'origin' => \sprintf('%s:%s@auto-generated recipe', $name, $package->getPrettyVersion()),
'manifest' => ['bundles' => $bundles],
];
$recipes[$name] = new Recipe($package, $name, $job, $manifest);

if ($operation instanceof InstallOperation) {
$this->lock->set($name, ['version' => $package->getPrettyVersion()]);
}
}
}
}

return array_merge($flexRecipe, $packRecipes, $metaRecipes, array_filter($recipes));
}

public function truncatePackages(PrePoolCreateEvent $event)
{
if (!$this->filter) {
return;
}

$rootPackage = $this->composer->getPackage();
$lockedPackages = $event->getRequest()->getFixedOrLockedPackages();

$event->setPackages($this->filter->removeLegacyPackages($event->getPackages(), $rootPackage, $lockedPackages));
}

public function getComposerJsonHash(): string
{
return md5_file(Factory::getComposerFile());
}

public function getLock(): Lock
{
if (null === $this->lock) {
throw new \Exception('Cannot access lock before calling activate().');
}

return $this->lock;
}

private function initOptions(): Options
{
$extra = $this->composer->getPackage()->getExtra();

$options = array_merge([
'bin-dir' => 'bin',
'conf-dir' => 'conf',
'config-dir' => 'config',
'src-dir' => 'src',
'var-dir' => 'var',
'public-dir' => 'public',
'root-dir' => $extra['symfony']['root-dir'] ?? '.',
'runtime' => $extra['runtime'] ?? [],
], $extra);

return new Options($options, $this->io, $this->lock);
}

private function formatOrigin(Recipe $recipe): string
{
if (method_exists($recipe, 'getFormattedOrigin')) {
return $recipe->getFormattedOrigin();
}


$origin = $recipe->getOrigin();


if (!preg_match('/^([^:]++):([^@]++)@(.+)$/', $origin, $matches)) {
return $origin;
}

return \sprintf('<info>%s</> (<comment>>=%s</>): From %s', $matches[1], $matches[2], 'auto-generated recipe' === $matches[3] ? '<comment>'.$matches[3].'</>' : $matches[3]);
}

private function shouldRecordOperation(OperationInterface $operation, bool $isDevMode, ?Composer $composer = null): bool
{
if ($this->reinstall) {
return false;
}

if ($operation instanceof UpdateOperation) {
$package = $operation->getTargetPackage();
} else {
$package = $operation->getPackage();
}


if (!$isDevMode && $operation instanceof UninstallOperation) {
foreach (($composer ?? $this->composer)->getLocker()->getLockData()['packages-dev'] as $p) {
if ($package->getName() === $p['name']) {
return false;
}
}
}


$name = $package->getName();
if ($operation instanceof InstallOperation) {
if (!$this->lock->has($name)) {
return true;
}
} elseif ($operation instanceof UninstallOperation) {
return true;
}

return false;
}

private function updateComposerLock()
{
$lock = substr(Factory::getComposerFile(), 0, -4).'lock';
$composerJson = file_get_contents(Factory::getComposerFile());
$lockFile = new JsonFile($lock, null, $this->io);
$locker = new Locker($this->io, $lockFile, $this->composer->getInstallationManager(), $composerJson);
$lockData = $locker->getLockData();
$lockData['content-hash'] = Locker::getContentHash($composerJson);
$lockFile->write($lockData);
}

private function unpack(Event $event)
{
$jsonPath = Factory::getComposerFile();
$json = JsonFile::parseJson(file_get_contents($jsonPath));
$sortPackages = $this->composer->getConfig()->get('sort-packages');
$unpackOp = new Operation(true, $sortPackages);

foreach (['require', 'require-dev'] as $type) {
foreach ($json[$type] ?? [] as $package => $constraint) {
$unpackOp->addPackage($package, $constraint, 'require-dev' === $type);
}
}

$unpacker = new Unpacker($this->composer, new PackageResolver($this->downloader), false); 
$result = $unpacker->unpack($unpackOp);

if (!$result->getUnpacked()) {
return;
}

foreach ($result->getUnpacked() as $pkg) {
$this->io->writeError(\sprintf('  - Unpacked <info>%s</>', $pkg->getName()));
}

$unpacker->updateLock($result, $this->io);
}

private function reinstall(Event $event)
{
$this->reinstall = false;
$event->stopPropagation();

$ed = $this->composer->getEventDispatcher();
$disableScripts = !method_exists($ed, 'setRunScripts') || !((array) $ed)["\0*\0runScripts"];
$composer = Factory::create($this->io, null, false, $disableScripts);
$composer->getInstallationManager()->addInstaller(new SymfonyPackInstaller($this->io));

$installer = clone $this->installer;
$installer->__construct(
$this->io,
$composer->getConfig(),
$composer->getPackage(),
$composer->getDownloadManager(),
$composer->getRepositoryManager(),
$composer->getLocker(),
$composer->getInstallationManager(),
$composer->getEventDispatcher(),
$composer->getAutoloadGenerator()
);
if (method_exists($installer, 'setPlatformRequirementFilter')) {
$installer->setPlatformRequirementFilter(((array) $this->installer)["\0*\0platformRequirementFilter"]);
}

$installer->run();

$this->io->write($this->postInstallOutput);
$this->postInstallOutput = [];
}

public static function getSubscribedEvents(): array
{
if (!self::$activated) {
return [];
}

$events = [
PackageEvents::POST_PACKAGE_UPDATE => 'enableThanksReminder',
PackageEvents::POST_PACKAGE_INSTALL => 'recordFlexInstall',
PackageEvents::POST_PACKAGE_UNINSTALL => 'record',
InstallerEvents::PRE_OPERATIONS_EXEC => 'recordOperations',
PluginEvents::PRE_POOL_CREATE => 'truncatePackages',
ScriptEvents::POST_CREATE_PROJECT_CMD => 'configureProject',
ScriptEvents::POST_INSTALL_CMD => 'install',
ScriptEvents::PRE_UPDATE_CMD => 'configureInstaller',
ScriptEvents::POST_UPDATE_CMD => 'update',
'auto-scripts' => 'executeAutoScripts',
];

return $events;
}

private function doesRecipeConflict(array $recipeData, OperationInterface $operation): bool
{
if (empty($recipeData['manifest']['conflict']) || $operation instanceof UninstallOperation) {
return false;
}

$lockedRepository = $this->composer->getLocker()->getLockedRepository(true);

foreach ($recipeData['manifest']['conflict'] as $conflictingPackage => $constraint) {
if ($lockedRepository->findPackage($conflictingPackage, $constraint)) {
return true;
}
}

return false;
}
}
<?php










namespace Symfony\Flex;

use Composer\Installer\MetapackageInstaller;

class SymfonyPackInstaller extends MetapackageInstaller
{
public function supports($packageType): bool
{
return 'symfony-pack' === $packageType;
}
}
<?php










namespace Symfony\Flex;

use Composer\Util\HttpDownloader;
use Composer\Util\RemoteFilesystem;

class GithubApi
{

private $downloader;

public function __construct($downloader)
{
$this->downloader = $downloader;
}










public function findRecipeCommitDataFromTreeRef(string $package, string $repo, string $branch, string $version, string $lockRef): ?array
{
$repositoryName = $this->getRepositoryName($repo);
if (!$repositoryName) {
return null;
}

$recipePath = \sprintf('%s/%s', $package, $version);
$commitsData = $this->requestGitHubApi(\sprintf(
'https://api.github.com/repos/%s/commits?path=%s&sha=%s',
$repositoryName,
$recipePath,
$branch
));

$commitShas = [];
foreach ($commitsData as $commitData) {
$commitShas[$commitData['sha']] = $commitData['commit']['committer']['date'];

$treeUrl = $commitData['commit']['tree']['url'].'?recursive=true';


$treeData = $this->requestGitHubApi($treeUrl);
foreach ($treeData['tree'] as $treeItem) {
if ($treeItem['path'] !== $recipePath) {
continue;
}

if ($treeItem['sha'] === $lockRef) {

array_pop($commitShas);

return [

'commit' => substr($commitData['sha'], 0, 7),
'date' => $commitData['commit']['committer']['date'],
'new_commits' => $commitShas,
];
}
}
}

return null;
}

public function getVersionsOfRecipe(string $repo, string $branch, string $recipePath): ?array
{
$repositoryName = $this->getRepositoryName($repo);
if (!$repositoryName) {
return null;
}

$url = \sprintf(
'https://api.github.com/repos/%s/contents/%s?ref=%s',
$repositoryName,
$recipePath,
$branch
);
$contents = $this->requestGitHubApi($url);
$versions = [];
foreach ($contents as $fileData) {
if ('dir' !== $fileData['type']) {
continue;
}

$versions[] = $fileData['name'];
}

return $versions;
}

public function getCommitDataForPath(string $repo, string $path, string $branch): array
{
$repositoryName = $this->getRepositoryName($repo);
if (!$repositoryName) {
return [];
}

$commitsData = $this->requestGitHubApi(\sprintf(
'https://api.github.com/repos/%s/commits?path=%s&sha=%s',
$repositoryName,
$path,
$branch
));

$data = [];
foreach ($commitsData as $commitData) {
$data[$commitData['sha']] = $commitData['commit']['committer']['date'];
}

return $data;
}

public function getPullRequestForCommit(string $commit, string $repo): ?array
{
$data = $this->requestGitHubApi('https://api.github.com/search/issues?q='.$commit.'+is:pull-request');

if (0 === \count($data['items'])) {
return null;
}

$repositoryName = $this->getRepositoryName($repo);
if (!$repositoryName) {
return null;
}

$bestItem = null;
foreach ($data['items'] as $item) {

if (!str_contains($item['html_url'], \sprintf('%s/pull', $repositoryName))) {
continue;
}

if (null === $bestItem) {
$bestItem = $item;

continue;
}




if ($item['number'] < $bestItem['number']) {
$bestItem = $item;
}
}

if (!$bestItem) {
return null;
}

return [
'number' => $bestItem['number'],
'url' => $bestItem['html_url'],
'title' => $bestItem['title'],
];
}

private function requestGitHubApi(string $path)
{
$contents = $this->downloader->get($path)->getBody();

return json_decode($contents, true);
}






private function getRepositoryName(string $repo): ?string
{

if (!str_starts_with($repo, 'github.com')) {
return null;
}

$parts = explode('/', $repo);
if (3 !== \count($parts)) {
return null;
}

return implode('/', [$parts[1], $parts[2]]);
}
}
<?php










namespace Symfony\Flex;

use Composer\Cache;
use Composer\Composer;
use Composer\DependencyResolver\Operation\OperationInterface;
use Composer\DependencyResolver\Operation\UninstallOperation;
use Composer\DependencyResolver\Operation\UpdateOperation;
use Composer\IO\IOInterface;
use Composer\Json\JsonFile;
use Composer\Package\BasePackage;
use Composer\Util\Http\Response as ComposerResponse;
use Composer\Util\HttpDownloader;
use Composer\Util\Loop;





class Downloader
{
private const DEFAULT_ENDPOINTS = [
'https://raw.githubusercontent.com/symfony/recipes/flex/main/index.json',
'https://raw.githubusercontent.com/symfony/recipes-contrib/flex/main/index.json',
];
private const MAX_LENGTH = 1000;

private static $versions;
private static $aliases;

private $io;
private $sess;
private $cache;

private HttpDownloader $rfs;
private $degradedMode = false;
private $endpoints;
private $index;
private $conflicts;
private $legacyEndpoint;
private $caFile;
private $enabled = true;
private $composer;

public function __construct(Composer $composer, IOInterface $io, HttpDownloader $rfs)
{
if (getenv('SYMFONY_CAFILE')) {
$this->caFile = getenv('SYMFONY_CAFILE');
}

if (null === $endpoint = $composer->getPackage()->getExtra()['symfony']['endpoint'] ?? null) {
$this->endpoints = self::DEFAULT_ENDPOINTS;
} elseif (\is_array($endpoint) || str_contains($endpoint, '.json') || 'flex://defaults' === $endpoint) {
$this->endpoints = array_values((array) $endpoint);
if (\is_string($endpoint) && str_contains($endpoint, '.json')) {
$this->endpoints[] = 'flex://defaults';
}
} else {
$this->legacyEndpoint = rtrim($endpoint, '/');
}

if (false === $endpoint = getenv('SYMFONY_ENDPOINT')) {

} elseif (str_contains($endpoint, '.json') || 'flex://defaults' === $endpoint) {
$this->endpoints ?? $this->endpoints = self::DEFAULT_ENDPOINTS;
array_unshift($this->endpoints, $endpoint);
$this->legacyEndpoint = null;
} else {
$this->endpoints = null;
$this->legacyEndpoint = rtrim($endpoint, '/');
}

if (null !== $this->endpoints) {
if (false !== $i = array_search('flex://defaults', $this->endpoints, true)) {
array_splice($this->endpoints, $i, 1, self::DEFAULT_ENDPOINTS);
}

$this->endpoints = array_fill_keys($this->endpoints, []);
}

$this->io = $io;
$config = $composer->getConfig();
$this->rfs = $rfs;
$this->cache = new Cache($io, $config->get('cache-repo-dir').'/flex');
$this->sess = bin2hex(random_bytes(16));
$this->composer = $composer;
}

public function getSessionId(): string
{
return $this->sess;
}

public function isEnabled()
{
return $this->enabled;
}

public function disable()
{
$this->enabled = false;
}

public function getVersions()
{
$this->initialize();

return self::$versions ?? self::$versions = current($this->get([$this->legacyEndpoint.'/versions.json']));
}

public function getAliases()
{
$this->initialize();

return self::$aliases ?? self::$aliases = current($this->get([$this->legacyEndpoint.'/aliases.json']));
}






public function getRecipes(array $operations): array
{
$this->initialize();

if ($this->conflicts) {
$lockedRepository = $this->composer->getLocker()->getLockedRepository(true);
foreach ($this->conflicts as $conflicts) {
foreach ($conflicts as $package => $versions) {
foreach ($versions as $version => $conflicts) {
foreach ($conflicts as $conflictingPackage => $constraint) {
if ($lockedRepository->findPackage($conflictingPackage, $constraint)) {
unset($this->index[$package][$version]);
}
}
}
}
}
$this->conflicts = [];
}

$data = [];
$urls = [];
$chunk = '';
$recipeRef = null;
foreach ($operations as $operation) {
$o = 'i';
if ($operation instanceof UpdateOperation) {
$package = $operation->getTargetPackage();
$o = 'u';
} else {
$package = $operation->getPackage();
if ($operation instanceof UninstallOperation) {
$o = 'r';
}

if ($operation instanceof InformationOperation) {
$recipeRef = $operation->getRecipeRef();
}
}

$version = $package->getPrettyVersion();
if ($operation instanceof InformationOperation && $operation->getVersion()) {
$version = $operation->getVersion();
}
if (str_starts_with($version, 'dev-') && isset($package->getExtra()['branch-alias'])) {
$branchAliases = $package->getExtra()['branch-alias'];
if (
(isset($branchAliases[$version]) && $alias = $branchAliases[$version])
|| (isset($branchAliases['dev-main']) && $alias = $branchAliases['dev-main'])
|| (isset($branchAliases['dev-trunk']) && $alias = $branchAliases['dev-trunk'])
|| (isset($branchAliases['dev-develop']) && $alias = $branchAliases['dev-develop'])
|| (isset($branchAliases['dev-default']) && $alias = $branchAliases['dev-default'])
|| (isset($branchAliases['dev-latest']) && $alias = $branchAliases['dev-latest'])
|| (isset($branchAliases['dev-next']) && $alias = $branchAliases['dev-next'])
|| (isset($branchAliases['dev-current']) && $alias = $branchAliases['dev-current'])
|| (isset($branchAliases['dev-support']) && $alias = $branchAliases['dev-support'])
|| (isset($branchAliases['dev-tip']) && $alias = $branchAliases['dev-tip'])
|| (isset($branchAliases['dev-master']) && $alias = $branchAliases['dev-master'])
) {
$version = $alias;
}
}

if ($recipeVersions = $this->index[$package->getName()] ?? null) {
$version = explode('.', preg_replace('/^dev-|^v|\.x-dev$|-dev$/', '', $version));
$version = $version[0].'.'.($version[1] ?? '9999999');

foreach (array_reverse($recipeVersions) as $v => $endpoint) {
if (version_compare($version, $v, '<')) {
continue;
}

$data['locks'][$package->getName()]['version'] = $version;
$data['locks'][$package->getName()]['recipe']['version'] = $v;
$links = $this->endpoints[$endpoint]['_links'];

if (null !== $recipeRef && isset($links['archived_recipes_template'])) {
if (isset($links['archived_recipes_template_relative'])) {
$links['archived_recipes_template'] = preg_replace('{[^/\?]*+(?=\?|$)}', $links['archived_recipes_template_relative'], $endpoint, 1);
}

$urls[] = strtr($links['archived_recipes_template'], [
'{package_dotted}' => str_replace('/', '.', $package->getName()),
'{ref}' => $recipeRef,
]);

break;
}

if (isset($links['recipe_template_relative'])) {
$links['recipe_template'] = preg_replace('{[^/\?]*+(?=\?|$)}', $links['recipe_template_relative'], $endpoint, 1);
}

$urls[] = strtr($links['recipe_template'], [
'{package_dotted}' => str_replace('/', '.', $package->getName()),
'{package}' => $package->getName(),
'{version}' => $v,
]);

break;
}

continue;
}

if (\is_array($recipeVersions)) {
$data['conflicts'][$package->getName()] = true;
}

if (null !== $this->endpoints) {
continue;
}


$name = str_replace('/', ',', $package->getName());
$path = \sprintf('%s,%s%s', $name, $o, $version);
if ($date = $package->getReleaseDate()) {
$path .= ','.$date->format('U');
}
if (\strlen($chunk) + \strlen($path) > self::MAX_LENGTH) {
$urls[] = $this->legacyEndpoint.'/p/'.$chunk;
$chunk = $path;
} elseif ($chunk) {
$chunk .= ';'.$path;
} else {
$chunk = $path;
}
}
if ($chunk) {
$urls[] = $this->legacyEndpoint.'/p/'.$chunk;
}

if (null === $this->endpoints) {
foreach ($this->get($urls, true) as $body) {
foreach ($body['manifests'] ?? [] as $name => $manifest) {
$data['manifests'][$name] = $manifest;
}
foreach ($body['locks'] ?? [] as $name => $lock) {
$data['locks'][$name] = $lock;
}
}
} else {
foreach ($this->get($urls, true) as $body) {
foreach ($body['manifests'] ?? [] as $name => $manifest) {
if (null === $version = $data['locks'][$name]['recipe']['version'] ?? null) {
continue;
}
$endpoint = $this->endpoints[$this->index[$name][$version]];

$data['locks'][$name]['recipe'] = [
'repo' => $endpoint['_links']['repository'],
'branch' => $endpoint['branch'],
'version' => $version,
'ref' => $manifest['ref'],
];

foreach ($manifest['files'] ?? [] as $i => $file) {
$manifest['files'][$i]['contents'] = \is_array($file['contents']) ? implode("\n", $file['contents']) : base64_decode($file['contents']);
}

$data['manifests'][$name] = $manifest + [
'repository' => $endpoint['_links']['repository'],
'package' => $name,
'version' => $version,
'origin' => strtr($endpoint['_links']['origin_template'], [
'{package}' => $name,
'{version}' => $version,
]),
'is_contrib' => $endpoint['is_contrib'] ?? false,
];
}
}
}

return $data;
}






public function removeRecipeFromIndex(string $packageName, string $version)
{
unset($this->index[$packageName][$version]);
}

public function getSymfonyPacks(array $packages)
{
$packs = [];
foreach ($this->composer->getRepositoryManager()->getRepositories() as $repo) {
if (!$packages) {
break;
}

$result = $repo->loadPackages($packages, BasePackage::$stabilities, []);

foreach ($result['packages'] ?? [] as $package) {
if (!isset($packages[$package->getName()])) {
continue;
}
if ('symfony-pack' === $package->getType()) {
$packs[$package->getName()] = true;
}
unset($packages[$package->getName()]);
}
}

return array_keys($packs);
}




private function get(array $urls, bool $isRecipe = false, int $try = 3): array
{
$responses = [];
$retries = [];
$options = [];

foreach ($urls as $url) {
$cacheKey = self::generateCacheKey($url);
$headers = [];

if (preg_match('{^https?://api\.github\.com/}', $url)) {
$headers[] = 'Accept: application/vnd.github.v3.raw';
} elseif (preg_match('{^https?://raw\.githubusercontent\.com/}', $url) && $this->io->hasAuthentication('github.com')) {
$auth = $this->io->getAuthentication('github.com');
if ('x-oauth-basic' === $auth['password']) {
$headers[] = 'Authorization: token '.$auth['username'];
}
} elseif ($this->legacyEndpoint) {
$headers[] = 'Package-Session: '.$this->sess;
}

if ($contents = $this->cache->read($cacheKey)) {
$cachedResponse = Response::fromJson(json_decode($contents, true));
if ($lastModified = $cachedResponse->getHeader('last-modified')) {
$headers[] = 'If-Modified-Since: '.$lastModified;
}
if ($eTag = $cachedResponse->getHeader('etag')) {
$headers[] = 'If-None-Match: '.$eTag;
}
$responses[$url] = $cachedResponse->getBody();
}

$options[$url] = $this->getOptions($headers);
}

$loop = new Loop($this->rfs);
$jobs = [];
foreach ($urls as $url) {
$jobs[] = $this->rfs->add($url, $options[$url])->then(function (ComposerResponse $response) use ($url, &$responses) {
if (200 === $response->getStatusCode()) {
$cacheKey = self::generateCacheKey($url);
$responses[$url] = $this->parseJson($response->getBody(), $url, $cacheKey, $response->getHeaders())->getBody();
}
}, function (\Exception $e) use ($url, &$retries) {
$retries[] = [$url, $e];
});
}
$loop->wait($jobs);

if (!$retries) {
return $responses;
}

if (0 < --$try) {
usleep(100000);

return $this->get(array_column($retries, 0), $isRecipe, $try) + $responses;
}

foreach ($retries as [$url, $e]) {
if (isset($responses[$url])) {
$this->switchToDegradedMode($e, $url);
} elseif ($isRecipe) {
$this->io->writeError('<warning>Failed to download recipe: '.$e->getMessage().'</>');
} else {
throw $e;
}
}

return $responses;
}

private function parseJson(string $json, string $url, string $cacheKey, array $lastHeaders): Response
{
$data = JsonFile::parseJson($json, $url);
if (!empty($data['warning'])) {
$this->io->writeError('<warning>Warning from '.$url.': '.$data['warning'].'</>');
}
if (!empty($data['info'])) {
$this->io->writeError('<info>Info from '.$url.': '.$data['info'].'</>');
}

$response = new Response($data, $lastHeaders);
if ($cacheKey && ($response->getHeader('last-modified') || $response->getHeader('etag'))) {
$this->cache->write($cacheKey, json_encode($response));
}

return $response;
}

private function switchToDegradedMode(\Exception $e, string $url)
{
if (!$this->degradedMode) {
$this->io->writeError('<warning>'.$e->getMessage().'</>');
$this->io->writeError('<warning>'.$url.' could not be fully loaded, package information was loaded from the local cache and may be out of date</>');
}
$this->degradedMode = true;
}

private function getOptions(array $headers): array
{
$options = ['http' => ['header' => $headers]];

if (null !== $this->caFile) {
$options['ssl']['cafile'] = $this->caFile;
}

return $options;
}

private function initialize()
{
if (null !== $this->index || null === $this->endpoints) {
$this->index ?? $this->index = [];

return;
}

$indexes = self::$versions = self::$aliases = [];

foreach ($this->get(array_keys($this->endpoints)) as $endpoint => $index) {
$indexes[$endpoint] = $index;
}

foreach ($this->endpoints as $endpoint => $config) {
$config = $indexes[$endpoint] ?? [];
foreach ($config['recipes'] ?? [] as $package => $versions) {
$this->index[$package] = $this->index[$package] ?? array_fill_keys($versions, $endpoint);
}
$this->conflicts[] = $config['recipe-conflicts'] ?? [];
self::$versions += $config['versions'] ?? [];
self::$aliases += $config['aliases'] ?? [];
unset($config['recipes'], $config['recipe-conflicts'], $config['versions'], $config['aliases']);
$this->endpoints[$endpoint] = $config;
}
}

private static function generateCacheKey(string $url): string
{
$url = preg_replace('{^https://api.github.com/repos/([^/]++/[^/]++)/contents/}', '$1/', $url);
$url = preg_replace('{^https://raw.githubusercontent.com/([^/]++/[^/]++)/}', '$1/', $url);

$key = preg_replace('{[^a-z0-9.]}i', '-', $url);


return \strlen($key) > 140 ? md5($url) : $key;
}
}
<?php










namespace Symfony\Flex;

use Composer\Package\PackageInterface;




class Recipe
{
private $package;
private $name;
private $job;
private $data;
private $lock;

public function __construct(PackageInterface $package, string $name, string $job, array $data, array $lock = [])
{
$this->package = $package;
$this->name = $name;
$this->job = $job;
$this->data = $data;
$this->lock = $lock;
}

public function getPackage(): PackageInterface
{
return $this->package;
}

public function getName(): string
{
return $this->name;
}

public function getJob(): string
{
return $this->job;
}

public function getManifest(): array
{
if (!isset($this->data['manifest'])) {
throw new \LogicException(\sprintf('Manifest is not available for recipe "%s".', $this->name));
}

return $this->data['manifest'];
}

public function getFiles(): array
{
return $this->data['files'] ?? [];
}

public function getOrigin(): string
{
return $this->data['origin'] ?? '';
}

public function getFormattedOrigin(): string
{
if (!$this->getOrigin()) {
return '';
}


if (!preg_match('/^([^:]++):([^@]++)@(.+)$/', $this->getOrigin(), $matches)) {
return $this->getOrigin();
}

return \sprintf('<info>%s</> (<comment>>=%s</>): From %s', $matches[1], $matches[2], 'auto-generated recipe' === $matches[3] ? '<comment>'.$matches[3].'</>' : $matches[3]);
}

public function getURL(): string
{
if (!$this->data['origin']) {
return '';
}


if (!preg_match('/^([^:]++):([^@]++)@([^:]++):(.+)$/', $this->data['origin'], $matches)) {

return '';
}

return \sprintf('https://%s/tree/%s/%s/%s', $matches[3], $matches[4], $matches[1], $matches[2]);
}

public function isContrib(): bool
{
return $this->data['is_contrib'] ?? false;
}

public function getRef()
{
return $this->lock['recipe']['ref'] ?? null;
}

public function isAuto(): bool
{
return !isset($this->lock['recipe']);
}

public function getVersion(): string
{
return $this->lock['recipe']['version'] ?? $this->lock['version'];
}

public function getLock(): array
{
return $this->lock;
}
}
<?php










namespace Symfony\Flex;

use Composer\Composer;
use Composer\IO\IOInterface;
use Symfony\Flex\Configurator\AbstractConfigurator;
use Symfony\Flex\Update\RecipeUpdate;




class Configurator
{
private $composer;
private $io;
private $options;
private $configurators;
private $postInstallConfigurators;
private $cache;

public function __construct(Composer $composer, IOInterface $io, Options $options)
{
$this->composer = $composer;
$this->io = $io;
$this->options = $options;

$this->configurators = [
'bundles' => Configurator\BundlesConfigurator::class,
'copy-from-recipe' => Configurator\CopyFromRecipeConfigurator::class,
'copy-from-package' => Configurator\CopyFromPackageConfigurator::class,
'env' => Configurator\EnvConfigurator::class,
'dotenv' => Configurator\DotenvConfigurator::class,
'container' => Configurator\ContainerConfigurator::class,
'makefile' => Configurator\MakefileConfigurator::class,
'composer-scripts' => Configurator\ComposerScriptsConfigurator::class,
'composer-commands' => Configurator\ComposerCommandsConfigurator::class,
'gitignore' => Configurator\GitignoreConfigurator::class,
'dockerfile' => Configurator\DockerfileConfigurator::class,
'docker-compose' => Configurator\DockerComposeConfigurator::class,
];
$this->postInstallConfigurators = [
'add-lines' => Configurator\AddLinesConfigurator::class,
];
}

public function install(Recipe $recipe, Lock $lock, array $options = [])
{
$manifest = $recipe->getManifest();
foreach (array_keys($this->configurators) as $key) {
if (isset($manifest[$key])) {
$this->get($key)->configure($recipe, $manifest[$key], $lock, $options);
}
}
}




public function postInstall(Recipe $recipe, Lock $lock, array $options = [])
{
$manifest = $recipe->getManifest();
foreach (array_keys($this->postInstallConfigurators) as $key) {
if (isset($manifest[$key])) {
$this->get($key)->configure($recipe, $manifest[$key], $lock, $options);
}
}
}

public function populateUpdate(RecipeUpdate $recipeUpdate): void
{
$originalManifest = $recipeUpdate->getOriginalRecipe()->getManifest();
$newManifest = $recipeUpdate->getNewRecipe()->getManifest();
$allConfigurators = array_merge($this->configurators, $this->postInstallConfigurators);
foreach (array_keys($allConfigurators) as $key) {
if (!isset($originalManifest[$key]) && !isset($newManifest[$key])) {
continue;
}

$this->get($key)->update($recipeUpdate, $originalManifest[$key] ?? [], $newManifest[$key] ?? []);
}
}

public function unconfigure(Recipe $recipe, Lock $lock)
{
$manifest = $recipe->getManifest();

$allConfigurators = array_merge($this->configurators, $this->postInstallConfigurators);

foreach (array_keys($allConfigurators) as $key) {
if (isset($manifest[$key])) {
$this->get($key)->unconfigure($recipe, $manifest[$key], $lock);
}
}
}

private function get($key): AbstractConfigurator
{
if (!isset($this->configurators[$key]) && !isset($this->postInstallConfigurators[$key])) {
throw new \InvalidArgumentException(\sprintf('Unknown configurator "%s".', $key));
}

if (isset($this->cache[$key])) {
return $this->cache[$key];
}

$class = isset($this->configurators[$key]) ? $this->configurators[$key] : $this->postInstallConfigurators[$key];

return $this->cache[$key] = new $class($this->composer, $this->io, $this->options);
}
}
<?php










namespace Symfony\Flex;

use Composer\IO\IOInterface;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Composer\Semver\Semver;
use Composer\Semver\VersionParser;
use Seld\JsonLint\ParsingException;





class PackageJsonSynchronizer
{
private $rootDir;
private $vendorDir;
private $scriptExecutor;
private $io;
private $versionParser;

public function __construct(string $rootDir, string $vendorDir, ScriptExecutor $scriptExecutor, IOInterface $io)
{
$this->rootDir = $rootDir;
$this->vendorDir = $vendorDir;
$this->scriptExecutor = $scriptExecutor;
$this->io = $io;
$this->versionParser = new VersionParser();
}

public function shouldSynchronize(): bool
{
return $this->rootDir && (file_exists($this->rootDir.'/package.json') || file_exists($this->rootDir.'/importmap.php'));
}

public function synchronize(array $phpPackages): bool
{
if (file_exists($this->rootDir.'/importmap.php')) {
$this->synchronizeForAssetMapper($phpPackages);

return false;
}

try {
JsonFile::parseJson(file_get_contents($this->rootDir.'/package.json'));
} catch (ParsingException $e) {

return false;
}

$didChangePackageJson = $this->removeObsoletePackageJsonLinks();

$dependencies = [];

$phpPackages = $this->normalizePhpPackages($phpPackages);
foreach ($phpPackages as $phpPackage) {
foreach ($this->resolvePackageJsonDependencies($phpPackage) as $dependency => $constraint) {
$dependencies[$dependency][$phpPackage['name']] = $constraint;
}
}

$didChangePackageJson = $this->registerDependenciesInPackageJson($dependencies) || $didChangePackageJson;


$this->updateControllersJsonFile($phpPackages);

return $didChangePackageJson;
}

private function synchronizeForAssetMapper(array $phpPackages): void
{
$importMapEntries = [];
$phpPackages = $this->normalizePhpPackages($phpPackages);
foreach ($phpPackages as $phpPackage) {
foreach ($this->resolveImportMapPackages($phpPackage) as $name => $dependencyConfig) {
$importMapEntries[$name] = $dependencyConfig;
}
}

$this->updateImportMap($importMapEntries);
$this->updateControllersJsonFile($phpPackages);
}

private function removeObsoletePackageJsonLinks(): bool
{
$didChangePackageJson = false;

$manipulator = new JsonManipulator(file_get_contents($this->rootDir.'/package.json'));
$content = json_decode($manipulator->getContents(), true);

$jsDependencies = $content['dependencies'] ?? [];
$jsDevDependencies = $content['devDependencies'] ?? [];

foreach (['dependencies' => $jsDependencies, 'devDependencies' => $jsDevDependencies] as $key => $packages) {
foreach ($packages as $name => $version) {
if ('@' !== $name[0] || !str_starts_with($version, 'file:'.$this->vendorDir.'/') || !str_contains($version, '/assets')) {
continue;
}
if (file_exists($this->rootDir.'/'.substr($version, 5).'/package.json')) {
continue;
}

$manipulator->removeSubNode($key, $name);
$didChangePackageJson = true;
}
}

file_put_contents($this->rootDir.'/package.json', $manipulator->getContents());

return $didChangePackageJson;
}

private function resolvePackageJsonDependencies($phpPackage): array
{
$dependencies = [];

if (!$packageJson = $this->resolvePackageJson($phpPackage)) {
return $dependencies;
}

if ($packageJson->read()['symfony']['needsPackageAsADependency'] ?? true) {
$dependencies['@'.$phpPackage['name']] = 'file:'.substr($packageJson->getPath(), 1 + \strlen($this->rootDir), -13);
}

foreach ($packageJson->read()['peerDependencies'] ?? [] as $peerDependency => $constraint) {
$dependencies[$peerDependency] = $constraint;
}

return $dependencies;
}

private function resolveImportMapPackages($phpPackage): array
{
if (!$packageJson = $this->resolvePackageJson($phpPackage)) {
return [];
}

$dependencies = [];

foreach ($packageJson->read()['symfony']['importmap'] ?? [] as $importMapName => $constraintConfig) {
if (\is_string($constraintConfig)) {

$constraint = $constraintConfig;
$package = $importMapName;
$entrypoint = false;
} elseif (\is_array($constraintConfig)) {


$constraint = $constraintConfig['version'] ?? '';
$package = $constraintConfig['package'] ?? $importMapName;
$entrypoint = $constraintConfig['entrypoint'] ?? false;
} else {
throw new \InvalidArgumentException(\sprintf('Invalid constraint config for key "%s": "%s" given, array or string expected.', $importMapName, var_export($constraintConfig, true)));
}




if (str_starts_with($constraint, 'entrypoint:')) {
$entrypoint = true;
$constraint = substr_replace($constraint, 'path:', 0, \strlen('entrypoint:'));
}

if (str_starts_with($constraint, 'path:')) {
$path = substr($constraint, 5);
$path = str_replace('%PACKAGE%', \dirname($packageJson->getPath()), $path);

$dependencies[$importMapName] = [
'path' => $path,
'entrypoint' => $entrypoint,
];

continue;
}

$dependencies[$importMapName] = [
'version' => $constraint,
'package' => $package,
];
}

return $dependencies;
}

private function registerDependenciesInPackageJson(array $flexDependencies): bool
{
$didChangePackageJson = false;

$manipulator = new JsonManipulator(file_get_contents($this->rootDir.'/package.json'));
$content = json_decode($manipulator->getContents(), true);

foreach ($flexDependencies as $dependency => $constraints) {
if (1 !== \count($constraints) && 1 !== \count(array_count_values($constraints))) {

continue;
}

$constraint = array_shift($constraints);

$parentNode = isset($content['dependencies'][$dependency]) ? 'dependencies' : 'devDependencies';
if (!isset($content[$parentNode][$dependency])) {
$content['devDependencies'][$dependency] = $constraint;
$didChangePackageJson = true;
} elseif ($constraint !== $content[$parentNode][$dependency]) {
if ($this->shouldUpdateConstraint($content[$parentNode][$dependency], $constraint)) {
$content[$parentNode][$dependency] = $constraint;
$didChangePackageJson = true;
}
}
}

if ($didChangePackageJson) {
if (isset($content['dependencies'])) {
$manipulator->addMainKey('dependencies', $content['dependencies']);
}

if (isset($content['devDependencies'])) {
$devDependencies = $content['devDependencies'];
uksort($devDependencies, 'strnatcmp');
$manipulator->addMainKey('devDependencies', $devDependencies);
}

$newContents = $manipulator->getContents();
if ($newContents === file_get_contents($this->rootDir.'/package.json')) {
return false;
}

file_put_contents($this->rootDir.'/package.json', $manipulator->getContents());
}

return $didChangePackageJson;
}

private function shouldUpdateConstraint(string $existingConstraint, string $constraint)
{
try {
$existingConstraint = $this->versionParser->parseConstraints($existingConstraint);
$constraint = $this->versionParser->parseConstraints($constraint);

return !$existingConstraint->matches($constraint);
} catch (\UnexpectedValueException $e) {
return true;
}
}




private function updateImportMap(array $importMapEntries): void
{
if (!$importMapEntries) {
return;
}

$importMapData = include $this->rootDir.'/importmap.php';

foreach ($importMapEntries as $name => $importMapEntry) {
if (isset($importMapData[$name])) {
if (!isset($importMapData[$name]['version'])) {

continue;
}

$version = $importMapData[$name]['version'];
$versionConstraint = $importMapEntry['version'] ?? null;


if (Semver::satisfies($version, $versionConstraint)) {
continue;
}

$this->io->writeError(\sprintf('Updating package <comment>%s</> from <info>%s</> to <info>%s</>.', $name, $version, $versionConstraint));
}

if (isset($importMapEntry['path'])) {
$arguments = [$name, '--path='.$importMapEntry['path']];
if (isset($importMapEntry['entrypoint']) && true === $importMapEntry['entrypoint']) {
$arguments[] = '--entrypoint';
}

$this->scriptExecutor->execute(
'symfony-cmd',
'importmap:require',
$arguments
);

continue;
}

if (isset($importMapEntry['version'])) {
$packageName = $importMapEntry['package'].'@'.$importMapEntry['version'];
if ($importMapEntry['package'] !== $name) {
$packageName .= '='.$name;
}
$arguments = [$packageName];
$this->scriptExecutor->execute(
'symfony-cmd',
'importmap:require',
$arguments
);

continue;
}

throw new \InvalidArgumentException(\sprintf('Invalid importmap entry: "%s".', var_export($importMapEntry, true)));
}
}

private function updateControllersJsonFile(array $phpPackages)
{
if (!file_exists($controllersJsonPath = $this->rootDir.'/assets/controllers.json')) {
return;
}

try {
$previousControllersJson = (new JsonFile($controllersJsonPath))->read();
} catch (ParsingException $e) {

return;
}
$newControllersJson = [
'controllers' => [],
'entrypoints' => $previousControllersJson['entrypoints'],
];

foreach ($phpPackages as $phpPackage) {
if (!$packageJson = $this->resolvePackageJson($phpPackage)) {
continue;
}
$name = '@'.$phpPackage['name'];

foreach ($packageJson->read()['symfony']['controllers'] ?? [] as $controllerName => $defaultConfig) {

if (!isset($previousControllersJson['controllers'][$name][$controllerName])) {
$config = [];
$config['enabled'] = $defaultConfig['enabled'];
$config['fetch'] = $defaultConfig['fetch'] ?? 'eager';

if (isset($defaultConfig['autoimport'])) {
$config['autoimport'] = $defaultConfig['autoimport'];
}

$newControllersJson['controllers'][$name][$controllerName] = $config;

continue;
}


$previousConfig = $previousControllersJson['controllers'][$name][$controllerName];

$config = [];
$config['enabled'] = $previousConfig['enabled'];
$config['fetch'] = $previousConfig['fetch'] ?? 'eager';

if (isset($defaultConfig['autoimport'])) {
$config['autoimport'] = [];


foreach ($defaultConfig['autoimport'] as $autoimport => $enabled) {
$config['autoimport'][$autoimport] = $previousConfig['autoimport'][$autoimport] ?? $enabled;
}
}

$newControllersJson['controllers'][$name][$controllerName] = $config;
}

foreach ($packageJson->read()['symfony']['entrypoints'] ?? [] as $entrypoint => $filename) {
if (!isset($newControllersJson['entrypoints'][$entrypoint])) {
$newControllersJson['entrypoints'][$entrypoint] = $filename;
}
}
}

file_put_contents($controllersJsonPath, json_encode($newControllersJson, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)."\n");
}

private function resolvePackageJson(array $phpPackage): ?JsonFile
{
$packageDir = $this->rootDir.'/'.$this->vendorDir.'/'.$phpPackage['name'];

if (!\in_array('symfony-ux', $phpPackage['keywords'] ?? [], true)) {
return null;
}

foreach (['/assets', '/Resources/assets', '/src/Resources/assets'] as $subdir) {
$packageJsonPath = $packageDir.$subdir.'/package.json';

if (!file_exists($packageJsonPath)) {
continue;
}

return new JsonFile($packageJsonPath);
}

return null;
}

private function normalizePhpPackages(array $phpPackages): array
{
foreach ($phpPackages as $k => $phpPackage) {
if (\is_string($phpPackage)) {

$phpPackages[$k] = $phpPackage = [
'name' => $phpPackage,
'keywords' => ['symfony-ux'],
];
}
}

return $phpPackages;
}
}
<?php










namespace Symfony\Flex\Event;

use Composer\Script\Event;
use Composer\Script\ScriptEvents;

class UpdateEvent extends Event
{
private $force;
private $reset;
private $assumeYesForPrompts;

public function __construct(bool $force, bool $reset, bool $assumeYesForPrompts)
{
$this->name = ScriptEvents::POST_UPDATE_CMD;
$this->force = $force;
$this->reset = $reset;
$this->assumeYesForPrompts = $assumeYesForPrompts;
}

public function force(): bool
{
return $this->force;
}

public function reset(): bool
{
return $this->reset;
}

public function assumeYesForPrompts(): bool
{
return $this->assumeYesForPrompts;
}
}
<?php










namespace Symfony\Flex\Unpack;

class Operation
{
private $packages = [];
private $unpack;
private $sort;

public function __construct(bool $unpack, bool $sort)
{
$this->unpack = $unpack;
$this->sort = $sort;
}

public function addPackage(string $name, string $version, bool $dev)
{
$this->packages[] = [
'name' => $name,
'version' => $version,
'dev' => $dev,
];
}

public function getPackages(): array
{
return $this->packages;
}

public function shouldUnpack(): bool
{
return $this->unpack;
}

public function shouldSort(): bool
{
return $this->sort;
}
}
<?php










namespace Symfony\Flex\Unpack;

use Composer\Package\PackageInterface;

class Result
{
private $unpacked = [];
private $required = [];

public function addUnpacked(PackageInterface $package): bool
{
$name = $package->getName();

if (!isset($this->unpacked[$name])) {
$this->unpacked[$name] = $package;

return true;
}

return false;
}




public function getUnpacked(): array
{
return $this->unpacked;
}

public function addRequired(string $package)
{
$this->required[] = $package;
}




public function getRequired(): array
{

return $this->required ?: ['symfony/flex'];
}
}
<?php










namespace Symfony\Flex;




class Response implements \JsonSerializable
{
private $body;
private $origHeaders;
private $headers;
private $code;




public function __construct($body, array $headers = [], int $code = 200)
{
$this->body = $body;
$this->origHeaders = $headers;
$this->headers = $this->parseHeaders($headers);
$this->code = $code;
}

public function getStatusCode(): int
{
return $this->code;
}

public function getHeader(string $name): string
{
return $this->headers[strtolower($name)][0] ?? '';
}

public function getHeaders(string $name): array
{
return $this->headers[strtolower($name)] ?? [];
}

public function getBody()
{
return $this->body;
}

public function getOrigHeaders(): array
{
return $this->origHeaders;
}

public static function fromJson(array $json): self
{
$response = new self($json['body']);
$response->headers = $json['headers'];

return $response;
}

#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return ['body' => $this->body, 'headers' => $this->headers];
}

private function parseHeaders(array $headers): array
{
$values = [];
foreach (array_reverse($headers) as $header) {
if (preg_match('{^([^:]++):\s*(.+?)\s*$}i', $header, $match)) {
$values[strtolower($match[1])][] = $match[2];
} elseif (preg_match('{^HTTP/}i', $header)) {
break;
}
}

return $values;
}
}
<?php










namespace Symfony\Flex;

use Composer\Composer;
use Composer\Config\JsonConfigSource;
use Composer\Factory;
use Composer\IO\IOInterface;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Composer\Package\Locker;
use Composer\Package\Version\VersionSelector;
use Composer\Repository\CompositeRepository;
use Composer\Repository\RepositorySet;
use Composer\Semver\VersionParser;
use Symfony\Flex\Unpack\Operation;
use Symfony\Flex\Unpack\Result;

class Unpacker
{
private $composer;
private $resolver;
private $versionParser;

public function __construct(Composer $composer, PackageResolver $resolver)
{
$this->composer = $composer;
$this->resolver = $resolver;
$this->versionParser = new VersionParser();
}

public function unpack(Operation $op, ?Result $result = null, &$links = [], bool $devRequire = false): Result
{
if (null === $result) {
$result = new Result();
}

$localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
foreach ($op->getPackages() as $package) {
$pkg = $localRepo->findPackage($package['name'], '*');
$pkg = $pkg ?? $this->composer->getRepositoryManager()->findPackage($package['name'], $package['version'] ?: '*');


if (
null === $pkg
|| 'symfony-pack' !== $pkg->getType()
|| !$op->shouldUnpack()
|| 0 === \count($pkg->getRequires()) + \count($pkg->getDevRequires())
) {
$result->addRequired($package['name'].($package['version'] ? ':'.$package['version'] : ''));

continue;
}

if (!$result->addUnpacked($pkg)) {
continue;
}

$requires = [];
foreach ($pkg->getRequires() as $link) {
$requires[$link->getTarget()] = $link;
}
$devRequires = $pkg->getDevRequires();

foreach ($devRequires as $i => $link) {
if (!isset($requires[$link->getTarget()])) {
throw new \RuntimeException(\sprintf('Symfony pack "%s" must duplicate all entries from "require-dev" into "require" but entry "%s" was not found.', $package['name'], $link->getTarget()));
}
$devRequires[$i] = $requires[$link->getTarget()];
unset($requires[$link->getTarget()]);
}

$versionSelector = null;
foreach ([$requires, $devRequires] as $dev => $requires) {
$dev = $dev ?: $devRequire ?: $package['dev'];

foreach ($requires as $link) {
if ('php' === $linkName = $link->getTarget()) {
continue;
}

$constraint = $link->getPrettyConstraint();
$constraint = substr($this->resolver->parseVersion($linkName, $constraint, true), 1) ?: $constraint;

if ($subPkg = $localRepo->findPackage($linkName, '*')) {
if ('symfony-pack' === $subPkg->getType()) {
$subOp = new Operation(true, $op->shouldSort());
$subOp->addPackage($subPkg->getName(), $constraint, $dev);
$result = $this->unpack($subOp, $result, $links, $dev);
continue;
}

if ('*' === $constraint) {
if (null === $versionSelector) {
$pool = new RepositorySet($this->composer->getPackage()->getMinimumStability(), $this->composer->getPackage()->getStabilityFlags());
$pool->addRepository(new CompositeRepository($this->composer->getRepositoryManager()->getRepositories()));
$versionSelector = new VersionSelector($pool);
}

$constraint = $versionSelector->findRecommendedRequireVersion($subPkg);
}
}

$linkType = $dev ? 'require-dev' : 'require';
$constraint = $this->versionParser->parseConstraints($constraint);

if (isset($links[$linkName])) {
$links[$linkName]['constraints'][] = $constraint;
if ('require' === $linkType) {
$links[$linkName]['type'] = 'require';
}
} else {
$links[$linkName] = [
'type' => $linkType,
'name' => $linkName,
'constraints' => [$constraint],
];
}
}
}
}

if (1 < \func_num_args()) {
return $result;
}

$jsonPath = Factory::getComposerFile();
$jsonContent = file_get_contents($jsonPath);
$jsonStored = json_decode($jsonContent, true);
$jsonManipulator = new JsonManipulator($jsonContent);

foreach ($result->getUnpacked() as $pkg) {
$localRepo->removePackage($pkg);
$localRepo->setDevPackageNames(array_diff($localRepo->getDevPackageNames(), [$pkg->getName()]));
$jsonManipulator->removeSubNode('require', $pkg->getName());
$jsonManipulator->removeSubNode('require-dev', $pkg->getName());
}

foreach ($links as $link) {

if (isset($jsonStored['require'][$link['name']])) {
continue;
}

if (isset($jsonStored['require-dev'][$link['name']])) {

if ('require-dev' === $link['type']) {
continue;
}



$link['constraints'][] = $this->versionParser->parseConstraints($jsonStored['require-dev'][$link['name']]);
$jsonManipulator->removeSubNode('require-dev', $link['name']);
}

$constraint = end($link['constraints']);

if (!$jsonManipulator->addLink($link['type'], $link['name'], $constraint->getPrettyString(), $op->shouldSort())) {
throw new \RuntimeException(\sprintf('Unable to unpack package "%s".', $link['name']));
}
}

file_put_contents($jsonPath, $jsonManipulator->getContents());

return $result;
}

public function updateLock(Result $result, IOInterface $io): void
{
$json = new JsonFile(Factory::getComposerFile());
$manipulator = new JsonConfigSource($json);
$locker = $this->composer->getLocker();
$lockData = $locker->getLockData();

foreach ($result->getUnpacked() as $package) {
$manipulator->removeLink('require-dev', $package->getName());
foreach ($lockData['packages-dev'] as $i => $pkg) {
if ($package->getName() === $pkg['name']) {
unset($lockData['packages-dev'][$i]);
}
}
$manipulator->removeLink('require', $package->getName());
foreach ($lockData['packages'] as $i => $pkg) {
if ($package->getName() === $pkg['name']) {
unset($lockData['packages'][$i]);
}
}
}
$jsonContent = file_get_contents($json->getPath());
$lockData['packages'] = array_values($lockData['packages']);
$lockData['packages-dev'] = array_values($lockData['packages-dev']);
$lockData['content-hash'] = Locker::getContentHash($jsonContent);
$lockFile = new JsonFile(substr($json->getPath(), 0, -4).'lock', null, $io);

$lockFile->write($lockData);

$locker = new Locker($io, $lockFile, $this->composer->getInstallationManager(), $jsonContent);
$this->composer->setLocker($locker);

$localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
$localRepo->write($localRepo->getDevMode() ?? true, $this->composer->getInstallationManager());
}
}
<?php










namespace Symfony\Flex;

use Composer\IO\IOInterface;
use Composer\Package\AliasPackage;
use Composer\Package\PackageInterface;
use Composer\Package\RootPackageInterface;
use Composer\Semver\Constraint\Constraint;
use Composer\Semver\Intervals;
use Composer\Semver\VersionParser;




class PackageFilter
{
private $versions;
private $versionParser;
private $symfonyRequire;
private $symfonyConstraints;
private $downloader;
private $io;
private $ignorePreleases;

public function __construct(IOInterface $io, string $symfonyRequire, Downloader $downloader, bool $ignorePreleases = false)
{
$this->versionParser = new VersionParser();
$this->symfonyRequire = $symfonyRequire;
$this->symfonyConstraints = '' !== $symfonyRequire ? $this->versionParser->parseConstraints($symfonyRequire) : null;
$this->downloader = $downloader;
$this->io = $io;
$this->ignorePreleases = $ignorePreleases;
}







public function removeLegacyPackages(array $data, RootPackageInterface $rootPackage, array $lockedPackages): array
{
if ($this->ignorePreleases) {
$filteredPackages = [];
foreach ($data as $package) {
if (\in_array($package->getStability(), ['stable', 'dev'], true)) {
$filteredPackages[] = $package;
}
}
$data = $filteredPackages;
}

if (!$this->symfonyConstraints || !$data) {
return $data;
}

$lockedVersions = [];
foreach ($lockedPackages as $package) {
$lockedVersions[$package->getName()] = [$package->getVersion()];
if ($package instanceof AliasPackage) {
$lockedVersions[$package->getName()][] = $package->getAliasOf()->getVersion();
}
}

$rootConstraints = [];
foreach ($rootPackage->getRequires() + $rootPackage->getDevRequires() as $name => $link) {
$rootConstraints[$name] = $link->getConstraint();
}

$knownVersions = null;
$filteredPackages = [];
$symfonyPackages = [];
$oneSymfony = false;
foreach ($data as $package) {
$name = $package->getName();
$versions = [$package->getVersion()];
if ($package instanceof AliasPackage) {
$versions[] = $package->getAliasOf()->getVersion();
}

if ('symfony/symfony' !== $name && (
array_intersect($versions, $lockedVersions[$name] ?? [])
|| (($knownVersions ??= $this->getVersions()) && !isset($knownVersions['splits'][$name]))
|| (isset($rootConstraints[$name]) && !Intervals::haveIntersections($this->symfonyConstraints, $rootConstraints[$name]))
|| ('symfony/psr-http-message-bridge' === $name && 6.4 > $versions[0])
)) {
$filteredPackages[] = $package;
continue;
}

if (null !== $alias = $package->getExtra()['branch-alias'][$package->getVersion()] ?? null) {
$versions[] = $this->versionParser->normalize($alias);
}

foreach ($versions as $version) {
if ($this->symfonyConstraints->matches(new Constraint('==', $version))) {
$filteredPackages[] = $package;
$oneSymfony = $oneSymfony || 'symfony/symfony' === $name;
continue 2;
}
}

if ('symfony/symfony' === $name) {
$symfonyPackages[] = $package;
} elseif (null !== $this->io) {
$this->io->writeError(\sprintf('<info>Restricting packages listed in "symfony/symfony" to "%s"</>', $this->symfonyRequire));
$this->io = null;
}
}

if ($symfonyPackages && !$oneSymfony) {
$filteredPackages = array_merge($filteredPackages, $symfonyPackages);
}

return $filteredPackages;
}

private function getVersions(): array
{
if (null !== $this->versions) {
return $this->versions;
}

$versions = $this->downloader->getVersions();
$this->downloader = null;
$okVersions = [];

if (!isset($versions['splits'])) {
throw new \LogicException('The Flex index is missing a "splits" entry. Did you forget to add "flex://defaults" in the "extra.symfony.endpoint" array of your composer.json?');
}
foreach ($versions['splits'] as $name => $vers) {
foreach ($vers as $i => $v) {
if (!isset($okVersions[$v])) {
$okVersions[$v] = false;
$w = '.x' === substr($v, -2) ? $versions['next'] : $v;

for ($j = 0; $j < 60; ++$j) {
if ($this->symfonyConstraints->matches(new Constraint('==', $w.'.'.$j.'.0'))) {
$okVersions[$v] = true;
break;
}
}
}

if (!$okVersions[$v]) {
unset($vers[$i]);
}
}

if (!$vers || $vers === $versions['splits'][$name]) {
unset($versions['splits'][$name]);
}
}

return $this->versions = $versions;
}
}
<?php










namespace Symfony\Flex;




class Path
{
private $workingDirectory;

public function __construct($workingDirectory)
{
$this->workingDirectory = $workingDirectory;
}

public function relativize(string $absolutePath): string
{
$relativePath = str_replace($this->workingDirectory, '.', $absolutePath);

return is_dir($absolutePath) ? rtrim($relativePath, '/').'/' : $relativePath;
}

public function concatenate(array $parts): string
{
$first = array_shift($parts);

return array_reduce($parts, function (string $initial, string $next): string {
return rtrim($initial, '/').'/'.ltrim($next, '/');
}, $first);
}
}
<?php










namespace Symfony\Flex\Command;

use Composer\Command\BaseCommand;
use Composer\Downloader\TransportException;
use Composer\Package\Package;
use Composer\Util\HttpDownloader;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Flex\GithubApi;
use Symfony\Flex\InformationOperation;
use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;




class RecipesCommand extends BaseCommand
{

private $flex;

private Lock $symfonyLock;
private GithubApi $githubApi;

public function __construct( $flex, Lock $symfonyLock, HttpDownloader $downloader)
{
$this->flex = $flex;
$this->symfonyLock = $symfonyLock;
$this->githubApi = new GithubApi($downloader);

parent::__construct();
}

protected function configure(): void
{
$this->setName('symfony:recipes')
->setAliases(['recipes'])
->setDescription('Shows information about all available recipes.')
->setDefinition([
new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect, if not provided all packages are.'),
])
->addOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only recipes that are outdated')
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository();


$package = $input->getArgument('package');
if (null !== $package) {
$packages = [strtolower($package)];
} else {
$locker = $this->getComposer()->getLocker();
$lockData = $locker->getLockData();


$packages = array_column(array_merge($lockData['packages'], $lockData['packages-dev']), 'name');
$packages = array_unique(array_merge($packages, array_keys($this->symfonyLock->all())));
}

$operations = [];
foreach ($packages as $name) {
$pkg = $installedRepo->findPackage($name, '*');

if (!$pkg && $this->symfonyLock->has($name)) {
$pkgVersion = $this->symfonyLock->get($name)['version'];
$pkg = new Package($name, $pkgVersion, $pkgVersion);
} elseif (!$pkg) {
$this->getIO()->writeError(\sprintf('<error>Package %s is not installed</error>', $name));

continue;
}

$operations[] = new InformationOperation($pkg);
}

$recipes = $this->flex->fetchRecipes($operations, false);
ksort($recipes);

$nbRecipe = \count($recipes);
if ($nbRecipe <= 0) {
$this->getIO()->writeError('<error>No recipe found</error>');

return 1;
}


if (1 === $nbRecipe) {
$this->displayPackageInformation(current($recipes));

return 0;
}

$outdated = $input->getOption('outdated');

$write = [];
$hasOutdatedRecipes = false;
foreach ($recipes as $name => $recipe) {
$lockRef = $this->symfonyLock->get($name)['recipe']['ref'] ?? null;

$additional = null;
if (null === $lockRef && null !== $recipe->getRef()) {
$additional = '<comment>(recipe not installed)</comment>';
} elseif ($recipe->getRef() !== $lockRef && !$recipe->isAuto()) {
$additional = '<comment>(update available)</comment>';
}

if ($outdated && null === $additional) {
continue;
}

$hasOutdatedRecipes = true;
$write[] = \sprintf(' * %s %s', $name, $additional);
}


if (!$hasOutdatedRecipes) {
return 0;
}

$this->getIO()->write(array_merge([
'',
'<bg=blue;fg=white>                      </>',
\sprintf('<bg=blue;fg=white> %s recipes.   </>', $outdated ? ' Outdated' : 'Available'),
'<bg=blue;fg=white>                      </>',
'',
], $write, [
'',
'Run:',
' * <info>composer recipes vendor/package</info> to see details about a recipe.',
' * <info>composer recipes:update vendor/package</info> to update that recipe.',
'',
]));

if ($outdated) {
return 1;
}

return 0;
}

private function displayPackageInformation(Recipe $recipe)
{
$io = $this->getIO();
$recipeLock = $this->symfonyLock->get($recipe->getName());

$lockRef = $recipeLock['recipe']['ref'] ?? null;
$lockRepo = $recipeLock['recipe']['repo'] ?? null;
$lockFiles = $recipeLock['files'] ?? null;
$lockBranch = $recipeLock['recipe']['branch'] ?? null;
$lockVersion = $recipeLock['recipe']['version'] ?? $recipeLock['version'] ?? null;

if ('master' === $lockBranch && \in_array($lockRepo, ['github.com/symfony/recipes', 'github.com/symfony/recipes-contrib'])) {
$lockBranch = 'main';
}

$status = '<comment>up to date</comment>';
if ($recipe->isAuto()) {
$status = '<comment>auto-generated recipe</comment>';
} elseif (null === $lockRef && null !== $recipe->getRef()) {
$status = '<comment>recipe not installed</comment>';
} elseif ($recipe->getRef() !== $lockRef) {
$status = '<comment>update available</comment>';
}

$gitSha = null;
$commitDate = null;
if (null !== $lockRef && null !== $lockRepo) {
try {
$recipeCommitData = $this->githubApi->findRecipeCommitDataFromTreeRef(
$recipe->getName(),
$lockRepo,
$lockBranch ?? '',
$lockVersion,
$lockRef
);
$gitSha = $recipeCommitData ? $recipeCommitData['commit'] : null;
$commitDate = $recipeCommitData ? $recipeCommitData['date'] : null;
} catch (TransportException $exception) {
$io->writeError('Error downloading exact git sha for installed recipe.');
}
}

$io->write('<info>name</info>             : '.$recipe->getName());
$io->write('<info>version</info>          : '.($lockVersion ?? 'n/a'));
$io->write('<info>status</info>           : '.$status);
if (!$recipe->isAuto() && null !== $lockVersion) {
$recipeUrl = \sprintf(
'https://%s/tree/%s/%s/%s',
$lockRepo,

$gitSha ?? $lockBranch,
$recipe->getName(),
$lockVersion
);

$io->write('<info>installed recipe</info> : '.$recipeUrl);
}

if ($lockRef !== $recipe->getRef()) {
$io->write('<info>latest recipe</info>    : '.$recipe->getURL());
}

if ($lockRef !== $recipe->getRef() && null !== $lockVersion) {
$historyUrl = \sprintf(
'https://%s/commits/%s/%s',
$lockRepo,
$lockBranch,
$recipe->getName()
);


if (null !== $commitDate) {
$historyUrl .= '?since=';
$historyUrl .= (new \DateTime($commitDate))
->setTimezone(new \DateTimeZone('UTC'))
->modify('+1 seconds')
->format('Y-m-d\TH:i:s\Z');
}

$io->write('<info>recipe history</info>   : '.$historyUrl);
}

if (null !== $lockFiles) {
$io->write('<info>files</info>            : ');
$io->write('');

$tree = $this->generateFilesTree($lockFiles);

$this->displayFilesTree($tree);
}

if ($lockRef !== $recipe->getRef()) {
$io->write([
'',
'Update this recipe by running:',
\sprintf('<info>composer recipes:update %s</info>', $recipe->getName()),
]);
}
}

private function generateFilesTree(array $files): array
{
$tree = [];
foreach ($files as $file) {
$path = explode('/', $file);

$tree = array_merge_recursive($tree, $this->addNode($path));
}

return $tree;
}

private function addNode(array $node): array
{
$current = array_shift($node);

$subTree = [];
if (null !== $current) {
$subTree[$current] = $this->addNode($node);
}

return $subTree;
}




private function displayFilesTree(array $tree)
{
end($tree);
$endKey = key($tree);
foreach ($tree as $dir => $files) {
$treeBar = '├';
$total = \count($files);
if (0 === $total || $endKey === $dir) {
$treeBar = '└';
}

$info = \sprintf(
'%s──%s',
$treeBar,
$dir
);
$this->writeTreeLine($info);

$treeBar = str_replace('└', ' ', $treeBar);

$this->displayTree($files, $treeBar);
}
}

private function displayTree(array $tree, $previousTreeBar = '├', $level = 1)
{
$previousTreeBar = str_replace('├', '│', $previousTreeBar);
$treeBar = $previousTreeBar.'  ├';

$i = 0;
$total = \count($tree);

foreach ($tree as $dir => $files) {
++$i;
if ($i === $total) {
$treeBar = $previousTreeBar.'  └';
}

$info = \sprintf(
'%s──%s',
$treeBar,
$dir
);
$this->writeTreeLine($info);

$treeBar = str_replace('└', ' ', $treeBar);

$this->displayTree($files, $treeBar, $level + 1);
}
}

private function writeTreeLine($line)
{
$io = $this->getIO();
if (!$io->isDecorated()) {
$line = str_replace(['└', '├', '──', '│'], ['`-', '|-', '-', '|'], $line);
}

$io->write($line);
}
}
<?php










namespace Symfony\Flex\Command;

use Composer\Command\BaseCommand;
use Composer\Config;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Flex\Options;

class DumpEnvCommand extends BaseCommand
{
private $config;
private $options;

public function __construct(Config $config, Options $options)
{
$this->config = $config;
$this->options = $options;

parent::__construct();
}

protected function configure(): void
{
$this->setName('symfony:dump-env')
->setAliases(['dump-env'])
->setDescription('Compiles .env files to .env.local.php.')
->setDefinition([
new InputArgument('env', InputArgument::OPTIONAL, 'The application environment to dump .env files for - e.g. "prod".'),
])
->addOption('empty', null, InputOption::VALUE_NONE, 'Ignore the content of .env files')
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$runtime = $this->options->get('runtime') ?? [];
$envKey = $runtime['env_var_name'] ?? 'APP_ENV';

if ($env = $input->getArgument('env') ?? $runtime['env'] ?? null) {
$_SERVER[$envKey] = $env;
}

$path = $this->options->get('root-dir').'/'.($runtime['dotenv_path'] ?? '.env');
$GLOBALS['SYMFONY_DOTENV_VARS'] = [];

if (!$env || !$input->getOption('empty')) {
$vars = $this->loadEnv($path, $env, $runtime);
$env = $vars[$envKey];
}

if ($input->getOption('empty')) {
$vars = [$envKey => $env];
}

$vars = var_export($vars, true);

foreach ($GLOBALS['SYMFONY_DOTENV_VARS'] as $k => $v) {
$k = var_export($k, true);
$vars = str_replace($v, "'.(\$_ENV[{$k}] ?? ".(str_starts_with($k, "'HTTP_") ? '' : "\$_SERVER[{$k}] ?? ")."'').'", $vars);
}
unset($GLOBALS['SYMFONY_DOTENV_VARS']);
$vars = strtr($vars, [
"''.(" => '(',
").''.(" => ').(',
").''" => ')',
]);

$vars = <<<EOF
            <?php

            // This file was generated by running "composer dump-env $env"

            return $vars;

            EOF;
file_put_contents($path.'.local.php', $vars, \LOCK_EX);

$this->getIO()->writeError('Successfully dumped .env files in <info>.env.local.php</>');

return 0;
}

private function loadEnv(string $path, ?string $env, array $runtime): array
{
if (!file_exists($autoloadFile = $this->config->get('vendor-dir').'/autoload.php')) {
throw new \RuntimeException(\sprintf('Please run "composer install" before running this command: "%s" not found.', $autoloadFile));
}

require $autoloadFile;

if (!class_exists(Dotenv::class)) {
throw new \RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
}

$envKey = $runtime['env_var_name'] ?? 'APP_ENV';
$globalsBackup = [$_SERVER, $_ENV];
unset($_SERVER[$envKey]);
$_ENV = [$envKey => $env];
$_SERVER['SYMFONY_DOTENV_VARS'] = implode(',', array_keys($_SERVER));
putenv('SYMFONY_DOTENV_VARS='.$_SERVER['SYMFONY_DOTENV_VARS']);

try {
$dotenv = new Dotenv();

if (!$env && file_exists($p = "$path.local")) {
$env = $_ENV[$envKey] = $dotenv->parse(file_get_contents($p), $p)[$envKey] ?? null;
}

if (!$env) {
throw new \RuntimeException(\sprintf('Please provide the name of the environment either by passing it as command line argument or by defining the "%s" variable in the ".env.local" file.', $envKey));
}

$testEnvs = $runtime['test_envs'] ?? ['test'];

$dotenv->loadEnv($path, $envKey, 'dev', $testEnvs);

unset($_ENV['SYMFONY_DOTENV_VARS'], $_ENV['SYMFONY_DOTENV_PATH']);
$env = $_ENV;
} finally {
[$_SERVER, $_ENV] = $globalsBackup;
}

return $env;
}
}

namespace Symfony\Component\Dotenv;

function getenv(?string $name = null, bool $local_only = false): string|array|false
{
if (null === $name) {
return \getenv($name, $local_only);
}

return $GLOBALS['SYMFONY_DOTENV_VARS'][$name] ??= md5(random_bytes(10));
}
<?php










namespace Symfony\Flex\Command;

use Composer\Command\BaseCommand;
use Composer\DependencyResolver\Operation\InstallOperation;
use Composer\Util\ProcessExecutor;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Flex\Event\UpdateEvent;
use Symfony\Flex\Flex;

class InstallRecipesCommand extends BaseCommand
{

private $flex;
private $rootDir;
private $dotenvPath;

public function __construct( $flex, string $rootDir, string $dotenvPath = '.env')
{
$this->flex = $flex;
$this->rootDir = $rootDir;
$this->dotenvPath = $dotenvPath;

parent::__construct();
}

protected function configure(): void
{
$this->setName('symfony:recipes:install')
->setAliases(['recipes:install', 'symfony:sync-recipes', 'sync-recipes', 'fix-recipes'])
->setDescription('Installs or reinstalls recipes for already installed packages.')
->addArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Recipes that should be installed.')
->addOption('force', null, InputOption::VALUE_NONE, 'Overwrite existing files when a new version of a recipe is available')
->addOption('reset', null, InputOption::VALUE_NONE, 'Reset all recipes back to their initial state (should be combined with --force)')
->addOption('yes', null, InputOption::VALUE_NONE, "Answer prompt questions with 'yes' for all questions.")
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$win = '\\' === \DIRECTORY_SEPARATOR;
$force = (bool) $input->getOption('force');

if ($force && !@is_executable(strtok(exec($win ? 'where git' : 'command -v git'), \PHP_EOL))) {
throw new RuntimeException('Cannot run "sync-recipes --force": git not found.');
}

$symfonyLock = $this->flex->getLock();
$composer = $this->getComposer();
$locker = $composer->getLocker();
$lockData = $locker->getLockData();

$packages = [];
$totalPackages = [];
foreach ($lockData['packages'] as $pkg) {
$totalPackages[] = $pkg['name'];
if ($force || !$symfonyLock->has($pkg['name'])) {
$packages[] = $pkg['name'];
}
}
foreach ($lockData['packages-dev'] as $pkg) {
$totalPackages[] = $pkg['name'];
if ($force || !$symfonyLock->has($pkg['name'])) {
$packages[] = $pkg['name'];
}
}

$io = $this->getIO();

if (!$io->isVerbose()) {
$io->writeError([
'Run command with <info>-v</info> to see more details',
'',
]);
}

if ($targetPackages = $input->getArgument('packages')) {
if ($invalidPackages = array_diff($targetPackages, $totalPackages)) {
$io->writeError(\sprintf('<warning>Cannot update: some packages are not installed:</warning> %s', implode(', ', $invalidPackages)));

return 1;
}

if ($packagesRequiringForce = array_diff($targetPackages, $packages)) {
$io->writeError(\sprintf('Recipe(s) already installed for: <info>%s</info>', implode(', ', $packagesRequiringForce)));
$io->writeError('Re-run the command with <info>--force</info> to re-install the recipes.');
$io->writeError('');
}

$packages = array_diff($targetPackages, $packagesRequiringForce);
}

if (!$packages) {
$io->writeError('No recipes to install.');

return 0;
}

$composer = $this->getComposer();
$installedRepo = $composer->getRepositoryManager()->getLocalRepository();

$operations = [];
foreach ($packages as $package) {
if (null === $pkg = $installedRepo->findPackage($package, '*')) {
$io->writeError(\sprintf('<error>Package %s is not installed</>', $package));

return 1;
}

$operations[] = new InstallOperation($pkg);
}

$dotenvFile = $this->dotenvPath;
$dotenvPath = $this->rootDir.'/'.$dotenvFile;

if ($createEnvLocal = $force && file_exists($dotenvPath) && file_exists($dotenvPath.'.dist') && !file_exists($dotenvPath.'.local')) {
rename($dotenvPath, $dotenvPath.'.local');
$pipes = [];
proc_close(proc_open(\sprintf('git mv %s %s > %s 2>&1 || %s %1$s %2$s', ProcessExecutor::escape($dotenvFile.'.dist'), ProcessExecutor::escape($dotenvFile), $win ? 'NUL' : '/dev/null', $win ? 'rename' : 'mv'), $pipes, $pipes, $this->rootDir));
if (file_exists($this->rootDir.'/phpunit.xml.dist') || file_exists($this->rootDir.'/phpunit.dist.xml')) {
touch($dotenvPath.'.test');
}
}

$this->flex->update(new UpdateEvent($force, (bool) $input->getOption('reset'), (bool) $input->getOption('yes')), $operations);

if ($force) {
$output = [
'',
'<bg=blue;fg=white>                                                            </>',
'<bg=blue;fg=white> Files have been reset to the latest version of the recipe. </>',
'<bg=blue;fg=white>                                                            </>',
'',
'  * Use <comment>git diff</> to inspect the changes.',
'',
'    Not all of the changes will be relevant to your app: you now',
'    need to selectively add or revert them using e.g. a combination',
'    of <comment>git add -p</> and <comment>git checkout -p</>',
'',
];

if ($createEnvLocal) {
$output[] = '    Dotenv files have been renamed: .env -> .env.local and .env.dist -> .env';
$output[] = '    See https://symfony.com/doc/current/configuration/dot-env-changes.html';
$output[] = '';
}

$output[] = '  * Use <comment>git checkout .</> to revert the changes.';
$output[] = '';

if ($createEnvLocal) {
$root = '.' !== $this->rootDir ? $this->rootDir.'/' : '';
$output[] = '    To revert the changes made to .env files, run';
$output[] = \sprintf('    <comment>git mv %s %s</> && <comment>%s %s %1$s</>', ProcessExecutor::escape($root.$dotenvFile), ProcessExecutor::escape($root.$dotenvFile.'.dist'), $win ? 'rename' : 'mv', ProcessExecutor::escape($root.$dotenvFile.'.local'));
$output[] = '';
}

$output[] = '    New (untracked) files can be inspected using <comment>git clean --dry-run</>';
$output[] = '    Add the new files you want to keep using <comment>git add</>';
$output[] = '    then delete the rest using <comment>git clean --force</>';
$output[] = '';

$io->write($output);
}

return 0;
}
}
<?php










namespace Symfony\Flex\Command;

use Composer\Command\BaseCommand;
use Composer\IO\IOInterface;
use Composer\Package\Package;
use Composer\Package\PackageInterface;
use Composer\Util\ProcessExecutor;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Flex\Configurator;
use Symfony\Flex\Downloader;
use Symfony\Flex\Flex;
use Symfony\Flex\GithubApi;
use Symfony\Flex\InformationOperation;
use Symfony\Flex\Lock;
use Symfony\Flex\Recipe;
use Symfony\Flex\Update\RecipePatcher;
use Symfony\Flex\Update\RecipeUpdate;

class UpdateRecipesCommand extends BaseCommand
{

private $flex;
private $downloader;
private $configurator;
private $rootDir;
private $githubApi;
private $processExecutor;

public function __construct( $flex, Downloader $downloader, $httpDownloader, Configurator $configurator, string $rootDir)
{
$this->flex = $flex;
$this->downloader = $downloader;
$this->configurator = $configurator;
$this->rootDir = $rootDir;
$this->githubApi = new GithubApi($httpDownloader);

parent::__construct();
}

protected function configure(): void
{
$this->setName('symfony:recipes:update')
->setAliases(['recipes:update'])
->setDescription('Updates an already-installed recipe to the latest version.')
->addArgument('package', InputArgument::OPTIONAL, 'Recipe that should be updated.')
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$win = '\\' === \DIRECTORY_SEPARATOR;
$runtimeExceptionClass = class_exists(RuntimeException::class) ? RuntimeException::class : \RuntimeException::class;
if (!@is_executable(strtok(exec($win ? 'where git' : 'command -v git'), \PHP_EOL))) {
throw new $runtimeExceptionClass('Cannot run "recipes:update": git not found.');
}

$io = $this->getIO();
if (!$this->isIndexClean($io)) {
$io->write([
'  Cannot run <comment>recipes:update</comment>: Your git index contains uncommitted changes.',
'  Please commit or stash them and try again!',
]);

return 1;
}

$packageName = $input->getArgument('package');
$symfonyLock = $this->flex->getLock();
if (!$packageName) {
$packageName = $this->askForPackage($io, $symfonyLock);

if (null === $packageName) {
$io->writeError('All packages appear to be up-to-date!');

return 0;
}
}

if (!$symfonyLock->has($packageName)) {
$io->writeError([
'Package not found inside symfony.lock. It looks like it\'s not installed?',
\sprintf('Try running <info>composer recipes:install %s --force -v</info> to re-install the recipe.', $packageName),
]);

return 1;
}

$packageLockData = $symfonyLock->get($packageName);
if (!isset($packageLockData['recipe'])) {
$io->writeError([
'It doesn\'t look like this package had a recipe when it was originally installed.',
'To install the latest version of the recipe, if there is one, run:',
\sprintf('  <info>composer recipes:install %s --force -v</info>', $packageName),
]);

return 1;
}

$recipeRef = $packageLockData['recipe']['ref'] ?? null;
$recipeVersion = $packageLockData['recipe']['version'] ?? null;
if (!$recipeRef || !$recipeVersion) {
$io->writeError([
'The version of the installed recipe was not saved into symfony.lock.',
'This is possible if it was installed by an old version of Symfony Flex.',
'Update the recipe by re-installing the latest version with:',
\sprintf('  <info>composer recipes:install %s --force -v</info>', $packageName),
]);

return 1;
}

$installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository();
$package = $installedRepo->findPackage($packageName, '*') ?? new Package($packageName, $packageLockData['version'], $packageLockData['version']);
$originalRecipe = $this->getRecipe($package, $recipeRef, $recipeVersion);

if (null === $originalRecipe) {
$io->writeError([
'The original recipe version you have installed could not be found, it may be too old.',
'Update the recipe by re-installing the latest version with:',
\sprintf('  <info>composer recipes:install %s --force -v</info>', $packageName),
]);

return 1;
}

$newRecipe = $this->getRecipe($package);

if ($newRecipe->getRef() === $originalRecipe->getRef()) {
$io->write(\sprintf('This recipe for <info>%s</info> is already at the latest version.', $packageName));

return 0;
}

$io->write([
\sprintf('  Updating recipe for <info>%s</info>...', $packageName),
'',
]);

$recipeUpdate = new RecipeUpdate($originalRecipe, $newRecipe, $symfonyLock, $this->rootDir);
$this->configurator->populateUpdate($recipeUpdate);
$originalComposerJsonHash = $this->flex->getComposerJsonHash();
$patcher = new RecipePatcher($this->rootDir, $io, $symfonyLock);

try {
$patch = $patcher->generatePatch($recipeUpdate->getOriginalFiles(), $recipeUpdate->getNewFiles());
$hasConflicts = !$patcher->applyPatch($patch, $packageName);
} catch (\Throwable $throwable) {
$io->writeError([
'<bg=red;fg=white>There was an error applying the recipe update patch</>',
$throwable->getMessage(),
'',
'Update the recipe by re-installing the latest version with:',
\sprintf('  <info>composer recipes:install %s --force -v</info>', $packageName),
]);

return 1;
}

$symfonyLock->add($packageName, $newRecipe->getLock());
$this->flex->finish($this->rootDir, $originalComposerJsonHash);


$cmdOutput = '';
$this->getProcessExecutor()->execute('git add symfony.lock', $cmdOutput, $this->rootDir);

$io->write([
'  <bg=blue;fg=white>                      </>',
'  <bg=blue;fg=white> Yes! Recipe updated! </>',
'  <bg=blue;fg=white>                      </>',
'',
]);

if ($hasConflicts) {
$io->write([
'  The recipe was updated but with <bg=red;fg=white>one or more conflicts</>.',
'  Run <comment>git status</comment> to see them.',
'  After resolving, commit your changes like normal.',
]);
} else {
if (!$patch->getPatch()) {

$io->write([
'  No files were changed as a result of the update.',
]);
} else {
$io->write([
'  Run <comment>git status</comment> or <comment>git diff --cached</comment> to see the changes.',
'  When you\'re ready, commit these changes like normal.',
]);
}
}

if (0 !== \count($recipeUpdate->getCopyFromPackagePaths())) {
$io->write([
'',
'  <bg=red;fg=white>NOTE:</>',
'  This recipe copies the following paths from the bundle into your app:',
]);
foreach ($recipeUpdate->getCopyFromPackagePaths() as $source => $target) {
$io->write(\sprintf('  * %s => %s', $source, $target));
}
$io->write([
'',
'  The recipe updater has no way of knowing if these files have changed since you originally installed the recipe.',
'  And so, no updates were made to these paths.',
]);
}

if (0 !== \count($patch->getRemovedPatches())) {
if (1 === \count($patch->getRemovedPatches())) {
$notes = [
\sprintf('  The file <comment>%s</comment> was not updated because it doesn\'t exist in your app.', array_keys($patch->getRemovedPatches())[0]),
];
} else {
$notes = ['  The following files were not updated because they don\'t exist in your app:'];
foreach ($patch->getRemovedPatches() as $filename => $contents) {
$notes[] = \sprintf('    * <comment>%s</comment>', $filename);
}
}
$io->write([
'',
'  <bg=red;fg=white>NOTE:</>',
]);
$io->write($notes);
$io->write('');
if ($io->askConfirmation('  Would you like to save the "diff" to a file so you can review it? (Y/n) ')) {
$patchFilename = str_replace('/', '.', $packageName).'.updates-for-deleted-files.patch';
file_put_contents($this->rootDir.'/'.$patchFilename, implode("\n", $patch->getRemovedPatches()));
$io->write([
'',
\sprintf('  Saved diff to <info>%s</info>', $patchFilename),
]);
}
}

if ($patch->getPatch()) {
$io->write('');
$io->write('  Calculating CHANGELOG...', false);
$changelog = $this->generateChangelog($originalRecipe);
$io->write("\r", false); 
if ($changelog) {
$io->write($changelog);
} else {
$io->write('No CHANGELOG could be calculated.');
}
}

return 0;
}

private function getRecipe(PackageInterface $package, ?string $recipeRef = null, ?string $recipeVersion = null): ?Recipe
{
$operation = new InformationOperation($package);
if (null !== $recipeRef) {
$operation->setSpecificRecipeVersion($recipeRef, $recipeVersion);
}
$recipes = $this->downloader->getRecipes([$operation]);

if (0 === \count($recipes['manifests'] ?? [])) {
return null;
}

return new Recipe(
$package,
$package->getName(),
$operation->getOperationType(),
$recipes['manifests'][$package->getName()],
$recipes['locks'][$package->getName()] ?? []
);
}

private function generateChangelog(Recipe $originalRecipe): ?array
{
$recipeData = $originalRecipe->getLock()['recipe'] ?? null;
if (null === $recipeData) {
return null;
}

if (!isset($recipeData['ref']) || !isset($recipeData['repo']) || !isset($recipeData['branch']) || !isset($recipeData['version'])) {
return null;
}

$currentRecipeVersionData = $this->githubApi->findRecipeCommitDataFromTreeRef(
$originalRecipe->getName(),
$recipeData['repo'],
$recipeData['branch'],
$recipeData['version'],
$recipeData['ref']
);

if (!$currentRecipeVersionData) {
return null;
}

$recipeVersions = $this->githubApi->getVersionsOfRecipe(
$recipeData['repo'],
$recipeData['branch'],
$originalRecipe->getName()
);
if (!$recipeVersions) {
return null;
}

$newerRecipeVersions = array_filter($recipeVersions, function ($version) use ($recipeData) {
return version_compare($version, $recipeData['version'], '>');
});

$newCommits = $currentRecipeVersionData['new_commits'];
foreach ($newerRecipeVersions as $newerRecipeVersion) {
$newCommits = array_merge(
$newCommits,
$this->githubApi->getCommitDataForPath($recipeData['repo'], $originalRecipe->getName().'/'.$newerRecipeVersion, $recipeData['branch'])
);
}

$newCommits = array_unique($newCommits);
asort($newCommits);

$pullRequests = [];
foreach ($newCommits as $commit => $date) {
$pr = $this->githubApi->getPullRequestForCommit($commit, $recipeData['repo']);
if ($pr) {
$pullRequests[$pr['number']] = $pr;
}
}

$lines = [];

$handlesHrefGracefully = 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR')
&& (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100);
foreach ($pullRequests as $number => $data) {
$url = $data['url'];
if ($handlesHrefGracefully) {
$url = "\033]8;;$url\033\\$number\033]8;;\033\\";
}
$lines[] = \sprintf('  * %s (PR %s)', $data['title'], $url);
}

return $lines;
}

private function askForPackage(IOInterface $io, Lock $symfonyLock): ?string
{
$installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository();

$operations = [];
foreach ($symfonyLock->all() as $name => $lock) {
if (isset($lock['recipe']['ref'])) {
$package = $installedRepo->findPackage($name, '*') ?? new Package($name, $lock['version'], $lock['version']);
$operations[] = new InformationOperation($package);
}
}

$recipes = $this->flex->fetchRecipes($operations, false);
ksort($recipes);

$outdatedRecipes = [];
foreach ($recipes as $name => $recipe) {
$lockRef = $symfonyLock->get($name)['recipe']['ref'] ?? null;

if (null !== $lockRef && $recipe->getRef() !== $lockRef && !$recipe->isAuto()) {
$outdatedRecipes[] = $name;
}
}

if (0 === \count($outdatedRecipes)) {
return null;
}

$question = 'Which outdated recipe would you like to update? (default: <info>0</info>)';

$choice = $io->select(
$question,
$outdatedRecipes,
0
);

return $outdatedRecipes[$choice];
}

private function isIndexClean(IOInterface $io): bool
{
$output = '';

$this->getProcessExecutor()->execute('git status --porcelain --untracked-files=no', $output, $this->rootDir);
if ('' !== trim($output)) {
return false;
}

return true;
}

private function getProcessExecutor(): ProcessExecutor
{
if (null === $this->processExecutor) {
$this->processExecutor = new ProcessExecutor($this->getIO());
}

return $this->processExecutor;
}
}
<?php










namespace Symfony\Flex;

use Composer\Factory;
use Composer\Package\Version\VersionParser;
use Composer\Repository\PlatformRepository;
use Composer\Semver\Constraint\MatchAllConstraint;




class PackageResolver
{
private static $SYMFONY_VERSIONS = ['lts', 'previous', 'stable', 'next', 'dev'];
private $downloader;

public function __construct(Downloader $downloader)
{
$this->downloader = $downloader;
}

public function resolve(array $arguments = [], bool $isRequire = false): array
{

$packages = [];
foreach ($arguments as $i => $argument) {
if ((false !== $pos = strpos($argument, ':')) || (false !== $pos = strpos($argument, '='))) {
$package = $this->resolvePackageName(substr($argument, 0, $pos), $i, $isRequire);
$version = substr($argument, $pos + 1);
$packages[] = $package.':'.$version;
} else {
$packages[] = $this->resolvePackageName($argument, $i, $isRequire);
}
}


$versionParser = new VersionParser();
$requires = [];
$toGuess = [];
foreach ($versionParser->parseNameVersionPairs($packages) as $package) {
$version = $this->parseVersion($package['name'], $package['version'] ?? '', $isRequire);
if ('' !== $version) {
unset($toGuess[$package['name']]);
} elseif (!isset($requires[$package['name']])) {
$toGuess[$package['name']] = new MatchAllConstraint();
}
$requires[$package['name']] = $package['name'].$version;
}

if ($toGuess && $isRequire) {
foreach ($this->downloader->getSymfonyPacks($toGuess) as $package) {
$requires[$package] .= ':*';
}
}

return array_values($requires);
}

public function parseVersion(string $package, string $version, bool $isRequire): string
{
$guess = 'guess' === ($version ?: 'guess');

if (!str_starts_with($package, 'symfony/')) {
return $guess ? '' : ':'.$version;
}

$versions = $this->downloader->getVersions();

if (!isset($versions['splits'][$package])) {
return $guess ? '' : ':'.$version;
}

if ($guess || '*' === $version) {
try {
$config = @json_decode(file_get_contents(Factory::getComposerFile()), true);
} finally {
if (!$isRequire || !isset($config['extra']['symfony']['require'])) {
return '';
}
}
$version = $config['extra']['symfony']['require'];
} elseif ('dev' === $version) {
$version = '^'.$versions['dev-name'].'@dev';
} elseif ('next' === $version) {
$version = '^'.$versions[$version].'@dev';
} elseif (\in_array($version, self::$SYMFONY_VERSIONS, true)) {
$version = '^'.$versions[$version];
}

return ':'.$version;
}

private function resolvePackageName(string $argument, int $position, bool $isRequire): string
{
$skippedPackages = ['mirrors', 'nothing', ''];

if (!$isRequire) {
$skippedPackages[] = 'lock';
}

if (str_contains($argument, '/') || preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $argument) || preg_match('{(?<=[a-z0-9_/-])\*|\*(?=[a-z0-9_/-])}i', $argument) || \in_array($argument, $skippedPackages)) {
return $argument;
}

$aliases = $this->downloader->getAliases();

if (isset($aliases[$argument])) {
$argument = $aliases[$argument];
} else {

try {
$versionParser = new VersionParser();
$versionParser->parseConstraints($argument);
} catch (\UnexpectedValueException $e) {

if (!\in_array($argument, self::$SYMFONY_VERSIONS, true)) {
$this->throwAlternatives($argument, $position);
}
}
}

return $argument;
}




private function throwAlternatives(string $argument, int $position)
{
$alternatives = [];
foreach ($this->downloader->getAliases() as $alias => $package) {
$lev = levenshtein($argument, $alias);
if ($lev <= \strlen($argument) / 3 || ('' !== $argument && str_contains($alias, $argument))) {
$alternatives[$package][] = $alias;
}
}


if ($alternatives || 0 === $position) {
$message = \sprintf('"%s" is not a valid alias.', $argument);
if ($alternatives) {
if (1 === \count($alternatives)) {
$message .= " Did you mean this:\n";
} else {
$message .= " Did you mean one of these:\n";
}
foreach ($alternatives as $package => $aliases) {
$message .= \sprintf("  \"%s\", supported aliases: \"%s\"\n", $package, implode('", "', $aliases));
}
}
} else {
$message = \sprintf('Could not parse version constraint "%s".', $argument);
}

throw new \UnexpectedValueException($message);
}
}
<?php

namespace Symfony\Flex;

use Composer\DependencyResolver\Operation\OperationInterface;
use Composer\Package\PackageInterface;




class InformationOperation implements OperationInterface
{
private $package;
private $recipeRef;
private $version;

public function __construct(PackageInterface $package)
{
$this->package = $package;
}






public function setSpecificRecipeVersion(string $recipeRef, string $version)
{
$this->recipeRef = $recipeRef;
$this->version = $version;
}






public function getPackage()
{
return $this->package;
}

public function getRecipeRef(): ?string
{
return $this->recipeRef;
}

public function getVersion(): ?string
{
return $this->version;
}

public function getJobType()
{
return 'information';
}




public function getOperationType()
{
return 'information';
}




public function show($lock)
{
$pretty = method_exists($this->package, 'getFullPrettyVersion') ? $this->package->getFullPrettyVersion() : $this->formatVersion($this->package);

return 'Information '.$this->package->getPrettyName().' ('.$pretty.')';
}

public function __toString()
{
return $this->show(false);
}




public function getReason()
{
return null;
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\LogicException;
use Symfony\Component\Process\Exception\RuntimeException;




























class PhpSubprocess extends Process
{








public function __construct(array $command, ?string $cwd = null, ?array $env = null, int $timeout = 60, ?array $php = null)
{
if (null === $php) {
$executableFinder = new PhpExecutableFinder();
$php = $executableFinder->find(false);
$php = false === $php ? null : array_merge([$php], $executableFinder->findArguments());
}

if (null === $php) {
throw new RuntimeException('Unable to find PHP binary.');
}

$tmpIni = $this->writeTmpIni($this->getAllIniFiles(), sys_get_temp_dir());

$php = array_merge($php, ['-n', '-c', $tmpIni]);
register_shutdown_function('unlink', $tmpIni);

$command = array_merge($php, $command);

parent::__construct($command, $cwd, $env, null, $timeout);
}

public static function fromShellCommandline(string $command, ?string $cwd = null, ?array $env = null, mixed $input = null, ?float $timeout = 60): static
{
throw new LogicException(\sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class));
}

public function start(?callable $callback = null, array $env = []): void
{
if (null === $this->getCommandLine()) {
throw new RuntimeException('Unable to find the PHP executable.');
}

parent::start($callback, $env);
}

private function writeTmpIni(array $iniFiles, string $tmpDir): string
{
if (false === $tmpfile = @tempnam($tmpDir, '')) {
throw new RuntimeException('Unable to create temporary ini file.');
}


if ('' === $iniFiles[0]) {
array_shift($iniFiles);
}

$content = '';

foreach ($iniFiles as $file) {

if (($data = @file_get_contents($file)) === false) {
throw new RuntimeException('Unable to read ini: '.$file);
}

if (preg_match('/^\s*\[(?:PATH|HOST)\s*=/mi', $data, $matches, \PREG_OFFSET_CAPTURE)) {
$data = substr($data, 0, $matches[0][1]);
}

$content .= $data."\n";
}


$config = parse_ini_string($content);
$loaded = ini_get_all(null, false);

if (false === $config || false === $loaded) {
throw new RuntimeException('Unable to parse ini data.');
}

$content .= $this->mergeLoadedConfig($loaded, $config);


$content .= "opcache.enable_cli=0\n";

if (false === @file_put_contents($tmpfile, $content)) {
throw new RuntimeException('Unable to write temporary ini file.');
}

return $tmpfile;
}

private function mergeLoadedConfig(array $loadedConfig, array $iniConfig): string
{
$content = '';

foreach ($loadedConfig as $name => $value) {
if (!\is_string($value)) {
continue;
}

if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) {

$content .= $name.'="'.addcslashes($value, '\\"')."\"\n";
}
}

return $content;
}

private function getAllIniFiles(): array
{
$paths = [(string) php_ini_loaded_file()];

if (false !== $scanned = php_ini_scanned_files()) {
$paths = array_merge($paths, array_map('trim', explode(',', $scanned)));
}

return $paths;
}
}
<?php










namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\LogicException;
use Symfony\Component\Process\Exception\RuntimeException;










class PhpProcess extends Process
{







public function __construct(string $script, ?string $cwd = null, ?array $env = null, int $timeout = 60, ?array $php = null)
{
if (null === $php) {
$executableFinder = new PhpExecutableFinder();
$php = $executableFinder->find(false);
$php = false === $php ? null : array_merge([$php], $executableFinder->findArguments());
}
if ('phpdbg' === \PHP_SAPI) {
$file = tempnam(sys_get_temp_dir(), 'dbg');
file_put_contents($file, $script);
register_shutdown_function('unlink', $file);
$php[] = $file;
$script = null;
}

parent::__construct($php, $cwd, $env, $script, $timeout);
}

public static function fromShellCommandline(string $command, ?string $cwd = null, ?array $env = null, mixed $input = null, ?float $timeout = 60): static
{
throw new LogicException(\sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class));
}




public function start(?callable $callback = null, array $env = [])
{
if (null === $this->getCommandLine()) {
throw new RuntimeException('Unable to find the PHP executable.');
}

parent::start($callback, $env);
}
}
<?php










namespace Symfony\Component\Process;







class ExecutableFinder
{
private const CMD_BUILTINS = [
'assoc', 'break', 'call', 'cd', 'chdir', 'cls', 'color', 'copy', 'date',
'del', 'dir', 'echo', 'endlocal', 'erase', 'exit', 'for', 'ftype', 'goto',
'help', 'if', 'label', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause',
'popd', 'prompt', 'pushd', 'rd', 'rem', 'ren', 'rename', 'rmdir', 'set',
'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'vol',
];

private array $suffixes = [];






public function setSuffixes(array $suffixes)
{
$this->suffixes = $suffixes;
}






public function addSuffix(string $suffix)
{
$this->suffixes[] = $suffix;
}








public function find(string $name, ?string $default = null, array $extraDirs = []): ?string
{

if ('\\' === \DIRECTORY_SEPARATOR && \in_array(strtolower($name), self::CMD_BUILTINS, true)) {
return $name;
}

$dirs = array_merge(
explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
$extraDirs
);

$suffixes = [];
if ('\\' === \DIRECTORY_SEPARATOR) {
$pathExt = getenv('PATHEXT');
$suffixes = $this->suffixes;
$suffixes = array_merge($suffixes, $pathExt ? explode(\PATH_SEPARATOR, $pathExt) : ['.exe', '.bat', '.cmd', '.com']);
}
$suffixes = '' !== pathinfo($name, \PATHINFO_EXTENSION) ? array_merge([''], $suffixes) : array_merge($suffixes, ['']);
foreach ($suffixes as $suffix) {
foreach ($dirs as $dir) {
if ('' === $dir) {
$dir = '.';
}
if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) {
return $file;
}

if (!@is_dir($dir) && basename($dir) === $name.$suffix && @is_executable($dir)) {
return $dir;
}
}
}

if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('exec') || \strlen($name) !== strcspn($name, '/'.\DIRECTORY_SEPARATOR)) {
return $default;
}

$execResult = exec('command -v -- '.escapeshellarg($name));

if (($executablePath = substr($execResult, 0, strpos($execResult, \PHP_EOL) ?: null)) && @is_executable($executablePath)) {
return $executablePath;
}

return $default;
}
}
<?php










namespace Symfony\Component\Process;







class PhpExecutableFinder
{
private ExecutableFinder $executableFinder;

public function __construct()
{
$this->executableFinder = new ExecutableFinder();
}




public function find(bool $includeArgs = true): string|false
{
if ($php = getenv('PHP_BINARY')) {
if (!is_executable($php) && !$php = $this->executableFinder->find($php)) {
return false;
}

if (@is_dir($php)) {
return false;
}

return $php;
}

$args = $this->findArguments();
$args = $includeArgs && $args ? ' '.implode(' ', $args) : '';


if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cli', 'cli-server', 'phpdbg'], true)) {
return \PHP_BINARY.$args;
}

if ($php = getenv('PHP_PATH')) {
if (!@is_executable($php) || @is_dir($php)) {
return false;
}

return $php;
}

if ($php = getenv('PHP_PEAR_PHP_BIN')) {
if (@is_executable($php) && !@is_dir($php)) {
return $php;
}
}

if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) {
return $php;
}

$dirs = [\PHP_BINDIR];
if ('\\' === \DIRECTORY_SEPARATOR) {
$dirs[] = 'C:\xampp\php\\';
}

return $this->executableFinder->find('php', false, $dirs);
}




public function findArguments(): array
{
$arguments = [];
if ('phpdbg' === \PHP_SAPI) {
$arguments[] = '-qrr';
}

return $arguments;
}
}
<?php










namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\RuntimeException;

/**
@implements




*/
class InputStream implements \IteratorAggregate
{
private ?\Closure $onEmpty = null;
private array $input = [];
private bool $open = true;






public function onEmpty(?callable $onEmpty = null)
{
$this->onEmpty = null !== $onEmpty ? $onEmpty(...) : null;
}









public function write(mixed $input)
{
if (null === $input) {
return;
}
if ($this->isClosed()) {
throw new RuntimeException(\sprintf('"%s" is closed.', static::class));
}
$this->input[] = ProcessUtils::validateInput(__METHOD__, $input);
}






public function close()
{
$this->open = false;
}






public function isClosed()
{
return !$this->open;
}

public function getIterator(): \Traversable
{
$this->open = true;

while ($this->open || $this->input) {
if (!$this->input) {
yield '';
continue;
}
$current = array_shift($this->input);

if ($current instanceof \Iterator) {
yield from $current;
} else {
yield $current;
}
if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) {
$this->write($onEmpty($this));
}
}
}
}
<?php










namespace Symfony\Component\Process\Pipes;

use Symfony\Component\Process\Exception\RuntimeException;
use Symfony\Component\Process\Process;











class WindowsPipes extends AbstractPipes
{
private array $files = [];
private array $fileHandles = [];
private array $lockHandles = [];
private array $readBytes = [
Process::STDOUT => 0,
Process::STDERR => 0,
];
private bool $haveReadSupport;

public function __construct(mixed $input, bool $haveReadSupport)
{
$this->haveReadSupport = $haveReadSupport;

if ($this->haveReadSupport) {




$pipes = [
Process::STDOUT => Process::OUT,
Process::STDERR => Process::ERR,
];
$tmpDir = sys_get_temp_dir();
$lastError = 'unknown reason';
set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; });
for ($i = 0;; ++$i) {
foreach ($pipes as $pipe => $name) {
$file = \sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name);

if (!$h = fopen($file.'.lock', 'w')) {
if (file_exists($file.'.lock')) {
continue 2;
}
restore_error_handler();
throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError);
}
if (!flock($h, \LOCK_EX | \LOCK_NB)) {
continue 2;
}
if (isset($this->lockHandles[$pipe])) {
flock($this->lockHandles[$pipe], \LOCK_UN);
fclose($this->lockHandles[$pipe]);
}
$this->lockHandles[$pipe] = $h;

if (!($h = fopen($file, 'w')) || !fclose($h) || !$h = fopen($file, 'r')) {
flock($this->lockHandles[$pipe], \LOCK_UN);
fclose($this->lockHandles[$pipe]);
unset($this->lockHandles[$pipe]);
continue 2;
}
$this->fileHandles[$pipe] = $h;
$this->files[$pipe] = $file;
}
break;
}
restore_error_handler();
}

parent::__construct($input);
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
$this->close();
}

public function getDescriptors(): array
{
if (!$this->haveReadSupport) {
$nullstream = fopen('NUL', 'c');

return [
['pipe', 'r'],
$nullstream,
$nullstream,
];
}




return [
['pipe', 'r'],
['file', 'NUL', 'w'],
['file', 'NUL', 'w'],
];
}

public function getFiles(): array
{
return $this->files;
}

public function readAndWrite(bool $blocking, bool $close = false): array
{
$this->unblock();
$w = $this->write();
$read = $r = $e = [];

if ($blocking) {
if ($w) {
@stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6);
} elseif ($this->fileHandles) {
usleep((int) (Process::TIMEOUT_PRECISION * 1E6));
}
}
foreach ($this->fileHandles as $type => $fileHandle) {
$data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]);

if (isset($data[0])) {
$this->readBytes[$type] += \strlen($data);
$read[$type] = $data;
}
if ($close) {
ftruncate($fileHandle, 0);
fclose($fileHandle);
flock($this->lockHandles[$type], \LOCK_UN);
fclose($this->lockHandles[$type]);
unset($this->fileHandles[$type], $this->lockHandles[$type]);
}
}

return $read;
}

public function haveReadSupport(): bool
{
return $this->haveReadSupport;
}

public function areOpen(): bool
{
return $this->pipes && $this->fileHandles;
}

public function close(): void
{
parent::close();
foreach ($this->fileHandles as $type => $handle) {
ftruncate($handle, 0);
fclose($handle);
flock($this->lockHandles[$type], \LOCK_UN);
fclose($this->lockHandles[$type]);
}
$this->fileHandles = $this->lockHandles = [];
}
}
<?php










namespace Symfony\Component\Process\Pipes;

use Symfony\Component\Process\Exception\InvalidArgumentException;






abstract class AbstractPipes implements PipesInterface
{
public array $pipes = [];

private string $inputBuffer = '';

private $input;
private bool $blocked = true;
private ?string $lastError = null;




public function __construct($input)
{
if (\is_resource($input) || $input instanceof \Iterator) {
$this->input = $input;
} else {
$this->inputBuffer = (string) $input;
}
}

public function close(): void
{
foreach ($this->pipes as $pipe) {
if (\is_resource($pipe)) {
fclose($pipe);
}
}
$this->pipes = [];
}






protected function hasSystemCallBeenInterrupted(): bool
{
$lastError = $this->lastError;
$this->lastError = null;

if (null === $lastError) {
return false;
}

if (false !== stripos($lastError, 'interrupted system call')) {
return true;
}




return \defined('SOCKET_EINTR') && str_starts_with($lastError, 'stream_select(): Unable to select ['.\SOCKET_EINTR.']');
}




protected function unblock(): void
{
if (!$this->blocked) {
return;
}

foreach ($this->pipes as $pipe) {
stream_set_blocking($pipe, false);
}
if (\is_resource($this->input)) {
stream_set_blocking($this->input, false);
}

$this->blocked = false;
}






protected function write(): ?array
{
if (!isset($this->pipes[0])) {
return null;
}
$input = $this->input;

if ($input instanceof \Iterator) {
if (!$input->valid()) {
$input = null;
} elseif (\is_resource($input = $input->current())) {
stream_set_blocking($input, false);
} elseif (!isset($this->inputBuffer[0])) {
if (!\is_string($input)) {
if (!\is_scalar($input)) {
throw new InvalidArgumentException(\sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input)));
}
$input = (string) $input;
}
$this->inputBuffer = $input;
$this->input->next();
$input = null;
} else {
$input = null;
}
}

$r = $e = [];
$w = [$this->pipes[0]];


if (false === @stream_select($r, $w, $e, 0, 0)) {
return null;
}

foreach ($w as $stdin) {
if (isset($this->inputBuffer[0])) {
$written = fwrite($stdin, $this->inputBuffer);
$this->inputBuffer = substr($this->inputBuffer, $written);
if (isset($this->inputBuffer[0])) {
return [$this->pipes[0]];
}
}

if ($input) {
while (true) {
$data = fread($input, self::CHUNK_SIZE);
if (!isset($data[0])) {
break;
}
$written = fwrite($stdin, $data);
$data = substr($data, $written);
if (isset($data[0])) {
$this->inputBuffer = $data;

return [$this->pipes[0]];
}
}
if (feof($input)) {
if ($this->input instanceof \Iterator) {
$this->input->next();
} else {
$this->input = null;
}
}
}
}


if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) {
$this->input = null;
fclose($this->pipes[0]);
unset($this->pipes[0]);
} elseif (!$w) {
return [$this->pipes[0]];
}

return null;
}




public function handleError(int $type, string $msg): void
{
$this->lastError = $msg;
}
}
<?php










namespace Symfony\Component\Process\Pipes;








interface PipesInterface
{
public const CHUNK_SIZE = 16384;




public function getDescriptors(): array;






public function getFiles(): array;









public function readAndWrite(bool $blocking, bool $close = false): array;




public function areOpen(): bool;




public function haveReadSupport(): bool;




public function close(): void;
}
<?php










namespace Symfony\Component\Process\Pipes;

use Symfony\Component\Process\Process;








class UnixPipes extends AbstractPipes
{
private ?bool $ttyMode;
private bool $ptyMode;
private bool $haveReadSupport;

public function __construct(?bool $ttyMode, bool $ptyMode, mixed $input, bool $haveReadSupport)
{
$this->ttyMode = $ttyMode;
$this->ptyMode = $ptyMode;
$this->haveReadSupport = $haveReadSupport;

parent::__construct($input);
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
$this->close();
}

public function getDescriptors(): array
{
if (!$this->haveReadSupport) {
$nullstream = fopen('/dev/null', 'c');

return [
['pipe', 'r'],
$nullstream,
$nullstream,
];
}

if ($this->ttyMode) {
return [
['file', '/dev/tty', 'r'],
['file', '/dev/tty', 'w'],
['file', '/dev/tty', 'w'],
];
}

if ($this->ptyMode && Process::isPtySupported()) {
return [
['pty'],
['pty'],
['pipe', 'w'], 
];
}

return [
['pipe', 'r'],
['pipe', 'w'], 
['pipe', 'w'], 
];
}

public function getFiles(): array
{
return [];
}

public function readAndWrite(bool $blocking, bool $close = false): array
{
$this->unblock();
$w = $this->write();

$read = $e = [];
$r = $this->pipes;
unset($r[0]);


set_error_handler($this->handleError(...));
if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) {
restore_error_handler();


if (!$this->hasSystemCallBeenInterrupted()) {
$this->pipes = [];
}

return $read;
}
restore_error_handler();

foreach ($r as $pipe) {


$read[$type = array_search($pipe, $this->pipes, true)] = '';

do {
$data = @fread($pipe, self::CHUNK_SIZE);
$read[$type] .= $data;
} while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1])));

if (!isset($read[$type][0])) {
unset($read[$type]);
}

if ($close && feof($pipe)) {
fclose($pipe);
unset($this->pipes[$type]);
}
}

return $read;
}

public function haveReadSupport(): bool
{
return $this->haveReadSupport;
}

public function areOpen(): bool
{
return (bool) $this->pipes;
}
}
<?php










namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Process;






class ProcessFailedException extends RuntimeException
{
private Process $process;

public function __construct(Process $process)
{
if ($process->isSuccessful()) {
throw new InvalidArgumentException('Expected a failed process, but the given process was successful.');
}

$error = \sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s",
$process->getCommandLine(),
$process->getExitCode(),
$process->getExitCodeText(),
$process->getWorkingDirectory()
);

if (!$process->isOutputDisabled()) {
$error .= \sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s",
$process->getOutput(),
$process->getErrorOutput()
);
}

parent::__construct($error);

$this->process = $process;
}




public function getProcess()
{
return $this->process;
}
}
<?php










namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Messenger\RunProcessContext;




final class RunProcessFailedException extends RuntimeException
{
public function __construct(ProcessFailedException $exception, public readonly RunProcessContext $context)
{
parent::__construct($exception->getMessage(), $exception->getCode());
}
}
<?php










namespace Symfony\Component\Process\Exception;






class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Process\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Process\Exception;






class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Process;






class ProcessTimedOutException extends RuntimeException
{
public const TYPE_GENERAL = 1;
public const TYPE_IDLE = 2;

private Process $process;
private int $timeoutType;

public function __construct(Process $process, int $timeoutType)
{
$this->process = $process;
$this->timeoutType = $timeoutType;

parent::__construct(\sprintf(
'The process "%s" exceeded the timeout of %s seconds.',
$process->getCommandLine(),
$this->getExceededTimeout()
));
}




public function getProcess()
{
return $this->process;
}




public function isGeneralTimeout()
{
return self::TYPE_GENERAL === $this->timeoutType;
}




public function isIdleTimeout()
{
return self::TYPE_IDLE === $this->timeoutType;
}

public function getExceededTimeout(): ?float
{
return match ($this->timeoutType) {
self::TYPE_GENERAL => $this->process->getTimeout(),
self::TYPE_IDLE => $this->process->getIdleTimeout(),
default => throw new \LogicException(\sprintf('Unknown timeout type "%d".', $this->timeoutType)),
};
}
}
<?php










namespace Symfony\Component\Process\Exception;






class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Process;






final class ProcessSignaledException extends RuntimeException
{
private Process $process;

public function __construct(Process $process)
{
$this->process = $process;

parent::__construct(\sprintf('The process has been signaled with signal "%s".', $process->getTermSignal()));
}

public function getProcess(): Process
{
return $this->process;
}

public function getSignal(): int
{
return $this->getProcess()->getTermSignal();
}
}
<?php










namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\InvalidArgumentException;
use Symfony\Component\Process\Exception\LogicException;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Exception\ProcessSignaledException;
use Symfony\Component\Process\Exception\ProcessTimedOutException;
use Symfony\Component\Process\Exception\RuntimeException;
use Symfony\Component\Process\Pipes\UnixPipes;
use Symfony\Component\Process\Pipes\WindowsPipes;

/**
@implements






*/
class Process implements \IteratorAggregate
{
public const ERR = 'err';
public const OUT = 'out';

public const STATUS_READY = 'ready';
public const STATUS_STARTED = 'started';
public const STATUS_TERMINATED = 'terminated';

public const STDIN = 0;
public const STDOUT = 1;
public const STDERR = 2;


public const TIMEOUT_PRECISION = 0.2;

public const ITER_NON_BLOCKING = 1; 
public const ITER_KEEP_OUTPUT = 2; 
public const ITER_SKIP_OUT = 4; 
public const ITER_SKIP_ERR = 8; 

private ?\Closure $callback = null;
private array|string $commandline;
private ?string $cwd;
private array $env = [];

private $input;
private ?float $starttime = null;
private ?float $lastOutputTime = null;
private ?float $timeout = null;
private ?float $idleTimeout = null;
private ?int $exitcode = null;
private array $fallbackStatus = [];
private array $processInformation;
private bool $outputDisabled = false;

private $stdout;

private $stderr;

private $process;
private string $status = self::STATUS_READY;
private int $incrementalOutputOffset = 0;
private int $incrementalErrorOutputOffset = 0;
private bool $tty = false;
private bool $pty;
private array $options = ['suppress_errors' => true, 'bypass_shell' => true];

private WindowsPipes|UnixPipes $processPipes;

private ?int $latestSignal = null;

private static ?bool $sigchild = null;






public static $exitCodes = [
0 => 'OK',
1 => 'General error',
2 => 'Misuse of shell builtins',

126 => 'Invoked command cannot execute',
127 => 'Command not found',
128 => 'Invalid exit argument',


129 => 'Hangup',
130 => 'Interrupt',
131 => 'Quit and dump core',
132 => 'Illegal instruction',
133 => 'Trace/breakpoint trap',
134 => 'Process aborted',
135 => 'Bus error: "access to undefined portion of memory object"',
136 => 'Floating point exception: "erroneous arithmetic operation"',
137 => 'Kill (terminate immediately)',
138 => 'User-defined 1',
139 => 'Segmentation violation',
140 => 'User-defined 2',
141 => 'Write to pipe with no one reading',
142 => 'Signal raised by alarm',
143 => 'Termination (request to terminate)',

145 => 'Child process terminated, stopped (or continued*)',
146 => 'Continue if stopped',
147 => 'Stop executing temporarily',
148 => 'Terminal stop signal',
149 => 'Background process attempting to read from tty ("in")',
150 => 'Background process attempting to write to tty ("out")',
151 => 'Urgent data available on socket',
152 => 'CPU time limit exceeded',
153 => 'File size limit exceeded',
154 => 'Signal raised by timer counting virtual time: "virtual timer expired"',
155 => 'Profiling timer expired',

157 => 'Pollable event',

159 => 'Bad syscall',
];










public function __construct(array $command, ?string $cwd = null, ?array $env = null, mixed $input = null, ?float $timeout = 60)
{
if (!\function_exists('proc_open')) {
throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.');
}

$this->commandline = $command;
$this->cwd = $cwd;





if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) {
$this->cwd = getcwd();
}
if (null !== $env) {
$this->setEnv($env);
}

$this->setInput($input);
$this->setTimeout($timeout);
$this->pty = false;
}






















public static function fromShellCommandline(string $command, ?string $cwd = null, ?array $env = null, mixed $input = null, ?float $timeout = 60): static
{
$process = new static([], $cwd, $env, $input, $timeout);
$process->commandline = $command;

return $process;
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
if ($this->options['create_new_console'] ?? false) {
$this->processPipes->close();
} else {
$this->stop(0);
}
}

public function __clone()
{
$this->resetProcessData();
}
























public function run(?callable $callback = null, array $env = []): int
{
$this->start($callback, $env);

return $this->wait();
}













public function mustRun(?callable $callback = null, array $env = []): static
{
if (0 !== $this->run($callback, $env)) {
throw new ProcessFailedException($this);
}

return $this;
}






















public function start(?callable $callback = null, array $env = [])
{
if ($this->isRunning()) {
throw new RuntimeException('Process is already running.');
}

$this->resetProcessData();
$this->starttime = $this->lastOutputTime = microtime(true);
$this->callback = $this->buildCallback($callback);
$descriptors = $this->getDescriptors(null !== $callback);

if ($this->env) {
$env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->env, $env, 'strcasecmp') : $this->env;
}

$env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->getDefaultEnv(), $env, 'strcasecmp') : $this->getDefaultEnv();

if (\is_array($commandline = $this->commandline)) {
$commandline = implode(' ', array_map($this->escapeArgument(...), $commandline));

if ('\\' !== \DIRECTORY_SEPARATOR) {

$commandline = 'exec '.$commandline;
}
} else {
$commandline = $this->replacePlaceholders($commandline, $env);
}

if ('\\' === \DIRECTORY_SEPARATOR) {
$commandline = $this->prepareWindowsCommandLine($commandline, $env);
} elseif ($this->isSigchildEnabled()) {

$descriptors[3] = ['pipe', 'w'];


$commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;';
$commandline .= 'pid=$!; echo $pid >&3; wait $pid 2>/dev/null; code=$?; echo $code >&3; exit $code';
}

$envPairs = [];
foreach ($env as $k => $v) {
if (false !== $v && false === \in_array($k, ['argc', 'argv', 'ARGC', 'ARGV'], true)) {
$envPairs[] = $k.'='.$v;
}
}

if (!is_dir($this->cwd)) {
throw new RuntimeException(\sprintf('The provided cwd "%s" does not exist.', $this->cwd));
}

$process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options);

if (!$process) {
throw new RuntimeException('Unable to launch a new process.');
}
$this->process = $process;
$this->status = self::STATUS_STARTED;

if (isset($descriptors[3])) {
$this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]);
}

if ($this->tty) {
return;
}

$this->updateStatus(false);
$this->checkTimeout();
}
















public function restart(?callable $callback = null, array $env = []): static
{
if ($this->isRunning()) {
throw new RuntimeException('Process is already running.');
}

$process = clone $this;
$process->start($callback, $env);

return $process;
}
















public function wait(?callable $callback = null): int
{
$this->requireProcessIsStarted(__FUNCTION__);

$this->updateStatus(false);

if (null !== $callback) {
if (!$this->processPipes->haveReadSupport()) {
$this->stop(0);
throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".');
}
$this->callback = $this->buildCallback($callback);
}

do {
$this->checkTimeout();
$running = $this->isRunning() && ('\\' === \DIRECTORY_SEPARATOR || $this->processPipes->areOpen());
$this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
} while ($running);

while ($this->isRunning()) {
$this->checkTimeout();
usleep(1000);
}

if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) {
throw new ProcessSignaledException($this);
}

return $this->exitcode;
}












public function waitUntil(callable $callback): bool
{
$this->requireProcessIsStarted(__FUNCTION__);
$this->updateStatus(false);

if (!$this->processPipes->haveReadSupport()) {
$this->stop(0);
throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".');
}
$callback = $this->buildCallback($callback);

$ready = false;
while (true) {
$this->checkTimeout();
$running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
$output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);

foreach ($output as $type => $data) {
if (3 !== $type) {
$ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready;
} elseif (!isset($this->fallbackStatus['signaled'])) {
$this->fallbackStatus['exitcode'] = (int) $data;
}
}
if ($ready) {
return true;
}
if (!$running) {
return false;
}

usleep(1000);
}
}






public function getPid(): ?int
{
return $this->isRunning() ? $this->processInformation['pid'] : null;
}












public function signal(int $signal): static
{
$this->doSignal($signal, true);

return $this;
}









public function disableOutput(): static
{
if ($this->isRunning()) {
throw new RuntimeException('Disabling output while the process is running is not possible.');
}
if (null !== $this->idleTimeout) {
throw new LogicException('Output cannot be disabled while an idle timeout is set.');
}

$this->outputDisabled = true;

return $this;
}








public function enableOutput(): static
{
if ($this->isRunning()) {
throw new RuntimeException('Enabling output while the process is running is not possible.');
}

$this->outputDisabled = false;

return $this;
}




public function isOutputDisabled(): bool
{
return $this->outputDisabled;
}







public function getOutput(): string
{
$this->readPipesForOutput(__FUNCTION__);

if (false === $ret = stream_get_contents($this->stdout, -1, 0)) {
return '';
}

return $ret;
}










public function getIncrementalOutput(): string
{
$this->readPipesForOutput(__FUNCTION__);

$latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset);
$this->incrementalOutputOffset = ftell($this->stdout);

if (false === $latest) {
return '';
}

return $latest;
}











public function getIterator(int $flags = 0): \Generator
{
$this->readPipesForOutput(__FUNCTION__, false);

$clearOutput = !(self::ITER_KEEP_OUTPUT & $flags);
$blocking = !(self::ITER_NON_BLOCKING & $flags);
$yieldOut = !(self::ITER_SKIP_OUT & $flags);
$yieldErr = !(self::ITER_SKIP_ERR & $flags);

while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) {
if ($yieldOut) {
$out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset);

if (isset($out[0])) {
if ($clearOutput) {
$this->clearOutput();
} else {
$this->incrementalOutputOffset = ftell($this->stdout);
}

yield self::OUT => $out;
}
}

if ($yieldErr) {
$err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset);

if (isset($err[0])) {
if ($clearOutput) {
$this->clearErrorOutput();
} else {
$this->incrementalErrorOutputOffset = ftell($this->stderr);
}

yield self::ERR => $err;
}
}

if (!$blocking && !isset($out[0]) && !isset($err[0])) {
yield self::OUT => '';
}

$this->checkTimeout();
$this->readPipesForOutput(__FUNCTION__, $blocking);
}
}






public function clearOutput(): static
{
ftruncate($this->stdout, 0);
fseek($this->stdout, 0);
$this->incrementalOutputOffset = 0;

return $this;
}







public function getErrorOutput(): string
{
$this->readPipesForOutput(__FUNCTION__);

if (false === $ret = stream_get_contents($this->stderr, -1, 0)) {
return '';
}

return $ret;
}











public function getIncrementalErrorOutput(): string
{
$this->readPipesForOutput(__FUNCTION__);

$latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset);
$this->incrementalErrorOutputOffset = ftell($this->stderr);

if (false === $latest) {
return '';
}

return $latest;
}






public function clearErrorOutput(): static
{
ftruncate($this->stderr, 0);
fseek($this->stderr, 0);
$this->incrementalErrorOutputOffset = 0;

return $this;
}






public function getExitCode(): ?int
{
$this->updateStatus(false);

return $this->exitcode;
}












public function getExitCodeText(): ?string
{
if (null === $exitcode = $this->getExitCode()) {
return null;
}

return self::$exitCodes[$exitcode] ?? 'Unknown error';
}




public function isSuccessful(): bool
{
return 0 === $this->getExitCode();
}








public function hasBeenSignaled(): bool
{
$this->requireProcessIsTerminated(__FUNCTION__);

return $this->processInformation['signaled'];
}









public function getTermSignal(): int
{
$this->requireProcessIsTerminated(__FUNCTION__);

if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) {
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal cannot be retrieved.');
}

return $this->processInformation['termsig'];
}








public function hasBeenStopped(): bool
{
$this->requireProcessIsTerminated(__FUNCTION__);

return $this->processInformation['stopped'];
}








public function getStopSignal(): int
{
$this->requireProcessIsTerminated(__FUNCTION__);

return $this->processInformation['stopsig'];
}




public function isRunning(): bool
{
if (self::STATUS_STARTED !== $this->status) {
return false;
}

$this->updateStatus(false);

return $this->processInformation['running'];
}




public function isStarted(): bool
{
return self::STATUS_READY != $this->status;
}




public function isTerminated(): bool
{
$this->updateStatus(false);

return self::STATUS_TERMINATED == $this->status;
}






public function getStatus(): string
{
$this->updateStatus(false);

return $this->status;
}









public function stop(float $timeout = 10, ?int $signal = null): ?int
{
$timeoutMicro = microtime(true) + $timeout;
if ($this->isRunning()) {

$this->doSignal(15, false);
do {
usleep(1000);
} while ($this->isRunning() && microtime(true) < $timeoutMicro);

if ($this->isRunning()) {


$this->doSignal($signal ?: 9, false);
}
}

if ($this->isRunning()) {
if (isset($this->fallbackStatus['pid'])) {
unset($this->fallbackStatus['pid']);

return $this->stop(0, $signal);
}
$this->close();
}

return $this->exitcode;
}






public function addOutput(string $line): void
{
$this->lastOutputTime = microtime(true);

fseek($this->stdout, 0, \SEEK_END);
fwrite($this->stdout, $line);
fseek($this->stdout, $this->incrementalOutputOffset);
}






public function addErrorOutput(string $line): void
{
$this->lastOutputTime = microtime(true);

fseek($this->stderr, 0, \SEEK_END);
fwrite($this->stderr, $line);
fseek($this->stderr, $this->incrementalErrorOutputOffset);
}




public function getLastOutputTime(): ?float
{
return $this->lastOutputTime;
}




public function getCommandLine(): string
{
return \is_array($this->commandline) ? implode(' ', array_map($this->escapeArgument(...), $this->commandline)) : $this->commandline;
}




public function getTimeout(): ?float
{
return $this->timeout;
}




public function getIdleTimeout(): ?float
{
return $this->idleTimeout;
}










public function setTimeout(?float $timeout): static
{
$this->timeout = $this->validateTimeout($timeout);

return $this;
}











public function setIdleTimeout(?float $timeout): static
{
if (null !== $timeout && $this->outputDisabled) {
throw new LogicException('Idle timeout cannot be set while the output is disabled.');
}

$this->idleTimeout = $this->validateTimeout($timeout);

return $this;
}








public function setTty(bool $tty): static
{
if ('\\' === \DIRECTORY_SEPARATOR && $tty) {
throw new RuntimeException('TTY mode is not supported on Windows platform.');
}

if ($tty && !self::isTtySupported()) {
throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.');
}

$this->tty = $tty;

return $this;
}




public function isTty(): bool
{
return $this->tty;
}






public function setPty(bool $bool): static
{
$this->pty = $bool;

return $this;
}




public function isPty(): bool
{
return $this->pty;
}




public function getWorkingDirectory(): ?string
{
if (null === $this->cwd) {


return getcwd() ?: null;
}

return $this->cwd;
}






public function setWorkingDirectory(string $cwd): static
{
$this->cwd = $cwd;

return $this;
}




public function getEnv(): array
{
return $this->env;
}








public function setEnv(array $env): static
{
$this->env = $env;

return $this;
}






public function getInput()
{
return $this->input;
}












public function setInput(mixed $input): static
{
if ($this->isRunning()) {
throw new LogicException('Input cannot be set while the process is running.');
}

$this->input = ProcessUtils::validateInput(__METHOD__, $input);

return $this;
}











public function checkTimeout()
{
if (self::STATUS_STARTED !== $this->status) {
return;
}

if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) {
$this->stop(0);

throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL);
}

if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) {
$this->stop(0);

throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE);
}
}




public function getStartTime(): float
{
if (!$this->isStarted()) {
throw new LogicException('Start time is only available after process start.');
}

return $this->starttime;
}











public function setOptions(array $options)
{
if ($this->isRunning()) {
throw new RuntimeException('Setting options while the process is running is not possible.');
}

$defaultOptions = $this->options;
$existingOptions = ['blocking_pipes', 'create_process_group', 'create_new_console'];

foreach ($options as $key => $value) {
if (!\in_array($key, $existingOptions)) {
$this->options = $defaultOptions;
throw new LogicException(\sprintf('Invalid option "%s" passed to "%s()". Supported options are "%s".', $key, __METHOD__, implode('", "', $existingOptions)));
}
$this->options[$key] = $value;
}
}




public static function isTtySupported(): bool
{
static $isTtySupported;

return $isTtySupported ??= ('/' === \DIRECTORY_SEPARATOR && stream_isatty(\STDOUT) && @is_writable('/dev/tty'));
}




public static function isPtySupported(): bool
{
static $result;

if (null !== $result) {
return $result;
}

if ('\\' === \DIRECTORY_SEPARATOR) {
return $result = false;
}

return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes);
}




private function getDescriptors(bool $hasCallback): array
{
if ($this->input instanceof \Iterator) {
$this->input->rewind();
}
if ('\\' === \DIRECTORY_SEPARATOR) {
$this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $hasCallback);
} else {
$this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $hasCallback);
}

return $this->processPipes->getDescriptors();
}









protected function buildCallback(?callable $callback = null): \Closure
{
if ($this->outputDisabled) {
return fn ($type, $data): bool => null !== $callback && $callback($type, $data);
}

$out = self::OUT;

return function ($type, $data) use ($callback, $out): bool {
if ($out == $type) {
$this->addOutput($data);
} else {
$this->addErrorOutput($data);
}

return null !== $callback && $callback($type, $data);
};
}








protected function updateStatus(bool $blocking)
{
if (self::STATUS_STARTED !== $this->status) {
return;
}

if ($this->processInformation['running'] ?? true) {
$this->processInformation = proc_get_status($this->process);
}
$running = $this->processInformation['running'];

$this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running);

if ($this->fallbackStatus && $this->isSigchildEnabled()) {
$this->processInformation = $this->fallbackStatus + $this->processInformation;
}

if (!$running) {
$this->close();
}
}




protected function isSigchildEnabled(): bool
{
if (null !== self::$sigchild) {
return self::$sigchild;
}

if (!\function_exists('phpinfo')) {
return self::$sigchild = false;
}

ob_start();
phpinfo(\INFO_GENERAL);

return self::$sigchild = str_contains(ob_get_clean(), '--enable-sigchild');
}









private function readPipesForOutput(string $caller, bool $blocking = false): void
{
if ($this->outputDisabled) {
throw new LogicException('Output has been disabled.');
}

$this->requireProcessIsStarted($caller);

$this->updateStatus($blocking);
}






private function validateTimeout(?float $timeout): ?float
{
$timeout = (float) $timeout;

if (0.0 === $timeout) {
$timeout = null;
} elseif ($timeout < 0) {
throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.');
}

return $timeout;
}







private function readPipes(bool $blocking, bool $close): void
{
$result = $this->processPipes->readAndWrite($blocking, $close);

$callback = $this->callback;
foreach ($result as $type => $data) {
if (3 !== $type) {
$callback(self::STDOUT === $type ? self::OUT : self::ERR, $data);
} elseif (!isset($this->fallbackStatus['signaled'])) {
$this->fallbackStatus['exitcode'] = (int) $data;
}
}
}






private function close(): int
{
$this->processPipes->close();
if ($this->process) {
proc_close($this->process);
$this->process = null;
}
$this->exitcode = $this->processInformation['exitcode'];
$this->status = self::STATUS_TERMINATED;

if (-1 === $this->exitcode) {
if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {

$this->exitcode = 128 + $this->processInformation['termsig'];
} elseif ($this->isSigchildEnabled()) {
$this->processInformation['signaled'] = true;
$this->processInformation['termsig'] = -1;
}
}




$this->callback = null;

return $this->exitcode;
}




private function resetProcessData(): void
{
$this->starttime = null;
$this->callback = null;
$this->exitcode = null;
$this->fallbackStatus = [];
$this->processInformation = [];
$this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+');
$this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+');
$this->process = null;
$this->latestSignal = null;
$this->status = self::STATUS_READY;
$this->incrementalOutputOffset = 0;
$this->incrementalErrorOutputOffset = 0;
}











private function doSignal(int $signal, bool $throwException): bool
{
if (null === $pid = $this->getPid()) {
if ($throwException) {
throw new LogicException('Cannot send signal on a non running process.');
}

return false;
}

if ('\\' === \DIRECTORY_SEPARATOR) {
exec(\sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode);
if ($exitCode && $this->isRunning()) {
if ($throwException) {
throw new RuntimeException(\sprintf('Unable to kill the process (%s).', implode(' ', $output)));
}

return false;
}
} else {
if (!$this->isSigchildEnabled()) {
$ok = @proc_terminate($this->process, $signal);
} elseif (\function_exists('posix_kill')) {
$ok = @posix_kill($pid, $signal);
} elseif ($ok = proc_open(\sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) {
$ok = false === fgets($pipes[2]);
}
if (!$ok) {
if ($throwException) {
throw new RuntimeException(\sprintf('Error while sending signal "%s".', $signal));
}

return false;
}
}

$this->latestSignal = $signal;
$this->fallbackStatus['signaled'] = true;
$this->fallbackStatus['exitcode'] = -1;
$this->fallbackStatus['termsig'] = $this->latestSignal;

return true;
}

private function prepareWindowsCommandLine(string $cmd, array &$env): string
{
$uid = uniqid('', true);
$cmd = preg_replace_callback(
'/"(?:(
                [^"%!^]*+
                (?:
                    (?: !LF! | "(?:\^[%!^])?+" )
                    [^"%!^]*+
                )++
            ) | [^"]*+ )"/x',
function ($m) use (&$env, $uid) {
static $varCount = 0;
static $varCache = [];
if (!isset($m[1])) {
return $m[0];
}
if (isset($varCache[$m[0]])) {
return $varCache[$m[0]];
}
if (str_contains($value = $m[1], "\0")) {
$value = str_replace("\0", '?', $value);
}
if (false === strpbrk($value, "\"%!\n")) {
return '"'.$value.'"';
}

$value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value);
$value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"';
$var = $uid.++$varCount;

$env[$var] = $value;

return $varCache[$m[0]] = '!'.$var.'!';
},
$cmd
);

static $comSpec;

if (!$comSpec && $comSpec = (new ExecutableFinder())->find('cmd.exe')) {

$comSpec = '"'.preg_replace('{(\\\\*+)"}', '$1$1\"', $comSpec).'"';
}

$cmd = ($comSpec ?? 'cmd').' /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')';
foreach ($this->processPipes->getFiles() as $offset => $filename) {
$cmd .= ' '.$offset.'>"'.$filename.'"';
}

return $cmd;
}






private function requireProcessIsStarted(string $functionName): void
{
if (!$this->isStarted()) {
throw new LogicException(\sprintf('Process must be started before calling "%s()".', $functionName));
}
}






private function requireProcessIsTerminated(string $functionName): void
{
if (!$this->isTerminated()) {
throw new LogicException(\sprintf('Process must be terminated before calling "%s()".', $functionName));
}
}




private function escapeArgument(?string $argument): string
{
if ('' === $argument || null === $argument) {
return '""';
}
if ('\\' !== \DIRECTORY_SEPARATOR) {
return "'".str_replace("'", "'\\''", $argument)."'";
}
if (str_contains($argument, "\0")) {
$argument = str_replace("\0", '?', $argument);
}
if (!preg_match('/[()%!^"<>&|\s]/', $argument)) {
return $argument;
}
$argument = preg_replace('/(\\\\+)$/', '$1$1', $argument);

return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"';
}

private function replacePlaceholders(string $commandline, array $env): string
{
return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) {
if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) {
throw new InvalidArgumentException(\sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline);
}

return $this->escapeArgument($env[$matches[1]]);
}, $commandline);
}

private function getDefaultEnv(): array
{
$env = getenv();
$env = ('\\' === \DIRECTORY_SEPARATOR ? array_intersect_ukey($env, $_SERVER, 'strcasecmp') : array_intersect_key($env, $_SERVER)) ?: $env;

return $_ENV + ('\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($env, $_ENV, 'strcasecmp') : $env);
}
}
<?php










namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\InvalidArgumentException;








class ProcessUtils
{



private function __construct()
{
}









public static function validateInput(string $caller, mixed $input): mixed
{
if (null !== $input) {
if (\is_resource($input)) {
return $input;
}
if (\is_scalar($input)) {
return (string) $input;
}
if ($input instanceof Process) {
return $input->getIterator($input::ITER_SKIP_ERR);
}
if ($input instanceof \Iterator) {
return $input;
}
if ($input instanceof \Traversable) {
return new \IteratorIterator($input);
}

throw new InvalidArgumentException(\sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller));
}

return $input;
}
}
<?php










namespace Symfony\Component\Process\Messenger;

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Exception\RunProcessFailedException;
use Symfony\Component\Process\Process;




final class RunProcessMessageHandler
{
public function __invoke(RunProcessMessage $message): RunProcessContext
{
$process = new Process($message->command, $message->cwd, $message->env, $message->input, $message->timeout);

try {
return new RunProcessContext($message, $process->mustRun());
} catch (ProcessFailedException $e) {
throw new RunProcessFailedException($e, new RunProcessContext($message, $e->getProcess()));
}
}
}
<?php










namespace Symfony\Component\Process\Messenger;

use Symfony\Component\Process\Process;




final class RunProcessContext
{
public readonly ?int $exitCode;
public readonly ?string $output;
public readonly ?string $errorOutput;

public function __construct(
public readonly RunProcessMessage $message,
Process $process,
) {
$this->exitCode = $process->getExitCode();
$this->output = $process->isOutputDisabled() ? null : $process->getOutput();
$this->errorOutput = $process->isOutputDisabled() ? null : $process->getErrorOutput();
}
}
<?php










namespace Symfony\Component\Process\Messenger;




class RunProcessMessage implements \Stringable
{
public function __construct(
public readonly array $command,
public readonly ?string $cwd = null,
public readonly ?array $env = null,
public readonly mixed $input = null,
public readonly ?float $timeout = 60.0,
) {
}

public function __toString(): string
{
return implode(' ', $this->command);
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class ChainRequestMatcher implements RequestMatcherInterface
{



public function __construct(private iterable $matchers)
{
}

public function matches(Request $request): bool
{
foreach ($this->matchers as $matcher) {
if (!$matcher->matches($request)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class ResponseHeaderBag extends HeaderBag
{
public const COOKIES_FLAT = 'flat';
public const COOKIES_ARRAY = 'array';

public const DISPOSITION_ATTACHMENT = 'attachment';
public const DISPOSITION_INLINE = 'inline';

protected array $computedCacheControl = [];
protected array $cookies = [];
protected array $headerNames = [];

public function __construct(array $headers = [])
{
parent::__construct($headers);

if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}


if (!isset($this->headers['date'])) {
$this->initDate();
}
}




public function allPreserveCase(): array
{
$headers = [];
foreach ($this->all() as $name => $value) {
$headers[$this->headerNames[$name] ?? $name] = $value;
}

return $headers;
}

public function allPreserveCaseWithoutCookies(): array
{
$headers = $this->allPreserveCase();
if (isset($this->headerNames['set-cookie'])) {
unset($headers[$this->headerNames['set-cookie']]);
}

return $headers;
}

public function replace(array $headers = []): void
{
$this->headerNames = [];

parent::replace($headers);

if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}

if (!isset($this->headers['date'])) {
$this->initDate();
}
}

public function all(?string $key = null): array
{
$headers = parent::all();

if (null !== $key) {
$key = strtr($key, self::UPPER, self::LOWER);

return 'set-cookie' !== $key ? $headers[$key] ?? [] : array_map('strval', $this->getCookies());
}

foreach ($this->getCookies() as $cookie) {
$headers['set-cookie'][] = (string) $cookie;
}

return $headers;
}

public function set(string $key, string|array|null $values, bool $replace = true): void
{
$uniqueKey = strtr($key, self::UPPER, self::LOWER);

if ('set-cookie' === $uniqueKey) {
if ($replace) {
$this->cookies = [];
}
foreach ((array) $values as $cookie) {
$this->setCookie(Cookie::fromString($cookie));
}
$this->headerNames[$uniqueKey] = $key;

return;
}

$this->headerNames[$uniqueKey] = $key;

parent::set($key, $values, $replace);


if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) {
$this->headers['cache-control'] = [$computed];
$this->headerNames['cache-control'] = 'Cache-Control';
$this->computedCacheControl = $this->parseCacheControl($computed);
}
}

public function remove(string $key): void
{
$uniqueKey = strtr($key, self::UPPER, self::LOWER);
unset($this->headerNames[$uniqueKey]);

if ('set-cookie' === $uniqueKey) {
$this->cookies = [];

return;
}

parent::remove($key);

if ('cache-control' === $uniqueKey) {
$this->computedCacheControl = [];
}

if ('date' === $uniqueKey) {
$this->initDate();
}
}

public function hasCacheControlDirective(string $key): bool
{
return \array_key_exists($key, $this->computedCacheControl);
}

public function getCacheControlDirective(string $key): bool|string|null
{
return $this->computedCacheControl[$key] ?? null;
}

public function setCookie(Cookie $cookie): void
{
$this->cookies[$cookie->getDomain() ?? ''][$cookie->getPath()][$cookie->getName()] = $cookie;
$this->headerNames['set-cookie'] = 'Set-Cookie';
}




public function removeCookie(string $name, ?string $path = '/', ?string $domain = null): void
{
$path ??= '/';

unset($this->cookies[$domain ?? ''][$path][$name]);

if (empty($this->cookies[$domain ?? ''][$path])) {
unset($this->cookies[$domain ?? ''][$path]);

if (empty($this->cookies[$domain ?? ''])) {
unset($this->cookies[$domain ?? '']);
}
}

if (!$this->cookies) {
unset($this->headerNames['set-cookie']);
}
}








public function getCookies(string $format = self::COOKIES_FLAT): array
{
if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) {
throw new \InvalidArgumentException(\sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY])));
}

if (self::COOKIES_ARRAY === $format) {
return $this->cookies;
}

$flattenedCookies = [];
foreach ($this->cookies as $path) {
foreach ($path as $cookies) {
foreach ($cookies as $cookie) {
$flattenedCookies[] = $cookie;
}
}
}

return $flattenedCookies;
}






public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null ): void
{
$partitioned = 6 < \func_num_args() ? func_get_arg(6) : false;

$this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite, $partitioned));
}




public function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string
{
return HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback);
}







protected function computeCacheControlValue(): string
{
if (!$this->cacheControl) {
if ($this->has('Last-Modified') || $this->has('Expires')) {
return 'private, must-revalidate'; 
}


return 'no-cache, private';
}

$header = $this->getCacheControlHeader();
if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
return $header;
}


if (!isset($this->cacheControl['s-maxage'])) {
return $header.', private';
}

return $header;
}

private function initDate(): void
{
$this->set('Date', gmdate('D, d M Y H:i:s').' GMT');
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Psr\Clock\ClockInterface;
use Symfony\Component\HttpFoundation\Exception\ExpiredSignedUriException;
use Symfony\Component\HttpFoundation\Exception\LogicException;
use Symfony\Component\HttpFoundation\Exception\SignedUriException;
use Symfony\Component\HttpFoundation\Exception\UnsignedUriException;
use Symfony\Component\HttpFoundation\Exception\UnverifiedSignedUriException;




class UriSigner
{
private const STATUS_VALID = 1;
private const STATUS_INVALID = 2;
private const STATUS_MISSING = 3;
private const STATUS_EXPIRED = 4;





public function __construct(
#[\SensitiveParameter] private string $secret,
private string $hashParameter = '_hash',
private string $expirationParameter = '_expiration',
private ?ClockInterface $clock = null,
) {
if (!$secret) {
throw new \InvalidArgumentException('A non-empty secret is required.');
}
}















public function sign(string $uri): string
{
$expiration = null;

if (1 < \func_num_args()) {
$expiration = func_get_arg(1);
}

if (null !== $expiration && !$expiration instanceof \DateTimeInterface && !$expiration instanceof \DateInterval && !\is_int($expiration)) {
throw new \TypeError(\sprintf('The second argument of "%s()" must be an instance of "%s" or "%s", an integer or null (%s given).', __METHOD__, \DateTimeInterface::class, \DateInterval::class, get_debug_type($expiration)));
}

$url = parse_url($uri);
$params = [];

if (isset($url['query'])) {
parse_str($url['query'], $params);
}

if (isset($params[$this->hashParameter])) {
throw new LogicException(\sprintf('URI query parameter conflict: parameter name "%s" is reserved.', $this->hashParameter));
}

if (isset($params[$this->expirationParameter])) {
throw new LogicException(\sprintf('URI query parameter conflict: parameter name "%s" is reserved.', $this->expirationParameter));
}

if (null !== $expiration) {
$params[$this->expirationParameter] = $this->getExpirationTime($expiration);
}

$uri = $this->buildUrl($url, $params);
$params[$this->hashParameter] = $this->computeHash($uri);

return $this->buildUrl($url, $params);
}





public function check(string $uri): bool
{
return self::STATUS_VALID === $this->doVerify($uri);
}

public function checkRequest(Request $request): bool
{
return self::STATUS_VALID === $this->doVerify(self::normalize($request));
}









public function verify(Request|string $uri): void
{
$uri = self::normalize($uri);
$status = $this->doVerify($uri);

if (self::STATUS_VALID === $status) {
return;
}

if (self::STATUS_MISSING === $status) {
throw new UnsignedUriException();
}

if (self::STATUS_INVALID === $status) {
throw new UnverifiedSignedUriException();
}

throw new ExpiredSignedUriException();
}

private function computeHash(string $uri): string
{
return strtr(rtrim(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)), '='), ['/' => '_', '+' => '-']);
}

private function buildUrl(array $url, array $params = []): string
{
ksort($params, \SORT_STRING);
$url['query'] = http_build_query($params, '', '&');

$scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';
$host = $url['host'] ?? '';
$port = isset($url['port']) ? ':'.$url['port'] : '';
$user = $url['user'] ?? '';
$pass = isset($url['pass']) ? ':'.$url['pass'] : '';
$pass = ($user || $pass) ? "$pass@" : '';
$path = $url['path'] ?? '';
$query = $url['query'] ? '?'.$url['query'] : '';
$fragment = isset($url['fragment']) ? '#'.$url['fragment'] : '';

return $scheme.$user.$pass.$host.$port.$path.$query.$fragment;
}

private function getExpirationTime(\DateTimeInterface|\DateInterval|int $expiration): string
{
if ($expiration instanceof \DateTimeInterface) {
return $expiration->format('U');
}

if ($expiration instanceof \DateInterval) {
return $this->now()->add($expiration)->format('U');
}

return (string) $expiration;
}

private function now(): \DateTimeImmutable
{
return $this->clock?->now() ?? \DateTimeImmutable::createFromFormat('U', time());
}




private function doVerify(string $uri): int
{
$url = parse_url($uri);
$params = [];

if (isset($url['query'])) {
parse_str($url['query'], $params);
}

if (empty($params[$this->hashParameter])) {
return self::STATUS_MISSING;
}

$hash = $params[$this->hashParameter];
unset($params[$this->hashParameter]);

if (!hash_equals($this->computeHash($this->buildUrl($url, $params)), strtr(rtrim($hash, '='), ['/' => '_', '+' => '-']))) {
return self::STATUS_INVALID;
}

if (!$expiration = $params[$this->expirationParameter] ?? false) {
return self::STATUS_VALID;
}

if ($this->now()->getTimestamp() < $expiration) {
return self::STATUS_VALID;
}

return self::STATUS_EXPIRED;
}

private static function normalize(Request|string $uri): string
{
if ($uri instanceof Request) {
$qs = ($qs = $uri->server->get('QUERY_STRING')) ? '?'.$qs : '';
$uri = $uri->getSchemeAndHttpHost().$uri->getBaseUrl().$uri->getPathInfo().$qs;
}

return $uri;
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\File;










class BinaryFileResponse extends Response
{
protected static bool $trustXSendfileTypeHeader = false;

protected File $file;
protected ?\SplTempFileObject $tempFileObject = null;
protected int $offset = 0;
protected int $maxlen = -1;
protected bool $deleteFileAfterSend = false;
protected int $chunkSize = 16 * 1024;










public function __construct(\SplFileInfo|string $file, int $status = 200, array $headers = [], bool $public = true, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true)
{
parent::__construct(null, $status, $headers);

$this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified);

if ($public) {
$this->setPublic();
}
}








public function setFile(\SplFileInfo|string $file, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true): static
{
$isTemporaryFile = $file instanceof \SplTempFileObject;
$this->tempFileObject = $isTemporaryFile ? $file : null;

if (!$file instanceof File) {
if ($file instanceof \SplFileInfo) {
$file = new File($file->getPathname(), !$isTemporaryFile);
} else {
$file = new File($file);
}
}

if (!$file->isReadable() && !$isTemporaryFile) {
throw new FileException('File must be readable.');
}

$this->file = $file;

if ($autoEtag) {
$this->setAutoEtag();
}

if ($autoLastModified && !$isTemporaryFile) {
$this->setAutoLastModified();
}

if ($contentDisposition) {
$this->setContentDisposition($contentDisposition);
}

return $this;
}




public function getFile(): File
{
return $this->file;
}






public function setChunkSize(int $chunkSize): static
{
if ($chunkSize < 1) {
throw new \InvalidArgumentException('The chunk size of a BinaryFileResponse cannot be less than 1.');
}

$this->chunkSize = $chunkSize;

return $this;
}






public function setAutoLastModified(): static
{
$this->setLastModified(\DateTimeImmutable::createFromFormat('U', $this->tempFileObject ? time() : $this->file->getMTime()));

return $this;
}






public function setAutoEtag(): static
{
$this->setEtag(base64_encode(hash_file('xxh128', $this->file->getPathname(), true)));

return $this;
}










public function setContentDisposition(string $disposition, string $filename = '', string $filenameFallback = ''): static
{
if ('' === $filename) {
$filename = $this->file->getFilename();
}

if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || str_contains($filename, '%'))) {
$encoding = mb_detect_encoding($filename, null, true) ?: '8bit';

for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) {
$char = mb_substr($filename, $i, 1, $encoding);

if ('%' === $char || \ord($char[0]) < 32 || \ord($char[0]) > 126) {
$filenameFallback .= '_';
} else {
$filenameFallback .= $char;
}
}
}

$dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);
$this->headers->set('Content-Disposition', $dispositionHeader);

return $this;
}

public function prepare(Request $request): static
{
if ($this->isInformational() || $this->isEmpty()) {
parent::prepare($request);

$this->maxlen = 0;

return $this;
}

if (!$this->headers->has('Content-Type')) {
$mimeType = null;
if (!$this->tempFileObject) {
$mimeType = $this->file->getMimeType();
}

$this->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
}

parent::prepare($request);

$this->offset = 0;
$this->maxlen = -1;

if ($this->tempFileObject) {
$fileSize = $this->tempFileObject->fstat()['size'];
} elseif (false === $fileSize = $this->file->getSize()) {
return $this;
}
$this->headers->remove('Transfer-Encoding');
$this->headers->set('Content-Length', $fileSize);

if (!$this->headers->has('Accept-Ranges')) {

$this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none');
}

if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) {

$type = $request->headers->get('X-Sendfile-Type');
$path = $this->file->getRealPath();

if (false === $path) {
$path = $this->file->getPathname();
}
if ('x-accel-redirect' === strtolower($type)) {



if (!$request->headers->has('X-Accel-Mapping')) {
throw new \LogicException('The "X-Accel-Mapping" header must be set when "X-Sendfile-Type" is set to "X-Accel-Redirect".');
}
$parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping'), ',=');
foreach ($parts as $part) {
[$pathPrefix, $location] = $part;
if (str_starts_with($path, $pathPrefix)) {
$path = $location.substr($path, \strlen($pathPrefix));


$this->headers->set($type, rawurlencode($path));
$this->maxlen = 0;
break;
}
}
} else {
$this->headers->set($type, $path);
$this->maxlen = 0;
}
} elseif ($request->headers->has('Range') && $request->isMethod('GET')) {

if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) {
$range = $request->headers->get('Range');

if (str_starts_with($range, 'bytes=')) {
[$start, $end] = explode('-', substr($range, 6), 2) + [1 => 0];

$end = ('' === $end) ? $fileSize - 1 : (int) $end;

if ('' === $start) {
$start = $fileSize - $end;
$end = $fileSize - 1;
} else {
$start = (int) $start;
}

if ($start <= $end) {
$end = min($end, $fileSize - 1);
if ($start < 0 || $start > $end) {
$this->setStatusCode(416);
$this->headers->set('Content-Range', \sprintf('bytes */%s', $fileSize));
} elseif ($end - $start < $fileSize - 1) {
$this->maxlen = $end < $fileSize ? $end - $start + 1 : -1;
$this->offset = $start;

$this->setStatusCode(206);
$this->headers->set('Content-Range', \sprintf('bytes %s-%s/%s', $start, $end, $fileSize));
$this->headers->set('Content-Length', $end - $start + 1);
}
}
}
}
}

if ($request->isMethod('HEAD')) {
$this->maxlen = 0;
}

return $this;
}

private function hasValidIfRangeHeader(?string $header): bool
{
if ($this->getEtag() === $header) {
return true;
}

if (null === $lastModified = $this->getLastModified()) {
return false;
}

return $lastModified->format('D, d M Y H:i:s').' GMT' === $header;
}

public function sendContent(): static
{
try {
if (!$this->isSuccessful()) {
return $this;
}

if (0 === $this->maxlen) {
return $this;
}

$out = fopen('php://output', 'w');

if ($this->tempFileObject) {
$file = $this->tempFileObject;
$file->rewind();
} else {
$file = new \SplFileObject($this->file->getPathname(), 'r');
}

ignore_user_abort(true);

if (0 !== $this->offset) {
$file->fseek($this->offset);
}

$length = $this->maxlen;
while ($length && !$file->eof()) {
$read = $length > $this->chunkSize || 0 > $length ? $this->chunkSize : $length;

if (false === $data = $file->fread($read)) {
break;
}
while ('' !== $data) {
$read = fwrite($out, $data);
if (false === $read || connection_aborted()) {
break 2;
}
if (0 < $length) {
$length -= $read;
}
$data = substr($data, $read);
}
}

fclose($out);
} finally {
if (null === $this->tempFileObject && $this->deleteFileAfterSend && is_file($this->file->getPathname())) {
unlink($this->file->getPathname());
}
}

return $this;
}




public function setContent(?string $content): static
{
if (null !== $content) {
throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.');
}

return $this;
}

public function getContent(): string|false
{
return false;
}




public static function trustXSendfileTypeHeader(): void
{
self::$trustXSendfileTypeHeader = true;
}







public function deleteFileAfterSend(bool $shouldDelete = true): static
{
$this->deleteFileAfterSend = $shouldDelete;

return $this;
}
}
<?php










namespace Symfony\Component\HttpFoundation;

/**
@implements





*/
class ServerEvent implements \IteratorAggregate
{








public function __construct(
private string|iterable $data,
private ?string $type = null,
private ?int $retry = null,
private ?string $id = null,
private ?string $comment = null,
) {
}

public function getData(): iterable|string
{
return $this->data;
}




public function setData(iterable|string $data): static
{
$this->data = $data;

return $this;
}

public function getType(): ?string
{
return $this->type;
}




public function setType(string $type): static
{
$this->type = $type;

return $this;
}

public function getRetry(): ?int
{
return $this->retry;
}




public function setRetry(?int $retry): static
{
$this->retry = $retry;

return $this;
}

public function getId(): ?string
{
return $this->id;
}




public function setId(string $id): static
{
$this->id = $id;

return $this;
}

public function getComment(): ?string
{
return $this->comment;
}

public function setComment(string $comment): static
{
$this->comment = $comment;

return $this;
}




public function getIterator(): \Traversable
{
static $lastRetry = null;

$head = '';
if ($this->comment) {
$head .= \sprintf(': %s', $this->comment)."\n";
}
if ($this->id) {
$head .= \sprintf('id: %s', $this->id)."\n";
}
if ($this->retry > 0 && $this->retry !== $lastRetry) {
$head .= \sprintf('retry: %s', $lastRetry = $this->retry)."\n";
}
if ($this->type) {
$head .= \sprintf('event: %s', $this->type)."\n";
}
yield $head;

if (is_iterable($this->data)) {
foreach ($this->data as $data) {
yield \sprintf('data: %s', $data)."\n";
}
} elseif ('' !== $this->data) {
yield \sprintf('data: %s', $this->data)."\n";
}

yield "\n";
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
use Symfony\Component\HttpFoundation\Exception\JsonException;
use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException;
use Symfony\Component\HttpFoundation\Session\SessionInterface;


class_exists(AcceptHeader::class);
class_exists(FileBag::class);
class_exists(HeaderBag::class);
class_exists(HeaderUtils::class);
class_exists(InputBag::class);
class_exists(ParameterBag::class);
class_exists(ServerBag::class);














class Request
{
public const HEADER_FORWARDED = 0b000001; 
public const HEADER_X_FORWARDED_FOR = 0b000010;
public const HEADER_X_FORWARDED_HOST = 0b000100;
public const HEADER_X_FORWARDED_PROTO = 0b001000;
public const HEADER_X_FORWARDED_PORT = 0b010000;
public const HEADER_X_FORWARDED_PREFIX = 0b100000;

public const HEADER_X_FORWARDED_AWS_ELB = 0b0011010; 
public const HEADER_X_FORWARDED_TRAEFIK = 0b0111110; 

public const METHOD_HEAD = 'HEAD';
public const METHOD_GET = 'GET';
public const METHOD_POST = 'POST';
public const METHOD_PUT = 'PUT';
public const METHOD_PATCH = 'PATCH';
public const METHOD_DELETE = 'DELETE';
public const METHOD_PURGE = 'PURGE';
public const METHOD_OPTIONS = 'OPTIONS';
public const METHOD_TRACE = 'TRACE';
public const METHOD_CONNECT = 'CONNECT';




protected static array $trustedProxies = [];




protected static array $trustedHostPatterns = [];




protected static array $trustedHosts = [];

protected static bool $httpMethodParameterOverride = false;




public ParameterBag $attributes;






public InputBag $request;




public InputBag $query;




public ServerBag $server;




public FileBag $files;




public InputBag $cookies;




public HeaderBag $headers;




protected $content;




protected ?array $languages = null;




protected ?array $charsets = null;




protected ?array $encodings = null;




protected ?array $acceptableContentTypes = null;

protected ?string $pathInfo = null;
protected ?string $requestUri = null;
protected ?string $baseUrl = null;
protected ?string $basePath = null;
protected ?string $method = null;
protected ?string $format = null;
protected SessionInterface|\Closure|null $session = null;
protected ?string $locale = null;
protected string $defaultLocale = 'en';




protected static ?array $formats = null;

protected static ?\Closure $requestFactory = null;

private ?string $preferredFormat = null;

private bool $isHostValid = true;
private bool $isForwardedValid = true;
private bool $isSafeContentPreferred;

private array $trustedValuesCache = [];

private static int $trustedHeaderSet = -1;

private const FORWARDED_PARAMS = [
self::HEADER_X_FORWARDED_FOR => 'for',
self::HEADER_X_FORWARDED_HOST => 'host',
self::HEADER_X_FORWARDED_PROTO => 'proto',
self::HEADER_X_FORWARDED_PORT => 'host',
];










private const TRUSTED_HEADERS = [
self::HEADER_FORWARDED => 'FORWARDED',
self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
self::HEADER_X_FORWARDED_PREFIX => 'X_FORWARDED_PREFIX',
];

private bool $isIisRewrite = false;










public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)
{
$this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
}














public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void
{
$this->request = new InputBag($request);
$this->query = new InputBag($query);
$this->attributes = new ParameterBag($attributes);
$this->cookies = new InputBag($cookies);
$this->files = new FileBag($files);
$this->server = new ServerBag($server);
$this->headers = new HeaderBag($this->server->getHeaders());

$this->content = $content;
$this->languages = null;
$this->charsets = null;
$this->encodings = null;
$this->acceptableContentTypes = null;
$this->pathInfo = null;
$this->requestUri = null;
$this->baseUrl = null;
$this->basePath = null;
$this->method = null;
$this->format = null;
}




public static function createFromGlobals(): static
{
$request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);

if (str_starts_with($request->headers->get('CONTENT_TYPE', ''), 'application/x-www-form-urlencoded')
&& \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'], true)
) {
parse_str($request->getContent(), $data);
$request->request = new InputBag($data);
}

return $request;
}

















public static function create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], $content = null): static
{
$server = array_replace([
'SERVER_NAME' => 'localhost',
'SERVER_PORT' => 80,
'HTTP_HOST' => 'localhost',
'HTTP_USER_AGENT' => 'Symfony',
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'REMOTE_ADDR' => '127.0.0.1',
'SCRIPT_NAME' => '',
'SCRIPT_FILENAME' => '',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'REQUEST_TIME' => time(),
'REQUEST_TIME_FLOAT' => microtime(true),
], $server);

$server['PATH_INFO'] = '';
$server['REQUEST_METHOD'] = strtoupper($method);

if (($i = strcspn($uri, ':/?#')) && ':' === ($uri[$i] ?? null) && (strspn($uri, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.') !== $i || strcspn($uri, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'))) {
throw new BadRequestException('Invalid URI: Scheme is malformed.');
}
if (false === $components = parse_url(\strlen($uri) !== strcspn($uri, '?#') ? $uri : $uri.'#')) {
throw new BadRequestException('Invalid URI.');
}

$part = ($components['user'] ?? '').':'.($components['pass'] ?? '');

if (':' !== $part && \strlen($part) !== strcspn($part, '[]')) {
throw new BadRequestException('Invalid URI: Userinfo is malformed.');
}
if (($part = $components['host'] ?? '') && !self::isHostValid($part)) {
throw new BadRequestException('Invalid URI: Host is malformed.');
}
if (false !== ($i = strpos($uri, '\\')) && $i < strcspn($uri, '?#')) {
throw new BadRequestException('Invalid URI: A URI cannot contain a backslash.');
}
if (\strlen($uri) !== strcspn($uri, "\r\n\t")) {
throw new BadRequestException('Invalid URI: A URI cannot contain CR/LF/TAB characters.');
}
if ('' !== $uri && (\ord($uri[0]) <= 32 || \ord($uri[-1]) <= 32)) {
throw new BadRequestException('Invalid URI: A URI must not start nor end with ASCII control characters or spaces.');
}

if (isset($components['host'])) {
$server['SERVER_NAME'] = $components['host'];
$server['HTTP_HOST'] = $components['host'];
}

if (isset($components['scheme'])) {
if ('https' === $components['scheme']) {
$server['HTTPS'] = 'on';
$server['SERVER_PORT'] = 443;
} else {
unset($server['HTTPS']);
$server['SERVER_PORT'] = 80;
}
}

if (isset($components['port'])) {
$server['SERVER_PORT'] = $components['port'];
$server['HTTP_HOST'] .= ':'.$components['port'];
}

if (isset($components['user'])) {
$server['PHP_AUTH_USER'] = $components['user'];
}

if (isset($components['pass'])) {
$server['PHP_AUTH_PW'] = $components['pass'];
}

if (!isset($components['path'])) {
$components['path'] = '/';
}

switch (strtoupper($method)) {
case 'POST':
case 'PUT':
case 'DELETE':
if (!isset($server['CONTENT_TYPE'])) {
$server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
}

case 'PATCH':
$request = $parameters;
$query = [];
break;
default:
$request = [];
$query = $parameters;
break;
}

$queryString = '';
if (isset($components['query'])) {
parse_str(html_entity_decode($components['query']), $qs);

if ($query) {
$query = array_replace($qs, $query);
$queryString = http_build_query($query, '', '&');
} else {
$query = $qs;
$queryString = $components['query'];
}
} elseif ($query) {
$queryString = http_build_query($query, '', '&');
}

$server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : '');
$server['QUERY_STRING'] = $queryString;

return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content);
}








public static function setFactory(?callable $callable): void
{
self::$requestFactory = null === $callable ? null : $callable(...);
}











public function duplicate(?array $query = null, ?array $request = null, ?array $attributes = null, ?array $cookies = null, ?array $files = null, ?array $server = null): static
{
$dup = clone $this;
if (null !== $query) {
$dup->query = new InputBag($query);
}
if (null !== $request) {
$dup->request = new InputBag($request);
}
if (null !== $attributes) {
$dup->attributes = new ParameterBag($attributes);
}
if (null !== $cookies) {
$dup->cookies = new InputBag($cookies);
}
if (null !== $files) {
$dup->files = new FileBag($files);
}
if (null !== $server) {
$dup->server = new ServerBag($server);
$dup->headers = new HeaderBag($dup->server->getHeaders());
}
$dup->languages = null;
$dup->charsets = null;
$dup->encodings = null;
$dup->acceptableContentTypes = null;
$dup->pathInfo = null;
$dup->requestUri = null;
$dup->baseUrl = null;
$dup->basePath = null;
$dup->method = null;
$dup->format = null;

if (!$dup->get('_format') && $this->get('_format')) {
$dup->attributes->set('_format', $this->get('_format'));
}

if (!$dup->getRequestFormat(null)) {
$dup->setRequestFormat($this->getRequestFormat(null));
}

return $dup;
}







public function __clone()
{
$this->query = clone $this->query;
$this->request = clone $this->request;
$this->attributes = clone $this->attributes;
$this->cookies = clone $this->cookies;
$this->files = clone $this->files;
$this->server = clone $this->server;
$this->headers = clone $this->headers;
}

public function __toString(): string
{
$content = $this->getContent();

$cookieHeader = '';
$cookies = [];

foreach ($this->cookies as $k => $v) {
$cookies[] = \is_array($v) ? http_build_query([$k => $v], '', '; ', \PHP_QUERY_RFC3986) : "$k=$v";
}

if ($cookies) {
$cookieHeader = 'Cookie: '.implode('; ', $cookies)."\r\n";
}

return
\sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
$this->headers.
$cookieHeader."\r\n".
$content;
}







public function overrideGlobals(): void
{
$this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&')));

$_GET = $this->query->all();
$_POST = $this->request->all();
$_SERVER = $this->server->all();
$_COOKIE = $this->cookies->all();

foreach ($this->headers->all() as $key => $value) {
$key = strtoupper(str_replace('-', '_', $key));
if (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) {
$_SERVER[$key] = implode(', ', $value);
} else {
$_SERVER['HTTP_'.$key] = implode(', ', $value);
}
}

$request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE];

$requestOrder = \ini_get('request_order') ?: \ini_get('variables_order');
$requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';

$_REQUEST = [[]];

foreach (str_split($requestOrder) as $order) {
$_REQUEST[] = $request[$order];
}

$_REQUEST = array_merge(...$_REQUEST);
}









public static function setTrustedProxies(array $proxies, int $trustedHeaderSet): void
{
if (false !== $i = array_search('REMOTE_ADDR', $proxies, true)) {
if (isset($_SERVER['REMOTE_ADDR'])) {
$proxies[$i] = $_SERVER['REMOTE_ADDR'];
} else {
unset($proxies[$i]);
$proxies = array_values($proxies);
}
}

if (false !== ($i = array_search('PRIVATE_SUBNETS', $proxies, true)) || false !== ($i = array_search('private_ranges', $proxies, true))) {
unset($proxies[$i]);
$proxies = array_merge($proxies, IpUtils::PRIVATE_SUBNETS);
}

self::$trustedProxies = $proxies;
self::$trustedHeaderSet = $trustedHeaderSet;
}






public static function getTrustedProxies(): array
{
return self::$trustedProxies;
}






public static function getTrustedHeaderSet(): int
{
return self::$trustedHeaderSet;
}








public static function setTrustedHosts(array $hostPatterns): void
{
self::$trustedHostPatterns = array_map(fn ($hostPattern) => \sprintf('{%s}i', $hostPattern), $hostPatterns);

self::$trustedHosts = [];
}






public static function getTrustedHosts(): array
{
return self::$trustedHostPatterns;
}







public static function normalizeQueryString(?string $qs): string
{
if ('' === ($qs ?? '')) {
return '';
}

$qs = HeaderUtils::parseQuery($qs);
ksort($qs);

return http_build_query($qs, '', '&', \PHP_QUERY_RFC3986);
}












public static function enableHttpMethodParameterOverride(): void
{
self::$httpMethodParameterOverride = true;
}




public static function getHttpMethodParameterOverride(): bool
{
return self::$httpMethodParameterOverride;
}












public function get(string $key, mixed $default = null): mixed
{
if ($this !== $result = $this->attributes->get($key, $this)) {
return $result;
}

if ($this->query->has($key)) {
return $this->query->all()[$key];
}

if ($this->request->has($key)) {
return $this->request->all()[$key];
}

return $default;
}






public function getSession(): SessionInterface
{
$session = $this->session;
if (!$session instanceof SessionInterface && null !== $session) {
$this->setSession($session = $session());
}

if (null === $session) {
throw new SessionNotFoundException('Session has not been set.');
}

return $session;
}





public function hasPreviousSession(): bool
{

return $this->hasSession() && $this->cookies->has($this->getSession()->getName());
}










public function hasSession(bool $skipIfUninitialized = false): bool
{
return null !== $this->session && (!$skipIfUninitialized || $this->session instanceof SessionInterface);
}

public function setSession(SessionInterface $session): void
{
$this->session = $session;
}






public function setSessionFactory(callable $factory): void
{
$this->session = $factory(...);
}












public function getClientIps(): array
{
$ip = $this->server->get('REMOTE_ADDR');

if (!$this->isFromTrustedProxy()) {
return [$ip];
}

return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip];
}

















public function getClientIp(): ?string
{
return $this->getClientIps()[0];
}




public function getScriptName(): string
{
return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', ''));
}















public function getPathInfo(): string
{
return $this->pathInfo ??= $this->preparePathInfo();
}













public function getBasePath(): string
{
return $this->basePath ??= $this->prepareBasePath();
}











public function getBaseUrl(): string
{
$trustedPrefix = '';


if ($this->isFromTrustedProxy() && $trustedPrefixValues = $this->getTrustedValues(self::HEADER_X_FORWARDED_PREFIX)) {
$trustedPrefix = rtrim($trustedPrefixValues[0], '/');
}

return $trustedPrefix.$this->getBaseUrlReal();
}







private function getBaseUrlReal(): string
{
return $this->baseUrl ??= $this->prepareBaseUrl();
}




public function getScheme(): string
{
return $this->isSecure() ? 'https' : 'http';
}











public function getPort(): int|string|null
{
if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) {
$host = $host[0];
} elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {
$host = $host[0];
} elseif (!$host = $this->headers->get('HOST')) {
return $this->server->get('SERVER_PORT');
}

if ('[' === $host[0]) {
$pos = strpos($host, ':', strrpos($host, ']'));
} else {
$pos = strrpos($host, ':');
}

if (false !== $pos && $port = substr($host, $pos + 1)) {
return (int) $port;
}

return 'https' === $this->getScheme() ? 443 : 80;
}




public function getUser(): ?string
{
return $this->headers->get('PHP_AUTH_USER');
}




public function getPassword(): ?string
{
return $this->headers->get('PHP_AUTH_PW');
}






public function getUserInfo(): ?string
{
$userinfo = $this->getUser();

$pass = $this->getPassword();
if ('' != $pass) {
$userinfo .= ":$pass";
}

return $userinfo;
}






public function getHttpHost(): string
{
$scheme = $this->getScheme();
$port = $this->getPort();

if (('http' === $scheme && 80 == $port) || ('https' === $scheme && 443 == $port)) {
return $this->getHost();
}

return $this->getHost().':'.$port;
}






public function getRequestUri(): string
{
return $this->requestUri ??= $this->prepareRequestUri();
}







public function getSchemeAndHttpHost(): string
{
return $this->getScheme().'://'.$this->getHttpHost();
}






public function getUri(): string
{
if (null !== $qs = $this->getQueryString()) {
$qs = '?'.$qs;
}

return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
}






public function getUriForPath(string $path): string
{
return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path;
}
















public function getRelativeUriForPath(string $path): string
{

if (!isset($path[0]) || '/' !== $path[0]) {
return $path;
}

if ($path === $basePath = $this->getPathInfo()) {
return '';
}

$sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);
$targetDirs = explode('/', substr($path, 1));
array_pop($sourceDirs);
$targetFile = array_pop($targetDirs);

foreach ($sourceDirs as $i => $dir) {
if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) {
unset($sourceDirs[$i], $targetDirs[$i]);
} else {
break;
}
}

$targetDirs[] = $targetFile;
$path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs);





return !isset($path[0]) || '/' === $path[0]
|| false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
? "./$path" : $path;
}







public function getQueryString(): ?string
{
$qs = static::normalizeQueryString($this->server->get('QUERY_STRING'));

return '' === $qs ? null : $qs;
}









public function isSecure(): bool
{
if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) {
return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true);
}

$https = $this->server->get('HTTPS');

return $https && 'off' !== strtolower($https);
}











public function getHost(): string
{
if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) {
$host = $host[0];
} elseif (!$host = $this->headers->get('HOST')) {
if (!$host = $this->server->get('SERVER_NAME')) {
$host = $this->server->get('SERVER_ADDR', '');
}
}



$host = strtolower(preg_replace('/:\d+$/', '', trim($host)));


if ($host && !self::isHostValid($host)) {
if (!$this->isHostValid) {
return '';
}
$this->isHostValid = false;

throw new SuspiciousOperationException(\sprintf('Invalid Host "%s".', $host));
}

if (\count(self::$trustedHostPatterns) > 0) {


if (\in_array($host, self::$trustedHosts, true)) {
return $host;
}

foreach (self::$trustedHostPatterns as $pattern) {
if (preg_match($pattern, $host)) {
self::$trustedHosts[] = $host;

return $host;
}
}

if (!$this->isHostValid) {
return '';
}
$this->isHostValid = false;

throw new SuspiciousOperationException(\sprintf('Untrusted Host "%s".', $host));
}

return $host;
}




public function setMethod(string $method): void
{
$this->method = null;
$this->server->set('REQUEST_METHOD', $method);
}














public function getMethod(): string
{
if (null !== $this->method) {
return $this->method;
}

$this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));

if ('POST' !== $this->method) {
return $this->method;
}

$method = $this->headers->get('X-HTTP-METHOD-OVERRIDE');

if (!$method && self::$httpMethodParameterOverride) {
$method = $this->request->get('_method', $this->query->get('_method', 'POST'));
}

if (!\is_string($method)) {
return $this->method;
}

$method = strtoupper($method);

if (\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) {
return $this->method = $method;
}

if (!preg_match('/^[A-Z]++$/D', $method)) {
throw new SuspiciousOperationException('Invalid HTTP method override.');
}

return $this->method = $method;
}






public function getRealMethod(): string
{
return strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
}




public function getMimeType(string $format): ?string
{
if (null === static::$formats) {
static::initializeFormats();
}

return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;
}






public static function getMimeTypes(string $format): array
{
if (null === static::$formats) {
static::initializeFormats();
}

return static::$formats[$format] ?? [];
}




public function getFormat(?string $mimeType): ?string
{
$canonicalMimeType = null;
if ($mimeType && false !== $pos = strpos($mimeType, ';')) {
$canonicalMimeType = trim(substr($mimeType, 0, $pos));
}

if (null === static::$formats) {
static::initializeFormats();
}

$exactFormat = null;
$canonicalFormat = null;

foreach (static::$formats as $format => $mimeTypes) {
if (\in_array($mimeType, $mimeTypes, true)) {
$exactFormat = $format;
}
if (null !== $canonicalMimeType && \in_array($canonicalMimeType, $mimeTypes, true)) {
$canonicalFormat = $format;
}
}

if ($format = $exactFormat ?? $canonicalFormat) {
return $format;
}

return null;
}






public function setFormat(?string $format, string|array $mimeTypes): void
{
if (null === static::$formats) {
static::initializeFormats();
}

static::$formats[$format ?? ''] = (array) $mimeTypes;
}












public function getRequestFormat(?string $default = 'html'): ?string
{
$this->format ??= $this->attributes->get('_format');

return $this->format ?? $default;
}




public function setRequestFormat(?string $format): void
{
$this->format = $format;
}






public function getContentTypeFormat(): ?string
{
return $this->getFormat($this->headers->get('CONTENT_TYPE', ''));
}




public function setDefaultLocale(string $locale): void
{
$this->defaultLocale = $locale;

if (null === $this->locale) {
$this->setPhpDefaultLocale($locale);
}
}




public function getDefaultLocale(): string
{
return $this->defaultLocale;
}




public function setLocale(string $locale): void
{
$this->setPhpDefaultLocale($this->locale = $locale);
}




public function getLocale(): string
{
return $this->locale ?? $this->defaultLocale;
}






public function isMethod(string $method): bool
{
return $this->getMethod() === strtoupper($method);
}






public function isMethodSafe(): bool
{
return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']);
}




public function isMethodIdempotent(): bool
{
return \in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE']);
}






public function isMethodCacheable(): bool
{
return \in_array($this->getMethod(), ['GET', 'HEAD']);
}










public function getProtocolVersion(): ?string
{
if ($this->isFromTrustedProxy()) {
preg_match('~^(HTTP/)?([1-9]\.[0-9])\b~', $this->headers->get('Via') ?? '', $matches);

if ($matches) {
return 'HTTP/'.$matches[2];
}
}

return $this->server->get('SERVER_PROTOCOL');
}

/**
@psalm-return($asResource is true ? resource : string)






*/
public function getContent(bool $asResource = false)
{
$currentContentIsResource = \is_resource($this->content);

if (true === $asResource) {
if ($currentContentIsResource) {
rewind($this->content);

return $this->content;
}


if (\is_string($this->content)) {
$resource = fopen('php://temp', 'r+');
fwrite($resource, $this->content);
rewind($resource);

return $resource;
}

$this->content = false;

return fopen('php://input', 'r');
}

if ($currentContentIsResource) {
rewind($this->content);

return stream_get_contents($this->content);
}

if (null === $this->content || false === $this->content) {
$this->content = file_get_contents('php://input');
}

return $this->content;
}






public function getPayload(): InputBag
{
if ($this->request->count()) {
return clone $this->request;
}

if ('' === $content = $this->getContent()) {
return new InputBag([]);
}

try {
$content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR);
} catch (\JsonException $e) {
throw new JsonException('Could not decode request body.', $e->getCode(), $e);
}

if (!\is_array($content)) {
throw new JsonException(\sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content)));
}

return new InputBag($content);
}








public function toArray(): array
{
if ('' === $content = $this->getContent()) {
throw new JsonException('Request body is empty.');
}

try {
$content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR);
} catch (\JsonException $e) {
throw new JsonException('Could not decode request body.', $e->getCode(), $e);
}

if (!\is_array($content)) {
throw new JsonException(\sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content)));
}

return $content;
}




public function getETags(): array
{
return preg_split('/\s*,\s*/', $this->headers->get('If-None-Match', ''), -1, \PREG_SPLIT_NO_EMPTY);
}

public function isNoCache(): bool
{
return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma');
}









public function getPreferredFormat(?string $default = 'html'): ?string
{
if (!isset($this->preferredFormat) && null !== $preferredFormat = $this->getRequestFormat(null)) {
$this->preferredFormat = $preferredFormat;
}

if ($this->preferredFormat ?? null) {
return $this->preferredFormat;
}

foreach ($this->getAcceptableContentTypes() as $mimeType) {
if ($this->preferredFormat = $this->getFormat($mimeType)) {
return $this->preferredFormat;
}
}

return $default;
}






public function getPreferredLanguage(?array $locales = null): ?string
{
$preferredLanguages = $this->getLanguages();

if (!$locales) {
return $preferredLanguages[0] ?? null;
}

$locales = array_map($this->formatLocale(...), $locales);
if (!$preferredLanguages) {
return $locales[0];
}

$combinations = array_merge(...array_map($this->getLanguageCombinations(...), $preferredLanguages));
foreach ($combinations as $combination) {
foreach ($locales as $locale) {
if (str_starts_with($locale, $combination)) {
return $locale;
}
}
}

return $locales[0];
}






public function getLanguages(): array
{
if (null !== $this->languages) {
return $this->languages;
}

$languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
$this->languages = [];
foreach ($languages as $acceptHeaderItem) {
$lang = $acceptHeaderItem->getValue();
$this->languages[] = self::formatLocale($lang);
}
$this->languages = array_unique($this->languages);

return $this->languages;
}















private static function formatLocale(string $locale): string
{
[$language, $script, $region] = self::getLanguageComponents($locale);

return implode('_', array_filter([$language, $script, $region]));
}












private static function getLanguageCombinations(string $locale): array
{
[$language, $script, $region] = self::getLanguageComponents($locale);

return array_unique([
implode('_', array_filter([$language, $script, $region])),
implode('_', array_filter([$language, $script])),
implode('_', array_filter([$language, $region])),
$language,
]);
}














private static function getLanguageComponents(string $locale): array
{
$locale = str_replace('_', '-', strtolower($locale));
$pattern = '/^([a-zA-Z]{2,3}|i-[a-zA-Z]{5,})(?:-([a-zA-Z]{4}))?(?:-([a-zA-Z]{2}))?(?:-(.+))?$/';
if (!preg_match($pattern, $locale, $matches)) {
return [$locale, null, null];
}
if (str_starts_with($matches[1], 'i-')) {



$matches[1] = substr($matches[1], 2);
}

return [
$matches[1],
isset($matches[2]) ? ucfirst(strtolower($matches[2])) : null,
isset($matches[3]) ? strtoupper($matches[3]) : null,
];
}






public function getCharsets(): array
{
return $this->charsets ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all()));
}






public function getEncodings(): array
{
return $this->encodings ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all()));
}






public function getAcceptableContentTypes(): array
{
return $this->acceptableContentTypes ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all()));
}









public function isXmlHttpRequest(): bool
{
return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}






public function preferSafeContent(): bool
{
if (isset($this->isSafeContentPreferred)) {
return $this->isSafeContentPreferred;
}

if (!$this->isSecure()) {

return $this->isSafeContentPreferred = false;
}

return $this->isSafeContentPreferred = AcceptHeader::fromString($this->headers->get('Prefer'))->has('safe');
}









protected function prepareRequestUri(): string
{
$requestUri = '';

if ($this->isIisRewrite() && '' != $this->server->get('UNENCODED_URL')) {

$requestUri = $this->server->get('UNENCODED_URL');
$this->server->remove('UNENCODED_URL');
} elseif ($this->server->has('REQUEST_URI')) {
$requestUri = $this->server->get('REQUEST_URI');

if ('' !== $requestUri && '/' === $requestUri[0]) {

if (false !== $pos = strpos($requestUri, '#')) {
$requestUri = substr($requestUri, 0, $pos);
}
} else {


$uriComponents = parse_url($requestUri);

if (isset($uriComponents['path'])) {
$requestUri = $uriComponents['path'];
}

if (isset($uriComponents['query'])) {
$requestUri .= '?'.$uriComponents['query'];
}
}
} elseif ($this->server->has('ORIG_PATH_INFO')) {

$requestUri = $this->server->get('ORIG_PATH_INFO');
if ('' != $this->server->get('QUERY_STRING')) {
$requestUri .= '?'.$this->server->get('QUERY_STRING');
}
$this->server->remove('ORIG_PATH_INFO');
}


$this->server->set('REQUEST_URI', $requestUri);

return $requestUri;
}




protected function prepareBaseUrl(): string
{
$filename = basename($this->server->get('SCRIPT_FILENAME', ''));

if (basename($this->server->get('SCRIPT_NAME', '')) === $filename) {
$baseUrl = $this->server->get('SCRIPT_NAME');
} elseif (basename($this->server->get('PHP_SELF', '')) === $filename) {
$baseUrl = $this->server->get('PHP_SELF');
} elseif (basename($this->server->get('ORIG_SCRIPT_NAME', '')) === $filename) {
$baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); 
} else {


$path = $this->server->get('PHP_SELF', '');
$file = $this->server->get('SCRIPT_FILENAME', '');
$segs = explode('/', trim($file, '/'));
$segs = array_reverse($segs);
$index = 0;
$last = \count($segs);
$baseUrl = '';
do {
$seg = $segs[$index];
$baseUrl = '/'.$seg.$baseUrl;
++$index;
} while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);
}


$requestUri = $this->getRequestUri();
if ('' !== $requestUri && '/' !== $requestUri[0]) {
$requestUri = '/'.$requestUri;
}

if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {

return $prefix;
}

if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\dirname($baseUrl), '/'.\DIRECTORY_SEPARATOR).'/')) {

return rtrim($prefix, '/'.\DIRECTORY_SEPARATOR);
}

$truncatedRequestUri = $requestUri;
if (false !== $pos = strpos($requestUri, '?')) {
$truncatedRequestUri = substr($requestUri, 0, $pos);
}

$basename = basename($baseUrl ?? '');
if (!$basename || !strpos(rawurldecode($truncatedRequestUri), $basename)) {

return '';
}




if (\strlen($requestUri) >= \strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) {
$baseUrl = substr($requestUri, 0, $pos + \strlen($baseUrl));
}

return rtrim($baseUrl, '/'.\DIRECTORY_SEPARATOR);
}




protected function prepareBasePath(): string
{
$baseUrl = $this->getBaseUrl();
if (!$baseUrl) {
return '';
}

$filename = basename($this->server->get('SCRIPT_FILENAME'));
if (basename($baseUrl) === $filename) {
$basePath = \dirname($baseUrl);
} else {
$basePath = $baseUrl;
}

if ('\\' === \DIRECTORY_SEPARATOR) {
$basePath = str_replace('\\', '/', $basePath);
}

return rtrim($basePath, '/');
}




protected function preparePathInfo(): string
{
if (null === ($requestUri = $this->getRequestUri())) {
return '/';
}


if (false !== $pos = strpos($requestUri, '?')) {
$requestUri = substr($requestUri, 0, $pos);
}
if ('' !== $requestUri && '/' !== $requestUri[0]) {
$requestUri = '/'.$requestUri;
}

if (null === ($baseUrl = $this->getBaseUrlReal())) {
return $requestUri;
}

$pathInfo = substr($requestUri, \strlen($baseUrl));
if ('' === $pathInfo || '/' !== $pathInfo[0]) {
return '/'.$pathInfo;
}

return $pathInfo;
}




protected static function initializeFormats(): void
{
static::$formats = [
'html' => ['text/html', 'application/xhtml+xml'],
'txt' => ['text/plain'],
'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'],
'css' => ['text/css'],
'json' => ['application/json', 'application/x-json'],
'jsonld' => ['application/ld+json'],
'xml' => ['text/xml', 'application/xml', 'application/x-xml'],
'rdf' => ['application/rdf+xml'],
'atom' => ['application/atom+xml'],
'rss' => ['application/rss+xml'],
'form' => ['application/x-www-form-urlencoded', 'multipart/form-data'],
];
}

private function setPhpDefaultLocale(string $locale): void
{



try {
if (class_exists(\Locale::class, false)) {
\Locale::setDefault($locale);
}
} catch (\Exception) {
}
}





private function getUrlencodedPrefix(string $string, string $prefix): ?string
{
if ($this->isIisRewrite()) {


if (0 !== stripos(rawurldecode($string), $prefix)) {
return null;
}
} elseif (!str_starts_with(rawurldecode($string), $prefix)) {
return null;
}

$len = \strlen($prefix);

if (preg_match(\sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) {
return $match[0];
}

return null;
}

private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static
{
if (self::$requestFactory) {
$request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content);

if (!$request instanceof self) {
throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
}

return $request;
}

return new static($query, $request, $attributes, $cookies, $files, $server, $content);
}







public function isFromTrustedProxy(): bool
{
return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR', ''), self::$trustedProxies);
}






private function getTrustedValues(int $type, ?string $ip = null): array
{
$cacheKey = $type."\0".((self::$trustedHeaderSet & $type) ? $this->headers->get(self::TRUSTED_HEADERS[$type]) : '');
$cacheKey .= "\0".$ip."\0".$this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]);

if (isset($this->trustedValuesCache[$cacheKey])) {
return $this->trustedValuesCache[$cacheKey];
}

$clientValues = [];
$forwardedValues = [];

if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::TRUSTED_HEADERS[$type])) {
foreach (explode(',', $this->headers->get(self::TRUSTED_HEADERS[$type])) as $v) {
$clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v);
}
}

if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && (isset(self::FORWARDED_PARAMS[$type])) && $this->headers->has(self::TRUSTED_HEADERS[self::HEADER_FORWARDED])) {
$forwarded = $this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]);
$parts = HeaderUtils::split($forwarded, ',;=');
$param = self::FORWARDED_PARAMS[$type];
foreach ($parts as $subParts) {
if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) {
continue;
}
if (self::HEADER_X_FORWARDED_PORT === $type) {
if (str_ends_with($v, ']') || false === $v = strrchr($v, ':')) {
$v = $this->isSecure() ? ':443' : ':80';
}
$v = '0.0.0.0'.$v;
}
$forwardedValues[] = $v;
}
}

if (null !== $ip) {
$clientValues = $this->normalizeAndFilterClientIps($clientValues, $ip);
$forwardedValues = $this->normalizeAndFilterClientIps($forwardedValues, $ip);
}

if ($forwardedValues === $clientValues || !$clientValues) {
return $this->trustedValuesCache[$cacheKey] = $forwardedValues;
}

if (!$forwardedValues) {
return $this->trustedValuesCache[$cacheKey] = $clientValues;
}

if (!$this->isForwardedValid) {
return $this->trustedValuesCache[$cacheKey] = null !== $ip ? ['0.0.0.0', $ip] : [];
}
$this->isForwardedValid = false;

throw new ConflictingHeadersException(\sprintf('The request has both a trusted "%s" header and a trusted "%s" header, conflicting with each other. You should either configure your proxy to remove one of them, or configure your project to distrust the offending one.', self::TRUSTED_HEADERS[self::HEADER_FORWARDED], self::TRUSTED_HEADERS[$type]));
}

private function normalizeAndFilterClientIps(array $clientIps, string $ip): array
{
if (!$clientIps) {
return [];
}
$clientIps[] = $ip; 
$firstTrustedIp = null;

foreach ($clientIps as $key => $clientIp) {
if (strpos($clientIp, '.')) {


$i = strpos($clientIp, ':');
if ($i) {
$clientIps[$key] = $clientIp = substr($clientIp, 0, $i);
}
} elseif (str_starts_with($clientIp, '[')) {

$i = strpos($clientIp, ']', 1);
$clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1);
}

if (!filter_var($clientIp, \FILTER_VALIDATE_IP)) {
unset($clientIps[$key]);

continue;
}

if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
unset($clientIps[$key]);


$firstTrustedIp ??= $clientIp;
}
}


return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp];
}







private function isIisRewrite(): bool
{
if (1 === $this->server->getInt('IIS_WasUrlRewritten')) {
$this->isIisRewrite = true;
$this->server->remove('IIS_WasUrlRewritten');
}

return $this->isIisRewrite;
}




private static function isHostValid(string $host): bool
{
if ('[' === $host[0]) {
return ']' === $host[-1] && filter_var(substr($host, 1, -1), \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6);
}

if (preg_match('/\.[0-9]++\.?$/D', $host)) {
return null !== filter_var($host, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4 | \FILTER_NULL_ON_FAILURE);
}


return '' === preg_replace('/[-a-zA-Z0-9_]++\.?/', '', $host);
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException;

/**
@implements




*/
class ParameterBag implements \IteratorAggregate, \Countable
{
public function __construct(
protected array $parameters = [],
) {
}








public function all(?string $key = null): array
{
if (null === $key) {
return $this->parameters;
}

if (!\is_array($value = $this->parameters[$key] ?? [])) {
throw new BadRequestException(\sprintf('Unexpected value for parameter "%s": expecting "array", got "%s".', $key, get_debug_type($value)));
}

return $value;
}




public function keys(): array
{
return array_keys($this->parameters);
}




public function replace(array $parameters = []): void
{
$this->parameters = $parameters;
}




public function add(array $parameters = []): void
{
$this->parameters = array_replace($this->parameters, $parameters);
}

public function get(string $key, mixed $default = null): mixed
{
return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
}

public function set(string $key, mixed $value): void
{
$this->parameters[$key] = $value;
}




public function has(string $key): bool
{
return \array_key_exists($key, $this->parameters);
}




public function remove(string $key): void
{
unset($this->parameters[$key]);
}






public function getAlpha(string $key, string $default = ''): string
{
return preg_replace('/[^[:alpha:]]/', '', $this->getString($key, $default));
}






public function getAlnum(string $key, string $default = ''): string
{
return preg_replace('/[^[:alnum:]]/', '', $this->getString($key, $default));
}






public function getDigits(string $key, string $default = ''): string
{
return preg_replace('/[^[:digit:]]/', '', $this->getString($key, $default));
}






public function getString(string $key, string $default = ''): string
{
$value = $this->get($key, $default);
if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException(\sprintf('Parameter value "%s" cannot be converted to "string".', $key));
}

return (string) $value;
}






public function getInt(string $key, int $default = 0): int
{
return $this->filter($key, $default, \FILTER_VALIDATE_INT, ['flags' => \FILTER_REQUIRE_SCALAR]);
}






public function getBoolean(string $key, bool $default = false): bool
{
return $this->filter($key, $default, \FILTER_VALIDATE_BOOL, ['flags' => \FILTER_REQUIRE_SCALAR]);
}

/**
@template
@psalm-return($default is null ? T|null : T)










*/
public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum
{
$value = $this->get($key);

if (null === $value) {
return $default;
}

try {
return $class::from($value);
} catch (\ValueError|\TypeError $e) {
throw new UnexpectedValueException(\sprintf('Parameter "%s" cannot be converted to enum: %s.', $key, $e->getMessage()), $e->getCode(), $e);
}
}












public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed
{
$value = $this->get($key, $default);


if (!\is_array($options) && $options) {
$options = ['flags' => $options];
}


if (\is_array($value) && !isset($options['flags'])) {
$options['flags'] = \FILTER_REQUIRE_ARRAY;
}

if (\is_object($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException(\sprintf('Parameter value "%s" cannot be filtered.', $key));
}

if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) {
throw new \InvalidArgumentException(\sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null)));
}

$options['flags'] ??= 0;
$nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE;
$options['flags'] |= \FILTER_NULL_ON_FAILURE;

$value = filter_var($value, $filter, $options);

if (null !== $value || $nullOnFailure) {
return $value;
}

throw new \UnexpectedValueException(\sprintf('Parameter value "%s" is invalid and flag "FILTER_NULL_ON_FAILURE" was not set.', $key));
}






public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->parameters);
}




public function count(): int
{
return \count($this->parameters);
}
}
<?php










namespace Symfony\Component\HttpFoundation;








class ServerBag extends ParameterBag
{



public function getHeaders(): array
{
$headers = [];
foreach ($this->parameters as $key => $value) {
if (str_starts_with($key, 'HTTP_')) {
$headers[substr($key, 5)] = $value;
} elseif (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true) && '' !== $value) {
$headers[$key] = $value;
}
}

if (isset($this->parameters['PHP_AUTH_USER'])) {
$headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER'];
$headers['PHP_AUTH_PW'] = $this->parameters['PHP_AUTH_PW'] ?? '';
} else {














$authorizationHeader = null;
if (isset($this->parameters['HTTP_AUTHORIZATION'])) {
$authorizationHeader = $this->parameters['HTTP_AUTHORIZATION'];
} elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) {
$authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION'];
}

if (null !== $authorizationHeader) {
if (0 === stripos($authorizationHeader, 'basic ')) {

$exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2);
if (2 == \count($exploded)) {
[$headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']] = $exploded;
}
} elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) {

$headers['PHP_AUTH_DIGEST'] = $authorizationHeader;
$this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;
} elseif (0 === stripos($authorizationHeader, 'bearer ')) {





$headers['AUTHORIZATION'] = $authorizationHeader;
}
}
}

if (isset($headers['AUTHORIZATION'])) {
return $headers;
}


if (isset($headers['PHP_AUTH_USER'])) {
$headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.($headers['PHP_AUTH_PW'] ?? ''));
} elseif (isset($headers['PHP_AUTH_DIGEST'])) {
$headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST'];
}

return $headers;
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class HeaderUtils
{
public const DISPOSITION_ATTACHMENT = 'attachment';
public const DISPOSITION_INLINE = 'inline';




private function __construct()
{
}















public static function split(string $header, string $separators): array
{
if ('' === $separators) {
throw new \InvalidArgumentException('At least one separator must be specified.');
}

$quotedSeparators = preg_quote($separators, '/');

preg_match_all('
            /
                (?!\s)
                    (?:
                        # quoted-string
                        "(?:[^"\\\\]|\\\\.)*(?:"|\\\\|$)
                    |
                        # token
                        [^"'.$quotedSeparators.']+
                    )+
                (?<!\s)
            |
                # separator
                \s*
                (?<separator>['.$quotedSeparators.'])
                \s*
            /x', trim($header), $matches, \PREG_SET_ORDER);

return self::groupParts($matches, $separators);
}














public static function combine(array $parts): array
{
$assoc = [];
foreach ($parts as $part) {
$name = strtolower($part[0]);
$value = $part[1] ?? true;
$assoc[$name] = $value;
}

return $assoc;
}













public static function toString(array $assoc, string $separator): string
{
$parts = [];
foreach ($assoc as $name => $value) {
if (true === $value) {
$parts[] = $name;
} else {
$parts[] = $name.'='.self::quote($value);
}
}

return implode($separator.' ', $parts);
}








public static function quote(string $s): string
{
if (preg_match('/^[a-z0-9!#$%&\'*.^_`|~-]+$/i', $s)) {
return $s;
}

return '"'.addcslashes($s, '"\\"').'"';
}







public static function unquote(string $s): string
{
return preg_replace('/\\\\(.)|"/', '$1', $s);
}














public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string
{
if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {
throw new \InvalidArgumentException(\sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
}

if ('' === $filenameFallback) {
$filenameFallback = $filename;
}


if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
}


if (str_contains($filenameFallback, '%')) {
throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
}


if (str_contains($filename, '/') || str_contains($filename, '\\') || str_contains($filenameFallback, '/') || str_contains($filenameFallback, '\\')) {
throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
}

$params = ['filename' => $filenameFallback];
if ($filename !== $filenameFallback) {
$params['filename*'] = "utf-8''".rawurlencode($filename);
}

return $disposition.'; '.self::toString($params, ';');
}




public static function parseQuery(string $query, bool $ignoreBrackets = false, string $separator = '&'): array
{
$q = [];

foreach (explode($separator, $query) as $v) {
if (false !== $i = strpos($v, "\0")) {
$v = substr($v, 0, $i);
}

if (false === $i = strpos($v, '=')) {
$k = urldecode($v);
$v = '';
} else {
$k = urldecode(substr($v, 0, $i));
$v = substr($v, $i);
}

if (false !== $i = strpos($k, "\0")) {
$k = substr($k, 0, $i);
}

$k = ltrim($k, ' ');

if ($ignoreBrackets) {
$q[$k][] = urldecode(substr($v, 1));

continue;
}

if (false === $i = strpos($k, '[')) {
$q[] = bin2hex($k).$v;
} else {
$q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v;
}
}

if ($ignoreBrackets) {
return $q;
}

parse_str(implode('&', $q), $q);

$query = [];

foreach ($q as $k => $v) {
if (false !== $i = strpos($k, '_')) {
$query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v;
} else {
$query[hex2bin($k)] = $v;
}
}

return $query;
}

private static function groupParts(array $matches, string $separators, bool $first = true): array
{
$separator = $separators[0];
$separators = substr($separators, 1) ?: '';
$i = 0;

if ('' === $separators && !$first) {
$parts = [''];

foreach ($matches as $match) {
if (!$i && isset($match['separator'])) {
$i = 1;
$parts[1] = '';
} else {
$parts[$i] .= self::unquote($match[0]);
}
}

return $parts;
}

$parts = [];
$partMatches = [];

foreach ($matches as $match) {
if (($match['separator'] ?? null) === $separator) {
++$i;
} else {
$partMatches[$i][] = $match;
}
}

foreach ($partMatches as $matches) {
if ('' === $separators && '' !== $unquoted = self::unquote($matches[0][0])) {
$parts[] = $unquoted;
} elseif ($groupedParts = self::groupParts($matches, $separators, false)) {
$parts[] = $groupedParts;
}
}

return $parts;
}
}
<?php










namespace Symfony\Component\HttpFoundation;
























class EventStreamResponse extends StreamedResponse
{




public function __construct(?callable $callback = null, int $status = 200, array $headers = [], private ?int $retry = null)
{
$headers += [
'Connection' => 'keep-alive',
'Content-Type' => 'text/event-stream',
'Cache-Control' => 'private, no-cache, no-store, must-revalidate, max-age=0',
'X-Accel-Buffering' => 'no',
'Pragma' => 'no-cache',
'Expire' => '0',
];

parent::__construct($callback, $status, $headers);
}

public function setCallback(callable $callback): static
{
if ($this->callback) {
return parent::setCallback($callback);
}

$this->callback = function () use ($callback) {
if (is_iterable($events = $callback($this))) {
foreach ($events as $event) {
$this->sendEvent($event);

if (connection_aborted()) {
break;
}
}
}
};

return $this;
}






public function sendEvent(ServerEvent $event): static
{
if ($this->retry > 0 && !$event->getRetry()) {
$event->setRetry($this->retry);
}

foreach ($event as $part) {
echo $part;

if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
static::closeOutputBuffers(0, true);
flush();
}
}

return $this;
}

public function getRetry(): ?int
{
return $this->retry;
}

public function setRetry(int $retry): void
{
$this->retry = $retry;
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class RedirectResponse extends Response
{
protected string $targetUrl;













public function __construct(string $url, int $status = 302, array $headers = [])
{
parent::__construct('', $status, $headers);

$this->setTargetUrl($url);

if (!$this->isRedirect()) {
throw new \InvalidArgumentException(\sprintf('The HTTP status code is not a redirect ("%s" given).', $status));
}

if (301 == $status && !\array_key_exists('cache-control', array_change_key_case($headers, \CASE_LOWER))) {
$this->headers->remove('cache-control');
}
}




public function getTargetUrl(): string
{
return $this->targetUrl;
}








public function setTargetUrl(string $url): static
{
if ('' === $url) {
throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
}

$this->targetUrl = $url;

$this->setContent(
\sprintf('<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url=\'%1$s\'" />

        <title>Redirecting to %1$s</title>
    </head>
    <body>
        Redirecting to <a href="%1$s">%1$s</a>.
    </body>
</html>', htmlspecialchars($url, \ENT_QUOTES, 'UTF-8')));

$this->headers->set('Location', $url);
$this->headers->set('Content-Type', 'text/html; charset=utf-8');

return $this;
}
}
<?php










namespace Symfony\Component\HttpFoundation\File;

use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException;
use Symfony\Component\HttpFoundation\File\Exception\NoFileException;
use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException;
use Symfony\Component\HttpFoundation\File\Exception\PartialFileException;
use Symfony\Component\Mime\MimeTypes;








class UploadedFile extends File
{
private string $originalName;
private string $mimeType;
private int $error;
private string $originalPath;

























public function __construct(
string $path,
string $originalName,
?string $mimeType = null,
?int $error = null,
private bool $test = false,
) {
$this->originalName = $this->getName($originalName);
$this->originalPath = strtr($originalName, '\\', '/');
$this->mimeType = $mimeType ?: 'application/octet-stream';
$this->error = $error ?: \UPLOAD_ERR_OK;

parent::__construct($path, \UPLOAD_ERR_OK === $this->error);
}







public function getClientOriginalName(): string
{
return $this->originalName;
}







public function getClientOriginalExtension(): string
{
return pathinfo($this->originalName, \PATHINFO_EXTENSION);
}











public function getClientOriginalPath(): string
{
return $this->originalPath;
}












public function getClientMimeType(): string
{
return $this->mimeType;
}
















public function guessClientExtension(): ?string
{
if (!class_exists(MimeTypes::class)) {
throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".');
}

return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null;
}







public function getError(): int
{
return $this->error;
}




public function isValid(): bool
{
$isOk = \UPLOAD_ERR_OK === $this->error;

return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());
}






public function move(string $directory, ?string $name = null): File
{
if ($this->isValid()) {
if ($this->test) {
return parent::move($directory, $name);
}

$target = $this->getTargetFile($directory, $name);

set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
try {
$moved = move_uploaded_file($this->getPathname(), $target);
} finally {
restore_error_handler();
}
if (!$moved) {
throw new FileException(\sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error)));
}

@chmod($target, 0666 & ~umask());

return $target;
}

switch ($this->error) {
case \UPLOAD_ERR_INI_SIZE:
throw new IniSizeFileException($this->getErrorMessage());
case \UPLOAD_ERR_FORM_SIZE:
throw new FormSizeFileException($this->getErrorMessage());
case \UPLOAD_ERR_PARTIAL:
throw new PartialFileException($this->getErrorMessage());
case \UPLOAD_ERR_NO_FILE:
throw new NoFileException($this->getErrorMessage());
case \UPLOAD_ERR_CANT_WRITE:
throw new CannotWriteFileException($this->getErrorMessage());
case \UPLOAD_ERR_NO_TMP_DIR:
throw new NoTmpDirFileException($this->getErrorMessage());
case \UPLOAD_ERR_EXTENSION:
throw new ExtensionFileException($this->getErrorMessage());
}

throw new FileException($this->getErrorMessage());
}






public static function getMaxFilesize(): int|float
{
$sizePostMax = self::parseFilesize(\ini_get('post_max_size'));
$sizeUploadMax = self::parseFilesize(\ini_get('upload_max_filesize'));

return min($sizePostMax ?: \PHP_INT_MAX, $sizeUploadMax ?: \PHP_INT_MAX);
}

private static function parseFilesize(string $size): int|float
{
if ('' === $size) {
return 0;
}

$size = strtolower($size);

$max = ltrim($size, '+');
if (str_starts_with($max, '0x')) {
$max = \intval($max, 16);
} elseif (str_starts_with($max, '0')) {
$max = \intval($max, 8);
} else {
$max = (int) $max;
}

switch (substr($size, -1)) {
case 't': $max *= 1024;

case 'g': $max *= 1024;

case 'm': $max *= 1024;

case 'k': $max *= 1024;
}

return $max;
}




public function getErrorMessage(): string
{
static $errors = [
\UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).',
\UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
\UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
\UPLOAD_ERR_NO_FILE => 'No file was uploaded.',
\UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
\UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
\UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
];

$errorCode = $this->error;
$maxFilesize = \UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0;
$message = $errors[$errorCode] ?? 'The file "%s" was not uploaded due to an unknown error.';

return \sprintf($message, $this->getClientOriginalName(), $maxFilesize);
}
}
<?php










namespace Symfony\Component\HttpFoundation\File;






class Stream extends File
{
public function getSize(): int|false
{
return false;
}
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class FileException extends \RuntimeException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class NoFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class CannotWriteFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class IniSizeFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class NoTmpDirFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class UploadException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;

class UnexpectedTypeException extends FileException
{
public function __construct(mixed $value, string $expectedType)
{
parent::__construct(\sprintf('Expected argument of type %s, %s given', $expectedType, get_debug_type($value)));
}
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class PartialFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class AccessDeniedException extends FileException
{
public function __construct(string $path)
{
parent::__construct(\sprintf('The file %s could not be accessed', $path));
}
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class FormSizeFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class FileNotFoundException extends FileException
{
public function __construct(string $path)
{
parent::__construct(\sprintf('The file "%s" does not exist', $path));
}
}
<?php










namespace Symfony\Component\HttpFoundation\File\Exception;






class ExtensionFileException extends FileException
{
}
<?php










namespace Symfony\Component\HttpFoundation\File;

use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\Mime\MimeTypes;






class File extends \SplFileInfo
{








public function __construct(string $path, bool $checkPath = true)
{
if ($checkPath && !is_file($path)) {
throw new FileNotFoundException($path);
}

parent::__construct($path);
}












public function guessExtension(): ?string
{
if (!class_exists(MimeTypes::class)) {
throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".');
}

return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null;
}










public function getMimeType(): ?string
{
if (!class_exists(MimeTypes::class)) {
throw new \LogicException('You cannot guess the mime type as the Mime component is not installed. Try running "composer require symfony/mime".');
}

return MimeTypes::getDefault()->guessMimeType($this->getPathname());
}






public function move(string $directory, ?string $name = null): self
{
$target = $this->getTargetFile($directory, $name);

set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
try {
$renamed = rename($this->getPathname(), $target);
} finally {
restore_error_handler();
}
if (!$renamed) {
throw new FileException(\sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error)));
}

@chmod($target, 0666 & ~umask());

return $target;
}

public function getContent(): string
{
$content = file_get_contents($this->getPathname());

if (false === $content) {
throw new FileException(\sprintf('Could not get the content of the file "%s".', $this->getPathname()));
}

return $content;
}

protected function getTargetFile(string $directory, ?string $name = null): self
{
if (!is_dir($directory)) {
if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
throw new FileException(\sprintf('Unable to create the "%s" directory.', $directory));
}
} elseif (!is_writable($directory)) {
throw new FileException(\sprintf('Unable to write in the "%s" directory.', $directory));
}

$target = rtrim($directory, '/\\').\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));

return new self($target, false);
}




protected function getName(string $name): string
{
$originalName = str_replace('\\', '/', $name);
$pos = strrpos($originalName, '/');

return false === $pos ? $originalName : substr($originalName, $pos + 1);
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RequestContextAwareInterface;






final class UrlHelper
{
public function __construct(
private RequestStack $requestStack,
private RequestContextAwareInterface|RequestContext|null $requestContext = null,
) {
}

public function getAbsoluteUrl(string $path): string
{
if (str_contains($path, '://') || str_starts_with($path, '//')) {
return $path;
}

if (null === $request = $this->requestStack->getMainRequest()) {
return $this->getAbsoluteUrlFromContext($path);
}

if ('#' === $path[0]) {
$path = $request->getRequestUri().$path;
} elseif ('?' === $path[0]) {
$path = $request->getPathInfo().$path;
}

if (!$path || '/' !== $path[0]) {
$prefix = $request->getPathInfo();
$last = \strlen($prefix) - 1;
if ($last !== $pos = strrpos($prefix, '/')) {
$prefix = substr($prefix, 0, $pos).'/';
}

return $request->getUriForPath($prefix.$path);
}

return $request->getSchemeAndHttpHost().$path;
}

public function getRelativePath(string $path): string
{
if (str_contains($path, '://') || str_starts_with($path, '//')) {
return $path;
}

if (null === $request = $this->requestStack->getMainRequest()) {
return $path;
}

return $request->getRelativeUriForPath($path);
}

private function getAbsoluteUrlFromContext(string $path): string
{
if (null === $context = $this->requestContext) {
return $path;
}

if ($context instanceof RequestContextAwareInterface) {
$context = $context->getContext();
}

if ('' === $host = $context->getHost()) {
return $path;
}

$scheme = $context->getScheme();
$port = '';

if ('http' === $scheme && 80 !== $context->getHttpPort()) {
$port = ':'.$context->getHttpPort();
} elseif ('https' === $scheme && 443 !== $context->getHttpsPort()) {
$port = ':'.$context->getHttpsPort();
}

if ('#' === $path[0]) {
$queryString = $context->getQueryString();
$path = $context->getPathInfo().($queryString ? '?'.$queryString : '').$path;
} elseif ('?' === $path[0]) {
$path = $context->getPathInfo().$path;
}

if ('/' !== $path[0]) {
$path = rtrim($context->getBaseUrl(), '/').'/'.$path;
}

return $scheme.'://'.$host.$port.$path;
}
}
<?php










namespace Symfony\Component\HttpFoundation;


class_exists(AcceptHeaderItem::class);









class AcceptHeader
{



private array $items = [];

private bool $sorted = true;




public function __construct(array $items)
{
foreach ($items as $item) {
$this->add($item);
}
}




public static function fromString(?string $headerValue): self
{
$parts = HeaderUtils::split($headerValue ?? '', ',;=');

return new self(array_map(function ($subParts) {
static $index = 0;
$part = array_shift($subParts);
$attributes = HeaderUtils::combine($subParts);

$item = new AcceptHeaderItem($part[0], $attributes);
$item->setIndex($index++);

return $item;
}, $parts));
}




public function __toString(): string
{
return implode(',', $this->items);
}




public function has(string $value): bool
{
return isset($this->items[$value]);
}




public function get(string $value): ?AcceptHeaderItem
{
return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null;
}






public function add(AcceptHeaderItem $item): static
{
$this->items[$item->getValue()] = $item;
$this->sorted = false;

return $this;
}






public function all(): array
{
$this->sort();

return $this->items;
}




public function filter(string $pattern): self
{
return new self(array_filter($this->items, fn (AcceptHeaderItem $item) => preg_match($pattern, $item->getValue())));
}




public function first(): ?AcceptHeaderItem
{
$this->sort();

return $this->items ? reset($this->items) : null;
}




private function sort(): void
{
if (!$this->sorted) {
uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) {
$qA = $a->getQuality();
$qB = $b->getQuality();

if ($qA === $qB) {
return $a->getIndex() > $b->getIndex() ? 1 : -1;
}

return $qA > $qB ? -1 : 1;
});

$this->sorted = true;
}
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Request;

final class RequestAttributeValueSame extends Constraint
{
public function __construct(
private string $name,
private string $value,
) {
}

public function toString(): string
{
return \sprintf('has attribute "%s" with value "%s"', $this->name, $this->value);
}




protected function matches($request): bool
{
return $this->value === $request->attributes->get($this->name);
}




protected function failureDescription($request): string
{
return 'the Request '.$this->toString();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






final class ResponseFormatSame extends Constraint
{
public function __construct(
private Request $request,
private ?string $format,
private readonly bool $verbose = true,
) {
}

public function toString(): string
{
return 'format is '.($this->format ?? 'null');
}




protected function matches($response): bool
{
return $this->format === $this->request->getFormat($response->headers->get('Content-Type'));
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}




protected function additionalFailureDescription($response): string
{
return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0];
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseHasHeader extends Constraint
{
public function __construct(
private string $headerName,
) {
}

public function toString(): string
{
return \sprintf('has header "%s"', $this->headerName);
}




protected function matches($response): bool
{
return $response->headers->has($this->headerName);
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class ResponseHeaderLocationSame extends Constraint
{
public function __construct(private Request $request, private string $expectedValue)
{
}

public function toString(): string
{
return \sprintf('has header "Location" matching "%s"', $this->expectedValue);
}

protected function matches($other): bool
{
if (!$other instanceof Response) {
return false;
}

$location = $other->headers->get('Location');

if (null === $location) {
return false;
}

return $this->toFullUrl($this->expectedValue) === $this->toFullUrl($location);
}

protected function failureDescription($other): string
{
return 'the Response '.$this->toString();
}

private function toFullUrl(string $url): string
{
if (null === parse_url($url, \PHP_URL_PATH)) {
$url .= '/';
}

if (str_starts_with($url, '//')) {
return \sprintf('%s:%s', $this->request->getScheme(), $url);
}

if (str_starts_with($url, '/')) {
return $this->request->getSchemeAndHttpHost().$url;
}

return $url;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseIsSuccessful extends Constraint
{



public function __construct(private readonly bool $verbose = true)
{
}

public function toString(): string
{
return 'is successful';
}




protected function matches($response): bool
{
return $response->isSuccessful();
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}




protected function additionalFailureDescription($response): string
{
return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0];
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseHeaderSame extends Constraint
{
public function __construct(
private string $headerName,
private string $expectedValue,
) {
}

public function toString(): string
{
return \sprintf('has header "%s" with value "%s"', $this->headerName, $this->expectedValue);
}




protected function matches($response): bool
{
return $this->expectedValue === $response->headers->get($this->headerName, null);
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;

final class ResponseCookieValueSame extends Constraint
{
public function __construct(
private string $name,
private string $value,
private string $path = '/',
private ?string $domain = null,
) {
}

public function toString(): string
{
$str = \sprintf('has cookie "%s"', $this->name);
if ('/' !== $this->path) {
$str .= \sprintf(' with path "%s"', $this->path);
}
if ($this->domain) {
$str .= \sprintf(' for domain "%s"', $this->domain);
}

return $str.\sprintf(' with value "%s"', $this->value);
}




protected function matches($response): bool
{
$cookie = $this->getCookie($response);
if (!$cookie) {
return false;
}

return $this->value === (string) $cookie->getValue();
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}

protected function getCookie(Response $response): ?Cookie
{
$cookies = $response->headers->getCookies();

$filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain);

return reset($filteredCookies) ?: null;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseStatusCodeSame extends Constraint
{
public function __construct(
private int $statusCode,
private readonly bool $verbose = true,
) {
}

public function toString(): string
{
return 'status code is '.$this->statusCode;
}




protected function matches($response): bool
{
return $this->statusCode === $response->getStatusCode();
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}




protected function additionalFailureDescription($response): string
{
return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0];
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseIsUnprocessable extends Constraint
{



public function __construct(private readonly bool $verbose = true)
{
}

public function toString(): string
{
return 'is unprocessable';
}




protected function matches($other): bool
{
return Response::HTTP_UNPROCESSABLE_ENTITY === $other->getStatusCode();
}




protected function failureDescription($other): string
{
return 'the Response '.$this->toString();
}




protected function additionalFailureDescription($response): string
{
return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0];
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Response;

final class ResponseIsRedirected extends Constraint
{



public function __construct(private readonly bool $verbose = true)
{
}

public function toString(): string
{
return 'is redirected';
}




protected function matches($response): bool
{
return $response->isRedirect();
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}




protected function additionalFailureDescription($response): string
{
return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0];
}
}
<?php










namespace Symfony\Component\HttpFoundation\Test\Constraint;

use PHPUnit\Framework\Constraint\Constraint;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;

final class ResponseHasCookie extends Constraint
{
public function __construct(
private string $name,
private string $path = '/',
private ?string $domain = null,
) {
}

public function toString(): string
{
$str = \sprintf('has cookie "%s"', $this->name);
if ('/' !== $this->path) {
$str .= \sprintf(' with path "%s"', $this->path);
}
if ($this->domain) {
$str .= \sprintf(' for domain "%s"', $this->domain);
}

return $str;
}




protected function matches($response): bool
{
return null !== $this->getCookie($response);
}




protected function failureDescription($response): string
{
return 'the Response '.$this->toString();
}

private function getCookie(Response $response): ?Cookie
{
$cookies = $response->headers->getCookies();

$filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain);

return reset($filteredCookies) ?: null;
}
}
<?php










namespace Symfony\Component\HttpFoundation;












class JsonResponse extends Response
{
protected mixed $data;
protected ?string $callback = null;



public const DEFAULT_ENCODING_OPTIONS = 15;

protected int $encodingOptions = self::DEFAULT_ENCODING_OPTIONS;




public function __construct(mixed $data = null, int $status = 200, array $headers = [], bool $json = false)
{
parent::__construct('', $status, $headers);

if ($json && !\is_string($data) && !is_numeric($data) && !$data instanceof \Stringable) {
throw new \TypeError(\sprintf('"%s": If $json is set to true, argument $data must be a string or object implementing __toString(), "%s" given.', __METHOD__, get_debug_type($data)));
}

$data ??= new \ArrayObject();

$json ? $this->setJson($data) : $this->setData($data);
}













public static function fromJsonString(string $data, int $status = 200, array $headers = []): static
{
return new static($data, $status, $headers, true);
}










public function setCallback(?string $callback): static
{
if (null !== $callback) {




$pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u';
$reserved = [
'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while',
'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export',
'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false',
];
$parts = explode('.', $callback);
foreach ($parts as $part) {
if (!preg_match($pattern, $part) || \in_array($part, $reserved, true)) {
throw new \InvalidArgumentException('The callback name is not valid.');
}
}
}

$this->callback = $callback;

return $this->update();
}






public function setJson(string $json): static
{
$this->data = $json;

return $this->update();
}








public function setData(mixed $data = []): static
{
try {
$data = json_encode($data, $this->encodingOptions);
} catch (\Exception $e) {
if ('Exception' === $e::class && str_starts_with($e->getMessage(), 'Failed calling ')) {
throw $e->getPrevious() ?: $e;
}
throw $e;
}

if (\JSON_THROW_ON_ERROR & $this->encodingOptions) {
return $this->setJson($data);
}

if (\JSON_ERROR_NONE !== json_last_error()) {
throw new \InvalidArgumentException(json_last_error_msg());
}

return $this->setJson($data);
}




public function getEncodingOptions(): int
{
return $this->encodingOptions;
}






public function setEncodingOptions(int $encodingOptions): static
{
$this->encodingOptions = $encodingOptions;

return $this->setData(json_decode($this->data));
}






protected function update(): static
{
if (null !== $this->callback) {

$this->headers->set('Content-Type', 'text/javascript');

return $this->setContent(\sprintf('/**/%s(%s);', $this->callback, $this->data));
}



if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {
$this->headers->set('Content-Type', 'application/json');
}

return $this->setContent($this->data);
}
}
<?php










namespace Symfony\Component\HttpFoundation;
































class StreamedJsonResponse extends StreamedResponse
{
private const PLACEHOLDER = '__symfony_json__';







public function __construct(
private readonly iterable $data,
int $status = 200,
array $headers = [],
private int $encodingOptions = JsonResponse::DEFAULT_ENCODING_OPTIONS,
) {
parent::__construct($this->stream(...), $status, $headers);

if (!$this->headers->get('Content-Type')) {
$this->headers->set('Content-Type', 'application/json');
}
}

private function stream(): void
{
$jsonEncodingOptions = \JSON_THROW_ON_ERROR | $this->encodingOptions;
$keyEncodingOptions = $jsonEncodingOptions & ~\JSON_NUMERIC_CHECK;

$this->streamData($this->data, $jsonEncodingOptions, $keyEncodingOptions);
}

private function streamData(mixed $data, int $jsonEncodingOptions, int $keyEncodingOptions): void
{
if (\is_array($data)) {
$this->streamArray($data, $jsonEncodingOptions, $keyEncodingOptions);

return;
}

if (is_iterable($data) && !$data instanceof \JsonSerializable) {
$this->streamIterable($data, $jsonEncodingOptions, $keyEncodingOptions);

return;
}

echo json_encode($data, $jsonEncodingOptions);
}

private function streamArray(array $data, int $jsonEncodingOptions, int $keyEncodingOptions): void
{
$generators = [];

array_walk_recursive($data, function (&$item, $key) use (&$generators) {
if (self::PLACEHOLDER === $key) {


$generators[] = $key;
}


if (\is_object($item)) {
$generators[] = $item;
$item = self::PLACEHOLDER;
} elseif (self::PLACEHOLDER === $item) {


$generators[] = $item;
}
});

$jsonParts = explode('"'.self::PLACEHOLDER.'"', json_encode($data, $jsonEncodingOptions));

foreach ($generators as $index => $generator) {

echo $jsonParts[$index];

$this->streamData($generator, $jsonEncodingOptions, $keyEncodingOptions);
}


echo $jsonParts[array_key_last($jsonParts)];
}

private function streamIterable(iterable $iterable, int $jsonEncodingOptions, int $keyEncodingOptions): void
{
$isFirstItem = true;
$startTag = '[';

foreach ($iterable as $key => $item) {
if ($isFirstItem) {
$isFirstItem = false;



if (0 !== $key) {
$startTag = '{';
}

echo $startTag;
} else {

echo ',';
}

if ('{' === $startTag) {
echo json_encode((string) $key, $keyEncodingOptions).':';
}

$this->streamData($item, $jsonEncodingOptions, $keyEncodingOptions);
}

if ($isFirstItem) { 
echo '[';
}

echo '[' === $startTag ? ']' : '}';
}
}
<?php










namespace Symfony\Component\HttpFoundation;






interface RequestMatcherInterface
{



public function matches(Request $request): bool;
}
<?php










namespace Symfony\Component\HttpFoundation\RateLimiter;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\RateLimiter\RateLimit;









interface RequestRateLimiterInterface
{
public function consume(Request $request): RateLimit;

public function reset(Request $request): void;
}
<?php










namespace Symfony\Component\HttpFoundation\RateLimiter;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\RateLimiter\RateLimit;
















interface PeekableRequestRateLimiterInterface extends RequestRateLimiterInterface
{
public function peek(Request $request): RateLimit;
}
<?php










namespace Symfony\Component\HttpFoundation\RateLimiter;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\RateLimiter\LimiterInterface;
use Symfony\Component\RateLimiter\Policy\NoLimiter;
use Symfony\Component\RateLimiter\RateLimit;







abstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface
{
public function consume(Request $request): RateLimit
{
return $this->doConsume($request, 1);
}

public function peek(Request $request): RateLimit
{
return $this->doConsume($request, 0);
}

private function doConsume(Request $request, int $tokens): RateLimit
{
$limiters = $this->getLimiters($request);
if (0 === \count($limiters)) {
$limiters = [new NoLimiter()];
}

$minimalRateLimit = null;
foreach ($limiters as $limiter) {
$rateLimit = $limiter->consume($tokens);

$minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit;
}

return $minimalRateLimit;
}

public function reset(Request $request): void
{
foreach ($this->getLimiters($request) as $limiter) {
$limiter->reset();
}
}




abstract protected function getLimiters(Request $request): array;

private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit
{
if ($first->isAccepted() !== $second->isAccepted()) {
return $first->isAccepted() ? $second : $first;
}

$firstRemainingTokens = $first->getRemainingTokens();
$secondRemainingTokens = $second->getRemainingTokens();

if ($firstRemainingTokens === $secondRemainingTokens) {
return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first;
}

return $firstRemainingTokens > $secondRemainingTokens ? $second : $first;
}
}
<?php










namespace Symfony\Component\HttpFoundation;


class_exists(ResponseHeaderBag::class);






class Response
{
public const HTTP_CONTINUE = 100;
public const HTTP_SWITCHING_PROTOCOLS = 101;
public const HTTP_PROCESSING = 102; 
public const HTTP_EARLY_HINTS = 103; 
public const HTTP_OK = 200;
public const HTTP_CREATED = 201;
public const HTTP_ACCEPTED = 202;
public const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
public const HTTP_NO_CONTENT = 204;
public const HTTP_RESET_CONTENT = 205;
public const HTTP_PARTIAL_CONTENT = 206;
public const HTTP_MULTI_STATUS = 207; 
public const HTTP_ALREADY_REPORTED = 208; 
public const HTTP_IM_USED = 226; 
public const HTTP_MULTIPLE_CHOICES = 300;
public const HTTP_MOVED_PERMANENTLY = 301;
public const HTTP_FOUND = 302;
public const HTTP_SEE_OTHER = 303;
public const HTTP_NOT_MODIFIED = 304;
public const HTTP_USE_PROXY = 305;
public const HTTP_RESERVED = 306;
public const HTTP_TEMPORARY_REDIRECT = 307;
public const HTTP_PERMANENTLY_REDIRECT = 308; 
public const HTTP_BAD_REQUEST = 400;
public const HTTP_UNAUTHORIZED = 401;
public const HTTP_PAYMENT_REQUIRED = 402;
public const HTTP_FORBIDDEN = 403;
public const HTTP_NOT_FOUND = 404;
public const HTTP_METHOD_NOT_ALLOWED = 405;
public const HTTP_NOT_ACCEPTABLE = 406;
public const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
public const HTTP_REQUEST_TIMEOUT = 408;
public const HTTP_CONFLICT = 409;
public const HTTP_GONE = 410;
public const HTTP_LENGTH_REQUIRED = 411;
public const HTTP_PRECONDITION_FAILED = 412;
public const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
public const HTTP_REQUEST_URI_TOO_LONG = 414;
public const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
public const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
public const HTTP_EXPECTATION_FAILED = 417;
public const HTTP_I_AM_A_TEAPOT = 418; 
public const HTTP_MISDIRECTED_REQUEST = 421; 
public const HTTP_UNPROCESSABLE_ENTITY = 422; 
public const HTTP_LOCKED = 423; 
public const HTTP_FAILED_DEPENDENCY = 424; 
public const HTTP_TOO_EARLY = 425; 
public const HTTP_UPGRADE_REQUIRED = 426; 
public const HTTP_PRECONDITION_REQUIRED = 428; 
public const HTTP_TOO_MANY_REQUESTS = 429; 
public const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; 
public const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451; 
public const HTTP_INTERNAL_SERVER_ERROR = 500;
public const HTTP_NOT_IMPLEMENTED = 501;
public const HTTP_BAD_GATEWAY = 502;
public const HTTP_SERVICE_UNAVAILABLE = 503;
public const HTTP_GATEWAY_TIMEOUT = 504;
public const HTTP_VERSION_NOT_SUPPORTED = 505;
public const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; 
public const HTTP_INSUFFICIENT_STORAGE = 507; 
public const HTTP_LOOP_DETECTED = 508; 
public const HTTP_NOT_EXTENDED = 510; 
public const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; 




private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [
'must_revalidate' => false,
'no_cache' => false,
'no_store' => false,
'no_transform' => false,
'public' => false,
'private' => false,
'proxy_revalidate' => false,
'max_age' => true,
's_maxage' => true,
'stale_if_error' => true, 
'stale_while_revalidate' => true, 
'immutable' => false,
'last_modified' => true,
'etag' => true,
];

public ResponseHeaderBag $headers;

protected string $content;
protected string $version;
protected int $statusCode;
protected string $statusText;
protected ?string $charset = null;












public static array $statusTexts = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing', 
103 => 'Early Hints',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status', 
208 => 'Already Reported', 
226 => 'IM Used', 
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect', 
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Content Too Large', 
414 => 'URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot', 
421 => 'Misdirected Request', 
422 => 'Unprocessable Content', 
423 => 'Locked', 
424 => 'Failed Dependency', 
425 => 'Too Early', 
426 => 'Upgrade Required', 
428 => 'Precondition Required', 
429 => 'Too Many Requests', 
431 => 'Request Header Fields Too Large', 
451 => 'Unavailable For Legal Reasons', 
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates', 
507 => 'Insufficient Storage', 
508 => 'Loop Detected', 
510 => 'Not Extended', 
511 => 'Network Authentication Required', 
];




private array $sentHeaders;






public function __construct(?string $content = '', int $status = 200, array $headers = [])
{
$this->headers = new ResponseHeaderBag($headers);
$this->setContent($content);
$this->setStatusCode($status);
$this->setProtocolVersion('1.0');
}










public function __toString(): string
{
return
\sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
$this->headers."\r\n".
$this->getContent();
}




public function __clone()
{
$this->headers = clone $this->headers;
}










public function prepare(Request $request): static
{
$headers = $this->headers;

if ($this->isInformational() || $this->isEmpty()) {
$this->setContent(null);
$headers->remove('Content-Type');
$headers->remove('Content-Length');

ini_set('default_mimetype', '');
} else {

if (!$headers->has('Content-Type')) {
$format = $request->getRequestFormat(null);
if (null !== $format && $mimeType = $request->getMimeType($format)) {
$headers->set('Content-Type', $mimeType);
}
}


$charset = $this->charset ?: 'UTF-8';
if (!$headers->has('Content-Type')) {
$headers->set('Content-Type', 'text/html; charset='.$charset);
} elseif (0 === stripos($headers->get('Content-Type') ?? '', 'text/') && false === stripos($headers->get('Content-Type') ?? '', 'charset')) {

$headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
}


if ($headers->has('Transfer-Encoding')) {
$headers->remove('Content-Length');
}

if ($request->isMethod('HEAD')) {

$length = $headers->get('Content-Length');
$this->setContent(null);
if ($length) {
$headers->set('Content-Length', $length);
}
}
}


if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {
$this->setProtocolVersion('1.1');
}


if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control', ''), 'no-cache')) {
$headers->set('pragma', 'no-cache');
$headers->set('expires', -1);
}

$this->ensureIEOverSSLCompatibility($request);

if ($request->isSecure()) {
foreach ($headers->getCookies() as $cookie) {
$cookie->setSecureDefault(true);
}
}

return $this;
}








public function sendHeaders(?int $statusCode = null): static
{

if (headers_sent()) {
return $this;
}

$informationalResponse = $statusCode >= 100 && $statusCode < 200;
if ($informationalResponse && !\function_exists('headers_send')) {

return $this;
}


foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {

$previousValues = $this->sentHeaders[$name] ?? null;
if ($previousValues === $values) {

continue;
}

$replace = 0 === strcasecmp($name, 'Content-Type');

if (null !== $previousValues && array_diff($previousValues, $values)) {
header_remove($name);
$previousValues = null;
}

$newValues = null === $previousValues ? $values : array_diff($values, $previousValues);

foreach ($newValues as $value) {
header($name.': '.$value, $replace, $this->statusCode);
}

if ($informationalResponse) {
$this->sentHeaders[$name] = $values;
}
}


foreach ($this->headers->getCookies() as $cookie) {
header('Set-Cookie: '.$cookie, false, $this->statusCode);
}

if ($informationalResponse) {
headers_send($statusCode);

return $this;
}

$statusCode ??= $this->statusCode;


header(\sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode);

return $this;
}






public function sendContent(): static
{
echo $this->content;

return $this;
}








public function send(bool $flush = true): static
{
$this->sendHeaders();
$this->sendContent();

if (!$flush) {
return $this;
}

if (\function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} elseif (\function_exists('litespeed_finish_request')) {
litespeed_finish_request();
} elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
static::closeOutputBuffers(0, true);
flush();
}

return $this;
}






public function setContent(?string $content): static
{
$this->content = $content ?? '';

return $this;
}




public function getContent(): string|false
{
return $this->content;
}








public function setProtocolVersion(string $version): static
{
$this->version = $version;

return $this;
}






public function getProtocolVersion(): string
{
return $this->version;
}













public function setStatusCode(int $code, ?string $text = null): static
{
$this->statusCode = $code;
if ($this->isInvalid()) {
throw new \InvalidArgumentException(\sprintf('The HTTP status code "%s" is not valid.', $code));
}

if (null === $text) {
$this->statusText = self::$statusTexts[$code] ?? 'unknown status';

return $this;
}

$this->statusText = $text;

return $this;
}






public function getStatusCode(): int
{
return $this->statusCode;
}








public function setCharset(string $charset): static
{
$this->charset = $charset;

return $this;
}






public function getCharset(): ?string
{
return $this->charset;
}


















public function isCacheable(): bool
{
if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) {
return false;
}

if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) {
return false;
}

return $this->isValidateable() || $this->isFresh();
}










public function isFresh(): bool
{
return $this->getTtl() > 0;
}







public function isValidateable(): bool
{
return $this->headers->has('Last-Modified') || $this->headers->has('ETag');
}










public function setPrivate(): static
{
$this->headers->removeCacheControlDirective('public');
$this->headers->addCacheControlDirective('private');

return $this;
}










public function setPublic(): static
{
$this->headers->addCacheControlDirective('public');
$this->headers->removeCacheControlDirective('private');

return $this;
}








public function setImmutable(bool $immutable = true): static
{
if ($immutable) {
$this->headers->addCacheControlDirective('immutable');
} else {
$this->headers->removeCacheControlDirective('immutable');
}

return $this;
}






public function isImmutable(): bool
{
return $this->headers->hasCacheControlDirective('immutable');
}











public function mustRevalidate(): bool
{
return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate');
}








public function getDate(): ?\DateTimeImmutable
{
return $this->headers->getDate('Date');
}








public function setDate(\DateTimeInterface $date): static
{
$date = \DateTimeImmutable::createFromInterface($date);
$date = $date->setTimezone(new \DateTimeZone('UTC'));
$this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');

return $this;
}






public function getAge(): int
{
if (null !== $age = $this->headers->get('Age')) {
return (int) $age;
}

return max(time() - (int) $this->getDate()->format('U'), 0);
}






public function expire(): static
{
if ($this->isFresh()) {
$this->headers->set('Age', $this->getMaxAge());
$this->headers->remove('Expires');
}

return $this;
}






public function getExpires(): ?\DateTimeImmutable
{
try {
return $this->headers->getDate('Expires');
} catch (\RuntimeException) {

return \DateTimeImmutable::createFromFormat('U', time() - 172800);
}
}










public function setExpires(?\DateTimeInterface $date): static
{
if (null === $date) {
$this->headers->remove('Expires');

return $this;
}

$date = \DateTimeImmutable::createFromInterface($date);
$date = $date->setTimezone(new \DateTimeZone('UTC'));
$this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');

return $this;
}










public function getMaxAge(): ?int
{
if ($this->headers->hasCacheControlDirective('s-maxage')) {
return (int) $this->headers->getCacheControlDirective('s-maxage');
}

if ($this->headers->hasCacheControlDirective('max-age')) {
return (int) $this->headers->getCacheControlDirective('max-age');
}

if (null !== $expires = $this->getExpires()) {
$maxAge = (int) $expires->format('U') - (int) $this->getDate()->format('U');

return max($maxAge, 0);
}

return null;
}










public function setMaxAge(int $value): static
{
$this->headers->addCacheControlDirective('max-age', $value);

return $this;
}










public function setStaleIfError(int $value): static
{
$this->headers->addCacheControlDirective('stale-if-error', $value);

return $this;
}










public function setStaleWhileRevalidate(int $value): static
{
$this->headers->addCacheControlDirective('stale-while-revalidate', $value);

return $this;
}










public function setSharedMaxAge(int $value): static
{
$this->setPublic();
$this->headers->addCacheControlDirective('s-maxage', $value);

return $this;
}











public function getTtl(): ?int
{
$maxAge = $this->getMaxAge();

return null !== $maxAge ? max($maxAge - $this->getAge(), 0) : null;
}










public function setTtl(int $seconds): static
{
$this->setSharedMaxAge($this->getAge() + $seconds);

return $this;
}










public function setClientTtl(int $seconds): static
{
$this->setMaxAge($this->getAge() + $seconds);

return $this;
}








public function getLastModified(): ?\DateTimeImmutable
{
return $this->headers->getDate('Last-Modified');
}










public function setLastModified(?\DateTimeInterface $date): static
{
if (null === $date) {
$this->headers->remove('Last-Modified');

return $this;
}

$date = \DateTimeImmutable::createFromInterface($date);
$date = $date->setTimezone(new \DateTimeZone('UTC'));
$this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');

return $this;
}






public function getEtag(): ?string
{
return $this->headers->get('ETag');
}











public function setEtag(?string $etag, bool $weak = false): static
{
if (null === $etag) {
$this->headers->remove('Etag');
} else {
if (!str_starts_with($etag, '"')) {
$etag = '"'.$etag.'"';
}

$this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag);
}

return $this;
}












public function setCache(array $options): static
{
if ($diff = array_diff(array_keys($options), array_keys(self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) {
throw new \InvalidArgumentException(\sprintf('Response does not support the following options: "%s".', implode('", "', $diff)));
}

if (isset($options['etag'])) {
$this->setEtag($options['etag']);
}

if (isset($options['last_modified'])) {
$this->setLastModified($options['last_modified']);
}

if (isset($options['max_age'])) {
$this->setMaxAge($options['max_age']);
}

if (isset($options['s_maxage'])) {
$this->setSharedMaxAge($options['s_maxage']);
}

if (isset($options['stale_while_revalidate'])) {
$this->setStaleWhileRevalidate($options['stale_while_revalidate']);
}

if (isset($options['stale_if_error'])) {
$this->setStaleIfError($options['stale_if_error']);
}

foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) {
if (!$hasValue && isset($options[$directive])) {
if ($options[$directive]) {
$this->headers->addCacheControlDirective(str_replace('_', '-', $directive));
} else {
$this->headers->removeCacheControlDirective(str_replace('_', '-', $directive));
}
}
}

if (isset($options['public'])) {
if ($options['public']) {
$this->setPublic();
} else {
$this->setPrivate();
}
}

if (isset($options['private'])) {
if ($options['private']) {
$this->setPrivate();
} else {
$this->setPublic();
}
}

return $this;
}













public function setNotModified(): static
{
$this->setStatusCode(304);
$this->setContent(null);


foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) {
$this->headers->remove($header);
}

return $this;
}






public function hasVary(): bool
{
return null !== $this->headers->get('Vary');
}






public function getVary(): array
{
if (!$vary = $this->headers->all('Vary')) {
return [];
}

$ret = [];
foreach ($vary as $item) {
$ret[] = preg_split('/[\s,]+/', $item);
}

return array_merge([], ...$ret);
}










public function setVary(string|array $headers, bool $replace = true): static
{
$this->headers->set('Vary', $headers, $replace);

return $this;
}










public function isNotModified(Request $request): bool
{
if (!$request->isMethodCacheable()) {
return false;
}

$notModified = false;
$lastModified = $this->headers->get('Last-Modified');
$modifiedSince = $request->headers->get('If-Modified-Since');

if (($ifNoneMatchEtags = $request->getETags()) && (null !== $etag = $this->getEtag())) {
if (0 == strncmp($etag, 'W/', 2)) {
$etag = substr($etag, 2);
}


foreach ($ifNoneMatchEtags as $ifNoneMatchEtag) {
if (0 == strncmp($ifNoneMatchEtag, 'W/', 2)) {
$ifNoneMatchEtag = substr($ifNoneMatchEtag, 2);
}

if ($ifNoneMatchEtag === $etag || '*' === $ifNoneMatchEtag) {
$notModified = true;
break;
}
}
}

elseif ($modifiedSince && $lastModified) {
$notModified = strtotime($modifiedSince) >= strtotime($lastModified);
}

if ($notModified) {
$this->setNotModified();
}

return $notModified;
}








public function isInvalid(): bool
{
return $this->statusCode < 100 || $this->statusCode >= 600;
}






public function isInformational(): bool
{
return $this->statusCode >= 100 && $this->statusCode < 200;
}






public function isSuccessful(): bool
{
return $this->statusCode >= 200 && $this->statusCode < 300;
}






public function isRedirection(): bool
{
return $this->statusCode >= 300 && $this->statusCode < 400;
}






public function isClientError(): bool
{
return $this->statusCode >= 400 && $this->statusCode < 500;
}






public function isServerError(): bool
{
return $this->statusCode >= 500 && $this->statusCode < 600;
}






public function isOk(): bool
{
return 200 === $this->statusCode;
}






public function isForbidden(): bool
{
return 403 === $this->statusCode;
}






public function isNotFound(): bool
{
return 404 === $this->statusCode;
}






public function isRedirect(?string $location = null): bool
{
return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location'));
}






public function isEmpty(): bool
{
return \in_array($this->statusCode, [204, 304]);
}








public static function closeOutputBuffers(int $targetLevel, bool $flush): void
{
$status = ob_get_status(true);
$level = \count($status);
$flags = \PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? \PHP_OUTPUT_HANDLER_FLUSHABLE : \PHP_OUTPUT_HANDLER_CLEANABLE);

while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) {
if ($flush) {
ob_end_flush();
} else {
ob_end_clean();
}
}
}






public function setContentSafe(bool $safe = true): void
{
if ($safe) {
$this->headers->set('Preference-Applied', 'safe');
} elseif ('safe' === $this->headers->get('Preference-Applied')) {
$this->headers->remove('Preference-Applied');
}

$this->setVary('Prefer', false);
}








protected function ensureIEOverSSLCompatibility(Request $request): void
{
if (false !== stripos($this->headers->get('Content-Disposition') ?? '', 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT') ?? '', $match) && true === $request->isSecure()) {
if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) {
$this->headers->remove('Cache-Control');
}
}
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class IpUtils
{
public const PRIVATE_SUBNETS = [
'127.0.0.0/8', 
'10.0.0.0/8', 
'192.168.0.0/16', 
'172.16.0.0/12', 
'169.254.0.0/16', 
'0.0.0.0/8', 
'240.0.0.0/4', 
'::1/128', 
'fc00::/7', 
'fe80::/10', 
'::ffff:0:0/96', 
'::/128', 
];

private static array $checkedIps = [];




private function __construct()
{
}






public static function checkIp(string $requestIp, string|array $ips): bool
{
if (!\is_array($ips)) {
$ips = [$ips];
}

$method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';

foreach ($ips as $ip) {
if (self::$method($requestIp, $ip)) {
return true;
}
}

return false;
}









public static function checkIp4(string $requestIp, string $ip): bool
{
$cacheKey = $requestIp.'-'.$ip.'-v4';
if (null !== $cacheValue = self::getCacheResult($cacheKey)) {
return $cacheValue;
}

if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) {
return self::setCacheResult($cacheKey, false);
}

if (str_contains($ip, '/')) {
[$address, $netmask] = explode('/', $ip, 2);

if ('0' === $netmask) {
return self::setCacheResult($cacheKey, false !== filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4));
}

if ($netmask < 0 || $netmask > 32) {
return self::setCacheResult($cacheKey, false);
}
} else {
$address = $ip;
$netmask = 32;
}

if (false === ip2long($address)) {
return self::setCacheResult($cacheKey, false);
}

return self::setCacheResult($cacheKey, 0 === substr_compare(\sprintf('%032b', ip2long($requestIp)), \sprintf('%032b', ip2long($address)), 0, $netmask));
}













public static function checkIp6(string $requestIp, string $ip): bool
{
$cacheKey = $requestIp.'-'.$ip.'-v6';
if (null !== $cacheValue = self::getCacheResult($cacheKey)) {
return $cacheValue;
}

if (!((\extension_loaded('sockets') && \defined('AF_INET6')) || @inet_pton('::1'))) {
throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
}


if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
return self::setCacheResult($cacheKey, false);
}

if (str_contains($ip, '/')) {
[$address, $netmask] = explode('/', $ip, 2);

if (!filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
return self::setCacheResult($cacheKey, false);
}

if ('0' === $netmask) {
return (bool) unpack('n*', @inet_pton($address));
}

if ($netmask < 1 || $netmask > 128) {
return self::setCacheResult($cacheKey, false);
}
} else {
if (!filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
return self::setCacheResult($cacheKey, false);
}

$address = $ip;
$netmask = 128;
}

$bytesAddr = unpack('n*', @inet_pton($address));
$bytesTest = unpack('n*', @inet_pton($requestIp));

if (!$bytesAddr || !$bytesTest) {
return self::setCacheResult($cacheKey, false);
}

for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {
$left = $netmask - 16 * ($i - 1);
$left = ($left <= 16) ? $left : 16;
$mask = ~(0xFFFF >> $left) & 0xFFFF;
if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
return self::setCacheResult($cacheKey, false);
}
}

return self::setCacheResult($cacheKey, true);
}









public static function anonymize(string $ip): string
{
$v4Bytes = 1 < \func_num_args() ? func_get_arg(1) : 1;
$v6Bytes = 2 < \func_num_args() ? func_get_arg(2) : 8;

if ($v4Bytes < 0 || $v6Bytes < 0) {
throw new \InvalidArgumentException('Cannot anonymize less than 0 bytes.');
}

if ($v4Bytes > 4 || $v6Bytes > 16) {
throw new \InvalidArgumentException('Cannot anonymize more than 4 bytes for IPv4 and 16 bytes for IPv6.');
}







if (str_contains($ip, '%')) {
$ip = substr($ip, 0, strpos($ip, '%'));
}

$wrappedIPv6 = false;
if (str_starts_with($ip, '[') && str_ends_with($ip, ']')) {
$wrappedIPv6 = true;
$ip = substr($ip, 1, -1);
}

$mappedIpV4MaskGenerator = function (string $mask, int $bytesToAnonymize) {
$mask .= str_repeat('ff', 4 - $bytesToAnonymize);
$mask .= str_repeat('00', $bytesToAnonymize);

return '::'.implode(':', str_split($mask, 4));
};

$packedAddress = inet_pton($ip);
if (4 === \strlen($packedAddress)) {
$mask = rtrim(str_repeat('255.', 4 - $v4Bytes).str_repeat('0.', $v4Bytes), '.');
} elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff:ffff'))) {
$mask = $mappedIpV4MaskGenerator('ffff', $v4Bytes);
} elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff'))) {
$mask = $mappedIpV4MaskGenerator('', $v4Bytes);
} else {
$mask = str_repeat('ff', 16 - $v6Bytes).str_repeat('00', $v6Bytes);
$mask = implode(':', str_split($mask, 4));
}
$ip = inet_ntop($packedAddress & inet_pton($mask));

if ($wrappedIPv6) {
$ip = '['.$ip.']';
}

return $ip;
}




public static function isPrivateIp(string $requestIp): bool
{
return self::checkIp($requestIp, self::PRIVATE_SUBNETS);
}

private static function getCacheResult(string $cacheKey): ?bool
{
if (isset(self::$checkedIps[$cacheKey])) {

$value = self::$checkedIps[$cacheKey];
unset(self::$checkedIps[$cacheKey]);
self::$checkedIps[$cacheKey] = $value;

return self::$checkedIps[$cacheKey];
}

return null;
}

private static function setCacheResult(string $cacheKey, bool $result): bool
{
if (1000 < \count(self::$checkedIps)) {

self::$checkedIps = \array_slice(self::$checkedIps, 500, null, true);
}

return self::$checkedIps[$cacheKey] = $result;
}
}
<?php










namespace Symfony\Component\HttpFoundation;






class Cookie
{
public const SAMESITE_NONE = 'none';
public const SAMESITE_LAX = 'lax';
public const SAMESITE_STRICT = 'strict';

protected int $expire;
protected string $path;

private ?string $sameSite = null;
private bool $secureDefault = false;

private const RESERVED_CHARS_LIST = "=,; \t\r\n\v\f";
private const RESERVED_CHARS_FROM = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"];
private const RESERVED_CHARS_TO = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C'];




public static function fromString(string $cookie, bool $decode = false): static
{
$data = [
'expires' => 0,
'path' => '/',
'domain' => null,
'secure' => false,
'httponly' => false,
'raw' => !$decode,
'samesite' => null,
'partitioned' => false,
];

$parts = HeaderUtils::split($cookie, ';=');
$part = array_shift($parts);

$name = $decode ? urldecode($part[0]) : $part[0];
$value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null;

$data = HeaderUtils::combine($parts) + $data;
$data['expires'] = self::expiresTimestamp($data['expires']);

if (isset($data['max-age']) && ($data['max-age'] > 0 || $data['expires'] > time())) {
$data['expires'] = time() + (int) $data['max-age'];
}

return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite'], $data['partitioned']);
}






public static function create(string $name, ?string $value = null, int|string|\DateTimeInterface $expire = 0, ?string $path = '/', ?string $domain = null, ?bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX, bool $partitioned = false): self
{
return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite, $partitioned);
}














public function __construct(
protected string $name,
protected ?string $value = null,
int|string|\DateTimeInterface $expire = 0,
?string $path = '/',
protected ?string $domain = null,
protected ?bool $secure = null,
protected bool $httpOnly = true,
private bool $raw = false,
?string $sameSite = self::SAMESITE_LAX,
private bool $partitioned = false,
) {

if ($raw && false !== strpbrk($name, self::RESERVED_CHARS_LIST)) {
throw new \InvalidArgumentException(\sprintf('The cookie name "%s" contains invalid characters.', $name));
}

if (!$name) {
throw new \InvalidArgumentException('The cookie name cannot be empty.');
}

$this->expire = self::expiresTimestamp($expire);
$this->path = $path ?: '/';
$this->sameSite = $this->withSameSite($sameSite)->sameSite;
}




public function withValue(?string $value): static
{
$cookie = clone $this;
$cookie->value = $value;

return $cookie;
}




public function withDomain(?string $domain): static
{
$cookie = clone $this;
$cookie->domain = $domain;

return $cookie;
}




public function withExpires(int|string|\DateTimeInterface $expire = 0): static
{
$cookie = clone $this;
$cookie->expire = self::expiresTimestamp($expire);

return $cookie;
}




private static function expiresTimestamp(int|string|\DateTimeInterface $expire = 0): int
{

if ($expire instanceof \DateTimeInterface) {
$expire = $expire->format('U');
} elseif (!is_numeric($expire)) {
$expire = strtotime($expire);

if (false === $expire) {
throw new \InvalidArgumentException('The cookie expiration time is not valid.');
}
}

return 0 < $expire ? (int) $expire : 0;
}




public function withPath(string $path): static
{
$cookie = clone $this;
$cookie->path = '' === $path ? '/' : $path;

return $cookie;
}




public function withSecure(bool $secure = true): static
{
$cookie = clone $this;
$cookie->secure = $secure;

return $cookie;
}




public function withHttpOnly(bool $httpOnly = true): static
{
$cookie = clone $this;
$cookie->httpOnly = $httpOnly;

return $cookie;
}




public function withRaw(bool $raw = true): static
{
if ($raw && false !== strpbrk($this->name, self::RESERVED_CHARS_LIST)) {
throw new \InvalidArgumentException(\sprintf('The cookie name "%s" contains invalid characters.', $this->name));
}

$cookie = clone $this;
$cookie->raw = $raw;

return $cookie;
}






public function withSameSite(?string $sameSite): static
{
if ('' === $sameSite) {
$sameSite = null;
} elseif (null !== $sameSite) {
$sameSite = strtolower($sameSite);
}

if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) {
throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.');
}

$cookie = clone $this;
$cookie->sameSite = $sameSite;

return $cookie;
}




public function withPartitioned(bool $partitioned = true): static
{
$cookie = clone $this;
$cookie->partitioned = $partitioned;

return $cookie;
}




public function __toString(): string
{
if ($this->isRaw()) {
$str = $this->getName();
} else {
$str = str_replace(self::RESERVED_CHARS_FROM, self::RESERVED_CHARS_TO, $this->getName());
}

$str .= '=';

if ('' === (string) $this->getValue()) {
$str .= 'deleted; expires='.gmdate('D, d M Y H:i:s T', time() - 31536001).'; Max-Age=0';
} else {
$str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());

if (0 !== $this->getExpiresTime()) {
$str .= '; expires='.gmdate('D, d M Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge();
}
}

if ($this->getPath()) {
$str .= '; path='.$this->getPath();
}

if ($this->getDomain()) {
$str .= '; domain='.$this->getDomain();
}

if ($this->isSecure()) {
$str .= '; secure';
}

if ($this->isHttpOnly()) {
$str .= '; httponly';
}

if (null !== $this->getSameSite()) {
$str .= '; samesite='.$this->getSameSite();
}

if ($this->isPartitioned()) {
$str .= '; partitioned';
}

return $str;
}




public function getName(): string
{
return $this->name;
}




public function getValue(): ?string
{
return $this->value;
}




public function getDomain(): ?string
{
return $this->domain;
}




public function getExpiresTime(): int
{
return $this->expire;
}




public function getMaxAge(): int
{
$maxAge = $this->expire - time();

return max(0, $maxAge);
}




public function getPath(): string
{
return $this->path;
}




public function isSecure(): bool
{
return $this->secure ?? $this->secureDefault;
}




public function isHttpOnly(): bool
{
return $this->httpOnly;
}




public function isCleared(): bool
{
return 0 !== $this->expire && $this->expire < time();
}




public function isRaw(): bool
{
return $this->raw;
}




public function isPartitioned(): bool
{
return $this->partitioned;
}




public function getSameSite(): ?string
{
return $this->sameSite;
}




public function setSecureDefault(bool $default): void
{
$this->secureDefault = $default;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;








class SessionNotFoundException extends \LogicException implements RequestExceptionInterface
{
public function __construct(string $message = 'There is currently no session available.', int $code = 0, ?\Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;






interface RequestExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;

class UnexpectedValueException extends \UnexpectedValueException
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




final class ExpiredSignedUriException extends SignedUriException
{



public function __construct()
{
parent::__construct('The URI has expired.');
}
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;






class ConflictingHeadersException extends UnexpectedValueException implements RequestExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;





class SuspiciousOperationException extends UnexpectedValueException implements RequestExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;

interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




final class UnverifiedSignedUriException extends SignedUriException
{



public function __construct()
{
parent::__construct('The URI signature is invalid.');
}
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




final class UnsignedUriException extends SignedUriException
{



public function __construct()
{
parent::__construct('The URI is not signed.');
}
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;






final class JsonException extends UnexpectedValueException implements RequestExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




class BadRequestException extends UnexpectedValueException implements RequestExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation\Exception;




abstract class SignedUriException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\HttpFoundation;






class AcceptHeaderItem
{
private float $quality = 1.0;
private int $index = 0;
private array $attributes = [];

public function __construct(
private string $value,
array $attributes = [],
) {
foreach ($attributes as $name => $value) {
$this->setAttribute($name, $value);
}
}




public static function fromString(?string $itemValue): self
{
$parts = HeaderUtils::split($itemValue ?? '', ';=');

$part = array_shift($parts);
$attributes = HeaderUtils::combine($parts);

return new self($part[0], $attributes);
}




public function __toString(): string
{
$string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
if (\count($this->attributes) > 0) {
$string .= '; '.HeaderUtils::toString($this->attributes, ';');
}

return $string;
}






public function setValue(string $value): static
{
$this->value = $value;

return $this;
}




public function getValue(): string
{
return $this->value;
}






public function setQuality(float $quality): static
{
$this->quality = $quality;

return $this;
}




public function getQuality(): float
{
return $this->quality;
}






public function setIndex(int $index): static
{
$this->index = $index;

return $this;
}




public function getIndex(): int
{
return $this->index;
}




public function hasAttribute(string $name): bool
{
return isset($this->attributes[$name]);
}




public function getAttribute(string $name, mixed $default = null): mixed
{
return $this->attributes[$name] ?? $default;
}




public function getAttributes(): array
{
return $this->attributes;
}






public function setAttribute(string $name, string $value): static
{
if ('q' === $name) {
$this->quality = (float) $value;
} else {
$this->attributes[$name] = $value;
}

return $this;
}
}
<?php










namespace Symfony\Component\HttpFoundation;














class StreamedResponse extends Response
{
protected ?\Closure $callback = null;
protected bool $streamed = false;

private bool $headersSent = false;





public function __construct(callable|iterable|null $callbackOrChunks = null, int $status = 200, array $headers = [])
{
parent::__construct(null, $status, $headers);

if (\is_callable($callbackOrChunks)) {
$this->setCallback($callbackOrChunks);
} elseif ($callbackOrChunks) {
$this->setChunks($callbackOrChunks);
}
$this->streamed = false;
$this->headersSent = false;
}




public function setChunks(iterable $chunks): static
{
$this->callback = static function () use ($chunks): void {
foreach ($chunks as $chunk) {
echo $chunk;
@ob_flush();
flush();
}
};

return $this;
}






public function setCallback(callable $callback): static
{
$this->callback = $callback(...);

return $this;
}

public function getCallback(): ?\Closure
{
if (!isset($this->callback)) {
return null;
}

return ($this->callback)(...);
}








public function sendHeaders(?int $statusCode = null): static
{
if ($this->headersSent) {
return $this;
}

if ($statusCode < 100 || $statusCode >= 200) {
$this->headersSent = true;
}

return parent::sendHeaders($statusCode);
}






public function sendContent(): static
{
if ($this->streamed) {
return $this;
}

$this->streamed = true;

if (!isset($this->callback)) {
throw new \LogicException('The Response callback must be set.');
}

($this->callback)();

return $this;
}






public function setContent(?string $content): static
{
if (null !== $content) {
throw new \LogicException('The content cannot be set on a StreamedResponse instance.');
}

$this->streamed = true;

return $this;
}

public function getContent(): string|false
{
return false;
}
}
<?php










namespace Symfony\Component\HttpFoundation;

/**
@implements




*/
class HeaderBag implements \IteratorAggregate, \Countable, \Stringable
{
protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ';
protected const LOWER = '-abcdefghijklmnopqrstuvwxyz';




protected array $headers = [];
protected array $cacheControl = [];

public function __construct(array $headers = [])
{
foreach ($headers as $key => $values) {
$this->set($key, $values);
}
}




public function __toString(): string
{
if (!$headers = $this->all()) {
return '';
}

ksort($headers);
$max = max(array_map('strlen', array_keys($headers))) + 1;
$content = '';
foreach ($headers as $name => $values) {
$name = ucwords($name, '-');
foreach ($values as $value) {
$content .= \sprintf("%-{$max}s %s\r\n", $name.':', $value);
}
}

return $content;
}








public function all(?string $key = null): array
{
if (null !== $key) {
return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? [];
}

return $this->headers;
}






public function keys(): array
{
return array_keys($this->all());
}




public function replace(array $headers = []): void
{
$this->headers = [];
$this->add($headers);
}




public function add(array $headers): void
{
foreach ($headers as $key => $values) {
$this->set($key, $values);
}
}




public function get(string $key, ?string $default = null): ?string
{
$headers = $this->all($key);

if (!$headers) {
return $default;
}

if (null === $headers[0]) {
return null;
}

return $headers[0];
}







public function set(string $key, string|array|null $values, bool $replace = true): void
{
$key = strtr($key, self::UPPER, self::LOWER);

if (\is_array($values)) {
$values = array_values($values);

if (true === $replace || !isset($this->headers[$key])) {
$this->headers[$key] = $values;
} else {
$this->headers[$key] = array_merge($this->headers[$key], $values);
}
} else {
if (true === $replace || !isset($this->headers[$key])) {
$this->headers[$key] = [$values];
} else {
$this->headers[$key][] = $values;
}
}

if ('cache-control' === $key) {
$this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key]));
}
}




public function has(string $key): bool
{
return \array_key_exists(strtr($key, self::UPPER, self::LOWER), $this->all());
}




public function contains(string $key, string $value): bool
{
return \in_array($value, $this->all($key), true);
}




public function remove(string $key): void
{
$key = strtr($key, self::UPPER, self::LOWER);

unset($this->headers[$key]);

if ('cache-control' === $key) {
$this->cacheControl = [];
}
}






public function getDate(string $key, ?\DateTimeInterface $default = null): ?\DateTimeImmutable
{
if (null === $value = $this->get($key)) {
return null !== $default ? \DateTimeImmutable::createFromInterface($default) : null;
}

if (false === $date = \DateTimeImmutable::createFromFormat(\DATE_RFC2822, $value)) {
throw new \RuntimeException(\sprintf('The "%s" HTTP header is not parseable (%s).', $key, $value));
}

return $date;
}




public function addCacheControlDirective(string $key, bool|string $value = true): void
{
$this->cacheControl[$key] = $value;

$this->set('Cache-Control', $this->getCacheControlHeader());
}




public function hasCacheControlDirective(string $key): bool
{
return \array_key_exists($key, $this->cacheControl);
}




public function getCacheControlDirective(string $key): bool|string|null
{
return $this->cacheControl[$key] ?? null;
}




public function removeCacheControlDirective(string $key): void
{
unset($this->cacheControl[$key]);

$this->set('Cache-Control', $this->getCacheControlHeader());
}






public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->headers);
}




public function count(): int
{
return \count($this->headers);
}

protected function getCacheControlHeader(): string
{
ksort($this->cacheControl);

return HeaderUtils::toString($this->cacheControl, ',');
}




protected function parseCacheControl(string $header): array
{
$parts = HeaderUtils::split($header, ',=');

return HeaderUtils::combine($parts);
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\File\UploadedFile;







class FileBag extends ParameterBag
{
private const FILE_KEYS = ['error', 'full_path', 'name', 'size', 'tmp_name', 'type'];




public function __construct(array $parameters = [])
{
$this->replace($parameters);
}

public function replace(array $files = []): void
{
$this->parameters = [];
$this->add($files);
}

public function set(string $key, mixed $value): void
{
if (!\is_array($value) && !$value instanceof UploadedFile) {
throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');
}

parent::set($key, $this->convertFileInformation($value));
}

public function add(array $files = []): void
{
foreach ($files as $key => $file) {
$this->set($key, $file);
}
}






protected function convertFileInformation(array|UploadedFile $file): array|UploadedFile|null
{
if ($file instanceof UploadedFile) {
return $file;
}

$file = $this->fixPhpFilesArray($file);
$keys = array_keys($file + ['full_path' => null]);
sort($keys);

if (self::FILE_KEYS === $keys) {
if (\UPLOAD_ERR_NO_FILE === $file['error']) {
$file = null;
} else {
$file = new UploadedFile($file['tmp_name'], $file['full_path'] ?? $file['name'], $file['type'], $file['error'], false);
}
} else {
$file = array_map(fn ($v) => $v instanceof UploadedFile || \is_array($v) ? $this->convertFileInformation($v) : $v, $file);
if (array_is_list($file)) {
$file = array_filter($file);
}
}

return $file;
}













protected function fixPhpFilesArray(array $data): array
{
$keys = array_keys($data + ['full_path' => null]);
sort($keys);

if (self::FILE_KEYS !== $keys || !isset($data['name']) || !\is_array($data['name'])) {
return $data;
}

$files = $data;
foreach (self::FILE_KEYS as $k) {
unset($files[$k]);
}

foreach ($data['name'] as $key => $name) {
$files[$key] = $this->fixPhpFilesArray([
'error' => $data['error'][$key],
'name' => $name,
'type' => $data['type'][$key],
'tmp_name' => $data['tmp_name'][$key],
'size' => $data['size'][$key],
] + (isset($data['full_path'][$key]) ? [
'full_path' => $data['full_path'][$key],
] : []));
}

return $files;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Attribute;

/**
@implements


*/
class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
{
protected array $attributes = [];

private string $name = 'attributes';




public function __construct(
private string $storageKey = '_sf2_attributes',
) {
}

public function getName(): string
{
return $this->name;
}

public function setName(string $name): void
{
$this->name = $name;
}

public function initialize(array &$attributes): void
{
$this->attributes = &$attributes;
}

public function getStorageKey(): string
{
return $this->storageKey;
}

public function has(string $name): bool
{
return \array_key_exists($name, $this->attributes);
}

public function get(string $name, mixed $default = null): mixed
{
return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
}

public function set(string $name, mixed $value): void
{
$this->attributes[$name] = $value;
}

public function all(): array
{
return $this->attributes;
}

public function replace(array $attributes): void
{
$this->attributes = [];
foreach ($attributes as $key => $value) {
$this->set($key, $value);
}
}

public function remove(string $name): mixed
{
$retval = null;
if (\array_key_exists($name, $this->attributes)) {
$retval = $this->attributes[$name];
unset($this->attributes[$name]);
}

return $retval;
}

public function clear(): mixed
{
$return = $this->attributes;
$this->attributes = [];

return $return;
}






public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->attributes);
}




public function count(): int
{
return \count($this->attributes);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Attribute;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;






interface AttributeBagInterface extends SessionBagInterface
{



public function has(string $name): bool;




public function get(string $name, mixed $default = null): mixed;




public function set(string $name, mixed $value): void;






public function all(): array;

public function replace(array $attributes): void;






public function remove(string $name): mixed;
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Request;


class_exists(MockFileSessionStorage::class);




class MockFileSessionStorageFactory implements SessionStorageFactoryInterface
{



public function __construct(
private ?string $savePath = null,
private string $name = 'MOCKSESSID',
private ?MetadataBag $metaBag = null,
) {
}

public function createStorage(?Request $request): SessionStorageInterface
{
return new MockFileSessionStorage($this->savePath, $this->name, $this->metaBag);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;













class MockFileSessionStorage extends MockArraySessionStorage
{
private string $savePath;




public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null)
{
$savePath ??= sys_get_temp_dir();

if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) {
throw new \RuntimeException(\sprintf('Session Storage was not able to create directory "%s".', $savePath));
}

$this->savePath = $savePath;

parent::__construct($name, $metaBag);
}

public function start(): bool
{
if ($this->started) {
return true;
}

if (!$this->id) {
$this->id = $this->generateId();
}

$this->read();

$this->started = true;

return true;
}

public function regenerate(bool $destroy = false, ?int $lifetime = null): bool
{
if (!$this->started) {
$this->start();
}

if ($destroy) {
$this->destroy();
}

return parent::regenerate($destroy, $lifetime);
}

public function save(): void
{
if (!$this->started) {
throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.');
}

$data = $this->data;

foreach ($this->bags as $bag) {
if (empty($data[$key = $bag->getStorageKey()])) {
unset($data[$key]);
}
}
if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) {
unset($data[$key]);
}

try {
if ($data) {
$path = $this->getFilePath();
$tmp = $path.bin2hex(random_bytes(6));
file_put_contents($tmp, serialize($data));
rename($tmp, $path);
} else {
$this->destroy();
}
} finally {
$this->data = $data;
}



$this->started = false;
}





private function destroy(): void
{
set_error_handler(static function () {});
try {
unlink($this->getFilePath());
} finally {
restore_error_handler();
}
}




private function getFilePath(): string
{
return $this->savePath.'/'.$this->id.'.mocksess';
}




private function read(): void
{
set_error_handler(static function () {});
try {
$data = file_get_contents($this->getFilePath());
} finally {
restore_error_handler();
}

$this->data = $data ? unserialize($data) : [];

$this->loadSession();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;

use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler;




class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
{
public function __construct(
protected \SessionHandlerInterface $handler,
) {
$this->wrapper = $handler instanceof \SessionHandler;
$this->saveHandlerName = $this->wrapper || ($handler instanceof StrictSessionHandler && $handler->isWrapper()) ? \ini_get('session.save_handler') : 'user';
}

public function getHandler(): \SessionHandlerInterface
{
return $this->handler;
}



public function open(string $savePath, string $sessionName): bool
{
return $this->handler->open($savePath, $sessionName);
}

public function close(): bool
{
return $this->handler->close();
}

public function read(#[\SensitiveParameter] string $sessionId): string|false
{
return $this->handler->read($sessionId);
}

public function write(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->handler->write($sessionId, $data);
}

public function destroy(#[\SensitiveParameter] string $sessionId): bool
{
return $this->handler->destroy($sessionId);
}

public function gc(int $maxlifetime): int|false
{
return $this->handler->gc($maxlifetime);
}

public function validateId(#[\SensitiveParameter] string $sessionId): bool
{
return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId);
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;




abstract class AbstractProxy
{
protected bool $wrapper = false;

protected ?string $saveHandlerName = null;




public function getSaveHandlerName(): ?string
{
return $this->saveHandlerName;
}




public function isSessionHandlerInterface(): bool
{
return $this instanceof \SessionHandlerInterface;
}




public function isWrapper(): bool
{
return $this->wrapper;
}




public function isActive(): bool
{
return \PHP_SESSION_ACTIVE === session_status();
}




public function getId(): string
{
return session_id();
}






public function setId(string $id): void
{
if ($this->isActive()) {
throw new \LogicException('Cannot change the ID of an active session.');
}

session_id($id);
}




public function getName(): string
{
return session_name();
}






public function setName(string $name): void
{
if ($this->isActive()) {
throw new \LogicException('Cannot change the name of an active session.');
}

session_name($name);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;








class MetadataBag implements SessionBagInterface
{
public const CREATED = 'c';
public const UPDATED = 'u';
public const LIFETIME = 'l';

protected array $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0];

private string $name = '__metadata';
private int $lastUsed;





public function __construct(
private string $storageKey = '_sf2_meta',
private int $updateThreshold = 0,
) {
}

public function initialize(array &$array): void
{
$this->meta = &$array;

if (isset($array[self::CREATED])) {
$this->lastUsed = $this->meta[self::UPDATED];

$timeStamp = time();
if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {
$this->meta[self::UPDATED] = $timeStamp;
}
} else {
$this->stampCreated();
}
}




public function getLifetime(): int
{
return $this->meta[self::LIFETIME];
}









public function stampNew(?int $lifetime = null): void
{
$this->stampCreated($lifetime);
}

public function getStorageKey(): string
{
return $this->storageKey;
}






public function getCreated(): int
{
return $this->meta[self::CREATED];
}






public function getLastUsed(): int
{
return $this->lastUsed;
}

public function clear(): mixed
{

return null;
}

public function getName(): string
{
return $this->name;
}




public function setName(string $name): void
{
$this->name = $name;
}

private function stampCreated(?int $lifetime = null): void
{
$timeStamp = time();
$this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;
$this->meta[self::LIFETIME] = $lifetime ?? (int) \ini_get('session.cookie_lifetime');
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;













class MockArraySessionStorage implements SessionStorageInterface
{
protected string $id = '';
protected bool $started = false;
protected bool $closed = false;
protected array $data = [];
protected MetadataBag $metadataBag;




protected array $bags = [];

public function __construct(
protected string $name = 'MOCKSESSID',
?MetadataBag $metaBag = null,
) {
$this->setMetadataBag($metaBag);
}

public function setSessionData(array $array): void
{
$this->data = $array;
}

public function start(): bool
{
if ($this->started) {
return true;
}

if (!$this->id) {
$this->id = $this->generateId();
}

$this->loadSession();

return true;
}

public function regenerate(bool $destroy = false, ?int $lifetime = null): bool
{
if (!$this->started) {
$this->start();
}

$this->metadataBag->stampNew($lifetime);
$this->id = $this->generateId();

return true;
}

public function getId(): string
{
return $this->id;
}

public function setId(string $id): void
{
if ($this->started) {
throw new \LogicException('Cannot set session ID after the session has started.');
}

$this->id = $id;
}

public function getName(): string
{
return $this->name;
}

public function setName(string $name): void
{
$this->name = $name;
}

public function save(): void
{
if (!$this->started || $this->closed) {
throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.');
}

$this->closed = false;
$this->started = false;
}

public function clear(): void
{

foreach ($this->bags as $bag) {
$bag->clear();
}


$this->data = [];


$this->loadSession();
}

public function registerBag(SessionBagInterface $bag): void
{
$this->bags[$bag->getName()] = $bag;
}

public function getBag(string $name): SessionBagInterface
{
if (!isset($this->bags[$name])) {
throw new \InvalidArgumentException(\sprintf('The SessionBagInterface "%s" is not registered.', $name));
}

if (!$this->started) {
$this->start();
}

return $this->bags[$name];
}

public function isStarted(): bool
{
return $this->started;
}

public function setMetadataBag(?MetadataBag $bag): void
{
$this->metadataBag = $bag ?? new MetadataBag();
}




public function getMetadataBag(): MetadataBag
{
return $this->metadataBag;
}







protected function generateId(): string
{
return bin2hex(random_bytes(16));
}

protected function loadSession(): void
{
$bags = array_merge($this->bags, [$this->metadataBag]);

foreach ($bags as $bag) {
$key = $bag->getStorageKey();
$this->data[$key] ??= [];
$bag->initialize($this->data[$key]);
}

$this->started = true;
$this->closed = false;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;


class_exists(PhpBridgeSessionStorage::class);




class PhpBridgeSessionStorageFactory implements SessionStorageFactoryInterface
{
public function __construct(
private AbstractProxy|\SessionHandlerInterface|null $handler = null,
private ?MetadataBag $metaBag = null,
private bool $secure = false,
) {
}

public function createStorage(?Request $request): SessionStorageInterface
{
$storage = new PhpBridgeSessionStorage($this->handler, $this->metaBag);
if ($this->secure && $request?->isSecure()) {
$storage->setOptions(['cookie_secure' => true]);
}

return $storage;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Symfony\Component\HttpFoundation\Session\SessionUtils;








abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
{
private string $sessionName;
private string $prefetchId;
private string $prefetchData;
private ?string $newSessionId = null;
private string $igbinaryEmptyData;

public function open(string $savePath, string $sessionName): bool
{
$this->sessionName = $sessionName;
if (!headers_sent() && !\ini_get('session.cache_limiter') && '0' !== \ini_get('session.cache_limiter')) {
header(\sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) \ini_get('session.cache_expire')));
}

return true;
}

abstract protected function doRead(#[\SensitiveParameter] string $sessionId): string;

abstract protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool;

abstract protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool;

public function validateId(#[\SensitiveParameter] string $sessionId): bool
{
$this->prefetchData = $this->read($sessionId);
$this->prefetchId = $sessionId;

return '' !== $this->prefetchData;
}

public function read(#[\SensitiveParameter] string $sessionId): string
{
if (isset($this->prefetchId)) {
$prefetchId = $this->prefetchId;
$prefetchData = $this->prefetchData;
unset($this->prefetchId, $this->prefetchData);

if ($prefetchId === $sessionId || '' === $prefetchData) {
$this->newSessionId = '' === $prefetchData ? $sessionId : null;

return $prefetchData;
}
}

$data = $this->doRead($sessionId);
$this->newSessionId = '' === $data ? $sessionId : null;

return $data;
}

public function write(#[\SensitiveParameter] string $sessionId, string $data): bool
{

$this->igbinaryEmptyData ??= \function_exists('igbinary_serialize') ? igbinary_serialize([]) : '';
if ('' === $data || $this->igbinaryEmptyData === $data) {
return $this->destroy($sessionId);
}
$this->newSessionId = null;

return $this->doWrite($sessionId, $data);
}

public function destroy(#[\SensitiveParameter] string $sessionId): bool
{
if (!headers_sent() && filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL)) {
if (!isset($this->sessionName)) {
throw new \LogicException(\sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', static::class));
}
$cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId);








if (null === $cookie || isset($_COOKIE[$this->sessionName])) {
$params = session_get_cookie_params();
unset($params['lifetime']);
setcookie($this->sessionName, '', $params);
}
}

return $this->newSessionId === $sessionId || $this->doDestroy($sessionId);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;






class StrictSessionHandler extends AbstractSessionHandler
{
private bool $doDestroy;

public function __construct(
private \SessionHandlerInterface $handler,
) {
if ($handler instanceof \SessionUpdateTimestampHandlerInterface) {
throw new \LogicException(\sprintf('"%s" is already an instance of "SessionUpdateTimestampHandlerInterface", you cannot wrap it with "%s".', get_debug_type($handler), self::class));
}
}






public function isWrapper(): bool
{
return $this->handler instanceof \SessionHandler;
}

public function open(string $savePath, string $sessionName): bool
{
parent::open($savePath, $sessionName);

return $this->handler->open($savePath, $sessionName);
}

protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
return $this->handler->read($sessionId);
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->write($sessionId, $data);
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->handler->write($sessionId, $data);
}

public function destroy(#[\SensitiveParameter] string $sessionId): bool
{
$this->doDestroy = true;
$destroyed = parent::destroy($sessionId);

return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{
$this->doDestroy = false;

return $this->handler->destroy($sessionId);
}

public function close(): bool
{
return $this->handler->close();
}

public function gc(int $maxlifetime): int|false
{
return $this->handler->gc($maxlifetime);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;









class MemcachedSessionHandler extends AbstractSessionHandler
{



private int|\Closure|null $ttl;




private string $prefix;










public function __construct(
private \Memcached $memcached,
array $options = [],
) {
if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime', 'ttl'])) {
throw new \InvalidArgumentException(\sprintf('The following options are not supported "%s".', implode(', ', $diff)));
}

$this->ttl = $options['expiretime'] ?? $options['ttl'] ?? null;
$this->prefix = $options['prefix'] ?? 'sf2s';
}

public function close(): bool
{
return $this->memcached->quit();
}

protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
return $this->memcached->get($this->prefix.$sessionId) ?: '';
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$this->memcached->touch($this->prefix.$sessionId, $this->getCompatibleTtl());

return true;
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->memcached->set($this->prefix.$sessionId, $data, $this->getCompatibleTtl());
}

private function getCompatibleTtl(): int
{
$ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime');



if ($ttl > 60 * 60 * 24 * 30) {
$ttl += time();
}

return $ttl;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{
$result = $this->memcached->delete($this->prefix.$sessionId);

return $result || \Memcached::RES_NOTFOUND == $this->memcached->getResultCode();
}

public function gc(int $maxlifetime): int|false
{

return 0;
}




protected function getMemcached(): \Memcached
{
return $this->memcached;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Predis\Response\ErrorInterface;
use Relay\Relay;







class RedisSessionHandler extends AbstractSessionHandler
{



private string $prefix;




private int|\Closure|null $ttl;








public function __construct(
private \Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis,
array $options = [],
) {
if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) {
throw new \InvalidArgumentException(\sprintf('The following options are not supported "%s".', implode(', ', $diff)));
}

$this->prefix = $options['prefix'] ?? 'sf_s';
$this->ttl = $options['ttl'] ?? null;
}

protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
return $this->redis->get($this->prefix.$sessionId) ?: '';
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime');
$result = $this->redis->setEx($this->prefix.$sessionId, (int) $ttl, $data);

return $result && !$result instanceof ErrorInterface;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{
static $unlink = true;

if ($unlink) {
try {
$unlink = false !== $this->redis->unlink($this->prefix.$sessionId);
} catch (\Throwable) {
$unlink = false;
}
}

if (!$unlink) {
$this->redis->del($this->prefix.$sessionId);
}

return true;
}

#[\ReturnTypeWillChange]
public function close(): bool
{
return true;
}

public function gc(int $maxlifetime): int|false
{
return 0;
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime');

return $this->redis->expire($this->prefix.$sessionId, (int) $ttl);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
use Doctrine\DBAL\Tools\DsnParser;
use Relay\Relay;
use Symfony\Component\Cache\Adapter\AbstractAdapter;




class SessionHandlerFactory
{
public static function createHandler(object|string $connection, array $options = []): AbstractSessionHandler
{
if ($query = \is_string($connection) ? parse_url($connection) : false) {
parse_str($query['query'] ?? '', $query);

if (($options['ttl'] ?? null) instanceof \Closure) {
$query['ttl'] = $options['ttl'];
}
}
$options = ($query ?: []) + $options;

switch (true) {
case $connection instanceof \Redis:
case $connection instanceof Relay:
case $connection instanceof \RedisArray:
case $connection instanceof \RedisCluster:
case $connection instanceof \Predis\ClientInterface:
return new RedisSessionHandler($connection);

case $connection instanceof \Memcached:
return new MemcachedSessionHandler($connection);

case $connection instanceof \PDO:
return new PdoSessionHandler($connection);

case !\is_string($connection):
throw new \InvalidArgumentException(\sprintf('Unsupported Connection: "%s".', get_debug_type($connection)));
case str_starts_with($connection, 'file://'):
$savePath = substr($connection, 7);

return new StrictSessionHandler(new NativeFileSessionHandler('' === $savePath ? null : $savePath));

case str_starts_with($connection, 'redis:'):
case str_starts_with($connection, 'rediss:'):
case str_starts_with($connection, 'valkey:'):
case str_starts_with($connection, 'valkeys:'):
case str_starts_with($connection, 'memcached:'):
if (!class_exists(AbstractAdapter::class)) {
throw new \InvalidArgumentException('Unsupported Redis or Memcached DSN. Try running "composer require symfony/cache".');
}
$handlerClass = str_starts_with($connection, 'memcached:') ? MemcachedSessionHandler::class : RedisSessionHandler::class;
$connection = AbstractAdapter::createConnection($connection, ['lazy' => true]);

return new $handlerClass($connection, array_intersect_key($options, ['prefix' => 1, 'ttl' => 1]));

case str_starts_with($connection, 'pdo_oci://'):
if (!class_exists(DriverManager::class)) {
throw new \InvalidArgumentException('Unsupported PDO OCI DSN. Try running "composer require doctrine/dbal".');
}
$connection[3] = '-';
$params = (new DsnParser())->parse($connection);
$config = new Configuration();
$config->setSchemaManagerFactory(new DefaultSchemaManagerFactory());

$connection = DriverManager::getConnection($params, $config)->getNativeConnection();


case str_starts_with($connection, 'mssql://'):
case str_starts_with($connection, 'mysql://'):
case str_starts_with($connection, 'mysql2://'):
case str_starts_with($connection, 'pgsql://'):
case str_starts_with($connection, 'postgres://'):
case str_starts_with($connection, 'postgresql://'):
case str_starts_with($connection, 'sqlsrv://'):
case str_starts_with($connection, 'sqlite://'):
case str_starts_with($connection, 'sqlite3://'):
return new PdoSessionHandler($connection, $options);
}

throw new \InvalidArgumentException(\sprintf('Unsupported Connection: "%s".', $connection));
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Doctrine\DBAL\Schema\Name\Identifier;
use Doctrine\DBAL\Schema\Name\UnqualifiedName;
use Doctrine\DBAL\Schema\PrimaryKeyConstraint;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types;




























class PdoSessionHandler extends AbstractSessionHandler
{






public const LOCK_NONE = 0;








public const LOCK_ADVISORY = 1;







public const LOCK_TRANSACTIONAL = 2;

private \PDO $pdo;




private string|false|null $dsn = false;

private string $driver;
private string $table = 'sessions';
private string $idCol = 'sess_id';
private string $dataCol = 'sess_data';
private string $lifetimeCol = 'sess_lifetime';
private string $timeCol = 'sess_time';




private int|\Closure|null $ttl;




private ?string $username = null;




private ?string $password = null;




private array $connectionOptions = [];




private int $lockMode = self::LOCK_TRANSACTIONAL;






private array $unlockStatements = [];




private bool $sessionExpired = false;




private bool $inTransaction = false;




private bool $gcCalled = false;























public function __construct(#[\SensitiveParameter] \PDO|string|null $pdoOrDsn = null, #[\SensitiveParameter] array $options = [])
{
if ($pdoOrDsn instanceof \PDO) {
if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
throw new \InvalidArgumentException(\sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__));
}

$this->pdo = $pdoOrDsn;
$this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
} elseif (\is_string($pdoOrDsn) && str_contains($pdoOrDsn, '://')) {
$this->dsn = $this->buildDsnFromUrl($pdoOrDsn);
} else {
$this->dsn = $pdoOrDsn;
}

$this->table = $options['db_table'] ?? $this->table;
$this->idCol = $options['db_id_col'] ?? $this->idCol;
$this->dataCol = $options['db_data_col'] ?? $this->dataCol;
$this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;
$this->timeCol = $options['db_time_col'] ?? $this->timeCol;
$this->username = $options['db_username'] ?? $this->username;
$this->password = $options['db_password'] ?? $this->password;
$this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions;
$this->lockMode = $options['lock_mode'] ?? $this->lockMode;
$this->ttl = $options['ttl'] ?? null;
}




public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null): void
{
if ($schema->hasTable($this->table) || ($isSameDatabase && !$isSameDatabase($this->getConnection()->exec(...)))) {
return;
}

$table = $schema->createTable($this->table);
switch ($this->driver) {
case 'mysql':
$table->addColumn($this->idCol, Types::BINARY)->setLength(128)->setNotnull(true);
$table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);
$table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);
$table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);
$table->addOption('collate', 'utf8mb4_bin');
$table->addOption('engine', 'InnoDB');
break;
case 'sqlite':
$table->addColumn($this->idCol, Types::TEXT)->setNotnull(true);
$table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);
$table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);
$table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);
break;
case 'pgsql':
$table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true);
$table->addColumn($this->dataCol, Types::BINARY)->setNotnull(true);
$table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);
$table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);
break;
case 'oci':
$table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true);
$table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);
$table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true);
$table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true);
break;
case 'sqlsrv':
$table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true);
$table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true);
$table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);
$table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true);
break;
default:
throw new \DomainException(\sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver));
}

if (class_exists(PrimaryKeyConstraint::class)) {
$table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted($this->idCol))], true));
} else {
$table->setPrimaryKey([$this->idCol]);
}

$table->addIndex([$this->lifetimeCol], $this->lifetimeCol.'_idx');
}












public function createTable(): void
{

$this->getConnection();

$sql = match ($this->driver) {





'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB",
'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)",
'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)",
'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)",
'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)",
default => throw new \DomainException(\sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)),
};

try {
$this->pdo->exec($sql);
$this->pdo->exec("CREATE INDEX {$this->lifetimeCol}_idx ON $this->table ($this->lifetimeCol)");
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}
}






public function isSessionExpired(): bool
{
return $this->sessionExpired;
}

public function open(string $savePath, string $sessionName): bool
{
$this->sessionExpired = false;

if (!isset($this->pdo)) {
$this->connect($this->dsn ?: $savePath);
}

return parent::open($savePath, $sessionName);
}

public function read(#[\SensitiveParameter] string $sessionId): string
{
try {
return parent::read($sessionId);
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}
}

public function gc(int $maxlifetime): int|false
{


$this->gcCalled = true;

return 0;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{

$sql = "DELETE FROM $this->table WHERE $this->idCol = :id";

try {
$stmt = $this->pdo->prepare($sql);
$stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
$stmt->execute();
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}

return true;
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$maxlifetime = (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'));

try {

$mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime);
if (null !== $mergeStmt) {
$mergeStmt->execute();

return true;
}

$updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime);
$updateStmt->execute();






if (!$updateStmt->rowCount()) {
try {
$insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime);
$insertStmt->execute();
} catch (\PDOException $e) {

if (str_starts_with($e->getCode(), '23')) {
$updateStmt->execute();
} else {
throw $e;
}
}
}
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}

return true;
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$expiry = time() + (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'));

try {
$updateStmt = $this->pdo->prepare(
"UPDATE $this->table SET $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id"
);
$updateStmt->bindValue(':id', $sessionId, \PDO::PARAM_STR);
$updateStmt->bindValue(':expiry', $expiry, \PDO::PARAM_INT);
$updateStmt->bindValue(':time', time(), \PDO::PARAM_INT);
$updateStmt->execute();
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}

return true;
}

public function close(): bool
{
$this->commit();

while ($unlockStmt = array_shift($this->unlockStatements)) {
$unlockStmt->execute();
}

if ($this->gcCalled) {
$this->gcCalled = false;


$sql = "DELETE FROM $this->table WHERE $this->lifetimeCol < :time";
$stmt = $this->pdo->prepare($sql);
$stmt->bindValue(':time', time(), \PDO::PARAM_INT);
$stmt->execute();
}

if (false !== $this->dsn) {
unset($this->pdo, $this->driver); 
}

return true;
}




private function connect(#[\SensitiveParameter] string $dsn): void
{
$this->pdo = new \PDO($dsn, $this->username, $this->password, $this->connectionOptions);
$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
}






private function buildDsnFromUrl(#[\SensitiveParameter] string $dsnOrUrl): string
{

$url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl);

$params = parse_url($url);

if (false === $params) {
return $dsnOrUrl; 
}

$params = array_map('rawurldecode', $params);


if (isset($params['user'])) {
$this->username = $params['user'];
}

if (isset($params['pass'])) {
$this->password = $params['pass'];
}

if (!isset($params['scheme'])) {
throw new \InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler.');
}

$driverAliasMap = [
'mssql' => 'sqlsrv',
'mysql2' => 'mysql', 
'postgres' => 'pgsql',
'postgresql' => 'pgsql',
'sqlite3' => 'sqlite',
];

$driver = $driverAliasMap[$params['scheme']] ?? $params['scheme'];


if (str_starts_with($driver, 'pdo_') || str_starts_with($driver, 'pdo-')) {
$driver = substr($driver, 4);
}

$dsn = null;
switch ($driver) {
case 'mysql':
$dsn = 'mysql:';
if ('' !== ($params['query'] ?? '')) {
$queryParams = [];
parse_str($params['query'], $queryParams);
if ('' !== ($queryParams['charset'] ?? '')) {
$dsn .= 'charset='.$queryParams['charset'].';';
}

if ('' !== ($queryParams['unix_socket'] ?? '')) {
$dsn .= 'unix_socket='.$queryParams['unix_socket'].';';

if (isset($params['path'])) {
$dbName = substr($params['path'], 1); 
$dsn .= 'dbname='.$dbName.';';
}

return $dsn;
}
}


case 'pgsql':
$dsn ??= 'pgsql:';

if (isset($params['host']) && '' !== $params['host']) {
$dsn .= 'host='.$params['host'].';';
}

if (isset($params['port']) && '' !== $params['port']) {
$dsn .= 'port='.$params['port'].';';
}

if (isset($params['path'])) {
$dbName = substr($params['path'], 1); 
$dsn .= 'dbname='.$dbName.';';
}

return $dsn;

case 'sqlite':
return 'sqlite:'.substr($params['path'], 1);

case 'sqlsrv':
$dsn = 'sqlsrv:server=';

if (isset($params['host'])) {
$dsn .= $params['host'];
}

if (isset($params['port']) && '' !== $params['port']) {
$dsn .= ','.$params['port'];
}

if (isset($params['path'])) {
$dbName = substr($params['path'], 1); 
$dsn .= ';Database='.$dbName;
}

return $dsn;

default:
throw new \InvalidArgumentException(\sprintf('The scheme "%s" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme']));
}
}













private function beginTransaction(): void
{
if (!$this->inTransaction) {
if ('sqlite' === $this->driver) {
$this->pdo->exec('BEGIN IMMEDIATE TRANSACTION');
} else {
if ('mysql' === $this->driver) {
$this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
}
$this->pdo->beginTransaction();
}
$this->inTransaction = true;
}
}




private function commit(): void
{
if ($this->inTransaction) {
try {

if ('sqlite' === $this->driver) {
$this->pdo->exec('COMMIT');
} else {
$this->pdo->commit();
}
$this->inTransaction = false;
} catch (\PDOException $e) {
$this->rollback();

throw $e;
}
}
}




private function rollback(): void
{




if ($this->inTransaction) {
if ('sqlite' === $this->driver) {
$this->pdo->exec('ROLLBACK');
} else {
$this->pdo->rollBack();
}
$this->inTransaction = false;
}
}







protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
if (self::LOCK_ADVISORY === $this->lockMode) {
$this->unlockStatements[] = $this->doAdvisoryLock($sessionId);
}

$selectSql = $this->getSelectSql();
$selectStmt = $this->pdo->prepare($selectSql);
$selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
$insertStmt = null;

while (true) {
$selectStmt->execute();
$sessionRows = $selectStmt->fetchAll(\PDO::FETCH_NUM);

if ($sessionRows) {
$expiry = (int) $sessionRows[0][1];

if ($expiry < time()) {
$this->sessionExpired = true;

return '';
}

return \is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
}

if (null !== $insertStmt) {
$this->rollback();
throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.');
}

if (!filter_var(\ini_get('session.use_strict_mode'), \FILTER_VALIDATE_BOOL) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {




try {
$insertStmt = $this->getInsertStatement($sessionId, '', 0);
$insertStmt->execute();
} catch (\PDOException $e) {


if (str_starts_with($e->getCode(), '23')) {



$this->rollback();
$this->beginTransaction();
continue;
}

throw $e;
}
}

return '';
}
}












private function doAdvisoryLock(#[\SensitiveParameter] string $sessionId): \PDOStatement
{
switch ($this->driver) {
case 'mysql':

$lockId = substr($sessionId, 0, 64);


$stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)');
$stmt->bindValue(':key', $lockId, \PDO::PARAM_STR);
$stmt->execute();

$releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)');
$releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR);

return $releaseStmt;
case 'pgsql':



if (4 === \PHP_INT_SIZE) {
$sessionInt1 = $this->convertStringToInt($sessionId);
$sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4));

$stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)');
$stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
$stmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT);
$stmt->execute();

$releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)');
$releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
$releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT);
} else {
$sessionBigInt = $this->convertStringToInt($sessionId);

$stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)');
$stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT);
$stmt->execute();

$releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)');
$releaseStmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT);
}

return $releaseStmt;
case 'sqlite':
throw new \DomainException('SQLite does not support advisory locks.');
default:
throw new \DomainException(\sprintf('Advisory locks are currently not implemented for PDO driver "%s".', $this->driver));
}
}






private function convertStringToInt(string $string): int
{
if (4 === \PHP_INT_SIZE) {
return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]);
}

$int1 = (\ord($string[7]) << 24) + (\ord($string[6]) << 16) + (\ord($string[5]) << 8) + \ord($string[4]);
$int2 = (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]);

return $int2 + ($int1 << 32);
}






private function getSelectSql(): string
{
if (self::LOCK_TRANSACTIONAL === $this->lockMode) {
$this->beginTransaction();

switch ($this->driver) {
case 'mysql':
case 'oci':
case 'pgsql':
return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE";
case 'sqlsrv':
return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id";
case 'sqlite':

break;
default:
throw new \DomainException(\sprintf('Transactional locks are currently not implemented for PDO driver "%s".', $this->driver));
}
}

return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id";
}




private function getInsertStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement
{
switch ($this->driver) {
case 'oci':
$data = fopen('php://memory', 'r+');
fwrite($data, $sessionData);
rewind($data);
$sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :expiry, :time) RETURNING $this->dataCol into :data";
break;
default:
$data = $sessionData;
$sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)";
break;
}

$stmt = $this->pdo->prepare($sql);
$stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
$stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
$stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT);
$stmt->bindValue(':time', time(), \PDO::PARAM_INT);

return $stmt;
}




private function getUpdateStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement
{
switch ($this->driver) {
case 'oci':
$data = fopen('php://memory', 'r+');
fwrite($data, $sessionData);
rewind($data);
$sql = "UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data";
break;
default:
$data = $sessionData;
$sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id";
break;
}

$stmt = $this->pdo->prepare($sql);
$stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
$stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
$stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT);
$stmt->bindValue(':time', time(), \PDO::PARAM_INT);

return $stmt;
}




private function getMergeStatement(#[\SensitiveParameter] string $sessionId, string $data, int $maxlifetime): ?\PDOStatement
{
switch (true) {
case 'mysql' === $this->driver:
$mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ".
"ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
break;
case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='):


$mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
break;
case 'sqlite' === $this->driver:
$mergeSql = "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)";
break;
case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '9.5', '>='):
$mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ".
"ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
break;
default:

return null;
}

$mergeStmt = $this->pdo->prepare($mergeSql);

if ('sqlsrv' === $this->driver) {
$mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR);
$mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR);
$mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB);
$mergeStmt->bindValue(4, time() + $maxlifetime, \PDO::PARAM_INT);
$mergeStmt->bindValue(5, time(), \PDO::PARAM_INT);
$mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB);
$mergeStmt->bindValue(7, time() + $maxlifetime, \PDO::PARAM_INT);
$mergeStmt->bindValue(8, time(), \PDO::PARAM_INT);
} else {
$mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
$mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
$mergeStmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT);
$mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT);
}

return $mergeStmt;
}




protected function getConnection(): \PDO
{
if (!isset($this->pdo)) {
$this->connect($this->dsn ?: \ini_get('session.save_path'));
}

return $this->pdo;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use MongoDB\BSON\Binary;
use MongoDB\BSON\UTCDateTime;
use MongoDB\Client;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;









class MongoDbSessionHandler extends AbstractSessionHandler
{
private Manager $manager;
private string $namespace;
private array $options;
private int|\Closure|null $ttl;
































public function __construct(Client|Manager $mongo, array $options)
{
if (!isset($options['database']) || !isset($options['collection'])) {
throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler.');
}

if ($mongo instanceof Client) {
$mongo = $mongo->getManager();
}

$this->manager = $mongo;
$this->namespace = $options['database'].'.'.$options['collection'];

$this->options = array_merge([
'id_field' => '_id',
'data_field' => 'data',
'time_field' => 'time',
'expiry_field' => 'expires_at',
], $options);
$this->ttl = $this->options['ttl'] ?? null;
}

public function close(): bool
{
return true;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{
$write = new BulkWrite();
$write->delete(
[$this->options['id_field'] => $sessionId],
['limit' => 1]
);

$this->manager->executeBulkWrite($this->namespace, $write);

return true;
}

public function gc(int $maxlifetime): int|false
{
$write = new BulkWrite();
$write->delete(
[$this->options['expiry_field'] => ['$lt' => $this->getUTCDateTime()]],
);
$result = $this->manager->executeBulkWrite($this->namespace, $write);

return $result->getDeletedCount() ?? false;
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime');
$expiry = $this->getUTCDateTime($ttl);

$fields = [
$this->options['time_field'] => $this->getUTCDateTime(),
$this->options['expiry_field'] => $expiry,
$this->options['data_field'] => new Binary($data, Binary::TYPE_GENERIC),
];

$write = new BulkWrite();
$write->update(
[$this->options['id_field'] => $sessionId],
['$set' => $fields],
['upsert' => true]
);

$this->manager->executeBulkWrite($this->namespace, $write);

return true;
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime');
$expiry = $this->getUTCDateTime($ttl);

$write = new BulkWrite();
$write->update(
[$this->options['id_field'] => $sessionId],
['$set' => [
$this->options['time_field'] => $this->getUTCDateTime(),
$this->options['expiry_field'] => $expiry,
]],
['multi' => false],
);

$this->manager->executeBulkWrite($this->namespace, $write);

return true;
}

protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
$cursor = $this->manager->executeQuery($this->namespace, new Query([
$this->options['id_field'] => $sessionId,
$this->options['expiry_field'] => ['$gte' => $this->getUTCDateTime()],
], [
'projection' => [
'_id' => false,
$this->options['data_field'] => true,
],
'limit' => 1,
]));

foreach ($cursor as $document) {
return (string) $document->{$this->options['data_field']} ?? '';
}


return '';
}

private function getUTCDateTime(int $additionalSeconds = 0): UTCDateTime
{
return new UTCDateTime((time() + $additionalSeconds) * 1000);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Symfony\Component\Cache\Marshaller\MarshallerInterface;




class MarshallingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
{
public function __construct(
private AbstractSessionHandler $handler,
private MarshallerInterface $marshaller,
) {
}

public function open(string $savePath, string $name): bool
{
return $this->handler->open($savePath, $name);
}

public function close(): bool
{
return $this->handler->close();
}

public function destroy(#[\SensitiveParameter] string $sessionId): bool
{
return $this->handler->destroy($sessionId);
}

public function gc(int $maxlifetime): int|false
{
return $this->handler->gc($maxlifetime);
}

public function read(#[\SensitiveParameter] string $sessionId): string
{
return $this->marshaller->unmarshall($this->handler->read($sessionId));
}

public function write(#[\SensitiveParameter] string $sessionId, string $data): bool
{
$failed = [];
$marshalledData = $this->marshaller->marshall(['data' => $data], $failed);

if (isset($failed['data'])) {
return false;
}

return $this->handler->write($sessionId, $marshalledData['data']);
}

public function validateId(#[\SensitiveParameter] string $sessionId): bool
{
return $this->handler->validateId($sessionId);
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return $this->handler->updateTimestamp($sessionId, $data);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;






class NativeFileSessionHandler extends \SessionHandler
{










public function __construct(?string $savePath = null)
{
$baseDir = $savePath ??= \ini_get('session.save_path');

if ($count = substr_count($savePath, ';')) {
if ($count > 2) {
throw new \InvalidArgumentException(\sprintf('Invalid argument $savePath \'%s\'.', $savePath));
}


$baseDir = ltrim(strrchr($savePath, ';'), ';');
}

if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) {
throw new \RuntimeException(\sprintf('Session Storage was not able to create directory "%s".', $baseDir));
}

if ($savePath !== \ini_get('session.save_path')) {
ini_set('session.save_path', $savePath);
}
if ('files' !== \ini_get('session.save_handler')) {
ini_set('session.save_handler', 'files');
}
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;






class NullSessionHandler extends AbstractSessionHandler
{
public function close(): bool
{
return true;
}

public function validateId(#[\SensitiveParameter] string $sessionId): bool
{
return true;
}

protected function doRead(#[\SensitiveParameter] string $sessionId): string
{
return '';
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return true;
}

protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool
{
return true;
}

protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool
{
return true;
}

public function gc(int $maxlifetime): int|false
{
return 0;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;










class MigratingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
{
private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $currentHandler;
private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $writeOnlyHandler;

public function __construct(\SessionHandlerInterface $currentHandler, \SessionHandlerInterface $writeOnlyHandler)
{
if (!$currentHandler instanceof \SessionUpdateTimestampHandlerInterface) {
$currentHandler = new StrictSessionHandler($currentHandler);
}
if (!$writeOnlyHandler instanceof \SessionUpdateTimestampHandlerInterface) {
$writeOnlyHandler = new StrictSessionHandler($writeOnlyHandler);
}

$this->currentHandler = $currentHandler;
$this->writeOnlyHandler = $writeOnlyHandler;
}

public function close(): bool
{
$result = $this->currentHandler->close();
$this->writeOnlyHandler->close();

return $result;
}

public function destroy(#[\SensitiveParameter] string $sessionId): bool
{
$result = $this->currentHandler->destroy($sessionId);
$this->writeOnlyHandler->destroy($sessionId);

return $result;
}

public function gc(int $maxlifetime): int|false
{
$result = $this->currentHandler->gc($maxlifetime);
$this->writeOnlyHandler->gc($maxlifetime);

return $result;
}

public function open(string $savePath, string $sessionName): bool
{
$result = $this->currentHandler->open($savePath, $sessionName);
$this->writeOnlyHandler->open($savePath, $sessionName);

return $result;
}

public function read(#[\SensitiveParameter] string $sessionId): string
{

return $this->currentHandler->read($sessionId);
}

public function write(#[\SensitiveParameter] string $sessionId, string $sessionData): bool
{
$result = $this->currentHandler->write($sessionId, $sessionData);
$this->writeOnlyHandler->write($sessionId, $sessionData);

return $result;
}

public function validateId(#[\SensitiveParameter] string $sessionId): bool
{

return $this->currentHandler->validateId($sessionId);
}

public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $sessionData): bool
{
$result = $this->currentHandler->updateTimestamp($sessionId, $sessionData);
$this->writeOnlyHandler->updateTimestamp($sessionId, $sessionData);

return $result;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

use Symfony\Component\Cache\Marshaller\MarshallerInterface;




class IdentityMarshaller implements MarshallerInterface
{
public function marshall(array $values, ?array &$failed): array
{
foreach ($values as $key => $value) {
if (!\is_string($value)) {
throw new \LogicException(\sprintf('%s accepts only string as data.', __METHOD__));
}
}

return $values;
}

public function unmarshall(string $value): string
{
return $value;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;







interface SessionStorageInterface
{





public function start(): bool;




public function isStarted(): bool;




public function getId(): string;




public function setId(string $id): void;




public function getName(): string;




public function setName(string $name): void;




























public function regenerate(bool $destroy = false, ?int $lifetime = null): bool;












public function save(): void;




public function clear(): void;






public function getBag(string $name): SessionBagInterface;




public function registerBag(SessionBagInterface $bag): void;

public function getMetadataBag(): MetadataBag;
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;






class PhpBridgeSessionStorage extends NativeSessionStorage
{
public function __construct(AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null)
{
if (!\extension_loaded('session')) {
throw new \LogicException('PHP extension "session" is required.');
}

$this->setMetadataBag($metaBag);
$this->setSaveHandler($handler);
}

public function start(): bool
{
if ($this->started) {
return true;
}

$this->loadSession();

return true;
}

public function clear(): void
{


foreach ($this->bags as $bag) {
$bag->clear();
}


$this->loadSession();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;


class_exists(MetadataBag::class);
class_exists(StrictSessionHandler::class);
class_exists(SessionHandlerProxy::class);






class NativeSessionStorage implements SessionStorageInterface
{



protected array $bags = [];
protected bool $started = false;
protected bool $closed = false;
protected AbstractProxy|\SessionHandlerInterface $saveHandler;
protected MetadataBag $metadataBag;





































public function __construct(array $options = [], AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null)
{
if (!\extension_loaded('session')) {
throw new \LogicException('PHP extension "session" is required.');
}

$options += [
'cache_limiter' => '',
'cache_expire' => 0,
'use_cookies' => 1,
'lazy_write' => 1,
'use_strict_mode' => 1,
];

session_register_shutdown();

$this->setMetadataBag($metaBag);
$this->setOptions($options);
$this->setSaveHandler($handler);
}




public function getSaveHandler(): AbstractProxy|\SessionHandlerInterface
{
return $this->saveHandler;
}

public function start(): bool
{
if ($this->started) {
return true;
}

if (\PHP_SESSION_ACTIVE === session_status()) {
throw new \RuntimeException('Failed to start the session: already started by PHP.');
}

if (filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL) && headers_sent($file, $line)) {
throw new \RuntimeException(\sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line));
}

$sessionId = $_COOKIE[session_name()] ?? null;
































if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,250}$/', $sessionId)) {

session_id(session_create_id());
}


if (!session_start()) {
throw new \RuntimeException('Failed to start the session.');
}

$this->loadSession();

return true;
}

public function getId(): string
{
return $this->saveHandler->getId();
}

public function setId(string $id): void
{
$this->saveHandler->setId($id);
}

public function getName(): string
{
return $this->saveHandler->getName();
}

public function setName(string $name): void
{
$this->saveHandler->setName($name);
}

public function regenerate(bool $destroy = false, ?int $lifetime = null): bool
{

if (\PHP_SESSION_ACTIVE !== session_status()) {
return false;
}

if (headers_sent()) {
return false;
}

if (null !== $lifetime && $lifetime != \ini_get('session.cookie_lifetime')) {
$this->save();
ini_set('session.cookie_lifetime', $lifetime);
$this->start();
}

if ($destroy) {
$this->metadataBag->stampNew();
}

return session_regenerate_id($destroy);
}

public function save(): void
{

$session = $_SESSION;

foreach ($this->bags as $bag) {
if (empty($_SESSION[$key = $bag->getStorageKey()])) {
unset($_SESSION[$key]);
}
}
if ($_SESSION && [$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) {
unset($_SESSION[$key]);
}


$previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) {
if (\E_WARNING === $type && str_starts_with($msg, 'session_write_close():')) {
$handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler;
$msg = \sprintf('session_write_close(): Failed to write session data with "%s" handler', $handler::class);
}

return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false;
});

try {
session_write_close();
} finally {
restore_error_handler();


if ($_SESSION) {
$_SESSION = $session;
}
}

$this->closed = true;
$this->started = false;
}

public function clear(): void
{

foreach ($this->bags as $bag) {
$bag->clear();
}


$_SESSION = [];


$this->loadSession();
}

public function registerBag(SessionBagInterface $bag): void
{
if ($this->started) {
throw new \LogicException('Cannot register a bag when the session is already started.');
}

$this->bags[$bag->getName()] = $bag;
}

public function getBag(string $name): SessionBagInterface
{
if (!isset($this->bags[$name])) {
throw new \InvalidArgumentException(\sprintf('The SessionBagInterface "%s" is not registered.', $name));
}

if (!$this->started && $this->saveHandler->isActive()) {
$this->loadSession();
} elseif (!$this->started) {
$this->start();
}

return $this->bags[$name];
}

public function setMetadataBag(?MetadataBag $metaBag): void
{
$this->metadataBag = $metaBag ?? new MetadataBag();
}




public function getMetadataBag(): MetadataBag
{
return $this->metadataBag;
}

public function isStarted(): bool
{
return $this->started;
}











public function setOptions(array $options): void
{
if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) {
return;
}

$validOptions = array_flip([
'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly',
'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite',
'gc_divisor', 'gc_maxlifetime', 'gc_probability',
'lazy_write', 'name', 'referer_check',
'serialize_handler', 'use_strict_mode', 'use_cookies',
'use_only_cookies', 'use_trans_sid',
'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags',
]);

foreach ($options as $key => $value) {
if (\in_array($key, ['referer_check', 'use_only_cookies', 'use_trans_sid', 'trans_sid_hosts', 'trans_sid_tags', 'sid_length', 'sid_bits_per_character'], true)) {
trigger_deprecation('symfony/http-foundation', '7.2', 'NativeSessionStorage\'s "%s" option is deprecated and will be ignored in Symfony 8.0.', $key);
}

if (isset($validOptions[$key])) {
if ('cookie_secure' === $key && 'auto' === $value) {
continue;
}
ini_set('session.'.$key, $value);
}
}
}



















public function setSaveHandler(AbstractProxy|\SessionHandlerInterface|null $saveHandler): void
{

if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
$saveHandler = new SessionHandlerProxy($saveHandler);
} elseif (!$saveHandler instanceof AbstractProxy) {
$saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \SessionHandler()));
}
$this->saveHandler = $saveHandler;

if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) {
return;
}

if ($this->saveHandler instanceof SessionHandlerProxy) {
session_set_save_handler($this->saveHandler, false);
}
}









protected function loadSession(?array &$session = null): void
{
if (null === $session) {
$session = &$_SESSION;
}

$bags = array_merge($this->bags, [$this->metadataBag]);

foreach ($bags as $bag) {
$key = $bag->getStorageKey();
$session[$key] = isset($session[$key]) && \is_array($session[$key]) ? $session[$key] : [];
$bag->initialize($session[$key]);
}

$this->started = true;
$this->closed = false;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;


class_exists(NativeSessionStorage::class);




class NativeSessionStorageFactory implements SessionStorageFactoryInterface
{



public function __construct(
private array $options = [],
private AbstractProxy|\SessionHandlerInterface|null $handler = null,
private ?MetadataBag $metaBag = null,
private bool $secure = false,
) {
}

public function createStorage(?Request $request): SessionStorageInterface
{
$storage = new NativeSessionStorage($this->options, $this->handler, $this->metaBag);
if ($this->secure && $request?->isSecure()) {
$storage->setOptions(['cookie_secure' => true]);
}

return $storage;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Request;




interface SessionStorageFactoryInterface
{



public function createStorage(?Request $request): SessionStorageInterface;
}
<?php










namespace Symfony\Component\HttpFoundation\Session;






final class SessionBagProxy implements SessionBagInterface
{
private array $data;
private ?int $usageIndex;
private ?\Closure $usageReporter;

public function __construct(
private SessionBagInterface $bag,
array &$data,
?int &$usageIndex,
?callable $usageReporter,
) {
$this->bag = $bag;
$this->data = &$data;
$this->usageIndex = &$usageIndex;
$this->usageReporter = null === $usageReporter ? null : $usageReporter(...);
}

public function getBag(): SessionBagInterface
{
++$this->usageIndex;
if ($this->usageReporter && 0 <= $this->usageIndex) {
($this->usageReporter)();
}

return $this->bag;
}

public function isEmpty(): bool
{
if (!isset($this->data[$this->bag->getStorageKey()])) {
return true;
}
++$this->usageIndex;
if ($this->usageReporter && 0 <= $this->usageIndex) {
($this->usageReporter)();
}

return empty($this->data[$this->bag->getStorageKey()]);
}

public function getName(): string
{
return $this->bag->getName();
}

public function initialize(array &$array): void
{
++$this->usageIndex;
if ($this->usageReporter && 0 <= $this->usageIndex) {
($this->usageReporter)();
}

$this->data[$this->bag->getStorageKey()] = &$array;

$this->bag->initialize($array);
}

public function getStorageKey(): string
{
return $this->bag->getStorageKey();
}

public function clear(): mixed
{
return $this->bag->clear();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session;






interface SessionBagInterface
{



public function getName(): string;




public function initialize(array &$array): void;




public function getStorageKey(): string;






public function clear(): mixed;
}
<?php










namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag;






interface SessionInterface
{





public function start(): bool;




public function getId(): string;




public function setId(string $id): void;




public function getName(): string;




public function setName(string $name): void;












public function invalidate(?int $lifetime = null): bool;











public function migrate(bool $destroy = false, ?int $lifetime = null): bool;








public function save(): void;




public function has(string $name): bool;




public function get(string $name, mixed $default = null): mixed;




public function set(string $name, mixed $value): void;




public function all(): array;




public function replace(array $attributes): void;






public function remove(string $name): mixed;




public function clear(): void;




public function isStarted(): bool;




public function registerBag(SessionBagInterface $bag): void;




public function getBag(string $name): SessionBagInterface;




public function getMetadataBag(): MetadataBag;
}
<?php










namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;


class_exists(AttributeBag::class);
class_exists(FlashBag::class);
class_exists(SessionBagProxy::class);

/**
@implements



*/
class Session implements FlashBagAwareSessionInterface, \IteratorAggregate, \Countable
{
protected SessionStorageInterface $storage;

private string $flashName;
private string $attributeName;
private array $data = [];
private int $usageIndex = 0;
private ?\Closure $usageReporter;

public function __construct(?SessionStorageInterface $storage = null, ?AttributeBagInterface $attributes = null, ?FlashBagInterface $flashes = null, ?callable $usageReporter = null)
{
$this->storage = $storage ?? new NativeSessionStorage();
$this->usageReporter = null === $usageReporter ? null : $usageReporter(...);

$attributes ??= new AttributeBag();
$this->attributeName = $attributes->getName();
$this->registerBag($attributes);

$flashes ??= new FlashBag();
$this->flashName = $flashes->getName();
$this->registerBag($flashes);
}

public function start(): bool
{
return $this->storage->start();
}

public function has(string $name): bool
{
return $this->getAttributeBag()->has($name);
}

public function get(string $name, mixed $default = null): mixed
{
return $this->getAttributeBag()->get($name, $default);
}

public function set(string $name, mixed $value): void
{
$this->getAttributeBag()->set($name, $value);
}

public function all(): array
{
return $this->getAttributeBag()->all();
}

public function replace(array $attributes): void
{
$this->getAttributeBag()->replace($attributes);
}

public function remove(string $name): mixed
{
return $this->getAttributeBag()->remove($name);
}

public function clear(): void
{
$this->getAttributeBag()->clear();
}

public function isStarted(): bool
{
return $this->storage->isStarted();
}






public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->getAttributeBag()->all());
}




public function count(): int
{
return \count($this->getAttributeBag()->all());
}

public function &getUsageIndex(): int
{
return $this->usageIndex;
}




public function isEmpty(): bool
{
if ($this->isStarted()) {
++$this->usageIndex;
if ($this->usageReporter && 0 <= $this->usageIndex) {
($this->usageReporter)();
}
}
foreach ($this->data as &$data) {
if ($data) {
return false;
}
}

return true;
}

public function invalidate(?int $lifetime = null): bool
{
$this->storage->clear();

return $this->migrate(true, $lifetime);
}

public function migrate(bool $destroy = false, ?int $lifetime = null): bool
{
return $this->storage->regenerate($destroy, $lifetime);
}

public function save(): void
{
$this->storage->save();
}

public function getId(): string
{
return $this->storage->getId();
}

public function setId(string $id): void
{
if ($this->storage->getId() !== $id) {
$this->storage->setId($id);
}
}

public function getName(): string
{
return $this->storage->getName();
}

public function setName(string $name): void
{
$this->storage->setName($name);
}

public function getMetadataBag(): MetadataBag
{
++$this->usageIndex;
if ($this->usageReporter && 0 <= $this->usageIndex) {
($this->usageReporter)();
}

return $this->storage->getMetadataBag();
}

public function registerBag(SessionBagInterface $bag): void
{
$this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex, $this->usageReporter));
}

public function getBag(string $name): SessionBagInterface
{
$bag = $this->storage->getBag($name);

return method_exists($bag, 'getBag') ? $bag->getBag() : $bag;
}




public function getFlashBag(): FlashBagInterface
{
return $this->getBag($this->flashName);
}






private function getAttributeBag(): AttributeBagInterface
{
return $this->getBag($this->attributeName);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session;









final class SessionUtils
{




public static function popSessionCookie(string $sessionName, #[\SensitiveParameter] string $sessionId): ?string
{
$sessionCookie = null;
$sessionCookiePrefix = \sprintf(' %s=', urlencode($sessionName));
$sessionCookieWithId = \sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId));
$otherCookies = [];
foreach (headers_list() as $h) {
if (0 !== stripos($h, 'Set-Cookie:')) {
continue;
}
if (11 === strpos($h, $sessionCookiePrefix, 11)) {
$sessionCookie = $h;

if (11 !== strpos($h, $sessionCookieWithId, 11)) {
$otherCookies[] = $h;
}
} else {
$otherCookies[] = $h;
}
}
if (null === $sessionCookie) {
return null;
}

header_remove('Set-Cookie');
foreach ($otherCookies as $h) {
header($h, false);
}

return $sessionCookie;
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface;


class_exists(Session::class);




class SessionFactory implements SessionFactoryInterface
{
private ?\Closure $usageReporter;

public function __construct(
private RequestStack $requestStack,
private SessionStorageFactoryInterface $storageFactory,
?callable $usageReporter = null,
) {
$this->usageReporter = null === $usageReporter ? null : $usageReporter(...);
}

public function createSession(): SessionInterface
{
return new Session($this->storageFactory->createStorage($this->requestStack->getMainRequest()), null, null, $this->usageReporter);
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Flash;






class AutoExpireFlashBag implements FlashBagInterface
{
private string $name = 'flashes';
private array $flashes = ['display' => [], 'new' => []];




public function __construct(
private string $storageKey = '_symfony_flashes',
) {
}

public function getName(): string
{
return $this->name;
}

public function setName(string $name): void
{
$this->name = $name;
}

public function initialize(array &$flashes): void
{
$this->flashes = &$flashes;




$this->flashes['display'] = \array_key_exists('new', $this->flashes) ? $this->flashes['new'] : [];
$this->flashes['new'] = [];
}

public function add(string $type, mixed $message): void
{
$this->flashes['new'][$type][] = $message;
}

public function peek(string $type, array $default = []): array
{
return $this->has($type) ? $this->flashes['display'][$type] : $default;
}

public function peekAll(): array
{
return \array_key_exists('display', $this->flashes) ? $this->flashes['display'] : [];
}

public function get(string $type, array $default = []): array
{
$return = $default;

if (!$this->has($type)) {
return $return;
}

if (isset($this->flashes['display'][$type])) {
$return = $this->flashes['display'][$type];
unset($this->flashes['display'][$type]);
}

return $return;
}

public function all(): array
{
$return = $this->flashes['display'];
$this->flashes['display'] = [];

return $return;
}

public function setAll(array $messages): void
{
$this->flashes['new'] = $messages;
}

public function set(string $type, string|array $messages): void
{
$this->flashes['new'][$type] = (array) $messages;
}

public function has(string $type): bool
{
return \array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
}

public function keys(): array
{
return array_keys($this->flashes['display']);
}

public function getStorageKey(): string
{
return $this->storageKey;
}

public function clear(): mixed
{
return $this->all();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Flash;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;






interface FlashBagInterface extends SessionBagInterface
{



public function add(string $type, mixed $message): void;




public function set(string $type, string|array $messages): void;







public function peek(string $type, array $default = []): array;




public function peekAll(): array;






public function get(string $type, array $default = []): array;




public function all(): array;




public function setAll(array $messages): void;




public function has(string $type): bool;




public function keys(): array;
}
<?php










namespace Symfony\Component\HttpFoundation\Session\Flash;






class FlashBag implements FlashBagInterface
{
private string $name = 'flashes';
private array $flashes = [];




public function __construct(
private string $storageKey = '_symfony_flashes',
) {
}

public function getName(): string
{
return $this->name;
}

public function setName(string $name): void
{
$this->name = $name;
}

public function initialize(array &$flashes): void
{
$this->flashes = &$flashes;
}

public function add(string $type, mixed $message): void
{
$this->flashes[$type][] = $message;
}

public function peek(string $type, array $default = []): array
{
return $this->has($type) ? $this->flashes[$type] : $default;
}

public function peekAll(): array
{
return $this->flashes;
}

public function get(string $type, array $default = []): array
{
if (!$this->has($type)) {
return $default;
}

$return = $this->flashes[$type];

unset($this->flashes[$type]);

return $return;
}

public function all(): array
{
$return = $this->peekAll();
$this->flashes = [];

return $return;
}

public function set(string $type, string|array $messages): void
{
$this->flashes[$type] = (array) $messages;
}

public function setAll(array $messages): void
{
$this->flashes = $messages;
}

public function has(string $type): bool
{
return \array_key_exists($type, $this->flashes) && $this->flashes[$type];
}

public function keys(): array
{
return array_keys($this->flashes);
}

public function getStorageKey(): string
{
return $this->storageKey;
}

public function clear(): mixed
{
return $this->all();
}
}
<?php










namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;




interface FlashBagAwareSessionInterface extends SessionInterface
{
public function getFlashBag(): FlashBagInterface;
}
<?php










namespace Symfony\Component\HttpFoundation\Session;




interface SessionFactoryInterface
{
public function createSession(): SessionInterface;
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
use Symfony\Component\HttpFoundation\Session\SessionInterface;






class RequestStack
{



private array $requests = [];




public function __construct(array $requests = [])
{
foreach ($requests as $request) {
$this->push($request);
}
}







public function push(Request $request): void
{
$this->requests[] = $request;
}









public function pop(): ?Request
{
if (!$this->requests) {
return null;
}

return array_pop($this->requests);
}

public function getCurrentRequest(): ?Request
{
return end($this->requests) ?: null;
}








public function getMainRequest(): ?Request
{
if (!$this->requests) {
return null;
}

return $this->requests[0];
}










public function getParentRequest(): ?Request
{
$pos = \count($this->requests) - 2;

return $this->requests[$pos] ?? null;
}






public function getSession(): SessionInterface
{
if ((null !== $request = end($this->requests) ?: null) && $request->hasSession()) {
return $request->getSession();
}

throw new SessionNotFoundException();
}

public function resetRequestFormats(): void
{
static $resetRequestFormats;
$resetRequestFormats ??= \Closure::bind(static fn () => self::$formats = null, null, Request::class);
$resetRequestFormats();
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class HostRequestMatcher implements RequestMatcherInterface
{
public function __construct(private string $regexp)
{
}

public function matches(Request $request): bool
{
return preg_match('{'.$this->regexp.'}i', $request->getHost());
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class IsJsonRequestMatcher implements RequestMatcherInterface
{
public function matches(Request $request): bool
{
return json_validate($request->getContent());
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class SchemeRequestMatcher implements RequestMatcherInterface
{



private array $schemes;





public function __construct(array|string $schemes)
{
$this->schemes = array_reduce(array_map('strtolower', (array) $schemes), static fn (array $schemes, string $scheme) => array_merge($schemes, preg_split('/\s*,\s*/', $scheme)), []);
}

public function matches(Request $request): bool
{
if (!$this->schemes) {
return true;
}

return \in_array($request->getScheme(), $this->schemes, true);
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class MethodRequestMatcher implements RequestMatcherInterface
{



private array $methods = [];





public function __construct(array|string $methods)
{
$this->methods = array_reduce(array_map('strtoupper', (array) $methods), static fn (array $methods, string $method) => array_merge($methods, preg_split('/\s*,\s*/', $method)), []);
}

public function matches(Request $request): bool
{
if (!$this->methods) {
return true;
}

return \in_array($request->getMethod(), $this->methods, true);
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class PathRequestMatcher implements RequestMatcherInterface
{
public function __construct(private string $regexp)
{
}

public function matches(Request $request): bool
{
return preg_match('{'.$this->regexp.'}', rawurldecode($request->getPathInfo()));
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class IpsRequestMatcher implements RequestMatcherInterface
{
private array $ips;





public function __construct(array|string $ips)
{
$this->ips = array_reduce((array) $ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\s*,\s*/', $ip)), []);
}

public function matches(Request $request): bool
{
if (!$this->ips) {
return true;
}

return IpUtils::checkIp($request->getClientIp() ?? '', $this->ips);
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class ExpressionRequestMatcher implements RequestMatcherInterface
{
public function __construct(
private ExpressionLanguage $language,
private Expression|string $expression,
) {
}

public function matches(Request $request): bool
{
return $this->language->evaluate($this->expression, [
'request' => $request,
'method' => $request->getMethod(),
'path' => rawurldecode($request->getPathInfo()),
'host' => $request->getHost(),
'ip' => $request->getClientIp(),
'attributes' => $request->attributes->all(),
]);
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class HeaderRequestMatcher implements RequestMatcherInterface
{



private array $headers;





public function __construct(array|string $headers)
{
$this->headers = array_reduce((array) $headers, static fn (array $headers, string $header) => array_merge($headers, preg_split('/\s*,\s*/', $header)), []);
}

public function matches(Request $request): bool
{
if (!$this->headers) {
return true;
}

foreach ($this->headers as $header) {
if (!$request->headers->has($header)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class PortRequestMatcher implements RequestMatcherInterface
{
public function __construct(private int $port)
{
}

public function matches(Request $request): bool
{
return $request->getPort() === $this->port;
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class AttributesRequestMatcher implements RequestMatcherInterface
{



public function __construct(private array $regexps)
{
}

public function matches(Request $request): bool
{
foreach ($this->regexps as $key => $regexp) {
$attribute = $request->attributes->get($key);
if (!\is_string($attribute)) {
return false;
}
if (!preg_match('{'.$regexp.'}', $attribute)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\HttpFoundation\RequestMatcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;






class QueryParameterRequestMatcher implements RequestMatcherInterface
{



private array $parameters;





public function __construct(array|string $parameters)
{
$this->parameters = array_reduce(array_map(strtolower(...), (array) $parameters), static fn (array $parameters, string $parameter) => array_merge($parameters, preg_split('/\s*,\s*/', $parameter)), []);
}

public function matches(Request $request): bool
{
if (!$this->parameters) {
return true;
}

return 0 === \count(array_diff_assoc($this->parameters, $request->query->keys()));
}
}
<?php










namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException;






final class InputBag extends ParameterBag
{







public function get(string $key, mixed $default = null): string|int|float|bool|null
{
if (null !== $default && !\is_scalar($default) && !$default instanceof \Stringable) {
throw new \InvalidArgumentException(\sprintf('Expected a scalar value as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($default)));
}

$value = parent::get($key, $this);

if (null !== $value && $this !== $value && !\is_scalar($value) && !$value instanceof \Stringable) {
throw new BadRequestException(\sprintf('Input value "%s" contains a non-scalar value.', $key));
}

return $this === $value ? $default : $value;
}




public function replace(array $inputs = []): void
{
$this->parameters = [];
$this->add($inputs);
}




public function add(array $inputs = []): void
{
foreach ($inputs as $input => $value) {
$this->set($input, $value);
}
}






public function set(string $key, mixed $value): void
{
if (null !== $value && !\is_scalar($value) && !\is_array($value) && !$value instanceof \Stringable) {
throw new \InvalidArgumentException(\sprintf('Expected a scalar, or an array as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($value)));
}

$this->parameters[$key] = $value;
}

/**
@template
@psalm-return($default is null ? T|null : T)










*/
public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum
{
try {
return parent::getEnum($key, $class, $default);
} catch (UnexpectedValueException $e) {
throw new BadRequestException($e->getMessage(), $e->getCode(), $e);
}
}






public function getString(string $key, string $default = ''): string
{

return (string) $this->get($key, $default);
}





public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed
{
$value = $this->has($key) ? $this->all()[$key] : $default;


if (!\is_array($options) && $options) {
$options = ['flags' => $options];
}

if (\is_array($value) && !(($options['flags'] ?? 0) & (\FILTER_REQUIRE_ARRAY | \FILTER_FORCE_ARRAY))) {
throw new BadRequestException(\sprintf('Input value "%s" contains an array, but "FILTER_REQUIRE_ARRAY" or "FILTER_FORCE_ARRAY" flags were not set.', $key));
}

if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) {
throw new \InvalidArgumentException(\sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null)));
}

$options['flags'] ??= 0;
$nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE;
$options['flags'] |= \FILTER_NULL_ON_FAILURE;

$value = filter_var($value, $filter, $options);

if (null !== $value || $nullOnFailure) {
return $value;
}

throw new BadRequestException(\sprintf('Input value "%s" is invalid and flag "FILTER_NULL_ON_FAILURE" was not set.', $key));
}
}
<?php










namespace Symfony\Component\Finder\Comparator;






class DateComparator extends Comparator
{





public function __construct(string $test)
{
if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) {
throw new \InvalidArgumentException(\sprintf('Don\'t understand "%s" as a date test.', $test));
}

try {
$date = new \DateTimeImmutable($matches[2]);
$target = $date->format('U');
} catch (\Exception) {
throw new \InvalidArgumentException(\sprintf('"%s" is not a valid date.', $matches[2]));
}

$operator = $matches[1] ?: '==';
if ('since' === $operator || 'after' === $operator) {
$operator = '>';
}

if ('until' === $operator || 'before' === $operator) {
$operator = '<';
}

parent::__construct($target, $operator);
}
}
<?php










namespace Symfony\Component\Finder\Comparator;






















class NumberComparator extends Comparator
{





public function __construct(?string $test)
{
if (null === $test || !preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
throw new \InvalidArgumentException(\sprintf('Don\'t understand "%s" as a number test.', $test ?? 'null'));
}

$target = $matches[2];
if (!is_numeric($target)) {
throw new \InvalidArgumentException(\sprintf('Invalid number "%s".', $target));
}
if (isset($matches[3])) {

switch (strtolower($matches[3])) {
case 'k':
$target *= 1000;
break;
case 'ki':
$target *= 1024;
break;
case 'm':
$target *= 1000000;
break;
case 'mi':
$target *= 1024 * 1024;
break;
case 'g':
$target *= 1000000000;
break;
case 'gi':
$target *= 1024 * 1024 * 1024;
break;
}
}

parent::__construct($target, $matches[1] ?: '==');
}
}
<?php










namespace Symfony\Component\Finder\Comparator;




class Comparator
{
private string $target;
private string $operator;

public function __construct(string $target, string $operator = '==')
{
if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) {
throw new \InvalidArgumentException(\sprintf('Invalid operator "%s".', $operator));
}

$this->target = $target;
$this->operator = $operator;
}




public function getTarget(): string
{
return $this->target;
}




public function getOperator(): string
{
return $this->operator;
}




public function test(mixed $test): bool
{
return match ($this->operator) {
'>' => $test > $this->target,
'>=' => $test >= $this->target,
'<' => $test < $this->target,
'<=' => $test <= $this->target,
'!=' => $test != $this->target,
default => $test == $this->target,
};
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Comparator\DateComparator;

/**
@extends




*/
class DateRangeFilterIterator extends \FilterIterator
{
private array $comparators = [];





public function __construct(\Iterator $iterator, array $comparators)
{
$this->comparators = $comparators;

parent::__construct($iterator);
}




public function accept(): bool
{
$fileinfo = $this->current();

if (!file_exists($fileinfo->getPathname())) {
return false;
}

$filedate = $fileinfo->getMTime();
foreach ($this->comparators as $compare) {
if (!$compare->test($filedate)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

/**
@template-covariant
@template-covariant
@extends





*/
abstract class MultiplePcreFilterIterator extends \FilterIterator
{
protected $matchRegexps = [];
protected $noMatchRegexps = [];






public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
{
foreach ($matchPatterns as $pattern) {
$this->matchRegexps[] = $this->toRegex($pattern);
}

foreach ($noMatchPatterns as $pattern) {
$this->noMatchRegexps[] = $this->toRegex($pattern);
}

parent::__construct($iterator);
}








protected function isAccepted(string $string): bool
{

foreach ($this->noMatchRegexps as $regex) {
if (preg_match($regex, $string)) {
return false;
}
}


if ($this->matchRegexps) {
foreach ($this->matchRegexps as $regex) {
if (preg_match($regex, $string)) {
return true;
}
}

return false;
}


return true;
}




protected function isRegex(string $str): bool
{
$availableModifiers = 'imsxuADU';

if (\PHP_VERSION_ID >= 80200) {
$availableModifiers .= 'n';
}

if (preg_match('/^(.{3,}?)['.$availableModifiers.']*$/', $str, $m)) {
$start = substr($m[1], 0, 1);
$end = substr($m[1], -1);

if ($start === $end) {
return !preg_match('/[*?[:alnum:] \\\\]/', $start);
}

foreach ([['{', '}'], ['(', ')'], ['[', ']'], ['<', '>']] as $delimiters) {
if ($start === $delimiters[0] && $end === $delimiters[1]) {
return true;
}
}
}

return false;
}




abstract protected function toRegex(string $str): string;
}
<?php










namespace Symfony\Component\Finder\Iterator;

/**
@template-covariant
@template-covariant
@extends





*/
class DepthRangeFilterIterator extends \FilterIterator
{
private int $minDepth = 0;






public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX)
{
$this->minDepth = $minDepth;
$iterator->setMaxDepth(\PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);

parent::__construct($iterator);
}




public function accept(): bool
{
return $this->getInnerIterator()->getDepth() >= $this->minDepth;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Gitignore;

/**
@extends
*/
final class VcsIgnoredFilterIterator extends \FilterIterator
{
private string $baseDir;




private array $gitignoreFilesCache = [];




private array $ignoredPathsCache = [];




public function __construct(\Iterator $iterator, string $baseDir)
{
$this->baseDir = $this->normalizePath($baseDir);

foreach ([$this->baseDir, ...$this->parentDirectoriesUpwards($this->baseDir)] as $directory) {
if (@is_dir("{$directory}/.git")) {
$this->baseDir = $directory;
break;
}
}

parent::__construct($iterator);
}

public function accept(): bool
{
$file = $this->current();

$fileRealPath = $this->normalizePath($file->getRealPath());

return !$this->isIgnored($fileRealPath);
}

private function isIgnored(string $fileRealPath): bool
{
if (is_dir($fileRealPath) && !str_ends_with($fileRealPath, '/')) {
$fileRealPath .= '/';
}

if (isset($this->ignoredPathsCache[$fileRealPath])) {
return $this->ignoredPathsCache[$fileRealPath];
}

$ignored = false;

foreach ($this->parentDirectoriesDownwards($fileRealPath) as $parentDirectory) {
if ($this->isIgnored($parentDirectory)) {

break;
}

$fileRelativePath = substr($fileRealPath, \strlen($parentDirectory) + 1);

if (null === $regexps = $this->readGitignoreFile("{$parentDirectory}/.gitignore")) {
continue;
}

[$exclusionRegex, $inclusionRegex] = $regexps;

if (preg_match($exclusionRegex, $fileRelativePath)) {
$ignored = true;

continue;
}

if (preg_match($inclusionRegex, $fileRelativePath)) {
$ignored = false;
}
}

return $this->ignoredPathsCache[$fileRealPath] = $ignored;
}




private function parentDirectoriesUpwards(string $from): array
{
$parentDirectories = [];

$parentDirectory = $from;

while (true) {
$newParentDirectory = \dirname($parentDirectory);


if ($newParentDirectory === $parentDirectory) {
break;
}

$parentDirectories[] = $parentDirectory = $newParentDirectory;
}

return $parentDirectories;
}

private function parentDirectoriesUpTo(string $from, string $upTo): array
{
return array_filter(
$this->parentDirectoriesUpwards($from),
static fn (string $directory): bool => str_starts_with($directory, $upTo)
);
}




private function parentDirectoriesDownwards(string $fileRealPath): array
{
return array_reverse(
$this->parentDirectoriesUpTo($fileRealPath, $this->baseDir)
);
}




private function readGitignoreFile(string $path): ?array
{
if (\array_key_exists($path, $this->gitignoreFilesCache)) {
return $this->gitignoreFilesCache[$path];
}

if (!file_exists($path)) {
return $this->gitignoreFilesCache[$path] = null;
}

if (!is_file($path) || !is_readable($path)) {
throw new \RuntimeException("The \"ignoreVCSIgnored\" option cannot be used by the Finder as the \"{$path}\" file is not readable.");
}

$gitignoreFileContent = file_get_contents($path);

return $this->gitignoreFilesCache[$path] = [
Gitignore::toRegex($gitignoreFileContent),
Gitignore::toRegexMatchingNegatedPatterns($gitignoreFileContent),
];
}

private function normalizePath(string $path): string
{
if ('\\' === \DIRECTORY_SEPARATOR) {
return str_replace('\\', '/', $path);
}

return $path;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;






class LazyIterator implements \IteratorAggregate
{
private \Closure $iteratorFactory;

public function __construct(callable $iteratorFactory)
{
$this->iteratorFactory = $iteratorFactory(...);
}

public function getIterator(): \Traversable
{
yield from ($this->iteratorFactory)();
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

/**
@extends







*/
class CustomFilterIterator extends \FilterIterator
{
private array $filters = [];







public function __construct(\Iterator $iterator, array $filters)
{
foreach ($filters as $filter) {
if (!\is_callable($filter)) {
throw new \InvalidArgumentException('Invalid PHP callback.');
}
}
$this->filters = $filters;

parent::__construct($iterator);
}




public function accept(): bool
{
$fileinfo = $this->current();

foreach ($this->filters as $filter) {
if (false === $filter($fileinfo)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\Finder\SplFileInfo;

/**
@extends




*/
class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
{
private bool $ignoreUnreadableDirs;
private bool $ignoreFirstRewind = true;


private string $rootPath;
private string $subPath;
private string $directorySeparator = '/';




public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false)
{
if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
throw new \RuntimeException('This iterator only support returning current as fileinfo.');
}

parent::__construct($path, $flags);
$this->ignoreUnreadableDirs = $ignoreUnreadableDirs;
$this->rootPath = $path;
if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) {
$this->directorySeparator = \DIRECTORY_SEPARATOR;
}
}




public function current(): SplFileInfo
{


if (!isset($this->subPath)) {
$this->subPath = $this->getSubPath();
}
$subPathname = $this->subPath;
if ('' !== $subPathname) {
$subPathname .= $this->directorySeparator;
}
$subPathname .= $this->getFilename();
$basePath = $this->rootPath;

if ('/' !== $basePath && !str_ends_with($basePath, $this->directorySeparator) && !str_ends_with($basePath, '/')) {
$basePath .= $this->directorySeparator;
}

return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname);
}

public function hasChildren(bool $allowLinks = false): bool
{
$hasChildren = parent::hasChildren($allowLinks);

if (!$hasChildren || !$this->ignoreUnreadableDirs) {
return $hasChildren;
}

try {
parent::getChildren();

return true;
} catch (\UnexpectedValueException) {

return false;
}
}




public function getChildren(): \RecursiveDirectoryIterator
{
try {
$children = parent::getChildren();

if ($children instanceof self) {

$children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs;


$children->rootPath = $this->rootPath;
}

return $children;
} catch (\UnexpectedValueException $e) {
throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
}
}

public function next(): void
{
$this->ignoreFirstRewind = false;

parent::next();
}

public function rewind(): void
{


if ($this->ignoreFirstRewind) {
$this->ignoreFirstRewind = false;

return;
}

parent::rewind();
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\SplFileInfo;

/**
@extends





*/
class FilecontentFilterIterator extends MultiplePcreFilterIterator
{



public function accept(): bool
{
if (!$this->matchRegexps && !$this->noMatchRegexps) {
return true;
}

$fileinfo = $this->current();

if ($fileinfo->isDir() || !$fileinfo->isReadable()) {
return false;
}

$content = $fileinfo->getContents();
if (!$content) {
return false;
}

return $this->isAccepted($content);
}






protected function toRegex(string $str): string
{
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

/**
@implements




*/
class SortableIterator implements \IteratorAggregate
{
public const SORT_BY_NONE = 0;
public const SORT_BY_NAME = 1;
public const SORT_BY_TYPE = 2;
public const SORT_BY_ACCESSED_TIME = 3;
public const SORT_BY_CHANGED_TIME = 4;
public const SORT_BY_MODIFIED_TIME = 5;
public const SORT_BY_NAME_NATURAL = 6;
public const SORT_BY_NAME_CASE_INSENSITIVE = 7;
public const SORT_BY_NAME_NATURAL_CASE_INSENSITIVE = 8;
public const SORT_BY_EXTENSION = 9;
public const SORT_BY_SIZE = 10;


private \Traversable $iterator;
private \Closure|int $sort;







public function __construct(\Traversable $iterator, int|callable $sort, bool $reverseOrder = false)
{
$this->iterator = $iterator;
$order = $reverseOrder ? -1 : 1;

if (self::SORT_BY_NAME === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
} elseif (self::SORT_BY_NAME_NATURAL === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
} elseif (self::SORT_BY_NAME_CASE_INSENSITIVE === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
} elseif (self::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
} elseif (self::SORT_BY_TYPE === $sort) {
$this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) {
if ($a->isDir() && $b->isFile()) {
return -$order;
} elseif ($a->isFile() && $b->isDir()) {
return $order;
}

return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
};
} elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getATime() - $b->getATime());
} elseif (self::SORT_BY_CHANGED_TIME === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getCTime() - $b->getCTime());
} elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getMTime() - $b->getMTime());
} elseif (self::SORT_BY_EXTENSION === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getExtension(), $b->getExtension());
} elseif (self::SORT_BY_SIZE === $sort) {
$this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getSize() - $b->getSize());
} elseif (self::SORT_BY_NONE === $sort) {
$this->sort = $order;
} elseif (\is_callable($sort)) {
$this->sort = $reverseOrder ? static fn (\SplFileInfo $a, \SplFileInfo $b) => -$sort($a, $b) : $sort(...);
} else {
throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
}
}

public function getIterator(): \Traversable
{
if (1 === $this->sort) {
return $this->iterator;
}

$array = iterator_to_array($this->iterator, true);

if (-1 === $this->sort) {
$array = array_reverse($array);
} else {
uasort($array, $this->sort);
}

return new \ArrayIterator($array);
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Glob;

/**
@extends




*/
class FilenameFilterIterator extends MultiplePcreFilterIterator
{



public function accept(): bool
{
return $this->isAccepted($this->current()->getFilename());
}









protected function toRegex(string $str): string
{
return $this->isRegex($str) ? $str : Glob::toRegex($str);
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\SplFileInfo;

/**
@extends
@implements





*/
class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator
{

private \Iterator $iterator;
private bool $isRecursive;

private array $excludedDirs = [];
private ?string $excludedPattern = null;

private array $pruneFilters = [];





public function __construct(\Iterator $iterator, array $directories)
{
$this->iterator = $iterator;
$this->isRecursive = $iterator instanceof \RecursiveIterator;
$patterns = [];
foreach ($directories as $directory) {
if (!\is_string($directory)) {
if (!\is_callable($directory)) {
throw new \InvalidArgumentException('Invalid PHP callback.');
}

$this->pruneFilters[] = $directory;

continue;
}

$directory = rtrim($directory, '/');
if (!$this->isRecursive || str_contains($directory, '/')) {
$patterns[] = preg_quote($directory, '#');
} else {
$this->excludedDirs[$directory] = true;
}
}
if ($patterns) {
$this->excludedPattern = '#(?:^|/)(?:'.implode('|', $patterns).')(?:/|$)#';
}

parent::__construct($iterator);
}




public function accept(): bool
{
if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) {
return false;
}

if ($this->excludedPattern) {
$path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath();
$path = str_replace('\\', '/', $path);

return !preg_match($this->excludedPattern, $path);
}

if ($this->pruneFilters && $this->hasChildren()) {
foreach ($this->pruneFilters as $pruneFilter) {
if (!$pruneFilter($this->current())) {
return false;
}
}
}

return true;
}

public function hasChildren(): bool
{
return $this->isRecursive && $this->iterator->hasChildren();
}

public function getChildren(): self
{
$children = new self($this->iterator->getChildren(), []);
$children->excludedDirs = $this->excludedDirs;
$children->excludedPattern = $this->excludedPattern;

return $children;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\SplFileInfo;

/**
@extends





*/
class PathFilterIterator extends MultiplePcreFilterIterator
{



public function accept(): bool
{
$filename = $this->current()->getRelativePathname();

if ('\\' === \DIRECTORY_SEPARATOR) {
$filename = str_replace('\\', '/', $filename);
}

return $this->isAccepted($filename);
}













protected function toRegex(string $str): string
{
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

/**
@extends




*/
class FileTypeFilterIterator extends \FilterIterator
{
public const ONLY_FILES = 1;
public const ONLY_DIRECTORIES = 2;

private int $mode;





public function __construct(\Iterator $iterator, int $mode)
{
$this->mode = $mode;

parent::__construct($iterator);
}




public function accept(): bool
{
$fileinfo = $this->current();
if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) {
return false;
} elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) {
return false;
}

return true;
}
}
<?php










namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Comparator\NumberComparator;

/**
@extends




*/
class SizeRangeFilterIterator extends \FilterIterator
{
private array $comparators = [];





public function __construct(\Iterator $iterator, array $comparators)
{
$this->comparators = $comparators;

parent::__construct($iterator);
}




public function accept(): bool
{
$fileinfo = $this->current();
if (!$fileinfo->isFile()) {
return true;
}

$filesize = $fileinfo->getSize();
foreach ($this->comparators as $compare) {
if (!$compare->test($filesize)) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\Finder;

use Symfony\Component\Finder\Comparator\DateComparator;
use Symfony\Component\Finder\Comparator\NumberComparator;
use Symfony\Component\Finder\Exception\DirectoryNotFoundException;
use Symfony\Component\Finder\Iterator\CustomFilterIterator;
use Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
use Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
use Symfony\Component\Finder\Iterator\FilenameFilterIterator;
use Symfony\Component\Finder\Iterator\LazyIterator;
use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
use Symfony\Component\Finder\Iterator\SortableIterator;

/**
@implements












*/
class Finder implements \IteratorAggregate, \Countable
{
public const IGNORE_VCS_FILES = 1;
public const IGNORE_DOT_FILES = 2;
public const IGNORE_VCS_IGNORED_FILES = 4;

private int $mode = 0;
private array $names = [];
private array $notNames = [];
private array $exclude = [];
private array $filters = [];
private array $pruneFilters = [];
private array $depths = [];
private array $sizes = [];
private bool $followLinks = false;
private bool $reverseSorting = false;
private \Closure|int|false $sort = false;
private int $ignore = 0;
private array $dirs = [];
private array $dates = [];
private array $iterators = [];
private array $contains = [];
private array $notContains = [];
private array $paths = [];
private array $notPaths = [];
private bool $ignoreUnreadableDirs = false;

private static array $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg'];

public function __construct()
{
$this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
}




public static function create(): static
{
return new static();
}






public function directories(): static
{
$this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;

return $this;
}






public function files(): static
{
$this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;

return $this;
}

















public function depth(string|int|array $levels): static
{
foreach ((array) $levels as $level) {
$this->depths[] = new NumberComparator($level);
}

return $this;
}




















public function date(string|array $dates): static
{
foreach ((array) $dates as $date) {
$this->dates[] = new DateComparator($date);
}

return $this;
}

















public function name(string|array $patterns): static
{
$this->names = array_merge($this->names, (array) $patterns);

return $this;
}










public function notName(string|array $patterns): static
{
$this->notNames = array_merge($this->notNames, (array) $patterns);

return $this;
}
















public function contains(string|array $patterns): static
{
$this->contains = array_merge($this->contains, (array) $patterns);

return $this;
}
















public function notContains(string|array $patterns): static
{
$this->notContains = array_merge($this->notContains, (array) $patterns);

return $this;
}


















public function path(string|array $patterns): static
{
$this->paths = array_merge($this->paths, (array) $patterns);

return $this;
}


















public function notPath(string|array $patterns): static
{
$this->notPaths = array_merge($this->notPaths, (array) $patterns);

return $this;
}
















public function size(string|int|array $sizes): static
{
foreach ((array) $sizes as $size) {
$this->sizes[] = new NumberComparator($size);
}

return $this;
}














public function exclude(string|array $dirs): static
{
$this->exclude = array_merge($this->exclude, (array) $dirs);

return $this;
}










public function ignoreDotFiles(bool $ignoreDotFiles): static
{
if ($ignoreDotFiles) {
$this->ignore |= static::IGNORE_DOT_FILES;
} else {
$this->ignore &= ~static::IGNORE_DOT_FILES;
}

return $this;
}










public function ignoreVCS(bool $ignoreVCS): static
{
if ($ignoreVCS) {
$this->ignore |= static::IGNORE_VCS_FILES;
} else {
$this->ignore &= ~static::IGNORE_VCS_FILES;
}

return $this;
}








public function ignoreVCSIgnored(bool $ignoreVCSIgnored): static
{
if ($ignoreVCSIgnored) {
$this->ignore |= static::IGNORE_VCS_IGNORED_FILES;
} else {
$this->ignore &= ~static::IGNORE_VCS_IGNORED_FILES;
}

return $this;
}










public static function addVCSPattern(string|array $pattern)
{
foreach ((array) $pattern as $p) {
self::$vcsPatterns[] = $p;
}

self::$vcsPatterns = array_unique(self::$vcsPatterns);
}












public function sort(\Closure $closure): static
{
$this->sort = $closure;

return $this;
}










public function sortByExtension(): static
{
$this->sort = SortableIterator::SORT_BY_EXTENSION;

return $this;
}










public function sortByName(bool $useNaturalSort = false): static
{
$this->sort = $useNaturalSort ? SortableIterator::SORT_BY_NAME_NATURAL : SortableIterator::SORT_BY_NAME;

return $this;
}










public function sortByCaseInsensitiveName(bool $useNaturalSort = false): static
{
$this->sort = $useNaturalSort ? SortableIterator::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE : SortableIterator::SORT_BY_NAME_CASE_INSENSITIVE;

return $this;
}










public function sortBySize(): static
{
$this->sort = SortableIterator::SORT_BY_SIZE;

return $this;
}










public function sortByType(): static
{
$this->sort = SortableIterator::SORT_BY_TYPE;

return $this;
}












public function sortByAccessedTime(): static
{
$this->sort = SortableIterator::SORT_BY_ACCESSED_TIME;

return $this;
}






public function reverseSorting(): static
{
$this->reverseSorting = true;

return $this;
}














public function sortByChangedTime(): static
{
$this->sort = SortableIterator::SORT_BY_CHANGED_TIME;

return $this;
}












public function sortByModifiedTime(): static
{
$this->sort = SortableIterator::SORT_BY_MODIFIED_TIME;

return $this;
}














public function filter(\Closure $closure ): static
{
$prune = 1 < \func_num_args() ? func_get_arg(1) : false;
$this->filters[] = $closure;

if ($prune) {
$this->pruneFilters[] = $closure;
}

return $this;
}






public function followLinks(): static
{
$this->followLinks = true;

return $this;
}








public function ignoreUnreadableDirs(bool $ignore = true): static
{
$this->ignoreUnreadableDirs = $ignore;

return $this;
}










public function in(string|array $dirs): static
{
$resolvedDirs = [];

foreach ((array) $dirs as $dir) {
if (is_dir($dir)) {
$resolvedDirs[] = [$this->normalizeDir($dir)];
} elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) {
sort($glob);
$resolvedDirs[] = array_map($this->normalizeDir(...), $glob);
} else {
throw new DirectoryNotFoundException(\sprintf('The "%s" directory does not exist.', $dir));
}
}

$this->dirs = array_merge($this->dirs, ...$resolvedDirs);

return $this;
}










public function getIterator(): \Iterator
{
if (0 === \count($this->dirs) && 0 === \count($this->iterators)) {
throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
}

if (1 === \count($this->dirs) && 0 === \count($this->iterators)) {
$iterator = $this->searchInDirectory($this->dirs[0]);

if ($this->sort || $this->reverseSorting) {
$iterator = (new SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
}

return $iterator;
}

$iterator = new \AppendIterator();
foreach ($this->dirs as $dir) {
$iterator->append(new \IteratorIterator(new LazyIterator(fn () => $this->searchInDirectory($dir))));
}

foreach ($this->iterators as $it) {
$iterator->append($it);
}

if ($this->sort || $this->reverseSorting) {
$iterator = (new SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator();
}

return $iterator;
}










public function append(iterable $iterator): static
{
if ($iterator instanceof \IteratorAggregate) {
$this->iterators[] = $iterator->getIterator();
} elseif ($iterator instanceof \Iterator) {
$this->iterators[] = $iterator;
} elseif (is_iterable($iterator)) {
$it = new \ArrayIterator();
foreach ($iterator as $file) {
$file = $file instanceof \SplFileInfo ? $file : new \SplFileInfo($file);
$it[$file->getPathname()] = $file;
}
$this->iterators[] = $it;
} else {
throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
}

return $this;
}




public function hasResults(): bool
{
foreach ($this->getIterator() as $_) {
return true;
}

return false;
}




public function count(): int
{
return iterator_count($this->getIterator());
}

private function searchInDirectory(string $dir): \Iterator
{
$exclude = $this->exclude;
$notPaths = $this->notPaths;

if ($this->pruneFilters) {
$exclude = array_merge($exclude, $this->pruneFilters);
}

if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
$exclude = array_merge($exclude, self::$vcsPatterns);
}

if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
$notPaths[] = '#(^|/)\..+(/|$)#';
}

$minDepth = 0;
$maxDepth = \PHP_INT_MAX;

foreach ($this->depths as $comparator) {
switch ($comparator->getOperator()) {
case '>':
$minDepth = $comparator->getTarget() + 1;
break;
case '>=':
$minDepth = $comparator->getTarget();
break;
case '<':
$maxDepth = $comparator->getTarget() - 1;
break;
case '<=':
$maxDepth = $comparator->getTarget();
break;
default:
$minDepth = $maxDepth = $comparator->getTarget();
}
}

$flags = \RecursiveDirectoryIterator::SKIP_DOTS;

if ($this->followLinks) {
$flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
}

$iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);

if ($exclude) {
$iterator = new ExcludeDirectoryFilterIterator($iterator, $exclude);
}

$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);

if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) {
$iterator = new DepthRangeFilterIterator($iterator, $minDepth, $maxDepth);
}

if ($this->mode) {
$iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
}

if ($this->names || $this->notNames) {
$iterator = new FilenameFilterIterator($iterator, $this->names, $this->notNames);
}

if ($this->contains || $this->notContains) {
$iterator = new FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
}

if ($this->sizes) {
$iterator = new SizeRangeFilterIterator($iterator, $this->sizes);
}

if ($this->dates) {
$iterator = new DateRangeFilterIterator($iterator, $this->dates);
}

if ($this->filters) {
$iterator = new CustomFilterIterator($iterator, $this->filters);
}

if ($this->paths || $notPaths) {
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $notPaths);
}

if (static::IGNORE_VCS_IGNORED_FILES === (static::IGNORE_VCS_IGNORED_FILES & $this->ignore)) {
$iterator = new Iterator\VcsIgnoredFilterIterator($iterator, $dir);
}

return $iterator;
}






private function normalizeDir(string $dir): string
{
if ('/' === $dir) {
return $dir;
}

$dir = rtrim($dir, '/'.\DIRECTORY_SEPARATOR);

if (preg_match('#^(ssh2\.)?s?ftp://#', $dir)) {
$dir .= '/';
}

return $dir;
}
}
<?php










namespace Symfony\Component\Finder;







class Gitignore
{





public static function toRegex(string $gitignoreFileContent): string
{
return self::buildRegex($gitignoreFileContent, false);
}

public static function toRegexMatchingNegatedPatterns(string $gitignoreFileContent): string
{
return self::buildRegex($gitignoreFileContent, true);
}

private static function buildRegex(string $gitignoreFileContent, bool $inverted): string
{
$gitignoreFileContent = preg_replace('~(?<!\\\\)#[^\n\r]*~', '', $gitignoreFileContent);
$gitignoreLines = preg_split('~\r\n?|\n~', $gitignoreFileContent);

$res = self::lineToRegex('');
foreach ($gitignoreLines as $line) {
$line = preg_replace('~(?<!\\\\)[ \t]+$~', '', $line);

if (str_starts_with($line, '!')) {
$line = substr($line, 1);
$isNegative = true;
} else {
$isNegative = false;
}

if ('' !== $line) {
if ($isNegative xor $inverted) {
$res = '(?!'.self::lineToRegex($line).'$)'.$res;
} else {
$res = '(?:'.$res.'|'.self::lineToRegex($line).')';
}
}
}

return '~^(?:'.$res.')~s';
}

private static function lineToRegex(string $gitignoreLine): string
{
if ('' === $gitignoreLine) {
return '$f'; 
}

$slashPos = strpos($gitignoreLine, '/');
if (false !== $slashPos && \strlen($gitignoreLine) - 1 !== $slashPos) {
if (0 === $slashPos) {
$gitignoreLine = substr($gitignoreLine, 1);
}
$isAbsolute = true;
} else {
$isAbsolute = false;
}

$regex = preg_quote(str_replace('\\', '', $gitignoreLine), '~');
$regex = preg_replace_callback('~\\\\\[((?:\\\\!)?)([^\[\]]*)\\\\\]~', fn (array $matches): string => '['.('' !== $matches[1] ? '^' : '').str_replace('\\-', '-', $matches[2]).']', $regex);
$regex = preg_replace('~(?:(?:\\\\\*){2,}(/?))+~', '(?:(?:(?!//).(?<!//))+$1)?', $regex);
$regex = preg_replace('~\\\\\*~', '[^/]*', $regex);
$regex = preg_replace('~\\\\\?~', '[^/]', $regex);

return ($isAbsolute ? '' : '(?:[^/]+/)*')
.$regex
.(!str_ends_with($gitignoreLine, '/') ? '(?:$|/)' : '');
}
}
<?php










namespace Symfony\Component\Finder;























class Glob
{



public static function toRegex(string $glob, bool $strictLeadingDot = true, bool $strictWildcardSlash = true, string $delimiter = '#'): string
{
$firstByte = true;
$escaping = false;
$inCurlies = 0;
$regex = '';
$sizeGlob = \strlen($glob);
for ($i = 0; $i < $sizeGlob; ++$i) {
$car = $glob[$i];
if ($firstByte && $strictLeadingDot && '.' !== $car) {
$regex .= '(?=[^\.])';
}

$firstByte = '/' === $car;

if ($firstByte && $strictWildcardSlash && isset($glob[$i + 2]) && '**' === $glob[$i + 1].$glob[$i + 2] && (!isset($glob[$i + 3]) || '/' === $glob[$i + 3])) {
$car = '[^/]++/';
if (!isset($glob[$i + 3])) {
$car .= '?';
}

if ($strictLeadingDot) {
$car = '(?=[^\.])'.$car;
}

$car = '/(?:'.$car.')*';
$i += 2 + isset($glob[$i + 3]);

if ('/' === $delimiter) {
$car = str_replace('/', '\\/', $car);
}
}

if ($delimiter === $car || '.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
$regex .= "\\$car";
} elseif ('*' === $car) {
$regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
} elseif ('?' === $car) {
$regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
} elseif ('{' === $car) {
$regex .= $escaping ? '\\{' : '(';
if (!$escaping) {
++$inCurlies;
}
} elseif ('}' === $car && $inCurlies) {
$regex .= $escaping ? '}' : ')';
if (!$escaping) {
--$inCurlies;
}
} elseif (',' === $car && $inCurlies) {
$regex .= $escaping ? ',' : '|';
} elseif ('\\' === $car) {
if ($escaping) {
$regex .= '\\\\';
$escaping = false;
} else {
$escaping = true;
}

continue;
} else {
$regex .= $car;
}
$escaping = false;
}

return $delimiter.'^'.$regex.'$'.$delimiter;
}
}
<?php










namespace Symfony\Component\Finder;






class SplFileInfo extends \SplFileInfo
{
private string $relativePath;
private string $relativePathname;






public function __construct(string $file, string $relativePath, string $relativePathname)
{
parent::__construct($file);
$this->relativePath = $relativePath;
$this->relativePathname = $relativePathname;
}






public function getRelativePath(): string
{
return $this->relativePath;
}






public function getRelativePathname(): string
{
return $this->relativePathname;
}

public function getFilenameWithoutExtension(): string
{
$filename = $this->getFilename();

return pathinfo($filename, \PATHINFO_FILENAME);
}






public function getContents(): string
{
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
try {
$content = file_get_contents($this->getPathname());
} finally {
restore_error_handler();
}
if (false === $content) {
throw new \RuntimeException($error);
}

return $content;
}
}
<?php










namespace Symfony\Component\Finder\Exception;




class DirectoryNotFoundException extends \InvalidArgumentException
{
}
<?php










namespace Symfony\Component\Finder\Exception;




class AccessDeniedException extends \UnexpectedValueException
{
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Container;







class ContainerControllerResolver extends ControllerResolver
{
protected $container;

public function __construct(ContainerInterface $container, ?LoggerInterface $logger = null)
{
$this->container = $container;

parent::__construct($logger);
}

protected function instantiateController(string $class): object
{
$class = ltrim($class, '\\');

if ($this->container->has($class)) {
return $this->container->get($class);
}

try {
return parent::instantiateController($class);
} catch (\Error $e) {
}

$this->throwExceptionIfControllerWasRemoved($class, $e);

if ($e instanceof \ArgumentCountError) {
throw new \InvalidArgumentException(\sprintf('Controller "%s" has required constructor arguments and does not exist in the container. Did you forget to define the controller as a service?', $class), 0, $e);
}

throw new \InvalidArgumentException(\sprintf('Controller "%s" does neither exist as service nor as class.', $class), 0, $e);
}

private function throwExceptionIfControllerWasRemoved(string $controller, \Throwable $previous): void
{
if ($this->container instanceof Container && isset($this->container->getRemovedIds()[$controller])) {
throw new \InvalidArgumentException(\sprintf('Controller "%s" cannot be fetched from the container because it is private. Did you forget to tag the service with "controller.service_arguments"?', $controller), 0, $previous);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;







interface ArgumentResolverInterface
{







public function getArguments(Request $request, callable $controller): array;
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\ValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface;
use Symfony\Component\HttpKernel\Exception\ResolverNotFoundException;
use Symfony\Contracts\Service\ServiceProviderInterface;






final class ArgumentResolver implements ArgumentResolverInterface
{
private ArgumentMetadataFactoryInterface $argumentMetadataFactory;
private iterable $argumentValueResolvers;
private ?ContainerInterface $namedResolvers;




public function __construct(?ArgumentMetadataFactoryInterface $argumentMetadataFactory = null, iterable $argumentValueResolvers = [], ?ContainerInterface $namedResolvers = null)
{
$this->argumentMetadataFactory = $argumentMetadataFactory ?? new ArgumentMetadataFactory();
$this->argumentValueResolvers = $argumentValueResolvers ?: self::getDefaultArgumentValueResolvers();
$this->namedResolvers = $namedResolvers;
}

public function getArguments(Request $request, callable $controller, ?\ReflectionFunctionAbstract $reflector = null): array
{
$arguments = [];

foreach ($this->argumentMetadataFactory->createArgumentMetadata($controller, $reflector) as $metadata) {
$argumentValueResolvers = $this->argumentValueResolvers;
$disabledResolvers = [];

if ($this->namedResolvers && $attributes = $metadata->getAttributesOfType(ValueResolver::class, $metadata::IS_INSTANCEOF)) {
$resolverName = null;
foreach ($attributes as $attribute) {
if ($attribute->disabled) {
$disabledResolvers[$attribute->resolver] = true;
} elseif ($resolverName) {
throw new \LogicException(\sprintf('You can only pin one resolver per argument, but argument "$%s" of "%s()" has more.', $metadata->getName(), $this->getPrettyName($controller)));
} else {
$resolverName = $attribute->resolver;
}
}

if ($resolverName) {
if (!$this->namedResolvers->has($resolverName)) {
throw new ResolverNotFoundException($resolverName, $this->namedResolvers instanceof ServiceProviderInterface ? array_keys($this->namedResolvers->getProvidedServices()) : []);
}

$argumentValueResolvers = [
$this->namedResolvers->get($resolverName),
new RequestAttributeValueResolver(),
new DefaultValueResolver(),
];
}
}

foreach ($argumentValueResolvers as $name => $resolver) {
if ((!$resolver instanceof ValueResolverInterface || $resolver instanceof TraceableValueResolver) && !$resolver->supports($request, $metadata)) {
continue;
}
if (isset($disabledResolvers[\is_int($name) ? $resolver::class : $name])) {
continue;
}

$count = 0;
foreach ($resolver->resolve($request, $metadata) as $argument) {
++$count;
$arguments[] = $argument;
}

if (1 < $count && !$metadata->isVariadic()) {
throw new \InvalidArgumentException(\sprintf('"%s::resolve()" must yield at most one value for non-variadic arguments.', get_debug_type($resolver)));
}

if ($count) {

continue 2;
}

if (!$resolver instanceof ValueResolverInterface) {
throw new \InvalidArgumentException(\sprintf('"%s::resolve()" must yield at least one value.', get_debug_type($resolver)));
}
}

throw new \RuntimeException(\sprintf('Controller "%s" requires that you provide a value for the "$%s" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or there is a non-optional argument after this one.', $this->getPrettyName($controller), $metadata->getName()));
}

return $arguments;
}




public static function getDefaultArgumentValueResolvers(): iterable
{
return [
new RequestAttributeValueResolver(),
new RequestValueResolver(),
new SessionValueResolver(),
new DefaultValueResolver(),
new VariadicValueResolver(),
];
}

private function getPrettyName($controller): string
{
if (\is_array($controller)) {
if (\is_object($controller[0])) {
$controller[0] = get_debug_type($controller[0]);
}

return $controller[0].'::'.$controller[1];
}

if (\is_object($controller)) {
return get_debug_type($controller);
}

return $controller;
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Stopwatch\Stopwatch;




class TraceableControllerResolver implements ControllerResolverInterface
{
private ControllerResolverInterface $resolver;
private Stopwatch $stopwatch;

public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch)
{
$this->resolver = $resolver;
$this->stopwatch = $stopwatch;
}

public function getController(Request $request): callable|false
{
$e = $this->stopwatch->start('controller.get_callable');

try {
return $this->resolver->getController($request);
} finally {
$e->stop();
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;








interface ArgumentValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool;




public function resolve(Request $request, ArgumentMetadata $argument): iterable;
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\AsController;








class ControllerResolver implements ControllerResolverInterface
{
private ?LoggerInterface $logger;
private array $allowedControllerTypes = [];
private array $allowedControllerAttributes = [AsController::class => AsController::class];

public function __construct(?LoggerInterface $logger = null)
{
$this->logger = $logger;
}





public function allowControllers(array $types = [], array $attributes = []): void
{
foreach ($types as $type) {
$this->allowedControllerTypes[$type] = $type;
}

foreach ($attributes as $attribute) {
$this->allowedControllerAttributes[$attribute] = $attribute;
}
}




public function getController(Request $request): callable|false
{
if (!$controller = $request->attributes->get('_controller')) {
$this->logger?->warning('Unable to look for the controller as the "_controller" parameter is missing.');

return false;
}

if (\is_array($controller)) {
if (isset($controller[0]) && \is_string($controller[0]) && isset($controller[1])) {
try {
$controller[0] = $this->instantiateController($controller[0]);
} catch (\Error|\LogicException $e) {
if (\is_callable($controller)) {
return $this->checkController($request, $controller);
}

throw $e;
}
}

if (!\is_callable($controller)) {
throw new \InvalidArgumentException(\sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($controller));
}

return $this->checkController($request, $controller);
}

if (\is_object($controller)) {
if (!\is_callable($controller)) {
throw new \InvalidArgumentException(\sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($controller));
}

return $this->checkController($request, $controller);
}

if (\function_exists($controller)) {
return $this->checkController($request, $controller);
}

try {
$callable = $this->createController($controller);
} catch (\InvalidArgumentException $e) {
throw new \InvalidArgumentException(\sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$e->getMessage(), 0, $e);
}

if (!\is_callable($callable)) {
throw new \InvalidArgumentException(\sprintf('The controller for URI "%s" is not callable: ', $request->getPathInfo()).$this->getControllerError($callable));
}

return $this->checkController($request, $callable);
}






protected function createController(string $controller): callable
{
if (!str_contains($controller, '::')) {
$controller = $this->instantiateController($controller);

if (!\is_callable($controller)) {
throw new \InvalidArgumentException($this->getControllerError($controller));
}

return $controller;
}

[$class, $method] = explode('::', $controller, 2);

try {
$controller = [$this->instantiateController($class), $method];
} catch (\Error|\LogicException $e) {
try {
if ((new \ReflectionMethod($class, $method))->isStatic()) {
return $class.'::'.$method;
}
} catch (\ReflectionException) {
throw $e;
}

throw $e;
}

if (!\is_callable($controller)) {
throw new \InvalidArgumentException($this->getControllerError($controller));
}

return $controller;
}




protected function instantiateController(string $class): object
{
return new $class();
}

private function getControllerError(mixed $callable): string
{
if (\is_string($callable)) {
if (str_contains($callable, '::')) {
$callable = explode('::', $callable, 2);
} else {
return \sprintf('Function "%s" does not exist.', $callable);
}
}

if (\is_object($callable)) {
$availableMethods = $this->getClassMethodsWithoutMagicMethods($callable);
$alternativeMsg = $availableMethods ? \sprintf(' or use one of the available methods: "%s"', implode('", "', $availableMethods)) : '';

return \sprintf('Controller class "%s" cannot be called without a method name. You need to implement "__invoke"%s.', get_debug_type($callable), $alternativeMsg);
}

if (!\is_array($callable)) {
return \sprintf('Invalid type for controller given, expected string, array or object, got "%s".', get_debug_type($callable));
}

if (!isset($callable[0]) || !isset($callable[1]) || 2 !== \count($callable)) {
return 'Invalid array callable, expected [controller, method].';
}

[$controller, $method] = $callable;

if (\is_string($controller) && !class_exists($controller)) {
return \sprintf('Class "%s" does not exist.', $controller);
}

$className = \is_object($controller) ? get_debug_type($controller) : $controller;

if (method_exists($controller, $method)) {
return \sprintf('Method "%s" on class "%s" should be public and non-abstract.', $method, $className);
}

$collection = $this->getClassMethodsWithoutMagicMethods($controller);

$alternatives = [];

foreach ($collection as $item) {
$lev = levenshtein($method, $item);

if ($lev <= \strlen($method) / 3 || str_contains($item, $method)) {
$alternatives[] = $item;
}
}

asort($alternatives);

$message = \sprintf('Expected method "%s" on class "%s"', $method, $className);

if (\count($alternatives) > 0) {
$message .= \sprintf(', did you mean "%s"?', implode('", "', $alternatives));
} else {
$message .= \sprintf('. Available methods: "%s".', implode('", "', $collection));
}

return $message;
}

private function getClassMethodsWithoutMagicMethods($classOrObject): array
{
$methods = get_class_methods($classOrObject);

return array_filter($methods, fn (string $method) => 0 !== strncmp($method, '__', 2));
}

private function checkController(Request $request, callable $controller): callable
{
if (!$request->attributes->get('_check_controller_is_allowed', false)) {
return $controller;
}

$r = null;

if (\is_array($controller)) {
[$class, $name] = $controller;
$name = (\is_string($class) ? $class : $class::class).'::'.$name;
} elseif (\is_object($controller) && !$controller instanceof \Closure) {
$class = $controller;
$name = $class::class.'::__invoke';
} else {
$r = new \ReflectionFunction($controller);
$name = $r->name;

if (str_contains($name, '{closure')) {
$name = $class = \Closure::class;
} elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
$class = $class->name;
$name = $class.'::'.$name;
}
}

if ($class) {
foreach ($this->allowedControllerTypes as $type) {
if (is_a($class, $type, true)) {
return $controller;
}
}
}

$r ??= new \ReflectionClass($class);

foreach ($r->getAttributes() as $attribute) {
if (isset($this->allowedControllerAttributes[$attribute->getName()])) {
return $controller;
}
}

if (str_contains($name, '@anonymous')) {
$name = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $name);
}

if (-1 === $request->attributes->get('_check_controller_is_allowed')) {
trigger_deprecation('symfony/http-kernel', '6.4', 'Callable "%s()" is not allowed as a controller. Did you miss tagging it with "#[AsController]" or registering its type with "%s::allowControllers()"?', $name, self::class);

return $controller;
}

throw new BadRequestException(\sprintf('Callable "%s()" is not allowed as a controller. Did you miss tagging it with "#[AsController]" or registering its type with "%s::allowControllers()"?', $name, self::class));
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\HttpKernelInterface;







class ErrorController
{
private HttpKernelInterface $kernel;
private string|object|array|null $controller;
private ErrorRendererInterface $errorRenderer;

public function __construct(HttpKernelInterface $kernel, string|object|array|null $controller, ErrorRendererInterface $errorRenderer)
{
$this->kernel = $kernel;
$this->controller = $controller;
$this->errorRenderer = $errorRenderer;
}

public function __invoke(\Throwable $exception): Response
{
$exception = $this->errorRenderer->render($exception);

return new Response($exception->getAsString(), $exception->getStatusCode(), $exception->getHeaders());
}

public function preview(Request $request, int $code): Response
{





$subRequest = $request->duplicate(null, null, [
'_controller' => $this->controller,
'exception' => new HttpException($code, 'This is a sample exception.'),
'logger' => null,
'showException' => false,
]);

return $this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;












class ControllerReference
{
public $controller;
public $attributes = [];
public $query = [];






public function __construct(string $controller, array $attributes = [], array $query = [])
{
$this->controller = $controller;
$this->attributes = $attributes;
$this->query = $query;
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






interface ValueResolverInterface
{



public function resolve(Request $request, ArgumentMetadata $argument): iterable;
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\MapQueryString;
use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Serializer\Exception\NotEncodableValueException;
use Symfony\Component\Serializer\Exception\PartialDenormalizationException;
use Symfony\Component\Serializer\Exception\UnsupportedFormatException;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;






class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscriberInterface
{



private const CONTEXT_DENORMALIZE = [
'collect_denormalization_errors' => true,
];




private const CONTEXT_DESERIALIZE = [
'collect_denormalization_errors' => true,
];

public function __construct(
private readonly SerializerInterface&DenormalizerInterface $serializer,
private readonly ?ValidatorInterface $validator = null,
private readonly ?TranslatorInterface $translator = null,
) {
}

public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
$attribute = $argument->getAttributesOfType(MapQueryString::class, ArgumentMetadata::IS_INSTANCEOF)[0]
?? $argument->getAttributesOfType(MapRequestPayload::class, ArgumentMetadata::IS_INSTANCEOF)[0]
?? null;

if (!$attribute) {
return [];
}

if ($argument->isVariadic()) {
throw new \LogicException(\sprintf('Mapping variadic argument "$%s" is not supported.', $argument->getName()));
}

$attribute->metadata = $argument;

return [$attribute];
}

public function onKernelControllerArguments(ControllerArgumentsEvent $event): void
{
$arguments = $event->getArguments();

foreach ($arguments as $i => $argument) {
if ($argument instanceof MapQueryString) {
$payloadMapper = 'mapQueryString';
$validationFailedCode = $argument->validationFailedStatusCode;
} elseif ($argument instanceof MapRequestPayload) {
$payloadMapper = 'mapRequestPayload';
$validationFailedCode = $argument->validationFailedStatusCode;
} else {
continue;
}
$request = $event->getRequest();

if (!$type = $argument->metadata->getType()) {
throw new \LogicException(\sprintf('Could not resolve the "$%s" controller argument: argument should be typed.', $argument->metadata->getName()));
}

if ($this->validator) {
$violations = new ConstraintViolationList();
try {
$payload = $this->$payloadMapper($request, $type, $argument);
} catch (PartialDenormalizationException $e) {
$trans = $this->translator ? $this->translator->trans(...) : fn ($m, $p) => strtr($m, $p);
foreach ($e->getErrors() as $error) {
$parameters = [];
$template = 'This value was of an unexpected type.';
if ($expectedTypes = $error->getExpectedTypes()) {
$template = 'This value should be of type {{ type }}.';
$parameters['{{ type }}'] = implode('|', $expectedTypes);
}
if ($error->canUseMessageForUser()) {
$parameters['hint'] = $error->getMessage();
}
$message = $trans($template, $parameters, 'validators');
$violations->add(new ConstraintViolation($message, $template, $parameters, null, $error->getPath(), null));
}
$payload = $e->getData();
}

if (null !== $payload && !\count($violations)) {
$violations->addAll($this->validator->validate($payload, null, $argument->validationGroups ?? null));
}

if (\count($violations)) {
throw new HttpException($validationFailedCode, implode("\n", array_map(static fn ($e) => $e->getMessage(), iterator_to_array($violations))), new ValidationFailedException($payload, $violations));
}
} else {
try {
$payload = $this->$payloadMapper($request, $type, $argument);
} catch (PartialDenormalizationException $e) {
throw new HttpException($validationFailedCode, implode("\n", array_map(static fn ($e) => $e->getMessage(), $e->getErrors())), $e);
}
}

if (null === $payload) {
$payload = match (true) {
$argument->metadata->hasDefaultValue() => $argument->metadata->getDefaultValue(),
$argument->metadata->isNullable() => null,
default => throw new HttpException($validationFailedCode),
};
}

$arguments[$i] = $payload;
}

$event->setArguments($arguments);
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER_ARGUMENTS => 'onKernelControllerArguments',
];
}

private function mapQueryString(Request $request, string $type, MapQueryString $attribute): ?object
{
if (!$data = $request->query->all()) {
return null;
}

return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE);
}

private function mapRequestPayload(Request $request, string $type, MapRequestPayload $attribute): ?object
{
if (null === $format = $request->getContentTypeFormat()) {
throw new HttpException(Response::HTTP_UNSUPPORTED_MEDIA_TYPE, 'Unsupported format.');
}

if ($attribute->acceptFormat && !\in_array($format, (array) $attribute->acceptFormat, true)) {
throw new HttpException(Response::HTTP_UNSUPPORTED_MEDIA_TYPE, \sprintf('Unsupported format, expects "%s", but "%s" given.', implode('", "', (array) $attribute->acceptFormat), $format));
}

if ($data = $request->request->all()) {
return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE);
}

if ('' === $data = $request->getContent()) {
return null;
}

if ('form' === $format) {
throw new HttpException(Response::HTTP_BAD_REQUEST, 'Request payload contains invalid "form" data.');
}

try {
return $this->serializer->deserialize($data, $type, $format, self::CONTEXT_DESERIALIZE + $attribute->serializationContext);
} catch (UnsupportedFormatException $e) {
throw new HttpException(Response::HTTP_UNSUPPORTED_MEDIA_TYPE, \sprintf('Unsupported format: "%s".', $format), $e);
} catch (NotEncodableValueException $e) {
throw new HttpException(Response::HTTP_BAD_REQUEST, \sprintf('Request payload contains invalid "%s" data.', $format), $e);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class ServiceValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{
private ContainerInterface $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}




public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

$controller = $request->attributes->get('_controller');

if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) {
$controller = $controller[0].'::'.$controller[1];
} elseif (!\is_string($controller) || '' === $controller) {
return false;
}

if ('\\' === $controller[0]) {
$controller = ltrim($controller, '\\');
}

if (!$this->container->has($controller) && false !== $i = strrpos($controller, ':')) {
$controller = substr($controller, 0, $i).strtolower(substr($controller, $i));
}

return $this->container->has($controller) && $this->container->get($controller)->has($argument->getName());
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
$controller = $request->attributes->get('_controller');

if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) {
$controller = $controller[0].'::'.$controller[1];
} elseif (!\is_string($controller) || '' === $controller) {
return [];
}

if ('\\' === $controller[0]) {
$controller = ltrim($controller, '\\');
}

if (!$this->container->has($controller) && false !== $i = strrpos($controller, ':')) {
$controller = substr($controller, 0, $i).strtolower(substr($controller, $i));
}

if (!$this->container->has($controller) || !$this->container->get($controller)->has($argument->getName())) {
return [];
}

try {
return [$this->container->get($controller)->get($argument->getName())];
} catch (RuntimeException $e) {
$what = \sprintf('argument $%s of "%s()"', $argument->getName(), $controller);
$message = preg_replace('/service "\.service_locator\.[^"]++"/', $what, $e->getMessage());

if ($e->getMessage() === $message) {
$message = \sprintf('Cannot resolve %s: %s', $what, $message);
}

$r = new \ReflectionProperty($e, 'message');
$r->setValue($e, $message);

throw $e;
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class SessionValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

if (!$request->hasSession()) {
return false;
}

$type = $argument->getType();
if (SessionInterface::class !== $type && !is_subclass_of($type, SessionInterface::class)) {
return false;
}

return $request->getSession() instanceof $type;
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
if (!$request->hasSession()) {
return [];
}

$type = $argument->getType();
if (SessionInterface::class !== $type && !is_subclass_of($type, SessionInterface::class)) {
return [];
}

return $request->getSession() instanceof $type ? [$request->getSession()] : [];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class NotTaggedControllerValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{
private ContainerInterface $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}




public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

$controller = $request->attributes->get('_controller');

if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) {
$controller = $controller[0].'::'.$controller[1];
} elseif (!\is_string($controller) || '' === $controller) {
return false;
}

if ('\\' === $controller[0]) {
$controller = ltrim($controller, '\\');
}

if (!$this->container->has($controller) && false !== $i = strrpos($controller, ':')) {
$controller = substr($controller, 0, $i).strtolower(substr($controller, $i));
}

return false === $this->container->has($controller);
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
$controller = $request->attributes->get('_controller');

if (\is_array($controller) && \is_callable($controller, true) && \is_string($controller[0])) {
$controller = $controller[0].'::'.$controller[1];
} elseif (!\is_string($controller) || '' === $controller) {
return [];
}

if ('\\' === $controller[0]) {
$controller = ltrim($controller, '\\');
}

if (!$this->container->has($controller)) {
$controller = (false !== $i = strrpos($controller, ':'))
? substr($controller, 0, $i).strtolower(substr($controller, $i))
: $controller.'::__invoke';
}

if ($this->container->has($controller)) {
return [];
}

$what = \sprintf('argument $%s of "%s()"', $argument->getName(), $controller);
$message = \sprintf('Could not resolve %s, maybe you forgot to register the controller as a service or missed tagging it with the "controller.service_arguments"?', $what);

throw new RuntimeException($message);
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;









class BackedEnumValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

if (!is_subclass_of($argument->getType(), \BackedEnum::class)) {
return false;
}

if ($argument->isVariadic()) {

return false;
}




return $request->attributes->has($argument->getName());
}

public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
if (!is_subclass_of($argument->getType(), \BackedEnum::class)) {
return [];
}

if ($argument->isVariadic()) {

return [];
}




if (!$request->attributes->has($argument->getName())) {
return [];
}

$value = $request->attributes->get($argument->getName());

if (null === $value) {
return [null];
}

if ($value instanceof \BackedEnum) {
return [$value];
}

if (!\is_int($value) && !\is_string($value)) {
throw new \LogicException(\sprintf('Could not resolve the "%s $%s" controller argument: expecting an int or string, got "%s".', $argument->getType(), $argument->getName(), get_debug_type($value)));
}


$enumType = $argument->getType();

try {
return [$enumType::from($value)];
} catch (\ValueError|\TypeError $e) {
throw new NotFoundHttpException(\sprintf('Could not resolve the "%s $%s" controller argument: ', $argument->getType(), $argument->getName()).$e->getMessage(), $e);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class RequestValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return Request::class === $argument->getType() || is_subclass_of($argument->getType(), Request::class);
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
return Request::class === $argument->getType() || is_subclass_of($argument->getType(), Request::class) ? [$request] : [];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\Stopwatch\Stopwatch;






final class TraceableValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{
private ArgumentValueResolverInterface|ValueResolverInterface $inner;
private Stopwatch $stopwatch;

public function __construct(ArgumentValueResolverInterface|ValueResolverInterface $inner, Stopwatch $stopwatch)
{
$this->inner = $inner;
$this->stopwatch = $stopwatch;
}




public function supports(Request $request, ArgumentMetadata $argument): bool
{
if ($this->inner instanceof ValueResolverInterface) {
return true;
}

$method = $this->inner::class.'::'.__FUNCTION__;
$this->stopwatch->start($method, 'controller.argument_value_resolver');

$return = $this->inner->supports($request, $argument);

$this->stopwatch->stop($method);

return $return;
}

public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
$method = $this->inner::class.'::'.__FUNCTION__;
$this->stopwatch->start($method, 'controller.argument_value_resolver');

yield from $this->inner->resolve($request, $argument);

$this->stopwatch->stop($method);
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Uid\AbstractUid;

final class UidValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return !$argument->isVariadic()
&& \is_string($request->attributes->get($argument->getName()))
&& null !== $argument->getType()
&& is_subclass_of($argument->getType(), AbstractUid::class, true);
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
if ($argument->isVariadic()
|| !\is_string($value = $request->attributes->get($argument->getName()))
|| null === ($uidClass = $argument->getType())
|| !is_subclass_of($uidClass, AbstractUid::class, true)
) {
return [];
}

try {
return [$uidClass::fromString($value)];
} catch (\InvalidArgumentException $e) {
throw new NotFoundHttpException(\sprintf('The uid for the "%s" parameter is invalid.', $argument->getName()), $e);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class DefaultValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return $argument->hasDefaultValue() || (null !== $argument->getType() && $argument->isNullable() && !$argument->isVariadic());
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
if ($argument->hasDefaultValue()) {
return [$argument->getDefaultValue()];
}

if (null !== $argument->getType() && $argument->isNullable() && !$argument->isVariadic()) {
return [null];
}

return [];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\MapQueryParameter;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;








final class QueryParameterValueResolver implements ValueResolverInterface
{
public function resolve(Request $request, ArgumentMetadata $argument): array
{
if (!$attribute = $argument->getAttributesOfType(MapQueryParameter::class)[0] ?? null) {
return [];
}

$name = $attribute->name ?? $argument->getName();
if (!$request->query->has($name)) {
if ($argument->isNullable() || $argument->hasDefaultValue()) {
return [];
}

throw new NotFoundHttpException(\sprintf('Missing query parameter "%s".', $name));
}

$value = $request->query->all()[$name];
$type = $argument->getType();

if (null === $attribute->filter && 'array' === $type) {
if (!$argument->isVariadic()) {
return [(array) $value];
}

$filtered = array_values(array_filter((array) $value, \is_array(...)));

if ($filtered !== $value && !($attribute->flags & \FILTER_NULL_ON_FAILURE)) {
throw new NotFoundHttpException(\sprintf('Invalid query parameter "%s".', $name));
}

return $filtered;
}

$options = [
'flags' => $attribute->flags | \FILTER_NULL_ON_FAILURE,
'options' => $attribute->options,
];

if ('array' === $type || $argument->isVariadic()) {
$value = (array) $value;
$options['flags'] |= \FILTER_REQUIRE_ARRAY;
} else {
$options['flags'] |= \FILTER_REQUIRE_SCALAR;
}

$enumType = null;
$filter = match ($type) {
'array' => \FILTER_DEFAULT,
'string' => \FILTER_DEFAULT,
'int' => \FILTER_VALIDATE_INT,
'float' => \FILTER_VALIDATE_FLOAT,
'bool' => \FILTER_VALIDATE_BOOL,
default => match ($enumType = is_subclass_of($type, \BackedEnum::class) ? (new \ReflectionEnum($type))->getBackingType()->getName() : null) {
'int' => \FILTER_VALIDATE_INT,
'string' => \FILTER_DEFAULT,
default => throw new \LogicException(\sprintf('#[MapQueryParameter] cannot be used on controller argument "%s$%s" of type "%s"; one of array, string, int, float, bool or \BackedEnum should be used.', $argument->isVariadic() ? '...' : '', $argument->getName(), $type ?? 'mixed')),
},
};

$value = filter_var($value, $attribute->filter ?? $filter, $options);

if (null !== $enumType && null !== $value) {
$enumFrom = static function ($value) use ($type) {
if (!\is_string($value) && !\is_int($value)) {
return null;
}

try {
return $type::from($value);
} catch (\ValueError) {
return null;
}
};

$value = \is_array($value) ? array_map($enumFrom, $value) : $enumFrom($value);
}

if (null === $value && !($attribute->flags & \FILTER_NULL_ON_FAILURE)) {
throw new NotFoundHttpException(\sprintf('Invalid query parameter "%s".', $name));
}

if (!\is_array($value)) {
return [$value];
}

$filtered = array_filter($value, static fn ($v) => null !== $v);

if ($argument->isVariadic()) {
$filtered = array_values($filtered);
}

if ($filtered !== $value && !($attribute->flags & \FILTER_NULL_ON_FAILURE)) {
throw new NotFoundHttpException(\sprintf('Invalid query parameter "%s".', $name));
}

return $argument->isVariadic() ? $filtered : [$filtered];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Psr\Clock\ClockInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\MapDateTime;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;







final class DateTimeValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{
public function __construct(
private readonly ?ClockInterface $clock = null,
) {
}




public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return is_a($argument->getType(), \DateTimeInterface::class, true) && $request->attributes->has($argument->getName());
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
if (!is_a($argument->getType(), \DateTimeInterface::class, true) || !$request->attributes->has($argument->getName())) {
return [];
}

$value = $request->attributes->get($argument->getName());
$class = \DateTimeInterface::class === $argument->getType() ? \DateTimeImmutable::class : $argument->getType();

if (!$value) {
if ($argument->isNullable()) {
return [null];
}
if (!$this->clock) {
return [new $class()];
}
$value = $this->clock->now();
}

if ($value instanceof \DateTimeInterface) {
return [$value instanceof $class ? $value : $class::createFromInterface($value)];
}

$format = null;

if ($attributes = $argument->getAttributes(MapDateTime::class, ArgumentMetadata::IS_INSTANCEOF)) {
$attribute = $attributes[0];
$format = $attribute->format;
}

if (null !== $format) {
$date = $class::createFromFormat($format, $value, $this->clock?->now()->getTimeZone());

if (($class::getLastErrors() ?: ['warning_count' => 0])['warning_count']) {
$date = false;
}
} else {
if (false !== filter_var($value, \FILTER_VALIDATE_INT, ['options' => ['min_range' => 0]])) {
$value = '@'.$value;
}
try {
$date = new $class($value, $this->clock?->now()->getTimeZone());
} catch (\Exception) {
$date = false;
}
}

if (!$date) {
throw new NotFoundHttpException(\sprintf('Invalid date given for parameter "%s".', $argument->getName()));
}

return [$date];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class VariadicValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return $argument->isVariadic() && $request->attributes->has($argument->getName());
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
if (!$argument->isVariadic() || !$request->attributes->has($argument->getName())) {
return [];
}

$values = $request->attributes->get($argument->getName());

if (!\is_array($values)) {
throw new \InvalidArgumentException(\sprintf('The action argument "...$%1$s" is required to be an array, the request attribute "%1$s" contains a type of "%2$s" instead.', $argument->getName(), get_debug_type($values)));
}

return $values;
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;






final class RequestAttributeValueResolver implements ArgumentValueResolverInterface, ValueResolverInterface
{



public function supports(Request $request, ArgumentMetadata $argument): bool
{
@trigger_deprecation('symfony/http-kernel', '6.2', 'The "%s()" method is deprecated, use "resolve()" instead.', __METHOD__);

return !$argument->isVariadic() && $request->attributes->has($argument->getName());
}

public function resolve(Request $request, ArgumentMetadata $argument): array
{
return !$argument->isVariadic() && $request->attributes->has($argument->getName()) ? [$request->attributes->get($argument->getName())] : [];
}
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;









interface ControllerResolverInterface
{














public function getController(Request $request): callable|false;
}
<?php










namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Stopwatch\Stopwatch;




class TraceableArgumentResolver implements ArgumentResolverInterface
{
private ArgumentResolverInterface $resolver;
private Stopwatch $stopwatch;

public function __construct(ArgumentResolverInterface $resolver, Stopwatch $stopwatch)
{
$this->resolver = $resolver;
$this->stopwatch = $stopwatch;
}




public function getArguments(Request $request, callable $controller): array
{
$reflector = 2 < \func_num_args() ? func_get_arg(2) : null;
$e = $this->stopwatch->start('controller.get_arguments');

try {
return $this->resolver->getArguments($request, $controller, $reflector);
} finally {
$e->stop();
}
}
}
<?php










namespace Symfony\Component\HttpKernel;






interface RebootableInterface
{










public function reboot(?string $warmupDir);
}
<?php










namespace Symfony\Component\HttpKernel\Log;

use Symfony\Component\HttpFoundation\Request;






interface DebugLoggerInterface
{













public function getLogs(?Request $request = null);






public function countErrors(?Request $request = null);






public function clear();
}
<?php










namespace Symfony\Component\HttpKernel\Log;

use Monolog\Logger;




class DebugLoggerConfigurator
{
private ?object $processor = null;

public function __construct(callable $processor, ?bool $enable = null)
{
if ($enable ?? !\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
$this->processor = \is_object($processor) ? $processor : $processor(...);
}
}

public function pushDebugLogger(Logger $logger): void
{
if ($this->processor) {
$logger->pushProcessor($this->processor);
}
}

public static function getDebugLogger(mixed $logger): ?DebugLoggerInterface
{
if ($logger instanceof DebugLoggerInterface) {
return $logger;
}

if (!$logger instanceof Logger) {
return null;
}

foreach ($logger->getProcessors() as $processor) {
if ($processor instanceof DebugLoggerInterface) {
return $processor;
}
}

return null;
}
}
<?php










namespace Symfony\Component\HttpKernel\Log;

use Psr\Log\AbstractLogger;
use Psr\Log\InvalidArgumentException;
use Psr\Log\LogLevel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;






class Logger extends AbstractLogger implements DebugLoggerInterface
{
private const LEVELS = [
LogLevel::DEBUG => 0,
LogLevel::INFO => 1,
LogLevel::NOTICE => 2,
LogLevel::WARNING => 3,
LogLevel::ERROR => 4,
LogLevel::CRITICAL => 5,
LogLevel::ALERT => 6,
LogLevel::EMERGENCY => 7,
];
private const PRIORITIES = [
LogLevel::DEBUG => 100,
LogLevel::INFO => 200,
LogLevel::NOTICE => 250,
LogLevel::WARNING => 300,
LogLevel::ERROR => 400,
LogLevel::CRITICAL => 500,
LogLevel::ALERT => 550,
LogLevel::EMERGENCY => 600,
];

private int $minLevelIndex;
private \Closure $formatter;
private bool $debug = false;
private array $logs = [];
private array $errorCount = [];


private $handle;




public function __construct(?string $minLevel = null, $output = null, ?callable $formatter = null, private readonly ?RequestStack $requestStack = null, bool $debug = false)
{
if (null === $minLevel) {
$minLevel = null === $output || 'php://stdout' === $output || 'php://stderr' === $output ? LogLevel::ERROR : LogLevel::WARNING;

if (isset($_ENV['SHELL_VERBOSITY']) || isset($_SERVER['SHELL_VERBOSITY'])) {
$minLevel = match ((int) ($_ENV['SHELL_VERBOSITY'] ?? $_SERVER['SHELL_VERBOSITY'])) {
-1 => LogLevel::ERROR,
1 => LogLevel::NOTICE,
2 => LogLevel::INFO,
3 => LogLevel::DEBUG,
default => $minLevel,
};
}
}

if (!isset(self::LEVELS[$minLevel])) {
throw new InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $minLevel));
}

$this->minLevelIndex = self::LEVELS[$minLevel];
$this->formatter = null !== $formatter ? $formatter(...) : $this->format(...);
if ($output && false === $this->handle = \is_string($output) ? @fopen($output, 'a') : $output) {
throw new InvalidArgumentException(\sprintf('Unable to open "%s".', $output));
}
$this->debug = $debug;
}

public function enableDebug(): void
{
$this->debug = true;
}

public function log($level, $message, array $context = []): void
{
if (!isset(self::LEVELS[$level])) {
throw new InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $level));
}

if (self::LEVELS[$level] < $this->minLevelIndex) {
return;
}

$formatter = $this->formatter;
if ($this->handle) {
@fwrite($this->handle, $formatter($level, $message, $context).\PHP_EOL);
} else {
error_log($formatter($level, $message, $context, false));
}

if ($this->debug && $this->requestStack) {
$this->record($level, $message, $context);
}
}

public function getLogs(?Request $request = null): array
{
if ($request) {
return $this->logs[spl_object_id($request)] ?? [];
}

return array_merge(...array_values($this->logs));
}

public function countErrors(?Request $request = null): int
{
if ($request) {
return $this->errorCount[spl_object_id($request)] ?? 0;
}

return array_sum($this->errorCount);
}

public function clear(): void
{
$this->logs = [];
$this->errorCount = [];
}

private function format(string $level, string $message, array $context, bool $prefixDate = true): string
{
if (str_contains($message, '{')) {
$replacements = [];
foreach ($context as $key => $val) {
if (null === $val || \is_scalar($val) || $val instanceof \Stringable) {
$replacements["{{$key}}"] = $val;
} elseif ($val instanceof \DateTimeInterface) {
$replacements["{{$key}}"] = $val->format(\DateTimeInterface::RFC3339);
} elseif (\is_object($val)) {
$replacements["{{$key}}"] = '[object '.$val::class.']';
} else {
$replacements["{{$key}}"] = '['.\gettype($val).']';
}
}

$message = strtr($message, $replacements);
}

$log = \sprintf('[%s] %s', $level, $message);
if ($prefixDate) {
$log = date(\DateTimeInterface::RFC3339).' '.$log;
}

return $log;
}

private function record($level, $message, array $context): void
{
$request = $this->requestStack->getCurrentRequest();
$key = $request ? spl_object_id($request) : '';

$this->logs[$key][] = [
'channel' => null,
'context' => $context,
'message' => $message,
'priority' => self::PRIORITIES[$level],
'priorityName' => $level,
'timestamp' => time(),
'timestamp_rfc3339' => date(\DATE_RFC3339_EXTENDED),
];

$this->errorCount[$key] ??= 0;
switch ($level) {
case LogLevel::ERROR:
case LogLevel::CRITICAL:
case LogLevel::ALERT:
case LogLevel::EMERGENCY:
++$this->errorCount[$key];
}
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\UriSigner as HttpFoundationUriSigner;

trigger_deprecation('symfony/http-kernel', '6.4', 'The "%s" class is deprecated, use "%s" instead.', UriSigner::class, HttpFoundationUriSigner::class);

class_exists(HttpFoundationUriSigner::class);

if (false) {



class UriSigner extends HttpFoundationUriSigner
{
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\HttpCache\SubRequestHandler;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;






class InlineFragmentRenderer extends RoutableFragmentRenderer
{
private HttpKernelInterface $kernel;
private ?EventDispatcherInterface $dispatcher;

public function __construct(HttpKernelInterface $kernel, ?EventDispatcherInterface $dispatcher = null)
{
$this->kernel = $kernel;
$this->dispatcher = $dispatcher;
}






public function render(string|ControllerReference $uri, Request $request, array $options = []): Response
{
$reference = null;
if ($uri instanceof ControllerReference) {
$reference = $uri;





$attributes = $reference->attributes;
$reference->attributes = [];


foreach (['_format', '_locale'] as $key) {
if (isset($attributes[$key])) {
$reference->attributes[$key] = $attributes[$key];
}
}

$uri = $this->generateFragmentUri($uri, $request, false, false);

$reference->attributes = array_merge($attributes, $reference->attributes);
}

$subRequest = $this->createSubRequest($uri, $request);


if (null !== $reference) {
$subRequest->attributes->add($reference->attributes);
}

$level = ob_get_level();
try {
return SubRequestHandler::handle($this->kernel, $subRequest, HttpKernelInterface::SUB_REQUEST, false);
} catch (\Exception $e) {


if (isset($options['ignore_errors']) && $options['ignore_errors'] && $this->dispatcher) {
$event = new ExceptionEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST, $e);

$this->dispatcher->dispatch($event, KernelEvents::EXCEPTION);
}


Response::closeOutputBuffers($level, false);

if (isset($options['alt'])) {
$alt = $options['alt'];
unset($options['alt']);

return $this->render($alt, $request, $options);
}

if (!isset($options['ignore_errors']) || !$options['ignore_errors']) {
throw $e;
}

return new Response();
}
}




protected function createSubRequest(string $uri, Request $request)
{
$cookies = $request->cookies->all();
$server = $request->server->all();

unset($server['HTTP_IF_MODIFIED_SINCE']);
unset($server['HTTP_IF_NONE_MATCH']);

$subRequest = Request::create($uri, 'get', [], $cookies, [], $server);
if ($request->headers->has('Surrogate-Capability')) {
$subRequest->headers->set('Surrogate-Capability', $request->headers->get('Surrogate-Capability'));
}

static $setSession;

$setSession ??= \Closure::bind(static function ($subRequest, $request) { $subRequest->session = $request->session; }, null, Request::class);
$setSession($subRequest, $request);

if ($request->get('_format')) {
$subRequest->attributes->set('_format', $request->get('_format'));
}
if ($request->getDefaultLocale() !== $request->getLocale()) {
$subRequest->setLocale($request->getLocale());
}
if ($request->attributes->has('_stateless')) {
$subRequest->attributes->set('_stateless', $request->attributes->get('_stateless'));
}
if ($request->attributes->has('_check_controller_is_allowed')) {
$subRequest->attributes->set('_check_controller_is_allowed', $request->attributes->get('_check_controller_is_allowed'));
}

return $subRequest;
}

public function getName(): string
{
return 'inline';
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\UriSigner;
use Symfony\Component\HttpKernel\Controller\ControllerReference;







final class FragmentUriGenerator implements FragmentUriGeneratorInterface
{
private string $fragmentPath;
private ?UriSigner $signer;
private ?RequestStack $requestStack;

public function __construct(string $fragmentPath, ?UriSigner $signer = null, ?RequestStack $requestStack = null)
{
$this->fragmentPath = $fragmentPath;
$this->signer = $signer;
$this->requestStack = $requestStack;
}

public function generate(ControllerReference $controller, ?Request $request = null, bool $absolute = false, bool $strict = true, bool $sign = true): string
{
if (null === $request && (null === $this->requestStack || null === $request = $this->requestStack->getCurrentRequest())) {
throw new \LogicException('Generating a fragment URL can only be done when handling a Request.');
}

if ($sign && null === $this->signer) {
throw new \LogicException('You must use a URI when using the ESI rendering strategy or set a URL signer.');
}

if ($strict) {
$this->checkNonScalar($controller->attributes);
}






if (!isset($controller->attributes['_format'])) {
$controller->attributes['_format'] = $request->getRequestFormat();
}
if (!isset($controller->attributes['_locale'])) {
$controller->attributes['_locale'] = $request->getLocale();
}

$controller->attributes['_controller'] = $controller->controller;
$controller->query['_path'] = http_build_query($controller->attributes, '', '&');
$path = $this->fragmentPath.'?'.http_build_query($controller->query, '', '&');


$fragmentUri = $sign || $absolute ? $request->getUriForPath($path) : $request->getBaseUrl().$path;

if (!$sign) {
return $fragmentUri;
}

$fragmentUri = $this->signer->sign($fragmentUri);

return $absolute ? $fragmentUri : substr($fragmentUri, \strlen($request->getSchemeAndHttpHost()));
}

private function checkNonScalar(array $values): void
{
foreach ($values as $key => $value) {
if (\is_array($value)) {
$this->checkNonScalar($value);
} elseif (!\is_scalar($value) && null !== $value) {
throw new \LogicException(\sprintf('Controller attributes cannot contain non-scalar/non-null values (value for key "%s" is not a scalar or null).', $key));
}
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\UriSigner;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Twig\Environment;






class HIncludeFragmentRenderer extends RoutableFragmentRenderer
{
private ?string $globalDefaultTemplate;
private ?UriSigner $signer;
private ?Environment $twig;
private string $charset;




public function __construct(?Environment $twig = null, ?UriSigner $signer = null, ?string $globalDefaultTemplate = null, string $charset = 'utf-8')
{
$this->twig = $twig;
$this->globalDefaultTemplate = $globalDefaultTemplate;
$this->signer = $signer;
$this->charset = $charset;
}




public function hasTemplating(): bool
{
return null !== $this->twig;
}








public function render(string|ControllerReference $uri, Request $request, array $options = []): Response
{
if ($uri instanceof ControllerReference) {
$uri = (new FragmentUriGenerator($this->fragmentPath, $this->signer))->generate($uri, $request);
}


$uri = str_replace('&', '&amp;', $uri);

$template = $options['default'] ?? $this->globalDefaultTemplate;
if (null !== $this->twig && $template && $this->twig->getLoader()->exists($template)) {
$content = $this->twig->render($template);
} else {
$content = $template;
}

$attributes = isset($options['attributes']) && \is_array($options['attributes']) ? $options['attributes'] : [];
if (isset($options['id']) && $options['id']) {
$attributes['id'] = $options['id'];
}
$renderedAttributes = '';
if (\count($attributes) > 0) {
$flags = \ENT_QUOTES | \ENT_SUBSTITUTE;
foreach ($attributes as $attribute => $value) {
$renderedAttributes .= \sprintf(
' %s="%s"',
htmlspecialchars($attribute, $flags, $this->charset, false),
htmlspecialchars($value, $flags, $this->charset, false)
);
}
}

return new Response(\sprintf('<hx:include src="%s"%s>%s</hx:include>', $uri, $renderedAttributes, $content));
}

public function getName(): string
{
return 'hinclude';
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;






class SsiFragmentRenderer extends AbstractSurrogateFragmentRenderer
{
public function getName(): string
{
return 'ssi';
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;






class EsiFragmentRenderer extends AbstractSurrogateFragmentRenderer
{
public function getName(): string
{
return 'esi';
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\UriSigner;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface;






abstract class AbstractSurrogateFragmentRenderer extends RoutableFragmentRenderer
{
private ?SurrogateInterface $surrogate;
private FragmentRendererInterface $inlineStrategy;
private ?UriSigner $signer;







public function __construct(?SurrogateInterface $surrogate, FragmentRendererInterface $inlineStrategy, ?UriSigner $signer = null)
{
$this->surrogate = $surrogate;
$this->inlineStrategy = $inlineStrategy;
$this->signer = $signer;
}
















public function render(string|ControllerReference $uri, Request $request, array $options = []): Response
{
if (!$this->surrogate || !$this->surrogate->hasSurrogateCapability($request)) {
$request->attributes->set('_check_controller_is_allowed', -1); 

if ($uri instanceof ControllerReference && $this->containsNonScalars($uri->attributes)) {
throw new \InvalidArgumentException('Passing non-scalar values as part of URI attributes to the ESI and SSI rendering strategies is not supported. Use a different rendering strategy or pass scalar values.');
}

return $this->inlineStrategy->render($uri, $request, $options);
}

$absolute = $options['absolute_uri'] ?? false;

if ($uri instanceof ControllerReference) {
$uri = $this->generateSignedFragmentUri($uri, $request, $absolute);
}

$alt = $options['alt'] ?? null;
if ($alt instanceof ControllerReference) {
$alt = $this->generateSignedFragmentUri($alt, $request, $absolute);
}

$tag = $this->surrogate->renderIncludeTag($uri, $alt, $options['ignore_errors'] ?? false, $options['comment'] ?? '');

return new Response($tag);
}

private function generateSignedFragmentUri(ControllerReference $uri, Request $request, bool $absolute): string
{
return (new FragmentUriGenerator($this->fragmentPath, $this->signer))->generate($uri, $request, $absolute);
}

private function containsNonScalars(array $values): bool
{
foreach ($values as $value) {
if (\is_scalar($value) || null === $value) {
continue;
}

if (!\is_array($value) || $this->containsNonScalars($value)) {
return true;
}
}

return false;
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\Exception\HttpException;











class FragmentHandler
{
private bool $debug;
private array $renderers = [];
private RequestStack $requestStack;





public function __construct(RequestStack $requestStack, array $renderers = [], bool $debug = false)
{
$this->requestStack = $requestStack;
foreach ($renderers as $renderer) {
$this->addRenderer($renderer);
}
$this->debug = $debug;
}






public function addRenderer(FragmentRendererInterface $renderer)
{
$this->renderers[$renderer->getName()] = $renderer;
}











public function render(string|ControllerReference $uri, string $renderer = 'inline', array $options = []): ?string
{
if (!isset($options['ignore_errors'])) {
$options['ignore_errors'] = !$this->debug;
}

if (!isset($this->renderers[$renderer])) {
throw new \InvalidArgumentException(\sprintf('The "%s" renderer does not exist.', $renderer));
}

if (!$request = $this->requestStack->getCurrentRequest()) {
throw new \LogicException('Rendering a fragment can only be done when handling a Request.');
}

return $this->deliver($this->renderers[$renderer]->render($uri, $request, $options));
}











protected function deliver(Response $response): ?string
{
if (!$response->isSuccessful()) {
$responseStatusCode = $response->getStatusCode();
throw new \RuntimeException(\sprintf('Error when rendering "%s" (Status code is %d).', $this->requestStack->getCurrentRequest()->getUri(), $responseStatusCode), 0, new HttpException($responseStatusCode));
}

if (!$response instanceof StreamedResponse) {
return $response->getContent();
}

$response->sendContent();

return null;
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\EventListener\FragmentListener;






abstract class RoutableFragmentRenderer implements FragmentRendererInterface
{



protected string $fragmentPath = '/_fragment';








public function setFragmentPath(string $path)
{
$this->fragmentPath = $path;
}







protected function generateFragmentUri(ControllerReference $reference, Request $request, bool $absolute = false, bool $strict = true): string
{
return (new FragmentUriGenerator($this->fragmentPath))->generate($reference, $request, $absolute, $strict, false);
}
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerReference;






interface FragmentUriGeneratorInterface
{







public function generate(ControllerReference $controller, ?Request $request = null, bool $absolute = false, bool $strict = true, bool $sign = true): string;
}
<?php










namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerReference;






interface FragmentRendererInterface
{



public function render(string|ControllerReference $uri, Request $request, array $options = []): Response;




public function getName(): string;
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Symfony\Component\HttpKernel\Controller\ArgumentResolver\QueryParameterValueResolver;






#[\Attribute(\Attribute::TARGET_PARAMETER)]
final class MapQueryParameter extends ValueResolver
{





public function __construct(
public ?string $name = null,
public ?int $filter = null,
public int $flags = 0,
public array $options = [],
string $resolver = QueryParameterValueResolver::class,
) {
parent::__construct($resolver);
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Psr\Log\LogLevel;




#[\Attribute(\Attribute::TARGET_CLASS)]
final class WithLogLevel
{



public function __construct(public readonly string $level)
{
if (!\defined('Psr\Log\LogLevel::'.strtoupper($this->level))) {
throw new \InvalidArgumentException(\sprintf('Invalid log level "%s".', $this->level));
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;

#[\Attribute(\Attribute::TARGET_PARAMETER | \Attribute::IS_REPEATABLE)]
class ValueResolver
{



public function __construct(
public string $resolver,
public bool $disabled = false,
) {
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class WithHttpStatus
{



public function __construct(
public readonly int $statusCode,
public readonly array $headers = [],
) {
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\Validator\Constraints\GroupSequence;






#[\Attribute(\Attribute::TARGET_PARAMETER)]
class MapQueryString extends ValueResolver
{
public ArgumentMetadata $metadata;

public function __construct(
public readonly array $serializationContext = [],
public readonly string|GroupSequence|array|null $validationGroups = null,
string $resolver = RequestPayloadValueResolver::class,
public readonly int $validationFailedStatusCode = Response::HTTP_NOT_FOUND,
) {
parent::__construct($resolver);
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;








#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_FUNCTION)]
class AsController
{
public function __construct()
{
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DateTimeValueResolver;




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class MapDateTime extends ValueResolver
{
public function __construct(
public readonly ?string $format = null,
bool $disabled = false,
string $resolver = DateTimeValueResolver::class,
) {
parent::__construct($resolver, $disabled);
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class AsTargetedValueResolver
{
public function __construct(
public readonly ?string $name = null,
) {
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\Validator\Constraints\GroupSequence;






#[\Attribute(\Attribute::TARGET_PARAMETER)]
class MapRequestPayload extends ValueResolver
{
public ArgumentMetadata $metadata;

public function __construct(
public readonly array|string|null $acceptFormat = null,
public readonly array $serializationContext = [],
public readonly string|GroupSequence|array|null $validationGroups = null,
string $resolver = RequestPayloadValueResolver::class,
public readonly int $validationFailedStatusCode = Response::HTTP_UNPROCESSABLE_ENTITY,
) {
parent::__construct($resolver);
}
}
<?php










namespace Symfony\Component\HttpKernel\Attribute;










#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::TARGET_FUNCTION)]
final class Cache
{
public function __construct(



public ?string $expires = null,





public int|string|null $maxage = null,





public int|string|null $smaxage = null,





public ?bool $public = null,





public bool $mustRevalidate = false,











public array $vary = [],









public ?string $lastModified = null,









public ?string $etag = null,





public int|string|null $maxStale = null,





public int|string|null $staleWhileRevalidate = null,





public int|string|null $staleIfError = null,
) {
}
}
Copyright (c) 2004-present 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.
<?php













namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






class Store implements StoreInterface
{
protected $root;

private \SplObjectStorage $keyCache;

private array $locks = [];
private array $options;











public function __construct(string $root, array $options = [])
{
$this->root = $root;
if (!is_dir($this->root) && !@mkdir($this->root, 0777, true) && !is_dir($this->root)) {
throw new \RuntimeException(\sprintf('Unable to create the store directory (%s).', $this->root));
}
$this->keyCache = new \SplObjectStorage();
$this->options = array_merge([
'private_headers' => ['Set-Cookie'],
], $options);
}






public function cleanup()
{

foreach ($this->locks as $lock) {
flock($lock, \LOCK_UN);
fclose($lock);
}

$this->locks = [];
}






public function lock(Request $request): bool|string
{
$key = $this->getCacheKey($request);

if (!isset($this->locks[$key])) {
$path = $this->getPath($key);
if (!is_dir(\dirname($path)) && false === @mkdir(\dirname($path), 0777, true) && !is_dir(\dirname($path))) {
return $path;
}
$h = fopen($path, 'c');
if (!flock($h, \LOCK_EX | \LOCK_NB)) {
fclose($h);

return $path;
}

$this->locks[$key] = $h;
}

return true;
}






public function unlock(Request $request): bool
{
$key = $this->getCacheKey($request);

if (isset($this->locks[$key])) {
flock($this->locks[$key], \LOCK_UN);
fclose($this->locks[$key]);
unset($this->locks[$key]);

return true;
}

return false;
}

public function isLocked(Request $request): bool
{
$key = $this->getCacheKey($request);

if (isset($this->locks[$key])) {
return true; 
}

if (!is_file($path = $this->getPath($key))) {
return false;
}

$h = fopen($path, 'r');
flock($h, \LOCK_EX | \LOCK_NB, $wouldBlock);
flock($h, \LOCK_UN); 
fclose($h);

return (bool) $wouldBlock;
}




public function lookup(Request $request): ?Response
{
$key = $this->getCacheKey($request);

if (!$entries = $this->getMetadata($key)) {
return null;
}


$match = null;
foreach ($entries as $entry) {
if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? implode(', ', $entry[1]['vary']) : '', $request->headers->all(), $entry[0])) {
$match = $entry;

break;
}
}

if (null === $match) {
return null;
}

$headers = $match[1];
if (file_exists($path = $this->getPath($headers['x-content-digest'][0]))) {
return $this->restoreResponse($headers, $path);
}




return null;
}









public function write(Request $request, Response $response): string
{
$key = $this->getCacheKey($request);
$storedEnv = $this->persistRequest($request);

if ($response->headers->has('X-Body-File')) {

if (!$response->headers->has('X-Content-Digest')) {
throw new \RuntimeException('A restored response must have the X-Content-Digest header.');
}

$digest = $response->headers->get('X-Content-Digest');
if ($this->getPath($digest) !== $response->headers->get('X-Body-File')) {
throw new \RuntimeException('X-Body-File and X-Content-Digest do not match.');
}

} else {
$digest = $this->generateContentDigest($response);
$response->headers->set('X-Content-Digest', $digest);

if (!$this->save($digest, $response->getContent(), false)) {
throw new \RuntimeException('Unable to store the entity.');
}

if (!$response->headers->has('Transfer-Encoding')) {
$response->headers->set('Content-Length', \strlen($response->getContent()));
}
}


$entries = [];
$vary = implode(', ', $response->headers->all('vary'));
foreach ($this->getMetadata($key) as $entry) {
if (!$this->requestsMatch($vary ?? '', $entry[0], $storedEnv)) {
$entries[] = $entry;
}
}

$headers = $this->persistResponse($response);
unset($headers['age']);

foreach ($this->options['private_headers'] as $h) {
unset($headers[strtolower($h)]);
}

array_unshift($entries, [$storedEnv, $headers]);

if (!$this->save($key, serialize($entries))) {
throw new \RuntimeException('Unable to store the metadata.');
}

return $key;
}




protected function generateContentDigest(Response $response): string
{
return 'en'.hash('xxh128', $response->getContent());
}








public function invalidate(Request $request)
{
$modified = false;
$key = $this->getCacheKey($request);

$entries = [];
foreach ($this->getMetadata($key) as $entry) {
$response = $this->restoreResponse($entry[1]);
if ($response->isFresh()) {
$response->expire();
$modified = true;
$entries[] = [$entry[0], $this->persistResponse($response)];
} else {
$entries[] = $entry;
}
}

if ($modified && !$this->save($key, serialize($entries))) {
throw new \RuntimeException('Unable to store the metadata.');
}
}









private function requestsMatch(?string $vary, array $env1, array $env2): bool
{
if ('' === ($vary ?? '')) {
return true;
}

foreach (preg_split('/[\s,]+/', $vary) as $header) {
$key = str_replace('_', '-', strtolower($header));
$v1 = $env1[$key] ?? null;
$v2 = $env2[$key] ?? null;
if ($v1 !== $v2) {
return false;
}
}

return true;
}






private function getMetadata(string $key): array
{
if (!$entries = $this->load($key)) {
return [];
}

return unserialize($entries) ?: [];
}








public function purge(string $url): bool
{
$http = preg_replace('#^https:#', 'http:', $url);
$https = preg_replace('#^http:#', 'https:', $url);

$purgedHttp = $this->doPurge($http);
$purgedHttps = $this->doPurge($https);

return $purgedHttp || $purgedHttps;
}




private function doPurge(string $url): bool
{
$key = $this->getCacheKey(Request::create($url));
if (isset($this->locks[$key])) {
flock($this->locks[$key], \LOCK_UN);
fclose($this->locks[$key]);
unset($this->locks[$key]);
}

if (is_file($path = $this->getPath($key))) {
unlink($path);

return true;
}

return false;
}




private function load(string $key): ?string
{
$path = $this->getPath($key);

return is_file($path) && false !== ($contents = @file_get_contents($path)) ? $contents : null;
}




private function save(string $key, string $data, bool $overwrite = true): bool
{
$path = $this->getPath($key);

if (!$overwrite && file_exists($path)) {
return true;
}

if (isset($this->locks[$key])) {
$fp = $this->locks[$key];
@ftruncate($fp, 0);
@fseek($fp, 0);
$len = @fwrite($fp, $data);
if (\strlen($data) !== $len) {
@ftruncate($fp, 0);

return false;
}
} else {
if (!is_dir(\dirname($path)) && false === @mkdir(\dirname($path), 0777, true) && !is_dir(\dirname($path))) {
return false;
}

$tmpFile = tempnam(\dirname($path), basename($path));
if (false === $fp = @fopen($tmpFile, 'w')) {
@unlink($tmpFile);

return false;
}
@fwrite($fp, $data);
@fclose($fp);

if ($data != file_get_contents($tmpFile)) {
@unlink($tmpFile);

return false;
}

if (false === @rename($tmpFile, $path)) {
@unlink($tmpFile);

return false;
}
}

@chmod($path, 0666 & ~umask());

return true;
}




public function getPath(string $key)
{
return $this->root.\DIRECTORY_SEPARATOR.substr($key, 0, 2).\DIRECTORY_SEPARATOR.substr($key, 2, 2).\DIRECTORY_SEPARATOR.substr($key, 4, 2).\DIRECTORY_SEPARATOR.substr($key, 6);
}











protected function generateCacheKey(Request $request): string
{
return 'md'.hash('sha256', $request->getUri());
}




private function getCacheKey(Request $request): string
{
if (isset($this->keyCache[$request])) {
return $this->keyCache[$request];
}

return $this->keyCache[$request] = $this->generateCacheKey($request);
}




private function persistRequest(Request $request): array
{
return $request->headers->all();
}




private function persistResponse(Response $response): array
{
$headers = $response->headers->all();
$headers['X-Status'] = [$response->getStatusCode()];

return $headers;
}




private function restoreResponse(array $headers, ?string $path = null): ?Response
{
$status = $headers['X-Status'][0];
unset($headers['X-Status']);
$content = null;

if (null !== $path) {
$headers['X-Body-File'] = [$path];
unset($headers['x-body-file']);

if ($headers['X-Body-Eval'] ?? $headers['x-body-eval'] ?? false) {
$content = file_get_contents($path);
\assert(HttpCache::BODY_EVAL_BOUNDARY_LENGTH === 24);
if (48 > \strlen($content) || substr($content, -24) !== substr($content, 0, 24)) {
return null;
}
}
}

return new Response($content, $status, $headers);
}
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;







abstract class AbstractSurrogate implements SurrogateInterface
{
protected $contentTypes;




protected $phpEscapeMap = [
['<?', '<%', '<s', '<S'],
['<?php echo "<?"; ?>', '<?php echo "<%"; ?>', '<?php echo "<s"; ?>', '<?php echo "<S"; ?>'],
];





public function __construct(array $contentTypes = ['text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'])
{
$this->contentTypes = $contentTypes;
}




public function createCacheStrategy(): ResponseCacheStrategyInterface
{
return new ResponseCacheStrategy();
}

public function hasSurrogateCapability(Request $request): bool
{
if (null === $value = $request->headers->get('Surrogate-Capability')) {
return false;
}

return str_contains($value, \sprintf('%s/1.0', strtoupper($this->getName())));
}




public function addSurrogateCapability(Request $request)
{
$current = $request->headers->get('Surrogate-Capability');
$new = \sprintf('symfony="%s/1.0"', strtoupper($this->getName()));

$request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new);
}

public function needsParsing(Response $response): bool
{
if (!$control = $response->headers->get('Surrogate-Control')) {
return false;
}

$pattern = \sprintf('#content="[^"]*%s/1.0[^"]*"#', strtoupper($this->getName()));

return (bool) preg_match($pattern, $control);
}

public function handle(HttpCache $cache, string $uri, string $alt, bool $ignoreErrors): string
{
$subRequest = Request::create($uri, Request::METHOD_GET, [], $cache->getRequest()->cookies->all(), [], $cache->getRequest()->server->all());

try {
$response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);

if (!$response->isSuccessful() && Response::HTTP_NOT_MODIFIED !== $response->getStatusCode()) {
throw new \RuntimeException(\sprintf('Error when rendering "%s" (Status code is %d).', $subRequest->getUri(), $response->getStatusCode()));
}

return $response->getContent();
} catch (\Exception $e) {
if ($alt) {
return $this->handle($cache, $alt, '', $ignoreErrors);
}

if (!$ignoreErrors) {
throw $e;
}
}

return '';
}






protected function removeFromControl(Response $response)
{
if (!$response->headers->has('Surrogate-Control')) {
return;
}

$value = $response->headers->get('Surrogate-Control');
$upperName = strtoupper($this->getName());

if (\sprintf('content="%s/1.0"', $upperName) == $value) {
$response->headers->remove('Surrogate-Control');
} elseif (preg_match(\sprintf('#,\s*content="%s/1.0"#', $upperName), $value)) {
$response->headers->set('Surrogate-Control', preg_replace(\sprintf('#,\s*content="%s/1.0"#', $upperName), '', $value));
} elseif (preg_match(\sprintf('#content="%s/1.0",\s*#', $upperName), $value)) {
$response->headers->set('Surrogate-Control', preg_replace(\sprintf('#content="%s/1.0",\s*#', $upperName), '', $value));
}
}

protected static function generateBodyEvalBoundary(): string
{
static $cookie;
$cookie = hash('xxh128', $cookie ?? $cookie = random_bytes(16), true);
$boundary = base64_encode($cookie);

\assert(HttpCache::BODY_EVAL_BOUNDARY_LENGTH === \strlen($boundary));

return $boundary;
}
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






class Ssi extends AbstractSurrogate
{
public function getName(): string
{
return 'ssi';
}




public function addSurrogateControl(Response $response)
{
if (str_contains($response->getContent(), '<!--#include')) {
$response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
}
}

public function renderIncludeTag(string $uri, ?string $alt = null, bool $ignoreErrors = true, string $comment = ''): string
{
return \sprintf('<!--#include virtual="%s" -->', $uri);
}

public function process(Request $request, Response $response): Response
{
$type = $response->headers->get('Content-Type');
if (empty($type)) {
$type = 'text/html';
}

$parts = explode(';', $type);
if (!\in_array($parts[0], $this->contentTypes)) {
return $response;
}


$content = $response->getContent();
$boundary = self::generateBodyEvalBoundary();
$chunks = preg_split('#<!--\#include\s+(.*?)\s*-->#', $content, -1, \PREG_SPLIT_DELIM_CAPTURE);

$i = 1;
while (isset($chunks[$i])) {
$options = [];
preg_match_all('/(virtual)="([^"]*?)"/', $chunks[$i], $matches, \PREG_SET_ORDER);
foreach ($matches as $set) {
$options[$set[1]] = $set[2];
}

if (!isset($options['virtual'])) {
throw new \RuntimeException('Unable to process an SSI tag without a "virtual" attribute.');
}

$chunks[$i] = $boundary.$options['virtual']."\n\n\n";
$i += 2;
}
$content = $boundary.implode('', $chunks).$boundary;

$response->setContent($content);
$response->headers->set('X-Body-Eval', 'SSI');


$this->removeFromControl($response);

return $response;
}
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;












class Esi extends AbstractSurrogate
{
public function getName(): string
{
return 'esi';
}




public function addSurrogateControl(Response $response)
{
if (str_contains($response->getContent(), '<esi:include')) {
$response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
}
}

public function renderIncludeTag(string $uri, ?string $alt = null, bool $ignoreErrors = true, string $comment = ''): string
{
$html = \sprintf('<esi:include src="%s"%s%s />',
$uri,
$ignoreErrors ? ' onerror="continue"' : '',
$alt ? \sprintf(' alt="%s"', $alt) : ''
);

if (!empty($comment)) {
return \sprintf("<esi:comment text=\"%s\" />\n%s", $comment, $html);
}

return $html;
}

public function process(Request $request, Response $response): Response
{
$type = $response->headers->get('Content-Type');
if (empty($type)) {
$type = 'text/html';
}

$parts = explode(';', $type);
if (!\in_array($parts[0], $this->contentTypes)) {
return $response;
}


$content = $response->getContent();
$content = preg_replace('#<esi\:remove>.*?</esi\:remove>#s', '', $content);
$content = preg_replace('#<esi\:comment[^>]+>#s', '', $content);

$boundary = self::generateBodyEvalBoundary();
$chunks = preg_split('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', $content, -1, \PREG_SPLIT_DELIM_CAPTURE);

$i = 1;
while (isset($chunks[$i])) {
$options = [];
preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, \PREG_SET_ORDER);
foreach ($matches as $set) {
$options[$set[1]] = $set[2];
}

if (!isset($options['src'])) {
throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
}

$chunks[$i] = $boundary.$options['src']."\n".($options['alt'] ?? '')."\n".('continue' === ($options['onerror'] ?? ''))."\n";
$i += 2;
}
$content = $boundary.implode('', $chunks).$boundary;

$response->setContent($content);
$response->headers->set('X-Body-Eval', 'ESI');


$this->removeFromControl($response);

return $response;
}
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;






class SubRequestHandler
{
public static function handle(HttpKernelInterface $kernel, Request $request, int $type, bool $catch): Response
{

$trustedProxies = Request::getTrustedProxies();
$trustedHeaderSet = Request::getTrustedHeaderSet();


$remoteAddr = $request->server->get('REMOTE_ADDR');
if (!$remoteAddr || !IpUtils::checkIp($remoteAddr, $trustedProxies)) {
$trustedHeaders = [
'FORWARDED' => $trustedHeaderSet & Request::HEADER_FORWARDED,
'X_FORWARDED_FOR' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_FOR,
'X_FORWARDED_HOST' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_HOST,
'X_FORWARDED_PROTO' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_PROTO,
'X_FORWARDED_PORT' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_PORT,
'X_FORWARDED_PREFIX' => $trustedHeaderSet & Request::HEADER_X_FORWARDED_PREFIX,
];
foreach (array_filter($trustedHeaders) as $name => $key) {
$request->headers->remove($name);
$request->server->remove('HTTP_'.$name);
}
}


$trustedIps = [];
$trustedValues = [];
foreach (array_reverse($request->getClientIps()) as $ip) {
$trustedIps[] = $ip;
$trustedValues[] = \sprintf('for="%s"', $ip);
}
if ($ip !== $remoteAddr) {
$trustedIps[] = $remoteAddr;
$trustedValues[] = \sprintf('for="%s"', $remoteAddr);
}


if (Request::HEADER_FORWARDED & $trustedHeaderSet) {
$trustedValues[0] .= \sprintf(';host="%s";proto=%s', $request->getHttpHost(), $request->getScheme());
$request->headers->set('Forwarded', $v = implode(', ', $trustedValues));
$request->server->set('HTTP_FORWARDED', $v);
}
if (Request::HEADER_X_FORWARDED_FOR & $trustedHeaderSet) {
$request->headers->set('X-Forwarded-For', $v = implode(', ', $trustedIps));
$request->server->set('HTTP_X_FORWARDED_FOR', $v);
} elseif (!(Request::HEADER_FORWARDED & $trustedHeaderSet)) {
Request::setTrustedProxies($trustedProxies, $trustedHeaderSet | Request::HEADER_X_FORWARDED_FOR);
$request->headers->set('X-Forwarded-For', $v = implode(', ', $trustedIps));
$request->server->set('HTTP_X_FORWARDED_FOR', $v);
}



$request->server->set('REMOTE_ADDR', '127.0.0.1');


if (!IpUtils::checkIp('127.0.0.1', $trustedProxies)) {
Request::setTrustedProxies(array_merge($trustedProxies, ['127.0.0.1']), Request::getTrustedHeaderSet());
}

try {
return $kernel->handle($request, $type, $catch);
} finally {

Request::setTrustedProxies($trustedProxies, $trustedHeaderSet);
}
}
}
<?php













namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






interface StoreInterface
{



public function lookup(Request $request): ?Response;









public function write(Request $request, Response $response): string;






public function invalidate(Request $request);






public function lock(Request $request): bool|string;






public function unlock(Request $request): bool;






public function isLocked(Request $request): bool;






public function purge(string $url): bool;






public function cleanup();
}
<?php














namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Response;







interface ResponseCacheStrategyInterface
{





public function add(Response $response);






public function update(Response $response);
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;




class CacheWasLockedException extends \Exception
{
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

interface SurrogateInterface
{



public function getName(): string;




public function createCacheStrategy(): ResponseCacheStrategyInterface;




public function hasSurrogateCapability(Request $request): bool;






public function addSurrogateCapability(Request $request);








public function addSurrogateControl(Response $response);




public function needsParsing(Response $response): bool;







public function renderIncludeTag(string $uri, ?string $alt = null, bool $ignoreErrors = true, string $comment = ''): string;




public function process(Request $request, Response $response): Response;









public function handle(HttpCache $cache, string $uri, string $alt, bool $ignoreErrors): string;
}
<?php










namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Response;










class ResponseCacheStrategy implements ResponseCacheStrategyInterface
{



private const OVERRIDE_DIRECTIVES = ['private', 'no-cache', 'no-store', 'no-transform', 'must-revalidate', 'proxy-revalidate'];




private const INHERIT_DIRECTIVES = ['public', 'immutable'];

private int $embeddedResponses = 0;
private bool $isNotCacheableResponseEmbedded = false;
private int $age = 0;
private \DateTimeInterface|false|null $lastModified = null;
private array $flagDirectives = [
'no-cache' => null,
'no-store' => null,
'no-transform' => null,
'must-revalidate' => null,
'proxy-revalidate' => null,
'public' => null,
'private' => null,
'immutable' => null,
];
private array $ageDirectives = [
'max-age' => null,
's-maxage' => null,
'expires' => false,
];




public function add(Response $response)
{
++$this->embeddedResponses;

foreach (self::OVERRIDE_DIRECTIVES as $directive) {
if ($response->headers->hasCacheControlDirective($directive)) {
$this->flagDirectives[$directive] = true;
}
}

foreach (self::INHERIT_DIRECTIVES as $directive) {
if (false !== $this->flagDirectives[$directive]) {
$this->flagDirectives[$directive] = $response->headers->hasCacheControlDirective($directive);
}
}

$age = $response->getAge();
$this->age = max($this->age, $age);

if ($this->willMakeFinalResponseUncacheable($response)) {
$this->isNotCacheableResponseEmbedded = true;

return;
}

$maxAge = $response->headers->hasCacheControlDirective('max-age') ? (int) $response->headers->getCacheControlDirective('max-age') : null;
$sharedMaxAge = $response->headers->hasCacheControlDirective('s-maxage') ? (int) $response->headers->getCacheControlDirective('s-maxage') : $maxAge;
$expires = $response->getExpires();
$expires = null !== $expires ? (int) $expires->format('U') - (int) $response->getDate()->format('U') : null;




$isHeuristicallyCacheable = $response->headers->hasCacheControlDirective('public')
&& null === $maxAge
&& null === $sharedMaxAge
&& null === $expires;

if (!$isHeuristicallyCacheable || null !== $maxAge || null !== $expires) {
$this->storeRelativeAgeDirective('max-age', $maxAge, $expires, $age);
}

if (!$isHeuristicallyCacheable || null !== $sharedMaxAge || null !== $expires) {
$this->storeRelativeAgeDirective('s-maxage', $sharedMaxAge, $expires, $age);
}

if (null !== $expires) {
$this->ageDirectives['expires'] = true;
}

if (false !== $this->lastModified) {
$lastModified = $response->getLastModified();
$this->lastModified = $lastModified ? max($this->lastModified, $lastModified) : false;
}
}




public function update(Response $response)
{

if (0 === $this->embeddedResponses) {
return;
}


$response->setEtag(null);

$this->add($response);

$response->headers->set('Age', $this->age);

if ($this->isNotCacheableResponseEmbedded) {
$response->setLastModified(null);

if ($this->flagDirectives['no-store']) {
$response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate');
} else {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
}

return;
}

$response->setLastModified($this->lastModified ?: null);

$flags = array_filter($this->flagDirectives);

if (isset($flags['must-revalidate'])) {
$flags['no-cache'] = true;
}

$response->headers->set('Cache-Control', implode(', ', array_keys($flags)));

$maxAge = null;

if (is_numeric($this->ageDirectives['max-age'])) {
$maxAge = $this->ageDirectives['max-age'] + $this->age;
$response->headers->addCacheControlDirective('max-age', $maxAge);
}

if (is_numeric($this->ageDirectives['s-maxage'])) {
$sMaxage = $this->ageDirectives['s-maxage'] + $this->age;

if ($maxAge !== $sMaxage) {
$response->headers->addCacheControlDirective('s-maxage', $sMaxage);
}
}

if ($this->ageDirectives['expires'] && null !== $maxAge) {
$date = clone $response->getDate();
$date = $date->modify('+'.$maxAge.' seconds');
$response->setExpires($date);
}
}






private function willMakeFinalResponseUncacheable(Response $response): bool
{


if ($response->headers->hasCacheControlDirective('no-cache')
|| $response->headers->hasCacheControlDirective('no-store')
) {
return true;
}



if (null === $response->getEtag() && \in_array($response->getStatusCode(), [200, 203, 300, 301, 410])) {
return false;
}




$cacheControl = ['max-age', 's-maxage', 'must-revalidate', 'proxy-revalidate', 'public', 'private'];
foreach ($cacheControl as $key) {
if ($response->headers->hasCacheControlDirective($key)) {
return false;
}
}

if ($response->headers->has('Expires')) {
return false;
}

return true;
}










private function storeRelativeAgeDirective(string $directive, ?int $value, ?int $expires, int $age): void
{
if (null === $value && null === $expires) {
$this->ageDirectives[$directive] = false;
}

if (false !== $this->ageDirectives[$directive]) {
$value = min($value ?? \PHP_INT_MAX, $expires ?? \PHP_INT_MAX);
$value -= $age;
$this->ageDirectives[$directive] = null !== $this->ageDirectives[$directive] ? min($this->ageDirectives[$directive], $value) : $value;
}
}
}
<?php
















namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\TerminableInterface;






class HttpCache implements HttpKernelInterface, TerminableInterface
{
public const BODY_EVAL_BOUNDARY_LENGTH = 24;

private HttpKernelInterface $kernel;
private StoreInterface $store;
private Request $request;
private ?SurrogateInterface $surrogate;
private ?ResponseCacheStrategyInterface $surrogateCacheStrategy = null;
private array $options = [];
private array $traces = [];



















































public function __construct(HttpKernelInterface $kernel, StoreInterface $store, ?SurrogateInterface $surrogate = null, array $options = [])
{
$this->store = $store;
$this->kernel = $kernel;
$this->surrogate = $surrogate;


register_shutdown_function($this->store->cleanup(...));

$this->options = array_merge([
'debug' => false,
'default_ttl' => 0,
'private_headers' => ['Authorization', 'Cookie'],
'skip_response_headers' => ['Set-Cookie'],
'allow_reload' => false,
'allow_revalidate' => false,
'stale_while_revalidate' => 2,
'stale_if_error' => 60,
'trace_level' => 'none',
'trace_header' => 'X-Symfony-Cache',
'terminate_on_cache_hit' => true,
], $options);

if (!isset($options['trace_level'])) {
$this->options['trace_level'] = $this->options['debug'] ? 'full' : 'none';
}
}




public function getStore(): StoreInterface
{
return $this->store;
}




public function getTraces(): array
{
return $this->traces;
}

private function addTraces(Response $response): void
{
$traceString = null;

if ('full' === $this->options['trace_level']) {
$traceString = $this->getLog();
}

if ('short' === $this->options['trace_level'] && $masterId = array_key_first($this->traces)) {
$traceString = implode('/', $this->traces[$masterId]);
}

if (null !== $traceString) {
$response->headers->add([$this->options['trace_header'] => $traceString]);
}
}




public function getLog(): string
{
$log = [];
foreach ($this->traces as $request => $traces) {
$log[] = \sprintf('%s: %s', $request, implode(', ', $traces));
}

return implode('; ', $log);
}




public function getRequest(): Request
{
return $this->request;
}




public function getKernel(): HttpKernelInterface
{
return $this->kernel;
}






public function getSurrogate(): SurrogateInterface
{
return $this->surrogate;
}

public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
{

if (HttpKernelInterface::MAIN_REQUEST === $type) {
$this->traces = [];




$this->request = clone $request;
if (null !== $this->surrogate) {
$this->surrogateCacheStrategy = $this->surrogate->createCacheStrategy();
}
}

$this->traces[$this->getTraceKey($request)] = [];

if (!$request->isMethodSafe()) {
$response = $this->invalidate($request, $catch);
} elseif ($request->headers->has('expect') || !$request->isMethodCacheable()) {
$response = $this->pass($request, $catch);
} elseif ($this->options['allow_reload'] && $request->isNoCache()) {




$this->record($request, 'reload');
$response = $this->fetch($request, $catch);
} else {
$response = null;
do {
try {
$response = $this->lookup($request, $catch);
} catch (CacheWasLockedException) {
}
} while (null === $response);
}

$this->restoreResponseBody($request, $response);

if (HttpKernelInterface::MAIN_REQUEST === $type) {
$this->addTraces($response);
}

if (null !== $this->surrogate) {
if (HttpKernelInterface::MAIN_REQUEST === $type) {
$this->surrogateCacheStrategy->update($response);
} else {
$this->surrogateCacheStrategy->add($response);
}
}

$response->prepare($request);

if (HttpKernelInterface::MAIN_REQUEST === $type) {
$response->isNotModified($request);
}

return $response;
}




public function terminate(Request $request, Response $response)
{



if ($this->options['terminate_on_cache_hit']) {
trigger_deprecation('symfony/http-kernel', '6.2', 'Setting "terminate_on_cache_hit" to "true" is deprecated and will be changed to "false" in Symfony 7.0.');
} elseif (\in_array('fresh', $this->traces[$this->getTraceKey($request)] ?? [], true)) {
return;
}

if ($this->getKernel() instanceof TerminableInterface) {
$this->getKernel()->terminate($request, $response);
}
}






protected function pass(Request $request, bool $catch = false): Response
{
$this->record($request, 'pass');

return $this->forward($request, $catch);
}










protected function invalidate(Request $request, bool $catch = false): Response
{
$response = $this->pass($request, $catch);


if ($response->isSuccessful() || $response->isRedirect()) {
try {
$this->store->invalidate($request);


foreach (['Location', 'Content-Location'] as $header) {
if ($uri = $response->headers->get($header)) {
$subRequest = Request::create($uri, 'get', [], [], [], $request->server->all());

$this->store->invalidate($subRequest);
}
}

$this->record($request, 'invalidate');
} catch (\Exception $e) {
$this->record($request, 'invalidate-failed');

if ($this->options['debug']) {
throw $e;
}
}
}

return $response;
}














protected function lookup(Request $request, bool $catch = false): Response
{
try {
$entry = $this->store->lookup($request);
} catch (\Exception $e) {
$this->record($request, 'lookup-failed');

if ($this->options['debug']) {
throw $e;
}

return $this->pass($request, $catch);
}

if (null === $entry) {
$this->record($request, 'miss');

return $this->fetch($request, $catch);
}

if (!$this->isFreshEnough($request, $entry)) {
$this->record($request, 'stale');

return $this->validate($request, $entry, $catch);
}

if ($entry->headers->hasCacheControlDirective('no-cache')) {
return $this->validate($request, $entry, $catch);
}

$this->record($request, 'fresh');

$entry->headers->set('Age', $entry->getAge());

return $entry;
}









protected function validate(Request $request, Response $entry, bool $catch = false): Response
{
$subRequest = clone $request;


if ('HEAD' === $request->getMethod()) {
$subRequest->setMethod('GET');
}


if ($entry->headers->has('Last-Modified')) {
$subRequest->headers->set('If-Modified-Since', $entry->headers->get('Last-Modified'));
}




$cachedEtags = $entry->getEtag() ? [$entry->getEtag()] : [];
$requestEtags = $request->getETags();
if ($etags = array_unique(array_merge($cachedEtags, $requestEtags))) {
$subRequest->headers->set('If-None-Match', implode(', ', $etags));
}

$response = $this->forward($subRequest, $catch, $entry);

if (304 == $response->getStatusCode()) {
$this->record($request, 'valid');


$etag = $response->getEtag();
if ($etag && \in_array($etag, $requestEtags) && !\in_array($etag, $cachedEtags)) {
return $response;
}

$entry = clone $entry;
$entry->headers->remove('Date');

foreach (['Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified'] as $name) {
if ($response->headers->has($name)) {
$entry->headers->set($name, $response->headers->get($name));
}
}

$response = $entry;
} else {
$this->record($request, 'invalid');
}

if ($response->isCacheable()) {
$this->store($request, $response);
}

return $response;
}







protected function fetch(Request $request, bool $catch = false): Response
{
$subRequest = clone $request;


if ('HEAD' === $request->getMethod()) {
$subRequest->setMethod('GET');
}


$subRequest->headers->remove('If-Modified-Since');
$subRequest->headers->remove('If-None-Match');

$response = $this->forward($subRequest, $catch);

if ($response->isCacheable()) {
$this->store($request, $response);
}

return $response;
}












protected function forward(Request $request, bool $catch = false, ?Response $entry = null)
{
$this->surrogate?->addSurrogateCapability($request);


$response = SubRequestHandler::handle($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST, $catch);

















if (null !== $entry
&& \in_array($response->getStatusCode(), [500, 502, 503, 504])
&& !$entry->headers->hasCacheControlDirective('no-cache')
&& !$entry->mustRevalidate()
) {
if (null === $age = $entry->headers->getCacheControlDirective('stale-if-error')) {
$age = $this->options['stale_if_error'];
}






if ($entry->getAge() <= $entry->getMaxAge() + $age) {
$this->record($request, 'stale-if-error');

return $entry;
}
}








if (!$response->headers->has('Date')) {
$response->setDate(\DateTimeImmutable::createFromFormat('U', time()));
}

$this->processResponseBody($request, $response);

if ($this->isPrivateRequest($request) && !$response->headers->hasCacheControlDirective('public')) {
$response->setPrivate();
} elseif ($this->options['default_ttl'] > 0 && null === $response->getTtl() && !$response->headers->getCacheControlDirective('must-revalidate')) {
$response->setTtl($this->options['default_ttl']);
}

return $response;
}




protected function isFreshEnough(Request $request, Response $entry): bool
{
if (!$entry->isFresh()) {
return $this->lock($request, $entry);
}

if ($this->options['allow_revalidate'] && null !== $maxAge = $request->headers->getCacheControlDirective('max-age')) {
return $maxAge > 0 && $maxAge >= $entry->getAge();
}

return true;
}






protected function lock(Request $request, Response $entry): bool
{

$lock = $this->store->lock($request);

if (true === $lock) {

return false;
}




if ($this->mayServeStaleWhileRevalidate($entry)) {
$this->record($request, 'stale-while-revalidate');

return true;
}


if ($this->waitForLock($request)) {
throw new CacheWasLockedException(); 
} else {

$entry->setStatusCode(503);
$entry->setContent('503 Service Unavailable');
$entry->headers->set('Retry-After', 10);
}

return true;
}








protected function store(Request $request, Response $response)
{
try {
$restoreHeaders = [];
foreach ($this->options['skip_response_headers'] as $header) {
if (!$response->headers->has($header)) {
continue;
}

$restoreHeaders[$header] = $response->headers->all($header);
$response->headers->remove($header);
}

$this->store->write($request, $response);
$this->record($request, 'store');

$response->headers->set('Age', $response->getAge());
} catch (\Exception $e) {
$this->record($request, 'store-failed');

if ($this->options['debug']) {
throw $e;
}
} finally {
foreach ($restoreHeaders as $header => $values) {
$response->headers->set($header, $values);
}
}


$this->store->unlock($request);
}




private function restoreResponseBody(Request $request, Response $response): void
{
if ($response->headers->has('X-Body-Eval')) {
\assert(self::BODY_EVAL_BOUNDARY_LENGTH === 24);

ob_start();

$content = $response->getContent();
$boundary = substr($content, 0, 24);
$j = strpos($content, $boundary, 24);
echo substr($content, 24, $j - 24);
$i = $j + 24;

while (false !== $j = strpos($content, $boundary, $i)) {
[$uri, $alt, $ignoreErrors, $part] = explode("\n", substr($content, $i, $j - $i), 4);
$i = $j + 24;

echo $this->surrogate->handle($this, $uri, $alt, $ignoreErrors);
echo $part;
}

$response->setContent(ob_get_clean());
$response->headers->remove('X-Body-Eval');
if (!$response->headers->has('Transfer-Encoding')) {
$response->headers->set('Content-Length', \strlen($response->getContent()));
}
} elseif ($response->headers->has('X-Body-File')) {


if (!$request->isMethod('HEAD')) {
$response->setContent(file_get_contents($response->headers->get('X-Body-File')));
}
} else {
return;
}

$response->headers->remove('X-Body-File');
}




protected function processResponseBody(Request $request, Response $response)
{
if ($this->surrogate?->needsParsing($response)) {
$this->surrogate->process($request, $response);
}
}





private function isPrivateRequest(Request $request): bool
{
foreach ($this->options['private_headers'] as $key) {
$key = strtolower(str_replace('HTTP_', '', $key));

if ('cookie' === $key) {
if (\count($request->cookies->all())) {
return true;
}
} elseif ($request->headers->has($key)) {
return true;
}
}

return false;
}




private function record(Request $request, string $event): void
{
$this->traces[$this->getTraceKey($request)][] = $event;
}




private function getTraceKey(Request $request): string
{
$path = $request->getPathInfo();
if ($qs = $request->getQueryString()) {
$path .= '?'.$qs;
}

try {
return $request->getMethod().' '.$path;
} catch (SuspiciousOperationException $e) {
return '_BAD_METHOD_ '.$path;
}
}





private function mayServeStaleWhileRevalidate(Response $entry): bool
{
$timeout = $entry->headers->getCacheControlDirective('stale-while-revalidate');
$timeout ??= $this->options['stale_while_revalidate'];

$age = $entry->getAge();
$maxAge = $entry->getMaxAge() ?? 0;
$ttl = $maxAge - $age;

return abs($ttl) < $timeout;
}




private function waitForLock(Request $request): bool
{
$wait = 0;
while ($this->store->isLocked($request) && $wait < 100) {
usleep(50000);
++$wait;
}

return $wait < 100;
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;








interface KernelInterface extends HttpKernelInterface
{





public function registerBundles(): iterable;






public function registerContainerConfiguration(LoaderInterface $loader);






public function boot();








public function shutdown();






public function getBundles(): array;






public function getBundle(string $name): BundleInterface;
















public function locateResource(string $name): string;




public function getEnvironment(): string;




public function isDebug(): bool;




public function getProjectDir(): string;




public function getContainer(): ContainerInterface;




public function getStartTime(): float;








public function getCacheDir(): string;







public function getBuildDir(): string;




public function getLogDir(): string;




public function getCharset(): string;
}
<?php










namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\Console\Application;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;






abstract class Bundle implements BundleInterface
{
protected $name;
protected $extension;
protected $path;
private string $namespace;




protected $container;




public function boot()
{
}




public function shutdown()
{
}







public function build(ContainerBuilder $container)
{
}






public function getContainerExtension(): ?ExtensionInterface
{
if (!isset($this->extension)) {
$extension = $this->createContainerExtension();

if (null !== $extension) {
if (!$extension instanceof ExtensionInterface) {
throw new \LogicException(\sprintf('Extension "%s" must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', get_debug_type($extension)));
}


$basename = preg_replace('/Bundle$/', '', $this->getName());
$expectedAlias = Container::underscore($basename);

if ($expectedAlias != $extension->getAlias()) {
throw new \LogicException(\sprintf('Users will expect the alias of the default extension of a bundle to be the underscored version of the bundle name ("%s"). You can override "Bundle::getContainerExtension()" if you want to use "%s" or another alias.', $expectedAlias, $extension->getAlias()));
}

$this->extension = $extension;
} else {
$this->extension = false;
}
}

return $this->extension ?: null;
}

public function getNamespace(): string
{
if (!isset($this->namespace)) {
$this->parseClassName();
}

return $this->namespace;
}

public function getPath(): string
{
if (!isset($this->path)) {
$reflected = new \ReflectionObject($this);
$this->path = \dirname($reflected->getFileName());
}

return $this->path;
}




final public function getName(): string
{
if (!isset($this->name)) {
$this->parseClassName();
}

return $this->name;
}




public function registerCommands(Application $application)
{
}




protected function getContainerExtensionClass(): string
{
$basename = preg_replace('/Bundle$/', '', $this->getName());

return $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension';
}




protected function createContainerExtension(): ?ExtensionInterface
{
return class_exists($class = $this->getContainerExtensionClass()) ? new $class() : null;
}

private function parseClassName(): void
{
$pos = strrpos(static::class, '\\');
$this->namespace = false === $pos ? '' : substr(static::class, 0, $pos);
$this->name ??= false === $pos ? static::class : substr(static::class, $pos + 1);
}

public function setContainer(?ContainerInterface $container): void
{
$this->container = $container;
}
}
<?php










namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\ConfigurableExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;






abstract class AbstractBundle extends Bundle implements ConfigurableExtensionInterface
{
protected string $extensionAlias = '';

public function configure(DefinitionConfigurator $definition): void
{
}

public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
{
}

public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
}

public function getContainerExtension(): ?ExtensionInterface
{
if ('' === $this->extensionAlias) {
$this->extensionAlias = Container::underscore(preg_replace('/Bundle$/', '', $this->getName()));
}

return $this->extension ??= new BundleExtension($this, $this->extensionAlias);
}

public function getPath(): string
{
if (null === $this->path) {
$reflected = new \ReflectionObject($this);

$this->path = \dirname($reflected->getFileName(), 2);
}

return $this->path;
}
}
<?php










namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;






interface BundleInterface
{





public function boot();






public function shutdown();








public function build(ContainerBuilder $container);




public function getContainerExtension(): ?ExtensionInterface;




public function getName(): string;




public function getNamespace(): string;






public function getPath(): string;




public function setContainer(?ContainerInterface $container);
}
<?php










namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\Config\Definition\Configuration;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\ConfigurableExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Extension\ExtensionTrait;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;






class BundleExtension extends Extension implements PrependExtensionInterface
{
use ExtensionTrait;

public function __construct(
private ConfigurableExtensionInterface $subject,
private string $alias,
) {
}

public function getConfiguration(array $config, ContainerBuilder $container): ?ConfigurationInterface
{
return new Configuration($this->subject, $container, $this->getAlias());
}

public function getAlias(): string
{
return $this->alias;
}

public function prepend(ContainerBuilder $container): void
{
$callback = function (ContainerConfigurator $configurator) use ($container) {
$this->subject->prependExtension($configurator, $container);
};

$this->executeConfiguratorCallback($container, $callback, $this->subject);
}

public function load(array $configs, ContainerBuilder $container): void
{
$config = $this->processConfiguration($this->getConfiguration([], $container), $configs);

$callback = function (ContainerConfigurator $configurator) use ($config, $container) {
$this->subject->loadExtension($config, $configurator, $container);
};

$this->executeConfiguratorCallback($container, $callback, $this->subject);
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpFoundation\Session\SessionInterface;








class SessionListener extends AbstractSessionListener
{
protected function getSession(): ?SessionInterface
{
if ($this->container->has('session_factory')) {
return $this->container->get('session_factory')->createSession();
}

return null;
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Attribute\Cache;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;






class CacheAttributeListener implements EventSubscriberInterface
{



private \SplObjectStorage $lastModified;




private \SplObjectStorage $etags;

public function __construct(
private ?ExpressionLanguage $expressionLanguage = null,
) {
$this->lastModified = new \SplObjectStorage();
$this->etags = new \SplObjectStorage();
}






public function onKernelControllerArguments(ControllerArgumentsEvent $event)
{
$request = $event->getRequest();

if (!\is_array($attributes = $request->attributes->get('_cache') ?? $event->getAttributes()[Cache::class] ?? null)) {
return;
}

$request->attributes->set('_cache', $attributes);
$response = null;
$lastModified = null;
$etag = null;


foreach ($attributes as $cache) {
if (null !== $cache->lastModified) {
$lastModified = $this->getExpressionLanguage()->evaluate($cache->lastModified, array_merge($request->attributes->all(), $event->getNamedArguments()));
($response ??= new Response())->setLastModified($lastModified);
}

if (null !== $cache->etag) {
$etag = hash('sha256', $this->getExpressionLanguage()->evaluate($cache->etag, array_merge($request->attributes->all(), $event->getNamedArguments())));
($response ??= new Response())->setEtag($etag);
}
}

if ($response?->isNotModified($request)) {
$event->setController(static fn () => $response);
$event->stopPropagation();

return;
}

if (null !== $etag) {
$this->etags[$request] = $etag;
}
if (null !== $lastModified) {
$this->lastModified[$request] = $lastModified;
}
}






public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();


if (!\is_array($attributes = $request->attributes->get('_cache'))) {
return;
}
$response = $event->getResponse();


if (!\in_array($response->getStatusCode(), [200, 203, 300, 301, 302, 304, 404, 410])) {
unset($this->lastModified[$request]);
unset($this->etags[$request]);

return;
}

if (isset($this->lastModified[$request]) && !$response->headers->has('Last-Modified')) {
$response->setLastModified($this->lastModified[$request]);
}

if (isset($this->etags[$request]) && !$response->headers->has('Etag')) {
$response->setEtag($this->etags[$request]);
}

unset($this->lastModified[$request]);
unset($this->etags[$request]);


$hasVary = ['Accept-Language'] === $response->getVary() ? !$request->attributes->get('_vary_by_language') : $response->hasVary();

foreach (array_reverse($attributes) as $cache) {
if (null !== $cache->smaxage && !$response->headers->hasCacheControlDirective('s-maxage')) {
$response->setSharedMaxAge($this->toSeconds($cache->smaxage));
}

if ($cache->mustRevalidate) {
$response->headers->addCacheControlDirective('must-revalidate');
}

if (null !== $cache->maxage && !$response->headers->hasCacheControlDirective('max-age')) {
$response->setMaxAge($this->toSeconds($cache->maxage));
}

if (null !== $cache->maxStale && !$response->headers->hasCacheControlDirective('max-stale')) {
$response->headers->addCacheControlDirective('max-stale', $this->toSeconds($cache->maxStale));
}

if (null !== $cache->staleWhileRevalidate && !$response->headers->hasCacheControlDirective('stale-while-revalidate')) {
$response->headers->addCacheControlDirective('stale-while-revalidate', $this->toSeconds($cache->staleWhileRevalidate));
}

if (null !== $cache->staleIfError && !$response->headers->hasCacheControlDirective('stale-if-error')) {
$response->headers->addCacheControlDirective('stale-if-error', $this->toSeconds($cache->staleIfError));
}

if (null !== $cache->expires && !$response->headers->has('Expires')) {
$response->setExpires(new \DateTimeImmutable('@'.strtotime($cache->expires, time())));
}

if (!$hasVary && $cache->vary) {
$response->setVary($cache->vary, false);
}
}

foreach ($attributes as $cache) {
if (true === $cache->public) {
$response->setPublic();
}

if (false === $cache->public) {
$response->setPrivate();
}
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER_ARGUMENTS => ['onKernelControllerArguments', 10],
KernelEvents::RESPONSE => ['onKernelResponse', -10],
];
}

private function getExpressionLanguage(): ExpressionLanguage
{
return $this->expressionLanguage ??= class_exists(ExpressionLanguage::class)
? new ExpressionLanguage()
: throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".');
}

private function toSeconds(int|string $time): int
{
if (!is_numeric($time)) {
$now = time();
$time = strtotime($time, $now) - $now;
}

return $time;
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;








class ValidateRequestListener implements EventSubscriberInterface
{



public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();

if ($request::getTrustedProxies()) {
$request->getClientIps();
}

$request->getHost();
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [
['onKernelRequest', 256],
],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
use Symfony\Component\ErrorHandler\ErrorHandler;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\WithHttpStatus;
use Symfony\Component\HttpKernel\Attribute\WithLogLevel;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Log\DebugLoggerConfigurator;




class ErrorListener implements EventSubscriberInterface
{
protected $controller;
protected $logger;
protected $debug;



protected $exceptionsMapping;




public function __construct(string|object|array|null $controller, ?LoggerInterface $logger = null, bool $debug = false, array $exceptionsMapping = [])
{
$this->controller = $controller;
$this->logger = $logger;
$this->debug = $debug;
$this->exceptionsMapping = $exceptionsMapping;
}




public function logKernelException(ExceptionEvent $event)
{
$throwable = $event->getThrowable();
$logLevel = $this->resolveLogLevel($throwable);

foreach ($this->exceptionsMapping as $class => $config) {
if (!$throwable instanceof $class || !$config['status_code']) {
continue;
}
if (!$throwable instanceof HttpExceptionInterface || $throwable->getStatusCode() !== $config['status_code']) {
$headers = $throwable instanceof HttpExceptionInterface ? $throwable->getHeaders() : [];
$throwable = new HttpException($config['status_code'], $throwable->getMessage(), $throwable, $headers);
$event->setThrowable($throwable);
}
break;
}


if (!$throwable instanceof HttpExceptionInterface) {
$class = new \ReflectionClass($throwable);

do {
if ($attributes = $class->getAttributes(WithHttpStatus::class, \ReflectionAttribute::IS_INSTANCEOF)) {

$instance = $attributes[0]->newInstance();

$throwable = new HttpException($instance->statusCode, $throwable->getMessage(), $throwable, $instance->headers);
$event->setThrowable($throwable);
break;
}
} while ($class = $class->getParentClass());
}

$e = FlattenException::createFromThrowable($throwable);

$this->logException($throwable, \sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', $e->getClass(), $e->getMessage(), basename($e->getFile()), $e->getLine()), $logLevel);
}




public function onKernelException(ExceptionEvent $event)
{
if (null === $this->controller) {
return;
}

$throwable = $event->getThrowable();

$exceptionHandler = set_exception_handler('var_dump');
restore_exception_handler();

if (\is_array($exceptionHandler) && $exceptionHandler[0] instanceof ErrorHandler) {
$throwable = $exceptionHandler[0]->enhanceError($event->getThrowable());
}

$request = $this->duplicateRequest($throwable, $event->getRequest());

try {
$response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, false);
} catch (\Exception $e) {
$f = FlattenException::createFromThrowable($e);

$this->logException($e, \sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', $f->getClass(), $f->getMessage(), basename($e->getFile()), $e->getLine()));

$prev = $e;
do {
if ($throwable === $wrapper = $prev) {
throw $e;
}
} while ($prev = $wrapper->getPrevious());

$prev = new \ReflectionProperty($wrapper instanceof \Exception ? \Exception::class : \Error::class, 'previous');
$prev->setValue($wrapper, $throwable);

throw $e;
}

$event->setResponse($response);

if ($this->debug) {
$event->getRequest()->attributes->set('_remove_csp_headers', true);
}
}

public function removeCspHeader(ResponseEvent $event): void
{
if ($this->debug && $event->getRequest()->attributes->get('_remove_csp_headers', false)) {
$event->getResponse()->headers->remove('Content-Security-Policy');
}
}




public function onControllerArguments(ControllerArgumentsEvent $event)
{
$e = $event->getRequest()->attributes->get('exception');

if (!$e instanceof \Throwable || false === $k = array_search($e, $event->getArguments(), true)) {
return;
}

$r = new \ReflectionFunction($event->getController()(...));
$r = $r->getParameters()[$k] ?? null;

if ($r && (!($r = $r->getType()) instanceof \ReflectionNamedType || FlattenException::class === $r->getName())) {
$arguments = $event->getArguments();
$arguments[$k] = FlattenException::createFromThrowable($e);
$event->setArguments($arguments);
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER_ARGUMENTS => 'onControllerArguments',
KernelEvents::EXCEPTION => [
['logKernelException', 0],
['onKernelException', -128],
],
KernelEvents::RESPONSE => ['removeCspHeader', -128],
];
}




protected function logException(\Throwable $exception, string $message, ?string $logLevel = null): void
{
if (null === $this->logger) {
return;
}

$logLevel ??= $this->resolveLogLevel($exception);

$this->logger->log($logLevel, $message, ['exception' => $exception]);
}




private function resolveLogLevel(\Throwable $throwable): string
{
foreach ($this->exceptionsMapping as $class => $config) {
if ($throwable instanceof $class && $config['log_level']) {
return $config['log_level'];
}
}

$class = new \ReflectionClass($throwable);

do {
if ($attributes = $class->getAttributes(WithLogLevel::class)) {

$instance = $attributes[0]->newInstance();

return $instance->level;
}
} while ($class = $class->getParentClass());

if (!$throwable instanceof HttpExceptionInterface || $throwable->getStatusCode() >= 500) {
return LogLevel::CRITICAL;
}

return LogLevel::ERROR;
}




protected function duplicateRequest(\Throwable $exception, Request $request): Request
{
$attributes = [
'_controller' => $this->controller,
'exception' => $exception,
'logger' => DebugLoggerConfigurator::getDebugLogger($this->logger),
];
$request = $request->duplicate(null, null, $attributes);
$request->setMethod('GET');

return $request;
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\HttpCache\HttpCache;
use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface;
use Symfony\Component\HttpKernel\KernelEvents;








class SurrogateListener implements EventSubscriberInterface
{
private ?SurrogateInterface $surrogate;

public function __construct(?SurrogateInterface $surrogate = null)
{
$this->surrogate = $surrogate;
}




public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

$kernel = $event->getKernel();
$surrogate = $this->surrogate;
if ($kernel instanceof HttpCache) {
$surrogate = $kernel->getSurrogate();
if (null !== $this->surrogate && $this->surrogate->getName() !== $surrogate->getName()) {
$surrogate = $this->surrogate;
}
}

if (null === $surrogate) {
return;
}

$surrogate->addSurrogateControl($event->getResponse());
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleEvent;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\ErrorHandler\ErrorHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\KernelEvents;










class DebugHandlersListener implements EventSubscriberInterface
{
private string|object|null $earlyHandler;
private ?\Closure $exceptionHandler;
private bool $webMode;
private bool $firstCall = true;
private bool $hasTerminatedWithException = false;





public function __construct(?callable $exceptionHandler = null, bool|LoggerInterface|null $webMode = null)
{
if ($webMode instanceof LoggerInterface) {

$webMode = null;
}

$handler = set_exception_handler('var_dump');
$this->earlyHandler = \is_array($handler) ? $handler[0] : null;
restore_exception_handler();

$this->exceptionHandler = null === $exceptionHandler ? null : $exceptionHandler(...);
$this->webMode = $webMode ?? !\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true);
}




public function configure(?object $event = null): void
{
if ($event instanceof ConsoleEvent && $this->webMode) {
return;
}
if (!$event instanceof KernelEvent ? !$this->firstCall : !$event->isMainRequest()) {
return;
}
$this->firstCall = $this->hasTerminatedWithException = false;
$hasRun = null;

if (!$this->exceptionHandler) {
if ($event instanceof KernelEvent) {
if (method_exists($kernel = $event->getKernel(), 'terminateWithException')) {
$request = $event->getRequest();
$hasRun = &$this->hasTerminatedWithException;
$this->exceptionHandler = static function (\Throwable $e) use ($kernel, $request, &$hasRun) {
if ($hasRun) {
throw $e;
}

$hasRun = true;
$kernel->terminateWithException($e, $request);
};
}
} elseif ($event instanceof ConsoleEvent && $app = $event->getCommand()->getApplication()) {
$output = $event->getOutput();
if ($output instanceof ConsoleOutputInterface) {
$output = $output->getErrorOutput();
}
$this->exceptionHandler = static function (\Throwable $e) use ($app, $output) {
$app->renderThrowable($e, $output);
};
}
}
if ($this->exceptionHandler) {
$handler = set_exception_handler('var_dump');
$handler = \is_array($handler) ? $handler[0] : null;
restore_exception_handler();

if (!$handler instanceof ErrorHandler) {
$handler = $this->earlyHandler;
}

if ($handler instanceof ErrorHandler) {
$handler->setExceptionHandler($this->exceptionHandler);
if (null !== $hasRun) {
$throwAt = $handler->throwAt(0) | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR | \E_USER_ERROR | \E_RECOVERABLE_ERROR | \E_PARSE;
$loggers = [];

foreach ($handler->setLoggers([]) as $type => $log) {
if ($type & $throwAt) {
$loggers[$type] = [null, $log[1]];
}
}


$handler->setLoggers($loggers);
}
}
$this->exceptionHandler = null;
}
}

public static function getSubscribedEvents(): array
{
$events = [KernelEvents::REQUEST => ['configure', 2048]];

if (\defined('Symfony\Component\Console\ConsoleEvents::COMMAND')) {
$events[ConsoleEvents::COMMAND] = ['configure', 2048];
}

return $events;
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RequestContextAwareInterface;








class LocaleListener implements EventSubscriberInterface
{
private ?RequestContextAwareInterface $router;
private string $defaultLocale;
private RequestStack $requestStack;
private bool $useAcceptLanguageHeader;
private array $enabledLocales;

public function __construct(RequestStack $requestStack, string $defaultLocale = 'en', ?RequestContextAwareInterface $router = null, bool $useAcceptLanguageHeader = false, array $enabledLocales = [])
{
$this->defaultLocale = $defaultLocale;
$this->requestStack = $requestStack;
$this->router = $router;
$this->useAcceptLanguageHeader = $useAcceptLanguageHeader;
$this->enabledLocales = $enabledLocales;
}

public function setDefaultLocale(KernelEvent $event): void
{
$event->getRequest()->setDefaultLocale($this->defaultLocale);
}

public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();

$this->setLocale($request);
$this->setRouterContext($request);
}

public function onKernelFinishRequest(FinishRequestEvent $event): void
{
if (null !== $parentRequest = $this->requestStack->getParentRequest()) {
$this->setRouterContext($parentRequest);
}
}

private function setLocale(Request $request): void
{
if ($locale = $request->attributes->get('_locale')) {
$request->setLocale($locale);
} elseif ($this->useAcceptLanguageHeader) {
if ($request->getLanguages() && $preferredLanguage = $request->getPreferredLanguage($this->enabledLocales)) {
$request->setLocale($preferredLanguage);
}
$request->attributes->set('_vary_by_language', true);
}
}

private function setRouterContext(Request $request): void
{
$this->router?->getContext()->setParameter('_locale', $request->getLocale());
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [
['setDefaultLocale', 100],

['onKernelRequest', 16],
],
KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', 0]],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\NoConfigurationException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RequestContextAwareInterface;









class RouterListener implements EventSubscriberInterface
{
private RequestMatcherInterface|UrlMatcherInterface $matcher;
private RequestContext $context;
private ?LoggerInterface $logger;
private RequestStack $requestStack;
private ?string $projectDir;
private bool $debug;






public function __construct(UrlMatcherInterface|RequestMatcherInterface $matcher, RequestStack $requestStack, ?RequestContext $context = null, ?LoggerInterface $logger = null, ?string $projectDir = null, bool $debug = true)
{
if (null === $context && !$matcher instanceof RequestContextAwareInterface) {
throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.');
}

$this->matcher = $matcher;
$this->context = $context ?? $matcher->getContext();
$this->requestStack = $requestStack;
$this->logger = $logger;
$this->projectDir = $projectDir;
$this->debug = $debug;
}

private function setCurrentRequest(?Request $request): void
{
if (null !== $request) {
try {
$this->context->fromRequest($request);
} catch (\UnexpectedValueException $e) {
throw new BadRequestHttpException($e->getMessage(), $e, $e->getCode());
}
}
}





public function onKernelFinishRequest(): void
{
$this->setCurrentRequest($this->requestStack->getParentRequest());
}

public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();

$this->setCurrentRequest($request);

if ($request->attributes->has('_controller')) {

return;
}


try {

if ($this->matcher instanceof RequestMatcherInterface) {
$parameters = $this->matcher->matchRequest($request);
} else {
$parameters = $this->matcher->match($request->getPathInfo());
}

$this->logger?->info('Matched route "{route}".', [
'route' => $parameters['_route'] ?? 'n/a',
'route_parameters' => $parameters,
'request_uri' => $request->getUri(),
'method' => $request->getMethod(),
]);

$request->attributes->add($parameters);
unset($parameters['_route'], $parameters['_controller']);
$request->attributes->set('_route_params', $parameters);
} catch (ResourceNotFoundException $e) {
$message = \sprintf('No route found for "%s %s"', $request->getMethod(), $request->getUriForPath($request->getPathInfo()));

if ($referer = $request->headers->get('referer')) {
$message .= \sprintf(' (from "%s")', $referer);
}

throw new NotFoundHttpException($message, $e);
} catch (MethodNotAllowedException $e) {
$message = \sprintf('No route found for "%s %s": Method Not Allowed (Allow: %s)', $request->getMethod(), $request->getUriForPath($request->getPathInfo()), implode(', ', $e->getAllowedMethods()));

throw new MethodNotAllowedHttpException($e->getAllowedMethods(), $message, $e);
}
}

public function onKernelException(ExceptionEvent $event): void
{
if (!$this->debug || !($e = $event->getThrowable()) instanceof NotFoundHttpException) {
return;
}

if ($e->getPrevious() instanceof NoConfigurationException) {
$event->setResponse($this->createWelcomeResponse());
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 32]],
KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', 0]],
KernelEvents::EXCEPTION => ['onKernelException', -64],
];
}

private function createWelcomeResponse(): Response
{
$version = Kernel::VERSION;
$projectDir = realpath((string) $this->projectDir).\DIRECTORY_SEPARATOR;
$docVersion = substr(Kernel::VERSION, 0, 3);

ob_start();
include \dirname(__DIR__).'/Resources/welcome.html.php';

return new Response(ob_get_clean(), Response::HTTP_NOT_FOUND);
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;






class DisallowRobotsIndexingListener implements EventSubscriberInterface
{
private const HEADER_NAME = 'X-Robots-Tag';

public function onResponse(ResponseEvent $event): void
{
if (!$event->getResponse()->headers->has(static::HEADER_NAME)) {
$event->getResponse()->headers->set(static::HEADER_NAME, 'noindex');
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['onResponse', -255],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\UriSigner;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelEvents;














class FragmentListener implements EventSubscriberInterface
{
private UriSigner $signer;
private string $fragmentPath;




public function __construct(UriSigner $signer, string $fragmentPath = '/_fragment')
{
$this->signer = $signer;
$this->fragmentPath = $fragmentPath;
}






public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();

if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) {
return;
}

if ($request->attributes->has('_controller')) {

$request->query->remove('_path');

return;
}

if ($event->isMainRequest()) {
$this->validateRequest($request);
}

parse_str($request->query->get('_path', ''), $attributes);
$attributes['_check_controller_is_allowed'] = -1; 
$request->attributes->add($attributes);
$request->attributes->set('_route_params', array_replace($request->attributes->get('_route_params', []), $attributes));
$request->query->remove('_path');
}

protected function validateRequest(Request $request): void
{

if (!$request->isMethodSafe()) {
throw new AccessDeniedHttpException();
}


if ($this->signer->checkRequest($request)) {
return;
}

throw new AccessDeniedHttpException();
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 48]],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Contracts\Translation\LocaleAwareInterface;






class LocaleAwareListener implements EventSubscriberInterface
{
private iterable $localeAwareServices;
private RequestStack $requestStack;




public function __construct(iterable $localeAwareServices, RequestStack $requestStack)
{
$this->localeAwareServices = $localeAwareServices;
$this->requestStack = $requestStack;
}

public function onKernelRequest(RequestEvent $event): void
{
$this->setLocale($event->getRequest()->getLocale(), $event->getRequest()->getDefaultLocale());
}

public function onKernelFinishRequest(FinishRequestEvent $event): void
{
if (null === $parentRequest = $this->requestStack->getParentRequest()) {
foreach ($this->localeAwareServices as $service) {
$service->setLocale($event->getRequest()->getDefaultLocale());
}

return;
}

$this->setLocale($parentRequest->getLocale(), $parentRequest->getDefaultLocale());
}

public static function getSubscribedEvents(): array
{
return [

KernelEvents::REQUEST => [['onKernelRequest', 15]],
KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', -15]],
];
}

private function setLocale(string $locale, string $defaultLocale): void
{
foreach ($this->localeAwareServices as $service) {
try {
$service->setLocale($locale);
} catch (\InvalidArgumentException) {
$service->setLocale($defaultLocale);
}
}
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

trigger_deprecation('symfony/http-kernel', '6.1', 'The "%s" class is deprecated.', StreamedResponseListener::class);











class StreamedResponseListener implements EventSubscriberInterface
{



public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

$response = $event->getResponse();

if ($response instanceof StreamedResponse) {
$response->send();
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['onKernelResponse', -1024],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;








class ResponseListener implements EventSubscriberInterface
{
private string $charset;
private bool $addContentLanguageHeader;

public function __construct(string $charset, bool $addContentLanguageHeader = false)
{
$this->charset = $charset;
$this->addContentLanguageHeader = $addContentLanguageHeader;
}




public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

$response = $event->getResponse();

if (null === $response->getCharset()) {
$response->setCharset($this->charset);
}

if ($this->addContentLanguageHeader && !$response->isInformational() && !$response->isEmpty() && !$response->headers->has('Content-Language')) {
$response->headers->set('Content-Language', $event->getRequest()->getLocale());
}

if ($event->getRequest()->attributes->get('_vary_by_language')) {
$response->setVary('Accept-Language', false);
}

$response->prepare($event->getRequest());
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Profiler\Profile;
use Symfony\Component\HttpKernel\Profiler\Profiler;








class ProfilerListener implements EventSubscriberInterface
{
private Profiler $profiler;
private ?RequestMatcherInterface $matcher;
private bool $onlyException;
private bool $onlyMainRequests;
private ?\Throwable $exception = null;

private \SplObjectStorage $profiles;
private RequestStack $requestStack;
private ?string $collectParameter;

private \SplObjectStorage $parents;





public function __construct(Profiler $profiler, RequestStack $requestStack, ?RequestMatcherInterface $matcher = null, bool $onlyException = false, bool $onlyMainRequests = false, ?string $collectParameter = null)
{
$this->profiler = $profiler;
$this->matcher = $matcher;
$this->onlyException = $onlyException;
$this->onlyMainRequests = $onlyMainRequests;
$this->profiles = new \SplObjectStorage();
$this->parents = new \SplObjectStorage();
$this->requestStack = $requestStack;
$this->collectParameter = $collectParameter;
}




public function onKernelException(ExceptionEvent $event): void
{
if ($this->onlyMainRequests && !$event->isMainRequest()) {
return;
}

$this->exception = $event->getThrowable();
}




public function onKernelResponse(ResponseEvent $event): void
{
if ($this->onlyMainRequests && !$event->isMainRequest()) {
return;
}

if ($this->onlyException && null === $this->exception) {
return;
}

$request = $event->getRequest();
if (null !== $this->collectParameter && null !== $collectParameterValue = $request->get($this->collectParameter)) {
true === $collectParameterValue || filter_var($collectParameterValue, \FILTER_VALIDATE_BOOL) ? $this->profiler->enable() : $this->profiler->disable();
}

$exception = $this->exception;
$this->exception = null;

if (null !== $this->matcher && !$this->matcher->matches($request)) {
return;
}

$session = !$request->attributes->getBoolean('_stateless') && $request->hasPreviousSession() ? $request->getSession() : null;

if ($session instanceof Session) {
$usageIndexValue = $usageIndexReference = &$session->getUsageIndex();
$usageIndexReference = \PHP_INT_MIN;
}

try {
if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) {
return;
}
} finally {
if ($session instanceof Session) {
$usageIndexReference = $usageIndexValue;
}
}

$this->profiles[$request] = $profile;

$this->parents[$request] = $this->requestStack->getParentRequest();
}

public function onKernelTerminate(TerminateEvent $event): void
{

foreach ($this->profiles as $request) {
if (null !== $parentRequest = $this->parents[$request]) {
if (isset($this->profiles[$parentRequest])) {
$this->profiles[$parentRequest]->addChild($this->profiles[$request]);
}
}
}


foreach ($this->profiles as $request) {
$this->profiler->saveProfile($this->profiles[$request]);
}

$this->profiles = new \SplObjectStorage();
$this->parents = new \SplObjectStorage();
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['onKernelResponse', -100],
KernelEvents::EXCEPTION => ['onKernelException', 0],
KernelEvents::TERMINATE => ['onKernelTerminate', -1024],
];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Container\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Session\SessionUtils;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Exception\UnexpectedSessionUsageException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Contracts\Service\ResetInterface;














abstract class AbstractSessionListener implements EventSubscriberInterface, ResetInterface
{
public const NO_AUTO_CACHE_CONTROL_HEADER = 'Symfony-Session-NoAutoCacheControl';




protected ?ContainerInterface $container;

private bool $debug;




private array $sessionOptions;




public function __construct(?ContainerInterface $container = null, bool $debug = false, array $sessionOptions = [])
{
$this->container = $container;
$this->debug = $debug;
$this->sessionOptions = $sessionOptions;
}




public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

$request = $event->getRequest();
if (!$request->hasSession()) {
$request->setSessionFactory(function () use ($request) {

static $sess;

if (!$sess) {
$sess = $this->getSession();
$request->setSession($sess);







if ($sess && !$sess->isStarted() && \PHP_SESSION_ACTIVE !== session_status()) {
$sessionId = $sess->getId() ?: $request->cookies->get($sess->getName(), '');
$sess->setId($sessionId);
}
}

return $sess;
});
}
}




public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest() || (!$this->container->has('initialized_session') && !$event->getRequest()->hasSession())) {
return;
}

$response = $event->getResponse();
$autoCacheControl = !$response->headers->has(self::NO_AUTO_CACHE_CONTROL_HEADER);

$response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER);
if (!$event->getRequest()->hasSession(true)) {
return;
}
$session = $event->getRequest()->getSession();

if ($session->isStarted()) {

























$session->save();





$sessionName = $session->getName();
$sessionId = $session->getId();
$sessionOptions = $this->getSessionOptions($this->sessionOptions);
$sessionCookiePath = $sessionOptions['cookie_path'] ?? '/';
$sessionCookieDomain = $sessionOptions['cookie_domain'] ?? null;
$sessionCookieSecure = $sessionOptions['cookie_secure'] ?? false;
$sessionCookieHttpOnly = $sessionOptions['cookie_httponly'] ?? true;
$sessionCookieSameSite = $sessionOptions['cookie_samesite'] ?? Cookie::SAMESITE_LAX;
$sessionUseCookies = $sessionOptions['use_cookies'] ?? true;

SessionUtils::popSessionCookie($sessionName, $sessionId);

if ($sessionUseCookies) {
$request = $event->getRequest();
$requestSessionCookieId = $request->cookies->get($sessionName);

$isSessionEmpty = ($session instanceof Session ? $session->isEmpty() : !$session->all()) && empty($_SESSION); 
if ($requestSessionCookieId && $isSessionEmpty) {




SessionUtils::popSessionCookie($sessionName, 'deleted');
$response->headers->clearCookie(
$sessionName,
$sessionCookiePath,
$sessionCookieDomain,
$sessionCookieSecure,
$sessionCookieHttpOnly,
$sessionCookieSameSite
);
} elseif ($sessionId !== $requestSessionCookieId && !$isSessionEmpty) {
$expire = 0;
$lifetime = $sessionOptions['cookie_lifetime'] ?? null;
if ($lifetime) {
$expire = time() + $lifetime;
}

$response->headers->setCookie(
Cookie::create(
$sessionName,
$sessionId,
$expire,
$sessionCookiePath,
$sessionCookieDomain,
$sessionCookieSecure,
$sessionCookieHttpOnly,
false,
$sessionCookieSameSite
)
);
}
}
}

if ($session instanceof Session ? 0 === $session->getUsageIndex() : !$session->isStarted()) {
return;
}

if ($autoCacheControl) {
$maxAge = $response->headers->hasCacheControlDirective('public') ? 0 : (int) $response->getMaxAge();
$response
->setExpires(new \DateTimeImmutable('+'.$maxAge.' seconds'))
->setPrivate()
->setMaxAge($maxAge)
->headers->addCacheControlDirective('must-revalidate');
}

if (!$event->getRequest()->attributes->get('_stateless', false)) {
return;
}

if ($this->debug) {
throw new UnexpectedSessionUsageException('Session was used while the request was declared stateless.');
}

if ($this->container->has('logger')) {
$this->container->get('logger')->warning('Session was used while the request was declared stateless.');
}
}




public function onSessionUsage(): void
{
if (!$this->debug) {
return;
}

if ($this->container?->has('session_collector')) {
$this->container->get('session_collector')();
}

if (!$requestStack = $this->container?->has('request_stack') ? $this->container->get('request_stack') : null) {
return;
}

$stateless = false;
$clonedRequestStack = clone $requestStack;
while (null !== ($request = $clonedRequestStack->pop()) && !$stateless) {
$stateless = $request->attributes->get('_stateless');
}

if (!$stateless) {
return;
}

if (!$session = $requestStack->getCurrentRequest()->getSession()) {
return;
}

if ($session->isStarted()) {
$session->save();
}

throw new UnexpectedSessionUsageException('Session was used while the request was declared stateless.');
}




public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 128],

KernelEvents::RESPONSE => ['onKernelResponse', -1000],
];
}




public function reset(): void
{
if (\PHP_SESSION_ACTIVE === session_status()) {
session_abort();
}

session_unset();
$_SESSION = [];

if (!headers_sent()) { 
session_id('');
}
}






abstract protected function getSession(): ?SessionInterface;

private function getSessionOptions(array $sessionOptions): array
{
$mergedSessionOptions = [];

foreach (session_get_cookie_params() as $key => $value) {
$mergedSessionOptions['cookie_'.$key] = $value;
}

foreach ($sessionOptions as $key => $value) {

if ('cookie_secure' === $key && 'auto' === $value) {
continue;
}
$mergedSessionOptions[$key] = $value;
}

return $mergedSessionOptions;
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;








class AddRequestFormatsListener implements EventSubscriberInterface
{
private array $formats;

public function __construct(array $formats)
{
$this->formats = $formats;
}




public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
foreach ($this->formats as $format => $mimeTypes) {
$request->setFormat($format, $mimeTypes);
}
}

public static function getSubscribedEvents(): array
{
return [KernelEvents::REQUEST => ['onKernelRequest', 100]];
}
}
<?php










namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
use Symfony\Component\VarDumper\Server\Connection;
use Symfony\Component\VarDumper\VarDumper;






class DumpListener implements EventSubscriberInterface
{
private ClonerInterface $cloner;
private DataDumperInterface $dumper;
private ?Connection $connection;

public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper, ?Connection $connection = null)
{
$this->cloner = $cloner;
$this->dumper = $dumper;
$this->connection = $connection;
}




public function configure()
{
$cloner = $this->cloner;
$dumper = $this->dumper;
$connection = $this->connection;

VarDumper::setHandler(static function ($var, ?string $label = null) use ($cloner, $dumper, $connection) {
$data = $cloner->cloneVar($var);
if (null !== $label) {
$data = $data->withContext(['label' => $label]);
}

if (!$connection || !$connection->write($data)) {
$dumper->dump($data);
}
});
}

public static function getSubscribedEvents(): array
{
if (!class_exists(ConsoleEvents::class)) {
return [];
}


return [ConsoleEvents::COMMAND => ['configure', 1024]];
}
}
<?php










namespace Symfony\Component\HttpKernel\Profiler;

use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;






class Profile
{
private string $token;




private array $collectors = [];

private ?string $ip = null;
private ?string $method = null;
private ?string $url = null;
private ?int $time = null;
private ?int $statusCode = null;
private ?self $parent = null;
private ?string $virtualType = null;




private array $children = [];

public function __construct(string $token)
{
$this->token = $token;
}




public function setToken(string $token)
{
$this->token = $token;
}




public function getToken(): string
{
return $this->token;
}






public function setParent(self $parent)
{
$this->parent = $parent;
}




public function getParent(): ?self
{
return $this->parent;
}




public function getParentToken(): ?string
{
return $this->parent?->getToken();
}




public function getIp(): ?string
{
return $this->ip;
}




public function setIp(?string $ip)
{
$this->ip = $ip;
}




public function getMethod(): ?string
{
return $this->method;
}




public function setMethod(string $method)
{
$this->method = $method;
}




public function getUrl(): ?string
{
return $this->url;
}




public function setUrl(?string $url)
{
$this->url = $url;
}

public function getTime(): int
{
return $this->time ?? 0;
}




public function setTime(int $time)
{
$this->time = $time;
}




public function setStatusCode(int $statusCode)
{
$this->statusCode = $statusCode;
}

public function getStatusCode(): ?int
{
return $this->statusCode;
}




public function setVirtualType(?string $virtualType): void
{
$this->virtualType = $virtualType;
}




public function getVirtualType(): ?string
{
return $this->virtualType;
}






public function getChildren(): array
{
return $this->children;
}








public function setChildren(array $children)
{
$this->children = [];
foreach ($children as $child) {
$this->addChild($child);
}
}






public function addChild(self $child)
{
$this->children[] = $child;
$child->setParent($this);
}

public function getChildByToken(string $token): ?self
{
foreach ($this->children as $child) {
if ($token === $child->getToken()) {
return $child;
}
}

return null;
}






public function getCollector(string $name): DataCollectorInterface
{
if (!isset($this->collectors[$name])) {
throw new \InvalidArgumentException(\sprintf('Collector "%s" does not exist.', $name));
}

return $this->collectors[$name];
}






public function getCollectors(): array
{
return $this->collectors;
}








public function setCollectors(array $collectors)
{
$this->collectors = [];
foreach ($collectors as $collector) {
$this->addCollector($collector);
}
}






public function addCollector(DataCollectorInterface $collector)
{
$this->collectors[$collector->getName()] = $collector;
}

public function hasCollector(string $name): bool
{
return isset($this->collectors[$name]);
}

public function __sleep(): array
{
return ['token', 'parent', 'children', 'collectors', 'ip', 'method', 'url', 'time', 'statusCode', 'virtualType'];
}
}
<?php










namespace Symfony\Component\HttpKernel\Profiler;






class FileProfilerStorage implements ProfilerStorageInterface
{



private string $folder;








public function __construct(string $dsn)
{
if (!str_starts_with($dsn, 'file:')) {
throw new \RuntimeException(\sprintf('Please check your configuration. You are trying to use FileStorage with an invalid dsn "%s". The expected format is "file:/path/to/the/storage/folder".', $dsn));
}
$this->folder = substr($dsn, 5);

if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) {
throw new \RuntimeException(\sprintf('Unable to create the storage directory (%s).', $this->folder));
}
}




public function find(?string $ip, ?string $url, ?int $limit, ?string $method, ?int $start = null, ?int $end = null, ?string $statusCode = null): array
{
$filter = 7 < \func_num_args() ? func_get_arg(7) : null;
$file = $this->getIndexFilename();

if (!file_exists($file)) {
return [];
}

$file = fopen($file, 'r');
fseek($file, 0, \SEEK_END);

$result = [];
while (\count($result) < $limit && $line = $this->readLineFromFile($file)) {
$values = str_getcsv($line, ',', '"', '\\');

if (7 > \count($values)) {

continue;
}

[$csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent, $csvStatusCode, $csvVirtualType] = $values + [7 => null];
$csvTime = (int) $csvTime;

$urlFilter = false;
if ($url) {
$urlFilter = str_starts_with($url, '!') ? str_contains($csvUrl, substr($url, 1)) : !str_contains($csvUrl, $url);
}

if ($ip && !str_contains($csvIp, $ip) || $urlFilter || $method && !str_contains($csvMethod, $method) || $statusCode && !str_contains($csvStatusCode, $statusCode)) {
continue;
}

if (!empty($start) && $csvTime < $start) {
continue;
}

if (!empty($end) && $csvTime > $end) {
continue;
}

$profile = [
'token' => $csvToken,
'ip' => $csvIp,
'method' => $csvMethod,
'url' => $csvUrl,
'time' => $csvTime,
'parent' => $csvParent,
'status_code' => $csvStatusCode,
'virtual_type' => $csvVirtualType ?: 'request',
];

if ($filter && !$filter($profile)) {
continue;
}

$result[$csvToken] = $profile;
}

fclose($file);

return array_values($result);
}




public function purge()
{
$flags = \FilesystemIterator::SKIP_DOTS;
$iterator = new \RecursiveDirectoryIterator($this->folder, $flags);
$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST);

foreach ($iterator as $file) {
if (is_file($file)) {
unlink($file);
} else {
rmdir($file);
}
}
}

public function read(string $token): ?Profile
{
return $this->doRead($token);
}




public function write(Profile $profile): bool
{
$file = $this->getFilename($profile->getToken());

$profileIndexed = is_file($file);
if (!$profileIndexed) {

$dir = \dirname($file);
if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
throw new \RuntimeException(\sprintf('Unable to create the storage directory (%s).', $dir));
}
}

$profileToken = $profile->getToken();


$parentToken = $profile->getParentToken() !== $profileToken ? $profile->getParentToken() : null;
$childrenToken = array_filter(array_map(fn (Profile $p) => $profileToken !== $p->getToken() ? $p->getToken() : null, $profile->getChildren()));


$data = [
'token' => $profileToken,
'parent' => $parentToken,
'children' => $childrenToken,
'data' => $profile->getCollectors(),
'ip' => $profile->getIp(),
'method' => $profile->getMethod(),
'url' => $profile->getUrl(),
'time' => $profile->getTime(),
'status_code' => $profile->getStatusCode(),
'virtual_type' => $profile->getVirtualType() ?? 'request',
];

$data = serialize($data);

if (\function_exists('gzencode')) {
$data = gzencode($data, 3);
}

if (false === file_put_contents($file, $data, \LOCK_EX)) {
return false;
}

if (!$profileIndexed) {

if (false === $file = fopen($this->getIndexFilename(), 'a')) {
return false;
}

fputcsv($file, [
$profile->getToken(),
$profile->getIp(),
$profile->getMethod(),
$profile->getUrl(),
$profile->getTime() ?: time(),
$profile->getParentToken(),
$profile->getStatusCode(),
$profile->getVirtualType() ?? 'request',
], ',', '"', '\\');
fclose($file);

if (1 === mt_rand(1, 10)) {
$this->removeExpiredProfiles();
}
}

return true;
}




protected function getFilename(string $token): string
{

$folderA = substr($token, -2, 2);
$folderB = substr($token, -4, 2);

return $this->folder.'/'.$folderA.'/'.$folderB.'/'.$token;
}




protected function getIndexFilename(): string
{
return $this->folder.'/index.csv';
}








protected function readLineFromFile($file): mixed
{
$line = '';
$position = ftell($file);

if (0 === $position) {
return null;
}

while (true) {
$chunkSize = min($position, 1024);
$position -= $chunkSize;
fseek($file, $position);

if (0 === $chunkSize) {

break;
}

$buffer = fread($file, $chunkSize);

if (false === ($upTo = strrpos($buffer, "\n"))) {
$line = $buffer.$line;
continue;
}

$position += $upTo;
$line = substr($buffer, $upTo + 1).$line;
fseek($file, max(0, $position), \SEEK_SET);

if ('' !== $line) {
break;
}
}

return '' === $line ? null : $line;
}




protected function createProfileFromData(string $token, array $data, ?Profile $parent = null)
{
$profile = new Profile($token);
$profile->setIp($data['ip']);
$profile->setMethod($data['method']);
$profile->setUrl($data['url']);
$profile->setTime($data['time']);
$profile->setStatusCode($data['status_code']);
$profile->setVirtualType($data['virtual_type'] ?: 'request');
$profile->setCollectors($data['data']);

if (!$parent && $data['parent']) {
$parent = $this->read($data['parent']);
}

if ($parent) {
$profile->setParent($parent);
}

foreach ($data['children'] as $token) {
if (null !== $childProfile = $this->doRead($token, $profile)) {
$profile->addChild($childProfile);
}
}

return $profile;
}

private function doRead($token, ?Profile $profile = null): ?Profile
{
if (!$token || !file_exists($file = $this->getFilename($token))) {
return null;
}

$h = fopen($file, 'r');
flock($h, \LOCK_SH);
$data = stream_get_contents($h);
flock($h, \LOCK_UN);
fclose($h);

if (\function_exists('gzdecode')) {
$data = @gzdecode($data) ?: $data;
}

if (!$data = unserialize($data)) {
return null;
}

return $this->createProfileFromData($token, $data, $profile);
}

private function removeExpiredProfiles(): void
{
$minimalProfileTimestamp = time() - 2 * 86400;
$file = $this->getIndexFilename();
$handle = fopen($file, 'r');

if ($offset = is_file($file.'.offset') ? (int) file_get_contents($file.'.offset') : 0) {
fseek($handle, $offset);
}

while ($line = fgets($handle)) {
$values = str_getcsv($line, ',', '"', '\\');

if (7 > \count($values)) {

$offset += \strlen($line);
continue;
}

[$csvToken, , , , $csvTime] = $values;

if ($csvTime >= $minimalProfileTimestamp) {
break;
}

@unlink($this->getFilename($csvToken));
$offset += \strlen($line);
}
fclose($handle);

file_put_contents($file.'.offset', $offset);
}
}
<?php










namespace Symfony\Component\HttpKernel\Profiler;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Symfony\Contracts\Service\ResetInterface;






class Profiler implements ResetInterface
{
private ProfilerStorageInterface $storage;




private array $collectors = [];

private ?LoggerInterface $logger;
private bool $initiallyEnabled = true;
private bool $enabled = true;

public function __construct(ProfilerStorageInterface $storage, ?LoggerInterface $logger = null, bool $enable = true)
{
$this->storage = $storage;
$this->logger = $logger;
$this->initiallyEnabled = $this->enabled = $enable;
}






public function disable()
{
$this->enabled = false;
}






public function enable()
{
$this->enabled = true;
}

public function isEnabled(): bool
{
return $this->enabled;
}




public function loadProfileFromResponse(Response $response): ?Profile
{
if (!$token = $response->headers->get('X-Debug-Token')) {
return null;
}

return $this->loadProfile($token);
}




public function loadProfile(string $token): ?Profile
{
return $this->storage->read($token);
}




public function saveProfile(Profile $profile): bool
{

foreach ($profile->getCollectors() as $collector) {
if ($collector instanceof LateDataCollectorInterface) {
$collector->lateCollect();
}
}

if (!($ret = $this->storage->write($profile)) && null !== $this->logger) {
$this->logger->warning('Unable to store the profiler information.', ['configured_storage' => $this->storage::class]);
}

return $ret;
}






public function purge()
{
$this->storage->purge();
}











public function find(?string $ip, ?string $url, ?int $limit, ?string $method, ?string $start, ?string $end, ?string $statusCode = null): array
{
$filter = 7 < \func_num_args() ? func_get_arg(7) : null;

return $this->storage->find($ip, $url, $limit, $method, $this->getTimestamp($start), $this->getTimestamp($end), $statusCode, $filter);
}




public function collect(Request $request, Response $response, ?\Throwable $exception = null): ?Profile
{
if (false === $this->enabled) {
return null;
}

$profile = new Profile(substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6));
$profile->setTime(time());
$profile->setUrl($request->getUri());
$profile->setMethod($request->getMethod());
$profile->setStatusCode($response->getStatusCode());
try {
$profile->setIp($request->getClientIp());
} catch (ConflictingHeadersException) {
$profile->setIp('Unknown');
}

if ($request->attributes->has('_virtual_type')) {
$profile->setVirtualType($request->attributes->get('_virtual_type'));
}

if ($prevToken = $response->headers->get('X-Debug-Token')) {
$response->headers->set('X-Previous-Debug-Token', $prevToken);
}

$response->headers->set('X-Debug-Token', $profile->getToken());

foreach ($this->collectors as $collector) {
$collector->collect($request, $response, $exception);


$profile->addCollector(clone $collector);
}

return $profile;
}




public function reset()
{
foreach ($this->collectors as $collector) {
$collector->reset();
}
$this->enabled = $this->initiallyEnabled;
}




public function all(): array
{
return $this->collectors;
}








public function set(array $collectors = [])
{
$this->collectors = [];
foreach ($collectors as $collector) {
$this->add($collector);
}
}






public function add(DataCollectorInterface $collector)
{
$this->collectors[$collector->getName()] = $collector;
}






public function has(string $name): bool
{
return isset($this->collectors[$name]);
}








public function get(string $name): DataCollectorInterface
{
if (!isset($this->collectors[$name])) {
throw new \InvalidArgumentException(\sprintf('Collector "%s" does not exist.', $name));
}

return $this->collectors[$name];
}

private function getTimestamp(?string $value): ?int
{
if (null === $value || '' === $value) {
return null;
}

try {
$value = new \DateTimeImmutable(is_numeric($value) ? '@'.$value : $value);
} catch (\Exception) {
return null;
}

return $value->getTimestamp();
}
}
<?php










namespace Symfony\Component\HttpKernel\Profiler;














interface ProfilerStorageInterface
{









public function find(?string $ip, ?string $url, ?int $limit, ?string $method, ?int $start = null, ?int $end = null): array;






public function read(string $token): ?Profile;




public function write(Profile $profile): bool;






public function purge();
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;








interface TerminableInterface
{







public function terminate(Request $request, Response $response);
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;






final class KernelEvents
{
/**
@Event("Symfony\Component\HttpKernel\Event\RequestEvent")






*/
public const REQUEST = 'kernel.request';

/**
@Event("Symfony\Component\HttpKernel\Event\ExceptionEvent")





*/
public const EXCEPTION = 'kernel.exception';

/**
@Event("Symfony\Component\HttpKernel\Event\ControllerEvent")






*/
public const CONTROLLER = 'kernel.controller';

/**
@Event("Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent")





*/
public const CONTROLLER_ARGUMENTS = 'kernel.controller_arguments';

/**
@Event("Symfony\Component\HttpKernel\Event\ViewEvent")






*/
public const VIEW = 'kernel.view';

/**
@Event("Symfony\Component\HttpKernel\Event\ResponseEvent")






*/
public const RESPONSE = 'kernel.response';

/**
@Event("Symfony\Component\HttpKernel\Event\FinishRequestEvent")





*/
public const FINISH_REQUEST = 'kernel.finish_request';

/**
@Event("Symfony\Component\HttpKernel\Event\TerminateEvent")




*/
public const TERMINATE = 'kernel.terminate';






public const ALIASES = [
ControllerArgumentsEvent::class => self::CONTROLLER_ARGUMENTS,
ControllerEvent::class => self::CONTROLLER,
ResponseEvent::class => self::RESPONSE,
FinishRequestEvent::class => self::FINISH_REQUEST,
RequestEvent::class => self::REQUEST,
ViewEvent::class => self::VIEW,
ExceptionEvent::class => self::EXCEPTION,
TerminateEvent::class => self::TERMINATE,
];
}
<?php










namespace Symfony\Component\HttpKernel\ControllerMetadata;






interface ArgumentMetadataFactoryInterface
{





public function createArgumentMetadata(string|object|array $controller): array;
}
<?php










namespace Symfony\Component\HttpKernel\ControllerMetadata;






final class ArgumentMetadataFactory implements ArgumentMetadataFactoryInterface
{
public function createArgumentMetadata(string|object|array $controller, ?\ReflectionFunctionAbstract $reflector = null): array
{
$arguments = [];
$reflector ??= new \ReflectionFunction($controller(...));

foreach ($reflector->getParameters() as $param) {
$attributes = [];
foreach ($param->getAttributes() as $reflectionAttribute) {
if (class_exists($reflectionAttribute->getName())) {
$attributes[] = $reflectionAttribute->newInstance();
}
}

$arguments[] = new ArgumentMetadata($param->getName(), $this->getType($param), $param->isVariadic(), $param->isDefaultValueAvailable(), $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null, $param->allowsNull(), $attributes);
}

return $arguments;
}




private function getType(\ReflectionParameter $parameter): ?string
{
if (!$type = $parameter->getType()) {
return null;
}
$name = $type instanceof \ReflectionNamedType ? $type->getName() : (string) $type;

return match (strtolower($name)) {
'self' => $parameter->getDeclaringClass()?->name,
'parent' => get_parent_class($parameter->getDeclaringClass()?->name ?? '') ?: null,
default => $name,
};
}
}
<?php










namespace Symfony\Component\HttpKernel\ControllerMetadata;






class ArgumentMetadata
{
public const IS_INSTANCEOF = 2;

private string $name;
private ?string $type;
private bool $isVariadic;
private bool $hasDefaultValue;
private mixed $defaultValue;
private bool $isNullable;
private array $attributes;




public function __construct(string $name, ?string $type, bool $isVariadic, bool $hasDefaultValue, mixed $defaultValue, bool $isNullable = false, array $attributes = [])
{
$this->name = $name;
$this->type = $type;
$this->isVariadic = $isVariadic;
$this->hasDefaultValue = $hasDefaultValue;
$this->defaultValue = $defaultValue;
$this->isNullable = $isNullable || null === $type || ($hasDefaultValue && null === $defaultValue);
$this->attributes = $attributes;
}




public function getName(): string
{
return $this->name;
}






public function getType(): ?string
{
return $this->type;
}




public function isVariadic(): bool
{
return $this->isVariadic;
}






public function hasDefaultValue(): bool
{
return $this->hasDefaultValue;
}




public function isNullable(): bool
{
return $this->isNullable;
}






public function getDefaultValue(): mixed
{
if (!$this->hasDefaultValue) {
throw new \LogicException(\sprintf('Argument $%s does not have a default value. Use "%s::hasDefaultValue()" to avoid this exception.', $this->name, __CLASS__));
}

return $this->defaultValue;
}







public function getAttributes(?string $name = null, int $flags = 0): array
{
if (!$name) {
return $this->attributes;
}

return $this->getAttributesOfType($name, $flags);
}

/**
@template





*/
public function getAttributesOfType(string $name, int $flags = 0): array
{
$attributes = [];
if ($flags & self::IS_INSTANCEOF) {
foreach ($this->attributes as $attribute) {
if ($attribute instanceof $name) {
$attributes[] = $attribute;
}
}
} else {
foreach ($this->attributes as $attribute) {
if ($attribute::class === $name) {
$attributes[] = $attribute;
}
}
}

return $attributes;
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Mime\Part\AbstractPart;
use Symfony\Component\Mime\Part\DataPart;
use Symfony\Component\Mime\Part\Multipart\FormDataPart;
use Symfony\Component\Mime\Part\TextPart;
use Symfony\Contracts\HttpClient\HttpClientInterface;


class_exists(ResponseHeaderBag::class);






final class HttpClientKernel implements HttpKernelInterface
{
private HttpClientInterface $client;

public function __construct(?HttpClientInterface $client = null)
{
if (null === $client && !class_exists(HttpClient::class)) {
throw new \LogicException(\sprintf('You cannot use "%s" as the HttpClient component is not installed. Try running "composer require symfony/http-client".', __CLASS__));
}

$this->client = $client ?? HttpClient::create();
}

public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
{
$headers = $this->getHeaders($request);
$body = '';
if (null !== $part = $this->getBody($request)) {
$headers = array_merge($headers, $part->getPreparedHeaders()->toArray());
$body = $part->bodyToIterable();
}
$response = $this->client->request($request->getMethod(), $request->getUri(), [
'headers' => $headers,
'body' => $body,
] + $request->attributes->get('http_client_options', []));

$response = new Response($response->getContent(!$catch), $response->getStatusCode(), $response->getHeaders(!$catch));

$response->headers->remove('X-Body-File');
$response->headers->remove('X-Body-Eval');
$response->headers->remove('X-Content-Digest');

$response->headers = new class($response->headers->all()) extends ResponseHeaderBag {
protected function computeCacheControlValue(): string
{
return $this->getCacheControlHeader(); 
}
};

return $response;
}

private function getBody(Request $request): ?AbstractPart
{
if (\in_array($request->getMethod(), ['GET', 'HEAD'])) {
return null;
}

if (!class_exists(AbstractPart::class)) {
throw new \LogicException('You cannot pass non-empty bodies as the Mime component is not installed. Try running "composer require symfony/mime".');
}

if ($content = $request->getContent()) {
return new TextPart($content, 'utf-8', 'plain', '8bit');
}

$fields = $request->request->all();
foreach ($request->files->all() as $name => $file) {
$fields[$name] = DataPart::fromPath($file->getPathname(), $file->getClientOriginalName(), $file->getClientMimeType());
}

return new FormDataPart($fields);
}

private function getHeaders(Request $request): array
{
$headers = [];
foreach ($request->headers as $key => $value) {
$headers[$key] = $value;
}
$cookies = [];
foreach ($request->cookies->all() as $name => $value) {
$cookies[] = $name.'='.$value;
}
if ($cookies) {
$headers['cookie'] = implode('; ', $cookies);
}

return $headers;
}
}
<?php










namespace Symfony\Component\HttpKernel\Config;

use Symfony\Component\Config\FileLocator as BaseFileLocator;
use Symfony\Component\HttpKernel\KernelInterface;






class FileLocator extends BaseFileLocator
{
private KernelInterface $kernel;

public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;

parent::__construct();
}

public function locate(string $file, ?string $currentPath = null, bool $first = true): string|array
{
if (isset($file[0]) && '@' === $file[0]) {
$resource = $this->kernel->locateResource($file);

return $first ? $resource : [$resource];
}

return parent::locate($file, $currentPath, $first);
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;






final class FinishRequestEvent extends KernelEvent
{
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;










final class ViewEvent extends RequestEvent
{
public readonly ?ControllerArgumentsEvent $controllerArgumentsEvent;
private mixed $controllerResult;

public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, mixed $controllerResult, ?ControllerArgumentsEvent $controllerArgumentsEvent = null)
{
parent::__construct($kernel, $request, $requestType);

$this->controllerResult = $controllerResult;
$this->controllerArgumentsEvent = $controllerArgumentsEvent;
}

public function getControllerResult(): mixed
{
return $this->controllerResult;
}

public function setControllerResult(mixed $controllerResult): void
{
$this->controllerResult = $controllerResult;
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Contracts\EventDispatcher\Event;






class KernelEvent extends Event
{
private HttpKernelInterface $kernel;
private Request $request;
private ?int $requestType;





public function __construct(HttpKernelInterface $kernel, Request $request, ?int $requestType)
{
$this->kernel = $kernel;
$this->request = $request;
$this->requestType = $requestType;
}




public function getKernel(): HttpKernelInterface
{
return $this->kernel;
}




public function getRequest(): Request
{
return $this->request;
}







public function getRequestType(): int
{
return $this->requestType;
}




public function isMainRequest(): bool
{
return HttpKernelInterface::MAIN_REQUEST === $this->requestType;
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;









final class TerminateEvent extends KernelEvent
{
private Response $response;

public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
{
parent::__construct($kernel, $request, HttpKernelInterface::MAIN_REQUEST);

$this->response = $response;
}

public function getResponse(): Response
{
return $this->response;
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;














final class ExceptionEvent extends RequestEvent
{
private \Throwable $throwable;
private bool $allowCustomResponseCode = false;

public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, \Throwable $e)
{
parent::__construct($kernel, $request, $requestType);

$this->setThrowable($e);
}

public function getThrowable(): \Throwable
{
return $this->throwable;
}






public function setThrowable(\Throwable $exception): void
{
$this->throwable = $exception;
}




public function allowCustomResponseCode(): void
{
$this->allowCustomResponseCode = true;
}




public function isAllowingCustomResponseCode(): bool
{
return $this->allowCustomResponseCode;
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;












final class ControllerEvent extends KernelEvent
{
private string|array|object $controller;
private \ReflectionFunctionAbstract $controllerReflector;
private array $attributes;

public function __construct(HttpKernelInterface $kernel, callable $controller, Request $request, ?int $requestType)
{
parent::__construct($kernel, $request, $requestType);

$this->setController($controller);
}

public function getController(): callable
{
return $this->controller;
}

public function getControllerReflector(): \ReflectionFunctionAbstract
{
return $this->controllerReflector;
}




public function setController(callable $controller, ?array $attributes = null): void
{
if (null !== $attributes) {
$this->attributes = $attributes;
}

if (isset($this->controller) && ($controller instanceof \Closure ? $controller == $this->controller : $controller === $this->controller)) {
$this->controller = $controller;

return;
}

if (null === $attributes) {
unset($this->attributes);
}

if (\is_array($controller) && method_exists(...$controller)) {
$this->controllerReflector = new \ReflectionMethod(...$controller);
} elseif (\is_string($controller) && str_contains($controller, '::')) {
$this->controllerReflector = new \ReflectionMethod(...explode('::', $controller, 2));
} else {
$this->controllerReflector = new \ReflectionFunction($controller(...));
}

$this->controller = $controller;
}

/**
@template
@psalm-return(T is null ? array<class-string, list<object>> : list<object>)





*/
public function getAttributes(?string $className = null): array
{
if (isset($this->attributes)) {
return null === $className ? $this->attributes : $this->attributes[$className] ?? [];
}

if (\is_array($this->controller) && method_exists(...$this->controller)) {
$class = new \ReflectionClass($this->controller[0]);
} elseif (\is_string($this->controller) && false !== $i = strpos($this->controller, '::')) {
$class = new \ReflectionClass(substr($this->controller, 0, $i));
} else {
$class = str_contains($this->controllerReflector->name, '{closure') ? null : (\PHP_VERSION_ID >= 80111 ? $this->controllerReflector->getClosureCalledClass() : $this->controllerReflector->getClosureScopeClass());
}
$this->attributes = [];

foreach (array_merge($class?->getAttributes() ?? [], $this->controllerReflector->getAttributes()) as $attribute) {
if (class_exists($attribute->getName())) {
$this->attributes[$attribute->getName()][] = $attribute->newInstance();
}
}

return null === $className ? $this->attributes : $this->attributes[$className] ?? [];
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;













final class ControllerArgumentsEvent extends KernelEvent
{
private ControllerEvent $controllerEvent;
private array $arguments;
private array $namedArguments;

public function __construct(HttpKernelInterface $kernel, callable|ControllerEvent $controller, array $arguments, Request $request, ?int $requestType)
{
parent::__construct($kernel, $request, $requestType);

if (!$controller instanceof ControllerEvent) {
$controller = new ControllerEvent($kernel, $controller, $request, $requestType);
}

$this->controllerEvent = $controller;
$this->arguments = $arguments;
}

public function getController(): callable
{
return $this->controllerEvent->getController();
}




public function setController(callable $controller, ?array $attributes = null): void
{
$this->controllerEvent->setController($controller, $attributes);
unset($this->namedArguments);
}

public function getArguments(): array
{
return $this->arguments;
}

public function setArguments(array $arguments): void
{
$this->arguments = $arguments;
unset($this->namedArguments);
}

public function getNamedArguments(): array
{
if (isset($this->namedArguments)) {
return $this->namedArguments;
}

$namedArguments = [];
$arguments = $this->arguments;

foreach ($this->controllerEvent->getControllerReflector()->getParameters() as $i => $param) {
if ($param->isVariadic()) {
$namedArguments[$param->name] = \array_slice($arguments, $i);
break;
}
if (\array_key_exists($i, $arguments)) {
$namedArguments[$param->name] = $arguments[$i];
} elseif ($param->isDefaultvalueAvailable()) {
$namedArguments[$param->name] = $param->getDefaultValue();
}
}

return $this->namedArguments = $namedArguments;
}

/**
@template
@psalm-return(T is null ? array<class-string, list<object>> : list<object>)





*/
public function getAttributes(?string $className = null): array
{
return $this->controllerEvent->getAttributes($className);
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;










final class ResponseEvent extends KernelEvent
{
private Response $response;

public function __construct(HttpKernelInterface $kernel, Request $request, int $requestType, Response $response)
{
parent::__construct($kernel, $request, $requestType);

$this->setResponse($response);
}

public function getResponse(): Response
{
return $this->response;
}

public function setResponse(Response $response): void
{
$this->response = $response;
}
}
<?php










namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Response;










class RequestEvent extends KernelEvent
{
private ?Response $response = null;




public function getResponse(): ?Response
{
return $this->response;
}






public function setResponse(Response $response)
{
$this->response = $response;

$this->stopPropagation();
}




public function hasResponse(): bool
{
return null !== $this->response;
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\Config\Builder\ConfigBuilderGenerator;
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\Compiler\RemoveBuildParametersPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\Dumper\Preloader;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\ErrorHandler\DebugClassLoader;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
use Symfony\Component\HttpKernel\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\AddAnnotatedClassesToCachePass;
use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;


class_exists(ConfigCache::class);











abstract class Kernel implements KernelInterface, RebootableInterface, TerminableInterface
{



protected $bundles = [];

protected $container;
protected $environment;
protected $debug;
protected $booted = false;
protected $startTime;

private string $projectDir;
private ?string $warmupDir = null;
private int $requestStackSize = 0;
private bool $resetServices = false;




private static array $freshCache = [];

public const VERSION = '6.4.27';
public const VERSION_ID = 60427;
public const MAJOR_VERSION = 6;
public const MINOR_VERSION = 4;
public const RELEASE_VERSION = 27;
public const EXTRA_VERSION = '';

public const END_OF_MAINTENANCE = '11/2026';
public const END_OF_LIFE = '11/2027';

public function __construct(string $environment, bool $debug)
{
if (!$this->environment = $environment) {
throw new \InvalidArgumentException(\sprintf('Invalid environment provided to "%s": the environment cannot be empty.', get_debug_type($this)));
}

$this->debug = $debug;
}

public function __clone()
{
$this->booted = false;
$this->container = null;
$this->requestStackSize = 0;
$this->resetServices = false;
}




public function boot()
{
if (true === $this->booted) {
if (!$this->requestStackSize && $this->resetServices) {
if ($this->container->has('services_resetter')) {
$this->container->get('services_resetter')->reset();
}
$this->resetServices = false;
if ($this->debug) {
$this->startTime = microtime(true);
}
}

return;
}

if (null === $this->container) {
$this->preBoot();
}

foreach ($this->getBundles() as $bundle) {
$bundle->setContainer($this->container);
$bundle->boot();
}

$this->booted = true;
}




public function reboot(?string $warmupDir)
{
$this->shutdown();
$this->warmupDir = $warmupDir;
$this->boot();
}




public function terminate(Request $request, Response $response)
{
if (false === $this->booted) {
return;
}

if ($this->getHttpKernel() instanceof TerminableInterface) {
$this->getHttpKernel()->terminate($request, $response);
}
}




public function shutdown()
{
if (false === $this->booted) {
return;
}

$this->booted = false;

foreach ($this->getBundles() as $bundle) {
$bundle->shutdown();
$bundle->setContainer(null);
}

$this->container = null;
$this->requestStackSize = 0;
$this->resetServices = false;
}

public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
{
if (!$this->booted) {
$container = $this->container ?? $this->preBoot();

if ($container->has('http_cache')) {
return $container->get('http_cache')->handle($request, $type, $catch);
}
}

$this->boot();
++$this->requestStackSize;
$this->resetServices = true;

try {
return $this->getHttpKernel()->handle($request, $type, $catch);
} finally {
--$this->requestStackSize;
}
}




protected function getHttpKernel(): HttpKernelInterface
{
return $this->container->get('http_kernel');
}

public function getBundles(): array
{
return $this->bundles;
}

public function getBundle(string $name): BundleInterface
{
if (!isset($this->bundles[$name])) {
throw new \InvalidArgumentException(\sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the "registerBundles()" method of your "%s.php" file?', $name, get_debug_type($this)));
}

return $this->bundles[$name];
}

public function locateResource(string $name): string
{
if ('@' !== $name[0]) {
throw new \InvalidArgumentException(\sprintf('A resource name must start with @ ("%s" given).', $name));
}

if (str_contains($name, '..')) {
throw new \RuntimeException(\sprintf('File name "%s" contains invalid characters (..).', $name));
}

$bundleName = substr($name, 1);
$path = '';
if (str_contains($bundleName, '/')) {
[$bundleName, $path] = explode('/', $bundleName, 2);
}

$bundle = $this->getBundle($bundleName);
if (file_exists($file = $bundle->getPath().'/'.$path)) {
return $file;
}

throw new \InvalidArgumentException(\sprintf('Unable to find file "%s".', $name));
}

public function getEnvironment(): string
{
return $this->environment;
}

public function isDebug(): bool
{
return $this->debug;
}




public function getProjectDir(): string
{
if (!isset($this->projectDir)) {
$r = new \ReflectionObject($this);

if (!is_file($dir = $r->getFileName())) {
throw new \LogicException(\sprintf('Cannot auto-detect project dir for kernel of class "%s".', $r->name));
}

$dir = $rootDir = \dirname($dir);
while (!is_file($dir.'/composer.json')) {
if ($dir === \dirname($dir)) {
return $this->projectDir = $rootDir;
}
$dir = \dirname($dir);
}
$this->projectDir = $dir;
}

return $this->projectDir;
}

public function getContainer(): ContainerInterface
{
if (!$this->container) {
throw new \LogicException('Cannot retrieve the container from a non-booted kernel.');
}

return $this->container;
}




public function setAnnotatedClassCache(array $annotatedClasses): void
{
file_put_contents(($this->warmupDir ?: $this->getBuildDir()).'/annotations.map', \sprintf('<?php return %s;', var_export($annotatedClasses, true)));
}

public function getStartTime(): float
{
return $this->debug && null !== $this->startTime ? $this->startTime : -\INF;
}

public function getCacheDir(): string
{
return $this->getProjectDir().'/var/cache/'.$this->environment;
}

public function getBuildDir(): string
{

return $this->getCacheDir();
}

public function getLogDir(): string
{
return $this->getProjectDir().'/var/log';
}

public function getCharset(): string
{
return 'UTF-8';
}




public function getAnnotatedClassesToCompile(): array
{
return [];
}








protected function initializeBundles()
{

$this->bundles = [];
foreach ($this->registerBundles() as $bundle) {
$name = $bundle->getName();
if (isset($this->bundles[$name])) {
throw new \LogicException(\sprintf('Trying to register two bundles with the same name "%s".', $name));
}
$this->bundles[$name] = $bundle;
}
}








protected function build(ContainerBuilder $container)
{
}






protected function getContainerClass(): string
{
$class = static::class;
$class = str_contains($class, "@anonymous\0") ? get_parent_class($class).str_replace('.', '_', ContainerBuilder::hash($class)) : $class;
$class = str_replace('\\', '_', $class).ucfirst($this->environment).($this->debug ? 'Debug' : '').'Container';

if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $class)) {
throw new \InvalidArgumentException(\sprintf('The environment "%s" contains invalid characters, it can only contain characters allowed in PHP class names.', $this->environment));
}

return $class;
}






protected function getContainerBaseClass(): string
{
return 'Container';
}









protected function initializeContainer()
{
$class = $this->getContainerClass();
$buildDir = $this->warmupDir ?: $this->getBuildDir();
$cache = new ConfigCache($buildDir.'/'.$class.'.php', $this->debug);
$cachePath = $cache->getPath();


$errorLevel = error_reporting();
error_reporting($errorLevel & ~\E_WARNING);

try {
if (is_file($cachePath) && \is_object($this->container = include $cachePath)
&& (!$this->debug || (self::$freshCache[$cachePath] ?? $cache->isFresh()))
) {
self::$freshCache[$cachePath] = true;
$this->container->set('kernel', $this);
error_reporting($errorLevel);

return;
}
} catch (\Throwable $e) {
}

$oldContainer = \is_object($this->container) ? new \ReflectionClass($this->container) : $this->container = null;

try {
is_dir($buildDir) ?: mkdir($buildDir, 0777, true);

if ($lock = fopen($cachePath.'.lock', 'w+')) {
if (!flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock) && !flock($lock, $wouldBlock ? \LOCK_SH : \LOCK_EX)) {
fclose($lock);
$lock = null;
} elseif (!is_file($cachePath) || !\is_object($this->container = include $cachePath)) {
$this->container = null;
} elseif (!$oldContainer || $this->container::class !== $oldContainer->name) {
flock($lock, \LOCK_UN);
fclose($lock);
$this->container->set('kernel', $this);

return;
}
}
} catch (\Throwable $e) {
} finally {
error_reporting($errorLevel);
}

if ($collectDeprecations = $this->debug && !\defined('PHPUNIT_COMPOSER_INSTALL')) {
$collectedLogs = [];
$previousHandler = set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) {
if (\E_USER_DEPRECATED !== $type && \E_DEPRECATED !== $type) {
return $previousHandler ? $previousHandler($type, $message, $file, $line) : false;
}

if (isset($collectedLogs[$message])) {
++$collectedLogs[$message]['count'];

return null;
}

$backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 5);

for ($i = 0; isset($backtrace[$i]); ++$i) {
if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) {
$backtrace = \array_slice($backtrace, 1 + $i);
break;
}
}
for ($i = 0; isset($backtrace[$i]); ++$i) {
if (!isset($backtrace[$i]['file'], $backtrace[$i]['line'], $backtrace[$i]['function'])) {
continue;
}
if (!isset($backtrace[$i]['class']) && 'trigger_deprecation' === $backtrace[$i]['function']) {
$file = $backtrace[$i]['file'];
$line = $backtrace[$i]['line'];
$backtrace = \array_slice($backtrace, 1 + $i);
break;
}
}


for ($i = \count($backtrace) - 2; 0 < $i; --$i) {
if (DebugClassLoader::class === ($backtrace[$i]['class'] ?? null)) {
$backtrace = [$backtrace[$i + 1]];
break;
}
}

$collectedLogs[$message] = [
'type' => $type,
'message' => $message,
'file' => $file,
'line' => $line,
'trace' => [$backtrace[0]],
'count' => 1,
];

return null;
});
}

try {
$container = null;
$container = $this->buildContainer();
$container->compile();
} finally {
if ($collectDeprecations) {
restore_error_handler();

@file_put_contents($buildDir.'/'.$class.'Deprecations.log', serialize(array_values($collectedLogs)));
@file_put_contents($buildDir.'/'.$class.'Compiler.log', null !== $container ? implode("\n", $container->getCompiler()->getLog()) : '');
}
}

$this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());

if ($lock) {
flock($lock, \LOCK_UN);
fclose($lock);
}

$this->container = require $cachePath;
$this->container->set('kernel', $this);

if ($oldContainer && $this->container::class !== $oldContainer->name) {



static $legacyContainers = [];
$oldContainerDir = \dirname($oldContainer->getFileName());
$legacyContainers[$oldContainerDir.'.legacy'] = true;
foreach (glob(\dirname($oldContainerDir).\DIRECTORY_SEPARATOR.'*.legacy', \GLOB_NOSORT) as $legacyContainer) {
if (!isset($legacyContainers[$legacyContainer]) && @unlink($legacyContainer)) {
(new Filesystem())->remove(substr($legacyContainer, 0, -7));
}
}

touch($oldContainerDir.'.legacy');
}

$buildDir = $this->container->getParameter('kernel.build_dir');
$cacheDir = $this->container->getParameter('kernel.cache_dir');
$preload = $this instanceof WarmableInterface ? (array) $this->warmUp($cacheDir, $buildDir) : [];

if ($this->container->has('cache_warmer')) {
$cacheWarmer = $this->container->get('cache_warmer');

if ($cacheDir !== $buildDir) {
$cacheWarmer->enableOptionalWarmers();
}

$preload = array_merge($preload, (array) $cacheWarmer->warmUp($cacheDir, $buildDir));
}

if ($preload && file_exists($preloadFile = $buildDir.'/'.$class.'.preload.php')) {
Preloader::append($preloadFile, $preload);
}
}




protected function getKernelParameters(): array
{
$bundles = [];
$bundlesMetadata = [];

foreach ($this->bundles as $name => $bundle) {
$bundles[$name] = $bundle::class;
$bundlesMetadata[$name] = [
'path' => $bundle->getPath(),
'namespace' => $bundle->getNamespace(),
];
}

return [
'kernel.project_dir' => realpath($this->getProjectDir()) ?: $this->getProjectDir(),
'kernel.environment' => $this->environment,
'kernel.runtime_environment' => '%env(default:kernel.environment:APP_RUNTIME_ENV)%',
'kernel.runtime_mode' => '%env(query_string:default:container.runtime_mode:APP_RUNTIME_MODE)%',
'kernel.runtime_mode.web' => '%env(bool:default::key:web:default:kernel.runtime_mode:)%',
'kernel.runtime_mode.cli' => '%env(not:default:kernel.runtime_mode.web:)%',
'kernel.runtime_mode.worker' => '%env(bool:default::key:worker:default:kernel.runtime_mode:)%',
'kernel.debug' => $this->debug,
'kernel.build_dir' => realpath($buildDir = $this->warmupDir ?: $this->getBuildDir()) ?: $buildDir,
'kernel.cache_dir' => realpath($cacheDir = ($this->getCacheDir() === $this->getBuildDir() ? ($this->warmupDir ?: $this->getCacheDir()) : $this->getCacheDir())) ?: $cacheDir,
'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(),
'kernel.bundles' => $bundles,
'kernel.bundles_metadata' => $bundlesMetadata,
'kernel.charset' => $this->getCharset(),
'kernel.container_class' => $this->getContainerClass(),
];
}






protected function buildContainer(): ContainerBuilder
{
foreach (['cache' => $this->getCacheDir(), 'build' => $this->warmupDir ?: $this->getBuildDir(), 'logs' => $this->getLogDir()] as $name => $dir) {
if (!is_dir($dir)) {
if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
throw new \RuntimeException(\sprintf('Unable to create the "%s" directory (%s).', $name, $dir));
}
} elseif (!is_writable($dir)) {
throw new \RuntimeException(\sprintf('Unable to write in the "%s" directory (%s).', $name, $dir));
}
}

$container = $this->getContainerBuilder();
$container->addObjectResource($this);
$this->prepareContainer($container);
$this->registerContainerConfiguration($this->getContainerLoader($container));

$container->addCompilerPass(new AddAnnotatedClassesToCachePass($this));

return $container;
}






protected function prepareContainer(ContainerBuilder $container)
{
$extensions = [];
foreach ($this->bundles as $bundle) {
if ($extension = $bundle->getContainerExtension()) {
$container->registerExtension($extension);
}

if ($this->debug) {
$container->addObjectResource($bundle);
}
}

foreach ($this->bundles as $bundle) {
$bundle->build($container);
}

$this->build($container);

foreach ($container->getExtensions() as $extension) {
$extensions[] = $extension->getAlias();
}


$container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions));
}




protected function getContainerBuilder(): ContainerBuilder
{
$container = new ContainerBuilder();
$container->getParameterBag()->add($this->getKernelParameters());

if ($this instanceof ExtensionInterface) {
$container->registerExtension($this);
}
if ($this instanceof CompilerPassInterface) {
$container->addCompilerPass($this, PassConfig::TYPE_BEFORE_OPTIMIZATION, -10000);
}

return $container;
}









protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, string $class, string $baseClass)
{

$dumper = new PhpDumper($container);

$buildParameters = [];
foreach ($container->getCompilerPassConfig()->getPasses() as $pass) {
if ($pass instanceof RemoveBuildParametersPass) {
$buildParameters = array_merge($buildParameters, $pass->getRemovedParameters());
}
}

$inlineFactories = false;
if (isset($buildParameters['.container.dumper.inline_factories'])) {
$inlineFactories = $buildParameters['.container.dumper.inline_factories'];
} elseif ($container->hasParameter('container.dumper.inline_factories')) {
trigger_deprecation('symfony/http-kernel', '6.3', 'Parameter "%s" is deprecated, use ".%1$s" instead.', 'container.dumper.inline_factories');
$inlineFactories = $container->getParameter('container.dumper.inline_factories');
}

$inlineClassLoader = $this->debug;
if (isset($buildParameters['.container.dumper.inline_class_loader'])) {
$inlineClassLoader = $buildParameters['.container.dumper.inline_class_loader'];
} elseif ($container->hasParameter('container.dumper.inline_class_loader')) {
trigger_deprecation('symfony/http-kernel', '6.3', 'Parameter "%s" is deprecated, use ".%1$s" instead.', 'container.dumper.inline_class_loader');
$inlineClassLoader = $container->getParameter('container.dumper.inline_class_loader');
}

$content = $dumper->dump([
'class' => $class,
'base_class' => $baseClass,
'file' => $cache->getPath(),
'as_files' => true,
'debug' => $this->debug,
'inline_factories' => $inlineFactories,
'inline_class_loader' => $inlineClassLoader,
'build_time' => $container->hasParameter('kernel.container_build_time') ? $container->getParameter('kernel.container_build_time') : time(),
'preload_classes' => array_map('get_class', $this->bundles),
]);

$rootCode = array_pop($content);
$dir = \dirname($cache->getPath()).'/';
$fs = new Filesystem();

foreach ($content as $file => $code) {
$fs->dumpFile($dir.$file, $code);
@chmod($dir.$file, 0666 & ~umask());
}
$legacyFile = \dirname($dir.key($content)).'.legacy';
if (is_file($legacyFile)) {
@unlink($legacyFile);
}

$cache->write($rootCode, $container->getResources());
}




protected function getContainerLoader(ContainerInterface $container): DelegatingLoader
{
$env = $this->getEnvironment();
$locator = new FileLocator($this);
$resolver = new LoaderResolver([
new XmlFileLoader($container, $locator, $env),
new YamlFileLoader($container, $locator, $env),
new IniFileLoader($container, $locator, $env),
new PhpFileLoader($container, $locator, $env, class_exists(ConfigBuilderGenerator::class) ? new ConfigBuilderGenerator($this->getBuildDir()) : null),
new GlobFileLoader($container, $locator, $env),
new DirectoryLoader($container, $locator, $env),
new ClosureLoader($container, $env),
]);

return new DelegatingLoader($resolver);
}

private function preBoot(): ContainerInterface
{
if ($this->debug) {
$this->startTime = microtime(true);
}
if ($this->debug && !isset($_ENV['SHELL_VERBOSITY']) && !isset($_SERVER['SHELL_VERBOSITY'])) {
if (\function_exists('putenv')) {
putenv('SHELL_VERBOSITY=3');
}
$_ENV['SHELL_VERBOSITY'] = 3;
$_SERVER['SHELL_VERBOSITY'] = 3;
}

$this->initializeBundles();
$this->initializeContainer();

$container = $this->container;

if ($container->hasParameter('kernel.trusted_hosts') && $trustedHosts = $container->getParameter('kernel.trusted_hosts')) {
Request::setTrustedHosts($trustedHosts);
}

if ($container->hasParameter('kernel.trusted_proxies') && $container->hasParameter('kernel.trusted_headers') && $trustedProxies = $container->getParameter('kernel.trusted_proxies')) {
Request::setTrustedProxies(\is_array($trustedProxies) ? $trustedProxies : array_map('trim', explode(',', $trustedProxies)), $container->getParameter('kernel.trusted_headers'));
}

return $container;
}









public static function stripComments(string $source): string
{
trigger_deprecation('symfony/http-kernel', '6.4', 'Method "%s()" is deprecated without replacement.', __METHOD__);

if (!\function_exists('token_get_all')) {
return $source;
}

$rawChunk = '';
$output = '';
$tokens = token_get_all($source);
$ignoreSpace = false;
for ($i = 0; isset($tokens[$i]); ++$i) {
$token = $tokens[$i];
if (!isset($token[1]) || 'b"' === $token) {
$rawChunk .= $token;
} elseif (\T_START_HEREDOC === $token[0]) {
$output .= $rawChunk.$token[1];
do {
$token = $tokens[++$i];
$output .= isset($token[1]) && 'b"' !== $token ? $token[1] : $token;
} while (\T_END_HEREDOC !== $token[0]);
$rawChunk = '';
} elseif (\T_WHITESPACE === $token[0]) {
if ($ignoreSpace) {
$ignoreSpace = false;

continue;
}


$rawChunk .= preg_replace(['/\n{2,}/S'], "\n", $token[1]);
} elseif (\in_array($token[0], [\T_COMMENT, \T_DOC_COMMENT])) {
if (!\in_array($rawChunk[\strlen($rawChunk) - 1], [' ', "\n", "\r", "\t"], true)) {
$rawChunk .= ' ';
}
$ignoreSpace = true;
} else {
$rawChunk .= $token[1];


if (\T_OPEN_TAG === $token[0]) {
$ignoreSpace = true;
} else {
$ignoreSpace = false;
}
}
}

$output .= $rawChunk;

unset($tokens, $rawChunk);
gc_mem_caches();

return $output;
}

public function __sleep(): array
{
return ['environment', 'debug'];
}




public function __wakeup()
{
if (\is_object($this->environment) || \is_object($this->debug)) {
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

$this->__construct($this->environment, $this->debug);
}
}
<?php










namespace Symfony\Component\HttpKernel\CacheClearer;

use Psr\Cache\CacheItemPoolInterface;




class Psr6CacheClearer implements CacheClearerInterface
{
private array $pools = [];




public function __construct(array $pools = [])
{
$this->pools = $pools;
}

public function hasPool(string $name): bool
{
return isset($this->pools[$name]);
}




public function getPool(string $name): CacheItemPoolInterface
{
if (!$this->hasPool($name)) {
throw new \InvalidArgumentException(\sprintf('Cache pool not found: "%s".', $name));
}

return $this->pools[$name];
}




public function clearPool(string $name): bool
{
if (!isset($this->pools[$name])) {
throw new \InvalidArgumentException(\sprintf('Cache pool not found: "%s".', $name));
}

return $this->pools[$name]->clear();
}




public function clear(string $cacheDir)
{
foreach ($this->pools as $pool) {
$pool->clear();
}
}
}
<?php










namespace Symfony\Component\HttpKernel\CacheClearer;








class ChainCacheClearer implements CacheClearerInterface
{
private iterable $clearers;




public function __construct(iterable $clearers = [])
{
$this->clearers = $clearers;
}

public function clear(string $cacheDir): void
{
foreach ($this->clearers as $clearer) {
$clearer->clear($cacheDir);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\CacheClearer;






interface CacheClearerInterface
{





public function clear(string $cacheDir);
}
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="robots" content="noindex,nofollow,noarchive,nosnippet,noodp,notranslate,noimageindex" />
    <title>Welcome to Symfony!</title>
    <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>👋</text></svg>" />
    <style>
        <?php $hue = random_int(0, 360); ?>
        <?php $darkColor = static fn (float $alpha = 1) => "hsla($hue, 20%, 45%, $alpha)"; ?>
        <?php $lightColor = static fn (float $alpha = 1) => "hsla($hue, 20%, 95%, $alpha)"; ?>
        body { background: <?= $lightColor(); ?>; color: <?= $darkColor(); ?>; display: flex; font: 16px/1.5 sans-serif; justify-content: center; margin: 0; }
        h1, h2 { line-height: 1.2; margin: 0 0 .5em; }
        h1 { font-size: 36px; }
        h2 { font-size: 21px; margin-bottom: 1em; }
        a { color: <?= $darkColor(0.75); ?> }
        a:hover { text-decoration: none; }
        code { border-radius: 25px; background: <?= $lightColor(); ?>; box-shadow: 0 0 45px -15px hsl(<?= $hue; ?>, 20%, 2%); color: <?= $darkColor(); ?>; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; align-items: center; padding-right: 20px; position: relative; word-wrap: break-word; z-index: 1; }
        svg { overflow: hidden; vertical-align: text-bottom; }
        .wrapper { text-align: center; width: 100%; }
        .container { position: relative; background: radial-gradient(ellipse at bottom, <?= $darkColor(); ?> 0%, hsl(<?= $hue; ?>, 20%, 13%) 100%); background-attachment: fixed; color: <?= $lightColor(); ?>; }
        .container:after { content: ""; position: absolute; height: 2px; width: 2px; top: -2px; left: 0; background: white; box-shadow: 778px 1019px 0 0 rgba(255, 255, 255, 0.826) , 1075px 1688px 0 0 rgba(255,255,255, 0.275) , 388px 1021px 0 0 rgba(255,255,255, 0.259) , 1238px 626px 0 0 rgba(255,255,255, 0.469) , 997px 904px 0 0 rgba(255,255,255, 0.925) , 921px 1345px 0 0 rgba(255,255,255, 0.698) , 337px 1236px 0 0 rgba(255,255,255, 0.838) , 460px 569px 0 0 rgba(255,255,255, 0.01) , 690px 1488px 0 0 rgba(255,255,255, 0.154) , 859px 926px 0 0 rgba(255,255,255, 0.515) , 1272px 791px 0 0 rgba(255,255,255, 1) , 238px 1256px 0 0 rgba(255,255,255, 0.633) , 1486px 897px 0 0 rgba(255,255,255, 0.88) , 667px 6px 0 0 rgba(255,255,255, 0.508) , 853px 504px 0 0 rgba(255,255,255, 0.248) , 1329px 1778px 0 0 rgba(255,255,255, 0.217) , 768px 1340px 0 0 rgba(255,255,255, 0.792) , 631px 1383px 0 0 rgba(255,255,255, 0.698) , 991px 1603px 0 0 rgba(255,255,255, 0.939) , 1778px 1767px 0 0 rgba(255,255,255, 0.784) , 285px 546px 0 0 rgba(255,255,255, 0.8) , 1224px 1333px 0 0 rgba(255,255,255, 0.676) , 1154px 397px 0 0 rgba(255,255,255, 0.974) , 1210px 1004px 0 0 rgba(255,255,255, 0.894) , 1632px 953px 0 0 rgba(255,255,255, 0.281) , 449px 1144px 0 0 rgba(255,255,255, 0.706) , 1426px 771px 0 0 rgba(255,255,255, 0.737) , 1438px 1634px 0 0 rgba(255,255,255, 0.984) , 806px 168px 0 0 rgba(255,255,255, 0.807) , 731px 1067px 0 0 rgba(255,255,255, 0.734) , 1731px 1785px 0 0 rgba(255,255,255, 0.528) , 23px 975px 0 0 rgba(255,255,255, 0.068) , 575px 1088px 0 0 rgba(255,255,255, 0.876) , 1205px 1668px 0 0 rgba(255,255,255, 0.601) , 18px 1457px 0 0 rgba(255,255,255, 0.176) , 252px 1163px 0 0 rgba(255,255,255, 0.416) , 1752px 1px 0 0 rgba(255,255,255, 0.374) , 382px 767px 0 0 rgba(255,255,255, 0.073) , 133px 1462px 0 0 rgba(255,255,255, 0.706) , 851px 1166px 0 0 rgba(255,255,255, 0.535) , 374px 921px 0 0 rgba(255,255,255, 0.548) , 554px 1598px 0 0 rgba(255,255,255, 0.062) , 314px 685px 0 0 rgba(255,255,255, 0.187) , 1443px 209px 0 0 rgba(255,255,255, 0.097) , 1774px 1625px 0 0 rgba(255,255,255, 0.32) , 58px 278px 0 0 rgba(255,255,255, 0.684) , 986px 338px 0 0 rgba(255,255,255, 0.272) , 718px 1357px 0 0 rgba(255,255,255, 0.317) , 722px 983px 0 0 rgba(255,255,255, 0.568) , 1124px 992px 0 0 rgba(255,255,255, 0.199) , 581px 619px 0 0 rgba(255,255,255, 0.44) , 1120px 285px 0 0 rgba(255,255,255, 0.425) , 702px 138px 0 0 rgba(255,255,255, 0.816) , 262px 767px 0 0 rgba(255,255,255, 0.92) , 1204px 38px 0 0 rgba(255,255,255, 0.197) , 1196px 410px 0 0 rgba(255,255,255, 0.453) , 707px 699px 0 0 rgba(255,255,255, 0.481) , 1590px 1488px 0 0 rgba(255,255,255, 0.559) , 879px 1763px 0 0 rgba(255,255,255, 0.241) , 106px 686px 0 0 rgba(255,255,255, 0.175) , 158px 569px 0 0 rgba(255,255,255, 0.549) , 711px 1219px 0 0 rgba(255,255,255, 0.476) , 1339px 53px 0 0 rgba(255,255,255, 0.275) , 1410px 172px 0 0 rgba(255,255,255, 0.449) , 1601px 1484px 0 0 rgba(255,255,255, 0.988) , 1328px 1752px 0 0 rgba(255,255,255, 0.827) , 1733px 1475px 0 0 rgba(255,255,255, 0.567) , 559px 742px 0 0 rgba(255,255,255, 0.423) , 772px 844px 0 0 rgba(255,255,255, 0.039) , 602px 520px 0 0 rgba(255,255,255, 0.284) , 1158px 1067px 0 0 rgba(255,255,255, 0.066) , 1562px 730px 0 0 rgba(255,255,255, 0.086) , 1792px 615px 0 0 rgba(255,255,255, 0.438) , 1085px 1191px 0 0 rgba(255,255,255, 0.157) , 1402px 1087px 0 0 rgba(255,255,255, 0.797) , 569px 1685px 0 0 rgba(255,255,255, 0.992) , 1608px 52px 0 0 rgba(255,255,255, 0.302) , 1697px 1246px 0 0 rgba(255,255,255, 0.295) , 899px 1490px 0 0 rgba(255,255,255, 0.73) , 993px 901px 0 0 rgba(255,255,255, 0.961) , 1193px 1023px 0 0 rgba(255,255,255, 0.671) , 1224px 176px 0 0 rgba(255,255,255, 0.786) , 721px 1308px 0 0 rgba(255,255,255, 0.691) , 1702px 730px 0 0 rgba(255,255,255, 0.841) , 1480px 1498px 0 0 rgba(255,255,255, 0.655) , 181px 1612px 0 0 rgba(255,255,255, 0.588) , 1776px 679px 0 0 rgba(255,255,255, 0.821) , 892px 706px 0 0 rgba(255,255,255, 0.056) , 859px 267px 0 0 rgba(255,255,255, 0.565) , 784px 1285px 0 0 rgba(255,255,255, 0.029) , 1561px 1198px 0 0 rgba(255,255,255, 0.315) , 205px 421px 0 0 rgba(255,255,255, 0.584) , 236px 406px 0 0 rgba(255,255,255, 0.166) , 1259px 689px 0 0 rgba(255,255,255, 0.321) , 448px 317px 0 0 rgba(255,255,255, 0.495) , 1318px 466px 0 0 rgba(255,255,255, 0.275) , 1053px 297px 0 0 rgba(255,255,255, 0.035) , 716px 538px 0 0 rgba(255,255,255, 0.764) , 381px 207px 0 0 rgba(255,255,255, 0.692) , 871px 1140px 0 0 rgba(255,255,255, 0.342) , 361px 53px 0 0 rgba(255,255,255, 0.984) , 1565px 1593px 0 0 rgba(255,255,255, 0.102) , 145px 277px 0 0 rgba(255,255,255, 0.866) , 220px 1503px 0 0 rgba(255,255,255, 0.936) , 1068px 1475px 0 0 rgba(255,255,255, 0.156) , 1548px 483px 0 0 rgba(255,255,255, 0.768) , 710px 103px 0 0 rgba(255,255,255, 0.809) , 1660px 921px 0 0 rgba(255,255,255, 0.952) , 462px 1252px 0 0 rgba(255,255,255, 0.825) , 1123px 1628px 0 0 rgba(255,255,255, 0.409) , 1274px 729px 0 0 rgba(255,255,255, 0.26) , 1739px 679px 0 0 rgba(255,255,255, 0.83) , 1550px 1518px 0 0 rgba(255,255,255, 0.25) , 1624px 346px 0 0 rgba(255,255,255, 0.557) , 1023px 579px 0 0 rgba(255,255,255, 0.854) , 217px 661px 0 0 rgba(255,255,255, 0.731) , 1504px 549px 0 0 rgba(255,255,255, 0.705) , 939px 5px 0 0 rgba(255,255,255, 0.389) , 284px 735px 0 0 rgba(255,255,255, 0.355) , 13px 1679px 0 0 rgba(255,255,255, 0.712) , 137px 1592px 0 0 rgba(255,255,255, 0.619) , 1113px 505px 0 0 rgba(255,255,255, 0.651) , 1584px 510px 0 0 rgba(255,255,255, 0.41) , 346px 913px 0 0 rgba(255,255,255, 0.09) , 198px 1490px 0 0 rgba(255,255,255, 0.103) , 447px 1128px 0 0 rgba(255,255,255, 0.314) , 1356px 324px 0 0 rgba(255,255,255, 0.324) , 648px 667px 0 0 rgba(255,255,255, 0.155) , 442px 260px 0 0 rgba(255,255,255, 0.22) , 210px 401px 0 0 rgba(255,255,255, 0.682) , 422px 1772px 0 0 rgba(255,255,255, 0.671) , 276px 349px 0 0 rgba(255,255,255, 0.683) , 131px 539px 0 0 rgba(255,255,255, 0.977) , 892px 94px 0 0 rgba(255,255,255, 0.081) , 1295px 222px 0 0 rgba(255,255,255, 0.961) , 5px 1727px 0 0 rgba(255,255,255, 0.311) , 714px 1148px 0 0 rgba(255,255,255, 0.846) , 1455px 1182px 0 0 rgba(255,255,255, 0.313) , 1370px 708px 0 0 rgba(255,255,255, 0.824) , 812px 433px 0 0 rgba(255,255,255, 0.75) , 1110px 558px 0 0 rgba(255,255,255, 0.709) , 1132px 1543px 0 0 rgba(255,255,255, 0.868) , 644px 610px 0 0 rgba(255,255,255, 0.166) , 269px 1481px 0 0 rgba(255,255,255, 0.889) , 1712px 590px 0 0 rgba(255,255,255, 0.139) , 1159px 599px 0 0 rgba(255,255,255, 0.992) , 1551px 209px 0 0 rgba(255,255,255, 0.033) , 1020px 1721px 0 0 rgba(255,255,255, 0.028) , 216px 373px 0 0 rgba(255,255,255, 0.665) , 877px 532px 0 0 rgba(255,255,255, 0.686) , 1326px 885px 0 0 rgba(255,255,255, 0.517) , 972px 1704px 0 0 rgba(255,255,255, 0.499) , 749px 181px 0 0 rgba(255,255,255, 0.712) , 1511px 1650px 0 0 rgba(255,255,255, 0.101) , 1432px 183px 0 0 rgba(255,255,255, 0.545) , 1541px 1338px 0 0 rgba(255,255,255, 0.71) , 513px 1406px 0 0 rgba(255,255,255, 0.17) , 1314px 1197px 0 0 rgba(255,255,255, 0.789) , 824px 1659px 0 0 rgba(255,255,255, 0.597) , 308px 298px 0 0 rgba(255,255,255, 0.917) , 1225px 659px 0 0 rgba(255,255,255, 0.229) , 1253px 257px 0 0 rgba(255,255,255, 0.631) , 1653px 185px 0 0 rgba(255,255,255, 0.113) , 336px 614px 0 0 rgba(255,255,255, 0.045) , 1093px 898px 0 0 rgba(255,255,255, 0.617) , 730px 5px 0 0 rgba(255,255,255, 0.11) , 785px 645px 0 0 rgba(255,255,255, 0.516) , 989px 678px 0 0 rgba(255,255,255, 0.917) , 1511px 1614px 0 0 rgba(255,255,255, 0.938) , 584px 1117px 0 0 rgba(255,255,255, 0.631) , 534px 1012px 0 0 rgba(255,255,255, 0.668) , 1325px 1778px 0 0 rgba(255,255,255, 0.293) , 1632px 754px 0 0 rgba(255,255,255, 0.26) , 78px 1258px 0 0 rgba(255,255,255, 0.52) , 779px 1691px 0 0 rgba(255,255,255, 0.878) , 253px 1706px 0 0 rgba(255,255,255, 0.75) , 1358px 245px 0 0 rgba(255,255,255, 0.027) , 361px 1629px 0 0 rgba(255,255,255, 0.238) , 1134px 232px 0 0 rgba(255,255,255, 0.387) , 1685px 777px 0 0 rgba(255,255,255, 0.156) , 515px 724px 0 0 rgba(255,255,255, 0.863) , 588px 1728px 0 0 rgba(255,255,255, 0.159) , 1132px 47px 0 0 rgba(255,255,255, 0.691) , 315px 1446px 0 0 rgba(255,255,255, 0.782) , 79px 233px 0 0 rgba(255,255,255, 0.317) , 1498px 1050px 0 0 rgba(255,255,255, 0.358) , 30px 1073px 0 0 rgba(255,255,255, 0.939) , 1637px 620px 0 0 rgba(255,255,255, 0.141) , 1736px 1683px 0 0 rgba(255,255,255, 0.682) , 1298px 1505px 0 0 rgba(255,255,255, 0.863) , 972px 85px 0 0 rgba(255,255,255, 0.941) , 349px 1356px 0 0 rgba(255,255,255, 0.672) , 1545px 1429px 0 0 rgba(255,255,255, 0.859) , 1076px 467px 0 0 rgba(255,255,255, 0.024) , 189px 1647px 0 0 rgba(255,255,255, 0.838) , 423px 1722px 0 0 rgba(255,255,255, 0.771) , 1691px 1719px 0 0 rgba(255,255,255, 0.676) , 1747px 658px 0 0 rgba(255,255,255, 0.255) , 149px 1492px 0 0 rgba(255,255,255, 0.911) , 1203px 1138px 0 0 rgba(255,255,255, 0.964) , 781px 1584px 0 0 rgba(255,255,255, 0.465) , 1609px 1595px 0 0 rgba(255,255,255, 0.688) , 447px 1655px 0 0 rgba(255,255,255, 0.166) , 914px 1153px 0 0 rgba(255,255,255, 0.085) , 600px 1058px 0 0 rgba(255,255,255, 0.821) , 804px 505px 0 0 rgba(255,255,255, 0.608) , 1506px 584px 0 0 rgba(255,255,255, 0.618) , 587px 1290px 0 0 rgba(255,255,255, 0.071) , 258px 600px 0 0 rgba(255,255,255, 0.243) , 328px 395px 0 0 rgba(255,255,255, 0.065) , 846px 783px 0 0 rgba(255,255,255, 0.995) , 1138px 1294px 0 0 rgba(255,255,255, 0.703) , 1668px 633px 0 0 rgba(255,255,255, 0.27) , 337px 103px 0 0 rgba(255,255,255, 0.202) , 132px 986px 0 0 rgba(255,255,255, 0.726) , 414px 757px 0 0 rgba(255,255,255, 0.752) , 8px 1311px 0 0 rgba(255,255,255, 0.307) , 1791px 910px 0 0 rgba(255,255,255, 0.346) , 844px 216px 0 0 rgba(255,255,255, 0.156) , 1547px 1723px 0 0 rgba(255,255,255, 0.73) , 1187px 398px 0 0 rgba(255,255,255, 0.698) , 1550px 1520px 0 0 rgba(255,255,255, 0.462) , 1346px 655px 0 0 rgba(255,255,255, 0.58) , 668px 770px 0 0 rgba(255,255,255, 0.422) , 1774px 1435px 0 0 rgba(255,255,255, 0.089) , 693px 1061px 0 0 rgba(255,255,255, 0.893) , 132px 1689px 0 0 rgba(255,255,255, 0.937) , 894px 1561px 0 0 rgba(255,255,255, 0.88) , 906px 1706px 0 0 rgba(255,255,255, 0.567) , 1140px 297px 0 0 rgba(255,255,255, 0.358) , 13px 1288px 0 0 rgba(255,255,255, 0.464) , 1744px 423px 0 0 rgba(255,255,255, 0.845) , 119px 1548px 0 0 rgba(255,255,255, 0.769) , 1249px 1321px 0 0 rgba(255,255,255, 0.29) , 123px 795px 0 0 rgba(255,255,255, 0.597) , 390px 1542px 0 0 rgba(255,255,255, 0.47) , 825px 667px 0 0 rgba(255,255,255, 0.049) , 1071px 875px 0 0 rgba(255,255,255, 0.06) , 1428px 1786px 0 0 rgba(255,255,255, 0.222) , 993px 696px 0 0 rgba(255,255,255, 0.399) , 1585px 247px 0 0 rgba(255,255,255, 0.094) , 1340px 1312px 0 0 rgba(255,255,255, 0.603) , 1640px 725px 0 0 rgba(255,255,255, 0.026) , 1161px 1397px 0 0 rgba(255,255,255, 0.222) , 966px 1132px 0 0 rgba(255,255,255, 0.69) , 1782px 1275px 0 0 rgba(255,255,255, 0.606) , 1117px 1533px 0 0 rgba(255,255,255, 0.248) , 1027px 959px 0 0 rgba(255,255,255, 0.46) , 459px 839px 0 0 rgba(255,255,255, 0.98) , 1192px 265px 0 0 rgba(255,255,255, 0.523) , 175px 501px 0 0 rgba(255,255,255, 0.371) , 626px 19px 0 0 rgba(255,255,255, 0.246) , 46px 1173px 0 0 rgba(255,255,255, 0.124) , 573px 925px 0 0 rgba(255,255,255, 0.621) , 1px 283px 0 0 rgba(255,255,255, 0.943) , 778px 1213px 0 0 rgba(255,255,255, 0.128) , 435px 593px 0 0 rgba(255,255,255, 0.378) , 32px 394px 0 0 rgba(255,255,255, 0.451) , 1019px 1055px 0 0 rgba(255,255,255, 0.685) , 1423px 1233px 0 0 rgba(255,255,255, 0.354) , 494px 841px 0 0 rgba(255,255,255, 0.322) , 667px 194px 0 0 rgba(255,255,255, 0.655) , 1671px 195px 0 0 rgba(255,255,255, 0.502) , 403px 1710px 0 0 rgba(255,255,255, 0.623) , 665px 1597px 0 0 rgba(255,255,255, 0.839) , 61px 1742px 0 0 rgba(255,255,255, 0.566) , 1490px 1654px 0 0 rgba(255,255,255, 0.646) , 1361px 1604px 0 0 rgba(255,255,255, 0.101) , 1191px 1023px 0 0 rgba(255,255,255, 0.881) , 550px 378px 0 0 rgba(255,255,255, 0.573) , 1332px 1234px 0 0 rgba(255,255,255, 0.922) , 760px 1205px 0 0 rgba(255,255,255, 0.992) , 1506px 1328px 0 0 rgba(255,255,255, 0.723) , 1126px 813px 0 0 rgba(255,255,255, 0.549) , 67px 240px 0 0 rgba(255,255,255, 0.901) , 125px 1301px 0 0 rgba(255,255,255, 0.464) , 643px 391px 0 0 rgba(255,255,255, 0.589) , 1114px 1756px 0 0 rgba(255,255,255, 0.321) , 1602px 699px 0 0 rgba(255,255,255, 0.274) , 510px 393px 0 0 rgba(255,255,255, 0.185) , 171px 1217px 0 0 rgba(255,255,255, 0.932) , 1202px 1362px 0 0 rgba(255,255,255, 0.726) , 1160px 1324px 0 0 rgba(255,255,255, 0.867) , 121px 319px 0 0 rgba(255,255,255, 0.992) , 1474px 835px 0 0 rgba(255,255,255, 0.89) , 357px 1213px 0 0 rgba(255,255,255, 0.91) , 783px 976px 0 0 rgba(255,255,255, 0.941) , 750px 1599px 0 0 rgba(255,255,255, 0.515) , 323px 450px 0 0 rgba(255,255,255, 0.966) , 1078px 282px 0 0 rgba(255,255,255, 0.947) , 1164px 46px 0 0 rgba(255,255,255, 0.296) , 1792px 705px 0 0 rgba(255,255,255, 0.485) , 880px 1287px 0 0 rgba(255,255,255, 0.894) , 60px 1402px 0 0 rgba(255,255,255, 0.816) , 752px 894px 0 0 rgba(255,255,255, 0.803) , 285px 1535px 0 0 rgba(255,255,255, 0.93) , 1528px 401px 0 0 rgba(255,255,255, 0.727) , 651px 1767px 0 0 rgba(255,255,255, 0.146) , 1498px 1190px 0 0 rgba(255,255,255, 0.042) , 394px 1786px 0 0 rgba(255,255,255, 0.159) , 1318px 9px 0 0 rgba(255,255,255, 0.575) , 1699px 1675px 0 0 rgba(255,255,255, 0.511) , 82px 986px 0 0 rgba(255,255,255, 0.906) , 940px 970px 0 0 rgba(255,255,255, 0.562) , 1624px 259px 0 0 rgba(255,255,255, 0.537) , 1782px 222px 0 0 rgba(255,255,255, 0.259) , 1572px 1725px 0 0 rgba(255,255,255, 0.716) , 1080px 1557px 0 0 rgba(255,255,255, 0.245) , 1727px 648px 0 0 rgba(255,255,255, 0.471) , 899px 231px 0 0 rgba(255,255,255, 0.445) , 1061px 1074px 0 0 rgba(255,255,255, 0.079) , 556px 478px 0 0 rgba(255,255,255, 0.524) , 343px 359px 0 0 rgba(255,255,255, 0.162) , 711px 1254px 0 0 rgba(255,255,255, 0.323) , 1335px 242px 0 0 rgba(255,255,255, 0.936) , 933px 39px 0 0 rgba(255,255,255, 0.784) , 1629px 908px 0 0 rgba(255,255,255, 0.289) , 1800px 229px 0 0 rgba(255,255,255, 0.399) , 1589px 926px 0 0 rgba(255,255,255, 0.709) , 976px 694px 0 0 rgba(255,255,255, 0.855) , 1163px 1240px 0 0 rgba(255,255,255, 0.754) , 1662px 1784px 0 0 rgba(255,255,255, 0.088) , 656px 1388px 0 0 rgba(255,255,255, 0.688) , 1190px 1100px 0 0 rgba(255,255,255, 0.769) , 33px 392px 0 0 rgba(255,255,255, 0.301) , 56px 1405px 0 0 rgba(255,255,255, 0.969) , 1491px 118px 0 0 rgba(255,255,255, 0.991) , 1216px 997px 0 0 rgba(255,255,255, 0.727) , 1617px 712px 0 0 rgba(255,255,255, 0.45) , 163px 553px 0 0 rgba(255,255,255, 0.977) , 103px 140px 0 0 rgba(255,255,255, 0.916) , 1099px 1404px 0 0 rgba(255,255,255, 0.167) , 1423px 587px 0 0 rgba(255,255,255, 0.792) , 1797px 309px 0 0 rgba(255,255,255, 0.526) , 381px 141px 0 0 rgba(255,255,255, 0.005) , 1214px 802px 0 0 rgba(255,255,255, 0.887) , 211px 829px 0 0 rgba(255,255,255, 0.72) , 1103px 1507px 0 0 rgba(255,255,255, 0.642) , 244px 1231px 0 0 rgba(255,255,255, 0.184) , 118px 1747px 0 0 rgba(255,255,255, 0.475) , 183px 1293px 0 0 rgba(255,255,255, 0.148) , 911px 1362px 0 0 rgba(255,255,255, 0.073) , 817px 457px 0 0 rgba(255,255,255, 0.459) , 756px 18px 0 0 rgba(255,255,255, 0.544) , 481px 1118px 0 0 rgba(255,255,255, 0.878) , 380px 138px 0 0 rgba(255,255,255, 0.132) , 320px 646px 0 0 rgba(255,255,255, 0.04) , 1724px 1716px 0 0 rgba(255,255,255, 0.381) , 978px 1269px 0 0 rgba(255,255,255, 0.431) , 1530px 255px 0 0 rgba(255,255,255, 0.31) , 664px 204px 0 0 rgba(255,255,255, 0.913) , 474px 703px 0 0 rgba(255,255,255, 0.832) , 1722px 1204px 0 0 rgba(255,255,255, 0.356) , 1453px 821px 0 0 rgba(255,255,255, 0.195) , 730px 1468px 0 0 rgba(255,255,255, 0.696) , 928px 1610px 0 0 rgba(255,255,255, 0.894) , 1036px 304px 0 0 rgba(255,255,255, 0.696) , 1590px 172px 0 0 rgba(255,255,255, 0.729) , 249px 1590px 0 0 rgba(255,255,255, 0.277) , 357px 81px 0 0 rgba(255,255,255, 0.526) , 726px 1261px 0 0 rgba(255,255,255, 0.149) , 643px 946px 0 0 rgba(255,255,255, 0.005) , 1263px 995px 0 0 rgba(255,255,255, 0.124) , 1564px 1107px 0 0 rgba(255,255,255, 0.789) , 388px 83px 0 0 rgba(255,255,255, 0.498) , 715px 681px 0 0 rgba(255,255,255, 0.655) , 1618px 1624px 0 0 rgba(255,255,255, 0.63) , 1423px 1576px 0 0 rgba(255,255,255, 0.52) , 564px 1786px 0 0 rgba(255,255,255, 0.482) , 1066px 735px 0 0 rgba(255,255,255, 0.276) , 714px 1179px 0 0 rgba(255,255,255, 0.395) , 967px 1006px 0 0 rgba(255,255,255, 0.923) , 1136px 1790px 0 0 rgba(255,255,255, 0.801) , 215px 1690px 0 0 rgba(255,255,255, 0.957) , 1500px 1338px 0 0 rgba(255,255,255, 0.541) , 1679px 1065px 0 0 rgba(255,255,255, 0.925) , 426px 1489px 0 0 rgba(255,255,255, 0.193) , 1273px 853px 0 0 rgba(255,255,255, 0.317) , 665px 1189px 0 0 rgba(255,255,255, 0.512) , 520px 552px 0 0 rgba(255,255,255, 0.925) , 253px 438px 0 0 rgba(255,255,255, 0.588) , 369px 1354px 0 0 rgba(255,255,255, 0.889) , 749px 205px 0 0 rgba(255,255,255, 0.243) , 820px 145px 0 0 rgba(255,255,255, 0.207) , 1739px 228px 0 0 rgba(255,255,255, 0.267) , 392px 495px 0 0 rgba(255,255,255, 0.504) , 721px 1044px 0 0 rgba(255,255,255, 0.823) , 833px 912px 0 0 rgba(255,255,255, 0.222) , 865px 1499px 0 0 rgba(255,255,255, 0.003) , 313px 756px 0 0 rgba(255,255,255, 0.727) , 439px 1187px 0 0 rgba(255,255,255, 0.572) , 6px 1238px 0 0 rgba(255,255,255, 0.676) , 1567px 11px 0 0 rgba(255,255,255, 0.701) , 1216px 757px 0 0 rgba(255,255,255, 0.87) , 916px 588px 0 0 rgba(255,255,255, 0.565) , 831px 215px 0 0 rgba(255,255,255, 0.597) , 1289px 697px 0 0 rgba(255,255,255, 0.964) , 307px 34px 0 0 rgba(255,255,255, 0.462) , 3px 1685px 0 0 rgba(255,255,255, 0.464) , 1115px 1421px 0 0 rgba(255,255,255, 0.303) , 1451px 473px 0 0 rgba(255,255,255, 0.142) , 1374px 1205px 0 0 rgba(255,255,255, 0.086) , 1564px 317px 0 0 rgba(255,255,255, 0.773) , 304px 1127px 0 0 rgba(255,255,255, 0.653) , 446px 214px 0 0 rgba(255,255,255, 0.135) , 1541px 459px 0 0 rgba(255,255,255, 0.725) , 1387px 880px 0 0 rgba(255,255,255, 0.157) , 1172px 224px 0 0 rgba(255,255,255, 0.088) , 1420px 637px 0 0 rgba(255,255,255, 0.916) , 1385px 932px 0 0 rgba(255,255,255, 0.225) , 174px 1472px 0 0 rgba(255,255,255, 0.649) , 252px 750px 0 0 rgba(255,255,255, 0.277) , 825px 1042px 0 0 rgba(255,255,255, 0.707) , 840px 703px 0 0 rgba(255,255,255, 0.948) , 1478px 1800px 0 0 rgba(255,255,255, 0.151) , 95px 1303px 0 0 rgba(255,255,255, 0.332) , 1198px 740px 0 0 rgba(255,255,255, 0.443) , 141px 312px 0 0 rgba(255,255,255, 0.04) , 291px 729px 0 0 rgba(255,255,255, 0.284) , 1209px 1506px 0 0 rgba(255,255,255, 0.741) , 1188px 307px 0 0 rgba(255,255,255, 0.141) , 958px 41px 0 0 rgba(255,255,255, 0.858) , 1311px 1484px 0 0 rgba(255,255,255, 0.097) , 846px 1153px 0 0 rgba(255,255,255, 0.862) , 1238px 1376px 0 0 rgba(255,255,255, 0.071) , 1499px 342px 0 0 rgba(255,255,255, 0.719) , 640px 833px 0 0 rgba(255,255,255, 0.966) , 712px 545px 0 0 rgba(255,255,255, 0.194) , 1655px 1542px 0 0 rgba(255,255,255, 0.82) , 616px 353px 0 0 rgba(255,255,255, 0.871) , 1591px 1631px 0 0 rgba(255,255,255, 0.61) , 1664px 591px 0 0 rgba(255,255,255, 0.35) , 934px 454px 0 0 rgba(255,255,255, 0.58) , 1175px 477px 0 0 rgba(255,255,255, 0.966) , 299px 914px 0 0 rgba(255,255,255, 0.839) , 534px 243px 0 0 rgba(255,255,255, 0.194) , 773px 1135px 0 0 rgba(255,255,255, 0.42) , 1696px 1472px 0 0 rgba(255,255,255, 0.552) , 125px 523px 0 0 rgba(255,255,255, 0.591) , 1195px 382px 0 0 rgba(255,255,255, 0.904) , 1609px 1374px 0 0 rgba(255,255,255, 0.579) , 843px 82px 0 0 rgba(255,255,255, 0.072) , 1604px 451px 0 0 rgba(255,255,255, 0.545) , 1322px 190px 0 0 rgba(255,255,255, 0.034) , 528px 228px 0 0 rgba(255,255,255, 0.146) , 1470px 1169px 0 0 rgba(255,255,255, 0.912) , 502px 1350px 0 0 rgba(255,255,255, 0.594) , 1031px 298px 0 0 rgba(255,255,255, 0.368) , 1100px 1427px 0 0 rgba(255,255,255, 0.79) , 979px 1105px 0 0 rgba(255,255,255, 0.973) , 643px 1184px 0 0 rgba(255,255,255, 0.813) , 1636px 1701px 0 0 rgba(255,255,255, 0.013) , 1004px 245px 0 0 rgba(255,255,255, 0.412) , 680px 740px 0 0 rgba(255,255,255, 0.967) , 1599px 562px 0 0 rgba(255,255,255, 0.66) , 256px 1617px 0 0 rgba(255,255,255, 0.463) , 314px 1092px 0 0 rgba(255,255,255, 0.734) , 870px 900px 0 0 rgba(255,255,255, 0.512) , 530px 60px 0 0 rgba(255,255,255, 0.198) , 1786px 896px 0 0 rgba(255,255,255, 0.392) , 636px 212px 0 0 rgba(255,255,255, 0.997) , 672px 540px 0 0 rgba(255,255,255, 0.632) , 1118px 1649px 0 0 rgba(255,255,255, 0.377) , 433px 647px 0 0 rgba(255,255,255, 0.902) , 1200px 1737px 0 0 rgba(255,255,255, 0.262) , 1258px 143px 0 0 rgba(255,255,255, 0.729) , 1603px 1364px 0 0 rgba(255,255,255, 0.192) , 66px 1756px 0 0 rgba(255,255,255, 0.681) , 946px 263px 0 0 rgba(255,255,255, 0.105) , 1216px 1082px 0 0 rgba(255,255,255, 0.287) , 6px 1143px 0 0 rgba(255,255,255, 0.017) , 1631px 126px 0 0 rgba(255,255,255, 0.449) , 357px 1565px 0 0 rgba(255,255,255, 0.163) , 1752px 261px 0 0 rgba(255,255,255, 0.423) , 1247px 1631px 0 0 rgba(255,255,255, 0.312) , 320px 671px 0 0 rgba(255,255,255, 0.695) , 1375px 596px 0 0 rgba(255,255,255, 0.856) , 1456px 1340px 0 0 rgba(255,255,255, 0.564) , 447px 1044px 0 0 rgba(255,255,255, 0.623) , 1732px 447px 0 0 rgba(255,255,255, 0.216) , 174px 1509px 0 0 rgba(255,255,255, 0.398) , 16px 861px 0 0 rgba(255,255,255, 0.904) , 878px 1296px 0 0 rgba(255,255,255, 0.205) , 1725px 1483px 0 0 rgba(255,255,255, 0.704) , 255px 48px 0 0 rgba(255,255,255, 0.7) , 610px 1669px 0 0 rgba(255,255,255, 0.865) , 1044px 1251px 0 0 rgba(255,255,255, 0.98) , 884px 862px 0 0 rgba(255,255,255, 0.198) , 986px 545px 0 0 rgba(255,255,255, 0.379) , 1620px 217px 0 0 rgba(255,255,255, 0.159) , 383px 1763px 0 0 rgba(255,255,255, 0.518) , 595px 974px 0 0 rgba(255,255,255, 0.347) , 359px 14px 0 0 rgba(255,255,255, 0.863) , 95px 1385px 0 0 rgba(255,255,255, 0.011) , 411px 1030px 0 0 rgba(255,255,255, 0.038) , 345px 789px 0 0 rgba(255,255,255, 0.771) , 421px 460px 0 0 rgba(255,255,255, 0.133) , 972px 1160px 0 0 rgba(255,255,255, 0.342) , 597px 1061px 0 0 rgba(255,255,255, 0.781) , 1017px 1092px 0 0 rgba(255,255,255, 0.437); }
        .warning { background: <?= $lightColor(); ?>; display: flex; align-items: center; padding: 10px; text-align: left; justify-content: center; }
        .warning svg { flex-shrink: 0; height: 32px; width: 32px; margin-right: 10px; }
        .warning p { line-height:  1.4; margin: 0; }
        .container svg.wave { position: absolute; bottom: -2px; left: 0; z-index: 1; }
        .container .logo { margin-bottom: 1em; }
        .container .logo svg { fill: hsl(<?= $hue; ?>, 20%, 26%); }
        .welcome { padding-top: 4em; margin-bottom: 3em; }
        .welcome small { display: block; font-size: 85%; }
        .status { padding-bottom: 2em; }
        .status code, .status .status-ready { display: none; }
        .version { font-size: 34px; }
        .check { background: <?= $darkColor(); ?>; border-radius: 20px; width: 50px; display: flex; align-items: center; justify-content: center; height: 37px; margin: 6px 8px 6px 6px; }
        .check svg { fill: <?= $lightColor(); ?>; }
        .status-ready { margin: 28px 0 0; }
        .resources { margin: 0 auto; max-width: 1366px; padding: 2.5em 0 3.5em; }
        .resources .row { margin-left: 30px; margin-right: 30px; display: flex; justify-content: space-evenly; }
        .resource { padding: 0 10px; position: relative; }
        .resource svg { height: 48px; width: 48px; fill: <?= $darkColor(); ?>; margin-bottom: 5px; }
        .resource h2 { font-size: 18px; font-weight: normal; margin-bottom: 5px; }
        .resource p { margin-top: 5px; }
        .resource a { display: block; font-size: 14px; }

        @media (min-width: 768px) {
            @-webkit-keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } }
            @keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } }
            .sf-toolbar { opacity: 0; -webkit-animation: fade-in 1s .2s forwards; animation: fade-in 1s .2s forwards; z-index: 99999; }

            .resources .row { margin-left: 50px; margin-right: 50px; }
            .resource { padding: 0 30px; }

            .status { padding-bottom: 4em; }
            .status code { display: inline-flex; }
            .status .status-ready { display: block; }

            .resource svg { height: 64px; width: 64px; }
            .resource h2 { font-size: 22px; }
            .resource a { font-size: 16px; margin-top: 0; }
        }
        @media (min-width: 992px) {
            body { font-size: 20px; }
            .warning { text-align: center; }
        }
    </style>
</head>
<body>
<div class="wrapper">
    <div class="warning">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" width="32"><path fill="currentColor" d="M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z" class=""></path></svg>
        <p>
            You're seeing this page because you haven't configured any homepage URL and <a href="https://symfony.com/doc/<?= $docVersion; ?>/debug-mode">debug mode</a> is enabled.
        </p>
    </div>

    <div class="container">
        <div class="welcome">
            <div class="logo">
                <svg xmlns="http://www.w3.org/2000/svg" width="112.165" height="112.166"><path d="M112.165 56.079c0 30.976-25.109 56.087-56.084 56.087C25.108 112.166 0 87.055 0 56.079 0 25.108 25.107 0 56.081 0c30.975 0 56.084 25.108 56.084 56.079z" style="fill: <?= $lightColor(); ?>;"/><path d="M80.603 20.75c-5.697.195-10.67 3.34-14.373 7.68-4.1 4.765-6.824 10.411-8.791 16.18-3.514-2.882-6.223-6.611-11.864-8.233-4.359-1.253-8.936-.737-13.146 2.399-1.992 1.489-3.367 3.738-4.02 5.859-1.692 5.498 1.778 10.396 3.354 12.151l3.447 3.691c.709.725 2.422 2.613 1.584 5.319-.9 2.947-4.451 4.85-8.092 3.731-1.627-.499-3.963-1.71-3.439-3.413.215-.699.715-1.225.984-1.821.244-.521.363-.907.438-1.14.665-2.169-.245-4.994-2.57-5.713-2.171-.666-4.391-.138-5.252 2.655-.977 3.174.543 8.935 8.681 11.441 9.535 2.935 17.597-2.259 18.742-9.026.721-4.239-1.195-7.392-4.701-11.441l-2.859-3.163c-1.73-1.729-2.324-4.677-.533-6.942 1.512-1.912 3.664-2.726 7.191-1.768 5.15 1.396 7.443 4.969 11.271 7.851-1.578 5.187-2.613 10.392-3.547 15.059l-.574 3.481c-2.736 14.352-4.826 22.235-10.256 26.76-1.094.779-2.658 1.943-5.014 2.027-1.238.037-1.637-.814-1.654-1.186-.027-.865.703-1.264 1.188-1.652.727-.396 1.824-1.053 1.748-3.156-.078-2.484-2.137-4.639-5.111-4.541-2.229.075-5.625 2.171-5.497 6.011.131 3.967 3.827 6.938 9.401 6.75 2.979-.102 9.633-1.312 16.188-9.105 7.631-8.935 9.766-19.175 11.372-26.671l1.793-9.897c.992.119 2.059.2 3.217.228 9.504.201 14.256-4.72 14.328-8.302.049-2.167-1.42-4.302-3.479-4.251-1.471.041-3.32 1.022-3.762 3.057-.436 1.995 3.023 3.798.32 5.553-1.92 1.242-5.361 2.116-10.209 1.407l.881-4.872c1.799-9.238 4.018-20.6 12.436-20.878.615-.029 2.857.026 2.91 1.512.014.493-.109.623-.689 1.757-.592.884-.814 1.64-.785 2.504.08 2.356 1.873 3.908 4.471 3.818 3.473-.116 4.469-3.496 4.412-5.233-.146-4.085-4.449-6.665-10.14-6.477z"/></svg>
            </div>
            <h1><small>Welcome to</small> Symfony <span class="version"><?= $version; ?></span></h1>
        </div>

        <div class="status">
            <code>
                <span class="check">
                    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
                </span>
                <span><?= $projectDir; ?></span>
            </code>
            <p class="status-ready">Your application is now ready and you can start working on it.</p>
        </div>

        <svg style="pointer-events: none" class="wave" width="100%" height="50px" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1920 75"><defs><style>.a{fill:none}.b{clip-path:url(#a)}.c,.d {fill: <?= $lightColor(); ?>}.d{opacity:0.5;isolation:isolate;}</style><clipPath id="a"><rect class="a" width="1920" height="75"></rect></clipPath></defs><g class="b"><path class="c" d="M1963,327H-105V65A2647.49,2647.49,0,0,1,431,19c217.7,3.5,239.6,30.8,470,36,297.3,6.7,367.5-36.2,642-28a2511.41,2511.41,0,0,1,420,48"></path></g><g class="b"><path class="d" d="M-127,404H1963V44c-140.1-28-343.3-46.7-566,22-75.5,23.3-118.5,45.9-162,64-48.6,20.2-404.7,128-784,0C355.2,97.7,341.6,78.3,235,50,86.6,10.6-41.8,6.9-127,10"></path></g><g class="b"><path class="d" d="M1979,462-155,446V106C251.8,20.2,576.6,15.9,805,30c167.4,10.3,322.3,32.9,680,56,207,13.4,378,20.3,494,24"></path></g><g class="b"><path class="d" d="M1998,484H-243V100c445.8,26.8,794.2-4.1,1035-39,141-20.4,231.1-40.1,378-45,349.6-11.6,636.7,73.8,828,150"></path></g></svg>
    </div>

    <div class="resources">
        <div class="row">
            <div class="resource">
                <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 11.55C9.64 9.35 6.48 8 3 8v11c3.48 0 6.64 1.35 9 3.55 2.36-2.19 5.52-3.55 9-3.55V8c-3.48 0-6.64 1.35-9 3.55zM12 8c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z"/></svg>
                <h2>Documentation</h2>
                <a href="https://symfony.com/doc/<?= $docVersion; ?>/index.html">
                    Guides, components, references
                </a>
            </div>
            <div class="resource">
                <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></svg>
                <h2>Tutorials</h2>
                <a href="https://symfony.com/doc/<?= $docVersion; ?>/page_creation.html">
                    Create your first page
                </a>
            </div>
            <div class="resource">
                <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
                <h2>Community</h2>
                <a href="https://symfony.com/community">
                    Connect, get help, or contribute
                </a>
            </div>
        </div>
    </div>
</div>
</body>
</html>
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\Attribute\AutowireCallable;
use Symfony\Component\DependencyInjection\Attribute\Target;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\VarExporter\ProxyHelper;






class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('argument_resolver.service') && !$container->hasDefinition('argument_resolver.not_tagged_controller')) {
return;
}

$parameterBag = $container->getParameterBag();
$controllers = [];
$controllerClasses = [];

$publicAliases = [];
foreach ($container->getAliases() as $id => $alias) {
if ($alias->isPublic() && !$alias->isPrivate()) {
$publicAliases[(string) $alias][] = $id;
}
}

$emptyAutowireAttributes = class_exists(Autowire::class) ? null : [];

foreach ($container->findTaggedServiceIds('controller.service_arguments', true) as $id => $tags) {
$def = $container->getDefinition($id);
$def->setPublic(true);
$def->setLazy(false);
$class = $def->getClass();
$autowire = $def->isAutowired();
$bindings = $def->getBindings();


while ($def instanceof ChildDefinition) {
$def = $container->findDefinition($def->getParent());
$class = $class ?: $def->getClass();
$bindings += $def->getBindings();
}
$class = $parameterBag->resolveValue($class);

if (!$r = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}

$controllerClasses[] = $class;


$methods = [];
$arguments = [];
foreach ($r->getMethods(\ReflectionMethod::IS_PUBLIC) as $r) {
if ('setContainer' === $r->name) {
continue;
}
if (!$r->isConstructor() && !$r->isDestructor() && !$r->isAbstract()) {
$methods[strtolower($r->name)] = [$r, $r->getParameters()];
}
}


foreach ($tags as $attributes) {
if (!isset($attributes['action']) && !isset($attributes['argument']) && !isset($attributes['id'])) {
$autowire = true;
continue;
}
foreach (['action', 'argument', 'id'] as $k) {
if (!isset($attributes[$k][0])) {
throw new InvalidArgumentException(\sprintf('Missing "%s" attribute on tag "controller.service_arguments" %s for service "%s".', $k, json_encode($attributes, \JSON_UNESCAPED_UNICODE), $id));
}
}
if (!isset($methods[$action = strtolower($attributes['action'])])) {
throw new InvalidArgumentException(\sprintf('Invalid "action" attribute on tag "controller.service_arguments" for service "%s": no public "%s()" method found on class "%s".', $id, $attributes['action'], $class));
}
[$r, $parameters] = $methods[$action];
$found = false;

foreach ($parameters as $p) {
if ($attributes['argument'] === $p->name) {
if (!isset($arguments[$r->name][$p->name])) {
$arguments[$r->name][$p->name] = $attributes['id'];
}
$found = true;
break;
}
}

if (!$found) {
throw new InvalidArgumentException(\sprintf('Invalid "controller.service_arguments" tag for service "%s": method "%s()" has no "%s" argument on class "%s".', $id, $r->name, $attributes['argument'], $class));
}
}

foreach ($methods as [$r, $parameters]) {



$args = [];
foreach ($parameters as $p) {

$type = preg_replace('/(^|[(|&])\\\\/', '\1', $target = ltrim(ProxyHelper::exportType($p) ?? '', '?'));
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
$autowireAttributes = $autowire ? $emptyAutowireAttributes : [];
$parsedName = $p->name;
$k = null;

if (isset($arguments[$r->name][$p->name])) {
$target = $arguments[$r->name][$p->name];
if ('?' !== $target[0]) {
$invalidBehavior = ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE;
} elseif ('' === $target = (string) substr($target, 1)) {
throw new InvalidArgumentException(\sprintf('A "controller.service_arguments" tag must have non-empty "id" attributes for service "%s".', $id));
} elseif ($p->allowsNull() && !$p->isOptional()) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
}
} elseif (isset($bindings[$bindingName = $type.' $'.$name = Target::parseName($p, $k, $parsedName)])
|| isset($bindings[$bindingName = $type.' $'.$parsedName])
|| isset($bindings[$bindingName = '$'.$name])
|| isset($bindings[$bindingName = $type])
) {
$binding = $bindings[$bindingName];

[$bindingValue, $bindingId, , $bindingType, $bindingFile] = $binding->getValues();
$binding->setValues([$bindingValue, $bindingId, true, $bindingType, $bindingFile]);

$args[$p->name] = $bindingValue;

continue;
} elseif (!$autowire || (!($autowireAttributes ??= $p->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF)) && (!$type || '\\' !== $target[0]))) {
continue;
} elseif (!$autowireAttributes && is_subclass_of($type, \UnitEnum::class)) {

continue;
} elseif (!$p->allowsNull()) {
$invalidBehavior = ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE;
}

if (Request::class === $type || SessionInterface::class === $type || Response::class === $type) {
continue;
}

if ($autowireAttributes) {
$attribute = $autowireAttributes[0]->newInstance();
$value = $parameterBag->resolveValue($attribute->value);

if ($attribute instanceof AutowireCallable) {
$value = $attribute->buildDefinition($value, $type, $p);
}

if ($value instanceof Reference) {
$args[$p->name] = $type ? new TypedReference($value, $type, $invalidBehavior, $p->name) : new Reference($value, $invalidBehavior);
} else {
$args[$p->name] = new Reference('.value.'.$container->hash($value));
$container->register((string) $args[$p->name], 'mixed')
->setFactory('current')
->addArgument([$value]);
}

continue;
}

if ($type && !$p->isOptional() && !$p->allowsNull() && !class_exists($type) && !interface_exists($type, false)) {
$message = \sprintf('Cannot determine controller argument for "%s::%s()": the $%s argument is type-hinted with the non-existent class or interface: "%s".', $class, $r->name, $p->name, $type);


if (0 === strncmp($type, $class, strrpos($class, '\\'))) {
$message .= ' Did you forget to add a use statement?';
}

$container->register($erroredId = '.errored.'.$container->hash($message), $type)
->addError($message);

$args[$p->name] = new Reference($erroredId, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE);
} else {
$target = preg_replace('/(^|[(|&])\\\\/', '\1', $target);
$args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, Target::parseName($p)) : new Reference($target, $invalidBehavior);
}
}

if ($args) {
$controllers[$id.'::'.$r->name] = ServiceLocatorTagPass::register($container, $args);

foreach ($publicAliases[$id] ?? [] as $alias) {
$controllers[$alias.'::'.$r->name] = clone $controllers[$id.'::'.$r->name];
}
}
}
}

$controllerLocatorRef = ServiceLocatorTagPass::register($container, $controllers);

if ($container->hasDefinition('argument_resolver.service')) {
$container->getDefinition('argument_resolver.service')
->replaceArgument(0, $controllerLocatorRef);
}

if ($container->hasDefinition('argument_resolver.not_tagged_controller')) {
$container->getDefinition('argument_resolver.not_tagged_controller')
->replaceArgument(0, $controllerLocatorRef);
}

$container->setAlias('argument_resolver.controller_locator', (string) $controllerLocatorRef);

if ($container->hasDefinition('controller_resolver')) {
$container->getDefinition('controller_resolver')
->addMethodCall('allowControllers', [array_unique($controllerClasses)]);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\TraceableValueResolver;
use Symfony\Component\Stopwatch\Stopwatch;






class ControllerArgumentValueResolverPass implements CompilerPassInterface
{
use PriorityTaggedServiceTrait;




public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('argument_resolver')) {
return;
}

$definitions = $container->getDefinitions();
$namedResolvers = $this->findAndSortTaggedServices(new TaggedIteratorArgument('controller.targeted_value_resolver', 'name', needsIndexes: true), $container);
$resolvers = $this->findAndSortTaggedServices(new TaggedIteratorArgument('controller.argument_value_resolver', 'name', needsIndexes: true), $container);

foreach ($resolvers as $name => $resolver) {
if ($definitions[(string) $resolver]->hasTag('controller.targeted_value_resolver')) {
unset($resolvers[$name]);
} else {
$namedResolvers[$name] ??= clone $resolver;
}
}

if ($container->getParameter('kernel.debug') && class_exists(Stopwatch::class) && $container->has('debug.stopwatch')) {
foreach ($resolvers as $name => $resolver) {
$resolvers[$name] = new Reference('.debug.value_resolver.'.$resolver);
$container->register('.debug.value_resolver.'.$resolver, TraceableValueResolver::class)
->setArguments([$resolver, new Reference('debug.stopwatch')]);
}
foreach ($namedResolvers as $name => $resolver) {
$namedResolvers[$name] = new Reference('.debug.value_resolver.'.$resolver);
$container->register('.debug.value_resolver.'.$resolver, TraceableValueResolver::class)
->setArguments([$resolver, new Reference('debug.stopwatch')]);
}
}

$container
->getDefinition('argument_resolver')
->replaceArgument(1, new IteratorArgument(array_values($resolvers)))
->setArgument(2, new ServiceLocatorArgument($namedResolvers))
;
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass as BaseMergeExtensionConfigurationPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;






class MergeExtensionConfigurationPass extends BaseMergeExtensionConfigurationPass
{
private array $extensions;




public function __construct(array $extensions)
{
$this->extensions = $extensions;
}

public function process(ContainerBuilder $container): void
{
foreach ($this->extensions as $extension) {
if (!\count($container->getExtensionConfig($extension))) {
$container->loadFromExtension($extension, []);
}
}

parent::process($container);
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\Fragment\FragmentHandler;






class LazyLoadingFragmentHandler extends FragmentHandler
{
private ContainerInterface $container;




private array $initialized = [];

public function __construct(ContainerInterface $container, RequestStack $requestStack, bool $debug = false)
{
$this->container = $container;

parent::__construct($requestStack, [], $debug);
}

public function render(string|ControllerReference $uri, string $renderer = 'inline', array $options = []): ?string
{
if (!isset($this->initialized[$renderer]) && $this->container->has($renderer)) {
$this->addRenderer($this->container->get($renderer));
$this->initialized[$renderer] = true;
}

return parent::render($uri, $renderer, $options);
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;




class ResettableServicePass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->has('services_resetter')) {
return;
}

$services = $methods = [];

foreach ($container->findTaggedServiceIds('kernel.reset', true) as $id => $tags) {
$services[$id] = new Reference($id, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE);

foreach ($tags as $attributes) {
if (!isset($attributes['method'])) {
throw new RuntimeException(\sprintf('Tag "kernel.reset" requires the "method" attribute to be set on service "%s".', $id));
}

if (!isset($methods[$id])) {
$methods[$id] = [];
}

if ('ignore' === ($attributes['on_invalid'] ?? null)) {
$attributes['method'] = '?'.$attributes['method'];
}

$methods[$id][] = $attributes['method'];
}
}

if (!$services) {
$container->removeAlias('services_resetter');
$container->removeDefinition('services_resetter');

return;
}

$container->findDefinition('services_resetter')
->setArgument(0, new IteratorArgument($services))
->setArgument(1, $methods);
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Log\Logger;






class LoggerPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->has(LoggerInterface::class)) {
$container->setAlias(LoggerInterface::class, 'logger');
}

if ($container->has('logger')) {
return;
}

if ($debug = $container->getParameter('kernel.debug')) {
$debug = $container->hasParameter('kernel.runtime_mode.web')
? $container->getParameter('kernel.runtime_mode.web')
: !\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true);
}

$container->register('logger', Logger::class)
->setArguments([null, null, null, new Reference(RequestStack::class), $debug]);
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use ProxyManager\Proxy\LazyLoadingInterface;
use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Contracts\Service\ResetInterface;









class ServicesResetter implements ResetInterface
{
private \Traversable $resettableServices;
private array $resetMethods;





public function __construct(\Traversable $resettableServices, array $resetMethods)
{
$this->resettableServices = $resettableServices;
$this->resetMethods = $resetMethods;
}

public function reset(): void
{
foreach ($this->resettableServices as $id => $service) {
if ($service instanceof LazyObjectInterface && !$service->isLazyObjectInitialized(true)) {
continue;
}

if ($service instanceof LazyLoadingInterface && !$service->isProxyInitialized()) {
continue;
}

foreach ((array) $this->resetMethods[$id] as $resetMethod) {
if ('?' === $resetMethod[0] && !method_exists($service, $resetMethod = substr($resetMethod, 1))) {
continue;
}

$service->$resetMethod();
}
}
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;






class FragmentRendererPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('fragment.handler')) {
return;
}

$definition = $container->getDefinition('fragment.handler');
$renderers = [];
foreach ($container->findTaggedServiceIds('kernel.fragment_renderer', true) as $id => $tags) {
$def = $container->getDefinition($id);
$class = $container->getParameterBag()->resolveValue($def->getClass());

if (!$r = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}
if (!$r->isSubclassOf(FragmentRendererInterface::class)) {
throw new InvalidArgumentException(\sprintf('Service "%s" must implement interface "%s".', $id, FragmentRendererInterface::class));
}

foreach ($tags as $tag) {
$renderers[$tag['alias']] = new Reference($id);
}
}

$definition->replaceArgument(0, ServiceLocatorTagPass::register($container, $renderers));
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;






class RegisterLocaleAwareServicesPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('locale_aware_listener')) {
return;
}

$services = [];

foreach ($container->findTaggedServiceIds('kernel.locale_aware') as $id => $tags) {
$services[] = new Reference($id);
}

if (!$services) {
$container->removeDefinition('locale_aware_listener');

return;
}

$container
->getDefinition('locale_aware_listener')
->setArgument(0, new IteratorArgument($services))
;
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;






abstract class Extension extends BaseExtension
{
private array $annotatedClasses = [];




public function getAnnotatedClassesToCompile(): array
{
return $this->annotatedClasses;
}








public function addAnnotatedClassesToCompile(array $annotatedClasses)
{
$this->annotatedClasses = array_merge($this->annotatedClasses, $annotatedClasses);
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Composer\Autoload\ClassLoader;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\ErrorHandler\DebugClassLoader;
use Symfony\Component\HttpKernel\Kernel;






class AddAnnotatedClassesToCachePass implements CompilerPassInterface
{
private Kernel $kernel;

public function __construct(Kernel $kernel)
{
$this->kernel = $kernel;
}




public function process(ContainerBuilder $container)
{
$annotatedClasses = [];
foreach ($container->getExtensions() as $extension) {
if ($extension instanceof Extension) {
$annotatedClasses[] = $extension->getAnnotatedClassesToCompile();
}
}

$annotatedClasses = array_merge($this->kernel->getAnnotatedClassesToCompile(), ...$annotatedClasses);

$existingClasses = $this->getClassesInComposerClassMaps();

$annotatedClasses = $container->getParameterBag()->resolveValue($annotatedClasses);
$this->kernel->setAnnotatedClassCache($this->expandClasses($annotatedClasses, $existingClasses));
}







private function expandClasses(array $patterns, array $classes): array
{
$expanded = [];


foreach ($patterns as $key => $pattern) {
if (!str_ends_with($pattern, '\\') && !str_contains($pattern, '*')) {
unset($patterns[$key]);
$expanded[] = ltrim($pattern, '\\');
}
}


$regexps = $this->patternsToRegexps($patterns);

foreach ($classes as $class) {
$class = ltrim($class, '\\');

if ($this->matchAnyRegexps($class, $regexps)) {
$expanded[] = $class;
}
}

return array_unique($expanded);
}

private function getClassesInComposerClassMaps(): array
{
$classes = [];

foreach (spl_autoload_functions() as $function) {
if (!\is_array($function)) {
continue;
}

if ($function[0] instanceof DebugClassLoader) {
$function = $function[0]->getClassLoader();
}

if (\is_array($function) && $function[0] instanceof ClassLoader) {
$classes += array_filter($function[0]->getClassMap());
}
}

return array_keys($classes);
}

private function patternsToRegexps(array $patterns): array
{
$regexps = [];

foreach ($patterns as $pattern) {

$regex = preg_quote(ltrim($pattern, '\\'));


$regex = strtr($regex, ['\\*\\*' => '.*?', '\\*' => '[^\\\\]*?']);


if (!str_ends_with($regex, '\\')) {
$regex .= '$';
}

$regexps[] = '{^\\\\'.$regex.'}';
}

return $regexps;
}

private function matchAnyRegexps(string $class, array $regexps): bool
{
$isTest = str_contains($class, 'Test');

foreach ($regexps as $regex) {
if ($isTest && !str_contains($regex, 'Test')) {
continue;
}

if (preg_match($regex, '\\'.$class)) {
return true;
}
}

return false;
}
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;













abstract class ConfigurableExtension extends Extension
{
final public function load(array $configs, ContainerBuilder $container): void
{
$this->loadInternal($this->processConfiguration($this->getConfiguration($configs, $container), $configs), $container);
}






abstract protected function loadInternal(array $mergedConfig, ContainerBuilder $container);
}
<?php










namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;






class RemoveEmptyControllerArgumentLocatorsPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
$controllerLocator = $container->findDefinition('argument_resolver.controller_locator');
$controllers = $controllerLocator->getArgument(0);

foreach ($controllers as $controller => $argumentRef) {
$argumentLocator = $container->getDefinition((string) $argumentRef->getValues()[0]);

if (!$argumentLocator->getArgument(0)) {

$reason = \sprintf('Removing service-argument resolver for controller "%s": no corresponding services exist for the referenced types.', $controller);
} else {

$reason = false;
[$id, $action] = explode('::', $controller);

if ($container->hasAlias($id)) {
continue;
}

$controllerDef = $container->getDefinition($id);
foreach ($controllerDef->getMethodCalls() as [$method]) {
if (0 === strcasecmp($action, $method)) {
$reason = \sprintf('Removing method "%s" of service "%s" from controller candidates: the method is called at instantiation, thus cannot be an action.', $action, $id);
break;
}
}
if (!$reason) {

$controllers[$id.':'.$action] = $argumentRef;

if ('__invoke' === $action) {
$controllers[$id] = $argumentRef;
}
continue;
}
}

unset($controllers[$controller]);
$container->log($this, $reason);
}

$controllerLocator->replaceArgument(0, $controllers);
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\BrowserKit\AbstractBrowser;
use Symfony\Component\BrowserKit\CookieJar;
use Symfony\Component\BrowserKit\History;
use Symfony\Component\BrowserKit\Request as DomRequest;
use Symfony\Component\BrowserKit\Response as DomResponse;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;









class HttpKernelBrowser extends AbstractBrowser
{
protected $kernel;
private bool $catchExceptions = true;




public function __construct(HttpKernelInterface $kernel, array $server = [], ?History $history = null, ?CookieJar $cookieJar = null)
{

$this->kernel = $kernel;
$this->followRedirects = false;

parent::__construct($server, $history, $cookieJar);
}






public function catchExceptions(bool $catchExceptions)
{
$this->catchExceptions = $catchExceptions;
}






protected function doRequest(object $request)
{
$response = $this->kernel->handle($request, HttpKernelInterface::MAIN_REQUEST, $this->catchExceptions);

if ($this->kernel instanceof TerminableInterface) {
$this->kernel->terminate($request, $response);
}

return $response;
}






protected function getScript(object $request)
{
$kernel = var_export(serialize($this->kernel), true);
$request = var_export(serialize($request), true);

$errorReporting = error_reporting();

$requires = '';
foreach (get_declared_classes() as $class) {
if (str_starts_with($class, 'ComposerAutoloaderInit')) {
$r = new \ReflectionClass($class);
$file = \dirname($r->getFileName(), 2).'/autoload.php';
if (file_exists($file)) {
$requires .= 'require_once '.var_export($file, true).";\n";
}
}
}

if (!$requires) {
throw new \RuntimeException('Composer autoloader not found.');
}

$code = <<<EOF
<?php

error_reporting($errorReporting);

$requires

\$kernel = unserialize($kernel);
\$request = unserialize($request);
EOF;

return $code.$this->getHandleScript();
}




protected function getHandleScript()
{
return <<<'EOF'
$response = $kernel->handle($request);

if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) {
    $kernel->terminate($request, $response);
}

echo serialize($response);
EOF;
}

protected function filterRequest(DomRequest $request): Request
{
$httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $server = $request->getServer(), $request->getContent());
if (!isset($server['HTTP_ACCEPT'])) {
$httpRequest->headers->remove('Accept');
}

foreach ($this->filterFiles($httpRequest->files->all()) as $key => $value) {
$httpRequest->files->set($key, $value);
}

return $httpRequest;
}












protected function filterFiles(array $files): array
{
$filtered = [];
foreach ($files as $key => $value) {
if (\is_array($value)) {
$filtered[$key] = $this->filterFiles($value);
} elseif ($value instanceof UploadedFile) {
if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) {
$filtered[$key] = new UploadedFile(
'',
$value->getClientOriginalName(),
$value->getClientMimeType(),
\UPLOAD_ERR_INI_SIZE,
true
);
} else {
$filtered[$key] = new UploadedFile(
$value->getPathname(),
$value->getClientOriginalName(),
$value->getClientMimeType(),
$value->getError(),
true
);
}
}
}

return $filtered;
}




protected function filterResponse(object $response): DomResponse
{

ob_start();
$response->sendContent();
$content = ob_get_clean();

return new DomResponse($content, $response->getStatusCode(), $response->headers->all());
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class UnprocessableEntityHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(422, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;






class TooManyRequestsHttpException extends HttpException
{



public function __construct(int|string|null $retryAfter = null, string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
if ($retryAfter) {
$headers['Retry-After'] = $retryAfter;
}

parent::__construct(429, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class ConflictHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(409, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class ControllerDoesNotReturnResponseException extends \LogicException
{
public function __construct(string $message, callable $controller, string $file, int $line)
{
parent::__construct($message);

if (!$controllerDefinition = $this->parseControllerDefinition($controller)) {
return;
}

$this->file = $controllerDefinition['file'];
$this->line = $controllerDefinition['line'];
$r = new \ReflectionProperty(\Exception::class, 'trace');
$r->setValue($this, array_merge([
[
'line' => $line,
'file' => $file,
],
], $this->getTrace()));
}

private function parseControllerDefinition(callable $controller): ?array
{
if (\is_string($controller) && str_contains($controller, '::')) {
$controller = explode('::', $controller);
}

if (\is_array($controller)) {
try {
$r = new \ReflectionMethod($controller[0], $controller[1]);

return [
'file' => $r->getFileName(),
'line' => $r->getEndLine(),
];
} catch (\ReflectionException) {
return null;
}
}

if ($controller instanceof \Closure) {
$r = new \ReflectionFunction($controller);

return [
'file' => $r->getFileName(),
'line' => $r->getEndLine(),
];
}

if (\is_object($controller)) {
$r = new \ReflectionClass($controller);

try {
$line = $r->getMethod('__invoke')->getEndLine();
} catch (\ReflectionException) {
$line = $r->getEndLine();
}

return [
'file' => $r->getFileName(),
'line' => $line,
];
}

return null;
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;





class AccessDeniedHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(403, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class LengthRequiredHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(411, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class LockedHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(423, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class UnsupportedMediaTypeHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(415, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class MethodNotAllowedHttpException extends HttpException
{



public function __construct(array $allow, string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
$headers['Allow'] = strtoupper(implode(', ', $allow));

parent::__construct(405, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class UnauthorizedHttpException extends HttpException
{



public function __construct(string $challenge, string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
$headers['WWW-Authenticate'] = $challenge;

parent::__construct(401, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class BadRequestHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(400, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class GoneHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(410, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class NotAcceptableHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(406, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;






class HttpException extends \RuntimeException implements HttpExceptionInterface
{
private int $statusCode;
private array $headers;

public function __construct(int $statusCode, string $message = '', ?\Throwable $previous = null, array $headers = [], int $code = 0)
{
$this->statusCode = $statusCode;
$this->headers = $headers;

parent::__construct($message, $code, $previous);
}

public function getStatusCode(): int
{
return $this->statusCode;
}

public function getHeaders(): array
{
return $this->headers;
}




public function setHeaders(array $headers)
{
$this->headers = $headers;
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class ServiceUnavailableHttpException extends HttpException
{



public function __construct(int|string|null $retryAfter = null, string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
if ($retryAfter) {
$headers['Retry-After'] = $retryAfter;
}

parent::__construct(503, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;

class ResolverNotFoundException extends \RuntimeException
{



public function __construct(string $name, array $alternatives = [])
{
$msg = \sprintf('You have requested a non-existent resolver "%s".', $name);
if ($alternatives) {
if (1 === \count($alternatives)) {
$msg .= ' Did you mean this: "';
} else {
$msg .= ' Did you mean one of these: "';
}
$msg .= implode('", "', $alternatives).'"?';
}

parent::__construct($msg);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;






interface HttpExceptionInterface extends \Throwable
{



public function getStatusCode(): int;




public function getHeaders(): array;
}
<?php










namespace Symfony\Component\HttpKernel\Exception;






class PreconditionRequiredHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(428, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class NotFoundHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(404, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel\Exception;

class InvalidMetadataException extends \LogicException
{
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class UnexpectedSessionUsageException extends \LogicException
{
}
<?php










namespace Symfony\Component\HttpKernel\Exception;




class PreconditionFailedHttpException extends HttpException
{
public function __construct(string $message = '', ?\Throwable $previous = null, int $code = 0, array $headers = [])
{
parent::__construct(412, $message, $previous, $headers, $code);
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;


class_exists(ControllerArgumentsEvent::class);
class_exists(ControllerEvent::class);
class_exists(ExceptionEvent::class);
class_exists(FinishRequestEvent::class);
class_exists(RequestEvent::class);
class_exists(ResponseEvent::class);
class_exists(TerminateEvent::class);
class_exists(ViewEvent::class);
class_exists(KernelEvents::class);






class HttpKernel implements HttpKernelInterface, TerminableInterface
{
protected $dispatcher;
protected $resolver;
protected $requestStack;
private ArgumentResolverInterface $argumentResolver;
private bool $handleAllThrowables;

public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, ?RequestStack $requestStack = null, ?ArgumentResolverInterface $argumentResolver = null, bool $handleAllThrowables = false)
{
$this->dispatcher = $dispatcher;
$this->resolver = $resolver;
$this->requestStack = $requestStack ?? new RequestStack();
$this->argumentResolver = $argumentResolver ?? new ArgumentResolver();
$this->handleAllThrowables = $handleAllThrowables;
}

public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response
{
$request->headers->set('X-Php-Ob-Level', (string) ob_get_level());

$this->requestStack->push($request);
$response = null;
try {
return $response = $this->handleRaw($request, $type);
} catch (\Throwable $e) {
if ($e instanceof \Error && !$this->handleAllThrowables) {
throw $e;
}

if ($e instanceof RequestExceptionInterface) {
$e = new BadRequestHttpException($e->getMessage(), $e);
}
if (false === $catch) {
$this->finishRequest($request, $type);

throw $e;
}

return $response = $this->handleThrowable($e, $request, $type);
} finally {
$this->requestStack->pop();

if ($response instanceof StreamedResponse && $callback = $response->getCallback()) {
$requestStack = $this->requestStack;

$response->setCallback(static function () use ($request, $callback, $requestStack) {
$requestStack->push($request);
try {
$callback();
} finally {
$requestStack->pop();
}
});
}
}
}




public function terminate(Request $request, Response $response)
{
$this->dispatcher->dispatch(new TerminateEvent($this, $request, $response), KernelEvents::TERMINATE);
}




public function terminateWithException(\Throwable $exception, ?Request $request = null): void
{
if (!$request ??= $this->requestStack->getMainRequest()) {
throw $exception;
}

if ($pop = $request !== $this->requestStack->getMainRequest()) {
$this->requestStack->push($request);
}

try {
$response = $this->handleThrowable($exception, $request, self::MAIN_REQUEST);
} finally {
if ($pop) {
$this->requestStack->pop();
}
}

$response->sendHeaders();
$response->sendContent();

$this->terminate($request, $response);
}









private function handleRaw(Request $request, int $type = self::MAIN_REQUEST): Response
{

$event = new RequestEvent($this, $request, $type);
$this->dispatcher->dispatch($event, KernelEvents::REQUEST);

if ($event->hasResponse()) {
return $this->filterResponse($event->getResponse(), $request, $type);
}


if (false === $controller = $this->resolver->getController($request)) {
throw new NotFoundHttpException(\sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request->getPathInfo()));
}

$event = new ControllerEvent($this, $controller, $request, $type);
$this->dispatcher->dispatch($event, KernelEvents::CONTROLLER);
$controller = $event->getController();


$arguments = $this->argumentResolver->getArguments($request, $controller, $event->getControllerReflector());

$event = new ControllerArgumentsEvent($this, $event, $arguments, $request, $type);
$this->dispatcher->dispatch($event, KernelEvents::CONTROLLER_ARGUMENTS);
$controller = $event->getController();
$arguments = $event->getArguments();


$response = $controller(...$arguments);


if (!$response instanceof Response) {
$event = new ViewEvent($this, $request, $type, $response, $event);
$this->dispatcher->dispatch($event, KernelEvents::VIEW);

if ($event->hasResponse()) {
$response = $event->getResponse();
} else {
$msg = \sprintf('The controller must return a "Symfony\Component\HttpFoundation\Response" object but it returned %s.', $this->varToString($response));


if (null === $response) {
$msg .= ' Did you forget to add a return statement somewhere in your controller?';
}

throw new ControllerDoesNotReturnResponseException($msg, $controller, __FILE__, __LINE__ - 17);
}
}

return $this->filterResponse($response, $request, $type);
}






private function filterResponse(Response $response, Request $request, int $type): Response
{
$event = new ResponseEvent($this, $request, $type, $response);

$this->dispatcher->dispatch($event, KernelEvents::RESPONSE);

$this->finishRequest($request, $type);

return $event->getResponse();
}








private function finishRequest(Request $request, int $type): void
{
$this->dispatcher->dispatch(new FinishRequestEvent($this, $request, $type), KernelEvents::FINISH_REQUEST);
}




private function handleThrowable(\Throwable $e, Request $request, int $type): Response
{
$event = new ExceptionEvent($this, $request, $type, $e);
$this->dispatcher->dispatch($event, KernelEvents::EXCEPTION);


$e = $event->getThrowable();

if (!$event->hasResponse()) {
$this->finishRequest($request, $type);

throw $e;
}

$response = $event->getResponse();


if (!$event->isAllowingCustomResponseCode() && !$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {

if ($e instanceof HttpExceptionInterface) {

$response->setStatusCode($e->getStatusCode());
$response->headers->add($e->getHeaders());
} else {
$response->setStatusCode(500);
}
}

try {
return $this->filterResponse($response, $request, $type);
} catch (\Throwable $e) {
if ($e instanceof \Error && !$this->handleAllThrowables) {
throw $e;
}

return $response;
}
}




private function varToString(mixed $var): string
{
if (\is_object($var)) {
return \sprintf('an object of type %s', $var::class);
}

if (\is_array($var)) {
$a = [];
foreach ($var as $k => $v) {
$a[] = \sprintf('%s => ...', $k);
}

return \sprintf('an array ([%s])', mb_substr(implode(', ', $a), 0, 255));
}

if (\is_resource($var)) {
return \sprintf('a resource (%s)', get_resource_type($var));
}

if (null === $var) {
return 'null';
}

if (false === $var) {
return 'a boolean value (false)';
}

if (true === $var) {
return 'a boolean value (true)';
}

if (\is_string($var)) {
return \sprintf('a string ("%s%s")', mb_substr($var, 0, 255), mb_strlen($var) > 255 ? '...' : '');
}

if (is_numeric($var)) {
return \sprintf('a number (%s)', (string) $var);
}

return (string) $var;
}
}
<?php










namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






interface HttpKernelInterface
{
public const MAIN_REQUEST = 1;
public const SUB_REQUEST = 2;





public const MASTER_REQUEST = self::MAIN_REQUEST;













public function handle(Request $request, int $type = self::MAIN_REQUEST, bool $catch = true): Response;
}
<?php










namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter as ErrorHandlerFileLinkFormatter;

trigger_deprecation('symfony/http-kernel', '6.4', 'The "%s" class is deprecated, use "%s" instead.', FileLinkFormatter::class, ErrorHandlerFileLinkFormatter::class);

class_exists(ErrorHandlerFileLinkFormatter::class);

if (!class_exists(FileLinkFormatter::class, false)) {
class_alias(ErrorHandlerFileLinkFormatter::class, FileLinkFormatter::class);
}

if (false) {



class FileLinkFormatter extends ErrorHandlerFileLinkFormatter
{
}
}
<?php










namespace Symfony\Component\HttpKernel\Debug;

use Psr\Log\LoggerInterface;
use Symfony\Component\ErrorHandler\ErrorHandler;








class ErrorHandlerConfigurator
{
private ?LoggerInterface $logger;
private ?LoggerInterface $deprecationLogger;
private array|int|null $levels;
private ?int $throwAt;
private bool $scream;
private bool $scope;







public function __construct(?LoggerInterface $logger = null, array|int|null $levels = \E_ALL, ?int $throwAt = \E_ALL, bool $scream = true, bool $scope = true, ?LoggerInterface $deprecationLogger = null)
{
$this->logger = $logger;
$this->levels = $levels ?? \E_ALL;
$this->throwAt = \is_int($throwAt) ? $throwAt : (null === $throwAt ? null : ($throwAt ? \E_ALL : null));
$this->scream = $scream;
$this->scope = $scope;
$this->deprecationLogger = $deprecationLogger;
}




public function configure(ErrorHandler $handler): void
{
if ($this->logger || $this->deprecationLogger) {
$this->setDefaultLoggers($handler);
if (\is_array($this->levels)) {
$levels = 0;
foreach ($this->levels as $type => $log) {
$levels |= $type;
}
} else {
$levels = $this->levels;
}

if ($this->scream) {
$handler->screamAt($levels);
}
if ($this->scope) {
$handler->scopeAt($levels & ~\E_USER_DEPRECATED & ~\E_DEPRECATED);
} else {
$handler->scopeAt(0, true);
}
$this->logger = $this->deprecationLogger = $this->levels = null;
}
if (null !== $this->throwAt) {
$handler->throwAt($this->throwAt, true);
}
}

private function setDefaultLoggers(ErrorHandler $handler): void
{
if (\is_array($this->levels)) {
$levelsDeprecatedOnly = [];
$levelsWithoutDeprecated = [];
foreach ($this->levels as $type => $log) {
if (\E_DEPRECATED == $type || \E_USER_DEPRECATED == $type) {
$levelsDeprecatedOnly[$type] = $log;
} else {
$levelsWithoutDeprecated[$type] = $log;
}
}
} else {
$levelsDeprecatedOnly = $this->levels & (\E_DEPRECATED | \E_USER_DEPRECATED);
$levelsWithoutDeprecated = $this->levels & ~\E_DEPRECATED & ~\E_USER_DEPRECATED;
}

$defaultLoggerLevels = $this->levels;
if ($this->deprecationLogger && $levelsDeprecatedOnly) {
$handler->setDefaultLogger($this->deprecationLogger, $levelsDeprecatedOnly);
$defaultLoggerLevels = $levelsWithoutDeprecated;
}

if ($this->logger && $defaultLoggerLevels) {
$handler->setDefaultLogger($this->logger, $defaultLoggerLevels);
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher as BaseTraceableEventDispatcher;
use Symfony\Component\HttpKernel\KernelEvents;








class TraceableEventDispatcher extends BaseTraceableEventDispatcher
{
protected function beforeDispatch(string $eventName, object $event): void
{
switch ($eventName) {
case KernelEvents::REQUEST:
$event->getRequest()->attributes->set('_stopwatch_token', substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6));
$this->stopwatch->openSection();
break;
case KernelEvents::VIEW:
case KernelEvents::RESPONSE:

if ($this->stopwatch->isStarted('controller')) {
$this->stopwatch->stop('controller');
}
break;
case KernelEvents::TERMINATE:
$sectionId = $event->getRequest()->attributes->get('_stopwatch_token');
if (null === $sectionId) {
break;
}





try {
$this->stopwatch->openSection($sectionId);
} catch (\LogicException) {
}
break;
}
}

protected function afterDispatch(string $eventName, object $event): void
{
switch ($eventName) {
case KernelEvents::CONTROLLER_ARGUMENTS:
$this->stopwatch->start('controller', 'section');
break;
case KernelEvents::RESPONSE:
$sectionId = $event->getRequest()->attributes->get('_stopwatch_token');
if (null === $sectionId) {
break;
}
try {
$this->stopwatch->stopSection($sectionId);
} catch (\LogicException) {

}
break;
case KernelEvents::TERMINATE:


$sectionId = $event->getRequest()->attributes->get('_stopwatch_token');
if (null === $sectionId) {
break;
}
try {
$this->stopwatch->stopSection($sectionId);
} catch (\LogicException) {
}
break;
}
}
}
<?php










namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;








final class VirtualRequestStack extends RequestStack
{
public function __construct(
private readonly RequestStack $decorated,
) {
}

public function push(Request $request): void
{
if ($request->attributes->has('_virtual_type')) {
if ($this->decorated->getCurrentRequest()) {
throw new \LogicException('Cannot mix virtual and HTTP requests.');
}

parent::push($request);

return;
}

$this->decorated->push($request);
}

public function pop(): ?Request
{
return $this->decorated->pop() ?? parent::pop();
}

public function getCurrentRequest(): ?Request
{
return $this->decorated->getCurrentRequest() ?? parent::getCurrentRequest();
}

public function getMainRequest(): ?Request
{
return $this->decorated->getMainRequest() ?? parent::getMainRequest();
}

public function getParentRequest(): ?Request
{
return $this->decorated->getParentRequest() ?? parent::getParentRequest();
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Service\ResetInterface;






interface DataCollectorInterface extends ResetInterface
{





public function collect(Request $request, Response $response, ?\Throwable $exception = null);






public function getName();
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






class MemoryDataCollector extends DataCollector implements LateDataCollectorInterface
{
public function __construct()
{
$this->reset();
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
$this->updateMemoryUsage();
}

public function reset(): void
{
$this->data = [
'memory' => 0,
'memory_limit' => $this->convertToBytes(\ini_get('memory_limit')),
];
}

public function lateCollect(): void
{
$this->updateMemoryUsage();
}

public function getMemory(): int
{
return $this->data['memory'];
}

public function getMemoryLimit(): int|float
{
return $this->data['memory_limit'];
}

public function updateMemoryUsage(): void
{
$this->data['memory'] = memory_get_peak_usage(true);
}

public function getName(): string
{
return 'memory';
}

private function convertToBytes(string $memoryLimit): int|float
{
if ('-1' === $memoryLimit) {
return -1;
}

$memoryLimit = strtolower($memoryLimit);
$max = strtolower(ltrim($memoryLimit, '+'));
if (str_starts_with($max, '0x')) {
$max = \intval($max, 16);
} elseif (str_starts_with($max, '0')) {
$max = \intval($max, 8);
} else {
$max = (int) $max;
}

switch (substr($memoryLimit, -1)) {
case 't': $max *= 1024;

case 'g': $max *= 1024;

case 'm': $max *= 1024;

case 'k': $max *= 1024;
}

return $max;
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\Service\ResetInterface;








class EventDataCollector extends DataCollector implements LateDataCollectorInterface
{

private iterable $dispatchers;
private ?Request $currentRequest = null;




public function __construct(
iterable|EventDispatcherInterface|null $dispatchers = null,
private ?RequestStack $requestStack = null,
private string $defaultDispatcher = 'event_dispatcher',
) {
if ($dispatchers instanceof EventDispatcherInterface) {
$dispatchers = [$this->defaultDispatcher => $dispatchers];
}
$this->dispatchers = $dispatchers ?? [];
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
$this->currentRequest = $this->requestStack && $this->requestStack->getMainRequest() !== $request ? $request : null;
$this->data = [];
}

public function reset(): void
{
parent::reset();

foreach ($this->dispatchers as $dispatcher) {
if ($dispatcher instanceof ResetInterface) {
$dispatcher->reset();
}
}
}

public function lateCollect(): void
{
foreach ($this->dispatchers as $name => $dispatcher) {
if (!$dispatcher instanceof TraceableEventDispatcher) {
continue;
}

$this->setCalledListeners($dispatcher->getCalledListeners($this->currentRequest), $name);
$this->setNotCalledListeners($dispatcher->getNotCalledListeners($this->currentRequest), $name);
$this->setOrphanedEvents($dispatcher->getOrphanedEvents($this->currentRequest), $name);
}

$this->data = $this->cloneVar($this->data);
}

public function getData(): array|Data
{
return $this->data;
}




public function setCalledListeners(array $listeners, ?string $dispatcher = null): void
{
$this->data[$dispatcher ?? $this->defaultDispatcher]['called_listeners'] = $listeners;
}




public function getCalledListeners(?string $dispatcher = null): array|Data
{
return $this->data[$dispatcher ?? $this->defaultDispatcher]['called_listeners'] ?? [];
}




public function setNotCalledListeners(array $listeners, ?string $dispatcher = null): void
{
$this->data[$dispatcher ?? $this->defaultDispatcher]['not_called_listeners'] = $listeners;
}




public function getNotCalledListeners(?string $dispatcher = null): array|Data
{
return $this->data[$dispatcher ?? $this->defaultDispatcher]['not_called_listeners'] ?? [];
}






public function setOrphanedEvents(array $events, ?string $dispatcher = null): void
{
$this->data[$dispatcher ?? $this->defaultDispatcher]['orphaned_events'] = $events;
}




public function getOrphanedEvents(?string $dispatcher = null): array|Data
{
return $this->data[$dispatcher ?? $this->defaultDispatcher]['orphaned_events'] ?? [];
}

public function getName(): string
{
return 'events';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\VarDumper\Caster\ClassStub;
use Symfony\Component\VarDumper\Cloner\Data;






class ConfigDataCollector extends DataCollector implements LateDataCollectorInterface
{
private KernelInterface $kernel;




public function setKernel(?KernelInterface $kernel = null): void
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/http-kernel', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}

$this->kernel = $kernel;
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE);
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE);

$this->data = [
'token' => $response->headers->get('X-Debug-Token'),
'symfony_version' => Kernel::VERSION,
'symfony_minor_version' => \sprintf('%s.%s', Kernel::MAJOR_VERSION, Kernel::MINOR_VERSION),
'symfony_lts' => 4 === Kernel::MINOR_VERSION,
'symfony_state' => $this->determineSymfonyState(),
'symfony_eom' => $eom->format('F Y'),
'symfony_eol' => $eol->format('F Y'),
'env' => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a',
'debug' => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a',
'php_version' => \PHP_VERSION,
'php_architecture' => \PHP_INT_SIZE * 8,
'php_intl_locale' => class_exists(\Locale::class, false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a',
'php_timezone' => date_default_timezone_get(),
'xdebug_enabled' => \extension_loaded('xdebug'),
'apcu_enabled' => \extension_loaded('apcu') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOL),
'zend_opcache_enabled' => \extension_loaded('Zend OPcache') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL),
'bundles' => [],
'sapi_name' => \PHP_SAPI,
];

if (isset($this->kernel)) {
foreach ($this->kernel->getBundles() as $name => $bundle) {
$this->data['bundles'][$name] = new ClassStub($bundle::class);
}
}

if (preg_match('~^(\d+(?:\.\d+)*)(.+)?$~', $this->data['php_version'], $matches) && isset($matches[2])) {
$this->data['php_version'] = $matches[1];
$this->data['php_version_extra'] = $matches[2];
}
}

public function lateCollect(): void
{
$this->data = $this->cloneVar($this->data);
}




public function getToken(): ?string
{
return $this->data['token'];
}




public function getSymfonyVersion(): string
{
return $this->data['symfony_version'];
}





public function getSymfonyState(): string
{
return $this->data['symfony_state'];
}





public function getSymfonyMinorVersion(): string
{
return $this->data['symfony_minor_version'];
}

public function isSymfonyLts(): bool
{
return $this->data['symfony_lts'];
}





public function getSymfonyEom(): string
{
return $this->data['symfony_eom'];
}





public function getSymfonyEol(): string
{
return $this->data['symfony_eol'];
}




public function getPhpVersion(): string
{
return $this->data['php_version'];
}




public function getPhpVersionExtra(): ?string
{
return $this->data['php_version_extra'] ?? null;
}

public function getPhpArchitecture(): int
{
return $this->data['php_architecture'];
}

public function getPhpIntlLocale(): string
{
return $this->data['php_intl_locale'];
}

public function getPhpTimezone(): string
{
return $this->data['php_timezone'];
}




public function getEnv(): string
{
return $this->data['env'];
}






public function isDebug(): bool|string
{
return $this->data['debug'];
}




public function hasXdebug(): bool
{
return $this->data['xdebug_enabled'];
}




public function hasXdebugInfo(): bool
{
return \function_exists('xdebug_info');
}




public function hasApcu(): bool
{
return $this->data['apcu_enabled'];
}




public function hasZendOpcache(): bool
{
return $this->data['zend_opcache_enabled'];
}

public function getBundles(): array|Data
{
return $this->data['bundles'];
}




public function getSapiName(): string
{
return $this->data['sapi_name'];
}

public function getName(): string
{
return 'config';
}

private function determineSymfonyState(): string
{
$now = new \DateTimeImmutable();
$eom = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_MAINTENANCE)->modify('last day of this month');
$eol = \DateTimeImmutable::createFromFormat('d/m/Y', '01/'.Kernel::END_OF_LIFE)->modify('last day of this month');

if ($now > $eol) {
$versionState = 'eol';
} elseif ($now > $eom) {
$versionState = 'eom';
} elseif ('' !== Kernel::EXTRA_VERSION) {
$versionState = 'dev';
} else {
$versionState = 'stable';
}

return $versionState;
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\Stopwatch\StopwatchEvent;






class TimeDataCollector extends DataCollector implements LateDataCollectorInterface
{
private ?KernelInterface $kernel;
private ?Stopwatch $stopwatch;

public function __construct(?KernelInterface $kernel = null, ?Stopwatch $stopwatch = null)
{
$this->kernel = $kernel;
$this->stopwatch = $stopwatch;
$this->data = ['events' => [], 'stopwatch_installed' => false, 'start_time' => 0];
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
if (null !== $this->kernel) {
$startTime = $this->kernel->getStartTime();
} else {
$startTime = $request->server->get('REQUEST_TIME_FLOAT');
}

$this->data = [
'token' => $request->attributes->get('_stopwatch_token'),
'start_time' => $startTime * 1000,
'events' => [],
'stopwatch_installed' => class_exists(Stopwatch::class, false),
];
}

public function reset(): void
{
$this->data = ['events' => [], 'stopwatch_installed' => false, 'start_time' => 0];

$this->stopwatch?->reset();
}

public function lateCollect(): void
{
if (null !== $this->stopwatch && isset($this->data['token'])) {
$this->setEvents($this->stopwatch->getSectionEvents($this->data['token']));
}
unset($this->data['token']);
}




public function setEvents(array $events): void
{
foreach ($events as $event) {
$event->ensureStopped();
}

$this->data['events'] = $events;
}




public function getEvents(): array
{
return $this->data['events'];
}




public function getDuration(): float
{
if (!isset($this->data['events']['__section__'])) {
return 0;
}

$lastEvent = $this->data['events']['__section__'];

return $lastEvent->getOrigin() + $lastEvent->getDuration() - $this->getStartTime();
}






public function getInitTime(): float
{
if (!isset($this->data['events']['__section__'])) {
return 0;
}

return $this->data['events']['__section__']->getOrigin() - $this->getStartTime();
}

public function getStartTime(): float
{
return $this->data['start_time'];
}

public function isStopwatchInstalled(): bool
{
return $this->data['stopwatch_installed'];
}

public function getName(): string
{
return 'time';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






class AjaxDataCollector extends DataCollector
{
public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{

}

public function reset(): void
{

}

public function getName(): string
{
return 'ajax';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider;
use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\Server\Connection;






class DumpDataCollector extends DataCollector implements DataDumperInterface
{
private ?Stopwatch $stopwatch = null;
private string|FileLinkFormatter|false $fileLinkFormat;
private int $dataCount = 0;
private bool $isCollected = true;
private int $clonesCount = 0;
private int $clonesIndex = 0;
private array $rootRefs;
private string $charset;
private ?RequestStack $requestStack;
private DataDumperInterface|Connection|null $dumper;
private mixed $sourceContextProvider;
private bool $webMode;

public function __construct(?Stopwatch $stopwatch = null, string|FileLinkFormatter|null $fileLinkFormat = null, ?string $charset = null, ?RequestStack $requestStack = null, DataDumperInterface|Connection|null $dumper = null, ?bool $webMode = null)
{
$fileLinkFormat = $fileLinkFormat ?: \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
$this->stopwatch = $stopwatch;
$this->fileLinkFormat = $fileLinkFormat instanceof FileLinkFormatter && false === $fileLinkFormat->format('', 0) ? false : $fileLinkFormat;
$this->charset = $charset ?: \ini_get('php.output_encoding') ?: \ini_get('default_charset') ?: 'UTF-8';
$this->requestStack = $requestStack;
$this->dumper = $dumper;
$this->webMode = $webMode ?? !\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true);


$this->rootRefs = [
&$this->data,
&$this->dataCount,
&$this->isCollected,
&$this->clonesCount,
];

$this->sourceContextProvider = $dumper instanceof Connection && isset($dumper->getContextProviders()['source']) ? $dumper->getContextProviders()['source'] : new SourceContextProvider($this->charset);
}

public function __clone()
{
$this->clonesIndex = ++$this->clonesCount;
}

public function dump(Data $data): ?string
{
$this->stopwatch?->start('dump');

['name' => $name, 'file' => $file, 'line' => $line, 'file_excerpt' => $fileExcerpt] = $this->sourceContextProvider->getContext();

if (!$this->dumper || $this->dumper instanceof Connection && !$this->dumper->write($data)) {
$this->isCollected = false;
}

$context = $data->getContext();
$label = $context['label'] ?? '';
unset($context['label']);
$data = $data->withContext($context);

if ($this->dumper && !$this->dumper instanceof Connection) {
$this->doDump($this->dumper, $data, $name, $file, $line, $label);
}

if (!$this->dataCount) {
$this->data = [];
}
$this->data[] = compact('data', 'name', 'file', 'line', 'fileExcerpt', 'label');
++$this->dataCount;

$this->stopwatch?->stop('dump');

return null;
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
if (!$this->dataCount) {
$this->data = [];
}


if ($this->dumper || ($this->requestStack && $this->requestStack->getMainRequest() !== $request) || $request->isXmlHttpRequest() || $request->headers->has('Origin')) {
return;
}


if (!$this->requestStack
|| !$response->headers->has('X-Debug-Token')
|| $response->isRedirection()
|| ($response->headers->has('Content-Type') && !str_contains($response->headers->get('Content-Type') ?? '', 'html'))
|| 'html' !== $request->getRequestFormat()
|| false === strripos($response->getContent(), '</body>')
) {
if ($response->headers->has('Content-Type') && str_contains($response->headers->get('Content-Type') ?? '', 'html')) {
$dumper = new HtmlDumper('php://output', $this->charset);
$dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]);
} else {
$dumper = new CliDumper('php://output', $this->charset);
$dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]);
}

foreach ($this->data as $dump) {
$this->doDump($dumper, $dump['data'], $dump['name'], $dump['file'], $dump['line'], $dump['label'] ?? '');
}
}
}

public function reset(): void
{
$this->stopwatch?->reset();
parent::reset();
$this->dataCount = 0;
$this->isCollected = true;
$this->clonesCount = 0;
$this->clonesIndex = 0;
}

public function __serialize(): array
{
if (!$this->dataCount) {
$this->data = [];
}

if ($this->clonesCount !== $this->clonesIndex) {
return [];
}

$this->data[] = $this->fileLinkFormat;
$this->data[] = $this->charset;
$this->dataCount = 0;
$this->isCollected = true;

return ['data' => $this->data];
}

public function __unserialize(array $data): void
{
$this->data = array_pop($data) ?? [];
$charset = array_pop($this->data);
$fileLinkFormat = array_pop($this->data);
$this->dataCount = \count($this->data);
foreach ($this->data as $dump) {
if (!\is_string($dump['name']) || !\is_string($dump['file']) || !\is_int($dump['line'])) {
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}
}

self::__construct($this->stopwatch ?? null, \is_string($fileLinkFormat) || $fileLinkFormat instanceof FileLinkFormatter ? $fileLinkFormat : null, \is_string($charset) ? $charset : null);
}

public function getDumpsCount(): int
{
return $this->dataCount;
}

public function getDumps(string $format, int $maxDepthLimit = -1, int $maxItemsPerDepth = -1): array
{
$data = fopen('php://memory', 'r+');

if ('html' === $format) {
$dumper = new HtmlDumper($data, $this->charset);
$dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]);
} else {
throw new \InvalidArgumentException(\sprintf('Invalid dump format: "%s".', $format));
}
$dumps = [];

if (!$this->dataCount) {
return $this->data = [];
}

foreach ($this->data as $dump) {
$dumper->dump($dump['data']->withMaxDepth($maxDepthLimit)->withMaxItemsPerDepth($maxItemsPerDepth));
$dump['data'] = stream_get_contents($data, -1, 0);
ftruncate($data, 0);
rewind($data);
$dumps[] = $dump;
}

return $dumps;
}

public function getName(): string
{
return 'dump';
}

public function __destruct()
{
if (0 === $this->clonesCount-- && !$this->isCollected && $this->dataCount) {
$this->clonesCount = 0;
$this->isCollected = true;

$h = headers_list();
$i = \count($h);
array_unshift($h, 'Content-Type: '.\ini_get('default_mimetype'));
while (0 !== stripos($h[$i], 'Content-Type:')) {
--$i;
}

if ($this->webMode) {
$dumper = new HtmlDumper('php://output', $this->charset);
$dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]);
} else {
$dumper = new CliDumper('php://output', $this->charset);
$dumper->setDisplayOptions(['fileLinkFormat' => $this->fileLinkFormat]);
}

foreach ($this->data as $i => $dump) {
$this->data[$i] = null;
$this->doDump($dumper, $dump['data'], $dump['name'], $dump['file'], $dump['line'], $dump['label'] ?? '');
}

$this->data = [];
$this->dataCount = 0;
}
}

private function doDump(DataDumperInterface $dumper, Data $data, string $name, string $file, int $line, string $label): void
{
if ($dumper instanceof CliDumper) {
$contextDumper = function ($name, $file, $line, $fmt, $label) {
$this->line = '' !== $label ? $this->style('meta', $label).' in ' : '';

if ($this instanceof HtmlDumper) {
if ($file) {
$s = $this->style('meta', '%s');
$f = strip_tags($this->style('', $file));
$name = strip_tags($this->style('', $name));
if ($fmt && $link = \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line)) {
$name = \sprintf('<a href="%s" title="%s">'.$s.'</a>', strip_tags($this->style('', $link)), $f, $name);
} else {
$name = \sprintf('<abbr title="%s">'.$s.'</abbr>', $f, $name);
}
} else {
$name = $this->style('meta', $name);
}
$this->line .= $name.' on line '.$this->style('meta', $line).':';
} else {
$this->line .= $this->style('meta', $name).' on line '.$this->style('meta', $line).':';
}
$this->dumpLine(0);
};
$contextDumper = $contextDumper->bindTo($dumper, $dumper);
$contextDumper($name, $file, $line, $this->fileLinkFormat, $label);
} else {
$cloner = new VarCloner();
$dumper->dump($cloner->cloneVar(('' !== $label ? $label.' in ' : '').$name.' on line '.$line.':'));
}
$dumper->dump($data);
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\VarDumper\Caster\CutStub;
use Symfony\Component\VarDumper\Caster\ReflectionCaster;
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\Stub;
use Symfony\Component\VarDumper\Cloner\VarCloner;









abstract class DataCollector implements DataCollectorInterface
{



protected $data = [];

private ClonerInterface $cloner;







protected function cloneVar(mixed $var): Data
{
if ($var instanceof Data) {
return $var;
}
if (!isset($this->cloner)) {
$this->cloner = new VarCloner();
$this->cloner->setMaxItems(-1);
$this->cloner->addCasters($this->getCasters());
}

return $this->cloner->cloneVar($var);
}




protected function getCasters()
{
$casters = [
'*' => function ($v, array $a, Stub $s, $isNested) {
if (!$v instanceof Stub) {
$b = $a;
foreach ($a as $k => $v) {
if (!\is_object($v) || $v instanceof \DateTimeInterface || $v instanceof Stub) {
continue;
}

try {
$a[$k] = $s = new CutStub($v);

if ($b[$k] === $s) {

$a[$k] = $v;
}
} catch (\TypeError $e) {

}
}
}

return $a;
},
] + ReflectionCaster::UNSET_CLOSURE_FILE_INFO;

return $casters;
}

public function __sleep(): array
{
return ['data'];
}




public function __wakeup()
{
}




final protected function serialize(): void
{
}




final protected function unserialize(string $data): void
{
}




public function reset()
{
$this->data = [];
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\VarDumper\Cloner\Data;






class RequestDataCollector extends DataCollector implements EventSubscriberInterface, LateDataCollectorInterface
{



private \SplObjectStorage $controllers;
private array $sessionUsages = [];
private ?RequestStack $requestStack;

public function __construct(?RequestStack $requestStack = null)
{
$this->controllers = new \SplObjectStorage();
$this->requestStack = $requestStack;
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{

$attributes = [];
$route = '';
foreach ($request->attributes->all() as $key => $value) {
if ('_route' === $key) {
$route = \is_object($value) ? $value->getPath() : $value;
$attributes[$key] = $route;
} else {
$attributes[$key] = $value;
}
}

$content = $request->getContent();

$sessionMetadata = [];
$sessionAttributes = [];
$flashes = [];
if (!$request->attributes->getBoolean('_stateless') && $request->hasSession()) {
$session = $request->getSession();
if ($session->isStarted()) {
$sessionMetadata['Created'] = date(\DATE_RFC822, $session->getMetadataBag()->getCreated());
$sessionMetadata['Last used'] = date(\DATE_RFC822, $session->getMetadataBag()->getLastUsed());
$sessionMetadata['Lifetime'] = $session->getMetadataBag()->getLifetime();
$sessionAttributes = $session->all();
$flashes = $session->getFlashBag()->peekAll();
}
}

$statusCode = $response->getStatusCode();

$responseCookies = [];
foreach ($response->headers->getCookies() as $cookie) {
$responseCookies[$cookie->getName()] = $cookie;
}

$dotenvVars = [];
foreach (explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '') as $name) {
if ('' !== $name && isset($_ENV[$name])) {
$dotenvVars[$name] = $_ENV[$name];
}
}

$this->data = [
'method' => $request->getMethod(),
'format' => $request->getRequestFormat(),
'content_type' => $response->headers->get('Content-Type', 'text/html'),
'status_text' => Response::$statusTexts[$statusCode] ?? '',
'status_code' => $statusCode,
'request_query' => $request->query->all(),
'request_request' => $request->request->all(),
'request_files' => $request->files->all(),
'request_headers' => $request->headers->all(),
'request_server' => $request->server->all(),
'request_cookies' => $request->cookies->all(),
'request_attributes' => $attributes,
'route' => $route,
'response_headers' => $response->headers->all(),
'response_cookies' => $responseCookies,
'session_metadata' => $sessionMetadata,
'session_attributes' => $sessionAttributes,
'session_usages' => array_values($this->sessionUsages),
'stateless_check' => $this->requestStack?->getMainRequest()?->attributes->get('_stateless') ?? false,
'flashes' => $flashes,
'path_info' => $request->getPathInfo(),
'controller' => 'n/a',
'locale' => $request->getLocale(),
'dotenv_vars' => $dotenvVars,
];

if (isset($this->data['request_headers']['php-auth-pw'])) {
$this->data['request_headers']['php-auth-pw'] = '******';
}

if (isset($this->data['request_server']['PHP_AUTH_PW'])) {
$this->data['request_server']['PHP_AUTH_PW'] = '******';
}

if (isset($this->data['request_request']['_password'])) {
$encodedPassword = rawurlencode($this->data['request_request']['_password']);
$content = str_replace('_password='.$encodedPassword, '_password=******', $content);
$this->data['request_request']['_password'] = '******';
}

$this->data['content'] = $content;

foreach ($this->data as $key => $value) {
if (!\is_array($value)) {
continue;
}
if ('request_headers' === $key || 'response_headers' === $key) {
$this->data[$key] = array_map(fn ($v) => isset($v[0]) && !isset($v[1]) ? $v[0] : $v, $value);
}
}

if (isset($this->controllers[$request])) {
$this->data['controller'] = $this->parseController($this->controllers[$request]);
unset($this->controllers[$request]);
}

if ($request->attributes->has('_redirected') && $redirectCookie = $request->cookies->get('sf_redirect')) {
$this->data['redirect'] = json_decode($redirectCookie, true);

$response->headers->clearCookie('sf_redirect');
}

if ($response->isRedirect()) {
$response->headers->setCookie(new Cookie(
'sf_redirect',
json_encode([
'token' => $response->headers->get('x-debug-token'),
'route' => $request->attributes->get('_route', 'n/a'),
'method' => $request->getMethod(),
'controller' => $this->parseController($request->attributes->get('_controller')),
'status_code' => $statusCode,
'status_text' => Response::$statusTexts[$statusCode],
]),
0, '/', null, $request->isSecure(), true, false, 'lax'
));
}

$this->data['identifier'] = $this->data['route'] ?: (\is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']);

if ($response->headers->has('x-previous-debug-token')) {
$this->data['forward_token'] = $response->headers->get('x-previous-debug-token');
}
}

public function lateCollect(): void
{
$this->data = $this->cloneVar($this->data);
}

public function reset(): void
{
parent::reset();
$this->controllers = new \SplObjectStorage();
$this->sessionUsages = [];
}

public function getMethod(): string
{
return $this->data['method'];
}

public function getPathInfo(): string
{
return $this->data['path_info'];
}




public function getRequestRequest()
{
return new ParameterBag($this->data['request_request']->getValue());
}




public function getRequestQuery()
{
return new ParameterBag($this->data['request_query']->getValue());
}




public function getRequestFiles()
{
return new ParameterBag($this->data['request_files']->getValue());
}




public function getRequestHeaders()
{
return new ParameterBag($this->data['request_headers']->getValue());
}




public function getRequestServer(bool $raw = false)
{
return new ParameterBag($this->data['request_server']->getValue($raw));
}




public function getRequestCookies(bool $raw = false)
{
return new ParameterBag($this->data['request_cookies']->getValue($raw));
}




public function getRequestAttributes()
{
return new ParameterBag($this->data['request_attributes']->getValue());
}




public function getResponseHeaders()
{
return new ParameterBag($this->data['response_headers']->getValue());
}




public function getResponseCookies()
{
return new ParameterBag($this->data['response_cookies']->getValue());
}

public function getSessionMetadata(): array
{
return $this->data['session_metadata']->getValue();
}

public function getSessionAttributes(): array
{
return $this->data['session_attributes']->getValue();
}

public function getStatelessCheck(): bool
{
return $this->data['stateless_check'];
}

public function getSessionUsages(): Data|array
{
return $this->data['session_usages'];
}

public function getFlashes(): array
{
return $this->data['flashes']->getValue();
}




public function getContent()
{
return $this->data['content'];
}




public function isJsonRequest()
{
return 1 === preg_match('{^application/(?:\w+\++)*json$}i', $this->data['request_headers']['content-type']);
}




public function getPrettyJson()
{
$decoded = json_decode($this->getContent());

return \JSON_ERROR_NONE === json_last_error() ? json_encode($decoded, \JSON_PRETTY_PRINT) : null;
}

public function getContentType(): string
{
return $this->data['content_type'];
}

public function getStatusText(): string
{
return $this->data['status_text'];
}

public function getStatusCode(): int
{
return $this->data['status_code'];
}

public function getFormat(): string
{
return $this->data['format'];
}

public function getLocale(): string
{
return $this->data['locale'];
}




public function getDotenvVars()
{
return new ParameterBag($this->data['dotenv_vars']->getValue());
}






public function getRoute(): string
{
return $this->data['route'];
}

public function getIdentifier(): string
{
return $this->data['identifier'];
}






public function getRouteParams(): array
{
return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params']->getValue() : [];
}







public function getController(): array|string|Data
{
return $this->data['controller'];
}







public function getRedirect(): array|Data|false
{
return $this->data['redirect'] ?? false;
}

public function getForwardToken(): ?string
{
return $this->data['forward_token'] ?? null;
}

public function onKernelController(ControllerEvent $event): void
{
$this->controllers[$event->getRequest()] = $event->getController();
}

public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}

if ($event->getRequest()->cookies->has('sf_redirect')) {
$event->getRequest()->attributes->set('_redirected', true);
}
}

public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}

public function getName(): string
{
return 'request';
}

public function collectSessionUsage(): void
{
$trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);

$traceEndIndex = \count($trace) - 1;
for ($i = $traceEndIndex; $i > 0; --$i) {
if (null !== ($class = $trace[$i]['class'] ?? null) && (is_subclass_of($class, SessionInterface::class) || is_subclass_of($class, SessionBagInterface::class))) {
$traceEndIndex = $i;
break;
}
}

if ((\count($trace) - 1) === $traceEndIndex) {
return;
}


array_splice($trace, 0, $traceEndIndex);


$name = \sprintf('%s:%s', $trace[1]['class'] ?? $trace[0]['file'], $trace[0]['line']);
if (!\array_key_exists($name, $this->sessionUsages)) {
$this->sessionUsages[$name] = [
'name' => $name,
'file' => $trace[0]['file'],
'line' => $trace[0]['line'],
'trace' => $trace,
];
}
}




private function parseController(array|object|string|null $controller): array|string
{
if (\is_string($controller) && str_contains($controller, '::')) {
$controller = explode('::', $controller);
}

if (\is_array($controller)) {
try {
$r = new \ReflectionMethod($controller[0], $controller[1]);

return [
'class' => \is_object($controller[0]) ? get_debug_type($controller[0]) : $controller[0],
'method' => $controller[1],
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];
} catch (\ReflectionException) {
if (\is_callable($controller)) {

return [
'class' => \is_object($controller[0]) ? get_debug_type($controller[0]) : $controller[0],
'method' => $controller[1],
'file' => 'n/a',
'line' => 'n/a',
];
}
}
}

if ($controller instanceof \Closure) {
$r = new \ReflectionFunction($controller);

$controller = [
'class' => $r->getName(),
'method' => null,
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];

if (str_contains($r->name, '{closure')) {
return $controller;
}
$controller['method'] = $r->name;

if ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
$controller['class'] = $class->name;
} else {
return $r->name;
}

return $controller;
}

if (\is_object($controller)) {
$r = new \ReflectionClass($controller);

return [
'class' => $r->getName(),
'method' => null,
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];
}

return \is_string($controller) ? $controller : 'n/a';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;




class RouterDataCollector extends DataCollector
{



protected $controllers;

public function __construct()
{
$this->reset();
}




public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
if ($response instanceof RedirectResponse) {
$this->data['redirect'] = true;
$this->data['url'] = $response->getTargetUrl();

if ($this->controllers->offsetExists($request)) {
$this->data['route'] = $this->guessRoute($request, $this->controllers[$request]);
}
}

unset($this->controllers[$request]);
}




public function reset()
{
$this->controllers = new \SplObjectStorage();

$this->data = [
'redirect' => false,
'url' => null,
'route' => null,
];
}




protected function guessRoute(Request $request, string|object|array $controller)
{
return 'n/a';
}






public function onKernelController(ControllerEvent $event)
{
$this->controllers[$event->getRequest()] = $event->getController();
}




public function getRedirect(): bool
{
return $this->data['redirect'];
}

public function getTargetUrl(): ?string
{
return $this->data['url'];
}

public function getTargetRoute(): ?string
{
return $this->data['route'];
}

public function getName(): string
{
return 'router';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;






class ExceptionDataCollector extends DataCollector
{
public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
if (null !== $exception) {
$this->data = [
'exception' => FlattenException::createWithDataRepresentation($exception),
];
}
}

public function hasException(): bool
{
return isset($this->data['exception']);
}

public function getException(): \Exception|FlattenException
{
return $this->data['exception'];
}

public function getMessage(): string
{
return $this->data['exception']->getMessage();
}

public function getCode(): int
{
return $this->data['exception']->getCode();
}

public function getStatusCode(): int
{
return $this->data['exception']->getStatusCode();
}

public function getTrace(): array
{
return $this->data['exception']->getTrace();
}

public function getName(): string
{
return 'exception';
}
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;






interface LateDataCollectorInterface
{





public function lateCollect();
}
<?php










namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerConfigurator;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\VarDumper\Cloner\Data;






class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
{
private ?DebugLoggerInterface $logger;
private ?string $containerPathPrefix;
private ?Request $currentRequest = null;
private ?RequestStack $requestStack;
private ?array $processedLogs = null;

public function __construct(?object $logger = null, ?string $containerPathPrefix = null, ?RequestStack $requestStack = null)
{
$this->logger = DebugLoggerConfigurator::getDebugLogger($logger);
$this->containerPathPrefix = $containerPathPrefix;
$this->requestStack = $requestStack;
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
$this->currentRequest = $this->requestStack && $this->requestStack->getMainRequest() !== $request ? $request : null;
}

public function lateCollect(): void
{
if ($this->logger) {
$containerDeprecationLogs = $this->getContainerDeprecationLogs();
$this->data = $this->computeErrorsCount($containerDeprecationLogs);

$this->data['compiler_logs'] = [];
$this->data['compiler_logs_filepath'] = $this->containerPathPrefix.'Compiler.log';
$this->data['logs'] = $this->sanitizeLogs(array_merge($this->logger->getLogs($this->currentRequest), $containerDeprecationLogs));
$this->data = $this->cloneVar($this->data);
}
$this->currentRequest = null;
}

public function getLogs(): Data|array
{
return $this->data['logs'] ?? [];
}

public function getProcessedLogs(): array
{
if (null !== $this->processedLogs) {
return $this->processedLogs;
}

$rawLogs = $this->getLogs();
if ([] === $rawLogs) {
return $this->processedLogs = $rawLogs;
}

$logs = [];
foreach ($this->getLogs()->getValue() as $rawLog) {
$rawLogData = $rawLog->getValue();

if ($rawLogData['priority']->getValue() > 300) {
$logType = 'error';
} elseif (isset($rawLogData['scream']) && false === $rawLogData['scream']->getValue()) {
$logType = 'deprecation';
} elseif (isset($rawLogData['scream']) && true === $rawLogData['scream']->getValue()) {
$logType = 'silenced';
} else {
$logType = 'regular';
}

$logs[] = [
'type' => $logType,
'errorCount' => $rawLog['errorCount'] ?? 1,
'timestamp' => $rawLogData['timestamp_rfc3339']->getValue(),
'priority' => $rawLogData['priority']->getValue(),
'priorityName' => $rawLogData['priorityName']->getValue(),
'channel' => $rawLogData['channel']->getValue(),
'message' => $rawLogData['message'],
'context' => $rawLogData['context'],
];
}


usort($logs, static fn ($logA, $logB) => $logA['timestamp'] <=> $logB['timestamp']);

return $this->processedLogs = $logs;
}

public function getFilters(): array
{
$filters = [
'channel' => [],
'priority' => [
'Debug' => 100,
'Info' => 200,
'Notice' => 250,
'Warning' => 300,
'Error' => 400,
'Critical' => 500,
'Alert' => 550,
'Emergency' => 600,
],
];

$allChannels = [];
foreach ($this->getProcessedLogs() as $log) {
if ('' === trim($log['channel'] ?? '')) {
continue;
}

$allChannels[] = $log['channel'];
}
$channels = array_unique($allChannels);
sort($channels);
$filters['channel'] = $channels;

return $filters;
}

public function getPriorities(): Data|array
{
return $this->data['priorities'] ?? [];
}

public function countErrors(): int
{
return $this->data['error_count'] ?? 0;
}

public function countDeprecations(): int
{
return $this->data['deprecation_count'] ?? 0;
}

public function countWarnings(): int
{
return $this->data['warning_count'] ?? 0;
}

public function countScreams(): int
{
return $this->data['scream_count'] ?? 0;
}

public function getCompilerLogs(): Data
{
return $this->cloneVar($this->getContainerCompilerLogs($this->data['compiler_logs_filepath'] ?? null));
}

public function getName(): string
{
return 'logger';
}

private function getContainerDeprecationLogs(): array
{
if (null === $this->containerPathPrefix || !is_file($file = $this->containerPathPrefix.'Deprecations.log')) {
return [];
}

if ('' === $logContent = trim(file_get_contents($file))) {
return [];
}

$bootTime = filemtime($file);
$logs = [];
foreach (unserialize($logContent) as $log) {
$log['context'] = ['exception' => new SilencedErrorContext($log['type'], $log['file'], $log['line'], $log['trace'], $log['count'])];
$log['timestamp'] = $bootTime;
$log['timestamp_rfc3339'] = (new \DateTimeImmutable())->setTimestamp($bootTime)->format(\DateTimeInterface::RFC3339_EXTENDED);
$log['priority'] = 100;
$log['priorityName'] = 'DEBUG';
$log['channel'] = null;
$log['scream'] = false;
unset($log['type'], $log['file'], $log['line'], $log['trace'], $log['trace'], $log['count']);
$logs[] = $log;
}

return $logs;
}

private function getContainerCompilerLogs(?string $compilerLogsFilepath = null): array
{
if (!$compilerLogsFilepath || !is_file($compilerLogsFilepath)) {
return [];
}

$logs = [];
foreach (file($compilerLogsFilepath, \FILE_IGNORE_NEW_LINES) as $log) {
$log = explode(': ', $log, 2);
if (!isset($log[1]) || !preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $log[0])) {
$log = ['Unknown Compiler Pass', implode(': ', $log)];
}

$logs[$log[0]][] = ['message' => $log[1]];
}

return $logs;
}

private function sanitizeLogs(array $logs): array
{
$sanitizedLogs = [];
$silencedLogs = [];

foreach ($logs as $log) {
if (!$this->isSilencedOrDeprecationErrorLog($log)) {
$sanitizedLogs[] = $log;

continue;
}

$message = '_'.$log['message'];
$exception = $log['context']['exception'];

if ($exception instanceof SilencedErrorContext) {
if (isset($silencedLogs[$h = spl_object_hash($exception)])) {
continue;
}
$silencedLogs[$h] = true;

if (!isset($sanitizedLogs[$message])) {
$sanitizedLogs[$message] = $log + [
'errorCount' => 0,
'scream' => true,
];
}
$sanitizedLogs[$message]['errorCount'] += $exception->count;

continue;
}

$errorId = hash('xxh128', "{$exception->getSeverity()}/{$exception->getLine()}/{$exception->getFile()}\0{$message}", true);

if (isset($sanitizedLogs[$errorId])) {
++$sanitizedLogs[$errorId]['errorCount'];
} else {
$log += [
'errorCount' => 1,
'scream' => false,
];

$sanitizedLogs[$errorId] = $log;
}
}

return array_values($sanitizedLogs);
}

private function isSilencedOrDeprecationErrorLog(array $log): bool
{
if (!isset($log['context']['exception'])) {
return false;
}

$exception = $log['context']['exception'];

if ($exception instanceof SilencedErrorContext) {
return true;
}

if ($exception instanceof \ErrorException && \in_array($exception->getSeverity(), [\E_DEPRECATED, \E_USER_DEPRECATED], true)) {
return true;
}

return false;
}

private function computeErrorsCount(array $containerDeprecationLogs): array
{
$silencedLogs = [];
$count = [
'error_count' => $this->logger->countErrors($this->currentRequest),
'deprecation_count' => 0,
'warning_count' => 0,
'scream_count' => 0,
'priorities' => [],
];

foreach ($this->logger->getLogs($this->currentRequest) as $log) {
if (isset($count['priorities'][$log['priority']])) {
++$count['priorities'][$log['priority']]['count'];
} else {
$count['priorities'][$log['priority']] = [
'count' => 1,
'name' => $log['priorityName'],
];
}
if ('WARNING' === $log['priorityName']) {
++$count['warning_count'];
}

if ($this->isSilencedOrDeprecationErrorLog($log)) {
$exception = $log['context']['exception'];
if ($exception instanceof SilencedErrorContext) {
if (isset($silencedLogs[$h = spl_object_hash($exception)])) {
continue;
}
$silencedLogs[$h] = true;
$count['scream_count'] += $exception->count;
} else {
++$count['deprecation_count'];
}
}
}

foreach ($containerDeprecationLogs as $deprecationLog) {
$count['deprecation_count'] += $deprecationLog['context']['exception']->count;
}

ksort($count['priorities']);

return $count;
}
}
<?php










namespace Symfony\Component\HttpKernel\CacheWarmer;






interface WarmableInterface
{








public function warmUp(string $cacheDir );
}
<?php










namespace Symfony\Component\HttpKernel\CacheWarmer;






interface CacheWarmerInterface extends WarmableInterface
{










public function isOptional();
}
<?php










namespace Symfony\Component\HttpKernel\CacheWarmer;






abstract class CacheWarmer implements CacheWarmerInterface
{



protected function writeCacheFile(string $file, $content)
{
$tmpFile = @tempnam(\dirname($file), basename($file));
if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
@chmod($file, 0666 & ~umask());

return;
}

throw new \RuntimeException(\sprintf('Failed to write cache file "%s".', $file));
}
}
<?php










namespace Symfony\Component\HttpKernel\CacheWarmer;

use Symfony\Component\Console\Style\SymfonyStyle;








class CacheWarmerAggregate implements CacheWarmerInterface
{
private iterable $warmers;
private bool $debug;
private ?string $deprecationLogsFilepath;
private bool $optionalsEnabled = false;
private bool $onlyOptionalsEnabled = false;




public function __construct(iterable $warmers = [], bool $debug = false, ?string $deprecationLogsFilepath = null)
{
$this->warmers = $warmers;
$this->debug = $debug;
$this->deprecationLogsFilepath = $deprecationLogsFilepath;
}

public function enableOptionalWarmers(): void
{
$this->optionalsEnabled = true;
}

public function enableOnlyOptionalWarmers(): void
{
$this->onlyOptionalsEnabled = $this->optionalsEnabled = true;
}




public function warmUp(string $cacheDir, string|SymfonyStyle|null $buildDir = null, ?SymfonyStyle $io = null): array
{
if ($buildDir instanceof SymfonyStyle) {
trigger_deprecation('symfony/http-kernel', '6.4', 'Passing a "%s" as second argument of "%s()" is deprecated, pass it as third argument instead, after the build directory.', SymfonyStyle::class, __METHOD__);
$io = $buildDir;
$buildDir = null;
}

if ($collectDeprecations = $this->debug && !\defined('PHPUNIT_COMPOSER_INSTALL')) {
$collectedLogs = [];
$previousHandler = set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) {
if (\E_USER_DEPRECATED !== $type && \E_DEPRECATED !== $type) {
return $previousHandler ? $previousHandler($type, $message, $file, $line) : false;
}

if (isset($collectedLogs[$message])) {
++$collectedLogs[$message]['count'];

return null;
}

$backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3);

for ($i = 0; isset($backtrace[$i]); ++$i) {
if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) {
$backtrace = \array_slice($backtrace, 1 + $i);
break;
}
}

$collectedLogs[$message] = [
'type' => $type,
'message' => $message,
'file' => $file,
'line' => $line,
'trace' => $backtrace,
'count' => 1,
];

return null;
});
}

$preload = [];
try {
foreach ($this->warmers as $warmer) {
if (!$this->optionalsEnabled && $warmer->isOptional()) {
continue;
}
if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) {
continue;
}

$start = microtime(true);
foreach ((array) $warmer->warmUp($cacheDir, $buildDir) as $item) {
if (is_dir($item) || (str_starts_with($item, \dirname($cacheDir)) && !is_file($item)) || ($buildDir && str_starts_with($item, \dirname($buildDir)) && !is_file($item))) {
throw new \LogicException(\sprintf('"%s::warmUp()" should return a list of files or classes but "%s" is none of them.', $warmer::class, $item));
}
$preload[] = $item;
}

if ($io?->isDebug()) {
$io->info(\sprintf('"%s" completed in %0.2fms.', $warmer::class, 1000 * (microtime(true) - $start)));
}
}
} finally {
if ($collectDeprecations) {
restore_error_handler();

if (is_file($this->deprecationLogsFilepath)) {
$previousLogs = unserialize(file_get_contents($this->deprecationLogsFilepath));
if (\is_array($previousLogs)) {
$collectedLogs = array_merge($previousLogs, $collectedLogs);
}
}

file_put_contents($this->deprecationLogsFilepath, serialize(array_values($collectedLogs)));
}
}

return array_values(array_unique($preload));
}

public function isOptional(): bool
{
return false;
}
}
Copyright (c) 2020-present 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.
<?php










namespace Symfony\Polyfill\Php80;








final class Php80
{
public static function fdiv(float $dividend, float $divisor): float
{
return @($dividend / $divisor);
}

public static function get_debug_type($value): string
{
switch (true) {
case null === $value: return 'null';
case \is_bool($value): return 'bool';
case \is_string($value): return 'string';
case \is_array($value): return 'array';
case \is_int($value): return 'int';
case \is_float($value): return 'float';
case \is_object($value): break;
case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class';
default:
if (null === $type = @get_resource_type($value)) {
return 'unknown';
}

if ('Unknown' === $type) {
$type = 'closed';
}

return "resource ($type)";
}

$class = \get_class($value);

if (false === strpos($class, '@')) {
return $class;
}

return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous';
}

public static function get_resource_id($res): int
{
if (!\is_resource($res) && null === @get_resource_type($res)) {
throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res)));
}

return (int) $res;
}

public static function preg_last_error_msg(): string
{
switch (preg_last_error()) {
case \PREG_INTERNAL_ERROR:
return 'Internal error';
case \PREG_BAD_UTF8_ERROR:
return 'Malformed UTF-8 characters, possibly incorrectly encoded';
case \PREG_BAD_UTF8_OFFSET_ERROR:
return 'The offset did not correspond to the beginning of a valid UTF-8 code point';
case \PREG_BACKTRACK_LIMIT_ERROR:
return 'Backtrack limit exhausted';
case \PREG_RECURSION_LIMIT_ERROR:
return 'Recursion limit exhausted';
case \PREG_JIT_STACKLIMIT_ERROR:
return 'JIT stack limit exhausted';
case \PREG_NO_ERROR:
return 'No error';
default:
return 'Unknown error';
}
}

public static function str_contains(string $haystack, string $needle): bool
{
return '' === $needle || false !== strpos($haystack, $needle);
}

public static function str_starts_with(string $haystack, string $needle): bool
{
return 0 === strncmp($haystack, $needle, \strlen($needle));
}

public static function str_ends_with(string $haystack, string $needle): bool
{
if ('' === $needle || $needle === $haystack) {
return true;
}

if ('' === $haystack) {
return false;
}

$needleLength = \strlen($needle);

return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength);
}
}
<?php










if (\PHP_VERSION_ID < 80000) {
class ValueError extends Error
{
}
}
<?php










if (\PHP_VERSION_ID < 80000) {
class UnhandledMatchError extends Error
{
}
}
<?php










if (\PHP_VERSION_ID < 80000) {
interface Stringable
{



public function __toString();
}
}
<?php










#[Attribute(Attribute::TARGET_CLASS)]
final class Attribute
{
public const TARGET_CLASS = 1;
public const TARGET_FUNCTION = 2;
public const TARGET_METHOD = 4;
public const TARGET_PROPERTY = 8;
public const TARGET_CLASS_CONSTANT = 16;
public const TARGET_PARAMETER = 32;
public const TARGET_ALL = 63;
public const IS_REPEATABLE = 64;


public $flags;

public function __construct(int $flags = self::TARGET_ALL)
{
$this->flags = $flags;
}
}
<?php










if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) {
class PhpToken extends Symfony\Polyfill\Php80\PhpToken
{
}
}
<?php










namespace Symfony\Polyfill\Php80;






class PhpToken implements \Stringable
{



public $id;




public $text;




public $line;




public $pos;




public function __construct(int $id, string $text, int $line = -1, int $position = -1)
{
$this->id = $id;
$this->text = $text;
$this->line = $line;
$this->pos = $position;
}

public function getTokenName(): ?string
{
if ('UNKNOWN' === $name = token_name($this->id)) {
$name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text;
}

return $name;
}




public function is($kind): bool
{
foreach ((array) $kind as $value) {
if (\in_array($value, [$this->id, $this->text], true)) {
return true;
}
}

return false;
}

public function isIgnorable(): bool
{
return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true);
}

public function __toString(): string
{
return (string) $this->text;
}




public static function tokenize(string $code, int $flags = 0): array
{
$line = 1;
$position = 0;
$tokens = token_get_all($code, $flags);
foreach ($tokens as $index => $token) {
if (\is_string($token)) {
$id = \ord($token);
$text = $token;
} else {
[$id, $text, $line] = $token;
}
$tokens[$index] = new static($id, $text, $line, $position);
$position += \strlen($text);
}

return $tokens;
}
}
<?php










use Symfony\Polyfill\Php80 as p;

if (\PHP_VERSION_ID >= 80000) {
return;
}

if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) {
define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN);
}

if (!function_exists('fdiv')) {
function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); }
}
if (!function_exists('preg_last_error_msg')) {
function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); }
}
if (!function_exists('str_contains')) {
function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('str_starts_with')) {
function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('str_ends_with')) {
function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); }
}
if (!function_exists('get_debug_type')) {
function get_debug_type($value): string { return p\Php80::get_debug_type($value); }
}
if (!function_exists('get_resource_id')) {
function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); }
}
Copyright (c) 2018-present 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.
<?php










use Symfony\Polyfill\Ctype as p;

if (!function_exists('ctype_alnum')) {
function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); }
}
if (!function_exists('ctype_alpha')) {
function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); }
}
if (!function_exists('ctype_cntrl')) {
function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); }
}
if (!function_exists('ctype_digit')) {
function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); }
}
if (!function_exists('ctype_graph')) {
function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); }
}
if (!function_exists('ctype_lower')) {
function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); }
}
if (!function_exists('ctype_print')) {
function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); }
}
if (!function_exists('ctype_punct')) {
function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); }
}
if (!function_exists('ctype_space')) {
function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); }
}
if (!function_exists('ctype_upper')) {
function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); }
}
if (!function_exists('ctype_xdigit')) {
function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); }
}
<?php










namespace Symfony\Polyfill\Ctype;








final class Ctype
{









public static function ctype_alnum($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
}










public static function ctype_alpha($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
}










public static function ctype_cntrl($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
}










public static function ctype_digit($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
}










public static function ctype_graph($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
}










public static function ctype_lower($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
}










public static function ctype_print($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
}










public static function ctype_punct($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
}










public static function ctype_space($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
}










public static function ctype_upper($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
}










public static function ctype_xdigit($text)
{
$text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);

return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
}














private static function convert_int_to_char_for_ctype($int, $function)
{
if (!\is_int($int)) {
return $int;
}

if ($int < -128 || $int > 255) {
return (string) $int;
}

if (\PHP_VERSION_ID >= 80100) {
@trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED);
}

if ($int < 0) {
$int += 256;
}

return \chr($int);
}
}
<?php










use Symfony\Polyfill\Ctype as p;

if (\PHP_VERSION_ID >= 80000) {
return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('ctype_alnum')) {
function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
}
if (!function_exists('ctype_alpha')) {
function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
}
if (!function_exists('ctype_cntrl')) {
function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
}
if (!function_exists('ctype_digit')) {
function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
}
if (!function_exists('ctype_graph')) {
function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
}
if (!function_exists('ctype_lower')) {
function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
}
if (!function_exists('ctype_print')) {
function ctype_print($text) { return p\Ctype::ctype_print($text); }
}
if (!function_exists('ctype_punct')) {
function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
}
if (!function_exists('ctype_space')) {
function ctype_space($text) { return p\Ctype::ctype_space($text); }
}
if (!function_exists('ctype_upper')) {
function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
}
if (!function_exists('ctype_xdigit')) {
function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
}
Copyright (c) 2015-present 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.
<?php










namespace Symfony\Polyfill\Intl\Normalizer;











class Normalizer
{
public const FORM_D = \Normalizer::FORM_D;
public const FORM_KD = \Normalizer::FORM_KD;
public const FORM_C = \Normalizer::FORM_C;
public const FORM_KC = \Normalizer::FORM_KC;
public const NFD = \Normalizer::NFD;
public const NFKD = \Normalizer::NFKD;
public const NFC = \Normalizer::NFC;
public const NFKC = \Normalizer::NFKC;

private static $C;
private static $D;
private static $KD;
private static $cC;
private static $ulenMask = ["\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(string $s, int $form = self::FORM_C)
{
if (!\in_array($form, [self::NFD, self::NFKD, self::NFC, self::NFKC])) {
return false;
}
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(string $s, int $form = self::FORM_C)
{
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;
}

if (80000 > \PHP_VERSION_ID) {
return false;
}

throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form');
}

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  & (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") {


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) {


$ucls = $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 {


$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 = [];
$i = 0;
$len = \strlen($s);

while ($i < $len) {
if ($s[$i] < "\x80") {


if ($c) {
ksort($c);
$result .= implode('', $c);
$c = [];
}

$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) {


if ($uchr !== $j = $compatMap[$uchr] ?? ($decompMap[$uchr] ?? $uchr)) {
$uchr = $j;

$j = \strlen($uchr);
$ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"];

if ($ulen != $j) {


$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])) {


if (!isset($c[$combClass[$uchr]])) {
$c[$combClass[$uchr]] = '';
}
$c[$combClass[$uchr]] .= $uchr;
continue;
}
} else {


$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 = [];
}

$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;
}
}
<?php










use Symfony\Polyfill\Intl\Normalizer as p;

if (!function_exists('normalizer_is_normalized')) {
function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C): bool { return p\Normalizer::isNormalized((string) $string, (int) $form); }
}
if (!function_exists('normalizer_normalize')) {
function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C): string|false { return p\Normalizer::normalize((string) $string, (int) $form); }
}
<?php

class Normalizer extends Symfony\Polyfill\Intl\Normalizer\Normalizer
{



public const NONE = 2;
public const FORM_D = 4;
public const FORM_KD = 8;
public const FORM_C = 16;
public const FORM_KC = 32;
public const NFD = 4;
public const NFKD = 8;
public const NFC = 16;
public const NFKC = 32;
}
<?php

return array (
'À' => 'À',
'Á' => 'Á',
'Â' => 'Â',
'Ã' => 'Ã',
'Ä' => 'Ä',
'Å' => 'Å',
'Ç' => 'Ç',
'È' => 'È',
'É' => 'É',
'Ê' => 'Ê',
'Ë' => 'Ë',
'Ì' => 'Ì',
'Í' => 'Í',
'Î' => 'Î',
'Ï' => 'Ï',
'Ñ' => 'Ñ',
'Ò' => 'Ò',
'Ó' => 'Ó',
'Ô' => 'Ô',
'Õ' => 'Õ',
'Ö' => 'Ö',
'Ù' => 'Ù',
'Ú' => 'Ú',
'Û' => 'Û',
'Ü' => 'Ü',
'Ý' => 'Ý',
'à' => 'à',
'á' => 'á',
'â' => 'â',
'ã' => 'ã',
'ä' => 'ä',
'å' => 'å',
'ç' => 'ç',
'è' => 'è',
'é' => 'é',
'ê' => 'ê',
'ë' => 'ë',
'ì' => 'ì',
'í' => 'í',
'î' => 'î',
'ï' => 'ï',
'ñ' => 'ñ',
'ò' => 'ò',
'ó' => 'ó',
'ô' => 'ô',
'õ' => 'õ',
'ö' => 'ö',
'ù' => 'ù',
'ú' => 'ú',
'û' => 'û',
'ü' => 'ü',
'ý' => 'ý',
'ÿ' => 'ÿ',
'Ā' => 'Ā',
'ā' => 'ā',
'Ă' => 'Ă',
'ă' => 'ă',
'Ą' => 'Ą',
'ą' => 'ą',
'Ć' => 'Ć',
'ć' => 'ć',
'Ĉ' => 'Ĉ',
'ĉ' => 'ĉ',
'Ċ' => 'Ċ',
'ċ' => 'ċ',
'Č' => 'Č',
'č' => 'č',
'Ď' => 'Ď',
'ď' => 'ď',
'Ē' => 'Ē',
'ē' => 'ē',
'Ĕ' => 'Ĕ',
'ĕ' => 'ĕ',
'Ė' => 'Ė',
'ė' => 'ė',
'Ę' => 'Ę',
'ę' => 'ę',
'Ě' => 'Ě',
'ě' => 'ě',
'Ĝ' => 'Ĝ',
'ĝ' => 'ĝ',
'Ğ' => 'Ğ',
'ğ' => 'ğ',
'Ġ' => 'Ġ',
'ġ' => 'ġ',
'Ģ' => 'Ģ',
'ģ' => 'ģ',
'Ĥ' => 'Ĥ',
'ĥ' => 'ĥ',
'Ĩ' => 'Ĩ',
'ĩ' => 'ĩ',
'Ī' => 'Ī',
'ī' => 'ī',
'Ĭ' => 'Ĭ',
'ĭ' => 'ĭ',
'Į' => 'Į',
'į' => 'į',
'İ' => 'İ',
'Ĵ' => 'Ĵ',
'ĵ' => 'ĵ',
'Ķ' => 'Ķ',
'ķ' => 'ķ',
'Ĺ' => 'Ĺ',
'ĺ' => 'ĺ',
'Ļ' => 'Ļ',
'ļ' => 'ļ',
'Ľ' => 'Ľ',
'ľ' => 'ľ',
'Ń' => 'Ń',
'ń' => 'ń',
'Ņ' => 'Ņ',
'ņ' => 'ņ',
'Ň' => 'Ň',
'ň' => 'ň',
'Ō' => 'Ō',
'ō' => 'ō',
'Ŏ' => 'Ŏ',
'ŏ' => 'ŏ',
'Ő' => 'Ő',
'ő' => 'ő',
'Ŕ' => 'Ŕ',
'ŕ' => 'ŕ',
'Ŗ' => 'Ŗ',
'ŗ' => 'ŗ',
'Ř' => 'Ř',
'ř' => 'ř',
'Ś' => 'Ś',
'ś' => 'ś',
'Ŝ' => 'Ŝ',
'ŝ' => 'ŝ',
'Ş' => 'Ş',
'ş' => 'ş',
'Š' => 'Š',
'š' => 'š',
'Ţ' => 'Ţ',
'ţ' => 'ţ',
'Ť' => 'Ť',
'ť' => 'ť',
'Ũ' => 'Ũ',
'ũ' => 'ũ',
'Ū' => 'Ū',
'ū' => 'ū',
'Ŭ' => 'Ŭ',
'ŭ' => 'ŭ',
'Ů' => 'Ů',
'ů' => 'ů',
'Ű' => 'Ű',
'ű' => 'ű',
'Ų' => 'Ų',
'ų' => 'ų',
'Ŵ' => 'Ŵ',
'ŵ' => 'ŵ',
'Ŷ' => 'Ŷ',
'ŷ' => 'ŷ',
'Ÿ' => 'Ÿ',
'Ź' => 'Ź',
'ź' => 'ź',
'Ż' => 'Ż',
'ż' => 'ż',
'Ž' => 'Ž',
'ž' => 'ž',
'Ơ' => 'Ơ',
'ơ' => 'ơ',
'Ư' => 'Ư',
'ư' => 'ư',
'Ǎ' => 'Ǎ',
'ǎ' => 'ǎ',
'Ǐ' => 'Ǐ',
'ǐ' => 'ǐ',
'Ǒ' => 'Ǒ',
'ǒ' => 'ǒ',
'Ǔ' => 'Ǔ',
'ǔ' => 'ǔ',
'Ǖ' => 'Ǖ',
'ǖ' => 'ǖ',
'Ǘ' => 'Ǘ',
'ǘ' => 'ǘ',
'Ǚ' => 'Ǚ',
'ǚ' => 'ǚ',
'Ǜ' => 'Ǜ',
'ǜ' => 'ǜ',
'Ǟ' => 'Ǟ',
'ǟ' => 'ǟ',
'Ǡ' => 'Ǡ',
'ǡ' => 'ǡ',
'Ǣ' => 'Ǣ',
'ǣ' => 'ǣ',
'Ǧ' => 'Ǧ',
'ǧ' => 'ǧ',
'Ǩ' => 'Ǩ',
'ǩ' => 'ǩ',
'Ǫ' => 'Ǫ',
'ǫ' => 'ǫ',
'Ǭ' => 'Ǭ',
'ǭ' => 'ǭ',
'Ǯ' => 'Ǯ',
'ǯ' => 'ǯ',
'ǰ' => 'ǰ',
'Ǵ' => 'Ǵ',
'ǵ' => 'ǵ',
'Ǹ' => 'Ǹ',
'ǹ' => 'ǹ',
'Ǻ' => 'Ǻ',
'ǻ' => 'ǻ',
'Ǽ' => 'Ǽ',
'ǽ' => 'ǽ',
'Ǿ' => 'Ǿ',
'ǿ' => 'ǿ',
'Ȁ' => 'Ȁ',
'ȁ' => 'ȁ',
'Ȃ' => 'Ȃ',
'ȃ' => 'ȃ',
'Ȅ' => 'Ȅ',
'ȅ' => 'ȅ',
'Ȇ' => 'Ȇ',
'ȇ' => 'ȇ',
'Ȉ' => 'Ȉ',
'ȉ' => 'ȉ',
'Ȋ' => 'Ȋ',
'ȋ' => 'ȋ',
'Ȍ' => 'Ȍ',
'ȍ' => 'ȍ',
'Ȏ' => 'Ȏ',
'ȏ' => 'ȏ',
'Ȑ' => 'Ȑ',
'ȑ' => 'ȑ',
'Ȓ' => 'Ȓ',
'ȓ' => 'ȓ',
'Ȕ' => 'Ȕ',
'ȕ' => 'ȕ',
'Ȗ' => 'Ȗ',
'ȗ' => 'ȗ',
'Ș' => 'Ș',
'ș' => 'ș',
'Ț' => 'Ț',
'ț' => 'ț',
'Ȟ' => 'Ȟ',
'ȟ' => 'ȟ',
'Ȧ' => 'Ȧ',
'ȧ' => 'ȧ',
'Ȩ' => 'Ȩ',
'ȩ' => 'ȩ',
'Ȫ' => 'Ȫ',
'ȫ' => 'ȫ',
'Ȭ' => 'Ȭ',
'ȭ' => 'ȭ',
'Ȯ' => 'Ȯ',
'ȯ' => 'ȯ',
'Ȱ' => 'Ȱ',
'ȱ' => 'ȱ',
'Ȳ' => 'Ȳ',
'ȳ' => 'ȳ',
'΅' => '΅',
'Ά' => 'Ά',
'Έ' => 'Έ',
'Ή' => 'Ή',
'Ί' => 'Ί',
'Ό' => 'Ό',
'Ύ' => 'Ύ',
'Ώ' => 'Ώ',
'ΐ' => 'ΐ',
'Ϊ' => 'Ϊ',
'Ϋ' => 'Ϋ',
'ά' => 'ά',
'έ' => 'έ',
'ή' => 'ή',
'ί' => 'ί',
'ΰ' => 'ΰ',
'ϊ' => 'ϊ',
'ϋ' => 'ϋ',
'ό' => 'ό',
'ύ' => 'ύ',
'ώ' => 'ώ',
'ϓ' => 'ϓ',
'ϔ' => 'ϔ',
'Ѐ' => 'Ѐ',
'Ё' => 'Ё',
'Ѓ' => 'Ѓ',
'Ї' => 'Ї',
'Ќ' => 'Ќ',
'Ѝ' => 'Ѝ',
'Ў' => 'Ў',
'Й' => 'Й',
'й' => 'й',
'ѐ' => 'ѐ',
'ё' => 'ё',
'ѓ' => 'ѓ',
'ї' => 'ї',
'ќ' => 'ќ',
'ѝ' => 'ѝ',
'ў' => 'ў',
'Ѷ' => 'Ѷ',
'ѷ' => 'ѷ',
'Ӂ' => 'Ӂ',
'ӂ' => 'ӂ',
'Ӑ' => 'Ӑ',
'ӑ' => 'ӑ',
'Ӓ' => 'Ӓ',
'ӓ' => 'ӓ',
'Ӗ' => 'Ӗ',
'ӗ' => 'ӗ',
'Ӛ' => 'Ӛ',
'ӛ' => 'ӛ',
'Ӝ' => 'Ӝ',
'ӝ' => 'ӝ',
'Ӟ' => 'Ӟ',
'ӟ' => 'ӟ',
'Ӣ' => 'Ӣ',
'ӣ' => 'ӣ',
'Ӥ' => 'Ӥ',
'ӥ' => 'ӥ',
'Ӧ' => 'Ӧ',
'ӧ' => 'ӧ',
'Ӫ' => 'Ӫ',
'ӫ' => 'ӫ',
'Ӭ' => 'Ӭ',
'ӭ' => 'ӭ',
'Ӯ' => 'Ӯ',
'ӯ' => 'ӯ',
'Ӱ' => 'Ӱ',
'ӱ' => 'ӱ',
'Ӳ' => 'Ӳ',
'ӳ' => 'ӳ',
'Ӵ' => 'Ӵ',
'ӵ' => 'ӵ',
'Ӹ' => 'Ӹ',
'ӹ' => 'ӹ',
'آ' => 'آ',
'أ' => 'أ',
'ؤ' => 'ؤ',
'إ' => 'إ',
'ئ' => 'ئ',
'ۀ' => 'ۀ',
'ۂ' => 'ۂ',
'ۓ' => 'ۓ',
'ऩ' => 'ऩ',
'ऱ' => 'ऱ',
'ऴ' => 'ऴ',
'ো' => 'ো',
'ৌ' => 'ৌ',
'ୈ' => 'ୈ',
'ୋ' => 'ୋ',
'ୌ' => 'ୌ',
'ஔ' => 'ஔ',
'ொ' => 'ொ',
'ோ' => 'ோ',
'ௌ' => 'ௌ',
'ై' => 'ై',
'ೀ' => 'ೀ',
'ೇ' => 'ೇ',
'ೈ' => 'ೈ',
'ೊ' => 'ೊ',
'ೋ' => 'ೋ',
'ൊ' => 'ൊ',
'ോ' => 'ോ',
'ൌ' => 'ൌ',
'ේ' => 'ේ',
'ො' => 'ො',
'ෝ' => 'ෝ',
'ෞ' => 'ෞ',
'ဦ' => 'ဦ',
'ᬆ' => 'ᬆ',
'ᬈ' => 'ᬈ',
'ᬊ' => 'ᬊ',
'ᬌ' => 'ᬌ',
'ᬎ' => 'ᬎ',
'ᬒ' => 'ᬒ',
'ᬻ' => 'ᬻ',
'ᬽ' => 'ᬽ',
'ᭀ' => 'ᭀ',
'ᭁ' => 'ᭁ',
'ᭃ' => 'ᭃ',
'Ḁ' => 'Ḁ',
'ḁ' => 'ḁ',
'Ḃ' => 'Ḃ',
'ḃ' => 'ḃ',
'Ḅ' => 'Ḅ',
'ḅ' => 'ḅ',
'Ḇ' => 'Ḇ',
'ḇ' => 'ḇ',
'Ḉ' => 'Ḉ',
'ḉ' => 'ḉ',
'Ḋ' => 'Ḋ',
'ḋ' => 'ḋ',
'Ḍ' => 'Ḍ',
'ḍ' => 'ḍ',
'Ḏ' => 'Ḏ',
'ḏ' => 'ḏ',
'Ḑ' => 'Ḑ',
'ḑ' => 'ḑ',
'Ḓ' => 'Ḓ',
'ḓ' => 'ḓ',
'Ḕ' => 'Ḕ',
'ḕ' => 'ḕ',
'Ḗ' => 'Ḗ',
'ḗ' => 'ḗ',
'Ḙ' => 'Ḙ',
'ḙ' => 'ḙ',
'Ḛ' => 'Ḛ',
'ḛ' => 'ḛ',
'Ḝ' => 'Ḝ',
'ḝ' => 'ḝ',
'Ḟ' => 'Ḟ',
'ḟ' => 'ḟ',
'Ḡ' => 'Ḡ',
'ḡ' => 'ḡ',
'Ḣ' => 'Ḣ',
'ḣ' => 'ḣ',
'Ḥ' => 'Ḥ',
'ḥ' => 'ḥ',
'Ḧ' => 'Ḧ',
'ḧ' => 'ḧ',
'Ḩ' => 'Ḩ',
'ḩ' => 'ḩ',
'Ḫ' => 'Ḫ',
'ḫ' => 'ḫ',
'Ḭ' => 'Ḭ',
'ḭ' => 'ḭ',
'Ḯ' => 'Ḯ',
'ḯ' => 'ḯ',
'Ḱ' => 'Ḱ',
'ḱ' => 'ḱ',
'Ḳ' => 'Ḳ',
'ḳ' => 'ḳ',
'Ḵ' => 'Ḵ',
'ḵ' => 'ḵ',
'Ḷ' => 'Ḷ',
'ḷ' => 'ḷ',
'Ḹ' => 'Ḹ',
'ḹ' => 'ḹ',
'Ḻ' => 'Ḻ',
'ḻ' => 'ḻ',
'Ḽ' => 'Ḽ',
'ḽ' => 'ḽ',
'Ḿ' => 'Ḿ',
'ḿ' => 'ḿ',
'Ṁ' => 'Ṁ',
'ṁ' => 'ṁ',
'Ṃ' => 'Ṃ',
'ṃ' => 'ṃ',
'Ṅ' => 'Ṅ',
'ṅ' => 'ṅ',
'Ṇ' => 'Ṇ',
'ṇ' => 'ṇ',
'Ṉ' => 'Ṉ',
'ṉ' => 'ṉ',
'Ṋ' => 'Ṋ',
'ṋ' => 'ṋ',
'Ṍ' => 'Ṍ',
'ṍ' => 'ṍ',
'Ṏ' => 'Ṏ',
'ṏ' => 'ṏ',
'Ṑ' => 'Ṑ',
'ṑ' => 'ṑ',
'Ṓ' => 'Ṓ',
'ṓ' => 'ṓ',
'Ṕ' => 'Ṕ',
'ṕ' => 'ṕ',
'Ṗ' => 'Ṗ',
'ṗ' => 'ṗ',
'Ṙ' => 'Ṙ',
'ṙ' => 'ṙ',
'Ṛ' => 'Ṛ',
'ṛ' => 'ṛ',
'Ṝ' => 'Ṝ',
'ṝ' => 'ṝ',
'Ṟ' => 'Ṟ',
'ṟ' => 'ṟ',
'Ṡ' => 'Ṡ',
'ṡ' => 'ṡ',
'Ṣ' => 'Ṣ',
'ṣ' => 'ṣ',
'Ṥ' => 'Ṥ',
'ṥ' => 'ṥ',
'Ṧ' => 'Ṧ',
'ṧ' => 'ṧ',
'Ṩ' => 'Ṩ',
'ṩ' => 'ṩ',
'Ṫ' => 'Ṫ',
'ṫ' => 'ṫ',
'Ṭ' => 'Ṭ',
'ṭ' => 'ṭ',
'Ṯ' => 'Ṯ',
'ṯ' => 'ṯ',
'Ṱ' => 'Ṱ',
'ṱ' => 'ṱ',
'Ṳ' => 'Ṳ',
'ṳ' => 'ṳ',
'Ṵ' => 'Ṵ',
'ṵ' => 'ṵ',
'Ṷ' => 'Ṷ',
'ṷ' => 'ṷ',
'Ṹ' => 'Ṹ',
'ṹ' => 'ṹ',
'Ṻ' => 'Ṻ',
'ṻ' => 'ṻ',
'Ṽ' => 'Ṽ',
'ṽ' => 'ṽ',
'Ṿ' => 'Ṿ',
'ṿ' => 'ṿ',
'Ẁ' => 'Ẁ',
'ẁ' => 'ẁ',
'Ẃ' => 'Ẃ',
'ẃ' => 'ẃ',
'Ẅ' => 'Ẅ',
'ẅ' => 'ẅ',
'Ẇ' => 'Ẇ',
'ẇ' => 'ẇ',
'Ẉ' => 'Ẉ',
'ẉ' => 'ẉ',
'Ẋ' => 'Ẋ',
'ẋ' => 'ẋ',
'Ẍ' => 'Ẍ',
'ẍ' => 'ẍ',
'Ẏ' => 'Ẏ',
'ẏ' => 'ẏ',
'Ẑ' => 'Ẑ',
'ẑ' => 'ẑ',
'Ẓ' => 'Ẓ',
'ẓ' => 'ẓ',
'Ẕ' => 'Ẕ',
'ẕ' => 'ẕ',
'ẖ' => 'ẖ',
'ẗ' => 'ẗ',
'ẘ' => 'ẘ',
'ẙ' => 'ẙ',
'ẛ' => 'ẛ',
'Ạ' => 'Ạ',
'ạ' => 'ạ',
'Ả' => 'Ả',
'ả' => 'ả',
'Ấ' => 'Ấ',
'ấ' => 'ấ',
'Ầ' => 'Ầ',
'ầ' => 'ầ',
'Ẩ' => 'Ẩ',
'ẩ' => 'ẩ',
'Ẫ' => 'Ẫ',
'ẫ' => 'ẫ',
'Ậ' => 'Ậ',
'ậ' => 'ậ',
'Ắ' => 'Ắ',
'ắ' => 'ắ',
'Ằ' => 'Ằ',
'ằ' => 'ằ',
'Ẳ' => 'Ẳ',
'ẳ' => 'ẳ',
'Ẵ' => 'Ẵ',
'ẵ' => 'ẵ',
'Ặ' => 'Ặ',
'ặ' => 'ặ',
'Ẹ' => 'Ẹ',
'ẹ' => 'ẹ',
'Ẻ' => 'Ẻ',
'ẻ' => 'ẻ',
'Ẽ' => 'Ẽ',
'ẽ' => 'ẽ',
'Ế' => 'Ế',
'ế' => 'ế',
'Ề' => 'Ề',
'ề' => 'ề',
'Ể' => 'Ể',
'ể' => 'ể',
'Ễ' => 'Ễ',
'ễ' => 'ễ',
'Ệ' => 'Ệ',
'ệ' => 'ệ',
'Ỉ' => 'Ỉ',
'ỉ' => 'ỉ',
'Ị' => 'Ị',
'ị' => 'ị',
'Ọ' => 'Ọ',
'ọ' => 'ọ',
'Ỏ' => 'Ỏ',
'ỏ' => 'ỏ',
'Ố' => 'Ố',
'ố' => 'ố',
'Ồ' => 'Ồ',
'ồ' => 'ồ',
'Ổ' => 'Ổ',
'ổ' => 'ổ',
'Ỗ' => 'Ỗ',
'ỗ' => 'ỗ',
'Ộ' => 'Ộ',
'ộ' => 'ộ',
'Ớ' => 'Ớ',
'ớ' => 'ớ',
'Ờ' => 'Ờ',
'ờ' => 'ờ',
'Ở' => 'Ở',
'ở' => 'ở',
'Ỡ' => 'Ỡ',
'ỡ' => 'ỡ',
'Ợ' => 'Ợ',
'ợ' => 'ợ',
'Ụ' => 'Ụ',
'ụ' => 'ụ',
'Ủ' => 'Ủ',
'ủ' => 'ủ',
'Ứ' => 'Ứ',
'ứ' => 'ứ',
'Ừ' => 'Ừ',
'ừ' => 'ừ',
'Ử' => 'Ử',
'ử' => 'ử',
'Ữ' => 'Ữ',
'ữ' => 'ữ',
'Ự' => 'Ự',
'ự' => 'ự',
'Ỳ' => 'Ỳ',
'ỳ' => 'ỳ',
'Ỵ' => 'Ỵ',
'ỵ' => 'ỵ',
'Ỷ' => 'Ỷ',
'ỷ' => 'ỷ',
'Ỹ' => 'Ỹ',
'ỹ' => 'ỹ',
'ἀ' => 'ἀ',
'ἁ' => 'ἁ',
'ἂ' => 'ἂ',
'ἃ' => 'ἃ',
'ἄ' => 'ἄ',
'ἅ' => 'ἅ',
'ἆ' => 'ἆ',
'ἇ' => 'ἇ',
'Ἀ' => 'Ἀ',
'Ἁ' => 'Ἁ',
'Ἂ' => 'Ἂ',
'Ἃ' => 'Ἃ',
'Ἄ' => 'Ἄ',
'Ἅ' => 'Ἅ',
'Ἆ' => 'Ἆ',
'Ἇ' => 'Ἇ',
'ἐ' => 'ἐ',
'ἑ' => 'ἑ',
'ἒ' => 'ἒ',
'ἓ' => 'ἓ',
'ἔ' => 'ἔ',
'ἕ' => 'ἕ',
'Ἐ' => 'Ἐ',
'Ἑ' => 'Ἑ',
'Ἒ' => 'Ἒ',
'Ἓ' => 'Ἓ',
'Ἔ' => 'Ἔ',
'Ἕ' => 'Ἕ',
'ἠ' => 'ἠ',
'ἡ' => 'ἡ',
'ἢ' => 'ἢ',
'ἣ' => 'ἣ',
'ἤ' => 'ἤ',
'ἥ' => 'ἥ',
'ἦ' => 'ἦ',
'ἧ' => 'ἧ',
'Ἠ' => 'Ἠ',
'Ἡ' => 'Ἡ',
'Ἢ' => 'Ἢ',
'Ἣ' => 'Ἣ',
'Ἤ' => 'Ἤ',
'Ἥ' => 'Ἥ',
'Ἦ' => 'Ἦ',
'Ἧ' => 'Ἧ',
'ἰ' => 'ἰ',
'ἱ' => 'ἱ',
'ἲ' => 'ἲ',
'ἳ' => 'ἳ',
'ἴ' => 'ἴ',
'ἵ' => 'ἵ',
'ἶ' => 'ἶ',
'ἷ' => 'ἷ',
'Ἰ' => 'Ἰ',
'Ἱ' => 'Ἱ',
'Ἲ' => 'Ἲ',
'Ἳ' => 'Ἳ',
'Ἴ' => 'Ἴ',
'Ἵ' => 'Ἵ',
'Ἶ' => 'Ἶ',
'Ἷ' => 'Ἷ',
'ὀ' => 'ὀ',
'ὁ' => 'ὁ',
'ὂ' => 'ὂ',
'ὃ' => 'ὃ',
'ὄ' => 'ὄ',
'ὅ' => 'ὅ',
'Ὀ' => 'Ὀ',
'Ὁ' => 'Ὁ',
'Ὂ' => 'Ὂ',
'Ὃ' => 'Ὃ',
'Ὄ' => 'Ὄ',
'Ὅ' => 'Ὅ',
'ὐ' => 'ὐ',
'ὑ' => 'ὑ',
'ὒ' => 'ὒ',
'ὓ' => 'ὓ',
'ὔ' => 'ὔ',
'ὕ' => 'ὕ',
'ὖ' => 'ὖ',
'ὗ' => 'ὗ',
'Ὑ' => 'Ὑ',
'Ὓ' => 'Ὓ',
'Ὕ' => 'Ὕ',
'Ὗ' => 'Ὗ',
'ὠ' => 'ὠ',
'ὡ' => 'ὡ',
'ὢ' => 'ὢ',
'ὣ' => 'ὣ',
'ὤ' => 'ὤ',
'ὥ' => 'ὥ',
'ὦ' => 'ὦ',
'ὧ' => 'ὧ',
'Ὠ' => 'Ὠ',
'Ὡ' => 'Ὡ',
'Ὢ' => 'Ὢ',
'Ὣ' => 'Ὣ',
'Ὤ' => 'Ὤ',
'Ὥ' => 'Ὥ',
'Ὦ' => 'Ὦ',
'Ὧ' => 'Ὧ',
'ὰ' => 'ὰ',
'ὲ' => 'ὲ',
'ὴ' => 'ὴ',
'ὶ' => 'ὶ',
'ὸ' => 'ὸ',
'ὺ' => 'ὺ',
'ὼ' => 'ὼ',
'ᾀ' => 'ᾀ',
'ᾁ' => 'ᾁ',
'ᾂ' => 'ᾂ',
'ᾃ' => 'ᾃ',
'ᾄ' => 'ᾄ',
'ᾅ' => 'ᾅ',
'ᾆ' => 'ᾆ',
'ᾇ' => 'ᾇ',
'ᾈ' => 'ᾈ',
'ᾉ' => 'ᾉ',
'ᾊ' => 'ᾊ',
'ᾋ' => 'ᾋ',
'ᾌ' => 'ᾌ',
'ᾍ' => 'ᾍ',
'ᾎ' => 'ᾎ',
'ᾏ' => 'ᾏ',
'ᾐ' => 'ᾐ',
'ᾑ' => 'ᾑ',
'ᾒ' => 'ᾒ',
'ᾓ' => 'ᾓ',
'ᾔ' => 'ᾔ',
'ᾕ' => 'ᾕ',
'ᾖ' => 'ᾖ',
'ᾗ' => 'ᾗ',
'ᾘ' => 'ᾘ',
'ᾙ' => 'ᾙ',
'ᾚ' => 'ᾚ',
'ᾛ' => 'ᾛ',
'ᾜ' => 'ᾜ',
'ᾝ' => 'ᾝ',
'ᾞ' => 'ᾞ',
'ᾟ' => 'ᾟ',
'ᾠ' => 'ᾠ',
'ᾡ' => 'ᾡ',
'ᾢ' => 'ᾢ',
'ᾣ' => 'ᾣ',
'ᾤ' => 'ᾤ',
'ᾥ' => 'ᾥ',
'ᾦ' => 'ᾦ',
'ᾧ' => 'ᾧ',
'ᾨ' => 'ᾨ',
'ᾩ' => 'ᾩ',
'ᾪ' => 'ᾪ',
'ᾫ' => 'ᾫ',
'ᾬ' => 'ᾬ',
'ᾭ' => 'ᾭ',
'ᾮ' => 'ᾮ',
'ᾯ' => 'ᾯ',
'ᾰ' => 'ᾰ',
'ᾱ' => 'ᾱ',
'ᾲ' => 'ᾲ',
'ᾳ' => 'ᾳ',
'ᾴ' => 'ᾴ',
'ᾶ' => 'ᾶ',
'ᾷ' => 'ᾷ',
'Ᾰ' => 'Ᾰ',
'Ᾱ' => 'Ᾱ',
'Ὰ' => 'Ὰ',
'ᾼ' => 'ᾼ',
'῁' => '῁',
'ῂ' => 'ῂ',
'ῃ' => 'ῃ',
'ῄ' => 'ῄ',
'ῆ' => 'ῆ',
'ῇ' => 'ῇ',
'Ὲ' => 'Ὲ',
'Ὴ' => 'Ὴ',
'ῌ' => 'ῌ',
'῍' => '῍',
'῎' => '῎',
'῏' => '῏',
'ῐ' => 'ῐ',
'ῑ' => 'ῑ',
'ῒ' => 'ῒ',
'ῖ' => 'ῖ',
'ῗ' => 'ῗ',
'Ῐ' => 'Ῐ',
'Ῑ' => 'Ῑ',
'Ὶ' => 'Ὶ',
'῝' => '῝',
'῞' => '῞',
'῟' => '῟',
'ῠ' => 'ῠ',
'ῡ' => 'ῡ',
'ῢ' => 'ῢ',
'ῤ' => 'ῤ',
'ῥ' => 'ῥ',
'ῦ' => 'ῦ',
'ῧ' => 'ῧ',
'Ῠ' => 'Ῠ',
'Ῡ' => 'Ῡ',
'Ὺ' => 'Ὺ',
'Ῥ' => 'Ῥ',
'῭' => '῭',
'ῲ' => 'ῲ',
'ῳ' => 'ῳ',
'ῴ' => 'ῴ',
'ῶ' => 'ῶ',
'ῷ' => 'ῷ',
'Ὸ' => 'Ὸ',
'Ὼ' => 'Ὼ',
'ῼ' => 'ῼ',
'↚' => '↚',
'↛' => '↛',
'↮' => '↮',
'⇍' => '⇍',
'⇎' => '⇎',
'⇏' => '⇏',
'∄' => '∄',
'∉' => '∉',
'∌' => '∌',
'∤' => '∤',
'∦' => '∦',
'≁' => '≁',
'≄' => '≄',
'≇' => '≇',
'≉' => '≉',
'≠' => '≠',
'≢' => '≢',
'≭' => '≭',
'≮' => '≮',
'≯' => '≯',
'≰' => '≰',
'≱' => '≱',
'≴' => '≴',
'≵' => '≵',
'≸' => '≸',
'≹' => '≹',
'⊀' => '⊀',
'⊁' => '⊁',
'⊄' => '⊄',
'⊅' => '⊅',
'⊈' => '⊈',
'⊉' => '⊉',
'⊬' => '⊬',
'⊭' => '⊭',
'⊮' => '⊮',
'⊯' => '⊯',
'⋠' => '⋠',
'⋡' => '⋡',
'⋢' => '⋢',
'⋣' => '⋣',
'⋪' => '⋪',
'⋫' => '⋫',
'⋬' => '⋬',
'⋭' => '⋭',
'が' => 'が',
'ぎ' => 'ぎ',
'ぐ' => 'ぐ',
'げ' => 'げ',
'ご' => 'ご',
'ざ' => 'ざ',
'じ' => 'じ',
'ず' => 'ず',
'ぜ' => 'ぜ',
'ぞ' => 'ぞ',
'だ' => 'だ',
'ぢ' => 'ぢ',
'づ' => 'づ',
'で' => 'で',
'ど' => 'ど',
'ば' => 'ば',
'ぱ' => 'ぱ',
'び' => 'び',
'ぴ' => 'ぴ',
'ぶ' => 'ぶ',
'ぷ' => 'ぷ',
'べ' => 'べ',
'ぺ' => 'ぺ',
'ぼ' => 'ぼ',
'ぽ' => 'ぽ',
'ゔ' => 'ゔ',
'ゞ' => 'ゞ',
'ガ' => 'ガ',
'ギ' => 'ギ',
'グ' => 'グ',
'ゲ' => 'ゲ',
'ゴ' => 'ゴ',
'ザ' => 'ザ',
'ジ' => 'ジ',
'ズ' => 'ズ',
'ゼ' => 'ゼ',
'ゾ' => 'ゾ',
'ダ' => 'ダ',
'ヂ' => 'ヂ',
'ヅ' => 'ヅ',
'デ' => 'デ',
'ド' => 'ド',
'バ' => 'バ',
'パ' => 'パ',
'ビ' => 'ビ',
'ピ' => 'ピ',
'ブ' => 'ブ',
'プ' => 'プ',
'ベ' => 'ベ',
'ペ' => 'ペ',
'ボ' => 'ボ',
'ポ' => 'ポ',
'ヴ' => 'ヴ',
'ヷ' => 'ヷ',
'ヸ' => 'ヸ',
'ヹ' => 'ヹ',
'ヺ' => 'ヺ',
'ヾ' => 'ヾ',
'𑂚' => '𑂚',
'𑂜' => '𑂜',
'𑂫' => '𑂫',
'𑄮' => '𑄮',
'𑄯' => '𑄯',
'𑍋' => '𑍋',
'𑍌' => '𑍌',
'𑒻' => '𑒻',
'𑒼' => '𑒼',
'𑒾' => '𑒾',
'𑖺' => '𑖺',
'𑖻' => '𑖻',
'𑤸' => '𑤸',
);
<?php

return array (
'À' => 'À',
'Á' => 'Á',
'Â' => 'Â',
'Ã' => 'Ã',
'Ä' => 'Ä',
'Å' => 'Å',
'Ç' => 'Ç',
'È' => 'È',
'É' => 'É',
'Ê' => 'Ê',
'Ë' => 'Ë',
'Ì' => 'Ì',
'Í' => 'Í',
'Î' => 'Î',
'Ï' => 'Ï',
'Ñ' => 'Ñ',
'Ò' => 'Ò',
'Ó' => 'Ó',
'Ô' => 'Ô',
'Õ' => 'Õ',
'Ö' => 'Ö',
'Ù' => 'Ù',
'Ú' => 'Ú',
'Û' => 'Û',
'Ü' => 'Ü',
'Ý' => 'Ý',
'à' => 'à',
'á' => 'á',
'â' => 'â',
'ã' => 'ã',
'ä' => 'ä',
'å' => 'å',
'ç' => 'ç',
'è' => 'è',
'é' => 'é',
'ê' => 'ê',
'ë' => 'ë',
'ì' => 'ì',
'í' => 'í',
'î' => 'î',
'ï' => 'ï',
'ñ' => 'ñ',
'ò' => 'ò',
'ó' => 'ó',
'ô' => 'ô',
'õ' => 'õ',
'ö' => 'ö',
'ù' => 'ù',
'ú' => 'ú',
'û' => 'û',
'ü' => 'ü',
'ý' => 'ý',
'ÿ' => 'ÿ',
'Ā' => 'Ā',
'ā' => 'ā',
'Ă' => 'Ă',
'ă' => 'ă',
'Ą' => 'Ą',
'ą' => 'ą',
'Ć' => 'Ć',
'ć' => 'ć',
'Ĉ' => 'Ĉ',
'ĉ' => 'ĉ',
'Ċ' => 'Ċ',
'ċ' => 'ċ',
'Č' => 'Č',
'č' => 'č',
'Ď' => 'Ď',
'ď' => 'ď',
'Ē' => 'Ē',
'ē' => 'ē',
'Ĕ' => 'Ĕ',
'ĕ' => 'ĕ',
'Ė' => 'Ė',
'ė' => 'ė',
'Ę' => 'Ę',
'ę' => 'ę',
'Ě' => 'Ě',
'ě' => 'ě',
'Ĝ' => 'Ĝ',
'ĝ' => 'ĝ',
'Ğ' => 'Ğ',
'ğ' => 'ğ',
'Ġ' => 'Ġ',
'ġ' => 'ġ',
'Ģ' => 'Ģ',
'ģ' => 'ģ',
'Ĥ' => 'Ĥ',
'ĥ' => 'ĥ',
'Ĩ' => 'Ĩ',
'ĩ' => 'ĩ',
'Ī' => 'Ī',
'ī' => 'ī',
'Ĭ' => 'Ĭ',
'ĭ' => 'ĭ',
'Į' => 'Į',
'į' => 'į',
'İ' => 'İ',
'Ĵ' => 'Ĵ',
'ĵ' => 'ĵ',
'Ķ' => 'Ķ',
'ķ' => 'ķ',
'Ĺ' => 'Ĺ',
'ĺ' => 'ĺ',
'Ļ' => 'Ļ',
'ļ' => 'ļ',
'Ľ' => 'Ľ',
'ľ' => 'ľ',
'Ń' => 'Ń',
'ń' => 'ń',
'Ņ' => 'Ņ',
'ņ' => 'ņ',
'Ň' => 'Ň',
'ň' => 'ň',
'Ō' => 'Ō',
'ō' => 'ō',
'Ŏ' => 'Ŏ',
'ŏ' => 'ŏ',
'Ő' => 'Ő',
'ő' => 'ő',
'Ŕ' => 'Ŕ',
'ŕ' => 'ŕ',
'Ŗ' => 'Ŗ',
'ŗ' => 'ŗ',
'Ř' => 'Ř',
'ř' => 'ř',
'Ś' => 'Ś',
'ś' => 'ś',
'Ŝ' => 'Ŝ',
'ŝ' => 'ŝ',
'Ş' => 'Ş',
'ş' => 'ş',
'Š' => 'Š',
'š' => 'š',
'Ţ' => 'Ţ',
'ţ' => 'ţ',
'Ť' => 'Ť',
'ť' => 'ť',
'Ũ' => 'Ũ',
'ũ' => 'ũ',
'Ū' => 'Ū',
'ū' => 'ū',
'Ŭ' => 'Ŭ',
'ŭ' => 'ŭ',
'Ů' => 'Ů',
'ů' => 'ů',
'Ű' => 'Ű',
'ű' => 'ű',
'Ų' => 'Ų',
'ų' => 'ų',
'Ŵ' => 'Ŵ',
'ŵ' => 'ŵ',
'Ŷ' => 'Ŷ',
'ŷ' => 'ŷ',
'Ÿ' => 'Ÿ',
'Ź' => 'Ź',
'ź' => 'ź',
'Ż' => 'Ż',
'ż' => 'ż',
'Ž' => 'Ž',
'ž' => 'ž',
'Ơ' => 'Ơ',
'ơ' => 'ơ',
'Ư' => 'Ư',
'ư' => 'ư',
'Ǎ' => 'Ǎ',
'ǎ' => 'ǎ',
'Ǐ' => 'Ǐ',
'ǐ' => 'ǐ',
'Ǒ' => 'Ǒ',
'ǒ' => 'ǒ',
'Ǔ' => 'Ǔ',
'ǔ' => 'ǔ',
'Ǖ' => 'Ǖ',
'ǖ' => 'ǖ',
'Ǘ' => 'Ǘ',
'ǘ' => 'ǘ',
'Ǚ' => 'Ǚ',
'ǚ' => 'ǚ',
'Ǜ' => 'Ǜ',
'ǜ' => 'ǜ',
'Ǟ' => 'Ǟ',
'ǟ' => 'ǟ',
'Ǡ' => 'Ǡ',
'ǡ' => 'ǡ',
'Ǣ' => 'Ǣ',
'ǣ' => 'ǣ',
'Ǧ' => 'Ǧ',
'ǧ' => 'ǧ',
'Ǩ' => 'Ǩ',
'ǩ' => 'ǩ',
'Ǫ' => 'Ǫ',
'ǫ' => 'ǫ',
'Ǭ' => 'Ǭ',
'ǭ' => 'ǭ',
'Ǯ' => 'Ǯ',
'ǯ' => 'ǯ',
'ǰ' => 'ǰ',
'Ǵ' => 'Ǵ',
'ǵ' => 'ǵ',
'Ǹ' => 'Ǹ',
'ǹ' => 'ǹ',
'Ǻ' => 'Ǻ',
'ǻ' => 'ǻ',
'Ǽ' => 'Ǽ',
'ǽ' => 'ǽ',
'Ǿ' => 'Ǿ',
'ǿ' => 'ǿ',
'Ȁ' => 'Ȁ',
'ȁ' => 'ȁ',
'Ȃ' => 'Ȃ',
'ȃ' => 'ȃ',
'Ȅ' => 'Ȅ',
'ȅ' => 'ȅ',
'Ȇ' => 'Ȇ',
'ȇ' => 'ȇ',
'Ȉ' => 'Ȉ',
'ȉ' => 'ȉ',
'Ȋ' => 'Ȋ',
'ȋ' => 'ȋ',
'Ȍ' => 'Ȍ',
'ȍ' => 'ȍ',
'Ȏ' => 'Ȏ',
'ȏ' => 'ȏ',
'Ȑ' => 'Ȑ',
'ȑ' => 'ȑ',
'Ȓ' => 'Ȓ',
'ȓ' => 'ȓ',
'Ȕ' => 'Ȕ',
'ȕ' => 'ȕ',
'Ȗ' => 'Ȗ',
'ȗ' => 'ȗ',
'Ș' => 'Ș',
'ș' => 'ș',
'Ț' => 'Ț',
'ț' => 'ț',
'Ȟ' => 'Ȟ',
'ȟ' => 'ȟ',
'Ȧ' => 'Ȧ',
'ȧ' => 'ȧ',
'Ȩ' => 'Ȩ',
'ȩ' => 'ȩ',
'Ȫ' => 'Ȫ',
'ȫ' => 'ȫ',
'Ȭ' => 'Ȭ',
'ȭ' => 'ȭ',
'Ȯ' => 'Ȯ',
'ȯ' => 'ȯ',
'Ȱ' => 'Ȱ',
'ȱ' => 'ȱ',
'Ȳ' => 'Ȳ',
'ȳ' => 'ȳ',
'̀' => '̀',
'́' => '́',
'̓' => '̓',
'̈́' => '̈́',
'ʹ' => 'ʹ',
';' => ';',
'΅' => '΅',
'Ά' => 'Ά',
'·' => '·',
'Έ' => 'Έ',
'Ή' => 'Ή',
'Ί' => 'Ί',
'Ό' => 'Ό',
'Ύ' => 'Ύ',
'Ώ' => 'Ώ',
'ΐ' => 'ΐ',
'Ϊ' => 'Ϊ',
'Ϋ' => 'Ϋ',
'ά' => 'ά',
'έ' => 'έ',
'ή' => 'ή',
'ί' => 'ί',
'ΰ' => 'ΰ',
'ϊ' => 'ϊ',
'ϋ' => 'ϋ',
'ό' => 'ό',
'ύ' => 'ύ',
'ώ' => 'ώ',
'ϓ' => 'ϓ',
'ϔ' => 'ϔ',
'Ѐ' => 'Ѐ',
'Ё' => 'Ё',
'Ѓ' => 'Ѓ',
'Ї' => 'Ї',
'Ќ' => 'Ќ',
'Ѝ' => 'Ѝ',
'Ў' => 'Ў',
'Й' => 'Й',
'й' => 'й',
'ѐ' => 'ѐ',
'ё' => 'ё',
'ѓ' => 'ѓ',
'ї' => 'ї',
'ќ' => 'ќ',
'ѝ' => 'ѝ',
'ў' => 'ў',
'Ѷ' => 'Ѷ',
'ѷ' => 'ѷ',
'Ӂ' => 'Ӂ',
'ӂ' => 'ӂ',
'Ӑ' => 'Ӑ',
'ӑ' => 'ӑ',
'Ӓ' => 'Ӓ',
'ӓ' => 'ӓ',
'Ӗ' => 'Ӗ',
'ӗ' => 'ӗ',
'Ӛ' => 'Ӛ',
'ӛ' => 'ӛ',
'Ӝ' => 'Ӝ',
'ӝ' => 'ӝ',
'Ӟ' => 'Ӟ',
'ӟ' => 'ӟ',
'Ӣ' => 'Ӣ',
'ӣ' => 'ӣ',
'Ӥ' => 'Ӥ',
'ӥ' => 'ӥ',
'Ӧ' => 'Ӧ',
'ӧ' => 'ӧ',
'Ӫ' => 'Ӫ',
'ӫ' => 'ӫ',
'Ӭ' => 'Ӭ',
'ӭ' => 'ӭ',
'Ӯ' => 'Ӯ',
'ӯ' => 'ӯ',
'Ӱ' => 'Ӱ',
'ӱ' => 'ӱ',
'Ӳ' => 'Ӳ',
'ӳ' => 'ӳ',
'Ӵ' => 'Ӵ',
'ӵ' => 'ӵ',
'Ӹ' => 'Ӹ',
'ӹ' => 'ӹ',
'آ' => 'آ',
'أ' => 'أ',
'ؤ' => 'ؤ',
'إ' => 'إ',
'ئ' => 'ئ',
'ۀ' => 'ۀ',
'ۂ' => 'ۂ',
'ۓ' => 'ۓ',
'ऩ' => 'ऩ',
'ऱ' => 'ऱ',
'ऴ' => 'ऴ',
'क़' => 'क़',
'ख़' => 'ख़',
'ग़' => 'ग़',
'ज़' => 'ज़',
'ड़' => 'ड़',
'ढ़' => 'ढ़',
'फ़' => 'फ़',
'य़' => 'य़',
'ো' => 'ো',
'ৌ' => 'ৌ',
'ড়' => 'ড়',
'ঢ়' => 'ঢ়',
'য়' => 'য়',
'ਲ਼' => 'ਲ਼',
'ਸ਼' => 'ਸ਼',
'ਖ਼' => 'ਖ਼',
'ਗ਼' => 'ਗ਼',
'ਜ਼' => 'ਜ਼',
'ਫ਼' => 'ਫ਼',
'ୈ' => 'ୈ',
'ୋ' => 'ୋ',
'ୌ' => 'ୌ',
'ଡ଼' => 'ଡ଼',
'ଢ଼' => 'ଢ଼',
'ஔ' => 'ஔ',
'ொ' => 'ொ',
'ோ' => 'ோ',
'ௌ' => 'ௌ',
'ై' => 'ై',
'ೀ' => 'ೀ',
'ೇ' => 'ೇ',
'ೈ' => 'ೈ',
'ೊ' => 'ೊ',
'ೋ' => 'ೋ',
'ൊ' => 'ൊ',
'ോ' => 'ോ',
'ൌ' => 'ൌ',
'ේ' => 'ේ',
'ො' => 'ො',
'ෝ' => 'ෝ',
'ෞ' => 'ෞ',
'གྷ' => 'གྷ',
'ཌྷ' => 'ཌྷ',
'དྷ' => 'དྷ',
'བྷ' => 'བྷ',
'ཛྷ' => 'ཛྷ',
'ཀྵ' => 'ཀྵ',
'ཱི' => 'ཱི',
'ཱུ' => 'ཱུ',
'ྲྀ' => 'ྲྀ',
'ླྀ' => 'ླྀ',
'ཱྀ' => 'ཱྀ',
'ྒྷ' => 'ྒྷ',
'ྜྷ' => 'ྜྷ',
'ྡྷ' => 'ྡྷ',
'ྦྷ' => 'ྦྷ',
'ྫྷ' => 'ྫྷ',
'ྐྵ' => 'ྐྵ',
'ဦ' => 'ဦ',
'ᬆ' => 'ᬆ',
'ᬈ' => 'ᬈ',
'ᬊ' => 'ᬊ',
'ᬌ' => 'ᬌ',
'ᬎ' => 'ᬎ',
'ᬒ' => 'ᬒ',
'ᬻ' => 'ᬻ',
'ᬽ' => 'ᬽ',
'ᭀ' => 'ᭀ',
'ᭁ' => 'ᭁ',
'ᭃ' => 'ᭃ',
'Ḁ' => 'Ḁ',
'ḁ' => 'ḁ',
'Ḃ' => 'Ḃ',
'ḃ' => 'ḃ',
'Ḅ' => 'Ḅ',
'ḅ' => 'ḅ',
'Ḇ' => 'Ḇ',
'ḇ' => 'ḇ',
'Ḉ' => 'Ḉ',
'ḉ' => 'ḉ',
'Ḋ' => 'Ḋ',
'ḋ' => 'ḋ',
'Ḍ' => 'Ḍ',
'ḍ' => 'ḍ',
'Ḏ' => 'Ḏ',
'ḏ' => 'ḏ',
'Ḑ' => 'Ḑ',
'ḑ' => 'ḑ',
'Ḓ' => 'Ḓ',
'ḓ' => 'ḓ',
'Ḕ' => 'Ḕ',
'ḕ' => 'ḕ',
'Ḗ' => 'Ḗ',
'ḗ' => 'ḗ',
'Ḙ' => 'Ḙ',
'ḙ' => 'ḙ',
'Ḛ' => 'Ḛ',
'ḛ' => 'ḛ',
'Ḝ' => 'Ḝ',
'ḝ' => 'ḝ',
'Ḟ' => 'Ḟ',
'ḟ' => 'ḟ',
'Ḡ' => 'Ḡ',
'ḡ' => 'ḡ',
'Ḣ' => 'Ḣ',
'ḣ' => 'ḣ',
'Ḥ' => 'Ḥ',
'ḥ' => 'ḥ',
'Ḧ' => 'Ḧ',
'ḧ' => 'ḧ',
'Ḩ' => 'Ḩ',
'ḩ' => 'ḩ',
'Ḫ' => 'Ḫ',
'ḫ' => 'ḫ',
'Ḭ' => 'Ḭ',
'ḭ' => 'ḭ',
'Ḯ' => 'Ḯ',
'ḯ' => 'ḯ',
'Ḱ' => 'Ḱ',
'ḱ' => 'ḱ',
'Ḳ' => 'Ḳ',
'ḳ' => 'ḳ',
'Ḵ' => 'Ḵ',
'ḵ' => 'ḵ',
'Ḷ' => 'Ḷ',
'ḷ' => 'ḷ',
'Ḹ' => 'Ḹ',
'ḹ' => 'ḹ',
'Ḻ' => 'Ḻ',
'ḻ' => 'ḻ',
'Ḽ' => 'Ḽ',
'ḽ' => 'ḽ',
'Ḿ' => 'Ḿ',
'ḿ' => 'ḿ',
'Ṁ' => 'Ṁ',
'ṁ' => 'ṁ',
'Ṃ' => 'Ṃ',
'ṃ' => 'ṃ',
'Ṅ' => 'Ṅ',
'ṅ' => 'ṅ',
'Ṇ' => 'Ṇ',
'ṇ' => 'ṇ',
'Ṉ' => 'Ṉ',
'ṉ' => 'ṉ',
'Ṋ' => 'Ṋ',
'ṋ' => 'ṋ',
'Ṍ' => 'Ṍ',
'ṍ' => 'ṍ',
'Ṏ' => 'Ṏ',
'ṏ' => 'ṏ',
'Ṑ' => 'Ṑ',
'ṑ' => 'ṑ',
'Ṓ' => 'Ṓ',
'ṓ' => 'ṓ',
'Ṕ' => 'Ṕ',
'ṕ' => 'ṕ',
'Ṗ' => 'Ṗ',
'ṗ' => 'ṗ',
'Ṙ' => 'Ṙ',
'ṙ' => 'ṙ',
'Ṛ' => 'Ṛ',
'ṛ' => 'ṛ',
'Ṝ' => 'Ṝ',
'ṝ' => 'ṝ',
'Ṟ' => 'Ṟ',
'ṟ' => 'ṟ',
'Ṡ' => 'Ṡ',
'ṡ' => 'ṡ',
'Ṣ' => 'Ṣ',
'ṣ' => 'ṣ',
'Ṥ' => 'Ṥ',
'ṥ' => 'ṥ',
'Ṧ' => 'Ṧ',
'ṧ' => 'ṧ',
'Ṩ' => 'Ṩ',
'ṩ' => 'ṩ',
'Ṫ' => 'Ṫ',
'ṫ' => 'ṫ',
'Ṭ' => 'Ṭ',
'ṭ' => 'ṭ',
'Ṯ' => 'Ṯ',
'ṯ' => 'ṯ',
'Ṱ' => 'Ṱ',
'ṱ' => 'ṱ',
'Ṳ' => 'Ṳ',
'ṳ' => 'ṳ',
'Ṵ' => 'Ṵ',
'ṵ' => 'ṵ',
'Ṷ' => 'Ṷ',
'ṷ' => 'ṷ',
'Ṹ' => 'Ṹ',
'ṹ' => 'ṹ',
'Ṻ' => 'Ṻ',
'ṻ' => 'ṻ',
'Ṽ' => 'Ṽ',
'ṽ' => 'ṽ',
'Ṿ' => 'Ṿ',
'ṿ' => 'ṿ',
'Ẁ' => 'Ẁ',
'ẁ' => 'ẁ',
'Ẃ' => 'Ẃ',
'ẃ' => 'ẃ',
'Ẅ' => 'Ẅ',
'ẅ' => 'ẅ',
'Ẇ' => 'Ẇ',
'ẇ' => 'ẇ',
'Ẉ' => 'Ẉ',
'ẉ' => 'ẉ',
'Ẋ' => 'Ẋ',
'ẋ' => 'ẋ',
'Ẍ' => 'Ẍ',
'ẍ' => 'ẍ',
'Ẏ' => 'Ẏ',
'ẏ' => 'ẏ',
'Ẑ' => 'Ẑ',
'ẑ' => 'ẑ',
'Ẓ' => 'Ẓ',
'ẓ' => 'ẓ',
'Ẕ' => 'Ẕ',
'ẕ' => 'ẕ',
'ẖ' => 'ẖ',
'ẗ' => 'ẗ',
'ẘ' => 'ẘ',
'ẙ' => 'ẙ',
'ẛ' => 'ẛ',
'Ạ' => 'Ạ',
'ạ' => 'ạ',
'Ả' => 'Ả',
'ả' => 'ả',
'Ấ' => 'Ấ',
'ấ' => 'ấ',
'Ầ' => 'Ầ',
'ầ' => 'ầ',
'Ẩ' => 'Ẩ',
'ẩ' => 'ẩ',
'Ẫ' => 'Ẫ',
'ẫ' => 'ẫ',
'Ậ' => 'Ậ',
'ậ' => 'ậ',
'Ắ' => 'Ắ',
'ắ' => 'ắ',
'Ằ' => 'Ằ',
'ằ' => 'ằ',
'Ẳ' => 'Ẳ',
'ẳ' => 'ẳ',
'Ẵ' => 'Ẵ',
'ẵ' => 'ẵ',
'Ặ' => 'Ặ',
'ặ' => 'ặ',
'Ẹ' => 'Ẹ',
'ẹ' => 'ẹ',
'Ẻ' => 'Ẻ',
'ẻ' => 'ẻ',
'Ẽ' => 'Ẽ',
'ẽ' => 'ẽ',
'Ế' => 'Ế',
'ế' => 'ế',
'Ề' => 'Ề',
'ề' => 'ề',
'Ể' => 'Ể',
'ể' => 'ể',
'Ễ' => 'Ễ',
'ễ' => 'ễ',
'Ệ' => 'Ệ',
'ệ' => 'ệ',
'Ỉ' => 'Ỉ',
'ỉ' => 'ỉ',
'Ị' => 'Ị',
'ị' => 'ị',
'Ọ' => 'Ọ',
'ọ' => 'ọ',
'Ỏ' => 'Ỏ',
'ỏ' => 'ỏ',
'Ố' => 'Ố',
'ố' => 'ố',
'Ồ' => 'Ồ',
'ồ' => 'ồ',
'Ổ' => 'Ổ',
'ổ' => 'ổ',
'Ỗ' => 'Ỗ',
'ỗ' => 'ỗ',
'Ộ' => 'Ộ',
'ộ' => 'ộ',
'Ớ' => 'Ớ',
'ớ' => 'ớ',
'Ờ' => 'Ờ',
'ờ' => 'ờ',
'Ở' => 'Ở',
'ở' => 'ở',
'Ỡ' => 'Ỡ',
'ỡ' => 'ỡ',
'Ợ' => 'Ợ',
'ợ' => 'ợ',
'Ụ' => 'Ụ',
'ụ' => 'ụ',
'Ủ' => 'Ủ',
'ủ' => 'ủ',
'Ứ' => 'Ứ',
'ứ' => 'ứ',
'Ừ' => 'Ừ',
'ừ' => 'ừ',
'Ử' => 'Ử',
'ử' => 'ử',
'Ữ' => 'Ữ',
'ữ' => 'ữ',
'Ự' => 'Ự',
'ự' => 'ự',
'Ỳ' => 'Ỳ',
'ỳ' => 'ỳ',
'Ỵ' => 'Ỵ',
'ỵ' => 'ỵ',
'Ỷ' => 'Ỷ',
'ỷ' => 'ỷ',
'Ỹ' => 'Ỹ',
'ỹ' => 'ỹ',
'ἀ' => 'ἀ',
'ἁ' => 'ἁ',
'ἂ' => 'ἂ',
'ἃ' => 'ἃ',
'ἄ' => 'ἄ',
'ἅ' => 'ἅ',
'ἆ' => 'ἆ',
'ἇ' => 'ἇ',
'Ἀ' => 'Ἀ',
'Ἁ' => 'Ἁ',
'Ἂ' => 'Ἂ',
'Ἃ' => 'Ἃ',
'Ἄ' => 'Ἄ',
'Ἅ' => 'Ἅ',
'Ἆ' => 'Ἆ',
'Ἇ' => 'Ἇ',
'ἐ' => 'ἐ',
'ἑ' => 'ἑ',
'ἒ' => 'ἒ',
'ἓ' => 'ἓ',
'ἔ' => 'ἔ',
'ἕ' => 'ἕ',
'Ἐ' => 'Ἐ',
'Ἑ' => 'Ἑ',
'Ἒ' => 'Ἒ',
'Ἓ' => 'Ἓ',
'Ἔ' => 'Ἔ',
'Ἕ' => 'Ἕ',
'ἠ' => 'ἠ',
'ἡ' => 'ἡ',
'ἢ' => 'ἢ',
'ἣ' => 'ἣ',
'ἤ' => 'ἤ',
'ἥ' => 'ἥ',
'ἦ' => 'ἦ',
'ἧ' => 'ἧ',
'Ἠ' => 'Ἠ',
'Ἡ' => 'Ἡ',
'Ἢ' => 'Ἢ',
'Ἣ' => 'Ἣ',
'Ἤ' => 'Ἤ',
'Ἥ' => 'Ἥ',
'Ἦ' => 'Ἦ',
'Ἧ' => 'Ἧ',
'ἰ' => 'ἰ',
'ἱ' => 'ἱ',
'ἲ' => 'ἲ',
'ἳ' => 'ἳ',
'ἴ' => 'ἴ',
'ἵ' => 'ἵ',
'ἶ' => 'ἶ',
'ἷ' => 'ἷ',
'Ἰ' => 'Ἰ',
'Ἱ' => 'Ἱ',
'Ἲ' => 'Ἲ',
'Ἳ' => 'Ἳ',
'Ἴ' => 'Ἴ',
'Ἵ' => 'Ἵ',
'Ἶ' => 'Ἶ',
'Ἷ' => 'Ἷ',
'ὀ' => 'ὀ',
'ὁ' => 'ὁ',
'ὂ' => 'ὂ',
'ὃ' => 'ὃ',
'ὄ' => 'ὄ',
'ὅ' => 'ὅ',
'Ὀ' => 'Ὀ',
'Ὁ' => 'Ὁ',
'Ὂ' => 'Ὂ',
'Ὃ' => 'Ὃ',
'Ὄ' => 'Ὄ',
'Ὅ' => 'Ὅ',
'ὐ' => 'ὐ',
'ὑ' => 'ὑ',
'ὒ' => 'ὒ',
'ὓ' => 'ὓ',
'ὔ' => 'ὔ',
'ὕ' => 'ὕ',
'ὖ' => 'ὖ',
'ὗ' => 'ὗ',
'Ὑ' => 'Ὑ',
'Ὓ' => 'Ὓ',
'Ὕ' => 'Ὕ',
'Ὗ' => 'Ὗ',
'ὠ' => 'ὠ',
'ὡ' => 'ὡ',
'ὢ' => 'ὢ',
'ὣ' => 'ὣ',
'ὤ' => 'ὤ',
'ὥ' => 'ὥ',
'ὦ' => 'ὦ',
'ὧ' => 'ὧ',
'Ὠ' => 'Ὠ',
'Ὡ' => 'Ὡ',
'Ὢ' => 'Ὢ',
'Ὣ' => 'Ὣ',
'Ὤ' => 'Ὤ',
'Ὥ' => 'Ὥ',
'Ὦ' => 'Ὦ',
'Ὧ' => 'Ὧ',
'ὰ' => 'ὰ',
'ά' => 'ά',
'ὲ' => 'ὲ',
'έ' => 'έ',
'ὴ' => 'ὴ',
'ή' => 'ή',
'ὶ' => 'ὶ',
'ί' => 'ί',
'ὸ' => 'ὸ',
'ό' => 'ό',
'ὺ' => 'ὺ',
'ύ' => 'ύ',
'ὼ' => 'ὼ',
'ώ' => 'ώ',
'ᾀ' => 'ᾀ',
'ᾁ' => 'ᾁ',
'ᾂ' => 'ᾂ',
'ᾃ' => 'ᾃ',
'ᾄ' => 'ᾄ',
'ᾅ' => 'ᾅ',
'ᾆ' => 'ᾆ',
'ᾇ' => 'ᾇ',
'ᾈ' => 'ᾈ',
'ᾉ' => 'ᾉ',
'ᾊ' => 'ᾊ',
'ᾋ' => 'ᾋ',
'ᾌ' => 'ᾌ',
'ᾍ' => 'ᾍ',
'ᾎ' => 'ᾎ',
'ᾏ' => 'ᾏ',
'ᾐ' => 'ᾐ',
'ᾑ' => 'ᾑ',
'ᾒ' => 'ᾒ',
'ᾓ' => 'ᾓ',
'ᾔ' => 'ᾔ',
'ᾕ' => 'ᾕ',
'ᾖ' => 'ᾖ',
'ᾗ' => 'ᾗ',
'ᾘ' => 'ᾘ',
'ᾙ' => 'ᾙ',
'ᾚ' => 'ᾚ',
'ᾛ' => 'ᾛ',
'ᾜ' => 'ᾜ',
'ᾝ' => 'ᾝ',
'ᾞ' => 'ᾞ',
'ᾟ' => 'ᾟ',
'ᾠ' => 'ᾠ',
'ᾡ' => 'ᾡ',
'ᾢ' => 'ᾢ',
'ᾣ' => 'ᾣ',
'ᾤ' => 'ᾤ',
'ᾥ' => 'ᾥ',
'ᾦ' => 'ᾦ',
'ᾧ' => 'ᾧ',
'ᾨ' => 'ᾨ',
'ᾩ' => 'ᾩ',
'ᾪ' => 'ᾪ',
'ᾫ' => 'ᾫ',
'ᾬ' => 'ᾬ',
'ᾭ' => 'ᾭ',
'ᾮ' => 'ᾮ',
'ᾯ' => 'ᾯ',
'ᾰ' => 'ᾰ',
'ᾱ' => 'ᾱ',
'ᾲ' => 'ᾲ',
'ᾳ' => 'ᾳ',
'ᾴ' => 'ᾴ',
'ᾶ' => 'ᾶ',
'ᾷ' => 'ᾷ',
'Ᾰ' => 'Ᾰ',
'Ᾱ' => 'Ᾱ',
'Ὰ' => 'Ὰ',
'Ά' => 'Ά',
'ᾼ' => 'ᾼ',
'ι' => 'ι',
'῁' => '῁',
'ῂ' => 'ῂ',
'ῃ' => 'ῃ',
'ῄ' => 'ῄ',
'ῆ' => 'ῆ',
'ῇ' => 'ῇ',
'Ὲ' => 'Ὲ',
'Έ' => 'Έ',
'Ὴ' => 'Ὴ',
'Ή' => 'Ή',
'ῌ' => 'ῌ',
'῍' => '῍',
'῎' => '῎',
'῏' => '῏',
'ῐ' => 'ῐ',
'ῑ' => 'ῑ',
'ῒ' => 'ῒ',
'ΐ' => 'ΐ',
'ῖ' => 'ῖ',
'ῗ' => 'ῗ',
'Ῐ' => 'Ῐ',
'Ῑ' => 'Ῑ',
'Ὶ' => 'Ὶ',
'Ί' => 'Ί',
'῝' => '῝',
'῞' => '῞',
'῟' => '῟',
'ῠ' => 'ῠ',
'ῡ' => 'ῡ',
'ῢ' => 'ῢ',
'ΰ' => 'ΰ',
'ῤ' => 'ῤ',
'ῥ' => 'ῥ',
'ῦ' => 'ῦ',
'ῧ' => 'ῧ',
'Ῠ' => 'Ῠ',
'Ῡ' => 'Ῡ',
'Ὺ' => 'Ὺ',
'Ύ' => 'Ύ',
'Ῥ' => 'Ῥ',
'῭' => '῭',
'΅' => '΅',
'`' => '`',
'ῲ' => 'ῲ',
'ῳ' => 'ῳ',
'ῴ' => 'ῴ',
'ῶ' => 'ῶ',
'ῷ' => 'ῷ',
'Ὸ' => 'Ὸ',
'Ό' => 'Ό',
'Ὼ' => 'Ὼ',
'Ώ' => 'Ώ',
'ῼ' => 'ῼ',
'´' => '´',
' ' => ' ',
' ' => ' ',
'Ω' => 'Ω',
'K' => 'K',
'Å' => 'Å',
'↚' => '↚',
'↛' => '↛',
'↮' => '↮',
'⇍' => '⇍',
'⇎' => '⇎',
'⇏' => '⇏',
'∄' => '∄',
'∉' => '∉',
'∌' => '∌',
'∤' => '∤',
'∦' => '∦',
'≁' => '≁',
'≄' => '≄',
'≇' => '≇',
'≉' => '≉',
'≠' => '≠',
'≢' => '≢',
'≭' => '≭',
'≮' => '≮',
'≯' => '≯',
'≰' => '≰',
'≱' => '≱',
'≴' => '≴',
'≵' => '≵',
'≸' => '≸',
'≹' => '≹',
'⊀' => '⊀',
'⊁' => '⊁',
'⊄' => '⊄',
'⊅' => '⊅',
'⊈' => '⊈',
'⊉' => '⊉',
'⊬' => '⊬',
'⊭' => '⊭',
'⊮' => '⊮',
'⊯' => '⊯',
'⋠' => '⋠',
'⋡' => '⋡',
'⋢' => '⋢',
'⋣' => '⋣',
'⋪' => '⋪',
'⋫' => '⋫',
'⋬' => '⋬',
'⋭' => '⋭',
'〈' => '〈',
'〉' => '〉',
'⫝̸' => '⫝̸',
'が' => 'が',
'ぎ' => 'ぎ',
'ぐ' => 'ぐ',
'げ' => 'げ',
'ご' => 'ご',
'ざ' => 'ざ',
'じ' => 'じ',
'ず' => 'ず',
'ぜ' => 'ぜ',
'ぞ' => 'ぞ',
'だ' => 'だ',
'ぢ' => 'ぢ',
'づ' => 'づ',
'で' => 'で',
'ど' => 'ど',
'ば' => 'ば',
'ぱ' => 'ぱ',
'び' => 'び',
'ぴ' => 'ぴ',
'ぶ' => 'ぶ',
'ぷ' => 'ぷ',
'べ' => 'べ',
'ぺ' => 'ぺ',
'ぼ' => 'ぼ',
'ぽ' => 'ぽ',
'ゔ' => 'ゔ',
'ゞ' => 'ゞ',
'ガ' => 'ガ',
'ギ' => 'ギ',
'グ' => 'グ',
'ゲ' => 'ゲ',
'ゴ' => 'ゴ',
'ザ' => 'ザ',
'ジ' => 'ジ',
'ズ' => 'ズ',
'ゼ' => 'ゼ',
'ゾ' => 'ゾ',
'ダ' => 'ダ',
'ヂ' => 'ヂ',
'ヅ' => 'ヅ',
'デ' => 'デ',
'ド' => 'ド',
'バ' => 'バ',
'パ' => 'パ',
'ビ' => 'ビ',
'ピ' => 'ピ',
'ブ' => 'ブ',
'プ' => 'プ',
'ベ' => 'ベ',
'ペ' => 'ペ',
'ボ' => 'ボ',
'ポ' => 'ポ',
'ヴ' => 'ヴ',
'ヷ' => 'ヷ',
'ヸ' => 'ヸ',
'ヹ' => 'ヹ',
'ヺ' => 'ヺ',
'ヾ' => 'ヾ',
'豈' => '豈',
'更' => '更',
'車' => '車',
'賈' => '賈',
'滑' => '滑',
'串' => '串',
'句' => '句',
'龜' => '龜',
'龜' => '龜',
'契' => '契',
'金' => '金',
'喇' => '喇',
'奈' => '奈',
'懶' => '懶',
'癩' => '癩',
'羅' => '羅',
'蘿' => '蘿',
'螺' => '螺',
'裸' => '裸',
'邏' => '邏',
'樂' => '樂',
'洛' => '洛',
'烙' => '烙',
'珞' => '珞',
'落' => '落',
'酪' => '酪',
'駱' => '駱',
'亂' => '亂',
'卵' => '卵',
'欄' => '欄',
'爛' => '爛',
'蘭' => '蘭',
'鸞' => '鸞',
'嵐' => '嵐',
'濫' => '濫',
'藍' => '藍',
'襤' => '襤',
'拉' => '拉',
'臘' => '臘',
'蠟' => '蠟',
'廊' => '廊',
'朗' => '朗',
'浪' => '浪',
'狼' => '狼',
'郎' => '郎',
'來' => '來',
'冷' => '冷',
'勞' => '勞',
'擄' => '擄',
'櫓' => '櫓',
'爐' => '爐',
'盧' => '盧',
'老' => '老',
'蘆' => '蘆',
'虜' => '虜',
'路' => '路',
'露' => '露',
'魯' => '魯',
'鷺' => '鷺',
'碌' => '碌',
'祿' => '祿',
'綠' => '綠',
'菉' => '菉',
'錄' => '錄',
'鹿' => '鹿',
'論' => '論',
'壟' => '壟',
'弄' => '弄',
'籠' => '籠',
'聾' => '聾',
'牢' => '牢',
'磊' => '磊',
'賂' => '賂',
'雷' => '雷',
'壘' => '壘',
'屢' => '屢',
'樓' => '樓',
'淚' => '淚',
'漏' => '漏',
'累' => '累',
'縷' => '縷',
'陋' => '陋',
'勒' => '勒',
'肋' => '肋',
'凜' => '凜',
'凌' => '凌',
'稜' => '稜',
'綾' => '綾',
'菱' => '菱',
'陵' => '陵',
'讀' => '讀',
'拏' => '拏',
'樂' => '樂',
'諾' => '諾',
'丹' => '丹',
'寧' => '寧',
'怒' => '怒',
'率' => '率',
'異' => '異',
'北' => '北',
'磻' => '磻',
'便' => '便',
'復' => '復',
'不' => '不',
'泌' => '泌',
'數' => '數',
'索' => '索',
'參' => '參',
'塞' => '塞',
'省' => '省',
'葉' => '葉',
'說' => '說',
'殺' => '殺',
'辰' => '辰',
'沈' => '沈',
'拾' => '拾',
'若' => '若',
'掠' => '掠',
'略' => '略',
'亮' => '亮',
'兩' => '兩',
'凉' => '凉',
'梁' => '梁',
'糧' => '糧',
'良' => '良',
'諒' => '諒',
'量' => '量',
'勵' => '勵',
'呂' => '呂',
'女' => '女',
'廬' => '廬',
'旅' => '旅',
'濾' => '濾',
'礪' => '礪',
'閭' => '閭',
'驪' => '驪',
'麗' => '麗',
'黎' => '黎',
'力' => '力',
'曆' => '曆',
'歷' => '歷',
'轢' => '轢',
'年' => '年',
'憐' => '憐',
'戀' => '戀',
'撚' => '撚',
'漣' => '漣',
'煉' => '煉',
'璉' => '璉',
'秊' => '秊',
'練' => '練',
'聯' => '聯',
'輦' => '輦',
'蓮' => '蓮',
'連' => '連',
'鍊' => '鍊',
'列' => '列',
'劣' => '劣',
'咽' => '咽',
'烈' => '烈',
'裂' => '裂',
'說' => '說',
'廉' => '廉',
'念' => '念',
'捻' => '捻',
'殮' => '殮',
'簾' => '簾',
'獵' => '獵',
'令' => '令',
'囹' => '囹',
'寧' => '寧',
'嶺' => '嶺',
'怜' => '怜',
'玲' => '玲',
'瑩' => '瑩',
'羚' => '羚',
'聆' => '聆',
'鈴' => '鈴',
'零' => '零',
'靈' => '靈',
'領' => '領',
'例' => '例',
'禮' => '禮',
'醴' => '醴',
'隸' => '隸',
'惡' => '惡',
'了' => '了',
'僚' => '僚',
'寮' => '寮',
'尿' => '尿',
'料' => '料',
'樂' => '樂',
'燎' => '燎',
'療' => '療',
'蓼' => '蓼',
'遼' => '遼',
'龍' => '龍',
'暈' => '暈',
'阮' => '阮',
'劉' => '劉',
'杻' => '杻',
'柳' => '柳',
'流' => '流',
'溜' => '溜',
'琉' => '琉',
'留' => '留',
'硫' => '硫',
'紐' => '紐',
'類' => '類',
'六' => '六',
'戮' => '戮',
'陸' => '陸',
'倫' => '倫',
'崙' => '崙',
'淪' => '淪',
'輪' => '輪',
'律' => '律',
'慄' => '慄',
'栗' => '栗',
'率' => '率',
'隆' => '隆',
'利' => '利',
'吏' => '吏',
'履' => '履',
'易' => '易',
'李' => '李',
'梨' => '梨',
'泥' => '泥',
'理' => '理',
'痢' => '痢',
'罹' => '罹',
'裏' => '裏',
'裡' => '裡',
'里' => '里',
'離' => '離',
'匿' => '匿',
'溺' => '溺',
'吝' => '吝',
'燐' => '燐',
'璘' => '璘',
'藺' => '藺',
'隣' => '隣',
'鱗' => '鱗',
'麟' => '麟',
'林' => '林',
'淋' => '淋',
'臨' => '臨',
'立' => '立',
'笠' => '笠',
'粒' => '粒',
'狀' => '狀',
'炙' => '炙',
'識' => '識',
'什' => '什',
'茶' => '茶',
'刺' => '刺',
'切' => '切',
'度' => '度',
'拓' => '拓',
'糖' => '糖',
'宅' => '宅',
'洞' => '洞',
'暴' => '暴',
'輻' => '輻',
'行' => '行',
'降' => '降',
'見' => '見',
'廓' => '廓',
'兀' => '兀',
'嗀' => '嗀',
'塚' => '塚',
'晴' => '晴',
'凞' => '凞',
'猪' => '猪',
'益' => '益',
'礼' => '礼',
'神' => '神',
'祥' => '祥',
'福' => '福',
'靖' => '靖',
'精' => '精',
'羽' => '羽',
'蘒' => '蘒',
'諸' => '諸',
'逸' => '逸',
'都' => '都',
'飯' => '飯',
'飼' => '飼',
'館' => '館',
'鶴' => '鶴',
'郞' => '郞',
'隷' => '隷',
'侮' => '侮',
'僧' => '僧',
'免' => '免',
'勉' => '勉',
'勤' => '勤',
'卑' => '卑',
'喝' => '喝',
'嘆' => '嘆',
'器' => '器',
'塀' => '塀',
'墨' => '墨',
'層' => '層',
'屮' => '屮',
'悔' => '悔',
'慨' => '慨',
'憎' => '憎',
'懲' => '懲',
'敏' => '敏',
'既' => '既',
'暑' => '暑',
'梅' => '梅',
'海' => '海',
'渚' => '渚',
'漢' => '漢',
'煮' => '煮',
'爫' => '爫',
'琢' => '琢',
'碑' => '碑',
'社' => '社',
'祉' => '祉',
'祈' => '祈',
'祐' => '祐',
'祖' => '祖',
'祝' => '祝',
'禍' => '禍',
'禎' => '禎',
'穀' => '穀',
'突' => '突',
'節' => '節',
'練' => '練',
'縉' => '縉',
'繁' => '繁',
'署' => '署',
'者' => '者',
'臭' => '臭',
'艹' => '艹',
'艹' => '艹',
'著' => '著',
'褐' => '褐',
'視' => '視',
'謁' => '謁',
'謹' => '謹',
'賓' => '賓',
'贈' => '贈',
'辶' => '辶',
'逸' => '逸',
'難' => '難',
'響' => '響',
'頻' => '頻',
'恵' => '恵',
'𤋮' => '𤋮',
'舘' => '舘',
'並' => '並',
'况' => '况',
'全' => '全',
'侀' => '侀',
'充' => '充',
'冀' => '冀',
'勇' => '勇',
'勺' => '勺',
'喝' => '喝',
'啕' => '啕',
'喙' => '喙',
'嗢' => '嗢',
'塚' => '塚',
'墳' => '墳',
'奄' => '奄',
'奔' => '奔',
'婢' => '婢',
'嬨' => '嬨',
'廒' => '廒',
'廙' => '廙',
'彩' => '彩',
'徭' => '徭',
'惘' => '惘',
'慎' => '慎',
'愈' => '愈',
'憎' => '憎',
'慠' => '慠',
'懲' => '懲',
'戴' => '戴',
'揄' => '揄',
'搜' => '搜',
'摒' => '摒',
'敖' => '敖',
'晴' => '晴',
'朗' => '朗',
'望' => '望',
'杖' => '杖',
'歹' => '歹',
'殺' => '殺',
'流' => '流',
'滛' => '滛',
'滋' => '滋',
'漢' => '漢',
'瀞' => '瀞',
'煮' => '煮',
'瞧' => '瞧',
'爵' => '爵',
'犯' => '犯',
'猪' => '猪',
'瑱' => '瑱',
'甆' => '甆',
'画' => '画',
'瘝' => '瘝',
'瘟' => '瘟',
'益' => '益',
'盛' => '盛',
'直' => '直',
'睊' => '睊',
'着' => '着',
'磌' => '磌',
'窱' => '窱',
'節' => '節',
'类' => '类',
'絛' => '絛',
'練' => '練',
'缾' => '缾',
'者' => '者',
'荒' => '荒',
'華' => '華',
'蝹' => '蝹',
'襁' => '襁',
'覆' => '覆',
'視' => '視',
'調' => '調',
'諸' => '諸',
'請' => '請',
'謁' => '謁',
'諾' => '諾',
'諭' => '諭',
'謹' => '謹',
'變' => '變',
'贈' => '贈',
'輸' => '輸',
'遲' => '遲',
'醙' => '醙',
'鉶' => '鉶',
'陼' => '陼',
'難' => '難',
'靖' => '靖',
'韛' => '韛',
'響' => '響',
'頋' => '頋',
'頻' => '頻',
'鬒' => '鬒',
'龜' => '龜',
'𢡊' => '𢡊',
'𢡄' => '𢡄',
'𣏕' => '𣏕',
'㮝' => '㮝',
'䀘' => '䀘',
'䀹' => '䀹',
'𥉉' => '𥉉',
'𥳐' => '𥳐',
'𧻓' => '𧻓',
'齃' => '齃',
'龎' => '龎',
'יִ' => 'יִ',
'ײַ' => 'ײַ',
'שׁ' => 'שׁ',
'שׂ' => 'שׂ',
'שּׁ' => 'שּׁ',
'שּׂ' => 'שּׂ',
'אַ' => 'אַ',
'אָ' => 'אָ',
'אּ' => 'אּ',
'בּ' => 'בּ',
'גּ' => 'גּ',
'דּ' => 'דּ',
'הּ' => 'הּ',
'וּ' => 'וּ',
'זּ' => 'זּ',
'טּ' => 'טּ',
'יּ' => 'יּ',
'ךּ' => 'ךּ',
'כּ' => 'כּ',
'לּ' => 'לּ',
'מּ' => 'מּ',
'נּ' => 'נּ',
'סּ' => 'סּ',
'ףּ' => 'ףּ',
'פּ' => 'פּ',
'צּ' => 'צּ',
'קּ' => 'קּ',
'רּ' => 'רּ',
'שּ' => 'שּ',
'תּ' => 'תּ',
'וֹ' => 'וֹ',
'בֿ' => 'בֿ',
'כֿ' => 'כֿ',
'פֿ' => 'פֿ',
'𑂚' => '𑂚',
'𑂜' => '𑂜',
'𑂫' => '𑂫',
'𑄮' => '𑄮',
'𑄯' => '𑄯',
'𑍋' => '𑍋',
'𑍌' => '𑍌',
'𑒻' => '𑒻',
'𑒼' => '𑒼',
'𑒾' => '𑒾',
'𑖺' => '𑖺',
'𑖻' => '𑖻',
'𑤸' => '𑤸',
'𝅗𝅥' => '𝅗𝅥',
'𝅘𝅥' => '𝅘𝅥',
'𝅘𝅥𝅮' => '𝅘𝅥𝅮',
'𝅘𝅥𝅯' => '𝅘𝅥𝅯',
'𝅘𝅥𝅰' => '𝅘𝅥𝅰',
'𝅘𝅥𝅱' => '𝅘𝅥𝅱',
'𝅘𝅥𝅲' => '𝅘𝅥𝅲',
'𝆹𝅥' => '𝆹𝅥',
'𝆺𝅥' => '𝆺𝅥',
'𝆹𝅥𝅮' => '𝆹𝅥𝅮',
'𝆺𝅥𝅮' => '𝆺𝅥𝅮',
'𝆹𝅥𝅯' => '𝆹𝅥𝅯',
'𝆺𝅥𝅯' => '𝆺𝅥𝅯',
'丽' => '丽',
'丸' => '丸',
'乁' => '乁',
'𠄢' => '𠄢',
'你' => '你',
'侮' => '侮',
'侻' => '侻',
'倂' => '倂',
'偺' => '偺',
'備' => '備',
'僧' => '僧',
'像' => '像',
'㒞' => '㒞',
'𠘺' => '𠘺',
'免' => '免',
'兔' => '兔',
'兤' => '兤',
'具' => '具',
'𠔜' => '𠔜',
'㒹' => '㒹',
'內' => '內',
'再' => '再',
'𠕋' => '𠕋',
'冗' => '冗',
'冤' => '冤',
'仌' => '仌',
'冬' => '冬',
'况' => '况',
'𩇟' => '𩇟',
'凵' => '凵',
'刃' => '刃',
'㓟' => '㓟',
'刻' => '刻',
'剆' => '剆',
'割' => '割',
'剷' => '剷',
'㔕' => '㔕',
'勇' => '勇',
'勉' => '勉',
'勤' => '勤',
'勺' => '勺',
'包' => '包',
'匆' => '匆',
'北' => '北',
'卉' => '卉',
'卑' => '卑',
'博' => '博',
'即' => '即',
'卽' => '卽',
'卿' => '卿',
'卿' => '卿',
'卿' => '卿',
'𠨬' => '𠨬',
'灰' => '灰',
'及' => '及',
'叟' => '叟',
'𠭣' => '𠭣',
'叫' => '叫',
'叱' => '叱',
'吆' => '吆',
'咞' => '咞',
'吸' => '吸',
'呈' => '呈',
'周' => '周',
'咢' => '咢',
'哶' => '哶',
'唐' => '唐',
'啓' => '啓',
'啣' => '啣',
'善' => '善',
'善' => '善',
'喙' => '喙',
'喫' => '喫',
'喳' => '喳',
'嗂' => '嗂',
'圖' => '圖',
'嘆' => '嘆',
'圗' => '圗',
'噑' => '噑',
'噴' => '噴',
'切' => '切',
'壮' => '壮',
'城' => '城',
'埴' => '埴',
'堍' => '堍',
'型' => '型',
'堲' => '堲',
'報' => '報',
'墬' => '墬',
'𡓤' => '𡓤',
'売' => '売',
'壷' => '壷',
'夆' => '夆',
'多' => '多',
'夢' => '夢',
'奢' => '奢',
'𡚨' => '𡚨',
'𡛪' => '𡛪',
'姬' => '姬',
'娛' => '娛',
'娧' => '娧',
'姘' => '姘',
'婦' => '婦',
'㛮' => '㛮',
'㛼' => '㛼',
'嬈' => '嬈',
'嬾' => '嬾',
'嬾' => '嬾',
'𡧈' => '𡧈',
'寃' => '寃',
'寘' => '寘',
'寧' => '寧',
'寳' => '寳',
'𡬘' => '𡬘',
'寿' => '寿',
'将' => '将',
'当' => '当',
'尢' => '尢',
'㞁' => '㞁',
'屠' => '屠',
'屮' => '屮',
'峀' => '峀',
'岍' => '岍',
'𡷤' => '𡷤',
'嵃' => '嵃',
'𡷦' => '𡷦',
'嵮' => '嵮',
'嵫' => '嵫',
'嵼' => '嵼',
'巡' => '巡',
'巢' => '巢',
'㠯' => '㠯',
'巽' => '巽',
'帨' => '帨',
'帽' => '帽',
'幩' => '幩',
'㡢' => '㡢',
'𢆃' => '𢆃',
'㡼' => '㡼',
'庰' => '庰',
'庳' => '庳',
'庶' => '庶',
'廊' => '廊',
'𪎒' => '𪎒',
'廾' => '廾',
'𢌱' => '𢌱',
'𢌱' => '𢌱',
'舁' => '舁',
'弢' => '弢',
'弢' => '弢',
'㣇' => '㣇',
'𣊸' => '𣊸',
'𦇚' => '𦇚',
'形' => '形',
'彫' => '彫',
'㣣' => '㣣',
'徚' => '徚',
'忍' => '忍',
'志' => '志',
'忹' => '忹',
'悁' => '悁',
'㤺' => '㤺',
'㤜' => '㤜',
'悔' => '悔',
'𢛔' => '𢛔',
'惇' => '惇',
'慈' => '慈',
'慌' => '慌',
'慎' => '慎',
'慌' => '慌',
'慺' => '慺',
'憎' => '憎',
'憲' => '憲',
'憤' => '憤',
'憯' => '憯',
'懞' => '懞',
'懲' => '懲',
'懶' => '懶',
'成' => '成',
'戛' => '戛',
'扝' => '扝',
'抱' => '抱',
'拔' => '拔',
'捐' => '捐',
'𢬌' => '𢬌',
'挽' => '挽',
'拼' => '拼',
'捨' => '捨',
'掃' => '掃',
'揤' => '揤',
'𢯱' => '𢯱',
'搢' => '搢',
'揅' => '揅',
'掩' => '掩',
'㨮' => '㨮',
'摩' => '摩',
'摾' => '摾',
'撝' => '撝',
'摷' => '摷',
'㩬' => '㩬',
'敏' => '敏',
'敬' => '敬',
'𣀊' => '𣀊',
'旣' => '旣',
'書' => '書',
'晉' => '晉',
'㬙' => '㬙',
'暑' => '暑',
'㬈' => '㬈',
'㫤' => '㫤',
'冒' => '冒',
'冕' => '冕',
'最' => '最',
'暜' => '暜',
'肭' => '肭',
'䏙' => '䏙',
'朗' => '朗',
'望' => '望',
'朡' => '朡',
'杞' => '杞',
'杓' => '杓',
'𣏃' => '𣏃',
'㭉' => '㭉',
'柺' => '柺',
'枅' => '枅',
'桒' => '桒',
'梅' => '梅',
'𣑭' => '𣑭',
'梎' => '梎',
'栟' => '栟',
'椔' => '椔',
'㮝' => '㮝',
'楂' => '楂',
'榣' => '榣',
'槪' => '槪',
'檨' => '檨',
'𣚣' => '𣚣',
'櫛' => '櫛',
'㰘' => '㰘',
'次' => '次',
'𣢧' => '𣢧',
'歔' => '歔',
'㱎' => '㱎',
'歲' => '歲',
'殟' => '殟',
'殺' => '殺',
'殻' => '殻',
'𣪍' => '𣪍',
'𡴋' => '𡴋',
'𣫺' => '𣫺',
'汎' => '汎',
'𣲼' => '𣲼',
'沿' => '沿',
'泍' => '泍',
'汧' => '汧',
'洖' => '洖',
'派' => '派',
'海' => '海',
'流' => '流',
'浩' => '浩',
'浸' => '浸',
'涅' => '涅',
'𣴞' => '𣴞',
'洴' => '洴',
'港' => '港',
'湮' => '湮',
'㴳' => '㴳',
'滋' => '滋',
'滇' => '滇',
'𣻑' => '𣻑',
'淹' => '淹',
'潮' => '潮',
'𣽞' => '𣽞',
'𣾎' => '𣾎',
'濆' => '濆',
'瀹' => '瀹',
'瀞' => '瀞',
'瀛' => '瀛',
'㶖' => '㶖',
'灊' => '灊',
'災' => '災',
'灷' => '灷',
'炭' => '炭',
'𠔥' => '𠔥',
'煅' => '煅',
'𤉣' => '𤉣',
'熜' => '熜',
'𤎫' => '𤎫',
'爨' => '爨',
'爵' => '爵',
'牐' => '牐',
'𤘈' => '𤘈',
'犀' => '犀',
'犕' => '犕',
'𤜵' => '𤜵',
'𤠔' => '𤠔',
'獺' => '獺',
'王' => '王',
'㺬' => '㺬',
'玥' => '玥',
'㺸' => '㺸',
'㺸' => '㺸',
'瑇' => '瑇',
'瑜' => '瑜',
'瑱' => '瑱',
'璅' => '璅',
'瓊' => '瓊',
'㼛' => '㼛',
'甤' => '甤',
'𤰶' => '𤰶',
'甾' => '甾',
'𤲒' => '𤲒',
'異' => '異',
'𢆟' => '𢆟',
'瘐' => '瘐',
'𤾡' => '𤾡',
'𤾸' => '𤾸',
'𥁄' => '𥁄',
'㿼' => '㿼',
'䀈' => '䀈',
'直' => '直',
'𥃳' => '𥃳',
'𥃲' => '𥃲',
'𥄙' => '𥄙',
'𥄳' => '𥄳',
'眞' => '眞',
'真' => '真',
'真' => '真',
'睊' => '睊',
'䀹' => '䀹',
'瞋' => '瞋',
'䁆' => '䁆',
'䂖' => '䂖',
'𥐝' => '𥐝',
'硎' => '硎',
'碌' => '碌',
'磌' => '磌',
'䃣' => '䃣',
'𥘦' => '𥘦',
'祖' => '祖',
'𥚚' => '𥚚',
'𥛅' => '𥛅',
'福' => '福',
'秫' => '秫',
'䄯' => '䄯',
'穀' => '穀',
'穊' => '穊',
'穏' => '穏',
'𥥼' => '𥥼',
'𥪧' => '𥪧',
'𥪧' => '𥪧',
'竮' => '竮',
'䈂' => '䈂',
'𥮫' => '𥮫',
'篆' => '篆',
'築' => '築',
'䈧' => '䈧',
'𥲀' => '𥲀',
'糒' => '糒',
'䊠' => '䊠',
'糨' => '糨',
'糣' => '糣',
'紀' => '紀',
'𥾆' => '𥾆',
'絣' => '絣',
'䌁' => '䌁',
'緇' => '緇',
'縂' => '縂',
'繅' => '繅',
'䌴' => '䌴',
'𦈨' => '𦈨',
'𦉇' => '𦉇',
'䍙' => '䍙',
'𦋙' => '𦋙',
'罺' => '罺',
'𦌾' => '𦌾',
'羕' => '羕',
'翺' => '翺',
'者' => '者',
'𦓚' => '𦓚',
'𦔣' => '𦔣',
'聠' => '聠',
'𦖨' => '𦖨',
'聰' => '聰',
'𣍟' => '𣍟',
'䏕' => '䏕',
'育' => '育',
'脃' => '脃',
'䐋' => '䐋',
'脾' => '脾',
'媵' => '媵',
'𦞧' => '𦞧',
'𦞵' => '𦞵',
'𣎓' => '𣎓',
'𣎜' => '𣎜',
'舁' => '舁',
'舄' => '舄',
'辞' => '辞',
'䑫' => '䑫',
'芑' => '芑',
'芋' => '芋',
'芝' => '芝',
'劳' => '劳',
'花' => '花',
'芳' => '芳',
'芽' => '芽',
'苦' => '苦',
'𦬼' => '𦬼',
'若' => '若',
'茝' => '茝',
'荣' => '荣',
'莭' => '莭',
'茣' => '茣',
'莽' => '莽',
'菧' => '菧',
'著' => '著',
'荓' => '荓',
'菊' => '菊',
'菌' => '菌',
'菜' => '菜',
'𦰶' => '𦰶',
'𦵫' => '𦵫',
'𦳕' => '𦳕',
'䔫' => '䔫',
'蓱' => '蓱',
'蓳' => '蓳',
'蔖' => '蔖',
'𧏊' => '𧏊',
'蕤' => '蕤',
'𦼬' => '𦼬',
'䕝' => '䕝',
'䕡' => '䕡',
'𦾱' => '𦾱',
'𧃒' => '𧃒',
'䕫' => '䕫',
'虐' => '虐',
'虜' => '虜',
'虧' => '虧',
'虩' => '虩',
'蚩' => '蚩',
'蚈' => '蚈',
'蜎' => '蜎',
'蛢' => '蛢',
'蝹' => '蝹',
'蜨' => '蜨',
'蝫' => '蝫',
'螆' => '螆',
'䗗' => '䗗',
'蟡' => '蟡',
'蠁' => '蠁',
'䗹' => '䗹',
'衠' => '衠',
'衣' => '衣',
'𧙧' => '𧙧',
'裗' => '裗',
'裞' => '裞',
'䘵' => '䘵',
'裺' => '裺',
'㒻' => '㒻',
'𧢮' => '𧢮',
'𧥦' => '𧥦',
'䚾' => '䚾',
'䛇' => '䛇',
'誠' => '誠',
'諭' => '諭',
'變' => '變',
'豕' => '豕',
'𧲨' => '𧲨',
'貫' => '貫',
'賁' => '賁',
'贛' => '贛',
'起' => '起',
'𧼯' => '𧼯',
'𠠄' => '𠠄',
'跋' => '跋',
'趼' => '趼',
'跰' => '跰',
'𠣞' => '𠣞',
'軔' => '軔',
'輸' => '輸',
'𨗒' => '𨗒',
'𨗭' => '𨗭',
'邔' => '邔',
'郱' => '郱',
'鄑' => '鄑',
'𨜮' => '𨜮',
'鄛' => '鄛',
'鈸' => '鈸',
'鋗' => '鋗',
'鋘' => '鋘',
'鉼' => '鉼',
'鏹' => '鏹',
'鐕' => '鐕',
'𨯺' => '𨯺',
'開' => '開',
'䦕' => '䦕',
'閷' => '閷',
'𨵷' => '𨵷',
'䧦' => '䧦',
'雃' => '雃',
'嶲' => '嶲',
'霣' => '霣',
'𩅅' => '𩅅',
'𩈚' => '𩈚',
'䩮' => '䩮',
'䩶' => '䩶',
'韠' => '韠',
'𩐊' => '𩐊',
'䪲' => '䪲',
'𩒖' => '𩒖',
'頋' => '頋',
'頋' => '頋',
'頩' => '頩',
'𩖶' => '𩖶',
'飢' => '飢',
'䬳' => '䬳',
'餩' => '餩',
'馧' => '馧',
'駂' => '駂',
'駾' => '駾',
'䯎' => '䯎',
'𩬰' => '𩬰',
'鬒' => '鬒',
'鱀' => '鱀',
'鳽' => '鳽',
'䳎' => '䳎',
'䳭' => '䳭',
'鵧' => '鵧',
'𪃎' => '𪃎',
'䳸' => '䳸',
'𪄅' => '𪄅',
'𪈎' => '𪈎',
'𪊑' => '𪊑',
'麻' => '麻',
'䵖' => '䵖',
'黹' => '黹',
'黾' => '黾',
'鼅' => '鼅',
'鼏' => '鼏',
'鼖' => '鼖',
'鼻' => '鼻',
'𪘀' => '𪘀',
);
<?php

return array (
' ' => ' ',
'¨' => ' ̈',
'ª' => 'a',
'¯' => ' ̄',
'²' => '2',
'³' => '3',
'´' => ' ́',
'µ' => 'μ',
'¸' => ' ̧',
'¹' => '1',
'º' => 'o',
'¼' => '1⁄4',
'½' => '1⁄2',
'¾' => '3⁄4',
'Ĳ' => 'IJ',
'ĳ' => 'ij',
'Ŀ' => 'L·',
'ŀ' => 'l·',
'ŉ' => 'ʼn',
'ſ' => 's',
'Ǆ' => 'DŽ',
'ǅ' => 'Dž',
'ǆ' => 'dž',
'Ǉ' => 'LJ',
'ǈ' => 'Lj',
'ǉ' => 'lj',
'Ǌ' => 'NJ',
'ǋ' => 'Nj',
'ǌ' => 'nj',
'Ǳ' => '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ʾ',
'ẛ' => 'ṡ',
'᾽' => ' ̓',
'᾿' => ' ̓',
'῀' => ' ͂',
'῁' => ' ̈͂',
'῍' => ' ̓̀',
'῎' => ' ̓́',
'῏' => ' ̓͂',
'῝' => ' ̔̀',
'῞' => ' ̔́',
'῟' => ' ̔͂',
'῭' => ' ̈̀',
'΅' => ' ̈́',
'´' => ' ́',
'῾' => ' ̔',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
' ' => ' ',
'‑' => '‐',
'‗' => ' ̳',
'․' => '.',
'‥' => '..',
'…' => '...',
' ' => ' ',
'″' => '′′',
'‴' => '′′′',
'‶' => '‵‵',
'‷' => '‵‵‵',
'‼' => '!!',
'‾' => ' ̅',
'⁇' => '??',
'⁈' => '?!',
'⁉' => '!?',
'⁗' => '′′′′',
' ' => ' ',
'⁰' => '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',
'ﬁ' => 'fi',
'ﬂ' => 'fl',
'ﬃ' => 'ffi',
'ﬄ' => 'ffl',
'ﬅ' => 'st',
'ﬆ' => 'st',
'ﬓ' => 'մն',
'ﬔ' => 'մե',
'ﬕ' => 'մի',
'ﬖ' => 'վն',
'ﬗ' => 'մխ',
'ﬠ' => 'ע',
'ﬡ' => 'א',
'ﬢ' => 'ד',
'ﬣ' => 'ה',
'ﬤ' => 'כ',
'ﬥ' => 'ל',
'ﬦ' => 'ם',
'ﬧ' => 'ר',
'ﬨ' => 'ת',
'﬩' => '+',
'ﭏ' => 'אל',
'ﭐ' => 'ٱ',
'ﭑ' => 'ٱ',
'ﭒ' => 'ٻ',
'ﭓ' => 'ٻ',
'ﭔ' => 'ٻ',
'ﭕ' => 'ٻ',
'ﭖ' => 'پ',
'ﭗ' => 'پ',
'ﭘ' => 'پ',
'ﭙ' => 'پ',
'ﭚ' => 'ڀ',
'ﭛ' => 'ڀ',
'ﭜ' => 'ڀ',
'ﭝ' => 'ڀ',
'ﭞ' => 'ٺ',
'ﭟ' => 'ٺ',
'ﭠ' => 'ٺ',
'ﭡ' => 'ٺ',
'ﭢ' => 'ٿ',
'ﭣ' => 'ٿ',
'ﭤ' => 'ٿ',
'ﭥ' => 'ٿ',
'ﭦ' => 'ٹ',
'ﭧ' => 'ٹ',
'ﭨ' => 'ٹ',
'ﭩ' => 'ٹ',
'ﭪ' => 'ڤ',
'ﭫ' => 'ڤ',
'ﭬ' => 'ڤ',
'ﭭ' => 'ڤ',
'ﭮ' => 'ڦ',
'ﭯ' => 'ڦ',
'ﭰ' => 'ڦ',
'ﭱ' => 'ڦ',
'ﭲ' => 'ڄ',
'ﭳ' => 'ڄ',
'ﭴ' => 'ڄ',
'ﭵ' => 'ڄ',
'ﭶ' => 'ڃ',
'ﭷ' => 'ڃ',
'ﭸ' => 'ڃ',
'ﭹ' => 'ڃ',
'ﭺ' => 'چ',
'ﭻ' => 'چ',
'ﭼ' => 'چ',
'ﭽ' => 'چ',
'ﭾ' => 'ڇ',
'ﭿ' => 'ڇ',
'ﮀ' => 'ڇ',
'ﮁ' => 'ڇ',
'ﮂ' => 'ڍ',
'ﮃ' => 'ڍ',
'ﮄ' => 'ڌ',
'ﮅ' => 'ڌ',
'ﮆ' => 'ڎ',
'ﮇ' => 'ڎ',
'ﮈ' => 'ڈ',
'ﮉ' => 'ڈ',
'ﮊ' => 'ژ',
'ﮋ' => 'ژ',
'ﮌ' => 'ڑ',
'ﮍ' => 'ڑ',
'ﮎ' => 'ک',
'ﮏ' => 'ک',
'ﮐ' => 'ک',
'ﮑ' => 'ک',
'ﮒ' => 'گ',
'ﮓ' => 'گ',
'ﮔ' => 'گ',
'ﮕ' => 'گ',
'ﮖ' => 'ڳ',
'ﮗ' => 'ڳ',
'ﮘ' => 'ڳ',
'ﮙ' => 'ڳ',
'ﮚ' => 'ڱ',
'ﮛ' => 'ڱ',
'ﮜ' => 'ڱ',
'ﮝ' => 'ڱ',
'ﮞ' => 'ں',
'ﮟ' => 'ں',
'ﮠ' => 'ڻ',
'ﮡ' => 'ڻ',
'ﮢ' => 'ڻ',
'ﮣ' => 'ڻ',
'ﮤ' => 'ۀ',
'ﮥ' => 'ۀ',
'ﮦ' => 'ہ',
'ﮧ' => 'ہ',
'ﮨ' => 'ہ',
'ﮩ' => 'ہ',
'ﮪ' => 'ھ',
'ﮫ' => 'ھ',
'ﮬ' => 'ھ',
'ﮭ' => 'ھ',
'ﮮ' => 'ے',
'ﮯ' => 'ے',
'ﮰ' => 'ۓ',
'ﮱ' => 'ۓ',
'ﯓ' => 'ڭ',
'ﯔ' => 'ڭ',
'ﯕ' => 'ڭ',
'ﯖ' => 'ڭ',
'ﯗ' => 'ۇ',
'ﯘ' => 'ۇ',
'ﯙ' => 'ۆ',
'ﯚ' => 'ۆ',
'ﯛ' => 'ۈ',
'ﯜ' => 'ۈ',
'ﯝ' => 'ۇٴ',
'ﯞ' => 'ۋ',
'ﯟ' => 'ۋ',
'ﯠ' => 'ۅ',
'ﯡ' => 'ۅ',
'ﯢ' => 'ۉ',
'ﯣ' => 'ۉ',
'ﯤ' => 'ې',
'ﯥ' => 'ې',
'ﯦ' => 'ې',
'ﯧ' => 'ې',
'ﯨ' => 'ى',
'ﯩ' => 'ى',
'ﯪ' => 'ئا',
'ﯫ' => 'ئا',
'ﯬ' => 'ئە',
'ﯭ' => 'ئە',
'ﯮ' => 'ئو',
'ﯯ' => 'ئو',
'ﯰ' => 'ئۇ',
'ﯱ' => 'ئۇ',
'ﯲ' => 'ئۆ',
'ﯳ' => 'ئۆ',
'ﯴ' => 'ئۈ',
'ﯵ' => 'ئۈ',
'ﯶ' => 'ئې',
'ﯷ' => 'ئې',
'ﯸ' => 'ئې',
'ﯹ' => 'ئى',
'ﯺ' => 'ئى',
'ﯻ' => 'ئى',
'ﯼ' => 'ی',
'ﯽ' => 'ی',
'ﯾ' => 'ی',
'ﯿ' => 'ی',
'ﰀ' => 'ئج',
'ﰁ' => 'ئح',
'ﰂ' => 'ئم',
'ﰃ' => 'ئى',
'ﰄ' => 'ئي',
'ﰅ' => 'بج',
'ﰆ' => 'بح',
'ﰇ' => 'بخ',
'ﰈ' => 'بم',
'ﰉ' => 'بى',
'ﰊ' => 'بي',
'ﰋ' => 'تج',
'ﰌ' => 'تح',
'ﰍ' => 'تخ',
'ﰎ' => 'تم',
'ﰏ' => 'تى',
'ﰐ' => 'تي',
'ﰑ' => 'ثج',
'ﰒ' => 'ثم',
'ﰓ' => 'ثى',
'ﰔ' => 'ثي',
'ﰕ' => 'جح',
'ﰖ' => 'جم',
'ﰗ' => 'حج',
'ﰘ' => 'حم',
'ﰙ' => 'خج',
'ﰚ' => 'خح',
'ﰛ' => 'خم',
'ﰜ' => 'سج',
'ﰝ' => 'سح',
'ﰞ' => 'سخ',
'ﰟ' => 'سم',
'ﰠ' => 'صح',
'ﰡ' => 'صم',
'ﰢ' => 'ضج',
'ﰣ' => 'ضح',
'ﰤ' => 'ضخ',
'ﰥ' => 'ضم',
'ﰦ' => 'طح',
'ﰧ' => 'طم',
'ﰨ' => 'ظم',
'ﰩ' => 'عج',
'ﰪ' => 'عم',
'ﰫ' => 'غج',
'ﰬ' => 'غم',
'ﰭ' => 'فج',
'ﰮ' => 'فح',
'ﰯ' => 'فخ',
'ﰰ' => 'فم',
'ﰱ' => 'فى',
'ﰲ' => 'في',
'ﰳ' => 'قح',
'ﰴ' => 'قم',
'ﰵ' => 'قى',
'ﰶ' => 'قي',
'ﰷ' => 'كا',
'ﰸ' => 'كج',
'ﰹ' => 'كح',
'ﰺ' => 'كخ',
'ﰻ' => 'كل',
'ﰼ' => 'كم',
'ﰽ' => 'كى',
'ﰾ' => 'كي',
'ﰿ' => 'لج',
'ﱀ' => 'لح',
'ﱁ' => 'لخ',
'ﱂ' => 'لم',
'ﱃ' => 'لى',
'ﱄ' => 'لي',
'ﱅ' => 'مج',
'ﱆ' => 'مح',
'ﱇ' => 'مخ',
'ﱈ' => 'مم',
'ﱉ' => 'مى',
'ﱊ' => 'مي',
'ﱋ' => 'نج',
'ﱌ' => 'نح',
'ﱍ' => 'نخ',
'ﱎ' => 'نم',
'ﱏ' => 'نى',
'ﱐ' => 'ني',
'ﱑ' => 'هج',
'ﱒ' => 'هم',
'ﱓ' => 'هى',
'ﱔ' => 'هي',
'ﱕ' => 'يج',
'ﱖ' => 'يح',
'ﱗ' => 'يخ',
'ﱘ' => 'يم',
'ﱙ' => 'يى',
'ﱚ' => 'يي',
'ﱛ' => 'ذٰ',
'ﱜ' => 'رٰ',
'ﱝ' => 'ىٰ',
'ﱞ' => ' ٌّ',
'ﱟ' => ' ٍّ',
'ﱠ' => ' َّ',
'ﱡ' => ' ُّ',
'ﱢ' => ' ِّ',
'ﱣ' => ' ّٰ',
'ﱤ' => 'ئر',
'ﱥ' => 'ئز',
'ﱦ' => 'ئم',
'ﱧ' => 'ئن',
'ﱨ' => 'ئى',
'ﱩ' => 'ئي',
'ﱪ' => 'بر',
'ﱫ' => 'بز',
'ﱬ' => 'بم',
'ﱭ' => 'بن',
'ﱮ' => 'بى',
'ﱯ' => 'بي',
'ﱰ' => 'تر',
'ﱱ' => 'تز',
'ﱲ' => 'تم',
'ﱳ' => 'تن',
'ﱴ' => 'تى',
'ﱵ' => 'تي',
'ﱶ' => 'ثر',
'ﱷ' => 'ثز',
'ﱸ' => 'ثم',
'ﱹ' => 'ثن',
'ﱺ' => 'ثى',
'ﱻ' => 'ثي',
'ﱼ' => 'فى',
'ﱽ' => 'في',
'ﱾ' => 'قى',
'ﱿ' => 'قي',
'ﲀ' => 'كا',
'ﲁ' => 'كل',
'ﲂ' => 'كم',
'ﲃ' => 'كى',
'ﲄ' => 'كي',
'ﲅ' => 'لم',
'ﲆ' => 'لى',
'ﲇ' => 'لي',
'ﲈ' => 'ما',
'ﲉ' => 'مم',
'ﲊ' => 'نر',
'ﲋ' => 'نز',
'ﲌ' => 'نم',
'ﲍ' => 'نن',
'ﲎ' => 'نى',
'ﲏ' => 'ني',
'ﲐ' => 'ىٰ',
'ﲑ' => 'ير',
'ﲒ' => 'يز',
'ﲓ' => 'يم',
'ﲔ' => 'ين',
'ﲕ' => 'يى',
'ﲖ' => 'يي',
'ﲗ' => 'ئج',
'ﲘ' => 'ئح',
'ﲙ' => 'ئخ',
'ﲚ' => 'ئم',
'ﲛ' => 'ئه',
'ﲜ' => 'بج',
'ﲝ' => 'بح',
'ﲞ' => 'بخ',
'ﲟ' => 'بم',
'ﲠ' => 'به',
'ﲡ' => 'تج',
'ﲢ' => 'تح',
'ﲣ' => 'تخ',
'ﲤ' => 'تم',
'ﲥ' => 'ته',
'ﲦ' => 'ثم',
'ﲧ' => 'جح',
'ﲨ' => 'جم',
'ﲩ' => 'حج',
'ﲪ' => 'حم',
'ﲫ' => 'خج',
'ﲬ' => 'خم',
'ﲭ' => 'سج',
'ﲮ' => 'سح',
'ﲯ' => 'سخ',
'ﲰ' => 'سم',
'ﲱ' => 'صح',
'ﲲ' => 'صخ',
'ﲳ' => 'صم',
'ﲴ' => 'ضج',
'ﲵ' => 'ضح',
'ﲶ' => 'ضخ',
'ﲷ' => 'ضم',
'ﲸ' => 'طح',
'ﲹ' => 'ظم',
'ﲺ' => 'عج',
'ﲻ' => 'عم',
'ﲼ' => 'غج',
'ﲽ' => 'غم',
'ﲾ' => 'فج',
'ﲿ' => 'فح',
'ﳀ' => 'فخ',
'ﳁ' => 'فم',
'ﳂ' => 'قح',
'ﳃ' => 'قم',
'ﳄ' => 'كج',
'ﳅ' => 'كح',
'ﳆ' => 'كخ',
'ﳇ' => 'كل',
'ﳈ' => 'كم',
'ﳉ' => 'لج',
'ﳊ' => 'لح',
'ﳋ' => 'لخ',
'ﳌ' => 'لم',
'ﳍ' => 'له',
'ﳎ' => 'مج',
'ﳏ' => 'مح',
'ﳐ' => 'مخ',
'ﳑ' => 'مم',
'ﳒ' => 'نج',
'ﳓ' => 'نح',
'ﳔ' => 'نخ',
'ﳕ' => 'نم',
'ﳖ' => 'نه',
'ﳗ' => 'هج',
'ﳘ' => 'هم',
'ﳙ' => 'هٰ',
'ﳚ' => 'يج',
'ﳛ' => 'يح',
'ﳜ' => 'يخ',
'ﳝ' => 'يم',
'ﳞ' => 'يه',
'ﳟ' => 'ئم',
'ﳠ' => 'ئه',
'ﳡ' => 'بم',
'ﳢ' => 'به',
'ﳣ' => 'تم',
'ﳤ' => 'ته',
'ﳥ' => 'ثم',
'ﳦ' => 'ثه',
'ﳧ' => 'سم',
'ﳨ' => 'سه',
'ﳩ' => 'شم',
'ﳪ' => 'شه',
'ﳫ' => 'كل',
'ﳬ' => 'كم',
'ﳭ' => 'لم',
'ﳮ' => 'نم',
'ﳯ' => 'نه',
'ﳰ' => 'يم',
'ﳱ' => 'يه',
'ﳲ' => 'ـَّ',
'ﳳ' => 'ـُّ',
'ﳴ' => 'ـِّ',
'ﳵ' => 'طى',
'ﳶ' => 'طي',
'ﳷ' => 'عى',
'ﳸ' => 'عي',
'ﳹ' => 'غى',
'ﳺ' => 'غي',
'ﳻ' => 'سى',
'ﳼ' => 'سي',
'ﳽ' => 'شى',
'ﳾ' => 'شي',
'ﳿ' => 'حى',
'ﴀ' => 'حي',
'ﴁ' => 'جى',
'ﴂ' => 'جي',
'ﴃ' => 'خى',
'ﴄ' => 'خي',
'ﴅ' => 'صى',
'ﴆ' => 'صي',
'ﴇ' => 'ضى',
'ﴈ' => 'ضي',
'ﴉ' => 'شج',
'ﴊ' => 'شح',
'ﴋ' => 'شخ',
'ﴌ' => 'شم',
'ﴍ' => 'شر',
'ﴎ' => 'سر',
'ﴏ' => 'صر',
'ﴐ' => 'ضر',
'ﴑ' => 'طى',
'ﴒ' => 'طي',
'ﴓ' => 'عى',
'ﴔ' => 'عي',
'ﴕ' => 'غى',
'ﴖ' => 'غي',
'ﴗ' => 'سى',
'ﴘ' => 'سي',
'ﴙ' => 'شى',
'ﴚ' => 'شي',
'ﴛ' => 'حى',
'ﴜ' => 'حي',
'ﴝ' => 'جى',
'ﴞ' => 'جي',
'ﴟ' => 'خى',
'ﴠ' => 'خي',
'ﴡ' => 'صى',
'ﴢ' => 'صي',
'ﴣ' => 'ضى',
'ﴤ' => 'ضي',
'ﴥ' => 'شج',
'ﴦ' => 'شح',
'ﴧ' => 'شخ',
'ﴨ' => 'شم',
'ﴩ' => 'شر',
'ﴪ' => 'سر',
'ﴫ' => 'صر',
'ﴬ' => 'ضر',
'ﴭ' => 'شج',
'ﴮ' => 'شح',
'ﴯ' => 'شخ',
'ﴰ' => 'شم',
'ﴱ' => 'سه',
'ﴲ' => 'شه',
'ﴳ' => 'طم',
'ﴴ' => 'سج',
'ﴵ' => 'سح',
'ﴶ' => 'سخ',
'ﴷ' => 'شج',
'ﴸ' => 'شح',
'ﴹ' => 'شخ',
'ﴺ' => 'طم',
'ﴻ' => 'ظم',
'ﴼ' => 'اً',
'ﴽ' => 'اً',
'ﵐ' => 'تجم',
'ﵑ' => 'تحج',
'ﵒ' => 'تحج',
'ﵓ' => 'تحم',
'ﵔ' => 'تخم',
'ﵕ' => 'تمج',
'ﵖ' => 'تمح',
'ﵗ' => 'تمخ',
'ﵘ' => 'جمح',
'ﵙ' => 'جمح',
'ﵚ' => 'حمي',
'ﵛ' => 'حمى',
'ﵜ' => 'سحج',
'ﵝ' => 'سجح',
'ﵞ' => 'سجى',
'ﵟ' => 'سمح',
'ﵠ' => 'سمح',
'ﵡ' => 'سمج',
'ﵢ' => 'سمم',
'ﵣ' => 'سمم',
'ﵤ' => 'صحح',
'ﵥ' => 'صحح',
'ﵦ' => 'صمم',
'ﵧ' => 'شحم',
'ﵨ' => 'شحم',
'ﵩ' => 'شجي',
'ﵪ' => 'شمخ',
'ﵫ' => 'شمخ',
'ﵬ' => 'شمم',
'ﵭ' => 'شمم',
'ﵮ' => 'ضحى',
'ﵯ' => 'ضخم',
'ﵰ' => 'ضخم',
'ﵱ' => 'طمح',
'ﵲ' => 'طمح',
'ﵳ' => 'طمم',
'ﵴ' => 'طمي',
'ﵵ' => 'عجم',
'ﵶ' => 'عمم',
'ﵷ' => 'عمم',
'ﵸ' => 'عمى',
'ﵹ' => 'غمم',
'ﵺ' => 'غمي',
'ﵻ' => 'غمى',
'ﵼ' => 'فخم',
'ﵽ' => 'فخم',
'ﵾ' => 'قمح',
'ﵿ' => 'قمم',
'ﶀ' => 'لحم',
'ﶁ' => 'لحي',
'ﶂ' => 'لحى',
'ﶃ' => 'لجج',
'ﶄ' => 'لجج',
'ﶅ' => 'لخم',
'ﶆ' => 'لخم',
'ﶇ' => 'لمح',
'ﶈ' => 'لمح',
'ﶉ' => 'محج',
'ﶊ' => 'محم',
'ﶋ' => 'محي',
'ﶌ' => 'مجح',
'ﶍ' => 'مجم',
'ﶎ' => 'مخج',
'ﶏ' => 'مخم',
'ﶒ' => 'مجخ',
'ﶓ' => 'همج',
'ﶔ' => 'همم',
'ﶕ' => 'نحم',
'ﶖ' => 'نحى',
'ﶗ' => 'نجم',
'ﶘ' => 'نجم',
'ﶙ' => 'نجى',
'ﶚ' => 'نمي',
'ﶛ' => 'نمى',
'ﶜ' => 'يمم',
'ﶝ' => 'يمم',
'ﶞ' => 'بخي',
'ﶟ' => 'تجي',
'ﶠ' => 'تجى',
'ﶡ' => 'تخي',
'ﶢ' => 'تخى',
'ﶣ' => 'تمي',
'ﶤ' => 'تمى',
'ﶥ' => 'جمي',
'ﶦ' => 'جحى',
'ﶧ' => 'جمى',
'ﶨ' => 'سخى',
'ﶩ' => 'صحي',
'ﶪ' => 'شحي',
'ﶫ' => 'ضحي',
'ﶬ' => 'لجي',
'ﶭ' => 'لمي',
'ﶮ' => 'يحي',
'ﶯ' => 'يجي',
'ﶰ' => 'يمي',
'ﶱ' => 'ممي',
'ﶲ' => 'قمي',
'ﶳ' => 'نحي',
'ﶴ' => 'قمح',
'ﶵ' => 'لحم',
'ﶶ' => 'عمي',
'ﶷ' => 'كمي',
'ﶸ' => 'نجح',
'ﶹ' => 'مخي',
'ﶺ' => 'لجم',
'ﶻ' => 'كمم',
'ﶼ' => 'لجم',
'ﶽ' => 'نجح',
'ﶾ' => 'جحي',
'ﶿ' => 'حجي',
'ﷀ' => 'مجي',
'ﷁ' => 'فمي',
'ﷂ' => 'بحي',
'ﷃ' => 'كمم',
'ﷄ' => 'عجم',
'ﷅ' => 'صمم',
'ﷆ' => 'سخي',
'ﷇ' => 'نجي',
'ﷰ' => 'صلے',
'ﷱ' => 'قلے',
'ﷲ' => 'الله',
'ﷳ' => 'اكبر',
'ﷴ' => 'محمد',
'ﷵ' => 'صلعم',
'ﷶ' => 'رسول',
'ﷷ' => 'عليه',
'ﷸ' => 'وسلم',
'ﷹ' => 'صلى',
'ﷺ' => 'صلى الله عليه وسلم',
'ﷻ' => 'جل جلاله',
'﷼' => 'ریال',
'︐' => ',',
'︑' => '、',
'︒' => '。',
'︓' => ':',
'︔' => ';',
'︕' => '!',
'︖' => '?',
'︗' => '〖',
'︘' => '〗',
'︙' => '...',
'︰' => '..',
'︱' => '—',
'︲' => '–',
'︳' => '_',
'︴' => '_',
'︵' => '(',
'︶' => ')',
'︷' => '{',
'︸' => '}',
'︹' => '〔',
'︺' => '〕',
'︻' => '【',
'︼' => '】',
'︽' => '《',
'︾' => '》',
'︿' => '〈',
'﹀' => '〉',
'﹁' => '「',
'﹂' => '」',
'﹃' => '『',
'﹄' => '』',
'﹇' => '[',
'﹈' => ']',
'﹉' => ' ̅',
'﹊' => ' ̅',
'﹋' => ' ̅',
'﹌' => ' ̅',
'﹍' => '_',
'﹎' => '_',
'﹏' => '_',
'﹐' => ',',
'﹑' => '、',
'﹒' => '.',
'﹔' => ';',
'﹕' => ':',
'﹖' => '?',
'﹗' => '!',
'﹘' => '—',
'﹙' => '(',
'﹚' => ')',
'﹛' => '{',
'﹜' => '}',
'﹝' => '〔',
'﹞' => '〕',
'﹟' => '#',
'﹠' => '&',
'﹡' => '*',
'﹢' => '+',
'﹣' => '-',
'﹤' => '<',
'﹥' => '>',
'﹦' => '=',
'﹨' => '\\',
'﹩' => '$',
'﹪' => '%',
'﹫' => '@',
'ﹰ' => ' ً',
'ﹱ' => 'ـً',
'ﹲ' => ' ٌ',
'ﹴ' => ' ٍ',
'ﹶ' => ' َ',
'ﹷ' => 'ـَ',
'ﹸ' => ' ُ',
'ﹹ' => 'ـُ',
'ﹺ' => ' ِ',
'ﹻ' => 'ـِ',
'ﹼ' => ' ّ',
'ﹽ' => 'ـّ',
'ﹾ' => ' ْ',
'ﹿ' => 'ـْ',
'ﺀ' => 'ء',
'ﺁ' => 'آ',
'ﺂ' => 'آ',
'ﺃ' => 'أ',
'ﺄ' => 'أ',
'ﺅ' => 'ؤ',
'ﺆ' => 'ؤ',
'ﺇ' => 'إ',
'ﺈ' => 'إ',
'ﺉ' => 'ئ',
'ﺊ' => 'ئ',
'ﺋ' => 'ئ',
'ﺌ' => 'ئ',
'ﺍ' => 'ا',
'ﺎ' => 'ا',
'ﺏ' => 'ب',
'ﺐ' => 'ب',
'ﺑ' => 'ب',
'ﺒ' => 'ب',
'ﺓ' => 'ة',
'ﺔ' => 'ة',
'ﺕ' => 'ت',
'ﺖ' => 'ت',
'ﺗ' => 'ت',
'ﺘ' => 'ت',
'ﺙ' => 'ث',
'ﺚ' => 'ث',
'ﺛ' => 'ث',
'ﺜ' => 'ث',
'ﺝ' => 'ج',
'ﺞ' => 'ج',
'ﺟ' => 'ج',
'ﺠ' => 'ج',
'ﺡ' => 'ح',
'ﺢ' => 'ح',
'ﺣ' => 'ح',
'ﺤ' => 'ح',
'ﺥ' => 'خ',
'ﺦ' => 'خ',
'ﺧ' => 'خ',
'ﺨ' => 'خ',
'ﺩ' => 'د',
'ﺪ' => 'د',
'ﺫ' => 'ذ',
'ﺬ' => 'ذ',
'ﺭ' => 'ر',
'ﺮ' => 'ر',
'ﺯ' => 'ز',
'ﺰ' => 'ز',
'ﺱ' => 'س',
'ﺲ' => 'س',
'ﺳ' => 'س',
'ﺴ' => 'س',
'ﺵ' => 'ش',
'ﺶ' => 'ش',
'ﺷ' => 'ش',
'ﺸ' => 'ش',
'ﺹ' => 'ص',
'ﺺ' => 'ص',
'ﺻ' => 'ص',
'ﺼ' => 'ص',
'ﺽ' => 'ض',
'ﺾ' => 'ض',
'ﺿ' => 'ض',
'ﻀ' => 'ض',
'ﻁ' => 'ط',
'ﻂ' => 'ط',
'ﻃ' => 'ط',
'ﻄ' => 'ط',
'ﻅ' => 'ظ',
'ﻆ' => 'ظ',
'ﻇ' => 'ظ',
'ﻈ' => 'ظ',
'ﻉ' => 'ع',
'ﻊ' => 'ع',
'ﻋ' => 'ع',
'ﻌ' => 'ع',
'ﻍ' => 'غ',
'ﻎ' => 'غ',
'ﻏ' => 'غ',
'ﻐ' => 'غ',
'ﻑ' => 'ف',
'ﻒ' => 'ف',
'ﻓ' => 'ف',
'ﻔ' => 'ف',
'ﻕ' => 'ق',
'ﻖ' => 'ق',
'ﻗ' => 'ق',
'ﻘ' => 'ق',
'ﻙ' => 'ك',
'ﻚ' => 'ك',
'ﻛ' => 'ك',
'ﻜ' => 'ك',
'ﻝ' => 'ل',
'ﻞ' => 'ل',
'ﻟ' => 'ل',
'ﻠ' => 'ل',
'ﻡ' => 'م',
'ﻢ' => 'م',
'ﻣ' => 'م',
'ﻤ' => 'م',
'ﻥ' => 'ن',
'ﻦ' => 'ن',
'ﻧ' => 'ن',
'ﻨ' => 'ن',
'ﻩ' => 'ه',
'ﻪ' => 'ه',
'ﻫ' => 'ه',
'ﻬ' => 'ه',
'ﻭ' => 'و',
'ﻮ' => 'و',
'ﻯ' => 'ى',
'ﻰ' => 'ى',
'ﻱ' => 'ي',
'ﻲ' => 'ي',
'ﻳ' => 'ي',
'ﻴ' => 'ي',
'ﻵ' => 'لآ',
'ﻶ' => 'لآ',
'ﻷ' => 'لأ',
'ﻸ' => 'لأ',
'ﻹ' => 'لإ',
'ﻺ' => 'لإ',
'ﻻ' => 'لا',
'ﻼ' => 'لا',
'！' => '!',
'＂' => '"',
'＃' => '#',
'＄' => '$',
'％' => '%',
'＆' => '&',
'＇' => '\'',
'（' => '(',
'）' => ')',
'＊' => '*',
'＋' => '+',
'，' => ',',
'－' => '-',
'．' => '.',
'／' => '/',
'０' => '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',
'［' => '[',
'＼' => '\\',
'］' => ']',
'＾' => '^',
'＿' => '_',
'｀' => '`',
'ａ' => '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',
'𝑖' => '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',
);
<?php

return array (
'̀' => 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,
);
<?php










use Symfony\Polyfill\Intl\Normalizer as p;

if (\PHP_VERSION_ID >= 80000) {
return require __DIR__.'/bootstrap80.php';
}

if (!function_exists('normalizer_is_normalized')) {
function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); }
}
if (!function_exists('normalizer_normalize')) {
function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); }
}
<?php










namespace Symfony\Component\Config\Resource;

use Symfony\Component\Config\ResourceCheckerInterface;









class SelfCheckingResourceChecker implements ResourceCheckerInterface
{




private static array $cache = [];

public function supports(ResourceInterface $metadata): bool
{
return $metadata instanceof SelfCheckingResourceInterface;
}




public function isFresh(ResourceInterface $resource, int $timestamp): bool
{
$key = "$resource:$timestamp";

return self::$cache[$key] ??= $resource->isFresh($timestamp);
}
}
<?php










namespace Symfony\Component\Config\Resource;










class FileResource implements SelfCheckingResourceInterface
{
private string $resource;






public function __construct(string $resource)
{
$resolvedResource = realpath($resource) ?: (file_exists($resource) ? $resource : false);

if (false === $resolvedResource) {
throw new \InvalidArgumentException(\sprintf('The file "%s" does not exist.', $resource));
}

$this->resource = $resolvedResource;
}

public function __toString(): string
{
return $this->resource;
}




public function getResource(): string
{
return $this->resource;
}

public function isFresh(int $timestamp): bool
{
return false !== ($filemtime = @filemtime($this->resource)) && $filemtime <= $timestamp;
}
}
<?php










namespace Symfony\Component\Config\Resource;








class DirectoryResource implements SelfCheckingResourceInterface
{
private string $resource;
private ?string $pattern;







public function __construct(string $resource, ?string $pattern = null)
{
$resolvedResource = realpath($resource) ?: (file_exists($resource) ? $resource : false);
$this->pattern = $pattern;

if (false === $resolvedResource || !is_dir($resolvedResource)) {
throw new \InvalidArgumentException(\sprintf('The directory "%s" does not exist.', $resource));
}

$this->resource = $resolvedResource;
}

public function __toString(): string
{
return hash('xxh128', serialize([$this->resource, $this->pattern]));
}

public function getResource(): string
{
return $this->resource;
}

public function getPattern(): ?string
{
return $this->pattern;
}

public function isFresh(int $timestamp): bool
{
if (!is_dir($this->resource)) {
return false;
}

if ($timestamp < filemtime($this->resource)) {
return false;
}

foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) {

if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) {
continue;
}



if ($file->isDir() && str_ends_with($file, '/..')) {
continue;
}


try {
$fileMTime = $file->getMTime();
} catch (\RuntimeException) {
continue;
}


if ($timestamp < $fileMTime) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\Config\Resource;











class FileExistenceResource implements SelfCheckingResourceInterface
{
private string $resource;

private bool $exists;




public function __construct(string $resource)
{
$this->resource = $resource;
$this->exists = file_exists($resource);
}

public function __toString(): string
{
return 'existence.'.$this->resource;
}

public function getResource(): string
{
return $this->resource;
}

public function isFresh(int $timestamp): bool
{
return file_exists($this->resource) === $this->exists;
}
}
<?php










namespace Symfony\Component\Config\Resource;






interface ResourceInterface extends \Stringable
{









public function __toString(): string;
}
<?php










namespace Symfony\Component\Config\Resource;











class ClassExistenceResource implements SelfCheckingResourceInterface
{
private string $resource;
private ?array $exists = null;

private static int $autoloadLevel = 0;
private static ?string $autoloadedClass = null;
private static array $existsCache = [];





public function __construct(string $resource, ?bool $exists = null)
{
$this->resource = $resource;
if (null !== $exists) {
$this->exists = [$exists, null];
}
}

public function __toString(): string
{
return $this->resource;
}

public function getResource(): string
{
return $this->resource;
}




public function isFresh(int $timestamp): bool
{
$loaded = class_exists($this->resource, false) || interface_exists($this->resource, false) || trait_exists($this->resource, false);

if (null !== $exists = &self::$existsCache[$this->resource]) {
if ($loaded) {
$exists = [true, null];
} elseif (0 >= $timestamp && !$exists[0] && null !== $exists[1]) {
throw new \ReflectionException($exists[1]);
}
} elseif ([false, null] === $exists = [$loaded, null]) {
if (!self::$autoloadLevel++) {
spl_autoload_register(__CLASS__.'::throwOnRequiredClass');
}
$autoloadedClass = self::$autoloadedClass;
self::$autoloadedClass = ltrim($this->resource, '\\');

try {
$exists[0] = class_exists($this->resource) || interface_exists($this->resource, false) || trait_exists($this->resource, false);
} catch (\Exception $e) {
$exists[1] = $e->getMessage();

try {
self::throwOnRequiredClass($this->resource, $e);
} catch (\ReflectionException $e) {
if (0 >= $timestamp) {
throw $e;
}
}
} catch (\Throwable $e) {
$exists[1] = $e->getMessage();

throw $e;
} finally {
self::$autoloadedClass = $autoloadedClass;
if (!--self::$autoloadLevel) {
spl_autoload_unregister(__CLASS__.'::throwOnRequiredClass');
}
}
}

$this->exists ??= $exists;

return $this->exists[0] xor !$exists[0];
}

public function __serialize(): array
{
if (null === $this->exists) {
$this->isFresh(0);
}

return [
'resource' => $this->resource,
'exists' => $this->exists,
];
}

public function __unserialize(array $data): void
{
$this->resource = array_shift($data);
$this->exists = array_shift($data);

if (\is_bool($this->exists)) {
$this->exists = [$this->exists, null];
}
}

















public static function throwOnRequiredClass(string $class, ?\Exception $previous = null): void
{

if (null === $previous && self::$autoloadedClass === $class) {
return;
}

if (class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false)) {
if (null !== $previous) {
throw $previous;
}

return;
}

if ($previous instanceof \ReflectionException) {
throw $previous;
}

$message = \sprintf('Class "%s" not found.', $class);

if ($class !== (self::$autoloadedClass ?? $class)) {
$message = substr_replace($message, \sprintf(' while loading "%s"', self::$autoloadedClass), -1, 0);
}

if (null !== $previous) {
$message = $previous->getMessage();
}

$e = new \ReflectionException($message, 0, $previous);

if (null !== $previous) {
throw $e;
}

$trace = debug_backtrace();
$autoloadFrame = [
'function' => 'spl_autoload_call',
'args' => [$class],
];

if (isset($trace[1])) {
$callerFrame = $trace[1];
$i = 2;
} elseif (false !== $i = array_search($autoloadFrame, $trace, true)) {
$callerFrame = $trace[++$i];
} else {
throw $e;
}

if (isset($callerFrame['function']) && !isset($callerFrame['class'])) {
switch ($callerFrame['function']) {
case 'get_class_methods':
case 'get_class_vars':
case 'get_parent_class':
case 'is_a':
case 'is_subclass_of':
case 'class_exists':
case 'class_implements':
case 'class_parents':
case 'trait_exists':
case 'defined':
case 'interface_exists':
case 'method_exists':
case 'property_exists':
case 'is_callable':
return;
}

$props = [
'file' => $callerFrame['file'] ?? null,
'line' => $callerFrame['line'] ?? null,
'trace' => \array_slice($trace, 1 + $i),
];

foreach ($props as $p => $v) {
if (null !== $v) {
$r = new \ReflectionProperty(\Exception::class, $p);
$r->setValue($e, $v);
}
}
}

throw $e;
}
}
<?php










namespace Symfony\Component\Config\Resource;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;






class ReflectionClassResource implements SelfCheckingResourceInterface
{
private array $files = [];
private string $className;
private \ReflectionClass $classReflector;
private array $excludedVendors = [];
private string $hash;

public function __construct(\ReflectionClass $classReflector, array $excludedVendors = [])
{
$this->className = $classReflector->name;
$this->classReflector = $classReflector;
$this->excludedVendors = $excludedVendors;
}

public function isFresh(int $timestamp): bool
{
if (!isset($this->hash)) {
$this->hash = $this->computeHash();
$this->loadFiles($this->classReflector);
}

foreach ($this->files as $file => $v) {
if (false === $filemtime = @filemtime($file)) {
return false;
}

if ($filemtime > $timestamp) {
return $this->hash === $this->computeHash();
}
}

return true;
}

public function __toString(): string
{
return 'reflection.'.$this->className;
}

public function __serialize(): array
{
if (!isset($this->hash)) {
$this->hash = $this->computeHash();
$this->loadFiles($this->classReflector);
}

return [
'files' => $this->files,
'className' => $this->className,
'excludedVendors' => $this->excludedVendors,
'hash' => $this->hash,
];
}

private function loadFiles(\ReflectionClass $class): void
{
foreach ($class->getInterfaces() as $v) {
$this->loadFiles($v);
}
do {
$file = $class->getFileName();
if (false !== $file && is_file($file)) {
foreach ($this->excludedVendors as $vendor) {
if (str_starts_with($file, $vendor) && false !== strpbrk(substr($file, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) {
$file = false;
break;
}
}
if ($file) {
$this->files[$file] = null;
}
}
foreach ($class->getTraits() as $v) {
$this->loadFiles($v);
}
} while ($class = $class->getParentClass());
}

private function computeHash(): string
{
try {
$this->classReflector ??= new \ReflectionClass($this->className);
} catch (\ReflectionException) {

return false;
}
$hash = hash_init('xxh128');

foreach ($this->generateSignature($this->classReflector) as $info) {
hash_update($hash, $info);
}

return hash_final($hash);
}

private function generateSignature(\ReflectionClass $class): iterable
{
$attributes = [];
foreach ($class->getAttributes() as $a) {
$attributes[] = [$a->getName(), (string) $a];
}
yield print_r($attributes, true);
$attributes = [];

yield $class->getDocComment() ?: '';
yield (int) $class->isFinal();
yield (int) $class->isAbstract();

if ($class->isTrait()) {
yield print_r(class_uses($class->name), true);
} else {
yield print_r(class_parents($class->name), true);
yield print_r(class_implements($class->name), true);
yield print_r($class->getConstants(), true);
}

foreach ($class->getReflectionConstants() as $constant) {
foreach ($constant->getAttributes() as $a) {
$attributes[] = [$a->getName(), (string) $a];
}
yield $constant->name.print_r($attributes, true);
$attributes = [];
}

if (!$class->isInterface()) {
$defaults = $class->getDefaultProperties();

foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED) as $p) {
foreach ($p->getAttributes() as $a) {
$attributes[] = [$a->getName(), (string) $a];
}
yield print_r($attributes, true);
$attributes = [];

yield $p->getDocComment() ?: '';
yield $p->isDefault() ? '<default>' : '';
yield $p->isPublic() ? 'public' : 'protected';
yield $p->isStatic() ? 'static' : '';
yield '$'.$p->name;
yield print_r(isset($defaults[$p->name]) && !\is_object($defaults[$p->name]) ? $defaults[$p->name] : null, true);
}
}

foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) as $m) {
foreach ($m->getAttributes() as $a) {
$attributes[] = [$a->getName(), (string) $a];
}
yield print_r($attributes, true);
$attributes = [];

$defaults = [];
foreach ($m->getParameters() as $p) {
foreach ($p->getAttributes() as $a) {
$attributes[] = [$a->getName(), (string) $a];
}
yield print_r($attributes, true);
$attributes = [];

if (!$p->isDefaultValueAvailable()) {
$defaults[$p->name] = null;

continue;
}

$defaults[$p->name] = (string) $p;
}

yield preg_replace('/^  @@.*/m', '', $m);
yield print_r($defaults, true);
}

if ($class->isAbstract() || $class->isInterface() || $class->isTrait()) {
return;
}

if (interface_exists(EventSubscriberInterface::class, false) && $class->isSubclassOf(EventSubscriberInterface::class)) {
yield EventSubscriberInterface::class;
yield print_r($class->name::getSubscribedEvents(), true);
}

if (interface_exists(MessageSubscriberInterface::class, false) && $class->isSubclassOf(MessageSubscriberInterface::class)) {
yield MessageSubscriberInterface::class;
foreach ($class->name::getHandledMessages() as $key => $value) {
yield $key.print_r($value, true);
}
}

if (interface_exists(ServiceSubscriberInterface::class, false) && $class->isSubclassOf(ServiceSubscriberInterface::class)) {
yield ServiceSubscriberInterface::class;
yield print_r($class->name::getSubscribedServices(), true);
}
}
}
<?php










namespace Symfony\Component\Config\Resource;







interface SelfCheckingResourceInterface extends ResourceInterface
{





public function isFresh(int $timestamp): bool;
}
<?php










namespace Symfony\Component\Config\Resource;

use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\Glob;

/**
@implements








*/
class GlobResource implements \IteratorAggregate, SelfCheckingResourceInterface
{
private string $prefix;
private string $pattern;
private bool $recursive;
private string $hash;
private bool $forExclusion;
private array $excludedPrefixes;
private int $globBrace;








public function __construct(string $prefix, string $pattern, bool $recursive, bool $forExclusion = false, array $excludedPrefixes = [])
{
ksort($excludedPrefixes);
$resolvedPrefix = realpath($prefix) ?: (file_exists($prefix) ? $prefix : false);
$this->pattern = $pattern;
$this->recursive = $recursive;
$this->forExclusion = $forExclusion;
$this->excludedPrefixes = $excludedPrefixes;
$this->globBrace = \defined('GLOB_BRACE') ? \GLOB_BRACE : 0;

if (false === $resolvedPrefix) {
throw new \InvalidArgumentException(\sprintf('The path "%s" does not exist.', $prefix));
}

$this->prefix = $resolvedPrefix;
}

public function getPrefix(): string
{
return $this->prefix;
}

public function __toString(): string
{
return 'glob.'.$this->prefix.(int) $this->recursive.$this->pattern.(int) $this->forExclusion.implode("\0", $this->excludedPrefixes);
}

public function isFresh(int $timestamp): bool
{
$hash = $this->computeHash();
$this->hash ??= $hash;

return $this->hash === $hash;
}

public function __serialize(): array
{
$this->hash ??= $this->computeHash();

return [
'prefix' => $this->prefix,
'pattern' => $this->pattern,
'recursive' => $this->recursive,
'hash' => $this->hash,
'forExclusion' => $this->forExclusion,
'excludedPrefixes' => $this->excludedPrefixes,
];
}

public function __unserialize(array $data): void
{
$this->prefix = array_shift($data);
$this->pattern = array_shift($data);
$this->recursive = array_shift($data);
$this->hash = array_shift($data);
$this->forExclusion = array_shift($data);
$this->excludedPrefixes = array_shift($data);
$this->globBrace = \defined('GLOB_BRACE') ? \GLOB_BRACE : 0;
}

public function getIterator(): \Traversable
{
if ((!$this->recursive && '' === $this->pattern) || !file_exists($this->prefix)) {
return;
}

if (is_file($prefix = str_replace('\\', '/', $this->prefix))) {
$prefix = \dirname($prefix);
$pattern = basename($prefix).$this->pattern;
} else {
$pattern = $this->pattern;
}

if (class_exists(Finder::class)) {
$regex = Glob::toRegex($pattern);
if ($this->recursive) {
$regex = substr_replace($regex, str_ends_with($pattern, '/') ? '' : '(/|$)', -2, 1);
}
} else {
$regex = null;
}

$prefixLen = \strlen($prefix);
$paths = null;

if ('' === $this->pattern && is_file($this->prefix)) {
$paths = [$this->prefix => null];
} elseif (!str_starts_with($this->prefix, 'phar://') && (null !== $regex || !str_contains($this->pattern, '/**/'))) {
if (!str_contains($this->pattern, '/**/') && ($this->globBrace || !str_contains($this->pattern, '{'))) {
$paths = array_fill_keys(glob($this->prefix.$this->pattern, \GLOB_NOSORT | $this->globBrace), null);
} elseif (!str_contains($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) {
$paths = [];
foreach ($this->expandGlob($this->pattern) as $p) {
if (false !== $i = strpos($p, '/**/')) {
$p = substr_replace($p, '/*', $i);
}
$paths += array_fill_keys(glob($this->prefix.$p, \GLOB_NOSORT), false !== $i ? $regex : null);
}
}
}

if (null !== $paths) {
uksort($paths, 'strnatcmp');
foreach ($paths as $path => $regex) {
if ($this->excludedPrefixes) {
$normalizedPath = str_replace('\\', '/', $path);
do {
if (isset($this->excludedPrefixes[$dirPath = $normalizedPath])) {
continue 2;
}
} while ($prefix !== $dirPath && $dirPath !== $normalizedPath = \dirname($dirPath));
}

if ((null === $regex || preg_match($regex, substr(str_replace('\\', '/', $path), $prefixLen))) && is_file($path)) {
yield $path => new \SplFileInfo($path);
}
if (!is_dir($path)) {
continue;
}
if ($this->forExclusion && (null === $regex || preg_match($regex, substr(str_replace('\\', '/', $path), $prefixLen)))) {
yield $path => new \SplFileInfo($path);
continue;
}
if (!($this->recursive || null !== $regex) || isset($this->excludedPrefixes[str_replace('\\', '/', $path)])) {
continue;
}
$files = iterator_to_array(new \RecursiveIteratorIterator(
new \RecursiveCallbackFilterIterator(
new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
fn (\SplFileInfo $file, $path) => !isset($this->excludedPrefixes[$path = str_replace('\\', '/', $path)])
&& (null === $regex || preg_match($regex, substr($path, $prefixLen)) || $file->isDir())
&& '.' !== $file->getBasename()[0]
),
\RecursiveIteratorIterator::LEAVES_ONLY
));
uksort($files, 'strnatcmp');

foreach ($files as $path => $info) {
if ($info->isFile()) {
yield $path => $info;
}
}
}

return;
}

if (!class_exists(Finder::class)) {
throw new \LogicException('Extended glob patterns cannot be used as the Finder component is not installed. Try running "composer require symfony/finder".');
}

yield from (new Finder())
->followLinks()
->filter(function (\SplFileInfo $info) use ($regex, $prefixLen, $prefix) {
$normalizedPath = str_replace('\\', '/', $info->getPathname());
if (!preg_match($regex, substr($normalizedPath, $prefixLen)) || !$info->isFile()) {
return false;
}
if ($this->excludedPrefixes) {
do {
if (isset($this->excludedPrefixes[$dirPath = $normalizedPath])) {
return false;
}
} while ($prefix !== $dirPath && $dirPath !== $normalizedPath = \dirname($dirPath));
}
})
->sortByName()
->in($prefix)
;
}

private function computeHash(): string
{
$hash = hash_init('xxh128');

foreach ($this->getIterator() as $path => $info) {
hash_update($hash, $path."\n");
}

return hash_final($hash);
}

private function expandGlob(string $pattern): array
{
$segments = preg_split('/\{([^{}]*+)\}/', $pattern, -1, \PREG_SPLIT_DELIM_CAPTURE);
$paths = [$segments[0]];
$patterns = [];

for ($i = 1; $i < \count($segments); $i += 2) {
$patterns = [];

foreach (explode(',', $segments[$i]) as $s) {
foreach ($paths as $p) {
$patterns[] = $p.$s.$segments[1 + $i];
}
}

$paths = $patterns;
}

$j = 0;
foreach ($patterns as $i => $p) {
if (str_contains($p, '{')) {
$p = $this->expandGlob($p);
array_splice($paths, $i + $j, 1, $p);
$j += \count($p) - 1;
}
}

return $paths;
}
}
<?php










namespace Symfony\Component\Config\Resource;








class ComposerResource implements SelfCheckingResourceInterface
{
private array $vendors;

private static array $runtimeVendors;

public function __construct()
{
self::refresh();
$this->vendors = self::$runtimeVendors;
}

public function getVendors(): array
{
return array_keys($this->vendors);
}

public function __toString(): string
{
return __CLASS__;
}

public function isFresh(int $timestamp): bool
{
self::refresh();

return array_values(self::$runtimeVendors) === array_values($this->vendors);
}

private static function refresh(): void
{
self::$runtimeVendors = [];

foreach (get_declared_classes() as $class) {
if ('C' === $class[0] && str_starts_with($class, 'ComposerAutoloaderInit')) {
$r = new \ReflectionClass($class);
$v = \dirname($r->getFileName(), 2);
if (is_file($v.'/composer/installed.json')) {
self::$runtimeVendors[$v] = @filemtime($v.'/composer/installed.json');
}
}
}
}
}
<?php










namespace Symfony\Component\Config\Builder;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\Config\Definition\BooleanNode;
use Symfony\Component\Config\Definition\Builder\ExprBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\FloatNode;
use Symfony\Component\Config\Definition\IntegerNode;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;
use Symfony\Component\Config\Definition\VariableNode;
use Symfony\Component\Config\Loader\ParamConfigurator;






class ConfigBuilderGenerator implements ConfigBuilderGeneratorInterface
{



private array $classes = [];
private string $outputDir;

public function __construct(string $outputDir)
{
$this->outputDir = $outputDir;
}




public function build(ConfigurationInterface $configuration): \Closure
{
$this->classes = [];

$rootNode = $configuration->getConfigTreeBuilder()->buildTree();
$rootClass = new ClassBuilder('Symfony\\Config', $rootNode->getName());

$path = $this->getFullPath($rootClass);
if (!is_file($path)) {

$this->classes[] = $rootClass;
$this->buildNode($rootNode, $rootClass, $this->getSubNamespace($rootClass));
$rootClass->addImplements(ConfigBuilderInterface::class);
$rootClass->addMethod('getExtensionAlias', '
public function NAME(): string
{
    return \'ALIAS\';
}', ['ALIAS' => $rootNode->getPath()]);

$this->writeClasses();
}

return function () use ($path, $rootClass) {
require_once $path;
$className = $rootClass->getFqcn();

return new $className();
};
}

private function getFullPath(ClassBuilder $class): string
{
$directory = $this->outputDir.\DIRECTORY_SEPARATOR.$class->getDirectory();
if (!is_dir($directory)) {
@mkdir($directory, 0777, true);
}

return $directory.\DIRECTORY_SEPARATOR.$class->getFilename();
}

private function writeClasses(): void
{
foreach ($this->classes as $class) {
$this->buildConstructor($class);
$this->buildToArray($class);
if ($class->getProperties()) {
$class->addProperty('_usedProperties', null, '[]');
}
$this->buildSetExtraKey($class);

file_put_contents($this->getFullPath($class), $class->build());
}

$this->classes = [];
}

private function buildNode(NodeInterface $node, ClassBuilder $class, string $namespace): void
{
if (!$node instanceof ArrayNode) {
throw new \LogicException('The node was expected to be an ArrayNode. This Configuration includes an edge case not supported yet.');
}

foreach ($node->getChildren() as $child) {
match (true) {
$child instanceof ScalarNode => $this->handleScalarNode($child, $class),
$child instanceof PrototypedArrayNode => $this->handlePrototypedArrayNode($child, $class, $namespace),
$child instanceof VariableNode => $this->handleVariableNode($child, $class),
$child instanceof ArrayNode => $this->handleArrayNode($child, $class, $namespace),
default => throw new \RuntimeException(\sprintf('Unknown node "%s".', $child::class)),
};
}
}

private function handleArrayNode(ArrayNode $node, ClassBuilder $class, string $namespace): void
{
$childClass = new ClassBuilder($namespace, $node->getName());
$childClass->setAllowExtraKeys($node->shouldIgnoreExtraKeys());
$class->addRequire($childClass);
$this->classes[] = $childClass;

$nodeTypes = $this->getParameterTypes($node);
$paramType = $this->getParamType($nodeTypes);

$hasNormalizationClosures = $this->hasNormalizationClosures($node);
$comment = $this->getComment($node);
if ($hasNormalizationClosures && 'array' !== $paramType) {
$comment = \sprintf(" * @template TValue of %s\n * @param TValue \$value\n%s", $paramType, $comment);
$comment .= \sprintf(' * @return %s|$this'."\n", $childClass->getFqcn());
$comment .= \sprintf(' * @psalm-return (TValue is array ? %s : static)'."\n ", $childClass->getFqcn());
}
if ('' !== $comment) {
$comment = "/**\n$comment*/\n";
}

$property = $class->addProperty(
$node->getName(),
$this->getType($childClass->getFqcn(), $hasNormalizationClosures)
);
$body = $hasNormalizationClosures && 'array' !== $paramType ? '
COMMENTpublic function NAME(PARAM_TYPE $value = []): CLASS|static
{
    if (!\is_array($value)) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY = $value;

        return $this;
    }

    if (!$this->PROPERTY instanceof CLASS) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY = new CLASS($value);
    } elseif (0 < \func_num_args()) {
        throw new InvalidConfigurationException(\'The node created by "NAME()" has already been initialized. You cannot pass values the second time you call NAME().\');
    }

    return $this->PROPERTY;
}' : '
COMMENTpublic function NAME(array $value = []): CLASS
{
    if (null === $this->PROPERTY) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY = new CLASS($value);
    } elseif (0 < \func_num_args()) {
        throw new InvalidConfigurationException(\'The node created by "NAME()" has already been initialized. You cannot pass values the second time you call NAME().\');
    }

    return $this->PROPERTY;
}';
$class->addUse(InvalidConfigurationException::class);
$class->addMethod($node->getName(), $body, [
'COMMENT' => $comment,
'PROPERTY' => $property->getName(),
'CLASS' => $childClass->getFqcn(),
'PARAM_TYPE' => $paramType,
]);

$this->buildNode($node, $childClass, $this->getSubNamespace($childClass));
}

private function handleVariableNode(VariableNode $node, ClassBuilder $class): void
{
$comment = $this->getComment($node);
$property = $class->addProperty($node->getName());
$class->addUse(ParamConfigurator::class);

$body = '
/**
COMMENT *
 * @return $this
 */
public function NAME(mixed $valueDEFAULT): static
{
    $this->_usedProperties[\'PROPERTY\'] = true;
    $this->PROPERTY = $value;

    return $this;
}';
$class->addMethod($node->getName(), $body, [
'PROPERTY' => $property->getName(),
'COMMENT' => $comment,
'DEFAULT' => $node->hasDefaultValue() ? ' = '.var_export($node->getDefaultValue(), true) : '',
]);
}

private function handlePrototypedArrayNode(PrototypedArrayNode $node, ClassBuilder $class, string $namespace): void
{
$name = $this->getSingularName($node);
$prototype = $node->getPrototype();
$methodName = $name;
$hasNormalizationClosures = $this->hasNormalizationClosures($node) || $this->hasNormalizationClosures($prototype);

$nodeParameterTypes = $this->getParameterTypes($node);
$prototypeParameterTypes = $this->getParameterTypes($prototype);
$noKey = null === $key = $node->getKeyAttribute();
if (!$prototype instanceof ArrayNode || ($prototype instanceof PrototypedArrayNode && $prototype->getPrototype() instanceof ScalarNode)) {
$class->addUse(ParamConfigurator::class);
$property = $class->addProperty($node->getName());
if ($noKey) {

$nodeTypesWithoutArray = array_filter($nodeParameterTypes, static fn ($type) => 'array' !== $type);
$body = '
/**
 * @param ParamConfigurator|list<ParamConfigurator|PROTOTYPE_TYPE>EXTRA_TYPE $value
 *
 * @return $this
 */
public function NAME(PARAM_TYPE $value): static
{
    $this->_usedProperties[\'PROPERTY\'] = true;
    $this->PROPERTY = $value;

    return $this;
}';

$class->addMethod($node->getName(), $body, [
'PROPERTY' => $property->getName(),
'PROTOTYPE_TYPE' => implode('|', $prototypeParameterTypes),
'EXTRA_TYPE' => $nodeTypesWithoutArray ? '|'.implode('|', $nodeTypesWithoutArray) : '',
'PARAM_TYPE' => $this->getParamType($nodeParameterTypes, true),
]);
} else {
$body = '
/**
 * @return $this
 */
public function NAME(string $VAR, TYPE $VALUE): static
{
    $this->_usedProperties[\'PROPERTY\'] = true;
    $this->PROPERTY[$VAR] = $VALUE;

    return $this;
}';

$class->addMethod($methodName, $body, [
'PROPERTY' => $property->getName(),
'TYPE' => $this->getParamType($prototypeParameterTypes, true),
'VAR' => '' === $key ? 'key' : $key,
'VALUE' => 'value' === $key ? 'data' : 'value',
]);
}

return;
}

$childClass = new ClassBuilder($namespace, $name);
if ($prototype instanceof ArrayNode) {
$childClass->setAllowExtraKeys($prototype->shouldIgnoreExtraKeys());
}
$class->addRequire($childClass);
$this->classes[] = $childClass;

$property = $class->addProperty(
$node->getName(),
$this->getType($childClass->getFqcn().'[]', $hasNormalizationClosures)
);

$paramType = $this->getParamType($noKey ? $nodeParameterTypes : $prototypeParameterTypes);

$comment = $this->getComment($node);
if ($hasNormalizationClosures && 'array' !== $paramType) {
$comment = \sprintf(" * @template TValue of %s\n * @param TValue \$value\n%s", $paramType, $comment);
$comment .= \sprintf(' * @return %s|$this'."\n", $childClass->getFqcn());
$comment .= \sprintf(' * @psalm-return (TValue is array ? %s : static)'."\n ", $childClass->getFqcn());
}
if ('' !== $comment) {
$comment = "/**\n$comment*/\n";
}

if ($noKey) {
$body = $hasNormalizationClosures && 'array' !== $paramType ? '
COMMENTpublic function NAME(PARAM_TYPE $value = []): CLASS|static
{
    $this->_usedProperties[\'PROPERTY\'] = true;
    if (!\is_array($value)) {
        $this->PROPERTY[] = $value;

        return $this;
    }

    return $this->PROPERTY[] = new CLASS($value);
}' : '
COMMENTpublic function NAME(array $value = []): CLASS
{
    $this->_usedProperties[\'PROPERTY\'] = true;

    return $this->PROPERTY[] = new CLASS($value);
}';
$class->addMethod($methodName, $body, [
'COMMENT' => $comment,
'PROPERTY' => $property->getName(),
'CLASS' => $childClass->getFqcn(),
'PARAM_TYPE' => $paramType,
]);
} else {
$body = $hasNormalizationClosures && 'array' !== $paramType ? '
COMMENTpublic function NAME(string $VAR, PARAM_TYPE $VALUE = []): CLASS|static
{
    if (!\is_array($VALUE)) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY[$VAR] = $VALUE;

        return $this;
    }

    if (!isset($this->PROPERTY[$VAR]) || !$this->PROPERTY[$VAR] instanceof CLASS) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY[$VAR] = new CLASS($VALUE);
    } elseif (1 < \func_num_args()) {
        throw new InvalidConfigurationException(\'The node created by "NAME()" has already been initialized. You cannot pass values the second time you call NAME().\');
    }

    return $this->PROPERTY[$VAR];
}' : '
COMMENTpublic function NAME(string $VAR, array $VALUE = []): CLASS
{
    if (!isset($this->PROPERTY[$VAR])) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY[$VAR] = new CLASS($VALUE);
    } elseif (1 < \func_num_args()) {
        throw new InvalidConfigurationException(\'The node created by "NAME()" has already been initialized. You cannot pass values the second time you call NAME().\');
    }

    return $this->PROPERTY[$VAR];
}';
$class->addUse(InvalidConfigurationException::class);
$class->addMethod($methodName, str_replace('$value', '$VAR', $body), [
'COMMENT' => $comment, 'PROPERTY' => $property->getName(),
'CLASS' => $childClass->getFqcn(),
'VAR' => '' === $key ? 'key' : $key,
'VALUE' => 'value' === $key ? 'data' : 'value',
'PARAM_TYPE' => $paramType,
]);
}

$this->buildNode($prototype, $childClass, $namespace.'\\'.$childClass->getName());
}

private function handleScalarNode(ScalarNode $node, ClassBuilder $class): void
{
$comment = $this->getComment($node);
$property = $class->addProperty($node->getName());
$class->addUse(ParamConfigurator::class);

$body = '
/**
COMMENT * @return $this
 */
public function NAME($value): static
{
    $this->_usedProperties[\'PROPERTY\'] = true;
    $this->PROPERTY = $value;

    return $this;
}';

$class->addMethod($node->getName(), $body, ['PROPERTY' => $property->getName(), 'COMMENT' => $comment]);
}

private function getParameterTypes(NodeInterface $node): array
{
$paramTypes = [];
if ($node instanceof BaseNode) {
$types = $node->getNormalizedTypes();
if (\in_array(ExprBuilder::TYPE_ANY, $types, true)) {
$paramTypes[] = 'mixed';
}
if (\in_array(ExprBuilder::TYPE_STRING, $types, true)) {
$paramTypes[] = 'string';
}
}
if ($node instanceof BooleanNode) {
$paramTypes[] = 'bool';
} elseif ($node instanceof IntegerNode) {
$paramTypes[] = 'int';
} elseif ($node instanceof FloatNode) {
$paramTypes[] = 'float';
} elseif ($node instanceof EnumNode) {
$paramTypes[] = 'mixed';
} elseif ($node instanceof ArrayNode) {
$paramTypes[] = 'array';
} elseif ($node instanceof VariableNode) {
$paramTypes[] = 'mixed';
}

return array_unique($paramTypes);
}

private function getComment(BaseNode $node): string
{
$comment = '';
if ('' !== $info = (string) $node->getInfo()) {
$comment .= $info."\n";
}

if (!$node instanceof ArrayNode) {
foreach ((array) ($node->getExample() ?? []) as $example) {
$comment .= '@example '.$example."\n";
}

if ('' !== $default = $node->getDefaultValue()) {
$comment .= '@default '.(null === $default ? 'null' : var_export($default, true))."\n";
}

if ($node instanceof EnumNode) {
$comment .= \sprintf('@param ParamConfigurator|%s $value', implode('|', array_unique(array_map(fn ($a) => !$a instanceof \UnitEnum ? var_export($a, true) : '\\'.ltrim(var_export($a, true), '\\'), $node->getValues()))))."\n";
} else {
$parameterTypes = $this->getParameterTypes($node);
$comment .= '@param ParamConfigurator|'.implode('|', $parameterTypes).' $value'."\n";
}
} else {
foreach ((array) ($node->getExample() ?? []) as $example) {
$comment .= '@example '.json_encode($example)."\n";
}

if ($node->hasDefaultValue() && [] != $default = $node->getDefaultValue()) {
$comment .= '@default '.json_encode($default)."\n";
}
}

if ($node->isDeprecated()) {
$comment .= '@deprecated '.$node->getDeprecation($node->getName(), $node->getParent()->getName())['message']."\n";
}

return $comment ? ' * '.str_replace("\n", "\n * ", rtrim($comment, "\n"))."\n" : '';
}




private function getSingularName(PrototypedArrayNode $node): string
{
$name = $node->getName();
if (!str_ends_with($name, 's')) {
return $name;
}

$parent = $node->getParent();
$mappings = $parent instanceof ArrayNode ? $parent->getXmlRemappings() : [];
foreach ($mappings as $map) {
if ($map[1] === $name) {
$name = $map[0];
break;
}
}

return $name;
}

private function buildToArray(ClassBuilder $class): void
{
$body = '$output = [];';
foreach ($class->getProperties() as $p) {
$code = '$this->PROPERTY';
if (null !== $p->getType()) {
if ($p->isArray()) {
$code = $p->areScalarsAllowed()
? 'array_map(fn ($v) => $v instanceof CLASS ? $v->toArray() : $v, $this->PROPERTY)'
: 'array_map(fn ($v) => $v->toArray(), $this->PROPERTY)'
;
} else {
$code = $p->areScalarsAllowed()
? '$this->PROPERTY instanceof CLASS ? $this->PROPERTY->toArray() : $this->PROPERTY'
: '$this->PROPERTY->toArray()'
;
}
}

$body .= strtr('
    if (isset($this->_usedProperties[\'PROPERTY\'])) {
        $output[\'ORG_NAME\'] = '.$code.';
    }', ['PROPERTY' => $p->getName(), 'ORG_NAME' => $p->getOriginalName(), 'CLASS' => $p->getType()]);
}

$extraKeys = $class->shouldAllowExtraKeys() ? ' + $this->_extraKeys' : '';

$class->addMethod('toArray', '
public function NAME(): array
{
    '.$body.'

    return $output'.$extraKeys.';
}');
}

private function buildConstructor(ClassBuilder $class): void
{
$body = '';
foreach ($class->getProperties() as $p) {
$code = '$value[\'ORG_NAME\']';
if (null !== $p->getType()) {
if ($p->isArray()) {
$code = $p->areScalarsAllowed()
? 'array_map(fn ($v) => \is_array($v) ? new '.$p->getType().'($v) : $v, $value[\'ORG_NAME\'])'
: 'array_map(fn ($v) => new '.$p->getType().'($v), $value[\'ORG_NAME\'])'
;
} else {
$code = $p->areScalarsAllowed()
? '\is_array($value[\'ORG_NAME\']) ? new '.$p->getType().'($value[\'ORG_NAME\']) : $value[\'ORG_NAME\']'
: 'new '.$p->getType().'($value[\'ORG_NAME\'])'
;
}
}

$body .= strtr('
    if (array_key_exists(\'ORG_NAME\', $value)) {
        $this->_usedProperties[\'PROPERTY\'] = true;
        $this->PROPERTY = '.$code.';
        unset($value[\'ORG_NAME\']);
    }
', ['PROPERTY' => $p->getName(), 'ORG_NAME' => $p->getOriginalName()]);
}

if ($class->shouldAllowExtraKeys()) {
$body .= '
    $this->_extraKeys = $value;
';
} else {
$body .= '
    if ([] !== $value) {
        throw new InvalidConfigurationException(sprintf(\'The following keys are not supported by "%s": \', __CLASS__).implode(\', \', array_keys($value)));
    }';

$class->addUse(InvalidConfigurationException::class);
}

$class->addMethod('__construct', '
public function __construct(array $value = [])
{'.$body.'
}');
}

private function buildSetExtraKey(ClassBuilder $class): void
{
if (!$class->shouldAllowExtraKeys()) {
return;
}

$class->addUse(ParamConfigurator::class);

$class->addProperty('_extraKeys');

$class->addMethod('set', '
/**
 * @param ParamConfigurator|mixed $value
 *
 * @return $this
 */
public function NAME(string $key, mixed $value): static
{
    $this->_extraKeys[$key] = $value;

    return $this;
}');
}

private function getSubNamespace(ClassBuilder $rootClass): string
{
return \sprintf('%s\\%s', $rootClass->getNamespace(), substr($rootClass->getName(), 0, -6));
}

private function hasNormalizationClosures(NodeInterface $node): bool
{
try {
$r = new \ReflectionProperty($node, 'normalizationClosures');
} catch (\ReflectionException) {
return false;
}

return [] !== $r->getValue($node);
}

private function getType(string $classType, bool $hasNormalizationClosures): string
{
return $classType.($hasNormalizationClosures ? '|scalar' : '');
}

private function getParamType(array $types, bool $withParamConfigurator = false): string
{
return \in_array('mixed', $types, true) ? 'mixed' : ($withParamConfigurator ? 'ParamConfigurator|' : '').implode('|', $types);
}
}
<?php










namespace Symfony\Component\Config\Builder;






interface ConfigBuilderInterface
{



public function toArray(): array;




public function getExtensionAlias(): string;
}
<?php










namespace Symfony\Component\Config\Builder;








class Property
{
private string $name;
private string $originalName;
private bool $array = false;
private bool $scalarsAllowed = false;
private ?string $type = null;
private ?string $content = null;

public function __construct(string $originalName, string $name)
{
$this->name = $name;
$this->originalName = $originalName;
}

public function getName(): string
{
return $this->name;
}

public function getOriginalName(): string
{
return $this->originalName;
}

public function setType(string $type): void
{
$this->array = false;
$this->type = $type;

if (str_ends_with($type, '|scalar')) {
$this->scalarsAllowed = true;
$this->type = $type = substr($type, 0, -7);
}

if (str_ends_with($type, '[]')) {
$this->array = true;
$this->type = substr($type, 0, -2);
}
}

public function getType(): ?string
{
return $this->type;
}

public function getContent(): ?string
{
return $this->content;
}

public function setContent(string $content): void
{
$this->content = $content;
}

public function isArray(): bool
{
return $this->array;
}

public function areScalarsAllowed(): bool
{
return $this->scalarsAllowed;
}
}
<?php










namespace Symfony\Component\Config\Builder;

use Symfony\Component\Config\Definition\ConfigurationInterface;






interface ConfigBuilderGeneratorInterface
{



public function build(ConfigurationInterface $configuration): \Closure;
}
<?php










namespace Symfony\Component\Config\Builder;








class Method
{
private string $content;

public function __construct(string $content)
{
$this->content = $content;
}

public function getContent(): string
{
return $this->content;
}
}
<?php










namespace Symfony\Component\Config\Builder;








class ClassBuilder
{
private string $namespace;
private string $name;


private array $properties = [];


private array $methods = [];
private array $require = [];
private array $use = [];
private array $implements = [];
private bool $allowExtraKeys = false;

public function __construct(string $namespace, string $name)
{
$this->namespace = $namespace;
$this->name = ucfirst($this->camelCase($name)).'Config';
}

public function getDirectory(): string
{
return str_replace('\\', \DIRECTORY_SEPARATOR, $this->namespace);
}

public function getFilename(): string
{
return $this->name.'.php';
}

public function build(): string
{
$rootPath = explode(\DIRECTORY_SEPARATOR, $this->getDirectory());
$require = '';
foreach ($this->require as $class) {

$path = explode(\DIRECTORY_SEPARATOR, $class->getDirectory());
$path[] = $class->getFilename();
foreach ($rootPath as $key => $value) {
if ($path[$key] !== $value) {
break;
}
unset($path[$key]);
}
$require .= \sprintf('require_once __DIR__.\DIRECTORY_SEPARATOR.\'%s\';', implode('\'.\DIRECTORY_SEPARATOR.\'', $path))."\n";
}
$use = $require ? "\n" : '';
foreach (array_keys($this->use) as $statement) {
$use .= \sprintf('use %s;', $statement)."\n";
}

$implements = [] === $this->implements ? '' : 'implements '.implode(', ', $this->implements);
$body = '';
foreach ($this->properties as $property) {
$body .= '    '.$property->getContent()."\n";
}
foreach ($this->methods as $method) {
$lines = explode("\n", $method->getContent());
foreach ($lines as $line) {
$body .= ($line ? '    '.$line : '')."\n";
}
}

$content = strtr('<?php

namespace NAMESPACE;

REQUIREUSE
/**
 * This class is automatically generated to help in creating a config.
 */
class CLASS IMPLEMENTS
{
BODY
}
', ['NAMESPACE' => $this->namespace, 'REQUIRE' => $require, 'USE' => $use, 'CLASS' => $this->getName(), 'IMPLEMENTS' => $implements, 'BODY' => $body]);

return $content;
}

public function addRequire(self $class): void
{
$this->require[] = $class;
}

public function addUse(string $class): void
{
$this->use[$class] = true;
}

public function addImplements(string $interface): void
{
$this->implements[] = '\\'.ltrim($interface, '\\');
}

public function addMethod(string $name, string $body, array $params = []): void
{
$this->methods[] = new Method(strtr($body, ['NAME' => $this->camelCase($name)] + $params));
}

public function addProperty(string $name, ?string $classType = null, ?string $defaultValue = null): Property
{
$property = new Property($name, '_' !== $name[0] ? $this->camelCase($name) : $name);
if (null !== $classType) {
$property->setType($classType);
}
$this->properties[] = $property;
$defaultValue = null !== $defaultValue ? \sprintf(' = %s', $defaultValue) : '';
$property->setContent(\sprintf('private $%s%s;', $property->getName(), $defaultValue));

return $property;
}

public function getProperties(): array
{
return $this->properties;
}

private function camelCase(string $input): string
{
$output = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $input))));

return preg_replace('#\W#', '', $output);
}

public function getName(): string
{
return $this->name;
}

public function getNamespace(): string
{
return $this->namespace;
}

public function getFqcn(): string
{
return '\\'.$this->namespace.'\\'.$this->name;
}

public function setAllowExtraKeys(bool $allowExtraKeys): void
{
$this->allowExtraKeys = $allowExtraKeys;
}

public function shouldAllowExtraKeys(): bool
{
return $this->allowExtraKeys;
}
}
<?php










namespace Symfony\Component\Config\Util;

use Symfony\Component\Config\Util\Exception\InvalidXmlException;
use Symfony\Component\Config\Util\Exception\XmlParsingException;










class XmlUtils
{



private function __construct()
{
}











public static function parse(string $content, string|callable|null $schemaOrCallable = null): \DOMDocument
{
if (!\extension_loaded('dom')) {
throw new \LogicException('Extension DOM is required.');
}

$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();

$dom = new \DOMDocument();
$dom->validateOnParse = true;
if (!$dom->loadXML($content, \LIBXML_NONET | \LIBXML_COMPACT)) {
throw new XmlParsingException(implode("\n", static::getXmlErrors($internalErrors)));
}

$dom->normalizeDocument();

libxml_use_internal_errors($internalErrors);

foreach ($dom->childNodes as $child) {
if (\XML_DOCUMENT_TYPE_NODE === $child->nodeType) {
throw new XmlParsingException('Document types are not allowed.');
}
}

if (null !== $schemaOrCallable) {
$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();

$e = null;
if (\is_callable($schemaOrCallable)) {
try {
$valid = $schemaOrCallable($dom, $internalErrors);
} catch (\Exception $e) {
$valid = false;
}
} elseif (is_file($schemaOrCallable)) {
$schemaSource = file_get_contents((string) $schemaOrCallable);
$valid = @$dom->schemaValidateSource($schemaSource);
} else {
libxml_use_internal_errors($internalErrors);

throw new XmlParsingException(\sprintf('Invalid XSD file: "%s".', $schemaOrCallable));
}

if (!$valid) {
$messages = static::getXmlErrors($internalErrors);
if (!$messages) {
throw new InvalidXmlException('The XML is not valid.', 0, $e);
}
throw new XmlParsingException(implode("\n", $messages), 0, $e);
}
}

libxml_clear_errors();
libxml_use_internal_errors($internalErrors);

return $dom;
}











public static function loadFile(string $file, string|callable|null $schemaOrCallable = null): \DOMDocument
{
if (!is_file($file)) {
throw new \InvalidArgumentException(\sprintf('Resource "%s" is not a file.', $file));
}

if (!is_readable($file)) {
throw new \InvalidArgumentException(\sprintf('File "%s" is not readable.', $file));
}

$content = @file_get_contents($file);

if ('' === trim($content)) {
throw new \InvalidArgumentException(\sprintf('File "%s" does not contain valid XML, it is empty.', $file));
}

try {
return static::parse($content, $schemaOrCallable);
} catch (InvalidXmlException $e) {
throw new XmlParsingException(\sprintf('The XML file "%s" is not valid.', $file), 0, $e->getPrevious());
}
}



















public static function convertDomElementToArray(\DOMElement $element, bool $checkPrefix = true): mixed
{
$prefix = (string) $element->prefix;
$empty = true;
$config = [];
foreach ($element->attributes as $name => $node) {
if ($checkPrefix && !\in_array((string) $node->prefix, ['', $prefix], true)) {
continue;
}
$config[$name] = static::phpize($node->value);
$empty = false;
}

$nodeValue = false;
foreach ($element->childNodes as $node) {
if ($node instanceof \DOMText) {
if ('' !== trim($node->nodeValue)) {
$nodeValue = trim($node->nodeValue);
$empty = false;
}
} elseif ($checkPrefix && $prefix != (string) $node->prefix) {
continue;
} elseif (!$node instanceof \DOMComment) {
$value = static::convertDomElementToArray($node, $checkPrefix);

$key = $node->localName;
if (isset($config[$key])) {
if (!\is_array($config[$key]) || !\is_int(key($config[$key]))) {
$config[$key] = [$config[$key]];
}
$config[$key][] = $value;
} else {
$config[$key] = $value;
}

$empty = false;
}
}

if (false !== $nodeValue) {
$value = static::phpize($nodeValue);
if (\count($config)) {
$config['value'] = $value;
} else {
$config = $value;
}
}

return !$empty ? $config : null;
}




public static function phpize(string|\Stringable $value): mixed
{
$value = (string) $value;
$lowercaseValue = strtolower($value);

switch (true) {
case 'null' === $lowercaseValue:
return null;
case ctype_digit($value):
case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)):
$raw = $value;
$cast = (int) $value;

return self::isOctal($value) ? \intval($value, 8) : (($raw === (string) $cast) ? $cast : $raw);
case 'true' === $lowercaseValue:
return true;
case 'false' === $lowercaseValue:
return false;
case isset($value[1]) && '0b' == $value[0].$value[1] && preg_match('/^0b[01]*$/', $value):
return bindec($value);
case is_numeric($value):
return '0x' === $value[0].$value[1] ? hexdec($value) : (float) $value;
case preg_match('/^0x[0-9a-f]++$/i', $value):
return hexdec($value);
case preg_match('/^[+-]?[0-9]+(\.[0-9]+)?$/', $value):
return (float) $value;
default:
return $value;
}
}




protected static function getXmlErrors(bool $internalErrors)
{
$errors = [];
foreach (libxml_get_errors() as $error) {
$errors[] = \sprintf('[%s %s] %s (in %s - line %d, column %d)',
\LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
$error->code,
trim($error->message),
$error->file ?: 'n/a',
$error->line,
$error->column
);
}

libxml_clear_errors();
libxml_use_internal_errors($internalErrors);

return $errors;
}

private static function isOctal(string $str): bool
{
if ('-' === $str[0]) {
$str = substr($str, 1);
}

return $str === '0'.decoct(\intval($str, 8));
}
}
<?php










namespace Symfony\Component\Config\Util\Exception;






class XmlParsingException extends \InvalidArgumentException
{
}
<?php










namespace Symfony\Component\Config\Util\Exception;







class InvalidXmlException extends XmlParsingException
{
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Config;










class ConfigCacheFactory implements ConfigCacheFactoryInterface
{
private bool $debug;




public function __construct(bool $debug)
{
$this->debug = $debug;
}

public function cache(string $file, callable $callback): ConfigCacheInterface
{
$cache = new ConfigCache($file, $this->debug);
if (!$cache->isFresh()) {
$callback($cache);
}

return $cache;
}
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceInterface;






interface ConfigCacheInterface
{



public function getPath(): string;






public function isFresh(): bool;












public function write(string $content, ?array $metadata = null);
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\SelfCheckingResourceChecker;











class ConfigCache extends ResourceCheckerConfigCache
{
private bool $debug;





public function __construct(string $file, bool $debug)
{
$this->debug = $debug;

$checkers = [];
if (true === $this->debug) {
$checkers = [new SelfCheckingResourceChecker()];
}

parent::__construct($file, $checkers);
}







public function isFresh(): bool
{
if (!$this->debug && is_file($this->getPath())) {
return true;
}

return parent::isFresh();
}
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;




interface FileLocatorInterface
{
/**
@psalm-return($first is true ? string : string[])











*/
public function locate(string $name, ?string $currentPath = null, bool $first = true);
}
<?php










namespace Symfony\Component\Config;







class ResourceCheckerConfigCacheFactory implements ConfigCacheFactoryInterface
{
private iterable $resourceCheckers = [];




public function __construct(iterable $resourceCheckers = [])
{
$this->resourceCheckers = $resourceCheckers;
}

public function cache(string $file, callable $callable): ConfigCacheInterface
{
$cache = new ResourceCheckerConfigCache($file, $this->resourceCheckers);
if (!$cache->isFresh()) {
$callable($cache);
}

return $cache;
}
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceInterface;












interface ResourceCheckerInterface
{






public function supports(ResourceInterface $metadata);








public function isFresh(ResourceInterface $resource, int $timestamp);
}
<?php










namespace Symfony\Component\Config\Exception;






class FileLoaderImportCircularReferenceException extends LoaderLoadException
{
public function __construct(array $resources, int $code = 0, ?\Throwable $previous = null)
{
$message = \sprintf('Circular reference detected in "%s" ("%s" > "%s").', $this->varToString($resources[0]), implode('" > "', $resources), $resources[0]);

\Exception::__construct($message, $code, $previous);
}
}
<?php










namespace Symfony\Component\Config\Exception;






class FileLocatorFileNotFoundException extends \InvalidArgumentException
{
private array $paths;

public function __construct(string $message = '', int $code = 0, ?\Throwable $previous = null, array $paths = [])
{
parent::__construct($message, $code, $previous);

$this->paths = $paths;
}




public function getPaths()
{
return $this->paths;
}
}
<?php










namespace Symfony\Component\Config\Exception;






class LoaderLoadException extends \Exception
{







public function __construct(mixed $resource, ?string $sourceResource = null, int $code = 0, ?\Throwable $previous = null, ?string $type = null)
{
if (!\is_string($resource)) {
try {
$resource = json_encode($resource, \JSON_THROW_ON_ERROR);
} catch (\JsonException) {
$resource = \sprintf('resource of type "%s"', get_debug_type($resource));
}
}

$message = '';
if ($previous) {



if (str_ends_with($previous->getMessage(), '.')) {
$trimmedMessage = substr($previous->getMessage(), 0, -1);
$message .= \sprintf('%s', $trimmedMessage).' in ';
} else {
$message .= \sprintf('%s', $previous->getMessage()).' in ';
}
$message .= $resource.' ';


if (null === $sourceResource) {
$message .= \sprintf('(which is loaded in resource "%s")', $resource);
} else {
$message .= \sprintf('(which is being imported from "%s")', $sourceResource);
}
$message .= '.';


} elseif (null === $sourceResource) {
$message .= \sprintf('Cannot load resource "%s".', $resource);
} else {
$message .= \sprintf('Cannot import resource "%s" from "%s".', $resource, $sourceResource);
}


if ('@' === $resource[0]) {
$parts = explode(\DIRECTORY_SEPARATOR, $resource);
$bundle = substr($parts[0], 1);
$message .= \sprintf(' Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
$message .= \sprintf(' If the bundle is registered, make sure the bundle path "%s" is not empty.', $resource);
} elseif (null !== $type) {
$message .= \sprintf(' Make sure there is a loader supporting the "%s" type.', $type);
}

parent::__construct($message, $code, $previous);
}




protected function varToString(mixed $var)
{
if (\is_object($var)) {
return \sprintf('Object(%s)', $var::class);
}

if (\is_array($var)) {
$a = [];
foreach ($var as $k => $v) {
$a[] = \sprintf('%s => %s', $k, $this->varToString($v));
}

return \sprintf('Array(%s)', implode(', ', $a));
}

if (\is_resource($var)) {
return \sprintf('Resource(%s)', get_resource_type($var));
}

if (null === $var) {
return 'null';
}

if (false === $var) {
return 'false';
}

if (true === $var) {
return 'true';
}

return (string) $var;
}
}
<?php










namespace Symfony\Component\Config\Definition;






interface PrototypeNodeInterface extends NodeInterface
{





public function setName(string $name);
}
<?php










namespace Symfony\Component\Config\Definition\Configurator;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Loader\DefinitionFileLoader;




class DefinitionConfigurator
{
public function __construct(
private TreeBuilder $treeBuilder,
private DefinitionFileLoader $loader,
private string $path,
private string $file,
) {
}

public function import(string $resource, ?string $type = null, bool $ignoreErrors = false): void
{
$this->loader->setCurrentDir(\dirname($this->path));
$this->loader->import($resource, $type, $ignoreErrors, $this->file);
}

public function rootNode(): NodeDefinition|ArrayNodeDefinition
{
return $this->treeBuilder->getRootNode();
}

public function setPathSeparator(string $separator): void
{
$this->treeBuilder->setPathSeparator($separator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\Exception\UnsetKeyException;







class ExprBuilder
{
public const TYPE_ANY = 'any';
public const TYPE_STRING = 'string';
public const TYPE_NULL = 'null';
public const TYPE_ARRAY = 'array';

protected $node;

public $allowedTypes;
public $ifPart;
public $thenPart;

public function __construct(NodeDefinition $node)
{
$this->node = $node;
}






public function always(?\Closure $then = null): static
{
$this->ifPart = static fn () => true;
$this->allowedTypes = self::TYPE_ANY;

if (null !== $then) {
$this->thenPart = $then;
}

return $this;
}








public function ifTrue(?\Closure $closure = null): static
{
$this->ifPart = $closure ?? static fn ($v) => true === $v;
$this->allowedTypes = self::TYPE_ANY;

return $this;
}






public function ifString(): static
{
$this->ifPart = \is_string(...);
$this->allowedTypes = self::TYPE_STRING;

return $this;
}






public function ifNull(): static
{
$this->ifPart = \is_null(...);
$this->allowedTypes = self::TYPE_NULL;

return $this;
}






public function ifEmpty(): static
{
$this->ifPart = static fn ($v) => empty($v);
$this->allowedTypes = self::TYPE_ANY;

return $this;
}






public function ifArray(): static
{
$this->ifPart = \is_array(...);
$this->allowedTypes = self::TYPE_ARRAY;

return $this;
}






public function ifInArray(array $array): static
{
$this->ifPart = static fn ($v) => \in_array($v, $array, true);
$this->allowedTypes = self::TYPE_ANY;

return $this;
}






public function ifNotInArray(array $array): static
{
$this->ifPart = static fn ($v) => !\in_array($v, $array, true);
$this->allowedTypes = self::TYPE_ANY;

return $this;
}






public function castToArray(): static
{
$this->ifPart = static fn ($v) => !\is_array($v);
$this->allowedTypes = self::TYPE_ANY;
$this->thenPart = static fn ($v) => [$v];

return $this;
}






public function then(\Closure $closure): static
{
$this->thenPart = $closure;

return $this;
}






public function thenEmptyArray(): static
{
$this->thenPart = static fn () => [];

return $this;
}










public function thenInvalid(string $message): static
{
$this->thenPart = static fn ($v) => throw new \InvalidArgumentException(\sprintf($message, json_encode($v)));

return $this;
}








public function thenUnset(): static
{
$this->thenPart = static fn () => throw new UnsetKeyException('Unsetting key.');

return $this;
}






public function end(): NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition
{
if (null === $this->ifPart) {
throw new \RuntimeException('You must specify an if part.');
}
if (null === $this->thenPart) {
throw new \RuntimeException('You must specify a then part.');
}

return $this->node;
}






public static function buildExpressions(array $expressions): array
{
foreach ($expressions as $k => $expr) {
if ($expr instanceof self) {
$if = $expr->ifPart;
$then = $expr->thenPart;
$expressions[$k] = static fn ($v) => $if($v) ? $then($v) : $v;
}
}

return $expressions;
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
use Symfony\Component\Config\Definition\NodeInterface;






abstract class NodeDefinition implements NodeParentInterface
{
protected $name;
protected $normalization;
protected $validation;
protected $defaultValue;
protected $default = false;
protected $required = false;
protected $deprecation = [];
protected $merge;
protected $allowEmptyValue = true;
protected $nullEquivalent;
protected $trueEquivalent = true;
protected $falseEquivalent = false;
protected $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR;
protected $parent;
protected $attributes = [];

public function __construct(?string $name, ?NodeParentInterface $parent = null)
{
$this->parent = $parent;
$this->name = $name;
}






public function setParent(NodeParentInterface $parent): static
{
$this->parent = $parent;

return $this;
}






public function info(string $info): static
{
return $this->attribute('info', $info);
}






public function example(string|array $example): static
{
return $this->attribute('example', $example);
}






public function attribute(string $key, mixed $value): static
{
$this->attributes[$key] = $value;

return $this;
}




public function end(): NodeParentInterface|NodeBuilder|self|ArrayNodeDefinition|VariableNodeDefinition|null
{
return $this->parent;
}




public function getNode(bool $forceRootNode = false): NodeInterface
{
if ($forceRootNode) {
$this->parent = null;
}

if (isset($this->normalization)) {
$allowedTypes = [];
foreach ($this->normalization->before as $expr) {
$allowedTypes[] = $expr->allowedTypes;
}
$allowedTypes = array_unique($allowedTypes);
$this->normalization->before = ExprBuilder::buildExpressions($this->normalization->before);
$this->normalization->declaredTypes = $allowedTypes;
}

if (isset($this->validation)) {
$this->validation->rules = ExprBuilder::buildExpressions($this->validation->rules);
}

$node = $this->createNode();
if ($node instanceof BaseNode) {
$node->setAttributes($this->attributes);
}

return $node;
}






public function defaultValue(mixed $value): static
{
$this->default = true;
$this->defaultValue = $value;

return $this;
}






public function isRequired(): static
{
$this->required = true;

return $this;
}













public function setDeprecated(string $package, string $version, string $message = 'The child node "%node%" at path "%path%" is deprecated.'): static
{
$this->deprecation = [
'package' => $package,
'version' => $version,
'message' => $message,
];

return $this;
}






public function treatNullLike(mixed $value): static
{
$this->nullEquivalent = $value;

return $this;
}






public function treatTrueLike(mixed $value): static
{
$this->trueEquivalent = $value;

return $this;
}






public function treatFalseLike(mixed $value): static
{
$this->falseEquivalent = $value;

return $this;
}






public function defaultNull(): static
{
return $this->defaultValue(null);
}






public function defaultTrue(): static
{
return $this->defaultValue(true);
}






public function defaultFalse(): static
{
return $this->defaultValue(false);
}




public function beforeNormalization(): ExprBuilder
{
return $this->normalization()->before();
}






public function cannotBeEmpty(): static
{
$this->allowEmptyValue = false;

return $this;
}








public function validate(): ExprBuilder
{
return $this->validation()->rule();
}






public function cannotBeOverwritten(bool $deny = true): static
{
$this->merge()->denyOverwrite($deny);

return $this;
}




protected function validation(): ValidationBuilder
{
return $this->validation ??= new ValidationBuilder($this);
}




protected function merge(): MergeBuilder
{
return $this->merge ??= new MergeBuilder($this);
}




protected function normalization(): NormalizationBuilder
{
return $this->normalization ??= new NormalizationBuilder($this);
}






abstract protected function createNode(): NodeInterface;






public function setPathSeparator(string $separator): static
{
if ($this instanceof ParentNodeDefinitionInterface) {
foreach ($this->getChildNodeDefinitions() as $child) {
$child->setPathSeparator($separator);
}
}

$this->pathSeparator = $separator;

return $this;
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\IntegerNode;






class IntegerNodeDefinition extends NumericNodeDefinition
{



protected function instantiateNode(): IntegerNode
{
return new IntegerNode($this->name, $this->parent, $this->min, $this->max, $this->pathSeparator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






interface BuilderAwareInterface
{





public function setBuilder(NodeBuilder $builder);
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






interface ParentNodeDefinitionInterface extends BuilderAwareInterface
{



public function children(): NodeBuilder;
















public function append(NodeDefinition $node): static;






public function getChildNodeDefinitions(): array;
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\VariableNode;






class VariableNodeDefinition extends NodeDefinition
{



protected function instantiateNode(): VariableNode
{
return new VariableNode($this->name, $this->parent, $this->pathSeparator);
}

protected function createNode(): NodeInterface
{
$node = $this->instantiateNode();

if (isset($this->normalization)) {
$node->setNormalizationClosures($this->normalization->before);
}

if (isset($this->merge)) {
$node->setAllowOverwrite($this->merge->allowOverwrite);
}

if (true === $this->default) {
$node->setDefaultValue($this->defaultValue);
}

$node->setAllowEmptyValue($this->allowEmptyValue);
$node->addEquivalentValue(null, $this->nullEquivalent);
$node->addEquivalentValue(true, $this->trueEquivalent);
$node->addEquivalentValue(false, $this->falseEquivalent);
$node->setRequired($this->required);

if ($this->deprecation) {
$node->setDeprecated($this->deprecation['package'], $this->deprecation['version'], $this->deprecation['message']);
}

if (isset($this->validation)) {
$node->setFinalValidationClosures($this->validation->rules);
}

return $node;
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\PrototypedArrayNode;






class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinitionInterface
{
protected $performDeepMerging = true;
protected $ignoreExtraKeys = false;
protected $removeExtraKeys = true;
protected $children = [];
protected $prototype;
protected $atLeastOne = false;
protected $allowNewKeys = true;
protected $key;
protected $removeKeyItem;
protected $addDefaults = false;
protected $addDefaultChildren = false;
protected $nodeBuilder;
protected $normalizeKeys = true;

public function __construct(?string $name, ?NodeParentInterface $parent = null)
{
parent::__construct($name, $parent);

$this->nullEquivalent = [];
$this->trueEquivalent = [];
}




public function setBuilder(NodeBuilder $builder)
{
$this->nodeBuilder = $builder;
}

public function children(): NodeBuilder
{
return $this->getNodeBuilder();
}




public function prototype(string $type): NodeDefinition
{
return $this->prototype = $this->getNodeBuilder()->node(null, $type)->setParent($this);
}

public function variablePrototype(): VariableNodeDefinition
{
return $this->prototype('variable');
}

public function scalarPrototype(): ScalarNodeDefinition
{
return $this->prototype('scalar');
}

public function booleanPrototype(): BooleanNodeDefinition
{
return $this->prototype('boolean');
}

public function integerPrototype(): IntegerNodeDefinition
{
return $this->prototype('integer');
}

public function floatPrototype(): FloatNodeDefinition
{
return $this->prototype('float');
}

public function arrayPrototype(): self
{
return $this->prototype('array');
}

public function enumPrototype(): EnumNodeDefinition
{
return $this->prototype('enum');
}










public function addDefaultsIfNotSet(): static
{
$this->addDefaults = true;

return $this;
}










public function addDefaultChildrenIfNoneSet(int|string|array|null $children = null): static
{
$this->addDefaultChildren = $children;

return $this;
}








public function requiresAtLeastOneElement(): static
{
$this->atLeastOne = true;

return $this;
}








public function disallowNewKeysInSubsequentConfigs(): static
{
$this->allowNewKeys = false;

return $this;
}









public function fixXmlConfig(string $singular, ?string $plural = null): static
{
$this->normalization()->remap($singular, $plural);

return $this;
}





























public function useAttributeAsKey(string $name, bool $removeKeyItem = true): static
{
$this->key = $name;
$this->removeKeyItem = $removeKeyItem;

return $this;
}






public function canBeUnset(bool $allow = true): static
{
$this->merge()->allowUnset($allow);

return $this;
}
















public function canBeEnabled(): static
{
$this
->addDefaultsIfNotSet()
->treatFalseLike(['enabled' => false])
->treatTrueLike(['enabled' => true])
->treatNullLike(['enabled' => true])
->beforeNormalization()
->ifArray()
->then(function (array $v) {
$v['enabled'] ??= true;

return $v;
})
->end()
->children()
->booleanNode('enabled')
->defaultFalse()
;

return $this;
}








public function canBeDisabled(): static
{
$this
->addDefaultsIfNotSet()
->treatFalseLike(['enabled' => false])
->treatTrueLike(['enabled' => true])
->treatNullLike(['enabled' => true])
->children()
->booleanNode('enabled')
->defaultTrue()
;

return $this;
}






public function performNoDeepMerging(): static
{
$this->performDeepMerging = false;

return $this;
}














public function ignoreExtraKeys(bool $remove = true): static
{
$this->ignoreExtraKeys = true;
$this->removeExtraKeys = $remove;

return $this;
}






public function normalizeKeys(bool $bool): static
{
$this->normalizeKeys = $bool;

return $this;
}

public function append(NodeDefinition $node): static
{
$this->children[$node->name ?? ''] = $node->setParent($this);

return $this;
}




protected function getNodeBuilder(): NodeBuilder
{
$this->nodeBuilder ??= new NodeBuilder();

return $this->nodeBuilder->setParent($this);
}

protected function createNode(): NodeInterface
{
if (!isset($this->prototype)) {
$node = new ArrayNode($this->name, $this->parent, $this->pathSeparator);

$this->validateConcreteNode($node);

$node->setAddIfNotSet($this->addDefaults);

foreach ($this->children as $child) {
$child->parent = $node;
$node->addChild($child->getNode());
}
} else {
$node = new PrototypedArrayNode($this->name, $this->parent, $this->pathSeparator);

$this->validatePrototypeNode($node);

if (null !== $this->key) {
$node->setKeyAttribute($this->key, $this->removeKeyItem);
}

if (true === $this->atLeastOne || false === $this->allowEmptyValue) {
$node->setMinNumberOfElements(1);
}

if ($this->default) {
if (!\is_array($this->defaultValue)) {
throw new \InvalidArgumentException(\sprintf('%s: the default value of an array node has to be an array.', $node->getPath()));
}

$node->setDefaultValue($this->defaultValue);
}

if (false !== $this->addDefaultChildren) {
$node->setAddChildrenIfNoneSet($this->addDefaultChildren);
if ($this->prototype instanceof static && !isset($this->prototype->prototype)) {
$this->prototype->addDefaultsIfNotSet();
}
}

$this->prototype->parent = $node;
$node->setPrototype($this->prototype->getNode());
}

$node->setAllowNewKeys($this->allowNewKeys);
$node->addEquivalentValue(null, $this->nullEquivalent);
$node->addEquivalentValue(true, $this->trueEquivalent);
$node->addEquivalentValue(false, $this->falseEquivalent);
$node->setPerformDeepMerging($this->performDeepMerging);
$node->setRequired($this->required);
$node->setIgnoreExtraKeys($this->ignoreExtraKeys, $this->removeExtraKeys);
$node->setNormalizeKeys($this->normalizeKeys);

if ($this->deprecation) {
$node->setDeprecated($this->deprecation['package'], $this->deprecation['version'], $this->deprecation['message']);
}

if (isset($this->normalization)) {
$node->setNormalizationClosures($this->normalization->before);
$node->setNormalizedTypes($this->normalization->declaredTypes);
$node->setXmlRemappings($this->normalization->remappings);
}

if (isset($this->merge)) {
$node->setAllowOverwrite($this->merge->allowOverwrite);
$node->setAllowFalse($this->merge->allowFalse);
}

if (isset($this->validation)) {
$node->setFinalValidationClosures($this->validation->rules);
}

return $node;
}








protected function validateConcreteNode(ArrayNode $node)
{
$path = $node->getPath();

if (null !== $this->key) {
throw new InvalidDefinitionException(\sprintf('->useAttributeAsKey() is not applicable to concrete nodes at path "%s".', $path));
}

if (false === $this->allowEmptyValue) {
throw new InvalidDefinitionException(\sprintf('->cannotBeEmpty() is not applicable to concrete nodes at path "%s".', $path));
}

if (true === $this->atLeastOne) {
throw new InvalidDefinitionException(\sprintf('->requiresAtLeastOneElement() is not applicable to concrete nodes at path "%s".', $path));
}

if ($this->default) {
throw new InvalidDefinitionException(\sprintf('->defaultValue() is not applicable to concrete nodes at path "%s".', $path));
}

if (false !== $this->addDefaultChildren) {
throw new InvalidDefinitionException(\sprintf('->addDefaultChildrenIfNoneSet() is not applicable to concrete nodes at path "%s".', $path));
}
}








protected function validatePrototypeNode(PrototypedArrayNode $node)
{
$path = $node->getPath();

if ($this->addDefaults) {
throw new InvalidDefinitionException(\sprintf('->addDefaultsIfNotSet() is not applicable to prototype nodes at path "%s".', $path));
}

if (false !== $this->addDefaultChildren) {
if ($this->default) {
throw new InvalidDefinitionException(\sprintf('A default value and default children might not be used together at path "%s".', $path));
}

if (null !== $this->key && (null === $this->addDefaultChildren || \is_int($this->addDefaultChildren) && $this->addDefaultChildren > 0)) {
throw new InvalidDefinitionException(\sprintf('->addDefaultChildrenIfNoneSet() should set default children names as ->useAttributeAsKey() is used at path "%s".', $path));
}

if (null === $this->key && (\is_string($this->addDefaultChildren) || \is_array($this->addDefaultChildren))) {
throw new InvalidDefinitionException(\sprintf('->addDefaultChildrenIfNoneSet() might not set default children names as ->useAttributeAsKey() is not used at path "%s".', $path));
}
}
}




public function getChildNodeDefinitions(): array
{
return $this->children;
}






public function find(string $nodePath): NodeDefinition
{
$firstPathSegment = (false === $pathSeparatorPos = strpos($nodePath, $this->pathSeparator))
? $nodePath
: substr($nodePath, 0, $pathSeparatorPos);

if (null === $node = ($this->children[$firstPathSegment] ?? null)) {
throw new \RuntimeException(\sprintf('Node with name "%s" does not exist in the current node "%s".', $firstPathSegment, $this->name));
}

if (false === $pathSeparatorPos) {
return $node;
}

return $node->find(substr($nodePath, $pathSeparatorPos + \strlen($this->pathSeparator)));
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






class MergeBuilder
{
protected $node;
public $allowFalse = false;
public $allowOverwrite = true;

public function __construct(NodeDefinition $node)
{
$this->node = $node;
}






public function allowUnset(bool $allow = true): static
{
$this->allowFalse = $allow;

return $this;
}






public function denyOverwrite(bool $deny = true): static
{
$this->allowOverwrite = !$deny;

return $this;
}




public function end(): NodeDefinition|ArrayNodeDefinition|VariableNodeDefinition
{
return $this->node;
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






class ValidationBuilder
{
protected $node;
public $rules = [];

public function __construct(NodeDefinition $node)
{
$this->node = $node;
}






public function rule(?\Closure $closure = null): ExprBuilder|static
{
if (null !== $closure) {
$this->rules[] = $closure;

return $this;
}

return $this->rules[] = new ExprBuilder($this->node);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\BooleanNode;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;






class BooleanNodeDefinition extends ScalarNodeDefinition
{
public function __construct(?string $name, ?NodeParentInterface $parent = null)
{
parent::__construct($name, $parent);

$this->nullEquivalent = true;
}




protected function instantiateNode(): BooleanNode
{
return new BooleanNode($this->name, $this->parent, $this->pathSeparator);
}




public function cannotBeEmpty(): static
{
throw new InvalidDefinitionException('->cannotBeEmpty() is not applicable to BooleanNodeDefinition.');
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\FloatNode;






class FloatNodeDefinition extends NumericNodeDefinition
{



protected function instantiateNode(): FloatNode
{
return new FloatNode($this->name, $this->parent, $this->min, $this->max, $this->pathSeparator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






class NormalizationBuilder
{
protected $node;
public $before = [];
public $declaredTypes = [];
public $remappings = [];

public function __construct(NodeDefinition $node)
{
$this->node = $node;
}









public function remap(string $key, ?string $plural = null): static
{
$this->remappings[] = [$key, null === $plural ? $key.'s' : $plural];

return $this;
}






public function before(?\Closure $closure = null): ExprBuilder|static
{
if (null !== $closure) {
$this->before[] = $closure;

return $this;
}

return $this->before[] = new ExprBuilder($this->node);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






interface NodeParentInterface
{
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\EnumNode;






class EnumNodeDefinition extends ScalarNodeDefinition
{
private array $values;




public function values(array $values): static
{
if (!$values) {
throw new \InvalidArgumentException('->values() must be called with at least one value.');
}

$this->values = $values;

return $this;
}






protected function instantiateNode(): EnumNode
{
if (!isset($this->values)) {
throw new \RuntimeException('You must call ->values() on enum nodes.');
}

return new EnumNode($this->name, $this->parent, $this->values, $this->pathSeparator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;






class NodeBuilder implements NodeParentInterface
{
protected $parent;
protected $nodeMapping;

public function __construct()
{
$this->nodeMapping = [
'variable' => VariableNodeDefinition::class,
'scalar' => ScalarNodeDefinition::class,
'boolean' => BooleanNodeDefinition::class,
'integer' => IntegerNodeDefinition::class,
'float' => FloatNodeDefinition::class,
'array' => ArrayNodeDefinition::class,
'enum' => EnumNodeDefinition::class,
];
}






public function setParent(?ParentNodeDefinitionInterface $parent = null): static
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/form', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__);
}
$this->parent = $parent;

return $this;
}




public function arrayNode(string $name): ArrayNodeDefinition
{
return $this->node($name, 'array');
}




public function scalarNode(string $name): ScalarNodeDefinition
{
return $this->node($name, 'scalar');
}




public function booleanNode(string $name): BooleanNodeDefinition
{
return $this->node($name, 'boolean');
}




public function integerNode(string $name): IntegerNodeDefinition
{
return $this->node($name, 'integer');
}




public function floatNode(string $name): FloatNodeDefinition
{
return $this->node($name, 'float');
}




public function enumNode(string $name): EnumNodeDefinition
{
return $this->node($name, 'enum');
}




public function variableNode(string $name): VariableNodeDefinition
{
return $this->node($name, 'variable');
}






public function end()
{
return $this->parent;
}







public function node(?string $name, string $type): NodeDefinition
{
$class = $this->getNodeClass($type);

$node = new $class($name);

$this->append($node);

return $node;
}
















public function append(NodeDefinition $node): static
{
if ($node instanceof BuilderAwareInterface) {
$builder = clone $this;
$builder->setParent(null);
$node->setBuilder($builder);
}

if (null !== $this->parent) {
$this->parent->append($node);

$node->setParent($this);
}

return $this;
}









public function setNodeClass(string $type, string $class): static
{
$this->nodeMapping[strtolower($type)] = $class;

return $this;
}







protected function getNodeClass(string $type): string
{
$type = strtolower($type);

if (!isset($this->nodeMapping[$type])) {
throw new \RuntimeException(\sprintf('The node type "%s" is not registered.', $type));
}

$class = $this->nodeMapping[$type];

if (!class_exists($class)) {
throw new \RuntimeException(\sprintf('The node class "%s" does not exist.', $class));
}

return $class;
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\ScalarNode;






class ScalarNodeDefinition extends VariableNodeDefinition
{



protected function instantiateNode(): ScalarNode
{
return new ScalarNode($this->name, $this->parent, $this->pathSeparator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\NodeInterface;






class TreeBuilder implements NodeParentInterface
{



protected $tree;




protected $root;

public function __construct(string $name, string $type = 'array', ?NodeBuilder $builder = null)
{
$builder ??= new NodeBuilder();
$this->root = $builder->node($name, $type)->setParent($this);
}




public function getRootNode(): NodeDefinition|ArrayNodeDefinition
{
return $this->root;
}






public function buildTree(): NodeInterface
{
return $this->tree ??= $this->root->getNode(true);
}




public function setPathSeparator(string $separator)
{

$this->tree = null;

$this->root->setPathSeparator($separator);
}
}
<?php










namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;






abstract class NumericNodeDefinition extends ScalarNodeDefinition
{
protected $min;
protected $max;








public function max(int|float $max): static
{
if (isset($this->min) && $this->min > $max) {
throw new \InvalidArgumentException(\sprintf('You cannot define a max(%s) as you already have a min(%s).', $max, $this->min));
}
$this->max = $max;

return $this;
}








public function min(int|float $min): static
{
if (isset($this->max) && $this->max < $min) {
throw new \InvalidArgumentException(\sprintf('You cannot define a min(%s) as you already have a max(%s).', $min, $this->max));
}
$this->min = $min;

return $this;
}




public function cannotBeEmpty(): static
{
throw new InvalidDefinitionException('->cannotBeEmpty() is not applicable to NumericNodeDefinition.');
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\Config\Definition\Loader\DefinitionFileLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;






class Configuration implements ConfigurationInterface
{
public function __construct(
private ConfigurableInterface $subject,
private ?ContainerBuilder $container,
private string $alias,
) {
}

public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder($this->alias);
$file = (new \ReflectionObject($this->subject))->getFileName();
$loader = new DefinitionFileLoader($treeBuilder, new FileLocator(\dirname($file)), $this->container);
$configurator = new DefinitionConfigurator($treeBuilder, $loader, $file, $file);

$this->subject->configure($configurator);

return $treeBuilder;
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;






class EnumNode extends ScalarNode
{
private array $values;

public function __construct(?string $name, ?NodeInterface $parent = null, array $values = [], string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR)
{
if (!$values) {
throw new \InvalidArgumentException('$values must contain at least one element.');
}

foreach ($values as $value) {
if (null === $value || \is_scalar($value)) {
continue;
}

if (!$value instanceof \UnitEnum) {
throw new \InvalidArgumentException(\sprintf('"%s" only supports scalar, enum, or null values, "%s" given.', __CLASS__, get_debug_type($value)));
}

if ($value::class !== ($enumClass ??= $value::class)) {
throw new \InvalidArgumentException(\sprintf('"%s" only supports one type of enum, "%s" and "%s" passed.', __CLASS__, $enumClass, $value::class));
}
}

parent::__construct($name, $parent, $pathSeparator);
$this->values = $values;
}




public function getValues()
{
return $this->values;
}




public function getPermissibleValues(string $separator): string
{
return implode($separator, array_unique(array_map(static function (mixed $value): string {
if (!$value instanceof \UnitEnum) {
return json_encode($value);
}

return ltrim(var_export($value, true), '\\');
}, $this->values)));
}




protected function validateType(mixed $value)
{
if ($value instanceof \UnitEnum) {
return;
}

parent::validateType($value);
}

protected function finalizeValue(mixed $value): mixed
{
$value = parent::finalizeValue($value);

if (!\in_array($value, $this->values, true)) {
$ex = new InvalidConfigurationException(\sprintf('The value %s is not allowed for path "%s". Permissible values: %s', json_encode($value), $this->getPath(), $this->getPermissibleValues(', ')));
$ex->setPath($this->getPath());

throw $ex;
}

return $value;
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
use Symfony\Component\Config\Definition\Exception\UnsetKeyException;






abstract class BaseNode implements NodeInterface
{
public const DEFAULT_PATH_SEPARATOR = '.';

private static array $placeholderUniquePrefixes = [];
private static array $placeholders = [];

protected $name;
protected $parent;
protected $normalizationClosures = [];
protected $normalizedTypes = [];
protected $finalValidationClosures = [];
protected $allowOverwrite = true;
protected $required = false;
protected $deprecation = [];
protected $equivalentValues = [];
protected $attributes = [];
protected $pathSeparator;

private mixed $handlingPlaceholder = null;




public function __construct(?string $name, ?NodeInterface $parent = null, string $pathSeparator = self::DEFAULT_PATH_SEPARATOR)
{
if (str_contains($name = (string) $name, $pathSeparator)) {
throw new \InvalidArgumentException('The name must not contain ".'.$pathSeparator.'".');
}

$this->name = $name;
$this->parent = $parent;
$this->pathSeparator = $pathSeparator;
}









public static function setPlaceholder(string $placeholder, array $values): void
{
if (!$values) {
throw new \InvalidArgumentException('At least one value must be provided.');
}

self::$placeholders[$placeholder] = $values;
}









public static function setPlaceholderUniquePrefix(string $prefix): void
{
self::$placeholderUniquePrefixes[] = $prefix;
}






public static function resetPlaceholders(): void
{
self::$placeholderUniquePrefixes = [];
self::$placeholders = [];
}




public function setAttribute(string $key, mixed $value)
{
$this->attributes[$key] = $value;
}

public function getAttribute(string $key, mixed $default = null): mixed
{
return $this->attributes[$key] ?? $default;
}

public function hasAttribute(string $key): bool
{
return isset($this->attributes[$key]);
}

public function getAttributes(): array
{
return $this->attributes;
}




public function setAttributes(array $attributes)
{
$this->attributes = $attributes;
}




public function removeAttribute(string $key)
{
unset($this->attributes[$key]);
}






public function setInfo(string $info)
{
$this->setAttribute('info', $info);
}




public function getInfo(): ?string
{
return $this->getAttribute('info');
}






public function setExample(string|array $example)
{
$this->setAttribute('example', $example);
}




public function getExample(): string|array|null
{
return $this->getAttribute('example');
}






public function addEquivalentValue(mixed $originalValue, mixed $equivalentValue)
{
$this->equivalentValues[] = [$originalValue, $equivalentValue];
}






public function setRequired(bool $boolean)
{
$this->required = $boolean;
}













public function setDeprecated(string $package, string $version, string $message = 'The child node "%node%" at path "%path%" is deprecated.')
{
$this->deprecation = [
'package' => $package,
'version' => $version,
'message' => $message,
];
}






public function setAllowOverwrite(bool $allow)
{
$this->allowOverwrite = $allow;
}








public function setNormalizationClosures(array $closures)
{
$this->normalizationClosures = $closures;
}








public function setNormalizedTypes(array $types)
{
$this->normalizedTypes = $types;
}






public function getNormalizedTypes(): array
{
return $this->normalizedTypes;
}








public function setFinalValidationClosures(array $closures)
{
$this->finalValidationClosures = $closures;
}

public function isRequired(): bool
{
return $this->required;
}




public function isDeprecated(): bool
{
return (bool) $this->deprecation;
}





public function getDeprecation(string $node, string $path): array
{
return [
'package' => $this->deprecation['package'],
'version' => $this->deprecation['version'],
'message' => strtr($this->deprecation['message'], ['%node%' => $node, '%path%' => $path]),
];
}

public function getName(): string
{
return $this->name;
}

public function getPath(): string
{
if (null !== $this->parent) {
return $this->parent->getPath().$this->pathSeparator.$this->name;
}

return $this->name;
}

final public function merge(mixed $leftSide, mixed $rightSide): mixed
{
if (!$this->allowOverwrite) {
throw new ForbiddenOverwriteException(\sprintf('Configuration path "%s" cannot be overwritten. You have to define all options for this path, and any of its sub-paths in one configuration section.', $this->getPath()));
}

if ($leftSide !== $leftPlaceholders = self::resolvePlaceholderValue($leftSide)) {
foreach ($leftPlaceholders as $leftPlaceholder) {
$this->handlingPlaceholder = $leftSide;
try {
$this->merge($leftPlaceholder, $rightSide);
} finally {
$this->handlingPlaceholder = null;
}
}

return $rightSide;
}

if ($rightSide !== $rightPlaceholders = self::resolvePlaceholderValue($rightSide)) {
foreach ($rightPlaceholders as $rightPlaceholder) {
$this->handlingPlaceholder = $rightSide;
try {
$this->merge($leftSide, $rightPlaceholder);
} finally {
$this->handlingPlaceholder = null;
}
}

return $rightSide;
}

$this->doValidateType($leftSide);
$this->doValidateType($rightSide);

return $this->mergeValues($leftSide, $rightSide);
}

final public function normalize(mixed $value): mixed
{
$value = $this->preNormalize($value);


foreach ($this->normalizationClosures as $closure) {
$value = $closure($value);
}


if ($value !== $placeholders = self::resolvePlaceholderValue($value)) {
foreach ($placeholders as $placeholder) {
$this->handlingPlaceholder = $value;
try {
$this->normalize($placeholder);
} finally {
$this->handlingPlaceholder = null;
}
}

return $value;
}


foreach ($this->equivalentValues as $data) {
if ($data[0] === $value) {
$value = $data[1];
}
}


$this->doValidateType($value);


return $this->normalizeValue($value);
}




protected function preNormalize(mixed $value): mixed
{
return $value;
}




public function getParent(): ?NodeInterface
{
return $this->parent;
}

final public function finalize(mixed $value): mixed
{
if ($value !== $placeholders = self::resolvePlaceholderValue($value)) {
foreach ($placeholders as $placeholder) {
$this->handlingPlaceholder = $value;
try {
$this->finalize($placeholder);
} finally {
$this->handlingPlaceholder = null;
}
}

return $value;
}

$this->doValidateType($value);

$value = $this->finalizeValue($value);



foreach ($this->finalValidationClosures as $closure) {
try {
$value = $closure($value);
} catch (Exception $e) {
if ($e instanceof UnsetKeyException && null !== $this->handlingPlaceholder) {
continue;
}

throw $e;
} catch (\Exception $e) {
throw new InvalidConfigurationException(\sprintf('Invalid configuration for path "%s": ', $this->getPath()).$e->getMessage(), $e->getCode(), $e);
}
}

return $value;
}








abstract protected function validateType(mixed $value);




abstract protected function normalizeValue(mixed $value): mixed;




abstract protected function mergeValues(mixed $leftSide, mixed $rightSide): mixed;




abstract protected function finalizeValue(mixed $value): mixed;




protected function allowPlaceholders(): bool
{
return true;
}




protected function isHandlingPlaceholder(): bool
{
return null !== $this->handlingPlaceholder;
}




protected function getValidPlaceholderTypes(): array
{
return [];
}

private static function resolvePlaceholderValue(mixed $value): mixed
{
if (\is_string($value)) {
if (isset(self::$placeholders[$value])) {
return self::$placeholders[$value];
}

foreach (self::$placeholderUniquePrefixes as $placeholderUniquePrefix) {
if (str_starts_with($value, $placeholderUniquePrefix)) {
return [];
}
}
}

return $value;
}

private function doValidateType(mixed $value): void
{
if (null !== $this->handlingPlaceholder && !$this->allowPlaceholders()) {
$e = new InvalidTypeException(\sprintf('A dynamic value is not compatible with a "%s" node type at path "%s".', static::class, $this->getPath()));
$e->setPath($this->getPath());

throw $e;
}

if (null === $this->handlingPlaceholder || null === $value) {
$this->validateType($value);

return;
}

$knownTypes = array_keys(self::$placeholders[$this->handlingPlaceholder]);
$validTypes = $this->getValidPlaceholderTypes();

if ($validTypes && array_diff($knownTypes, $validTypes)) {
$e = new InvalidTypeException(\sprintf(
'Invalid type for path "%s". Expected %s, but got %s.',
$this->getPath(),
1 === \count($validTypes) ? '"'.reset($validTypes).'"' : 'one of "'.implode('", "', $validTypes).'"',
1 === \count($knownTypes) ? '"'.reset($knownTypes).'"' : 'one of "'.implode('", "', $knownTypes).'"'
));
if ($hint = $this->getInfo()) {
$e->addHint($hint);
}
$e->setPath($this->getPath());

throw $e;
}

$this->validateType($value);
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;









interface NodeInterface
{



public function getName(): string;




public function getPath(): string;




public function isRequired(): bool;




public function hasDefaultValue(): bool;






public function getDefaultValue(): mixed;






public function normalize(mixed $value): mixed;







public function merge(mixed $leftSide, mixed $rightSide): mixed;







public function finalize(mixed $value): mixed;
}
<?php










namespace Symfony\Component\Config\Definition;








class Processor
{





public function process(NodeInterface $configTree, array $configs): array
{
$currentConfig = [];
foreach ($configs as $config) {
$config = $configTree->normalize($config);
$currentConfig = $configTree->merge($currentConfig, $config);
}

return $configTree->finalize($currentConfig);
}






public function processConfiguration(ConfigurationInterface $configuration, array $configs): array
{
return $this->process($configuration->getConfigTreeBuilder()->buildTree(), $configs);
}






















public static function normalizeConfig(array $config, string $key, ?string $plural = null): array
{
$plural ??= $key.'s';

if (isset($config[$plural])) {
return $config[$plural];
}

if (isset($config[$key])) {
if (\is_string($config[$key]) || !\is_int(key($config[$key]))) {

return [$config[$key]];
}

return $config[$key];
}

return [];
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;






interface ConfigurationInterface
{





public function getConfigTreeBuilder();
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;













class ScalarNode extends VariableNode
{



protected function validateType(mixed $value)
{
if (!\is_scalar($value) && null !== $value) {
$ex = new InvalidTypeException(\sprintf('Invalid type for path "%s". Expected "scalar", but got "%s".', $this->getPath(), get_debug_type($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}
}

protected function isValueEmpty(mixed $value): bool
{


if ($this->isHandlingPlaceholder()) {
return false;
}

return null === $value || '' === $value;
}

protected function getValidPlaceholderTypes(): array
{
return ['bool', 'int', 'float', 'string'];
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;






class BooleanNode extends ScalarNode
{



protected function validateType(mixed $value)
{
if (!\is_bool($value)) {
$ex = new InvalidTypeException(\sprintf('Invalid type for path "%s". Expected "bool", but got "%s".', $this->getPath(), get_debug_type($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}
}

protected function isValueEmpty(mixed $value): bool
{

return false;
}

protected function getValidPlaceholderTypes(): array
{
return ['bool'];
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;






class IntegerNode extends NumericNode
{



protected function validateType(mixed $value)
{
if (!\is_int($value)) {
$ex = new InvalidTypeException(\sprintf('Invalid type for path "%s". Expected "int", but got "%s".', $this->getPath(), get_debug_type($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}
}

protected function getValidPlaceholderTypes(): array
{
return ['int'];
}
}
<?php










namespace Symfony\Component\Config\Definition\Exception;






class InvalidDefinitionException extends Exception
{
}
<?php










namespace Symfony\Component\Config\Definition\Exception;






class InvalidTypeException extends InvalidConfigurationException
{
}
<?php










namespace Symfony\Component\Config\Definition\Exception;







class InvalidConfigurationException extends Exception
{
private ?string $path = null;
private bool $containsHints = false;




public function setPath(string $path)
{
$this->path = $path;
}

public function getPath(): ?string
{
return $this->path;
}






public function addHint(string $hint)
{
if (!$this->containsHints) {
$this->message .= "\nHint: ".$hint;
$this->containsHints = true;
} else {
$this->message .= ', '.$hint;
}
}
}
<?php










namespace Symfony\Component\Config\Definition\Exception;






class Exception extends \RuntimeException
{
}
<?php










namespace Symfony\Component\Config\Definition\Exception;







class ForbiddenOverwriteException extends InvalidConfigurationException
{
}
<?php










namespace Symfony\Component\Config\Definition\Exception;







class DuplicateKeyException extends InvalidConfigurationException
{
}
<?php










namespace Symfony\Component\Config\Definition\Exception;







class UnsetKeyException extends Exception
{
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\DuplicateKeyException;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\UnsetKeyException;






class PrototypedArrayNode extends ArrayNode
{
protected $prototype;
protected $keyAttribute;
protected $removeKeyAttribute = false;
protected $minNumberOfElements = 0;
protected $defaultValue = [];
protected $defaultChildren;



private array $valuePrototypes = [];







public function setMinNumberOfElements(int $number)
{
$this->minNumberOfElements = $number;
}



























public function setKeyAttribute(string $attribute, bool $remove = true)
{
$this->keyAttribute = $attribute;
$this->removeKeyAttribute = $remove;
}




public function getKeyAttribute(): ?string
{
return $this->keyAttribute;
}






public function setDefaultValue(array $value)
{
$this->defaultValue = $value;
}

public function hasDefaultValue(): bool
{
return true;
}








public function setAddChildrenIfNoneSet(int|string|array|null $children = ['defaults'])
{
if (null === $children) {
$this->defaultChildren = ['defaults'];
} else {
$this->defaultChildren = \is_int($children) && $children > 0 ? range(1, $children) : (array) $children;
}
}





public function getDefaultValue(): mixed
{
if (null !== $this->defaultChildren) {
$default = $this->prototype->hasDefaultValue() ? $this->prototype->getDefaultValue() : [];
$defaults = [];
foreach (array_values($this->defaultChildren) as $i => $name) {
$defaults[null === $this->keyAttribute ? $i : $name] = $default;
}

return $defaults;
}

return $this->defaultValue;
}






public function setPrototype(PrototypeNodeInterface $node)
{
$this->prototype = $node;
}




public function getPrototype(): PrototypeNodeInterface
{
return $this->prototype;
}








public function addChild(NodeInterface $node)
{
throw new Exception('A prototyped array node cannot have concrete children.');
}

protected function finalizeValue(mixed $value): mixed
{
if (false === $value) {
throw new UnsetKeyException(\sprintf('Unsetting key for path "%s", value: %s.', $this->getPath(), json_encode($value)));
}

foreach ($value as $k => $v) {
$prototype = $this->getPrototypeForChild($k);
try {
$value[$k] = $prototype->finalize($v);
} catch (UnsetKeyException) {
unset($value[$k]);
}
}

if (\count($value) < $this->minNumberOfElements) {
$ex = new InvalidConfigurationException(\sprintf('The path "%s" should have at least %d element(s) defined.', $this->getPath(), $this->minNumberOfElements));
$ex->setPath($this->getPath());

throw $ex;
}

return $value;
}




protected function normalizeValue(mixed $value): mixed
{
if (false === $value) {
return $value;
}

$value = $this->remapXml($value);

$isList = array_is_list($value);
$normalized = [];
foreach ($value as $k => $v) {
if (null !== $this->keyAttribute && \is_array($v)) {
if (!isset($v[$this->keyAttribute]) && \is_int($k) && $isList) {
$ex = new InvalidConfigurationException(\sprintf('The attribute "%s" must be set for path "%s".', $this->keyAttribute, $this->getPath()));
$ex->setPath($this->getPath());

throw $ex;
} elseif (isset($v[$this->keyAttribute])) {
$k = $v[$this->keyAttribute];

if (\is_float($k)) {
$k = var_export($k, true);
}


if ($this->removeKeyAttribute) {
unset($v[$this->keyAttribute]);
}


if (array_keys($v) === ['value']) {
$v = $v['value'];
if ($this->prototype instanceof ArrayNode && ($children = $this->prototype->getChildren()) && \array_key_exists('value', $children)) {
$valuePrototype = current($this->valuePrototypes) ?: clone $children['value'];
$valuePrototype->parent = $this;
$originalClosures = $this->prototype->normalizationClosures;
if (\is_array($originalClosures)) {
$valuePrototypeClosures = $valuePrototype->normalizationClosures;
$valuePrototype->normalizationClosures = \is_array($valuePrototypeClosures) ? array_merge($originalClosures, $valuePrototypeClosures) : $originalClosures;
}
$this->valuePrototypes[$k] = $valuePrototype;
}
}
}

if (\array_key_exists($k, $normalized)) {
$ex = new DuplicateKeyException(\sprintf('Duplicate key "%s" for path "%s".', $k, $this->getPath()));
$ex->setPath($this->getPath());

throw $ex;
}
}

$prototype = $this->getPrototypeForChild($k);
if (null !== $this->keyAttribute || !$isList) {
$normalized[$k] = $prototype->normalize($v);
} else {
$normalized[] = $prototype->normalize($v);
}
}

return $normalized;
}

protected function mergeValues(mixed $leftSide, mixed $rightSide): mixed
{
if (false === $rightSide) {


return false;
}

if (false === $leftSide || !$this->performDeepMerging) {
return $rightSide;
}

$isList = array_is_list($rightSide);
foreach ($rightSide as $k => $v) {

if (null === $this->keyAttribute && $isList) {
$leftSide[] = $v;
continue;
}


if (!\array_key_exists($k, $leftSide)) {
if (!$this->allowNewKeys) {
$ex = new InvalidConfigurationException(\sprintf('You are not allowed to define new elements for path "%s". Please define all elements for this path in one config file.', $this->getPath()));
$ex->setPath($this->getPath());

throw $ex;
}

$leftSide[$k] = $v;
continue;
}

$prototype = $this->getPrototypeForChild($k);
$leftSide[$k] = $prototype->merge($leftSide[$k], $v);
}

return $leftSide;
}





































private function getPrototypeForChild(string $key): mixed
{
$prototype = $this->valuePrototypes[$key] ?? $this->prototype;
$prototype->setName($key);

return $prototype;
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
use Symfony\Component\Config\Definition\Exception\UnsetKeyException;






class ArrayNode extends BaseNode implements PrototypeNodeInterface
{
protected $xmlRemappings = [];
protected $children = [];
protected $allowFalse = false;
protected $allowNewKeys = true;
protected $addIfNotSet = false;
protected $performDeepMerging = true;
protected $ignoreExtraKeys = false;
protected $removeExtraKeys = true;
protected $normalizeKeys = true;




public function setNormalizeKeys(bool $normalizeKeys)
{
$this->normalizeKeys = $normalizeKeys;
}








protected function preNormalize(mixed $value): mixed
{
if (!$this->normalizeKeys || !\is_array($value)) {
return $value;
}

$normalized = [];

foreach ($value as $k => $v) {
if (str_contains($k, '-') && !str_contains($k, '_') && !\array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) {
$normalized[$normalizedKey] = $v;
} else {
$normalized[$k] = $v;
}
}

return $normalized;
}






public function getChildren(): array
{
return $this->children;
}








public function setXmlRemappings(array $remappings)
{
$this->xmlRemappings = $remappings;
}






public function getXmlRemappings(): array
{
return $this->xmlRemappings;
}







public function setAddIfNotSet(bool $boolean)
{
$this->addIfNotSet = $boolean;
}






public function setAllowFalse(bool $allow)
{
$this->allowFalse = $allow;
}






public function setAllowNewKeys(bool $allow)
{
$this->allowNewKeys = $allow;
}






public function setPerformDeepMerging(bool $boolean)
{
$this->performDeepMerging = $boolean;
}









public function setIgnoreExtraKeys(bool $boolean, bool $remove = true)
{
$this->ignoreExtraKeys = $boolean;
$this->removeExtraKeys = $this->ignoreExtraKeys && $remove;
}




public function shouldIgnoreExtraKeys(): bool
{
return $this->ignoreExtraKeys;
}




public function setName(string $name)
{
$this->name = $name;
}

public function hasDefaultValue(): bool
{
return $this->addIfNotSet;
}

public function getDefaultValue(): mixed
{
if (!$this->hasDefaultValue()) {
throw new \RuntimeException(\sprintf('The node at path "%s" has no default value.', $this->getPath()));
}

$defaults = [];
foreach ($this->children as $name => $child) {
if ($child->hasDefaultValue()) {
$defaults[$name] = $child->getDefaultValue();
}
}

return $defaults;
}









public function addChild(NodeInterface $node)
{
$name = $node->getName();
if ('' === $name) {
throw new \InvalidArgumentException('Child nodes must be named.');
}
if (isset($this->children[$name])) {
throw new \InvalidArgumentException(\sprintf('A child node named "%s" already exists.', $name));
}

$this->children[$name] = $node;
}





protected function finalizeValue(mixed $value): mixed
{
if (false === $value) {
throw new UnsetKeyException(\sprintf('Unsetting key for path "%s", value: %s.', $this->getPath(), json_encode($value)));
}

foreach ($this->children as $name => $child) {
if (!\array_key_exists($name, $value)) {
if ($child->isRequired()) {
$message = \sprintf('The child config "%s" under "%s" must be configured', $name, $this->getPath());
if ($child->getInfo()) {
$message .= \sprintf(': %s', $child->getInfo());
} else {
$message .= '.';
}
$ex = new InvalidConfigurationException($message);
$ex->setPath($this->getPath());

throw $ex;
}

if ($child->hasDefaultValue()) {
$value[$name] = $child->getDefaultValue();
}

continue;
}

if ($child->isDeprecated()) {
$deprecation = $child->getDeprecation($name, $this->getPath());
trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']);
}

try {
$value[$name] = $child->finalize($value[$name]);
} catch (UnsetKeyException) {
unset($value[$name]);
}
}

return $value;
}




protected function validateType(mixed $value)
{
if (!\is_array($value) && (!$this->allowFalse || false !== $value)) {
$ex = new InvalidTypeException(\sprintf('Invalid type for path "%s". Expected "array", but got "%s"', $this->getPath(), get_debug_type($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}
}




protected function normalizeValue(mixed $value): mixed
{
if (false === $value) {
return $value;
}

$value = $this->remapXml($value);

$normalized = [];
foreach ($value as $name => $val) {
if (isset($this->children[$name])) {
try {
$normalized[$name] = $this->children[$name]->normalize($val);
} catch (UnsetKeyException) {
}
unset($value[$name]);
} elseif (!$this->removeExtraKeys) {
$normalized[$name] = $val;
}
}


if (\count($value) && !$this->ignoreExtraKeys) {
$proposals = array_keys($this->children);
sort($proposals);
$guesses = [];

foreach (array_keys($value) as $subject) {
$minScore = \INF;
foreach ($proposals as $proposal) {
$distance = levenshtein($subject, $proposal);
if ($distance <= $minScore && $distance < 3) {
$guesses[$proposal] = $distance;
$minScore = $distance;
}
}
}

$msg = \sprintf('Unrecognized option%s "%s" under "%s"', 1 === \count($value) ? '' : 's', implode(', ', array_keys($value)), $this->getPath());

if (\count($guesses)) {
asort($guesses);
$msg .= \sprintf('. Did you mean "%s"?', implode('", "', array_keys($guesses)));
} else {
$msg .= \sprintf('. Available option%s %s "%s".', 1 === \count($proposals) ? '' : 's', 1 === \count($proposals) ? 'is' : 'are', implode('", "', $proposals));
}

$ex = new InvalidConfigurationException($msg);
$ex->setPath($this->getPath());

throw $ex;
}

return $normalized;
}




protected function remapXml(array $value): array
{
foreach ($this->xmlRemappings as [$singular, $plural]) {
if (!isset($value[$singular])) {
continue;
}

$value[$plural] = Processor::normalizeConfig($value, $singular, $plural);
unset($value[$singular]);
}

return $value;
}





protected function mergeValues(mixed $leftSide, mixed $rightSide): mixed
{
if (false === $rightSide) {


return false;
}

if (false === $leftSide || !$this->performDeepMerging) {
return $rightSide;
}

foreach ($rightSide as $k => $v) {

if (!\array_key_exists($k, $leftSide)) {
if (!$this->allowNewKeys) {
$ex = new InvalidConfigurationException(\sprintf('You are not allowed to define new elements for path "%s". Please define all elements for this path in one config file. If you are trying to overwrite an element, make sure you redefine it with the same name.', $this->getPath()));
$ex->setPath($this->getPath());

throw $ex;
}

$leftSide[$k] = $v;
continue;
}

if (!isset($this->children[$k])) {
if (!$this->ignoreExtraKeys || $this->removeExtraKeys) {
throw new \RuntimeException('merge() expects a normalized config array.');
}

$leftSide[$k] = $v;
continue;
}

$leftSide[$k] = $this->children[$k]->merge($leftSide[$k], $v);
}

return $leftSide;
}

protected function allowPlaceholders(): bool
{
return false;
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;




interface ConfigurableInterface
{



public function configure(DefinitionConfigurator $definition): void;
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;









class VariableNode extends BaseNode implements PrototypeNodeInterface
{
protected $defaultValueSet = false;
protected $defaultValue;
protected $allowEmptyValue = true;




public function setDefaultValue(mixed $value)
{
$this->defaultValueSet = true;
$this->defaultValue = $value;
}

public function hasDefaultValue(): bool
{
return $this->defaultValueSet;
}

public function getDefaultValue(): mixed
{
$v = $this->defaultValue;

return $v instanceof \Closure ? $v() : $v;
}








public function setAllowEmptyValue(bool $boolean)
{
$this->allowEmptyValue = $boolean;
}




public function setName(string $name)
{
$this->name = $name;
}




protected function validateType(mixed $value)
{
}

protected function finalizeValue(mixed $value): mixed
{


if (!$this->allowEmptyValue && $this->isHandlingPlaceholder() && $this->finalValidationClosures) {
$e = new InvalidConfigurationException(\sprintf('The path "%s" cannot contain an environment variable when empty values are not allowed by definition and are validated.', $this->getPath()));
if ($hint = $this->getInfo()) {
$e->addHint($hint);
}
$e->setPath($this->getPath());

throw $e;
}

if (!$this->allowEmptyValue && $this->isValueEmpty($value)) {
$ex = new InvalidConfigurationException(\sprintf('The path "%s" cannot contain an empty value, but got %s.', $this->getPath(), json_encode($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}

return $value;
}

protected function normalizeValue(mixed $value): mixed
{
return $value;
}

protected function mergeValues(mixed $leftSide, mixed $rightSide): mixed
{
return $rightSide;
}










protected function isValueEmpty(mixed $value): bool
{
return empty($value);
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;






class NumericNode extends ScalarNode
{
protected $min;
protected $max;

public function __construct(?string $name, ?NodeInterface $parent = null, int|float|null $min = null, int|float|null $max = null, string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR)
{
parent::__construct($name, $parent, $pathSeparator);
$this->min = $min;
$this->max = $max;
}

protected function finalizeValue(mixed $value): mixed
{
$value = parent::finalizeValue($value);

$errorMsg = null;
if (isset($this->min) && $value < $this->min) {
$errorMsg = \sprintf('The value %s is too small for path "%s". Should be greater than or equal to %s', $value, $this->getPath(), $this->min);
}
if (isset($this->max) && $value > $this->max) {
$errorMsg = \sprintf('The value %s is too big for path "%s". Should be less than or equal to %s', $value, $this->getPath(), $this->max);
}
if (isset($errorMsg)) {
$ex = new InvalidConfigurationException($errorMsg);
$ex->setPath($this->getPath());
throw $ex;
}

return $value;
}

protected function isValueEmpty(mixed $value): bool
{

return false;
}
}
<?php










namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;






class FloatNode extends NumericNode
{



protected function validateType(mixed $value)
{

if (\is_int($value)) {
$value = (float) $value;
}

if (!\is_float($value)) {
$ex = new InvalidTypeException(\sprintf('Invalid type for path "%s". Expected "float", but got "%s".', $this->getPath(), get_debug_type($value)));
if ($hint = $this->getInfo()) {
$ex->addHint($hint);
}
$ex->setPath($this->getPath());

throw $ex;
}
}

protected function getValidPlaceholderTypes(): array
{
return ['float'];
}
}
<?php










namespace Symfony\Component\Config\Definition\Dumper;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;
use Symfony\Component\Yaml\Inline;






class YamlReferenceDumper
{
private ?string $reference = null;




public function dump(ConfigurationInterface $configuration)
{
return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree());
}




public function dumpAtPath(ConfigurationInterface $configuration, string $path)
{
$rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree();

foreach (explode('.', $path) as $step) {
if (!$node instanceof ArrayNode) {
throw new \UnexpectedValueException(\sprintf('Unable to find node at path "%s.%s".', $rootNode->getName(), $path));
}


$children = $node instanceof PrototypedArrayNode ? $this->getPrototypeChildren($node) : $node->getChildren();

foreach ($children as $child) {
if ($child->getName() === $step) {
$node = $child;

continue 2;
}
}

throw new \UnexpectedValueException(\sprintf('Unable to find node at path "%s.%s".', $rootNode->getName(), $path));
}

return $this->dumpNode($node);
}




public function dumpNode(NodeInterface $node)
{
$this->reference = '';
$this->writeNode($node);
$ref = $this->reference;
$this->reference = null;

return $ref;
}

private function writeNode(NodeInterface $node, ?NodeInterface $parentNode = null, int $depth = 0, bool $prototypedArray = false): void
{
$comments = [];
$default = '';
$defaultArray = null;
$children = null;
$example = null;
if ($node instanceof BaseNode) {
$example = $node->getExample();
}


if ($node instanceof ArrayNode) {
$children = $node->getChildren();

if ($node instanceof PrototypedArrayNode) {
$children = $this->getPrototypeChildren($node);
}

if (!$children && !($node->hasDefaultValue() && \count($defaultArray = $node->getDefaultValue()))) {
$default = '[]';
}
} elseif ($node instanceof EnumNode) {
$comments[] = 'One of '.$node->getPermissibleValues('; ');
$default = $node->hasDefaultValue() ? Inline::dump($node->getDefaultValue()) : '~';
} else {
$default = '~';

if ($node->hasDefaultValue()) {
$default = $node->getDefaultValue();

if (\is_array($default)) {
if (\count($defaultArray = $node->getDefaultValue())) {
$default = '';
} elseif (!\is_array($example)) {
$default = '[]';
}
} else {
$default = Inline::dump($default);
}
}
}


if ($node->isRequired()) {
$comments[] = 'Required';
}


if ($node instanceof BaseNode && $node->isDeprecated()) {
$deprecation = $node->getDeprecation($node->getName(), $parentNode ? $parentNode->getPath() : $node->getPath());
$comments[] = \sprintf('Deprecated (%s)', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']);
}


if ($example && !\is_array($example)) {
$comments[] = 'Example: '.Inline::dump($example);
}

$default = '' != (string) $default ? ' '.$default : '';
$comments = \count($comments) ? '# '.implode(', ', $comments) : '';

$key = $prototypedArray ? '-' : $node->getName().':';
$text = rtrim(\sprintf('%-21s%s %s', $key, $default, $comments), ' ');

if ($node instanceof BaseNode && $info = $node->getInfo()) {
$this->writeLine('');

$info = str_replace("\n", \sprintf("\n%".($depth * 4).'s# ', ' '), $info);
$this->writeLine('# '.$info, $depth * 4);
}

$this->writeLine($text, $depth * 4);


if ($defaultArray) {
$this->writeLine('');

$message = \count($defaultArray) > 1 ? 'Defaults' : 'Default';

$this->writeLine('# '.$message.':', $depth * 4 + 4);

$this->writeArray($defaultArray, $depth + 1);
}

if (\is_array($example)) {
$this->writeLine('');

$message = \count($example) > 1 ? 'Examples' : 'Example';

$this->writeLine('# '.$message.':', $depth * 4 + 4);

$this->writeArray(array_map(Inline::dump(...), $example), $depth + 1, true);
}

if ($children) {
foreach ($children as $childNode) {
$this->writeNode($childNode, $node, $depth + 1, $node instanceof PrototypedArrayNode && !$node->getKeyAttribute());
}
}
}




private function writeLine(string $text, int $indent = 0): void
{
$indent = \strlen($text) + $indent;
$format = '%'.$indent.'s';

$this->reference .= \sprintf($format, $text)."\n";
}

private function writeArray(array $array, int $depth, bool $asComment = false): void
{
$isIndexed = array_is_list($array);

foreach ($array as $key => $value) {
if (\is_array($value)) {
$val = '';
} else {
$val = $value;
}

$prefix = $asComment ? '# ' : '';

if ($isIndexed) {
$this->writeLine($prefix.'- '.$val, $depth * 4);
} else {
$this->writeLine(\sprintf('%s%-20s %s', $prefix, $key.':', $val), $depth * 4);
}

if (\is_array($value)) {
$this->writeArray($value, $depth + 1, $asComment);
}
}
}

private function getPrototypeChildren(PrototypedArrayNode $node): array
{
$prototype = $node->getPrototype();
$key = $node->getKeyAttribute();


if (!$key && !$prototype instanceof ArrayNode) {
return $node->getChildren();
}

if ($prototype instanceof ArrayNode) {
$keyNode = new ArrayNode($key, $node);
$children = $prototype->getChildren();

if ($prototype instanceof PrototypedArrayNode && $prototype->getKeyAttribute()) {
$children = $this->getPrototypeChildren($prototype);
}


foreach ($children as $childNode) {
$keyNode->addChild($childNode);
}
} else {
$keyNode = new ScalarNode($key, $node);
}

$info = 'Prototype';
if (null !== $prototype->getInfo()) {
$info .= ': '.$prototype->getInfo();
}
$keyNode->setInfo($info);

return [$key => $keyNode];
}
}
<?php










namespace Symfony\Component\Config\Definition\Dumper;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\Config\Definition\BooleanNode;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\FloatNode;
use Symfony\Component\Config\Definition\IntegerNode;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;






class XmlReferenceDumper
{
private ?string $reference = null;




public function dump(ConfigurationInterface $configuration, ?string $namespace = null)
{
return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace);
}




public function dumpNode(NodeInterface $node, ?string $namespace = null)
{
$this->reference = '';
$this->writeNode($node, 0, true, $namespace);
$ref = $this->reference;
$this->reference = null;

return $ref;
}

private function writeNode(NodeInterface $node, int $depth = 0, bool $root = false, ?string $namespace = null): void
{
$rootName = ($root ? 'config' : $node->getName());
$rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null));


if ($node->getParent()) {
$remapping = array_filter($node->getParent()->getXmlRemappings(), fn (array $mapping) => $rootName === $mapping[1]);

if (\count($remapping)) {
[$singular] = current($remapping);
$rootName = $singular;
}
}
$rootName = str_replace('_', '-', $rootName);

$rootAttributes = [];
$rootAttributeComments = [];
$rootChildren = [];
$rootComments = [];

if ($node instanceof ArrayNode) {
$children = $node->getChildren();


if ($rootInfo = $node->getInfo()) {
$rootComments[] = $rootInfo;
}

if ($rootNamespace) {
$rootComments[] = 'Namespace: '.$rootNamespace;
}


if ($node instanceof PrototypedArrayNode) {
$prototype = $node->getPrototype();

$info = 'prototype';
if (null !== $prototype->getInfo()) {
$info .= ': '.$prototype->getInfo();
}
array_unshift($rootComments, $info);

if ($key = $node->getKeyAttribute()) {
$rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key;
}

if ($prototype instanceof PrototypedArrayNode) {
$prototype->setName($key ?? '');
$children = [$key => $prototype];
} elseif ($prototype instanceof ArrayNode) {
$children = $prototype->getChildren();
} else {
if ($prototype->hasDefaultValue()) {
$prototypeValue = $prototype->getDefaultValue();
} else {
$prototypeValue = match ($prototype::class) {
ScalarNode::class => 'scalar value',
FloatNode::class,
IntegerNode::class => 'numeric value',
BooleanNode::class => 'true|false',
EnumNode::class => $prototype->getPermissibleValues('|'),
default => 'value',
};
}
}
}


foreach ($children as $child) {
if ($child instanceof ArrayNode) {

$rootChildren[] = $child;

continue;
}




$name = str_replace('_', '-', $child->getName());
$value = '%%%%not_defined%%%%'; 


$comments = [];
if ($child instanceof BaseNode && $info = $child->getInfo()) {
$comments[] = $info;
}

if ($child instanceof BaseNode && $example = $child->getExample()) {
$comments[] = 'Example: '.(\is_array($example) ? implode(', ', $example) : $example);
}

if ($child->isRequired()) {
$comments[] = 'Required';
}

if ($child instanceof BaseNode && $child->isDeprecated()) {
$deprecation = $child->getDeprecation($child->getName(), $node->getPath());
$comments[] = \sprintf('Deprecated (%s)', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']);
}

if ($child instanceof EnumNode) {
$comments[] = 'One of '.$child->getPermissibleValues('; ');
}

if (\count($comments)) {
$rootAttributeComments[$name] = implode(";\n", $comments);
}


if ($child->hasDefaultValue()) {
$value = $child->getDefaultValue();
}


$rootAttributes[$name] = $value;
}
}




if (\count($rootComments)) {
foreach ($rootComments as $comment) {
$this->writeLine('<!-- '.$comment.' -->', $depth);
}
}


if (\count($rootAttributeComments)) {
foreach ($rootAttributeComments as $attrName => $comment) {
$commentDepth = $depth + 4 + \strlen($attrName) + 2;
$commentLines = explode("\n", $comment);
$multiline = (\count($commentLines) > 1);
$comment = implode(\PHP_EOL.str_repeat(' ', $commentDepth), $commentLines);

if ($multiline) {
$this->writeLine('<!--', $depth);
$this->writeLine($attrName.': '.$comment, $depth + 4);
$this->writeLine('-->', $depth);
} else {
$this->writeLine('<!-- '.$attrName.': '.$comment.' -->', $depth);
}
}
}


$rootIsVariablePrototype = isset($prototypeValue);
$rootIsEmptyTag = (0 === \count($rootChildren) && !$rootIsVariablePrototype);
$rootOpenTag = '<'.$rootName;
if (1 >= ($attributesCount = \count($rootAttributes))) {
if (1 === $attributesCount) {
$rootOpenTag .= \sprintf(' %s="%s"', current(array_keys($rootAttributes)), $this->writeValue(current($rootAttributes)));
}

$rootOpenTag .= $rootIsEmptyTag ? ' />' : '>';

if ($rootIsVariablePrototype) {
$rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
}

$this->writeLine($rootOpenTag, $depth);
} else {
$this->writeLine($rootOpenTag, $depth);

$i = 1;

foreach ($rootAttributes as $attrName => $attrValue) {
$attr = \sprintf('%s="%s"', $attrName, $this->writeValue($attrValue));

$this->writeLine($attr, $depth + 4);

if ($attributesCount === $i++) {
$this->writeLine($rootIsEmptyTag ? '/>' : '>', $depth);

if ($rootIsVariablePrototype) {
$rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
}
}
}
}


foreach ($rootChildren as $child) {
$this->writeLine('');
$this->writeNode($child, $depth + 4);
}


if (!$rootIsEmptyTag && !$rootIsVariablePrototype) {
$this->writeLine('');

$rootEndTag = '</'.$rootName.'>';
$this->writeLine($rootEndTag, $depth);
}
}




private function writeLine(string $text, int $indent = 0): void
{
$indent = \strlen($text) + $indent;
$format = '%'.$indent.'s';

$this->reference .= \sprintf($format, $text).\PHP_EOL;
}




private function writeValue(mixed $value): string
{
if ('%%%%not_defined%%%%' === $value) {
return '';
}

if (\is_string($value) || is_numeric($value)) {
return $value;
}

if (false === $value) {
return 'false';
}

if (true === $value) {
return 'true';
}

if (null === $value) {
return 'null';
}

if (empty($value)) {
return '';
}

if (\is_array($value)) {
return implode(',', $value);
}

return '';
}
}
<?php










namespace Symfony\Component\Config\Definition\Loader;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\DependencyInjection\ContainerBuilder;








class DefinitionFileLoader extends FileLoader
{
public function __construct(
private TreeBuilder $treeBuilder,
FileLocatorInterface $locator,
private ?ContainerBuilder $container = null,
) {
parent::__construct($locator);
}

public function load(mixed $resource, ?string $type = null): mixed
{

$loader = $this;

$path = $this->locator->locate($resource);
$this->setCurrentDir(\dirname($path));
$this->container?->fileExists($path);


$load = \Closure::bind(static function ($file) use ($loader) {
return include $file;
}, null, ProtectedDefinitionFileLoader::class);

$callback = $load($path);

if (\is_object($callback) && \is_callable($callback)) {
$this->executeCallback($callback, new DefinitionConfigurator($this->treeBuilder, $this, $path, $resource), $path);
}

return null;
}

public function supports(mixed $resource, ?string $type = null): bool
{
if (!\is_string($resource)) {
return false;
}

if (null === $type && 'php' === pathinfo($resource, \PATHINFO_EXTENSION)) {
return true;
}

return 'php' === $type;
}

private function executeCallback(callable $callback, DefinitionConfigurator $configurator, string $path): void
{
$callback = $callback(...);

$arguments = [];
$r = new \ReflectionFunction($callback);

foreach ($r->getParameters() as $parameter) {
$reflectionType = $parameter->getType();

if (!$reflectionType instanceof \ReflectionNamedType) {
throw new \InvalidArgumentException(\sprintf('Could not resolve argument "$%s" for "%s". You must typehint it (for example with "%s").', $parameter->getName(), $path, DefinitionConfigurator::class));
}

$arguments[] = match ($reflectionType->getName()) {
DefinitionConfigurator::class => $configurator,
TreeBuilder::class => $this->treeBuilder,
FileLoader::class, self::class => $this,
};
}

$callback(...$arguments);
}
}




final class ProtectedDefinitionFileLoader extends DefinitionFileLoader
{
}
<?php










namespace Symfony\Component\Config;








interface ConfigCacheFactoryInterface
{






public function cache(string $file, callable $callable): ConfigCacheInterface;
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;







class ResourceCheckerConfigCache implements ConfigCacheInterface
{
private string $file;




private iterable $resourceCheckers;





public function __construct(string $file, iterable $resourceCheckers = [])
{
$this->file = $file;
$this->resourceCheckers = $resourceCheckers;
}

public function getPath(): string
{
return $this->file;
}










public function isFresh(): bool
{
if (!is_file($this->file)) {
return false;
}

if ($this->resourceCheckers instanceof \Traversable && !$this->resourceCheckers instanceof \Countable) {
$this->resourceCheckers = iterator_to_array($this->resourceCheckers);
}

if (!\count($this->resourceCheckers)) {
return true; 
}

$metadata = $this->getMetaFile();

if (!is_file($metadata)) {
return false;
}

$meta = $this->safelyUnserialize($metadata);

if (false === $meta) {
return false;
}

$time = filemtime($this->file);

foreach ($meta as $resource) {
foreach ($this->resourceCheckers as $checker) {
if (!$checker->supports($resource)) {
continue; 
}
if ($checker->isFresh($resource, $time)) {
break; 
}

return false; 
}

}

return true;
}











public function write(string $content, ?array $metadata = null)
{
$mode = 0666;
$umask = umask();
$filesystem = new Filesystem();
$filesystem->dumpFile($this->file, $content);
try {
$filesystem->chmod($this->file, $mode, $umask);
} catch (IOException) {

}

if (null !== $metadata) {
$filesystem->dumpFile($this->getMetaFile(), serialize($metadata));
try {
$filesystem->chmod($this->getMetaFile(), $mode, $umask);
} catch (IOException) {

}
}

if (\function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL)) {
@opcache_invalidate($this->file, true);
}
}




private function getMetaFile(): string
{
return $this->file.'.meta';
}

private function safelyUnserialize(string $file): mixed
{
$meta = false;
$content = file_get_contents($file);
$signalingException = new \UnexpectedValueException();
$prevUnserializeHandler = ini_set('unserialize_callback_func', self::class.'::handleUnserializeCallback');
$prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler, $signalingException) {
if (__FILE__ === $file && !\in_array($type, [\E_DEPRECATED, \E_USER_DEPRECATED], true)) {
throw $signalingException;
}

return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false;
});

try {
$meta = unserialize($content);
} catch (\Throwable $e) {
if ($e !== $signalingException) {
throw $e;
}
} finally {
restore_error_handler();
ini_set('unserialize_callback_func', $prevUnserializeHandler);
}

return $meta;
}




public static function handleUnserializeCallback(string $class): void
{
trigger_error('Class not found: '.$class);
}
}
<?php










namespace Symfony\Component\Config;

use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;






class FileLocator implements FileLocatorInterface
{
protected $paths;




public function __construct(string|array $paths = [])
{
$this->paths = (array) $paths;
}

/**
@psalm-return($first is true ? string : string[])


*/
public function locate(string $name, ?string $currentPath = null, bool $first = true)
{
if ('' === $name) {
throw new \InvalidArgumentException('An empty file name is not valid to be located.');
}

if ($this->isAbsolutePath($name)) {
if (!file_exists($name)) {
throw new FileLocatorFileNotFoundException(\sprintf('The file "%s" does not exist.', $name), 0, null, [$name]);
}

return $name;
}

$paths = $this->paths;

if (null !== $currentPath) {
array_unshift($paths, $currentPath);
}

$paths = array_unique($paths);
$filepaths = $notfound = [];

foreach ($paths as $path) {
if (@file_exists($file = $path.\DIRECTORY_SEPARATOR.$name)) {
if (true === $first) {
return $file;
}
$filepaths[] = $file;
} else {
$notfound[] = $file;
}
}

if (!$filepaths) {
throw new FileLocatorFileNotFoundException(\sprintf('The file "%s" does not exist (in: "%s").', $name, implode('", "', $paths)), 0, null, $notfound);
}

return $filepaths;
}




private function isAbsolutePath(string $file): bool
{
if ('/' === $file[0] || '\\' === $file[0]
|| (\strlen($file) > 3 && ctype_alpha($file[0])
&& ':' === $file[1]
&& ('\\' === $file[2] || '/' === $file[2])
)
|| parse_url($file, \PHP_URL_SCHEME)
|| str_starts_with($file, 'phar:///') 
) {
return true;
}

return false;
}
}
<?php










namespace Symfony\Component\Config\Loader;






class GlobFileLoader extends FileLoader
{
public function load(mixed $resource, ?string $type = null): mixed
{
return $this->import($resource);
}

public function supports(mixed $resource, ?string $type = null): bool
{
return 'glob' === $type;
}
}
<?php










namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;
use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
use Symfony\Component\Config\Exception\LoaderLoadException;
use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Config\Resource\FileExistenceResource;
use Symfony\Component\Config\Resource\GlobResource;






abstract class FileLoader extends Loader
{
protected static $loading = [];

protected $locator;

private ?string $currentDir = null;

public function __construct(FileLocatorInterface $locator, ?string $env = null)
{
$this->locator = $locator;
parent::__construct($env);
}






public function setCurrentDir(string $dir)
{
$this->currentDir = $dir;
}




public function getLocator(): FileLocatorInterface
{
return $this->locator;
}
















public function import(mixed $resource, ?string $type = null, bool $ignoreErrors = false, ?string $sourceResource = null, string|array|null $exclude = null)
{
if (\is_string($resource) && \strlen($resource) !== ($i = strcspn($resource, '*?{[')) && !str_contains($resource, "\n")) {
$excluded = [];
foreach ((array) $exclude as $pattern) {
foreach ($this->glob($pattern, true, $_, false, true) as $path => $info) {

$excluded[rtrim(str_replace('\\', '/', $path), '/')] = true;
}
}

$ret = [];
$isSubpath = 0 !== $i && str_contains(substr($resource, 0, $i), '/');
foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath, false, $excluded) as $path => $info) {
if (null !== $res = $this->doImport($path, 'glob' === $type ? null : $type, $ignoreErrors, $sourceResource)) {
$ret[] = $res;
}
$isSubpath = true;
}

if ($isSubpath) {
return isset($ret[1]) ? $ret : ($ret[0] ?? null);
}
}

return $this->doImport($resource, $type, $ignoreErrors, $sourceResource);
}




protected function glob(string $pattern, bool $recursive, array|GlobResource|null &$resource = null, bool $ignoreErrors = false, bool $forExclusion = false, array $excluded = []): iterable
{
if (\strlen($pattern) === $i = strcspn($pattern, '*?{[')) {
$prefix = $pattern;
$pattern = '';
} elseif (0 === $i || !str_contains(substr($pattern, 0, $i), '/')) {
$prefix = '.';
$pattern = '/'.$pattern;
} else {
$prefix = \dirname(substr($pattern, 0, 1 + $i));
$pattern = substr($pattern, \strlen($prefix));
}

try {
$prefix = $this->locator->locate($prefix, $this->currentDir, true);
} catch (FileLocatorFileNotFoundException $e) {
if (!$ignoreErrors) {
throw $e;
}

$resource = [];
foreach ($e->getPaths() as $path) {
$resource[] = new FileExistenceResource($path);
}

return;
}
$resource = new GlobResource($prefix, $pattern, $recursive, $forExclusion, $excluded);

yield from $resource;
}

private function doImport(mixed $resource, ?string $type = null, bool $ignoreErrors = false, ?string $sourceResource = null): mixed
{
try {
$loader = $this->resolve($resource, $type);

if ($loader instanceof DirectoryAwareLoaderInterface) {
$loader = $loader->forDirectory($this->currentDir);
}

if (!$loader instanceof self) {
return $loader->load($resource, $type);
}

if (null !== $this->currentDir) {
$resource = $loader->getLocator()->locate($resource, $this->currentDir, false);
}

$resources = \is_array($resource) ? $resource : [$resource];
for ($i = 0; $i < $resourcesCount = \count($resources); ++$i) {
if (isset(self::$loading[$resources[$i]])) {
if ($i == $resourcesCount - 1) {
throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading));
}
} else {
$resource = $resources[$i];
break;
}
}
self::$loading[$resource] = true;

try {
$ret = $loader->load($resource, $type);
} finally {
unset(self::$loading[$resource]);
}

return $ret;
} catch (FileLoaderImportCircularReferenceException $e) {
throw $e;
} catch (\Exception $e) {
if (!$ignoreErrors) {

if ($e instanceof LoaderLoadException) {
throw $e;
}

throw new LoaderLoadException($resource, $sourceResource, 0, $e, $type);
}
}

return null;
}
}
<?php










namespace Symfony\Component\Config\Loader;






interface LoaderInterface
{







public function load(mixed $resource, ?string $type = null);








public function supports(mixed $resource, ?string $type = null);






public function getResolver();






public function setResolver(LoaderResolverInterface $resolver);
}
<?php










namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\Exception\LoaderLoadException;









class DelegatingLoader extends Loader
{
public function __construct(LoaderResolverInterface $resolver)
{
$this->resolver = $resolver;
}

public function load(mixed $resource, ?string $type = null): mixed
{
if (false === $loader = $this->resolver->resolve($resource, $type)) {
throw new LoaderLoadException($resource, null, 0, null, $type);
}

return $loader->load($resource, $type);
}

public function supports(mixed $resource, ?string $type = null): bool
{
return false !== $this->resolver->resolve($resource, $type);
}
}
<?php










namespace Symfony\Component\Config\Loader;






class ParamConfigurator
{
private string $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function __toString(): string
{
return '%'.$this->name.'%';
}
}
<?php










namespace Symfony\Component\Config\Loader;






interface DirectoryAwareLoaderInterface
{
public function forDirectory(string $currentDirectory): static;
}
<?php










namespace Symfony\Component\Config\Loader;









class LoaderResolver implements LoaderResolverInterface
{



private array $loaders = [];




public function __construct(array $loaders = [])
{
foreach ($loaders as $loader) {
$this->addLoader($loader);
}
}

public function resolve(mixed $resource, ?string $type = null): LoaderInterface|false
{
foreach ($this->loaders as $loader) {
if ($loader->supports($resource, $type)) {
return $loader;
}
}

return false;
}




public function addLoader(LoaderInterface $loader)
{
$this->loaders[] = $loader;
$loader->setResolver($this);
}






public function getLoaders(): array
{
return $this->loaders;
}
}
<?php










namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\Exception\LoaderLoadException;






abstract class Loader implements LoaderInterface
{
protected $resolver;
protected $env;

public function __construct(?string $env = null)
{
$this->env = $env;
}

public function getResolver(): LoaderResolverInterface
{
return $this->resolver;
}




public function setResolver(LoaderResolverInterface $resolver)
{
$this->resolver = $resolver;
}






public function import(mixed $resource, ?string $type = null)
{
return $this->resolve($resource, $type)->load($resource, $type);
}






public function resolve(mixed $resource, ?string $type = null): LoaderInterface
{
if ($this->supports($resource, $type)) {
return $this;
}

$loader = null === $this->resolver ? false : $this->resolver->resolve($resource, $type);

if (false === $loader) {
throw new LoaderLoadException($resource, null, 0, null, $type);
}

return $loader;
}
}
<?php










namespace Symfony\Component\Config\Loader;






interface LoaderResolverInterface
{





public function resolve(mixed $resource, ?string $type = null): LoaderInterface|false;
}
<?php










namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;

















class UnicodeString extends AbstractUnicodeString
{
public function __construct(string $string = '')
{
if ('' === $string || normalizer_is_normalized($this->string = $string)) {
return;
}

if (false === $string = normalizer_normalize($string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$this->string = $string;
}

public function append(string ...$suffix): static
{
$str = clone $this;
$str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix));

if (normalizer_is_normalized($str->string)) {
return $str;
}

if (false === $string = normalizer_normalize($str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$str->string = $string;

return $str;
}

public function chunk(int $length = 1): array
{
if (1 > $length) {
throw new InvalidArgumentException('The chunk length must be greater than zero.');
}

if ('' === $this->string) {
return [];
}

$rx = '/(';
while (65535 < $length) {
$rx .= '\X{65535}';
$length -= 65535;
}
$rx .= '\X{'.$length.'})/u';

$str = clone $this;
$chunks = [];

foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) {
$str->string = $chunk;
$chunks[] = clone $str;
}

return $chunks;
}

public function endsWith(string|iterable|AbstractString $suffix): bool
{
if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
} elseif (!\is_string($suffix)) {
return parent::endsWith($suffix);
}

$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
normalizer_is_normalized($suffix, $form) ?: $suffix = normalizer_normalize($suffix, $form);

if ('' === $suffix || false === $suffix) {
return false;
}

if ($this->ignoreCase) {
return 0 === mb_stripos(grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8');
}

return $suffix === grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix));
}

public function equalsTo(string|iterable|AbstractString $string): bool
{
if ($string instanceof AbstractString) {
$string = $string->string;
} elseif (!\is_string($string)) {
return parent::equalsTo($string);
}

$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
normalizer_is_normalized($string, $form) ?: $string = normalizer_normalize($string, $form);

if ('' !== $string && false !== $string && $this->ignoreCase) {
return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');
}

return $string === $this->string;
}

public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOf($needle, $offset);
}

$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);

if ('' === $needle || false === $needle) {
return null;
}

try {
$i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset);
} catch (\ValueError) {
return null;
}

return false === $i ? null : $i;
}

public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOfLast($needle, $offset);
}

$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
normalizer_is_normalized($needle, $form) ?: $needle = normalizer_normalize($needle, $form);

if ('' === $needle || false === $needle) {
return null;
}

$string = $this->string;

if (0 > $offset) {

if (0 > $offset += grapheme_strlen($needle)) {
$string = grapheme_substr($string, 0, $offset);
}
$offset = 0;
}

$i = $this->ignoreCase ? grapheme_strripos($string, $needle, $offset) : grapheme_strrpos($string, $needle, $offset);

return false === $i ? null : $i;
}

public function join(array $strings, ?string $lastGlue = null): static
{
$str = parent::join($strings, $lastGlue);
normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

return $str;
}

public function length(): int
{
return grapheme_strlen($this->string);
}

public function normalize(int $form = self::NFC): static
{
$str = clone $this;

if (\in_array($form, [self::NFC, self::NFKC], true)) {
normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);
} elseif (!\in_array($form, [self::NFD, self::NFKD], true)) {
throw new InvalidArgumentException('Unsupported normalization form.');
} elseif (!normalizer_is_normalized($str->string, $form)) {
$str->string = normalizer_normalize($str->string, $form);
$str->ignoreCase = null;
}

return $str;
}

public function prepend(string ...$prefix): static
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;

if (normalizer_is_normalized($str->string)) {
return $str;
}

if (false === $string = normalizer_normalize($str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$str->string = $string;

return $str;
}

public function replace(string $from, string $to): static
{
$str = clone $this;
normalizer_is_normalized($from) ?: $from = normalizer_normalize($from);

if ('' !== $from && false !== $from) {
$tail = $str->string;
$result = '';
$indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';

while ('' !== $tail && false !== $i = $indexOf($tail, $from)) {
$slice = grapheme_substr($tail, 0, $i);
$result .= $slice.$to;
$tail = substr($tail, \strlen($slice) + \strlen($from));
}

$str->string = $result.$tail;

if (normalizer_is_normalized($str->string)) {
return $str;
}

if (false === $string = normalizer_normalize($str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$str->string = $string;
}

return $str;
}

public function replaceMatches(string $fromRegexp, string|callable $to): static
{
$str = parent::replaceMatches($fromRegexp, $to);
normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);

return $str;
}

public function slice(int $start = 0, ?int $length = null): static
{
$str = clone $this;

$str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647);

return $str;
}

public function splice(string $replacement, int $start = 0, ?int $length = null): static
{
$str = clone $this;

$start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0;
$length = $length ? \strlen(grapheme_substr($this->string, $start, $length)) : $length;
$str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647);

if (normalizer_is_normalized($str->string)) {
return $str;
}

if (false === $string = normalizer_normalize($str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$str->string = $string;

return $str;
}

public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array
{
if (1 > $limit ??= 2147483647) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}

if ('' === $delimiter) {
throw new InvalidArgumentException('Split delimiter is empty.');
}

if (null !== $flags) {
return parent::split($delimiter.'u', $limit, $flags);
}

normalizer_is_normalized($delimiter) ?: $delimiter = normalizer_normalize($delimiter);

if (false === $delimiter) {
throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');
}

$str = clone $this;
$tail = $this->string;
$chunks = [];
$indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos';

while (1 < $limit && false !== $i = $indexOf($tail, $delimiter)) {
$str->string = grapheme_substr($tail, 0, $i);
$chunks[] = clone $str;
$tail = substr($tail, \strlen($str->string) + \strlen($delimiter));
--$limit;
}

$str->string = $tail;
$chunks[] = clone $str;

return $chunks;
}

public function startsWith(string|iterable|AbstractString $prefix): bool
{
if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
} elseif (!\is_string($prefix)) {
return parent::startsWith($prefix);
}

$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
normalizer_is_normalized($prefix, $form) ?: $prefix = normalizer_normalize($prefix, $form);

if ('' === $prefix || false === $prefix) {
return false;
}

if ($this->ignoreCase) {
return 0 === mb_stripos(grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8');
}

return $prefix === grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES);
}

public function __wakeup(): void
{
if (!\is_string($this->string)) {
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);
}

public function __clone()
{
if (null === $this->ignoreCase) {
normalizer_is_normalized($this->string) ?: $this->string = normalizer_normalize($this->string);
}

$this->ignoreCase = false;
}
}
Copyright (c) 2019-present 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.
<?php










namespace Symfony\Component\String;






class LazyString implements \Stringable, \JsonSerializable
{
private \Closure|string $value;




public static function fromCallable(callable|array $callback, mixed ...$arguments): static
{
if (\is_array($callback) && !\is_callable($callback) && !(($callback[0] ?? null) instanceof \Closure || 2 < \count($callback))) {
throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, '['.implode(', ', array_map('get_debug_type', $callback)).']'));
}

$lazyString = new static();
$lazyString->value = static function () use (&$callback, &$arguments): string {
static $value;

if (null !== $arguments) {
if (!\is_callable($callback)) {
$callback[0] = $callback[0]();
$callback[1] ??= '__invoke';
}
$value = $callback(...$arguments);
$callback = !\is_scalar($value) && !$value instanceof \Stringable ? self::getPrettyName($callback) : 'callable';
$arguments = null;
}

return $value ?? '';
};

return $lazyString;
}

public static function fromStringable(string|int|float|bool|\Stringable $value): static
{
if (\is_object($value)) {
return static::fromCallable($value->__toString(...));
}

$lazyString = new static();
$lazyString->value = (string) $value;

return $lazyString;
}




final public static function isStringable(mixed $value): bool
{
return \is_string($value) || $value instanceof \Stringable || \is_scalar($value);
}






final public static function resolve(\Stringable|string|int|float|bool $value): string
{
return $value;
}

public function __toString(): string
{
if (\is_string($this->value)) {
return $this->value;
}

try {
return $this->value = ($this->value)();
} catch (\Throwable $e) {
if (\TypeError::class === $e::class && __FILE__ === $e->getFile()) {
$type = explode(', ', $e->getMessage());
$type = substr(array_pop($type), 0, -\strlen(' returned'));
$r = new \ReflectionFunction($this->value);
$callback = $r->getStaticVariables()['callback'];

$e = new \TypeError(\sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type));
}

throw $e;
}
}

public function __sleep(): array
{
$this->__toString();

return ['value'];
}

public function jsonSerialize(): string
{
return $this->__toString();
}

private function __construct()
{
}

private static function getPrettyName(callable $callback): string
{
if (\is_string($callback)) {
return $callback;
}

if (\is_array($callback)) {
$class = \is_object($callback[0]) ? get_debug_type($callback[0]) : $callback[0];
$method = $callback[1];
} elseif ($callback instanceof \Closure) {
$r = new \ReflectionFunction($callback);

if ($r->isAnonymous() || !$class = $r->getClosureCalledClass()) {
return $r->name;
}

$class = $class->name;
$method = $r->name;
} else {
$class = get_debug_type($callback);
$method = '__invoke';
}

return $class.'::'.$method;
}
}
<?php










namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;









class CodePointString extends AbstractUnicodeString
{
public function __construct(string $string = '')
{
if ('' !== $string && !preg_match('//u', $string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$this->string = $string;
}

public function append(string ...$suffix): static
{
$str = clone $this;
$str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);

if (!preg_match('//u', $str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

return $str;
}

public function chunk(int $length = 1): array
{
if (1 > $length) {
throw new InvalidArgumentException('The chunk length must be greater than zero.');
}

if ('' === $this->string) {
return [];
}

$rx = '/(';
while (65535 < $length) {
$rx .= '.{65535}';
$length -= 65535;
}
$rx .= '.{'.$length.'})/us';

$str = clone $this;
$chunks = [];

foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) {
$str->string = $chunk;
$chunks[] = clone $str;
}

return $chunks;
}

public function codePointsAt(int $offset): array
{
$str = $offset ? $this->slice($offset, 1) : $this;

return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')];
}

public function endsWith(string|iterable|AbstractString $suffix): bool
{
if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
} elseif (!\is_string($suffix)) {
return parent::endsWith($suffix);
}

if ('' === $suffix || !preg_match('//u', $suffix)) {
return false;
}

if ($this->ignoreCase) {
return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string);
}

return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix));
}

public function equalsTo(string|iterable|AbstractString $string): bool
{
if ($string instanceof AbstractString) {
$string = $string->string;
} elseif (!\is_string($string)) {
return parent::equalsTo($string);
}

if ('' !== $string && $this->ignoreCase) {
return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');
}

return $string === $this->string;
}

public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOf($needle, $offset);
}

if ('' === $needle) {
return null;
}

$i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8');

return false === $i ? null : $i;
}

public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOfLast($needle, $offset);
}

if ('' === $needle) {
return null;
}

$i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8');

return false === $i ? null : $i;
}

public function length(): int
{
return mb_strlen($this->string, 'UTF-8');
}

public function prepend(string ...$prefix): static
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;

if (!preg_match('//u', $str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

return $str;
}

public function replace(string $from, string $to): static
{
$str = clone $this;

if ('' === $from || !preg_match('//u', $from)) {
return $str;
}

if ('' !== $to && !preg_match('//u', $to)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

if ($this->ignoreCase) {
$str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string));
} else {
$str->string = str_replace($from, $to, $this->string);
}

return $str;
}

public function slice(int $start = 0, ?int $length = null): static
{
$str = clone $this;
$str->string = mb_substr($this->string, $start, $length, 'UTF-8');

return $str;
}

public function splice(string $replacement, int $start = 0, ?int $length = null): static
{
if (!preg_match('//u', $replacement)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$str = clone $this;
$start = $start ? \strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0;
$length = $length ? \strlen(mb_substr($this->string, $start, $length, 'UTF-8')) : $length;
$str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);

return $str;
}

public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array
{
if (1 > $limit ??= \PHP_INT_MAX) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}

if ('' === $delimiter) {
throw new InvalidArgumentException('Split delimiter is empty.');
}

if (null !== $flags) {
return parent::split($delimiter.'u', $limit, $flags);
}

if (!preg_match('//u', $delimiter)) {
throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');
}

$str = clone $this;
$chunks = $this->ignoreCase
? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit)
: explode($delimiter, $this->string, $limit);

foreach ($chunks as &$chunk) {
$str->string = $chunk;
$chunk = clone $str;
}

return $chunks;
}

public function startsWith(string|iterable|AbstractString $prefix): bool
{
if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
} elseif (!\is_string($prefix)) {
return parent::startsWith($prefix);
}

if ('' === $prefix || !preg_match('//u', $prefix)) {
return false;
}

if ($this->ignoreCase) {
return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8');
}

return 0 === strncmp($this->string, $prefix, \strlen($prefix));
}
}
<?php










namespace Symfony\Component\String\Inflector;

final class EnglishInflector implements InflectorInterface
{





private const PLURAL_MAP = [







['saingisni', 9, true, true, 'insigne'],
['aingisni', 8, true, true, 'insigne'],


['ybsressap', 9, true, true, 'passerby'],


['sedon', 5, true, true, 'node'],


['airetcab', 8, true, true, 'bacterium'],


['seussi', 6, true, true, 'issue'],


['aroproc', 7, true, true, 'corpus'],


['airetirc', 8, true, true, 'criterion'],


['alucirruc', 9, true, true, 'curriculum'],


['arouq', 5, true, true, 'quorum'],


['areneg', 6, true, true, 'genus'],


['aidem', 5, true, true, 'medium'],


['adnaromem', 9, true, true, 'memorandum'],


['anemonehp', 9, true, true, 'phenomenon'],


['atarts', 6, true, true, 'stratum'],


['ea', 2, true, true, 'a'],


['secivres', 8, true, true, 'service'],


['eci', 3, false, true, 'ouse'],


['esee', 4, false, true, 'oose'],


['i', 1, true, true, 'us'],


['nem', 3, true, true, 'man'],


['nerdlihc', 8, true, true, 'child'],


['nexo', 4, false, false, 'ox'],


['seci', 4, false, true, ['ex', 'ix', 'ice']],


['sedoc', 5, false, true, 'code'],


['seifles', 7, true, true, 'selfie'],


['seibmoz', 7, true, true, 'zombie'],


['seivom', 6, true, true, 'movie'],


['seman', 5, true, false, 'name'],


['sesutcep', 8, true, true, 'pectus'],


['teef', 4, true, true, 'foot'],


['eseeg', 5, true, true, 'goose'],


['hteet', 5, true, true, 'tooth'],


['swen', 4, true, true, 'news'],


['seires', 6, true, true, 'series'],


['sei', 3, false, true, 'y'],


['sess', 4, true, false, 'ss'],


['sesutats', 8, true, true, 'status'],


['sel', 3, true, true, 'le'],





['ses', 3, true, true, ['s', 'se', 'sis']],


['sevit', 5, true, true, 'tive'],


['sevird', 6, false, true, 'drive'],


['sevi', 4, false, true, 'ife'],


['sevom', 5, true, true, 'move'],


['sev', 3, true, true, ['f', 've', 'ff']],


['sexa', 4, false, false, ['ax', 'axe', 'axis']],


['sex', 3, true, false, 'x'],


['sezz', 4, true, false, 'z'],


['suae', 4, false, true, 'eau'],


['see', 3, true, true, 'ee'],


['segd', 4, true, true, 'dge'],


['segatuo', 7, true, true, 'outage'],




['se', 2, true, true, ['', 'e']],


['sutats', 6, true, true, 'status'],


['s', 1, true, true, ''],


['xuae', 4, false, true, 'eau'],


['elpoep', 6, true, true, 'person'],
];






private const SINGULAR_MAP = [







['ybressap', 8, true, true, 'passersby'],


['engisni', 7, true, true, ['insignia', 'insignias']],


['edon', 4, true, true, 'nodes'],


['sixa', 4, false, false, 'axes'],


['airetirc', 8, false, false, 'criterion'],


['aluben', 6, false, false, 'nebulae'],


['dlihc', 5, true, true, 'children'],


['eci', 3, false, true, 'ices'],


['ecivres', 7, true, true, 'services'],


['efi', 3, false, true, 'ives'],


['eifles', 6, true, true, 'selfies'],


['eivom', 5, true, true, 'movies'],


['esuol', 5, false, true, 'lice'],


['esuom', 5, false, true, 'mice'],


['esoo', 4, false, true, 'eese'],


['es', 2, true, true, 'ses'],


['esoog', 5, true, true, 'geese'],


['ev', 2, true, true, 'ves'],


['evird', 5, false, true, 'drives'],


['evit', 4, true, true, 'tives'],


['evom', 4, true, true, 'moves'],


['ffats', 5, true, true, 'staves'],


['ff', 2, true, true, 'ffs'],


['f', 1, true, true, ['fs', 'ves']],


['hc', 2, true, true, 'ches'],


['hs', 2, true, true, 'shes'],


['htoot', 5, true, true, 'teeth'],


['mubla', 5, true, true, 'albums'],


['murouq', 6, true, true, ['quora', 'quorums']],


['mu', 2, true, true, 'a'],


['nam', 3, true, true, 'men'],


['nosrep', 6, true, true, ['persons', 'people']],


['noiretirc', 9, true, true, 'criteria'],


['nonemonehp', 10, true, true, 'phenomena'],


['ohce', 4, true, true, 'echoes'],


['oreh', 4, true, true, 'heroes'],


['salta', 5, true, true, 'atlases'],


['saila', 5, true, true, 'aliases'],


['siri', 4, true, true, 'irises'],




['sis', 3, true, true, 'ses'],


['ss', 2, true, false, 'sses'],


['suballys', 8, true, true, 'syllabi'],


['sub', 3, true, true, 'buses'],


['suc', 3, true, true, 'cuses'],


['supmacoppih', 11, false, false, 'hippocampi'],


['sup', 3, true, true, 'puses'],


['sutats', 6, true, true, ['status', 'statuses']],


['sutcep', 6, true, true, 'pectuses'],


['suxen', 5, false, false, 'nexuses'],


['su', 2, true, true, 'i'],


['swen', 4, true, true, 'news'],


['toof', 4, true, true, 'feet'],


['uae', 3, false, true, ['eaus', 'eaux']],


['xo', 2, false, false, 'oxen'],


['xaoh', 4, true, false, 'hoaxes'],


['xedni', 5, false, true, ['indicies', 'indexes']],


['xaf', 3, true, true, ['faxes', 'faxxes']],


['xo', 2, false, true, 'oxes'],


['x', 1, true, false, ['ces', 'xes']],


['y', 1, false, true, 'ies'],


['ziuq', 4, true, false, 'quizzes'],


['z', 1, true, true, 'zes'],
];




private const UNINFLECTED = [
'',


'atad',


'reed',


'tnempiuqe',


'kcabdeef',


'hsif',


'htlaeh',


'yrotsih',


'ofni',


'noitamrofni',


'yenom',


'esoom',


'seires',


'peehs',


'seiceps',


'ciffart',


'tfarcria',


'erawdrah',
];

public function singularize(string $plural): array
{
$pluralRev = strrev($plural);
$lowerPluralRev = strtolower($pluralRev);
$pluralLength = \strlen($lowerPluralRev);


if (\in_array($lowerPluralRev, self::UNINFLECTED, true)) {
return [$plural];
}





foreach (self::PLURAL_MAP as $map) {
$suffix = $map[0];
$suffixLength = $map[1];
$j = 0;



while ($suffix[$j] === $lowerPluralRev[$j]) {

++$j;



if ($j === $suffixLength) {

if ($j < $pluralLength) {
$nextIsVowel = str_contains('aeiou', $lowerPluralRev[$j]);

if (!$map[2] && $nextIsVowel) {

break;
}

if (!$map[3] && !$nextIsVowel) {

break;
}
}

$newBase = substr($plural, 0, $pluralLength - $suffixLength);
$newSuffix = $map[4];




$firstUpper = ctype_upper($pluralRev[$j - 1]);

if (\is_array($newSuffix)) {
$singulars = [];

foreach ($newSuffix as $newSuffixEntry) {
$singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
}

return $singulars;
}

return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];
}


if ($j === $pluralLength) {
break;
}
}
}


return [$plural];
}

public function pluralize(string $singular): array
{
$singularRev = strrev($singular);
$lowerSingularRev = strtolower($singularRev);
$singularLength = \strlen($lowerSingularRev);


if (\in_array($lowerSingularRev, self::UNINFLECTED, true)) {
return [$singular];
}





foreach (self::SINGULAR_MAP as $map) {
$suffix = $map[0];
$suffixLength = $map[1];
$j = 0;




while ($suffix[$j] === $lowerSingularRev[$j]) {

++$j;



if ($j === $suffixLength) {

if ($j < $singularLength) {
$nextIsVowel = str_contains('aeiou', $lowerSingularRev[$j]);

if (!$map[2] && $nextIsVowel) {

break;
}

if (!$map[3] && !$nextIsVowel) {

break;
}
}

$newBase = substr($singular, 0, $singularLength - $suffixLength);
$newSuffix = $map[4];




$firstUpper = ctype_upper($singularRev[$j - 1]);

if (\is_array($newSuffix)) {
$plurals = [];

foreach ($newSuffix as $newSuffixEntry) {
$plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
}

return $plurals;
}

return [$newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix)];
}


if ($j === $singularLength) {
break;
}
}
}


return [$singular.'s'];
}
}
<?php










namespace Symfony\Component\String\Inflector;






final class FrenchInflector implements InflectorInterface
{





private const PLURALIZE_REGEXP = [





['/(s|x|z)$/i', '\1'],



['/(eau)$/i', '\1x'],



['/^(landau)$/i', '\1s'],
['/(au)$/i', '\1x'],



['/^(pneu|bleu|émeu)$/i', '\1s'],
['/(eu)$/i', '\1x'],



['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\1s'],
['/al$/i', '\1aux'],


['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\1aux'],


['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\1oux'],


['/^(cinquante|soixante|mille)$/i', '\1'],


['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', 'mes\2s'],
['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', 'Mes\2s'],
];




private const SINGULARIZE_REGEXP = [




['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\1ail'],



['/(eau)x$/i', '\1'],



['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\1al'],



['/(au)x$/i', '\1'],



['/(eu)x$/i', '\1'],



['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\1ou'],


['/^mes(dame|demoiselle)s$/', 'ma\1'],
['/^Mes(dame|demoiselle)s$/', 'Ma\1'],
['/^mes(sieur|seigneur)s$/', 'mon\1'],
['/^Mes(sieur|seigneur)s$/', 'Mon\1'],


['/s$/i', ''],
];





private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i';

public function singularize(string $plural): array
{
if ($this->isInflectedWord($plural)) {
return [$plural];
}

foreach (self::SINGULARIZE_REGEXP as $rule) {
[$regexp, $replace] = $rule;

if (1 === preg_match($regexp, $plural)) {
return [preg_replace($regexp, $replace, $plural)];
}
}

return [$plural];
}

public function pluralize(string $singular): array
{
if ($this->isInflectedWord($singular)) {
return [$singular];
}

foreach (self::PLURALIZE_REGEXP as $rule) {
[$regexp, $replace] = $rule;

if (1 === preg_match($regexp, $singular)) {
return [preg_replace($regexp, $replace, $singular)];
}
}

return [$singular.'s'];
}

private function isInflectedWord(string $word): bool
{
return 1 === preg_match(self::UNINFLECTED, $word);
}
}
<?php










namespace Symfony\Component\String\Inflector;

interface InflectorInterface
{







public function singularize(string $plural): array;








public function pluralize(string $singular): array;
}
<?php










namespace Symfony\Component\String\Inflector;

final class SpanishInflector implements InflectorInterface
{








private const PLURALIZE_REGEXP = [

['/(sí|no)$/i', '\1es'],


['/(a|e|i|o|u|á|é|í|ó|ú)$/i', '\1s'],


['/ás$/i', 'ases'],
['/és$/i', 'eses'],
['/ís$/i', 'ises'],
['/ós$/i', 'oses'],
['/ús$/i', 'uses'],


['/ión$/i', '\1iones'],


['/(l|r|n|d|j|s|x|ch|y)$/i', '\1es'],


['/(z)$/i', 'ces'],
];




private const SINGULARIZE_REGEXP = [

['/(sí|no)es$/i', '\1'],


['/iones$/i', '\1ión'],


['/ces$/i', 'z'],


['/(\w)ases$/i', '\1ás'],
['/eses$/i', 'és'],
['/ises$/i', 'ís'],
['/(\w{2,})oses$/i', '\1ós'],
['/(\w)uses$/i', '\1ús'],


['/(l|r|n|d|j|s|x|ch|y)e?s$/i', '\1'],


['/(a|e|i|o|u|á|é|ó|í|ú)s$/i', '\1'],
];

private const UNINFLECTED_RULES = [

'/.*(piés)$/i',
];

private const UNINFLECTED = '/^(lunes|martes|miércoles|jueves|viernes|análisis|torax|yo|pies)$/i';

public function singularize(string $plural): array
{
if ($this->isInflectedWord($plural)) {
return [$plural];
}

foreach (self::SINGULARIZE_REGEXP as $rule) {
[$regexp, $replace] = $rule;

if (1 === preg_match($regexp, $plural)) {
return [preg_replace($regexp, $replace, $plural)];
}
}

return [$plural];
}

public function pluralize(string $singular): array
{
if ($this->isInflectedWord($singular)) {
return [$singular];
}

foreach (self::PLURALIZE_REGEXP as $rule) {
[$regexp, $replace] = $rule;

if (1 === preg_match($regexp, $singular)) {
return [preg_replace($regexp, $replace, $singular)];
}
}

return [$singular.'s'];
}

private function isInflectedWord(string $word): bool
{
foreach (self::UNINFLECTED_RULES as $rule) {
if (1 === preg_match($rule, $word)) {
return true;
}
}

return 1 === preg_match(self::UNINFLECTED, $word);
}
}
<?php










namespace Symfony\Component\String;

use Random\Randomizer;
use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;









class ByteString extends AbstractString
{
private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

public function __construct(string $string = '')
{
$this->string = $string;
}











public static function fromRandom(int $length = 16, ?string $alphabet = null): self
{
if ($length <= 0) {
throw new InvalidArgumentException(\sprintf('A strictly positive length is expected, "%d" given.', $length));
}

$alphabet ??= self::ALPHABET_ALPHANUMERIC;
$alphabetSize = \strlen($alphabet);
$bits = (int) ceil(log($alphabetSize, 2.0));
if ($bits <= 0 || $bits > 56) {
throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.');
}

if (\PHP_VERSION_ID >= 80300) {
return new static((new Randomizer())->getBytesFromString($alphabet, $length));
}

$ret = '';
while ($length > 0) {
$urandomLength = (int) ceil(2 * $length * $bits / 8.0);
$data = random_bytes($urandomLength);
$unpackedData = 0;
$unpackedBits = 0;
for ($i = 0; $i < $urandomLength && $length > 0; ++$i) {

$unpackedData = ($unpackedData << 8) | \ord($data[$i]);
$unpackedBits += 8;



for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {
$index = ($unpackedData & ((1 << $bits) - 1));
$unpackedData >>= $bits;



if ($index < $alphabetSize) {
$ret .= $alphabet[$index];
--$length;
}
}
}
}

return new static($ret);
}

public function bytesAt(int $offset): array
{
$str = $this->string[$offset] ?? '';

return '' === $str ? [] : [\ord($str)];
}

public function append(string ...$suffix): static
{
$str = clone $this;
$str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);

return $str;
}

public function camel(): static
{
$str = clone $this;

$parts = explode(' ', trim(ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->string))));
$parts[0] = 1 !== \strlen($parts[0]) && ctype_upper($parts[0]) ? $parts[0] : lcfirst($parts[0]);
$str->string = implode('', $parts);

return $str;
}

public function chunk(int $length = 1): array
{
if (1 > $length) {
throw new InvalidArgumentException('The chunk length must be greater than zero.');
}

if ('' === $this->string) {
return [];
}

$str = clone $this;
$chunks = [];

foreach (str_split($this->string, $length) as $chunk) {
$str->string = $chunk;
$chunks[] = clone $str;
}

return $chunks;
}

public function endsWith(string|iterable|AbstractString $suffix): bool
{
if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
} elseif (!\is_string($suffix)) {
return parent::endsWith($suffix);
}

return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase);
}

public function equalsTo(string|iterable|AbstractString $string): bool
{
if ($string instanceof AbstractString) {
$string = $string->string;
} elseif (!\is_string($string)) {
return parent::equalsTo($string);
}

if ('' !== $string && $this->ignoreCase) {
return 0 === strcasecmp($string, $this->string);
}

return $string === $this->string;
}

public function folded(): static
{
$str = clone $this;
$str->string = strtolower($str->string);

return $str;
}

public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOf($needle, $offset);
}

if ('' === $needle) {
return null;
}

$i = $this->ignoreCase ? stripos($this->string, $needle, $offset) : strpos($this->string, $needle, $offset);

return false === $i ? null : $i;
}

public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
} elseif (!\is_string($needle)) {
return parent::indexOfLast($needle, $offset);
}

if ('' === $needle) {
return null;
}

$i = $this->ignoreCase ? strripos($this->string, $needle, $offset) : strrpos($this->string, $needle, $offset);

return false === $i ? null : $i;
}

public function isUtf8(): bool
{
return '' === $this->string || preg_match('//u', $this->string);
}

public function join(array $strings, ?string $lastGlue = null): static
{
$str = clone $this;

$tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
$str->string = implode($this->string, $strings).$tail;

return $str;
}

public function length(): int
{
return \strlen($this->string);
}

public function lower(): static
{
$str = clone $this;
$str->string = strtolower($str->string);

return $str;
}

public function match(string $regexp, int $flags = 0, int $offset = 0): array
{
$match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';

if ($this->ignoreCase) {
$regexp .= 'i';
}

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
if (false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) {
throw new RuntimeException('Matching failed with error: '.preg_last_error_msg());
}
} finally {
restore_error_handler();
}

return $matches;
}

public function padBoth(int $length, string $padStr = ' '): static
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_BOTH);

return $str;
}

public function padEnd(int $length, string $padStr = ' '): static
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT);

return $str;
}

public function padStart(int $length, string $padStr = ' '): static
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_LEFT);

return $str;
}

public function prepend(string ...$prefix): static
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string;

return $str;
}

public function replace(string $from, string $to): static
{
$str = clone $this;

if ('' !== $from) {
$str->string = $this->ignoreCase ? str_ireplace($from, $to, $this->string) : str_replace($from, $to, $this->string);
}

return $str;
}

public function replaceMatches(string $fromRegexp, string|callable $to): static
{
if ($this->ignoreCase) {
$fromRegexp .= 'i';
}

$replace = \is_array($to) || $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace';

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
if (null === $string = $replace($fromRegexp, $to, $this->string)) {
$lastError = preg_last_error();

foreach (get_defined_constants(true)['pcre'] as $k => $v) {
if ($lastError === $v && str_ends_with($k, '_ERROR')) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}

throw new RuntimeException('Matching failed with unknown error code.');
}
} finally {
restore_error_handler();
}

$str = clone $this;
$str->string = $string;

return $str;
}

public function reverse(): static
{
$str = clone $this;
$str->string = strrev($str->string);

return $str;
}

public function slice(int $start = 0, ?int $length = null): static
{
$str = clone $this;
$str->string = substr($this->string, $start, $length ?? \PHP_INT_MAX);

return $str;
}

public function snake(): static
{
$str = $this->camel();
$str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string));

return $str;
}

public function splice(string $replacement, int $start = 0, ?int $length = null): static
{
$str = clone $this;
$str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);

return $str;
}

public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array
{
if (1 > $limit ??= \PHP_INT_MAX) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}

if ('' === $delimiter) {
throw new InvalidArgumentException('Split delimiter is empty.');
}

if (null !== $flags) {
return parent::split($delimiter, $limit, $flags);
}

$str = clone $this;
$chunks = $this->ignoreCase
? preg_split('{'.preg_quote($delimiter).'}iD', $this->string, $limit)
: explode($delimiter, $this->string, $limit);

foreach ($chunks as &$chunk) {
$str->string = $chunk;
$chunk = clone $str;
}

return $chunks;
}

public function startsWith(string|iterable|AbstractString $prefix): bool
{
if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
} elseif (!\is_string($prefix)) {
return parent::startsWith($prefix);
}

return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix)));
}

public function title(bool $allWords = false): static
{
$str = clone $this;
$str->string = $allWords ? ucwords($str->string) : ucfirst($str->string);

return $str;
}

public function toUnicodeString(?string $fromEncoding = null): UnicodeString
{
return new UnicodeString($this->toCodePointString($fromEncoding)->string);
}

public function toCodePointString(?string $fromEncoding = null): CodePointString
{
$u = new CodePointString();

if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], true) && preg_match('//u', $this->string)) {
$u->string = $this->string;

return $u;
}

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
try {
$validEncoding = false !== mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', true);
} catch (InvalidArgumentException $e) {
if (!\function_exists('iconv')) {
throw $e;
}

$u->string = iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string);

return $u;
}
} finally {
restore_error_handler();
}

if (!$validEncoding) {
throw new InvalidArgumentException(\sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252'));
}

$u->string = mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252');

return $u;
}

public function trim(string $chars = " \t\n\r\0\x0B\x0C"): static
{
$str = clone $this;
$str->string = trim($str->string, $chars);

return $str;
}

public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): static
{
$str = clone $this;
$str->string = rtrim($str->string, $chars);

return $str;
}

public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): static
{
$str = clone $this;
$str->string = ltrim($str->string, $chars);

return $str;
}

public function upper(): static
{
$str = clone $this;
$str->string = strtoupper($str->string);

return $str;
}

public function width(bool $ignoreAnsiDecoration = true): int
{
$string = preg_match('//u', $this->string) ? $this->string : preg_replace('/[\x80-\xFF]/', '?', $this->string);

return (new CodePointString($string))->width($ignoreAnsiDecoration);
}
}
<?php










namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;













abstract class AbstractString implements \Stringable, \JsonSerializable
{
public const PREG_PATTERN_ORDER = \PREG_PATTERN_ORDER;
public const PREG_SET_ORDER = \PREG_SET_ORDER;
public const PREG_OFFSET_CAPTURE = \PREG_OFFSET_CAPTURE;
public const PREG_UNMATCHED_AS_NULL = \PREG_UNMATCHED_AS_NULL;

public const PREG_SPLIT = 0;
public const PREG_SPLIT_NO_EMPTY = \PREG_SPLIT_NO_EMPTY;
public const PREG_SPLIT_DELIM_CAPTURE = \PREG_SPLIT_DELIM_CAPTURE;
public const PREG_SPLIT_OFFSET_CAPTURE = \PREG_SPLIT_OFFSET_CAPTURE;

protected string $string = '';
protected ?bool $ignoreCase = false;

abstract public function __construct(string $string = '');






public static function unwrap(array $values): array
{
foreach ($values as $k => $v) {
if ($v instanceof self) {
$values[$k] = $v->__toString();
} elseif (\is_array($v) && $values[$k] !== $v = static::unwrap($v)) {
$values[$k] = $v;
}
}

return $values;
}






public static function wrap(array $values): array
{
$i = 0;
$keys = null;

foreach ($values as $k => $v) {
if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) {
$keys ??= array_keys($values);
$keys[$i] = $j;
}

if (\is_string($v)) {
$values[$k] = new static($v);
} elseif (\is_array($v) && $values[$k] !== $v = static::wrap($v)) {
$values[$k] = $v;
}

++$i;
}

return null !== $keys ? array_combine($keys, $values) : $values;
}




public function after(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
{
$str = clone $this;
$i = \PHP_INT_MAX;

if (\is_string($needle)) {
$needle = [$needle];
}

foreach ($needle as $n) {
$n = (string) $n;
$j = $this->indexOf($n, $offset);

if (null !== $j && $j < $i) {
$i = $j;
$str->string = $n;
}
}

if (\PHP_INT_MAX === $i) {
return $str;
}

if (!$includeNeedle) {
$i += $str->length();
}

return $this->slice($i);
}




public function afterLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
{
$str = clone $this;
$i = null;

if (\is_string($needle)) {
$needle = [$needle];
}

foreach ($needle as $n) {
$n = (string) $n;
$j = $this->indexOfLast($n, $offset);

if (null !== $j && $j >= $i) {
$i = $offset = $j;
$str->string = $n;
}
}

if (null === $i) {
return $str;
}

if (!$includeNeedle) {
$i += $str->length();
}

return $this->slice($i);
}

abstract public function append(string ...$suffix): static;




public function before(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
{
$str = clone $this;
$i = \PHP_INT_MAX;

if (\is_string($needle)) {
$needle = [$needle];
}

foreach ($needle as $n) {
$n = (string) $n;
$j = $this->indexOf($n, $offset);

if (null !== $j && $j < $i) {
$i = $j;
$str->string = $n;
}
}

if (\PHP_INT_MAX === $i) {
return $str;
}

if ($includeNeedle) {
$i += $str->length();
}

return $this->slice(0, $i);
}




public function beforeLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
{
$str = clone $this;
$i = null;

if (\is_string($needle)) {
$needle = [$needle];
}

foreach ($needle as $n) {
$n = (string) $n;
$j = $this->indexOfLast($n, $offset);

if (null !== $j && $j >= $i) {
$i = $offset = $j;
$str->string = $n;
}
}

if (null === $i) {
return $str;
}

if ($includeNeedle) {
$i += $str->length();
}

return $this->slice(0, $i);
}




public function bytesAt(int $offset): array
{
$str = $this->slice($offset, 1);

return '' === $str->string ? [] : array_values(unpack('C*', $str->string));
}

abstract public function camel(): static;




abstract public function chunk(int $length = 1): array;

public function collapseWhitespace(): static
{
$str = clone $this;
$str->string = trim(preg_replace("/(?:[ \n\r\t\x0C]{2,}+|[\n\r\t\x0C])/", ' ', $str->string), " \n\r\t\x0C");

return $str;
}




public function containsAny(string|iterable $needle): bool
{
return null !== $this->indexOf($needle);
}




public function endsWith(string|iterable $suffix): bool
{
if (\is_string($suffix)) {
throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}

foreach ($suffix as $s) {
if ($this->endsWith((string) $s)) {
return true;
}
}

return false;
}

public function ensureEnd(string $suffix): static
{
if (!$this->endsWith($suffix)) {
return $this->append($suffix);
}

$suffix = preg_quote($suffix);
$regex = '{('.$suffix.')(?:'.$suffix.')++$}D';

return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1');
}

public function ensureStart(string $prefix): static
{
$prefix = new static($prefix);

if (!$this->startsWith($prefix)) {
return $this->prepend($prefix);
}

$str = clone $this;
$i = $prefixLen = $prefix->length();

while ($this->indexOf($prefix, $i) === $i) {
$str = $str->slice($prefixLen);
$i += $prefixLen;
}

return $str;
}




public function equalsTo(string|iterable $string): bool
{
if (\is_string($string)) {
throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}

foreach ($string as $s) {
if ($this->equalsTo((string) $s)) {
return true;
}
}

return false;
}

abstract public function folded(): static;

public function ignoreCase(): static
{
$str = clone $this;
$str->ignoreCase = true;

return $str;
}




public function indexOf(string|iterable $needle, int $offset = 0): ?int
{
if (\is_string($needle)) {
throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}

$i = \PHP_INT_MAX;

foreach ($needle as $n) {
$j = $this->indexOf((string) $n, $offset);

if (null !== $j && $j < $i) {
$i = $j;
}
}

return \PHP_INT_MAX === $i ? null : $i;
}




public function indexOfLast(string|iterable $needle, int $offset = 0): ?int
{
if (\is_string($needle)) {
throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}

$i = null;

foreach ($needle as $n) {
$j = $this->indexOfLast((string) $n, $offset);

if (null !== $j && $j >= $i) {
$i = $offset = $j;
}
}

return $i;
}

public function isEmpty(): bool
{
return '' === $this->string;
}

abstract public function join(array $strings, ?string $lastGlue = null): static;

public function jsonSerialize(): string
{
return $this->string;
}

abstract public function length(): int;

abstract public function lower(): static;








abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array;

abstract public function padBoth(int $length, string $padStr = ' '): static;

abstract public function padEnd(int $length, string $padStr = ' '): static;

abstract public function padStart(int $length, string $padStr = ' '): static;

abstract public function prepend(string ...$prefix): static;

public function repeat(int $multiplier): static
{
if (0 > $multiplier) {
throw new InvalidArgumentException(\sprintf('Multiplier must be positive, %d given.', $multiplier));
}

$str = clone $this;
$str->string = str_repeat($str->string, $multiplier);

return $str;
}

abstract public function replace(string $from, string $to): static;

abstract public function replaceMatches(string $fromRegexp, string|callable $to): static;

abstract public function reverse(): static;

abstract public function slice(int $start = 0, ?int $length = null): static;

abstract public function snake(): static;

public function kebab(): static
{
return $this->snake()->replace('_', '-');
}

public function pascal(): static
{
return $this->camel()->title();
}

abstract public function splice(string $replacement, int $start = 0, ?int $length = null): static;




public function split(string $delimiter, ?int $limit = null, ?int $flags = null): array
{
if (null === $flags) {
throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.');
}

if ($this->ignoreCase) {
$delimiter .= 'i';
}

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
if (false === $chunks = preg_split($delimiter, $this->string, $limit, $flags)) {
throw new RuntimeException('Splitting failed with error: '.preg_last_error_msg());
}
} finally {
restore_error_handler();
}

$str = clone $this;

if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) {
foreach ($chunks as &$chunk) {
$str->string = $chunk[0];
$chunk[0] = clone $str;
}
} else {
foreach ($chunks as &$chunk) {
$str->string = $chunk;
$chunk = clone $str;
}
}

return $chunks;
}




public function startsWith(string|iterable $prefix): bool
{
if (\is_string($prefix)) {
throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}

foreach ($prefix as $prefix) {
if ($this->startsWith((string) $prefix)) {
return true;
}
}

return false;
}

abstract public function title(bool $allWords = false): static;

public function toByteString(?string $toEncoding = null): ByteString
{
$b = new ByteString();

$toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], true) ? 'UTF-8' : $toEncoding;

if (null === $toEncoding || $toEncoding === $fromEncoding = $this instanceof AbstractUnicodeString || preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252') {
$b->string = $this->string;

return $b;
}

try {
$b->string = mb_convert_encoding($this->string, $toEncoding, 'UTF-8');
} catch (\ValueError $e) {
if (!\function_exists('iconv')) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}

$b->string = iconv('UTF-8', $toEncoding, $this->string);
}

return $b;
}

public function toCodePointString(): CodePointString
{
return new CodePointString($this->string);
}

public function toString(): string
{
return $this->string;
}

public function toUnicodeString(): UnicodeString
{
return new UnicodeString($this->string);
}

abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;

abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;




public function trimPrefix($prefix): static
{
if (\is_array($prefix) || $prefix instanceof \Traversable) { 
foreach ($prefix as $s) {
$t = $this->trimPrefix($s);

if ($t->string !== $this->string) {
return $t;
}
}

return clone $this;
}

$str = clone $this;

if ($prefix instanceof self) {
$prefix = $prefix->string;
} else {
$prefix = (string) $prefix;
}

if ('' !== $prefix && \strlen($this->string) >= \strlen($prefix) && 0 === substr_compare($this->string, $prefix, 0, \strlen($prefix), $this->ignoreCase)) {
$str->string = substr($this->string, \strlen($prefix));
}

return $str;
}

abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;




public function trimSuffix($suffix): static
{
if (\is_array($suffix) || $suffix instanceof \Traversable) { 
foreach ($suffix as $s) {
$t = $this->trimSuffix($s);

if ($t->string !== $this->string) {
return $t;
}
}

return clone $this;
}

$str = clone $this;

if ($suffix instanceof self) {
$suffix = $suffix->string;
} else {
$suffix = (string) $suffix;
}

if ('' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase)) {
$str->string = substr($this->string, 0, -\strlen($suffix));
}

return $str;
}

public function truncate(int $length, string $ellipsis = '', bool|TruncateMode $cut = TruncateMode::Char): static
{
$stringLength = $this->length();

if ($stringLength <= $length) {
return clone $this;
}

$ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0;

if ($length < $ellipsisLength) {
$ellipsisLength = 0;
}

$desiredLength = $length;
if (TruncateMode::WordAfter === $cut || !$cut) {
if (null === $length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1)) {
return clone $this;
}

$length += $ellipsisLength;
} elseif (TruncateMode::WordBefore === $cut && null !== $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1)) {
$length += $ellipsisLength;
}

$str = $this->slice(0, $length - $ellipsisLength);

if (TruncateMode::WordBefore === $cut) {
if (0 === $ellipsisLength && $desiredLength === $this->indexOf([' ', "\r", "\n", "\t"], $length)) {
return $str;
}

$str = $str->beforeLast([' ', "\r", "\n", "\t"]);
}

return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str;
}

abstract public function upper(): static;




abstract public function width(bool $ignoreAnsiDecoration = true): int;

public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): static
{
$lines = '' !== $break ? $this->split($break) : [clone $this];
$chars = [];
$mask = '';

if (1 === \count($lines) && '' === $lines[0]->string) {
return $lines[0];
}

foreach ($lines as $i => $line) {
if ($i) {
$chars[] = $break;
$mask .= '#';
}

foreach ($line->chunk() as $char) {
$chars[] = $char->string;
$mask .= ' ' === $char->string ? ' ' : '?';
}
}

$string = '';
$j = 0;
$b = $i = -1;
$mask = wordwrap($mask, $width, '#', $cut);

while (false !== $b = strpos($mask, '#', $b + 1)) {
for (++$i; $i < $b; ++$i) {
$string .= $chars[$j];
unset($chars[$j++]);
}

if ($break === $chars[$j] || ' ' === $chars[$j]) {
unset($chars[$j++]);
}

$string .= $break;
}

$str = clone $this;
$str->string = $string.implode('', $chars);

return $str;
}

public function __sleep(): array
{
return ['string'];
}

public function __clone()
{
$this->ignoreCase = false;
}

public function __toString(): string
{
return $this->string;
}
}
<?php










namespace Symfony\Component\String;

use Symfony\Component\String\Exception\ExceptionInterface;
use Symfony\Component\String\Exception\InvalidArgumentException;
use Symfony\Component\String\Exception\RuntimeException;












abstract class AbstractUnicodeString extends AbstractString
{
public const NFC = \Normalizer::NFC;
public const NFD = \Normalizer::NFD;
public const NFKC = \Normalizer::NFKC;
public const NFKD = \Normalizer::NFKD;


private const 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";


private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'ŉ', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ﬀ', 'ﬁ', 'ﬂ', 'ﬃ', 'ﬄ', 'ﬅ', 'ﬆ', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ'];
private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ'];


private const TRANSLIT_FROM = ['Æ', 'Ð', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Đ', 'đ', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'ŉ', 'Ŋ', 'ŋ', 'Œ', 'œ', 'Ŧ', 'ŧ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'Ɛ', 'Ƒ', 'ƒ', 'Ɠ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ', 'Ɲ', 'ƞ', 'Ƣ', 'ƣ', 'Ƥ', 'ƥ', 'ƫ', 'Ƭ', 'ƭ', 'Ʈ', 'Ʋ', 'Ƴ', 'ƴ', 'Ƶ', 'ƶ', 'Ǆ', 'ǅ', 'ǆ', 'Ǥ', 'ǥ', 'ȡ', 'Ȥ', 'ȥ', 'ȴ', 'ȵ', 'ȶ', 'ȷ', 'ȸ', 'ȹ', 'Ⱥ', 'Ȼ', 'ȼ', 'Ƚ', 'Ⱦ', 'ȿ', 'ɀ', 'Ƀ', 'Ʉ', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'Ɍ', 'ɍ', 'Ɏ', 'ɏ', 'ɓ', 'ɕ', 'ɖ', 'ɗ', 'ɛ', 'ɟ', 'ɠ', 'ɡ', 'ɢ', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'ɫ', 'ɬ', 'ɭ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'ʀ', 'ʂ', 'ʈ', 'ʉ', 'ʋ', 'ʏ', 'ʐ', 'ʑ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʣ', 'ʥ', 'ʦ', 'ʪ', 'ʫ', 'ᴀ', 'ᴁ', 'ᴃ', 'ᴄ', 'ᴅ', 'ᴆ', 'ᴇ', 'ᴊ', 'ᴋ', 'ᴌ', 'ᴍ', 'ᴏ', 'ᴘ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'ᴢ', 'ᵫ', 'ᵬ', 'ᵭ', 'ᵮ', 'ᵯ', 'ᵰ', 'ᵱ', 'ᵲ', 'ᵳ', 'ᵴ', 'ᵵ', 'ᵶ', 'ᵺ', 'ᵻ', 'ᵽ', 'ᵾ', 'ᶀ', 'ᶁ', 'ᶂ', 'ᶃ', 'ᶄ', 'ᶅ', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'ᶊ', 'ᶌ', 'ᶍ', 'ᶎ', 'ᶏ', 'ᶑ', 'ᶒ', 'ᶓ', 'ᶖ', 'ᶙ', 'ẚ', 'ẜ', 'ẝ', 'ẞ', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', '₠', '₢', '₣', '₤', '₧', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', '㏆', '㏗', '㏞', '㏟', '¼', '½', '¾', '⅓', '⅔', '⅕', '⅖', '⅗', '⅘', '⅙', '⅚', '⅛', '⅜', '⅝', '⅞', '⅟', '〇', '‘', '’', '‚', '‛', '“', '”', '„', '‟', '′', '″', '〝', '〞', '«', '»', '‹', '›', '‐', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', '⁄', '⁅', '⁆', '⁎', '、', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', '﹀', '﹑', '﹝', '﹞', '｟', '｠', '｡', '､', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆'];
private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 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/', '0', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))'];

private static array $transliterators = [];
private static array $tableZero;
private static array $tableWide;

public static function fromCodePoints(int ...$codes): static
{
$string = '';

foreach ($codes as $code) {
if (0x80 > $code %= 0x200000) {
$string .= \chr($code);
} elseif (0x800 > $code) {
$string .= \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
} elseif (0x10000 > $code) {
$string .= \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
} else {
$string .= \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
}
}

return new static($string);
}








public function ascii(array $rules = []): self
{
$str = clone $this;
$s = $str->string;
$str->string = '';

array_unshift($rules, 'nfd');
$rules[] = 'latin-ascii';

if (\function_exists('transliterator_transliterate')) {
$rules[] = 'any-latin/bgn';
}

$rules[] = 'nfkd';
$rules[] = '[:nonspacing mark:] remove';

while (\strlen($s) - 1 > $i = strspn($s, self::ASCII)) {
if (0 < --$i) {
$str->string .= substr($s, 0, $i);
$s = substr($s, $i);
}

if (!$rule = array_shift($rules)) {
$rules = []; 
}

if ($rule instanceof \Transliterator) {
$s = $rule->transliterate($s);
} elseif ($rule instanceof \Closure) {
$s = $rule($s);
} elseif ($rule) {
if ('nfd' === $rule = strtolower($rule)) {
normalizer_is_normalized($s, self::NFD) ?: $s = normalizer_normalize($s, self::NFD);
} elseif ('nfkd' === $rule) {
normalizer_is_normalized($s, self::NFKD) ?: $s = normalizer_normalize($s, self::NFKD);
} elseif ('[:nonspacing mark:] remove' === $rule) {
$s = preg_replace('/\p{Mn}++/u', '', $s);
} elseif ('latin-ascii' === $rule) {
$s = str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s);
} elseif ('de-ascii' === $rule) {
$s = preg_replace("/([AUO])\u{0308}(?=\p{Ll})/u", '$1e', $s);
$s = str_replace(["a\u{0308}", "o\u{0308}", "u\u{0308}", "A\u{0308}", "O\u{0308}", "U\u{0308}"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s);
} elseif (\function_exists('transliterator_transliterate')) {
if (null === $transliterator = self::$transliterators[$rule] ??= \Transliterator::create($rule)) {
if ('any-latin/bgn' === $rule) {
$rule = 'any-latin';
$transliterator = self::$transliterators[$rule] ??= \Transliterator::create($rule);
}

if (null === $transliterator) {
throw new InvalidArgumentException(\sprintf('Unknown transliteration rule "%s".', $rule));
}

self::$transliterators['any-latin/bgn'] = $transliterator;
}

$s = $transliterator->transliterate($s);
}
} elseif (!\function_exists('iconv')) {
$s = preg_replace('/[^\x00-\x7F]/u', '?', $s);
} else {
$previousLocale = setlocale(\LC_CTYPE, 0);
try {
setlocale(\LC_CTYPE, 'C');
$s = @preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) {
$c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]);

if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) {
throw new \LogicException(\sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class));
}

return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?');
}, $s);
} finally {
setlocale(\LC_CTYPE, $previousLocale);
}
}
}

$str->string .= $s;

return $str;
}

public function camel(): static
{
$str = clone $this;
$str->string = str_replace(' ', '', preg_replace_callback('/\b.(?!\p{Lu})/u', static function ($m) {
static $i = 0;

return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8');
}, preg_replace('/[^\pL0-9]++/u', ' ', $this->string)));

return $str;
}




public function codePointsAt(int $offset): array
{
$str = $this->slice($offset, 1);

if ('' === $str->string) {
return [];
}

$codePoints = [];

foreach (preg_split('//u', $str->string, -1, \PREG_SPLIT_NO_EMPTY) as $c) {
$codePoints[] = mb_ord($c, 'UTF-8');
}

return $codePoints;
}

public function folded(bool $compat = true): static
{
$str = clone $this;

if (!$compat || !\defined('Normalizer::NFKC_CF')) {
$str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC);
$str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $str->string), 'UTF-8');
} else {
$str->string = normalizer_normalize($str->string, \Normalizer::NFKC_CF);
}

return $str;
}

public function join(array $strings, ?string $lastGlue = null): static
{
$str = clone $this;

$tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
$str->string = implode($this->string, $strings).$tail;

if (!preg_match('//u', $str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

return $str;
}

public function lower(): static
{
$str = clone $this;
$str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8');

return $str;
}




public function localeLower(string $locale): static
{
if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Lower')) {
$str = clone $this;
$str->string = $transliterator->transliterate($str->string);

return $str;
}

return $this->lower();
}

public function match(string $regexp, int $flags = 0, int $offset = 0): array
{
$match = ((\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags) ? 'preg_match_all' : 'preg_match';

if ($this->ignoreCase) {
$regexp .= 'i';
}

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
if (false === $match($regexp.'u', $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) {
throw new RuntimeException('Matching failed with error: '.preg_last_error_msg());
}
} finally {
restore_error_handler();
}

return $matches;
}

public function normalize(int $form = self::NFC): static
{
if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) {
throw new InvalidArgumentException('Unsupported normalization form.');
}

$str = clone $this;
normalizer_is_normalized($str->string, $form) ?: $str->string = normalizer_normalize($str->string, $form);

return $str;
}

public function padBoth(int $length, string $padStr = ' '): static
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$pad = clone $this;
$pad->string = $padStr;

return $this->pad($length, $pad, \STR_PAD_BOTH);
}

public function padEnd(int $length, string $padStr = ' '): static
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$pad = clone $this;
$pad->string = $padStr;

return $this->pad($length, $pad, \STR_PAD_RIGHT);
}

public function padStart(int $length, string $padStr = ' '): static
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
}

$pad = clone $this;
$pad->string = $padStr;

return $this->pad($length, $pad, \STR_PAD_LEFT);
}

public function replaceMatches(string $fromRegexp, string|callable $to): static
{
if ($this->ignoreCase) {
$fromRegexp .= 'i';
}

if (\is_array($to) || $to instanceof \Closure) {
$replace = 'preg_replace_callback';
$to = static function (array $m) use ($to): string {
$to = $to($m);

if ('' !== $to && (!\is_string($to) || !preg_match('//u', $to))) {
throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.');
}

return $to;
};
} elseif ('' !== $to && !preg_match('//u', $to)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
} else {
$replace = 'preg_replace';
}

set_error_handler(static fn ($t, $m) => throw new InvalidArgumentException($m));

try {
if (null === $string = $replace($fromRegexp.'u', $to, $this->string)) {
$lastError = preg_last_error();

foreach (get_defined_constants(true)['pcre'] as $k => $v) {
if ($lastError === $v && str_ends_with($k, '_ERROR')) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}

throw new RuntimeException('Matching failed with unknown error code.');
}
} finally {
restore_error_handler();
}

$str = clone $this;
$str->string = $string;

return $str;
}

public function reverse(): static
{
$str = clone $this;
$str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY)));

return $str;
}

public function snake(): static
{
$str = $this->camel();
$str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8');

return $str;
}

public function title(bool $allWords = false): static
{
$str = clone $this;

$limit = $allWords ? -1 : 1;

$str->string = preg_replace_callback('/\b./u', static fn (array $m): string => mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'), $str->string, $limit);

return $str;
}




public function localeTitle(string $locale): static
{
if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Title')) {
$str = clone $this;
$str->string = $transliterator->transliterate($str->string);

return $str;
}

return $this->title();
}

public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
}
$chars = preg_quote($chars);

$str = clone $this;
$str->string = preg_replace("{^[$chars]++|[$chars]++$}uD", '', $str->string);

return $str;
}

public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
}
$chars = preg_quote($chars);

$str = clone $this;
$str->string = preg_replace("{[$chars]++$}uD", '', $str->string);

return $str;
}

public function trimPrefix($prefix): static
{
if (!$this->ignoreCase) {
return parent::trimPrefix($prefix);
}

$str = clone $this;

if ($prefix instanceof \Traversable) {
$prefix = iterator_to_array($prefix, false);
} elseif ($prefix instanceof parent) {
$prefix = $prefix->string;
}

$prefix = implode('|', array_map('preg_quote', (array) $prefix));
$str->string = preg_replace("{^(?:$prefix)}iuD", '', $this->string);

return $str;
}

public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
}
$chars = preg_quote($chars);

$str = clone $this;
$str->string = preg_replace("{^[$chars]++}uD", '', $str->string);

return $str;
}

public function trimSuffix($suffix): static
{
if (!$this->ignoreCase) {
return parent::trimSuffix($suffix);
}

$str = clone $this;

if ($suffix instanceof \Traversable) {
$suffix = iterator_to_array($suffix, false);
} elseif ($suffix instanceof parent) {
$suffix = $suffix->string;
}

$suffix = implode('|', array_map('preg_quote', (array) $suffix));
$str->string = preg_replace("{(?:$suffix)$}iuD", '', $this->string);

return $str;
}

public function upper(): static
{
$str = clone $this;
$str->string = mb_strtoupper($str->string, 'UTF-8');

return $str;
}




public function localeUpper(string $locale): static
{
if (null !== $transliterator = $this->getLocaleTransliterator($locale, 'Upper')) {
$str = clone $this;
$str->string = $transliterator->transliterate($str->string);

return $str;
}

return $this->upper();
}

public function width(bool $ignoreAnsiDecoration = true): int
{
$width = 0;
$s = str_replace(["\x00", "\x05", "\x07"], '', $this->string);

if (str_contains($s, "\r")) {
$s = str_replace(["\r\n", "\r"], "\n", $s);
}

if (!$ignoreAnsiDecoration) {
$s = preg_replace('/[\p{Cc}\x7F]++/u', '', $s);
}

foreach (explode("\n", $s) as $s) {
if ($ignoreAnsiDecoration) {
$s = preg_replace('/(?:\x1B(?:
                    \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [\x40-\x7E]
                    | [P\]X^_] .*? \x1B\\\\
                    | [\x41-\x7E]
                )|[\p{Cc}\x7F]++)/xu', '', $s);
}

$lineWidth = $this->wcswidth($s);

if ($lineWidth > $width) {
$width = $lineWidth;
}
}

return $width;
}

private function pad(int $len, self $pad, int $type): static
{
$sLen = $this->length();

if ($len <= $sLen) {
return clone $this;
}

$padLen = $pad->length();
$freeLen = $len - $sLen;
$len = $freeLen % $padLen;

switch ($type) {
case \STR_PAD_RIGHT:
return $this->append(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

case \STR_PAD_LEFT:
return $this->prepend(str_repeat($pad->string, intdiv($freeLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

case \STR_PAD_BOTH:
$freeLen /= 2;

$rightLen = ceil($freeLen);
$len = $rightLen % $padLen;
$str = $this->append(str_repeat($pad->string, intdiv($rightLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

$leftLen = floor($freeLen);
$len = $leftLen % $padLen;

return $str->prepend(str_repeat($pad->string, intdiv($leftLen, $padLen)).($len ? $pad->slice(0, $len) : ''));

default:
throw new InvalidArgumentException('Invalid padding type.');
}
}




private function wcswidth(string $string): int
{
$width = 0;

foreach (preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) {
$codePoint = mb_ord($c, 'UTF-8');

if (0 === $codePoint 
|| 0x034F === $codePoint 
|| (0x200B <= $codePoint && 0x200F >= $codePoint) 
|| 0x2028 === $codePoint 
|| 0x2029 === $codePoint 
|| (0x202A <= $codePoint && 0x202E >= $codePoint) 
|| (0x2060 <= $codePoint && 0x2063 >= $codePoint) 
) {
continue;
}


if (32 > $codePoint 
|| (0x07F <= $codePoint && 0x0A0 > $codePoint) 
) {
return -1;
}

self::$tableZero ??= require __DIR__.'/Resources/data/wcswidth_table_zero.php';

if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \count(self::$tableZero) - 1][1]) {
$lbound = 0;
while ($ubound >= $lbound) {
$mid = floor(($lbound + $ubound) / 2);

if ($codePoint > self::$tableZero[$mid][1]) {
$lbound = $mid + 1;
} elseif ($codePoint < self::$tableZero[$mid][0]) {
$ubound = $mid - 1;
} else {
continue 2;
}
}
}

self::$tableWide ??= require __DIR__.'/Resources/data/wcswidth_table_wide.php';

if ($codePoint >= self::$tableWide[0][0] && $codePoint <= self::$tableWide[$ubound = \count(self::$tableWide) - 1][1]) {
$lbound = 0;
while ($ubound >= $lbound) {
$mid = floor(($lbound + $ubound) / 2);

if ($codePoint > self::$tableWide[$mid][1]) {
$lbound = $mid + 1;
} elseif ($codePoint < self::$tableWide[$mid][0]) {
$ubound = $mid - 1;
} else {
$width += 2;

continue 2;
}
}
}

++$width;
}

return $width;
}

private function getLocaleTransliterator(string $locale, string $id): ?\Transliterator
{
$rule = $locale.'-'.$id;
if (\array_key_exists($rule, self::$transliterators)) {
return self::$transliterators[$rule];
}

if (null !== $transliterator = self::$transliterators[$rule] = \Transliterator::create($rule)) {
return $transliterator;
}


if (false === $i = strpos($locale, '_')) {
return null;
}

$parentRule = substr_replace($locale, '-'.$id, $i);


if (\array_key_exists($parentRule, self::$transliterators)) {
return self::$transliterators[$rule] = self::$transliterators[$parentRule];
}


$transliterator = \Transliterator::create($parentRule);

return self::$transliterators[$rule] = self::$transliterators[$parentRule] = $transliterator;
}
}
<?php










namespace Symfony\Component\String;

if (!\function_exists(u::class)) {
function u(?string $string = ''): UnicodeString
{
return new UnicodeString($string ?? '');
}
}

if (!\function_exists(b::class)) {
function b(?string $string = ''): ByteString
{
return new ByteString($string ?? '');
}
}

if (!\function_exists(s::class)) {



function s(?string $string = ''): AbstractString
{
$string ??= '';

return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
}
}
<?php















return [
[
4352,
4447,
],
[
8986,
8987,
],
[
9001,
9001,
],
[
9002,
9002,
],
[
9193,
9196,
],
[
9200,
9200,
],
[
9203,
9203,
],
[
9725,
9726,
],
[
9748,
9749,
],
[
9776,
9783,
],
[
9800,
9811,
],
[
9855,
9855,
],
[
9866,
9871,
],
[
9875,
9875,
],
[
9889,
9889,
],
[
9898,
9899,
],
[
9917,
9918,
],
[
9924,
9925,
],
[
9934,
9934,
],
[
9940,
9940,
],
[
9962,
9962,
],
[
9970,
9971,
],
[
9973,
9973,
],
[
9978,
9978,
],
[
9981,
9981,
],
[
9989,
9989,
],
[
9994,
9995,
],
[
10024,
10024,
],
[
10060,
10060,
],
[
10062,
10062,
],
[
10067,
10069,
],
[
10071,
10071,
],
[
10133,
10135,
],
[
10160,
10160,
],
[
10175,
10175,
],
[
11035,
11036,
],
[
11088,
11088,
],
[
11093,
11093,
],
[
11904,
11929,
],
[
11931,
12019,
],
[
12032,
12245,
],
[
12272,
12287,
],
[
12288,
12288,
],
[
12289,
12291,
],
[
12292,
12292,
],
[
12293,
12293,
],
[
12294,
12294,
],
[
12295,
12295,
],
[
12296,
12296,
],
[
12297,
12297,
],
[
12298,
12298,
],
[
12299,
12299,
],
[
12300,
12300,
],
[
12301,
12301,
],
[
12302,
12302,
],
[
12303,
12303,
],
[
12304,
12304,
],
[
12305,
12305,
],
[
12306,
12307,
],
[
12308,
12308,
],
[
12309,
12309,
],
[
12310,
12310,
],
[
12311,
12311,
],
[
12312,
12312,
],
[
12313,
12313,
],
[
12314,
12314,
],
[
12315,
12315,
],
[
12316,
12316,
],
[
12317,
12317,
],
[
12318,
12319,
],
[
12320,
12320,
],
[
12321,
12329,
],
[
12330,
12333,
],
[
12334,
12335,
],
[
12336,
12336,
],
[
12337,
12341,
],
[
12342,
12343,
],
[
12344,
12346,
],
[
12347,
12347,
],
[
12348,
12348,
],
[
12349,
12349,
],
[
12350,
12350,
],
[
12353,
12438,
],
[
12441,
12442,
],
[
12443,
12444,
],
[
12445,
12446,
],
[
12447,
12447,
],
[
12448,
12448,
],
[
12449,
12538,
],
[
12539,
12539,
],
[
12540,
12542,
],
[
12543,
12543,
],
[
12549,
12591,
],
[
12593,
12686,
],
[
12688,
12689,
],
[
12690,
12693,
],
[
12694,
12703,
],
[
12704,
12735,
],
[
12736,
12773,
],
[
12783,
12783,
],
[
12784,
12799,
],
[
12800,
12830,
],
[
12832,
12841,
],
[
12842,
12871,
],
[
12880,
12880,
],
[
12881,
12895,
],
[
12896,
12927,
],
[
12928,
12937,
],
[
12938,
12976,
],
[
12977,
12991,
],
[
12992,
13055,
],
[
13056,
13311,
],
[
13312,
19903,
],
[
19904,
19967,
],
[
19968,
40959,
],
[
40960,
40980,
],
[
40981,
40981,
],
[
40982,
42124,
],
[
42128,
42182,
],
[
43360,
43388,
],
[
44032,
55203,
],
[
63744,
64109,
],
[
64110,
64111,
],
[
64112,
64217,
],
[
64218,
64255,
],
[
65040,
65046,
],
[
65047,
65047,
],
[
65048,
65048,
],
[
65049,
65049,
],
[
65072,
65072,
],
[
65073,
65074,
],
[
65075,
65076,
],
[
65077,
65077,
],
[
65078,
65078,
],
[
65079,
65079,
],
[
65080,
65080,
],
[
65081,
65081,
],
[
65082,
65082,
],
[
65083,
65083,
],
[
65084,
65084,
],
[
65085,
65085,
],
[
65086,
65086,
],
[
65087,
65087,
],
[
65088,
65088,
],
[
65089,
65089,
],
[
65090,
65090,
],
[
65091,
65091,
],
[
65092,
65092,
],
[
65093,
65094,
],
[
65095,
65095,
],
[
65096,
65096,
],
[
65097,
65100,
],
[
65101,
65103,
],
[
65104,
65106,
],
[
65108,
65111,
],
[
65112,
65112,
],
[
65113,
65113,
],
[
65114,
65114,
],
[
65115,
65115,
],
[
65116,
65116,
],
[
65117,
65117,
],
[
65118,
65118,
],
[
65119,
65121,
],
[
65122,
65122,
],
[
65123,
65123,
],
[
65124,
65126,
],
[
65128,
65128,
],
[
65129,
65129,
],
[
65130,
65131,
],
[
65281,
65283,
],
[
65284,
65284,
],
[
65285,
65287,
],
[
65288,
65288,
],
[
65289,
65289,
],
[
65290,
65290,
],
[
65291,
65291,
],
[
65292,
65292,
],
[
65293,
65293,
],
[
65294,
65295,
],
[
65296,
65305,
],
[
65306,
65307,
],
[
65308,
65310,
],
[
65311,
65312,
],
[
65313,
65338,
],
[
65339,
65339,
],
[
65340,
65340,
],
[
65341,
65341,
],
[
65342,
65342,
],
[
65343,
65343,
],
[
65344,
65344,
],
[
65345,
65370,
],
[
65371,
65371,
],
[
65372,
65372,
],
[
65373,
65373,
],
[
65374,
65374,
],
[
65375,
65375,
],
[
65376,
65376,
],
[
65504,
65505,
],
[
65506,
65506,
],
[
65507,
65507,
],
[
65508,
65508,
],
[
65509,
65510,
],
[
94176,
94177,
],
[
94178,
94178,
],
[
94179,
94179,
],
[
94180,
94180,
],
[
94192,
94193,
],
[
94208,
100343,
],
[
100352,
101119,
],
[
101120,
101589,
],
[
101631,
101631,
],
[
101632,
101640,
],
[
110576,
110579,
],
[
110581,
110587,
],
[
110589,
110590,
],
[
110592,
110847,
],
[
110848,
110882,
],
[
110898,
110898,
],
[
110928,
110930,
],
[
110933,
110933,
],
[
110948,
110951,
],
[
110960,
111355,
],
[
119552,
119638,
],
[
119648,
119670,
],
[
126980,
126980,
],
[
127183,
127183,
],
[
127374,
127374,
],
[
127377,
127386,
],
[
127488,
127490,
],
[
127504,
127547,
],
[
127552,
127560,
],
[
127568,
127569,
],
[
127584,
127589,
],
[
127744,
127776,
],
[
127789,
127797,
],
[
127799,
127868,
],
[
127870,
127891,
],
[
127904,
127946,
],
[
127951,
127955,
],
[
127968,
127984,
],
[
127988,
127988,
],
[
127992,
127994,
],
[
127995,
127999,
],
[
128000,
128062,
],
[
128064,
128064,
],
[
128066,
128252,
],
[
128255,
128317,
],
[
128331,
128334,
],
[
128336,
128359,
],
[
128378,
128378,
],
[
128405,
128406,
],
[
128420,
128420,
],
[
128507,
128511,
],
[
128512,
128591,
],
[
128640,
128709,
],
[
128716,
128716,
],
[
128720,
128722,
],
[
128725,
128727,
],
[
128732,
128735,
],
[
128747,
128748,
],
[
128756,
128764,
],
[
128992,
129003,
],
[
129008,
129008,
],
[
129292,
129338,
],
[
129340,
129349,
],
[
129351,
129535,
],
[
129648,
129660,
],
[
129664,
129673,
],
[
129679,
129734,
],
[
129742,
129756,
],
[
129759,
129769,
],
[
129776,
129784,
],
[
131072,
173791,
],
[
173792,
173823,
],
[
173824,
177977,
],
[
177978,
177983,
],
[
177984,
178205,
],
[
178206,
178207,
],
[
178208,
183969,
],
[
183970,
183983,
],
[
183984,
191456,
],
[
191457,
191471,
],
[
191472,
192093,
],
[
192094,
194559,
],
[
194560,
195101,
],
[
195102,
195103,
],
[
195104,
196605,
],
[
196608,
201546,
],
[
201547,
201551,
],
[
201552,
205743,
],
[
205744,
262141,
],
];
<?php















return [
[
768,
879,
],
[
1155,
1159,
],
[
1160,
1161,
],
[
1425,
1469,
],
[
1471,
1471,
],
[
1473,
1474,
],
[
1476,
1477,
],
[
1479,
1479,
],
[
1552,
1562,
],
[
1611,
1631,
],
[
1648,
1648,
],
[
1750,
1756,
],
[
1759,
1764,
],
[
1767,
1768,
],
[
1770,
1773,
],
[
1809,
1809,
],
[
1840,
1866,
],
[
1958,
1968,
],
[
2027,
2035,
],
[
2045,
2045,
],
[
2070,
2073,
],
[
2075,
2083,
],
[
2085,
2087,
],
[
2089,
2093,
],
[
2137,
2139,
],
[
2199,
2207,
],
[
2250,
2273,
],
[
2275,
2306,
],
[
2362,
2362,
],
[
2364,
2364,
],
[
2369,
2376,
],
[
2381,
2381,
],
[
2385,
2391,
],
[
2402,
2403,
],
[
2433,
2433,
],
[
2492,
2492,
],
[
2497,
2500,
],
[
2509,
2509,
],
[
2530,
2531,
],
[
2558,
2558,
],
[
2561,
2562,
],
[
2620,
2620,
],
[
2625,
2626,
],
[
2631,
2632,
],
[
2635,
2637,
],
[
2641,
2641,
],
[
2672,
2673,
],
[
2677,
2677,
],
[
2689,
2690,
],
[
2748,
2748,
],
[
2753,
2757,
],
[
2759,
2760,
],
[
2765,
2765,
],
[
2786,
2787,
],
[
2810,
2815,
],
[
2817,
2817,
],
[
2876,
2876,
],
[
2879,
2879,
],
[
2881,
2884,
],
[
2893,
2893,
],
[
2901,
2902,
],
[
2914,
2915,
],
[
2946,
2946,
],
[
3008,
3008,
],
[
3021,
3021,
],
[
3072,
3072,
],
[
3076,
3076,
],
[
3132,
3132,
],
[
3134,
3136,
],
[
3142,
3144,
],
[
3146,
3149,
],
[
3157,
3158,
],
[
3170,
3171,
],
[
3201,
3201,
],
[
3260,
3260,
],
[
3263,
3263,
],
[
3270,
3270,
],
[
3276,
3277,
],
[
3298,
3299,
],
[
3328,
3329,
],
[
3387,
3388,
],
[
3393,
3396,
],
[
3405,
3405,
],
[
3426,
3427,
],
[
3457,
3457,
],
[
3530,
3530,
],
[
3538,
3540,
],
[
3542,
3542,
],
[
3633,
3633,
],
[
3636,
3642,
],
[
3655,
3662,
],
[
3761,
3761,
],
[
3764,
3772,
],
[
3784,
3790,
],
[
3864,
3865,
],
[
3893,
3893,
],
[
3895,
3895,
],
[
3897,
3897,
],
[
3953,
3966,
],
[
3968,
3972,
],
[
3974,
3975,
],
[
3981,
3991,
],
[
3993,
4028,
],
[
4038,
4038,
],
[
4141,
4144,
],
[
4146,
4151,
],
[
4153,
4154,
],
[
4157,
4158,
],
[
4184,
4185,
],
[
4190,
4192,
],
[
4209,
4212,
],
[
4226,
4226,
],
[
4229,
4230,
],
[
4237,
4237,
],
[
4253,
4253,
],
[
4957,
4959,
],
[
5906,
5908,
],
[
5938,
5939,
],
[
5970,
5971,
],
[
6002,
6003,
],
[
6068,
6069,
],
[
6071,
6077,
],
[
6086,
6086,
],
[
6089,
6099,
],
[
6109,
6109,
],
[
6155,
6157,
],
[
6159,
6159,
],
[
6277,
6278,
],
[
6313,
6313,
],
[
6432,
6434,
],
[
6439,
6440,
],
[
6450,
6450,
],
[
6457,
6459,
],
[
6679,
6680,
],
[
6683,
6683,
],
[
6742,
6742,
],
[
6744,
6750,
],
[
6752,
6752,
],
[
6754,
6754,
],
[
6757,
6764,
],
[
6771,
6780,
],
[
6783,
6783,
],
[
6832,
6845,
],
[
6846,
6846,
],
[
6847,
6862,
],
[
6912,
6915,
],
[
6964,
6964,
],
[
6966,
6970,
],
[
6972,
6972,
],
[
6978,
6978,
],
[
7019,
7027,
],
[
7040,
7041,
],
[
7074,
7077,
],
[
7080,
7081,
],
[
7083,
7085,
],
[
7142,
7142,
],
[
7144,
7145,
],
[
7149,
7149,
],
[
7151,
7153,
],
[
7212,
7219,
],
[
7222,
7223,
],
[
7376,
7378,
],
[
7380,
7392,
],
[
7394,
7400,
],
[
7405,
7405,
],
[
7412,
7412,
],
[
7416,
7417,
],
[
7616,
7679,
],
[
8400,
8412,
],
[
8413,
8416,
],
[
8417,
8417,
],
[
8418,
8420,
],
[
8421,
8432,
],
[
11503,
11505,
],
[
11647,
11647,
],
[
11744,
11775,
],
[
12330,
12333,
],
[
12441,
12442,
],
[
42607,
42607,
],
[
42608,
42610,
],
[
42612,
42621,
],
[
42654,
42655,
],
[
42736,
42737,
],
[
43010,
43010,
],
[
43014,
43014,
],
[
43019,
43019,
],
[
43045,
43046,
],
[
43052,
43052,
],
[
43204,
43205,
],
[
43232,
43249,
],
[
43263,
43263,
],
[
43302,
43309,
],
[
43335,
43345,
],
[
43392,
43394,
],
[
43443,
43443,
],
[
43446,
43449,
],
[
43452,
43453,
],
[
43493,
43493,
],
[
43561,
43566,
],
[
43569,
43570,
],
[
43573,
43574,
],
[
43587,
43587,
],
[
43596,
43596,
],
[
43644,
43644,
],
[
43696,
43696,
],
[
43698,
43700,
],
[
43703,
43704,
],
[
43710,
43711,
],
[
43713,
43713,
],
[
43756,
43757,
],
[
43766,
43766,
],
[
44005,
44005,
],
[
44008,
44008,
],
[
44013,
44013,
],
[
64286,
64286,
],
[
65024,
65039,
],
[
65056,
65071,
],
[
66045,
66045,
],
[
66272,
66272,
],
[
66422,
66426,
],
[
68097,
68099,
],
[
68101,
68102,
],
[
68108,
68111,
],
[
68152,
68154,
],
[
68159,
68159,
],
[
68325,
68326,
],
[
68900,
68903,
],
[
68969,
68973,
],
[
69291,
69292,
],
[
69372,
69375,
],
[
69446,
69456,
],
[
69506,
69509,
],
[
69633,
69633,
],
[
69688,
69702,
],
[
69744,
69744,
],
[
69747,
69748,
],
[
69759,
69761,
],
[
69811,
69814,
],
[
69817,
69818,
],
[
69826,
69826,
],
[
69888,
69890,
],
[
69927,
69931,
],
[
69933,
69940,
],
[
70003,
70003,
],
[
70016,
70017,
],
[
70070,
70078,
],
[
70089,
70092,
],
[
70095,
70095,
],
[
70191,
70193,
],
[
70196,
70196,
],
[
70198,
70199,
],
[
70206,
70206,
],
[
70209,
70209,
],
[
70367,
70367,
],
[
70371,
70378,
],
[
70400,
70401,
],
[
70459,
70460,
],
[
70464,
70464,
],
[
70502,
70508,
],
[
70512,
70516,
],
[
70587,
70592,
],
[
70606,
70606,
],
[
70608,
70608,
],
[
70610,
70610,
],
[
70625,
70626,
],
[
70712,
70719,
],
[
70722,
70724,
],
[
70726,
70726,
],
[
70750,
70750,
],
[
70835,
70840,
],
[
70842,
70842,
],
[
70847,
70848,
],
[
70850,
70851,
],
[
71090,
71093,
],
[
71100,
71101,
],
[
71103,
71104,
],
[
71132,
71133,
],
[
71219,
71226,
],
[
71229,
71229,
],
[
71231,
71232,
],
[
71339,
71339,
],
[
71341,
71341,
],
[
71344,
71349,
],
[
71351,
71351,
],
[
71453,
71453,
],
[
71455,
71455,
],
[
71458,
71461,
],
[
71463,
71467,
],
[
71727,
71735,
],
[
71737,
71738,
],
[
71995,
71996,
],
[
71998,
71998,
],
[
72003,
72003,
],
[
72148,
72151,
],
[
72154,
72155,
],
[
72160,
72160,
],
[
72193,
72202,
],
[
72243,
72248,
],
[
72251,
72254,
],
[
72263,
72263,
],
[
72273,
72278,
],
[
72281,
72283,
],
[
72330,
72342,
],
[
72344,
72345,
],
[
72752,
72758,
],
[
72760,
72765,
],
[
72767,
72767,
],
[
72850,
72871,
],
[
72874,
72880,
],
[
72882,
72883,
],
[
72885,
72886,
],
[
73009,
73014,
],
[
73018,
73018,
],
[
73020,
73021,
],
[
73023,
73029,
],
[
73031,
73031,
],
[
73104,
73105,
],
[
73109,
73109,
],
[
73111,
73111,
],
[
73459,
73460,
],
[
73472,
73473,
],
[
73526,
73530,
],
[
73536,
73536,
],
[
73538,
73538,
],
[
73562,
73562,
],
[
78912,
78912,
],
[
78919,
78933,
],
[
90398,
90409,
],
[
90413,
90415,
],
[
92912,
92916,
],
[
92976,
92982,
],
[
94031,
94031,
],
[
94095,
94098,
],
[
94180,
94180,
],
[
113821,
113822,
],
[
118528,
118573,
],
[
118576,
118598,
],
[
119143,
119145,
],
[
119163,
119170,
],
[
119173,
119179,
],
[
119210,
119213,
],
[
119362,
119364,
],
[
121344,
121398,
],
[
121403,
121452,
],
[
121461,
121461,
],
[
121476,
121476,
],
[
121499,
121503,
],
[
121505,
121519,
],
[
122880,
122886,
],
[
122888,
122904,
],
[
122907,
122913,
],
[
122915,
122916,
],
[
122918,
122922,
],
[
123023,
123023,
],
[
123184,
123190,
],
[
123566,
123566,
],
[
123628,
123631,
],
[
124140,
124143,
],
[
124398,
124399,
],
[
125136,
125142,
],
[
125252,
125258,
],
[
917760,
917999,
],
];
<?php










namespace Symfony\Component\String\Exception;

interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\String\Exception;

class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\String\Exception;

class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\String\Slugger;

use Symfony\Component\Emoji\EmojiTransliterator;
use Symfony\Component\String\AbstractUnicodeString;
use Symfony\Component\String\UnicodeString;
use Symfony\Contracts\Translation\LocaleAwareInterface;

if (!interface_exists(LocaleAwareInterface::class)) {
throw new \LogicException('You cannot use the "Symfony\Component\String\Slugger\AsciiSlugger" as the "symfony/translation-contracts" package is not installed. Try running "composer require symfony/translation-contracts".');
}




class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
{
private const LOCALE_TO_TRANSLITERATOR_ID = [
'am' => 'Amharic-Latin',
'ar' => 'Arabic-Latin',
'az' => 'Azerbaijani-Latin',
'be' => 'Belarusian-Latin',
'bg' => 'Bulgarian-Latin',
'bn' => 'Bengali-Latin',
'de' => 'de-ASCII',
'el' => 'Greek-Latin',
'fa' => 'Persian-Latin',
'he' => 'Hebrew-Latin',
'hy' => 'Armenian-Latin',
'ka' => 'Georgian-Latin',
'kk' => 'Kazakh-Latin',
'ky' => 'Kirghiz-Latin',
'ko' => 'Korean-Latin',
'mk' => 'Macedonian-Latin',
'mn' => 'Mongolian-Latin',
'or' => 'Oriya-Latin',
'ps' => 'Pashto-Latin',
'ru' => 'Russian-Latin',
'sr' => 'Serbian-Latin',
'sr_Cyrl' => 'Serbian-Latin',
'th' => 'Thai-Latin',
'tk' => 'Turkmen-Latin',
'uk' => 'Ukrainian-Latin',
'uz' => 'Uzbek-Latin',
'zh' => 'Han-Latin',
];

private \Closure|array $symbolsMap = [
'en' => ['@' => 'at', '&' => 'and'],
];
private bool|string $emoji = false;






private array $transliterators = [];

public function __construct(
private ?string $defaultLocale = null,
array|\Closure|null $symbolsMap = null,
) {
$this->symbolsMap = $symbolsMap ?? $this->symbolsMap;
}

public function setLocale(string $locale): void
{
$this->defaultLocale = $locale;
}

public function getLocale(): string
{
return $this->defaultLocale;
}






public function withEmoji(bool|string $emoji = true): static
{
if (false !== $emoji && !class_exists(EmojiTransliterator::class)) {
throw new \LogicException(\sprintf('You cannot use the "%s()" method as the "symfony/emoji" package is not installed. Try running "composer require symfony/emoji".', __METHOD__));
}

$new = clone $this;
$new->emoji = $emoji;

return $new;
}

public function slug(string $string, string $separator = '-', ?string $locale = null): AbstractUnicodeString
{
$locale ??= $this->defaultLocale;

$transliterator = [];
if ($locale && ('de' === $locale || str_starts_with($locale, 'de_'))) {

$transliterator = ['de-ASCII'];
} elseif (\function_exists('transliterator_transliterate') && $locale) {
$transliterator = (array) $this->createTransliterator($locale);
}

if ($emojiTransliterator = $this->createEmojiTransliterator($locale)) {
$transliterator[] = $emojiTransliterator;
}

if ($this->symbolsMap instanceof \Closure) {


$symbolsMap = $this->symbolsMap;
array_unshift($transliterator, static fn ($s) => $symbolsMap($s, $locale));
}

$unicodeString = (new UnicodeString($string))->ascii($transliterator);

if (\is_array($this->symbolsMap)) {
$map = null;
if (isset($this->symbolsMap[$locale ?? ''])) {
$map = $this->symbolsMap[$locale ?? ''];
} else {
$parent = self::getParentLocale($locale);
if ($parent && isset($this->symbolsMap[$parent])) {
$map = $this->symbolsMap[$parent];
}
}
if ($map) {
foreach ($map as $char => $replace) {
$unicodeString = $unicodeString->replace($char, ' '.$replace.' ');
}
}
}

return $unicodeString
->replaceMatches('/[^A-Za-z0-9]++/', $separator)
->trim($separator)
;
}

private function createTransliterator(string $locale): ?\Transliterator
{
if (\array_key_exists($locale, $this->transliterators)) {
return $this->transliterators[$locale];
}


if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) {
return $this->transliterators[$locale] = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id);
}


if (!$parent = self::getParentLocale($locale)) {
return $this->transliterators[$locale] = null;
}


if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) {
$transliterator = \Transliterator::create($id.'/BGN') ?? \Transliterator::create($id);
}

return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null;
}

private function createEmojiTransliterator(?string $locale): ?EmojiTransliterator
{
if (\is_string($this->emoji)) {
$locale = $this->emoji;
} elseif (!$this->emoji) {
return null;
}

while (null !== $locale) {
try {
return EmojiTransliterator::create("emoji-$locale");
} catch (\IntlException) {
$locale = self::getParentLocale($locale);
}
}

return null;
}

private static function getParentLocale(?string $locale): ?string
{
if (!$locale) {
return null;
}
if (false === $str = strrchr($locale, '_')) {

return null;
}

return substr($locale, 0, -\strlen($str));
}
}
<?php










namespace Symfony\Component\String\Slugger;

use Symfony\Component\String\AbstractUnicodeString;






interface SluggerInterface
{



public function slug(string $string, string $separator = '-', ?string $locale = null): AbstractUnicodeString;
}
<?php










namespace Symfony\Component\String;

enum TruncateMode
{







case Char;








case WordBefore;








case WordAfter;
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validator\ValidatorInterface;






final class Validation
{



public static function createCallable(Constraint|ValidatorInterface|null $constraintOrValidator = null, Constraint ...$constraints): callable
{
$validator = self::createIsValidCallable($constraintOrValidator, ...$constraints);

return static function ($value) use ($validator) {
if (!$validator($value, $violations)) {
throw new ValidationFailedException($value, $violations);
}

return $value;
};
}

/**
@@return callable(mixed $value, ConstraintViolationListInterface &$violations = null): bool


*/
public static function createIsValidCallable(Constraint|ValidatorInterface|null $constraintOrValidator = null, Constraint ...$constraints): callable
{
$validator = $constraintOrValidator;

if ($constraintOrValidator instanceof Constraint) {
$constraints = \func_get_args();
$validator = null;
}

$validator ??= self::createValidator();

return static function (mixed $value, ?ConstraintViolationListInterface &$violations = null) use ($constraints, $validator): bool {
$violations = $validator->validate($value, $constraints);

return 0 === $violations->count();
};
}







public static function createValidator(): ValidatorInterface
{
return self::createValidatorBuilder()->getValidator();
}




public static function createValidatorBuilder(): ValidatorBuilder
{
return new ValidatorBuilder();
}




private function __construct()
{
}
}
<?php










namespace Symfony\Component\Validator\Violation;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\Util\PropertyPath;
use Symfony\Contracts\Translation\TranslatorInterface;








class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface
{
private ConstraintViolationList $violations;
private string|\Stringable $message;
private array $parameters;
private mixed $root;
private mixed $invalidValue;
private string $propertyPath;
private TranslatorInterface $translator;
private string|false|null $translationDomain;
private ?int $plural = null;
private ?Constraint $constraint;
private ?string $code = null;
private mixed $cause = null;

public function __construct(ConstraintViolationList $violations, ?Constraint $constraint, string|\Stringable $message, array $parameters, mixed $root, ?string $propertyPath, mixed $invalidValue, TranslatorInterface $translator, string|false|null $translationDomain = null)
{
$this->violations = $violations;
$this->message = $message;
$this->parameters = $parameters;
$this->root = $root;
$this->propertyPath = $propertyPath ?? '';
$this->invalidValue = $invalidValue;
$this->translator = $translator;
$this->translationDomain = $translationDomain;
$this->constraint = $constraint;
}

public function atPath(string $path): static
{
$this->propertyPath = PropertyPath::append($this->propertyPath, $path);

return $this;
}

public function setParameter(string $key, string $value): static
{
$this->parameters[$key] = $value;

return $this;
}

public function setParameters(array $parameters): static
{
$this->parameters = $parameters;

return $this;
}

public function setTranslationDomain(string $translationDomain): static
{
$this->translationDomain = $translationDomain;

return $this;
}




public function disableTranslation(): static
{
$this->translationDomain = false;

return $this;
}

public function setInvalidValue(mixed $invalidValue): static
{
$this->invalidValue = $invalidValue;

return $this;
}

public function setPlural(int $number): static
{
$this->plural = $number;

return $this;
}

public function setCode(?string $code): static
{
$this->code = $code;

return $this;
}

public function setCause(mixed $cause): static
{
$this->cause = $cause;

return $this;
}

public function addViolation(): void
{
$parameters = null === $this->plural ? $this->parameters : (['%count%' => $this->plural] + $this->parameters);
if (false === $this->translationDomain) {
$translatedMessage = strtr($this->message, $parameters);
} else {
$translatedMessage = $this->translator->trans(
$this->message,
$parameters,
$this->translationDomain
);
}

$this->violations->add(new ConstraintViolation(
$translatedMessage,
$this->message,
$this->parameters,
$this->root,
$this->propertyPath,
$this->invalidValue,
$this->plural,
$this->code,
$this->constraint,
$this->cause
));
}
}
<?php










namespace Symfony\Component\Validator\Violation;













interface ConstraintViolationBuilderInterface
{










public function atPath(string $path): static;









public function setParameter(string $key, string $value): static;










public function setParameters(array $parameters): static;











public function setTranslationDomain(string $translationDomain): static;






public function setInvalidValue(mixed $invalidValue): static;











public function setPlural(int $number): static;








public function setCode(?string $code): static;








public function setCause(mixed $cause): static;






public function addViolation();
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\InvalidArgumentException;
use Symfony\Component\Validator\Exception\InvalidOptionsException;
use Symfony\Component\Validator\Exception\MissingOptionsException;












abstract class Constraint
{



public const DEFAULT_GROUP = 'Default';




public const CLASS_CONSTRAINT = 'class';




public const PROPERTY_CONSTRAINT = 'property';






protected const ERROR_NAMES = [];




protected static $errorNames = [];






public $payload;






public $groups;






public static function getErrorName(string $errorCode): string
{
if (isset(static::ERROR_NAMES[$errorCode])) {
return static::ERROR_NAMES[$errorCode];
}

if (!isset(static::$errorNames[$errorCode])) {
throw new InvalidArgumentException(\sprintf('The error code "%s" does not exist for constraint of type "%s".', $errorCode, static::class));
}

trigger_deprecation('symfony/validator', '6.1', 'The "%s::$errorNames" property is deprecated, use protected const ERROR_NAMES instead.', static::class);

return static::$errorNames[$errorCode];
}






























public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null)
{
unset($this->groups); 

$options = $this->normalizeOptions($options);
if (null !== $groups) {
$options['groups'] = $groups;
}
$options['payload'] = $payload ?? $options['payload'] ?? null;

foreach ($options as $name => $value) {
$this->$name = $value;
}
}

protected function normalizeOptions(mixed $options): array
{
$normalizedOptions = [];
$defaultOption = $this->getDefaultOption();
$invalidOptions = [];
$missingOptions = array_flip((array) $this->getRequiredOptions());
$knownOptions = get_class_vars(static::class);

if (\is_array($options) && isset($options['value']) && !property_exists($this, 'value')) {
if (null === $defaultOption) {
throw new ConstraintDefinitionException(\sprintf('No default option is configured for constraint "%s".', static::class));
}

$options[$defaultOption] = $options['value'];
unset($options['value']);
}

if (\is_array($options)) {
reset($options);
}
if ($options && \is_array($options) && \is_string(key($options))) {
foreach ($options as $option => $value) {
if (\array_key_exists($option, $knownOptions)) {
$normalizedOptions[$option] = $value;
unset($missingOptions[$option]);
} else {
$invalidOptions[] = $option;
}
}
} elseif (null !== $options && !(\is_array($options) && 0 === \count($options))) {
if (null === $defaultOption) {
throw new ConstraintDefinitionException(\sprintf('No default option is configured for constraint "%s".', static::class));
}

if (\array_key_exists($defaultOption, $knownOptions)) {
$normalizedOptions[$defaultOption] = $options;
unset($missingOptions[$defaultOption]);
} else {
$invalidOptions[] = $defaultOption;
}
}

if (\count($invalidOptions) > 0) {
throw new InvalidOptionsException(\sprintf('The options "%s" do not exist in constraint "%s".', implode('", "', $invalidOptions), static::class), $invalidOptions);
}

if (\count($missingOptions) > 0) {
throw new MissingOptionsException(\sprintf('The options "%s" must be set for constraint "%s".', implode('", "', array_keys($missingOptions)), static::class), array_keys($missingOptions));
}

return $normalizedOptions;
}












public function __set(string $option, mixed $value)
{
if ('groups' === $option) {
$this->groups = (array) $value;

return;
}

throw new InvalidOptionsException(\sprintf('The option "%s" does not exist in constraint "%s".', $option, static::class), [$option]);
}










public function __get(string $option): mixed
{
if ('groups' === $option) {
$this->groups = [self::DEFAULT_GROUP];

return $this->groups;
}

throw new InvalidOptionsException(\sprintf('The option "%s" does not exist in constraint "%s".', $option, static::class), [$option]);
}

public function __isset(string $option): bool
{
return 'groups' === $option;
}






public function addImplicitGroupName(string $group)
{
if (null === $this->groups && \array_key_exists('groups', (array) $this)) {
throw new \LogicException(\sprintf('"%s::$groups" is set to null. Did you forget to call "%s::__construct()"?', static::class, self::class));
}

if (\in_array(self::DEFAULT_GROUP, $this->groups) && !\in_array($group, $this->groups)) {
$this->groups[] = $group;
}
}










public function getDefaultOption()
{
return null;
}










public function getRequiredOptions()
{
return [];
}










public function validatedBy()
{
return static::class.'Validator';
}










public function getTargets()
{
return self::PROPERTY_CONSTRAINT;
}






public function __sleep(): array
{

$this->groups;

return array_keys(get_object_vars($this));
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Constraints\ExpressionValidator;










class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
{
protected $validators = [];

public function __construct(array $validators = [])
{
$this->validators = $validators;
}

public function getInstance(Constraint $constraint): ConstraintValidatorInterface
{
if ('validator.expression' === $name = $class = $constraint->validatedBy()) {
$class = ExpressionValidator::class;
}

return $this->validators[$name] ??= new $class();
}
}
<?php










namespace Symfony\Component\Validator\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;






interface ValidatorInterface extends MetadataFactoryInterface
{













public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface;












public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface;














public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface;








public function startContext(): ContextualValidatorInterface;







public function inContext(ExecutionContextInterface $context): ContextualValidatorInterface;
}
<?php










namespace Symfony\Component\Validator\Validator;

use Psr\Container\ContainerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContextFactoryInterface;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
use Symfony\Component\Validator\Mapping\MetadataInterface;
use Symfony\Component\Validator\ObjectInitializerInterface;






class RecursiveValidator implements ValidatorInterface
{
protected $contextFactory;
protected $metadataFactory;
protected $validatorFactory;
protected $objectInitializers;
protected ?ContainerInterface $groupProviderLocator;






public function __construct(ExecutionContextFactoryInterface $contextFactory, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = [], ?ContainerInterface $groupProviderLocator = null)
{
$this->contextFactory = $contextFactory;
$this->metadataFactory = $metadataFactory;
$this->validatorFactory = $validatorFactory;
$this->objectInitializers = $objectInitializers;
$this->groupProviderLocator = $groupProviderLocator;
}

public function startContext(mixed $root = null): ContextualValidatorInterface
{
return new RecursiveContextualValidator(
$this->contextFactory->createContext($this, $root),
$this->metadataFactory,
$this->validatorFactory,
$this->objectInitializers,
$this->groupProviderLocator,
);
}

public function inContext(ExecutionContextInterface $context): ContextualValidatorInterface
{
return new RecursiveContextualValidator(
$context,
$this->metadataFactory,
$this->validatorFactory,
$this->objectInitializers,
$this->groupProviderLocator,
);
}

public function getMetadataFor(mixed $object): MetadataInterface
{
return $this->metadataFactory->getMetadataFor($object);
}

public function hasMetadataFor(mixed $object): bool
{
return $this->metadataFactory->hasMetadataFor($object);
}

public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{
return $this->startContext($value)
->validate($value, $constraints, $groups)
->getViolations();
}

public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{
return $this->startContext($object)
->validateProperty($object, $propertyName, $groups)
->getViolations();
}

public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{

return $this->startContext(\is_object($objectOrClass) ? $objectOrClass : $value)
->validatePropertyValue($objectOrClass, $propertyName, $value, $groups)
->getViolations();
}
}
<?php










namespace Symfony\Component\Validator\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\ConstraintViolationListInterface;






interface ContextualValidatorInterface
{








public function atPath(string $path): static;













public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): static;










public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): static;












public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): static;





public function getViolations(): ConstraintViolationListInterface;
}
<?php










namespace Symfony\Component\Validator\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\MetadataInterface;
use Symfony\Contracts\Service\ResetInterface;






class TraceableValidator implements ValidatorInterface, ResetInterface
{
private ValidatorInterface $validator;
private array $collectedData = [];

public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}

public function getCollectedData(): array
{
return $this->collectedData;
}




public function reset()
{
$this->collectedData = [];
}

public function getMetadataFor(mixed $value): MetadataInterface
{
return $this->validator->getMetadataFor($value);
}

public function hasMetadataFor(mixed $value): bool
{
return $this->validator->hasMetadataFor($value);
}

public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{
$violations = $this->validator->validate($value, $constraints, $groups);

$trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 7);

$file = $trace[0]['file'];
$line = $trace[0]['line'];

for ($i = 1; $i < 7; ++$i) {
if (isset($trace[$i]['class'], $trace[$i]['function'])
&& 'validate' === $trace[$i]['function']
&& is_a($trace[$i]['class'], ValidatorInterface::class, true)
) {
$file = $trace[$i]['file'];
$line = $trace[$i]['line'];

while (++$i < 7) {
if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && !str_starts_with($trace[$i]['function'], 'call_user_func')) {
$file = $trace[$i]['file'];
$line = $trace[$i]['line'];

break;
}
}
break;
}
}

$name = str_replace('\\', '/', $file);
$name = substr($name, strrpos($name, '/') + 1);

$this->collectedData[] = [
'caller' => compact('name', 'file', 'line'),
'context' => compact('value', 'constraints', 'groups'),
'violations' => iterator_to_array($violations),
];

return $violations;
}

public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{
return $this->validator->validateProperty($object, $propertyName, $groups);
}

public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): ConstraintViolationListInterface
{
return $this->validator->validatePropertyValue($objectOrClass, $propertyName, $value, $groups);
}

public function startContext(): ContextualValidatorInterface
{
return $this->validator->startContext();
}

public function inContext(ExecutionContextInterface $context): ContextualValidatorInterface
{
return $this->validator->inContext($context);
}
}
<?php










namespace Symfony\Component\Validator\Validator;






class LazyProperty
{
private \Closure $propertyValueCallback;

public function __construct(\Closure $propertyValueCallback)
{
$this->propertyValueCallback = $propertyValueCallback;
}

public function getPropertyValue(): mixed
{
return ($this->propertyValueCallback)();
}
}
<?php










namespace Symfony\Component\Validator\Validator;

use Psr\Container\ContainerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Composite;
use Symfony\Component\Validator\Constraints\Existence;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContext;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\NoSuchMetadataException;
use Symfony\Component\Validator\Exception\RuntimeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use Symfony\Component\Validator\Exception\UnsupportedMetadataException;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Mapping\CascadingStrategy;
use Symfony\Component\Validator\Mapping\ClassMetadataInterface;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
use Symfony\Component\Validator\Mapping\GenericMetadata;
use Symfony\Component\Validator\Mapping\GetterMetadata;
use Symfony\Component\Validator\Mapping\MetadataInterface;
use Symfony\Component\Validator\Mapping\PropertyMetadataInterface;
use Symfony\Component\Validator\Mapping\TraversalStrategy;
use Symfony\Component\Validator\ObjectInitializerInterface;
use Symfony\Component\Validator\Util\PropertyPath;






class RecursiveContextualValidator implements ContextualValidatorInterface
{
private ExecutionContextInterface $context;
private string $defaultPropertyPath;
private array $defaultGroups;
private MetadataFactoryInterface $metadataFactory;
private ConstraintValidatorFactoryInterface $validatorFactory;
private array $objectInitializers;
private ?ContainerInterface $groupProviderLocator;






public function __construct(ExecutionContextInterface $context, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = [], ?ContainerInterface $groupProviderLocator = null)
{
$this->context = $context;
$this->defaultPropertyPath = $context->getPropertyPath();
$this->defaultGroups = [$context->getGroup() ?: Constraint::DEFAULT_GROUP];
$this->metadataFactory = $metadataFactory;
$this->validatorFactory = $validatorFactory;
$this->objectInitializers = $objectInitializers;
$this->groupProviderLocator = $groupProviderLocator;
}

public function atPath(string $path): static
{
$this->defaultPropertyPath = $this->context->getPropertyPath($path);

return $this;
}

public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): static
{
$groups = $groups ? $this->normalizeGroups($groups) : $this->defaultGroups;

$previousValue = $this->context->getValue();
$previousObject = $this->context->getObject();
$previousMetadata = $this->context->getMetadata();
$previousPath = $this->context->getPropertyPath();
$previousGroup = $this->context->getGroup();
$previousConstraint = null;

if ($this->context instanceof ExecutionContext || method_exists($this->context, 'getConstraint')) {
$previousConstraint = $this->context->getConstraint();
}



if (null !== $constraints) {


if (!\is_array($constraints)) {
$constraints = [$constraints];
}

$metadata = new GenericMetadata();
$metadata->addConstraints($constraints);

$this->validateGenericNode(
$value,
$previousObject,
\is_object($value) ? $this->generateCacheKey($value) : null,
$metadata,
$this->defaultPropertyPath,
$groups,
null,
TraversalStrategy::IMPLICIT,
$this->context
);

$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
$this->context->setGroup($previousGroup);

if (null !== $previousConstraint) {
$this->context->setConstraint($previousConstraint);
}

return $this;
}



if (\is_object($value)) {
$this->validateObject(
$value,
$this->defaultPropertyPath,
$groups,
TraversalStrategy::IMPLICIT,
$this->context
);

$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
$this->context->setGroup($previousGroup);

return $this;
}



if (\is_array($value)) {
$this->validateEachObjectIn(
$value,
$this->defaultPropertyPath,
$groups,
$this->context
);

$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
$this->context->setGroup($previousGroup);

return $this;
}

throw new RuntimeException(\sprintf('Cannot validate values of type "%s" automatically. Please provide a constraint.', get_debug_type($value)));
}

public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): static
{
$classMetadata = $this->metadataFactory->getMetadataFor($object);

if (!$classMetadata instanceof ClassMetadataInterface) {
throw new ValidatorException(\sprintf('The metadata factory should return instances of "\Symfony\Component\Validator\Mapping\ClassMetadataInterface", got: "%s".', get_debug_type($classMetadata)));
}

$propertyMetadatas = $classMetadata->getPropertyMetadata($propertyName);
$groups = $groups ? $this->normalizeGroups($groups) : $this->defaultGroups;
$cacheKey = $this->generateCacheKey($object);
$propertyPath = PropertyPath::append($this->defaultPropertyPath, $propertyName);

$previousValue = $this->context->getValue();
$previousObject = $this->context->getObject();
$previousMetadata = $this->context->getMetadata();
$previousPath = $this->context->getPropertyPath();
$previousGroup = $this->context->getGroup();

foreach ($propertyMetadatas as $propertyMetadata) {
$propertyValue = $propertyMetadata->getPropertyValue($object);

$this->validateGenericNode(
$propertyValue,
$object,
$cacheKey.':'.$object::class.':'.$propertyName,
$propertyMetadata,
$propertyPath,
$groups,
null,
TraversalStrategy::IMPLICIT,
$this->context
);
}

$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
$this->context->setGroup($previousGroup);

return $this;
}

public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): static
{
$classMetadata = $this->metadataFactory->getMetadataFor($objectOrClass);

if (!$classMetadata instanceof ClassMetadataInterface) {
throw new ValidatorException(\sprintf('The metadata factory should return instances of "\Symfony\Component\Validator\Mapping\ClassMetadataInterface", got: "%s".', get_debug_type($classMetadata)));
}

$propertyMetadatas = $classMetadata->getPropertyMetadata($propertyName);
$groups = $groups ? $this->normalizeGroups($groups) : $this->defaultGroups;

if (\is_object($objectOrClass)) {
$object = $objectOrClass;
$class = $object::class;
$cacheKey = $this->generateCacheKey($objectOrClass);
$propertyPath = PropertyPath::append($this->defaultPropertyPath, $propertyName);
} else {

$object = null;
$class = $objectOrClass;
$cacheKey = null;
$propertyPath = $this->defaultPropertyPath;
}

$previousValue = $this->context->getValue();
$previousObject = $this->context->getObject();
$previousMetadata = $this->context->getMetadata();
$previousPath = $this->context->getPropertyPath();
$previousGroup = $this->context->getGroup();

foreach ($propertyMetadatas as $propertyMetadata) {
$this->validateGenericNode(
$value,
$object,
$cacheKey.':'.$class.':'.$propertyName,
$propertyMetadata,
$propertyPath,
$groups,
null,
TraversalStrategy::IMPLICIT,
$this->context
);
}

$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
$this->context->setGroup($previousGroup);

return $this;
}

public function getViolations(): ConstraintViolationListInterface
{
return $this->context->getViolations();
}








protected function normalizeGroups(string|GroupSequence|array $groups): array
{
if (\is_array($groups)) {
return $groups;
}

return [$groups];
}

















private function validateObject(object $object, string $propertyPath, array $groups, int $traversalStrategy, ExecutionContextInterface $context): void
{
try {
$classMetadata = $this->metadataFactory->getMetadataFor($object);

if (!$classMetadata instanceof ClassMetadataInterface) {
throw new UnsupportedMetadataException(\sprintf('The metadata factory should return instances of "Symfony\Component\Validator\Mapping\ClassMetadataInterface", got: "%s".', get_debug_type($classMetadata)));
}

$this->validateClassNode(
$object,
$this->generateCacheKey($object),
$classMetadata,
$propertyPath,
$groups,
null,
$traversalStrategy,
$context
);
} catch (NoSuchMetadataException $e) {

if (!$object instanceof \Traversable) {
throw $e;
}


if (!($traversalStrategy & (TraversalStrategy::IMPLICIT | TraversalStrategy::TRAVERSE))) {
throw $e;
}

$this->validateEachObjectIn(
$object,
$propertyPath,
$groups,
$context
);
}
}







private function validateEachObjectIn(iterable $collection, string $propertyPath, array $groups, ExecutionContextInterface $context): void
{
foreach ($collection as $key => $value) {
if (\is_array($value)) {

$this->validateEachObjectIn(
$value,
$propertyPath.'['.$key.']',
$groups,
$context
);

continue;
}


if (\is_object($value)) {
$this->validateObject(
$value,
$propertyPath.'['.$key.']',
$groups,
TraversalStrategy::IMPLICIT,
$context
);
}
}
}


































private function validateClassNode(object $object, ?string $cacheKey, ClassMetadataInterface $metadata, string $propertyPath, array $groups, ?array $cascadedGroups, int $traversalStrategy, ExecutionContextInterface $context): void
{
$context->setNode($object, $object, $metadata, $propertyPath);

if (!$context->isObjectInitialized($cacheKey)) {
foreach ($this->objectInitializers as $initializer) {
$initializer->initialize($object);
}

$context->markObjectAsInitialized($cacheKey);
}

foreach ($groups as $key => $group) {



$defaultOverridden = false;


$groupHash = \is_object($group) ? $this->generateCacheKey($group, true) : $group;

if ($context->isGroupValidated($cacheKey, $groupHash)) {


unset($groups[$key]);

continue;
}

$context->markGroupAsValidated($cacheKey, $groupHash);








if (Constraint::DEFAULT_GROUP === $group) {
if ($metadata->hasGroupSequence()) {

$group = $metadata->getGroupSequence();
$defaultOverridden = true;
} elseif ($metadata->isGroupSequenceProvider()) {
if (null !== $provider = $metadata->getGroupProvider()) {
if (null === $this->groupProviderLocator) {
throw new \LogicException('A group provider locator is required when using group provider.');
}

$group = $this->groupProviderLocator->get($provider)->getGroups($object);
} else {



$group = $object->getGroupSequence();
}
$defaultOverridden = true;

if (!$group instanceof GroupSequence) {
$group = new GroupSequence($group);
}
}
}




if ($group instanceof GroupSequence) {
$this->stepThroughGroupSequence(
$object,
$object,
$cacheKey,
$metadata,
$propertyPath,
$traversalStrategy,
$group,
$defaultOverridden ? Constraint::DEFAULT_GROUP : null,
$context
);



unset($groups[$key]);

continue;
}

$this->validateInGroup($object, $cacheKey, $metadata, $group, $context);
}



if (0 === \count($groups)) {
return;
}


foreach ($metadata->getConstrainedProperties() as $propertyName) {



foreach ($metadata->getPropertyMetadata($propertyName) as $propertyMetadata) {
if (!$propertyMetadata instanceof PropertyMetadataInterface) {
throw new UnsupportedMetadataException(\sprintf('The property metadata instances should implement "Symfony\Component\Validator\Mapping\PropertyMetadataInterface", got: "%s".', get_debug_type($propertyMetadata)));
}

if ($propertyMetadata instanceof GetterMetadata) {
$propertyValue = new LazyProperty(static fn () => $propertyMetadata->getPropertyValue($object));
} else {
$propertyValue = $propertyMetadata->getPropertyValue($object);
}

$this->validateGenericNode(
$propertyValue,
$object,
$cacheKey.':'.$object::class.':'.$propertyName,
$propertyMetadata,
PropertyPath::append($propertyPath, $propertyName),
$groups,
$cascadedGroups,
TraversalStrategy::IMPLICIT,
$context
);
}
}



if ($traversalStrategy & TraversalStrategy::IMPLICIT) {
$traversalStrategy = $metadata->getTraversalStrategy();
}


if (!($traversalStrategy & (TraversalStrategy::IMPLICIT | TraversalStrategy::TRAVERSE))) {
return;
}


if ($traversalStrategy & TraversalStrategy::IMPLICIT && !$object instanceof \Traversable) {
return;
}


if (!$object instanceof \Traversable) {
throw new ConstraintDefinitionException(\sprintf('Traversal was enabled for "%s", but this class does not implement "\Traversable".', get_debug_type($object)));
}

$this->validateEachObjectIn(
$object,
$propertyPath,
$groups,
$context
);
}




















private function validateGenericNode(mixed $value, ?object $object, ?string $cacheKey, ?MetadataInterface $metadata, string $propertyPath, array $groups, ?array $cascadedGroups, int $traversalStrategy, ExecutionContextInterface $context): void
{
$context->setNode($value, $object, $metadata, $propertyPath);

foreach ($groups as $key => $group) {
if ($group instanceof GroupSequence) {
$this->stepThroughGroupSequence(
$value,
$object,
$cacheKey,
$metadata,
$propertyPath,
$traversalStrategy,
$group,
null,
$context
);



unset($groups[$key]);

continue;
}

$this->validateInGroup($value, $cacheKey, $metadata, $group, $context);
}

if (0 === \count($groups)) {
return;
}

if (null === $value) {
return;
}

$cascadingStrategy = $metadata->getCascadingStrategy();


if (!($cascadingStrategy & CascadingStrategy::CASCADE)) {
return;
}



if ($traversalStrategy & TraversalStrategy::IMPLICIT) {
$traversalStrategy = $metadata->getTraversalStrategy();
}




$cascadedGroups = null !== $cascadedGroups && \count($cascadedGroups) > 0 ? $cascadedGroups : $groups;

if ($value instanceof LazyProperty) {
$value = $value->getPropertyValue();

if (null === $value) {
return;
}
}

if (\is_array($value)) {


$this->validateEachObjectIn(
$value,
$propertyPath,
$cascadedGroups,
$context
);

return;
}

if (!\is_object($value)) {
throw new NoSuchMetadataException(\sprintf('Cannot create metadata for non-objects. Got: "%s".', \gettype($value)));
}

$this->validateObject(
$value,
$propertyPath,
$cascadedGroups,
$traversalStrategy,
$context
);







}







private function stepThroughGroupSequence(mixed $value, ?object $object, ?string $cacheKey, ?MetadataInterface $metadata, string $propertyPath, int $traversalStrategy, GroupSequence $groupSequence, ?string $cascadedGroup, ExecutionContextInterface $context): void
{
$violationCount = \count($context->getViolations());
$cascadedGroups = $cascadedGroup ? [$cascadedGroup] : null;

foreach ($groupSequence->groups as $groupInSequence) {
$groups = (array) $groupInSequence;

if ($metadata instanceof ClassMetadataInterface) {
$this->validateClassNode(
$value,
$cacheKey,
$metadata,
$propertyPath,
$groups,
$cascadedGroups,
$traversalStrategy,
$context
);
} else {
$this->validateGenericNode(
$value,
$object,
$cacheKey,
$metadata,
$propertyPath,
$groups,
$cascadedGroups,
$traversalStrategy,
$context
);
}


if (\count($context->getViolations()) > $violationCount) {
break;
}
}
}




private function validateInGroup(mixed $value, ?string $cacheKey, MetadataInterface $metadata, string $group, ExecutionContextInterface $context): void
{
$context->setGroup($group);

foreach ($metadata->findConstraints($group) as $constraint) {
if ($constraint instanceof Existence) {
continue;
}



if (null !== $cacheKey) {
$constraintHash = $this->generateCacheKey($constraint, true);


if ($constraint instanceof Composite || $constraint instanceof Valid) {
$constraintHash .= $group;
}

if ($context->isConstraintValidated($cacheKey, $constraintHash)) {
continue;
}

$context->markConstraintAsValidated($cacheKey, $constraintHash);
}

$context->setConstraint($constraint);

$validator = $this->validatorFactory->getInstance($constraint);
$validator->initialize($context);

if ($value instanceof LazyProperty) {
$value = $value->getPropertyValue();
}

try {
$validator->validate($value, $constraint);
} catch (UnexpectedValueException $e) {
$context->buildViolation('This value should be of type {{ type }}.')
->setParameter('{{ type }}', $e->getExpectedType())
->addViolation();
}
}
}

private function generateCacheKey(object $object, bool $dependsOnPropertyPath = false): string
{
if ($this->context instanceof ExecutionContext) {
$cacheKey = $this->context->generateCacheKey($object);
} else {
$cacheKey = spl_object_hash($object);
}

if ($dependsOnPropertyPath) {
$cacheKey .= $this->context->getPropertyPath();
}

return $cacheKey;
}
}
<?php










namespace Symfony\Component\Validator\Attribute;

#[\Attribute(\Attribute::TARGET_METHOD)]
final class HasNamedArguments
{
}
<?php










namespace Symfony\Component\Validator\Util;








class PropertyPath
{









public static function append(string $basePath, string $subPath): string
{
if ('' !== $subPath) {
if ('[' === $subPath[0]) {
return $basePath.$subPath;
}

return '' !== $basePath ? $basePath.'.'.$subPath : $subPath;
}

return $basePath;
}




private function __construct()
{
}
}
<?php










namespace Symfony\Component\Validator;

























interface ConstraintViolationInterface
{



public function getMessage(): string|\Stringable;








public function getMessageTemplate(): string;









public function getParameters(): array;















public function getPlural(): ?int;









public function getRoot(): mixed;













public function getPropertyPath(): string;







public function getInvalidValue(): mixed;




public function getCode(): ?string;
}
<?php










namespace Symfony\Component\Validator\Context;

use Symfony\Component\Validator\Validator\ValidatorInterface;









interface ExecutionContextFactoryInterface
{






public function createContext(ValidatorInterface $validator, mixed $root): ExecutionContextInterface;
}
<?php










namespace Symfony\Component\Validator\Context;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Mapping\ClassMetadataInterface;
use Symfony\Component\Validator\Mapping\MemberMetadata;
use Symfony\Component\Validator\Mapping\MetadataInterface;
use Symfony\Component\Validator\Mapping\PropertyMetadataInterface;
use Symfony\Component\Validator\Util\PropertyPath;
use Symfony\Component\Validator\Validator\LazyProperty;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilder;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;










class ExecutionContext implements ExecutionContextInterface
{
private ValidatorInterface $validator;




private mixed $root;

private TranslatorInterface $translator;
private ?string $translationDomain;




private ConstraintViolationList $violations;




private mixed $value = null;




private ?object $object = null;




private string $propertyPath = '';




private ?MetadataInterface $metadata = null;




private ?string $group = null;




private ?Constraint $constraint = null;






private array $validatedObjects = [];






private array $validatedConstraints = [];






private array $initializedObjects = [];




private \SplObjectStorage $cachedObjectsRefs;




public function __construct(ValidatorInterface $validator, mixed $root, TranslatorInterface $translator, ?string $translationDomain = null)
{
$this->validator = $validator;
$this->root = $root;
$this->translator = $translator;
$this->translationDomain = $translationDomain;
$this->violations = new ConstraintViolationList();
$this->cachedObjectsRefs = new \SplObjectStorage();
}

public function setNode(mixed $value, ?object $object, ?MetadataInterface $metadata, string $propertyPath): void
{
$this->value = $value;
$this->object = $object;
$this->metadata = $metadata;
$this->propertyPath = $propertyPath;
}

public function setGroup(?string $group): void
{
$this->group = $group;
}

public function setConstraint(Constraint $constraint): void
{
$this->constraint = $constraint;
}

public function addViolation(string|\Stringable $message, array $parameters = []): void
{
$this->violations->add(new ConstraintViolation(
$this->translator->trans($message, $parameters, $this->translationDomain),
$message,
$parameters,
$this->root,
$this->propertyPath,
$this->getValue(),
null,
null,
$this->constraint
));
}

public function buildViolation(string|\Stringable $message, array $parameters = []): ConstraintViolationBuilderInterface
{
return new ConstraintViolationBuilder(
$this->violations,
$this->constraint,
$message,
$parameters,
$this->root,
$this->propertyPath,
$this->getValue(),
$this->translator,
$this->translationDomain
);
}

public function getViolations(): ConstraintViolationListInterface
{
return $this->violations;
}

public function getValidator(): ValidatorInterface
{
return $this->validator;
}

public function getRoot(): mixed
{
return $this->root;
}

public function getValue(): mixed
{
if ($this->value instanceof LazyProperty) {
return $this->value->getPropertyValue();
}

return $this->value;
}

public function getObject(): ?object
{
return $this->object;
}

public function getMetadata(): ?MetadataInterface
{
return $this->metadata;
}

public function getGroup(): ?string
{
return $this->group;
}

public function getConstraint(): ?Constraint
{
return $this->constraint;
}

public function getClassName(): ?string
{
return $this->metadata instanceof MemberMetadata || $this->metadata instanceof ClassMetadataInterface ? $this->metadata->getClassName() : null;
}

public function getPropertyName(): ?string
{
return $this->metadata instanceof PropertyMetadataInterface ? $this->metadata->getPropertyName() : null;
}

public function getPropertyPath(string $subPath = ''): string
{
return PropertyPath::append($this->propertyPath, $subPath);
}

public function markGroupAsValidated(string $cacheKey, string $groupHash): void
{
if (!isset($this->validatedObjects[$cacheKey])) {
$this->validatedObjects[$cacheKey] = [];
}

$this->validatedObjects[$cacheKey][$groupHash] = true;
}

public function isGroupValidated(string $cacheKey, string $groupHash): bool
{
return isset($this->validatedObjects[$cacheKey][$groupHash]);
}

public function markConstraintAsValidated(string $cacheKey, string $constraintHash): void
{
$this->validatedConstraints[$cacheKey.':'.$constraintHash] = true;
}

public function isConstraintValidated(string $cacheKey, string $constraintHash): bool
{
return isset($this->validatedConstraints[$cacheKey.':'.$constraintHash]);
}

public function markObjectAsInitialized(string $cacheKey): void
{
$this->initializedObjects[$cacheKey] = true;
}

public function isObjectInitialized(string $cacheKey): bool
{
return isset($this->initializedObjects[$cacheKey]);
}




public function generateCacheKey(object $object): string
{
if (!isset($this->cachedObjectsRefs[$object])) {
$this->cachedObjectsRefs[$object] = spl_object_hash($object);
}

return $this->cachedObjectsRefs[$object];
}

public function __clone()
{
$this->violations = clone $this->violations;
}
}
<?php










namespace Symfony\Component\Validator\Context;

use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;








class ExecutionContextFactory implements ExecutionContextFactoryInterface
{
private TranslatorInterface $translator;
private ?string $translationDomain;

public function __construct(TranslatorInterface $translator, ?string $translationDomain = null)
{
$this->translator = $translator;
$this->translationDomain = $translationDomain;
}

public function createContext(ValidatorInterface $validator, mixed $root): ExecutionContextInterface
{
return new ExecutionContext(
$validator,
$root,
$this->translator,
$this->translationDomain
);
}
}
<?php










namespace Symfony\Component\Validator\Context;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Mapping;
use Symfony\Component\Validator\Mapping\MetadataInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilderInterface;










































interface ExecutionContextInterface
{








public function addViolation(string $message, array $params = []);
















public function buildViolation(string $message, array $parameters = []): ConstraintViolationBuilderInterface;

















public function getValidator(): ValidatorInterface;











public function getObject(): ?object;









public function setNode(mixed $value, ?object $object, ?MetadataInterface $metadata, string $propertyPath);








public function setGroup(?string $group);






public function setConstraint(Constraint $constraint);










public function markGroupAsValidated(string $cacheKey, string $groupHash);








public function isGroupValidated(string $cacheKey, string $groupHash): bool;









public function markConstraintAsValidated(string $cacheKey, string $constraintHash);







public function isConstraintValidated(string $cacheKey, string $constraintHash): bool;








public function markObjectAsInitialized(string $cacheKey): void;








public function isObjectInitialized(string $cacheKey): bool;




public function getViolations(): ConstraintViolationListInterface;










public function getRoot(): mixed;







public function getValue(): mixed;














public function getMetadata(): ?MetadataInterface;




public function getGroup(): ?string;








public function getClassName(): ?string;








public function getPropertyName(): ?string;
































public function getPropertyPath(string $subPath = ''): string;
}
<?php










namespace Symfony\Component\Validator;










interface ObjectInitializerInterface
{



public function initialize(object $object);
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Validator\Mapping;

















class TraversalStrategy
{




public const IMPLICIT = 1;




public const NONE = 2;





public const TRAVERSE = 4;




private function __construct()
{
}
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Exception\ValidatorException;














class PropertyMetadata extends MemberMetadata
{






public function __construct(string $class, string $name)
{
if (!property_exists($class, $name)) {
throw new ValidatorException(\sprintf('Property "%s" does not exist in class "%s".', $name, $class));
}

parent::__construct($class, $name, $name);
}

public function getPropertyValue(mixed $object): mixed
{
$reflProperty = $this->getReflectionMember($object);

if ($reflProperty->hasType() && !$reflProperty->isInitialized($object)) {





if (!method_exists($object, '__get')) {
return null;
}

try {
return $reflProperty->getValue($object);
} catch (\Error) {
return null;
}
}

return $reflProperty->getValue($object);
}

protected function newReflectionMember(object|string $objectOrClassName): \ReflectionMethod|\ReflectionProperty
{
$originalClass = \is_string($objectOrClassName) ? $objectOrClassName : $objectOrClassName::class;

while (!property_exists($objectOrClassName, $this->getName())) {
$objectOrClassName = get_parent_class($objectOrClassName);

if (false === $objectOrClassName) {
throw new ValidatorException(\sprintf('Property "%s" does not exist in class "%s".', $this->getName(), $originalClass));
}
}

return new \ReflectionProperty($objectOrClassName, $this->getName());
}
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Exception\ValidatorException;


















class GetterMetadata extends MemberMetadata
{







public function __construct(string $class, string $property, ?string $method = null)
{
if (null === $method) {
$getMethod = 'get'.ucfirst($property);
$isMethod = 'is'.ucfirst($property);
$hasMethod = 'has'.ucfirst($property);

if (method_exists($class, $getMethod)) {
$method = $getMethod;
} elseif (method_exists($class, $isMethod)) {
$method = $isMethod;
} elseif (method_exists($class, $hasMethod)) {
$method = $hasMethod;
} else {
throw new ValidatorException(\sprintf('Neither of these methods exist in class "%s": "%s", "%s", "%s".', $class, $getMethod, $isMethod, $hasMethod));
}
} elseif (!method_exists($class, $method)) {
throw new ValidatorException(\sprintf('The "%s()" method does not exist in class "%s".', $method, $class));
}

parent::__construct($class, $method, $property);
}

public function getPropertyValue(mixed $object): mixed
{
return $this->newReflectionMember($object)->invoke($object);
}

protected function newReflectionMember(object|string $objectOrClassName): \ReflectionMethod|\ReflectionProperty
{
return new \ReflectionMethod($objectOrClassName, $this->getName());
}
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Cascade;
use Symfony\Component\Validator\Constraints\DisableAutoMapping;
use Symfony\Component\Validator\Constraints\EnableAutoMapping;
use Symfony\Component\Validator\Constraints\Traverse;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;








class GenericMetadata implements MetadataInterface
{







public array $constraints = [];








public array $constraintsByGroup = [];












public int $cascadingStrategy = CascadingStrategy::NONE;












public int $traversalStrategy = TraversalStrategy::NONE;










public int $autoMappingStrategy = AutoMappingStrategy::NONE;






public function __sleep(): array
{
return [
'constraints',
'constraintsByGroup',
'cascadingStrategy',
'traversalStrategy',
'autoMappingStrategy',
];
}




public function __clone()
{
$constraints = $this->constraints;

$this->constraints = [];
$this->constraintsByGroup = [];

foreach ($constraints as $constraint) {
$this->addConstraint(clone $constraint);
}
}

















public function addConstraint(Constraint $constraint): static
{
if ($constraint instanceof Traverse || $constraint instanceof Cascade) {
throw new ConstraintDefinitionException(\sprintf('The constraint "%s" can only be put on classes. Please use "Symfony\Component\Validator\Constraints\Valid" instead.', get_debug_type($constraint)));
}

if ($constraint instanceof Valid && null === $constraint->groups) {
$this->cascadingStrategy = CascadingStrategy::CASCADE;

if ($constraint->traverse) {
$this->traversalStrategy = TraversalStrategy::IMPLICIT;
} else {
$this->traversalStrategy = TraversalStrategy::NONE;
}

return $this;
}

if ($constraint instanceof DisableAutoMapping || $constraint instanceof EnableAutoMapping) {
$this->autoMappingStrategy = $constraint instanceof EnableAutoMapping ? AutoMappingStrategy::ENABLED : AutoMappingStrategy::DISABLED;


return $this;
}

$this->constraints[] = $constraint;

foreach ($constraint->groups as $group) {
$this->constraintsByGroup[$group][] = $constraint;
}

return $this;
}








public function addConstraints(array $constraints): static
{
foreach ($constraints as $constraint) {
$this->addConstraint($constraint);
}

return $this;
}




public function getConstraints(): array
{
return $this->constraints;
}




public function hasConstraints(): bool
{
return \count($this->constraints) > 0;
}






public function findConstraints(string $group): array
{
return $this->constraintsByGroup[$group] ?? [];
}

public function getCascadingStrategy(): int
{
return $this->cascadingStrategy;
}

public function getTraversalStrategy(): int
{
return $this->traversalStrategy;
}




public function getAutoMappingStrategy(): int
{
return $this->autoMappingStrategy;
}
}
<?php










namespace Symfony\Component\Validator\Mapping;





















class CascadingStrategy
{



public const NONE = 1;




public const CASCADE = 2;




private function __construct()
{
}
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\GroupSequenceProviderInterface;




















interface ClassMetadataInterface extends MetadataInterface
{





public function getConstrainedProperties(): array;






public function hasGroupSequence(): bool;





public function getGroupSequence(): ?GroupSequence;










public function isGroupSequenceProvider(): bool;






public function hasPropertyMetadata(string $property): bool;











public function getPropertyMetadata(string $property): array;




public function getClassName(): string;
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraint;
















interface MetadataInterface
{





public function getCascadingStrategy(): int;






public function getTraversalStrategy(): int;






public function getConstraints(): array;








public function findConstraints(string $group): array;
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Cascade;
use Symfony\Component\Validator\Constraints\Composite;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\Traverse;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\GroupDefinitionException;
use Symfony\Component\Validator\GroupSequenceProviderInterface;









class ClassMetadata extends GenericMetadata implements ClassMetadataInterface
{





public string $name;






public string $defaultGroup;








public array $members = [];








public array $properties = [];








public array $getters = [];






public ?GroupSequence $groupSequence = null;






public bool $groupSequenceProvider = false;






public ?string $groupProvider = null;












public int $traversalStrategy = TraversalStrategy::IMPLICIT;

private \ReflectionClass $reflClass;

public function __construct(string $class)
{
$this->name = $class;

if (false !== $nsSep = strrpos($class, '\\')) {
$this->defaultGroup = substr($class, $nsSep + 1);
} else {
$this->defaultGroup = $class;
}
}

public function __sleep(): array
{
$parentProperties = parent::__sleep();


unset($parentProperties[array_search('cascadingStrategy', $parentProperties)]);

return array_merge($parentProperties, [
'getters',
'groupSequence',
'groupSequenceProvider',
'groupProvider',
'members',
'name',
'properties',
'defaultGroup',
]);
}

public function getClassName(): string
{
return $this->name;
}














public function getDefaultGroup(): string
{
return $this->defaultGroup;
}













public function addConstraint(Constraint $constraint): static
{
$this->checkConstraint($constraint);

if ($constraint instanceof Traverse) {
if ($constraint->traverse) {

$this->traversalStrategy = TraversalStrategy::TRAVERSE;
} else {

$this->traversalStrategy = TraversalStrategy::NONE;
}


return $this;
}

if ($constraint instanceof Cascade) {
$this->cascadingStrategy = CascadingStrategy::CASCADE;

foreach ($this->getReflectionClass()->getProperties() as $property) {
if (isset($constraint->exclude[$property->getName()])) {
continue;
}

if ($this->canCascade($property->getType())) {
$this->addPropertyConstraint($property->getName(), new Valid());
}
}


return $this;
}

$constraint->addImplicitGroupName($this->getDefaultGroup());

parent::addConstraint($constraint);

return $this;
}






public function addPropertyConstraint(string $property, Constraint $constraint): static
{
if (!isset($this->properties[$property])) {
$this->properties[$property] = new PropertyMetadata($this->getClassName(), $property);

$this->addPropertyMetadata($this->properties[$property]);
}

$constraint->addImplicitGroupName($this->getDefaultGroup());

$this->properties[$property]->addConstraint($constraint);

return $this;
}






public function addPropertyConstraints(string $property, array $constraints): static
{
foreach ($constraints as $constraint) {
$this->addPropertyConstraint($property, $constraint);
}

return $this;
}









public function addGetterConstraint(string $property, Constraint $constraint): static
{
if (!isset($this->getters[$property])) {
$this->getters[$property] = new GetterMetadata($this->getClassName(), $property);

$this->addPropertyMetadata($this->getters[$property]);
}

$constraint->addImplicitGroupName($this->getDefaultGroup());

$this->getters[$property]->addConstraint($constraint);

return $this;
}






public function addGetterMethodConstraint(string $property, string $method, Constraint $constraint): static
{
if (!isset($this->getters[$property])) {
$this->getters[$property] = new GetterMetadata($this->getClassName(), $property, $method);

$this->addPropertyMetadata($this->getters[$property]);
}

$constraint->addImplicitGroupName($this->getDefaultGroup());

$this->getters[$property]->addConstraint($constraint);

return $this;
}






public function addGetterConstraints(string $property, array $constraints): static
{
foreach ($constraints as $constraint) {
$this->addGetterConstraint($property, $constraint);
}

return $this;
}






public function addGetterMethodConstraints(string $property, string $method, array $constraints): static
{
foreach ($constraints as $constraint) {
$this->addGetterMethodConstraint($property, $method, $constraint);
}

return $this;
}






public function mergeConstraints(self $source)
{
if ($source->isGroupSequenceProvider()) {
$this->setGroupProvider($source->getGroupProvider());
$this->setGroupSequenceProvider(true);
}

foreach ($source->getConstraints() as $constraint) {
$this->addConstraint(clone $constraint);
}

foreach ($source->getConstrainedProperties() as $property) {
foreach ($source->getPropertyMetadata($property) as $member) {
$member = clone $member;

foreach ($member->getConstraints() as $constraint) {
if (\in_array($constraint::DEFAULT_GROUP, $constraint->groups, true)) {
$member->constraintsByGroup[$this->getDefaultGroup()][] = $constraint;
}

$constraint->addImplicitGroupName($this->getDefaultGroup());
}

if ($member instanceof MemberMetadata && !$member->isPrivate($this->name)) {
$property = $member->getPropertyName();
$this->members[$property][] = $member;

if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
$this->properties[$property] = $member;
} elseif ($member instanceof GetterMetadata && !isset($this->getters[$property])) {
$this->getters[$property] = $member;
}
} else {
$this->addPropertyMetadata($member);
}
}
}
}

public function hasPropertyMetadata(string $property): bool
{
return \array_key_exists($property, $this->members);
}

public function getPropertyMetadata(string $property): array
{
return $this->members[$property] ?? [];
}

public function getConstrainedProperties(): array
{
return array_keys($this->members);
}










public function setGroupSequence(array|GroupSequence $groupSequence): static
{
if ($this->isGroupSequenceProvider()) {
throw new GroupDefinitionException('Defining a static group sequence is not allowed with a group sequence provider.');
}

if (\is_array($groupSequence)) {
$groupSequence = new GroupSequence($groupSequence);
}

if (\in_array(Constraint::DEFAULT_GROUP, $groupSequence->groups, true)) {
throw new GroupDefinitionException(\sprintf('The group "%s" is not allowed in group sequences.', Constraint::DEFAULT_GROUP));
}

if (!\in_array($this->getDefaultGroup(), $groupSequence->groups, true)) {
throw new GroupDefinitionException(\sprintf('The group "%s" is missing in the group sequence.', $this->getDefaultGroup()));
}

$this->groupSequence = $groupSequence;

return $this;
}

public function hasGroupSequence(): bool
{
return isset($this->groupSequence) && \count($this->groupSequence->groups) > 0;
}

public function getGroupSequence(): ?GroupSequence
{
return $this->groupSequence;
}




public function getReflectionClass(): \ReflectionClass
{
return $this->reflClass ??= new \ReflectionClass($this->getClassName());
}








public function setGroupSequenceProvider(bool $active)
{
if ($this->hasGroupSequence()) {
throw new GroupDefinitionException('Defining a group sequence provider is not allowed with a static group sequence.');
}

if (null === $this->groupProvider && !$this->getReflectionClass()->implementsInterface(GroupSequenceProviderInterface::class)) {
throw new GroupDefinitionException(\sprintf('Class "%s" must implement GroupSequenceProviderInterface.', $this->name));
}

$this->groupSequenceProvider = $active;
}

public function isGroupSequenceProvider(): bool
{
return $this->groupSequenceProvider;
}

public function setGroupProvider(?string $provider): void
{
$this->groupProvider = $provider;
}

public function getGroupProvider(): ?string
{
return $this->groupProvider;
}

public function getCascadingStrategy(): int
{
return $this->cascadingStrategy;
}

private function addPropertyMetadata(PropertyMetadataInterface $metadata): void
{
$property = $metadata->getPropertyName();

$this->members[$property][] = $metadata;
}

private function checkConstraint(Constraint $constraint): void
{
if (!\in_array(Constraint::CLASS_CONSTRAINT, (array) $constraint->getTargets(), true)) {
throw new ConstraintDefinitionException(\sprintf('The constraint "%s" cannot be put on classes.', get_debug_type($constraint)));
}

if ($constraint instanceof Composite) {
foreach ($constraint->getNestedConstraints() as $nestedConstraint) {
$this->checkConstraint($nestedConstraint);
}
}
}

private function canCascade(?\ReflectionType $type = null): bool
{
if (null === $type) {
return false;
}

if ($type instanceof \ReflectionIntersectionType) {
foreach ($type->getTypes() as $nestedType) {
if ($this->canCascade($nestedType)) {
return true;
}
}

return false;
}

if ($type instanceof \ReflectionUnionType) {
foreach ($type->getTypes() as $nestedType) {
if (!$this->canCascade($nestedType)) {
return false;
}
}

return true;
}

return $type instanceof \ReflectionNamedType && (\in_array($type->getName(), ['array', 'null'], true) || class_exists($type->getName()));
}
}
<?php










namespace Symfony\Component\Validator\Mapping;

















interface PropertyMetadataInterface extends MetadataInterface
{



public function getPropertyName(): string;




public function getPropertyValue(mixed $containingValue): mixed;
}
<?php










namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Composite;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;













abstract class MemberMetadata extends GenericMetadata implements PropertyMetadataInterface
{





public string $class;






public string $name;






public string $property;




private array $reflMember = [];






public function __construct(string $class, string $name, string $property)
{
$this->class = $class;
$this->name = $name;
$this->property = $property;
}

public function addConstraint(Constraint $constraint): static
{
$this->checkConstraint($constraint);

parent::addConstraint($constraint);

return $this;
}

public function __sleep(): array
{
return array_merge(parent::__sleep(), [
'class',
'name',
'property',
]);
}




public function getName(): string
{
return $this->name;
}




public function getClassName()
{
return $this->class;
}

public function getPropertyName(): string
{
return $this->property;
}




public function isPublic(object|string $objectOrClassName): bool
{
return $this->getReflectionMember($objectOrClassName)->isPublic();
}




public function isProtected(object|string $objectOrClassName): bool
{
return $this->getReflectionMember($objectOrClassName)->isProtected();
}




public function isPrivate(object|string $objectOrClassName): bool
{
return $this->getReflectionMember($objectOrClassName)->isPrivate();
}




public function getReflectionMember(object|string $objectOrClassName): \ReflectionMethod|\ReflectionProperty
{
$className = \is_string($objectOrClassName) ? $objectOrClassName : $objectOrClassName::class;
if (!isset($this->reflMember[$className])) {
$this->reflMember[$className] = $this->newReflectionMember($objectOrClassName);
}

return $this->reflMember[$className];
}




abstract protected function newReflectionMember(object|string $objectOrClassName): \ReflectionMethod|\ReflectionProperty;

private function checkConstraint(Constraint $constraint): void
{
if (!\in_array(Constraint::PROPERTY_CONSTRAINT, (array) $constraint->getTargets(), true)) {
throw new ConstraintDefinitionException(\sprintf('The constraint "%s" cannot be put on properties or getters.', get_debug_type($constraint)));
}

if ($constraint instanceof Composite) {
foreach ($constraint->getNestedConstraints() as $nestedConstraint) {
$this->checkConstraint($nestedConstraint);
}
}
}
}
<?php










namespace Symfony\Component\Validator\Mapping;






final class AutoMappingStrategy
{



public const NONE = 0;




public const ENABLED = 1;




public const DISABLED = 2;




private function __construct()
{
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Factory;

use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Validator\Exception\NoSuchMetadataException;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
use Symfony\Component\Validator\Mapping\MetadataInterface;





















class LazyLoadingMetadataFactory implements MetadataFactoryInterface
{
protected $loader;
protected $cache;






protected $loadedClasses = [];

public function __construct(?LoaderInterface $loader = null, ?CacheItemPoolInterface $cache = null)
{
$this->loader = $loader;
$this->cache = $cache;
}














public function getMetadataFor(mixed $value): MetadataInterface
{
if (!\is_object($value) && !\is_string($value)) {
throw new NoSuchMetadataException(\sprintf('Cannot create metadata for non-objects. Got: "%s".', get_debug_type($value)));
}

$class = ltrim(\is_object($value) ? $value::class : $value, '\\');

if (isset($this->loadedClasses[$class])) {
return $this->loadedClasses[$class];
}

if (!class_exists($class) && !interface_exists($class, false)) {
throw new NoSuchMetadataException(\sprintf('The class or interface "%s" does not exist.', $class));
}

$cacheItem = $this->cache?->getItem($this->escapeClassName($class));
if ($cacheItem?->isHit()) {
$metadata = $cacheItem->get();


$this->mergeConstraints($metadata);

return $this->loadedClasses[$class] = $metadata;
}

$metadata = new ClassMetadata($class);

$this->loader?->loadClassMetadata($metadata);

if (null !== $cacheItem) {
$this->cache->save($cacheItem->set($metadata));
}


$this->mergeConstraints($metadata);

return $this->loadedClasses[$class] = $metadata;
}

private function mergeConstraints(ClassMetadata $metadata): void
{
if ($metadata->getReflectionClass()->isInterface()) {
return;
}


if ($parent = $metadata->getReflectionClass()->getParentClass()) {
$metadata->mergeConstraints($this->getMetadataFor($parent->name));
}


foreach ($metadata->getReflectionClass()->getInterfaces() as $interface) {
if ('Symfony\Component\Validator\GroupSequenceProviderInterface' === $interface->name) {
continue;
}

if ($parent && \in_array($interface->getName(), $parent->getInterfaceNames(), true)) {
continue;
}

$metadata->mergeConstraints($this->getMetadataFor($interface->name));
}
}

public function hasMetadataFor(mixed $value): bool
{
if (!\is_object($value) && !\is_string($value)) {
return false;
}

$class = ltrim(\is_object($value) ? $value::class : $value, '\\');

return class_exists($class) || interface_exists($class, false);
}




private function escapeClassName(string $class): string
{
if (str_contains($class, '@')) {

return str_replace(["\0", '\\', '/', '@', ':', '{', '}', '(', ')'], '.', $class);
}

return str_replace('\\', '.', $class);
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Factory;

use Symfony\Component\Validator\Exception\NoSuchMetadataException;
use Symfony\Component\Validator\Mapping\MetadataInterface;






interface MetadataFactoryInterface
{





public function getMetadataFor(mixed $value): MetadataInterface;




public function hasMetadataFor(mixed $value): bool;
}
<?php










namespace Symfony\Component\Validator\Mapping\Factory;

use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Mapping\MetadataInterface;










class BlackHoleMetadataFactory implements MetadataFactoryInterface
{
public function getMetadataFor(mixed $value): MetadataInterface
{
throw new LogicException('This class does not support metadata.');
}

public function hasMetadataFor(mixed $value): bool
{
return false;
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;









class YamlFilesLoader extends FilesLoader
{
public function getFileLoaderInstance(string $file): LoaderInterface
{
return new YamlFileLoader($file);
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;









abstract class FileLoader extends AbstractLoader
{
protected $file;








public function __construct(string $file)
{
if (!is_file($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));
}

if (!stream_is_local($this->file)) {
throw new MappingException(\sprintf('The mapping file "%s" is not a local file.', $file));
}

$this->file = $file;
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Mapping\ClassMetadata;






interface LoaderInterface
{



public function loadClassMetadata(ClassMetadata $metadata): bool;
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;









class XmlFilesLoader extends FilesLoader
{
public function getFileLoaderInstance(string $file): LoaderInterface
{
return new XmlFileLoader($file);
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Mapping\AutoMappingStrategy;
use Symfony\Component\Validator\Mapping\ClassMetadata;






trait AutoMappingTrait
{
private function isAutoMappingEnabledForClass(ClassMetadata $metadata, ?string $classValidatorRegexp = null): bool
{

if (AutoMappingStrategy::NONE !== $strategy = $metadata->getAutoMappingStrategy()) {
return AutoMappingStrategy::ENABLED === $strategy;
}


return null !== $classValidatorRegexp && preg_match($classValidatorRegexp, $metadata->getClassName());
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;






class XmlFileLoader extends FileLoader
{





protected $classes;

public function __construct(string $file)
{
$this->file = $file;
}

public function loadClassMetadata(ClassMetadata $metadata): bool
{
if (!isset($this->classes)) {
$this->loadClassesFromXml();
}

if (isset($this->classes[$metadata->getClassName()])) {
$classDescription = $this->classes[$metadata->getClassName()];

$this->loadClassMetadataFromXml($metadata, $classDescription);

return true;
}

return false;
}






public function getMappedClasses(): array
{
if (!isset($this->classes)) {
$this->loadClassesFromXml();
}

return array_keys($this->classes);
}








protected function parseConstraints(\SimpleXMLElement $nodes): array
{
$constraints = [];

foreach ($nodes as $node) {
if (\count($node) > 0) {
if (\count($node->value) > 0) {
$options = [
'value' => $this->parseValues($node->value),
];
} elseif (\count($node->constraint) > 0) {
$options = $this->parseConstraints($node->constraint);
} elseif (\count($node->option) > 0) {
$options = $this->parseOptions($node->option);
} else {
$options = [];
}
} elseif ('' !== (string) $node) {
$options = XmlUtils::phpize(trim($node));
} else {
$options = null;
}

if (isset($options['groups']) && !\is_array($options['groups'])) {
$options['groups'] = (array) $options['groups'];
}

$constraints[] = $this->newConstraint((string) $node['name'], $options);
}

return $constraints;
}






protected function parseValues(\SimpleXMLElement $nodes): array
{
$values = [];

foreach ($nodes as $node) {
if (\count($node) > 0) {
if (\count($node->value) > 0) {
$value = $this->parseValues($node->value);
} elseif (\count($node->constraint) > 0) {
$value = $this->parseConstraints($node->constraint);
} else {
$value = [];
}
} else {
$value = trim($node);
}

if (isset($node['key'])) {
$values[(string) $node['key']] = $value;
} else {
$values[] = $value;
}
}

return $values;
}






protected function parseOptions(\SimpleXMLElement $nodes): array
{
$options = [];

foreach ($nodes as $node) {
if (\count($node) > 0) {
if (\count($node->value) > 0) {
$value = $this->parseValues($node->value);
} elseif (\count($node->constraint) > 0) {
$value = $this->parseConstraints($node->constraint);
} else {
$value = [];
}
} else {
$value = XmlUtils::phpize($node);
if (\is_string($value)) {
$value = trim($value);
}
}

$options[(string) $node['name']] = $value;
}

return $options;
}






protected function parseFile(string $path): \SimpleXMLElement
{
try {
$dom = XmlUtils::loadFile($path, __DIR__.'/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd');
} catch (\Exception $e) {
throw new MappingException($e->getMessage(), $e->getCode(), $e);
}

return simplexml_import_dom($dom);
}

private function loadClassesFromXml(): void
{
parent::__construct($this->file);



$xml = $this->parseFile($this->file);

$this->classes = [];

foreach ($xml->namespace as $namespace) {
$this->addNamespaceAlias((string) $namespace['prefix'], trim((string) $namespace));
}

foreach ($xml->class as $class) {
$this->classes[(string) $class['name']] = $class;
}
}

private function loadClassMetadataFromXml(ClassMetadata $metadata, \SimpleXMLElement $classDescription): void
{
if (\count($classDescription->{'group-sequence-provider'}) > 0) {
$metadata->setGroupProvider($classDescription->{'group-sequence-provider'}[0]->value ?: null);
$metadata->setGroupSequenceProvider(true);
}

foreach ($classDescription->{'group-sequence'} as $groupSequence) {
if (\count($groupSequence->value) > 0) {
$metadata->setGroupSequence($this->parseValues($groupSequence[0]->value));
}
}

foreach ($this->parseConstraints($classDescription->constraint) as $constraint) {
$metadata->addConstraint($constraint);
}

foreach ($classDescription->property as $property) {
foreach ($this->parseConstraints($property->constraint) as $constraint) {
$metadata->addPropertyConstraint((string) $property['name'], $constraint);
}
}

foreach ($classDescription->getter as $getter) {
foreach ($this->parseConstraints($getter->constraint) as $constraint) {
$metadata->addGetterConstraint((string) $getter['property'], $constraint);
}
}
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\PropertyInfo\PropertyAccessExtractorInterface;
use Symfony\Component\PropertyInfo\PropertyListExtractorInterface;
use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface;
use Symfony\Component\PropertyInfo\Type as PropertyInfoType;
use Symfony\Component\Validator\Constraints\All;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\NotNull;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Mapping\AutoMappingStrategy;
use Symfony\Component\Validator\Mapping\ClassMetadata;






final class PropertyInfoLoader implements LoaderInterface
{
use AutoMappingTrait;

private PropertyListExtractorInterface $listExtractor;
private PropertyTypeExtractorInterface $typeExtractor;
private PropertyAccessExtractorInterface $accessExtractor;
private ?string $classValidatorRegexp;

public function __construct(PropertyListExtractorInterface $listExtractor, PropertyTypeExtractorInterface $typeExtractor, PropertyAccessExtractorInterface $accessExtractor, ?string $classValidatorRegexp = null)
{
$this->listExtractor = $listExtractor;
$this->typeExtractor = $typeExtractor;
$this->accessExtractor = $accessExtractor;
$this->classValidatorRegexp = $classValidatorRegexp;
}

public function loadClassMetadata(ClassMetadata $metadata): bool
{
$className = $metadata->getClassName();
if (!$properties = $this->listExtractor->getProperties($className)) {
return false;
}

$loaded = false;
$enabledForClass = $this->isAutoMappingEnabledForClass($metadata, $this->classValidatorRegexp);
foreach ($properties as $property) {
if (false === $this->accessExtractor->isWritable($className, $property)) {
continue;
}

if (!property_exists($className, $property)) {
continue;
}

$types = $this->typeExtractor->getTypes($className, $property);
if (null === $types) {
continue;
}

$enabledForProperty = $enabledForClass;
$hasTypeConstraint = false;
$hasNotNullConstraint = false;
$hasNotBlankConstraint = false;
$allConstraint = null;
foreach ($metadata->getPropertyMetadata($property) as $propertyMetadata) {

if (AutoMappingStrategy::DISABLED === $propertyMetadata->getAutoMappingStrategy()) {
continue 2;
}

if (AutoMappingStrategy::ENABLED === $propertyMetadata->getAutoMappingStrategy()) {
$enabledForProperty = true;
}

foreach ($propertyMetadata->getConstraints() as $constraint) {
if ($constraint instanceof Type) {
$hasTypeConstraint = true;
} elseif ($constraint instanceof NotNull) {
$hasNotNullConstraint = true;
} elseif ($constraint instanceof NotBlank) {
$hasNotBlankConstraint = true;
} elseif ($constraint instanceof All) {
$allConstraint = $constraint;
}
}
}

if (!$enabledForProperty) {
continue;
}

$loaded = true;
$builtinTypes = [];
$nullable = false;
$scalar = true;
foreach ($types as $type) {
$builtinTypes[] = $type->getBuiltinType();

if ($scalar && !\in_array($type->getBuiltinType(), [PropertyInfoType::BUILTIN_TYPE_INT, PropertyInfoType::BUILTIN_TYPE_FLOAT, PropertyInfoType::BUILTIN_TYPE_STRING, PropertyInfoType::BUILTIN_TYPE_BOOL], true)) {
$scalar = false;
}

if (!$nullable && $type->isNullable()) {
$nullable = true;
}
}
if (!$hasTypeConstraint) {
if (1 === \count($builtinTypes)) {
if ($types[0]->isCollection() && \count($collectionValueType = $types[0]->getCollectionValueTypes()) > 0) {
[$collectionValueType] = $collectionValueType;
$this->handleAllConstraint($property, $allConstraint, $collectionValueType, $metadata);
}

$metadata->addPropertyConstraint($property, $this->getTypeConstraint($builtinTypes[0], $types[0]));
} elseif ($scalar) {
$metadata->addPropertyConstraint($property, new Type(['type' => 'scalar']));
}
}

if (!$nullable && !$hasNotBlankConstraint && !$hasNotNullConstraint) {
$metadata->addPropertyConstraint($property, new NotNull());
}
}

return $loaded;
}

private function getTypeConstraint(string $builtinType, PropertyInfoType $type): Type
{
if (PropertyInfoType::BUILTIN_TYPE_OBJECT === $builtinType && null !== $className = $type->getClassName()) {
return new Type(['type' => $className]);
}

return new Type(['type' => $builtinType]);
}

private function handleAllConstraint(string $property, ?All $allConstraint, PropertyInfoType $propertyInfoType, ClassMetadata $metadata): void
{
$containsTypeConstraint = false;
$containsNotNullConstraint = false;
if (null !== $allConstraint) {
foreach ($allConstraint->constraints as $constraint) {
if ($constraint instanceof Type) {
$containsTypeConstraint = true;
} elseif ($constraint instanceof NotNull) {
$containsNotNullConstraint = true;
}
}
}

$constraints = [];
if (!$containsNotNullConstraint && !$propertyInfoType->isNullable()) {
$constraints[] = new NotNull();
}

if (!$containsTypeConstraint) {
$constraints[] = $this->getTypeConstraint($propertyInfoType->getBuiltinType(), $propertyInfoType);
}

if (null === $allConstraint) {
$metadata->addPropertyConstraint($property, new All(['constraints' => $constraints]));
} else {
$allConstraint->constraints = array_merge($allConstraint->constraints, $constraints);
}
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\Yaml\Yaml;






class YamlFileLoader extends FileLoader
{





protected $classes;

public function __construct(string $file)
{
$this->file = $file;
}




private YamlParser $yamlParser;

public function loadClassMetadata(ClassMetadata $metadata): bool
{
if (!isset($this->classes)) {
$this->loadClassesFromYaml();
}

if (isset($this->classes[$metadata->getClassName()])) {
$classDescription = $this->classes[$metadata->getClassName()];

$this->loadClassMetadataFromYaml($metadata, $classDescription);

return true;
}

return false;
}






public function getMappedClasses(): array
{
if (!isset($this->classes)) {
$this->loadClassesFromYaml();
}

return array_keys($this->classes);
}








protected function parseNodes(array $nodes): array
{
$values = [];

foreach ($nodes as $name => $childNodes) {
if (is_numeric($name) && \is_array($childNodes) && 1 === \count($childNodes)) {
$options = current($childNodes);

if (\is_array($options)) {
$options = $this->parseNodes($options);
}

if (null !== $options && (!\is_array($options) || array_is_list($options))) {
$options = [
'value' => $options,
];
}

$values[] = $this->newConstraint(key($childNodes), $options);
} else {
if (\is_array($childNodes)) {
$childNodes = $this->parseNodes($childNodes);
}

$values[$name] = $childNodes;
}
}

return $values;
}







private function parseFile(string $path): array
{
try {
$classes = $this->yamlParser->parseFile($path, Yaml::PARSE_CONSTANT);
} catch (ParseException $e) {
throw new \InvalidArgumentException(\sprintf('The file "%s" does not contain valid YAML: ', $path).$e->getMessage(), 0, $e);
}


if (null === $classes) {
return [];
}


if (!\is_array($classes)) {
throw new \InvalidArgumentException(\sprintf('The file "%s" must contain a YAML array.', $this->file));
}

return $classes;
}

private function loadClassesFromYaml(): void
{
parent::__construct($this->file);

$this->yamlParser ??= new YamlParser();
$this->classes = $this->parseFile($this->file);

if (isset($this->classes['namespaces'])) {
foreach ($this->classes['namespaces'] as $alias => $namespace) {
$this->addNamespaceAlias($alias, $namespace);
}

unset($this->classes['namespaces']);
}
}

private function loadClassMetadataFromYaml(ClassMetadata $metadata, array $classDescription): void
{
if (isset($classDescription['group_sequence_provider'])) {
if (\is_string($classDescription['group_sequence_provider'])) {
$metadata->setGroupProvider($classDescription['group_sequence_provider']);
}
$metadata->setGroupSequenceProvider(
(bool) $classDescription['group_sequence_provider']
);
}

if (isset($classDescription['group_sequence'])) {
$metadata->setGroupSequence($classDescription['group_sequence']);
}

if (isset($classDescription['constraints']) && \is_array($classDescription['constraints'])) {
foreach ($this->parseNodes($classDescription['constraints']) as $constraint) {
$metadata->addConstraint($constraint);
}
}

if (isset($classDescription['properties']) && \is_array($classDescription['properties'])) {
foreach ($classDescription['properties'] as $property => $constraints) {
if (null !== $constraints) {
foreach ($this->parseNodes($constraints) as $constraint) {
$metadata->addPropertyConstraint($property, $constraint);
}
}
}
}

if (isset($classDescription['getters']) && \is_array($classDescription['getters'])) {
foreach ($classDescription['getters'] as $getter => $constraints) {
if (null !== $constraints) {
foreach ($this->parseNodes($constraints) as $constraint) {
$metadata->addGetterConstraint($getter, $constraint);
}
}
}
}
}
}
<?xml version="1.0" ?>

<xsd:schema xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema/dic/constraint-mapping"
    elementFormDefault="qualified">

  <xsd:annotation>
    <xsd:documentation><![CDATA[
      Symfony Validator Constraint Mapping Schema, version 1.0
      Authors: Bernhard Schussek

      A constraint mapping connects classes, properties and getters with
      validation constraints.
    ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:element name="constraint-mapping" type="constraint-mapping" />

  <xsd:complexType name="constraint-mapping">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        The root element of the constraint mapping definition.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="namespace" type="namespace" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="class" type="class" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="namespace">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains the abbreviation for a namespace.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="prefix" type="xsd:string" use="required" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="class">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a single class.

        Nested elements may be class constraints, property and/or getter
        definitions.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="group-sequence-provider" type="group-sequence-provider" minOccurs="0" maxOccurs="1" />
      <xsd:element name="group-sequence" type="group-sequence" minOccurs="0" maxOccurs="1" />
      <xsd:element name="constraint" type="constraint" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="getter" type="getter" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="group-sequence">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains the group sequence of a class. Each group should be written
        into a "value" tag.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="group-sequence-provider">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Defines the name of the group sequence provider for a class.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="value" type="value" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="property">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a single property. The name of the property
        should be given in the "name" option.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="getter">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a getter method. The name of the corresponding
        property should be given in the "property" option.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="property" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="constraint" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains a constraint definition. The name of the constraint should be
        given in the "name" option.

        May contain a single value, multiple "constraint" elements,
        multiple "value" elements or multiple "option" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="option" type="option" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="option" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains a constraint option definition. The name of the option
        should be given in the "name" option.

        May contain a single value, multiple "value" elements or multiple
        "constraint" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="value" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        A value of an element.

        May contain a single value, multiple "value" elements or multiple
        "constraint" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="key" type="xsd:string" use="optional" />
  </xsd:complexType>
</xsd:schema>
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Attribute\HasNamedArguments;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MappingException;












abstract class AbstractLoader implements LoaderInterface
{



public const DEFAULT_NAMESPACE = '\\Symfony\\Component\\Validator\\Constraints\\';

protected $namespaces = [];




private array $namedArgumentsCache = [];













protected function addNamespaceAlias(string $alias, string $namespace)
{
$this->namespaces[$alias] = $namespace;
}














protected function newConstraint(string $name, mixed $options = null): Constraint
{
if (str_contains($name, '\\') && class_exists($name)) {
$className = $name;
} elseif (str_contains($name, ':')) {
[$prefix, $className] = explode(':', $name, 2);

if (!isset($this->namespaces[$prefix])) {
throw new MappingException(\sprintf('Undefined namespace prefix "%s".', $prefix));
}

$className = $this->namespaces[$prefix].$className;
} else {
$className = self::DEFAULT_NAMESPACE.$name;
}

if ($this->namedArgumentsCache[$className] ??= (bool) (new \ReflectionMethod($className, '__construct'))->getAttributes(HasNamedArguments::class)) {
if (null === $options) {
return new $className();
}

if (!\is_array($options)) {
return new $className($options);
}

if (1 === \count($options) && isset($options['value'])) {
return new $className($options['value']);
}

return new $className(...$options);
}

return new $className($options);
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;








class AttributeLoader extends AnnotationLoader
{
public function __construct()
{
parent::__construct(null);
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Doctrine\Common\Annotations\Reader;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\GroupSequenceProvider;
use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;









class AnnotationLoader implements LoaderInterface
{





protected $reader;

public function __construct(?Reader $reader = null)
{
$this->reader = $reader;
}

public function loadClassMetadata(ClassMetadata $metadata): bool
{
$reflClass = $metadata->getReflectionClass();
$className = $reflClass->name;
$success = false;

foreach ($this->getAnnotations($reflClass) as $constraint) {
if ($constraint instanceof GroupSequence) {
$metadata->setGroupSequence($constraint->groups);
} elseif ($constraint instanceof GroupSequenceProvider) {
$metadata->setGroupProvider($constraint->provider);
$metadata->setGroupSequenceProvider(true);
} elseif ($constraint instanceof Constraint) {
$metadata->addConstraint($constraint);
}

$success = true;
}

foreach ($reflClass->getProperties() as $property) {
if ($property->getDeclaringClass()->name === $className) {
foreach ($this->getAnnotations($property) as $constraint) {
if ($constraint instanceof Constraint) {
$metadata->addPropertyConstraint($property->name, $constraint);
}

$success = true;
}
}
}

foreach ($reflClass->getMethods() as $method) {
if ($method->getDeclaringClass()->name === $className) {
foreach ($this->getAnnotations($method) as $constraint) {
if ($constraint instanceof Callback) {
$constraint->callback = $method->getName();

$metadata->addConstraint($constraint);
} elseif ($constraint instanceof Constraint) {
if (preg_match('/^(get|is|has)(.+)$/i', $method->name, $matches)) {
$metadata->addGetterMethodConstraint(lcfirst($matches[2]), $matches[0], $constraint);
} else {
throw new MappingException(\sprintf('The constraint on "%s::%s()" cannot be added. Constraints can only be added on methods beginning with "get", "is" or "has".', $className, $method->name));
}
}

$success = true;
}
}
}

return $success;
}

private function getAnnotations(\ReflectionMethod|\ReflectionClass|\ReflectionProperty $reflection): iterable
{
$dedup = [];

foreach ($reflection->getAttributes(GroupSequence::class) as $attribute) {
$dedup[] = $attribute->newInstance();
yield $attribute->newInstance();
}
foreach ($reflection->getAttributes(GroupSequenceProvider::class) as $attribute) {
$dedup[] = $attribute->newInstance();
yield $attribute->newInstance();
}
foreach ($reflection->getAttributes(Constraint::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
$dedup[] = $attribute->newInstance();
yield $attribute->newInstance();
}
if (!$this->reader) {
return;
}

$annotations = [];

if ($reflection instanceof \ReflectionClass && $annotations = $this->reader->getClassAnnotations($reflection)) {
$this->triggerDeprecationIfAnnotationIsUsed($annotations, \sprintf('Class "%s"', $reflection->getName()));
}
if ($reflection instanceof \ReflectionMethod && $annotations = $this->reader->getMethodAnnotations($reflection)) {
$this->triggerDeprecationIfAnnotationIsUsed($annotations, \sprintf('Method "%s::%s()"', $reflection->getDeclaringClass()->getName(), $reflection->getName()));
}
if ($reflection instanceof \ReflectionProperty && $annotations = $this->reader->getPropertyAnnotations($reflection)) {
$this->triggerDeprecationIfAnnotationIsUsed($annotations, \sprintf('Property "%s::$%s"', $reflection->getDeclaringClass()->getName(), $reflection->getName()));
}

foreach ($dedup as $annotation) {
if ($annotation instanceof Constraint) {
$annotation->groups; 
}
}

foreach ($annotations as $annotation) {
if ($annotation instanceof Constraint) {
$annotation->groups; 
}
if (!\in_array($annotation, $dedup, false)) {
yield $annotation;
}
}
}

private function triggerDeprecationIfAnnotationIsUsed(array $annotations, string $messagePrefix): void
{
foreach ($annotations as $annotation) {
if (
$annotation instanceof Constraint
|| $annotation instanceof GroupSequence
|| $annotation instanceof GroupSequenceProvider
) {
trigger_deprecation('symfony/validator', '6.4', \sprintf('%s uses Doctrine Annotations to configure validation constraints, which is deprecated. Use PHP attributes instead.', $messagePrefix));
break;
}
}
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;










class LoaderChain implements LoaderInterface
{
protected $loaders;






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_debug_type($loader)));
}
}

$this->loaders = $loaders;
}

public function loadClassMetadata(ClassMetadata $metadata): bool
{
$success = false;

foreach ($this->loaders as $loader) {
$success = $loader->loadClassMetadata($metadata) || $success;
}

return $success;
}




public function getLoaders(): array
{
return $this->loaders;
}
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;










abstract class FilesLoader extends LoaderChain
{





public function __construct(array $paths)
{
parent::__construct($this->getFileLoaders($paths));
}






protected function getFileLoaders(array $paths): array
{
$loaders = [];

foreach ($paths as $path) {
$loaders[] = $this->getFileLoaderInstance($path);
}

return $loaders;
}




abstract protected function getFileLoaderInstance(string $path): LoaderInterface;
}
<?php










namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;






class StaticMethodLoader implements LoaderInterface
{
protected $methodName;






public function __construct(string $methodName = 'loadValidatorMetadata')
{
$this->methodName = $methodName;
}

public function loadClassMetadata(ClassMetadata $metadata): bool
{

$reflClass = $metadata->getReflectionClass();

if (!$reflClass->isInterface() && $reflClass->hasMethod($this->methodName)) {
$reflMethod = $reflClass->getMethod($this->methodName);

if ($reflMethod->isAbstract()) {
return false;
}

if (!$reflMethod->isStatic()) {
throw new MappingException(\sprintf('The method "%s::%s()" should be static.', $reflClass->name, $this->methodName));
}

if ($reflMethod->getDeclaringClass()->name != $reflClass->name) {
return false;
}

$reflMethod->invoke(null, $metadata);

return true;
}

return false;
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Constraints\GroupSequence;




interface GroupSequenceProviderInterface
{






public function getGroupSequence(): array|GroupSequence;
}
<?php










namespace Symfony\Component\Validator\Test;

use PHPUnit\Framework\Assert;
use PHPUnit\Framework\Constraint\IsIdentical;
use PHPUnit\Framework\Constraint\IsInstanceOf;
use PHPUnit\Framework\Constraint\IsNull;
use PHPUnit\Framework\Constraint\LogicalOr;
use PHPUnit\Framework\ExpectationFailedException;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\NotNull;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\ConstraintValidatorInterface;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationInterface;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Symfony\Component\Validator\Context\ExecutionContext;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Mapping\PropertyMetadata;
use Symfony\Component\Validator\Validator\ContextualValidatorInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;

/**
@template




*/
abstract class ConstraintValidatorTestCase extends TestCase
{



protected $context;




protected $validator;

protected $group;
protected $metadata;
protected $object;
protected $value;
protected $root;
protected $propertyPath;
protected $constraint;
protected $defaultTimezone;
private string $defaultLocale;
private array $expectedViolations;
private int $call;

protected function setUp(): void
{
$this->group = 'MyGroup';
$this->metadata = null;
$this->object = null;
$this->value = 'InvalidValue';
$this->root = 'root';
$this->propertyPath = 'property.path';



$this->constraint = new NotNull();

$this->context = $this->createContext();
$this->validator = $this->createValidator();
$this->validator->initialize($this->context);

if (class_exists(\Locale::class)) {
$this->defaultLocale = \Locale::getDefault();
\Locale::setDefault('en');
}

$this->expectedViolations = [];
$this->call = 0;

$this->setDefaultTimezone('UTC');
}

protected function tearDown(): void
{
$this->restoreDefaultTimezone();

if (class_exists(\Locale::class)) {
\Locale::setDefault($this->defaultLocale);
}
}

protected function setDefaultTimezone(?string $defaultTimezone)
{


if (null === $this->defaultTimezone) {
$this->defaultTimezone = date_default_timezone_get();
date_default_timezone_set($defaultTimezone);
}
}

protected function restoreDefaultTimezone()
{
if (null !== $this->defaultTimezone) {
date_default_timezone_set($this->defaultTimezone);
$this->defaultTimezone = null;
}
}

protected function createContext()
{
$translator = $this->createMock(TranslatorInterface::class);
$translator->expects($this->any())->method('trans')->willReturnArgument(0);
$validator = $this->createMock(ValidatorInterface::class);
$validator->expects($this->any())
->method('validate')
->willReturnCallback(fn () => $this->expectedViolations[$this->call++] ?? new ConstraintViolationList());

$context = new ExecutionContext($validator, $this->root, $translator);
$context->setGroup($this->group);
$context->setNode($this->value, $this->object, $this->metadata, $this->propertyPath);
$context->setConstraint($this->constraint);

$contextualValidatorMockBuilder = $this->getMockBuilder(AssertingContextualValidator::class)
->setConstructorArgs([$context]);
$contextualValidatorMethods = [
'atPath',
'validate',
'validateProperty',
'validatePropertyValue',
'getViolations',
];

$contextualValidatorMockBuilder->onlyMethods($contextualValidatorMethods);
$contextualValidator = $contextualValidatorMockBuilder->getMock();
$contextualValidator->expects($this->any())
->method('atPath')
->willReturnCallback(fn ($path) => $contextualValidator->doAtPath($path));
$contextualValidator->expects($this->any())
->method('validate')
->willReturnCallback(fn ($value, $constraints = null, $groups = null) => $contextualValidator->doValidate($value, $constraints, $groups));
$contextualValidator->expects($this->any())
->method('validateProperty')
->willReturnCallback(fn ($object, $propertyName, $groups = null) => $contextualValidator->validateProperty($object, $propertyName, $groups));
$contextualValidator->expects($this->any())
->method('validatePropertyValue')
->willReturnCallback(fn ($objectOrClass, $propertyName, $value, $groups = null) => $contextualValidator->doValidatePropertyValue($objectOrClass, $propertyName, $value, $groups));
$contextualValidator->expects($this->any())
->method('getViolations')
->willReturnCallback(fn () => $contextualValidator->doGetViolations());
$validator->expects($this->any())
->method('inContext')
->with($context)
->willReturn($contextualValidator);

return $context;
}

protected function setGroup(?string $group)
{
$this->group = $group;
$this->context->setGroup($group);
}

protected function setObject(mixed $object)
{
$this->object = $object;
$this->metadata = \is_object($object)
? new ClassMetadata($object::class)
: null;

$this->context->setNode($this->value, $this->object, $this->metadata, $this->propertyPath);
}

protected function setProperty(mixed $object, string $property)
{
$this->object = $object;
$this->metadata = \is_object($object)
? new PropertyMetadata($object::class, $property)
: null;

$this->context->setNode($this->value, $this->object, $this->metadata, $this->propertyPath);
}

protected function setValue(mixed $value)
{
$this->value = $value;
$this->context->setNode($this->value, $this->object, $this->metadata, $this->propertyPath);
}

protected function setRoot(mixed $root)
{
$this->root = $root;
$this->context = $this->createContext();
$this->validator->initialize($this->context);
}

protected function setPropertyPath(string $propertyPath)
{
$this->propertyPath = $propertyPath;
$this->context->setNode($this->value, $this->object, $this->metadata, $this->propertyPath);
}

protected function expectNoValidate()
{
$validator = $this->context->getValidator()->inContext($this->context);
$validator->expectNoValidate();
}

protected function expectValidateAt(int $i, string $propertyPath, mixed $value, string|GroupSequence|array|null $group)
{
$validator = $this->context->getValidator()->inContext($this->context);
$validator->expectValidation($i, $propertyPath, $value, $group, function ($passedConstraints) {
$expectedConstraints = LogicalOr::fromConstraints(new IsNull(), new IsIdentical([]), new IsInstanceOf(Valid::class));

Assert::assertThat($passedConstraints, $expectedConstraints);
});
}

protected function expectValidateValue(int $i, mixed $value, array $constraints = [], string|GroupSequence|array|null $group = null)
{
$contextualValidator = $this->context->getValidator()->inContext($this->context);
$contextualValidator->expectValidation($i, null, $value, $group, function ($passedConstraints) use ($constraints) {
if (\is_array($constraints) && !\is_array($passedConstraints)) {
$passedConstraints = [$passedConstraints];
}

Assert::assertEquals($constraints, $passedConstraints);
});
}

protected function expectFailingValueValidation(int $i, mixed $value, array $constraints, string|GroupSequence|array|null $group, ConstraintViolationInterface $violation)
{
$contextualValidator = $this->context->getValidator()->inContext($this->context);
$contextualValidator->expectValidation($i, null, $value, $group, function ($passedConstraints) use ($constraints) {
if (\is_array($constraints) && !\is_array($passedConstraints)) {
$passedConstraints = [$passedConstraints];
}

Assert::assertEquals($constraints, $passedConstraints);
}, $violation);
}

protected function expectValidateValueAt(int $i, string $propertyPath, mixed $value, Constraint|array $constraints, string|GroupSequence|array|null $group = null)
{
$contextualValidator = $this->context->getValidator()->inContext($this->context);
$contextualValidator->expectValidation($i, $propertyPath, $value, $group, function ($passedConstraints) use ($constraints) {
Assert::assertEquals($constraints, $passedConstraints);
});
}

protected function expectViolationsAt(int $i, mixed $value, Constraint $constraint)
{
$context = $this->createContext();

$validatorClassname = $constraint->validatedBy();

$validator = new $validatorClassname();
$validator->initialize($context);
$validator->validate($value, $constraint);

$this->expectedViolations[] = $context->getViolations();

return $context->getViolations();
}

protected function assertNoViolation()
{
$this->assertSame(0, $violationsCount = \count($this->context->getViolations()), \sprintf('0 violation expected. Got %u.', $violationsCount));
}

protected function buildViolation(string|\Stringable $message): ConstraintViolationAssertion
{
return new ConstraintViolationAssertion($this->context, $message, $this->constraint);
}

/**
@psalm-return


*/
abstract protected function createValidator();
}

final class ConstraintViolationAssertion
{
private ExecutionContextInterface $context;




private array $assertions;

private string $message;
private array $parameters = [];
private mixed $invalidValue = 'InvalidValue';
private string $propertyPath = 'property.path';
private ?int $plural = null;
private ?string $code = null;
private ?Constraint $constraint;
private mixed $cause = null;




public function __construct(ExecutionContextInterface $context, string $message, ?Constraint $constraint = null, array $assertions = [])
{
$this->context = $context;
$this->message = $message;
$this->constraint = $constraint;
$this->assertions = $assertions;
}




public function atPath(string $path): static
{
$this->propertyPath = $path;

return $this;
}




public function setParameter(string $key, string $value): static
{
$this->parameters[$key] = $value;

return $this;
}




public function setParameters(array $parameters): static
{
$this->parameters = $parameters;

return $this;
}




public function setTranslationDomain(?string $translationDomain): static
{


return $this;
}




public function setInvalidValue(mixed $invalidValue): static
{
$this->invalidValue = $invalidValue;

return $this;
}




public function setPlural(int $number): static
{
$this->plural = $number;

return $this;
}




public function setCode(string $code): static
{
$this->code = $code;

return $this;
}




public function setCause(mixed $cause): static
{
$this->cause = $cause;

return $this;
}

public function buildNextViolation(string $message): self
{
$assertions = $this->assertions;
$assertions[] = $this;

return new self($this->context, $message, $this->constraint, $assertions);
}

public function assertRaised(): void
{
$expected = [];
foreach ($this->assertions as $assertion) {
$expected[] = $assertion->getViolation();
}
$expected[] = $this->getViolation();

$violations = iterator_to_array($this->context->getViolations());

Assert::assertSame($expectedCount = \count($expected), $violationsCount = \count($violations), \sprintf('%u violation(s) expected. Got %u.', $expectedCount, $violationsCount));

reset($violations);

foreach ($expected as $violation) {
Assert::assertEquals($violation, current($violations));
next($violations);
}
}

private function getViolation(): ConstraintViolation
{
return new ConstraintViolation(
$this->message,
$this->message,
$this->parameters,
$this->context->getRoot(),
$this->propertyPath,
$this->invalidValue,
$this->plural,
$this->code,
$this->constraint,
$this->cause
);
}
}




class AssertingContextualValidator implements ContextualValidatorInterface
{
private ExecutionContextInterface $context;
private bool $expectNoValidate = false;
private int $atPathCalls = -1;
private array $expectedAtPath = [];
private int $validateCalls = -1;
private array $expectedValidate = [];

public function __construct(ExecutionContextInterface $context)
{
$this->context = $context;
}

public function __destruct()
{
if ($this->expectedAtPath) {
throw new ExpectationFailedException('Some expected validation calls for paths were not done.');
}

if ($this->expectedValidate) {
throw new ExpectationFailedException('Some expected validation calls for values were not done.');
}
}

public function atPath(string $path): static
{
throw new \BadMethodCallException();
}




public function doAtPath(string $path): static
{
Assert::assertFalse($this->expectNoValidate, 'No validation calls have been expected.');

if (!isset($this->expectedAtPath[++$this->atPathCalls])) {
throw new ExpectationFailedException(\sprintf('Validation for property path "%s" was not expected.', $path));
}

$expectedPath = $this->expectedAtPath[$this->atPathCalls];
unset($this->expectedAtPath[$this->atPathCalls]);

Assert::assertSame($expectedPath, $path);

return $this;
}

public function validate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): static
{
throw new \BadMethodCallException();
}




public function doValidate(mixed $value, Constraint|array|null $constraints = null, string|GroupSequence|array|null $groups = null): static
{
Assert::assertFalse($this->expectNoValidate, 'No validation calls have been expected.');

if (!isset($this->expectedValidate[++$this->validateCalls])) {
return $this;
}

[$expectedValue, $expectedGroup, $expectedConstraints, $violation] = $this->expectedValidate[$this->validateCalls];
unset($this->expectedValidate[$this->validateCalls]);

Assert::assertSame($expectedValue, $value);
$expectedConstraints($constraints);
Assert::assertSame($expectedGroup, $groups);

if (null !== $violation) {
$this->context->addViolation($violation->getMessage(), $violation->getParameters());
}

return $this;
}

public function validateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): static
{
throw new \BadMethodCallException();
}




public function doValidateProperty(object $object, string $propertyName, string|GroupSequence|array|null $groups = null): static
{
return $this;
}

public function validatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): static
{
throw new \BadMethodCallException();
}




public function doValidatePropertyValue(object|string $objectOrClass, string $propertyName, mixed $value, string|GroupSequence|array|null $groups = null): static
{
return $this;
}

public function getViolations(): ConstraintViolationListInterface
{
throw new \BadMethodCallException();
}

public function doGetViolations(): ConstraintViolationListInterface
{
return $this->context->getViolations();
}

public function expectNoValidate(): void
{
$this->expectNoValidate = true;
}

public function expectValidation(string $call, ?string $propertyPath, mixed $value, string|GroupSequence|array|null $group, callable $constraints, ?ConstraintViolationInterface $violation = null): void
{
if (null !== $propertyPath) {
$this->expectedAtPath[$call] = $propertyPath;
}

$this->expectedValidate[$call] = [$value, $group, $constraints, $violation];
}
}
<?php










namespace Symfony\Component\Validator;

use Psr\Container\ContainerInterface;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\ValidatorException;






class ContainerConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
{
private ContainerInterface $container;
private array $validators;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
$this->validators = [];
}





public function getInstance(Constraint $constraint): ConstraintValidatorInterface
{
$name = $constraint->validatedBy();

if (!isset($this->validators[$name])) {
if ($this->container->has($name)) {
$this->validators[$name] = $this->container->get($name);
} else {
if (!class_exists($name)) {
throw new ValidatorException(\sprintf('Constraint validator "%s" does not exist or is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, get_debug_type($constraint)));
}

$this->validators[$name] = new $name();
}
}

if (!$this->validators[$name] instanceof ConstraintValidatorInterface) {
throw new UnexpectedTypeException($this->validators[$name], ConstraintValidatorInterface::class);
}

return $this->validators[$name];
}
}
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sk" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Táto hodnota by mala byť nastavená na false.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Táto hodnota by mala byť nastavená na true.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Táto hodnota by mala byť typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Táto hodnota by mala byť prázdna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Táto hodnota by mala byť jednou z poskytnutých možností.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Mali by ste vybrať minimálne {{ limit }} možnosť.|Mali by ste vybrať minimálne {{ limit }} možnosti.|Mali by ste vybrať minimálne {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Mali by ste vybrať najviac {{ limit }} možnosť.|Mali by ste vybrať najviac {{ limit }} možnosti.|Mali by ste vybrať najviac {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Niektoré z uvedených hodnôt sú neplatné.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Toto pole sa neočakáva.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Toto pole chýba.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Tato hodnota nemá platný formát dátumu.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Táto hodnota nemá platný formát dátumu a času.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Táto hodnota nie je platná emailová adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Súbor sa nenašiel.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Súbor nie je čitateľný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Súbor je príliš veľký ({{ size }} {{ suffix }}). Maximálna povolená veľkosť je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Súbor typu ({{ type }}) nie je podporovaný. Podporované typy sú {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Táto hodnota by mala byť {{ limit }} alebo menej.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znak.|Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znaky.|Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Táto hodnota by mala byť viac ako {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Táto hodnota je príliš krátka. Musí obsahovať minimálne {{ limit }} znak.|Táto hodnota je príliš krátka. Musí obsahovať minimálne {{ limit }} znaky.|Táto hodnota je príliš krátka. Minimálny počet znakov je {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Táto hodnota by mala byť vyplnená.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Táto hodnota by nemala byť null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Táto hodnota by mala byť null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Táto hodnota nie je platná.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Tato hodnota nemá správny formát času.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Táto hodnota nie je platnou URL adresou.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Tieto dve hodnoty by mali byť rovnaké.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Súbor je príliš veľký. Maximálna povolená veľkosť je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Súbor je príliš veľký.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Súbor sa nepodarilo nahrať.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Táto hodnota by mala byť číslo.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tento súbor nie je obrázok.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Táto hodnota nie je platná IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Tento jazyk neexistuje.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Táto lokalizácia neexistuje.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Táto krajina neexistuje.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Táto hodnota sa už používa.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepodarilo sa zistiť rozmery obrázku.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Obrázok je príliš široký ({{ width }}px). Maximálna povolená šírka obrázku je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Obrázok je príliš úzky ({{ width }}px). Minimálna šírka obrázku by mala byť {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target><![CDATA[>Obrázok je príliš vysoký ({{ height }}px). Maximálna povolená výška obrázku je {{ max_height }}px.]]></target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Obrázok je príliš nízky ({{ height }}px). Minimálna výška obrázku by mala byť {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Táto hodnota by mala byť aktuálne heslo používateľa.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Táto hodnota by mala mať presne {{ limit }} znak.|Táto hodnota by mala mať presne {{ limit }} znaky.|Táto hodnota by mala mať presne {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Bola nahraná len časť súboru.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Žiadny súbor nebol nahraný.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>V php.ini nie je nastavený žiadny dočasný adresár, alebo nastavený adresár neexistuje.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Dočasný súbor sa nepodarilo zapísať na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozšírenie PHP zabránilo nahraniu súboru.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Táto kolekcia by mala obsahovať aspoň {{ limit }} prvok alebo viac.|Táto kolekcia by mala obsahovať aspoň {{ limit }} prvky alebo viac.|Táto kolekcia by mala obsahovať aspoň {{ limit }} prvkov alebo viac.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Táto kolekcia by mala maximálne {{ limit }} prvok.|Táto kolekcia by mala obsahovať maximálne {{ limit }} prvky.|Táto kolekcia by mala obsahovať maximálne {{ limit }} prvkov.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Táto kolekcia by mala obsahovať presne {{ limit }} prvok.|Táto kolekcia by mala obsahovať presne {{ limit }} prvky.|Táto kolekcia by mala obsahovať presne {{ limit }} prvkov.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodporovaný typ karty alebo neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Táto hodnota nie je platným Medzinárodným bankovým číslom účtu (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Táto hodnota je neplatné ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Táto hodnota je neplatné ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Táto hodnota nie je platné ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Táto hodnota nie je platné ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Táto hodnota nie je platná mena.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť väčšia ako {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť väčšia alebo rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť typu {{ compared_value_type }} a zároveň by mala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť menšia ako {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť menšia alebo rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Táto hodnota by nemala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Táto hodnota by nemala byť typu {{ compared_value_type }} a zároveň by nemala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Pomer strán obrázku je príliš veľký ({{ ratio }}). Maximálny povolený pomer strán obrázku je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Pomer strán obrázku je príliš malý ({{ ratio }}). Minimálny povolený pomer strán obrázku je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Strany obrázku sú štvorcové ({{ width }}x{{ height }}px). Štvorcové obrázky nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Obrázok je orientovaný na šírku ({{ width }}x{{ height }}px). Obrázky orientované na šírku nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Obrázok je orientovaný na výšku ({{ width }}x{{ height }}px). Obrázky orientované na výšku nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Súbor nesmie byť prázdny.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Hostiteľa nebolo možné rozpoznať.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Táto hodnota nezodpovedá očakávanej znakovej sade {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Táto hodnota nie je platným Obchodným identifikačným kódom (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Chyba</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Táto hodnota nie je platné UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť násobkom {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Tento identifikačný kód podniku (BIC) nie je spojený s IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Táto hodnota by mala byť platný JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Táto kolekcia by mala obsahovať len unikátne prvky.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Táto hodnota by mala byť kladná.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Táto hodnota by mala byť kladná alebo nulová.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Táto hodnota by mala byť záporná.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Táto hodnota by mala byť záporná alebo nulová.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Táto hodnota nie je platné časové pásmo.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Toto heslo uniklo pri narušení ochrany dát, nie je možné ho použiť. Prosím, použite iné heslo.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Táto hodnota by mala byť medzi {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Táto hodnota nie je platný hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Počet prvkov v tejto kolekcii musí byť násobok {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Táto hodnota musí spĺňať aspoň jedno z nasledujúcich obmedzení:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Každý prvok v tejto kolekcii musí spĺňať svoje vlastné obmedzenia.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Táto hodnota nie je platné medzinárodné označenie cenného papiera (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Táto hodnota by mala byť platným výrazom.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Táto hodnota nie je platná CSS farba.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Táto hodnota nie je platnou notáciou CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Hodnota masky siete by mala byť medzi {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Názov súboru je príliš dlhý. Mal by mať {{ filename_max_length }} znak alebo menej.|Názov súboru je príliš dlhý. Mal by mať {{ filename_max_length }} znaky alebo menej.|Názov súboru je príliš dlhý. Mal by mať {{ filename_max_length }} znakov alebo menej.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Sila hesla je príliš nízka. Použite silnejšie heslo.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Táto hodnota obsahuje znaky, ktoré nie sú povolené aktuálnou úrovňou obmedzenia.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Používanie neviditeľných znakov nie je povolené.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Miešanie čísel z rôznych skriptov nie je povolené.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Používanie skrytých prekryvných znakov nie je povolené.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Prípona súboru je neplatná ({{ extension }}). Povolené prípony sú {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Zistené kódovanie znakov je neplatné ({{ detected }}). Povolené kódovania sú {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Táto hodnota nie je platnou MAC adresou.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Tejto URL chýba doména najvyššej úrovne.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Táto hodnota je príliš krátka. Mala by obsahovať aspoň jedno slovo.|Táto hodnota je príliš krátka. Mala by obsahovať aspoň {{ min }} slov.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Táto hodnota je príliš dlhá. Mala by obsahovať len jedno slovo.|Táto hodnota je príliš dlhá. Mala by obsahovať {{ max }} slov alebo menej.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Táto hodnota nepredstavuje platný týždeň vo formáte ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Táto hodnota nie je platný týždeň.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Táto hodnota by nemala byť pred týždňom "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Táto hodnota by nemala byť po týždni "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Táto hodnota nie je platnou Twig šablónou.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Tento súbor nie je platné video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Veľkosť videa sa nepodarilo zistiť.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Šírka videa je príliš veľká ({{ width }}px). Povolená maximálna šírka je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Šírka videa je príliš malá ({{ width }}px). Očakávaná minimálna šírka je {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Výška videa je príliš veľká ({{ height }}px). Povolená maximálna výška je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Výška videa je príliš malá ({{ height }}px). Očakávaná minimálna výška je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Video má príliš málo pixelov ({{ pixels }}). Očakávané minimálne množstvo je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Video má príliš veľa pixelov ({{ pixels }}). Očakávané maximálne množstvo je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Pomer strán videa je príliš veľký ({{ ratio }}). Povolený maximálny pomer strán je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Pomer strán videa je príliš malý ({{ ratio }}). Očakávaný minimálny pomer strán je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video je štvorcové ({{ width }}x{{ height }}px). Štvorcové videá nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video je orientované na šírku ({{ width }}x{{ height }} px). Videá orientované na šírku nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video je orientované na výšku ({{ width }}x{{ height }}px). Videá orientované na výšku nie sú povolené.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videosúbor je poškodený.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Video obsahuje viacero tokov. Povolený je len jeden tok.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Nepodporovaný videokodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Nepodporovaný kontajner videa "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Súbor obrázka je poškodený.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Obrázok má príliš málo pixelov ({{ pixels }}). Očakávané minimálne množstvo je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Obrázok má príliš veľa pixelov ({{ pixels }}). Očakávané maximálne množstvo je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Tento názov súboru nezodpovedá očakávanej znakovej sade.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="lv" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Šai vērtībai ir jābūt nepatiesai.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Šai vērtībai ir jābūt patiesai.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Šīs vērtības tipam ir jābūt {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Šai vērtībai ir jābūt tukšai.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vērtība, kuru jūs izvēlējāties, nav derīga izvēle.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Jums nav jāveic izvēle.|Jums ir jāveic vismaz {{ limit }} izvēle.|Jums ir jāveic vismaz {{ limit }} izvēles.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Jums nav jāveic izvēle.|Jums ir jāveic ne vairāk kā {{ limit }} izvēle.|Jums ir jāveic ne vairāk kā {{ limit }} izvēles.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Viena vai vairākas no dotajām vērtībām ir nederīgas.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Šis lauks netika gaidīts.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Šis lauks ir pazudis.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Šī vērtība ir nederīgs datums.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Šī vērtība ir nederīgs datums un laiks.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Šī vērtība ir nederīga e-pasta adrese.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fails nav atrasts.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fails nav lasāms.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fails ir pārāk liels ({{ size }} {{ suffix }}). Atļautais maksimālais izmērs ir {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Faila mime tips nav derīgs ({{ type }}). Atļautie mime tipi ir {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Šai vērtībai ir jābūt ne vairāk kā {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Šīs vērtības garums ir 0 rakstzīmes.|Šī vērtība ir pārāk gara. Tai būtu jābūt ne vairāk kā {{ limit }} rakstzīmi garai.|Šī vērtība ir pārāk gara. Tai būtu jābūt ne vairāk kā {{ limit }} rakstzīmes garai.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Šai vērtībai ir jābūt ne mazāk kā {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Šīs vērtības garums ir 0 rakstzīmes.|Šī vērtība ir pārāk īsa. Tai būtu jābūt ne mazāk kā {{ limit }} rakstzīmi garai.|Šī vērtība ir pārāk īsa. Tai būtu jābūt ne mazāk kā {{ limit }} rakstzīmes garai.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Šai vērtībai nav jābūt tukšai.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Šai vērtībai nav jābūt null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Šai vērtībai ir jābūt null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Šī vērtība ir nederīga.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Šī vērtība ir nederīgs laiks.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Šī vērtība ir nederīgs URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Abām vērtībām jābūt vienādām.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fails ir pārāk liels. Atļautais maksimālais izmērs ir {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fails ir pārāk liels.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Failu nevarēja augšupielādēt.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Šai vērtībai ir jābūt derīgam skaitlim.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Šis fails nav derīgs attēls.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Šī vērtība nav derīga IP adrese.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Šī vērtība nav derīga valoda.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Šī vērtība nav derīga lokalizācija.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Šī vērtība nav derīga valsts.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Šī vērtība jau tiek izmantota.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nevar noteikt attēla izmēru.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Attēla platums ir pārāk liels ({{ width }}px). Atļautais maksimālais platums ir {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Attēla platums ir pārāk mazs ({{ width }}px). Minimālais sagaidāmais platums ir {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Attēla augstums ir pārāk liels ({{ height }}px). Atļautais maksimālais augstums ir {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Attēla augstums ir pārāk mazs ({{ height }}px). Minimālais sagaidāmais augstums ir {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Šai vērtībai ir jābūt lietotāja pašreizējai parolei.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Šīs vērtības garums ir 0 rakstzīmes.|Šai vērtībai ir jābūt tieši {{ limit }} rakstzīmi garai.|Šai vērtībai ir jābūt tieši {{ limit }} rakstzīmes garai.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fails bija tikai daļēji augšupielādēts.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Fails netika augšupielādēts.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.ini nav konfigurēta pagaidu mape vai arī konfigurētā mape neeksistē.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nevar ierakstīt pagaidu failu diskā.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP paplašinājums izraisīja augšupielādes neizdošanos.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Šis krājums satur 0 elementu.|Šim krājumam jāsatur vismaz {{ limit }} elements.|Šim krājumam jāsatur vismaz {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Šis krājums satur 0 elementu.|Šim krājumam jāsatur ne vairāk kā {{ limit }} elements.|Šim krājumam jāsatur ne vairāk kā {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Šis krājums satur 0 elementu.|Šim krājumam jāsatur tieši {{ limit }} elements.|Šim krājumam jāsatur tieši {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nederīgs kartes numurs.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Neatbalstīts kartes tips vai nederīgs kartes numurs.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Šī vērtība nav derīgs Starptautiskais Bankas Konta Numurs (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Šī vērtība nav derīgs ISBN-10 numurs.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Šī vērtība nav derīgs ISBN-13 numurs.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Šī vērtība neatbilst ne derīgam ISBN-10 numuram, ne derīgm ISBN-13 numuram.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Šī vērtība nav derīgs ISSN numurs.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Šī vērtība nav derīga valūta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt vienādai ar {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt lielākai par {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt lielākai vai vienādai ar {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt identiskai ar {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt mazākai par {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt mazākai vai vienādai ar {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Šai vērtībai ir jābūt vienādai ar {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Šai vērtībai nav jābūt identiskai ar {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Attēla attiecība ir pārāk liela ({{ ratio }}). Atļautā maksimālā attiecība ir {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Attēla attiecība ir pārāk maza ({{ ratio }}). Minimālā sagaidāmā attiecība ir {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Šis attēls ir kvadrāts ({{ width }}x{{ height }}px). Kvadrātveida attēli nav atļauti.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Attēls ir orientēts kā ainava ({{ width }}x{{ height }}px). Attēli, kas ir orientēti kā ainavas, nav atļauti.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Attēls ir orientēts kā portrets ({{ width }}x{{ height }}px). Attēli, kas ir orientēti kā portreti, nav atļauti.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Tukšs fails nav atļauts.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Resursdatora nosaukumu nevar atrisināt.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Šī vērtība neatbilst sagaidāmajai rakstzīmju kopai {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Šī vērtība nav derīgs Uzņēmuma Identifikācijas Kods (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Kļūda</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Šī vērtība nav derīgs UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Šai vērtībai jābūt vairākas reizes atkārtotai {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Šis Biznesa Identifikācijas Kods (BIC) neatbilst {{ iban }} konta numuram (IBAN).</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Šai vērtībai jābūt derīgam JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Šai kolekcijai jāsatur tikai unikāli elementi.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Šai vērtībai jābūt pozitīvai.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Šai vērtībai jābūt pozitīvai vai vienādai ar nulli.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Šai vērtībai jābūt negatīvai.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Šai vērtībai jābūt negatīvai vai vienādai ar nulli.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Šī vērtība nav derīga laika zona.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Šī parole tika publicēta datu noplūdē, to nedrīkst izmantot. Lūdzu, izvēlieties citu paroli.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Šai vērtībai jābūt starp {{ min }} un {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Šī vērtība nav derīgs tīmekļa servera nosaukums.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Elementu skaitam šajā kolekcijā jābūt {{ compared_value }} reizinājumam.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Šai vērtībai jāiekļaujas vismaz vienā no sekojošiem ierobežojumiem:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Šīs kolekcijas katram elementam jāiekļaujas savā ierobežojumu kopā.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Šī vērtība nav derīgs starptautiskais vērtspapīru identifikācijas numurs (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Šai vērtībai jābūt korektai izteiksmei.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Šī vērtība nav korekta CSS krāsa.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Šī vērtība nav korekts CIDR apzīmējums.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Tīkla maskas (netmask) vērtībai jābūt starp {{ min }} un {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Faila nosaukums ir pārāk garš. Tas var būt {{ filename_max_length }} rakstzīmi garš vai īsāks.|Faila nosaukums ir pārāk garš. Tas var būt {{ filename_max_length }} rakstzīmes garš vai īsāks.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Paroles stiprums ir pārāk zems. Lūdzu, izmantojiet spēcīgāku paroli.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Šī vērtība satur rakstzīmes, kuras nav atļautas pašreizējā ierobežojuma līmenī.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Neredzamu rakstzīmju izmantošana nav atļauta.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Nav atļauts sajaukt numurus no dažādiem skriptiem.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Slēptu pārklājuma rakstzīmju izmantošana nav atļauta.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Faila paplašinājums nav derīgs ({{ extension }}). Atļautie paplašinājumi ir {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Noteiktais rakstzīmju kodējums nav derīgs ({{ detected }}). Atļautie kodējumi ir {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Šī vērtība nav derīga MAC adrese.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Šim URL trūkst augšējā līmeņa domēna.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Šī vērtība ir pārāk īsa. Tai būtu jābūt vismaz vienu vārdu garai.|Šī vērtība ir pārāk īsa. Tai būtu jābūt ne mazāk kā {{ min }} vārdus garai.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Šī vērtība ir pārāk gara. Tai būtu jābūt vienam vārdam.|Šī vērtība ir pārāk gara. Tai būtu jābūt ne vairāk kā {{ max }} vārdus garai.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Šī vērtība neatspoguļo nedēļu ISO 8601 formatā.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Šī vērtība nav derīga nedēļa.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Šai vērtībai nevajadzētu būt pirms "{{ min }}" nedēļas.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Šai vērtībai nevajadzētu būt pēc "{{ max }}" nedēļas.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Šī vērtība nav derīgs Twig šablons.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Šī datne nav derīgs video fails.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Neizdevās noteikt video izmēru.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Video platums ir pārāk liels ({{ width }}px). Atļautais maksimālais platums ir {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Video platums ir pārāk mazs ({{ width }}px). Sagaidāmais minimālais platums ir {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Video augstums ir pārāk liels ({{ height }}px). Atļautais maksimālais augstums ir {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Video augstums ir pārāk mazs ({{ height }}px). Sagaidāmais minimālais augstums ir {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ir pārāk maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ir pārāk daudz pikseļu ({{ pixels }}). Paredzētais maksimālais daudzums ir {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Video attiecība ir pārāk liela ({{ ratio }}). Atļautā maksimālā attiecība ir {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Video attiecība ir pārāk maza ({{ ratio }}). Sagaidāmā minimālā attiecība ir {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video ir kvadrātveida ({{ width }}x{{ height }}px). Kvadrātveida video nav atļauti.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video ir ainavas orientācijā ({{ width }}x{{ height }} px). Ainavas formāta video nav atļauti.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video ir portreta orientācijā ({{ width }}x{{ height }}px). Portreta orientācijas video nav atļauti.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Video fails ir bojāts.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video satur vairākus straumējumus. Atļauta ir tikai viena straume.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Neatbalstīts video kodeks “{{ codec }}”.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Neatbalstīts video konteiners "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Attēla fails ir bojāts.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Attēlam ir par maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Attēlam ir pārāk daudz pikseļu ({{ pixels }}). Sagaidāmais maksimālais daudzums ir {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Šis faila nosaukums neatbilst paredzētajam rakstzīmju kopumam.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="hu" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ennek az értéknek hamisnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ennek az értéknek igaznak kell lennie.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ennek az értéknek {{ type }} típusúnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ennek az értéknek üresnek kell lennie.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>A választott érték érvénytelen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Legalább {{ limit }} értéket kell kiválasztani.|Legalább {{ limit }} értéket kell kiválasztani.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Legfeljebb {{ limit }} értéket lehet kiválasztani.|Legfeljebb {{ limit }} értéket lehet kiválasztani.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>A megadott értékek közül legalább egy érvénytelen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Nem várt mező.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ez a mező hiányzik.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ez az érték nem egy érvényes dátum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ez az érték nem egy érvényes időpont.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ez az érték nem egy érvényes e-mail cím.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>A fájl nem található.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>A fájl nem olvasható.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>A fájl túl nagy ({{ size }} {{ suffix }}). A legnagyobb megengedett méret {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>A fájl MIME típusa érvénytelen ({{ type }}). Az engedélyezett MIME típusok: {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ez az érték legfeljebb {{ limit }} lehet.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ez az érték túl hosszú. Legfeljebb {{ limit }} karaktert tartalmazhat.|Ez az érték túl hosszú. Legfeljebb {{ limit }} karaktert tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ez az érték legalább {{ limit }} kell, hogy legyen.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ez az érték túl rövid. Legalább {{ limit }} karaktert kell tartalmaznia.|Ez az érték túl rövid. Legalább {{ limit }} karaktert kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ez az érték nem lehet üres.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ez az érték nem lehet null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ennek az értéknek nullnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ez az érték nem érvényes.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ez az érték nem egy érvényes időpont.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ez az érték nem egy érvényes URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>A két értéknek azonosnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>A fájl túl nagy. A megengedett maximális méret: {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>A fájl túl nagy.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>A fájl nem tölthető fel.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ennek az értéknek érvényes számnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ez a fájl nem egy érvényes kép.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ez az érték nem érvényes IP-cím.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ez az érték nem egy érvényes nyelv.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ez az érték nem egy érvényes területi beállítás.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ez az érték nem egy érvényes ország.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ez az érték már használatban van.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>A kép méretét nem lehet megállapítani.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A kép szélessége túl nagy ({{ width }}px). A megengedett legnagyobb szélesség {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A kép szélessége túl kicsi ({{ width }}px). Az elvárt legkisebb szélesség {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A kép magassága túl nagy ({{ height }}px). A megengedett legnagyobb magasság {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A kép magassága túl kicsi ({{ height }}px). Az elvárt legkisebb magasság {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ez az érték a felhasználó jelenlegi jelszavával kell megegyezzen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ennek az értéknek pontosan {{ limit }} karaktert kell tartalmaznia.|Ennek az értéknek pontosan {{ limit }} karaktert kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>A fájl csak részben lett feltöltve.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nem lett fájl feltöltve.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nem lett ideiglenes mappa beállítva a php.ini-ben, vagy a beállított mappa nem létezik.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Az ideiglenes fájl nem írható a lemezre.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Egy PHP bővítmény miatt a feltöltés nem sikerült.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ennek a gyűjteménynek legalább {{ limit }} elemet kell tartalmaznia.|Ennek a gyűjteménynek legalább {{ limit }} elemet kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ez a gyűjtemény legfeljebb {{ limit }} elemet tartalmazhat.|Ez a gyűjtemény legfeljebb {{ limit }} elemet tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ennek a gyűjteménynek pontosan {{ limit }} elemet kell tartalmaznia.|Ennek a gyűjteménynek pontosan {{ limit }} elemet kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Érvénytelen kártyaszám.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nem támogatott kártyatípus vagy érvénytelen kártyaszám.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ez az érték nem érvényes Nemzetközi Bankszámlaszám (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ez az érték nem egy érvényes ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ez az érték nem egy érvényes ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ez az érték nem egy érvényes ISBN-10 vagy ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ez az érték nem egy érvényes ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ez az érték nem egy érvényes pénznem.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ez az érték legyen {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ez az érték nagyobb legyen, mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ez az érték nagyobb vagy egyenlő legyen, mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ez az érték ugyanolyan legyen, mint {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ez az érték kisebb legyen, mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ez az érték kisebb vagy egyenlő legyen, mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ez az érték ne legyen {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ez az érték ne legyen ugyanolyan, mint {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>A képarány túl nagy ({{ ratio }}). A megengedett legnagyobb képarány {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>A képarány túl kicsi ({{ ratio }}). A megengedett legkisebb képarány {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>A kép négyzet alakú ({{ width }}x{{ height }}px). A négyzet alakú képek nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>A kép fekvő tájolású ({{ width }}x{{ height }}px). A fekvő tájolású képek nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>A kép álló tájolású ({{ width }}x{{ height }}px). Az álló tájolású képek nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Üres fájl nem megengedett.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Az állomásnevet nem lehet feloldani.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ez az érték nem az elvárt {{ charset }} karakterkódolást használja.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ez az érték nem érvényes Üzleti Azonosító Kód (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Hiba</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ez az érték nem érvényes UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ennek az értéknek oszthatónak kell lennie a következővel: {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ez a Bankazonosító kód (BIC) nem kapcsolódik az IBAN kódhoz ({{ iban }}).</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ez az érték érvényes JSON kell, hogy legyen.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ez a gyűjtemény csak egyedi elemeket tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ennek az értéknek pozitívnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ennek az értéknek pozitívnak vagy nullának kell lennie.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ennek az értéknek negatívnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ennek az értéknek negatívnak vagy nullának kell lennie.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ez az érték nem egy érvényes időzóna.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ez a jelszó korábban egy adatvédelmi incidens során illetéktelenek kezébe került, így nem használható. Kérjük, használjon másik jelszót.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ennek az értéknek {{ min }} és {{ max }} között kell lennie.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ez az érték nem egy érvényes állomásnév (hosztnév).</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>A gyűjteményben lévő elemek számának oszthatónak kell lennie a következővel: {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ennek az értéknek meg kell felelni legalább egynek a következő feltételek közül:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>A gyűjtemény minden elemének meg kell felelni a saját feltételeinek.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ez az érték nem egy érvényes nemzetközi értékpapír-azonosító szám (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ennek az értéknek érvényes kifejezésnek kell lennie.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ez az érték nem egy érvényes CSS szín.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ez az érték nem egy érvényes CIDR jelölés.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Ennek a netmask értéknek {{ min }} és {{ max }} között kell lennie.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>A fájlnév túl hosszú. {{ filename_max_length }} karakter vagy kevesebb legyen.|A fájlnév túl hosszú. {{ filename_max_length }} karakter vagy kevesebb legyen.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>A jelszó túl egyszerű. Kérjük, használjon egy erősebb jelszót.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ez az érték olyan karaktereket tartalmaz, amik nem megengedettek.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Láthatatlan karakterek használata nem megengedett.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Különböző szám írásmódok használata nem megengedett.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Rejtett módosító karakterek használata nem megengedett.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>A fájl kiterjesztése érvénytelen ({{ extension }}). Engedélyezett kiterjesztések: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Az érzékelt karakterkódolás érvénytelen ({{ detected }}). Engedélyezett karakterkódolások: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ez az érték nem érvényes MAC-cím.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Az URL-ből hiányzik a legfelső szintű tartomány (top-level domain).</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ez az érték túl rövid. Tartalmaznia kell legalább egy szót.|Ez az érték túl rövid. Tartalmaznia kell legalább {{ min }} szót.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ez az érték túl hosszú. Csak egy szót tartalmazhat.|Ez az érték túl hosszú. Legfeljebb {{ max }} szót vagy kevesebbet tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ez a érték érvénytelen hetet jelent az ISO 8601 formátumban.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ez az érték érvénytelen hét.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ez az érték nem lehet a "{{ min }}". hétnél korábbi.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ez az érték nem lehet a "{{ max }}". hétnél későbbi.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ez az érték nem érvényes Twig sablon.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ez a fájl nem érvényes videó.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">A videó méretét nem sikerült megállapítani.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">A videó szélessége túl nagy ({{ width }}px). A megengedett maximális szélesség {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">A videó szélessége túl kicsi ({{ width }}px). A várható minimális szélesség {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">A videó magassága túl nagy ({{ height }}px). A megengedett maximális magasság {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">A videó magassága túl kicsi ({{ height }}px). A minimálisan elvárt magasság {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">A videóban túl kevés a képpont ({{ pixels }}). Az elvárt minimális mennyiség {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">A videóban túl sok a képpont ({{ pixels }}). A várható maximális mennyiség {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">A videó aránya túl nagy ({{ ratio }}). A megengedett maximális arány {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">A videó képaránya túl kicsi ({{ ratio }}). A minimálisan elvárt arány {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">A videó négyzetes ({{ width }}x{{ height }}px). A négyzetes videók nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">A videó fekvő tájolású ({{ width }}x{{ height }} px). Fekvő tájolású videók nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">A videó álló tájolású ({{ width }}x{{ height }} px). Álló tájolású videók nem engedélyezettek.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">A videófájl sérült.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">A videó több adatfolyamot tartalmaz. Csak egy adatfolyam engedélyezett.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nem támogatott videokodek „{{ codec }}”.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nem támogatott videokonténer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">A képfájl sérült.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">A képen túl kevés pixel van ({{ pixels }}). Az elvárt minimum {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">A kép túl sok pixelt tartalmaz ({{ pixels }}). A várható maximális mennyiség {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Ez a fájlnév nem felel meg a várt karakterkészletnek.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sq" datatype="plaintext" original="file.ext">
        <header>
            <note>
                Për fjalët e huaja, të cilat nuk kanë përkthim të drejtpërdrejtë, ju lutemi të ndiqni rregullat e mëposhtme:
                  a) në rast se emri është akronim i përdorur gjerësisht si i përveçëm, atëherë, emri lakohet pa thonjëza dhe mbaresa shkruhet me vizë ndarëse. Gjinia gjykohet sipas rastit. Shembull: JSON (mashkullore)
                  b) në rast se emri është akronim i papërdorur gjerësisht si i përveçëm, atëherë, emri lakohet pa thonjëza dhe mbaresa shkruhet me vizë ndarëse. Gjinia është femërore. Shembull: URL (femërore)
                  c) në rast se emri duhet lakuar për shkak të rasës në fjali, atëherë, emri lakohet pa thonjëza dhe mbaresa shkruhet me vizë ndarëse. Shembull: host-i, prej host-it
                  d) në rast se emri nuk duhet lakuar për shkak të trajtës në fjali, atëherë, emri rrethote me thonjëzat “”. Shembull: “locale”
            </note>
        </header>
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Kjo vlerë duhet të jetë e pavërtetë (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Kjo vlerë duhet të jetë e vërtetë (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Kjo vlerë duhet të jetë e llojit {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Kjo vlerë duhet të jetë e zbrazët.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vlera që keni zgjedhur nuk është alternativë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Duhet të zgjidhni së paku {{ limit }} alternativë.|Duhet të zgjidhni së paku {{ limit }} alternativa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Duhet të zgjidhni së shumti {{ limit }} alternativë.|Duhet të zgjidhni së shumti {{ limit }} alternativa.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Një apo më shumë nga vlerat e dhëna janë të pavlefshme.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Kjo fushë nuk pritej.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Kjo fushë mungon.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Kjo vlerë nuk është datë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Kjo vlerë nuk është datë dhe orë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Kjo vlerë nuk është email adresë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fajli nuk u gjet.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fajli nuk është e lexueshme.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fajli është shumë e madhe ({{ size }} {{ suffix }}). Madhësia maksimale e lejuar është {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Lloji “mime” i fajlit është i pavlefshëm ({{ type }}). Llojet “mime” të lejuara janë {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Kjo vlerë duhet të jetë {{ limit }} ose më pak.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Kjo vlerë është shumë e gjatë. Duhet të përmbajë {{ limit }} karakter ose më pak.|Kjo vlerë është shumë e gjatë. Duhet të përmbajë {{ limit }} karaktere ose më pak.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Kjo vlerë duhet të jetë {{ limit }} ose më shumë.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Kjo vlerë është shumë e shkurtër. Duhet të përmbajë {{ limit }} karakter ose më shumë.|Kjo vlerë është shumë e shkurtër. Duhet të përmbajë {{ limit }} karaktere ose më shumë.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Kjo vlerë nuk duhet të jetë e zbrazët.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Kjo vlerë nuk duhet të jetë “null”.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Kjo vlerë duhet të jetë “null”.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Kjo vlerë nuk është e vlefshme.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Kjo vlerë nuk është një orë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Kjo vlerë nuk është URL e vlefshme.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Këto dy vlera duhet të jenë të barabarta.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ky fajl është shumë i madhë. Madhësia maksimale e lejuar është {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ky fajl është shumë i madhë.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ky fajl nuk mund të ngarkohet.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Kjo vlerë duhet të jetë një numër i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ky fajl nuk është një imazh i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Kjo vlerë nuk është një adresë IP e vlefshme.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Kjo vlerë nuk është një gjuhë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Kjo vlerë nuk është nje “locale” e vlefshme.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Kjo vlerë nuk është një shtet i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Kjo vlerë është tashmë në përdorim.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Madhësia e imazhit nuk mund të zbulohet.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Gjerësia e imazhit është shumë e madhe ({{ width }}px). Gjerësia maksimale e lejuar është {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Gjerësia e imazhit është shumë e vogël ({{ width }}px). Gjerësia minimale e pritur është {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Gjatësia e imazhit është shumë e madhe ({{ height }}px). Gjatësia maksimale e lejuar është {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Gjatësia e imazhit është shumë e vogël ({{ height }}px). Gjatësia minimale e pritur është {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Kjo vlerë duhet të jetë fjalëkalimi i tanishëm i përdoruesit.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Kjo vlerë duhet të ketë saktësisht {{ limit }} karakter.|Kjo vlerë duhet të ketë saktësisht {{ limit }} karaktere.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Ky fajl është ngarkuar pjesërisht.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nuk është ngarkuar ndonjë fajl.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nuk është konfiguruar asnjë dosje e përkohshëm në php.ini, ose dosja e konfiguruar nuk ekziston.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nuk mund të shkruhet fajli e përkohshme në disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Një shtojcë PHP shkaktoi dështimin e ngarkimit.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ky koleksion duhet të përmbajë {{ limit }} element ose më shumë.|Ky koleksion duhet të përmbajë {{ limit }} elemente ose më shumë.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ky koleksion duhet të përmbajë {{ limit }} element ose më pak.|Ky koleksion duhet të përmbajë {{ limit }} elemente ose më pak.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ky koleksion duhet të përmbajë saktësisht {{ limit }} element.|Ky koleksion duhet të përmbajë saktësisht {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numër karte i pavlefshëm.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Lloji i kartës i papërkrahur ose numër kartës i pavlefshëm.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Kjo vlerë nuk është një Numër Llogarie Bankare Ndërkombëtare (IBAN) i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Kjo vlerë nuk është një ISBN-10 e vlefshme.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Kjo vlerë nuk është një ISBN-13 e vlefshme.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Kjo vlerë nuk është as ISBN-10 e vlefshme as ISBN-13 e vlefshme.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Kjo vlerë nuk është një ISSN e vlefshme.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Kjo vlerë nuk është një valutë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë e barabartë me {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë më e madhe se {{ compared_value }}. </target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë më e madhe ose e barabartë me {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë identike me {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë më vogël se {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë më e vogël ose e barabartë me {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Kjo vlerë nuk duhet të jetë e barabartë me {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Kjo vlerë nuk duhet të jetë identike me {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Raporti i imazhit është shumë i madh ({{ ratio }}). Raporti maksimal i lejuar është {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Raporti i imazhit është shumë i vogël ({{ ratio }}). Raporti minimal pritet të jetë {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Imazhi është katror ({{ width }}x{{ height }}px). Imazhet katrore nuk janë të lejuara.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Imazhi është i orientuar horizontalisht ({{ width }}x{{ height }}px). Imazhet e orientuara horizontalisht nuk lejohen.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Imazhi është i orientuar vertikalisht ({{ width }}x{{ height }}px). Imazhet orientuara vertikalisht nuk lejohen.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Një fajl i zbrazët nuk lejohet.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Host-i nuk mund te zbulohej.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Kjo vlerë nuk përputhet me kodifikimin e karaktereve {{ charset }} që pritej.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Kjo vlerë nuk është një Kod Identifikues Biznesi (BIC) i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Gabim</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Kjo vlerë nuk është një UUID e vlefshme.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Kjo vlerë duhet të jetë një shumëfish i {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ky Kod Identifikues Biznesi (BIC) nuk është i lidhur me IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Kjo vlerë duhet të jetë JSON i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ky koleksion duhet të përmbajë vetëm elementë unikë.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Kjo vlerë duhet të jetë pozitive.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Kjo vlerë duhet të jetë pozitive ose zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Kjo vlerë duhet të jetë negative.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Kjo vlerë duhet të jetë negative ose zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Kjo vlerë nuk është një zonë e vlefshme kohore.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ky fjalëkalim është zbuluar në një shkelje të të dhënave, nuk duhet të përdoret. Ju lutemi përdorni një fjalëkalim tjetër.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Kjo vlerë duhet të jetë ndërmjet {{ min }} dhe {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Kjo vlerë nuk është një emër i vlefshëm host-i.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Numri i elementeve në këtë koleksion duhet të jetë një shumëfish i {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Kjo vlerë duhet të plotësojë të paktën njërën nga kufizimet e mëposhtme:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Secili element i këtij koleksioni duhet të përmbushë kufizimet e veta.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Kjo vlerë nuk është një numër i vlefshëm identifikues ndërkombëtar i sigurisë (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Kjo vlerë duhet të jetë një shprehje e vlefshme.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Kjo vlerë nuk është një ngjyrë e vlefshme CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Kjo vlerë nuk është një shënim i vlefshëm CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Vlera e maskës së rrjetit duhet të jetë ndërmjet {{ min }} dhe {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Emri i fajlit është shumë i gjatë. Duhet të ketë maksimumi {{ filename_max_length }} karakter ose më pak.|Emri i fajlit është shumë i gjatë. Duhet të ketë maksimumi {{ filename_max_length }} karaktere ose më pak.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Fuqia e fjalëkalimit është shumë e ulët. Ju lutemi përdorni një fjalëkalim më të fortë.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Kjo vlerë përmban karaktere që nuk lejohen nga niveli aktual i kufizimit.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Përdorimi i karaktereve të padukshme nuk lejohet.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Përzierja e numrave nga shkrimet e ndryshme nuk lejohet.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Përdorimi i karaktereve të mbivendosura të fshehura nuk lejohet.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Shtesa e fajlit është e pavlefshme ({{ extension }}). Shtesat e lejuara janë {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Kodimi i karakterit të identifikuar është i pavlefshëm ({{ detected }}). Kodimet e lejuara janë {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Kjo nuk është një adresë e vlefshme e Kontrollit të Qasjes në Media (MAC).</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Kësaj URL-je i mungon një domain i nivelit të sipërm.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Kjo vlerë është shumë e shkurtër. Duhet të përmbajë të paktën një fjalë.|Kjo vlerë është shumë e shkurtër. Duhet të përmbajë të paktën {{ min }} fjalë.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Kjo vlerë është shumë e gjatë. Duhet të përmbajë një fjalë.|Kjo vlerë është shumë e gjatë. Duhet të përmbajë {{ max }} fjalë ose më pak.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Kjo vlerë nuk përfaqëson një javë të vlefshme në formatin ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Kjo vlerë nuk është një javë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Kjo vlerë nuk duhet të jetë para javës "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Kjo vlerë nuk duhet të jetë pas javës "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Kjo vlerë nuk është një shabllon Twig i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Ky fajl nuk është video e vlefshme.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Madhësia e videos nuk mund të zbulohej.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Gjerësia e videos është shumë e madhe ({{ width }}px). Gjerësia maksimale e lejuar është {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Gjerësia e videos është shumë e vogël ({{ width }}px). Gjerësia minimale e pritur është {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Lartësia e videos është shumë e madhe ({{ height }}px). Lartësia maksimale e lejuar është {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Lartësia e videos është shumë e vogël ({{ height }}px). Lartësia minimale e pritur është {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Video ka shumë pak pikselë ({{ pixels }}). Sasia minimale e pritur është {{ min_pixels }}px.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videoja ka tepër piksele ({{ pixels }}). Sasia maksimale e pritur është {{ max_pixels }}px.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Raporti i videos është shumë i madh ({{ ratio }}). Raporti maksimal i lejuar është {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Raporti i videos është shumë i vogël ({{ ratio }}). Raporti minimal i pritur është {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videoja është katrore ({{ width }}x{{ height }}px). Videot katrore nuk lejohen.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videoja është me orientim horizontal ({{ width }}x{{ height }}px). Videot horizontale nuk lejohen.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videoja është me orientim portret ({{ width }}x{{ height }}px). Videot me orientim portret nuk lejohen.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Fajli i videos është i korruptuar.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videoja përmban disa rrjedha. Lejohet vetëm një rrjedhë.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Kodeku videos është i pambështetur „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Kontejneri videos është i pambështetur "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Fajli i imazhit është korruptuar.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Imazhi ka shumë pak pikselë ({{ pixels }}). Sasia minimale e pritur është {{ min_pixels }}px.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Imazhi ka shumë pikselë ({{ pixels }}). Shuma maksimale e pritur është {{ max_pixels }}px.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Ky emër fajlit nuk përputhet me grupin e pritur të karaktereve.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ru" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Значение должно быть ложным.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Значение должно быть истинным.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Тип значения должен быть {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Значение должно быть пустым.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Выбранное Вами значение недопустимо.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Вы должны выбрать хотя бы {{ limit }} вариант.|Вы должны выбрать хотя бы {{ limit }} варианта.|Вы должны выбрать хотя бы {{ limit }} вариантов.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Вы должны выбрать не более чем {{ limit }} вариант.|Вы должны выбрать не более чем {{ limit }} варианта.|Вы должны выбрать не более чем {{ limit }} вариантов.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Одно или несколько заданных значений недопустимо.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Это поле не ожидалось.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Это поле отсутствует.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Значение не является правильной датой.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Значение даты и времени недопустимо.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Значение адреса электронной почты недопустимо.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл не может быть найден.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл не может быть прочитан.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл слишком большой ({{ size }} {{ suffix }}). Максимально допустимый размер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-тип файла недопустим ({{ type }}). Допустимы MIME-типы файлов {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Значение должно быть {{ limit }} или меньше.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Значение слишком длинное. Должно быть равно {{ limit }} символу или меньше.|Значение слишком длинное. Должно быть равно {{ limit }} символам или меньше.|Значение слишком длинное. Должно быть равно {{ limit }} символам или меньше.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Значение должно быть {{ limit }} или больше.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Значение слишком короткое. Должно быть равно {{ limit }} символу или больше.|Значение слишком короткое. Должно быть равно {{ limit }} символам или больше.|Значение слишком короткое. Должно быть равно {{ limit }} символам или больше.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Значение не должно быть пустым.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Значение не должно быть null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Значение должно быть null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Значение недопустимо.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Значение времени недопустимо.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Значение не является допустимым URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Оба значения должны быть одинаковыми.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл слишком большой. Максимально допустимый размер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл слишком большой.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл не может быть загружен.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Значение должно быть числом.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Файл не является допустимым форматом изображения.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Это значение не является действительным IP-адресом.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Значение не является допустимым языком.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Значение не является допустимой локалью.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Значение не является допустимой страной.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Это значение уже используется.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Не удалось определить размер изображения.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина изображения слишком велика ({{ width }}px). Максимально допустимая ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина изображения слишком мала ({{ width }}px). Минимально допустимая ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Высота изображения слишком велика ({{ height }}px). Максимально допустимая высота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Высота изображения слишком мала ({{ height }}px). Минимально допустимая высота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Значение должно быть текущим паролем пользователя.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Значение должно быть равно {{ limit }} символу.|Значение должно быть равно {{ limit }} символам.|Значение должно быть равно {{ limit }} символам.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файл был загружен только частично.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файл не был загружен.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>В php.ini не была настроена временная папка, или настроенная папка не существует.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Невозможно записать временный файл на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Расширение PHP вызвало ошибку при загрузке.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Эта коллекция должна содержать {{ limit }} элемент или больше.|Эта коллекция должна содержать {{ limit }} элемента или больше.|Эта коллекция должна содержать {{ limit }} элементов или больше.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Эта коллекция должна содержать {{ limit }} элемент или меньше.|Эта коллекция должна содержать {{ limit }} элемента или меньше.|Эта коллекция должна содержать {{ limit }} элементов или меньше.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Эта коллекция должна содержать ровно {{ limit }} элемент.|Эта коллекция должна содержать ровно {{ limit }} элемента.|Эта коллекция должна содержать ровно {{ limit }} элементов.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Неверный номер карты.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Неподдерживаемый тип или неверный номер карты.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Это значение не является действительным Международным банковским счетом (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Значение имеет неверный формат ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Значение имеет неверный формат ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Значение не соответствует форматам ISBN-10 и ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Значение не соответствует формату ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Некорректный формат валюты.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Значение должно быть равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Значение должно быть больше чем {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Значение должно быть больше или равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значение должно быть идентичным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Значение должно быть меньше чем {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Значение должно быть меньше или равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Значение не должно быть равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значение не должно быть идентичным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Соотношение сторон изображения слишком велико ({{ ratio }}). Максимальное соотношение сторон {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Соотношение сторон изображения слишком мало ({{ ratio }}). Минимальное соотношение сторон {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Изображение квадратное ({{ width }}x{{ height }}px). Квадратные изображения не разрешены.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Изображение в альбомной ориентации ({{ width }}x{{ height }}px). Изображения в альбомной ориентации не разрешены.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Изображение в портретной ориентации ({{ width }}x{{ height }}px). Изображения в портретной ориентации не разрешены.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Пустые файлы не разрешены.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Имя хоста не может быть разрешено.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Значение не совпадает с ожидаемой {{ charset }} кодировкой.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Это значение не является действительным Бизнес-идентификатором (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Ошибка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Это значение не является действительным UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Значение должно быть кратно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Данный BIC не связан с IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Значение должно быть корректным JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Эта коллекция должна содержать только уникальные элементы.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Значение должно быть положительным.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Значение должно быть положительным или равным нулю.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Значение должно быть отрицательным.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Значение должно быть отрицательным или равным нулю.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Значение не является корректным часовым поясом.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Данный пароль был скомпрометирован в результате утечки данных и не должен быть использован. Пожалуйста, используйте другой пароль.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Значение должно быть между {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Значение не является корректным именем хоста.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Количество элементов в этой коллекции должно быть кратным {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Значение должно удовлетворять как минимум одному из следующих ограничений:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Каждый элемент этой коллекции должен удовлетворять своему собственному набору ограничений.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Значение не является корректным международным идентификационным номером ценных бумаг (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Это значение должно быть корректным выражением.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Значение не является корректным CSS цветом.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Значение не соответствует нотации CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Значение маски подсети должно быть от {{ min }} до {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Имя файла слишком длинное. Оно должно содержать {{ filename_max_length }} символ или меньше.|Имя файла слишком длинное. Оно должно содержать {{ filename_max_length }} символа или меньше.|Имя файла слишком длинное. Оно должно содержать {{ filename_max_length }} символов или меньше.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Слишком низкая надёжность пароля. Пожалуйста, используйте более надёжный пароль.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Значение содержит символы, запрещённые на текущем уровне ограничений.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Использование невидимых символов запрещено.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Смешивание номеров из разных сценариев запрещено.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Использование невидимых символов наложения запрещено.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Недопустимое расширение файла ({{ extension }}). Разрешенные расширения: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Обнаруженная кодировка символов недопустима ({{ detected }}). Разрешенные кодировки: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Это значение не является действительным MAC-адресом.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>В этом URL отсутствует домен верхнего уровня.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Это значение слишком короткое. Оно должно содержать как минимум одно слово.|Это значение слишком короткое. Оно должно содержать как минимум {{ min }} слова.|Это значение слишком короткое. Оно должно содержать как минимум {{ min }} слов.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Это значение слишком длинное. Оно должно содержать только одно слово.|Это значение слишком длинное. Оно должно содержать {{ max }} слова или меньше.|Это значение слишком длинное. Оно должно содержать {{ max }} слов или меньше.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Это значение не представляет допустимую неделю в формате ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Это значение не является допустимой неделей.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Это значение не должно быть раньше недели "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Это значение не должно быть после недели "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Это значение не является корректным шаблоном Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Этот файл не является корректным видео.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Не удалось определить размер видео.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина видео слишком велика ({{ width }}px). Максимально допустимая ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина видео слишком мала ({{ width }}px). Минимально допустимая ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Высота видео слишком велика ({{ height }}px). Максимально допустимая высота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Высота видео слишком мала ({{ height }}px). Минимально допустимая высота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>В видео слишком мало пикселей ({{ pixels }} пикселей). Минимально допустимое количество {{ min_pixels }} пикселей.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>В видео слишком много пикселей ({{ pixels }} пикселей). Максимально допустимое количество {{ max_pixels }} пикселей.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Соотношение сторон видео слишком велико ({{ ratio }}). Максимально допустимое соотношение {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Соотношение сторон видео слишком мало ({{ ratio }}). Минимально допустимое соотношение {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Видео квадратное ({{ width }}x{{ height }}px). Квадратные видео не разрешены.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Видео в альбомной ориентации ({{ width }}x{{ height }}px). Видео в альбомной ориентации не разрешены.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Видео в портретной ориентации ({{ width }}x{{ height }}px). Видео в портретной ориентации не разрешены.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Видеофайл повреждён.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Видео содержит несколько потоков. Разрешён только один поток.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Неподдерживаемый видеокодек «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Неподдерживаемый видеоконтейнер «{{ container }}».</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Файл изображения повреждён.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>В изображении слишком мало пикселей ({{ pixels }} пикселей). Минимально допустимое количество {{ min_pixels }} пикселей.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>В изображении слишком много пикселей ({{ pixels }} пикселей). Максимально допустимое количество {{ max_pixels }} пикселей.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Это имя файла не соответствует ожидаемой кодировке.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="bs" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ova vrijednost bi trebalo da bude "netačno" (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ova vrijednost bi trebalo da bude "tačno" (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ova vrijednost bi trebalo da bude tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ova vrijednost bi trebalo da bude prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Odabrana vrijednost nije validan izbor.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Morate odabrati barem {{ limit }} mogućnost.|Morate odabrati barem {{ limit }} mogućnosti.|Morate odabrati barem {{ limit }} mogućnosti.  </target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Morate odabrati najviše {{ limit }} mogućnost.|Morate odabrati najviše {{ limit }} mogućnosti.|Morate odabrati najviše {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna ili više datih vrijednosti nisu validne.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ovo polje nije očekivano.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ovo polje nedostaje.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ova vrijednost nije ispravan datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ova vrijednost nije ispravnog datum-vrijeme (datetime) formata.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ova vrijednost nije ispravna e-mail adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ova datoteka ne može biti pronađena.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Ova datoteka nije čitljiva.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ova datoteka je prevelika ({{ size }} {{ suffix }}). Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke nije ispravan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ova vrijednost bi trebalo da bude {{ limit }} ili manje.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ova vrijednost je predugačka. Trebalo bi da ima {{ limit }} karakter ili manje.|Ova vrijednost je predugačka. Trebalo bi da ima {{ limit }} karaktera ili manje.|Ova vrijednost je predugačka. Trebalo bi da ima {{ limit }} karaktera ili manje.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ova vrijednost bi trebalo da bude {{ limit }} ili više.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ova vrijednost je prekratka. Trebalo bi da ima {{ limit }} karakter ili više.|Ova vrijednost je prekratka. Trebalo bi da ima {{ limit }} karaktera ili više.|Ova vrijednost je prekratka. Trebalo bi da ima {{ limit }} karaktera ili više.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ova vrijednost ne bi trebalo da bude prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ova vrijednost ne bi trebalo da bude null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ova vrijednost bi trebalo da bude null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ova vrijednost nije ispravna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ova vrijednost nije ispravno vrijeme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ova vrijednost nije ispravan URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obje vrijednosti bi trebalo da budu jednake.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ova datoteka je prevelika. Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ova datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ova datoteka ne može biti prenijeta (uploaded).</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ova vrijednost bi trebalo da bude ispravan broj.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ova datoteka nije validna slika.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Ova vrijednost nije valjana IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ova vrijednost nije validan jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ova vrijednost nije validna regionalna oznaka.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ova vrijednost nije validna država.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ova vrijednost je već upotrebljena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nije moguće otkriti veličinu ove slike.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je prevelika ({{ width }}px). Najveća dozvoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premala ({{ width }}px). Najmanja dozvoljena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Dužina slike je prevelika ({{ height }}px). Najveća dozvoljena dužina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Dužina slike je premala ({{ height }}px). Najmanja dozvoljena dužina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ova vrijednost bi trebalo da bude trenutna korisnička lozinka.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ova vrijednost bi trebalo da ima tačno {{ limit }} karakter.|Ova vrijednost bi trebalo da ima tačno {{ limit }} karaktera.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je samo djelimično prenijeta (uploaded).</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nijedna datoteka nije prenijeta (uploaded).</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Privremeni direktorij nije konfiguriran u php.ini, ili konfigurirani direktorij ne postoji.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Privremenu datoteku nije moguće upisati na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Prenos datoteke nije uspio zbog PHP ekstenzije.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ova kolekcija bi trebalo da sadrži {{ limit }} ili više elemenata.|Ova kolekcija bi trebalo da sadrži {{ limit }} ili više elemenata.|Ova kolekcija bi trebalo da sadrži {{ limit }} ili više elemenata.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ova kolekcija bi trebalo da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija bi trebalo da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija bi trebalo da sadrži {{ limit }} ili manje elemenata.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ova kolekcija bi trebalo da sadrži tačno {{ limit }} element.|Ova kolekcija bi trebalo da sadrži tačno {{ limit }} elementa.|Ova kolekcija bi trebalo da sadrži tačno {{ limit }} elemenata.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Broj kartice je neispravan.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tip kartice nije podržan ili je broj kartice neispravan.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Ova vrijednost nije valjan Međunarodni broj bankovnog računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ova vrijednost nije ispravan ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-10 niti ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ova vrijednost nije ispravan ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ova vrijednost nije ispravna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude veća od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude jednaka ili veća od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude identična {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude manja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude jednaka ili manja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude različita od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude identična sa {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Razmjera ove slike je prevelika ({{ ratio }}). Maksimalna dozvoljena razmjera je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Razmjera ove slike je premala ({{ ratio }}). Minimalna očekivana razmjera je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Ova slika je kvadratnog oblika ({{ width }}x{{ height }}px). Kvadratne slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Ova slika je orijentisana horizontalno (landscape) ({{ width }}x{{ height }}px). Horizontalno orijentisane slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Ova slika je orijentisana vertikalno (portrait) ({{ width }}x{{ height }}px). Vertikalno orijentisane slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Prazna datoteka nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Nije moguće odrediti poslužitelja (host).</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ova vrijednost ne odgovara očekivanom {{ charset }} setu karaktera (charset).</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Ova vrijednost nije valjan Poslovni identifikacijski kod (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Greška</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Ova vrijednost nije valjan UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebalo da bude djeljiva sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ovaj poslovni identifikacioni kod (BIC) nije povezan sa IBAN-om {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ova vrijednost bi trebalo da bude validan JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ova kolekcija bi trebala da sadrži samo jedinstvene elemente.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ova vrijednost bi trebalo da bude pozitivna.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ova vrijednost bi trebalo da bude pozitivna ili jednaka nuli.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ova vrijednost bi trebalo da bude negativna.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ova vrijednost bi trebalo da bude negativna ili jednaka nuli.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ova vrijednost nije validna vremenska zona.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ova lozinka je procurila u nekom od slučajeva kompromitovanja podataka, nemojte je koristiti. Koristite drugu lozinku.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ova vrijednosti bi trebala biti između {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ova vrijednost nije ispravno ime poslužitelja (hostname).</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Broj elemenata u ovoj kolekciji bi trebalo da bude djeljiv sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ova vrijednost bi trebalo da zadovoljava namjanje jedno od narednih ograničenja:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Svaki element ove kolekcije bi trebalo da zadovolji sopstveni skup ograničenja.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ova vrijednost nije ispravna međunarodna identifikaciona oznaka hartija od vrijednosti (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ova vrijednost bi trebala biti važeći izraz.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ova vrijednost nije važeća CSS boja.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ova vrijednost nije važeća CIDR notacija.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Vrijednost NetMask bi trebala biti između {{min}} i {{max}}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Ime datoteke je predugačko. Trebao bi imati {{ filename_max_length }} znak ili manje.|Naziv fajla je predugačak. Trebao bi imati {{ filename_max_length }} znakova ili manje.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Jačina lozinke je preniska. Molimo koristite jaču lozinku.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ova vrijednost sadrži znakove koji nisu dozvoljeni trenutnim nivoom ograničenja.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Upotreba nevidljivih znakova nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Nije dozvoljeno miješanje brojeva iz različitih pisama.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Upotreba skrivenih preklapajućih znakova nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Ekstenzija datoteke je nevažeća ({{ extension }}). Dozvoljene ekstenzije su {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Otkriveno kodiranje karaktera je nevažeće ({{ detected }}). Dozvoljena kodiranja su {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Ova vrijednost nije valjana MAC adresa.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Ovom URL-u nedostaje domena najvišeg nivoa.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Ova vrijednost je prekratka. Trebala bi sadržavati barem jednu riječ.|Ova vrijednost je prekratka. Trebala bi sadržavati barem {{ min }} riječi.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Ova vrijednost je predugačka. Trebala bi sadržavati samo jednu riječ.|Ova vrijednost je predugačka. Trebala bi sadržavati {{ max }} riječi ili manje.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Ova vrijednost ne predstavlja valjani tjedan u ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Ova vrijednost nije važeća sedmica.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Ova vrijednost ne smije biti prije tjedna "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Ova vrijednost ne bi trebala biti nakon sedmice "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ova vrijednost nije važeći Twig šablon.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ova datoteka nije važeći video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Veličina videa nije mogla biti utvrđena.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Širina videa je prevelika ({{ width }}px). Dozvoljena maksimalna širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Širina videa je premala ({{ width }}px). Minimalna očekivana širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Visina videa je prevelika ({{ height }}px). Dozvoljena maksimalna visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Visina videa je premala ({{ height }}px). Očekivana minimalna visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima premalo piksela ({{ pixels }}). Očekivana minimalna količina je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima previše piksela ({{ pixels }}). Očekivana maksimalna količina je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Omjer videa je prevelik ({{ ratio }}). Dozvoljeni maksimalni omjer je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Omjer videa je premali ({{ ratio }}). Minimalni očekivani omjer je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video je kvadratan ({{ width }}x{{ height }}px). Kvadratni video zapisi nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je vodoravne orijentacije ({{ width }}x{{ height }} px). Vodoravni video zapisi nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je uspravno orijentisan ({{ width }}x{{ height }}px). Video zapisi uspravne orijentacije nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Video datoteka je oštećena.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video sadrži više tokova. Dozvoljen je samo jedan tok.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nepodržani video kodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nepodržani video kontejner "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Datoteka slike je oštećena.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima premalo piksela ({{ pixels }}). Očekivani minimalni broj je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima previše piksela ({{ pixels }}). Očekivani maksimalni broj je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Naziv ove datoteke ne odgovara očekivanom skupu znakova.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>This value should be false.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>This value should be true.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>This value should be of type {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>This value should be blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>The value you selected is not a valid choice.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>One or more of the given values is invalid.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>This field was not expected.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>This field is missing.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>This value is not a valid date.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>This value is not a valid datetime.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>This value is not a valid email address.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>The file could not be found.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>The file is not readable.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>This value should be {{ limit }} or less.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>This value should be {{ limit }} or more.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>This value should not be blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>This value should not be null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>This value should be null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>This value is not valid.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>This value is not a valid time.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>This value is not a valid URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>The two values should be equal.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>The file is too large.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>The file could not be uploaded.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>This value should be a valid number.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>This file is not a valid image.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>This value is not a valid IP address.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>This value is not a valid language.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>This value is not a valid locale.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>This value is not a valid country.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>This value is already used.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>The size of the image could not be detected.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>This value should be the user's current password.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>The file was only partially uploaded.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>No file was uploaded.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>No temporary folder was configured in php.ini, or the configured folder does not exist.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Cannot write temporary file to disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>A PHP extension caused the upload to fail.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Invalid card number.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Unsupported card type or invalid card number.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>This value is not a valid International Bank Account Number (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>This value is not a valid ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>This value is not a valid ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>This value is neither a valid ISBN-10 nor a valid ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>This value is not a valid ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>This value is not a valid currency.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>This value should be equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>This value should be greater than {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>This value should be greater than or equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>This value should be less than {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>This value should be less than or equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>This value should not be equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>An empty file is not allowed.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>The host could not be resolved.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>This value does not match the expected {{ charset }} charset.</target>
            </trans-unit>
            <trans-unit id="81">
                <source>This is not a valid Business Identifier Code (BIC).</source>
                <target>This value is not a valid Business Identifier Code (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Error</target>
            </trans-unit>
            <trans-unit id="83">
                <source>This is not a valid UUID.</source>
                <target>This value is not a valid UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>This value should be a multiple of {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>This value should be valid JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>This collection should contain only unique elements.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>This value should be positive.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>This value should be either positive or zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>This value should be negative.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>This value should be either negative or zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>This value is not a valid timezone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>This password has been leaked in a data breach, it must not be used. Please use another password.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>This value should be between {{ min }} and {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>This value is not a valid hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>The number of elements in this collection should be a multiple of {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>This value should satisfy at least one of the following constraints:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Each element of this collection should satisfy its own set of constraints.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>This value is not a valid International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>This value should be a valid expression.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>This value is not a valid CSS color.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>This value is not a valid CIDR notation.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>The value of the netmask should be between {{ min }} and {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>The password strength is too low. Please use a stronger password.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>This value contains characters that are not allowed by the current restriction-level.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Using invisible characters is not allowed.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Mixing numbers from different scripts is not allowed.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Using hidden overlay characters is not allowed.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>This value is not a valid MAC address.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>This URL is missing a top-level domain.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>This value does not represent a valid week in the ISO 8601 format.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>This value is not a valid week.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>This value should not be before week "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>This value should not be after week "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>This value is not a valid Twig template.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>This file is not a valid video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>The size of the video could not be detected.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>The video file is corrupted.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>The video contains multiple streams. Only one stream is allowed.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Unsupported video codec "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Unsupported video container "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>The image file is corrupted.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>This filename does not match the expected charset.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="nn" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Verdien skulle ha vore tom/nei.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Verdien skulla ha vore satt/ja.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Verdien må vere av typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Verdien skal vere blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Verdien du valde er ikkje gyldig.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du må gjere minst {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan maksimalt gjere {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ein eller fleire av dei opplyste verdiane er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Dette feltet var ikkje forventa.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dette feltet mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Verdien er ikkje ein gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Verdien er ikkje ein gyldig dato og tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Verdien er ikkje ei gyldig e-postadresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fila er ikkje funnen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fila kan ikkje lesast.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fila er for stor ({{ size }} {{ suffix }}). Maksimal storleik er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime-typen av fila er ugyldig ({{ type }}). Tillatne mime-typar er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Verdien må vere {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Verdien er for lang. Den må vere {{ limit }} bokstavar eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Verdien må vere {{ limit }} eller meir.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Verdien er for kort. Den må ha {{ limit }} teikn eller fleire.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Verdien kan ikkje vere blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Verdien kan ikkje vere tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Verdien må vere tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Verdien er ikkje gyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Verdien er ikkje ei gyldig tidseining.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Verdien er ikkje ein gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Dei to verdiane må vere like.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fila er for stor. Den maksimale storleiken er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fila er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Fila kunne ikkje bli lasta opp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Verdien må vere eit gyldig tal.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fila er ikkje eit gyldig bilete.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Denne verdien er ikkje ein gyldig IP-adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Verdien er ikkje eit gyldig språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Verdien er ikkje ein gyldig lokalitet (språk/region).</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Verdien er ikkje eit gyldig land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Verdien er allereie i bruk.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Storleiken på biletet kunne ikkje oppdagast.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Biletbreidda er for stor, ({{ width }} pikslar). Tillaten maksimumsbreidde er {{ max_width }} pikslar.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Biletbreidda er for liten, ({{ width }} pikslar). Forventa minimumsbreidde er {{ min_width }} pikslar.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bilethøgda er for stor, ({{ height }} pikslar). Tillaten maksimumshøgde er {{ max_height }} pikslar.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Billethøgda er for låg, ({{ height }} pikslar). Forventa minimumshøgde er {{ min_height }} pikslar.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Verdien må vere brukaren sitt noverande passord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Verdien må vere nøyaktig {{ limit }} teikn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fila vart berre delvis lasta opp.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Inga fil vart lasta opp.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Ingen midlertidig mappe var konfigurert i php.ini, eller den konfigurerte mappa eksisterer ikkje.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikkje skrive førebels fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Ei PHP-udviding forårsaka feil under opplasting.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samlinga må innehalde {{ limit }} element eller meir.|Denne samlinga må innehalde {{ limit }} element eller meir.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samlinga må innehalde {{ limit }} element eller færre.|Denne samlinga må innehalde {{ limit }} element eller færre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samlinga må innehalde nøyaktig {{ limit }} element.|Denne samlinga må innehalde nøyaktig {{ limit }} element.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldig kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Korttypen er ikkje støtta, eller kortnummeret er ugyldig.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Denne verdien er ikkje eit gyldig internasjonalt bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Verdien er ikkje eit gyldig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Verdien er ikkje eit gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Verdien er verken eit gyldig ISBN-10 eller eit gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Verdien er ikkje eit gyldig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Verdien er ikkje ein gyldig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Verdien bør vera eins med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Verdien bør vera større enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Verdien bør vera større enn eller eins med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Verdien bør vera eins med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Verdien bør vera mindre enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Verdi bør vera mindre enn eller eins med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Verdi bør ikkje vera eins med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Denne verdien bør ikkje vera eins med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Sideforholdet til biletet er for stort ({{ ratio }}). Sideforholdet kan ikkje vere større enn {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Sideforholdet til biletet er for lite ({{ ratio }}). Sideforholdet kan ikkje vere mindre enn {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Biletet er kvadratisk ({{ width }}x{{ height }}px). Kvadratiske bilete er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Biletet er landskapsorientert ({{ width }}x{{ height }}px). Landskapsorienterte bilete er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Biletet er portrettorientert ({{ width }}x{{ height }}px). Portrettorienterte bilete er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Ei tom fil er ikkje tillate.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Verten kunne ikkje finnast.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Verdien stemmer ikkje med forventa {{ charset }} charset.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Denne verdien er ikkje ein gyldig forretningsidentifikasjonskode (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Feil</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Denne verdien er ikkje ein gyldig UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Verdien bør vera eit multipel av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Denne Business Identifier Code (BIC) er ikkje kopla til IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Verdien bør vera gyldig JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Denne samlinga bør berre innehalda unike element.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Verdien bør vera positiv.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Verdien bør vera anten positiv eller null.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Verdien bør vera negativ.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Verdien bør vera negativ eller null.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Verdien er ikkje ei gyldig tidssone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dette passordet har lekt ut ved eit datainnbrot, det får ikkje nyttast. Gje opp eit anna passord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Denne verdien bør liggje mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Verdien er ikkje eit gyldig vertsnamn.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Talet på element i denne samlinga bør vera eit multippel av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Verdien burde oppfylla minst ein av følgjande avgrensingar:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Kvart element i denne samlinga bør oppfylla sine eigne avgrensingar.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Verdien er ikkje eit gyldig International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Denne verdien skal være et gyldig uttrykk.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Denne verdien er ikke en gyldig CSS-farge.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Denne verdien er ikke en gyldig CIDR-notasjon.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Verdien av nettmasken skal være mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">Filnamnet er for langt. Det bør ha {{ filename_max_length }} teikn eller færre.|Filnamnet er for langt. Det bør ha {{ filename_max_length }} teikn eller færre.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">Passordstyrken er for låg. Vennligst bruk eit sterkare passord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">Denne verdien inneheld teikn som ikkje er tillatne av det gjeldande restriksjonsnivået.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">Det er ikkje tillate å bruke usynlege teikn.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">Det er ikkje tillate å blande tal frå forskjellige skript.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">Det er ikkje tillate å bruke skjulte overleggsteikn.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Filutvidinga er ugyldig ({{ extension }}). Tillatne utvidingar er {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Den oppdaga teiknkodinga er ugyldig ({{ detected }}). Tillatne kodingar er {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Denne verdien er ikkje ein gyldig MAC-adresse.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Denne URL-en manglar eit toppnivådomene.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Denne verdien er for kort. Han bør innehalde minst eitt ord.|Denne verdien er for kort. Han bør innehalde minst {{ min }} ord.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Denne verdien er for lang. Han bør innehalde berre eitt ord.|Denne verdien er for lang. Han bør innehalde {{ max }} ord eller færre.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Denne verdien representerer ikkje ein gyldig veke i ISO 8601-formatet.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Denne verdien er ikkje ei gyldig veke.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Denne verdien bør ikkje vere før veke "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Denne verdien bør ikkje vere etter veke "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Denne verdien er ikkje ein gyldig Twig-mal.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Denne fila er ikkje ein gyldig video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Storleiken på videoen kunne ikkje oppdagast.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Videobreidda er for stor ({{ width }}px). Tillaten maksimal breidde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Videobreidda er for lita ({{ width }}px). Forventa minimumsbreidde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Videoen si høgd er for stor ({{ height }}px). Tillaten maksimal høgd er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Videohøgda er for lita ({{ height }}px). Forventa minstehøgd er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoen har for få pikslar ({{ pixels }}). Forventa minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoen har for mange pikslar ({{ pixels }}). Forventa maksimalt tal er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Videoforholdet er for stort ({{ ratio }}). Tillaten maksimal forhold er {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Videoforholdet er for lite ({{ ratio }}). Forventa minimumsforhold er {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Videoen er kvadratisk ({{ width }}x{{ height }}px). Kvadratiske videoar er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Videoen er i liggjande format ({{ width }}x{{ height }} px). Liggjande videoar er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Videoen er i portrettformat ({{ width }}x{{ height }}px). Portrettvideoar er ikkje tillatne.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Videofila er skadd.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Videoen inneheld fleire straumar. Berre éin straum er tillaten.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Ikkje støtta videokodek «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Ikkje-støtta videokontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Bildefila er skadd.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Biletet har for få pikslar ({{ pixels }}). Forventa minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Biletet har for mange pikslar ({{ pixels }}). Forventa maksimalt tal er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Dette filnamnet samsvarar ikkje med forventa teiknsett.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="lt" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Reikšmė turi būti neigiama.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Reikšmė turi būti teigiama.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Šios reikšmės tipas turi būti {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ši reikšmė turi būti tuščia.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Neteisingas pasirinkimas.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Turite pasirinkti bent {{ limit }} variantą.|Turite pasirinkti bent {{ limit }} variantus.|Turite pasirinkti bent {{ limit }} variantų.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Turite pasirinkti ne daugiau kaip {{ limit }} variantą.|Turite pasirinkti ne daugiau kaip {{ limit }} variantus.|Turite pasirinkti ne daugiau kaip {{ limit }} variantų.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Viena ar daugiau įvestų reikšmių yra netinkamos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Nebuvo tikimasi šio laukelio.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Trūkstamas laukelis.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ši reikšmė nėra data.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ši reikšmė nera data ir laikas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ši reikšmė nėra tinkamas el. pašto adresas.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Byla nerasta.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Negalima nuskaityti bylos.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Byla yra per didelė ({{ size }} {{ suffix }}). Maksimalus dydis {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Netinkamas bylos tipas (mime type) ({{ type }}). Galimi bylų tipai {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Reikšmė turi būti {{ limit }} arba mažiau.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.|Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.|Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Reikšmė turi būti {{ limit }} arba daugiau.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.|Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.|Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ši reikšmė negali būti tuščia.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ši reikšmė negali būti null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ši reikšmė turi būti null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Netinkama reikšmė.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ši reikšmė nėra laikas.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ši reikšmė nėra tinkamas interneto adresas.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Abi reikšmės turi būti identiškos.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Byla yra per didelė. Maksimalus dydis yra {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Byla per didelė.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Byla negali būti įkelta.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ši reikšmė turi būti skaičius.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Byla nėra paveikslėlis.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ši reikšmė nėra tinkamas IP adresas.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ši reikšmė nėra tinkama kalba.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ši reikšmė nėra tinkama lokalė.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ši reikšmė nėra tinkama šalis.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ši reikšmė jau yra naudojama.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepavyko nustatyti nuotraukos dydžio.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Nuotraukos plotis per didelis ({{ width }}px). Maksimalus leidžiamas plotis yra {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Nuotraukos plotis per mažas ({{ width }}px). Minimalus leidžiamas plotis yra {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Nuotraukos aukštis per didelis ({{ height }}px). Maksimalus leidžiamas aukštis yra {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Nuotraukos aukštis per mažas ({{ height }}px). Minimalus leidžiamas aukštis yra {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ši reikšmė turi sutapti su dabartiniu naudotojo slaptažodžiu.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ši reikšmė turi turėti lygiai {{ limit }} simbolį.|Ši reikšmė turi turėti lygiai {{ limit }} simbolius.|Ši reikšmė turi turėti lygiai {{ limit }} simbolių.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Failas buvo tik dalinai įkeltas.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nebuvo įkelta jokių failų.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.ini nesukonfigūruotas laikinas aplankas arba sukonfigūruotas aplankas neegzistuoja.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nepavyko išsaugoti laikino failo.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP plėtinys sutrukdė failo įkėlimą ir jis nepavyko.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Sąraše turi būti {{ limit }} arba daugiau įrašų.|Sąraše turi būti {{ limit }} arba daugiau įrašų.|Sąraše turi būti {{ limit }} arba daugiau įrašų.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Sąraše turi būti {{ limit }} arba mažiau įrašų.|Sąraše turi būti {{ limit }} arba mažiau įrašų.|Sąraše turi būti {{ limit }} arba mažiau įrašų.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Sąraše turi būti lygiai {{ limit }} įrašas.|Sąraše turi būti lygiai {{ limit }} įrašai.|Sąraše turi būti lygiai {{ limit }} įrašų.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Klaidingas kortelės numeris.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Kortelės tipas nepalaikomas arba klaidingas kortelės numeris.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ši reikšmė nėra tinkamas Tarptautinis Banko Sąskaitos Numeris (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ši reikšmė neatitinka ISBN-10 formato.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ši reikšmė neatitinka ISBN-13 formato.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ši reikšmė neatitinka nei ISBN-10, nei ISBN-13 formato.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ši reišmė neatitinka ISSN formato.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Netinkamas valiutos formatas.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti didesnė už {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti didesnė už arba lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti identiška {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti mažesnė už {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti mažesnė už arba lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ši reikšmė neturi būti lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ši reikšmė neturi būti identiška {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Nuotraukos santykis yra per didelis ({{ ratio }}). Didžiausias leistinas santykis yra {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Nuotraukos santykis yra per mažas ({{ ratio }}). Mažiausias leistinas santykis yra {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Nuotrauka yra kvadratinė ({{ width }}x{{ height }}px). Kvadratinės nuotraukos nėra leistinos.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Nuotrauka orientuota į plotį ({{ width }}x{{ height }}px). Nuotraukos orientuotos į plotį nėra leistinos.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Nuotrauka orientuota į aukštį ({{ width }}x{{ height }}px). Nuotraukos orientuotos į aukštį nėra leistinos.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Failas negali būti tuščias.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Serveris nepasiekiamas.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ši reikšmė neatitinka {{ charset }} koduotės.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ši reikšmė nėra tinkamas Verslo Identifikavimo Kodas (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Klaida</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ši reikšmė nėra tinkamas UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti skaičiaus {{ compared_value }} kartotinis.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Šis bendrovės identifikavimo kodas (BIC) nesusijęs su IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ši reikšmė turi būti tinkamo JSON formato.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Sąraše turi būti tik unikalios reikšmės.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Reikšmė turi būti teigiama.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Reikšmė turi būti teigiama arba lygi nuliui.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Reikšmė turi būti neigiama.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Reikšmė turi būti neigiama arba lygi nuliui.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Reikšmė nėra tinkama laiko juosta.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Slaptažodis yra nutekėjęs duomenų saugumo pažeidime, jo naudoti negalima. Prašome naudoti kitą slaptažodį.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ši reikšmė turi būti tarp {{ min }} ir {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ši reikšmė nėra tinkamas svetainės adresas.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Šio sąrašo elementų skaičius turėtų būti skaičiaus {{ compared_value }} kartotinis.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ši reikšmė turėtų atitikti bent vieną iš šių nurodymų:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Kiekvienas šio sąrašo elementas turi atitikti savo nurodymų rinkinį.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ši reišmė neatitinka tarptautinio vertybinių popierių identifikavimo numerio formato (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ši vertė turėtų būti teisinga išraiška.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ši reikšmė nėra tinkama CSS spalva.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ši vertė nėra tinkamas CIDR žymėjimas.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Tinklo kaukės reikšmė turi būti nuo {{ min }} iki {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Failo pavadinimas per ilgas. Jame turėtų būti {{ filename_max_length }} simbolis arba mažiau.|Failo pavadinimas per ilgas. Jame turėtų būti {{ filename_max_length }} simbolių arba mažiau.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Slaptažodis per silpnas. Naudokite stipresnį slaptažodį.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Šioje reikšmėje yra simbolių, kurių neleidžia dabartinis apribojimo lygis.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Naudoti nematomus simbolius draudžiama.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Draudžiama maišyti skaičius iš skirtingų scenarijų.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Draudžiama naudoti paslėptus perdangos simbolius.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Failo plėtinys netinkamas ({{ extension }}). Leidžiami plėtiniai yra {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Aptikta simbolių koduotė yra netinkama ({{ detected }}). Leidžiamos koduotės yra {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ši reikšmė nėra tinkamas MAC adresas.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Šiam URL trūksta aukščiausio lygio domeno.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Per mažas žodžių skaičius. Turi susidaryti bent iš 1 žodžio.|Per mažas žodžių skaičius. Turi susidaryti iš {{ min }} arba daugiau žodžių.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Per didelis žodžių skaičius. Turi susidaryti iš 1 žodžio.|Per didelis žodžių skaičius. Turi susidaryti iš {{ max }} arba mažiau žodžių.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Ši reikšmė neatitinka galiojančios savaitės ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Ši reikšmė nėra galiojanti savaitė.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Ši reikšmė neturėtų būti prieš savaitę "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Ši reikšmė neturėtų būti po savaitės "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ši reikšmė nėra tinkamas „Twig“ šablonas.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Šis failas nėra galiojantis vaizdo įrašas.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Nepavyko nustatyti vaizdo įrašo dydžio.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Vaizdo įrašo plotis per didelis ({{ width }}px). Leidžiamas didžiausias plotis yra {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Vaizdo įrašo plotis per mažas ({{ width }}px). Tikėtinas mažiausias plotis yra {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Vaizdo aukštis per didelis ({{ height }}px). Leidžiamas maksimalus aukštis yra {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Vaizdo aukštis per mažas ({{ height }}px). Tikėtinas minimalus aukštis yra {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Vaizdo įraše per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Vaizdo įraše per daug pikselių ({{ pixels }}). Tikimasi, kad didžiausias kiekis yra {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Vaizdo santykis per didelis ({{ ratio }}). Leidžiamas didžiausias santykis yra {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Vaizdo santykis per mažas ({{ ratio }}). Tikimasi mažiausias santykis yra {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Vaizdo įrašas yra kvadratinis ({{ width }}x{{ height }}px). Kvadratiniai vaizdo įrašai neleidžiami.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Vaizdo įrašas yra gulsčio formato ({{ width }}x{{ height }} px). Gulsčio formato vaizdo įrašai neleidžiami.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Vaizdo įrašas yra portreto orientacijos ({{ width }}x{{ height }}px). Portreto orientacijos vaizdo įrašai neleidžiami.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Vaizdo failas sugadintas.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Vaizdo įraše yra keli srautai. Leidžiamas tik vienas srautas.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nepalaikomas vaizdo kodekas „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nepalaikomas vaizdo konteineris "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Paveikslėlio failas sugadintas.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Paveikslėlyje per mažai pikselių ({{ pixels }}). Tikimasi mažiausiai {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Paveikslėlis turi per daug pikselių ({{ pixels }}). Tikėtinas didžiausias kiekis yra {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Šis failo pavadinimas neatitinka laukiamo ženklų rinkinio.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ja" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>この値はfalseでなければなりません。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>この値はtrueでなければなりません。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>この値は{{ type }}型でなければなりません。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>この値は空でなければなりません。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>有効な選択肢ではありません。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>{{ limit }}個以上選択してください。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>{{ limit }}個以下で選択してください。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>無効な値が含まれています。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>このフィールドは不要です。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>このフィールドを入力してください。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>有効な日付ではありません。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>有効な日時ではありません。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>有効なメールアドレスではありません。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>ファイルが見つかりません。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>ファイルが読み込めません。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ファイルのサイズが大きすぎます（{{ size }} {{ suffix }}）。{{ limit }} {{ suffix }}以下にしてください。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>ファイルのMIMEタイプが無効です（{{ type }}）。有効なMIMEタイプは{{ types }}です。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>この値は{{ limit }}以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>長すぎます。この値は{{ limit }}文字以下で入力してください。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>この値は{{ limit }}以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>短すぎます。この値は{{ limit }}文字以上で入力してください。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>この値は空にできません。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>値を入力してください。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>入力しないでください。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>有効な値ではありません。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>有効な時刻ではありません。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>有効なURLではありません。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>2つの値は同じでなければなりません。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ファイルのサイズが大きすぎます。許可されている最大サイズは{{ limit }} {{ suffix }}です。</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>ファイルのサイズが大きすぎます。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>ファイルをアップロードできませんでした。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>この値は有効な数値でなければなりません。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>選択されたファイルは有効な画像ではありません。</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>有効なIPアドレスではありません。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>有効な言語名ではありません。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>有効なロケールではありません。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>有効な国名ではありません。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>既に使用されています。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>画像のサイズが検出できません。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>画像の幅が大きすぎます（{{ width }}px）。{{ max_width }}px以下にしてください。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>画像の幅が小さすぎます（{{ width }}px）。{{ min_width }}px以上にしてください。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>画像の高さが大きすぎます（{{ height }}px）。{{ max_height }}px以下にしてください。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>画像の高さが小さすぎます（{{ height }}px）。{{ min_height }}px以上にしてください。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>現在のパスワードを入力してください。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>この値は{{ limit }}文字ちょうどで入力してください。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>ファイルのアップロードが完了しませんでした。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>ファイルがアップロードされていません。</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.iniに一時フォルダが設定されていないか、設定されたフォルダが存在しません。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>一時ファイルをディスクに書き込むことができません。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP拡張が原因でアップロードに失敗しました。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>要素は{{ limit }}個以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>要素は{{ limit }}個以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>要素はちょうど{{ limit }}個でなければなりません。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>無効なカード番号です。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>対応していないカードまたは無効なカード番号です。</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>有効な国際銀行勘定番号（IBAN）ではありません。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>有効なISBN-10コードではありません。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>有効なISBN-13コードではありません。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>有効なISBN-10コードまたはISBN-13コードではありません。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>有効なISSNコードではありません。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>有効な通貨ではありません。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}と同じ値でなければなりません。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}より大きくなければなりません。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>この値は{{ compared_value_type }}型の{{ compared_value }}と同じでなければなりません。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}未満でなければなりません。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}と等しくてはいけません。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>この値は{{ compared_value_type }}型の{{ compared_value }}と異なる値にしてください。</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>画像のアスペクト比が大きすぎます（{{ ratio }}）。{{ max_ratio }}までにしてください。</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>画像のアスペクト比が小さすぎます（{{ ratio }}）。{{ min_ratio }}以上にしてください。</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>画像が正方形になっています（{{ width }}x{{ height }}px）。正方形の画像は許可されていません。</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>画像が横向きになっています（{{ width }}x{{ height }}px）。横向きの画像は許可されていません。</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>画像が縦向きになっています（{{ width }}x{{ height }}px）。縦向きの画像は許可されていません。</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>空のファイルは許可されていません。</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>ホストを解決できませんでした。</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>この値の文字コードが期待される{{ charset }}と一致しません。</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>有効な事業者識別コード（BIC）ではありません。</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>エラー</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>有効なUUIDではありません。</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>この値は{{ compared_value }}の倍数でなければなりません。</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>このSWIFTコードはIBANコード（{{ iban }}）に関連付けられていません。</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>この値は有効なJSONでなければなりません。</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>要素は重複してはなりません。</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>この値は正の数でなければなりません。</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>この値は正の数、または0でなければなりません。</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>この値は負の数でなければなりません。</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>この値は負の数、または0でなければなりません。</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>有効なタイムゾーンではありません。</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>このパスワードは漏洩しているため使用できません。</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>この値は{{ min }}以上{{ max }}以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>有効なホスト名ではありません。</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>要素の数は{{ compared_value }}の倍数でなければなりません。</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>以下の制約のうち少なくとも1つを満たさなければなりません。</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>コレクションの各要素は、それぞれの制約を満たさなければなりません。</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>この値は有効な国際証券識別番号（ISIN）ではありません。</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>この値は有効な式形式でなければなりません。</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>この値は有効なCSSカラーではありません。</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>この値は有効なCIDR表記ではありません。</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>サブネットマスクは{{ min }}から{{ max }}の範囲で入力してください。</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>ファイル名が長すぎます。ファイル名は{{ filename_max_length }}文字以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>パスワードの強度が弱すぎます。より強いパスワードを使用してください。</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>現在の設定では使用できない文字が含まれています。</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>不可視文字は使用できません。</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>異なる種類の数字を使うことはできません。</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>隠れたオーバレイ文字は使用できません。</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>ファイルの拡張子が無効です（{{ extension }}）。有効な拡張子は{{ extensions }}です。</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>検出された文字コードは無効です（{{ detected }}）。有効な文字コードは{{ encodings }}です。</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>有効なMACアドレスではありません。</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>このURLはトップレベルドメインがありません。</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>短すぎます。この値は{{ min }}単語以上にする必要があります。</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>長すぎます。この値は{{ max }}単語以下にする必要があります。</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>週の形式が正しくありません（ISO 8601形式）。</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>有効な週形式ではありません。</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>週 "{{ min }}" 以降を指定してください。</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>週 "{{ max }}" までを指定してください。</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>有効なTwigテンプレートではありません。</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>選択されたファイルは有効な動画ではありません。</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>動画のファイルサイズを検出できませんでした。</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>動画の幅が大きすぎます（{{ width }}px）。許可されている最大の幅は {{ max_width }}px です。</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>動画の幅が小さすぎます（{{ width }}px）。許可されている最小の幅は {{ min_width }}px です。</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>動画の高さが大きすぎます （{{ height }}px）。許可されている最大の高さは {{ max_height }}px です。</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>動画の高さが小さすぎます （{{ height }}px）。許可されている最小の高さは {{ min_height }}px です。</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>この動画のピクセル数が少なすぎます （{{ pixels }}）。許可されている最小ピクセル数は {{ min_pixels }} です。</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>この動画のピクセル数が多すぎます （{{ pixels }}）。許可されている最大ピクセル数は {{ max_pixels }} です。</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>動画のアスペクト比が大きすぎます （{{ ratio }}）。許可されている最大比率は {{ max_ratio }} です。</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>動画のアスペクト比が小さすぎます （{{ ratio }}）。許可されている最小比率は {{ min_ratio }} です。</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>動画は正方形です （{{ width }}x{{ height }}px）。正方形の動画は許可されていません。</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>動画は横向きです（{{ width }}x{{ height }}px）。横向きの動画は許可されていません。</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>動画は縦向きです（{{ width }}x{{ height }}px）。縦向きの動画は許可されていません。</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>動画ファイルが破損しています。</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>この動画には複数のストリームが含まれています。許可されるのは1つのストリームのみです。</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>サポートされていないビデオコーデック「{{ codec }}」です。</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>サポートされていない動画コンテナ「{{ container }}」です。</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>画像ファイルが破損しています。</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>画像のピクセル数が少なすぎます（{{ pixels }}）。許可されている最小ピクセル数は {{ min_pixels }} です。</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>画像のピクセル数が多すぎます（{{ pixels }}）。許可されている最大ピクセル数は {{ max_pixels }} です。</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>このファイル名は期待される文字セットと一致しません。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="uk" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Значення повинно бути Ні.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Значення повинно бути Так.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Тип значення повинен бути {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Значення повинно бути пустим.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Обране вами значення недопустиме.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Ви повинні обрати хоча б {{ limit }} варіант.|Ви повинні обрати хоча б {{ limit }} варіанти.|Ви повинні обрати хоча б {{ limit }} варіантів.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Ви повинні обрати не більше ніж {{ limit }} варіантів.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Одне або кілька заданих значень є недопустимі.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Це поле не очікується.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Це поле не вистачає.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Дане значення не є вірною датою.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Дане значення дати та часу недопустиме.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Значення адреси электронної пошти недопустиме.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл не знайдено.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл не читається.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадто великий ({{ size }} {{ suffix }}). Дозволений максимальний розмір {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-тип файлу недопустимий ({{ type }}). Допустимі MIME-типи файлів {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Значення повинно бути {{ limit }} або менше.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Значення занадто довге. Повинно бути рівне {{ limit }} символу або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Значення повинно бути {{ limit }} або більше.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Значення занадто коротке. Повинно бути рівне {{ limit }} символу або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Значення не повинно бути пустим.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Значення не повинно бути null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Значення повинно бути null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Значення недопустиме.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Значення часу недопустиме.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Значення URL недопустиме.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Обидва занчення повинні бути одинаковими.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадто великий. Максимальний допустимий розмір {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл занадто великий.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл не можливо завантажити.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Значення має бути допустимим числом.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Цей файл не є допустимим форматом зображення.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Це значення не є дійсною IP-адресою.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Це некоректна мова.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Це некоректна локалізація.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Це некоректна країна.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Це значення вже використовується.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Не вдалося визначити розмір зображення.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина зображення занадто велика ({{ width }}px). Максимально допустима ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина зображення занадто мала ({{ width }}px). Мінімально допустима ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висота зображення занадто велика ({{ height }}px). Максимально допустима висота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висота зображення занадто мала ({{ height }}px). Мінімально допустима висота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Значення має бути поточним паролем користувача.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Значення повинно бути рівним {{ limit }} символу.|Значення повинно бути рівним {{ limit }} символам.|Значення повинно бути рівним {{ limit }} символам.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файл був завантажений лише частково.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файл не був завантажений.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>У php.ini не було налаштовано тимчасової теки, або налаштована тека не існує.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Неможливо записати тимчасовий файл на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Розширення PHP викликало помилку при завантаженні.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ця колекція повинна містити {{ limit }} елемент чи більше.|Ця колекція повинна містити {{ limit }} елемента чи більше.|Ця колекція повинна містити {{ limit }} елементів чи більше.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ця колекція повинна містити {{ limit }} елемент чи менше.|Ця колекція повинна містити {{ limit }} елемента чи менше.|Ця колекція повинна містити {{ limit }} елементов чи менше.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ця колекція повинна містити рівно {{ limit }} елемент.|Ця колекція повинна містити рівно {{ limit }} елемента.|Ця колекція повинна містити рівно {{ limit }} елементів.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невірний номер карти.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Непідтримуваний тип карти або невірний номер карти.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Це значення не є дійсним міжнародним номером банківського рахунку (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Значення не у форматі ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Значення не у форматі ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Значення не відповідає форматам ISBN-10 та ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Значення має невірний формат ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Значення має невірний формат валюти.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Значення повинно дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Значення має бути більше ніж {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Значення має бути більше або дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значення має бути ідентичним {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Значення повинно бути менше ніж {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Значення повинно бути менше або дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Значення не повинно дорівнювати  {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значення не повинно бути ідентичним {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Співвідношення сторін зображення занадто велике ({{ ratio }}). Максимальне співвідношення сторін {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Співвідношення сторін зображення занадто мало ({{ ratio }}). Мінімальне співвідношення сторін {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Зображення квадратне ({{ width }}x{{ height }}px). Квадратні зображення не дозволені.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Зображення альбомної орієнтації ({{ width }}x{{ height }}px). Зображення альбомної орієнтації не дозволені.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Зображення в портретній орієнтації ({{ width }}x{{ height }}px). Зображення в портретної орієнтації не дозволені.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Порожні файли не дозволені.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Ім'я хоста не знайдено.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Значення не збігається з очікуваним {{ charset }} кодуванням.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Це значення не є дійсним банківським кодом (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Помилка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Це значення не є дійсним UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Це значення повинне бути кратним {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Банківський код (BIC) не пов’язаний із міжнародним номером банківського рахунку (IBAN) {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Значення має бути корректним JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ця колекція повинна мати тільки унікальни значення.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Значення має бути позитивним.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Значення має бути позитивним або дорівнювати нулю.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Значення має бути негативним.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Значення має бути негативним або дорівнювати нулю.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Значення не є дійсним часовим поясом.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Цей пароль був скомпрометований в результаті витоку даних та не повинен використовуватися. Будь ласка, використовуйте інший пароль.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Значення має бути між {{ min }} та {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Значення не є дійсним іменем хоста.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Кількість елементів у цій колекції повинна бути кратною {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Значення повинно задовольняти хоча б одному з наступних обмежень:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Кожен елемент цієї колекції повинен задовольняти власному набору обмежень.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Це значення не є дійсним міжнародним ідентифікаційним номером цінних паперів (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Це значення має бути дійсним виразом.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Це значення не є дійсним CSS кольором.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Це значення не є дійсною CIDR нотаціею.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Значення в мережевій масці має бути між {{ min }} та {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Назва файлу занадто довга. Вона має містити {{ filename_max_length }} символів або менше.|Назва файлу занадто довга. Вона має містити {{ filename_max_length }} символів або менше.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Надійність пароля занадто низька. Будь ласка, створіть складніший пароль.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Це значення містить символи, які не дозволяються поточним рівнем обмежень.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Використання невидимих ​​символів не допускається.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Змішувати числа з різних скриптів не допускається.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Використання прихованих накладених символів не допускається.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Розширення файлу недопустиме ({{ extension }}). Дозволені розширення {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Недопустиме кодування символів ({{ detected }}). Допустимі кодування: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Це значення не є дійсною MAC-адресою.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Цьому URL не вистачає домену верхнього рівня.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Це значення занадто коротке. Воно має містити принаймні одне слово.|Це значення занадто коротке. Мінімальна кількість слів — {{ min }}.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Це значення занадто довге. Воно має містити лише одне слово.|Це значення занадто довге. Максимальна кількість слів — {{ max }}.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Це значення не представляє дійсний тиждень у форматі ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Це значення не є дійсним тижнем.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Це значення не повинно бути раніше тижня "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Це значення не повинно бути після тижня "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Це значення не є дійсним шаблоном Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Цей файл не є допустимим відеофайлом.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Не вдалося визначити розмір відеофайлу.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина відеофайлу занадто велика ({{ width }}px). Максимально допустима ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина відеофайлу занадто мала ({{ width }}px). Мінімально допустима ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висота відеофайлу занадто велика ({{ height }}px). Максимально допустима висота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висота відеофайлу занадто мала ({{ height }}px). Мінімально допустима висота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Кількість пікселів у відеофайлі занадто мала ({{ pixels }} пікселів). Мінімально допустима кількість {{ min_pixels }} пікселів.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Кількість пікселів у відеофайлі занадто велика ({{ pixels }} пікселів). Максимально допустима кількість {{ max_pixels }} пікселів.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Співвідношення сторін відеофайлу занадто велике ({{ ratio }}). Максимально допустиме співвідношення сторін {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Співвідношення сторін відеофайлу занадто мале ({{ ratio }}). Мінімально допустиме співвідношення сторін {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target> Відеофайл має квадратні пропорції ({{ width }}x{{ height }}px). Квадратні відеофайли не дозволені.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Відеофайл в альбомній орієнтації ({{ width }}x{{ height }}px). Відеофайли в альбомній орієнтації не дозволені.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Відеофайл у портретній орієнтації ({{ width }}x{{ height }}px). Відеофайли у портретній орієнтації не дозволені.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Відеофайл пошкоджено.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Відеофайл містить кілька потоків. Дозволено лише один потік.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Непідтримуваний відеокодек «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Непідтримуваний відеоконтейнер "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Файл зображення пошкоджено.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Кількість пікселів у зображенні занадто мала ({{ pixels }} пікселів). Мінімально допустима кількість {{ min_pixels }} пікселів.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Кількість пікселів у зображенні занадто велика ({{ pixels }} пікселів). Максимально допустима кількість {{ max_pixels }} пікселів.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Назва файлу не відповідає очікуваному набору символів.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="cy" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dylid bod y gwerth hwn yn ffug.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dylid bod y gwerth hwn yn wir.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dylid bod y gwerth hwn bod o fath {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dylid bod y gwerth hwn yn wag.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Nid yw'r gwerth â ddewiswyd yn ddilys.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Rhaid dewis o leiaf {{ limit }} opsiwn.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Rhaid dewis dim mwy na {{ limit }} opsiwn.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Mae un neu fwy o'r gwerthoedd a roddwyd yn annilys.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Nid oedd disgwyl y maes hwn.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Mae'r maes hwn ar goll.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Nid yw'r gwerth yn ddyddiad dilys.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Nid yw'r gwerth yn datetime dilys.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Nid yw'r gwerth yn gyfeiriad ebost dilys.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ni ddarganfyddwyd y ffeil.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Ni ellir darllen y ffeil.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Mae'r ffeil yn rhy fawr ({{ size }} {{ suffix }}). Yr uchafswm â ganiateir yw {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Nid yw math mime y ffeil yn ddilys ({{ type }}). Dyma'r mathau â ganiateir {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dylai'r gwerth hwn fod yn {{ limit }} neu lai.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Mae'r gwerth hwn rhy hir. Dylai gynnwys {{ limit }} nodyn cyfrifiadurol neu lai.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dylai'r gwerth hwn fod yn {{ limit }} neu fwy.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys {{ limit }} nodyn cyfrifiadurol neu fwy.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ni ddylai'r gwerth hwn fod yn wag.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ni ddylai'r gwerth hwn fod yn null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dylai'r gwerth fod yn null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Nid yw'r gwerth hwn yn ddilys.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Nid yw'r gwerth hwn yn amser dilys.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Nid yw'r gwerth hwn yn URL dilys.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Rhaid i'r ddau werth fod yn gyfystyr a'u gilydd.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Mae'r ffeil yn rhy fawr. Yr uchafswm â ganiateir yw {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Mae'r ffeil yn rhy fawr.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Methwyd ag uwchlwytho'r ffeil.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dylai'r gwerth hwn fod yn rif dilys.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Nid yw'r ffeil hon yn ddelwedd dilys.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn gyfeiriad IP dilys.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Nid yw'r gwerth hwn yn iaith ddilys.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Nid yw'r gwerth hwn yn locale dilys.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Nid yw'r gwerth hwn yn wlad dilys.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Mae'r gwerth hwn eisoes yn cael ei ddefnyddio.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Methwyd â darganfod maint y ddelwedd.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Mae lled y ddelwedd yn rhy fawr ({{ width }}px). Y lled mwyaf â ganiateir yw {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Mae lled y ddelwedd yn rhy fach ({{ width }}px). Y lled lleiaf â ganiateir yw {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Mae uchder y ddelwedd yn rhy fawr ({{ width }}px). Yr uchder mwyaf â ganiateir yw {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Mae uchder y ddelwedd yn rhy fach ({{ width }}px). Yr uchder lleiaf â ganiateir yw {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Dylaid bod y gwerth hwn yn gyfrinair presenol y defnyddiwr.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dylai'r gwerth hwn fod yn union {{ limit }} nodyn cyfrifiadurol o hyd.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Dim ond rhan o'r ffeil ag uwchlwythwyd.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ni uwchlwythwyd unrhyw ffeil.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Nid oedd ffolder dros dro wedi'i ffurfweddu yn php.ini, neu nid yw'r ffolder a ffurfweddiwyd yn bodoli.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Methwyd ag ysgrifennu'r ffeil dros-dro ar ddisg.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Methwyd ag uwchlwytho oherwydd ategyn PHP.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Dylai'r casgliad hwn gynnwys {{ limit }} elfen neu fwy.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Dylai'r casgliad hwn gynnwys {{ limit }} elfen neu lai.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Dylai'r casgliad hwn gynnwys union {{ limit }} elfen.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nid oedd rhif y cerdyn yn ddilys.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Unai ni dderbynir y math yna o gerdyn, neu nid yw rhif y cerdyn yn ddilys.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn Rhif Cyfrif Banc Rhyngwladol (IBAN) dilys.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Nid yw'r gwerth hwn yn ISBN-10 dilys.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Nid yw'r gwerth hwn yn ISBN-13 dilys.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Nid yw'r gwerth hwn yn Rhif ISBN-10 dilys nac yn ISBN-13 dilys.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Nid yw'r gwerth hwn yn ISSN dilys.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Nid yw'r gwerth hwn yn arian dilys.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn gyfartal â {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn fwy na {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn fwy na neu'n hafal i {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn union yr un fath â {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn llai na {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn llai na neu'n hafal i {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ni ddylai'r gwerth hwn fod yn hafal i {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ni ddylai'r gwerth hwn fod yn union yr un fath â {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Mae'r gymhareb delwedd yn rhy fawr ({{ ratio }}). Y gymhareb uchaf a ganiateir yw {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Mae'r gymhareb delwedd yn rhy fach ({{ ratio }}). Y gymhareb isaf a ddisgwylir yw {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Mae'r ddelwedd yn sgwâr ({{ width }}x{{ height }}px). Ni chaniateir delweddau sgwâr.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Mae'r ddelwedd mewn fformat tirlun ({{ width }}x{{ height }}px). Ni chaniateir delweddau mewn fformat tirlun.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Mae'r ddelwedd mewn fformat portread ({{ width }}x{{ height }}px). Ni chaniateir delweddau mewn fformat portread.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Ni chaniateir ffeil wag.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Ni fu modd datrys y gwesteiwr.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Nid yw'r gwerth hwn yn cyfateb â'r {{ charset }} set nodau ddisgwyliedig.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn God Adnabod Busnes (BIC) dilys.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Gwall</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn UUID dilys.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Dylai'r gwerth hwn fod yn luosrif o {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Nid yw'r Cod Adnabod Busnes (BIC) hwn yn gysylltiedig ag IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn JSON dilys.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target state="needs-review-translation">Dylai'r casgliad hwn gynnwys elfennau unigryw yn unig.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn gadarnhaol.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn gadarnhaol neu sero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn negyddol.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn negyddol neu sero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn gyfnod parth amser dilys.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target state="needs-review-translation">Mae'r cyfrinair hwn wedi'i ddatgelu mewn toriad data, ni ddylid ei ddefnyddio. Defnyddiwch gyfrinair arall.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod rhwng {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn enw gwesteiwr dilys.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target state="needs-review-translation">Dylai nifer yr elfennau yn y casgliad hwn fod yn luosrif o {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fodloni o leiaf un o'r cyfyngiadau canlynol:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target state="needs-review-translation">Dylai pob elfen o'r casgliad hwn fodloni ei gyfres ei hun o gyfyngiadau.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn Rhif Adnabod Diogelwch Rhyngwladol (ISIN) dilys.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target state="needs-review-translation">Dylai'r gwerth hwn fod yn fynegiant dilys.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn lliw CSS dilys.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn nodiant CIDR dilys.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target state="needs-review-translation">Dylai gwerth y mwgwd rhwydwaith fod rhwng {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">Mae'r enw ffeil yn rhy hir. Dylai fod â {{ filename_max_length }} cymeriad neu lai.|Mae'r enw ffeil yn rhy hir. Dylai fod â {{ filename_max_length }} nodau neu lai.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">Mae cryfder y cyfrinair yn rhy isel. Defnyddiwch gyfrinair cryfach os gwelwch yn dda.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">Mae'r gwerth hwn yn cynnwys cymeriadau nad ydynt yn cael eu caniatáu gan y lefel cyfyngu presennol.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">Ni chaniateir defnyddio cymeriadau anweledig.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">Ni chaniateir cymysgu rhifau o sgriptiau gwahanol.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">Ni chaniateir defnyddio cymeriadau goruwchlwytho cudd.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Mae estyniad y ffeil yn annilys ({{ extension }}). Mae'r estyniadau a ganiateir yn {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Mae'r codio cymeriadau a ganfuwyd yn annilys ({{ detected }}). Mae'r codiadau a ganiateir yn {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn gyfeiriad MAC dilys.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Mae'r URL hwn yn colli parth lefel uchaf.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys o leiaf un gair.|Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys o leiaf {{ min }} gair.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Mae'r gwerth hwn yn rhy hir. Dylai gynnwys un gair yn unig.|Mae'r gwerth hwn yn rhy hir. Dylai gynnwys {{ max }} gair neu lai.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn cynrychioli wythnos dilys yn fformat ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn wythnos ddilys.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Ni ddylai'r gwerth hwn fod cyn wythnos "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Ni ddylai'r gwerth hwn fod ar ôl yr wythnos "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Nid yw'r gwerth hwn yn dempled Twig dilys.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Nid yw’r ffeil hon yn fideo dilys.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Nid oedd modd canfod maint y fideo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Mae lled y fideo yn rhy fawr ({{ width }}px). Y lled uchaf a ganiateir yw {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Mae lled y fideo yn rhy fach ({{ width }}px). Lled lleiaf disgwyliedig yw {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Mae uchder y fideo yn rhy fawr ({{ height }}px). Yr uchder mwyaf a ganiateir yw {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Mae uchder y fideo yn rhy fach ({{ height }}px). Yr uchder lleiaf disgwyliedig yw {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Mae gan y fideo rhy ychydig o bicseli ({{ pixels }}). Y swm lleiaf disgwyliedig yw {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Mae gan y fideo ormod o bicseli ({{ pixels }}). Y swm uchaf disgwyliedig yw {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Mae cymhareb y fideo yn rhy fawr ({{ ratio }}). Y gymhareb uchaf a ganiateir yw {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Mae cymhareb y fideo yn rhy fach ({{ ratio }}). Y gymhareb leiaf ddisgwyliedig yw {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Mae'r fideo'n sgwâr ({{ width }}x{{ height }}px). Nid yw fideos sgwâr yn cael eu caniatáu.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Mae’r fideo yn dirwedd ({{ width }}x{{ height }} px). Ni chaniateir fideos tirwedd.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Mae'r fideo wedi'i gyfeirio'n bortread ({{ width }}x{{ height }}px). Nid yw fideos portread yn cael eu caniatáu.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Mae'r ffeil fideo wedi'i llygru.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Mae'r fideo yn cynnwys sawl ffrwd. Dim ond un ffrwd a ganiateir.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Codec fideo heb ei gefnogi "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Cynhwysydd fideo heb ei gefnogi "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Mae'r ffeil delwedd wedi'i llygru.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Mae gan y ddelwedd rhy ychydig o bicseli ({{ pixels }}). Y lleiafswm disgwyliedig yw {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Mae gan y ddelwedd ormod o bicseli ({{ pixels }}). Y nifer uchaf disgwyliedig yw {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Nid yw'r enw ffeil hwn yn cyfateb i'r set nodau ddisgwyliedig.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ro" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Această valoare ar trebui să fie falsă.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Această valoare ar trebui să fie adevărată.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Această valoare ar trebui să fie de tipul {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Această valoare ar trebui să fie necompletată.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Valoarea selectată nu este o opțiune validă.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Trebuie să selectați cel puțin {{ limit }} opțiune.|Trebuie să selectați cel puțin {{ limit }} opțiuni.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Trebuie să selectați cel mult {{ limit }} opțiune.|Trebuie să selectați cel mult {{ limit }} opțiuni.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Una sau mai multe dintre valorile furnizate sunt invalide.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Acest câmp nu era prevăzut.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Acest câmp lipsește.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Această valoare nu reprezintă o dată validă.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Această valoare nu reprezintă o dată și oră validă.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Această valoare nu reprezintă o adresă de e-mail validă.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fișierul nu a putut fi găsit.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fișierul nu poate fi citit.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fișierul este prea mare ({{ size }} {{ suffix }}). Dimensiunea maximă permisă este {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Tipul fișierului este invalid ({{ type }}). Tipurile de fișiere permise sunt {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Această valoare ar trebui să fie cel mult {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Această valoare ar trebui să fie cel puțin {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Această valoare nu ar trebui să fie necompletată.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Această valoare nu ar trebui să fie nulă.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Această valoare ar trebui să fie nulă.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Această valoare nu este validă.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Această valoare nu reprezintă o oră validă.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Această valoare nu reprezintă un URL valid.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Cele două valori ar trebui să fie egale.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fișierul este prea mare. Mărimea maximă permisă este de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fișierul este prea mare.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Fișierul nu a putut fi încărcat.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Această valoare nu reprezintă un număr valid.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Acest fișier nu este o imagine validă.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Această valoare nu este o adresă de IP validă.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Această valoare nu reprezintă o limbă corectă.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Această valoare nu este o localizare validă.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Această valoare nu este o țară validă.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Această valoare este folosită deja.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Mărimea imaginii nu a putut fi detectată.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lățimea imaginii este prea mare ({{ width }}px). Lățimea maximă permisă este de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lățimea imaginii este prea mică ({{ width }}px). Lățimea minimă permisă este de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Înălțimea imaginii este prea mare ({{ height }}px). Înălțimea maximă permisă este de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Înălțimea imaginii este prea mică ({{ height }}px). Înălțimea minimă permisă este de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Această valoare trebuie să fie parola curentă a utilizatorului.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fișierul a fost încărcat parțial.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nu a fost încărcat niciun fișier.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nu a fost configurat niciun folder temporar în php.ini, sau folderul configurat nu există.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nu a fost posibilă scrierea fișierului temporar pe disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>O extensie PHP a cauzat eșecul încărcării.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Această colecție trebuie să conțină cel puțin {{ limit }} element.|Această colecție trebuie să conțină cel puțin {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Această colecție trebuie să conțină cel mult {{ limit }} element.|Această colecție trebuie să conțină cel mult {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Această colecție trebuie să conțină exact {{ limit }} element.|Această colecție trebuie să conțină exact {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numărul cardului este invalid.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipul sau numărul cardului sunt invalide.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Această valoare nu este un Număr de Cont Bancar Internațional (IBAN) valid.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Această valoare nu este un cod ISBN-10 valid.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Această valoare nu este un cod ISBN-13 valid.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Această valoare nu este un cod ISBN-10 sau ISBN-13 valid.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Această valoare nu este un cod ISSN valid.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Această valoare nu este o monedă validă.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mare decât {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mare sau egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie identică cu {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mică decât {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mică sau egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Această valoare nu trebuie să fie egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Această valoare nu trebuie să fie identică cu {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Raportul imaginii este prea mare ({{ ratio }}). Raportul maxim permis este {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Raportul imaginii este prea mic ({{ ratio }}). Raportul minim permis este {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Imaginea este pătrată ({{ width }}x{{ height }}px). Imaginile pătrate nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Imaginea are orientarea orizontală ({{ width }}x{{ height }}px). Imaginile cu orientare orizontală nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Imaginea are orientarea portret ({{ width }}x{{ height }}px). Imaginile cu orientare portret nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Nu se permite un fișier gol.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Host-ul nu a putut fi rezolvat.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Această valoare nu corespunde setului de caractere {{ charset }} așteptat.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Această valoare nu este un Cod de Identificare a Afacerilor (BIC) valid.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Eroare</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Această valoare nu este un UUID valid.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie un multiplu de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Codul BIC (Business Identifier Code) nu este asociat cu codul IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Această valoare trebuie să fie un JSON valid.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Această colecție ar trebui să conțină numai elemente unice.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Această valoare ar trebui să fie pozitivă.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Această valoare trebuie să fie pozitivă sau zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Această valoare ar trebui să fie negativă.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Această valoare trebuie să fie negativă sau zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Această valoare nu este un fus orar valid.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Această parolă a fost compromisă și nu poate fi utilizată. Vă rugăm să utilizați o altă parolă.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Această valoare trebuie să fie între {{ min }} și {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Această valoare nu este un hostname valid.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Numărul de elemente din această colecție ar trebui să fie un multiplu de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Această valoare trebuie să îndeplinească cel puțin una dintre următoarele condiții:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Fiecare element din acest set ar trebui să îndeplinească propriul set de condiții.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Această valoare nu este un număr internațional de identificare (ISIN) valabil.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Această valoare ar trebui să fie o expresie validă.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Această valoare nu este o culoare CSS validă.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Această valoare nu este o notație CIDR validă.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Valoarea măștii de rețea trebuie să fie între {{ min }} și {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Denumirea fișierului este prea lungă. Trebuie să conțină {{ filename_max_length }} caracter sau mai puțin.|Denumirea fișierului este prea lungă. Trebuie să conțină {{ filename_max_length }} caractere sau mai puține.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Complexitatea parolei este prea mică. Vă rugăm să folosiți o parolă mai puternică.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Această valoare conține caractere care nu sunt premise de nivelul de restricționare curent.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Folosirea caracterelor invizibile nu este permisă.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Combinarea numerelor din diferite script-uri nu este permisă.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Folosirea caracterelor ascunse nu este permisă.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Extensia fișierului este invalidă ({{ extension }}). Extensiile permise sunt {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Codificarea caracterelor detectate este invalidă ({{ detected }}). Codificările permise sunt {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Această valoare nu este o adresă MAC validă.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Acestui URL îi lipsește un domeniu de nivel superior.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Această valoare este prea scurtă. Trebuie să conțină cel puțin un cuvânt.|Această valoare este prea scurtă. Trebuie să conțină cel puțin {{ min }} cuvinte.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Această valoare este prea lungă. Trebuie să conțină un singur cuvânt.|Această valoare este prea lungă. Trebuie să conțină cel mult {{ max }} cuvinte.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Această valoare nu reprezintă o săptămână validă în formatul ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Această valoare nu este o săptămână validă.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Această valoare nu trebuie să fie înainte de săptămâna "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Această valoare nu trebuie să fie după săptămâna "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Această valoare nu este un șablon Twig valid.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Acest fișier nu este un videoclip valid.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Dimensiunea videoclipului nu a putut fi detectată.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lățimea videoclipului este prea mare ({{ width }}px). Lățimea maximă permisă este {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lățimea videoclipului este prea mică ({{ width }}px). Lățimea minimă așteptată este {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Înălțimea videoclipului este prea mare ({{ height }}px). Înălțimea maximă permisă este {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Înălțimea videoclipului este prea mică ({{ height }}px). Înălțimea minimă așteptată este {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videoclipul are prea puțini pixeli ({{ pixels }}). Cantitatea minimă așteptată este {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videoclipul are prea mulți pixeli ({{ pixels }}). Cantitatea maximă așteptată este {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Raportul video este prea mare ({{ ratio }}). Raportul maxim permis este {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Raportul video este prea mic ({{ ratio }}). Raportul minim așteptat este {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videoclipul este pătrat ({{ width }}x{{ height }}px). Videoclipurile pătrate nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videoclipul are orientare peisaj ({{ width }}x{{ height }} px). Videoclipurile în orientare peisaj nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videoclipul este în orientare portret ({{ width }}x{{ height }}px). Videoclipurile cu orientare portret nu sunt permise.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Fișierul video este corupt.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videoclipul conține mai multe fluxuri. Doar un singur flux este permis.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Codec video nesuportat „{{ codec }}”.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Container video nesuportat "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Fișierul imagine este corupt.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Imaginea are prea puțini pixeli ({{ pixels }}). Cantitatea minimă așteptată este {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Imaginea are prea mulți pixeli ({{ pixels }}). Cantitatea maximă așteptată este {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Acest nume de fișier nu corespunde setului de caractere așteptat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="pt-BR" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor deve ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor deve ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor deve ser do tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor deve ser vazio.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor selecionado não é uma opção válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Você deve selecionar, no mínimo, {{ limit }} opção.|Você deve selecionar, no mínimo, {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Você deve selecionar, no máximo, {{ limit }} opção.|Você deve selecionar, no máximo, {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Um ou mais valores informados são inválidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Este campo não era esperado.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Este campo está ausente.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor não é uma data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor não é uma data e hora válida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor não é um endereço de e-mail válido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>O arquivo não foi encontrado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo não pode ser lido.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande ({{ size }} {{ suffix }}). O tamanho máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo é inválido ({{ type }}). Os tipos mime permitidos são {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor deve ser {{ limit }} ou menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor é muito longo. Deve ter {{ limit }} caractere ou menos.|Este valor é muito longo. Deve ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor deve ser {{ limit }} ou mais.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor é muito curto. Deve ter {{ limit }} caractere ou mais.|Este valor é muito curto. Deve ter {{ limit }} caracteres ou mais.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor não deve ser vazio.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor não deve ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor deve ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor não é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor não é uma hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor não é uma URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dois valores devem ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande. O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O arquivo é muito grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>O arquivo não pode ser enviado.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor deve ser um número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Este arquivo não é uma imagem válida.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Este valor não é um endereço IP válido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor não é um idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor não é uma localidade válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor não é um país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor já está sendo usado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>O tamanho da imagem não pode ser detectado.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imagem é muito grande ({{ width }}px). A largura máxima permitida é de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imagem é muito pequena ({{ width }}px). A largura mínima esperada é de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imagem é muito grande ({{ height }}px). A altura máxima permitida é de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imagem é muito pequena ({{ height }}px). A altura mínima esperada é de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Este valor deve ser a senha atual do usuário.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor deve ter exatamente {{ limit }} caractere.|Este valor deve ter exatamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>O arquivo foi enviado apenas parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nenhum arquivo foi enviado.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nenhum diretório temporário foi configurado no php.ini, ou o diretório configurado não existe.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Não foi possível escrever o arquivo temporário no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Uma extensão PHP fez com que o envio falhasse.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou mais.|Esta coleção deve conter {{ limit }} elementos ou mais.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou menos.|Esta coleção deve conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta coleção deve conter exatamente {{ limit }} elemento.|Esta coleção deve conter exatamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de cartão não suportado ou número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Este valor não é um Número de Conta Bancária Internacional (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor não é um ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-10 e nem um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor não é um ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este não é um valor monetário válido.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor deve ser maior que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser maior ou igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor deve ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser menor ou igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor não deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor não deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>A proporção da imagem é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>A proporção da imagem é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>A imagem está num formato quadrado ({{ width }}x{{ height }}px). Imagens com formato quadrado não são permitidas.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>A imagem está orientada à paisagem ({{ width }}x{{ height }}px). Imagens orientadas à paisagem não são permitidas.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>A imagem está orientada ao retrato ({{ width }}x{{ height }}px). Imagens orientadas ao retrato não são permitidas.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Arquivo vazio não é permitido.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>O host não pôde ser resolvido.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Este valor não corresponde ao charset {{ charset }} esperado.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Este valor não é um Código de Identificação de Negócios (BIC) válido.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Erro</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Este valor não é um UUID válido.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Este valor deve ser múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Este Código Identificador Bancário (BIC) não está associado ao IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Este valor deve ser um JSON válido.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Esta coleção deve conter somente elementos únicos.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Este valor deve ser positivo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Este valor deve ser positivo ou zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Este valor deve ser negativo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Este valor deve ser negativo ou zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Este valor não representa um fuso horário válido.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Esta senha foi divulgada num vazamento de dados e não deve ser utilizada. Por favor, utilize outra senha.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Este valor deve estar entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Este valor não é um nome de host válido.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>O número de elementos desta coleção deve ser um múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Este valor deve satisfazer pelo menos uma das seguintes restrições:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Cada elemento desta coleção deve satisfazer seu próprio grupo de restrições.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Este valor não é um Número de Identificação de Títulos Internacionais (ISIN) válido.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Este valor deve ser uma expressão válida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Este valor não é uma cor CSS válida.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Este valor não é uma notação CIDR válida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>O valor da máscara de rede deve estar entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>O nome do arquivo é muito longo. Deve ter {{ filename_max_length }} caractere ou menos.|O nome do arquivo é muito longo. Deve ter {{ filename_max_length }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>A força da senha é muito baixa. Por favor, use uma senha mais forte.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Este valor contém caracteres que não são permitidos pelo nível de restrição atual.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>O uso de caracteres invisíveis não é permitido.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Misturar números de scripts diferentes não é permitido.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>O uso de caracteres de sobreposição ocultos não é permitido.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>A extensão do arquivo é inválida ({{ extension }}). As extensões permitidas são {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>A codificação de caracteres detectada é inválida ({{ detected }}). As codificações permitidas são {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Este valor não é um endereço MAC válido.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Esta URL está faltando o domínio de nível superior.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Este valor é muito curto. Deve conter pelo menos uma palavra.|Este valor é muito curto. Deve conter pelo menos {{ min }} palavras.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Este valor é muito longo. Deve conter apenas uma palavra.|Este valor é muito longo. Deve conter {{ max }} palavras ou menos.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Este valor não representa uma semana válida no formato ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Este valor não é uma semana válida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Este valor não deve ser anterior à semana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Este valor não deve estar após a semana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Este valor não é um modelo Twig válido.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Este arquivo não é um vídeo válido.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Não foi possível detectar o tamanho do vídeo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">A largura do vídeo é muito grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">A largura do vídeo é muito pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">A altura do vídeo é muito grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">A altura do vídeo é muito pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">O vídeo tem poucos pixels ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">O vídeo tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">A proporção do vídeo é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">A proporção do vídeo é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo está no modo paisagem ({{ width }}x{{ height }} px). Vídeos em paisagem não são permitidos.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo está em orientação vertical ({{ width }}x{{ height }}px). Vídeos em orientação vertical não são permitidos.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">O arquivo de vídeo está corrompido.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">O vídeo contém múltiplos fluxos. Apenas um fluxo é permitido.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Codec de vídeo não suportado «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Contêiner de vídeo não suportado "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">O arquivo de imagem está corrompido.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">A imagem tem pixels de menos ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">A imagem tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Este nome de arquivo não corresponde ao conjunto de caracteres esperado.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="hr" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ova vrijednost treba biti netočna (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ova vrijednost treba biti točna (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ova vrijednost treba biti tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ova vrijednost treba biti prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ova vrijednost nije valjan izbor.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izaberite barem {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izaberite najviše {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna ili više danih vrijednosti nije ispravna.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ovo polje nije očekivano.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ovo polje nedostaje.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ova vrijednost nije ispravan datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ova vrijednost nije ispravnog datum-vrijeme formata.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ova vrijednost nije ispravna e-mail adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteka ne može biti pronađena.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteka nije čitljiva.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke nije ispravan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ova vrijednost treba biti {{ limit }} ili manje.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ova vrijednost je predugačka. Treba imati {{ limit }} znakova ili manje.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ova vrijednost treba biti {{ limit }} ili više.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ova vrijednost je prekratka. Treba imati {{ limit }} znakova ili više.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ova vrijednost ne bi trebala biti prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ova vrijednost ne bi trebala biti null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ova vrijednost treba biti null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ova vrijednost nije ispravna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ova vrijednost nije ispravno vrijeme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ova vrijednost nije ispravan URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obje vrijednosti trebaju biti jednake.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ova datoteka je prevelika. Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ova datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ova datoteka ne može biti prenesena.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ova vrijednost treba biti ispravan broj.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ova datoteka nije ispravna slika.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ova vrijednost nije valjana IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ova vrijednost nije ispravan jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ova vrijednost nije ispravana regionalna oznaka.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ova vrijednost nije ispravna država.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ova vrijednost je već iskorištena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Veličina slike se ne može odrediti.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je prevelika ({{ width }}px). Najveća dozvoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premala ({{ width }}px). Najmanja dozvoljena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Visina slike je prevelika ({{ height }}px). Najveća dozvoljena visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Visina slike je premala ({{ height }}px). Najmanja dozvoljena visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ova vrijednost treba biti trenutna korisnička lozinka.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ova vrijednost treba imati točno {{ limit }} znakova.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je samo djelomično prenesena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Niti jedna datoteka nije prenesena.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Privremena mapa nije konfigurirana u php.ini-u, ili konfigurirana mapa ne postoji.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ne mogu zapisati privremenu datoteku na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Prijenos datoteke nije uspio zbog PHP ekstenzije.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ova kolekcija treba sadržavati točno {{ limit }} element.|Ova kolekcija treba sadržavati točno {{ limit }} elementa.|Ova kolekcija treba sadržavati točno {{ limit }} elemenata.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neispravan broj kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tip kartice nije podržan ili je broj kartice neispravan.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ova vrijednost nije valjani međunarodni bankovni broj računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ova vrijednost nije ispravan ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-10 niti ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ova vrijednost nije ispravan ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ova vrijednost nije ispravna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti veća od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti veća od ili jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti manja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti manja od ili jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti različita od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti različita od {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Omjer slike je prevelik ({{ ratio }}). Dozvoljeni maksimalni omjer je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Omjer slike je premali ({{ ratio }}). Minimalni očekivani omjer je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Slika je kvadratnog oblika ({{ width }}x{{ height }}px). Kvadratne slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Slika je orijentirana horizontalno ({{ width }}x{{ height }}px). Horizontalno orijentirane slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Slika je orijentirana vertikalno ({{ width }}x{{ height }}px). Vertikalno orijentirane slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Prazna datoteka nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Poslužitelj ne može biti pronađen.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ova vrijednost ne odgovara očekivanom {{ charset }} znakovnom skupu.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ova vrijednost nije valjani poslovni identifikacijski kod (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Greška</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ova vrijednost nije valjani UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ova vrijednost treba biti višekratnik od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Poslovni identifikacijski broj (BIC) nije povezan sa IBAN brojem {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ova vrijednost treba biti validan JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ova kolekcija treba sadržavati samo unikatne elemente.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ova vrijednost treba biti pozitivna.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ova vrijednost treba biti pozitivna ili jednaka nuli.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ova vrijednost treba biti negativna.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ova vrijednost treba biti negativna ili jednaka nuli.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ova vrijednost nije validna vremenska zona.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ova lozinka je procurila u nekom od sigurnosnih propusta, te je potrebno koristiti drugu lozinku.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ova vrijednost treba biti između {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ova vrijednost nije ispravno ime poslužitelja (engl. hostname).</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Broj elemenata u kolekciji treba biti djeljiv s {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ova vrijednost mora zadovoljiti jedan od sljedećih ograničenja:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Svaki element ove kolekcije mora zadovoljiti vlastiti skup ograničenja.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ova vrijednost nije ispravan međunarodni identifikacijski broj vrijednosnih papira (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ova vrijednost mora biti valjani izraz.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ova vrijednost nije važeća CSS boja.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ova vrijednost nije valjana CIDR notacija.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Vrijednost mrežne maske trebala bi biti između {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Naziv datoteke je predug. Treba imati {{ filename_max_length }} znak ili manje.|Naziv datoteke je predug. Treba imati {{ filename_max_length }} znaka ili manje.|Naziv datoteke je predug. Treba imati {{ filename_max_length }} znakova ili manje.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Jačina lozinke je preniska. Molim koristite jaču lozinku.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ova vrijednost sadrži znakove koji nisu dopušteni prema trenutnoj razini ograničenja.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Korištenje nevidljivih znakova nije dopušteno.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Miješanje brojeva iz različitih pisama nije dopušteno.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Korištenje skrivenih preklapajućih znakova nije dopušteno.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Ekstenzija datoteke nije valjana ({{ extension }}). Dozvoljene ekstenzije su {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Otkriveno kodiranje znakova je nevažeće ({{ detected }}). Dopuštena kodiranja su {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ova vrijednost nije valjana MAC adresa.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Ovom URL-u nedostaje vršna domena.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ova vrijednost je prekratka. Trebala bi sadržavati barem jednu riječ.|Ova vrijednost je prekratka. Trebala bi sadržavati barem {{ min }} riječi.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ova vrijednost je predugačka. Trebala bi sadržavati samo jednu riječ.|Ova vrijednost je predugačka. Trebala bi sadržavati {{ max }} riječi ili manje.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ova vrijednost ne predstavlja valjani tjedan u ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ova vrijednost nije valjani tjedan.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ova vrijednost ne bi trebala biti prije tjedna "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ova vrijednost ne bi trebala biti nakon tjedna "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Ova vrijednost nije valjani Twig predložak.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Ova datoteka nije valjani videozapis.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Veličina videozapisa nije mogla biti određena.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina videozapisa je prevelika ({{ width }}px). Dopuštenа maksimalna širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina videozapisa je premala ({{ width }}px). Očekivana minimalna širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Visina videozapisa je prevelika ({{ height }}px). Dopuštena maksimalna visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Visina videozapisa je premala ({{ height }}px). Očekivana minimalna visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Video ima premalo piksela ({{ pixels }}). Očekivani minimalni broj je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Video ima previše piksela ({{ pixels }}). Očekivani maksimalni broj je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Omjer videa je prevelik ({{ ratio }}). Dopušteni maksimalni omjer je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Omjer videa je premalen ({{ ratio }}). Minimalni očekivani omjer je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video je kvadratan ({{ width }}x{{ height }}px). Kvadratni videozapisi nisu dopušteni.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video je vodoravne orijentacije ({{ width }}x{{ height }} px). Vodoravni videozapisi nisu dopušteni.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video je okomite orijentacije ({{ width }}x{{ height }} px). Videozapisi okomite orijentacije nisu dopušteni.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videodatoteka je oštećena.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Video sadrži više tokova. Dopušten je samo jedan tok.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Nepodržani video kodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Nepodržani video spremnik "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Datoteka slike je oštećena.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Slika ima premalo piksela ({{ pixels }}). Očekivani minimalni broj je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Slika ima previše piksela ({{ pixels }}). Očekivani maksimalni broj je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Naziv ove datoteke ne odgovara očekivanom skupu znakova.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="tr" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Bu değer olumsuz olmalıdır.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Bu değer olumlu olmalıdır.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Bu değerin tipi {{ type }} olmalıdır.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Bu değer boş olmalıdır.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Seçtiğiniz değer geçerli bir seçenek değildir.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>En az {{ limit }} seçenek belirtmelisiniz.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>En çok {{ limit }} seçenek belirtmelisiniz.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Verilen değerlerden bir veya daha fazlası geçersiz.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Bu alan beklenen olmadı.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Bu alan, eksiktir</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Bu değer doğru bir tarih biçimi değildir.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Bu değer doğru bir tarihsaat biçimi değildir.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Bu değer doğru bir e-mail adresi değildir.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Dosya bulunamadı.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Dosya okunabilir değildir.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Dosya çok büyük ({{ size }} {{ suffix }}). İzin verilen en büyük dosya boyutu {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Dosyanın mime tipi geçersiz ({{ type }}). İzin verilen mime tipleri {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Bu değer {{ limit }} ve altında olmalıdır.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Bu değer çok uzun. {{ limit }} karakter veya daha az olmalıdır.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Bu değer {{ limit }} veya daha fazla olmalıdır.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Bu değer çok kısa. {{ limit }} karakter veya daha fazla olmalıdır.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Bu değer boş bırakılmamalıdır.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Bu değer boş bırakılmamalıdır.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Bu değer boş bırakılmalıdır.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Bu değer geçerli değildir.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Bu değer doğru bir saat değildir.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Bu değer doğru bir URL değildir.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>İki değer eşit olmalıdır.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Dosya çok büyük. İzin verilen en büyük dosya boyutu {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Dosya çok büyük.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Dosya yüklenemiyor.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Bu değer geçerli bir rakam olmalıdır.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Bu dosya geçerli bir resim değildir.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Bu değer geçerli bir IP adresi değildir.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Bu değer geçerli bir lisan değildir.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Bu değer geçerli bir yer değildir.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Bu değer geçerli bir ülke değildir.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Bu değer şu anda kullanımda.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Resmin boyutu saptanamıyor.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Resmin genişliği çok büyük ({{ width }}px). İzin verilen en büyük genişlik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Resmin genişliği çok küçük ({{ width }}px). En az {{ min_width }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Resmin yüksekliği çok büyük ({{ height }}px). İzin verilen en büyük yükseklik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Resmin yüksekliği çok küçük ({{ height }}px). En az {{ min_height }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Bu değer kullanıcının şu anki şifresi olmalıdır.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Bu değer tam olarak {{ limit }} karakter olmaldır.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Dosya sadece kısmen yüklendi.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Hiçbir dosya yüklenmedi.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.ini'de geçici bir klasör yapılandırılmadı veya yapılandırılan klasör mevcut değildir.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Geçici dosya diske yazılamıyor.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Bir PHP eklentisi dosyanın yüklemesini başarısız kıldı.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Bu derlem {{ limit }} veya daha çok eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Bu derlem {{ limit }} veya daha az eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Bu derlem {{ limit }} eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Geçersiz kart numarası.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Desteklenmeyen kart tipi veya geçersiz kart numarası.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Bu değer geçerli bir Uluslararası Banka Hesap Numarası (IBAN) değildir.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Bu değer geçerli bir ISBN-10 değildir.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Bu değer geçerli bir ISBN-13 değildir.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Bu değer geçerli bir ISBN-10 veya ISBN-13 değildir.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Bu değer geçerli bir ISSN değildir.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Bu değer geçerli bir para birimi değildir.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} ile eşit olmalıdır.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} değerinden büyük olmalıdır.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} ile eşit veya büyük olmalıdır.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value_type }} {{ compared_value }} ile aynı olmalıdır.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} değerinden düşük olmalıdır.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>.Bu değer {{ compared_value }} ile eşit veya düşük olmalıdır.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} ile eşit olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value_type }} {{ compared_value }} ile aynı olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Resim oranı çok büyük ({{ ratio }}). İzin verilen maksimum oran: {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Resim oranı çok ufak ({{ ratio }}). Beklenen minimum oran {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Resim karesi ({{ width }}x{{ height }}px). Kare resimlerine izin verilmiyor.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Resim manzara odaklı ({{ width }}x{{ height }}px). Manzara odaklı resimlere izin verilmiyor.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Resim portre odaklı ({{ width }}x{{ height }}px). Portre odaklı resimlere izin verilmiyor.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Boş bir dosyaya izin verilmiyor.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Sunucu çözülemedi.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Bu değer beklenen {{ charset }} karakter kümesiyle eşleşmiyor.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Bu değer geçerli bir İşletme Tanımlama Kodu (BIC) değildir.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Hata</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Bu değer geçerli bir UUID değildir.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Bu değer {{ compare_value }} değerinin katlarından biri olmalıdır.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Bu İşletme Tanımlayıcı Kodu (BIC), IBAN {{ iban }} ile ilişkili değildir.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Bu değer için geçerli olmalıdır JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Bu grup yalnızca benzersiz öğeler içermelidir.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Bu değer pozitif olmalıdır.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Bu değer pozitif veya sıfır olmalıdır.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Bu değer negatif olmalıdır.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Bu değer, negatif veya sıfır olmalıdır.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Bu değer, geçerli bir saat dilimi değildir.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Bu parola, bir veri ihlali nedeniyle sızdırılmıştır ve kullanılmamalıdır. Lütfen başka bir şifre kullanın.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Bu değer {{ min }} ve {{ max }} arasında olmalıdır.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Bu değer, geçerli bir ana bilgisayar adı değildir.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Bu gruptaki öğe sayısı birden fazla olmalıdır {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Bu değer aşağıdaki kısıtlamalardan birini karşılamalıdır:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Bu gruptaki her öğe kendi kısıtlamalarını karşılamalıdır.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Bu değer geçerli bir Uluslararası Menkul Kıymetler Kimlik Numarası (ISIN) değildir.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Bu değer geçerli bir ifade olmalıdır.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Bu değer geçerli bir CSS rengi değildir.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Bu değer geçerli bir CIDR yazımı değildir.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Netmask'in değeri {{ min }} ve {{ max }} arasında olmaldır.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Dosya adı çok uzun. {{ filename_max_length }} karakter veya daha az olmalıdır.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Şifre gücü çok düşük. Lütfen daha güçlü bir şifre kullanın.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Bu değer, mevcut kısıtlama seviyesi tarafından izin verilmeyen karakterler içeriyor.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Görünmez karakterlerin kullanılması izin verilmez.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Farklı yazı türlerinden sayıların karıştırılması izin verilmez.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Gizli üstü kaplama karakterlerinin kullanılması izin verilmez.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Dosya uzantısı geçersiz ({{ extension }}). İzin verilen uzantılar {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Tespit edilen karakter kodlaması geçersiz ({{ detected }}). İzin verilen kodlamalar: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Bu değer geçerli bir MAC adresi değildir.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Bu URL bir üst seviye alan adı eksik.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Bu değer çok kısa. En az bir kelime içermelidir.|Bu değer çok kısa. En az {{ min }} kelime içermelidir.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Bu değer çok uzun. Tek bir kelime içermelidir.|Bu değer çok uzun. {{ max }} veya daha az kelime içermelidir.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Bu değer ISO 8601 formatında geçerli bir haftayı temsil etmezdir.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Bu değer geçerli hafta değildir.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Bu değer “{{ min }}” haftasından önce olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Bu değer “{{ max }}” haftasından sonra olmamalıdır</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Bu değer geçerli bir Twig şablonu olarak kabul edilmiyor.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Bu dosya geçerli bir video dosyası değil.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videonun boyutu tespit edilemedi.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Video genişliği çok büyük ({{ width }}px). İzin verilen maksimum genişlik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Video genişliği çok küçük ({{ width }}px). Beklenen minimum genişlik {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Video yüksekliği çok büyük ({{ height }}px). İzin verilen maksimum yükseklik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Video yüksekliği çok küçük ({{ height }}px). Beklenen minimum yükseklik {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videodaki piksel sayısı çok az ({{ pixels }} piksel). Beklenen minimum miktar {{ min_pixels }} pikseldir.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videodaki piksel sayısı çok fazla ({{ pixels }} piksel). Beklenen maksimum miktar {{ max_pixels }} pikseldir.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Video oranı çok büyük ({{ ratio }}). İzin verilen maksimum oran {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Video oranı çok küçük ({{ ratio }}). Beklenen minimum oran {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video kare biçimde ({{ width }}x{{ height }}px). Kare videolara izin verilmez.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video yatay biçimde ({{ width }}x{{ height }}px). Yatay videolara izin verilmez.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video dikey biçimde ({{ width }}x{{ height }}px). Dikey videolara izin verilmez.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Video dosyası bozuk.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Video birden fazla akış içeriyor. Yalnızca tek akışa izin verilir.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Desteklenmeyen video codec'i "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Desteklenmeyen video kapsayıcısı "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Görüntü dosyası bozulmuş.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Görüntüdeki piksel sayısı çok az ({{ pixels }}). Beklenen minimum miktar {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Görüntüdeki piksel sayısı çok fazla ({{ pixels }}). Beklenen maksimum miktar {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Bu dosya adı beklenen karakter kümesiyle eşleşmiyor.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="hy" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Արժեքը պետք է լինի կեղծ։</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Արժեքը պետք է լինի իրական։</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Արժեքը պետք է լինի {{ type }} տեսակի։</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Արժեքը պետք է լինի դատարկ։</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ձեր ընտրած արժեքը անվավեր ընտրություն է։</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Դուք պետք է ընտրեք ամենաքիչը {{ limit }} տարբերակներ։</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Դուք պետք է ընտրեք ոչ ավելի քան {{ limit }} տարբերակներ։</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Մեկ կամ ավելի տրված արժեքները անվավեր են։</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Այս դաշտը չի սպասվում։</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Այս դաշտը բացակայում է։</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Արժեքը սխալ ամսաթիվ է։</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ամսաթվի և ժամանակի արժեքը անվավեր է։</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Անվավեր էլ֊փոստի արժեք։</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Նիշքը չի գտնվել։</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Նիշքը անընթեռնելի է։</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Նիշքը չափազանց մեծ է ({{ size }} {{ suffix }}): Մաքսիմալ թույլատրելի չափսը՝ {{ limit }} {{ suffix }}։</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-տեսակը անվավեր է է({{ type }}): Նիշքերի թույլատրելի MIME-տեսակներն են: {{ types }}։</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Արժեքը պետք է լինի {{ limit }} կամ փոքր։</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Արժեքը չափազանց երկար է: Պետք է լինի {{ limit }} կամ ավել սիմվոլներ։</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Արժեքը պետ է լինի {{ limit }} կամ շատ։</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Արժեքը չափազանց կարճ է: Պետք է լինի {{ limit }} կամ ավելի սիմվոլներ։</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Արժեքը չպետք է դատարկ լինի։</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Արժեքը չպետք է լինի null։</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Արժեքը պետք է լինի null։</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Անվավեր արժեք։</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ժամանակի արժեքը անվավեր է։</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Արժեքը  URL  չէ։</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Երկու արժեքները պետք է նույնը լինեն։</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Նիշքը չափազանց մեծ է: Մաքսիմալ թույլատրելի չափսը {{ limit }} {{ suffix }} է։</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Նիշքը չափազանց մեծ է։</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Նիշքը չի կարող բեռնվել։</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Արժեքը պետք է լինի թիվ։</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Նիշքը նկարի վավեր ֆորմատ չէ։</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր IP հասցե չէ։</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Արժեքը վավեր լեզու չէ։</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Արժեքը չի հանդիսանում վավեր տեղայնացում։</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Արժեքը պետք է լինի երկիր։</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Այդ արժեքն արդեն օգտագործվում է։</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Նկարի չափսերը չստացվեց որոշել։</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Նկարի լայնությունը չափազանց մեծ է({{ width }}px). Մաքսիմալ չափն է {{ max_width }}px։</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Նկարի լայնությունը չափազանց փոքր է ({{ width }}px). Մինիմալ չափն է {{ min_ width }}px։</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Նկարի բարձրությունը չափազանց մեծ է ({{ height }}px). Մաքսիմալ չափն է {{ max_height }}px։</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Նկարի բարձրությունը չափազանց փոքր է ({{ height }}px). Մինիմալ չափն է {{ min_height }}px։</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Այս արժեքը պետք է լինի օգտագործողի ներկա ծածկագիրը։</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Այս արժեքը պետք է ունենա ճիշտ {{ limit }} սիմվոլներ։</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Նիշքի մասնակի բեռնման սխալ։</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Նիշքը չի բեռնվել։</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">php.ini-ում չի կարգավորվել ժամանակավոր թղթապանակ, կամ կարգավորված թղթապանակը չկա։</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ժամանակավոր նիշքը հնարավոր չէ գրել սկավառակի վրա։</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP ֆորմատը դարձել է բեռնման չհաջողման պատճառ։</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Այս համախումբը պետք է պաուրակի {{ limit }} կամ ավելի տարրեր։|Այս հավելվածը պետք է պարունակի limit }} տարր կամ ավելին։|Այս համախումբը պետք է պարունակի {{ limit }} տարրերին կամ ավելի։</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Այս համախումբը պետք է պաուրակի {{ limit }} տարրեր կամ քիչ։|Այս համախումբը պետք է պաուրակի {{ limit }} տարր կամ քիչ։|Այս համախումբը պետք է պաուրակի {{ limit }} տարրեր կամ քիչ։</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Այս համախումբը պետք է պաուրակի ուղիղ {{ limit }} տարր։|Այս համախումբը պետք է պաուրակի ուղիղ {{ limit }} տարրեր։|Այս համախումբը պետք է պաուրակի {{ limit }} տարրեր։</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Քարտի սխալ համար:</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Չսպասարկվող կամ սխալ քարտի համար:</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Այս արժեքը վավեր միջազգային բանկային հաշվի համար (IBAN) չէ։</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Արժեքը ունի անվավեր ISBN-10 ձևաչափ։</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Արժեքը ունի անվավեր ISBN-13 ձևաչափ։</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Արժեքը չի համապատասխանում ISBN-10 և ISBN-13 ձևաչափերին։</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Արժեքը չի համապաստասխանում ISSN ձևաչափին։</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Արժեքը վավեր տարադրամ չէ։</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Արժեքը պետք է մեծ լինի, քան {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի հավասար կամ մեծ քան {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի ինչպես {{ compared_value_type }} {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի փոքր քան {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի փոքր կամ հավասար {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի հավասար {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Արժեքը պետք է լինի նունը {{ compared_value_type }} {{ compared_value }}:</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Պատկերի կողմերի հարաբերակցությունը խիստ մեծ է ({{ ratio }}). Մաքսիմալ հարաբերակցությունը՝ {{ max_ratio }}։</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Պատկերի կողմերի հարաբերակցությունը խիստ փոքր է ({{ ratio }}). Մինիմալ հարաբերակցությունը՝ {{ min_ratio }}։</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Պատկերը քառակուսի է({{ width }}x{{ height }}px)։ Քառակուսի նկարներ չեն թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Պատկերը ալբոմային ուղղվածության է({{ width }}x{{ height }}px)․ դա չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Պատկերը պորտրետային ուղղվածության է ({{ width }}x{{ height }}px)․ դա չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Դատարկ նիշք չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Հոսթի անունը հնարավոր չի պարզել։</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Արժեքը չի համընկնում {{ charset }} կոդավորման հետ։</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Այս արժեքը վավեր բիզնեսի նորմատիվ կոդ (BIC) չէ։</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Սխալ</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր UUID չէ։</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Այս արժեքը պետք է լինի բազմակի {{ compared_value }}։</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Բիզնեսի նույնականացման կոդը (BIC) կապված չէ IBAN- ի հետ {{ iban }}։</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Այս արժեքը պետք է լինի վավեր JSON։</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Այս համախումբը պետք է պարունակի միայն եզակի տարրեր։</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Այս արժեքը պետք է լինի դրական։</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Այս արժեքը պետք է լինի դրական կամ զրոյական։</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Այս արժեքը պետք է լինի բացասական։</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Այս արժեքը պետք է լինի բացասական կամ զրոյական։</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Այս արժեքը վավեր ժամային գոտի չէ։</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Գաղտնաբառը գտնվել է տվյալների արտահոսքում. այն չպետք է օգտագործվի: Խնդրում ենք օգտագործել մեկ այլ գաղտնաբառ։</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Այս արժեքը պետք է լինի  {{ min }}-ի և {{ max }}-ի միջև։</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Այս հոստի անունը վավեր չէ։</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Այս համախմբի տարրերի քանակը պետք է հավասար լինի {{ compared_value }}-ի բազմապատիկներին։</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Այս արժեքը պետք է բավարարի հետևյալ սահմանափակումներից առնվազն մեկը։</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Այս համախմբի յուրաքանչյուր տարր պետք է բավարարի իր սեփական սահմանափակումները։</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Այս արժեքը արժեթղթերի նույնականացման միջազգային համարը վավեր չէ(ISIN)։</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Այս արժեքը պետք է լինի վավեր արտահայտություն:</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր CSS գույն չէ։</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր CIDR նշում չէ։</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target state="needs-review-translation">Ցանցային դիմակի արժեքը պետք է լինի {{ min }}-ի և {{ max }}-ի միջև։</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">Ֆայլի անունը շատ երկար է։ Այն պետք է ունենա {{ filename_max_length }} նիշ կամ պակաս։</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">Գաղտնաբառի անվտանգությունը շատ ցածր է։ Խնդրում ենք գործածել ավելի ամրագույն գաղտնաբառ։</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">Այս արժեքը պարունակում է այն նիշերը, որոնք չեն թույլատրվում ըստ ընթացիկ սահմանումների։</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">Անտեսանելի նիշերի օգտագործումը չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">Թվերի խառնուրդը տարբեր սցենարներից չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">Թաքնված ծածկանիշերի օգտագործումը չի թույլատրվում։</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Ֆայլի ընդլայնումը անվավեր է ({{ extension }})։ Թույլատրվող ընդլայնումներն են՝ {{ extensions }}։</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Հայտնաբերված նիշագրության կոդը անվավեր է ({{ detected }})։ Թույլատրվող կոդերն են՝ {{ encodings }}։</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր MAC հասցե չէ։</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Այս URL-ը չունի վերին մակարդակի դոմեյն:</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե մեկ բառ.|Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե {{ min }} բառեր:</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Այս արժեքը շատ երկար է: պետք է պարունակի միայն մեկ բառ.|Այս արժեքը շատ երկար է: պետք է պարունակի {{ max }} բառ կամ ավելի քիչ:</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Այս արժեքը չի ներկայացնում ISO 8601 ձևաչափով գործող շաբաթ։</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր շաբաթ չէ:</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Այս արժեքը չպետք է լինի «{{ min }}» շաբաթից առաջ։</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Այս արժեքը չպետք է լինի «{{ max }}» շաբաթից հետո։</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Այս արժեքը վավեր Twig ձևանմուշ չէ:</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Այս ֆայլը վավեր տեսանյութ չէ։</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Չհաջողվեց հայտնաբերել տեսանյութի չափը.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Տեսահոլովակի լայնությունը չափազանց մեծ է ({{ width }}px)։ Թույլատրելի առավելագույն լայնությունը {{ max_width }}px է։</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Տեսանյութի լայնությունը չափազանց փոքր է ({{ width }}px). Սպասվող նվազագույն լայնքը {{ min_width }}px է.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Վիդեոյի բարձրությունը չափազանց մեծ է ({{ height }}px)։ Թույլատրելի առավելագույն բարձրությունը {{ max_height }}px է։</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Վիդեոյի բարձրությունը շատ փոքր է ({{ height }}px)։ Սպասվող նվազագույն բարձրությունը {{ min_height }}px է։</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Տեսանյութը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույն քանակը {{ min_pixels }} է։</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Տեսանյութը ունի չափազանց շատ պիքսելներ ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է։</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Տեսանյութի հարաբերակցությունը չափազանց մեծ է ({{ ratio }}): Թույլատրելի առավելագույն հարաբերակցությունը {{ max_ratio }} է։</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Վիդեոյի հարաբերակցությունը շատ փոքր է ({{ ratio }}). Ավելի փոքրագույն սպասվող հարաբերակցությունը {{ min_ratio }} է.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Տեսանյութը քառակուսի է ({{ width }}x{{ height }}px). Քառակուսի տեսանյութերը թույլատրելի չեն.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Տեսանյութը հորիզոնական կողմնորոշմամբ է ({{ width }}x{{ height }} px). Հորիզոնական տեսանյութերը թույլատրելի չեն.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Վիդեոն ուղղահայաց կողմնորոշված է ({{ width }}x{{ height }}px)։ Ուղղահայաց կողմնորոշմամբ տեսանյութերը թույլատրելի չեն։</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Տեսանյութի ֆայլը վնասված է.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Տեսանյութը պարունակում է բազմաթիվ հոսքեր։ Թույլատրվում է միայն մեկ հոսք։</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Չաջակցվող տեսանյութի կոդեկ «{{ codec }}»։</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Չաջակցվող վիդեո կոնտեյներ "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Պատկերի ֆայլը վնասված է։</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Պատկերը ունի չափազանց քիչ պիքսելներ ({{ pixels }}). Սպասվող նվազագույնը {{ min_pixels }} է։</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Պատկերը ունի չափազանց շատ պիքսել ({{ pixels }}). Սպասվող առավելագույն քանակը {{ max_pixels }} է.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Այս ֆայլի անունը չի համապատասխանում սպասվող նիշքերի հավաքածուին.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="tl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ang halaga nito ay dapat na huwad.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ang halaga nito ay dapat totoo.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ang halaga nito ay dapat sa uri {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ang halaga nito ay dapat walang laman.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ang halaga ng iyong pinili ay hindi balidong pagpili.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Kailangan mong pumili ng pinakamababang {{ limit }} ng pagpilian.|Kailangan mong pumili ng pinakamababang {{ limit }} ng mga pagpipilian.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Kailangan mong pumili ng pinakamataas {{ limit }} ng pagpipilian.|Kailangan mong pumili ng pinakamataas {{ limit }} ng mga pagpipilian.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Isa o higit pang mga halaga na binigay ay hindi balido.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ang larangang ito ay hindi inaasahan.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ang patlang na ito ay nawawala.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ang halagang ito ay hindi balidong petsa.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ang halagang ito ay hindi wastong petsa/oras.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ang halagang ito ay hindi balidong address ng email.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ang file na ito ay hindi makita.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Ang file na ito ay hindi mabasa.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ang file na ito ay masyadong malaki ({{ size }} {{ suffix }}). Ang pinakamalaking sukat {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Ang uri ng file ng mime ay hindi balido ({{ type }}). Ang mga pinapayagang uri ng mime ay ang  {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ang halaga nito ay dapat na {{ limit }} or maliit pa.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ang halaga nito ay masyadong mahaba. Ito ay dapat na {{ limit }} karakter o maliit pa.|Ang halaga nito ay masyadong mahaba. Ito ay dapat na {{ limit }} mga karakter o maliit pa.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ang halaga nito ay dapat na {{ limit }} o mas marami pa.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ang halaga nito ay masyadong maliit. Ito ay dapat na {{ limit }} karakter o marami pa.|Ang halaga nito ay masyadong maliit. Ito ay dapat na {{ limit }} mga karakter o marami pa.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ang halaga na ito ay dapat na may laman.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Meron dapt itong halaga.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Wala dapat itong halaga.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Hindi balido ang halagang ito.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ang halagang ito ay hindi wastong oras.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Hindi ito isang balidong URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Ang dalwang halaga ay dapat magkapareha.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ang file ay masyadong malaki. Ang pinapayagan halaga lamang ay {{ limit}} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ang file na ito ay masyadong malaki.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ang file na ito ay hindi ma-upload.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ang halaga nito ay dapat na wastong numero.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ang file na ito ay hindi wastong imahe.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ang halagang ito ay hindi isang wastong IP address.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ang halaga na ito ay hindi balidong wika.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ito ay isang hindi wastong locale na halaga.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>ng halaga na ito ay hindi wastong bansa.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ang halaga na ito ay ginamit na.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Ang sukat ng imahe ay hindi madetect.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ang lapad ng imahe ay masyadong malaki ({{ width }}px). Ang pinapayagang lapay ay {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ang lapad ng imahe ay masyadong maliit ({{ width }}px). Ang pinakamaliit na pinapayagang lapad ay {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Ang haba ng imahe ay masyadong mataas ({{ height }}px). Ang pinakmataas na haba ay {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Ang haba ng imahe ay masyadong maliit ({{ height }}px). Ang inaasahang haba ay {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ang halagang ito ay dapat na password ng kasalukuyang gumagamit.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ang halagang ito ay dapat na eksakto sa {{ limit}} karakter.|Ang halagang ito ay dapat na eksakto sa {{ limit }} mga karakter.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Ang file na ito ay kahalating na upload lamang.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Walang na upload na file.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Walang pansamantalang folder na na-configure sa php.ini, o ang naka-configure na folder ay hindi naroroon.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Temporaryong hindi  makasulat ng file sa disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Ang dahilan ng pagkabigo ng pagupload ng files ay isang extension ng PHP.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ang koleksyon na ito ay dapat magkaroon ng {{ limit }} elemento o marami pa.|Ang koleksyon na ito ay dapat magkaroon ng {{ limit }} mga elemento o marami pa.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ang koleksyon na ito ay dapat magkaroon ng {{ limit }} elemento o maliit pa.|Ang koleksyon na ito ay dapat magkaroon ng {{ limit }} mga elemento o maliit pa.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ang koleksyong ito ay magkaroon ng eksaktong {{ limit }} elemento.|Ang koleksyong ito ay magkaroon ng eksaktong {{ limit }} mga elemento.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Hindi wastong numero ng kard.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Hindi supportadong uri ng kard o hindi wastong numero ng kard.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ang halagang ito ay hindi isang wastong International Bank Account Number (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ang halagang ito ay hindi balidong SBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ang halagang ito ay hindi balidong ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ang halagang ito ay pwdeng isang balidong ISBN-10 o isang balidong ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ang halangang ito ay hindi isang balidong ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ang halagang ito ay hindi balidong pera.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ito ay hindi dapat magkapareho sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat tataas sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat mas mataas o magkapareha sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat kapareha ng {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat mas maliit sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat mas maliit o magkapareha sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ang halagang ito ay hindi dapat magkapareha sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ang halagang ito ay hindi dapat magkapareha sa {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Ang ratio ng imahe ay masyadong malaki ({{ ratio }}). Ang pinakamalaking ratio ay {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Ang ratio ng imahe ay masyadong maliit ({{ ratio }}). Ang pinakamaliit na ratio ay {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Ang imahe ay kwadrado ({{ width }}x{{ height }}px). Ang mga kwadradong imahe ay hindi pwede.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Ang orientasyon ng imahe ay nakalandscape ({{ width }}x{{ height }}px). Ang mga imaheng nakalandscape ang orientasyon ay hindi pwede.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Ang orientasyon ng imahe ay nakaportrait ({{ width }}x{{ height }}px). Ang mga imaheng nakaportrait ang orientasyon ay hindi pwede.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Ang file na walang laman ay hindi pwede.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Hindi maresolba ang host.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ang halaga ay hindi kapareha sa inaasahang {{ charset }} set ng karater.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ang halagang ito ay hindi isang wastong Business Identifier Code (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Error</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ang halagang ito ay hindi isang wastong UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ang halagang ito ay dapat multiple ng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ang Business Identifier Code (BIC) na ito ay walang kaugnayan sa IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ang halagang ito ay dapat naka wastong JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ang mga elemento ng koleksyong ito ay dapat magkakaiba.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ang halagang ito ay dapat positibo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ang halagang ito ay dapat positibo o zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ang halagang ito ay dapat negatibo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ang halagang ito ay dapat negatibo o zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ang halagang ito ay hindi wastong timezone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Naikalat ang password na ito sa isang data breach at hindi na dapat gamitin. Mangyaring gumamit ng ibang pang password.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ang halagang ito ay dapat nasa pagitan ng {{ min }} at {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ang halagang ito ay hindi wastong hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Ang bilang ng mga elemento sa koleksyon na ito ay dapat multiple ng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ang halagang ito ay dapat masunod ang kahit na isang sumusunod na batayan.</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Ang bawat elemento sa koleksyon na ito ay dapat masunod ang nararapat na batayan.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ang halagang ito ay hindi wastong International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ang halagang ito ay dapat wastong ekspresyon.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ang halagang ito ay hindi wastong kulay ng CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ang halagang ito ay hindi wastong notasyon ng CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Ang halaga ng netmask ay dapat nasa pagitan ng {{ min }} at {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} karakter o mas kaunti.|Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} mga karakter o mas kaunti.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Ang lakas ng password ay masyadong mababa. Mangyaring gumamit ng mas malakas na password.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ang halagang ito ay naglalaman ng mga karakter na hindi pinapayagan ng kasalukuyang antas ng paghihigpit.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Hindi pinapayagan ang paggamit ng mga hindi nakikitang karakter.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Hindi pinapayagan ang paghahalo ng mga numero mula sa iba't ibang script.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Hindi pinapayagan ang paggamit ng mga nakatagong overlay na karakter.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Ang extension ng file ay hindi wasto ({{ extension }}). Ang mga pinapayagang extension ay {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Ang nakitang encoding ng karakter ay hindi wasto ({{ detected }}). Ang mga pinapayagang encoding ay {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ang halagang ito ay hindi isang wastong MAC address.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Ang URL na ito ay kulang ng top-level domain.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Masyadong maikli ang halagang ito. Dapat itong maglaman ng hindi bababa sa isang salita.|Masyadong maikli ang halagang ito. Dapat itong maglaman ng hindi bababa sa {{ min }} salita.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Masyadong mahaba ang halagang ito. Dapat itong maglaman lamang ng isang salita.|Masyadong mahaba ang halagang ito. Dapat itong maglaman ng {{ max }} salita o mas kaunti.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ang halagang ito ay hindi kumakatawan sa isang wastong linggo sa format ng ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ang halagang ito ay hindi isang wastong linggo.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ang halagang ito ay hindi dapat bago sa linggo "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ang halagang ito ay hindi dapat pagkatapos ng linggo "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ang halagang ito ay hindi isang balidong Twig template.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ang file na ito ay hindi isang wastong video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Hindi matukoy ang laki ng video.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Masyadong malaki ang lapad ng video ({{ width }}px). Ang pinahihintulutang pinakamaksimum na lapad ay {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Masyadong maliit ang lapad ng video ({{ width }}px). Inaasahang minimum na lapad ay {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Sobrang taas ng video ({{ height }}px). Ang pinapahintulutang pinakamataas na taas ay {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Masyadong maliit ang taas ng video ({{ height }}px). Inaasahang pinakamababang taas ay {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Ang video ay may masyadong kaunting pixel ({{ pixels }}). Ang inaasahang pinakamababang dami ay {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Ang video ay may masyadong maraming pixel ({{ pixels }}). Ang inaasahang pinakamataas na bilang ay {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Masyadong malaki ang ratio ng video ({{ ratio }}). Ang pinahihintulutang pinakamataas na ratio ay {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Masyadong maliit ang ratio ng video ({{ ratio }}). Ang inaasahang minimum na ratio ay {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Ang video ay parisukat ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga parisukat na video.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Ang video ay nasa landscape na oryentasyon ({{ width }}x{{ height }} px). Hindi pinapayagan ang mga landscape na video.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Ang video ay naka-portrait ({{ width }}x{{ height }}px). Hindi pinapayagan ang mga video na naka-portrait.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Sira ang file ng video.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">May ilang stream ang video. Isa lamang na stream ang pinapayagan.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Hindi suportadong video codec "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Hindi suportadong lalagyan ng video "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Ang file ng larawan ay sira.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Masyadong kaunti ang pixel ng larawan ({{ pixels }}). Ang inaasahang pinakamababang dami ay {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Ang larawan ay may sobrang daming pixel ({{ pixels }}). Ang inaasahang pinakamataas na dami ay {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Ang pangalan ng file na ito ay hindi tumutugma sa inaasahang hanay ng mga character.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="et" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Väärtus peaks olema väär.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Väärtus peaks oleme tõene.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Väärtus peaks olema {{ type }}-tüüpi.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Väärtus peaks olema tühi.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Väärtus peaks olema üks etteantud valikutest.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Valima peaks vähemalt {{ limit }} valikut.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Valima peaks mitte rohkem kui  {{ limit }} valikut.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Üks või rohkem väärtustest on vigane.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>See väli ei olnud oodatud.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>See väli on puudu.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Väärtus pole korrektne kuupäev.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Väärtus pole korrektne kuupäev ja kellaeg.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Väärtus pole korrektne e-maili aadress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Faili ei leita.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fail ei ole loetav.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fail on liiga suur ({{ size }} {{ suffix }}). Suurim lubatud suurus on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Faili sisutüüp on vigane ({{ type }}). Lubatud sisutüübid on {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Väärtus peaks olema {{ limit }} või vähem.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Väärtus on liiga pikk. Pikkus peaks olema {{ limit }} tähemärki või vähem.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Väärtus peaks olema {{ limit }} või rohkem.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Väärtus on liiga lühike. Pikkus peaks  olema {{ limit }} tähemärki või rohkem.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Väärtus ei tohiks olla tühi.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Väärtus ei tohiks olla 'null'.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Väärtus peaks olema 'null'.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Väärtus on vigane.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Väärtus pole korrektne aeg.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Väärtus pole korrektne URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Väärtused peaksid olema võrdsed.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fail on liiga suur. Maksimaalne lubatud suurus on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fail on liiga suur.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Faili ei saa üles laadida.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Väärtus peaks olema korrektne number.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fail ei ole korrektne pilt.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>See väärtus ei ole kehtiv IP-aadress.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Väärtus pole korrektne keel.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Väärtus pole korrektne asukohakeel.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Väärtus pole olemasolev riik.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Väärtust on juba kasutatud.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Pildi suurust polnud võimalik tuvastada.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Pilt on liiga lai ({{ width }}px). Suurim lubatud laius on {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Pilt on liiga kitsas ({{ width }}px). Vähim lubatud laius on {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Pilt on liiga pikk ({{ height }}px). Lubatud suurim pikkus on {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Pilt pole piisavalt pikk ({{ height }}px). Lubatud vähim pikkus on {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Väärtus peaks olema kasutaja kehtiv salasõna.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Väärtus peaks olema täpselt {{ limit }} tähemärk pikk.|Väärtus peaks olema täpselt {{ limit }} tähemärki pikk.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fail ei laetud täielikult üles.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ühtegi faili ei laetud üles.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ajutine kaust php.ini-s ei olnud seadistatud või seadistatud kaust ei eksisteeri.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ajutist faili ei saa kettale kirjutada.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP laiendi tõttu ebaõnnestus faili üleslaadimine.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Kogumikus peaks olema vähemalt {{ limit }} element.|Kogumikus peaks olema vähemalt {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Kogumikus peaks olema ülimalt {{ limit }} element.|Kogumikus peaks olema ülimalt {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Kogumikus peaks olema täpselt {{ limit }} element.|Kogumikus peaks olema täpselt {{ limit }}|elementi.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Vigane kaardi number.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Kaardi tüüpi ei toetata või kaardi number on vigane.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>See väärtus ei ole kehtiv Rahvusvaheline Kontonumber (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Väärtus pole korrektne ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Väärtus pole korrektne ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Väärtus pole korrektne ISBN-10 ega ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Väärtus pole korrektne ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Väärtus pole korrektne valuuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema võrdne {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Väärtus peaks olema suurem kui {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema suurem kui või võrduma {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Väärtus peaks olema identne väärtusega {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Väärtus peaks olema väiksem kui {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema väiksem kui või võrduma {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Väärtus ei tohiks võrduda {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Väärtus ei tohiks olla identne väärtusega {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Kuvasuhe on liiga suur ({{ ratio }}). Lubatud maksimaalne suhe on {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Kuvasuhe on liiga väike ({{ ratio }}). Oodatav minimaalne suhe on {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Pilt on ruudukujuline ({{ width }}x{{ height }}px). Ruudukujulised pildid pole lubatud.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Pilt on horisontaalselt orienteeritud ({{ width }}x{{ height }}px). Maastikulised pildid pole lubatud.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Pilt on vertikaalselt orienteeritud ({{ width }}x{{ height }}px). Portreepildid pole lubatud.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Tühi fail pole lubatud.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Sellist domeeni ei õnnestunud leida.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>See väärtus ei ühti eeldatava tähemärgiga {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>See väärtus ei ole kehtiv BIC-kood.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Viga</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>See väärtus ei ole kehtiv UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>See väärtus peaks olema väärtuse {{ compared_value }} kordne.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>See ettevõtte identifitseerimiskood (BIC) ei ole seotud IBAN-iga {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>See väärtus peaks olema kehtiv JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>See kogu peaks sisaldama ainult unikaalseid elemente.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>See väärtus peaks olema positiivne.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>See väärtus peaks olema kas positiivne või null.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>See väärtus peaks olema negatiivne.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>See väärtus peaks olema kas negatiivne või null.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>See väärtus pole kehtiv ajavöönd.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>See parool on lekkinud andmerikkumise korral, seda ei tohi kasutada. Palun kasutage muud parooli.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>See väärtus peaks olema vahemikus {{ min }} kuni {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>See väärtus pole korrektne domeeninimi.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Selles kogus olevate elementide arv peab olema arvu {{ compared_value }} kordne.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>See väärtus peab vastama vähemalt ühele järgmistest tingimustest:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Kõik väärtused selles kogus peavad vastama oma tingimustele.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>See väärtus pole korrektne ISIN-kood.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>See väärtus pole korrektne avaldis.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>See väärtus pole korrektne CSS-i värv.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>See väärtus pole korrektne CIDR võrguaadress.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Võrgumaski väärtus peaks olema vahemikus {{ min }} kuni {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Failinimi on liiga pikk. See peaks olema {{ filename_max_length }} tähemärk või vähem.|Failinimi on liiga pikk. See peaks olema {{ filename_max_length }} tähemärki või vähem.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Parooli tugevus on liiga madal. Palun kasuta tugevamat parooli.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>See väärtus sisaldab tähemärke, mida praegune piirangu tase ei luba.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Mittenähtavate tähemärkide kasutamine ei ole lubatud.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Eri kirjasüsteemidest pärit numbrite koos kasutamine pole lubatud.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Peidetud tähemärkide kasutamine pole lubatud.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Faili laiend on vigane ({{ extension }}). Lubatud laiendid on {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Tuvastatud teksti kodeering on vigane ({{ detected }}). Lubatud kodeeringud on {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>See väärtus ei ole kehtiv MAC-aadress.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Sellel URL-il puudub ülataseme domeen.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">See väärtus on liiga lühike. See peaks sisaldama vähemalt ühte sõna.|See väärtus on liiga lühike. See peaks sisaldama vähemalt {{ min }} sõna.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">See väärtus on liiga pikk. See peaks sisaldama ainult ühte sõna.|See väärtus on liiga pikk. See peaks sisaldama {{ max }} sõna või vähem.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">See väärtus ei esinda kehtivat nädalat ISO 8601 formaadis.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">See väärtus ei ole kehtiv nädal.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">See väärtus ei tohiks olla enne nädalat "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">See väärtus ei tohiks olla pärast nädalat "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">See väärtus ei ole kehtiv Twig'i mall.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">See fail ei ole kehtiv video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Video suurust ei õnnestunud tuvastada.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Video laius on liiga suur ({{ width }}px). Lubatud maksimaalne laius on {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Video laius on liiga väike ({{ width }}px). Oodatav minimaalne laius on {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Video kõrgus on liiga suur ({{ height }}px). Lubatud maksimaalne kõrgus on {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Video kõrgus on liiga väike ({{ height }}px). Oodatav minimaalne kõrgus on {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Videol on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Videol on liiga palju piksleid ({{ pixels }}). Eeldatav maksimaalne kogus on {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Video suhe on liiga suur ({{ ratio }}). Lubatud maksimaalne suhe on {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Video kuvasuhe on liiga väike ({{ ratio }}). Eeldatav miinimumsuhe on {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video on ruudukujuline ({{ width }}x{{ height }}px). Ruutvideod pole lubatud.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video on horisontaalses asendis ({{ width }}x{{ height }} px). Horisontaalseid videoid ei ole lubatud.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video on püstsuunas ({{ width }}x{{ height }} px). Püstsuunalised videod pole lubatud.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Videofail on rikutud.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video sisaldab mitu voogu. Lubatud on ainult üks voog.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Toetamata videokoodek „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Toetamata videokonteiner "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Pildifail on rikutud.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Pildil on liiga vähe piksleid ({{ pixels }}). Oodatav miinimum on {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Pildil on liiga palju piksleid ({{ pixels }}). Oodatav maksimaalne hulk on {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">See failinimi ei vasta eeldatavale märgistikule.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="it" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Questo valore dovrebbe essere falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Questo valore dovrebbe essere vero.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Questo valore dovrebbe essere di tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Questo valore dovrebbe essere vuoto.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Il valore selezionato non è una scelta valida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Si dovrebbe selezionare almeno {{ limit }} opzione.|Si dovrebbero selezionare almeno {{ limit }} opzioni.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Si dovrebbe selezionare al massimo {{ limit }} opzione.|Si dovrebbero selezionare al massimo {{ limit }} opzioni.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Uno o più valori inseriti non sono validi.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Questo campo non è stato previsto.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Questo campo è mancante.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Questo valore non è una data valida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Questo valore non è una data e ora valida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Questo valore non è un indirizzo email valido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Non è stato possibile trovare il file.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Il file non è leggibile.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Il file è troppo grande ({{ size }} {{ suffix }}). La dimensione massima consentita è {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Il mime type del file non è valido ({{ type }}). I tipi permessi sono {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Questo valore dovrebbe essere {{ limit }} o inferiore.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Questo valore è troppo lungo. Dovrebbe essere al massimo di {{ limit }} carattere.|Questo valore è troppo lungo. Dovrebbe essere al massimo di {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Questo valore dovrebbe essere {{ limit }} o superiore.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Questo valore è troppo corto. Dovrebbe essere almeno di {{ limit }} carattere.|Questo valore è troppo corto. Dovrebbe essere almeno di {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Questo valore non dovrebbe essere vuoto.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Questo valore non dovrebbe essere nullo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Questo valore dovrebbe essere nullo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Questo valore non è valido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Questo valore non è un'ora valida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Questo valore non è un URL valido.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>I due valori dovrebbero essere uguali.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Il file è troppo grande. La dimensione massima è {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Il file è troppo grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Il file non può essere caricato.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Questo valore dovrebbe essere un numero.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Questo file non è una immagine valida.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Questo valore non è un indirizzo IP valido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Questo valore non è una lingua valida.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Questo valore non è una impostazione regionale valida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Questo valore non è una nazione valida.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Questo valore è già stato utilizzato.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>La dimensione dell'immagine non può essere determinata.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La larghezza dell'immagine è troppo grande ({{ width }}px). La larghezza massima è di {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La larghezza dell'immagine è troppo piccola ({{ width }}px). La larghezza minima è di {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altezza dell'immagine è troppo grande ({{ height }}px). L'altezza massima è di {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altezza dell'immagine è troppo piccola ({{ height }}px). L'altezza minima è di {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Questo valore dovrebbe essere la password attuale dell'utente.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Questo valore dovrebbe contenere esattamente {{ limit }} carattere.|Questo valore dovrebbe contenere esattamente {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Il file è stato caricato solo parzialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nessun file è stato caricato.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Non è stata configurata una cartella temporanea in php.ini, o la cartella configurata non esiste.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Impossibile scrivere il file temporaneo sul disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Un'estensione PHP ha causato il fallimento del caricamento.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Questa collezione dovrebbe contenere almeno {{ limit }} elemento.|Questa collezione dovrebbe contenere almeno {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Questa collezione dovrebbe contenere massimo {{ limit }} elemento.|Questa collezione dovrebbe contenere massimo {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Questa collezione dovrebbe contenere esattamente {{ limit }} elemento.|Questa collezione dovrebbe contenere esattamente {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numero di carta non valido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo di carta non supportato o numero non valido.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Questo valore non è un IBAN valido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Questo valore non è un codice ISBN-10 valido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Questo valore non è un codice ISBN-13 valido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Questo valore non è un codice ISBN-10 o ISBN-13 valido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Questo valore non è un codice ISSN valido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Questo valore non è una valuta valida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere uguale a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere maggiore di {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere maggiore o uguale a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere identico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere minore di {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere minore o uguale a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere diverso da {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere diverso da {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Il rapporto di aspetto dell'immagine è troppo grande ({{ ratio }}). Il rapporto massimo consentito è {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Il rapporto di aspetto dell'immagine è troppo piccolo ({{ ratio }}). Il rapporto minimo consentito è {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>L'immagine è quadrata ({{ width }}x{{ height }}px). Le immagini quadrate non sono consentite.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>L'immagine è orizzontale ({{ width }}x{{ height }}px). Le immagini orizzontali non sono consentite.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>L'immagine è verticale ({{ width }}x{{ height }}px). Le immagini verticali non sono consentite.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Un file vuoto non è consentito.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>L'host non può essere risolto.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Questo valore non corrisponde al charset {{ charset }} previsto.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Questo valore non è un codice identificativo bancario (BIC) valido.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Errore</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Questo valore non è un UUID valido.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Questo valore dovrebbe essere un multiplo di {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Questo codice identificativo bancario (BIC) non è associato all'IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Questo valore dovrebbe essere un JSON valido.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Questa collezione dovrebbe contenere solo elementi unici.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Questo valore dovrebbe essere positivo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Questo valore dovrebbe essere positivo oppure zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Questo valore dovrebbe essere negativo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Questo valore dovrebbe essere negativo oppure zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Questo valore non è un fuso orario valido.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Questa password è trapelata durante una compromissione di dati, non deve essere usata. Si prega di usare una password diversa.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Questo valore dovrebbe essere compreso tra {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Questo valore non è un nome di host valido.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Il numero di elementi in questa collezione dovrebbe essere un multiplo di {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Questo valore dovrebbe soddisfare almeno uno dei vincoli seguenti:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Ciascun elemento di questa collezione dovrebbe soddisfare il suo insieme di vincoli.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Questo valore non è un codice identificativo internazionale di valori mobiliari (ISIN) valido.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Questo valore dovrebbe essere un'espressione valida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Questo valore non è un colore CSS valido.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Questo valore non è una notazione CIDR valida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Il valore della netmask dovrebbe essere compreso tra {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Il nome del file è troppo lungo. Dovrebbe avere {{ filename_max_length }} carattere o meno.|Il nome del file è troppo lungo. Dovrebbe avere {{ filename_max_length }} caratteri o meno.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>La password non è abbastanza sicura. Per favore, utilizza una password più robusta.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Questo valore contiene caratteri che non sono consentiti dal livello di restrizione attuale.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Utilizzare caratteri invisibili non è consentito.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Non è consentito mescolare numeri provenienti da diversi script.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Non è consentito utilizzare caratteri sovrapposti nascosti.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>L'estensione del file non è valida ({{ extension }}). Le estensioni consentite sono {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>La codifica dei caratteri rilevata non è valida ({{ detected }}). Le codifiche ammesse sono {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Questo valore non è un indirizzo MAC valido.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Questo URL è privo di un dominio di primo livello.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Questo valore è troppo corto. Dovrebbe contenere almeno una parola.|Questo valore è troppo corto. Dovrebbe contenere almeno {{ min }} parole.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Questo valore è troppo lungo. Dovrebbe contenere una parola.|Questo valore è troppo lungo. Dovrebbe contenere {{ max }} parole o meno.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Questo valore non rappresenta una settimana valida nel formato ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Questo valore non è una settimana valida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Questo valore non dovrebbe essere prima della settimana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Questo valore non dovrebbe essere dopo la settimana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Questo valore non è un template Twig valido.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Questo file non è un video valido.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Non è stato possibile rilevare la dimensione del video.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La larghezza del video è troppo grande ({{ width }}px). La larghezza massima consentita è {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La larghezza del video è troppo piccola ({{ width }}px). La larghezza minima prevista è {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altezza del video è troppo grande ({{ height }}px). L'altezza massima consentita è {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altezza del video è troppo piccola ({{ height }}px). L'altezza minima prevista è {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Il video ha troppo pochi pixel ({{ pixels }}). La quantità minima prevista è {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Il video ha troppi pixel ({{ pixels }}). La quantità massima prevista è {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Il rapporto del video è troppo alto ({{ ratio }}). Il rapporto massimo consentito è {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Il rapporto del video è troppo piccolo ({{ ratio }}). Il rapporto minimo previsto è {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Il video è quadrato ({{ width }}x{{ height }}px). I video quadrati non sono consentiti.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Il video è in orientamento orizzontale ({{ width }}x{{ height }}px). I video orizzontali non sono consentiti.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Il video è in orientamento verticale ({{ width }}x{{ height }}px). I video in orientamento verticale non sono consentiti.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Il file video è danneggiato.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Il video contiene più flussi. È consentito un solo flusso.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Codec video non supportato «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Container video non supportato "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Il file immagine è danneggiato.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>L’immagine ha troppo pochi pixel ({{ pixels }}). La quantità minima prevista è {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>L’immagine ha troppi pixel ({{ pixels }}). La quantità massima prevista è {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Questo nome file non corrisponde al set di caratteri previsto.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="gl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor debería ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor debería ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor debería ser de tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor debería estar baleiro.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor seleccionado non é unha opción válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Debe seleccionar polo menos {{ limit }} opción.|Debe seleccionar polo menos {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Debe seleccionar como máximo {{ limit }} opción.|Debe seleccionar como máximo {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Un ou máis dos valores indicados non son válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Este campo non era esperado.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Este campo falta.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor non é unha data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor non é unha data e hora válidas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor non é unha dirección de correo electrónico válida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Non se puido atopar o arquivo.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo non se pode ler.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é demasiado grande ({{ size }} {{ suffix }}). O tamaño máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo non é válido ({{ type }}). Os tipos mime válidos son {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor debería ser {{ limit }} ou menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor é demasiado longo. Debería ter {{ limit }} carácter ou menos.|Este valor é demasiado longo. Debería ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor debería ser {{ limit }} ou máis.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor é demasiado curto. Debería ter {{ limit }} carácter ou máis.|Este valor é demasiado corto. Debería ter {{ limit }} caracteres ou máis.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor non debería estar baleiro.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor non debería ser null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor debería ser null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor non é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor non é unha hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor non é unha URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dous valores deberían ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é demasiado grande. O tamaño máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O arquivo é demasiado grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No se puido cargar o arquivo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor debería ser un número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>O arquivo non é unha imaxe válida.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Este valor non é un enderezo IP válido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor non é un idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor non é unha localización válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor non é un país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor xa está a ser empregado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Non se puido determinar o tamaño da imaxe.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imaxe é demasiado grande ({{ width }}px). A largura máxima permitida son {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imaxe é demasiado pequena ({{ width }}px). A largura mínima requerida son {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imaxe é demasiado grande ({{ height }}px). A altura máxima permitida son {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imaxe é demasiado pequena ({{ height }}px). A altura mínima requerida son {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Este valor debería ser a contrasinal actual do usuario.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor debería ter exactamente {{ limit }} carácter.|Este valor debería ter exactamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>O arquivo foi só subido parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Non se subiu ningún arquivo.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ningunha carpeta temporal foi configurada en php.ini, ou a carpeta non existe.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Non se puido escribir o arquivo temporal no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Unha extensión de PHP provocou que a subida fallara.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta colección debe conter {{ limit }} elemento ou máis.|Esta colección debe conter {{ limit }} elementos ou máis.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta colección debe conter {{ limit }} elemento ou menos.|Esta colección debe conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta colección debe conter exactamente {{ limit }} elemento.|Esta colección debe conter exactamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de tarxeta non válido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de tarxeta non soportado ou número de tarxeta non válido.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Este valor non é un Número de Conta Bancaria Internacional (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor non é un ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor non é un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor non é nin un ISBN-10 válido nin un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor non é un ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este valor non é unha moeda válida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor debería ser maior que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser maior ou igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor debería ser identico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor debería ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser menor ou igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor non debería ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor non debería ser identico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>A proporción da imaxe é demasiado grande ({{ ratio }}). A proporción máxima permitida é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>A proporción da é demasiado pequena ({{ ratio }}). A proporción mínima permitida é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>A imaxe é cadrada ({{ width }}x{{ height }}px). As imáxenes cadradas non están permitidas.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>A imaxe está orientada horizontalmente ({{ width }}x{{ height }}px). As imáxenes orientadas horizontalmente non están permitidas.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>A imaxe está orientada verticalmente ({{ width }}x{{ height }}px). As imáxenes orientadas verticalmente non están permitidas.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Non está permitido un arquivo baleiro.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Non se puido resolver o host.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>A codificación de caracteres para este valor debería ser {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Este valor non é un Código de Identificación de Negocios (BIC) válido.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Erro</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Este valor non é un UUID válido.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Este valor debería ser multiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Este Código de identificación bancaria (BIC) non está asociado co IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Este valor debería ser un JSON válido.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Esta colección só debería ter elementos únicos.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Este valor debería ser positivo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Este valor debe ser positivo ou igual a cero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Este valor debe ser negativo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Este valor debe ser negativo ou igual a cero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Este valor non é unha zona horaria válida.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Este contrasinal non se pode usar porque está incluído nunha lista de contrasinais públicos obtidos grazas a fallos de seguridade noutros sitios e aplicacións. Utiliza outro contrasinal.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Este valor debe estar comprendido entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Este valor non é un nome de host válido.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>O número de elementos desta colección debería ser múltiplo de {{compare_value}}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Este valor debe cumprir polo menos unha das seguintes restricións:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Cada elemento desta colección debe satisfacer o seu propio conxunto de restricións.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Este valor non é un número de identificación de valores internacionais (ISIN) válido.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Este valor debe ser unha expresión válida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Este valor non é unha cor CSS válida.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Este valor non ten unha notación CIDR válida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>O valor da máscara de rede debería estar entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>O nome do ficheiro é demasiado longo. Debe ter {{ filename_max_length }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>O contrasinal é demasiado débil. Utilice un contrasinal máis seguro.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Este valor contén caracteres que non están permitidos polo nivel de restrición actual.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Non se permite usar caracteres invisíbeis.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Non se permite mesturar números de diferentes scripts.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Non se permite usar caracteres de superposición ocultos.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>A extensión do ficheiro non é válida ({{ extension }}). As extensións permitidas son {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>A codificación de caracteres detectada non é válida ({{ detected }}). As codificacións permitidas son {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Este valor non é un enderezo MAC válido.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>A esta URL fáltalle un dominio de nivel superior.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Este valor é curto de máis. Debe conter polo menos unha palabra.|Este valor é curto de máis. Debe conter polo menos {{ min }} palabras.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Este valor é longo de máis. Debe conter só unha palabra.|Este valor é longo de máis. Debe conter {{ max }} palabras ou menos.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Este valor non representa unha semana válida no formato ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Este valor non é unha semana válida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Este valor non debe ser anterior á semana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Este valor non debe estar despois da semana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Este valor non é un modelo Twig válido.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Este ficheiro non é un vídeo válido.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Non se puido detectar o tamaño do vídeo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A anchura do vídeo é demasiado grande ({{ width }}px). A anchura máxima permitida é {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A anchura do vídeo é demasiado pequena ({{ width }}px). A anchura mínima agardada é {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura do vídeo é demasiado grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura do vídeo é demasiado pequena ({{ height }}px). A altura mínima agardada é {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>O vídeo ten moi poucos píxeles ({{ pixels }}). A cantidade mínima agardada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>O vídeo ten demasiados píxeles ({{ pixels }}). A cantidade máxima agardada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>A relación do vídeo é demasiado grande ({{ ratio }}). A relación máxima permitida é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>A relación do vídeo é demasiado pequena ({{ ratio }}). A relación mínima agardada é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>O vídeo é cadrado ({{ width }}x{{ height }}px). Non se permiten vídeos cadrados.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>O vídeo está en orientación horizontal ({{ width }}x{{ height }} px). Non se permiten vídeos en horizontal.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>O vídeo está en orientación vertical ({{ width }}x{{ height }} px). Non se permiten vídeos en orientación vertical.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>O ficheiro de vídeo está danado.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>O vídeo contén múltiples fluxos. Só se permite un fluxo.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Códec de vídeo non compatible «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Contedor de vídeo non compatible "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>O ficheiro de imaxe está danado.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>A imaxe ten moi poucos píxeles ({{ pixels }}). A cantidade mínima esperada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>A imaxe ten demasiados píxeles ({{ pixels }}). A cantidade máxima esperada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Este nome de ficheiro non coincide co charset agardado.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="el" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Αυτή η τιμή πρέπει να είναι ψευδής.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Αυτή η τιμή πρέπει να είναι αληθής.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Αυτή η τιμή πρέπει να είναι τύπου {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Αυτή η τιμή πρέπει να είναι κενή.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Η τιμή που επιλέχθηκε δεν αντιστοιχεί σε έγκυρη επιλογή.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Πρέπει να επιλέξτε τουλάχιστον {{ limit }} επιλογή.|Πρέπει να επιλέξτε τουλάχιστον {{ limit }} επιλογές.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Πρέπει να επιλέξτε το πολύ {{ limit }} επιλογή.|Πρέπει να επιλέξτε το πολύ {{ limit }} επιλογές.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Μια ή περισσότερες τιμές δεν είναι έγκυρες.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Αυτό το πεδίο δεν ήταν αναμενόμενο.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Λείπει αυτό το πεδίο.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρη ημερομηνία.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρη ημερομηνία και ώρα.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρο email.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Το αρχείο δε μπορεί να βρεθεί.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Το αρχείο δεν είναι αναγνώσιμο.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Το αρχείο είναι πολύ μεγάλο ({{ size }} {{ suffix }}). Το μέγιστο επιτρεπτό μέγεθος είναι {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Ο τύπος mime του αρχείου δεν είναι έγκυρος ({{ type }}). Οι έγκυροι τύποι mime είναι {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι {{ limit }} ή λιγότερο.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Αυτή η τιμή είναι πολύ μεγάλη. Θα έπρεπε να έχει {{ limit }} χαρακτήρα ή λιγότερο.|Αυτή η τιμή είναι πολύ μεγάλη. Θα έπρεπε να έχει {{ limit }} χαρακτήρες ή λιγότερο.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι {{ limit }} ή περισσότερο.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Αυτή η τιμή είναι πολύ μικρή. Θα έπρεπε να έχει {{ limit }} χαρακτήρα ή περισσότερο.|Αυτή η τιμή είναι πολύ μικρή. Θα έπρεπε να έχει {{ limit }} χαρακτήρες ή περισσότερο.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι κενή.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι μηδενική.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Αυτή η τιμή πρέπει να είναι μηδενική.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Αυτή η τιμή δεν είναι έγκυρη.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έγκυρη ώρα.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έγκυρο URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Οι δύο τιμές θα πρέπει να είναι ίδιες.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπτό μέγεθος είναι {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Το αρχείο είναι πολύ μεγάλο.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Το αρχείο δε μπορεί να ανέβει.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι ένας έγκυρος αριθμός.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Το αρχείο δεν αποτελεί έγκυρη εικόνα.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Αυτή η IP διεύθυνση δεν είναι έγκυρη.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έγκυρη γλώσσα.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έγκυρο κωδικό τοποθεσίας.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έγκυρη χώρα.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Αυτή η τιμή χρησιμοποιείται ήδη.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Το μέγεθος της εικόνας δεν ήταν δυνατό να ανιχνευθεί.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Το πλάτος της εικόνας είναι πολύ μεγάλο ({{ width }}px). Το μέγιστο επιτρεπτό πλάτος είναι {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Το πλάτος της εικόνας είναι πολύ μικρό ({{ width }}px). Το ελάχιστο επιτρεπτό πλάτος είναι {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Το ύψος της εικόνας είναι πολύ μεγάλο ({{ height }}px). Το μέγιστο επιτρεπτό ύψος είναι {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Το ύψος της εικόνας είναι πολύ μικρό ({{ height }}px). Το ελάχιστο επιτρεπτό ύψος είναι {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι ο τρέχων κωδικός.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Αυτή η τιμή θα έπρεπε να έχει ακριβώς {{ limit }} χαρακτήρα.|Αυτή η τιμή θα έπρεπε να έχει ακριβώς {{ limit }} χαρακτήρες.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Το αρχείο δεν ανέβηκε ολόκληρο.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Δεν ανέβηκε κανένα αρχείο.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Δεν έχει ρυθμιστεί προσωρινός φάκελος στο php.ini, ή ο ρυθμισμένος φάκελος δεν υπάρχει.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Αδυναμία εγγραφής προσωρινού αρχείου στο δίσκο.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Μια επέκταση PHP προκάλεσε αδυναμία ανεβάσματος.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχείο ή περισσότερα.|Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχεία ή περισσότερα.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχείo ή λιγότερα.|Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχεία ή λιγότερα.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει ακριβώς {{ limit }} στοιχείo.|Αυτή η συλλογή θα πρέπει να περιέχει ακριβώς {{ limit }} στοιχεία.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Μη έγκυρος αριθμός κάρτας.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Μη υποστηριζόμενος τύπος κάρτας ή μη έγκυρος αριθμός κάρτας.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Αυτός δεν είναι έγκυρος διεθνής αριθμός τραπεζικού λογαριασμού (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Αυτό δεν είναι ούτε έγκυρος κωδικός ISBN-10 ούτε έγκυρος κωδικός ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Αυτό δεν αντιστοιχεί σε έγκυρο νόμισμα.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μεγαλύτερη από {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μεγαλύτερη ή ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι πανομοιότυπη με {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μικρότερη από {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μικρότερη ή ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή δεν θα πρέπει να είναι ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι πανομοιότυπη με {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Η αναλογία πλάτους-ύψους της εικόνας είναι πολύ μεγάλη ({{ ratio }}). Μέγιστη επιτρεπτή αναλογία {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Η αναλογία πλάτους-ύψους της εικόνας είναι πολύ μικρή ({{ ratio }}). Ελάχιστη επιτρεπτή αναλογία {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Η εικόνα είναι τετράγωνη ({{ width }}x{{ height }}px). Δεν επιτρέπονται τετράγωνες εικόνες.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Η εικόνα έχει οριζόντιο προσανατολισμό ({{ width }}x{{ height }}px). Δεν επιτρέπονται εικόνες με οριζόντιο προσανατολισμό.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Η εικόνα έχει κάθετο προσανατολισμό ({{ width }}x{{ height }}px). Δεν επιτρέπονται εικόνες με κάθετο προσανατολισμό.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Δεν επιτρέπεται κενό αρχείο.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Η διεύθυνση δεν μπόρεσε να επιλυθεί.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Αυτή η τιμή δεν ταιριάζει στο αναμενόμενο {{ charset }} σύνολο χαρακτήρων.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Αυτός ο αριθμός δεν είναι έγκυρος Κωδικός Ταυτοποίησης Επιχείρησης (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Σφάλμα</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Αυτός ο αριθμός δεν είναι έγκυρη UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι πολλαπλάσιο του {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Αυτός ο κωδικός BIC δεν σχετίζεται με το IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι έγκυρο JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει μόνο μοναδικά στοιχεία.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι θετική.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι θετική ή μηδενική.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι αρνητική.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι αρνητική ή μηδενική.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Αυτή η τιμή θα δεν είναι έγκυρη ζώνη ώρας.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Αυτός ο κωδικός πρόσβασης έχει διαρρεύσει σε παραβίαση δεδομένων. Παρακαλούμε να χρησιμοποιήσετε έναν άλλο κωδικό.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μεταξύ {{ min }} και {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Αυτή η τιμή δεν είναι έγκυρο όνομα υποδοχής.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Το νούμερο των στοιχείων σε αυτή τη συλλογή θα πρέπει να είναι πολλαπλάσιο του {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Αυτή η τιμή θα πρέπει να ικανοποιεί τουλάχιστον έναν από τους παρακάτω περιορισμούς: </target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Κάθε στοιχείο σε αυτή τη συλλογή θα πρέπει να ικανοποιεί το δικό του σύνολο περιορισμών.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Αυτή η τιμή δεν είναι έγκυρο International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μία έγκυρη έκφραση.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Αυτή η τιμή δεν είναι έγκυρο χρώμα CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Αυτή η τιμή δεν είναι έγκυρη CIDR σημειογραφία.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Η τιμή του netmask πρέπει να είναι ανάμεσα σε {{ min }} και {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Το όνομα αρχείου είναι πολύ μεγάλο. Θα πρέπει να έχει έως {{ filename_max_length }} χαρακτήρα.|Το όνομα αρχείου είναι πολύ μεγάλο. Θα πρέπει να έχει έως {{ filename_max_length }} χαρακτήρες.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Η ισχύς του κωδικού πρόσβασης είναι πολύ χαμηλή. Χρησιμοποιήστε έναν ισχυρότερο κωδικό πρόσβασης.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Αυτή η τιμή περιέχει χαρακτήρες που δεν επιτρέπονται από το τρέχον επίπεδο περιορισμού.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Δεν επιτρέπεται η χρήση αόρατων χαρακτήρων.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Δεν επιτρέπεται η μίξη αριθμών από διαφορετικά γραφήματα.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Δεν επιτρέπεται η χρήση κρυφών χαρακτήρων επικάλυψης.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Η επέκταση του αρχείου δεν είναι έγκυρη ({{ extension }}). Οι επιτρεπτόμενες επεκτάσεις είναι {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Η κωδικοποίηση χαρακτήρων που ανιχνεύτηκε δεν είναι έγκυρη ({{ detected }}). Οι επιτρεπόμενες κωδικοποιήσεις είναι {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Αυτός ο αριθμός δεν είναι έγκυρη διεύθυνση MAC.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Αυτή η διεύθυνση URL λείπει ένας τομέας ανώτατου επιπέδου.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Αυτή η τιμή είναι πολύ σύντομη. Πρέπει να περιέχει τουλάχιστον μία λέξη.|Αυτή η τιμή είναι πολύ σύντομη. Πρέπει να περιέχει τουλάχιστον {{ min }} λέξεις.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Αυτή η τιμή είναι πολύ μεγάλη. Πρέπει να περιέχει μόνο μία λέξη.|Αυτή η τιμή είναι πολύ μεγάλη. Πρέπει να περιέχει {{ max }} λέξεις ή λιγότερες.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Αυτή η τιμή δεν αντιπροσωπεύει έγκυρη εβδομάδα στη μορφή ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Αυτή η τιμή δεν είναι έγκυρη εβδομάδα.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι πριν από την εβδομάδα "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι μετά την εβδομάδα "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Αυτή η τιμή δεν είναι έγκυρο πρότυπο Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Αυτό το αρχείο δεν είναι έγκυρο βίντεο.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Δεν ήταν δυνατός ο εντοπισμός του μεγέθους του βίντεο.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Το πλάτος του βίντεο είναι πολύ μεγάλο ({{ width }}px). Το επιτρεπόμενο μέγιστο πλάτος είναι {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Το πλάτος του βίντεο είναι πολύ μικρό ({{ width }}px). Το ελάχιστο αναμενόμενο πλάτος είναι {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Το ύψος του βίντεο είναι πολύ μεγάλο ({{ height }}px). Το επιτρεπόμενο μέγιστο ύψος είναι {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Το ύψος του βίντεο είναι πολύ μικρό ({{ height }}px). Το αναμενόμενο ελάχιστο ύψος είναι {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Το βίντεο έχει πολύ λίγα εικονοστοιχεία ({{ pixels }}). Η ελάχιστη αναμενόμενη ποσότητα είναι {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Το βίντεο έχει πάρα πολλά εικονοστοιχεία ({{ pixels }}). Η μέγιστη αναμενόμενη ποσότητα είναι {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Η αναλογία του βίντεο είναι πολύ μεγάλη ({{ ratio }}). Η μέγιστη επιτρεπτή αναλογία είναι {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Η αναλογία βίντεο είναι πολύ μικρή ({{ ratio }}). Η ελάχιστη αναμενόμενη αναλογία είναι {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Το βίντεο είναι τετράγωνο ({{ width }}x{{ height }}px). Τα τετράγωνα βίντεο δεν επιτρέπονται.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Το βίντεο είναι σε οριζόντιο προσανατολισμό ({{ width }}x{{ height }} px). Τα οριζόντια βίντεο δεν επιτρέπονται.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Το βίντεο είναι σε κατακόρυφο προσανατολισμό ({{ width }}x{{ height }}px). Βίντεο κάθετου προσανατολισμού δεν επιτρέπονται.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Το αρχείο βίντεο είναι κατεστραμμένο.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Το βίντεο περιέχει πολλαπλά ρεύματα. Επιτρέπεται μόνο ένα ρεύμα.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Μη υποστηριζόμενος κωδικοποιητής βίντεο «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Μη υποστηριζόμενο κοντέινερ βίντεο "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Το αρχείο εικόνας είναι κατεστραμμένο.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Η εικόνα έχει πολύ λίγα εικονοστοιχεία ({{ pixels }}). Η αναμενόμενη ελάχιστη ποσότητα είναι {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Η εικόνα έχει πάρα πολλούς εικονοστοιχείους ({{ pixels }}). Ο μέγιστος αναμενόμενος αριθμός είναι {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Αυτό το όνομα αρχείου δεν αντιστοιχεί στο αναμενόμενο σύνολο χαρακτήρων.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sr-Cyrl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Вредност треба да буде нетачна.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Вредност треба да буде тачна.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Вредност треба да буде типа {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Вредност треба да буде празна.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Вредност треба да буде једна од понуђених.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Изаберите бар {{ limit }} могућност.|Изаберите бар {{ limit }} могућности.|Изаберите бар {{ limit }} могућности.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Изаберите највише {{ limit }} могућност.|Изаберите највише {{ limit }} могућности.|Изаберите највише {{ limit }} могућности.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Једна или више вредности је невалидна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ово поље није било очекивано.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ово поље недостаје.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Вредност није валидан датум.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Вредност није валидан датум-време.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Вредност није валидна адреса електронске поште.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Датотека не може бити пронађена.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Датотека није читљива.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотека је превелика ({{ size }} {{ suffix }}). Највећа дозвољена величина је {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Миме тип датотеке није валидан ({{ type }}). Дозвољени миме типови су {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Вредност треба да буде {{ limit }} или мање.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Вредност је предугачка. Треба да има {{ limit }} карактер или мање.|Вредност је предугачка. Треба да има {{ limit }} карактера или мање.|Вредност је предугачка. Треба да има {{ limit }} карактера или мање.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Вредност треба да буде {{ limit }} или више.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Вредност је прекратка. Треба да има {{ limit }} карактер или више.|Вредност је прекратка. Треба да има {{ limit }} карактера или више.|Вредност је прекратка. Треба да има {{ limit }} карактера или више.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Вредност не треба да буде празна.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Вредност не треба да буде null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Вредност треба да буде null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Вредност није валидна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Вредност није валидно време.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Вредност није валидан URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Обе вредности треба да буду једнаке.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотека је превелика. Највећа дозвољена величина је {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Датотека је превелика.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Датотека не може бити отпремљена.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Вредност треба да буде валидан број.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ова датотека није валидна слика.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ова вредност није валидна IP адреса.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Вредност није валидан језик.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Вредност није валидна међународна ознака језика.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Вредност није валидна држава.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Вредност је већ искоришћена.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Величина слике не може бити одређена.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина слике је превелика ({{ width }} пиксела). Најећа дозвољена ширина је {{ max_width }} пиксела.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина слике је премала ({{ width }} пиксела). Најмања дозвољена ширина је {{ min_width }} пиксела.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висина слике је превелика ({{ height }} пиксела). Најећа дозвољена висина је {{ max_height }} пиксела.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висина слике је премала ({{ height }} пиксела). Најмања дозвољена висина је {{ min_height }} пиксела.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Вредност треба да буде тренутна корисничка лозинка.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Вредност треба да има тачно {{ limit }} карактер.|Вредност треба да има тачно {{ limit }} карактера.|Вредност треба да има тачно {{ limit }} карактера.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Датотека је само делимично отпремљена.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Датотека није отпремљена.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Привремени директоријум није конфигурисан у php.ini, или конфигурисани директоријум не постоји.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Немогуће писање привремене датотеке на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP екстензија је проузроковала неуспех отпремања датотеке.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ова колекција треба да садржи {{ limit }} или више елемената.|Ова колекција треба да садржи {{ limit }} или више елемената.|Ова колекција треба да садржи {{ limit }} или више елемената.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ова колекција треба да садржи {{ limit }} или мање елемената.|Ова колекција треба да садржи {{ limit }} или мање елемената.|Ова колекција треба да садржи {{ limit }} или мање елемената.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ова колекција треба да садржи тачно {{ limit }} елемент.|Ова колекција треба да садржи тачно {{ limit }} елемента.|Ова колекција треба да садржи тачно {{ limit }} елемената.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невалидан број картице.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Невалидан број картице или тип картице није подржан.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ова вредност није валидан Међународни број банковног рачуна (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ова вредност није валидан ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ова вредност није валидан ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Овa вредност није ни валидан ISBN-10 ни валидан ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ова вредност није валидан ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ово вредност није валидна валута.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ова вредност треба да буде {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ова вредност треба да буде већа од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ова вредност треба да буде већа или једнака {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ова вредност треба да буде идентична са {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ова вредност треба да буде мања од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ова вредност треба да буде мања или једнака {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ова вредност не треба да буде једнака {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ова вредност не треба да буде идентична са {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Размера ове слике је превелика ({{ ratio }}). Максимална дозвољена размера је {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Размера ове слике је премала ({{ ratio }}). Минимална очекивана размера је {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Слика је квадратна ({{ width }}x{{ height }} пиксела). Квадратне слике нису дозвољене.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Слика је оријентације пејзажа ({{ width }}x{{ height }} пиксела). Пејзажна оријентација слика није дозвољена.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Слика је оријантације портрета ({{ width }}x{{ height }} пиксела). Портретна оријентација слика није дозвољена.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Празна датотека није дозвољена.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Име хоста не може бити разрешено.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Вредност се не поклапа са очекиваним {{ charset }} сетом карактера.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ова вредност није валидан Код за идентификацију бизниса (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Грешка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ова вредност није валидан UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ова вредност треба да буде дељива са {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>BIC код није повезан са IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ова вредност треба да буде валидан JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ова колекција треба да садржи само јединствене елементе.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ова вредност треба да буде позитивна.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ова вредност треба да буде или позитивна или нула.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ова вредност треба да буде негативна.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ова вредност треба да буде или негативна или нула.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ова вредност није валидна временска зона.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ова лозинка је компромитована приликом претходних напада, немојте је користити. Користите другу лозинку.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ова вредност треба да буде између {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ова вредност није исправно име хоста.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Број елемената у овој колекцији треба да буде дељив са {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ова вредност треба да задовољава најмање једно од наредних ограничења:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Сваки елемент ове колекције треба да задовољи сопствени скуп ограничења.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ова вредност није валидна међународна идентификациона ознака хартија од вредности (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ова вредност треба да буде валидан израз.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ова вредност није валидна CSS боја.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ова вредност није валидна CIDR нотација.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Вредност мрежне маске треба да буде између {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Назив датотеке је сувише дугачак. Треба да има {{ filename_max_length }} карактер или мање.|Назив датотеке је сувише дугачак. Треба да има {{ filename_max_length }} карактера или мање.|Назив датотеке је сувише дугачак. Треба да има {{ filename_max_length }} карактера или мање.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Лозинка није довољно јака. Молимо користите јачу лозинку.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ова вредност садржи карактере који нису дозвољени од стране важећег нивоа рестрикције.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Коришћење невидљивих карактера није дозвољено.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Мешање бројева из различитих скрипти није дозвољено.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Коришћење скривених преклопних карактера није дозвољено.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Екстензија фајла није валидна ({{ extension }}). Дозвољене екстензије су {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Детектовано кодирање знакова није валидно ({{ detected }}). Дозвољена кодирања су {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ова вредност није валидна MAC адреса.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Овом URL-у недостаје домен највишег нивоа.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ова вредност је прекратка. Треба да садржи макар једну реч.|Ова вредност је прекратка. Треба да садржи макар {{ min }} речи.|Ова вредност је прекратка. Треба да садржи макар {{ min }} речи.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ова вредност је предугачка. Треба да садржи само једну реч.|Ова вредност је предугачка. Треба да садржи највише {{ max }} речи.|Ова вредност је предугачка. Треба да садржи највише {{ max }} речи.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ова вредност не представља валидну недељу у ISO 8601 формату.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ова вредност није валидна недеља.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ова вредност не треба да буде пре недеље "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ова вредност не треба да буде после недеље "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ова вредност није важећи Twig шаблон.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ова датотека није важећи видео.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Није било могуће утврдити величину видео снимка.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Ширина видеа је превелика ({{ width }}px). Дозвољена максимална ширина је {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Ширина видеа је превише мала ({{ width }}px). Очекивана минимална ширина је {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Висина видеа је превелика ({{ height }}px). Дозвољена максимална висина је {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Висина видеа је превише мала ({{ height }}px). Очекивана минимална висина је {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Видео има премало пиксела ({{ pixels }}). Очекивана минимална количина је {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Видео има превише пиксела ({{ pixels }}). Очекивана максимална количина је {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Однос слике видеа је превелик ({{ ratio }}). Дозвољени максимални однос је {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Однос стране видеа је превише мали ({{ ratio }}). Очекивани минимални однос је {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Видео је квадратног облика ({{ width }}x{{ height }}px). Квадратни видео записи нису дозвољени.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видео је у водоравној оријентацији ({{ width }}x{{ height }} px). Водоравни видео записи нису дозвољени.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видео је у портрет оријентацији ({{ width }}x{{ height }}px). Видео снимци у портрет оријентацији нису дозвољени.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Видео датотека је оштећена.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Видео садржи више токова. Дозвољен је само један ток.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Неподржан видео кодек „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Неподржан видео контејнер "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Датотека слике је оштећена.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Слика има премало пиксела ({{ pixels }}). Очекивани минимални број је {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Слика има превише пиксела ({{ pixels }}). Очекивани максимални број је {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Ово име датотеке не одговара очекиваном скупу знакова.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="pt" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor deveria ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor deveria ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor deveria ser do tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor deveria ser vazio.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor selecionado não é uma opção válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Você deveria selecionar {{ limit }} opção no mínimo.|Você deveria selecionar {{ limit }} opções no mínimo.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Você deve selecionar, no máximo {{ limit }} opção.|Você deve selecionar, no máximo {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Um ou mais dos valores introduzidos não são válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Este campo não era esperado.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Este campo está faltando.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor não é uma data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor não é uma data-hora válida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor não é um endereço de e-mail válido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>O arquivo não pôde ser encontrado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo não pôde ser lido.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande ({{ size }} {{ suffix }}). O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo é inválido ({{ type }}). Os tipos mime permitidos são {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor deveria ser {{ limit }} ou menor.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>O valor é muito longo. Deveria ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor deveria ser {{ limit }} ou mais.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>O valor é muito curto. Deveria de ter {{ limit }} caractere ou mais.|O valor é muito curto. Deveria de ter {{ limit }} caracteres ou mais.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor não deveria ser vazio.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor não deveria ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor deveria ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor não é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor não é uma hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor não é uma URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dois valores deveriam ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande. O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O arquivo é muito grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Não foi possível enviar o arquivo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor deveria ser um número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Este arquivo não é uma imagem.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Este valor não é um endereço IP válido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor não é uma linguagem válida.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor não é uma localidade válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor não é um país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor já está a ser usado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>O tamanho da imagem não foi detectado.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imagem ({{ width }}px) é muito grande. A largura máxima da imagem é: {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imagem ({{ width }}px) é muito pequena. A largura mínima da imagem é de: {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imagem ({{ height }}px) é muito grande. A altura máxima da imagem é de: {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imagem ({{ height }}px) é muito pequena. A altura mínima da imagem é de: {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Este valor deveria ser a senha atual do usuário.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor deve possuir exatamente {{ limit }} caractere.|Este valor deve possuir exatamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Só foi enviada uma parte do arquivo.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nenhum arquivo foi enviado.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nenhuma pasta temporária foi configurada no php.ini, ou a pasta configurada não existe.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Não foi possível escrever os arquivos temporários no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Uma extensão PHP causou a falha no envio.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou mais.|Esta coleção deve conter {{ limit }} elementos ou mais.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou menos.|Esta coleção deve conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta coleção deve conter exatamente {{ limit }} elemento.|Esta coleção deve conter exatamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de cartão não suportado ou número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Este valor não é um Número de Conta Bancária Internacional (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor não é um ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-10 ou ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor não é um ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este não é um valor monetário válido.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor deve ser superior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual ou superior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor deve ser inferior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual ou inferior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor não deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor não deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>O formato da imagem é muito grande ({{ ratio }}). O formato máximo é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>O formato da imagem é muito pequeno ({{ ratio }}). O formato mínimo esperado é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>A imagem é um quadrado ({{ width }}x{{ height }}px). Imagens quadradas não são permitidas.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>A imagem está em orientação de paisagem ({{ width }}x{{ height }}px). Imagens orientadas em paisagem não são permitidas.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>A imagem está em orientação de retrato ({{ width }}x{{ height }}px). Imagens orientadas em retrato não são permitidas.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Um arquivo vazio não é permitido.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>O host não pode ser resolvido.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Este valor não corresponde ao conjunto de caracteres {{ charset }} esperado.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Este valor não é um Código de Identificação de Negócio (BIC) válido.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Erro</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Este valor não é um UUID válido.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Este valor deve ser um múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>O Código de Identificação de Empresa (BIC) não está associado ao IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Este valor deve ser um JSON válido.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Esta coleção deve conter só elementos únicos.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Este valor deve ser positivo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Este valor deve ser superior ou igual a zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Este valor deve ser negativo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Este valor deve ser inferior ou igual a zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Este valor não é um fuso horário válido.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Esta senha foi divulgada durante um vazamento de dados, não deve ser usada de novamente. Por favor usar uma senha outra.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Este valor deve estar entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Este valor não é um nome de host válido.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>O número de elementos desta coleção deve ser um múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Este valor deve satisfazer pelo menos uma das seguintes restrições:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Cada elemento desta coleção deve satisfazer o seu próprio conjunto de restrições.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Este valor não é um Número Internacional de Identificação de Segurança (ISIN) válido.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Este valor deve ser uma expressão válida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Este valor não é uma cor de CSS válida.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Este valor não é uma notação CIDR válida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>O valor da máscara de rede deve estar entre {{ min }} e {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>O nome do arquivo é muito grande. Deveria ter {{ filename_max_length }} caractere ou menos.|O nome do arquivo é muito grande. Deveria ter {{ filename_max_length }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>A força da senha é muito baixa. Por favor utilize uma senha mais forte.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Este valor contém caracteres que não são permitidos pelo nível de restrição atual.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Não é permitido usar caracteres invisíveis.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Não é permitido misturar números de scripts diferentes.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Não é permitido usar caracteres de sobreposição ocultos.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>A extensão do arquivo é inválida ({{ extension }}). As extensões permitidas são {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>A codificação de carateres detectada é inválida ({{ detected }}). As codificações permitidas são {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Este valor não é um endereço MAC válido.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Esta URL está faltando o domínio de nível superior.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Este valor é muito curto. Deve conter pelo menos uma palavra.|Este valor é muito curto. Deve conter pelo menos {{ min }} palavras.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Este valor é muito longo. Deve conter apenas uma palavra.|Este valor é muito longo. Deve conter {{ max }} palavras ou menos.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Este valor não representa uma semana válida no formato ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Este valor não é uma semana válida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Este valor não deve ser anterior à semana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Este valor não deve estar após a semana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Este valor não é um modelo Twig válido.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Este ficheiro não é um vídeo válido.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Não foi possível detetar o tamanho do vídeo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">A largura do vídeo é demasiado grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">A largura do vídeo é muito pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">A altura do vídeo é demasiado grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">A altura do vídeo é muito pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">O vídeo tem poucos píxeis ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">O vídeo tem píxeis a mais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">A proporção do vídeo é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">A proporção do vídeo é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo está em modo paisagem ({{ width }}x{{ height }} px). Vídeos em paisagem não são permitidos.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">O vídeo está em orientação vertical ({{ width }}x{{ height }}px). Vídeos em orientação vertical não são permitidos.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">O ficheiro de vídeo está corrompido.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">O vídeo contém vários fluxos. É permitido apenas um fluxo.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Codec de vídeo não suportado «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Contentor de vídeo não suportado "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">O ficheiro de imagem está corrompido.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">A imagem tem píxeis a menos ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">A imagem tem píxeis a mais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Este nome de ficheiro não corresponde ao conjunto de caracteres esperado.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="nb" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Verdien må være usann.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Verdien må være sann.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Verdien skal ha typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Verdien skal være blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Den valgte verdien er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du må velge minst {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan maks velge {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>En eller flere av de oppgitte verdiene er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Dette feltet var ikke forventet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dette feltet mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Verdien er ikke en gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Verdien er ikke en gyldig dato/tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Verdien er ikke en gyldig e-postadresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunne ikke finnes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen er ikke lesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilatte maksimale størrelse {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mimetypen av filen er ugyldig ({{ type }}). Tilatte mimetyper er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Verdien må være {{ limit }} tegn lang eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Verdien er for lang. Den må ha {{ limit }} tegn eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Verdien må være {{ limit }} eller mer.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Verdien er for kort. Den må ha {{ limit }} tegn eller flere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Verdien kan ikke være blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Verdien kan ikke være tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Verdien skal være tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Verdien er ugyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Verdien er ikke en gyldig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Verdien er ikke en gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Verdiene skal være identiske.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor. Den maksimale størrelsen er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunne ikke lastes opp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Verdien skal være et gyldig tall.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Denne filen er ikke et gyldig bilde.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Denne verdien er ikke en gyldig IP-adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Verdien er ikke et gyldig språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Verdien er ikke en gyldig lokalitet.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Verdien er ikke et gyldig navn på land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Verdien er allerede brukt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Bildestørrelsen kunne ikke oppdages.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Bildebredden er for stor ({{ width }} piksler). Tillatt maksimumsbredde er {{ max_width }} piksler.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Bildebredden er for liten ({{ width }} piksler). Forventet minimumsbredde er {{ min_width }} piksler.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bildehøyden er for stor ({{ height }} piksler). Tillatt maksimumshøyde er {{ max_height }} piksler.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Bildehøyden er for liten ({{ height }} piksler). Forventet minimumshøyde er {{ min_height }} piksler.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Verdien skal være brukerens sitt nåværende passord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Verdien skal være nøyaktig {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen var kun delvis opplastet.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil var lastet opp.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ingen midlertidig mappe ble konfigurert i php.ini, eller den konfigurerte mappen eksisterer ikke.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikke skrive midlertidig fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP-utvidelse forårsaket en feil under opplasting.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samlingen må inneholde {{ limit }} element eller flere.|Denne samlingen må inneholde {{ limit }} elementer eller flere.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samlingen må inneholde {{ limit }} element eller færre.|Denne samlingen må inneholde {{ limit }} elementer eller færre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samlingen må inneholde nøyaktig {{ limit }} element.|Denne samlingen må inneholde nøyaktig {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldig kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Korttypen er ikke støttet eller kortnummeret er ugyldig.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Denne verdien er ikke et gyldig internasjonalt bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Verdien er ikke en gyldig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Verdien er ikke en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Verdien er hverken en gyldig ISBN-10 eller ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Verdien er ikke en gyldig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Verdien er ikke gyldig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Verdien skal være lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Verdien skal være større enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Verdien skal være større enn eller lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Verdien skal være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Verdien skal være mindre enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Verdien skal være mindre enn eller lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Verdien skal ikke være lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Verdien skal ikke være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Bildeforholdet er for stort ({{ ratio }}). Tillatt bildeforhold er maks {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Bildeforholdet er for lite ({{ ratio }}). Forventet bildeforhold er minst {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Bildet er en kvadrat ({{ width }}x{{ height }}px). Kvadratiske bilder er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Bildet er i liggende retning ({{ width }}x{{ height }}px). Bilder i liggende retning er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Bildet er i stående retning ({{ width }}x{{ height }}px). Bilder i stående retning er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Tomme filer er ikke tilatt.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Vertsnavn kunne ikke løses.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Verdien samsvarer ikke med forventet tegnsett {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Denne verdien er ikke en gyldig forretningsidentifikasjonskode (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Feil</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Denne verdien er ikke en gyldig UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Verdien skal være flertall av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Business Identifier Code (BIC) er ikke tilknyttet en IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Verdien er ikke gyldig JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Samlingen kan kun inneholde unike elementer.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Denne verdien må være positiv.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Denne verdien må være positiv eller null.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Denne verdien må være negativ.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Denne verdien må være negativ eller null.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Verdien er ikke en gyldig tidssone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dette passordet er lekket i et datainnbrudd, det må ikke tas i bruk. Vennligst bruk et annet passord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Verdien må være mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Denne verdien er ikke et gyldig vertsnavn.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Antall elementer i denne samlingen bør være et multiplum av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Denne verdien skal tilfredsstille minst en av følgende begrensninger:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Hvert element i denne samlingen skal tilfredsstille sitt eget sett med begrensninger.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Denne verdien er ikke et gyldig International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Denne verdien skal være et gyldig uttrykk.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Denne verdien er ikke en gyldig CSS-farge.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Denne verdien er ikke en gyldig CIDR-notasjon.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Verdien på nettmasken skal være mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Filnavnet er for langt. Det bør ha {{ filename_max_length }} tegn eller mindre.|Filnavnet er for langt. Det bør ha {{ filename_max_length }} tegn eller mindre.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Passordstyrken er for lav. Vennligst bruk et sterkere passord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Denne verdien inneholder tegn som ikke er tillatt av gjeldende restriksjonsnivå.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Det er ikke tillatt å bruke usynlige tegn.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Det er ikke tillatt å blande tall fra forskjellige skript.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Det er ikke tillatt å bruke skjulte overleggskarakterer.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Filutvidelsen er ugyldig ({{ extension }}). Tillatte utvidelser er {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Den oppdagede tegnkodingen er ugyldig ({{ detected }}). Tillatte kodinger er {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Denne verdien er ikke en gyldig MAC-adresse.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Denne URL-en mangler et toppnivådomene.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Denne verdien er for kort. Den bør inneholde minst ett ord.|Denne verdien er for kort. Den bør inneholde minst {{ min }} ord.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Denne verdien er for lang. Den bør inneholde kun ett ord.|Denne verdien er for lang. Den bør inneholde {{ max }} ord eller færre.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Denne verdien representerer ikke en gyldig uke i ISO 8601-formatet.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Denne verdien er ikke en gyldig uke.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Denne verdien bør ikke være før uke "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Denne verdien bør ikke være etter uke "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Denne verdien er ikke en gyldig Twig-mal.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Denne filen er ikke en gyldig video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videostørrelsen kunne ikke oppdages.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Videobredden er for stor ({{ width }}px). Tillatt maksimal bredde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Videobredden er for liten ({{ width }}px). Forventet minimumsbredde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Videohøyden er for stor ({{ height }}px). Tillatt maksimal høyde er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Videoens høyde er for liten ({{ height }}px). Forventet minstehøyde er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videoen har for få piksler ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videoen har for mange piksler ({{ pixels }}). Forventet maksimalt antall er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Video-forholdet er for stort ({{ ratio }}). Tillatt maksimalt forhold er {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Videoforholdet er for lite ({{ ratio }}). Forventet minimumsforhold er {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videoen er kvadratisk ({{ width }}x{{ height }}px). Kvadratiske videoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videoen er i liggende format ({{ width }}x{{ height }} px). Liggende videoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videoen er i portrettformat ({{ width }}x{{ height }}px). Portrettvideoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videofilen er ødelagt.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videoen inneholder flere strømmer. Kun én strøm er tillatt.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Ikke støttet videokodek «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Ikke-støttet videokontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Bildefilen er ødelagt.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Bildet har for få piksler ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Bildet har for mange piksler ({{ pixels }}). Forventet maksimalt antall er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Dette filnavnet samsvarer ikke med forventet tegnsett.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ca" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Aquest valor hauria de ser fals.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Aquest valor hauria de ser cert.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Aquest valor hauria de ser del tipus {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Aquest valor hauria d'estar buit.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>El valor seleccionat no és una opció vàlida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Ha de seleccionar almenys {{ limit }} opció.|Ha de seleccionar almenys {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Ha de seleccionar com a màxim {{ limit }} opció.|Ha de seleccionar com a màxim {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Un o més dels valors facilitats són incorrectes.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Aquest camp no s'esperava.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Aquest camp està desaparegut.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Aquest valor no és una data vàlida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Aquest valor no és una data i hora vàlida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Aquest valor no és una adreça d'email vàlida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>No s'ha pogut trobar l'arxiu.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>No es pot llegir l'arxiu.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>L'arxiu és massa gran ({{ size }} {{ suffix }}). La grandària màxima permesa és {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>El tipus mime de l'arxiu no és vàlid ({{ type }}). Els tipus mime vàlids són {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Aquest valor hauria de ser {{ limit }} o menys.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Aquest valor és massa llarg. Hauria de tenir {{ limit }} caràcter o menys.|Aquest valor és massa llarg. Hauria de tenir {{ limit }} caràcters o menys.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Aquest valor hauria de ser {{ limit }} o més.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Aquest valor és massa curt. Hauria de tenir {{ limit }} caràcters o més.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Aquest valor no hauria d'estar buit.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Aquest valor no hauria de ser null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Aquest valor hauria de ser null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Aquest valor no és vàlid.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Aquest valor no és una hora vàlida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Aquest valor no és un URL vàlid.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Els dos valors haurien de ser iguals.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>L'arxiu és massa gran. La mida màxima permesa és {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>L'arxiu és massa gran.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No es pot pujar l'arxiu.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Aquest valor hauria de ser un nombre vàlid.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>L'arxiu no és una imatge vàlida.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Aquest valor no és una adreça IP vàlida.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Aquest valor no és un idioma vàlid.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Aquest valor no és una localització vàlida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Aquest valor no és un país vàlid.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Aquest valor ja s'ha utilitzat.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>No s'ha pogut determinar la grandària de la imatge.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>L'amplària de la imatge és massa gran ({{ width }}px). L'amplària màxima permesa és {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>L'amplària de la imatge és massa petita ({{ width }}px). L'amplària mínima requerida és {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altura de la imatge és massa gran ({{ height }}px). L'altura màxima permesa és {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altura de la imatge és massa petita ({{ height }}px). L'altura mínima requerida és {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Aquest valor hauria de ser la contrasenya actual de l'usuari.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Aquest valor hauria de tenir exactament {{ limit }} caràcter.|Aquest valor hauria de tenir exactament {{ limit }} caràcters.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>L'arxiu va ser només pujat parcialment.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Cap arxiu va ser pujat.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>No s'ha configurat cap carpeta temporal en php.ini, o la carpeta configurada no existeix.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>No es va poder escriure l'arxiu temporal en el disc.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Una extensió de PHP va fer que la pujada fallarà.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Aquesta col·lecció ha de contenir {{ limit }} element o més.|Aquesta col·lecció ha de contenir {{ limit }} elements o més.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Aquesta col·lecció ha de contenir {{ limit }} element o menys.|Aquesta col·lecció ha de contenir {{ limit }} elements o menys.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Aquesta col·lecció ha de contenir exactament {{ limit }} element.|Aquesta col·lecció ha de contenir exactament {{ limit }} elements.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de targeta invàlid.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipus de targeta no suportada o número de targeta invàlid.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Aquest valor no és un Número de Compte Bancari Internacional (IBAN) vàlid.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Aquest valor no és un ISBN-10 vàlid.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Aquest valor no és un ISBN-13 vàlid.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Aquest valor no és ni un ISBN-10 vàlid ni un ISBN-13 vàlid.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Aquest valor no és un ISSN vàlid.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Aquest valor no és una divisa vàlida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser més gran a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser major o igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser idèntic a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser menor a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser menor o igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Aquest valor no hauria de ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Aquest valor no hauria de ser idèntic a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>La proporció de la imatge és massa gran ({{ ratio }}). La màxima proporció permesa és {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>La proporció de la imatge és massa petita ({{ ratio }}). La mínima proporció permesa és {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>La imatge és quadrada({{ width }}x{{ height }}px). Les imatges quadrades no estan permeses.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>La imatge està orientada horitzontalment ({{ width }}x{{ height }}px). Les imatges orientades horitzontalment no estan permeses.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>La imatge està orientada verticalment ({{ width }}x{{ height }}px). Les imatges orientades verticalment no estan permeses.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>No està permès un fitxer buit.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>No s'ha pogut resoldre l'amfitrió.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Aquest valor no coincideix amb l'esperat {{ charset }} joc de caràcters.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Aquest valor no és un Codi d'identificació bancari (BIC) vàlid.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Error</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Aquest valor no és un UUID vàlid.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Aquest valor ha de ser múltiple de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Aquest Codi d'identificació bancari (BIC) no està associat amb l'IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Aquest valor hauria de ser un JSON vàlid.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Aquesta col·lecció només hauria de contenir elements únics.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Aquest valor hauria de ser positiu.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Aquest valor ha de ser positiu o zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Aquest valor ha de ser negatiu.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Aquest valor ha de ser negatiu o zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Aquest valor no és una zona horària vàlida.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Aquesta contrasenya s'ha filtrat en cas de violació de dades, no s'ha d'utilitzar. Utilitzeu una altra contrasenya.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Aquest valor ha d'estar entre {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Aquest valor no és un nom d'amfitrió vàlid.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>El nombre d'elements d'aquesta col·lecció ha de ser múltiple de {{compared_value}}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Aquest valor ha de satisfer almenys una de les restriccions següents:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Cada element d'aquesta col·lecció hauria de satisfer el seu propi conjunt de restriccions.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Aquest valor no és un número d'identificació de valors internacionals (ISIN) vàlid.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Aquest valor hauria de ser una expressió vàlida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Aquest valor no és un color CSS vàlid.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Aquest valor no és una notació CIDR vàlida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>El valor de la màscara de xarxa hauria d'estar entre {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>El nom del fitxer és massa llarg. Ha de tenir {{ filename_max_length }} caràcter o menys.|El nom del fitxer és massa llarg. Ha de tenir {{ filename_max_length }} caràcters o menys.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>La contrasenya és massa feble. Si us plau, feu servir una contrasenya més segura.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Aquest valor conté caràcters que no estan permisos segons el nivell de restricció actual.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>No es permet l'ús de caràcters invisibles.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>No es permet barrejar números de diferents scripts.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>No es permet l'ús de caràcters superposats ocults.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>L'extensió del fitxer no és vàlida ({{ extension }}). Les extensions permeses són {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>S'ha detectat que la codificació de caràcters no és vàlida ({{ detected }}). Les codificacions permeses són {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Aquest valor no és una adreça MAC vàlida.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Aquesta URL no conté un domini de primer nivell.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Aquest valor és massa curt. Ha de contenir almenys una paraula.|Aquest valor és massa curt. Ha de contenir almenys {{ min }} paraules.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Aquest valor és massa llarg. Ha de contenir una paraula.|Aquest valor és massa llarg. Ha de contenir {{ max }} paraules o menys.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Aquest valor no representa una setmana vàlida en el format ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Aquest valor no és una setmana vàlida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Aquest valor no ha de ser anterior a la setmana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Aquest valor no ha de ser posterior a la setmana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Aquest valor no és una plantilla Twig vàlida.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Aquest fitxer no és un vídeo vàlid.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>No s'ha pogut detectar la mida del vídeo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>L'amplada del vídeo és massa gran ({{ width }}px). L'amplada màxima permesa és {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>L'amplada del vídeo és massa petita ({{ width }}px). L'amplada mínima esperada és {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altura del vídeo és massa gran ({{ height }}px). L'altura màxima permesa és {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altura del vídeo és massa petita ({{ height }}px). L'altura mínima esperada és {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>El vídeo no té suficients píxels ({{ pixels }}). La quantitat mínima esperada és {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>El vídeo té massa píxels ({{ pixels }}). La quantitat màxima prevista és {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>La relació del vídeo és massa gran ({{ ratio }}). La relació màxima permesa és {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>La relació del vídeo és massa petita ({{ ratio }}). La relació mínima esperada és {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>El vídeo és quadrat ({{ width }}x{{ height }}px). No es permeten vídeos quadrats.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>El vídeo té orientació horitzontal ({{ width }}x{{ height }} px). No es permeten vídeos horitzontals.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>El vídeo és en orientació vertical ({{ width }}x{{ height }} px). No es permeten vídeos en orientació vertical.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>El fitxer de vídeo està espatllat.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>El vídeo conté diversos fluxos. Només es permet un sol flux.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Còdec de vídeo incompatible «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Contenidor de vídeo incompatible "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>El fitxer d'imatge està espatllat.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>La imatge no té suficients píxels ({{ pixels }}). La quantitat mínima esperada és {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>La imatge té massa píxels ({{ pixels }}). El nombre màxim esperat és {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Aquest nom de fitxer no coincideix amb el charset esperat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="id" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Nilai ini harus bernilai salah.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Nilai ini harus bernilai benar.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Nilai ini harus bertipe {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Nilai ini harus kosong.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Nilai yang dipilih tidak tepat.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Anda harus memilih paling tidak {{ limit }} pilihan.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Anda harus memilih paling banyak {{ limit }} pilihan.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Satu atau lebih nilai yang diberikan tidak sah.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ruas ini tidak diharapkan.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ruas ini hilang.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Nilai ini bukan merupakan tanggal yang sah.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Nilai ini bukan merupakan tanggal dan waktu yang sah.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Nilai ini bukan alamat surel yang sah.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Berkas tidak dapat ditemukan.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Berkas tidak dapat dibaca.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ukuran berkas terlalu besar ({{ size }} {{ suffix }}). Ukuran maksimum yang diizinkan adalah {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Jenis berkas ({{ type }}) tidak sah. Jenis berkas yang diizinkan adalah {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Nilai ini harus {{ limit }} atau kurang.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Nilai ini terlalu panjang. Seharusnya {{ limit }} karakter atau kurang.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Nilai ini harus {{ limit }} atau lebih.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Nilai ini terlalu pendek. Seharusnya {{ limit }} karakter atau lebih.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Nilai ini tidak boleh kosong.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Nilai ini tidak boleh 'null'.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Nilai ini harus 'null'.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Nilai ini tidak sah.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Nilai ini bukan merupakan waktu yang sah.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Nilai ini bukan URL yang sah.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Isi keduanya harus sama.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ukuran berkas terlalu besar. Ukuran maksimum yang diizinkan adalah {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ukuran berkas terlalu besar.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Berkas tidak dapat diunggah.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Nilai ini harus angka yang sah.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Berkas ini tidak termasuk citra.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Nilai ini bukan alamat IP yang valid.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Nilai ini bukan bahasa yang sah.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Nilai ini bukan lokal yang sah.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Nilai ini bukan negara yang sah.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Nilai ini sudah digunakan.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Ukuran dari citra tidak bisa dideteksi.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lebar citra terlalu besar ({{ width }}px). Ukuran lebar maksimum adalah {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lebar citra terlalu kecil ({{ width }}px). Ukuran lebar minimum yang diharapkan adalah {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Tinggi citra terlalu besar ({{ height }}px). Ukuran tinggi maksimum adalah {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Tinggi citra terlalu kecil ({{ height }}px). Ukuran tinggi minimum yang diharapkan adalah {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Nilai ini harus kata sandi pengguna saat ini.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Nilai ini harus memiliki tepat {{ limit }} karakter.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Berkas hanya terunggah sebagian.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tidak ada berkas terunggah.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Tidak ada folder sementara yang dikonfigurasi di php.ini, atau folder yang dikonfigurasi tidak ada.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Tidak dapat menuliskan berkas sementara ke dalam media penyimpanan.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Sebuah ekstensi PHP menyebabkan kegagalan unggah.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Kumpulan ini harus memiliki {{ limit }} elemen atau lebih.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Kumpulan ini harus memiliki kurang dari {{ limit }} elemen.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Kumpulan ini harus memiliki tepat {{ limit }} elemen.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nomor kartu tidak sah.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Jenis kartu tidak didukung atau nomor kartu tidak sah.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Nilai ini bukan Nomor Rekening Bank Internasional (IBAN) yang valid.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Nilai ini bukan ISBN-10 yang sah.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Nilai ini bukan ISBN-13 yang sah.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Nilai ini bukan ISBN-10 maupun ISBN-13 yang sah.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Nilai ini bukan ISSN yang sah.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Nilai ini bukan mata uang yang sah.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Nilai ini seharusnya lebih dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya lebih dari atau sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Nilai ini seharusnya identik dengan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Nilai ini seharusnya kurang dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya kurang dari atau sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya tidak sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Nilai ini seharusnya tidak identik dengan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Rasio citra terlalu besar ({{ ratio }}). Rasio maksimum yang diizinkan adalah {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Rasio citra terlalu kecil ({{ ratio }}). Rasio minimum yang diharapkan adalah {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Citra persegi ({{ width }}x{{ height }}px). Citra persegi tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Citra berorientasi lanskap ({{ width }}x{{ height }}px). Citra berorientasi lanskap tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Citra berorientasi potret ({{ width }}x{{ height }}px). Citra berorientasi potret tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Berkas kosong tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Host tidak dapat diselesaikan.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Nilai ini tidak memenuhi set karakter {{ charset }} yang diharapkan.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Nilai ini bukan Kode Identifikasi Bisnis (BIC) yang valid.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Galat</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Nilai ini bukan UUID yang valid.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Nilai ini harus kelipatan dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Business Identifier Code (BIC) ini tidak terkait dengan IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Nilai ini harus berisi JSON yang sah.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Kumpulan ini harus mengandung elemen yang unik.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Nilai ini harus positif.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Nilai ini harus positif atau nol.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Nilai ini harus negatif.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Nilai ini harus negatif atau nol.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Nilai ini harus merupakan zona waktu yang sah.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Kata sandi ini telah bocor di data breach, harus tidak digunakan kembali. Silahkan gunakan kata sandi yang lain.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Nilai ini harus berada diantara {{ min }} dan {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Nilai ini bukan merupakan hostname yang sah.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Angka dari setiap elemen di dalam kumpulan ini harus kelipatan dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Nilai ini harus memenuhi setidaknya satu dari batasan berikut:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Setiap elemen koleksi ini harus memenuhi batasannya sendiri.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Nilai ini bukan merupakan International Securities Identification Number (ISIN) yang sah.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Nilai ini harus berupa ekspresi yang sah.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Nilai ini bukan merupakan warna CSS yang sah.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Nilai ini bukan merupakan notasi CIDR yang sah.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Nilai dari netmask harus berada diantara {{ min }} dan {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Nama file terlalu panjang. Harusnya {{ filename_max_length }} karakter atau kurang.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Kata sandi terlalu lemah. Harap gunakan kata sandi yang lebih kuat.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Nilai ini mengandung karakter yang tidak diizinkan oleh tingkat pembatasan saat ini.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Penggunaan karakter tak terlihat tidak diperbolehkan.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Menggabungkan angka-angka dari skrip yang berbeda tidak diperbolehkan.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Penggunaan karakter overlay yang tersembunyi tidak diperbolehkan.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Ekstensi file tidak valid ({{ extension }}). Ekstensi yang diperbolehkan adalah {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Pengkodean karakter yang terdeteksi tidak valid ({{ detected }}). Pengkodean yang diperbolehkan adalah {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Nilai ini bukan alamat MAC yang valid.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>URL ini tidak memiliki domain tingkat atas.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Nilai ini terlalu pendek. Seharusnya berisi setidaknya satu kata.|Nilai ini terlalu pendek. Seharusnya berisi setidaknya {{ min }} kata.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Nilai ini terlalu panjang. Seharusnya hanya berisi satu kata.|Nilai ini terlalu panjang. Seharusnya berisi {{ max }} kata atau kurang.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Nilai ini tidak mewakili minggu yang valid dalam format ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Nilai ini bukan minggu yang valid.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Nilai ini tidak boleh sebelum minggu "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Nilai ini tidak boleh setelah minggu "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Nilai ini bukan templat Twig yang valid.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Berkas ini bukan video yang valid.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Ukuran video tidak dapat dideteksi.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lebar video terlalu besar ({{ width }}px). Lebar maksimum yang diizinkan adalah {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lebar video terlalu kecil ({{ width }}px). Lebar minimum yang diharapkan adalah {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Tinggi video terlalu besar ({{ height }}px). Tinggi maksimum yang diizinkan adalah {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Tinggi video terlalu kecil ({{ height }}px). Tinggi minimum yang diharapkan adalah {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Video memiliki terlalu sedikit piksel ({{ pixels }}). Jumlah minimum yang diharapkan adalah {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Video memiliki terlalu banyak piksel ({{ pixels }}). Jumlah maksimum yang diharapkan adalah {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Rasio video terlalu besar ({{ ratio }}). Rasio maksimum yang diizinkan adalah {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Rasio video terlalu kecil ({{ ratio }}). Rasio minimum yang diharapkan adalah {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video berbentuk persegi ({{ width }}x{{ height }}px). Video persegi tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video berorientasi lanskap ({{ width }}x{{ height }}px). Video berorientasi lanskap tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video berorientasi potret ({{ width }}x{{ height }}px). Video berorientasi potret tidak diizinkan.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Berkas video rusak.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Video berisi beberapa aliran. Hanya satu aliran yang diizinkan.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Kodek video tidak didukung "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Kontainer video tidak didukung "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Berkas gambar rusak.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Gambar memiliki terlalu sedikit piksel ({{ pixels }}). Jumlah minimum yang diharapkan adalah {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Gambar memiliki terlalu banyak piksel ({{ pixels }}). Jumlah maksimum yang diharapkan adalah {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Nama berkas ini tidak sesuai dengan set karakter yang diharapkan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="eu" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Balio hau faltsua izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Balio hau egia izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Balio hau {{ type }} motakoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Balio hau hutsik egon beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Hautatu duzun balioa ez da aukera egoki bat.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Gutxienez aukera {{ limit }} hautatu behar duzu.|Gutxienez {{ limit }} aukera hautatu behar dituzu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Gehienez aukera {{ limit }} hautatu behar duzu.|Gehienez {{ limit }} aukera hautatu behar dituzu.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Emandako balioetatik gutxienez bat ez da egokia.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Eremu hau ez zen espero.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Eremu hau falta da.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Balio hau ez da data egoki bat.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Balio hau ez da data-ordu egoki bat.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Balio hau ez da posta elektroniko egoki bat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ezin izan da fitxategia aurkitu.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fitxategia ez da irakurgarria.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fitxategia handiegia da ({{ size }} {{ suffix }}). Baimendutako tamaina handiena {{ limit }} {{ suffix }} da.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Fitxategiaren mime mota ez da egokia ({{ type }}). Hauek dira baimendutako mime motak: {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Balio hau gehienez {{ limit }} izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Balio hau luzeegia da. Gehienez karaktere {{ limit }} eduki beharko luke.|Balio hau luzeegia da. Gehienez {{ limit }} karaktere eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Balio hau gutxienez {{ limit }} izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Balio hau motzegia da. Karaktere {{ limit }} gutxienez eduki beharko luke.|Balio hau motzegia da. Gutxienez {{ limit }} karaktere eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Balio hau ez litzateke hutsik egon behar.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Balio hau ez litzateke nulua izan behar.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Balio hau nulua izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Balio hau ez da egokia.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Balio hau ez da ordu egoki bat.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Balio hau ez da baliabideen kokatzaile uniforme (URL) egoki bat.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Bi balioak berdinak izan beharko lirateke.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fitxategia handiegia da. Baimendutako tamaina handiena {{ limit }} {{ suffix }} da.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fitxategia handiegia da.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ezin izan da fitxategia igo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Balio hau zenbaki egoki bat izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fitxategi hau ez da irudi egoki bat.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Balio hau ez da IP helbide baliozko bat.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Balio hau ez da hizkuntza egoki bat.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Balio hau ez da kokapen egoki bat.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Balio hau ez da herrialde egoki bat.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Balio hau jadanik erabilia izan da.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Ezin izan da irudiaren tamaina detektatu.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Irudiaren zabalera handiegia da ({{ width }}px). Onartutako gehienezko zabalera {{ max_width }}px dira.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Irudiaren zabalera txikiegia da ({{ width }}px). Onartutako gutxieneko zabalera {{ min_width }}px dira.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Irudiaren altuera handiegia da ({{ height }}px). Onartutako gehienezko altuera {{ max_height }}px dira.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Irudiaren altuera txikiegia da ({{ height }}px). Onartutako gutxieneko altuera {{ min_height }}px dira.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Balio hau uneko erabiltzailearen pasahitza izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Balio honek zehazki karaktere {{ limit }} izan beharko luke.|Balio honek zehazki {{ limit }} karaktere izan beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fitxategiaren zati bat bakarrik igo da.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ez da fitxategirik igo.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Ez da aldi baterako karpetarik konfiguratu php.ini-n, edo konfiguratutako karpeta ez da existitzen.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ezin izan da aldi baterako fitxategia diskoan idatzi.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP luzapen batek igoeraren hutsa eragin du.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Bilduma honek gutxienez elementu {{ limit }} eduki beharko luke.|Bilduma honek gutxienez {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Bilduma honek gehienez elementu {{ limit }} eduki beharko luke.|Bilduma honek gehienez {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Bilduma honek zehazki elementu {{ limit }} eduki beharko luke.|Bilduma honek zehazki {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Txartel zenbaki baliogabea.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Txartel mota onartezina edo txartel zenbaki baliogabea.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Balio hau ez da Nazioarteko Banku Kontu Zenbaki (IBAN) baliozko bat.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Balio hau ez da onartutako ISBN-10 bat.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Balio hau ez da onartutako ISBN-13 bat.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Balio hau ez da onartutako ISBN-10 edo ISBN-13 bat.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Balio hau ez da onartutako ISSN bat.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Balio hau ez da baliozko moneta bat.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berbera izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }} baino handiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berdina edota handiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value_type }} {{ compared_value }}-(r)en berbera izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }} baino txikiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berdina edota txikiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Balio hau ez litzateke {{ compared_value }}-(r)en berdina izan behar.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Balio hau ez litzateke {{ compared_value_type }} {{ compared_value }}-(r)en berbera izan behar.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Irudiaren proportzioa oso handia da ({{ ratio }}). Onartutako proportzio handienda {{ max_ratio }} da.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Irudiaren proportzioa oso txikia da ({{ ratio }}). Onartutako proportzio txikiena {{ min_ratio }} da.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Irudia karratua da ({{ width }}x{{ height }}px). Karratuak diren irudiak ez dira onartzen.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Irudia horizontalki bideratua dago ({{ width }}x{{ height }}px). Horizontalki bideratutako irudiak ez dira onartzen.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Irudia bertikalki bideratua dago ({{ width }}x{{ height }}px). Bertikalki bideratutako irudiak ez dira onartzen.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Hutsik dagoen fitxategia ez da onartzen.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Host-a ezin da ebatzi.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Balio honen karaktere kodea ez da esperotakoa {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Balio hau ez da Negozioaren Identifikazio Kode (BIC) baliozko bat.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Errore</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Balio hau ez da UUID baliozko bat.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Balio honek {{ compared_value }}-ren multiploa izan beharko luke.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Banku Identifikazioko Kode hau ez dago lotuta {{ IBAN }} IBAN-rekin.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Balio honek baliozko JSON bat izan behar luke.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Bilduma honek elementu bakarrak soilik izan beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Balio honek positiboa izan beharko luke.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Balio honek positiboa edo zero izan behar luke.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Balio honek negatiboa izan behar luke.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Balio honek negatiboa edo zero izan behar luke.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Balio hori ez da baliozko ordu-eremua.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Pasahitz hori ezin da erabili, beste gune eta aplikazio batzuetako segurtasun-akatsei esker lortutako pasahitz publikoen zerrendan sartuta dagoelako. Mesedez, erabili beste pasahitz bat.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Balio honek {{ min }} eta {{ max }} artean egon behar luke.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Balio hori ez da ostalari-izen onargarria.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Bilduma honetako elementu-kopuruak {{ compared_value }}-ren multiploa izan behar luke.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Balio honek, gutxienez, murrizketa hauetako bat bete behar du:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Bilduma honetako elementu bakoitzak bere murriztapen-multzoa bete behar du.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Balio hori ez da baliozko baloreen nazioarteko identifikazio-zenbaki bat (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Balio hori baliozko adierazpena izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Balio hori ez da baliozko CSS kolorea.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Balio hori ez da baliozko CIDR notazioa.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Maskararen balioa {{ min }} eta {{ max }} artekoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Fitxategiaren izena luzeegia da. Karaktere {{ filename_max_length }} edo gutxiago izan beharko lituzke.|Fitxategiaren izena luzeegia da. {{ filename_max_length }} karaktere edo gutxiago izan beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Pasahitzaren sendotasuna baxuegia da. Mesedez, erabili pasahitz seguruagoa.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Egungo murrizte-mailak ez du balio honek dituen karaktereak onartzen.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Ez da onartzen karaktere ikusezinak erabiltzea.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Ez da onartzen script ezberdinetako zenbakiak nahastea</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Ez da onartzen karaktere gainjarri ezkutuen erabilera.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Fitxategiaren luzapena ez da zuzena ({{ extension }}). Baimendutako luzapenak hauek dira: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Detektatutako karaktere-kodetzea ez da zuzena ({{ detected }}). Baimendutako kodetzeak hauek dira: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Balio hau ez da MAC helbide baliozko bat.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">URL honek ez du goi-mailako domeinurik.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Balio hau oso laburra da. Gutxienez hitz bat izan behar du.|Balio hau oso laburra da. Gutxienez {{ min }} hitz izan behar ditu.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Balio hau oso luzea da. Hitz bat bakarrik izan behar du.|Balio hau oso luzea da. {{ max }} hitz edo gutxiago izan behar ditu.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Balio honek ez du ISO 8601 formatuan aste baliozko bat adierazten.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Balio hau ez da aste balioduna.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Balio hau ez luke aste "{{ min }}" baino lehenagokoa izan behar.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Balio hau ez luke astearen "{{ max }}" ondoren egon behar.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Balio hau ez da Twig txantiloi baliozko bat.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Fitxategi hau ez da baliozko bideo bat.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Ezin izan da bideoaren tamaina detektatu.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Bideoaren zabalera handiegia da ({{ width }}px). Baimendutako gehieneko zabalera {{ max_width }}px da.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Bideoaren zabalera txikiegia da ({{ width }}px). Gutxieneko espero den zabalera {{ min_width }}px da.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Bideoaren altuera handiegia da ({{ height }}px). Onartutako gehienezko altuera {{ max_height }}px da.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Bideoaren altuera txikiegia da ({{ height }}px). Espero den gutxieneko altuera {{ min_height }}px da.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Bideoak pixel gutiegi ditu ({{ pixels }}). Gutxieneko espero den kopurua {{ min_pixels }} da.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Bideoak pixel gehiegi ditu ({{ pixels }}). Espero den gehieneko kopurua {{ max_pixels }} da.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Bideoaren erlazioa handiegia da ({{ ratio }}). Onartutako gehieneko erlazioa {{ max_ratio }} da.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Bideoaren erlazioa txikiegia da ({{ ratio }}). Espero den gutxieneko erlazioa {{ min_ratio }} da.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Bideoa karratua da ({{ width }}x{{ height }}px). Bideo karratuak ez dira onartzen.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Bideoa paisaia orientazioan dago ({{ width }}x{{ height }} px). Paisaia-orientazioko bideoak ez daude baimenduta.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Bideoa bertikal orientatuta dago ({{ width }}x{{ height }} px). Orientazio bertikaleko bideoak ez dira onartzen.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Bideo fitxategia hondatuta dago.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Bideoak korronte anitz ditu. Korronte bakarra onartzen da.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Bideo kodek onartugabea "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Onartzen ez den bideo edukiontzia "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Irudi fitxategia hondatuta dago.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Irudiak pixelen kopuru gutiegi du ({{ pixels }}). Espero den gutxienekoa {{ min_pixels }} da.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Irudiak pixel gehiegi ditu ({{ pixels }}). Espero den gehienezko kopurua {{ max_pixels }} da.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Fitxategi-izen honek ez du espero zen karaktere multzoarekin bat egiten.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="es" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor debería ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor debería ser verdadero.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor debería ser de tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor debería estar vacío.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>El valor seleccionado no es una opción válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Debe seleccionar al menos {{ limit }} opción.|Debe seleccionar al menos {{ limit }} opciones.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Debe seleccionar como máximo {{ limit }} opción.|Debe seleccionar como máximo {{ limit }} opciones.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Uno o más de los valores indicados no son válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Este campo no se esperaba.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Este campo falta.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor no es una fecha válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor no es una fecha y hora válida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor no es una dirección de email válida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>No se pudo encontrar el archivo.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>No se puede leer el archivo.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>El archivo es demasiado grande ({{ size }} {{ suffix }}). El tamaño máximo permitido es {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>El tipo mime del archivo no es válido ({{ type }}). Los tipos mime válidos son {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor debería ser {{ limit }} o menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor es demasiado largo. Debería tener {{ limit }} carácter o menos.|Este valor es demasiado largo. Debería tener {{ limit }} caracteres o menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor debería ser {{ limit }} o más.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor es demasiado corto. Debería tener {{ limit }} carácter o más.|Este valor es demasiado corto. Debería tener {{ limit }} caracteres o más.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor no debería estar vacío.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor no debería ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor debería ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor no es válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor no es una hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor no es una URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Los dos valores deberían ser iguales.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>El archivo es demasiado grande. El tamaño máximo permitido es {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>El archivo es demasiado grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No se pudo subir el archivo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor debería ser un número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>El archivo no es una imagen válida.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Este valor no es una dirección IP válida.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor no es un idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor no es una localización válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor no es un país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor ya se ha utilizado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>No se pudo determinar el tamaño de la imagen.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>El ancho de la imagen es demasiado grande ({{ width }}px). El ancho máximo permitido es de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>El ancho de la imagen es demasiado pequeño ({{ width }}px). El ancho mínimo requerido es {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>La altura de la imagen es demasiado grande ({{ height }}px). La altura máxima permitida es de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>La altura de la imagen es demasiado pequeña ({{ height }}px). La altura mínima requerida es de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Este valor debería ser la contraseña actual del usuario.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor debería tener exactamente {{ limit }} carácter.|Este valor debería tener exactamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>El archivo se cargó solo parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>No se subió ningún archivo.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ninguna carpeta temporal fue configurada en php.ini o la carpeta configurada no existe.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>No se pudo escribir el archivo temporal en el disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Una extensión de PHP provocó que la carga fallara.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta colección debe contener {{ limit }} elemento o más.|Esta colección debe contener {{ limit }} elementos o más.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta colección debe contener {{ limit }} elemento o menos.|Esta colección debe contener {{ limit }} elementos o menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta colección debe contener exactamente {{ limit }} elemento.|Esta colección debe contener exactamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de tarjeta inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de tarjeta no soportado o número de tarjeta inválido.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Este valor no es un Número de Cuenta Bancaria Internacional (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor no es un ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor no es un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor no es ni un ISBN-10 válido ni un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor no es un ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este valor no es una divisa válida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor debería ser mayor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser mayor o igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor debería ser idéntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor debería ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser menor o igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser distinto de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor no debería ser idéntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>La proporción de la imagen es demasiado grande ({{ ratio }}). La máxima proporción permitida es {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>La proporción de la imagen es demasiado pequeña ({{ ratio }}). La mínima proporción permitida es {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>La imagen es cuadrada ({{ width }}x{{ height }}px). Las imágenes cuadradas no están permitidas.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>La imagen está orientada horizontalmente ({{ width }}x{{ height }}px). Las imágenes orientadas horizontalmente no están permitidas.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>La imagen está orientada verticalmente ({{ width }}x{{ height }}px). Las imágenes orientadas verticalmente no están permitidas.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>No se permite un archivo vacío.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>No se puede resolver el host.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>La codificación de caracteres para este valor debería ser {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Este valor no es un Código de Identificación de Negocios (BIC) válido.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Error</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Este valor no es un UUID válido.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Este valor debería ser múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Este Código de Identificación Bancaria (BIC) no está asociado con el IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Este valor debería ser un JSON válido.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Esta colección debería tener exclusivamente elementos únicos.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Este valor debería ser positivo.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Este valor debería ser positivo o igual a cero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Este valor debería ser negativo.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Este valor debería ser negativo o igual a cero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Este valor no es una zona horaria válida.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Esta contraseña no se puede utilizar porque está incluida en un listado de contraseñas públicas obtenido gracias a fallos de seguridad de otros sitios y aplicaciones. Por favor, utilice otra contraseña.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Este valor debería estar entre {{ min }} y {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Este valor no es un nombre de host válido.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>El número de elementos en esta colección debería ser múltiplo de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Este valor debería satisfacer al menos una de las siguientes restricciones:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Cada elemento de esta colección debería satisfacer su propio conjunto de restricciones.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Este valor no es un número de identificación internacional de valores (ISIN) válido.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Este valor debería ser una expresión válida.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Este valor no es un color CSS válido.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Este valor no es una notación CIDR válida.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>El valor de la máscara de red debería estar entre {{ min }} y {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>El nombre del archivo es demasiado largo. Debe tener {{ filename_max_length }} carácter o menos.|El nombre del archivo es demasiado largo. Debe tener {{ filename_max_length }} caracteres o menos.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>La seguridad de la contraseña es demasiado baja. Por favor, utilice una contraseña más segura.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Este valor contiene caracteres que no están permitidos según el nivel de restricción actual.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>No se permite el uso de caracteres invisibles.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>No está permitido mezclar números de diferentes scripts.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>No está permitido el uso de caracteres superpuestos ocultos.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>La extensión del archivo no es válida ({{ extension }}). Las extensiones permitidas son {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>La codificación de los caracteres detectada es inválida ({{ detected }}). Las codificaciones permitidas son {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Este valor no es una dirección MAC válida.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Esta URL no contiene una extensión de dominio (TLD).</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Este valor es demasiado corto. Debe contener al menos una palabra.|Este valor es demasiado corto. Debe contener al menos {{ min }} palabras.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Este valor es demasiado largo. Debe contener una palabra.|Este valor es demasiado largo. Debe contener {{ max }} palabras o menos.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Este valor no representa una semana válida en formato ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Este valor no es una semana válida.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Este valor no debe ser anterior a la semana "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Este valor no debe ser posterior a la semana "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Este valor no es una plantilla Twig válida.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Este archivo no es un video válido.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">No se pudo detectar el tamaño del video.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">El ancho del vídeo es demasiado grande ({{ width }}px). El ancho máximo permitido es {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">El ancho del video es demasiado pequeño ({{ width }}px). El ancho mínimo esperado es {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">La altura del video es demasiado grande ({{ height }}px). La altura máxima permitida es {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">La altura del video es demasiado pequeña ({{ height }}px). La altura mínima esperada es {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">El vídeo tiene muy pocos píxeles ({{ pixels }}). La cantidad mínima esperada es {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">El vídeo tiene demasiados píxeles ({{ pixels }}). La cantidad máxima esperada es {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">La relación del video es demasiado grande ({{ ratio }}). La relación máxima permitida es {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">La relación del video es demasiado pequeña ({{ ratio }}). La relación mínima esperada es {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">El video es cuadrado ({{ width }}x{{ height }}px). No se permiten videos cuadrados.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">El video tiene orientación horizontal ({{ width }}x{{ height }} px). No se permiten videos en formato horizontal.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">El video tiene orientación vertical ({{ width }}x{{ height }} px). No se permiten videos en orientación vertical.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">El archivo de video está dañado.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">El video contiene múltiples flujos. Solo se permite un flujo.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Códec de vídeo no compatible «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Contenedor de vídeo no compatible "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">El archivo de imagen está dañado.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">La imagen tiene muy pocos píxeles ({{ pixels }}). La cantidad mínima esperada es {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">La imagen tiene demasiados píxeles ({{ pixels }}). La cantidad máxima esperada es {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Este nombre de archivo no coincide con el conjunto de caracteres esperado.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="uz" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Qiymat false bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Qiymat true bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Qiymat turi {{ type }} bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Qiymat bo'sh bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Tanlangan qiymat yaroqli emas.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Siz hech bo'lmaganda {{ limit }} ta qiymat tanlashingiz kerak.|Siz kamida {{ limit }} ta qiymat tanlashingiz kerak.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Siz {{ limit }} ta qiymatni tanlashingiz kerak.|Siz {{ limit }} dan ortiq qiymat tanlashingiz kerak.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Belgilangan qiymatlarning bir yoki bir nechtasi yaroqsiz.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ushbu maydon kutilmagan edi.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Bu maydon majvud emas.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ushbu sana noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Sana va vaqt qiymati noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Elektron pochta manzili noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fayl topilmadi.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Faylni o'qib bo'lmadi.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fayl hajmi katta ({{ size }} {{ suffix }}). Maksimal ruxsat etilgan hajim {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Faylning MIME turi noto'g'ri ({{ type }}). Ruxsat etilgan MIME turlar {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Qiymat {{ limit }} ga teng yoki kam bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Qiymat juda uzun. {{ limit }} ga teng yoki kam bo'lishi kerak.|Qiymat juda uzun. {{ limit }} yoki undan kam belgidan iborat bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Qiymat {{ limit }} yoki undan ortiq bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Qiymat juda qisqa. {{ limit }} ta yoki undan ortiq belgidan iborat bo'lishi kerak.|Qiymat juda qisqa. {{ limit }} yoki undan ko'p belgidan iborat bo'lishi kerak</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Qiymatni bo'sh kirtish mumkin emas.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Qiymat null bo'lmasligi kerak.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Qiymat null bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Qiymat noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Vaqt noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>URL noto'g'ri</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Ikkala qiymat ham bir xil bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fayl hajmi katta. Maksimal ruxsat berilgan hajim {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fayl hajmi katta.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Faylni yuklab bo'lmadi.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Qiymat raqam bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fayl yaroqli rasm formati emas.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy IP manzil emas.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Noto'g'ri til.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ushbu qiymat mahalliy qiymat emas.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Mamlakat qiymati noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ushbu qiymat allaqachon ishlatilgan.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Rasm o'lchamini aniqlab bo'lmadi.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Rasm kengligi juda katta ({{ width }}px). Maksimal ruxsat etilgan kenglik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Rasm kengligi juda kichkina ({{ width }}px). Minimal ruxsat etilgan kenglik {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Rasm bo'yi juda katta ({{ height }}px). Maksimal ruxsat etilgan balandlik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Rasm bo'yi juda kichkina ({{ height }}px). Minimal ruxsat etilgan balandlik {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Qiymat joriy foydalanuvchi paroli bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Qiymat {{ limit }} ta belgidan iborat bo'lishi kerak.|Qiymat {{ limit }} belgidan iborat bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fayl faqat qisman yuklangan.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Fayl yuklanmagan.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">php.ini da vaqtinchalik katalog sozlanmagan, yoki sozlangan katalog mavjud emas.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Diskka vaqtinchalik faylni yozib bo'lmadi.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP kengaytmasi yuklash paytida xatolik yuz berdi.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ushbu to'plam {{ limit }} ta yoki undan ko'p narsalarni o'z ichiga olishi kerak.|Ushbu to'plam {{ limit }} yoki undan ortiq narsalarni o'z ichiga olishi kerak.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ushbu to'plam {{ limit }} ta yoki undan kam narsalarni o'z ichiga olishi kerak.|Ushbu to'plamda {{ limit }} yoki undan kam element bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ushbu to'plam to'liq {{ limit }} narsani o'z ichiga olishi kerak.|Ushbu to'plamda to'liq {{ limit }} ta ma'lumotlar bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Kata raqami noto'g'ri.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Qo'llab-quvvatlanmaydigan karta turi yoki yaroqsiz karta raqami.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy Xalqaro Bank Hisob Raqami (IBAN) emas.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Qiymat to'g'ri ISBN-10 formatida emas.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Qiymat to'g'ri ISBN-13 formatida emas.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Qiymat ISBN-10 va ISBN-13 formatlariga mos kelmaydi.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Qiymat ISSN formatiga mos kelmaydi.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Noto'g'ri valyuta formati.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} ga teng bo'lishi shart.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} dan katta bo'lishi shart.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} dan katta yoki teng bo'lishi shart.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значение должно быть идентичным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Qiymat bir xil bo'lishi kerak {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} dan kichik yoki teng bo'lishi shart.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} ga teng bo'lmasligi kerak.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Qiymat bir xil bo'lishi kerak emas {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Rasmning tomonlari nisbati juda katta ({{ ratio }}). Maksimal tomonlar nisbati {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Rasmning format nisbati juda kichik ({{ ratio }}). Minimal tomonlar nisbati {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Rasm kvadrat shaklida ({{ width }}x{{ height }}px). Kvadrat shaklida tasvirlarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Landshaft tasvir ({{ width }}x{{ height }}px). Landshaft rasmlarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Portret rasm ({{ width }}x{{ height }}px). Portretlarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Bo'sh fayllarga ruxsat berilmagan.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Xost nomini nomiga ruxsat berilmagan.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Qiymat kutilgan {{ charset }} kodlashiga mos kelmaydi.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy Biznes Identifikatsiya Kodi (BIC) emas.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Xatolik</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy UUID emas.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Qiymat {{ compared_value }} ning ko'paytmasi bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ushbu BIC IBAN {{ iban }} bilan bog'liq emas..</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Qiymat to'g'ri JSON bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ushbu kolleksiyada takroriy elementlar bo'lmasligi kerak.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Qiymat musbat bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Qiymat musbat yoki 0 ga teng bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Qiymat manfiy bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Qiymat manfiy yoki 0 ga teng bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Qiymat to'g'ri vaqt zonasi emas.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ushbu parol ma'lumotlarning tarqalishi tufayli buzilgan va uni ishlatmaslik kerak. Boshqa paroldan foydalaning.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Qiymat {{ min }} va {{ max }} oralig'ida bo'lishi shart.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Qiymat to'g'ri xost nomi emas.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Ushbu to'plamdagi narsalar soni {{ compared_value }} dan ko'p bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Qiymat quyidagi cheklovlardan kamida bittasiga javob berishi kerak:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Ushbu to'plamdagi har bir narsa o'ziga xos cheklovlarni qondirishi kerak.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Qiymat Qimmatli qog'ozlarning xalqaro identifikatsiya raqami (ISIN) ga mos emas.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ushbu qiymat to'g'ri ifoda bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Bu qiymat haqiqiy CSS rangi emas.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Qiymat CIDR belgisiga mos kelmaydi.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Tarmoq niqobining qiymati {{ min }} va {{ max }} oralig'ida bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Fayl nomi juda uzun. U {{ filename_max_length }} belgidan iborat boʻlishi kerak.|Fayl nomi juda uzun. U {{ filename_max_length }} ta belgidan iborat boʻlishi kerak.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Parol kuchi juda past. Iltimos, kuchliroq paroldan foydalaning.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Bu qiymat joriy cheklov darajasida ruxsat etilmagan belgilarni o'z ichiga oladi.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Ko'rinmas belgilardan foydalanish taqiqlangan.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Turli skriptlardagi raqamlarni aralashtirish taqiqlangan.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Yashirin qoplamali belgilardan foydalanish taqiqlangan.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Fayl kengaytmasi yaroqsiz ({{ extension }}). Ruxsat berilgan kengaytmalar {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Aniqlangan belgi kodlamasi yaroqsiz ({{ detected }}). Ruxsat etilgan kodlamalar {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy MAC manzil emas.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Bu URL yuqori darajali domenni o'z ichiga olmaydi.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Bu qiymat juda qisqa. U kamida bitta so'z bo'lishi kerak.|Bu qiymat juda qisqa. U kamida {{ min }} so'z bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Bu qiymat juda uzun. U faqat bitta so'z bo'lishi kerak.|Bu qiymat juda uzun. U {{ max }} so'z yoki undan kam bo'lishi kerak.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Bu qiymat ISO 8601 formatida haqiqiy haftaga mos kelmaydi.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Bu qiymat haqiqiy hafta emas.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Bu qiymat "{{ min }}" haftadan oldin bo'lmasligi kerak.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Bu qiymat "{{ max }}" haftadan keyin bo'lmasligi kerak.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Bu qiymat yaroqli Twig shabloni emas.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ushbu fayl yaroqli video emas.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Videoning hajmini aniqlab bo‘lmadi.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Video kengligi juda katta ({{ width }}px). Ruxsat etilgan maksimal kenglik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Video kengligi juda kichik ({{ width }}px). Kutilayotgan minimal kenglik {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Video balandligi juda katta ({{ height }}px). Ruxsat etilgan maksimal balandlik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Video balandligi juda kichik ({{ height }}px). Kutilayotgan minimal balandlik {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoda piksellar soni juda kam ({{ pixels }}). Kutilgan minimal miqdor {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoda juda ko‘p piksellar bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Video nisbati juda katta ({{ ratio }}). Ruxsat etilgan maksimal nisbat {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Video nisbati juda kichik ({{ ratio }}). Kutilayotgan minimal nisbat {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video kvadrat ({{ width }}x{{ height }}px). Kvadrat videolarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video gorizontal yo‘nalishda ({{ width }}x{{ height }} px). Gorizontal videolarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video portret yoʻnalishda ({{ width }}x{{ height }}px). Portret yoʻnalishidagi videolarga ruxsat berilmaydi.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Video fayli buzilgan.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Videoda bir nechta oqim mavjud. Faqat bitta oqimga ruxsat beriladi.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Qo‘llab-quvvatlanmaydigan video kodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Qo'llab-quvvatlanmaydigan video konteyner "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Rasm fayli buzilgan.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Tasvirda piksellar juda kam ({{ pixels }}). Kutilayotgan minimal miqdor {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Tasvirda juda ko‘p piksel bor ({{ pixels }}). Kutilayotgan maksimal miqdor {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Bu fayl nomi kutilgan belgi to‘plamiga mos kelmaydi.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="fa" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>این مقدار باید نادرست (False) باشد.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>این مقدار باید درست (True) باشد.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>این مقدار باید از نوع {{ type }} باشد.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>این مقدار باید خالی باشد.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>مقدار انتخاب شده یک گزینه معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>شما باید حداقل {{ limit }} گزینه انتخاب نمایید.|شما باید حداقل {{ limit }} گزینه انتخاب نمایید.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>شما باید حداکثر {{ limit }} گزینه انتخاب نمایید.|شما باید حداکثر {{ limit }} گزینه انتخاب نمایید.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>یک یا چند مقدار داده شده نامعتبر است.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>این ورودی مورد انتظار نبود.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>این فیلد وارد نشده است.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>این مقدار یک تاریخ معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>این مقدار یک تاریخ و زمان معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>این یک آدرس رایانامه (ایمیل) معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>فایل یافت نشد.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>فایل قابل خواندن نیست.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>فایل بیش از اندازه بزرگ است({{ size }} {{ suffix }}). بیشینه (حداکثر) اندازه مجاز برابر با {{ limit }} {{ suffix }} می‌باشد.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>نوع mime این فایل نامعتبر است({{ type }}). انواع mime مجاز {{ types }} هستند.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>این مقدار باید کوچکتر و یا مساوی {{ limit }} باشد.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>این مقدار بسیار طولانی است. باید دارای {{limit}} کاراکتر یا کمتر باشد. | این مقدار بسیار طولانی است. باید دارای {{limit}} کاراکتر یا کمتر باشد.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>این مقدار باید بزرگتر و یا مساوی {{ limit }} باشد.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>این مقدار بیش از اندازه کوتاه است. باید {{ limit }} کاراکتر یا بیشتر داشته باشد.|این مقدار بیش از اندازه کوتاه است. باید {{ limit }} کاراکتر یا بیشتر داشته باشد.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>این مقدار نباید خالی باشد.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>این مقدار نباید خالی باشد.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>این مقدار باید خالی باشد.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>این مقدار معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>این مقدار یک زمان معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>این مقدار شامل یک URL معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>دو مقدار باید با یکدیگر برابر باشند.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>فایل بیش از اندازه بزرگ است. بیشینه (حداکثر) اندازه مجاز {{ limit }} {{ suffix }} است.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>فایل بیش از اندازه بزرگ است.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>بارگذاری فایل با شکست مواجه گردید.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>این مقدار باید یک عدد معتبر باشد.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>این فایل یک تصویر معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>این مقدار یه آدرس آی‌پی معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>این مقدار یک زبان معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>این مقدار یک محل (locale) معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>این مقدار یک کشور معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>این مقدار قبلاً استفاده شده است.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>اندازه تصویر قابل شناسایی نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>عرض تصویر بسیار بزرگ است({{ width }}px). بیشینه (حداکثر) عرض مجاز {{ max_width }}px می‌باشد.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>عرض تصویر بسیار کوچک است({{ width }}px). کمینه (حداقل) عرض مورد انتظار {{ min_width }}px می‌باشد.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ارتفاع تصویر بسیار بزرگ است({{ height }}px). بیشینه (حداکثر) ارتفاع مجاز {{ max_height }}px می‌باشد.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ارتفاع تصویر بسیار کوچک است({{ height }}px). کمینه (حداقل) ارتفاع مورد انتظار {{ min_height }}px می‌باشد.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>این مقدار باید رمزعبور فعلی کاربر باشد.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target> این مقدار باید دقیقا {{ limit }} کاراکتر داشته باشد.| این مقدار باید دقیقا {{ limit }} کاراکتر داشته باشد.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>فایل به صورت جزئی بارگذاری گردیده است.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>هیچ فایلی بارگذاری نشد.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>هیچ پوشه موقتی در php.ini پیکربندی نشده است، یا پوشه پیکربندی شده وجود ندارد.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>فایل موقتی را نمی‌توان در دیسک نوشت.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>یک افزونه PHP باعث شد بارگذاری ناموفق باشد.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>این مجموعه باید حاوی {{ limit }} عنصر یا بیشتر باشد.|این مجموعه باید حاوی {{ limit }} عنصر یا بیشتر باشد.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>این مجموعه باید حاوی {{ limit }} عنصر یا کمتر باشد.|این مجموعه باید حاوی {{ limit }} عنصر یا کمتر باشد.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>این مجموعه باید دقیقا حاوی {{ limit }} عنصر باشد.|این مجموعه باید دقیقا حاوی {{ limit }} عنصر باشد.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>شماره کارت نامعتبر است.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>نوع کارت پشتیبانی نمی‌شود و یا شماره کارت نامعتبر می‌باشد.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>این مقدار یک شماره شبای معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>این مقدار یک ISBN-10 معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>این مقدار یک ISBN-13 معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>این مقدار یک ISBN-10 معتبر و یا ISBN-13 معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>این مقدار یک ISSN معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>این مقدار یک واحد پول معتبر نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>این مقدار باید برابر با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>این مقدار باید از {{ compared_value }} بیشتر باشد.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>این مقدار باید بزرگتر و یا مساوی با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>این مقدار باید برابر {{ compared_value_type }} {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>این مقدار باید کمتر از {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>این مقدار باید کمتر و یا مساوی با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>این مقدار نباید با {{ compared_value }} برابر باشد.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>این مقدار نباید برابر {{ compared_value_type }} {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>ابعاد ({{ ratio }}) عکس بیش از حد بزرگ است. بیشینه (حداکثر) ابعاد مجاز {{ max_ratio }} می‌باشد.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>ابعاد ({{ ratio }}) عکس بیش از حد کوچک است. کمینه (حداقل) ابعاد مورد انتظار {{ min_ratio }} می‌باشد.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>این تصویر یک مربع ({{ width }}x{{ height }}px) می‌باشد. تصاویر مربع شکل مجاز نمی‌باشند.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>این تصویر افقی ({{ width }}x{{ height }}px) می‌باشد. تصاویر افقی مجاز نمی‌باشند.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>این تصویر عمودی ({{ width }}x{{ height }}px) می‌باشد. تصاویر عمودی مجاز نمی‌باشند.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>فایل خالی مجاز نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>میزبان (Host) شناسایی نشد.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>این مقدار مطابق charset مورد انتظار {{ charset }} نمی باشد.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>این مقدار یک کد شناسه کسب‌وکار (BIC) معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>خطا</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>این مقدار یک UUID معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>این مقدار باید چند برابر {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>این کد شناسایی کسب‌و‌کار (BIC) با شماره حساب بانکی بین‌المللی (IBAN) {{ iban }} مرتبط نیست.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>این مقدار باید یک JSON معتبر باشد.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>این مجموعه باید فقط حاوی عناصر یکتا باشد.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>این مقدار باید مثبت باشد.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>این مقدار باید مثبت یا صفر باشد.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>این مقدار باید منفی باشد.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>این مقدار باید منفی یا صفر باشد.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>این مقدار یک منطقه‌زمانی (timezone) معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>این رمزعبور در یک رخنه‌ی اطلاعاتی نشت کرده است. لطفاً از یک رمزعبور دیگر استفاده کنید.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>این مقدار باید بین {{ min }} و {{ max }} باشد</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>این مقدار یک hostname معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>تعداد عناصر این مجموعه باید ضریبی از {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>این مقدار باید حداقل یکی از محدودیت‌های زیر را ارضا کند:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>هر یک از عناصر این مجموعه باید دسته محدودیت‌های خودش را ارضا کند.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>این مقدار یک شماره شناسایی بین‌المللی اوراق بهادار (ISIN) معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>این مقدار باید یک عبارت معتبر باشد.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>این مقدار یک رنگ معتبر در CSS نیست.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>این مقدار یک نماد معتبر در CIDR نیست.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>مقدار ماسک شبکه (NetMask) باید بین {{ min }} و {{ max }} باشد.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>نام فایل طولانی است. نام فایل باید {{ filename_max_length }} کاراکتر یا کمتر باشد.|نام فایل طولانی است. نام فایل باید {{ filename_max_length }} کاراکتر یا کمتر باشد.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>رمز عبور ضعیف است. لطفا از رمز عبور قوی‌تری استفاده کنید.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>این مقدار حاوی کاراکترهایی است که در سطح محدودیت فعلی مجاز نیستند.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>استفاده از کاراکترهای نامرئی مجاز نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>مخلوط کردن اعداد از اسکریپت های مختلف مجاز نیست.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>استفاده از کاراکترهای همپوشانی پنهان (hidden overlay characters) مجاز نیست.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>پسوند فایل ({{ extension }}) نامعتبر است. پسوندهای مجاز {{ extensions }} هستند.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>رمزگذاری کاراکتر تشخیص داده شده ({{ detected }}) نامعتبر است. رمزگذاری‌های مجاز {{ encodings }} هستند.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>این مقدار یک آدرس MAC معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>این آدرس دارای دامنه نمی‌باشد.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>این مقدار بسیار کوتاه است. باید حداقل یک کلمه داشته باشد.|این مقدار بسیار کوتاه است. باید حداقل {{ min }} کلمه داشته باشد.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>این مقدار بیش از حد طولانی است. باید فقط یک کلمه باشد.|این مقدار بیش از حد طولانی است. باید حداکثر {{ max }} کلمه داشته باشد.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>این مقدار یک هفته معتبر در قالب ISO 8601 را نشان نمی‌دهد.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>این مقدار یک هفته معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>این مقدار نباید قبل از هفته "{{ min }}" باشد.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>این مقدار نباید بعد از هفته "{{ max }}" باشد.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>این مقدار یک قالب معتبر Twig نیست.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">این فایل یک ویدیوی معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">اندازه ویدئو قابل تشخیص نبود.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">عرض ویدئو خیلی زیاد است ({{ width }}px). حداکثر عرض مجاز {{ max_width }}px است.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">عرض ویدئو خیلی کم است ({{ width }}px). حداقل عرض مورد انتظار {{ min_width }} پیکسل است.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">ارتفاع ویدیو خیلی زیاد است ({{ height }}px). حداکثر ارتفاع مجاز {{ max_height }}px است.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">ارتفاع ویدیو خیلی کم است ({{ height }}px). حداقل ارتفاع مورد انتظار {{ min_height }}px است.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">ویدیو پیکسل‌های بسیار کمی دارد ({{ pixels }}). حداقل مقدار مورد انتظار {{ min_pixels }} است.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">ویدئو پیکسل‌های زیادی دارد ({{ pixels }}). حداکثر مقدار مورد انتظار {{ max_pixels }} است.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">نسبت ویدیو خیلی بزرگ است ({{ ratio }}). حداکثر نسبت مجاز {{ max_ratio }} است.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">نسبت ویدیو خیلی کوچک است ({{ ratio }}). نسبت حداقل مورد انتظار {{ min_ratio }} است.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">ویدئو مربعی است ({{ width }}x{{ height }}px). ویدئوهای مربعی مجاز نیستند.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">ویدیو به صورت افقی است ({{ width }}x{{ height }} پیکسل). ویدیوهای افقی مجاز نیستند.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">ویدیو با جهت عمودی است ({{ width }}x{{ height }}px). ویدیوهای با جهت عمودی مجاز نیستند.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">فایل ویدیو خراب است.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">ویدئو شامل چندین استریم است. فقط یک استریم مجاز است.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">کُدک ویدیویی پشتیبانی نمی‌شود «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">ظرف ویدئو پشتیبانی نمی‌شود "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">فایل تصویر خراب است.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">تصویر پیکسل‌های بسیار کمی دارد ({{ pixels }}). حداقل مقدار مورد انتظار {{ min_pixels }} است.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">تصویر پیکسل‌های زیادی دارد ({{ pixels }}). حداکثر مقدار مورد انتظار {{ max_pixels }} است.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">نام این فایل با مجموعه نویسه‌های مورد انتظار مطابقت ندارد.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="he" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>הערך צריך להיות שקר.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>הערך צריך להיות אמת.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>הערך צריך להיות מסוג {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>הערך צריך להיות ריק.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>הערך שבחרת אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>אתה צריך לבחור לפחות {{ limit }} אפשרויות.|אתה צריך לבחור לפחות {{ limit }} אפשרויות.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>אתה צריך לבחור לכל היותר {{ limit }} אפשרויות.|אתה צריך לבחור לכל היותר {{ limit }} אפשרויות.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>אחד או יותר מהערכים אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>שדה זה לא היה צפוי</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>שדה זה חסר.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>הערך אינו תאריך חוקי.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>הערך אינו תאריך ושעה חוקיים.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>כתובת המייל אינה תקינה.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>הקובץ לא נמצא.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>לא ניתן לקרוא את הקובץ.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>הקובץ גדול מדי ({{ size }} {{ suffix }}). הגודל המרבי המותר הוא {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>סוג MIME של הקובץ אינו חוקי ({{ type }}). מותרים סוגי MIME {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>הערך צריך להכיל {{ limit }} תווים לכל היותר.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>הערך ארוך מידי. הוא צריך להכיל {{ limit }} תווים לכל היותר.|הערך ארוך מידי. הוא צריך להכיל {{ limit }} תווים לכל היותר.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>הערך צריך להכיל {{ limit }} תווים לפחות.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>הערך קצר מידי. הוא צריך להכיל {{ limit }} תווים לפחות.|הערך קצר מידי. הערך צריך להכיל {{ limit }} תווים לפחות.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>הערך לא אמור להיות ריק.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>הערך לא אמור להיות ריק.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>הערך צריך להיות ריק.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>הערך אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>הערך אינו זמן תקין.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>זאת אינה כתובת אתר תקינה.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>שני הערכים צריכים להיות שווים.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>הקובץ גדול מדי. הגודל המרבי המותר הוא {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>הקובץ גדול מדי.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>לא ניתן לעלות את הקובץ.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>הערך צריך להיות מספר חוקי.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>הקובץ הזה אינו תמונה תקינה.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>ערך זה אינו כתובת IP תקפה.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>הערך אינו שפה חוקית.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>הערך אינו אזור תקף.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>הערך אינו ארץ חוקית.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>הערך כבר בשימוש.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>לא ניתן לקבוע את גודל התמונה.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>רוחב התמונה גדול מדי ({{ width }}px). הרוחב המקסימלי הוא {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>רוחב התמונה קטן מדי ({{ width }}px). הרוחב המינימלי הוא {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>גובה התמונה גדול מדי ({{ height }}px). הגובה המקסימלי הוא {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>גובה התמונה קטן מדי ({{ height }}px). הגובה המינימלי הוא {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>הערך צריך להיות סיסמת המשתמש הנוכחי.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>הערך צריך להיות בדיוק {{ limit }} תווים.|הערך צריך להיות בדיוק {{ limit }} תווים.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>הקובץ הועלה באופן חלקי.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>הקובץ לא הועלה.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>לא הוגדרה תיקייה זמנית ב-php.ini, או שהתיקייה המוגדרת אינה קיימת.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>לא ניתן לכתוב קובץ זמני לדיסק.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>סיומת PHP גרם להעלאה להיכשל.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>האוסף אמור להכיל {{ limit }} אלמנטים או יותר.|האוסף אמור להכיל {{ limit }} אלמנטים או יותר.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>האוסף אמור להכיל {{ limit }} אלמנטים או פחות.|האוסף אמור להכיל {{ limit }} אלמנטים או פחות.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>האוסף צריך להכיל בדיוק {{ limit }} אלמנטים.|האוסף צריך להכיל בדיוק {{ limit }} אלמנטים.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>מספר הכרטיס אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>סוג הכרטיס אינו נתמך או לא חוקי.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>ערך זה אינו מספר זה"ב (IBAN) תקף.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>הערך אינו ערך ISBN-10 חוקי.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>הערך אינו ערך ISBN-13 חוקי.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>הערך אינו ערך ISBN-10 חוקי או ערך ISBN-13 חוקי.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>הערך אינו ערך ISSN חוקי.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>הערך אינו ערך מטבע חוקי.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>הערך חייב להיות שווה ל {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>הערך חייב להיות גדול מ {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>הערך חייב להיות גדול או שווה ל {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>הערך חייב להיות זהה ל {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>הערך חייב להיות קטן מ {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>הערך חייב להיות קטן או שווה ל {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>הערך חייב להיות לא שווה ל {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>הערך חייב להיות לא זהה ל {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>היחס של התמונה הוא גדול מדי ({{ ratio }}). היחס המקסימלי האפשרי הוא {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>היחס של התמונה הוא קטן מדי ({{ ratio }}). היחס המינימלי האפשרי הוא {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>התמונה מרובעת ({{ width }}x{{ height }}px). אסורות תמונות מרובעות.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>התמונה היא לרוחב ({{ width }}x{{ height }}px). אסורות תמונות לרוחב.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>התמונה היא לאורך ({{ width }}x{{ height }}px). אסורות תמונות לאורך.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>אסור קובץ ריק.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>לא הייתה אפשרות לזהות את המארח.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>הערך אינו תואם למערך התווים {{ charset }} הצפוי.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>ערך זה אינו קוד מזהה עסקי (BIC) תקף.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>שגיאה</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>ערך זה אינו UUID תקף.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>הערך חייב להיות כפולה של {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>הקוד זיהוי עסקי (BIC) אינו משוייך ל IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>הערך אינו ערך JSON תקין.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>האוסף חייב להכיל רק אלמנטים ייחודיים.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>הערך חייב להיות חיובי.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>הערך חייב להיות חיובי או אפס.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>הערך חייב להיות שלילי.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>הערך חייב להיות שלילי או אפס.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>הערך אינו אזור זמן תקין.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>סיסמא זו הודלפה בהדלפת מידע, אסור להשתמש בה. אנא השתמש בסיסמה אחרת.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>הערך חייב להיות בין {{ min }} ו- {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>ערך זה אינו שם מארח חוקי.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>מספר האלמנטים באוסף זה צריך להיות מכפיל של {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>ערך זה אמור לעמוד לפחות באחד התנאים הבאים:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>כל אלמנט באוסף זה אמור לעמוד בקבוצת התנאים שלו.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>ערך זה אינו מספר זיהוי ניירות ערך בינלאומי תקף (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>ערך זה חייב להיות ביטוי חוקי.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>ערך זה אינו צבע CSS חוקי.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>ערך זה אינו סימון CIDR חוקי.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>הערך של מסכת הרשת חייב להיות בין {{ min }} ו {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>שם הקובץ ארוך מדי. עליו להכיל {{ filename_max_length }} תווים או פחות.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>חוזק הסיסמה נמוך מדי. אנא השתמש בסיסמה חזקה יותר.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>הערך כולל תווים שאינם מותרים על פי רמת ההגבלה הנוכחית.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>אסור להשתמש בתווים בלתי נראים.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>אסור לערבב מספרים מסקריפטים שונים.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>אסור להשתמש בתווים חופפים נסתרים.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>סיומת הקובץ אינה תקינה ({{ extension }}). הסיומות המותרות הן {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>קידוד התווים שזוהה אינו חוקי ({{ detected }}). הקידודים המותרים הם {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>ערך זה אינו כתובת MAC תקפה.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">לכתובת URL זו חסר דומיין רמה עליונה.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">ערך זה קצר מדי. הוא צריך להכיל לפחות מילה אחת.|ערך זה קצר מדי. הוא צריך להכיל לפחות {{ min }} מילים.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">ערך זה ארוך מדי. הוא צריך להכיל רק מילה אחת.|ערך זה ארוך מדי. הוא צריך להכיל {{ max }} מילים או פחות.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">ערך זה אינו מייצג שבוע תקף בפורמט ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">ערך זה אינו שבוע חוקי.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">ערך זה לא אמור להיות לפני שבוע "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">ערך זה לא אמור להיות לאחר שבוע "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">ערך זה אינו תבנית Twig חוקית.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">קובץ זה אינו וידאו תקין.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">לא ניתן היה לזהות את גודל הווידאו.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">רוחב הווידאו גדול מדי ({{ width }}px). רוחב מרבי מותר הוא {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">רוחב הווידאו קטן מדי ({{ width }}px). רוחב מינימלי צפוי הוא {{ min_width }} פיקסלים.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">גובה הווידאו גדול מדי ({{ height }}px). הגובה המקסימלי המותר הוא {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">גובה הווידאו קטן מדי ({{ height }}px). הגובה המינימלי הצפוי הוא {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">לסרטון יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">לסרטון יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">יחס הווידאו גדול מדי ({{ ratio }}). יחס מקסימלי מותר הוא {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">יחס הווידאו קטן מדי ({{ ratio }}). יחס מינימלי צפוי הוא {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">הווידאו הוא מרובע ({{ width }}x{{ height }}px). סרטוני וידאו מרובעים אינם מותרים.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">הווידאו במצב לרוחב ({{ width }}x{{ height }} פיקסלים). סרטוני לרוחב אינם מותרים.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">הווידאו הוא בתצורת דיוקן ({{ width }}x{{ height }}px). סרטוני וידאו בתצורת דיוקן אינם מותרים.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">קובץ הווידאו פגום.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">הווידאו מכיל מספר זרמים. מותר זרם אחד בלבד.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">מקודד וידאו שאינו נתמך "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">מיכל וידאו שאינו נתמך "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">קובץ התמונה פגום.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">לתמונה יש מעט מדי פיקסלים ({{ pixels }}). הכמות המינימלית הצפויה היא {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">לתמונה יש יותר מדי פיקסלים ({{ pixels }}). הכמות המרבית הצפויה היא {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">שם הקובץ הזה אינו תואם את מערך התווים הצפוי.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="af" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Hierdie waarde moet vals wees.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Hierdie waarde moet waar wees.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Hierdie waarde moet van die soort {{type}} wees.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Hierdie waarde moet leeg wees.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Die waarde wat jy gekies het is nie 'n geldige keuse nie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Jy moet ten minste {{ limit }} kies.|Jy moet ten minste {{ limit }} keuses kies.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Jy moet by die meeste {{ limit }} keuse kies.|Jy moet by die meeste {{ limit }} keuses kies.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Een of meer van die gegewe waardes is ongeldig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Die veld is nie verwag nie.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Hierdie veld ontbreek.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Hierdie waarde is nie 'n geldige datum nie.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Hierdie waarde is nie 'n geldige datum en tyd nie.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Hierdie waarde is nie 'n geldige e-pos adres nie.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Die lêer kon nie gevind word nie.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Die lêer kan nie gelees word nie.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die lêer is te groot ({{ size }} {{ suffix }}). Toegelaat maksimum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Die MIME-tipe van die lêer is ongeldig ({{ type }}). Toegelaat MIME-tipes is {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Hierdie waarde moet {{ limit }} of minder wees.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Hierdie waarde is te lank. Dit moet {{ limit }} karakter of minder wees.|Hierdie waarde is te lank. Dit moet {{ limit }} karakters of minder wees.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Hierdie waarde moet {{ limit }} of meer wees.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Hierdie waarde is te kort. Dit moet {{ limit }} karakter of meer wees.|Hierdie waarde is te kort. Dit moet {{ limit }} karakters of meer wees.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Hierdie waarde moet nie leeg wees nie.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Hierdie waarde moet nie nul wees nie.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Hierdie waarde moet nul wees.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Hierdie waarde is nie geldig nie.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Hierdie waarde is nie 'n geldige tyd nie.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Hierdie waarde is nie 'n geldige URL nie.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Die twee waardes moet gelyk wees.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die lêer is te groot. Toegelaat maksimum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Die lêer is te groot.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Die lêer kan nie opgelaai word nie.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Hierdie waarde moet 'n geldige nommer wees.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Hierdie lêer is nie 'n geldige beeld nie.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige IP-adres nie.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Hierdie waarde is nie 'n geldige taal nie.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Hierdie waarde is nie 'n geldige land instelling nie.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Hierdie waarde is nie 'n geldige land nie.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Hierdie waarde word reeds gebruik.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Die grootte van die beeld kon nie opgespoor word nie.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Die beeld breedte is te groot ({{ width }}px). Toegelaat maksimum breedte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Die beeld breedte is te klein ({{ width }}px). Minimum breedte verwag is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Die beeld hoogte is te groot ({{ height }}px). Toegelaat maksimum hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Die beeld hoogte is te klein ({{ height }}px). Minimum hoogte verwag is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Hierdie waarde moet die huidige wagwoord van die gebruiker wees.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Hierdie waarde moet presies {{ limit }} karakter wees.|Hierdie waarde moet presies {{ limit }} karakters wees.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Die lêer is slegs gedeeltelik opgelaai.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Geen lêer is opgelaai nie.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Geen tydelike gids is in php.ini opgestel nie, of die opgestelde gids bestaan nie.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan nie tydelike lêer skryf op skyf nie.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>'n PHP-uitbreiding veroorsaak die oplaai van die lêer om te misluk.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Hierdie versameling moet {{ limit }} element of meer bevat.|Hierdie versameling moet {{ limit }} elemente of meer bevat.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Hierdie versameling moet {{ limit }} element of minder bevat.|Hierdie versameling moet {{ limit }} elemente of meer bevat.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Hierdie versameling moet presies {{ limit }} element bevat.|Hierdie versameling moet presies {{ limit }} elemente bevat.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongeldige kredietkaart nommer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nie-ondersteunde tipe kaart of ongeldige kredietkaart nommer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige Internasionale Bankrekeningnommer (IBAN) nie.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Hierdie waarde is nie 'n geldige ISBN-10 nie.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Hierdie waarde is nie 'n geldige ISBN-13 nie.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Hierdie waarde is nie 'n geldige ISBN-10 of ISBN-13 nie.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Hierdie waarde is nie 'n geldige ISSN nie.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Hierdie waarde is nie 'n geldige geldeenheid nie.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Hierdie waarde moet gelyk aan {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Hierdie waarde moet meer as {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Hierdie waarde moet meer of gelyk aan {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Hierdie waarde moet identies aan {{ compared_value_type }} {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Hierdie waarde moet minder as {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Hierdie waarde moet minder of gelyk aan {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Hierdie waarde moet nie dieselfde as {{ compared_value }} wees nie.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Hierdie waarde moet nie identies as {{ compared_value_type }} {{ compared_value }} wees nie.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Die beeld aspek is te groot ({{ ratio }}). Die maksimum toegelate aspek is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Die beeld aspek is te klein ({{ ratio }}). Die minimum toegelate aspek is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Die beeld is vierkantig ({{ width }}x{{ height }}px). Vierkantige beelde word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Die beeld is landskap georiënteerd ({{ width }}x{{ height }}px). Landskap georiënteerde beelde word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Die beeld dis portret georiënteerd ({{ width }}x{{ height }}px). Portret georiënteerde beelde word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>'n Leë lêer word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Die gasheer kon nie opgelos word nie.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Die waarde stem nie ooreen met die verwagte {{ charset }} karakterstel nie.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige Besigheid Identifiseerder Kode (BIC) nie.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Fout</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige UUID nie.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Hierdie waarde moet 'n veelvoud van {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Hierdie Besigheids Identifikasie Kode (BIK) is nie geassosieer met IBAN {{ iban }} nie.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Hierdie waarde moet geldige JSON wees.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Hierdie versameling moet net unieke elemente bevat.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Hierdie waarde moet positief wees.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Hierdie waarde moet positief of nul wees.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Hierdie waarde moet negatief wees.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Hierdie waarde moet negatief of nul wees.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Hierdie waarde is nie 'n geldige tydsone nie.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target state="needs-review-translation">Hierdie wagwoord is in 'n data-oortreding uitgelek, dit mag nie gebruik word nie. Gebruik asseblief 'n ander wagwoord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Hierdie waarde moet tussen {{ min }} en {{ max }} wees.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Hierdie waarde is nie 'n geldige gasheernaam nie.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Die hoeveelheid elemente in hierdie versameling moet 'n meelvoud van {{ compared_value }} wees.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Hierdie waarde moet voldoen aan ten minste een van hierdie beperkings:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Elke element van hierdie versameling moet voldoen aan hulle eie beperkings.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Hierdie waarde is nie 'n geldige Internasionale veiligheidsidentifikasienommer (ISIN) nie.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Hierdie waarde moet 'n geldige uitdrukking wees.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Hierdie waarde is nie 'n geldige CSS-kleur nie.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Hierdie waarde is nie 'n geldige CIDR-notasie nie.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Die waarde van die netmasker moet tussen {{ min }} en {{ max }} wees.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">Die lêernaam is te lank. Dit moet {{ filename_max_length }} karakter of minder hê.|Die lêernaam is te lank. Dit moet {{ filename_max_length }} karakters of minder hê.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">Die wagwoordsterkte is te laag. Gebruik asseblief 'n sterker wagwoord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">Hierdie waarde bevat karakters wat nie toegelaat word deur die huidige beperkingsvlak nie.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">Die gebruik van onsigbare karakters word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">Die meng van nommers van verskillende skrifte word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">Die gebruik van verborge oorvleuelende karakters word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Die uitbreiding van die lêer is ongeldig ({{ extension }}). Toegelate uitbreidings is {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Die opgespoorde karakterkodering is ongeldig ({{ detected }}). Toegelate koderings is {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige MAC-adres nie.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Die URL mis 'n topvlakdomein.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Hierdie waarde is te kort. Dit moet ten minste een woord bevat.|Hierdie waarde is te kort. Dit moet ten minste {{ min }} woorde bevat.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Hierdie waarde is te lank. Dit moet een woord bevat.,Hierdie waarde is te lank. Dit moet {{ max }} woorde of minder bevat.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Hierdie waarde stel nie 'n geldige week in die ISO 8601-formaat voor nie.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige week nie.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Hierdie waarde mag nie voor week "{{ min }}" wees nie.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Hierdie waarde mag nie na week "{{ max }}" kom nie.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Hierdie waarde is nie 'n geldige Twig-sjabloon nie.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Hierdie lêer is nie 'n geldige video nie.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Die grootte van die video kon nie bepaal word nie.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Die videowydte is te groot ({{ width }}px). Toegelate maksimum wydte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Die videobreedte is te klein ({{ width }}px). Minimum verwagte breedte is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Die videohoogte is te groot ({{ height }}px). Toegelate maksimum hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Die videohoogte is te klein ({{ height }}px). Minimum hoogte verwag is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Die video het te min pixels ({{ pixels }}). Minimum hoeveelheid verwag is {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Die video het te veel pixels ({{ pixels }}). Maksimum verwagte hoeveelheid is {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Die videoratio is te groot ({{ ratio }}). Toegelate maksimum ratio is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Die videoratio is te klein ({{ ratio }}). Minimum verwagte ratio is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Die video is vierkantig ({{ width }}x{{ height }}px). Vierkantige video's word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Die video is landskap georiënteer ({{ width }}x{{ height }} px). Landskapvideo's word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Die video is portretgeoriënteerd ({{ width }}x{{ height }}px). Portretgeoriënteerde video's word nie toegelaat nie.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Die videolêer is korrup.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Die video bevat veelvuldige strome. Slegs een stroom word toegelaat.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nie-ondersteunde videokodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nie-ondersteunde videohouer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Die beeldlêer is beskadig.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Die beeld het te min pixels ({{ pixels }}). Minimum hoeveelheid verwag is {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Die beeld het te veel pixels ({{ pixels }}). Maksimum verwagte aantal is {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Hierdie lêernaam stem nie ooreen met die verwagte karakterstel nie.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="bg" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Стойността трябва да бъде лъжа (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Стойността трябва да бъде истина (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Стойността трябва да бъде от тип {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Стойността трябва да бъде празна.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Избраната стойност е невалидна.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Трябва да изберете поне {{ limit }} опция.|Трябва да изберете поне {{ limit }} опции.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Трябва да изберете най-много {{ limit }} опция.|Трябва да изберете най-много {{ limit }} опции.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Една или повече от зададените стойности е невалидна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Полето не се е очаквало.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Полето липсва.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Стойността не е валидна дата.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Стойността не е валидна дата и час.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Стойността не е валиден имейл адрес.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файлът не беше открит.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файлът не може да бъде прочетен.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файлът е твърде голям ({{ size }} {{ suffix }}). Максималният размер е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime типът на файла е невалиден ({{ type }}). Разрешени mime типове са {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Стойността трябва да бъде {{ limit }} или по-малко.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Стойността е твърде дълга. Трябва да съдържа най-много {{ limit }} символ.|Стойността е твърде дълга. Трябва да съдържа най-много {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Стойността трябва да бъде {{ limit }} или повече.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Стойността е твърде кратка. Трябва да съдържа поне {{ limit }} символ.|Стойността е твърде кратка. Трябва да съдържа поне {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Стойността не трябва да бъде празна.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Стойността не трябва да бъде null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Стойността трябва да бъде null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Стойността не е валидна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Стойността не е валидно време.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Стойността не е валиден URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Двете стойности трябва да бъдат равни.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файлът е твърде голям. Разрешеният максимален размер е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файлът е твърде голям.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файлът не може да бъде качен.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Стойността трябва да бъде валиден номер.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Файлът не е валидно изображение.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Стойността не е валиден IP адрес.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Стойността не е валиден език.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Стойността не е валидна локализация.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Стойността не е валидна държава.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Стойността вече е в употреба.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Размерът на изображението не може да бъде определен.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Изображението е твърде широко ({{ width }}px). Широчината трябва да бъде максимум {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Изображението е с твърде малка широчина ({{ width }}px). Широчината трябва да бъде минимум {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Изображението е с твърде голяма височина ({{ height }}px). Височината трябва да бъде максимум {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Изображението е с твърде малка височина ({{ height }}px). Височина трябва да бъде минимум {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Стойността трябва да бъде текущата потребителска парола.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Стойността трябва да бъде точно {{ limit }} символ.|Стойността трябва да бъде точно {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файлът е качен частично.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файлът не беше качен.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>В php.ini не е конфигурирана временна директория или конфигурираната директория не съществува.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Не може да запише временен файл на диска.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP разширение предизвика прекъсване на качването.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Колекцията трябва да съдържа поне {{ limit }} елемент.|Колекцията трябва да съдържа поне {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Колекцията трябва да съдържа най-много {{ limit }} елемент.|Колекцията трябва да съдържа най-много {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Колекцията трябва да съдържа точно {{ limit }} елемент.|Колекцията трябва да съдържа точно {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невалиден номер на карта.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Неподдържан тип карта или невалиден номер на карта.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Стойността не е валиден Международен номер на банкова сметка (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Стойността не е валиден ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Стойността не е валиден ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Стойността не е нито валиден ISBN-10, нито валиден ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Стойността не е валиден ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Стойността не е валидна валута.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-голяма от {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-голяма или равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Стойността трябва да бъде идентична с {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-малка {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-малка или равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Стойността не трябва да бъде равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Стойността не трябва да бъде идентична с {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Изображението е с твърде голяма пропорция ({{ ratio }}). Максималната пропорция трябва да е {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Изображението е с твърде малка пропорция ({{ ratio }}). Минималната пропорция трябва да е {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Изображението е квадрат ({{ width }}x{{ height }}px). Такива изображения не са разрешени.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Изображението е с пейзажна ориентация ({{ width }}x{{ height }}px). Изображения с такава ориентация не са разрешени.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Изображението е с портретна ориентация ({{ width }}x{{ height }}px). Изображения с такава ориентация не са разрешени.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Празни файлове не са разрешени.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Хостът е недостъпен.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Стойността не съвпада с очакваната {{ charset }} кодировка.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Стойността не е валиден Бизнес идентификационен код (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Грешка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Стойността не е валиден UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Стойността трябва да бъде кратно число на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Бизнес идентификационният код (BIC) не е свързан с IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Стойността трябва да е валиден JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Колекцията трябва да съдържа само уникални елементи.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Стойността трябва да бъде положително число.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Стойността трябва бъде положително число или нула.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Стойността трябва да бъде отрицателно число.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Стойността трябва да бъде отрицателно число или нула.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Стойността не е валидна часова зона.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Тази парола е компрометирана, не може да бъде използвана. Моля използвайте друга парола.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Стойността трябва да бъде между {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Стойността не е валиден hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Броят на елементите в тази колекция трябва да бъде кратен на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Стойността трябва да отговаря на поне едно от следните ограничения:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Всеки елемент от тази колекция трябва да отговаря на собствения си набор от ограничения.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Стойността не е валиден Международен идентификационен номер на ценни книжа (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Стойността трябва да бъде валиден израз.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Стойността не е валиден CSS цвят.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Стойността не е валидна CIDR нотация.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Стойността на мрежовата маска трябва да бъде между {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Името на файла е твърде дълго. Трябва да съдържа не повече от {{ filename_max_length }} символ.|Името на файла е твърде дълго. Трябва да съдържа не повече от {{ filename_max_length }} символа.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Сложността на паролата е твърде малка. Моля използвайте по-сложна парола.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Стойността съдържа символи, които не са позволени от текущото ниво на ограничение.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Използването на невидими символи не е позволено.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Смесването на числа от различни скриптове не е позволено.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Използването на скрити насложени символи не е позволено.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Разширението на файла е невалидно ({{ extension }}). Разрешените разширения са {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Откритото кодиране на знаците е невалидно ({{ detected }}). Разрешените кодирания са {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Стойността не е валиден MAC адрес.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>На този URL липсва домейн от най-високо ниво.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Тази стойност е твърде кратка. Трябва да съдържа поне една дума.|Тази стойност е твърде кратка. Трябва да съдържа поне {{ min }} думи.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Тази стойност е твърде дълга. Трябва да съдържа само една дума.|Тази стойност е твърде дълга. Трябва да съдържа {{ max }} думи или по-малко.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Тази стойност не представлява валидна седмица във формат ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Тази стойност не е валидна седмица.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Тази стойност не трябва да бъде преди седмица "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Тази стойност не трябва да бъде след седмица "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Тази стойност не е валиден Twig шаблон.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Този файл не е валидно видео.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Размерът на видеото не може да бъде установен.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Ширината на видеото е твърде голяма ({{ width }}px). Допустимата максимална ширина е {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Ширината на видеото е твърде малка ({{ width }}px). Минималната изисквана ширина е {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Височината на видеото е твърде голяма ({{ height }}px). Максимално допустимата височина е {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Височината на видеото е твърде малка ({{ height }}px). Очакваната минимална височина е {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Видеото има твърде малко пиксели ({{ pixels }}). Минимално изискуемото количество е {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Видеото има твърде много пиксели ({{ pixels }}). Очакваният максимум е {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Съотношението на видеото е твърде голямо ({{ ratio }}). Позволеното максимално съотношение е {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Съотношението на видеото е твърде малко ({{ ratio }}). Минималното очаквано съотношение е {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е квадратно ({{ width }}x{{ height }}px). Квадратни видеа не са позволени.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е в хоризонтална ориентация ({{ width }}x{{ height }} px). Хоризонтални видеа не са позволени.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е с портретна ориентация ({{ width }}x{{ height }}px). Видеа с портретна ориентация не са позволени.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Видеофайлът е повреден.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Видеото съдържа множество потоци. Разрешен е само един поток.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Неподдържан видео кодек „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Неподдържан видео контейнер "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Файлът с изображение е повреден.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Изображението има твърде малко пиксели ({{ pixels }}). Очакваният минимален брой е {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Изображението има твърде много пиксели ({{ pixels }}). Очакваният максимален брой е {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Името на файла не съответства на очаквания набор от знаци.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sv" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Värdet ska vara falskt.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Värdet ska vara sant.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Värdet ska vara av typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Värdet ska vara tomt.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Värdet ska vara ett av de givna valen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du måste välja minst {{ limit }} val.|Du måste välja minst {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan som mest välja {{ limit }} val.|Du kan som mest välja {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ett eller fler av de angivna värdena är ogiltigt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Det här fältet förväntades inte.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Det här fältet saknas.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Värdet är inte ett giltigt datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Värdet är inte ett giltigt datum med tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Värdet är inte en giltig e-postadress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen är inte läsbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen är för stor ({{ size }} {{ suffix }}). Största tillåtna storlek är {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Filens MIME-typ ({{ type }}) är ogiltig. De tillåtna typerna är {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Värdet ska vara {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Värdet är för långt. Det ska ha {{ limit }} tecken eller färre.|Värdet är för långt. Det ska ha {{ limit }} tecken eller färre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Värdet ska vara {{ limit }} eller mer.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Värdet är för kort. Det ska ha {{ limit }} tecken eller mer.|Värdet är för kort. Det ska ha {{ limit }} tecken eller mer.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Värdet kan inte vara tomt.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Värdet kan inte vara null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Värdet ska vara null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Värdet är inte giltigt.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Värdet är inte en giltig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Värdet är inte en giltig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De två värdena måste vara lika.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen är för stor. Tillåten maximal storlek är {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen är för stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunde inte laddas upp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Värdet ska vara ett giltigt nummer.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Filen är ingen giltig bild.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Värdet är inte en giltig IP-adress.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Värdet är inte ett giltigt språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Värdet är inte en giltig plats.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Värdet är inte ett giltigt land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Värdet används redan.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Det gick inte att fastställa storleken på bilden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Bildens bredd är för stor ({{ width }}px). Tillåten maximal bredd är {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Bildens bredd är för liten ({{ width }}px). Minsta förväntade bredd är {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bildens höjd är för stor ({{ height }}px). Tillåten maximal bredd är {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Bildens höjd är för liten ({{ height }}px). Minsta förväntade höjd är {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Värdet ska vara användarens nuvarande lösenord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Värdet ska ha exakt {{ limit }} tecken.|Värdet ska ha exakt {{ limit }} tecken.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen laddades bara upp delvis.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil laddades upp.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ingen tillfällig mapp konfigurerades i php.ini, eller den konfigurerade mappen finns inte.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan inte skriva temporär fil till disken.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP extension gjorde att uppladdningen misslyckades.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Den här samlingen ska innehålla {{ limit }} element eller mer.|Den här samlingen ska innehålla {{ limit }} element eller mer.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Den här samlingen ska innehålla {{ limit }} element eller mindre.|Den här samlingen ska innehålla {{ limit }} element eller mindre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Den här samlingen ska innehålla exakt {{ limit }} element.|Den här samlingen ska innehålla exakt {{ limit }} element.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ogiltigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Okänd korttyp eller ogiltigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Värdet är inte ett giltigt internationellt bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Värdet är inte en giltig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Värdet är inte en giltig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Värdet är varken en giltig ISBN-10 eller en giltig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Värdet är inte en giltig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Värdet är inte en giltig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Värdet ska vara detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Värdet ska vara större än {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Värdet ska bara större än eller detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Värdet ska vara identiskt till {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Värdet ska vara mindre än {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Värdet ska vara mindre än eller detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Värdet ska inte vara detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Värdet ska inte vara identiskt med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Förhållandet mellan bildens bredd och höjd är för stort ({{ ratio }}). Högsta tillåtna förhållande är {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Förhållandet mellan bildens bredd och höjd är för litet ({{ ratio }}). Minsta tillåtna förhållande är {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Bilden är kvadratisk ({{ width }}x{{ height }}px). Kvadratiska bilder tillåts inte.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Bilden är landskapsorienterad ({{ width }}x{{ height }}px). Landskapsorienterade bilder tillåts inte.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Bilden är porträttsorienterad ({{ width }}x{{ height }}px). Porträttsorienterade bilder tillåts inte.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>En tom fil är inte tillåten.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Värddatorn kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Värdet har inte den förväntade teckenkodningen {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Värdet är inte en giltig BIC-kod.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Fel</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Värdet är inte en giltig UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Värdet ska vara en multipel av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Denna BIC-koden är inte associerad med IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Värdet ska vara giltig JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Denna samling bör endast innehålla unika element.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Värdet ska vara positivt.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Värdet ska vara antingen positivt eller noll.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Värdet ska vara negativt.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Värdet ska vara antingen negativt eller noll.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Värdet är inte en giltig tidszon.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Det här lösenordet har läckt ut vid ett dataintrång, det får inte användas. Använd ett annat lösenord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Värdet bör ligga mellan {{ min }} och {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Värdet är inte ett giltigt servernamn.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Antalet element i samlingen ska vara en multipel av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Värdet ska uppfylla minst ett av följande krav:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Varje element i samlingen skall uppfylla sin egen uppsättning av krav.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Värdet är inte ett giltigt "International Securities Identification Number" (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Värdet ska vara ett giltigt uttryck.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Värdet är inte en giltig CSS-färg.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Värdet är inte en giltig CIDR-notation.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Värdet på nätmasken bör vara mellan {{ min }} och {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Filnamnet är för långt. Det måste vara {{ filename_max_length }} tecken eller färre.|Filnamnet är för långt. Det måste vara {{ filename_max_length }} tecken eller färre.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Detta lösenord är för svagt. Använd ett starkare lösenord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Värdet innehåller tecken som inte är tillåtna.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Användning av osynliga tecken är inte tillåtet.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Blandning av siffror från olika skript är inte tillåtet.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Användning av dolda överlagringstecken är inte tillåtet.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Filtillägget är ogiltigt ({{ extension }}). Tillåtna filtillägg är {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Den upptäckta teckenkodningen är ogiltig ({{ detected }}). Tillåtna kodningar är {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Värdet är inte en giltig MAC-adress.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Denna URL saknar en toppdomän.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Det här värdet är för kort. Det ska innehålla minst ett ord.|Det här värdet är för kort. Det ska innehålla minst {{ min }} ord.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Det här värdet är för långt. Det ska innehålla endast ett ord.|Det här värdet är för långt. Det ska innehålla {{ max }} ord eller färre.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Det här värdet representerar inte en giltig vecka i ISO 8601-formatet.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Det här värdet är inte en giltig vecka.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Det här värdet bör inte vara före vecka "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Det här värdet bör inte vara efter vecka "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Det här värdet är inte en giltig Twig-mall.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Den här filen är inte en giltig video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videons storlek kunde inte upptäckas.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Videobredden är för stor ({{ width }}px). Tillåten maximal bredd är {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Videobredden är för liten ({{ width }}px). Förväntad minsta bredd är {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Videons höjd är för stor ({{ height }}px). Tillåten maximal höjd är {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Videohöjden är för liten ({{ height }}px). Förväntad minimihöjd är {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videon har för få pixlar ({{ pixels }}). Förväntad miniminivå är {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videon har för många pixlar ({{ pixels }}). Förväntat maxantal är {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Videons förhållande är för stort ({{ ratio }}). Tillåtet maxförhållande är {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Videoförhållandet är för litet ({{ ratio }}). Förväntat minimiförhållande är {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videon är kvadratisk ({{ width }}x{{ height }}px). Kvadratiska videor är inte tillåtna.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videon är i liggande läge ({{ width }}x{{ height }}px). Liggande videor är inte tillåtna.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videon är i porträttläge ({{ width }}x{{ height }}px). Videor i porträttläge är inte tillåtna.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videofilen är skadad.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videon innehåller flera strömmar. Endast en ström är tillåten.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Videokodek stöds inte "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Videokontainer stöds inte "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Bildfilen är skadad.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Bilden har för få pixlar ({{ pixels }}). Förväntat minimiantal är {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Bilden har för många pixlar ({{ pixels }}). Förväntat maxantal är {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Detta filnamn stämmer inte med förväntad teckenuppsättning.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="my" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>ဤတန်ဖိုးသည် false ဖြစ်ရမည်။</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>ဤတန်ဖိုးသည် true ဖြစ်ရမည်။</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>ဤတန်ဖိုးသည် {{ type }} အမျိုးအစားဖြစ်ရမည်။ </target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>ဤတန်ဖိုးသည် ကွပ်လပ်မဖြစ်သင့်ပါ။</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>သင်ရွေးချယ်သောတန်ဖိုးသည် သင့်လျှော်သော် တန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>သင်သည် အနည်းဆုံးရွေးချယ်မှု {{ limit }} ခုရွေးချယ်ရမည်။</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>သင်သည်အများဆုံး {{ limit }} ခုသာရွေးချယ်ခွင့်ရှိသည်။</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>ပေးထားသောတန်ဖိုးတစ်ခု (သို့မဟုတ်) တစ်ခုထက်ပို၍မမှန်ကန်ပါ။</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>ဤကွက်လပ်ကိုမမျှော်လင့်ထားပါ။</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>ဤကွက်လပ်ကိုမမျှော်လင့်ထားပါ။</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သော်ရက်စွဲမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သော် ရက်စွဲ/အချိန် မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သော် အီးမေးလိပ်စာ မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>ဖိုင်ရှာမတွေ့ပါ။</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>ဤဖိုင်ကို ဖတ်၍မရပါ။</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ဖိုင်အရွယ်အစား အလွန်ကြီးနေသည် ({{ size }} {{ suffix }}). ခွင့်ပြုထားသော အများဆုံး ဖိုင်ဆိုဒ်သည် {{ limit }} {{ suffix }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>ဖိုင်၏ mime အမျိုးအစားမမှန်ကန်ပါ ({{ type }})။ ခွင့်ပြုထားသော mime အမျိုးအစားများမှာ {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>ဤတန်ဖိုးသည် {{ limit }} (သို့မဟုတ်) {{ limit }} ထက်နည်းသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>ဤတန်ဖိုးသည် အလွန်ရှည်လွန်းသည်။ ၎င်းတွင်အက္ခရာ {{ limit }} (သို့မဟုတ်) ၎င်းထက်နည်းသင့်သည်။ | ဤတန်ဖိုးသည် အလွန်ရှည်လွန်းသည်။ ၎င်းတွင်အက္ခရာ {{limit}} ခုနှင့်အထက်ရှိသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>ဤတန်ဖိုးသည် {{limit}} (သို့မဟုတ်) ထို့ထက်ပိုသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>ဤတန်ဖိုးသည် အလွန်တိုလွန်းသည်။ ၎င်းတွင်အက္ခရာ {{limit}} (သို့မဟုတ်) ထို့ထက်ပိုရှိသင့်သည်။ | ဤတန်ဖိုးသည်တိုလွန်းသည်။ ၎င်းတွင်အက္ခရာ {{limit}} လုံးနှင့်အထက်ရှိသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>ဤတန်ဖိုးသည်ကွက်လပ်မဖြစ်သင့်ပါ။</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>ဤတန်ဖိုးသည် null မဖြစ်သင့်ပါ။</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>ဤတန်ဖိုးသည် null ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သောတန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သော အချိန်တန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သော URL တန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>တန်ဖိုးနှစ်ခုသည် တူညီသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ဤဖိုင်သည် အလွန်ကြီးသည်။ ခွင့်ပြုထားသည့်အများဆုံးဖိုင်အရွယ်အစားသည် {{ limit }} {{ suffix }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>ဤဖိုင်သည် အလွန်ကြီးသည်။</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>ဤဖိုင်ကိုတင်၍မရပါ။</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သောနံပါတ်ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>ဤဖိုင်သည်မှန်ကန်သော ဓါတ်ပုံမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော IP လိပ်စာ မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သောဘာသာစကားမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သောဘာသာပြန်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သောနိုင်ငံမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>ဤတန်ဖိုးသည် အသုံးပြုပြီးသားဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>ဓါတ်ပုံအရွယ်အစားကိုရှာမတွေ့ပါ။</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>ပုံ၏အလျားသည် ကြီးလွန်းသည် ({{ width }}px)။ ခွင့်ပြုထားသည့်အများဆုံးအလျားသည် {{max_width}}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>ပုံ၏အလျားသည် သေးလွန်းသည် ({{ width }}px)။ ခွင့်ပြုထားသည့်အနည်းဆုံးအလျားသည် {{max_width}}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ပုံ၏အနံသည် ကြီးလွန်းသည် ({{ height }}px)။ ခွင့်ပြုထားသည့်အများဆုံးအနံသည် {{max_height}}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ပုံ၏အနံသည် သေးလွန်းသည် ({{ height }}px)။ ခွင့်ပြုထားသည့်အနည်းဆုံးအနံသည် {{min_height}}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>ဤတန်ဖိုးသည်အသုံးပြုသူ၏ လက်ရှိစကားဝှက်ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>ဤတန်ဖိုးသည်စာလုံး {{limit}} အတိအကျရှိသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>ဤဖိုင်သည်တစ်စိတ်တစ်ပိုင်းသာ upload တင်ခဲ့သည်။</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>မည်သည့် ဖိုင်မျှ upload မလုပ်ခဲ့ပါ။</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">php.ini တွင်ယာယီဖိုင်တွဲကိုပြင်ဆင်ထားခြင်းမရှိပါ၊ သို့မဟုတ် ပြင်ဆင်ထားသောဖိုင်တွဲမရှိပါ။</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>ယာရီဖိုင်ကို disk မရေးနိုင်ပါ။</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP extension တစ်ခုကြောင့် upload တင်၍မရနိုင်ပါ။</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>ဤ collection တွင် {{limit}} element (သို့မဟုတ်) ထို့ထက်မပိုသင့်ပါ။</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>ဤ collection တွင် {{limit}} element (သို့မဟုတ်) ၎င်းထက်နည်းသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>ဤစုစည်းမှုတွင် {{limit}} element အတိအကျပါသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>ကဒ်နံပါတ်မမှန်ပါ။</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>ကဒ်အမျိုးအစားမမှန်ပါ (သို့မဟုတ်) ကဒ်နံပါတ်မမှန်ပါ။</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော နိုင်ငံတကာ ဘဏ်စာရင်းနံပါတ် (IBAN) မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သော ISBN-10 တန်ဖိုးမဟုတ်ပါ၊</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သော ISBN-13 တန်ဖိုးမဟုတ်ပါ၊</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် ISBN-10 (သို့မဟုတ်) ISBN-13 တန်ဖိုးမဟုတ်ပါ၊</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် ISSN တန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် ငွေကြေးတန်ဖိုးမဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} နှင့်ညီသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} ထက်ကြီးသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} ထက်ကြီးသင့်သည် (သို့မဟုတ်) ဤတန်ဖိုးသည် {{ compared_value }} ညီသင့်သည်။ </target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value_type }} {{ compared_value }} နှင့်ထပ်တူညီမျှသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} ထက်မနဲသောတဲ့ တန်ဖိုးဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} ထက် မနည်းသောတန်ဖိုး (သို့မဟုတ်) ညီမျှသောတန်ဖိုးဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value }} နှင့်မညီသင့်ပါ။</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{ compared_value_type }} {{ compared_value }} နှင့်ထပ်တူမညီမျှသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>ဤဓာတ်ပုံအချိုးအစားသည်အလွန်ကြီးလွန်းသည်။ ({{ ratio }})။ ခွင့်ပြုထားသောဓာတ်ပုံအချိုးအသားသည် {{ max_ratio }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>ဤဓာတ်ပုံအချိုးအစားသည်အလွန်သေးလွန်းသည်။ ({{ ratio }})။ ခွင့်ပြုထားသောဓာတ်ပုံအချိုးအသားသည် {{ min_ratio }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>ဤဓာတ်ပုံသည် စတုရန်းဖြစ်နေသည် ({{ width }}x{{ height }}px)။ စတုရန်းဓာတ်ပုံများကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>ဤဓာတ်ပုံသည် အလျှားလိုက်ဖြစ်နေသည် ({{ width }}x{{ height }}px). အလျှားလိုက်ဓာတ်ပုံများခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>ဤဓာတ်ပုံသည် ဒေါင်လိုက်ဖြစ်နေသည် ({{ width }}x{{ height }}px). ဒေါင်လိုက်ဓာတ်ပုံများခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>ဖိုင်အလွတ်ကိုတင်ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>host ဖြေရှင်း၍မနိုင်ပါ။</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>ဤတန်ဖိုးသည် မျှော်မှန်းထားသော {{ charset }} စားလုံးနှင့် ကိုက်ညီမှုမရှိပါ။</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော စီးပွားရေး မှတ်ပုံတင်ကုဒ် (BIC) မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>အမှား</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော UUID မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>ဤတန်ဖိုးသည် {{compared_value}} ၏ စတူတန်ဖိုးဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>ဤ Business Identifier Code (BIC) သည် IBAN {{ iban }} နှင့်ဆက်စပ်မှုမရှိပါ။</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် JSON တန်ဖိုးဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>ဤ collection ကိုယ်ပိုင် elements များ ပါသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>ဤတန်ဖိုးသည် အပေါင်းဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>ဤတန်ဖိုးသည် အပေါင်း (သို့မဟုတ်) သုည ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>ဤတန်ဖိုးသည် အနုတ် ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>ဤတန်ဖိုးသည် အနုတ် (သို့မဟုတ်) သုည ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>ဤတန်ဖိုးသည် မှန်ကန်သော အချိန်ဇုန်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>ဤစကားဝှက် သည် ဒေတာပေါက်ကြားမှုတစ်ခုဖြစ်ခဲ့သည်။ ဤစကား၀ှက်ကိုအသုံးမပြုရပါ။  ကျေးဇူးပြု၍ အခြားစကားဝှက်ကိုသုံးပါ။</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>ဤတန်ဖိုးသည် {{ min }} နှင့် {{ max }} ကြားရှိသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် hostname မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>ဤ collection တွင်ပါပါ၀င်သော elements အရေအတွက်သည် {{ compared_value }} ၏ စတူဖြစ်သင့်သည်။ </target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>ဤတန်ဖိုးသည် အောက်ပါကန့်သတ်ချက်များအနက်မှအနည်းဆုံးတစ်ခု ဖြည့်ဆည်းပေးသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>ဤ collection ၏ element တစ်ခုစီသည်၎င်း၏ကိုယ်ပိုင်ကန့်သတ်ချက်များကိုဖြည့်ဆည်းသင့်သည်။</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>ဤတန်ဖိုးသည် သင့်လျှော်သော် အပြည်ပြည်ဆိုင်ရာငွေချေးသက်သေခံနံပါတ် ,International Securities Identification Number (ISIN) မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>ဤတန်ဖိုးသည်မှန်ကန်သောစကားရပ်ဖြစ်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် CSS အရောင်မှန်ကန်မှုမရှိပါ။</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် CIDR မှတ်စုံမှန်ကန်မှုမရှိပါ။</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target state="needs-review-translation">ကွန်ယက်မျက်နှာဖုံး၏ တန်ဖိုးသည် {{ min }} နှင့် {{ max }} ကြားရှိရမည်။</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">ဖိုင်နာမည်သည် အရှည်လွန်းသည်။ သင်္ကေတ {{ filename_max_length }} သို့မဟုတ် နည်းသည့်အရေအတွက်ရှိရမည်။|ဖိုင်နာမည်သည် အရှည်လွန်းသည်။ သင်္ကေတ {{ filename_max_length }} သို့မဟုတ် နည်းသည့်အရေအတွက်ရှိရမည်။</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">စကားဝှက်ခိုင်မာမှုနည်းပါးသည်။ ပိုခိုင်မာသော စကားဝှက်ကို သုံးပါ။</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးတွင် လက်ရှိကန့်သတ်မှုအဆင့်မှ ခွင့်မပြုထားသော ဇာတ်ကောင်များပါဝင်သည်။</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">မမြင်ရသော ဇာတ်ကောင်များကို သုံးခြင်းကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">မတူညီသော ဇာတ်ကောင်များမှ နံပါတ်များကို ရောနှောစပ်ခြင်းကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">ပုန်းထားသော အထပ်ကောင်းဇာတ်ကောင်များကို သုံးခြင်းကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">ဖိုင်တွင်းတိုးခြင်းသည် မမှန်ကန်ပါ ({{ extension }})။ ခွင့်ပြုထားသော တိုးခြင်းများမှာ {{ extensions }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">တွေ့ရှိထားသော စာလုံးကုဒ်စံနစ်သည် မမှန်ကန်ပါ ({{ detected }})။ ခွင့်ပြုထားသော ကုဒ်စံနစ်များမှာ {{ encodings }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော MAC လိပ်စာ မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">ဤ URL တွင် အမြင့်ဆုံးအဆင့်ဒိုမိန်း ပါဝင်မရှိပါ။</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် အလွန်တိုတောင်းသည်။ အနည်းဆုံး စကားလုံးတစ်လုံး ပါဝင်သင့်သည်။|ဤတန်ဖိုးသည် အလွန်တိုတောင်းသည်။ အနည်းဆုံး စကားလုံး {{ min }} လုံး ပါဝင်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် အလွန်ရှည်လျားသည်။ စကားလုံးတစ်လုံးသာ ပါဝင်သင့်သည်။|ဤတန်ဖိုးသည် အလွန်ရှည်လျားသည်။ စကားလုံး {{ max }} လုံး သို့မဟုတ် ထိုထက်နည်းသည် ပါဝင်သင့်သည်။</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် ISO 8601 ပုံစံအတိုင်း မသက်ဆိုင်သော သီတင်းပတ်ကို ကိုယ်စားမပြုပါ။</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည်မှန်ကန်သည့်အပတ်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် သီတင်းပတ် "{{ min }}" မတိုင်မီ ဖြစ်သင့်သည်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် သီတင်းပတ် "{{ max }}" ပြီးနောက် ဖြစ်သင့်သည်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">ဤတန်ဖိုးသည် မှန်ကန်သော Twig တင်းပလိတ်မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">ဤဖိုင်သည် မှန်ကန်သော ဗီဒီယို မဟုတ်ပါ။</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">ဗီဒီယို၏ အရွယ်အစားကို စိစစ်မရနိုင်ခဲ့ပါ။</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">ဗီဒီယိုအကျယ် {{ width }}px သည် အလွန်ကြီးနေသည်။ ခွင့်ပြုထားသော အများဆုံးအကျယ်မှာ {{ max_width }}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">ဗီဒီယိုအကျယ်အဝန်းမှာ သေးလွန်းနေပါတယ် ({{ width }}px)။ ခန့်မှန်းထားသော အနည်းဆုံး အကျယ်မှာ {{ min_width }}px ဖြစ်ပါတယ်။</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">ဗီဒီယိုအမြင့် ကြီးလွန်းသည် ({{ height }}px)။ ခွင့်ပြုထားသော အမြင့်အများဆုံးမှာ {{ max_height }}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">ဗွီဒီယိုအမြင့် သက်သက်ငယ်နေပါသည် ({{ height }}px)။ မျှော်မှန်းထားသော အနည်းဆုံးအမြင့်မှာ {{ min_height }}px ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">ဗီဒီယိုတွင် ပစ်ဆယ် အရေအတွက် နည်းလွန်းသည် ({{ pixels }})။ မျှော်လင့်ထားသည့် အနည်းဆုံး အရေအတွက်မှာ {{ min_pixels }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">ဗီဒီယိုတွင် pixel များ အလွန်များနေသည် ({{ pixels }})။ မျှော်မှန်းထားသော အများဆုံးပမာဏမှာ {{ max_pixels }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">ဗီဒီယို အချိုးအစား များလွန်းသည် ({{ ratio }})။ ခွင့်ပြုထားသော အများဆုံး အချိုးအစားမှာ {{ max_ratio }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">ဗီဒီယိုအချိုးအစား သောလွန်းငယ်သည် ({{ ratio }})။ ခန့်မှန်းထားသော အနည်းဆုံး အချိုးအစားမှာ {{ min_ratio }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">ဗီဒီယိုသည် စတုဂံဖြစ်သည် ({{ width }}x{{ height }}px)။ စတုဂံ ဗီဒီယိုများကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">ဗီဒီယိုသည် အလျားလိုက် ({{ width }}x{{ height }} px) ဖြစ်သည်။ အလျားလိုက်ဗီဒီယိုများကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">ဗီဒီယိုသည် ဒေါင်လိုက် ရှုထောင့်ဖြစ်သည် ({{ width }}x{{ height }}px)။ ဒေါင်လိုက် ဗီဒီယိုများကို ခွင့်မပြုပါ။</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">ဗီဒီယိုဖိုင် ပျက်စီးထားသည်။</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">ဗီဒီယိုတွင် စီးဆင်းမှုများ များစွာ ပါရှိသည်။ စီးဆင်းမှုတစ်ခုသာ ခွင့်ပြုထားသည်။</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">ပံ့ပိုးမထားသော ဗီဒီယိုကုဒက် "{{ codec }}" ။</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">မပံ့ပိုးထားသော ဗီဒီယို ကွန်တိနာ "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">ပုံဖိုင် ပျက်စီးနေသည်။</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">ပုံတွင် ပစ်ဆယ်များအလွန်နည်းပါးသည် ({{ pixels }})။ မျှော်မှန်းထားသော အနည်းဆုံး အရေအတွက်မှာ {{ min_pixels }} ဖြစ်သည်။</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">ပုံတွင် ပစ်ကဆယ်များ အလွန်များနေသည် ({{ pixels }}). လျှောက်ထားထားသော အများဆုံး ပမာဏမှာ {{ max_pixels }} ဖြစ်သည်.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">ဤဖိုင်နာမည်သည် မျှော်မှန်းထားသော အက္ခရာစုနှင့် ကိုက်ညီမှုမရှိပါ။</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="fi" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Arvon tulee olla epätosi.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Arvon tulee olla tosi.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Arvon tulee olla tyyppiä {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Arvon tulee olla tyhjä.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Arvon tulee olla yksi annetuista vaihtoehdoista.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Sinun tulee valita vähintään yksi vaihtoehto.|Sinun tulee valita vähintään {{ limit }} vaihtoehtoa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Sinun tulee valita enintään yksi vaihtoehto.|Sinun tulee valita enintään {{ limit }} vaihtoehtoa.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Yksi tai useampi annetuista arvoista on virheellinen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Tätä kenttää ei odotettu.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Tämä kenttä puuttuu.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Annettu arvo ei ole kelvollinen päivämäärä.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Annettu arvo ei ole kelvollinen päivämäärä ja kellonaika.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Annettu arvo ei ole kelvollinen sähköpostiosoite.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Tiedostoa ei löydy.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Tiedostoa ei voi lukea.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tiedostonkoko ({{ size }} {{ suffix }}) on liian iso. Suurin sallittu tiedostonkoko on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Tiedostotyyppi ({{ type }}) on virheellinen. Sallittuja tiedostotyyppejä ovat {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Arvon tulee olla {{ limit }} tai vähemmän.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Liian pitkä syöte. Syöte saa olla enintään yhden merkin.|Liian pitkä syöte. Syöte saa olla enintään {{ limit }} merkkiä.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Arvon tulee olla {{ limit }} tai enemmän.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Liian lyhyt syöte. Syötteen tulee olla vähintään yhden merkin.|Liian lyhyt syöte. Syötteen tulee olla vähintään {{ limit }} merkkiä.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Kenttä ei voi olla tyhjä.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Annettu arvo ei voi olla null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Annetun arvon tulee olla null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Virheellinen arvo.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Annettu arvo ei ole kelvollinen kellonaika.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Annettu arvo ei ole kelvollinen URL-osoite.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Kahden annetun arvon tulee olla samat.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Annettu tiedosto on liian iso. Suurin sallittu tiedostokoko on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Tiedosto on liian iso.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Tiedoston siirto epäonnistui.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Arvon tulee olla numero.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tiedosto ei ole kelvollinen kuva.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Tämä arvo ei ole kelvollinen IP-osoite.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Arvo ei ole kelvollinen kieli.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Arvo ei ole kelvollinen kieli- ja alueasetus (locale).</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Arvo ei ole kelvollinen maa.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Arvo on jo käytetty.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Kuvan kokoa ei tunnistettu.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Kuva on liian leveä ({{ width }} px). Leveyden tulee olla enintään {{ max_width }} px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Kuva on liian kapea ({{ width }} px). Leveyden tulee olla vähintään {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Kuva on liian korkea ({{ width }} px). Korkeuden tulee olla enintään {{ max_width }} px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Kuva on liian matala ({{ height }} px). Korkeuden tulee olla vähintään {{ min_height }} px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Arvon tulee olla käyttäjän tämänhetkinen salasana.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Arvon tulee olla tasan yhden merkin pituinen.|Arvon tulee olla tasan {{ limit }} merkin pituinen.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Tiedosto ladattiin vain osittain.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tiedostoa ei ladattu.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Väliaikaista kansiota ei ole määritetty php.ini:ssä, tai määritetty kansio ei ole olemassa.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Väliaikaistiedostoa ei voitu kirjoittaa levylle.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP-laajennoksen vuoksi tiedoston lataus epäonnistui.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Tässä ryhmässä tulee olla vähintään yksi elementti.|Tässä ryhmässä tulee olla vähintään {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Tässä ryhmässä tulee olla enintään yksi elementti.|Tässä ryhmässä tulee olla enintään {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Tässä ryhmässä tulee olla tasan yksi elementti.|Tässä ryhmässä tulee olla tasan {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Virheellinen korttinumero.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tätä korttityyppiä ei tueta tai korttinumero on virheellinen.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Tämä arvo ei ole kelvollinen kansainvälinen pankkitilinumero (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Arvo ei ole kelvollinen ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Arvo ei ole kelvollinen ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Arvo ei ole kelvollinen ISBN-10 eikä ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Arvo ei ole kelvollinen ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Arvo ei ole kelvollinen valuutta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Arvo ei ole sama kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Arvon tulee olla suurempi kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Arvon tulee olla suurempi tai yhtä suuri kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Arvon tulee olla sama kuin {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Arvon tulee olla pienempi kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Arvon tulee olla pienempi tai yhtä suuri kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Arvon ei tule olla sama kuin {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Arvon ei tule olla sama kuin {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Kuvasuhde on liian suuri ({{ ratio }}). Suurin sallittu suhde on {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Kuvasuhde on liian pieni ({{ ratio }}). Pienin sallittu suhde on {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Kuva on neliö ({{ width }}x{{ height }} px). Neliönmuotoiset kuvat eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Kuva on vaakasuuntainen ({{ width }}x{{ height }} px). Vaakasuuntaiset kuvat eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Kuva on pystysuuntainen ({{ width }}x{{ height }} px). Pystysuuntaiset kuvat eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Tiedosto ei saa olla tyhjä.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Palvelimeen ei saatu yhteyttä.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Arvo ei vastaa odotettua merkistöä {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Tämä arvo ei ole kelvollinen liiketoiminnan tunnistekoodi (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Virhe</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Tämä arvo ei ole kelvollinen UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Tämän arvon tulee olla luvun {{ compared_value }} kerrannainen.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Tätä yritystunnusta (BIC) ei ole liitetty IBAN-tilinumeroon {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Arvon tulee olla kelvollinen JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ryhmän tulee sisältää vain yksilöllisiä arvoja.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Arvon tulee olla positiivinen.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Arvon tulee olla joko positiivinen tai nolla.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Arvon tulee olla negatiivinen.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Arvon tulee olla joko negatiivinen tai nolla.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Arvo ei ole kelvollinen aikavyöhyke.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Tämä salasana on vuotanut tietomurrossa, eikä sitä saa käyttää. Käytä toista salasanaa.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Arvon tulee olla {{ min }} - {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Arvo ei ole kelvollinen laitenimi (hostname).</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Ryhmässä olevien elementtien määrän pitää olla luvun {{ compared_value }} kerrannainen.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Arvon tulee läpäistä vähintään yksi seuraavista tarkistuksista:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Ryhmän jokaisen elementin tulee läpäistä omat tarkistuksensa.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Tämä arvo ei ole kelvollinen ISIN-koodi (International Securities Identification Number).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Tämän arvon on oltava kelvollinen lauseke.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Tämä arvo ei ole kelvollinen CSS-värimääritys.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Tämä arvo ei ole kelvollinen CIDR-merkintä.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Verkkomaskille annetun arvon tulee olla {{ min }} - {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Tiedostonimi on liian pitkä. Nimi saa olla enintään yhden merkin pituinen.|Tiedostonimi on liian pitkä. Nimi saa olla enintään {{ filename_max_length }} merkin pituinen.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Salasana on liian heikko. Valitse vahvempi salasana.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Arvo sisältää merkkejä, joita nykyinen rajoitustaso ei salli.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Näkymättömiä merkkejä ei saa käyttää.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Eri kirjaimistojen numeroita ei saa sekoittaa.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Piilotettuja tarkemerkkejä ei saa käyttää.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Tiedostopääte ({{ extension }}) on virheellinen. Sallitut tiedostopäätteet ovat: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Havaittu merkistö on virheellinen ({{ detected }}). Sallitut merkistöt ovat {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Tämä arvo ei ole kelvollinen MAC-osoite.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Tästä URL-osoitteesta puuttuu ylätason verkkotunnus.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Tämä arvo on liian lyhyt. Sen pitäisi sisältää vähintään yksi sana.|Tämä arvo on liian lyhyt. Sen pitäisi sisältää vähintään {{ min }} sanaa.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Tämä arvo on liian pitkä. Sen pitäisi sisältää vain yksi sana.|Tämä arvo on liian pitkä. Sen pitäisi sisältää {{ max }} sanaa tai vähemmän.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Tämä arvo ei esitä kelvollista viikkoa ISO 8601 -muodossa.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Tämä arvo ei ole kelvollinen viikko.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Tämän arvon ei pitäisi olla ennen viikkoa "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Tämän arvon ei pitäisi olla viikon "{{ max }}" jälkeen.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Tämä arvo ei ole kelvollinen Twig-malli.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Tämä tiedosto ei ole kelvollinen video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videon kokoa ei voitu tunnistaa.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Videon leveys on liian suuri ({{ width }} px). Leveyden tulee olla enintään {{ max_width }} px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Videon leveys on liian pieni ({{ width }} px). Leveyden tulee olla vähintään {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Videon korkeus on liian suuri ({{ height }} px). Korkeuden tulee olla enintään {{ max_height }} px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Videon korkeus on liian pieni ({{ height }} px). Korkeuden tulee olla vähintään {{ min_height }} px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videossa on liian vähän pikseleitä ({{ pixels }}). Pikseleitä tulee olla vähintään {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videossa on liikaa pikseleitä ({{ pixels }}). Pikseleitä tulee olla enintään {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Videon kuvasuhde on liian suuri ({{ ratio }}). Suurin sallittu suhde on {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Videon kuvasuhde on liian pieni ({{ ratio }}). Pienin sallittu suhde on {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video on neliön muotoinen ({{ width }}x{{ height }}px). Neliönmuotoiset videot eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video on vaakasuuntainen ({{ width }}x{{ height }} px). Vaakasuuntaiset videot eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video on pystysuuntainen ({{ width }}x{{ height }} px). Pystysuuntaiset videot eivät ole sallittuja.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videotiedosto on vioittunut.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videossa on useita virtoja. Vain yksi virta on sallittu.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Videokoodekkia ei tueta ({{ codec }}).</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Videon säiliömuotoa ei tueta ({{ container }}).</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Kuvatiedosto on vioittunut.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Kuvassa on liian vähän pikseleitä ({{ pixels }}). Pikseleitä tulee olla vähintään {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Kuvassa on liikaa pikseleitä ({{ pixels }}). Pikseleitä tulee olla enintään {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Tämä tiedostonimi ei vastaa odotettua merkistöä.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="nb" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Verdien må være usann.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Verdien må være sann.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Verdien skal ha typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Verdien skal være blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Den valgte verdien er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du må velge minst {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan maks velge {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>En eller flere av de oppgitte verdiene er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Dette feltet var ikke forventet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dette feltet mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Verdien er ikke en gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Verdien er ikke en gyldig dato/tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Verdien er ikke en gyldig e-postadresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunne ikke finnes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen er ikke lesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilatte maksimale størrelse {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mimetypen av filen er ugyldig ({{ type }}). Tilatte mimetyper er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Verdien må være {{ limit }} tegn lang eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Verdien er for lang. Den må ha {{ limit }} tegn eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Verdien må være {{ limit }} eller mer.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Verdien er for kort. Den må ha {{ limit }} tegn eller flere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Verdien kan ikke være blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Verdien kan ikke være tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Verdien skal være tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Verdien er ugyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Verdien er ikke en gyldig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Verdien er ikke en gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Verdiene skal være identiske.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor. Den maksimale størrelsen er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunne ikke lastes opp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Verdien skal være et gyldig tall.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Denne filen er ikke et gyldig bilde.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Denne verdien er ikke en gyldig IP-adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Verdien er ikke et gyldig språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Verdien er ikke en gyldig lokalitet.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Verdien er ikke et gyldig navn på land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Verdien er allerede brukt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Bildestørrelsen kunne ikke oppdages.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Bildebredden er for stor ({{ width }} piksler). Tillatt maksimumsbredde er {{ max_width }} piksler.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Bildebredden er for liten ({{ width }} piksler). Forventet minimumsbredde er {{ min_width }} piksler.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bildehøyden er for stor ({{ height }} piksler). Tillatt maksimumshøyde er {{ max_height }} piksler.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Bildehøyden er for liten ({{ height }} piksler). Forventet minimumshøyde er {{ min_height }} piksler.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Verdien skal være brukerens sitt nåværende passord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Verdien skal være nøyaktig {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen var kun delvis opplastet.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil var lastet opp.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Ingen midlertidig mappe ble konfigurert i php.ini, eller den konfigurerte mappen eksisterer ikke.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikke skrive midlertidig fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP-utvidelse forårsaket en feil under opplasting.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samlingen må inneholde {{ limit }} element eller flere.|Denne samlingen må inneholde {{ limit }} elementer eller flere.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samlingen må inneholde {{ limit }} element eller færre.|Denne samlingen må inneholde {{ limit }} elementer eller færre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samlingen må inneholde nøyaktig {{ limit }} element.|Denne samlingen må inneholde nøyaktig {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldig kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Korttypen er ikke støttet eller kortnummeret er ugyldig.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Denne verdien er ikke et gyldig internasjonalt bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Verdien er ikke en gyldig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Verdien er ikke en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Verdien er hverken en gyldig ISBN-10 eller ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Verdien er ikke en gyldig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Verdien er ikke gyldig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Verdien skal være lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Verdien skal være større enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Verdien skal være større enn eller lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Verdien skal være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Verdien skal være mindre enn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Verdien skal være mindre enn eller lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Verdien skal ikke være lik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Verdien skal ikke være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Bildeforholdet er for stort ({{ ratio }}). Tillatt bildeforhold er maks {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Bildeforholdet er for lite ({{ ratio }}). Forventet bildeforhold er minst {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Bildet er en kvadrat ({{ width }}x{{ height }}px). Kvadratiske bilder er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Bildet er i liggende retning ({{ width }}x{{ height }}px). Bilder i liggende retning er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Bildet er i stående retning ({{ width }}x{{ height }}px). Bilder i stående retning er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Tomme filer er ikke tilatt.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Vertsnavn kunne ikke løses.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Verdien samsvarer ikke med forventet tegnsett {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Denne verdien er ikke en gyldig forretningsidentifikasjonskode (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Feil</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Denne verdien er ikke en gyldig UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Verdien skal være flertall av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Business Identifier Code (BIC) er ikke tilknyttet en IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Verdien er ikke gyldig JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Samlingen kan kun inneholde unike elementer.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Denne verdien må være positiv.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Denne verdien må være positiv eller null.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Denne verdien må være negativ.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Denne verdien må være negativ eller null.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Verdien er ikke en gyldig tidssone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dette passordet er lekket i et datainnbrudd, det må ikke tas i bruk. Vennligst bruk et annet passord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Verdien må være mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Denne verdien er ikke et gyldig vertsnavn.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Antall elementer i denne samlingen bør være et multiplum av {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Denne verdien skal tilfredsstille minst en av følgende begrensninger:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Hvert element i denne samlingen skal tilfredsstille sitt eget sett med begrensninger.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Denne verdien er ikke et gyldig International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Denne verdien skal være et gyldig uttrykk.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Denne verdien er ikke en gyldig CSS-farge.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Denne verdien er ikke en gyldig CIDR-notasjon.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Verdien på nettmasken skal være mellom {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Filnavnet er for langt. Det bør ha {{ filename_max_length }} tegn eller mindre.|Filnavnet er for langt. Det bør ha {{ filename_max_length }} tegn eller mindre.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Passordstyrken er for lav. Vennligst bruk et sterkere passord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Denne verdien inneholder tegn som ikke er tillatt av gjeldende restriksjonsnivå.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Det er ikke tillatt å bruke usynlige tegn.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Det er ikke tillatt å blande tall fra forskjellige skript.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Det er ikke tillatt å bruke skjulte overleggskarakterer.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Filutvidelsen er ugyldig ({{ extension }}). Tillatte utvidelser er {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Den oppdagede tegnkodingen er ugyldig ({{ detected }}). Tillatte kodinger er {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Denne verdien er ikke en gyldig MAC-adresse.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Denne URL-en mangler et toppnivådomene.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Denne verdien er for kort. Den bør inneholde minst ett ord.|Denne verdien er for kort. Den bør inneholde minst {{ min }} ord.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Denne verdien er for lang. Den bør inneholde kun ett ord.|Denne verdien er for lang. Den bør inneholde {{ max }} ord eller færre.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Denne verdien representerer ikke en gyldig uke i ISO 8601-formatet.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Denne verdien er ikke en gyldig uke.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Denne verdien bør ikke være før uke "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Denne verdien bør ikke være etter uke "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Denne verdien er ikke en gyldig Twig-mal.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Denne filen er ikke en gyldig video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videostørrelsen kunne ikke oppdages.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Videobredden er for stor ({{ width }}px). Tillatt maksimal bredde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Videobredden er for liten ({{ width }}px). Forventet minimumsbredde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Videohøyden er for stor ({{ height }}px). Tillatt maksimal høyde er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Videoens høyde er for liten ({{ height }}px). Forventet minstehøyde er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videoen har for få piksler ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videoen har for mange piksler ({{ pixels }}). Forventet maksimalt antall er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Video-forholdet er for stort ({{ ratio }}). Tillatt maksimalt forhold er {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Videoforholdet er for lite ({{ ratio }}). Forventet minimumsforhold er {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videoen er kvadratisk ({{ width }}x{{ height }}px). Kvadratiske videoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videoen er i liggende format ({{ width }}x{{ height }} px). Liggende videoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videoen er i portrettformat ({{ width }}x{{ height }}px). Portrettvideoer er ikke tillatt.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videofilen er ødelagt.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videoen inneholder flere strømmer. Kun én strøm er tillatt.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Ikke støttet videokodek «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Ikke-støttet videokontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Bildefilen er ødelagt.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Bildet har for få piksler ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Bildet har for mange piksler ({{ pixels }}). Forventet maksimalt antall er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Dette filnavnet samsvarer ikke med forventet tegnsett.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="cs" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Tato hodnota musí být nepravdivá (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Tato hodnota musí být pravdivá (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Tato hodnota musí být typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Tato hodnota musí být prázdná.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vybraná hodnota není platnou možností.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Musí být vybrána nejméně {{ limit }} možnost.|Musí být vybrány nejméně {{ limit }} možnosti.|Musí být vybráno nejméně {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Musí být vybrána maximálně {{ limit }} možnost.|Musí být vybrány maximálně {{ limit }} možnosti.|Musí být vybráno maximálně {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Některé z uvedených hodnot jsou neplatné.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Toto pole nebylo očekáváno.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Toto pole chybí.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Tato hodnota není platné datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Tato hodnota není platné datum s časovým údajem.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Tato hodnota není platná e-mailová adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Soubor nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Soubor je nečitelný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Soubor je příliš velký ({{ size }} {{ suffix }}). Maximální povolená velikost souboru je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Neplatný mime typ souboru ({{ type }}). Povolené mime typy souborů jsou {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Tato hodnota musí být {{ limit }} nebo méně.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znak.|Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znaky.|Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Tato hodnota musí být {{ limit }} nebo více.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znak.|Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znaky.|Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Tato hodnota nesmí být prázdná.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Tato hodnota nesmí být null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Tato hodnota musí být null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Tato hodnota není platná.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Tato hodnota není platný časový údaj.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Tato hodnota není platná URL adresa.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Tyto dvě hodnoty musí být stejné.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Soubor je příliš velký. Maximální povolená velikost souboru je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Soubor je příliš velký.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Soubor se nepodařilo nahrát.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Tato hodnota musí být číslo.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tento soubor není obrázek.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Tato hodnota není platnou IP adresou.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Tento jazyk neexistuje.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Tato lokalizace neexistuje.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Tato země neexistuje.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Tato hodnota je již používána.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepodařily se zjistit rozměry obrázku.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Obrázek je příliš široký ({{ width }}px). Maximální povolená šířka je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Obrázek je příliš úzký ({{ width }}px). Minimální očekávaná šířka je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Obrázek je příliš vysoký ({{ height }}px). Maximální povolená výška je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Obrázek je příliš nízký ({{ height }}px). Minimální očekávaná výška je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Tato hodnota musí být aktuální heslo uživatele.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Tato hodnota musí mít přesně {{ limit }} znak.|Tato hodnota musí mít přesně {{ limit }} znaky.|Tato hodnota musí mít přesně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Byla nahrána jen část souboru.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Žádný soubor nebyl nahrán.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>V php.ini nebyla nastavena cesta k dočasnému adresáři, nebo nastavený adresář neexistuje.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Dočasný soubor se nepodařilo zapsat na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozšíření PHP zabránilo nahrání souboru.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Tato kolekce musí obsahovat minimálně {{ limit }} prvek.|Tato kolekce musí obsahovat minimálně {{ limit }} prvky.|Tato kolekce musí obsahovat minimálně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Tato kolekce musí obsahovat maximálně {{ limit }} prvek.|Tato kolekce musí obsahovat maximálně {{ limit }} prvky.|Tato kolekce musí obsahovat maximálně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Tato kolekce musí obsahovat přesně {{ limit }} prvek.|Tato kolekce musí obsahovat přesně {{ limit }} prvky.|Tato kolekce musí obsahovat přesně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodporovaný typ karty nebo neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Tato hodnota není platným Mezinárodním bankovním číslem účtu (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Tato hodnota není platné ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Tato hodnota není platné ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Tato hodnota není platné ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Tato hodnota není platné ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Tato měna neexistuje.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Tato hodnota musí být větší než {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být větší nebo rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Tato hodnota musí být typu {{ compared_value_type }} a zároveň musí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Tato hodnota musí být menší než {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být menší nebo rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Tato hodnota nesmí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Tato hodnota nesmí být typu {{ compared_value_type }} a zároveň nesmí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Poměr stran obrázku je příliš velký ({{ ratio }}). Maximální povolený poměr stran je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Poměr stran obrázku je příliš malý ({{ ratio }}). Minimální očekávaný poměr stran je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Obrázek je čtvercový ({{ width }}x{{ height }}px). Čtvercové obrázky nejsou povolené.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Obrázek je orientovaný na šířku ({{ width }}x{{ height }}px). Obrázky orientované na šířku nejsou povolené.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Obrázek je orientovaný na výšku ({{ width }}x{{ height }}px). Obrázky orientované na výšku nejsou povolené.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Soubor nesmí být prázdný.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Hostitele nebylo možné rozpoznat.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Tato hodnota neodpovídá očekávané znakové sadě {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Tato hodnota není platným Kódem obchodního identifikátoru (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Chyba</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Tato hodnota není platným UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Tato hodnota musí být násobek hodnoty {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Bankovní identifikační kód (BIC) neodpovídá mezinárodnímu číslu účtu (IBAN) {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Tato hodnota musí být validní JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Tato kolekce musí obsahovat pouze unikátní prvky.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Tato hodnota musí být kladná.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Tato hodnota musí být buď kladná nebo nula.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Tato hodnota musí být záporná.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Tato hodnota musí být buď záporná nebo nula.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Tato časová zóna neexistuje.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Zadané heslo bylo součástí úniku dat, takže ho není možné použít. Použijte prosím jiné heslo.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Hodnota musí být mezi {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Tato hodnota není platný hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Počet prvků v této kolekci musí být násobek {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Tato hodnota musí splňovat alespoň jedno z následujících omezení:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Každý prvek v této kolekci musí splňovat svá vlastní omezení.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Tato hodnota není platné mezinárodní identifikační číslo cenného papíru (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Tato hodnota musí být platný výraz.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Tato hodnota není platná barva CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Tato hodnota není platná notace CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Hodnota masky sítě musí být mezi {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Název souboru je příliš dlouhý. Měl by obsahovat {{ filename_max_length }} znak nebo méně.|Název souboru je příliš dlouhý. Měl by obsahovat {{ filename_max_length }} znaky nebo méně.|Název souboru je příliš dlouhý. Měl by obsahovat {{ filename_max_length }} znaků nebo méně.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Síla hesla je příliš nízká. Použijte silnější heslo, prosím.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Tato hodnota obsahuje znaky, které nejsou povoleny aktuální úrovní omezení.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Používání neviditelných znaků není povoleno.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Kombinování čísel z různých písem není povoleno.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Použití skrytých překrývajících znaků není povoleno.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Přípona souboru je neplatná ({{ extension }}). Povolené přípony jsou {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Zjištěné kódování znaků je neplatné ({{ detected }}). Povolená kódování jsou {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Tato hodnota není platnou MAC adresou.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Této URL není doména nejvyššího řádu.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Tato hodnota je příliš krátká, měla by obsahovat alespoň jedno slovo|Tato hodnota je příliš krátká, měla by obsahovat alespoň {{ min }} slova.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Tato hodnota je příliš dlouhá, měla obsahovat pouze jedno slovo.|Tato hodnota je příliš dlouhá, měla by obsahovat {{ max }} slova a nebo méně.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Tato hodnota není validní týden v ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Tato hodnota není validní týden.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Tato hodnota by neměla být týden před "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Tato hodnota by neměla být týden za "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Tato hodnota není platná Twig šablona.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Tento soubor není video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Nepodařily se zjistit rozměry videa.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Video je příliš široké ({{ width }}px). Maximální povolená šířka je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Video je příliš úzké ({{ width }}px). Minimální očekávaná šířka je {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Video je příliš vysoké ({{ height }}px). Maximální povolená výška je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Video je příliš nízké ({{ height }}px). Minimální očekávaná výška je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Video má příliš málo pixelů ({{ pixels }} pixelů). Minimální očekávané množství je {{ min_pixels }} pixelů.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Video má příliš mnoho pixelů ({{ pixels }} pixelů). Maximální očekávané množství je {{ max_pixels }} pixelů.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Poměr stran videa je příliš velký ({{ ratio }}). Maximální povolený poměr stran je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Poměr stran videa je příliš malý ({{ ratio }}). Minimální očekávaný poměr stran je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Video je čtvercové ({{ width }}x{{ height }}px). Čtvercová videa nejsou povolená.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Video je orientované na šířku ({{ width }}x{{ height }} px). Videa orientovaná na šířku nejsou povolená.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Video je orientované na výšku ({{ width }}x{{ height }} px). Videa orientovaná na výšku nejsou povolená.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Soubor videa je poškozený.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Video obsahuje více proudů. Povolen je pouze jeden proud.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Nepodporovaný kodek videa "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Nepodporovaný kontejner videa "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Soubor obrázku je poškozený.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Obrázek má příliš málo pixelů ({{ pixels }} pixelů). Minimální očekávané množství je {{ min_pixels }} pixelů.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Obrázek má příliš mnoho pixelů ({{ pixels }} pixelů). Maximální očekávané množství je {{ max_pixels }} pixelů.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Tento název souboru neodpovídá očekávané znakové sadě.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="da" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Værdien skal være falsk.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Værdien skal være sand.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Værdien skal være af typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Værdien skal være blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Den valgte værdi er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du skal vælge mindst én mulighed.|Du skal vælge mindst {{ limit }} muligheder.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan højst vælge én mulighed.|Du kan højst vælge {{ limit }} muligheder.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>En eller flere af de angivne værdier er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Feltet blev ikke forventet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dette felt mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Værdien er ikke en gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Værdien er ikke et gyldigt tidspunkt.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Værdien er ikke en gyldig e-mailadresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunne ikke findes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen kan ikke læses.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor ({{ size }} {{ suffix }}). Maksimale tilladte størrelse er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Filens MIME-type er ugyldig ({{ type }}). Tilladte MIME-typer er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Værdien skal være {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Værdien er for lang. Den må højst indeholde {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Værdien skal være {{ limit }} eller mere.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Værdien er for kort. Den skal indeholde mindst {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Værdien må ikke være blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Værdien må ikke være tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Værdien skal være tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Værdien er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Værdien er ikke et gyldigt klokkeslæt.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Værdien er ikke en gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De to værdier skal være ens.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor. Den maksimale størrelse er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunne ikke uploades.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Værdien skal være et gyldigt tal.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Filen er ikke gyldigt billede.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Denne værdi er ikke en gyldig IP-adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Værdien er ikke et gyldigt sprog.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Værdien er ikke en gyldig lokalitet.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Værdien er ikke et gyldigt land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Værdien er allerede i brug.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Størrelsen på billedet kunne ikke detekteres.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Billedet er for bredt ({{ width }}px). Største tilladte bredde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Billedet er for smalt ({{ width }}px). Mindste forventede bredde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Billedet er for højt ({{ height }}px). Største tilladte højde er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Billedet er for lavt ({{ height }}px). Mindste forventede højde er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Værdien skal være brugerens nuværende adgangskode.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Værdien skal være på præcis {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen blev kun delvist uploadet.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil blev uploadet.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Der blev ikke konfigureret en midlertidig mappe i php.ini, eller den konfigurerede mappe eksisterer ikke.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikke skrive midlertidig fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP-udvidelse forårsagede fejl i upload.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samling skal indeholde mindst ét element.|Denne samling skal indeholde mindst {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samling skal indeholde højst ét element.|Denne samling skal indeholde højst {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samling skal indeholde præcis ét element.|Denne samling skal indeholde præcis {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Ikke-understøttet korttype eller ugyldigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Denne værdi er ikke et gyldigt internationalt bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Værdien er ikke en gyldig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Værdien er ikke en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Værdien er hverken en gyldig ISBN-10 eller en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Værdien er ikke en gyldig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Denne værdi er ikke en gyldig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Denne værdi skal være lig med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Denne værdi skal være større end {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Denne værdi skal være større end eller lig med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Denne værdi skal være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Denne værdi skal være mindre end {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Denne værdi skal være mindre end eller lig med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Denne værdi bør ikke være lig med {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Denne værdi bør ikke være identisk med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Billedforholdet er for stort ({{ratio}}). Tilladt maksimumsforhold er {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Billedforholdet er for lille ({{ ratio }}). Minimumsforventet forventet er {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Billedet er firkantet ({{ width }} x {{ height }} px). Firkantede billeder er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Billedet er landskabsorienteret ({{width}} x {{height}} px). Landskabsorienterede billeder er ikke tilladt</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Billedet er portrætorienteret ({{ width }}x{{ height }}px). Portrætorienterede billeder er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>En tom fil er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Værten kunne ikke løses.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Denne værdi stemmer ikke overens med den forventede {{ charset }} charset.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Denne værdi er ikke en gyldig forretningsidentifikationskode (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Fejl</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Denne værdi er ikke en gyldig UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Denne værdi skal være et multiplikation af {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Denne Business Identifier Code (BIC) er ikke forbundet med IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Denne værdi skal være gyldig JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Denne samling bør kun indeholde unikke elementer.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Denne værdi skal være positiv.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Denne værdi skal være enten positiv eller nul.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Denne værdi skal være negativ.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Denne værdi skal være enten negativ eller nul.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Denne værdi er ikke en gyldig tidszone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Denne adgangskode er blevet lækket i et databrud, det må ikke bruges. Brug venligst en anden adgangskode.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Værdien skal være mellem {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Værdien er ikke et gyldigt værtsnavn.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Antallet af elementer i denne samling skal være en multiplikation af {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Værdien skal overholde mindst én af følgende krav:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Hvert element i denne samling skal overholde dens egne krav.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Værdien er ikke et gyldig International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Værdien skal være et gyldigt udtryk.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Værdien skal være en gyldig CSS farve.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Værdien er ikke en gyldig CIDR notation.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Værdien af netmasken skal være mellem {{ min }} og {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Filnavnet er for langt. Det bør indeholde {{ filename_max_length }} tegn eller mindre.|Filnavnet er for langt. Det bør indeholde {{ filename_max_length }} tegn eller mindre.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Kodeordets styrke er for lav. Du bedes indtaste et stærkere kodeord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Denne værdi indeholder tegn, som ikke er tilladt med det nuværende restriktionsniveau.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Brug af usynlige tegn er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>At blande numre fra forskellige scripts er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>At bruge skjulte overlejringstegn er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Udvidelsen til filen er ugyldig ({{ extension }}). De tilladte udvidelser er {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Det registrerede tegnsæt er ugyldigt ({{ detected }}). De tilladte tegnsæt er {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Denne værdi er ikke en gyldig MAC-adresse.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Denne URL mangler et topdomæne.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Denne værdi er for kort. Den skal indeholde mindst ét ord.|Denne værdi er for kort. Den skal indeholde mindst {{ min }} ord.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Denne værdi er for lang. Den skal indeholde ét ord.|Denne værdi er for lang. Den skal indeholde {{ max }} ord eller færre.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Denne værdi repræsenterer ikke en gyldig uge i ISO 8601-formatet.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Denne værdi er ikke en gyldig uge.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Denne værdi bør ikke være før uge "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Denne værdi bør ikke være efter uge "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Denne værdi er ikke en gyldig Twig-skabelon.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Denne fil er ikke en gyldig video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Videostørrelsen kunne ikke registreres.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Videobredden er for stor ({{ width }}px). Tilladt maksimal bredde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Videobredden er for lille ({{ width }}px). Mindste forventede bredde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Videoens højde er for stor ({{ height }}px). Tilladt maksimal højde er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Videoens højde er for lille ({{ height }}px). Forventet minimumshøjde er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Videoen har for få pixels ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Videoen har for mange pixels ({{ pixels }}). Forventet maksimummængde er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Videoforholdet er for stort ({{ ratio }}). Tilladt maksimalforhold er {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Videoforholdet er for lille ({{ ratio }}). Forventet minimumsforhold er {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Videoen er kvadratisk ({{ width }}x{{ height }}px). Kvadratiske videoer er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Videoen er i liggende format ({{ width }}x{{ height }} px). Liggende videoer er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Videoen er i portrætformat ({{ width }}x{{ height }}px). Portrætvideoer er ikke tilladt.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Videofilen er beskadiget.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Videoen indeholder flere streams. Kun én stream er tilladt.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Ikke-understøttet videokodek "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Ikke-understøttet videocontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Billedfilen er beskadiget.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Billedet har for få pixels ({{ pixels }}). Forventet minimum er {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Billedet har for mange pixels ({{ pixels }}). Forventet maksimalt antal er {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Dette filnavn matcher ikke det forventede tegnsæt.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="mn" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Энэ утга буруу байх ёстой.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Энэ утга үнэн байх ёстой.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Энэ утга  {{ type }} -н төрөл байх ёстой.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Энэ утга хоосон байх ёстой.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Сонгосон утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Хамгийн багадаа {{ limit }} утга сонгогдсон байх ёстой.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Хамгийн ихдээ {{ limit }} утга сонгогдох боломжтой.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Өгөгдсөн нэг эсвэл нэгээс олон утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Энэ талбар нь хүлээгдэж байсан юм.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Энэ талбар нь алга болсон байна.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Энэ утга буруу date төрөл байна .</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Энэ утга буруу цаг төрөл байна.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>И-майл хаяг буруу байна.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл олдсонгүй.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл уншигдахуйц биш байна.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл хэтэрхий том байна ({{ size }} {{ suffix }}). Зөвшөөрөгдөх дээд хэмжээ  {{ limit }} {{ suffix }} байна.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Файлын MIME-төрөл нь буруу байна ({{ type }}). Зөвшөөрөгдөх MIME-төрлүүд {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Энэ утга  {{ limit }} юмуу эсвэл бага байна.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Энэ утга хэтэрхий урт байна. {{ limit }} тэмдэгтийн урттай юмуу эсвэл бага байна.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Энэ утга {{ limit }} юмуу эсвэл их байна.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Энэ утга хэтэрхий богино байна. {{ limit }} тэмдэгт эсвэл их байна.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Энэ утга хоосон байж болохгүй.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Энэ утга null байж болохгүй.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Энэ утга null байна.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Энэ утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Энэ утга буруу цаг төрөл байна.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Энэ утга буруу URL байна .</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Хоёр утгууд ижил байх ёстой.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл хэтэрхий том байна. Зөвшөөрөгдөх дээд хэмжээ нь {{ limit }} {{ suffix }} байна.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл хэтэрхий том байна.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл upload хийгдсэнгүй.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Энэ утга зөвхөн тоо байна.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Файл зураг биш байна.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй IP хаяг биш юм.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Энэ утга үнэн зөв хэл биш байна.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Энэ утга үнэн зөв байршил биш байна.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Энэ утга үнэн бодит улс биш байна.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Энэ утга аль хэдийнээ хэрэглэгдсэн байна.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Зургийн хэмжээ тогтоогдож чадсангүй.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Зургийн өргөн хэтэрхий том байна ({{ width }}px). Өргөн нь хамгийн ихдээ {{ max_width }}px байх боломжтой.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Зургийн өргөн хэтэрхий жижиг байна ({{ width }}px). Өргөн нь хамгийн багадаа {{ min_width }}px байх боломжтой.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Зургийн өндөр хэтэрхий том байна ({{ height }}px). Өндөр нь хамгийн ихдээ {{ max_height }}px байх боломжтой.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Зургийн өндөр хэтэрхий жижиг байна ({{ height }}px). Өндөр нь хамгийн багадаа {{ min_height }}px байх боломжтой.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Энэ утга хэрэглэгчийн одоогийн нууц үг байх ёстой.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Энэ утга яг {{ limit }} тэмдэгт байх ёстой.|Энэ утга яг {{ limit }} тэмдэгт байх ёстой.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файлын зөвхөн хагас нь upload хийгдсэн.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ямар ч файл upload хийгдсэнгүй.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.ini дээр түр зуурын хавтсыг тохируулаагүй байна, эсвэл тохируулсан хавтас байхгүй байна.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Түр зуурын файлыг диск руу бичиж болохгүй байна.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP extension нь upload -г амжилтгүй болгоод байна.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Энэ коллекц {{ limit }} ба түүнээс дээш тооны элемент агуулах ёстой.|Энэ коллекц {{ limit }} ба түүнээс дээш тооны элемент агуулах ёстой.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Энэ коллекц {{ limit }} ба түүнээс доош тооны элемент агуулах ёстой.|Энэ коллекц {{ limit }} ба түүнээс доош тооны элемент агуулах ёстой.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Энэ коллекц яг {{ limit }} элемент агуулах ёстой.|Энэ коллекц яг {{ limit }} элемент агуулах ёстой.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Картын дугаар буруу байна.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Дэмжигдээгүй картын төрөл эсвэл картын дугаар буруу байна.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй Олон улсын Банкны Дансны Дугаар (IBAN) биш юм.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Энэ утга үнэн зөв ISBN-10 биш байна.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Энэ утга үнэн зөв ISBN-13 биш байна.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Энэ утга үнэн зөв ISBN-10 юмуу ISBN-13 биш байна.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Энэ утга үнэн зөв ISSN биш байна.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Энэ утга үнэн бодит валют биш байна.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -тaй тэнцүү байх ёстой.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -с их байх ёстой.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -тай тэнцүү юмуу эсвэл их байх ёстой.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value_type }} {{ compared_value }} -тай яг ижил байх ёстой.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -с бага байх ёстой.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -тай ижил юмуу эсвэл бага байх ёстой.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -тай тэнцүү байх ёсгүй.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value_type }} {{ compared_value }} -тай яг ижил байх ёсгүй.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Зургийн харьцаа хэтэрхий том байна ({{ ratio }}). Харьцаа нь хамгийн ихдээ {{ max_ratio }} байна.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Зургийн харьцаа хэтэрхий жижиг байна ({{ ratio }}). Харьцаа нь хамгийн багадаа {{ min_ratio }} байна.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Зураг дөрвөлжин хэлбэртэй байна ({{ width }}x{{ height }}px). Дөрвөлжин зургууд оруулах боломжгүй.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Зураг хэвтээ байрлалтай байна ({{ width }}x{{ height }}px). Хэвтээ байрлалтай зургууд оруулах боломжгүй.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Зургууд босоо байрлалтай байна ({{ width }}x{{ height }}px). Босоо байрлалтай зургууд оруулах боломжгүй.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Хоосон файл оруулах боломжгүй.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Хост зөв тохирогдоогүй байна.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Энэ утга тооцоолсон {{ charset }} тэмдэгттэй таарахгүй байна.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй Бизнес Таних Код (BIC) биш юм.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Алдаа</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй UUID биш юм.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Энэ утга {{ compared_value }} -н үржвэр байх ёстой.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Энэ Business Identifier Code (BIC) код нь IBAN {{ iban }} -тай холбоогүй байна.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Энэ утга JSON байх ёстой.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Энэ коллекц зөвхөн давтагдахгүй элементүүд агуулах ёстой.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Энэ утга эерэг байх ёстой.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Энэ утга тэг эсвэл эерэг байх ёстой.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Энэ утга сөрөг байх ёстой.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Энэ утга сөрөг эсвэл тэг байх ёстой.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Энэ утга үнэн зөв цагийн бүс биш байна.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Энэ нууц үгийн мэдээлэл алдагдсан байх магадлалтай учраас дахин ашиглагдах ёсгүй. Өөр нууц үг ашиглана уу.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Энэ утга {{ min }} -с {{ max }} хооронд байх ёстой.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Энэ утга буруу hostname байна.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Энэхүү цуглуулган дахь элемэнтийн тоо, {{ compared_value }}-н үржвэр байх ёстой.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Энэ утга доорх болзолуудын ядаж нэгийг хангах ёстой:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Энэхүү цуглуулган дахь элемэнтүүд өөр өөрсдийн болзолуудаа хангах ёстой.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Энэ утга зөв International Securities Identification Number (ISIN) биш байна.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target state="needs-review-translation">Энэ утга нь зөв илэрхийлэл байх ёстой.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target state="needs-review-translation">Энэ утга нь хүчинтэй CSS өнгө биш байна.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target state="needs-review-translation">Энэ утга нь хүчинтэй CIDR тэмдэглэгээ биш байна.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target state="needs-review-translation">Сүлжээний маскны утга нь {{ min }} ба {{ max }}-ийн хооронд байх ёстой.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">Файлын нэр хэт урт байна. Энэ нь {{ filename_max_length }} тэмдэгт эсвэл түүнээс бага байх ёстой.|Файлын нэр хэт урт байна. Энэ нь {{ filename_max_length }} тэмдэгт эсвэл түүнээс бага байх ёстой.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">Нууц үгийн хүч нь хэт бага байна. Хүчтэй нууц үгийг ашиглана уу.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">Энэ утга нь одоогийн хязгаарлалтын түвшинд зөвшөөрөгдөөгүй тэмдэгтүүд агуулж байна.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">Харагдахгүй тэмдэгтүүдийг ашиглахыг зөвшөөрөхгүй.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">Янз бүрийн скриптүүдээс тоог хольж хэрэглэхийг зөвшөөрөхгүй.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">Нууцлагдсан давхаргын тэмдэгтүүдийг ашиглахыг зөвшөөрөхгүй.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">Файлын өргөтгөл буруу байна ({{ extension }}). Зөвшөөрөгдсөн өргөтгөлүүд нь {{ extensions }} юм.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Илрүүлсэн тэмдэгтийн кодчилол буруу байна ({{ detected }}). Зөвшөөрөгдсөн кодчилолууд нь {{ encodings }} юм.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй MAC хаяг биш юм.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Энэ URL дээд түвшингийн домейн дутуу байна.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Энэ утга нь хэтэрхий богино байна. Энэ нь дор хаяж нэг үг агуулсан байх ёстой.|Энэ утга нь хэтэрхий богино байна. Энэ нь дор хаяж {{ min }} үг агуулсан байх ёстой.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Энэ утга нь хэтэрхий урт байна. Энэ нь зөвхөн нэг үг агуулсан байх ёстой.|Энэ утга нь хэтэрхий урт байна. Энэ нь {{ max }} үг эсвэл түүнээс бага байх ёстой.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Энэ утга нь ISO 8601 форматад хүчинтэй долоо хоногийг илэрхийлэхгүй байна.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Энэ утга хүчинтэй долоо хоног биш байна.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Энэ утга нь "{{ min }}" долоо хоногоос өмнө байх ёсгүй.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Энэ утга нь долоо хоног "{{ max }}" -аас хойш байх ёсгүй.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Энэ утга нь Twig-ийн хүчинтэй загвар биш юм.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Энэ файл хүчинтэй видео биш байна.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Видеоны хэмжээг тодорхойлох боломжгүй байлаа.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Видео өргөн хэт их байна ({{ width }}px). Зөвшөөрөгдөх дээд өргөн нь {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Видео өргөн хэт бага байна ({{ width }}px). Хамгийн бага хүлээгдэж буй өргөн {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Видеоны өндөр хэт их байна ({{ height }}px). Зөвшөөрөгдсөн дээд өндөр нь {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Видео өндрийг хэт бага байна ({{ height }}px). Хамгийн бага өндрийн шаардлага {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Видео хэт цөөн пикселтэй байна ({{ pixels }}). Хүлээгдэж буй хамгийн бага хэмжээ нь {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Видео хэт олон пикселтэй байна ({{ pixels }}). Хүлээгдэж буй дээд хэмжээ нь {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Видео харьцаа хэт их байна ({{ ratio }}). Зөвшөөрөгдөх дээд харьцаа {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Видеоны харьцаа хэт жижиг байна ({{ ratio }}). Хамгийн бага хүлээгдэж буй харьцаа {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Видео дөрвөлжин байна ({{ width }}x{{ height }}px). Дөрвөлжин видеонууд зөвшөөрөгдөхгүй.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видео хэвтээ чиглэлтэй байна ({{ width }}x{{ height }} px). Хэвтээ видеонууд зөвшөөрөгдөхгүй.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видео босоо чиглэлтэй ({{ width }}x{{ height }}px). Босоо чиглэлийн видеонууд зөвшөөрөгдөхгүй.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Видео файл гэмтсэн байна.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Видео нь олон урсгал агуулсан байна. Зөвхөн нэг урсгалыг зөвшөөрнө.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Дэмжигдээгүй видео кодек "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Дэмжигдээгүй видео контейнер "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Зургийн файл гэмтсэн.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Зурган дээрх пикселийн тоо дэндүү цөөн байна ({{ pixels }}). Хүлээгдэж буй доод хэмжээ нь {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Зурагт хэт олон пиксел байна ({{ pixels }}). Хүлээгдэж буй дээд хэмжээ нь {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Энэ файлын нэр хүлээгдэж буй тэмдэгтийн багцтай нийцэхгүй байна.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="lb" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dëse Wäert sollt falsch sinn.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dëse Wäert sollt wouer sinn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dëse Wäert sollt vum Typ {{ type }} sinn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dëse Wäert sollt eidel sinn.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Dëse Wäert sollt enger vun de Wielméiglechkeeten entspriechen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Et muss mindestens {{ limit }} Méiglechkeet ausgewielt ginn.|Et musse mindestens {{ limit }} Méiglechkeeten ausgewielt ginn.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Et dierf héchstens {{ limit }} Méiglechkeet ausgewielt ginn.|Et dierfen héchstens {{ limit }} Méiglechkeeten ausgewielt ginn.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Een oder méi vun de Wäerter ass ongëlteg.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>D'Feld gouf net erwaart.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>D'Feld feelt.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Datumsangab.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Datums- an Zäitangab.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Dëse Wäert ass keng gëlteg Email-Adress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>De Fichier gouf net fonnt.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>De Fichier ass net liesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>De Fichier ass ze grouss ({{ size }} {{ suffix }}). Déi zougeloosse Maximalgréisst bedréit {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Den Typ vum Fichier ass ongëlteg ({{ type }}). Erlaabten Type sinn {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dëse Wäert soll méi kleng oder gläich {{ limit }} sinn.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Dës Zeecheketten ass ze laang. Se sollt héchstens {{ limit }} Zeechen hunn.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dëse Wäert sollt méi grouss oder gläich {{ limit }} sinn.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Dës Zeecheketten ass ze kuerz. Se sollt mindestens {{ limit }} Zeechen hunn.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Dëse Wäert sollt net eidel sinn.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Dëst sollt keen Null-Wäert sinn.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dëst sollt keen Null-Wäert sinn.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Dëse Wäert ass net gëlteg.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Zäitangab.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Dëse Wäert ass keng gëlteg URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Béid Wäerter sollten identesch sinn.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>De fichier ass ze grouss. Déi maximal Gréisst dierf {{ limit }} {{ suffix }} net depasséieren.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>De Fichier ass ze grouss.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>De Fichier konnt net eropgeluede ginn.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dëse Wäert sollt eng gëlteg Zuel sinn.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Dëse Fichier ass kee gëltegt Bild.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Dëse Wäert ass keng gülteg IP-Adress.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Sprooch.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Dëse Wäert entsprécht kengem gëltege Gebittsschema.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Dëse Wäert entsprécht kengem gëltege Land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Dëse Wäert gëtt scho benotzt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>D'Gréisst vum Bild konnt net detektéiert ginn.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>D'Breet vum Bild ass ze grouss ({{ width }}px). Déi erlaabte maximal Breet ass {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>D'Breet vum Bild ass ze kleng ({{ width }}px). Déi minimal Breet ass {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>D'Héicht vum Bild ass ze grouss ({{ height }}px). Déi erlaabte maximal Héicht ass {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>D'Héicht vum Bild ass ze kleng ({{ height }}px). Déi minimal Héicht ass {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Dëse Wäert sollt dem aktuelle Benotzerpasswuert entspriechen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dëse Wäert sollt exakt {{ limit }} Buschtaf hunn.|Dëse Wäert sollt exakt {{ limit }} Buschtawen hunn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>De Fichier gouf just deelweis eropgelueden.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Et gouf kee Fichier eropgelueden.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Et gouf keen temporären Dossier an der php.ini konfiguréiert oder den temporären Dossier existéiert net.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Den temporäre Fichier kann net gespäichert ginn.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Eng PHP-Erweiderung huet den Upload verhënnert.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Dës Sammlung sollt {{ limit }} oder méi Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Dës Sammlung sollt {{ limit }} oder manner Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Dës Sammlung sollt exakt {{ limit }} Element hunn.|Dës Sammlung sollt exakt {{ limit }} Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongëlteg Kaartennummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Net ënnerstëtzte Kaartentyp oder ongëlteg Kaartennummer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Dëse Wäert ass keng gülteg International Bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Dëse Wäert ass keng gëlteg ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Dëse Wäert ass keng gëlteg ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Dëse Wäert ass weder eng gëlteg ISBN-10 nach eng gëlteg ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Dëse Wäert ass keng gëlteg ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Dëse Wäert ass keng gëlteg Währung.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi grouss wéi {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi grouss wéi oder gläich {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dëse Wäert sollt identesch si mat {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi kleng wéi {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi kleng wéi oder gläich {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt net {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dëse Wäert sollt net identesch si mat {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>D'Säiteverhältnis vum Bild ass ze grouss ({{ ratio }}). Den erlaabte Maximalwäert ass {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>D'Säiteverhältnis vum Bild ass ze kleng ({{ ratio }}). Den erwaarte Minimalwäert ass {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>D'Bild ass quadratesch ({{ width }}x{{ height }}px). Quadratesch Biller sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>D'Bild ass am Queeschformat ({{ width }}x{{ height }}px). Biller am Queeschformat sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>D'Bild ass am Héichformat ({{ width }}x{{ height }}px). Biller am Héichformat sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>En eidele Fichier ass net erlaabt.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Den Host-Numm konnt net opgeléist ginn.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Dëse Wäert entsprécht net dem erwaarten Zeechesaz {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Dëse Wäert ass kee gültege Business Identifier Code (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Feeler</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Dëse Wäert ass keng gülteg UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Dëse Wäert sollt e puer vun {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Dëse "Business Identifier Code" (BIC) ass net mat IBAN verbonnen {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Dëse Wäert sollt gëlteg JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Dës Sammlung sollt just eenzegaarteg Elementer enthalen.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Dëse Wäert sollt positiv sinn.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Dëse Wäert sollt entweeder positiv oder null sinn.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Dëse Wäert sollt negativ sinn.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Dëse Wäert sollt entweeder negativ oder null sinn.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Dëse Wäert ass keng gëlteg Zäitzon.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dëst Passwuert war Deel vun engem Dateleck an dierf net benotzt ginn. Benotzt w.e.g. en anert Passwuert .</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>De Wäert sollt tëscht {{ min }} a(n) {{ max }} leien.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Dëse Wäert ass kee gëltegen Hostnumm.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>D'Unzuel un Elementer an dëser Sammlung sollt e multipel vu(n) {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Dëse Wäert sollt op d'mannst ee vun dësen Aschränkungen erfëllen:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>All Element aus dëser Sammlung sollt seng eegen Aschränkungen erfëllen.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Dëse Wäert ass keng gëlteg International Wäertpabeiererkennnummer (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Dëse Wäert soll eng gëlteg Expression sinn.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Dëse Wäert ass keng gëlteg CSS Faarf.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Dëse Wäert ass keng gëlteg CIDR Notatioun.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>De Wäert vum Netmask soll tëscht {{ min }} a {{ max }} sinn.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>De Dateinimm ass ze laang. Et sollt {{ filename_max_length }} Zeechen oder manner hunn.|De Dateinimm ass ze laang. Et sollt {{ filename_max_length }} Zeechen oder manner hunn.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>D'Staarf vum Passwuert ass ze schwaach. Benotzt w. e. g. e stäerker Passwuert.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Dëse Wäert enthält Zeechen, déi net erlaabt sinn no der aktueller Beschränkungsstuf.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>D'Benotzen vu onsiichtbaren Zeechen ass net erlaabt.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>D'Mësche vu Nummeren aus verschiddenen Skripten ass net erlaabt.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>D'Benotzen vu verstoppten Iwwerlagungszeechen ass net erlaabt.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>D'Extensioun vum Fichier ass net valabel ({{ extension }}). Valabel Extensioune sinn {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Den Encodage vun de Schrëftzeechen ass net valabel ({{ detected }}). Valabel Encodage sinn {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Dëse Wäert ass keng gülteg MAC-Adress.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Dësen URL feelt eng Top-Level-Domain.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Dëse Wäert ass ze kuerz. Et sollt op d'mannst ee Wuert enthalen.|Dëse Wäert ass ze kuerz. Et sollt op d'mannst {{ min }} Wierder enthalen.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Dëse Wäert ass ze laang. Et sollt nëmmen ee Wuert enthalen.|Dëse Wäert ass ze laang. Et sollt {{ max }} Wierder oder manner enthalen.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Dëse Wäert stellt keng valabel Woch am ISO 8601-Format duer.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Dëse Wäert ass keng valabel Woch.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Dëse Wäert sollt net virun der Woch "{{ min }}" sinn.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Dëse Wäert sollt net no Woch "{{ max }}" sinn.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Dëse Wäert ass kee valabelen Twig-Template.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Dës Datei ass kee gëltegen Video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>D'Gréisst vum Video konnt net erkannt ginn.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>D'Videobreed ass ze grouss ({{ width }}px). Erlaabt maximal Breed ass {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>D'Videobreed ass ze kleng ({{ width }}px). Minimal erwaart Breed ass {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>D'Videohéicht ass ze grouss ({{ height }}px). Erlaabt maximal Héicht ass {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>D'Videohéicht ass ze kleng ({{ height }}px). Erwaart Mindesthéicht ass {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>De Video huet ze wéineg Pixel ({{ pixels }}). Erwaart Minimum ass {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>De Video huet ze vill Pixel ({{ pixels }}). Déi erwaart maximal Zuel ass {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>D'Videoproportioun ass ze grouss ({{ ratio }}). Erlaabt maximal Proportioun ass {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>D'Videoratio ass ze kleng ({{ ratio }}). Minimal erwaart Ratio ass {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>De Video ass quadratesch ({{ width }}x{{ height }}px). Quadratesch Videoe sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>De Video ass am Landschaftsformat ({{ width }}x{{ height }} px). Landschafts-Videoe sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>De Video ass am Portraitformat ({{ width }}x{{ height }}px). Portrait-Videoe sinn net erlaabt.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>D'Videodatei ass beschiedegt.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>De Video enthält verschidde Stréimen. Nëmmen ee Stroum ass erlaabt.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Net ënnerstëtzte Videocodec „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Net ënnerstëtzte Video-Container "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>D'Bilddatei ass beschiedegt.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>D'Bild huet ze wéineg Pixel ({{ pixels }}). Déi erwaart Mindestzuel ass {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>D'Bild huet ze vill Pixel ({{ pixels }}). Déi erwaart maximal Zuel ass {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Dësen Dateinumm entsprécht net dem erwaarten Zeechesaz.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="be" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Значэнне павінна быць Не.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Значэнне павінна быць Так.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Тып значэння павінен быць {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Значэнне павінна быць пустым.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Абранае вамі значэнне не сапраўднае.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Вы павінны выбраць хаця б {{ limit }} варыянт.|Вы павінны выбраць хаця б {{ limit }} варыянтаў.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Вы павінны выбраць не больш за {{ limit }} варыянт.|Вы павінны выбраць не больш за {{ limit }} варыянтаў.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Адзін або некалькі пазначаных значэнняў з'яўляецца несапраўдным.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Гэта поле не чакаецца.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Гэта поле адсутнічае.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Гэта значэнне не з'яўляецца карэктнай датай.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Гэта значэнне не з'яўляецца карэктнай датай i часом.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Гэта значэнне не з'яўляецца карэктным адрасам электроннай пошты.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл не знойдзен.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл не чытаецца.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадта вялікі ({{ size }} {{ suffix }}). Максімальна дазволены памер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-тып файлу некарэкты ({{ type }}). Дазволеныя MIME-тыпы файлу {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Значэнне павінна быць {{ limit }} або менш.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Значэнне занадта доўгае. Яно павінна мець {{ limit }} сімвал або менш.|Значэнне занадта доўгае. Яно павінна мець {{ limit }} сімвалаў або менш.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Значэнне павінна быць {{ limit }} або больш.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Значэнне занадта кароткае. Яно павінна мець прынамсі {{ limit }} сімвал.|Значэнне занадта кароткае. Яно павінна мець прынамсі {{ limit }} сімвалаў.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Значэнне не павінна быць пустым.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Значэнне не павінна быць null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Значэнне павінна быць null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Значэнне з'яўляецца не сапраўдным.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Значэнне не з'яўляецца сапраўдным часам.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Значэнне не з'яўляецца сапраўдным URL-адрасам.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Абодва значэнні павінны быць аднолькавымі.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадта вялікі. Максімальна дазволены памер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл занадта вялікі.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Немагчыма запампаваць файл.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Значэнне павінна быць лікам.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Гэты файл не з'яўляецца сапраўднай выявай.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным IP-адрасам.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Значэнне не з'яўляецца сапраўдным мовай.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Значэнне не з'яўляецца сапраўднай лакаллю.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Значэнне не з'яўляецца сапраўднай краінай.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Гэта значэнне ўжо выкарыстоўваецца.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Немагчыма вызначыць памер выявы.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Гэта выява занадта вялікая ({{ width }}px). Дазваляецца максімальная шырыня {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Гэта выява занадта маленькая ({{ width }}px). Дазваляецца мінімальная шырыня {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Гэты выява занадта вялікая ({{ width }}px). Дазваляецца максімальная вышыня {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Гэта выява занадта маленькая ({{ width }}px). Дазваляецца мінімальная вышыня {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Значэнне павінна быць цяперашнім паролем карыстальніка.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Значэнне павінна мець {{ limit }} сімвал.|Значэнне павінна мець {{ limit }} сімвалаў.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файл быў запампаваны толькі часткова.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файл не быў запампаваны.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>У php.ini не была налажана часовая папка, або часовая папка не існуе.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Немагчыма запісаць часовы файл на дыск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Пашырэнне PHP выклікала памылку загрузкі.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Калекцыя павінна змяшчаць прынамсі {{ limit }} элемент.|Калекцыя павінна змяшчаць прынамсі {{ limit }} элементаў.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Калекцыя павінна змяшчаць {{ limit }} або менш элемент.|Калекцыя павінна змяшчаць {{ limit }} або менш элементаў.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Калекцыя павінна змяшчаць роўна {{ limit }} элемент.|Калекцыя павінна змяшчаць роўна {{ limit }} элементаў.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Несапраўдны нумар карты.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Тып карты не падтрымліваецца або несапраўдны нумар карты.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным міжнародным нумарам банкаўскага рахунку (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным ISBN-10 або ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Гэта значэнне не з'яўляецца сапраўднай валютай.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Значэнне павінна раўняцца {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Значэнне павінна быць больш чым {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Значэнне павінна быць больш чым або раўняцца {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значэнне павінна быць ідэнтычным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Значэнне павінна быць менш чым {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Значэнне павінна быць менш чым або раўняцца {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Значэнне не павінна раўняцца {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значэнне не павінна быць ідэнтычным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Суадносіны бакоў выявы з'яўляецца занадта вялікім ({{ ratio }}). Дазваляецца максімальныя суадносіны {{max_ratio}} .</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Суадносіны бакоў выявы з'яўляецца занадта маленькімі ({{ ratio }}). Дазваляецца мінімальныя суадносіны {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Выява квадратная ({{width}}x{{height}}px). Квадратныя выявы не дазволены.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Выява ў альбомнай арыентацыі ({{ width }}x{{ height }}px). Выявы ў альбомнай арыентацыі не дазволены.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Выява ў партрэтнай арыентацыі ({{ width }}x{{ height }}px). Выявы ў партрэтнай арыентацыі не дазволены.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Пусты файл не дазволены.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Не магчыма знайсці імя хоста.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Гэта значэнне не супадае з чаканай {{ charset }} кадыроўкай.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным кодам ідэнтыфікацыі банка (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Памылка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Значэнне павінна быць кратным {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Банкаўскі ідэнтыфікацыйны код (BIC) не звязан з IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Гэта значэнне павінна быць у фармаце JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Калекцыя павінна змяшчаць толькі ўнікальныя элементы.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Значэнне павінна быць дадатным.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Значэнне павінна быць дадатным ці нуль.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Значэнне павінна быць адмоўным.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Значэнне павінна быць адмоўным ці нуль.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Значэнне не з'яўляецца сапраўдным гадзінным поясам.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Гэты пароль быў выкрадзены ў выніку ўзлому дадзеных, таму яго нельга выкарыстоўваць. Калі ласка, выкарыстоўвайце іншы пароль.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Значэнне павінна быць паміж {{min}} і {{max}}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Значэнне не з'яўляецца карэктным імем хаста.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Колькасць элементаў у гэтай калекцыі павінна быць кратным {{compared_value}}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Значэнне павінна задавальняць як мінімум аднаму з наступных абмежаванняў:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Кожны элемент гэтай калекцыі павінен задавальняць свайму ўласнаму набору абмежаванняў.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Значэнне не з'яўляецца карэктным міжнародным ідэнтыфікацыйным нумарам каштоўных папер (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Значэнне не з'яўляецца сапраўдным выразам.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Значэнне не з'яўляецца дапушчальным колерам CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Значэнне не з'яўляецца сапраўднай натацыяй CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Значэнне сеткавай маскі павінна быць ад {{min}} да {{max}}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Назва файла занадта доўгая. Ён павінен мець {{ filename_max_length }} сімвал або менш.|Назва файла занадта доўгая. Ён павінен мець {{ filename_max_length }} сімвалы або менш.|Назва файла занадта доўгая. Ён павінен мець {{ filename_max_length }} сімвалаў або менш.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Надзейнасць пароля занадта нізкая. Выкарыстоўвайце больш надзейны пароль.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Гэта значэнне змяшчае сімвалы, якія не дазволены цяперашнім узроўнем абмежаванняў.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Выкарыстанне нябачных сімвалаў не дазваляецца.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Змешванне лікаў з розных алфавітаў не дапускаецца.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Выкарыстанне схаваных накладзеных сімвалаў не дазваляецца.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Пашырэнне файла недапушчальнае ({{ extension }}). Дазволеныя пашырэнні: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Выяўленая кадзіроўка недапушчальная ({{ detected }}). Дазволеныя кадзіроўкі: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным MAC-адрасам.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Гэтаму URL бракуе дамен верхняга ўзроўню.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б адно слова.|Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б {{ min }} слоў.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Гэта значэнне занадта доўгае. Яно павінна ўтрымліваць адно слова.|Гэта значэнне занадта доўгае. Яно павінна ўтрымліваць {{ max }} слоў або менш.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Гэта значэнне не адпавядае сапраўднаму тыдню ў фармаце ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным тыднем.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Гэта значэнне не павінна быць раней за тыдзень "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Гэта значэнне не павінна быць пасля тыдня "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Гэта значэнне не з'яўляецца сапраўдным шаблонам Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Гэты файл не з'яўляецца сапраўдным відэа.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Не ўдалося вызначыць памер відэа.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Шырыня відэа занадта вялікая ({{ width }}px). Дапушчальная максімальная шырыня — {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Шырыня відэа занадта малая ({{ width }}px). Мінімальная чаканая шырыня — {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Вышыня відэа занадта вялікая ({{ height }}px). Дазволеная максімальная вышыня — {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Вышыня відэа занадта малая ({{ height }}px). Чаканая мінімальная вышыня — {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Відэа мае занадта мала пікселяў ({{ pixels }}). Мінімальная колькасць чакаецца {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Відэа мае занадта шмат пікселяў ({{ pixels }}). Максімальна дапушчальная колькасць — {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Суадносіны відэа занадта вялікія ({{ ratio }}). Дапушчальна максімальнае суадносіны — {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Суадносіны відэа занадта малыя ({{ ratio }}). Мінімальнае чаканае суадносіны — {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Відэа квадратнае ({{ width }}x{{ height }}px). Квадратныя відэа не дазволены.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Відэа ў ландшафтнай арыентацыі ({{ width }}x{{ height }} пікс.). Ландшафтныя відэа не дазваляюцца.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Відэа ў партрэтнай арыентацыі ({{ width }}x{{ height }}px). Відэа ў партрэтнай арыентацыі не дазваляюцца.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Відэафайл пашкоджаны.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Відэа змяшчае некалькі патокаў. Дазволены толькі адзін паток.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Непадтрымліваемы відэакодэк «{{ codec }}».</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Непадтрымліваемы кантэйнер відэа "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Файл выявы пашкоджаны.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">У выяве занадта мала пікселяў ({{ pixels }}). Чакаемы мінімум — {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Малюнак мае занадта шмат пікселяў ({{ pixels }}). Чаканая максімальная колькасць {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Гэта назва файла не адпавядае чаканаму набору знакаў.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="zh-TW" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>這個數值應為 false。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>這個數值應為 true。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>這個數值的類型應為 {{ type }}。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>這個數值應該留白。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>選取的值不是有效的選項。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>至少需要選 {{ limit }} 項。|至少需要選 {{ limit }} 項。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>至多只能選 {{ limit }} 項。|至多只能選 {{ limit }} 項。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>一或多個填入的數值無效。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>這個欄位不在預期之內。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>缺少這個欄位。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>這個數值不是有效的日期。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>這個數值不是有效的日期時間組合。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>這個數值不是有效的電子郵件格式。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>找不到這個檔案。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>無法讀取這個檔案。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>這個檔案過大（{{ size }} {{ suffix }}）。允許的大小上限是 {{ limit }} {{ suffix }}。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>這個檔案的 MIME 類型無效（{{ type }}）。允許的 MIME 類型有 {{ types }}。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>這個數值必須小於等於 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>這個數值過長。最多只能有 {{ limit }} 個字元。|這個數值過長。最多只能有 {{ limit }} 個字元。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>這個數值必須大於等於 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>這個數值過短。最少要有 {{ limit }} 個字元。|這個數值過短。最少要有 {{ limit }} 個字元。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>這個數值不允許留白。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>這個數值不能為空值（null）。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>這個數值應為空值（null）。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>這個數值無效。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>這個數值不是有效的時間。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>這個數值不是 URL 格式。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>這兩個數值應該相同。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>這個檔案過大。允許的大小上限為 {{ limit }} {{ suffix }}。</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>這個檔案過大。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>無法上傳檔案。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>這個數值不是有效的數字。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>這個檔案不是有效的圖片。</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>這個數值不是有效的 IP 地址。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>這個數值不是有效的語言。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>這個數值不是有效的地區。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>這個數值不是有效的國家。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>已經用過這個數值。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>無法偵測到圖片的大小。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>圖片寬度過大 ({{ width }}px)。允許的最大寬度為 {{ max_width }}px。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>圖片寬度過小 ({{ width }}px)。允許的最小寬度為 {{ max_width }}px。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>圖片高度過大 ({{ height }}px)。允許的最大長度為 {{ max_height }}px。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>圖片高度過小 ({{ height }}px)。允許的最小高度為 {{ max_height }}px。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>這個數值應為使用者目前使用的密碼。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>這個數值應剛好為 {{ limit }} 個字元長。|這個數值應剛好為 {{ limit }} 個字元長。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>檔案只上傳了一部分。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>未上傳檔案。</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>未在 php.ini 設定暫存資料夾，或者是暫存資料夾不存在。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>無法將暫存檔寫入磁碟。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>有個 PHP 擴充套件導致上傳失敗。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>這個集合應該至少有 {{ limit }} 個元素。|這個集合應該至少有 {{ limit }} 個元素。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>這個集合最多只能有 {{ limit }} 個元素。|這個集合最多只能有 {{ limit }} 個元素。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>這個集合只能有剛好 {{ limit }} 個元素。|這個集合只能有剛好 {{ limit }} 個元素。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>卡號無效。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>不支援這個卡片類型，或卡號不正確。</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>這個數值的格式不是國際銀行帳戶號碼（IBAN）。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>這個數值的格式不是 ISBN-10。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>這個數值的格式不是 ISBN-13。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>這個數值的格式不是 ISBN-10 或 ISBN-13。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>這個數值的格式不是 ISSN。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>這個數值不是有效的貨幣。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>這個數值應等於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>這個數值應大於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>這個數值應大於等於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>這個數值應等於 {{ compared_value_type }} {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>這個數值應小於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>這個數值應小於等於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>這個數值不應等於 {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>這個數值不應等於 {{ compared_value_type }} {{ compared_value }}。</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>圖片的比例過大 ({{ ratio }})。允許的最大比例為 {{ max_ratio }}。</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>圖片的比例過小 ({{ ratio }})。允許的最小比例為 {{ min_ratio }}。</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>圖片為正方形 ({{ width }}x{{ height }}px)。不允許使用正方形圖片。</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>圖片為橫向 ({{ width }}x{{ height }}px)。不允許使用橫向圖片。</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>圖片為縱向 ({{ width }}x{{ height }}px)。不允許使用縱向圖片。</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>不允許空白檔案。</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>無法解析主機。</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>這個數值不符合預期的 {{ charset }} 字元集。</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>這個數值不是有效的商業識別碼（BIC）。</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>錯誤</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>這個數值不是有效的 UUID。</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>這個數值應為 {{ compared_value }} 的倍數。</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>這個商業識別碼（BIC）與 IBAN {{ iban }} 沒有關聯。</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>這個數值應為有效的 JSON。</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>這個集合不允許有重複元素。</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>這個數值應為正數。</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>這個數值應為正數或 0。</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>這個數值應為負數。</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>這個數值應為負數或 0。</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>這個數值不是有效的時區。</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>這個密碼已在資料洩露中曝光，不應再使用。請使用其他密碼。</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>這個數值應介於 {{ min }} 和 {{ max }} 之間。</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>這個數值不是有效的主機名稱。</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>這個集合中的元素數量應為 {{ compared_value }} 的倍數。</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>這個數值應滿足以下至少一項限制：</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>這個集合中的每個元素應滿足其自身的約束條件。</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>這個數值不是有效的國際證券識別號碼（ISIN）。</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>這個數值應為有效的表達式。</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>這個數值不是有效的 CSS 顏色。</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>這個數值不是有效的 CIDR 表示法。</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>網路遮罩的值應介於 {{ min }} 和 {{ max }} 之間。</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>檔案名稱過長。應最多有 {{ filename_max_length }} 個字元。|檔案名稱過長。應最多有 {{ filename_max_length }} 個字元。</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>密碼強度太低。請使用更強的密碼。</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>這個數值包含目前限制級別不允許的字元。</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>不允許使用隱形字元。</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>不允許混合來自不同文字的數字。</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>不允許使用隱藏的覆蓋字元。</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>檔案的副檔名無效（{{ extension }}）。允許的副檔名有 {{ extensions }}。</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>偵測到的字元編碼無效（{{ detected }}）。允許的編碼有 {{ encodings }}。</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>這個數值不是有效的 MAC 位址。</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>這個 URL 缺少頂級域名。</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>這個數值過短。應至少包含 1 個單字。|這個數值過短。應至少包含 {{ min }} 個單字。</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>這個數值過長。應包含 1 個單字。|這個數值過長。應最多包含 {{ max }} 個單字。</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>這個數值不符合 ISO 8601 格式的有效週。</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>這個數值不是有效的週。</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>這個數值不應早於第「{{ min }}」週。</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>這個數值不應晚於第「{{ max }}」週。</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>這個數值不是有效的 Twig 模板。</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>這個檔案不是有效的影片。</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>無法偵測到影片的大小。</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>影片寬度過大 ({{ width }}px)。允許的最大寬度為 {{ max_width }}px。</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>影片寬度過小 ({{ width }}p)。允許的最小寬度為 {{ min_width }}px。</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>影片高度過大 ({{ height }}px)。允許的最大高度為 {{ max_height }}px。</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>影片高度過小 ({{ height }}px)。允許的最小高度為 {{ min_height }}px。</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>影片的像素過少 ({{ pixels }} 像素). 允許的最小值為 {{ min_pixels }} 像素。</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>影片的像素過多 ({{ pixels }} 像素)。允許的最大值為 {{ max_pixels }} 像素。</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>影片的比例過大 ({{ ratio }})。允許的最大比例為 {{ max_ratio }}。</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>影片的比例過小 ({{ ratio }})。允許的最小比例為 {{ min_ratio }}。</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>影片為正方形 ({{ width }}x{{ height }}px)。不允許使用正方形影片。</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>影片為橫向 ({{ width }}x{{ height }}px)。不允許使用橫向影片。</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>影片為縱向 ({{ width }}x{{ height }}px)。不允許使用縱向影片。</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>影片檔案已損壞。</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>影片包含多個串流。只允許單個串流。</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>不支援的影片編解碼器: {{ codec }}。</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>不支援的影片容器格式: {{ container }}。</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>圖片檔案已損壞。</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>圖片的像素過少 ({{ pixels }} 像素)。允許的最小值為 {{ min_pixels }} 像素。</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>圖片的像素過多 ({{ pixels }} 像素)。允許的最大值為 {{ max_pixels }} 像素。</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>這個檔名與預期的字元集不相符。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="de" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dieser Wert sollte false sein.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dieser Wert sollte true sein.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dieser Wert sollte vom Typ {{ type }} sein.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dieser Wert sollte leer sein.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Sie haben einen ungültigen Wert ausgewählt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Sie müssen mindestens {{ limit }} Möglichkeit wählen.|Sie müssen mindestens {{ limit }} Möglichkeiten wählen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Sie dürfen höchstens {{ limit }} Möglichkeit wählen.|Sie dürfen höchstens {{ limit }} Möglichkeiten wählen.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Einer oder mehrere der angegebenen Werte sind ungültig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Dieses Feld wurde nicht erwartet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dieses Feld fehlt.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Dieser Wert entspricht keiner gültigen Datumsangabe.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Dieser Wert entspricht keiner gültigen Datums- und Zeitangabe.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Dieser Wert ist keine gültige E-Mail-Adresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Die Datei wurde nicht gefunden.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Die Datei ist nicht lesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die Datei ist zu groß ({{ size }} {{ suffix }}). Die maximal zulässige Größe beträgt {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Der Dateityp ist ungültig ({{ type }}). Erlaubte Dateitypen sind {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dieser Wert sollte kleiner oder gleich {{ limit }} sein.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Diese Zeichenkette ist zu lang. Sie sollte höchstens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu lang. Sie sollte höchstens {{ limit }} Zeichen haben.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dieser Wert sollte größer oder gleich {{ limit }} sein.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Dieser Wert sollte nicht leer sein.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Dieser Wert sollte nicht null sein.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dieser Wert sollte null sein.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Dieser Wert ist nicht gültig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Dieser Wert entspricht keiner gültigen Zeitangabe.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Dieser Wert ist keine gültige URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Die beiden Werte sollten identisch sein.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die Datei ist zu groß. Die maximal zulässige Größe beträgt {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Die Datei ist zu groß.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Die Datei konnte nicht hochgeladen werden.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dieser Wert sollte eine gültige Zahl sein.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Diese Datei ist kein gültiges Bild.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Dieser Wert ist keine gültige IP-Adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Dieser Wert entspricht keiner gültigen Sprache.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Dieser Wert entspricht keinem gültigen Gebietsschema.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Dieser Wert entspricht keinem gültigen Land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Dieser Wert wird bereits verwendet.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Die Größe des Bildes konnte nicht ermittelt werden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Die Bildbreite ist zu groß ({{ width }}px). Die maximal zulässige Breite beträgt {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Die Bildbreite ist zu gering ({{ width }}px). Die erwartete Mindestbreite beträgt {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Die Bildhöhe ist zu groß ({{ height }}px). Die maximal zulässige Höhe beträgt {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Die Bildhöhe ist zu gering ({{ height }}px). Die erwartete Mindesthöhe beträgt {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Dieser Wert sollte dem aktuellen Benutzerpasswort entsprechen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dieser Wert sollte genau {{ limit }} Zeichen lang sein.|Dieser Wert sollte genau {{ limit }} Zeichen lang sein.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Die Datei wurde nur teilweise hochgeladen.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Es wurde keine Datei hochgeladen.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Es wurde kein temporärer Ordner in der php.ini konfiguriert oder der temporäre Ordner existiert nicht.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kann die temporäre Datei nicht speichern.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Eine PHP-Erweiterung verhinderte den Upload.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Diese Sammlung sollte genau {{ limit }} Element beinhalten.|Diese Sammlung sollte genau {{ limit }} Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ungültige Kartennummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nicht unterstützter Kartentyp oder ungültige Kartennummer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Dieser Wert ist keine gültige Internationale Bankkontonummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Dieser Wert entspricht keiner gültigen ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Dieser Wert entspricht keiner gültigen ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Dieser Wert ist weder eine gültige ISBN-10 noch eine gültige ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Dieser Wert ist keine gültige ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Dieser Wert ist keine gültige Währung.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Dieser Wert sollte größer als {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte größer oder gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dieser Wert sollte identisch sein mit {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Dieser Wert sollte kleiner als {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte kleiner oder gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte nicht {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dieser Wert sollte nicht identisch sein mit {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Das Seitenverhältnis des Bildes ist zu groß ({{ ratio }}). Der erlaubte Maximalwert ist {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Das Seitenverhältnis des Bildes ist zu klein ({{ ratio }}). Der erwartete Minimalwert ist {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Das Bild ist quadratisch ({{ width }}x{{ height }}px). Quadratische Bilder sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Das Bild ist im Querformat ({{ width }}x{{ height }}px). Bilder im Querformat sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Das Bild ist im Hochformat ({{ width }}x{{ height }}px). Bilder im Hochformat sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Eine leere Datei ist nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Der Hostname konnte nicht aufgelöst werden.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Dieser Wert entspricht nicht dem erwarteten Zeichensatz {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Dieser Wert ist keine gültige internationale Bankleitzahl (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Fehler</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Dieser Wert ist keine gültige UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Dieser Wert sollte ein Vielfaches von {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Diese internationale Bankleitzahl (BIC) ist nicht mit der IBAN {{ iban }} assoziiert.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Dieser Wert sollte gültiges JSON sein.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Diese Sammlung darf keine doppelten Elemente enthalten.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Diese Zahl sollte positiv sein.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Diese Zahl sollte entweder positiv oder 0 sein.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Diese Zahl sollte negativ sein.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Diese Zahl sollte entweder negativ oder 0 sein.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Dieser Wert ist keine gültige Zeitzone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dieses Passwort ist Teil eines Datenlecks, es darf nicht verwendet werden.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Dieser Wert sollte zwischen {{ min }} und {{ max }} sein.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Dieser Wert ist kein gültiger Hostname.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Die Anzahl an Elementen in dieser Sammlung sollte ein Vielfaches von {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Dieser Wert sollte eine der folgenden Bedingungen erfüllen:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Jedes Element dieser Sammlung sollte seine eigene Menge an Bedingungen erfüllen.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Dieser Wert ist keine gültige Internationale Wertpapierkennnummer (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Dieser Wert sollte eine gültige Expression sein.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Dieser Wert ist keine gültige CSS-Farbe.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Dieser Wert entspricht nicht der CIDR-Notation.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Der Wert der Subnetzmaske sollte zwischen {{ min }} und {{ max }} liegen.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Der Dateiname ist zu lang. Er sollte nicht länger als {{ filename_max_length }} Zeichen sein.|Der Dateiname ist zu lang. Er sollte nicht länger als {{ filename_max_length }} Zeichen sein.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Das Passwort ist zu schwach.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Der Wert enthält Zeichen, die auf der aktuellen Einschränkungsstufe nicht erlaubt sind.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Unsichtbare Zeichen sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Das Mischen von Zahlen aus verschiedenen Skripten ist nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Verstecke Overlay-Zeichen sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Die Dateiendung ist ungültig ({{ extension }}). Gültige Dateiendungen sind {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Der erkannte Zeichensatz ist nicht gültig ({{ detected }}). Gültige Zeichensätze sind {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Dieser Wert ist keine gültige MAC-Adresse.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Dieser URL fehlt eine Top-Level-Domain.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Dieser Wert ist zu kurz. Er muss aus mindestens einem Wort bestehen.|Dieser Wert ist zu kurz. Er muss mindestens {{ min }} Wörter enthalten.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Dieser Wert ist zu lang. Er darf maximal aus einem Wort bestehen.|Dieser Wert ist zu lang. Er darf maximal {{ max }} Wörter enthalten.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Dieser Wert ist keine Wochenangabe im ISO 8601-Format.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Dieser Wert ist keine gültige Woche.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Dieser Wert darf nicht vor der Woche "{{ min }}" sein.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Dieser Wert darf nicht nach der Woche "{{ max }}" sein.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Dieser Wert ist kein valides Twig-Template.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Diese Datei ist kein gültiges Video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Die Größe des Videos konnte nicht ermittelt werden.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Das Video ist zu breit ({{ width }}px). Die zulässige maximale Breite ist {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Das Video ist nicht breit genug ({{ width }}px). Die erwartete Mindestbreite ist {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Die Videohöhe ist zu hoch ({{ height }}px). Die zulässige maximale Höhe ist {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Die Videohöhe ist zu klein ({{ height }}px). Die erwartete Mindesthöhe ist {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Das Video hat zu wenige Pixel ({{ pixels }}). Die erwartete Mindestanzahl ist {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Das Video hat zu viele Pixel ({{ pixels }}). Die erwartete Höchstanzahl ist {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Das Video-Seitenverhältnis ist zu hoch ({{ ratio }}). Das zulässige maximale Verhältnis ist {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Das Video-Seitenverhältnis ist zu klein ({{ ratio }}). Das erwartete Mindestverhältnis ist {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Das Video ist quadratisch ({{ width }}x{{ height }}px). Quadratische Videos sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Das Video ist im Querformat ({{ width }}x{{ height }} px). Querformat-Videos sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Das Video ist hochkant ausgerichtet ({{ width }}x{{ height }}px). Hochkant-Videos sind nicht erlaubt.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Die Videodatei ist beschädigt.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Das Video enthält mehrere Streams. Es ist nur ein Stream erlaubt.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Nicht unterstützter Videocodec "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Nicht unterstützter Videocontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Die Bilddatei ist beschädigt.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Das Bild hat zu wenige Pixel ({{ pixels }}). Erwartete Mindestanzahl ist {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Das Bild hat zu viele Pixel ({{ pixels }}). Erwartete Höchstanzahl ist {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Dieser Dateiname entspricht nicht dem erwarteten Zeichensatz.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="th" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>ค่านี้ควรเป็น false</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>ค่านี้ควรเป็น true</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>ค่านี้ควรเป็น {{ type }}</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>ควรเป็นค่าว่าง</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>คุณเลือกค่าที่ไม่ตรงกับตัวเลือก</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>คุณต้องเลือกอย่างน้อย {{ limit }} ตัวเลือก</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>คุณเลือกได้มากที่สุด {{ limit }} ตัวเลือก</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>มีบางค่าที่ส่งมาไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>ไม่ควรมีฟิลด์นี้</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>ฟิลด์นี้หายไป</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>ค่าของวันที่ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>ค่าของวันที่และเวลาไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>ค่าของอีเมล์ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>ไม่พบไฟล์</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>ไฟล์ไม่อยู่ในสถานะที่สามารถอ่านได้</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ไฟล์ใหญ่เกิน ({{ size }} {{ suffix }}) อนุญาตให้ใหญ่ที่สุดได้ไม่เกิน {{ limit }} {{ suffix }}</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime type ของไฟล์ไม่ถูกต้อง ({{ type }}) Mime types ที่อนุญาตคือ {{ types }}</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>ค่านี้ควรจะเป็น {{ limit }} หรือน้อยกว่านั้น</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>ค่านี้ยาวเกินไป ควรจะมีแค่ {{ limit }} ตัวอักษรหรือน้อยกว่านั้น</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>ค่านี้ควรจะมี {{ limit }} หรือมากกว่านั้น</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>ค่านี้สั้นเกินไป ควรจะมี {{ limit }} ตัวอักษรหรือมากกว่านั้น</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>ค่านี้ไม่ควรเป็นค่าว่าง</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>ค่านี้ไม่ควรเป็นค่า null</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>ค่านี้ควรเป็นค่า null</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>ค่านี้ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>ค่าของเวลาไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>ค่าของ URL ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>ค่าทั้งสองค่าควรจะเหมือนกัน</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ขนาดไฟล์ใหญ่เกินไป อนุญาตให้ไฟล์ขนาดใหญ่ได้ไม่เกิน {{ limit }} {{ suffix }}</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>ขนาดไฟล์ใหญ่เกินไป</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>ไม่สามารถอัปโหลดไฟล์ได้</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>ค่าของตัวเลขไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>ไฟล์นี้ไม่ใช่ไฟล์รูปภาพ</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่ที่อยู่ IP ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>ค่าของภาษาไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>ค่าของภูมิภาค (Locale) ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>ค่าของประเทศไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>ค่านี้ถูกใช้งานไปแล้ว</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>ไม่สามารถตรวจสอบขนาดไฟล์ของภาพได้</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>ความกว้างของภาพเกินขนาด ({{ width }}px) อนุญาตให้กว้างได้มากที่สุด {{ max_width }}px</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>ความกว้างของภาพต่ำเกินไป ({{ width }}px) อนุญาตให้ความกว้างไม่ต่ำกว่า {{ min_width }}px</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ความสูงของภาพเกินขนาด ({{ height }}px) อนุญาตให้สูงได้มากที่สุด {{ max_height }}px</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ความสูงของภาพเล็กเกินไป ({{ height }}px) อนุญาตให้ความสูงไม่ควรต่ำกว่า {{ min_height }}px</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>ค่านี้ควรจะเป็นรหัสผ่านปัจจุบันของผู้ใช้</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>ค่านี้ควรจะมีความยาว {{ limit }} ตัวอักษร</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>อัปโหลดไฟล์ได้เพียงบางส่วนเท่านั้น</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>ไม่มีไฟล์ใดถูกอัปโหลด</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">ไม่มีการกำหนดโฟลเดอร์ชั่วคราวใน php.ini หรือโฟลเดอร์ที่กำหนดไม่มีอยู่จริง</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>ไม่สามารถเขียนไฟล์ชั่วคราว (temporary file) ลงดิสก์ได้</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP extension ทำให้การอัปโหลดมีปัญหา</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>คอเล็กชั่นนี้ควรจะประกอบไปด้วยอย่างน้อย {{ limit }} สมาชิก</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>คอเล็กชั่นนี้ไม่ควรมีสมาชิกเกิน {{ limit }}</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>คอเล็กชั่นนี้ควรจะมี {{ limit }} สมาชิกเท่านั้น</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>หมายเลขบัตรไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>ไม่รู้จักประเภทของบัตร หรือหมายเลขบัตรไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่หมายเลขบัญชีธนาคารระหว่างประเทศ (IBAN) ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>ค่านี้ไม่ใช่ ISBN-10 ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>ค่านี้ไม่ใช่ ISBN-13 ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>ค่านี้ไม่ใช่ ISBN-10 หรือ ISBN-13 ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>ค่านี้ไม่ใช่ ISSN ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>ค่านี้ไม่ใช่สกุลเงินที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>ค่านี้ควรตรงกับ {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>ค่านี้ควรจะมากกว่า {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>ค่านี้ควรจะมากกว่าหรือตรงกับ {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>ค่านี้ควรจะเหมือนกันกับ {{ compared_value_type }} {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>ค่านี้ควรจะน้อยกว่า {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>ค่านี้ควรจะน้อยกว่าหรือเท่ากับ {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>ค่านี้ไม่ควรเท่ากันกับ {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>ค่านี้ไม่ควรเหมือนกันกับ {{ compared_value_type }} {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>สัดส่วนของภาพใหญ่เกิน ({{ ratio }}) สัดส่วนใหญ่ที่สุดที่ใช้ได้คือ {{ max_ratio }}</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>สัดส่วนของภาพเล็กเกิน ({{ ratio }}) สัดส่วนเล็กที่สุดที่ใช้ได้คือ {{ min_ratio }}</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>รูปภาพเป็นจุตรัส ({{ width }}x{{ height }}px) ไม่อนุญาตภาพที่เป็นสี่เหลี่ยมจตุรัส</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>ภาพนี้เป็นแนวนอน ({{ width }}x{{ height }}px) ไม่อนุญาตภาพที่เป็นแนวนอน</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>ภาพนี้เป็นแนวตั้ง ({{ width }}x{{ height }}px) ไม่อนุญาตภาพที่เป็นแนวตั้ง</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>ไม่อนุญาตให้ใช้ไฟล์ว่าง</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>ไม่สามารถแก้ไขชื่อโฮสต์</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>ค่านี้ไม่ตรงกับการเข้ารหัส {{ charset }}</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่รหัสประจำตัวธุรกิจ (BIC) ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>เกิดข้อผิดพลาด</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่ UUID ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>ค่านี้ควรเป็น {{ compared_value }} หลายตัว</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>รหัสสำหรับระบุธุรกิจนี้ (BIC) ไม่เกี่ยวข้องกับ IBAN {{ iban }}</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>ค่านี้ควรอยู่ในรูปแบบ JSON ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>คอเล็กชั่นนี้ควรมีเฉพาะสมาชิกที่ไม่ซ้ำกันเท่านั้น</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>ค่านี้ควรเป็นค่าบวก</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>ค่านี้ควรเป็นค่าบวกหรือค่าศูนย์</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>ค่านี้ควรเป็นค่าลบ</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>ค่านี้ควรเป็นค่าลบหรือค่าศูนย์</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>ค่าเขตเวลาไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>รหัสผ่านนี้ได้เคยรั่วไหลออกไปโดยถูกการละเมิดข้อมูล ซึ่งไม่ควรนำกลับมาใช้ กรุณาใช้รหัสผ่านอื่น</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>ค่านี้ควรอยู่ระหว่าง {{ min }} ถึง {{ max }}</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>ค่าโฮสต์เนมไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>จำนวนของสมาชิกในคอเล็กชั่นควรเป็นพหุคูณของ {{ compared_value }}</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>ค่านี้ควรเป็นไปตามข้อจำกัดอย่างน้อยหนึ่งข้อจากข้อจำกัดเหล่านี้:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>สมาชิกแต่ละตัวในคอเล็กชั่นควรเป็นไปตามข้อจำกัดของคอเล็กชั่นนั้นๆ</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>ค่ารหัสหลักทรัพย์สากล (ISIN) ไม่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>ค่านี้ควรเป็นนิพจน์ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>ค่านี้ไม่ใช่สี CSS ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>ค่านี้ไม่ใช่รูปแบบ CIDR ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>ค่าของ netmask ควรมีค่าระหว่าง {{ min }} ถึง {{ max }}</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>ชื่อไฟล์ยาวเกินไป ควรจะมีแค่ {{ filename_max_length }} ตัวอักษรหรือน้อยกว่านั้น</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>รหัสผ่านมีความปลอดภัยต่ำ กรุณาใช้รหัสผ่านที่มีความปลอดภัยสูง</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>ค่านี้ประกอบด้วยตัวอักษรที่ไม่รับอนุญาตจากระดับข้อบังคับปัจจุบัน</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>ไม่อนุญาตให้ใช้ตัวอักษรที่มองไม่เห็น</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>ไม่อนุญาตให้ผสมตัวเลขจากสคริปต์ที่แตกต่างกัน</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>ไม่อนุญาตให้ใช้ตัวอักษรซ้อนทับที่ซ่อนอยู่</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">นามสกุลไฟล์ไม่ถูกต้อง ({{ extension }}). นามสกุลที่อนุญาตคือ {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">การเข้ารหัสอักขระที่ตรวจพบไม่ถูกต้อง ({{ detected }}). การเข้ารหัสที่อนุญาตคือ {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่ที่อยู่ MAC ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">URL นี้ขาดโดเมนระดับสูงสุด.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">ค่านี้สั้นเกินไป ควรมีอย่างน้อยหนึ่งคำ|ค่านี้สั้นเกินไป ควรมีอย่างน้อย {{ min }} คำ</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">ค่านี้ยาวเกินไป ควรมีเพียงคำเดียว|ค่านี้ยาวเกินไป ควรมี {{ max }} คำ หรือต่ำกว่า</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">ค่านี้ไม่แสดงถึงสัปดาห์ที่ถูกต้องตามรูปแบบ ISO 8601</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่สัปดาห์ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">ค่านี้ไม่ควรจะก่อนสัปดาห์ "{{ min }}"</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">ค่านี้ไม่ควรจะอยู่หลังสัปดาห์ "{{ max }}"</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">ค่านี้ไม่ใช่เทมเพลต Twig ที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">ไฟล์นี้ไม่ใช่วิดีโอที่ถูกต้อง</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">ไม่สามารถตรวจพบขนาดของวิดีโอได้</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">ความกว้างของวิดีโอใหญ่เกินไป ({{ width }}px). ความกว้างสูงสุดที่อนุญาตคือ {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">ความกว้างของวิดีโอเล็กเกินไป ({{ width }}px) ความกว้างขั้นต่ำที่คาดหวังคือ {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">ความสูงของวิดีโอสูงเกินไป ({{ height }}px). ความสูงสูงสุดที่อนุญาตคือ {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">ความสูงของวิดีโอมีขนาดเล็กเกินไป ({{ height }}px). ความสูงขั้นต่ำที่คาดไว้คือ {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">วิดีโอนี้มีพิกเซลน้อยเกินไป ({{ pixels }}). ปริมาณขั้นต่ำที่คาดไว้คือ {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">วิดีโอนี้มีพิกเซลมากเกินไป ({{ pixels }}). จำนวนสูงสุดที่คาดไว้คือ {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">อัตราส่วนวิดีโอใหญ่เกินไป ({{ ratio }}) อัตราส่วนสูงสุดที่อนุญาตคือ {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">อัตราส่วนวิดีโอเล็กเกินไป ({{ ratio }}). อัตราส่วนขั้นต่ำที่คาดหวังคือ {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">วิดีโอเป็นสี่เหลี่ยมจัตุรัส ({{ width }}x{{ height }}px). ไม่อนุญาตให้ใช้วิดีโอสี่เหลี่ยมจัตุรัส.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">วิดีโออยู่ในแนวนอน ({{ width }}x{{ height }} พิกเซล). ไม่อนุญาตวิดีโอแนวนอน</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">วิดีโอเป็นแนวตั้ง ({{ width }}x{{ height }}px) วิดีโอแนวตั้งไม่ได้รับอนุญาต</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">ไฟล์วิดีโอเสียหาย.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">วิดีโอนี้มีสตรีมหลายสตรีม อนุญาตเฉพาะสตรีมเดียวเท่านั้น</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">ไม่รองรับตัวแปลงสัญญาณวิดีโอ "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">ไม่รองรับคอนเทนเนอร์วิดีโอ "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">ไฟล์รูปภาพเสียหาย</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">รูปภาพมีพิกเซลน้อยเกินไป ({{ pixels }}). จำนวนขั้นต่ำที่คาดไว้คือ {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">ภาพมีพิกเซลมากเกินไป ({{ pixels }}). จำนวนสูงสุดที่คาดไว้คือ {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">ชื่อไฟล์นี้ไม่ตรงกับชุดอักขระที่คาดไว้.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ur" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>یہ ويليو غلط ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>یہ ويليو درست ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>قسم کی ہونی چاہیے {{type}} يھ ويليو</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>یہ ويليو خالی ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>آپ نے جو ويليو منتخب کی ہے وہ درست انتخاب نہیں ہے</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>کا انتخاب کرنا چاہیے {{limit}} کا انتخاب کرنا چاہیے ۔آّپ کو کم اذ کم {{limit}} آپ کو کم از کم</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>کا انتخاب کرنا چاہیے {{limit}} کا انتخاب کرنا چاہیے ۔آّپ کو ذيادھ سے ذيادھ {{limit}} آپ کو ذيادھ سے ذيادھ</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>دی گئی ويليوذ میں سے ایک یا زیادھ ويليوذ غلط ہیں</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>اس فیلڈ کی توقع نہیں تھی</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>یہ فیلڈ غائب ہے</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>یہ ويليو درست تاریخ نہیں ہے</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>یہ ويليو درست تاریخ وقت نہیں ہے</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>یہ ويليو درست ای میل ایڈریس نہیں ہے</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>فائل نہیں مل سکی</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>فائل پڑھنے کے قابل نہیں ہے</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>{{ suffix }} {{ limit }} زیادہ سے زیادہ سائز کی اجازت ہے {{ suffix }}) ({{ size }} فائل بہت بڑی ہے</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>ہیں {{ types }} مائیم کی قسمیں ({{ type }}) فائل کی ماۂيم قسم غلط ہے</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>یا اس سے کم ہونی چاہیے {{ limit }} یہ ويليو</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>حروف یا اس سے کم ہونے چاہئیں {{ limit }} حرف یا اس سے کم ہونا چاہیے۔|یہ ويليو بہت لمبی ہے۔ اس میں{{ limit }} یہ ويليو بہت لمبی ہے۔ اس میں</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>یا اس سے زیادہ ہونی چاہیے {{ limit }} یہ ويليو</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>حروف یا اس سے زیادہ ہونے چاہئیں {{ limit }} حرف یا اس سے زیادہ ہونا چاہیے۔|یہ ويليو بہت چھوٹی ہے۔ اس میں{{ limit }} یہ ويليو بہت مختصر ہے۔ اس میں</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>یہ ويليو خالی نہیں ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>یہ ويليو خالی نہیں ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>یہ ويليو خالی ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>یہ ويليو درست نہیں ہے</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>یہ ويليو درست وقت نہیں ہے</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>نہیں ہے URL یہ ويليو درست</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>دونوں ويليوذ برابر ہونی چاہئیں</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>{{ suffix }} {{ limit }} فائل بہت بڑی ہے۔ زیادہ سے زیادہ سائز کی اجازت ہے</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>فائل بہت بڑی ہے</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>فائل اپ لوڈ نہیں ہو سکی</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>یہ ويليو ایک درست نمبر ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>یہ فائل درست تصویر نہیں ہے</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">یہ قیمت کوئی درست IP پتہ نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>یہ ويليو درست زبان نہیں ہے</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>یہ ويليو درست مقام نہیں ہے</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>یہ ويليو ایک درست ملک نہیں ہے</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>یہ ويليو پہلے ہی استعمال ہو چکی ہے</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>تصویر کے سائز کا پتہ نہیں چل سکا</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>ہے {{ max_width }}px اجازت دی گئی زیادہ سے زیاد چوڑائی ({{ width }}px) تصویر کی چوڑائی بہت بڑی ہے</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>ہے {{ min_width }}px کم از کم چوڑائی متوقع({{ width }}px) تصویر کی چوڑائی بہت چھوٹی ہے</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ہے {{ max_height }}px اجازت دی گئی زیادہ سے زیاد اونچائی ({{ height }}px) تصویر کی اونچائی بہت بڑی ہے</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ہے {{ min_height }}px  متوقع کم از کم اونچائی ({{ height }}px) تصویر کی اونچائی بہت چھوٹی ہے</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>یہ ويليو صارف کا موجودہ پاس ورڈ ہونا چاہیے</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>حروف ہونے چاہئیں {{ limit }} حرف ہونا چاہیے۔|اس ويليو میں بالکل {{ limit }} اس ويليو میں بالکل</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>فائل صرف جزوی طور پر اپ لوڈ کی گئی تھی</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>کوئی فائل اپ لوڈ نہیں کی گئی</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">php.ini میں کوئی عارضی فولڈر ترتیب نہیں دیا گیا تھا، یا ترتیب دیا گیا فولڈر موجود نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>عارضی فائل کو ڈسک پر نہیں لکھا جا سکتا</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>پی ایچ پی کی توسیع کی وجہ سے اپ لوڈ ناکام ہو گیا</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>عناصر یا اس سے زیادہ ہونا چاہیے {{ limit }  عنصر یا اس سے زیادہ ہونا چاہیے۔|اس مجموعہ میں {{ limit }} اس مجموعہ میں</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>عناصر یا اس سے کم ہونا چاہیے {{ limit } عنصر یا اس سے کم ہونا چاہیے۔|اس مجموعہ میں {{ limit }} اس مجموعہ میں</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>عنصر ہونا چاہیے {{ limit }}  عنصر ہونا چاہیے۔|اس مجموعے میں بالکل {{ limit }} اس مجموعہ میں بالکل</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>غلط کارڈ نمبر</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>غیر تعاون یافتہ کارڈ کی قسم یا غلط کارڈ نمبر</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">یہ قیمت کوئی درست بین الاقوامی بینک اکاؤنٹ نمبر (IBAN) نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>نہیں ہے ISBN-10 یھ ويليو درست۔</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>نہیں ہے ISBN-13 یھ ويليو درست۔</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>ISBN-13 ے اور نہ ہی درست ISBN-10 یہ ويليو نہ تو درست</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>نہیں ہے ISSNیھ ويليو درست۔</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>یہ ويليو درست کرنسی نہیں ہے</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>کے برابر ہونا چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>سے بڈي ہوني چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>سے بڈي یا برابر ہوني چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>{{ compared_value }} {{ compared_value_type }} یہ ويليو ایک جیسی ہونی چاہیے۔</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>سے کم ہوني چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>سے کم یا برابر ہوني چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>کے برابر نھيں ہوني چاہیے {{ compared_value }} یھ ويليو</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>ایک جیسی نیيں ہونی چاہیے {{ compared_value }} {{ compared_value_type }} یہ ويليو</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>ہے {{ max_ratio }} اجازت شدہ زیادہ سے زیادہ تناسب ({{ ratio }}) تصویر کا تناسب بہت بڑا ہے</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>ہے{{ min_ratio }} ratio متوقع کم از کم ({{ ratio }}) بہت چھوٹا ہے ratio تصویر کا</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>مربع تصاویر کی اجازت نہیں ہے (px{{ height }}x{{ width }})  تصویر مربع ہے</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>زمین کی تزئین پر مبنی تصاویر کی اجازت نہیں ہے ({{ width }}x{{ height }}px) تصویر زمین کی تزئین پر مبنی ہے</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>پورٹریٹ پر مبنی تصاویر کی اجازت نہیں ہے ({{ width }}x{{ height }}px) تصویر پورٹریٹ پر مبنی ہے</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>خالی فائل کی اجازت نہیں ہے</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>میزبان حل نہیں ہو سکا</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>کے جيسي نہیں ہے charset {{ charset }} یہ ويليو متوقع</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">یہ قیمت کوئی درست بزنس شناختی کوڈ (BIC) نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>خرابی</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">یہ قیمت کوئی درست UUID نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>کا ضرب ہوني چاہیے {{ compared_value }} یہ ويليو </target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>سے وابستہ نہیں ہے IBAN {{ iban }} (BIC) یہ کاروباری شناختی کوڈ</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>ہونی چاہیے JSON یہ ويليو درست</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>یہ مجموعہ صرف منفرد عناصر پر مشتمل ہونا چاہیے</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>یہ ويليو مثبت ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>یہ ويليو یا تو مثبت یا صفر ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>یہ ويليو منفی ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>یہ ويليو یا تو منفی یا صفر ہونی چاہیے</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>یہ ويليو درست ٹائم زون نہیں ہے</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>یہ پاس ورڈ ڈیٹا کی خلاف ورزی میں لیک ہو گیا ہے، اسے استعمال نہیں کرنا چاہیے۔ براۓ کرم دوسرا پاس ورڈ استعمال کریں</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>کے درمیان ہونی چاہیے {{ max }} اور {{ min }} یہ ويليو</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>نہیں ہے hostname یہ ويليو درست</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>کی ضرب ہونی چاہیے {{ compared_value }} اس مجموعہ میں عناصر کی تعداد</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>اس ويليو کو درج ذیل رکاوٹوں میں سے کم از کم ایک کو پورا کرنا چاہیے</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>اس مجموعے کے ہر عنصر کو اپنی پابندیوں کے سیٹ کو پورا کرنا چاہیے</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>نہیں ہے (ISIN) یہ ويليو درست بین الاقوامی سیکیورٹیز شناختی نمبر</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>یہ ويليو ایک درست اظہار ہوني چاہیے</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>رنگ نہیں ہے CSS یہ ويليو درست</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>نوٹیشن نہیں ہے CIDR یہ ويليو ایک درست</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>کے درمیان ہونی چاہیے {{ max }} اور {{ min }} نیٹ ماسک کی ويليو</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target state="needs-review-translation">فائل کا نام بہت لمبا ہے۔ اس میں {{ filename_max_length }} حرف یا اس سے کم ہونے چاہئیں۔|فائل کا نام بہت لمبا ہے۔ اس میں {{ filename_max_length }} حروف یا اس سے کم ہونے چاہئیں۔</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target state="needs-review-translation">پاس ورڈ کی طاقت بہت کم ہے۔ براہ کرم مضبوط پاس ورڈ استعمال کریں۔</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target state="needs-review-translation">اس قدر میں ایسے حروف موجود ہیں جو موجودہ پابندی کی سطح کی طرف سے اجازت نہیں ہیں۔</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target state="needs-review-translation">نادیدہ حروف استعمال کرنے کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target state="needs-review-translation">مختلف اسکرپٹس سے نمبروں کو ملا کر استعمال کرنے کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target state="needs-review-translation">چھپے ہوئے اوورلے کریکٹرز کا استعمال کرنے کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target state="needs-review-translation">فائل کی توسیع نامناسب ہے ({{ extension }})۔ اجازت شدہ توسیعات {{ extensions }} ہیں۔</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">پتہ چلنے والی کریکٹر انکوڈنگ نامناسب ہے ({{ detected }})۔ اجازت شدہ انکوڈنگز {{ encodings }} ہیں۔</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">یہ قیمت کوئی درست MAC پتہ نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">اس URL میں ٹاپ لیول ڈومین موجود نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">یہ قدر بہت مختصر ہے۔ اس میں کم از کم ایک لفظ ہونا چاہیے۔|یہ قدر بہت مختصر ہے۔ اس میں کم از کم {{ min }} الفاظ ہونے چاہئیں۔</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">یہ قدر بہت طویل ہے۔ اس میں صرف ایک لفظ ہونا چاہیے۔|یہ قدر بہت طویل ہے۔ اس میں {{ max }} الفاظ یا اس سے کم ہونے چاہئیں۔</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">یہ قدر آئی ایس او 8601 فارمیٹ میں ایک درست ہفتے کی نمائندگی نہیں کرتی ہے۔</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">یہ قدر ایک درست ہفتہ نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">یہ قدر ہفتہ "{{ min }}" سے پہلے نہیں ہونا چاہیے۔</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">یہ قدر ہفتہ "{{ max }}" کے بعد نہیں ہونا چاہیے۔</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">یہ قدر ایک درست Twig سانچہ نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">یہ فائل ایک درست ویڈیو نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">ویڈیو کا سائز معلوم نہیں کیا جا سکا۔</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">ویڈیو کی چوڑائی بہت زیادہ ہے ({{ width }}px)۔ اجازت شدہ زیادہ سے زیادہ چوڑائی {{ max_width }}px ہے۔</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">ویڈیو کی چوڑائی بہت کم ہے ({{ width }}px)۔ متوقع کم از کم چوڑائی {{ min_width }} پکسل ہے۔</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">ویڈیو کی اونچائی بہت زیادہ ہے ({{ height }}px)۔ مجاز زیادہ سے زیادہ اونچائی {{ max_height }}px ہے۔</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">ویڈیو کی اونچائی بہت کم ہے ({{ height }}px)۔ متوقع کم از کم اونچائی {{ min_height }}px ہے۔</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">ویڈیو میں پکسل بہت کم ہیں ({{ pixels }}). متوقع کم از کم مقدار {{ min_pixels }} ہے۔</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">ویڈیو میں پکسلز بہت زیادہ ہیں ({{ pixels }}). متوقع زیادہ سے زیادہ مقدار {{ max_pixels }} ہے۔</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">ویڈیو کا تناسب بہت بڑا ہے ({{ ratio }}). اجازت شدہ زیادہ سے زیادہ تناسب {{ max_ratio }} ہے۔</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">ویڈیو کا تناسب بہت چھوٹا ہے ({{ ratio }}). متوقع کم از کم تناسب {{ min_ratio }} ہے۔</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">ویڈیو مربع ہے ({{ width }}x{{ height }}px). مربع ویڈیوز کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">ویڈیو افقی سمت میں ہے ({{ width }}x{{ height }} پکسل). افقی ویڈیوز کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">ویڈیو عمودی رخ پر ہے ({{ width }}x{{ height }}px). عمودی رخ والی ویڈیوز کی اجازت نہیں ہے۔</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">ویڈیو فائل خراب ہے۔</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">ویڈیو میں متعدد اسٹریمز ہیں۔ صرف ایک اسٹریم کی اجازت ہے۔</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">غیر معاون ویڈیو کوڈیک "{{ codec }}"۔</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">غیر معاونت یافتہ ویڈیو کنٹینر "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">تصویری فائل خراب ہے۔</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">تصویر میں پکسلز بہت کم ہیں ({{ pixels }})۔ متوقع کم سے کم مقدار {{ min_pixels }} ہے۔</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">تصویر میں پکسلز بہت زیادہ ہیں ({{ pixels }}). متوقع زیادہ سے زیادہ مقدار {{ max_pixels }} ہے.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">اس فائل کا نام متوقع حرفوں کے مجموعے سے مطابقت نہیں رکھتا۔</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="ar" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>هذه القيمة يجب أن تكون خاطئة.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>هذه القيمة يجب أن تكون صحيحة.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>هذه القيمة يجب ان تكون من نوع {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>هذه القيمة يجب ان تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>القيمة المختارة ليست خيار صحيح.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيارات على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيارات على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>واحد أو أكثر من القيم المعطاه خاطئ.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>لم يكن من المتوقع هذا الحقل.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>هذا الحقل مفقود.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>هذه القيمة ليست تاريخ صالح.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>هذه القيمة ليست تاريخ و وقت صالح.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>هذه القيمة ليست لها عنوان بريد إلكتروني صحيح.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>لا يمكن العثور على الملف.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>الملف غير قابل للقراءة.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>الملف كبير جدا ({{ size }} {{ suffix }}).اقصى مساحه مسموح بها ({{ limit }} {{ suffix }}).</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>نوع الملف غير صحيح ({{ type }}). الانواع المسموح بها هى {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>هذه القيمة يجب ان تكون {{ limit }} او اقل.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حروف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>هذه القيمة يجب ان تكون {{ limit }} او اكثر.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حروف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>هذه القيمة يجب لا تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>هذه القيمة يجب لا تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>هذه القيمة يجب ان تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>هذه القيمة غير صحيحة.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>هذه القيمة ليست وقت صحيح.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>هذه القيمة ليست رابط الكترونى صحيح.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>القيمتان يجب ان تكونا متساويتان.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>الملف كبير جدا. اقصى مساحه مسموح بها {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>الملف كبير جدا.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>تعذر تحميل الملف.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>هذه القيمة يجب ان تكون رقم.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>هذا الملف غير صالح للصورة.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>هذا ليس عنوان IP صحيح.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>هذه القيمة ليست لغة صحيحة.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>هذه القيمة ليست موقع صحيح.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>هذه القيمة ليست بلدا صالحا.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>هذه القيمة مستخدمة بالفعل.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>لم استطع معرفة حجم الصورة.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>عرض الصورة كبير جدا ({{ width }}px). اقصى عرض مسموح به هو{{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>عرض الصورة صغير جدا ({{ width }}px). اقل عرض مسموح به هو{{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>طول الصورة كبير جدا ({{ height }}px). اقصى طول مسموح به هو{{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>طول الصورة صغير جدا ({{ height }}px). اقل طول مسموح به هو{{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>هذه القيمة يجب ان تكون كلمة سر المستخدم الحالية.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حروف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>تم استقبال جزء من الملف فقط.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>لم يتم ارسال اى ملف.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>لم يتم تكوين مجلد مؤقت في ملف php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>لم استطع كتابة الملف المؤقت.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>احد اضافات PHP تسببت فى فشل استقبال الملف.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>رقم البطاقه غير صحيح.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>نوع البطاقه غير مدعوم او الرقم غير صحيح.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>هذه القيمة ليست رقم حساب بنكي دولي (IBAN) صالحًا.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>هذه القيمة ليست ISBN-10 صالحة.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>هذه القيمة ليست ISBN-13 صالحة.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>هذه القيمة ليست ISBN-10 صالحة ولا ISBN-13 صالحة.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>هذه القيمة ليست ISSN صالحة.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>العُملة غير صحيحة.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تساوي {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون اعلي من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون مساوية او اعلي من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>القيمة يجب ان تطابق {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون اقل من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تساوي او تقل عن {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان لا تساوي {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>القيمة يجب ان لا تطابق {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>نسبة العرض على الارتفاع للصورة كبيرة جدا ({{ ratio }}). الحد الأقصى للنسبة المسموح به هو {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>نسبة العرض على الارتفاع للصورة صغيرة جدا ({{ ratio }}). الحد الأدنى للنسبة المسموح به هو {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>الصورة مربعة ({{ width }}x{{ height }}px). الصور المربعة غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>الصورة في وضع أفقي ({{ width }}x{{ height }}px). الصور في وضع أفقي غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>الصورة في وضع عمودي ({{ width }}x{{ height }}px). الصور في وضع عمودي غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>ملف فارغ غير مسموح به.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>يتعذر الإتصال بالنطاق.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>هذه القيمة غير متطابقة مع صيغة التحويل {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>هذه القيمة ليست رمز معرف أعمال (BIC) صالحًا.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>خطأ</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>هذه القيمة ليست UUID صالحًا.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>هذه القيمة يجب أن تكون مضاعف ل {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>رمز المعرّف نشاط تجاري (BIC) هذا لا يرتبط مع IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>هذه القيمة يجب أن تكون صالحة ل JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>يجب أن تحتوي هذه المجموعة علي عناصر فريدة فقط.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>يجب أن تكون هذه القيمة موجبة.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>يجب أن تكون هذه القيمة إما موجبة او صفر.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>يجب أن تكون هذه القيمة سالبة.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>يجب أن تكون هذه القيمة إما سالبة او صفر.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>هذه القيمة ليست منطقة زمنية صحيحة.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>تم تسريب كلمة المرور هذه في خرق للبيانات، ويجب عدم استخدامها. يرجي استخدام كلمة مرور أخري.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>يجب أن تكون هذه القيمة بين {{ min }} و {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>هذه القيمة ليست اسم مضيف صالح.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>يجب أن يكون عدد العناصر في هذه المجموعة مضاعف {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>يجب أن تستوفي هذه القيمة واحدة من القيود التالية:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>يجب أن يفي كل عنصر من عناصر هذه المجموعة بمجموعة القيود الخاصة به.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target> صالح (ISIN) هذه القيمة ليست رقم تعريف الأوراق المالية الدولي.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>يجب أن تكون هذه القيمة تعبيرًا صالحًا.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>هذه القيمة ليست لون CSS صالحًا.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>هذه القيمة ليست تدوين CIDR صالحًا.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>يجب أن تكون قيمة netmask بين {{ min }} و {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>اسم الملف طويل جدا. يجب أن يحتوي على {{ filename_max_length }} حرف أو أقل.|اسم الملف طويل جدا. يجب أن يحتوي على {{ filename_max_length }} أحرف أو أقل.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>قوة كلمة المرور منخفضة للغاية. يرجى استخدام كلمة مرور أقوى.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>تحتوي هذه القيمة على أحرف غير مسموح بها بواسطة مستوى التقييد الحالي.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>لا يسمح باستخدام أحرف غير مرئية.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>لا يسمح بخلط الأرقام من نصوص مختلفة.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>لا يسمح باستخدام أحرف التراكب المخفية.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>امتداد الملف غير صحيح ({{ extension }}). الامتدادات المسموح بها هي {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>تم اكتشاف ترميز أحرف غير صالح ({{ detected }}). الترميزات المسموح بها هي {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>هذه القيمة ليست عنوان MAC صالحًا.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>هذا الرابط يفتقر إلى نطاق المستوى الأعلى.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>هذه القيمة قصيرة جدًا. يجب أن تحتوي على كلمة واحدة على الأقل.|هذه القيمة قصيرة جدًا. يجب أن تحتوي على {{ min }} كلمة على الأقل.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>هذه القيمة طويلة جدًا. يجب أن تحتوي على كلمة واحدة فقط.|هذه القيمة طويلة جدًا. يجب أن تحتوي على {{ max }} كلمة أو أقل.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>هذه القيمة لا تمثل أسبوعًا صالحًا وفق تنسيق ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>هذه القيمة ليست أسبوعًا صالحًا.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>يجب ألا تكون هذه القيمة قبل الأسبوع "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>يجب ألا تكون هذه القيمة بعد الأسبوع "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>هذه القيمة ليست نموذج Twig صالح.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>هذا الملف غير صالح كفيديو.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>تعذّر تحديد حجم الفيديو.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>عرض الفيديو كبير جدًا ({{ width }}px). الحد الأقصى المسموح للعرض هو {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>عرض الفيديو صغير جدًا ({{ width }}px). العرض الأدنى المتوقع هو {{ min_width }} بكسل.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ارتفاع الفيديو كبير جدًا ({{ height }}px). الحد الأقصى المسموح للارتفاع هو {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ارتفاع الفيديو صغير جدًا ({{ height }} بكسل). الارتفاع الأدنى المتوقع هو {{ min_height }} بكسل.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>الفيديو منخفض الجودة جداً ({{ pixels }} بكسل). الحد الأدنى المتوقع هو {{ min_pixels }} بكسل.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>دقة الفيديو مرتفعة جداً ({{ pixels }} بكسل). الحد الأقصى المتوقع هو {{ max_pixels }} بكسل.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>نسبة أبعاد الفيديو كبيرة جدًا ({{ ratio }}). أعلى نسبة متوقعة هي {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>نسبة أبعاد الفيديو صغيرة جدًا ({{ ratio }}). أقل نسبة متوقعة هي {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>الفيديو مربع ({{ width }}x{{ height }}px). مقاطع الفيديو ذات الشكل المربع غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>الفيديو بوضعية أفقية ({{ width }}x{{ height }} بكسل). مقاطع الفيديو الأفقية غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>الفيديو ذو اتجاه عمودي ({{ width }}x{{ height }} بكسل). مقاطع الفيديو ذات الاتجاه العمودي غير مسموح بها.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>ملف الفيديو تالف.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>الفيديو يحتوي على عدة مسارات (صوت أو صورة)، ومسموح بمسار واحد فقط.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>الترميز المستخدم في الفيديو غير مدعوم. "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>ملف الفيديو بصيغة غير مدعومة "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>ملف الصورة تالف.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>الصورة منخفضة الجودة جدًا ({{ pixels }} بكسل)، و الحد الأدنى المتوقع: {{ min_pixels }} بكسل.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>جودة الصورة مرتفعة جدًا ({{ pixels }} بكسل). العدد الأقصى المتوقع هو {{ max_pixels }} بكسل.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>اسم الملف يحتوي على أحرف غير مسموح بها.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sr-Latn" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Vrednost treba da bude netačna.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Vrednost treba da bude tačna.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Vrednost treba da bude tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Vrednost treba da bude prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vrednost treba da bude jedna od ponuđenih.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izaberite bar {{ limit }} mogućnost.|Izaberite bar {{ limit }} mogućnosti.|Izaberite bar {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izaberite najviše {{ limit }} mogućnost.|Izaberite najviše {{ limit }} mogućnosti.|Izaberite najviše {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna ili više vrednosti je nevalidna.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ovo polje nije bilo očekivano.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ovo polje nedostaje.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Vrednost nije validan datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Vrednost nije validan datum-vreme.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Vrednost nije validna adresa elektronske pošte.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteka ne može biti pronađena.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteka nije čitljiva.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME tip datoteke nije validan ({{ type }}). Dozvoljeni MIME tipovi su {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Vrednost treba da bude {{ limit }} ili manje.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Vrednost je predugačka. Treba da ima {{ limit }} karakter ili manje.|Vrednost je predugačka. Treba da ima {{ limit }} karaktera ili manje.|Vrednost je predugačka. Treba da ima {{ limit }} karaktera ili manje.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Vrednost treba da bude {{ limit }} ili više.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Vrednost je prekratka. Treba da ima {{ limit }} karakter ili više.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili više.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili više.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Vrednost ne treba da bude prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Vrednost ne treba da bude null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Vrednost treba da bude null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Vrednost nije validna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Vrednost nije validno vreme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Vrednost nije validan URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obe vrednosti treba da budu jednake.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika. Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Datoteka je prevelikia.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Datoteka ne može biti otpremljena.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Vrednost treba da bude validan broj.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ova datoteka nije validna slika.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ova vrednost nije validna IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Vrednost nije validan jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Vrednost nije validna međunarodna oznaka jezika.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Vrednost nije validna država.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Vrednost je već iskorišćena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Veličina slike ne može biti određena.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je prevelika ({{ width }} piksela). Najveća dozvoljena širina je {{ max_width }} piksela.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premala ({{ width }} piksela). Najmanja dozvoljena širina je {{ min_width }} piksela.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Visina slike je prevelika ({{ height }} piksela). Najveća dozvoljena visina je {{ max_height }} piksela.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Visina slike je preniska ({{ height }} piksela). Najmanja dozvoljena visina je {{ min_height }} piksela.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Vrednost treba da bude trenutna korisnička lozinka.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Vrednost treba da ima tačno {{ limit }} karakter.|Vrednost treba da ima tačno {{ limit }} karaktera.|Vrednost treba da ima tačno {{ limit }} karaktera.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je samo delimično otpremljena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Datoteka nije otpremljena.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Privremeni direktorijum nije konfigurisan u php.ini, ili konfigurisani direktorijum ne postoji.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nemoguće pisanje privremene datoteke na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP ekstenzija je prouzrokovala neuspeh otpremanja datoteke.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ova kolekcija treba da sadrži tačno {{ limit }} element.|Ova kolekcija treba da sadrži tačno {{ limit }} elementa.|Ova kolekcija treba da sadrži tačno {{ limit }} elemenata.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nevalidan broj kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nevalidan broj kartice ili tip kartice nije podržan.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ova vrednost nije validan Međunarodni broj bankovnog računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ova vrednost nije validan ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ova vrednost nije validan ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ova vrednost nije ni validan ISBN-10 ni validan ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ova vrednost nije validan ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ova vrednost nije validna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude veća od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude veća ili jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude identična sa {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude manja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude manja ili jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ova vrednost ne treba da bude jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrednost ne treba da bude identična sa {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Razmera ove slike je prevelika ({{ ratio }}). Maksimalna dozvoljena razmera je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Razmera ove slike je premala ({{ ratio }}). Minimalna očekivana razmera je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Slika je kvadratna ({{ width }}x{{ height }} piksela). Kvadratne slike nisu dozvoljene.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Slika je orijentacije pejzaža ({{ width }}x{{ height }} piksela). Pejzažna orijentacija slika nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Slika je orijentacije portreta ({{ width }}x{{ height }} piksela). Portretna orijentacija slika nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Prazna datoteka nije dozvoljena.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Ime hosta ne može biti razrešeno.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Vrednost se ne poklapa sa očekivanim {{ charset }} setom karaktera.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ova vrednost nije validan Kod za identifikaciju biznisa (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Greška</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ova vrednost nije validan UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ova vrednost treba da bude deljiva sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>BIC kod nije povezan sa IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ova vrednost treba da bude validan JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ova kolekcija treba da sadrži samo jedinstvene elemente.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ova vrednost treba da bude pozitivna.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ova vrednost treba da bude ili pozitivna ili nula.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ova vrednost treba da bude negativna.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ova vrednost treba da bude ili negativna ili nula.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ova vrednost nije validna vremenska zona.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ova lozinka je kompromitovana prilikom prethodnih napada, nemojte je koristiti. Koristite drugu lozinku.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ova vrednost treba da bude između {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ova vrednost nije ispravno ime hosta.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Broj elemenata u ovoj kolekciji treba da bude deljiv sa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ova vrednost treba da zadovoljava namjanje jedno od narednih ograničenja:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Svaki element ove kolekcije treba da zadovolji sopstveni skup ograničenja.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ova vrednost nije validna međunarodna identifikaciona oznaka hartija od vrednosti (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ova vrednost treba da bude validan izraz.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ova vrednost nije validna CSS boja.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ova vrednost nije validna CIDR notacija.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Vrednost mrežne maske treba da bude između {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Naziv datoteke je suviše dugačak. Treba da ima {{ filename_max_length }} karakter ili manje.|Naziv datoteke je suviše dugačak. Treba da ima {{ filename_max_length }} karaktera ili manje.|Naziv datoteke je suviše dugačak. Treba da ima {{ filename_max_length }} karaktera ili manje.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Lozinka nije dovoljno jaka. Molimo koristite jaču lozinku.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ova vrednost sadrži karaktere koji nisu dozvoljeni od strane važećeg nivoa restrikcije.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Korišćenje nevidljivih karaktera nije dozvoljeno.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Mešanje brojeva iz različitih skripti nije dozvoljeno.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Korišćenje skrivenih preklopnih karaktera nije dozvoljeno.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Ekstenzija fajla nije validna ({{ extension }}). Dozvoljene ekstenzije su {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Detektovano kodiranje znakova nije validno ({{ detected }}). Dozvoljena kodiranja su {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ova vrednost nije validna MAC adresa.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Ovom URL nedostaje domen najvišeg nivoa.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ova vrednost je prekratka. Treba da sadrži makar jednu reč.|Ova vrednost je prekratka. Treba da sadrži makar {{ min }} reči.|Ova vrednost je prekratka. Treba da sadrži makar {{ min }} reči.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ova vrednost je predugačka. Treba da sadrži samo jednu reč.|Ova vrednost je predugačka. Treba da sadrži najviše {{ max }} reči.|Ova vrednost je predugačka. Treba da sadrži najviše {{ max }} reči.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ova vrednost ne predstavlja validnu nedelju u ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ova vrednost nije validna nedelja</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ova vrednost ne treba da bude pre nedelje "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ova vrednost ne treba da bude posle nedelje "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ova vrednost nije važeći Twig šablon.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ova datoteka nije važeći video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Nije bilo moguće utvrditi veličinu video snimka.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Širina videa je prevelika ({{ width }}px). Dozvoljena maksimalna širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Širina videa je previše mala ({{ width }}px). Očekivana minimalna širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Visina videa je prevelika ({{ height }}px). Dozvoljena maksimalna visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Visina videa je premala ({{ height }}px). Očekivana minimalna visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima premalo piksela ({{ pixels }}). Očekivana minimalna količina je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima previše piksela ({{ pixels }}). Očekivana maksimalna količina je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Odnos slike videa je prevelik ({{ ratio }}). Dozvoljeni maksimalni odnos je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Odnos stranica videa je previše mali ({{ ratio }}). Očekivani minimalni odnos je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video je kvadratnog oblika ({{ width }}x{{ height }}px). Kvadratni video zapisi nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je u vodoravnoj orijentaciji ({{ width }}x{{ height }} px). Vodoravni video zapisi nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je u portret orijentaciji ({{ width }}x{{ height }}px). Video zapisi u portret orijentaciji nisu dozvoljeni.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Video datoteka je oštećena.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video sadrži više tokova. Dozvoljen je samo jedan tok.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nepodržan video kodek „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nepodržan video kontejner "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Datoteka slike je oštećena.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima premalo piksela ({{ pixels }}). Očekivani minimalni broj je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima previše piksela ({{ pixels }}). Očekivani maksimalni broj je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Ovo ime datoteke ne odgovara očekivanom skupu znakova.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="mk" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Оваа вредност треба да биде лажна.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Оваа вредност треба да биде вистинита.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Оваа вредност треба да биде од типот {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Оваа вредност треба да биде празна.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Вредноста што ја одбравте не е валиден избор.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Мора да одберете најмалку {{ limit }} избор.|Мора да одберете најмалку {{ limit }} изброи.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Може да одберете најмногу {{ limit }} избор.|Мора да одберете најмногу {{ limit }} избори.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Една или повеќе од дадените вредности не се валидни.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ова поле не беше очекувано.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ова поле недостига.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Оваа вредност не е валиден датум.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Оваа вредност не е валиден датум и време.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Оваа вредност не е валидна адреса за е-пошта.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Датотеката не е најдена.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Датотеката не може да биде прочитана.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотеката е премногу голема ({{ size }} {{ suffix }}). Максималната дозволена големина е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Миме типот на датотеката не е валиден ({{ type }}). Дозволените миме типови се {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Оваа вредност треба да биде {{ limit }} или помалку.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Оваа вредност е предолга. Треба да содржи {{ limit }} карактер или помалку.|Оваа вредност е предолга. Треба да содржи {{ limit }} карактери или помалку.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Оваа вредност треба да е {{ limit }} или повеќе.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Оваа вредност е прекратка. Треба да содржи {{ limit }} карактер или повеќе.|Оваа вредност е прекратка. Треба да содржи {{ limit }} карактери или повеќе.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ова поле не може да биде празно.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Оваа вредност не може да биде ништо (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Оваа вредност треба да е ништо (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Оваа вредност не е валидна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Оваа вредност не е валидно време.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Оваа вредност не е валиден URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Двете вредности треба да се еднакви.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотеката е премногу голема. Максималната дозволена големина е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Датотеката е премногу голема.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Датотеката не може да биде подигната.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Оваа вредност треба да е валиден број.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Оваа датотека не е валидна слика.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Оваа вредност не е валидна IP адреса.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Оваа вредност не е валиден јазик.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Оваа вредност не е валидна локализација.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Оваа вредност не е валидна земја.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Оваа вредност веќе се користи.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Големината на сликата не може да се детектира.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширината на сликата е преголема ({{ width }}px). Максималната дозволена ширина е {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширината на сликата е премала ({{ width }}px). Минималната дозволена ширина е {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висината на сликата е преголема ({{ height }}px). Максималната дозволена висина е {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висината на сликата е премала ({{ height }}px). Минималната дозволена висина е {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Оваа вредност треба да биде сегашната лозинка на корисникот.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Оваа вредност треба да има точно {{ limit }} карактер.|Оваа вредност треба да има точно {{ limit }} карактери.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Датотеката е само делумно подигната.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Датотеката не е подигната.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Не е конфигурирана привремена папка во php.ini, или конфигурираната папка не постои.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Не може да се напише привремена датотека на дискот.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP екстензијата предизвика подигнувањето да биде неуспешно.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Оваа колекција треба да содржи {{ limit }} елемент или повеќе.|Оваа колекција треба да содржи {{ limit }} елементи или повеќе.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Оваа колекција треба да содржи {{ limit }} елемент или помалку.|Оваа колекција треба да содржи {{ limit }} елементи или помалку.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Оваа колекција треба да содржи точно {{ limit }} елемент.|Оваа колекција треба да содржи точно {{ limit }} елементи.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Бројот на картичката не е валиден.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Неподдржан тип на картичка или бројот на картичката не е валиден.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Оваа вредност не е валиден Меѓународен Банкарски Сметка Број (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Оваа вредност не е валиден ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Оваа вредност не е валиден ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Оваа вредност не е ниту валиден ISBN-10 ниту валиден ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Оваа вредност не е валиден ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Оваа вредност не е валидна валута.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Оваа вредност треба да биде еднаква на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Оваа вредност треба да е поголема од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Оваа вредност треба да е поголема или еднаква на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Оваа вредност треба да е идентична на {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Оваа вредност треба да е помала од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Оваа вредност треба да е помала или еднаква на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Оваа вредност треба да не биде еднаква на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Оваа вредност треба да не биде идентична со {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Соодносот на сликата е преголем ({{ ratio }}).Максималниот дозволен сооднос е {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Соодносот на сликата е премал ({{ ratio }}). Минималниот дозволен сооднос е {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Сликата е квадратна ({{ width }}x{{ height }}px). Квадратни слики не се дозволени.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Сликата е ориентирана кон пејзаж ({{ width }}x{{ height }}px). Сликите ориентирани кон пејзаж не се дозволени.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Сликата е ориентирана кон портрет ({{ width }}x{{ height }}px). Сликите ориентирани кон портрет не се дозволени.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Празна датотека не е дозволена.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Хостот е недостапен.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Оваа вредност не се совпаѓа со очекуваниот {{ charset }} сет на карактери (charset).</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Оваа вредност не е валиден Бизнис Идентификациски Код (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Грешка</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Оваа вредност не е валиден UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Оваа вредност треба да биде повеќекратна од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Овој бизнис идентификациски код (BIC) не е поврзан со IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Оваа вредност треба да биде валиден JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Оваа колекција треба да содржи само уникатни елементи.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Оваа вредност треба да биде позитивна.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Оваа вредност треба да биде или позитивна или нула.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Оваа вредност треба да биде негативна.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Оваа вредност треба да биде или негативна или нула.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Оваа вредност не е валидна временска зона.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Оваа лозинка е компромитирана и не смее да биде користена. Ве молиме употребете друга лозинка.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Оваа вредност треба да е помеѓу {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Оваа вредност не е валидно име за мрежниот сметач (hostname).</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Бројот на елементи во оваа колекција треба да биде повеќекратен од {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Оваа вредност треба да задоволува најмалку едно од следните ограничувања:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Секој елемент од оваа колекција треба да задоволува сопствен сет на ограничувања.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Оваа вредност не е важечки меѓународен идентификациски број за хартии од вредност (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Оваа вредност треба да биде валиден израз.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Оваа вредност не е валидна CSS боја.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Оваа вредност не е валидна CIDR ознака.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Вредноста на мрежната маска (netmask) треба да биде помеѓу {{ min }} и {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Името на датотеката е предолго. Треба да има {{ filename_max_length }} карактер има помалку.|Името на датотеката е предолго. Треба да има {{ filename_max_length }} карактери или помалку.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Оваа лозинка е премногу едноставна. Ве молиме користете посилна лозинка.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Оваа вредност содржи карактери кои не се дозволени од тековното ниво на ограничување.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Користењето на невидливи знаци не е дозволено.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Не е дозволено мешање на броеви од различни скрипти.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Не е дозволено користење на скриени знаци за преклопување.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Зголемувања на датотеката е неважечка ({{ extension }}). Дозволени зголемувања се ({{ extensions }}).</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Откриеното кодирање на знаци е неважечко ({{ detected }}). Дозволените шифрирања се {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Оваа вредност не е валидна MAC адреса.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">На овој URL недостасува домен од највисоко ниво.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Оваа вредност е премногу кратка. Треба да содржи барем една збор.|Оваа вредност е премногу кратка. Треба да содржи барем {{ min }} зборови.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Оваа вредност е премногу долга. Треба да содржи само еден збор.|Оваа вредност е премногу долга. Треба да содржи {{ max }} зборови или помалку.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Ова вредност не претставува валидна недела во ISO 8601 формат.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Оваа вредност не е валидна недела.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Ова вредност не треба да биде пред неделата "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Ова вредност не треба да биде по недела "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Оваа вредност не е валиден Twig шаблон.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Оваа датотека не е валидно видео.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Големината на видеото не можеше да се утврди.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Ширината на видеото е премногу голема ({{ width }}px). Дозволената максимална ширина е {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Ширината на видеото е премала ({{ width }}px). Минималната очекувана ширина е {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Висината на видеото е премногу голема ({{ height }}px). Дозволената максимална висина е {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Висината на видеото е премала ({{ height }}px). Очекуваната минимална висина е {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Видеото има премалку пиксели ({{ pixels }}). Очекуван минимален износ е {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Видеото има премногу пиксели ({{ pixels }}). Очекуваниот максимален износ е {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Соодносот на видеото е преголем ({{ ratio }}). Дозволениот максимален сооднос е {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Односот на видеото е премал ({{ ratio }}). Очекуваниот минимален однос е {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е квадратно ({{ width }}x{{ height }}px). Квадратни видеа не се дозволени.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е во хоризонтална ориентација ({{ width }}x{{ height }} px). Хоризонтални видеа не се дозволени.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Видеото е во портретна ориентација ({{ width }}x{{ height }}px). Видеа со портретна ориентација не се дозволени.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Видео датотеката е оштетена.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Видеото содржи повеќе струи. Дозволена е само една струја.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Неподдржан видео кодек „{{ codec }}“.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Неподдржан видео контејнер "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Датотеката со слика е оштетена.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Сликата има премалку пиксели ({{ pixels }}). Очекуваниот минимален број е {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Сликата има премногу пиксели ({{ pixels }}). Очекуваната максимална количина е {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Името на датотеката не одговара на очекуваниот збир на знаци.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="sl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Vrednost bi morala biti nepravilna (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Vrednost bi morala biti pravilna (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Vrednost mora biti naslednjega tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Vrednost mora biti prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vrednost, ki ste jo izbrali, ni veljavna možnost.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izbrati morate vsaj {{ limit }} možnost.|Izbrati morate vsaj {{ limit }} možnosti.|Izbrati morate vsaj {{ limit }} možnosti.|Izbrati morate vsaj {{ limit }} možnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izberete lahko največ {{ limit }} možnost.|Izberete lahko največ {{ limit }} možnosti.|Izberete lahko največ {{ limit }} možnosti.|Izberete lahko največ {{ limit }} možnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ena ali več podanih vrednosti ni veljavnih.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>To polje ni bilo pričakovati.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>To polje manjka.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ta vrednost ni veljaven datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ta vrednost ni veljaven datum in čas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ta vrednost ni veljaven e-poštni naslov.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteke ni mogoče najti.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteke ni mogoče prebrati.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Največja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke je neveljaven ({{ type }}). Dovoljeni mime tipi so {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ta vrednost bi morala biti {{ limit }} ali manj.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ta vrednost je predolga. Morala bi imeti {{ limit }} znak ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znaka ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znake ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znakov ali manj.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ta vrednost bi morala biti {{ limit }} ali več.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ta vrednost je prekratka. Morala bi imeti {{ limit }} znak ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znaka ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znake ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znakov ali več.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ta vrednost ne bi smela biti prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ta vrednost ne bi smela biti nedefinirana (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ta vrednost bi morala biti nedefinirana (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ta vrednost ni veljavna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ta vrednost ni veljaven čas.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ta vrednost ni veljaven URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Ti dve vrednosti bi morali biti enaki.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika. Največja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Datoteke ni bilo mogoče naložiti.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ta vrednost bi morala biti veljavna številka.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ta datoteka ni veljavna slika.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ta vrednost ni veljaven IP naslov.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ta vrednost ni veljaven jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ta vrednost ni veljavna lokalnost.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ta vrednost ni veljavna država.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ta vrednost je že uporabljena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Velikosti slike ni bilo mogoče zaznati.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je preširoka ({{ width }}px). Največja dovoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premajhna ({{ width }}px). Najmanjša predvidena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Višina slike je prevelika ({{ height }}px). Največja dovoljena višina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Višina slike je premajhna ({{ height }}px). Najmanjša predvidena višina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ta vrednost bi morala biti trenutno uporabnikovo geslo.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ta vrednost bi morala imeti točno {{ limit }} znak.|Ta vrednost bi morala imeti točno {{ limit }} znaka.|Ta vrednost bi morala imeti točno {{ limit }} znake.|Ta vrednost bi morala imeti točno {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je bila le delno naložena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nobena datoteka ni bila naložena.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>V php.ini ni bila nastavljena začasna mapa, ali pa nastavljena mapa ne obstaja.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Začasne datoteke ni bilo mogoče zapisati na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP razširitev je vzrok, da nalaganje ni uspelo.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ta zbirka bi morala vsebovati {{ limit }} element ali več.|Ta zbirka bi morala vsebovati {{ limit }} elementa ali več.|Ta zbirka bi morala vsebovati {{ limit }} elemente ali več.|Ta zbirka bi morala vsebovati {{ limit }} elementov ali več.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ta zbirka bi morala vsebovati {{ limit }} element ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elementa ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elemente ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elementov ali manj.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ta zbirka bi morala vsebovati točno {{ limit }} element.|Ta zbirka bi morala vsebovati točno {{ limit }} elementa.|Ta zbirka bi morala vsebovati točno {{ limit }} elemente.|Ta zbirka bi morala vsebovati točno {{ limit }} elementov.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neveljavna številka kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodprti tip kartice ali neveljavna številka kartice.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ta vrednost ni veljavna mednarodna številka bančnega računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Neveljavna vrednost po ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Neveljavna vrednost po ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Neveljavna vrednost po ISBN-10 ali po ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Neveljavna vrednost ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ta vrednost ni veljavna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti večja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti večja ali enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti identična {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti manjša od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti manjša ali enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ta vrednost ne bi smela biti enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta vrednost ne bi smela biti identična {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Razmerje slike je preveliko ({{ ratio }}). Največje dovoljeno razmerje je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Razmerje slike je premajhno ({{ ratio }}). Najmanjše pričakovano razmerje je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Slika je kvadrat ({{ width }}x{{ height }}px). Kvadratne slike niso dovoljene.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Slika je ležeče usmerjena ({{ width }}x{{ height }}px). Ležeče usmerjene slike niso dovoljene.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Slika je pokončno usmerjena ({{ width }}x{{ height }}px). Pokončno usmerjene slike niso dovoljene.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Prazna datoteka ni dovoljena.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Gostitelja ni bilo mogoče prepoznati.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ta vrednost se ne ujema s pričakovanim naborom znakov {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ta vrednost ni veljavna poslovna identifikacijska koda (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Napaka</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ta vrednost ni veljaven UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti večkratnik od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ta poslovna identifikacijska koda (BIC) ni povezana z IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ta vrednost bi morala biti veljaven JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ta zbirka bi morala vsebovati samo edinstvene elemente.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ta vrednost bi morala biti pozitivna.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ta vrednost bi morala biti pozitivna ali enaka nič.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ta vrednost bi morala biti negativna.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ta vrednost bi morala biti negativna ali enaka nič.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ta vrednost ni veljaven časovni pas.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>To geslo je ušlo pri kršitvi varnosti podatkov in ga ne smete uporabljati. Prosimo, uporabite drugo geslo.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ta vrednost bi morala biti med {{ min }} in {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ta vrednost ni veljavno ime gostitelja.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Število elementov v tej zbirki bi moralo biti mnogokratnik {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ta vrednost bi morala zadostiti vsaj eni izmed sledečih omejitev:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Vsak element te zbirke bi moral zadostiti svojemu lastnemu naboru omejitev.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ta vrednost ni veljavna mednarodna identifikacijska koda vrednostnih papirjev (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ta vrednost bi morala biti veljaven izraz.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ta vrednost ni veljavna barva CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ta vrednost ni veljaven zapis CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Vrednost omrežne maske mora biti med {{ min }} in {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Ime datoteke je predolgo. Imeti mora {{ filename_max_length }} znak ali manj.|Ime datoteke je predolgo. Imeti mora {{ filename_max_length }} znaka ali manj.|Ime datoteke je predolgo. Imeti mora {{ filename_max_length }} znake ali manj.|Ime datoteke je predolgo. Imeti mora {{ filename_max_length }} znakov ali manj.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Moč gesla je prenizka. Uporabite močnejše geslo.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ta vrednost vsebuje znake, ki jih trenutna raven omejitve ne dovoljuje.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Uporaba nevidnih znakov ni dovoljena.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Mešanje številk iz različnih skript ni dovoljeno.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Uporaba skritih prekrivnih znakov ni dovoljena.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Končnica datoteke ni veljavna ({{ extension }}). Dovoljene so naslednje končnice: {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Zaznano kodiranje znakov ni veljavno ({{ detected }}). Dovoljene so naslednje vrste kodiranja {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ta vrednost ni veljaven MAC naslov.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>URL-ju manjka vrhnja domena.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ta vrednost je prekratka. Vsebovati mora vsaj eno besedo.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besedi.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besede.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besed.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ta vrednost je predolga. Vsebovati mora največ eno besedo.|Ta vrednost je predolga. Vsebovati mora največ {{ max }}.|Ta vrednost je predolga. Vsebovati mora največ {{ max }} besede.|Ta vrednost je predolga. Vsebovati mora največ {{ max }} besed.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ta vrednost ne predstavlja veljavnega tedna v ISO 8601 formatu.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ta vrednost ni veljaven teden.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ta vrednost ne sme biti pred tednom "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ta vrednost ne sme biti po tednu "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Ta vrednost ni veljavna predloga Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Ta datoteka ni veljaven video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Velikosti videoposnetka ni bilo mogoče zaznati.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Širina videoposnetka je prevelika ({{ width }}px). Dovoljena največja širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Širina videa je premajhna ({{ width }}px). Pričakovana minimalna širina je {{ min_width }} px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Višina videa je prevelika ({{ height }}px). Dovoljena največja višina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Višina videa je premajhna ({{ height }}px). Pričakovana najmanjša višina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima premalo slikovnih pik ({{ pixels }}). Pričakovana minimalna količina je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Video ima preveč slikovnih pik ({{ pixels }}). Pričakovano največje število je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Razmerje videa je preveliko ({{ ratio }}). Dovoljeno največje razmerje je {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Razmerje videa je premajhno ({{ ratio }}). Pričakovano minimalno razmerje je {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video je kvadratno ({{ width }}x{{ height }}px). Kvadratni videoposnetki niso dovoljeni.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je vodoravno orientiran ({{ width }}x{{ height }} px). Vodoravni videi niso dovoljeni.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video je usmerjeno pokonci ({{ width }}x{{ height }}px). Videi v pokončni usmeritvi niso dovoljeni.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Videodatoteka je poškodovana.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video vsebuje več tokov. Dovoljen je le en tok.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Nepodprti video kodek »{{ codec }}«.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Nepodprt videokontejner "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Slikovna datoteka je poškodovana.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima premalo slikovnih točk ({{ pixels }}). Pričakovana minimalna količina je {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Slika ima preveč slikovnih pik ({{ pixels }}). Pričakovano največje število je {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">To ime datoteke ne ustreza pričakovanemu naboru znakov.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="vi" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Giá trị này phải là sai.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Giá trị này phải là đúng.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Giá trị này phải là kiểu  {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Giá trị này phải rỗng.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Giá trị bạn vừa chọn không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Bạn phải chọn ít nhất {{ limit }} lựa chọn.|Bạn phải chọn ít nhất {{ limit }} lựa chọn.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Bạn phải chọn nhiều nhất {{ limit }} lựa chọn.|Bạn phải chọn nhiều  nhất {{ limit }} lựa chọn.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Một hoặc nhiều giá trị được chọn không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Lĩnh vực này không được dự kiến.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Lĩnh vực này bị thiếu.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Giá trị không phải là ngày hợp lệ.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Giá trị không phải là ngày tháng hợp lệ.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Giá trị này không phải là email hợp lệ.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Tập tin không tìm thấy.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Tập tin không thể đọc được.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tập tin quá lớn ({{ size }} {{ suffix }}). Kích thước tối đa cho phép {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Kiểu mime của tập tin không hợp lệ ({{ type }}). Kiểu hợp lệ là {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Giá trị phải bằng hoặc nhỏ hơn {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Giá trị quá dài. Phải bằng hoặc ít hơn {{ limit }} kí tự.|Giá trị quá dài. Phải bằng hoặc ít hơn {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Giá trị phải lớn hơn hoặc bằng {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Giá trị quá ngắn. Phải hơn hoặc bằng {{ limit }} kí tự.|Giá trị quá ngắn. Phải hơn hoặc bằng {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Giá trị không được phép để trống.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Giá trị không được phép rỗng.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Giá trị phải rỗng.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Giá trị không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Giá trị không phải là thời gian hợp lệ.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Giá trị không phải là địa chỉ URL hợp lệ.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Hai giá trị phải bằng nhau.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tập tin quá lớn. Kích thước tối đa cho phép là {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Tập tin quá lớn.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Tập tin không thể tải lên.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Giá trị phải là con số.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tập tin không phải là hình ảnh hợp lệ.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Giá trị này không phải là địa chỉ IP hợp lệ.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Giá trị không phải là ngôn ngữ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Giá trị không phải là một bản địa địa phương hợp lệ.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Giá trị không phải là quốc gia hợp lệ.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Giá trị đã được sử dụng.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Kích thước của hình ảnh không thể xác định.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Chiều rộng của hình quá lớn ({{ width }}px). Chiều rộng tối đa phải là {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Chiều rộng của hình quá thấp ({{ width }}px). Chiều rộng tối thiểu phải là {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Chiều cao của hình quá cao ({{ height }}px). Chiều cao tối đa phải là {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Chiều cao của hình quá thấp ({{ height }}px). Chiều cao tối thiểu phải là {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Giá trị này phải là mật khẩu hiện tại của người dùng.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Giá trị này phải có chính xác {{ limit }} kí tự.|Giá trị này phải có chính xác {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Tập tin chỉ được tải lên một phần.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tập tin không được tải lên.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">Không có thư mục tạm được cấu hình trong php.ini, hoặc thư mục đã cấu hình không tồn tại.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Không thể ghi tập tin tạm ra đĩa.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Một PHP extension đã phá hỏng quá trình tải lên của tập tin.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Danh sách phải chứa {{ limit }} thành phần hoặc nhiều hơn.|Danh sách phải chứa {{ limit }} thành phần hoặc nhiều hơn.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Danh sách phải chứa {{ limit }} thành phần hoặc ít hơn.|Danh sách phải chứa {{ limit }} thành phần hoặc ít hơn.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Danh sách phải chứa chính xác {{ limit }} thành phần.|Danh sách phải chứa chính xác {{ limit }} thành phần.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Số thẻ không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Thẻ không được hỗ trợ hoặc số thẻ không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Giá trị này không phải là Số Tài Khoản Ngân Hàng Quốc Tế (IBAN) hợp lệ.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Giá trị không phải là ISBN-10 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Giá trị không phải là ISBN-13 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Giá trị không phải là ISBN-10 hoặc ISBN-13 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Giá trị không phải là ISSN hợp lệ.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Giá trị không phải là đơn vị tiền tệ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Giá trị phải bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Giá trị phải lớn hơn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Giá trị phải lớn hơn hoặc bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Giá trị phải giống  {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Giá trị phải bé hơn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Giá trị phải nhỏ hơn hoặc bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Giá trị không được phép bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Giá trị không được phép giống như {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Tỷ lệ bức ảnh quá lớn ({{ ratio }}). Tỷ lệ tối đa cho phép là {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Tỷ lệ bức ảnh quá nhỏ ({{ ratio }}). Tỷ lệ tối thiểu mong muốn là {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Bức ảnh là hình vuông ({{ width }}x{{ height }}px). Ảnh hình vuông không được phép.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Bức ảnh theo chiều ngang ({{ width }}x{{ height }}px). Ảnh chiều ngang không được phép.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Bức ảnh theo chiều dọc ({{ width }}x{{ height }}px). Ảnh chiều dọc không được phép.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Một file rỗng không được phép.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Máy chủ không thể được tìm thấy.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Giá trị này không đúng định dạng bộ ký tự mong muốn {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Giá trị này không phải là Mã Định Danh Doanh Nghiệp (BIC) hợp lệ.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Lỗi</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Giá trị này không phải là UUID hợp lệ.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Giá trị này nên là bội số của {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Mã định danh doanh nghiệp (BIC) này không liên kết với IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Giá trị này nên đúng định dạng JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Danh sách này chỉ nên chứa các phần tử khác nhau.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Giá trị này có thể thực hiện được.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Giá trị này có thể thực hiện được hoặc bằng không.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Giá trị này nên bị từ chối.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Giá trị này nên bị từ chối hoặc bằng không.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Giá trị này không phải là múi giờ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Mật khẩu này đã bị rò rỉ dữ liệu, không được sử dụng nữa. Xin vui lòng sử dụng mật khẩu khác.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Giá trị này nên thuộc giữa {{ min }} và {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Giá trị này không phải là tên máy chủ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Số lượng các phần tử trong bộ sưu tập này nên là bội số của {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Giá trị này nên thỏa mãn ít nhất một trong những ràng buộc sau:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Mỗi phần tử trong bộ sưu tập này nên thỏa mãn những ràng buộc của nó.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Giá trị này không phải là mã số chứng khoán quốc tế (ISIN) hợp lệ.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Giá trị này phải là một biểu thức hợp lệ.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Giá trị này không phải là màu CSS hợp lệ.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Giá trị này không phải là ký hiệu CIDR hợp lệ.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Giá trị của mặt nạ mạng phải nằm trong khoảng từ {{ min }} đến {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Tên tệp quá dài. Phải bằng {{ filename_max_length }} ký tự hoặc ít hơn.|Tên tệp quá dài. Phải bằng {{ filename_max_length }} ký tự hoặc ít hơn.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Sức mạnh mật khẩu quá thấp. Vui lòng sử dụng mật khẩu mạnh hơn.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Giá trị này chứa các ký tự không được phép bởi mức độ hạn chế hiện tại.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Sử dụng ký tự vô hình không được phép.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Không được phép trộn các số từ các tập lệnh khác nhau.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Sử dụng các ký tự lớp phủ ẩn không được phép.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Phần mở rộng của tệp không hợp lệ ({{ extension }}). Phần mở rộng cho phép là {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target state="needs-review-translation">Mã hóa ký tự được phát hiện là không hợp lệ ({{ detected }}). Các mã hóa được phép là {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Giá trị này không phải là địa chỉ MAC hợp lệ.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">URL này thiếu miền cấp cao.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Giá trị này quá ngắn. Nó phải chứa ít nhất một từ.|Giá trị này quá ngắn. Nó phải chứa ít nhất {{ min }} từ.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Giá trị này quá dài. Nó chỉ nên chứa một từ.|Giá trị này quá dài. Nó chỉ nên chứa {{ max }} từ hoặc ít hơn.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Giá trị này không đại diện cho một tuần hợp lệ theo định dạng ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Giá trị này không phải là một tuần hợp lệ.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Giá trị này không nên trước tuần "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Giá trị này không nên sau tuần "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Giá trị này không phải là một mẫu Twig hợp lệ.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Tệp này không phải là video hợp lệ.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Không thể phát hiện kích thước của video.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Chiều rộng video quá lớn ({{ width }}px). Chiều rộng tối đa cho phép là {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Chiều rộng video quá nhỏ ({{ width }}px). Chiều rộng tối thiểu mong đợi là {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Chiều cao video quá lớn ({{ height }}px). Chiều cao tối đa cho phép là {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Chiều cao video quá nhỏ ({{ height }}px). Chiều cao tối thiểu dự kiến là {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Video có quá ít điểm ảnh ({{ pixels }}). Lượng tối thiểu mong đợi là {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Video có quá nhiều điểm ảnh ({{ pixels }}). Số lượng tối đa dự kiến là {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Tỉ lệ video quá lớn ({{ ratio }}). Tỉ lệ tối đa được phép là {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Tỉ lệ video quá nhỏ ({{ ratio }}). Tỉ lệ tối thiểu dự kiến là {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video có dạng hình vuông ({{ width }}x{{ height }}px). Không cho phép video hình vuông.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video có hướng ngang ({{ width }}x{{ height }} px). Không cho phép video ngang.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video có hướng dọc ({{ width }}x{{ height }}px). Không cho phép video hướng dọc.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Tệp video bị hỏng.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video chứa nhiều luồng. Chỉ cho phép một luồng.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Bộ mã hóa video không được hỗ trợ "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Bộ chứa video không được hỗ trợ "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Tệp hình ảnh bị hỏng.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Hình ảnh có quá ít điểm ảnh ({{ pixels }}). Số lượng tối thiểu dự kiến là {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Hình ảnh có quá nhiều điểm ảnh ({{ pixels }}). Lượng tối đa dự kiến là {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Tên tệp này không khớp với bộ ký tự mong đợi.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="pl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ta wartość powinna być fałszem.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ta wartość powinna być prawdą.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ta wartość powinna być typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ta wartość powinna być pusta.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ta wartość powinna być jedną z podanych opcji.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Powinieneś wybrać co najmniej {{ limit }} opcję.|Powinieneś wybrać co najmniej {{ limit }} opcje.|Powinieneś wybrać co najmniej {{ limit }} opcji.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Powinieneś wybrać maksymalnie {{ limit }} opcję.|Powinieneś wybrać maksymalnie {{ limit }} opcje.|Powinieneś wybrać maksymalnie {{ limit }} opcji.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna lub więcej z podanych wartości jest nieprawidłowa.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Tego pola się nie spodziewano.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Tego pola brakuje.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ta wartość nie jest prawidłową datą.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ta wartość nie jest prawidłową datą i czasem.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ta wartość nie jest prawidłowym adresem email.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Plik nie mógł zostać odnaleziony.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Nie można odczytać pliku.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Plik jest za duży ({{ size }} {{ suffix }}). Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Nieprawidłowy typ mime pliku ({{ type }}). Dozwolone typy mime to {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ta wartość powinna wynosić {{ limit }} lub mniej.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.|Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.|Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ta wartość powinna wynosić {{ limit }} lub więcej.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.|Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.|Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ta wartość nie powinna być pusta.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ta wartość nie powinna być nullem.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ta wartość powinna być nullem.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ta wartość jest nieprawidłowa.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ta wartość nie jest prawidłowym czasem.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ta wartość nie jest prawidłowym adresem URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obie wartości powinny być równe.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Plik jest za duży. Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Plik jest za duży.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Plik nie mógł być wgrany.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ta wartość powinna być prawidłową liczbą.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ten plik nie jest obrazem.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Ta wartość nie jest prawidłowym adresem IP.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ta wartość nie jest prawidłowym językiem.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ta wartość nie jest prawidłową lokalizacją.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ta wartość nie jest prawidłową nazwą kraju.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ta wartość jest już wykorzystywana.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nie można wykryć rozmiaru obrazka.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Szerokość obrazka jest zbyt duża ({{ width }}px). Maksymalna dopuszczalna szerokość to {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Szerokość obrazka jest zbyt mała ({{ width }}px). Oczekiwana minimalna szerokość to {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Wysokość obrazka jest zbyt duża ({{ height }}px). Maksymalna dopuszczalna wysokość to {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Wysokość obrazka jest zbyt mała ({{ height }}px). Oczekiwana minimalna wysokość to {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Ta wartość powinna być aktualnym hasłem użytkownika.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ta wartość powinna mieć dokładnie {{ limit }} znak.|Ta wartość powinna mieć dokładnie {{ limit }} znaki.|Ta wartość powinna mieć dokładnie {{ limit }} znaków.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Plik został wgrany tylko częściowo.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Żaden plik nie został wgrany.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Nie skonfigurowano folderu tymczasowego w php.ini lub skonfigurowany folder nie istnieje.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nie można zapisać pliku tymczasowego na dysku.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozszerzenie PHP spowodowało błąd podczas wgrywania.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ten zbiór powinien zawierać {{ limit }} lub więcej elementów.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ten zbiór powinien zawierać {{ limit }} lub mniej elementów.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ten zbiór powinien zawierać dokładnie {{ limit }} element.|Ten zbiór powinien zawierać dokładnie {{ limit }} elementy.|Ten zbiór powinien zawierać dokładnie {{ limit }} elementów.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nieprawidłowy numer karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nieobsługiwany rodzaj karty lub nieprawidłowy numer karty.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Ta wartość nie jest prawidłowym Międzynarodowym Numerem Rachunku Bankowego (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ta wartość nie jest prawidłową walutą.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ta wartość powinna być większa niż {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być większa bądź równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta wartość powinna być identycznego typu {{ compared_value_type }} oraz wartości {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ta wartość powinna być mniejsza niż {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być mniejsza bądź równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ta wartość nie powinna być równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta wartość nie powinna być identycznego typu {{ compared_value_type }} oraz wartości {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Proporcje obrazu są zbyt duże ({{ ratio }}). Maksymalne proporcje to {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Proporcje obrazu są zbyt małe ({{ ratio }}). Minimalne proporcje to {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Obraz jest kwadratem ({{ width }}x{{ height }}px). Kwadratowe obrazy nie są akceptowane.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Obraz jest panoramiczny ({{ width }}x{{ height }}px). Panoramiczne zdjęcia nie są akceptowane.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Obraz jest portretowy ({{ width }}x{{ height }}px). Portretowe zdjęcia nie są akceptowane.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Plik nie może być pusty.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Nazwa hosta nie została rozpoznana.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Ta wartość nie pasuje do oczekiwanego zestawu znaków {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Ta wartość nie jest prawidłowym Kodem Identyfikującym Bank (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Błąd</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Ta wartość nie jest prawidłowym UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Ta wartość powinna być wielokrotnością {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ten kod BIC (Business Identifier Code) nie jest powiązany z międzynarodowym numerem rachunku bankowego (IBAN) {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Ta wartość powinna być prawidłowym formatem JSON.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Ten zbiór powinien zawierać tylko unikalne elementy.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Ta wartość powinna być dodatnia.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Ta wartość powinna być dodatnia lub równa zero.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Ta wartość powinna być ujemna.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Ta wartość powinna być ujemna lub równa zero.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Ta wartość nie jest prawidłową strefą czasową.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>To hasło wyciekło w wyniku naruszenia danych i nie może być użyte. Proszę użyć innego hasła.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Ta wartość powinna być pomiędzy {{ min }} a {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Ta wartość nie jest prawidłową nazwą hosta.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Liczba elementów w tym zbiorze powinna być wielokrotnością {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Ta wartość powinna spełniać co najmniej jedną z następujących reguł:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Każdy element w tym zbiorze powinien spełniać własny zestaw reguł.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Ta wartość nie jest prawidłowym Międzynarodowym Numerem Identyfikacyjnym Papierów Wartościowych (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Ta wartość powinna być prawidłowym wyrażeniem.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Ta wartość nie jest prawidłowym kolorem CSS.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Ta wartość nie jest prawidłową notacją CIDR.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Wartość maski podsieci powinna być pomiędzy {{ min }} i {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Nazwa pliku jest za długa. Powinna mieć {{ filename_max_length }} znak lub mniej.|Nazwa pliku jest za długa. Powinna mieć {{ filename_max_length }} znaki lub mniej.|Nazwa pliku jest za długa. Powinna mieć {{ filename_max_length }} znaków lub mniej.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Siła hasła jest zbyt niska. Użyj mocniejszego hasła.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Ta wartość zawiera znaki, które nie są dozwolone przez aktualny poziom ograniczeń.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Używanie niewidzialnych znaków jest niedozwolone.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Mieszanie liczb z różnych skryptów jest niedozwolone.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Używanie ukrytych znaków nakładki jest niedozwolone.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Rozszerzenie pliku jest nieprawidłowe ({{ extension }}). Dozwolone rozszerzenia to {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Wykryte kodowanie znaków ({{ detected }}) jest nieprawidłowe. Dozwolone kodowania to {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Ta wartość nie jest prawidłowym adresem MAC.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Ten URL nie zawiera domeny najwyższego poziomu.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Ta wartość jest zbyt krótka. Powinna zawierać co najmniej jedno słowo.|Ta wartość jest zbyt krótka. Powinna zawierać co najmniej {{ min }} słów.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Ta wartość jest zbyt długa. Powinna zawierać jedno słowo.|Ta wartość jest zbyt długa. Powinna zawierać {{ max }} słowa lub mniej.|Ta wartość jest zbyt długa. Powinna zawierać {{ max }} słów lub mniej.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Ta wartość nie jest poprawnym oznaczeniem tygodnia w formacie ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Ta wartość nie jest poprawnym oznaczeniem tygodnia.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Ta wartość nie powinna być przed tygodniem "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Ta wartość nie powinna być po tygodniu "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Ta wartość nie jest prawidłowym szablonem Twig.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Ten plik nie jest prawidłowym plikiem wideo.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>Nie można wykryć rozmiaru wideo.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Szerokość wideo jest zbyt duża ({{ width }}px). Maksymalna dopuszczalna szerokość to {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Szerokość wideo jest zbyt mała ({{ width }}px). Oczekiwana minimalna szerokość to {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Wysokość wideo jest zbyt duża ({{ height }}px). Maksymalna dopuszczalna wysokość to {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Wysokość wideo jest zbyt mała ({{ height }}px). Oczekiwana minimalna wysokość to {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Wideo ma zbyt mało ({{ pixels }} pikseli). Oczekiwana minimalna liczba to {{ min_pixels }} pikseli.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Wideo ma zbyt wiele ({{ pixels }} pikseli). Oczekiwana maksymalna liczba to {{ max_pixels }} pikseli.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Współczynnik proporcji wideo jest zbyt duży ({{ ratio }}). Maksymalny dopuszczalny współczynnik to {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Współczynnik proporcji wideo jest zbyt mały ({{ ratio }}). Oczekiwany minimalny współczynnik to {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>Wideo jest w formacie kwadratowym ({{ width }}x{{ height }}px). Filmy w tym formacie są niedozwolone.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>Wideo ma orientację poziomą ({{ width }}x{{ height }}px). Filmy w orientacji poziomej są niedozwolone.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>Wideo ma orientację pionową ({{ width }}x{{ height }}px). Filmy w orientacji pionowej są niedozwolone.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Plik wideo jest uszkodzony.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>Wideo zawiera wiele strumieni. Dozwolony jest tylko jeden strumień.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Nieobsługiwany kodek wideo "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Nieobsługiwany kontener wideo "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Plik obrazu jest uszkodzony.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>Obraz ma zbyt mało ({{ pixels }} pikseli). Oczekiwana minimalna liczba to {{ min_pixels }} pikseli.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>Obraz ma zbyt wiele ({{ pixels }} pikseli). Oczekiwana maksymalna liczba to {{ max_pixels }} pikseli.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Ta nazwa pliku nie odpowiada oczekiwanemu zestawowi znaków.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="fr" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Cette valeur doit être fausse.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Cette valeur doit être vraie.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Cette valeur doit être de type {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Cette valeur doit être vide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Cette valeur doit être l'un des choix proposés.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Vous devez sélectionner au moins {{ limit }} choix.|Vous devez sélectionner au moins {{ limit }} choix.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Vous devez sélectionner au maximum {{ limit }} choix.|Vous devez sélectionner au maximum {{ limit }} choix.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Une ou plusieurs des valeurs soumises sont invalides.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Ce champ n'a pas été prévu.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Ce champ est manquant.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Cette valeur n'est pas une date valide.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Cette valeur n'est pas une date valide.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Cette valeur n'est pas une adresse email valide.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Le fichier n'a pas été trouvé.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Le fichier n'est pas lisible.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Le fichier est trop volumineux ({{ size }} {{ suffix }}). Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Le type du fichier est invalide ({{ type }}). Les types autorisés sont {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Cette valeur doit être inférieure ou égale à {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Cette chaîne est trop longue. Elle doit avoir au maximum {{ limit }} caractère.|Cette chaîne est trop longue. Elle doit avoir au maximum {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Cette valeur doit être supérieure ou égale à {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Cette chaîne est trop courte. Elle doit avoir au minimum {{ limit }} caractère.|Cette chaîne est trop courte. Elle doit avoir au minimum {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Cette valeur ne doit pas être vide.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Cette valeur ne doit pas être nulle.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Cette valeur doit être nulle.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Cette valeur n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Cette valeur n'est pas une heure valide.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Cette valeur n'est pas une URL valide.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Les deux valeurs doivent être identiques.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Le fichier est trop volumineux. Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Le fichier est trop volumineux.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Le téléchargement de ce fichier est impossible.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Cette valeur doit être un nombre.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ce fichier n'est pas une image valide.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Cette valeur n'est pas une adresse IP valide.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Cette langue n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ce paramètre régional n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ce pays n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Cette valeur est déjà utilisée.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>La taille de l'image n'a pas pu être détectée.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La largeur de l'image est trop grande ({{ width }}px). La largeur maximale autorisée est de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La largeur de l'image est trop petite ({{ width }}px). La largeur minimale attendue est de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>La hauteur de l'image est trop grande ({{ height }}px). La hauteur maximale autorisée est de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>La hauteur de l'image est trop petite ({{ height }}px). La hauteur minimale attendue est de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Cette valeur doit être le mot de passe actuel de l'utilisateur.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Cette chaîne doit avoir exactement {{ limit }} caractère.|Cette chaîne doit avoir exactement {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Le fichier a été partiellement transféré.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Aucun fichier n'a été transféré.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Aucun répertoire temporaire n'a été configuré dans le php.ini, ou le répertoire configuré n'existe pas.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Impossible d'écrire le fichier temporaire sur le disque.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Une extension PHP a empêché le transfert du fichier.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Cette collection doit contenir {{ limit }} élément ou plus.|Cette collection doit contenir {{ limit }} éléments ou plus.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Cette collection doit contenir {{ limit }} élément ou moins.|Cette collection doit contenir {{ limit }} éléments ou moins.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Cette collection doit contenir exactement {{ limit }} élément.|Cette collection doit contenir exactement {{ limit }} éléments.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numéro de carte invalide.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Type de carte non supporté ou numéro invalide.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Cette valeur n'est pas un Numéro de Compte Bancaire International (IBAN) valide.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Cette valeur n'est pas un code ISBN-10 valide.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Cette valeur n'est pas un code ISBN-13 valide.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Cette valeur n'est ni un code ISBN-10, ni un code ISBN-13 valide.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Cette valeur n'est pas un code ISSN valide.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Cette valeur n'est pas une devise valide.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Cette valeur doit être supérieure à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être supérieure ou égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Cette valeur doit être identique à {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Cette valeur doit être inférieure à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être inférieure ou égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Cette valeur ne doit pas être égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Cette valeur ne doit pas être identique à {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Le rapport largeur/hauteur de l'image est trop grand ({{ ratio }}). Le rapport maximal autorisé est {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Le rapport largeur/hauteur de l'image est trop petit ({{ ratio }}). Le rapport minimal attendu est {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>L'image est carrée ({{ width }}x{{ height }}px). Les images carrées ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>L'image est au format paysage ({{ width }}x{{ height }}px). Les images au format paysage ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>L'image est au format portrait ({{ width }}x{{ height }}px). Les images au format portrait ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Un fichier vide n'est pas autorisé.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Le nom de domaine n'a pas pu être résolu.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Cette valeur ne correspond pas au jeu de caractères {{ charset }} attendu.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Cette valeur n'est pas un Code Identifiant de Business (BIC) valide.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Erreur</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Cette valeur n'est pas un UUID valide.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Cette valeur doit être un multiple de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Ce code d'identification d'entreprise (BIC) n'est pas associé à l'IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Cette valeur doit être un JSON valide.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Cette collection ne doit pas comporter de doublons.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Cette valeur doit être strictement positive.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Cette valeur doit être supérieure ou égale à zéro.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Cette valeur doit être strictement négative.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Cette valeur doit être inférieure ou égale à zéro.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Cette valeur n'est pas un fuseau horaire valide.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Ce mot de passe a été divulgué lors d'une fuite de données, il ne doit plus être utilisé. Veuillez utiliser un autre mot de passe.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Cette valeur doit être comprise entre {{ min }} et {{ max }}.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Cette valeur n'est pas un nom d'hôte valide.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Le nombre d'éléments de cette collection doit être un multiple de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Cette valeur doit satisfaire à au moins une des contraintes suivantes :</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Chaque élément de cette collection doit satisfaire à son propre jeu de contraintes.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Cette valeur n'est pas un code international de sécurité valide (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Cette valeur doit être une expression valide.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Cette valeur n'est pas une couleur CSS valide.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Cette valeur n'est pas une notation CIDR valide.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>La valeur du masque de réseau doit être comprise entre {{ min }} et {{ max }}.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Le nom du fichier est trop long. Il doit contenir au maximum {{ filename_max_length }} caractère.|Le nom de fichier est trop long. Il doit contenir au maximum {{ filename_max_length }} caractères.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>La force du mot de passe est trop faible. Veuillez utiliser un mot de passe plus fort.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Cette valeur contient des caractères qui ne sont pas autorisés par le niveau de restriction actuel.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Utiliser des caractères invisibles n'est pas autorisé.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Mélanger des chiffres provenant de différents scripts n'est pas autorisé.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Utiliser des caractères de superposition cachés n'est pas autorisé.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>L'extension du fichier est invalide ({{ extension }}). Les extensions autorisées sont {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>L'encodage de caractères détecté est invalide ({{ detected }}). Les encodages autorisés sont {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Cette valeur n'est pas une adresse MAC valide.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Cette URL doit contenir un domaine de premier niveau.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Cette valeur est trop courte. Elle doit contenir au moins un mot.|Cette valeur est trop courte. Elle doit contenir au moins {{ min }} mots.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Cette valeur est trop longue. Elle doit contenir au maximum un mot.|Cette valeur est trop longue. Elle doit contenir au maximum {{ max }} mots.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Cette valeur ne représente pas une semaine valide au format ISO 8601.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Cette valeur n'est pas une semaine valide.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Cette valeur ne doit pas être antérieure à la semaine "{{ min }}".</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Cette valeur ne doit pas être postérieure à la semaine "{{ max }}".</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Cette valeur n'est pas un modèle Twig valide.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Ce fichier n’est pas une vidéo valide.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>La taille de la vidéo n’a pas pu être détectée.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La largeur de la vidéo est trop grande ({{ width }}px). La largeur maximale autorisée est de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La largeur de la vidéo est trop petite ({{ width }}px). La largeur minimale attendue est de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>La hauteur de la vidéo est trop grande ({{ height }}px). La hauteur maximale autorisée est de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>La hauteur de la vidéo est trop petite ({{ height }}px). La hauteur minimale attendue est de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>La vidéo a trop peu de pixels ({{ pixels }}). La quantité minimale attendue est de {{ min_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>La vidéo contient trop de pixels ({{ pixels }}). La quantité maximale attendue est de {{ max_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Le ratio de la vidéo est trop élevé ({{ ratio }}). Le ratio maximal autorisé est de {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Le ratio de la vidéo est trop petit ({{ ratio }}). Le ratio minimum attendu est de {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>La vidéo est carrée ({{ width }}x{{ height }}px). Les vidéos carrées ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>La vidéo est au format paysage ({{ width }}x{{ height }} px). Les vidéos au format paysage ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>La vidéo est orientée en portrait ({{ width }}x{{ height }} px). Les vidéos en orientation portrait ne sont pas autorisées.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Le fichier vidéo est corrompu.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>La vidéo contient plusieurs flux. Un seul flux est autorisé.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Le codec vidéo «{{ codec }}» est non pris en charge.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Le conteneur vidéo «{{ container }}» est non pris en charge.</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Le fichier image est corrompu.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>L’image comporte trop peu de pixels ({{ pixels }}). La quantité minimale attendue est de {{ min_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>L’image contient trop de pixels ({{ pixels }}). La quantité maximale attendue est de {{ max_pixels }} pixels.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Le nom de fichier ne correspond pas au jeu de caractères attendu.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="nl" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Deze waarde moet onwaar zijn.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Deze waarde moet waar zijn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Deze waarde moet van het type {{ type }} zijn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Deze waarde moet leeg zijn.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>De geselecteerde waarde is geen geldige optie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Selecteer ten minste {{ limit }} optie.|Selecteer ten minste {{ limit }} opties.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Selecteer maximaal {{ limit }} optie.|Selecteer maximaal {{ limit }} opties.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Eén of meer van de ingegeven waarden zijn ongeldig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Dit veld werd niet verwacht.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Dit veld ontbreekt.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Deze waarde is geen geldige datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Deze waarde is geen geldige datum en tijd.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Deze waarde is geen geldig e-mailadres.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Het bestand kon niet gevonden worden.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Het bestand is niet leesbaar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Het bestand is te groot ({{ size }} {{ suffix }}). De maximale grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Het mediatype van het bestand is ongeldig ({{ type }}). De toegestane mediatypes zijn {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Deze waarde moet {{ limit }} of minder zijn.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Deze waarde is te lang. Deze mag maximaal één teken bevatten.|Deze waarde is te lang. Deze mag maximaal {{ limit }} tekens bevatten.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Deze waarde moet {{ limit }} of meer zijn.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Deze waarde is te kort. Deze moet ten minste één teken bevatten.|Deze waarde is te kort. Deze moet ten minste {{ limit }} tekens bevatten.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Deze waarde mag niet leeg zijn.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Deze waarde mag niet null zijn.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Deze waarde moet null zijn.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Deze waarde is niet geldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Deze waarde is geen geldige tijd.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Deze waarde is geen geldige URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De twee waarden moeten gelijk zijn.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Het bestand is te groot. De maximale grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Het bestand is te groot.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Het bestand kon niet worden geüpload.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Deze waarde moet een geldig getal zijn.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Dit bestand is geen geldige afbeelding.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>Deze waarde is geen geldig IP-adres.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Deze waarde is geen geldige taal.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Deze waarde is geen geldige landinstelling.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Deze waarde is geen geldig land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Deze waarde wordt al gebruikt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>De grootte van de afbeelding kon niet bepaald worden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>De afbeelding is te breed ({{ width }}px). De maximale breedte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>De afbeelding is niet breed genoeg ({{ width }}px). De minimaal verwachte breedte is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>De afbeelding is te hoog ({{ height }}px). De maximale hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>De afbeelding is niet hoog genoeg ({{ height }}px). De minimaal verwachte hoogte is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Deze waarde moet het huidige wachtwoord van de gebruiker zijn.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Deze waarde moet exact één teken lang zijn.|Deze waarde moet exact {{ limit }} tekens lang zijn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Het bestand is slechts gedeeltelijk geüpload.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Er is geen bestand geüpload.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>Er is geen tijdelijke map geconfigureerd in php.ini, of de gespecificeerde map bestaat niet.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan het tijdelijke bestand niet wegschrijven op de schijf.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>De upload is mislukt vanwege een PHP-extensie.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Deze collectie moet één of meer elementen bevatten.|Deze collectie moet {{ limit }} of meer elementen bevatten.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Deze collectie moet één of minder elementen bevatten.|Deze collectie moet {{ limit }} of minder elementen bevatten.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Deze collectie moet exact één element bevatten.|Deze collectie moet exact {{ limit }} elementen bevatten.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongeldig creditcardnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Niet-ondersteund type creditcard of ongeldig nummer.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>Deze waarde is geen geldig internationaal bankrekeningnummer (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Deze waarde is geen geldige ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Deze waarde is geen geldige ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Deze waarde is geen geldige ISBN-10 of ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Deze waarde is geen geldige ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Deze waarde is geen geldige valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Deze waarde moet gelijk zijn aan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Deze waarde moet groter zijn dan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Deze waarde moet groter of gelijk aan {{ compared_value }} zijn.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Deze waarde moet identiek zijn aan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Deze waarde moet minder zijn dan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Deze waarde moet minder dan of gelijk aan {{ compared_value }} zijn.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Deze waarde mag niet gelijk zijn aan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Deze waarde mag niet identiek zijn aan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>De afbeeldingsverhouding is te groot ({{ ratio }}). De maximale verhouding is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>De afbeeldingsverhouding is te klein ({{ ratio }}). De minimale verhouding is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>De afbeelding is vierkant ({{ width }}x{{ height }}px). Vierkante afbeeldingen zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>De afbeelding is liggend ({{ width }}x{{ height }}px). Liggende afbeeldingen zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>De afbeelding is staand ({{ width }}x{{ height }}px). Staande afbeeldingen zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Lege bestanden zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>De hostnaam kon niet worden gevonden.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Deze waarde is niet in de verwachte tekencodering {{ charset }}.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>Deze waarde is geen geldige bankidentificatiecode (BIC).</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Fout</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>Deze waarde is geen geldige UUID.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Deze waarde moet een meervoud van {{ compared_value }} zijn.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Deze bankidentificatiecode (BIC) is niet gekoppeld aan IBAN {{ iban }}.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Deze waarde moet geldige JSON zijn.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Deze collectie mag alleen unieke elementen bevatten.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Deze waarde moet positief zijn.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Deze waarde moet positief of gelijk aan nul zijn.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Deze waarde moet negatief zijn.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Deze waarde moet negatief of gelijk aan nul zijn.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Deze waarde is geen geldige tijdzone.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Dit wachtwoord is gelekt bij een datalek en mag niet worden gebruikt. Kies een ander wachtwoord.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Deze waarde moet zich tussen {{ min }} en {{ max }} bevinden.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Deze waarde is geen geldige hostnaam.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Het aantal elementen van deze collectie moet een veelvoud zijn van {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Deze waarde moet voldoen aan tenminste een van de volgende voorwaarden:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Elk element van deze collectie moet voldoen aan zijn eigen set voorwaarden.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Deze waarde is geen geldig International Securities Identification Number (ISIN).</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Deze waarde moet een geldige expressie zijn.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Deze waarde is geen geldige CSS kleur.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Deze waarde is geen geldige CIDR-notatie.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>De waarde van het netmasker moet tussen {{ min }} en {{ max }} liggen.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>De bestandsnaam is te lang. Het moet {{ filename_max_length }} of minder karakters zijn.|De bestandsnaam is te lang. Het moet {{ filename_max_length }} of minder karakters zijn.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Het wachtwoord is niet sterk genoeg. Probeer een sterker wachtwoord.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Deze waarde bevat tekens die niet zijn toegestaan volgens het huidige beperkingsniveau.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Het gebruik van onzichtbare tekens is niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Het mengen van cijfers uit verschillende schriften is niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Het gebruik van verborgen overlay-tekens is niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>De bestandsextensie is ongeldig ({{ extension }}). De toegestane extensies zijn {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>De gedetecteerde karaktercodering is ongeldig ({{ detected }}). De toegestane coderingen zijn {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>Deze waarde is geen geldig MAC-adres.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>Deze URL mist een top-level domein.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>Deze waarde is te kort. Het moet ten minste één woord bevatten.|Deze waarde is te kort. Het moet ten minste {{ min }} woorden bevatten.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>Deze waarde is te lang. Het moet één woord zijn.|Deze waarde is te lang. Het mag maximaal {{ max }} woorden bevatten.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>Deze waarde vertegenwoordigt geen geldige week in het ISO 8601-formaat.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>Deze waarde is geen geldige week.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>Deze waarde mag niet vóór week "{{ min }}" liggen.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>Deze waarde mag niet na week "{{ max }}" liggen.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target>Deze waarde is geen geldige Twig-template.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target>Dit bestand is geen geldige video.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target>De grootte van de video kon niet worden gedetecteerd.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>De videobreedte is te groot ({{ width }}px). Toegestane maximale breedte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>De videobreedte is te klein ({{ width }}px). Verwachte minimum breedte is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>De videohoogte is te groot ({{ height }}px). Toegestane maximale hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>De videohoogte is te klein ({{ height }}px). Verwachte minimale hoogte is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>De video heeft te weinig pixels ({{ pixels }}). Verwachte minimumaantal is {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>De video heeft te veel pixels ({{ pixels }}). Het verwachte maximum is {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>De videoratio is te groot ({{ ratio }}). Toegestane maximale ratio is {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>De videoratio is te klein ({{ ratio }}). Verwachte minimumverhouding is {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target>De video is vierkant ({{ width }}x{{ height }}px). Vierkante video's zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target>De video is in liggende oriëntatie ({{ width }}x{{ height }} px). Liggende video's zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target>De video is in portretstand ({{ width }}x{{ height }}px). Video's in portretstand zijn niet toegestaan.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target>Het videobestand is beschadigd.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target>De video bevat meerdere streams. Slechts één stream is toegestaan.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target>Niet-ondersteunde videocodec ‘{{ codec }}’.</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target>Niet-ondersteunde videocontainer "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target>Het afbeeldingsbestand is beschadigd.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target>De afbeelding heeft te weinig pixels ({{ pixels }}). Verwachte minimumhoeveelheid is {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target>De afbeelding heeft te veel pixels ({{ pixels }}). Het verwachte maximum is {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target>Deze bestandsnaam komt niet overeen met de verwachte tekencodering.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="zh-CN" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>该值应为 false 。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>该值应为 true 。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>该值的类型应为 {{ type }} 。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>该值应为空。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>该值不是有效的选项。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>您至少要选择 {{ limit }} 个选项。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>您最多能选择 {{ limit }} 个选项。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>一个或者多个给定的值无效。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>该字段是多余的。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>该字段缺失。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>该值不是一个有效的日期（date）。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>该值不是一个有效的日期时间（datetime）。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>该值不是一个有效的邮件地址。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>文件未找到。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>文件不可读。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>文件太大 ({{ size }} {{ suffix }})，文件大小不应超过 {{ limit }} {{ suffix }} 。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>无效的文件类型 ({{ type }}) ，允许的文件类型有 {{ types }} 。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>该值应小于或等于 {{ limit }} 。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>该值太长，长度不应超过 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>该值应大于或等于 {{ limit }} 。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>该值太短，长度不应少于 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>该值不应为空。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>该值不应为 null 。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>该值应为 null 。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>该值无效。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>该值不是一个有效的时间。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>该值不是一个有效的 URL 。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>该两个变量值应相等。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>文件太大，文件大小不可以超过 {{ limit }} {{ suffix }} 。</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>文件太大。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>无法上传此文件。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>该值应为有效的数字。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>该文件不是有效的图片。</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target>该值不是有效的 IP 地址。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>该值不是有效的语言名称（language）。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>该值不是有效的区域名称（locale）。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>该值不是有效的国家名称（country）。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>该值已经被使用。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>不能解析图片大小。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>图片太宽 ({{ width }}px)，最大宽度为 {{ max_width }}px 。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>图片宽度不够 ({{ width }}px)，最小宽度为 {{ min_width }}px 。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>图片太高 ({{ height }}px)，最大高度为 {{ max_height }}px 。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>图片高度不够 ({{ height }}px)，最小高度为 {{ min_height }}px 。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>该值应为用户当前的密码。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>该值应为 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>文件的上传不完整。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>没有上传任何文件。</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target>php.ini 中未配置临时文件夹，或配置的文件夹不存在。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>临时文件写入磁盘失败。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>某个 PHP 扩展造成上传失败。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>该集合不应少于 {{ limit }} 个元素。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>该集合不应超过 {{ limit }} 个元素。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>该集合应为 {{ limit }} 个元素。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>无效的信用卡号。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>不支持的信用卡类型或无效的信用卡号。</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target>该值不是有效的国际银行账号（IBAN）。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>该值不是有效的 10 位国际标准书号（ISBN-10）。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>该值不是有效的 13 位国际标准书号（ISBN-13）。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>该值不是有效的国际标准书号（ISBN-10 或 ISBN-13）。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>该值不是有效的国际标准期刊号（ISSN）。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>该值不是有效的货币名称（currency）。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>该值应等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>该值应大于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>该值应大于或等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>该值应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>该值应小于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>该值应小于或等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>该值不应等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>该值不应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>图片宽高比太大 ({{ ratio }})。允许的最大宽高比为 {{ max_ratio }} 。</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>图片宽高比太小 ({{ ratio }})。允许的最大宽高比为 {{ min_ratio }} 。</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>图片是方形的 ({{ width }}x{{ height }}px)。不允许使用方形的图片。</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>图片是横向的 ({{ width }}x{{ height }}px)。不允许使用横向的图片。</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>图片是纵向的 ({{ width }}x{{ height }}px)。不允许使用纵向的图片。</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>不允许使用空文件。</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>主机名无法解析。</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>该值不符合 {{ charset }} 编码。</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target>该值不是有效的银行识别代码（BIC）。</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>错误</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target>该值不是有效的 UUID 。</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>该值应为 {{ compared_value }} 的倍数。</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>该业务标识符代码（BIC）与 IBAN {{ iban }} 无关。</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>该值应为有效的 JSON 。</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>该集合不能包含重复项。</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>该值应为正数。</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>该值应为正数或零。</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>该值应为负数。</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>该值应为负数或零。</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>该值不是有效的时区。</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>此密码已被泄露，切勿使用。请更换密码。</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>该值应在 {{ min }} 和 {{ max }} 之间。</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>该值不是有效的主机名称。</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>该集合的元素数量应为 {{ compared_value }} 的倍数。</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>该值应符合以下其中一个约束：</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>该集合的每个元素应符合元素本身规定的约束。</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>该值不是有效的国际证券识别码（ISIN）。</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>该值应为一个有效的表达式。</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>该值不是有效的 CSS 颜色。</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>该值不是一个有效的 CIDR 表示。</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>网络掩码的值应当在 {{ min }} 和 {{ max }} 之间。</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>文件名过长，最长不应超过{{ filename_max_length }} 个字符。</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>密码强度太低。请使用更复杂的密码。</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>该值包含了当前限制级别不允许的字符。</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>不允许使用隐藏字符。</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>不可混合使用不同语系的数字。</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>不允许使用隐藏的覆盖字符。</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>文件的扩展名无效 ({{ extension }})。允许的扩展名为 {{ extensions }} 。</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>检测到的字符编码无效 ({{ detected }})。允许的编码为 {{ encodings }} 。</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target>该值不是有效的 MAC 地址。</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target>该 URL 缺少顶级域名。</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target>该值太短，应至少包含一个词。|该值太短，应至少包含 {{ min }} 个词。</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target>该值太长，应只包含一个词。|该值太长，应只包含 {{ max }} 个或更少个词。</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target>该值不代表 ISO 8601 格式中的有效周。</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target>该值不是一个有效周。</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target>该值不应位于 "{{ min }}" 周之前。</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target>该值不应位于 "{{ max }}"周之后。</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">该值不是有效的 Twig 模板。</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">此文件不是有效的视频。</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">无法检测到视频的大小。</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">视频宽度过大（{{ width }}px）。允许的最大宽度为 {{ max_width }}px。</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">视频宽度太小（{{ width }}px）。预期的最小宽度为 {{ min_width }} 像素。</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">视频高度过大（{{ height }}px）。允许的最大高度为 {{ max_height }}px。</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">视频高度太小（{{ height }}px）。期望的最小高度为 {{ min_height }}px。</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">该视频像素过少 ({{ pixels }}). 期望的最小值为 {{ min_pixels }}。</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">该视频的像素过多（{{ pixels }}）。预期的最大数量为 {{ max_pixels }}。</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">视频纵横比过大（{{ ratio }}）。允许的最大纵横比为 {{ max_ratio }}。</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">视频纵横比过小（{{ ratio }}）。预期的最低比例为 {{ min_ratio }}。</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">视频为正方形 ({{ width }}x{{ height }}px)。不允许正方形视频。</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">视频为横向（{{ width }}x{{ height }} 像素）。不允许横向视频。</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">该视频为竖屏方向（{{ width }}x{{ height }}px）。不允许竖屏视频。</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">视频文件已损坏。</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">该视频包含多个流。只允许一个流。</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">不支持的视频编解码器“{{ codec }}”。</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">不支持的视频容器 "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">图像文件已损坏。</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">图像的像素太少（{{ pixels }}）。预期的最小数量为 {{ min_pixels }}。</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">图像的像素过多 ({{ pixels }}). 预期的最大数量为 {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">该文件名与预期的字符集不匹配。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" target-language="az" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Bu dəyər false olmalıdır.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Bu dəyər true olmalıdır.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Bu dəyərin tipi {{ type }} olmalıdır.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Bu dəyər boş olmalıdır.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Seçdiyiniz dəyər düzgün bir seçim değil.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Ən az {{ limit }} seçim qeyd edilməlidir.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Ən çox {{ limit }} seçim qeyd edilməlidir.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Təqdim edilən dəyərlərdən bir və ya bir neçəsi yanlışdır.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>This field was not expected.</source>
                <target>Bu sahə gözlənilmirdi.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>This field is missing.</source>
                <target>Bu sahə əksikdir.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Bu dəyər düzgün bir tarix deyil.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Bu dəyər düzgün bir tarixsaat deyil.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Bu dəyər düzgün bir e-poçt adresi deyil.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fayl tapılmadı.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fayl oxunabilən deyil.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fayl çox böyükdür ({{ size }} {{ suffix }}). İcazə verilən maksimum fayl ölçüsü {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Faylın mime tipi yanlışdr ({{ type }}). İcazə verilən mime tipləri {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Bu dəyər {{ limit }} və ya altında olmalıdır.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Bu dəyər çox uzundur. {{ limit }} və ya daha az simvol olmalıdır.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Bu dəyər {{ limit }} veya daha fazla olmalıdır.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Bu dəyər çox qısadır. {{ limit }} və ya daha çox simvol olmalıdır.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Bu dəyər boş olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Bu dəyər boş olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Bu dəyər boş olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Bu dəyər doğru deyil.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Bu dəyər doğru bir saat deyil.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Bu dəyər doğru bir URL değil.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>İki dəyər eyni olmalıdır.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fayl çox böyükdür. İcazə verilən ən böyük fayl ölçüsü {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fayl çox böyükdür.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Fayl yüklənəbilmir.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Bu dəyər rəqəm olmalıdır.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Bu fayl düzgün bir şəkil deyil.</target>
            </trans-unit>
            <trans-unit id="37" resname="This is not a valid IP address.">
                <source>This value is not a valid IP address.</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir IP ünvanı deyil.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Bu dəyər düzgün bir dil deyil.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Bu dəyər düzgün bir dil deyil.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Bu dəyər düzgün bir ölkə deyil.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Bu dəyər hal-hazırda istifadədədir.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Şəklin ölçüsü hesablana bilmir.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Şəklin genişliyi çox böyükdür ({{ width }}px). İcazə verilən ən böyük genişlik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Şəklin genişliyi çox kiçikdir ({{ width }}px). Ən az {{ min_width }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Şəklin yüksəkliyi çox böyükdür ({{ height }}px). İcazə verilən ən böyük yüksəklik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Şəklin yüksəkliyi çox kiçikdir ({{ height }}px). Ən az {{ min_height }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user's current password.</source>
                <target>Bu dəyər istifadəçinin hazırkı parolu olmalıdır.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Bu dəyər tam olaraq {{ limit }} simvol olmaldır.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fayl qismən yükləndi.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Fayl yüklənmədi.</target>
            </trans-unit>
            <trans-unit id="51" resname="No temporary folder was configured in php.ini.">
                <source>No temporary folder was configured in php.ini, or the configured folder does not exist.</source>
                <target state="needs-review-translation">php.ini-də müvəqqəti qovluq quraşdırılmayıb, və ya quraşdırılmış qovluq mövcud deyil.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Müvəqqəti fayl diskə yazıla bilmir.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Bir PHP əlavəsi faylın yüklənməsinə mane oldu.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Bu kolleksiyada {{ limit }} və ya daha çox element olmalıdır.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Bu kolleksiyada {{ limit }} və ya daha az element olmalıdır.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Bu kolleksiyada tam olaraq {{ limit }} element olmalıdır.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Yanlış kart nömrəsi.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Dəstəklənməyən kart tipi və ya yanlış kart nömrəsi.</target>
            </trans-unit>
            <trans-unit id="59" resname="This is not a valid International Bank Account Number (IBAN).">
                <source>This value is not a valid International Bank Account Number (IBAN).</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir Beynəlxalq Bank Hesab Nömrəsi (IBAN) deyil.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Bu dəyər doğru bir ISBN-10 deyil.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Bu dəyər doğru bir ISBN-13 deyil.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Bu dəyər doğru bir ISBN-10 və ya ISBN-13 deyil.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Bu dəyər doğru bir ISSN deyil.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Bu dəyər doğru bir valyuta deyil.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value }} ilə bərabər olmalıdır.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value }} dəyərindən büyük olmalıdır.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value }} ilə bərabər və ya daha böyük olmaldır.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value_type }} {{ compared_value }} ilə eyni olmalıdır.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value }} dəyərindən kiçik olmalıdır.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value }} dəyərindən kiçik və ya bərabər olmalıdır.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Bu değer {{ compared_value }} ile eşit olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Bu dəyər {{ compared_value_type }} {{ compared_value }} ilə eyni olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="73">
                <source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target>Şəkil nisbəti çox büyükdür ({{ ratio }}). İcazə verilən maksimum nisbət: {{ max_ratio }}.</target>
            </trans-unit>
            <trans-unit id="74">
                <source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target>Şəkil nisbəti çox balacadır ({{ ratio }}). İcazə verilən minimum nisbət: {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="75">
                <source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
                <target>Şəkil kvadratdır ({{ width }}x{{ height }}px). Kvadrat şəkillərə icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="76">
                <source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
                <target>Şəkil albom rejimindədir ({{ width }}x{{ height }}px). Albom rejimli şəkillərə icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="77">
                <source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
                <target>Şəkil portret rejimindədir ({{ width }}x{{ height }}px). Portret rejimli şəkillərə icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="78">
                <source>An empty file is not allowed.</source>
                <target>Boş fayla icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="79">
                <source>The host could not be resolved.</source>
                <target>Ünvan tapılmadı.</target>
            </trans-unit>
            <trans-unit id="80">
                <source>This value does not match the expected {{ charset }} charset.</source>
                <target>Bu dəyər gözlənilən {{ charset }} simvol cədvəli ilə uyğun gəlmir.</target>
            </trans-unit>
            <trans-unit id="81" resname="This is not a valid Business Identifier Code (BIC).">
                <source>This value is not a valid Business Identifier Code (BIC).</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir Biznes Təyinat Kodu (BIC) deyil.</target>
            </trans-unit>
            <trans-unit id="82">
                <source>Error</source>
                <target>Xəta</target>
            </trans-unit>
            <trans-unit id="83" resname="This is not a valid UUID.">
                <source>This value is not a valid UUID.</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir UUID deyil.</target>
            </trans-unit>
            <trans-unit id="84">
                <source>This value should be a multiple of {{ compared_value }}.</source>
                <target>Bu dəyər {{ compare_value }} dəyərinin bölənlərindən biri olmalıdır.</target>
            </trans-unit>
            <trans-unit id="85">
                <source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
                <target>Bu Biznes Təyinedici Kodu (BIC) {{ iban }} IBAN kodu ilə əlaqəli deyil.</target>
            </trans-unit>
            <trans-unit id="86">
                <source>This value should be valid JSON.</source>
                <target>Bu dəyər doğru bir JSON olmalıdır.</target>
            </trans-unit>
            <trans-unit id="87">
                <source>This collection should contain only unique elements.</source>
                <target>Bu kolleksiyada sadəcə unikal elementlər olmalıdır.</target>
            </trans-unit>
            <trans-unit id="88">
                <source>This value should be positive.</source>
                <target>Bu dəyər müsbət olmalıdır.</target>
            </trans-unit>
            <trans-unit id="89">
                <source>This value should be either positive or zero.</source>
                <target>Bu dəyər müsbət və ya sıfır olmalıdır.</target>
            </trans-unit>
            <trans-unit id="90">
                <source>This value should be negative.</source>
                <target>Bu dəyər mənfi olmaldır.</target>
            </trans-unit>
            <trans-unit id="91">
                <source>This value should be either negative or zero.</source>
                <target>Bu dəyər mənfi və ya sıfır olmaldır.</target>
            </trans-unit>
            <trans-unit id="92">
                <source>This value is not a valid timezone.</source>
                <target>Bu dəyər doğru bir zaman zolağı deyil.</target>
            </trans-unit>
            <trans-unit id="93">
                <source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
                <target>Bu parol data oğurluğunda tapıldığı üçün işlədilməməlidir. Zəhmət olmasa, başqa parol seçin.</target>
            </trans-unit>
            <trans-unit id="94">
                <source>This value should be between {{ min }} and {{ max }}.</source>
                <target>Bu dəyər {{ min }} və {{ max }} arasında olmaldır.</target>
            </trans-unit>
            <trans-unit id="95">
                <source>This value is not a valid hostname.</source>
                <target>Bu dəyər doğru bir host adı deyil.</target>
            </trans-unit>
            <trans-unit id="96">
                <source>The number of elements in this collection should be a multiple of {{ compared_value }}.</source>
                <target>Bu kolleksiyadakı elementlerin sayı {{ compared_value }} tam bölünəni olmalıdır.</target>
            </trans-unit>
            <trans-unit id="97">
                <source>This value should satisfy at least one of the following constraints:</source>
                <target>Bu dəyər aşağıdakı məcburiyyətlərdən birini qarşılamalıdır:</target>
            </trans-unit>
            <trans-unit id="98">
                <source>Each element of this collection should satisfy its own set of constraints.</source>
                <target>Bu kolleksiyadakı hər element öz məcburiyyətlərini qarşılamalıdır.</target>
            </trans-unit>
            <trans-unit id="99">
                <source>This value is not a valid International Securities Identification Number (ISIN).</source>
                <target>Bu dəyər doğru bir Qiymətli Kağızın Beynəlxalq İdentifikasiya Kodu (ISIN) deyil.</target>
            </trans-unit>
            <trans-unit id="100">
                <source>This value should be a valid expression.</source>
                <target>Bu dəyər etibarlı ifadə olmalıdır.</target>
            </trans-unit>
            <trans-unit id="101">
                <source>This value is not a valid CSS color.</source>
                <target>Bu dəyər etibarlı CSS rəngi deyil.</target>
            </trans-unit>
            <trans-unit id="102">
                <source>This value is not a valid CIDR notation.</source>
                <target>Bu dəyər etibarlı CIDR notasiyası deyil.</target>
            </trans-unit>
            <trans-unit id="103">
                <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
                <target>Şəbəkə maskasının dəyəri {{ min }} və {{ max }} arasında olmalıdır.</target>
            </trans-unit>
            <trans-unit id="104">
                <source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
                <target>Fayl adı çox uzundur. {{ filename_max_length }} və ya daha az simvol olmalıdır.</target>
            </trans-unit>
            <trans-unit id="105">
                <source>The password strength is too low. Please use a stronger password.</source>
                <target>Parolun gücü çox zəifdir. Zəhmət olmasa, daha güclü bir parol istifadə edin.</target>
            </trans-unit>
            <trans-unit id="106">
                <source>This value contains characters that are not allowed by the current restriction-level.</source>
                <target>Bu dəyərdə cari məhdudiyyət səviyyəsi tərəfindən icazə verilməyən simvollar var.</target>
            </trans-unit>
            <trans-unit id="107">
                <source>Using invisible characters is not allowed.</source>
                <target>Görünməz simvolların istifadəsinə icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="108">
                <source>Mixing numbers from different scripts is not allowed.</source>
                <target>Fərqli skriptlərdən nömrələrin qarışdırılmasına icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="109">
                <source>Using hidden overlay characters is not allowed.</source>
                <target>Gizli örtülü simvolların istifadəsinə icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="110">
                <source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
                <target>Faylın uzantısı yanlışdır ({{ extension }}). İcazə verilən uzantılar {{ extensions }}.</target>
            </trans-unit>
            <trans-unit id="111">
                <source>The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}.</source>
                <target>Təsbit edilən simvol şifrləməsi yanlışdır. ({{ detected }}). İcazə verilən şifrləmələr bunlardır: {{ encodings }}.</target>
            </trans-unit>
            <trans-unit id="112">
                <source>This value is not a valid MAC address.</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir MAC ünvanı deyil.</target>
            </trans-unit>
            <trans-unit id="113">
                <source>This URL is missing a top-level domain.</source>
                <target state="needs-review-translation">Bu URL yuxarı səviyyəli domeni çatışmır.</target>
            </trans-unit>
            <trans-unit id="114">
                <source>This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.</source>
                <target state="needs-review-translation">Bu dəyər çox qısadır. Heç olmasa bir söz daxil etməlisiniz.|Bu dəyər çox qısadır. Heç olmasa {{ min }} söz daxil etməlisiniz.</target>
            </trans-unit>
            <trans-unit id="115">
                <source>This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.</source>
                <target state="needs-review-translation">Bu dəyər çox uzundur. Yalnız bir söz daxil etməlisiniz.|Bu dəyər çox uzundur. {{ max }} və ya daha az söz daxil etməlisiniz.</target>
            </trans-unit>
            <trans-unit id="116">
                <source>This value does not represent a valid week in the ISO 8601 format.</source>
                <target state="needs-review-translation">Bu dəyər ISO 8601 formatında etibarlı bir həftəni təmsil etmir.</target>
            </trans-unit>
            <trans-unit id="117">
                <source>This value is not a valid week.</source>
                <target state="needs-review-translation">Bu dəyər etibarlı bir həftə deyil.</target>
            </trans-unit>
            <trans-unit id="118">
                <source>This value should not be before week "{{ min }}".</source>
                <target state="needs-review-translation">Bu dəyər "{{ min }}" həftəsindən əvvəl olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="119">
                <source>This value should not be after week "{{ max }}".</source>
                <target state="needs-review-translation">Bu dəyər "{{ max }}" həftəsindən sonra olmamalıdır.</target>
            </trans-unit>
            <trans-unit id="121">
                <source>This value is not a valid Twig template.</source>
                <target state="needs-review-translation">Bu dəyər etibarlı Twig şablonu deyil.</target>
            </trans-unit>
            <trans-unit id="122">
                <source>This file is not a valid video.</source>
                <target state="needs-review-translation">Bu fayl etibarlı video deyil.</target>
            </trans-unit>
            <trans-unit id="123">
                <source>The size of the video could not be detected.</source>
                <target state="needs-review-translation">Videonun ölçüsünü təyin etmək mümkün olmadı.</target>
            </trans-unit>
            <trans-unit id="124">
                <source>The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target state="needs-review-translation">Video enliyi çox böyükdür ({{ width }}px). İcazə verilən maksimal enlik {{ max_width }}px-dir.</target>
            </trans-unit>
            <trans-unit id="125">
                <source>The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target state="needs-review-translation">Video eni çox kiçikdir ({{ width }}px). Gözlənilən minimum en {{ min_width }}px-dir.</target>
            </trans-unit>
            <trans-unit id="126">
                <source>The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target state="needs-review-translation">Video hündürlüyü çox böyükdür ({{ height }}px). İcazə verilən maksimum hündürlük {{ max_height }}px-dir.</target>
            </trans-unit>
            <trans-unit id="127">
                <source>The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target state="needs-review-translation">Videonun hündürlüyü çox kiçikdir ({{ height }}px). Gözlənilən minimum hündürlük {{ min_height }}px-dir.</target>
            </trans-unit>
            <trans-unit id="128">
                <source>The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoda piksellərin sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}-dir.</target>
            </trans-unit>
            <trans-unit id="129">
                <source>The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Videoda həddindən artıq piksel var ({{ pixels }}). Gözlənilən maksimum miqdar {{ max_pixels }}-dir.</target>
            </trans-unit>
            <trans-unit id="130">
                <source>The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
                <target state="needs-review-translation">Video nisbəti çox böyükdür ({{ ratio }}). İcazə verilən maksimal nisbət {{ max_ratio }}‑dir.</target>
            </trans-unit>
            <trans-unit id="131">
                <source>The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
                <target state="needs-review-translation">Video nisbəti çox kiçikdir ({{ ratio }}). Gözlənilən minimal nisbət {{ min_ratio }}.</target>
            </trans-unit>
            <trans-unit id="132">
                <source>The video is square ({{ width }}x{{ height }}px). Square videos are not allowed.</source>
                <target state="needs-review-translation">Video kvadratdır ({{ width }}x{{ height }}px). Kvadrat videolara icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="133">
                <source>The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video üfiqi istiqamətdədir ({{ width }}x{{ height }} piksel). Üfiqi videolara icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="134">
                <source>The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed.</source>
                <target state="needs-review-translation">Video portret istiqamətindədir ({{ width }}x{{ height }} piksel). Portret istiqamətli videolara icazə verilmir.</target>
            </trans-unit>
            <trans-unit id="135">
                <source>The video file is corrupted.</source>
                <target state="needs-review-translation">Video faylı zədələnib.</target>
            </trans-unit>
            <trans-unit id="136">
                <source>The video contains multiple streams. Only one stream is allowed.</source>
                <target state="needs-review-translation">Video bir neçə axın ehtiva edir. Yalnız bir axına icazə verilir.</target>
            </trans-unit>
            <trans-unit id="137">
                <source>Unsupported video codec "{{ codec }}".</source>
                <target state="needs-review-translation">Dəstəklənməyən video kodeki "{{ codec }}".</target>
            </trans-unit>
            <trans-unit id="138">
                <source>Unsupported video container "{{ container }}".</source>
                <target state="needs-review-translation">Dəstəklənməyən video konteyneri "{{ container }}".</target>
            </trans-unit>
            <trans-unit id="139">
                <source>The image file is corrupted.</source>
                <target state="needs-review-translation">Şəkil faylı korlanıb.</target>
            </trans-unit>
            <trans-unit id="140">
                <source>The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.</source>
                <target state="needs-review-translation">Şəkildə piksel sayı çox azdır ({{ pixels }}). Gözlənilən minimum miqdar {{ min_pixels }}.</target>
            </trans-unit>
            <trans-unit id="141">
                <source>The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.</source>
                <target state="needs-review-translation">Şəkildə çox piksel var ({{ pixels }}). Gözlənilən maksimum say {{ max_pixels }}.</target>
            </trans-unit>
            <trans-unit id="142">
                <source>This filename does not match the expected charset.</source>
                <target state="needs-review-translation">Bu fayl adı gözlənilən simvol dəstinə uyğun gəlmir.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
<?php










namespace Symfony\Component\Validator\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;





class AddValidatorInitializersPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('validator.builder')) {
return;
}

$initializers = [];
foreach ($container->findTaggedServiceIds('validator.initializer', true) as $id => $attributes) {
$initializers[] = new Reference($id);
}

$container->getDefinition('validator.builder')->addMethodCall('addObjectInitializers', [$initializers]);
}
}
<?php










namespace Symfony\Component\Validator\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;






class AddAutoMappingConfigurationPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasParameter('validator.auto_mapping') || !$container->hasDefinition('validator.builder')) {
return;
}

$config = $container->getParameter('validator.auto_mapping');

$globalNamespaces = [];
$servicesToNamespaces = [];
foreach ($config as $namespace => $value) {
if ([] === $value['services']) {
$globalNamespaces[] = $namespace;

continue;
}

foreach ($value['services'] as $service) {
$servicesToNamespaces[$service][] = $namespace;
}
}

$validatorBuilder = $container->getDefinition('validator.builder');
foreach ($container->findTaggedServiceIds('validator.auto_mapper') as $id => $tags) {
$regexp = $this->getRegexp(array_merge($globalNamespaces, $servicesToNamespaces[$id] ?? []));
$validatorBuilder->addMethodCall('addLoader', [new Reference($id)]);
$container->getDefinition($id)->setArgument('$classValidatorRegexp', $regexp);
}

$container->getParameterBag()->remove('validator.auto_mapping');
}




private function getRegexp(array $patterns): ?string
{
if (!$patterns) {
return null;
}

$regexps = [];
foreach ($patterns as $pattern) {

$regex = preg_quote(ltrim($pattern, '\\'));


$regex = strtr($regex, ['\\*\\*' => '.*?', '\\*' => '[^\\\\]*?']);


if (!str_ends_with($regex, '\\')) {
$regex .= '$';
}

$regexps[] = '^'.$regex;
}

return \sprintf('{%s}', implode('|', $regexps));
}
}
<?php










namespace Symfony\Component\Validator\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;





class AddConstraintValidatorsPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('validator.validator_factory')) {
return;
}

$validators = [];
foreach ($container->findTaggedServiceIds('validator.constraint_validator', true) as $id => $attributes) {
$definition = $container->getDefinition($id);

if (isset($attributes[0]['alias'])) {
$validators[$attributes[0]['alias']] = new Reference($id);
}

$validators[$definition->getClass()] = new Reference($id);
}

$container
->getDefinition('validator.validator_factory')
->replaceArgument(0, ServiceLocatorTagPass::register($container, $validators))
;
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Context\ExecutionContextInterface;




interface ConstraintValidatorInterface
{





public function initialize(ExecutionContextInterface $context);






public function validate(mixed $value, Constraint $constraint);
}
<?php










namespace Symfony\Component\Validator\Exception;




class NoSuchMetadataException extends ValidatorException
{
}
<?php










namespace Symfony\Component\Validator\Exception;

use Symfony\Component\Validator\ConstraintViolationListInterface;




class ValidationFailedException extends RuntimeException
{
private ConstraintViolationListInterface $violations;
private mixed $value;

public function __construct(mixed $value, ConstraintViolationListInterface $violations)
{
$this->violations = $violations;
$this->value = $value;
parent::__construct($violations);
}




public function getValue()
{
return $this->value;
}

public function getViolations(): ConstraintViolationListInterface
{
return $this->violations;
}
}
<?php










namespace Symfony\Component\Validator\Exception;

class GroupDefinitionException extends ValidatorException
{
}
<?php










namespace Symfony\Component\Validator\Exception;




class UnexpectedValueException extends UnexpectedTypeException
{
private string $expectedType;

public function __construct(mixed $value, string $expectedType)
{
parent::__construct($value, $expectedType);

$this->expectedType = $expectedType;
}

public function getExpectedType(): string
{
return $this->expectedType;
}
}
<?php










namespace Symfony\Component\Validator\Exception;

class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Validator\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Validator\Exception;

class UnexpectedTypeException extends ValidatorException
{
public function __construct(mixed $value, string $expectedType)
{
parent::__construct(\sprintf('Expected argument of type "%s", "%s" given', $expectedType, get_debug_type($value)));
}
}
<?php










namespace Symfony\Component\Validator\Exception;






class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Validator\Exception;




class UnsupportedMetadataException extends InvalidArgumentException
{
}
<?php










namespace Symfony\Component\Validator\Exception;

class InvalidOptionsException extends ValidatorException
{
private array $options;

public function __construct(string $message, array $options)
{
parent::__construct($message);

$this->options = $options;
}




public function getOptions()
{
return $this->options;
}
}
<?php










namespace Symfony\Component\Validator\Exception;

class ConstraintDefinitionException extends ValidatorException
{
}
<?php










namespace Symfony\Component\Validator\Exception;

class MissingOptionsException extends ValidatorException
{
private array $options;

public function __construct(string $message, array $options)
{
parent::__construct($message);

$this->options = $options;
}




public function getOptions()
{
return $this->options;
}
}
<?php










namespace Symfony\Component\Validator\Exception;






class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Validator\Exception;






class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Validator\Exception;






class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Validator\Exception;

class MappingException extends ValidatorException
{
}
<?php










namespace Symfony\Component\Validator\Exception;

class ValidatorException extends RuntimeException
{
}
<?php










namespace Symfony\Component\Validator;






class ConstraintViolation implements ConstraintViolationInterface
{
private string|\Stringable $message;
private ?string $messageTemplate;
private array $parameters;
private ?int $plural;
private mixed $root;
private ?string $propertyPath;
private mixed $invalidValue;
private ?Constraint $constraint;
private ?string $code;
private mixed $cause;





















public function __construct(string|\Stringable $message, ?string $messageTemplate, array $parameters, mixed $root, ?string $propertyPath, mixed $invalidValue, ?int $plural = null, ?string $code = null, ?Constraint $constraint = null, mixed $cause = null)
{
$this->message = $message;
$this->messageTemplate = $messageTemplate;
$this->parameters = $parameters;
$this->plural = $plural;
$this->root = $root;
$this->propertyPath = $propertyPath;
$this->invalidValue = $invalidValue;
$this->constraint = $constraint;
$this->code = $code;
$this->cause = $cause;
}

public function __toString(): string
{
if (\is_object($this->root)) {
$class = 'Object('.$this->root::class.')';
} elseif (\is_array($this->root)) {
$class = 'Array';
} else {
$class = (string) $this->root;
}

$propertyPath = (string) $this->propertyPath;

if ('' !== $propertyPath && '[' !== $propertyPath[0] && '' !== $class) {
$class .= '.';
}

if (null !== ($code = $this->code) && '' !== $code) {
$code = ' (code '.$code.')';
}

return $class.$propertyPath.":\n    ".$this->getMessage().$code;
}

public function getMessageTemplate(): string
{
return (string) $this->messageTemplate;
}

public function getParameters(): array
{
return $this->parameters;
}

public function getPlural(): ?int
{
return $this->plural;
}

public function getMessage(): string|\Stringable
{
return $this->message;
}

public function getRoot(): mixed
{
return $this->root;
}

public function getPropertyPath(): string
{
return (string) $this->propertyPath;
}

public function getInvalidValue(): mixed
{
return $this->invalidValue;
}




public function getConstraint(): ?Constraint
{
return $this->constraint;
}




public function getCause(): mixed
{
return $this->cause;
}

public function getCode(): ?string
{
return $this->code;
}
}
<?php










namespace Symfony\Component\Validator;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\PsrCachedReader;
use Doctrine\Common\Annotations\Reader;
use Psr\Cache\CacheItemPoolInterface;
use Psr\Container\ContainerInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Validator\Context\ExecutionContextFactory;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Validator\Mapping\Loader\AttributeLoader;
use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
use Symfony\Component\Validator\Validator\RecursiveValidator;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\LocaleAwareInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorTrait;


class_exists(TranslatorInterface::class);
class_exists(LocaleAwareInterface::class);
class_exists(TranslatorTrait::class);




class ValidatorBuilder
{
private array $initializers = [];
private array $loaders = [];
private array $xmlMappings = [];
private array $yamlMappings = [];
private array $methodMappings = [];
private ?Reader $annotationReader = null;
private bool $enableAttributeMapping = false;
private ?MetadataFactoryInterface $metadataFactory = null;
private ConstraintValidatorFactoryInterface $validatorFactory;
private ?ContainerInterface $groupProviderLocator = null;
private ?CacheItemPoolInterface $mappingCache = null;
private ?TranslatorInterface $translator = null;
private ?string $translationDomain = null;






public function addObjectInitializer(ObjectInitializerInterface $initializer): static
{
$this->initializers[] = $initializer;

return $this;
}








public function addObjectInitializers(array $initializers): static
{
$this->initializers = array_merge($this->initializers, $initializers);

return $this;
}






public function addXmlMapping(string $path): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->xmlMappings[] = $path;

return $this;
}








public function addXmlMappings(array $paths): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->xmlMappings = array_merge($this->xmlMappings, $paths);

return $this;
}








public function addYamlMapping(string $path): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->yamlMappings[] = $path;

return $this;
}








public function addYamlMappings(array $paths): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->yamlMappings = array_merge($this->yamlMappings, $paths);

return $this;
}






public function addMethodMapping(string $methodName): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->methodMappings[] = $methodName;

return $this;
}








public function addMethodMappings(array $methodNames): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->methodMappings = array_merge($this->methodMappings, $methodNames);

return $this;
}






public function enableAnnotationMapping(): static
{
trigger_deprecation('symfony/validator', '6.4', 'Method "%s()" is deprecated, use "enableAttributeMapping()" instead.', __METHOD__);

return $this->enableAttributeMapping();
}






public function enableAttributeMapping(): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot enable attribute mapping after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->enableAttributeMapping = true;

return $this;
}






public function disableAnnotationMapping(): static
{
trigger_deprecation('symfony/validator', '6.4', 'Method "%s()" is deprecated, use "disableAttributeMapping()" instead.', __METHOD__);

return $this->disableAttributeMapping();
}






public function disableAttributeMapping(): static
{
$this->annotationReader = null;
$this->enableAttributeMapping = false;

return $this;
}






public function setDoctrineAnnotationReader(?Reader $reader): static
{
trigger_deprecation('symfony/validator', '6.4', 'Method "%s()" is deprecated without replacement.', __METHOD__);

$this->annotationReader = $reader;

return $this;
}






public function addDefaultDoctrineAnnotationReader(): static
{
trigger_deprecation('symfony/validator', '6.4', 'Method "%s()" is deprecated without replacement.', __METHOD__);

$this->annotationReader = $this->createAnnotationReader();

return $this;
}






public function setMetadataFactory(MetadataFactoryInterface $metadataFactory): static
{
if (\count($this->xmlMappings) > 0 || \count($this->yamlMappings) > 0 || \count($this->methodMappings) > 0 || $this->enableAttributeMapping) {
throw new ValidatorException('You cannot set a custom metadata factory after adding custom mappings. You should do either of both.');
}

$this->metadataFactory = $metadataFactory;

return $this;
}






public function setMappingCache(CacheItemPoolInterface $cache): static
{
if (null !== $this->metadataFactory) {
throw new ValidatorException('You cannot set a custom mapping cache after setting a custom metadata factory. Configure your metadata factory instead.');
}

$this->mappingCache = $cache;

return $this;
}






public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory): static
{
$this->validatorFactory = $validatorFactory;

return $this;
}




public function setGroupProviderLocator(ContainerInterface $groupProviderLocator): static
{
$this->groupProviderLocator = $groupProviderLocator;

return $this;
}






public function setTranslator(TranslatorInterface $translator): static
{
$this->translator = $translator;

return $this;
}










public function setTranslationDomain(?string $translationDomain): static
{
$this->translationDomain = $translationDomain;

return $this;
}




public function addLoader(LoaderInterface $loader): static
{
$this->loaders[] = $loader;

return $this;
}




public function getLoaders(): array
{
$loaders = [];

foreach ($this->xmlMappings as $xmlMapping) {
$loaders[] = new XmlFileLoader($xmlMapping);
}

foreach ($this->yamlMappings as $yamlMappings) {
$loaders[] = new YamlFileLoader($yamlMappings);
}

foreach ($this->methodMappings as $methodName) {
$loaders[] = new StaticMethodLoader($methodName);
}

if ($this->enableAttributeMapping && $this->annotationReader) {
$loaders[] = new AnnotationLoader($this->annotationReader);
} elseif ($this->enableAttributeMapping) {
$loaders[] = new AttributeLoader();
}

return array_merge($loaders, $this->loaders);
}




public function getValidator(): ValidatorInterface
{
$metadataFactory = $this->metadataFactory;

if (!$metadataFactory) {
$loaders = $this->getLoaders();
$loader = null;

if (\count($loaders) > 1) {
$loader = new LoaderChain($loaders);
} elseif (1 === \count($loaders)) {
$loader = $loaders[0];
}

$metadataFactory = new LazyLoadingMetadataFactory($loader, $this->mappingCache);
}

$validatorFactory = $this->validatorFactory ?? new ConstraintValidatorFactory();
$translator = $this->translator;

if (null === $translator) {
$translator = new class implements TranslatorInterface, LocaleAwareInterface {
use TranslatorTrait;
};




$translator->setLocale('en');
}

$contextFactory = new ExecutionContextFactory($translator, $this->translationDomain);

return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers, $this->groupProviderLocator);
}

private function createAnnotationReader(): Reader
{
if (!class_exists(AnnotationReader::class)) {
throw new LogicException('Enabling annotation based constraint mapping requires the packages doctrine/annotations and symfony/cache to be installed.');
}

if (class_exists(ArrayAdapter::class)) {
return new PsrCachedReader(new AnnotationReader(), new ArrayAdapter());
}

throw new LogicException('Enabling annotation based constraint mapping requires the packages doctrine/annotations and symfony/cache to be installed.');
}
}
<?php










namespace Symfony\Component\Validator\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Dumper;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Finder\Exception\DirectoryNotFoundException;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Mapping\AutoMappingStrategy;
use Symfony\Component\Validator\Mapping\CascadingStrategy;
use Symfony\Component\Validator\Mapping\ClassMetadataInterface;
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
use Symfony\Component\Validator\Mapping\GenericMetadata;
use Symfony\Component\Validator\Mapping\TraversalStrategy;






#[AsCommand(name: 'debug:validator', description: 'Display validation constraints for classes')]
class DebugCommand extends Command
{
private MetadataFactoryInterface $validator;

public function __construct(MetadataFactoryInterface $validator)
{
parent::__construct();

$this->validator = $validator;
}




protected function configure()
{
$this
->addArgument('class', InputArgument::REQUIRED, 'A fully qualified class name or a path')
->addOption('show-all', null, InputOption::VALUE_NONE, 'Show all classes even if they have no validation constraints')
->setHelp(<<<'EOF'
The <info>%command.name% 'App\Entity\Dummy'</info> command dumps the validators for the dummy class.

The <info>%command.name% src/</info> command dumps the validators for the `src` directory.
EOF
)
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$class = $input->getArgument('class');

if (class_exists($class)) {
$this->dumpValidatorsForClass($input, $output, $class);

return 0;
}

try {
foreach ($this->getResourcesByPath($class) as $class) {
$this->dumpValidatorsForClass($input, $output, $class);
}
} catch (DirectoryNotFoundException) {
$io = new SymfonyStyle($input, $output);
$io->error(\sprintf('Neither class nor path were found with "%s" argument.', $input->getArgument('class')));

return 1;
}

return 0;
}

private function dumpValidatorsForClass(InputInterface $input, OutputInterface $output, string $class): void
{
$io = new SymfonyStyle($input, $output);
$title = \sprintf('<info>%s</info>', $class);
$rows = [];
$dump = new Dumper($output);


$classMetadata = $this->validator->getMetadataFor($class);

foreach ($this->getClassConstraintsData($classMetadata) as $data) {
$rows[] = [
'-',
$data['class'],
implode(', ', $data['groups']),
$dump($data['options']),
];
}

foreach ($this->getConstrainedPropertiesData($classMetadata) as $propertyName => $constraintsData) {
foreach ($constraintsData as $data) {
$rows[] = [
$propertyName,
$data['class'],
implode(', ', $data['groups']),
$dump($data['options']),
];
}
}

if (!$rows) {
if (false === $input->getOption('show-all')) {
return;
}

$io->section($title);
$io->text('No validators were found for this class.');

return;
}

$io->section($title);

$table = new Table($output);
$table->setHeaders(['Property', 'Name', 'Groups', 'Options']);
$table->setRows($rows);
$table->setColumnMaxWidth(3, 80);
$table->render();
}

private function getClassConstraintsData(ClassMetadataInterface $classMetadata): iterable
{
foreach ($classMetadata->getConstraints() as $constraint) {
yield [
'class' => $constraint::class,
'groups' => $constraint->groups,
'options' => $this->getConstraintOptions($constraint),
];
}
}

private function getConstrainedPropertiesData(ClassMetadataInterface $classMetadata): array
{
$data = [];

foreach ($classMetadata->getConstrainedProperties() as $constrainedProperty) {
$data[$constrainedProperty] = $this->getPropertyData($classMetadata, $constrainedProperty);
}

return $data;
}

private function getPropertyData(ClassMetadataInterface $classMetadata, string $constrainedProperty): array
{
$data = [];

$propertyMetadata = $classMetadata->getPropertyMetadata($constrainedProperty);
foreach ($propertyMetadata as $metadata) {
$autoMapingStrategy = 'Not supported';
if ($metadata instanceof GenericMetadata) {
$autoMapingStrategy = match ($metadata->getAutoMappingStrategy()) {
AutoMappingStrategy::ENABLED => 'Enabled',
AutoMappingStrategy::DISABLED => 'Disabled',
AutoMappingStrategy::NONE => 'None',
};
}
$traversalStrategy = 'None';
if (TraversalStrategy::TRAVERSE === $metadata->getTraversalStrategy()) {
$traversalStrategy = 'Traverse';
}
if (TraversalStrategy::IMPLICIT === $metadata->getTraversalStrategy()) {
$traversalStrategy = 'Implicit';
}

$data[] = [
'class' => 'property options',
'groups' => [],
'options' => [
'cascadeStrategy' => CascadingStrategy::CASCADE === $metadata->getCascadingStrategy() ? 'Cascade' : 'None',
'autoMappingStrategy' => $autoMapingStrategy,
'traversalStrategy' => $traversalStrategy,
],
];
foreach ($metadata->getConstraints() as $constraint) {
$data[] = [
'class' => $constraint::class,
'groups' => $constraint->groups,
'options' => $this->getConstraintOptions($constraint),
];
}
}

return $data;
}

private function getConstraintOptions(Constraint $constraint): array
{
$options = [];

foreach (array_keys(get_object_vars($constraint)) as $propertyName) {

if ('groups' === $propertyName) {
continue;
}

$options[$propertyName] = $constraint->$propertyName;
}

ksort($options);

return $options;
}

private function getResourcesByPath(string $path): array
{
$finder = new Finder();
$finder->files()->in($path)->name('*.php')->sortByName(true);
$classes = [];

foreach ($finder as $file) {
$fileContent = file_get_contents($file->getRealPath());

preg_match('/namespace (.+);/', $fileContent, $matches);

$namespace = $matches[1] ?? null;

if (!preg_match('/class +([^{ ]+)/', $fileContent, $matches)) {

continue;
}

$className = trim($matches[1]);

if (null !== $namespace) {
$classes[] = $namespace.'\\'.$className;
} else {
$classes[] = $className;
}
}

return $classes;
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\OutOfBoundsException;

/**
@implements




*/
class ConstraintViolationList implements \IteratorAggregate, ConstraintViolationListInterface
{



private array $violations = [];






public function __construct(iterable $violations = [])
{
foreach ($violations as $violation) {
$this->add($violation);
}
}

public static function createFromMessage(string $message): self
{
$self = new self();
$self->add(new ConstraintViolation($message, '', [], null, '', null));

return $self;
}

public function __toString(): string
{
$string = '';

foreach ($this->violations as $violation) {
$string .= $violation."\n";
}

return $string;
}




public function add(ConstraintViolationInterface $violation)
{
$this->violations[] = $violation;
}




public function addAll(ConstraintViolationListInterface $otherList)
{
foreach ($otherList as $violation) {
$this->violations[] = $violation;
}
}

public function get(int $offset): ConstraintViolationInterface
{
if (!isset($this->violations[$offset])) {
throw new OutOfBoundsException(\sprintf('The offset "%s" does not exist.', $offset));
}

return $this->violations[$offset];
}

public function has(int $offset): bool
{
return isset($this->violations[$offset]);
}




public function set(int $offset, ConstraintViolationInterface $violation)
{
$this->violations[$offset] = $violation;
}




public function remove(int $offset)
{
unset($this->violations[$offset]);
}




public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->violations);
}

public function count(): int
{
return \count($this->violations);
}

public function offsetExists(mixed $offset): bool
{
return $this->has($offset);
}

public function offsetGet(mixed $offset): ConstraintViolationInterface
{
return $this->get($offset);
}

public function offsetSet(mixed $offset, mixed $violation): void
{
if (null === $offset) {
$this->add($violation);
} else {
$this->set($offset, $violation);
}
}

public function offsetUnset(mixed $offset): void
{
$this->remove($offset);
}






public function findByCodes(string|array $codes): static
{
$codes = (array) $codes;
$violations = [];
foreach ($this as $violation) {
if (\in_array($violation->getCode(), $codes, true)) {
$violations[] = $violation;
}
}

return new static($violations);
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Constraints\GroupSequence;






interface GroupProviderInterface
{






public function getGroups(object $object): array|GroupSequence;
}
<?php










namespace Symfony\Component\Validator;





interface ConstraintValidatorFactoryInterface
{




public function getInstance(Constraint $constraint): ConstraintValidatorInterface;
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;





#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class When extends Composite
{
public $expression;
public $constraints = [];
public $values = [];

public function __construct(string|Expression|array $expression, array|Constraint|null $constraints = null, ?array $values = null, ?array $groups = null, $payload = null, array $options = [])
{
if (!class_exists(ExpressionLanguage::class)) {
throw new LogicException(\sprintf('The "symfony/expression-language" component is required to use the "%s" constraint. Try running "composer require symfony/expression-language".', __CLASS__));
}

if (\is_array($expression)) {
$options = array_merge($expression, $options);
} else {
$options['expression'] = $expression;

if (null !== $constraints) {
$options['constraints'] = $constraints;
}
}

if (isset($options['constraints']) && !\is_array($options['constraints'])) {
$options['constraints'] = [$options['constraints']];
}

if (null !== $groups) {
$options['groups'] = $groups;
}

if (null !== $payload) {
$options['payload'] = $payload;
}

parent::__construct($options);

$this->values = $values ?? $this->values;
}

public function getRequiredOptions(): array
{
return ['expression', 'constraints'];
}

public function getTargets(): string|array
{
return [self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT];
}

protected function getCompositeOption(): string
{
return 'constraints';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Callback extends Constraint
{



public $callback;

public function __construct(array|string|callable|null $callback = null, ?array $groups = null, mixed $payload = null, array $options = [])
{

if (\is_array($callback) && 1 === \count($callback) && isset($callback['value'])) {
$callback = $callback['value'];
}

if (!\is_array($callback) || (!isset($callback['callback']) && !isset($callback['groups']) && !isset($callback['payload']))) {
$options['callback'] = $callback;
} else {
$options = array_merge($callback, $options);
}

parent::__construct($options, $groups, $payload);
}

public function getDefaultOption(): ?string
{
return 'callback';
}

public function getTargets(): string|array
{
return [self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
final class PasswordStrength extends Constraint
{
public const STRENGTH_VERY_WEAK = 0;
public const STRENGTH_WEAK = 1;
public const STRENGTH_MEDIUM = 2;
public const STRENGTH_STRONG = 3;
public const STRENGTH_VERY_STRONG = 4;

public const PASSWORD_STRENGTH_ERROR = '4234df00-45dd-49a4-b303-a75dbf8b10d8';

protected const ERROR_NAMES = [
self::PASSWORD_STRENGTH_ERROR => 'PASSWORD_STRENGTH_ERROR',
];

public string $message = 'The password strength is too low. Please use a stronger password.';

public int $minScore;

public function __construct(?array $options = null, ?int $minScore = null, ?array $groups = null, mixed $payload = null, ?string $message = null)
{
$options['minScore'] ??= self::STRENGTH_MEDIUM;

parent::__construct($options, $groups, $payload);

$this->minScore = $minScore ?? $this->minScore;
$this->message = $message ?? $this->message;

if ($this->minScore < 1 || 4 < $this->minScore) {
throw new ConstraintDefinitionException(\sprintf('The parameter "minScore" of the "%s" constraint must be an integer between 1 and 4.', self::class));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Positive extends GreaterThan
{
use ZeroComparisonConstraintTrait;

public $message = 'This value should be positive.';
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class IdenticalTo extends AbstractComparison
{
public const NOT_IDENTICAL_ERROR = '2a8cc50f-58a2-4536-875e-060a2ce69ed5';

protected const ERROR_NAMES = [
self::NOT_IDENTICAL_ERROR => 'NOT_IDENTICAL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class IsTrue extends Constraint
{
public const NOT_TRUE_ERROR = '2beabf1c-54c0-4882-a928-05249b26e23b';

protected const ERROR_NAMES = [
self::NOT_TRUE_ERROR => 'NOT_TRUE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be true.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;











#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::TARGET_CLASS)]
class EnableAutoMapping extends Constraint
{
public function __construct(?array $options = null)
{
if (\is_array($options) && \array_key_exists('groups', $options)) {
throw new ConstraintDefinitionException(\sprintf('The option "groups" is not supported by the constraint "%s".', __CLASS__));
}

parent::__construct($options);
}

public function getTargets(): string|array
{
return [self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\HttpFoundation\File\File as FileObject;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Mime\MimeTypes;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class FileValidator extends ConstraintValidator
{
public const KB_BYTES = 1000;
public const MB_BYTES = 1000000;
public const KIB_BYTES = 1024;
public const MIB_BYTES = 1048576;

private const SUFFICES = [
1 => 'bytes',
self::KB_BYTES => 'kB',
self::MB_BYTES => 'MB',
self::KIB_BYTES => 'KiB',
self::MIB_BYTES => 'MiB',
];




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof File) {
throw new UnexpectedTypeException($constraint, File::class);
}

if (null === $value || '' === $value) {
return;
}

if ($value instanceof UploadedFile && !$value->isValid()) {
switch ($value->getError()) {
case \UPLOAD_ERR_INI_SIZE:
$iniLimitSize = UploadedFile::getMaxFilesize();
if ($constraint->maxSize && $constraint->maxSize < $iniLimitSize) {
$limitInBytes = $constraint->maxSize;
$binaryFormat = $constraint->binaryFormat;
} else {
$limitInBytes = $iniLimitSize;
$binaryFormat = $constraint->binaryFormat ?? true;
}

[, $limitAsString, $suffix] = $this->factorizeSizes(0, $limitInBytes, $binaryFormat);
$this->context->buildViolation($constraint->uploadIniSizeErrorMessage)
->setParameter('{{ limit }}', $limitAsString)
->setParameter('{{ suffix }}', $suffix)
->setCode((string) \UPLOAD_ERR_INI_SIZE)
->addViolation();

return;
case \UPLOAD_ERR_FORM_SIZE:
$this->context->buildViolation($constraint->uploadFormSizeErrorMessage)
->setCode((string) \UPLOAD_ERR_FORM_SIZE)
->addViolation();

return;
case \UPLOAD_ERR_PARTIAL:
$this->context->buildViolation($constraint->uploadPartialErrorMessage)
->setCode((string) \UPLOAD_ERR_PARTIAL)
->addViolation();

return;
case \UPLOAD_ERR_NO_FILE:
$this->context->buildViolation($constraint->uploadNoFileErrorMessage)
->setCode((string) \UPLOAD_ERR_NO_FILE)
->addViolation();

return;
case \UPLOAD_ERR_NO_TMP_DIR:
$this->context->buildViolation($constraint->uploadNoTmpDirErrorMessage)
->setCode((string) \UPLOAD_ERR_NO_TMP_DIR)
->addViolation();

return;
case \UPLOAD_ERR_CANT_WRITE:
$this->context->buildViolation($constraint->uploadCantWriteErrorMessage)
->setCode((string) \UPLOAD_ERR_CANT_WRITE)
->addViolation();

return;
case \UPLOAD_ERR_EXTENSION:
$this->context->buildViolation($constraint->uploadExtensionErrorMessage)
->setCode((string) \UPLOAD_ERR_EXTENSION)
->addViolation();

return;
default:
$this->context->buildViolation($constraint->uploadErrorMessage)
->setCode((string) $value->getError())
->addViolation();

return;
}
}

if (!\is_scalar($value) && !$value instanceof FileObject && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$path = $value instanceof FileObject ? $value->getPathname() : (string) $value;

if (!is_file($path)) {
$this->context->buildViolation($constraint->notFoundMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setCode(File::NOT_FOUND_ERROR)
->addViolation();

return;
}

if (!is_readable($path)) {
$this->context->buildViolation($constraint->notReadableMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setCode(File::NOT_READABLE_ERROR)
->addViolation();

return;
}

$sizeInBytes = filesize($path);
$basename = $value instanceof UploadedFile ? $value->getClientOriginalName() : basename($path);

if ($constraint->filenameMaxLength && $constraint->filenameMaxLength < $filenameLength = \strlen($basename)) {
$this->context->buildViolation($constraint->filenameTooLongMessage)
->setParameter('{{ filename_max_length }}', $this->formatValue($constraint->filenameMaxLength))
->setCode(File::FILENAME_TOO_LONG)
->setPlural($constraint->filenameMaxLength)
->addViolation();

return;
}

if (0 === $sizeInBytes) {
$this->context->buildViolation($constraint->disallowEmptyMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setParameter('{{ name }}', $this->formatValue($basename))
->setCode(File::EMPTY_ERROR)
->addViolation();

return;
}

if ($constraint->maxSize) {
$limitInBytes = $constraint->maxSize;

if ($sizeInBytes > $limitInBytes) {
[$sizeAsString, $limitAsString, $suffix] = $this->factorizeSizes($sizeInBytes, $limitInBytes, $constraint->binaryFormat);
$this->context->buildViolation($constraint->maxSizeMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setParameter('{{ size }}', $sizeAsString)
->setParameter('{{ limit }}', $limitAsString)
->setParameter('{{ suffix }}', $suffix)
->setParameter('{{ name }}', $this->formatValue($basename))
->setCode(File::TOO_LARGE_ERROR)
->addViolation();

return;
}
}

$mimeTypes = (array) $constraint->mimeTypes;

if ($constraint->extensions) {
$fileExtension = strtolower(pathinfo($basename, \PATHINFO_EXTENSION));

$found = false;
$normalizedExtensions = [];
foreach ((array) $constraint->extensions as $k => $v) {
if (!\is_string($k)) {
$k = $v;
$v = null;
}

$normalizedExtensions[] = $k;

if ($fileExtension !== $k) {
continue;
}

$found = true;
if (null === $v) {
if (!class_exists(MimeTypes::class)) {
throw new LogicException('You cannot validate the mime-type of files as the Mime component is not installed. Try running "composer require symfony/mime".');
}

$mimeTypesHelper = MimeTypes::getDefault();
$v = $mimeTypesHelper->getMimeTypes($k);
}

$mimeTypes = $mimeTypes ? array_intersect($v, $mimeTypes) : (array) $v;
break;
}

if (!$found) {
$this->context->buildViolation($constraint->extensionsMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setParameter('{{ extension }}', $this->formatValue($fileExtension))
->setParameter('{{ extensions }}', $this->formatValues($normalizedExtensions))
->setParameter('{{ name }}', $this->formatValue($basename))
->setCode(File::INVALID_EXTENSION_ERROR)
->addViolation();
}
}

if ($mimeTypes) {
if ($value instanceof FileObject) {
$mime = $value->getMimeType();
} elseif (isset($mimeTypesHelper) || class_exists(MimeTypes::class)) {
$mime = ($mimeTypesHelper ?? MimeTypes::getDefault())->guessMimeType($path);
} elseif (!class_exists(FileObject::class)) {
throw new LogicException('You cannot validate the mime-type of files as the Mime component is not installed. Try running "composer require symfony/mime".');
} else {
$mime = (new FileObject($value))->getMimeType();
}

foreach ($mimeTypes as $mimeType) {
if ($mimeType === $mime) {
return;
}

if ($discrete = strstr($mimeType, '/*', true)) {
if (strstr($mime, '/', true) === $discrete) {
return;
}
}
}

$this->context->buildViolation($constraint->mimeTypesMessage)
->setParameter('{{ file }}', $this->formatValue($path))
->setParameter('{{ type }}', $this->formatValue($mime))
->setParameter('{{ types }}', $this->formatValues($mimeTypes))
->setParameter('{{ name }}', $this->formatValue($basename))
->setCode(File::INVALID_MIME_TYPE_ERROR)
->addViolation();
}
}

private static function moreDecimalsThan(string $double, int $numberOfDecimals): bool
{
return \strlen($double) > \strlen(round($double, $numberOfDecimals));
}





private function factorizeSizes(int $size, int|float $limit, bool $binaryFormat): array
{
if ($binaryFormat) {
$coef = self::MIB_BYTES;
$coefFactor = self::KIB_BYTES;
} else {
$coef = self::MB_BYTES;
$coefFactor = self::KB_BYTES;
}




while ($limit < $coef) {
$coef /= $coefFactor;
}

$limitAsString = (string) ($limit / $coef);



while (self::moreDecimalsThan($limitAsString, 2)) {
$coef /= $coefFactor;
$limitAsString = (string) ($limit / $coef);
}


$sizeAsString = (string) round($size / $coef, 2);



while ($sizeAsString === $limitAsString) {
$coef /= $coefFactor;
$limitAsString = (string) ($limit / $coef);
$sizeAsString = (string) round($size / $coef, 2);
}

return [$sizeAsString, $limitAsString, self::SUFFICES[$coef]];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class UniqueValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Unique) {
throw new UnexpectedTypeException($constraint, Unique::class);
}

$fields = (array) $constraint->fields;

if (null === $value) {
return;
}

if (!\is_array($value) && !$value instanceof \IteratorAggregate) {
throw new UnexpectedValueException($value, 'array|IteratorAggregate');
}

$collectionElements = [];
$normalizer = $this->getNormalizer($constraint);
foreach ($value as $element) {
$element = $normalizer($element);

if ($fields && !$element = $this->reduceElementKeys($fields, $element)) {
continue;
}

if (\in_array($element, $collectionElements, true)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($element))
->setCode(Unique::IS_NOT_UNIQUE)
->addViolation();

return;
}
$collectionElements[] = $element;
}
}

private function getNormalizer(Unique $unique): callable
{
if (null === $unique->normalizer) {
return static fn ($value) => $value;
}

return $unique->normalizer;
}

private function reduceElementKeys(array $fields, array $element): array
{
$output = [];
foreach ($fields as $field) {
if (!\is_string($field)) {
throw new UnexpectedTypeException($field, 'string');
}
if (\array_key_exists($field, $element)) {
$output[$field] = $element[$field];
}
}

return $output;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class RangeValidator extends ConstraintValidator
{
private ?PropertyAccessorInterface $propertyAccessor;

public function __construct(?PropertyAccessorInterface $propertyAccessor = null)
{
$this->propertyAccessor = $propertyAccessor;
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Range) {
throw new UnexpectedTypeException($constraint, Range::class);
}

if (null === $value) {
return;
}

$min = $this->getLimit($constraint->minPropertyPath, $constraint->min, $constraint);
$max = $this->getLimit($constraint->maxPropertyPath, $constraint->max, $constraint);

if (!is_numeric($value) && !$value instanceof \DateTimeInterface) {
if ($this->isParsableDatetimeString($min) && $this->isParsableDatetimeString($max)) {
$this->context->buildViolation($constraint->invalidDateTimeMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setCode(Range::INVALID_CHARACTERS_ERROR)
->addViolation();
} else {
$this->context->buildViolation($constraint->invalidMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setCode(Range::INVALID_CHARACTERS_ERROR)
->addViolation();
}

return;
}





if ($value instanceof \DateTimeInterface) {
if (\is_string($min)) {
try {
$min = new $value($min);
} catch (\Exception) {
throw new ConstraintDefinitionException(\sprintf('The min value "%s" could not be converted to a "%s" instance in the "%s" constraint.', $min, get_debug_type($value), get_debug_type($constraint)));
}
}

if (\is_string($max)) {
try {
$max = new $value($max);
} catch (\Exception) {
throw new ConstraintDefinitionException(\sprintf('The max value "%s" could not be converted to a "%s" instance in the "%s" constraint.', $max, get_debug_type($value), get_debug_type($constraint)));
}
}
}

$hasLowerLimit = null !== $min;
$hasUpperLimit = null !== $max;

if ($hasLowerLimit && $hasUpperLimit && ($value < $min || $value > $max)) {
$message = $constraint->notInRangeMessage;
$code = Range::NOT_IN_RANGE_ERROR;

$violationBuilder = $this->context->buildViolation($message)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ min }}', $this->formatValue($min, self::PRETTY_DATE))
->setParameter('{{ max }}', $this->formatValue($max, self::PRETTY_DATE))
->setCode($code);

if (null !== $constraint->maxPropertyPath) {
$violationBuilder->setParameter('{{ max_limit_path }}', $constraint->maxPropertyPath);
}

if (null !== $constraint->minPropertyPath) {
$violationBuilder->setParameter('{{ min_limit_path }}', $constraint->minPropertyPath);
}

$violationBuilder->addViolation();

return;
}

if ($hasUpperLimit && $value > $max) {
$violationBuilder = $this->context->buildViolation($constraint->maxMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($max, self::PRETTY_DATE))
->setCode(Range::TOO_HIGH_ERROR);

if (null !== $constraint->maxPropertyPath) {
$violationBuilder->setParameter('{{ max_limit_path }}', $constraint->maxPropertyPath);
}

if (null !== $constraint->minPropertyPath) {
$violationBuilder->setParameter('{{ min_limit_path }}', $constraint->minPropertyPath);
}

$violationBuilder->addViolation();

return;
}

if ($hasLowerLimit && $value < $min) {
$violationBuilder = $this->context->buildViolation($constraint->minMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($min, self::PRETTY_DATE))
->setCode(Range::TOO_LOW_ERROR);

if (null !== $constraint->maxPropertyPath) {
$violationBuilder->setParameter('{{ max_limit_path }}', $constraint->maxPropertyPath);
}

if (null !== $constraint->minPropertyPath) {
$violationBuilder->setParameter('{{ min_limit_path }}', $constraint->minPropertyPath);
}

$violationBuilder->addViolation();
}
}

private function getLimit(?string $propertyPath, mixed $default, Constraint $constraint): mixed
{
if (null === $propertyPath) {
return $default;
}

if (null === $object = $this->context->getObject()) {
return $default;
}

try {
return $this->getPropertyAccessor()->getValue($object, $propertyPath);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(\sprintf('Invalid property path "%s" provided to "%s" constraint: ', $propertyPath, get_debug_type($constraint)).$e->getMessage(), 0, $e);
} catch (UninitializedPropertyException) {
return null;
}
}

private function getPropertyAccessor(): PropertyAccessorInterface
{
return $this->propertyAccessor ??= PropertyAccess::createPropertyAccessor();
}

private function isParsableDatetimeString(mixed $boundary): bool
{
if (null === $boundary) {
return true;
}

if (!\is_string($boundary)) {
return false;
}

try {
new \DateTimeImmutable($boundary);
} catch (\Exception) {
return false;
}

return true;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;











#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::TARGET_CLASS)]
class DisableAutoMapping extends Constraint
{
public function __construct(?array $options = null)
{
if (\is_array($options) && \array_key_exists('groups', $options)) {
throw new ConstraintDefinitionException(\sprintf('The option "groups" is not supported by the constraint "%s".', __CLASS__));
}

parent::__construct($options);
}

public function getTargets(): string|array
{
return [self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
use Symfony\Contracts\HttpClient\Exception\ExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;









class NotCompromisedPasswordValidator extends ConstraintValidator
{
private const DEFAULT_API_ENDPOINT = 'https://api.pwnedpasswords.com/range/%s';

private HttpClientInterface $httpClient;
private string $charset;
private bool $enabled;
private string $endpoint;

public function __construct(?HttpClientInterface $httpClient = null, string $charset = 'UTF-8', bool $enabled = true, ?string $endpoint = null)
{
if (null === $httpClient && !class_exists(HttpClient::class)) {
throw new LogicException(\sprintf('The "%s" class requires the "HttpClient" component. Try running "composer require symfony/http-client".', self::class));
}

$this->httpClient = $httpClient ?? HttpClient::create();
$this->charset = $charset;
$this->enabled = $enabled;
$this->endpoint = $endpoint ?? self::DEFAULT_API_ENDPOINT;
}






public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof NotCompromisedPassword) {
throw new UnexpectedTypeException($constraint, NotCompromisedPassword::class);
}

if (!$this->enabled) {
return;
}

if (null !== $value && !\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
if ('' === $value) {
return;
}

if ('UTF-8' !== $this->charset) {
$value = mb_convert_encoding($value, 'UTF-8', $this->charset);
}

$hash = strtoupper(sha1($value));
$hashPrefix = substr($hash, 0, 5);
$url = \sprintf($this->endpoint, $hashPrefix);

try {
$result = $this->httpClient->request('GET', $url, ['headers' => ['Add-Padding' => 'true']])->getContent();
} catch (ExceptionInterface $e) {
if ($constraint->skipOnError) {
return;
}

throw $e;
}

foreach (explode("\r\n", $result) as $line) {
if (!str_contains($line, ':')) {
continue;
}

[$hashSuffix, $count] = explode(':', $line);

if ($hashPrefix.$hashSuffix === $hash && $constraint->threshold <= (int) $count) {
$this->context->buildViolation($constraint->message)
->setCode(NotCompromisedPassword::COMPROMISED_PASSWORD_ERROR)
->addViolation();

return;
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class CssColor extends Constraint
{
public const HEX_LONG = 'hex_long';
public const HEX_LONG_WITH_ALPHA = 'hex_long_with_alpha';
public const HEX_SHORT = 'hex_short';
public const HEX_SHORT_WITH_ALPHA = 'hex_short_with_alpha';
public const BASIC_NAMED_COLORS = 'basic_named_colors';
public const EXTENDED_NAMED_COLORS = 'extended_named_colors';
public const SYSTEM_COLORS = 'system_colors';
public const KEYWORDS = 'keywords';
public const RGB = 'rgb';
public const RGBA = 'rgba';
public const HSL = 'hsl';
public const HSLA = 'hsla';
public const INVALID_FORMAT_ERROR = '454ab47b-aacf-4059-8f26-184b2dc9d48d';

protected const ERROR_NAMES = [
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;




private static array $validationModes = [
self::HEX_LONG,
self::HEX_LONG_WITH_ALPHA,
self::HEX_SHORT,
self::HEX_SHORT_WITH_ALPHA,
self::BASIC_NAMED_COLORS,
self::EXTENDED_NAMED_COLORS,
self::SYSTEM_COLORS,
self::KEYWORDS,
self::RGB,
self::RGBA,
self::HSL,
self::HSLA,
];

public $message = 'This value is not a valid CSS color.';
public $formats;




public function __construct($formats = [], ?string $message = null, ?array $groups = null, $payload = null, ?array $options = null)
{
$validationModesAsString = implode(', ', self::$validationModes);

if (!$formats) {
$options['value'] = self::$validationModes;
} elseif (\is_array($formats) && \is_string(key($formats))) {
$options = array_merge($formats, $options ?? []);
} elseif (\is_array($formats)) {
if ([] === array_intersect(self::$validationModes, $formats)) {
throw new InvalidArgumentException(\sprintf('The "formats" parameter value is not valid. It must contain one or more of the following values: "%s".', $validationModesAsString));
}

$options['value'] = $formats;
} elseif (\is_string($formats)) {
if (!\in_array($formats, self::$validationModes)) {
throw new InvalidArgumentException(\sprintf('The "formats" parameter value is not valid. It must contain one or more of the following values: "%s".', $validationModesAsString));
}

$options['value'] = [$formats];
} else {
throw new InvalidArgumentException('The "formats" parameter type is not valid. It should be a string or an array.');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}

public function getDefaultOption(): string
{
return 'formats';
}

public function getRequiredOptions(): array
{
return ['formats'];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;







class UlidValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Ulid) {
throw new UnexpectedTypeException($constraint, Ulid::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (26 !== \strlen($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(26 > \strlen($value) ? Ulid::TOO_SHORT_ERROR : Ulid::TOO_LONG_ERROR)
->addViolation();

return;
}

if (\strlen($value) !== strspn($value, '0123456789ABCDEFGHJKMNPQRSTVWXYZabcdefghjkmnpqrstvwxyz')) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Ulid::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}



if ($value[0] > '7') {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Ulid::TOO_LARGE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NotIdenticalTo extends AbstractComparison
{
public const IS_IDENTICAL_ERROR = '4aaac518-0dda-4129-a6d9-e216b9b454a0';

protected const ERROR_NAMES = [
self::IS_IDENTICAL_ERROR => 'IS_IDENTICAL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Choice extends Constraint
{
public const NO_SUCH_CHOICE_ERROR = '8e179f1b-97aa-4560-a02f-2a8b42e49df7';
public const TOO_FEW_ERROR = '11edd7eb-5872-4b6e-9f12-89923999fd0e';
public const TOO_MANY_ERROR = '9bd98e49-211c-433f-8630-fd1c2d0f08c3';

protected const ERROR_NAMES = [
self::NO_SUCH_CHOICE_ERROR => 'NO_SUCH_CHOICE_ERROR',
self::TOO_FEW_ERROR => 'TOO_FEW_ERROR',
self::TOO_MANY_ERROR => 'TOO_MANY_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $choices;

public $callback;
public $multiple = false;
public $strict = true;
public $min;
public $max;
public $message = 'The value you selected is not a valid choice.';
public $multipleMessage = 'One or more of the given values is invalid.';
public $minMessage = 'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.';
public $maxMessage = 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.';
public bool $match = true;

public function getDefaultOption(): ?string
{
return 'choices';
}

public function __construct(
string|array $options = [],
?array $choices = null,
callable|string|null $callback = null,
?bool $multiple = null,
?bool $strict = null,
?int $min = null,
?int $max = null,
?string $message = null,
?string $multipleMessage = null,
?string $minMessage = null,
?string $maxMessage = null,
?array $groups = null,
mixed $payload = null,
?bool $match = null,
) {
if (\is_array($options) && $options && array_is_list($options)) {
$choices ??= $options;
$options = [];
}
if (null !== $choices) {
$options['value'] = $choices;
}

parent::__construct($options, $groups, $payload);

$this->callback = $callback ?? $this->callback;
$this->multiple = $multiple ?? $this->multiple;
$this->strict = $strict ?? $this->strict;
$this->min = $min ?? $this->min;
$this->max = $max ?? $this->max;
$this->message = $message ?? $this->message;
$this->multipleMessage = $multipleMessage ?? $this->multipleMessage;
$this->minMessage = $minMessage ?? $this->minMessage;
$this->maxMessage = $maxMessage ?? $this->maxMessage;
$this->match = $match ?? $this->match;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class CountValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Count) {
throw new UnexpectedTypeException($constraint, Count::class);
}

if (null === $value) {
return;
}

if (!\is_array($value) && !$value instanceof \Countable) {
throw new UnexpectedValueException($value, 'array|\Countable');
}

$count = \count($value);

if (null !== $constraint->max && $count > $constraint->max) {
$exactlyOptionEnabled = $constraint->min == $constraint->max;

$this->context->buildViolation($exactlyOptionEnabled ? $constraint->exactMessage : $constraint->maxMessage)
->setParameter('{{ count }}', $count)
->setParameter('{{ limit }}', $constraint->max)
->setInvalidValue($value)
->setPlural((int) $constraint->max)
->setCode($exactlyOptionEnabled ? Count::NOT_EQUAL_COUNT_ERROR : Count::TOO_MANY_ERROR)
->addViolation();

return;
}

if (null !== $constraint->min && $count < $constraint->min) {
$exactlyOptionEnabled = $constraint->min == $constraint->max;

$this->context->buildViolation($exactlyOptionEnabled ? $constraint->exactMessage : $constraint->minMessage)
->setParameter('{{ count }}', $count)
->setParameter('{{ limit }}', $constraint->min)
->setInvalidValue($value)
->setPlural((int) $constraint->min)
->setCode($exactlyOptionEnabled ? Count::NOT_EQUAL_COUNT_ERROR : Count::TOO_FEW_ERROR)
->addViolation();

return;
}

if (null !== $constraint->divisibleBy) {
$this->context
->getValidator()
->inContext($this->context)
->validate($count, [
new DivisibleBy([
'value' => $constraint->divisibleBy,
'message' => $constraint->divisibleByMessage,
]),
], $this->context->getGroup());
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Countries;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Country extends Constraint
{
public const NO_SUCH_COUNTRY_ERROR = '8f900c12-61bd-455d-9398-996cd040f7f0';

protected const ERROR_NAMES = [
self::NO_SUCH_COUNTRY_ERROR => 'NO_SUCH_COUNTRY_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid country.';
public $alpha3 = false;

public function __construct(
?array $options = null,
?string $message = null,
?bool $alpha3 = null,
?array $groups = null,
mixed $payload = null,
) {
if (!class_exists(Countries::class)) {
throw new LogicException('The Intl component is required to use the Country constraint. Try running "composer require symfony/intl".');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->alpha3 = $alpha3 ?? $this->alpha3;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class BlankValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Blank) {
throw new UnexpectedTypeException($constraint, Blank::class);
}

if ('' !== $value && null !== $value) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Blank::NOT_BLANK_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class LengthValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Length) {
throw new UnexpectedTypeException($constraint, Length::class);
}

if (null === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$stringValue = (string) $value;

if (null !== $constraint->normalizer) {
$stringValue = ($constraint->normalizer)($stringValue);
}

try {
$invalidCharset = !@mb_check_encoding($stringValue, $constraint->charset);
} catch (\ValueError $e) {
if (!str_starts_with($e->getMessage(), 'mb_check_encoding(): Argument #2 ($encoding) must be a valid encoding')) {
throw $e;
}

$invalidCharset = true;
}

$length = $invalidCharset ? 0 : match ($constraint->countUnit) {
Length::COUNT_BYTES => \strlen($stringValue),
Length::COUNT_CODEPOINTS => mb_strlen($stringValue, $constraint->charset),
Length::COUNT_GRAPHEMES => grapheme_strlen($stringValue),
};

if ($invalidCharset || false === ($length ?? false)) {
$this->context->buildViolation($constraint->charsetMessage)
->setParameter('{{ value }}', $this->formatValue($stringValue))
->setParameter('{{ charset }}', $constraint->charset)
->setInvalidValue($value)
->setCode(Length::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}

if (null !== $constraint->max && $length > $constraint->max) {
$exactlyOptionEnabled = $constraint->min == $constraint->max;

$this->context->buildViolation($exactlyOptionEnabled ? $constraint->exactMessage : $constraint->maxMessage)
->setParameter('{{ value }}', $this->formatValue($stringValue))
->setParameter('{{ limit }}', $constraint->max)
->setParameter('{{ value_length }}', $length)
->setInvalidValue($value)
->setPlural((int) $constraint->max)
->setCode($exactlyOptionEnabled ? Length::NOT_EQUAL_LENGTH_ERROR : Length::TOO_LONG_ERROR)
->addViolation();

return;
}

if (null !== $constraint->min && $length < $constraint->min) {
$exactlyOptionEnabled = $constraint->min == $constraint->max;

$this->context->buildViolation($exactlyOptionEnabled ? $constraint->exactMessage : $constraint->minMessage)
->setParameter('{{ value }}', $this->formatValue($stringValue))
->setParameter('{{ limit }}', $constraint->min)
->setParameter('{{ value_length }}', $length)
->setInvalidValue($value)
->setPlural((int) $constraint->min)
->setCode($exactlyOptionEnabled ? Length::NOT_EQUAL_LENGTH_ERROR : Length::TOO_SHORT_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class EqualToValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return $value1 == $value2;
}

protected function getErrorCode(): ?string
{
return EqualTo::NOT_EQUAL_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;






#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Ulid extends Constraint
{
public const TOO_SHORT_ERROR = '7b44804e-37d5-4df4-9bdd-b738d4a45bb4';
public const TOO_LONG_ERROR = '9608249f-6da1-4d53-889e-9864b58c4d37';
public const INVALID_CHARACTERS_ERROR = 'e4155739-5135-4258-9c81-ae7b44b5311e';
public const TOO_LARGE_ERROR = 'df8cfb9a-ce6d-4a69-ae5a-eea7ab6f278b';

protected const ERROR_NAMES = [
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::TOO_LARGE_ERROR => 'TOO_LARGE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This is not a valid ULID.';

public function __construct(
?array $options = null,
?string $message = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NotBlank extends Constraint
{
public const IS_BLANK_ERROR = 'c1051bb4-d103-4f74-8988-acbcafc7fdc3';

protected const ERROR_NAMES = [
self::IS_BLANK_ERROR => 'IS_BLANK_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should not be blank.';
public $allowNull = false;

public $normalizer;

public function __construct(?array $options = null, ?string $message = null, ?bool $allowNull = null, ?callable $normalizer = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
$this->allowNull = $allowNull ?? $this->allowNull;
$this->normalizer = $normalizer ?? $this->normalizer;

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class IsFalseValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof IsFalse) {
throw new UnexpectedTypeException($constraint, IsFalse::class);
}

if (null === $value || false === $value || 0 === $value || '0' === $value) {
return;
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(IsFalse::NOT_FALSE_ERROR)
->addViolation();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Isin extends Constraint
{
public const VALIDATION_LENGTH = 12;
public const VALIDATION_PATTERN = '/[A-Z]{2}[A-Z0-9]{9}[0-9]{1}/';

public const INVALID_LENGTH_ERROR = '88738dfc-9ed5-ba1e-aebe-402a2a9bf58e';
public const INVALID_PATTERN_ERROR = '3d08ce0-ded9-a93d-9216-17ac21265b65e';
public const INVALID_CHECKSUM_ERROR = '32089b-0ee1-93ba-399e-aa232e62f2d29d';

protected const ERROR_NAMES = [
self::INVALID_LENGTH_ERROR => 'INVALID_LENGTH_ERROR',
self::INVALID_PATTERN_ERROR => 'INVALID_PATTERN_ERROR',
self::INVALID_CHECKSUM_ERROR => 'INVALID_CHECKSUM_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid International Securities Identification Number (ISIN).';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class ValidValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Valid) {
throw new UnexpectedTypeException($constraint, Valid::class);
}

if (null === $value) {
return;
}

$this->context
->getValidator()
->inContext($this->context)
->validate($value, null, $this->context->getGroup());
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;










#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class CardScheme extends Constraint
{
public const AMEX = 'AMEX';
public const CHINA_UNIONPAY = 'CHINA_UNIONPAY';
public const DINERS = 'DINERS';
public const DISCOVER = 'DISCOVER';
public const INSTAPAYMENT = 'INSTAPAYMENT';
public const JCB = 'JCB';
public const LASER = 'LASER';
public const MAESTRO = 'MAESTRO';
public const MASTERCARD = 'MASTERCARD';
public const MIR = 'MIR';
public const UATP = 'UATP';
public const VISA = 'VISA';

public const NOT_NUMERIC_ERROR = 'a2ad9231-e827-485f-8a1e-ef4d9a6d5c2e';
public const INVALID_FORMAT_ERROR = 'a8faedbf-1c2f-4695-8d22-55783be8efed';

protected const ERROR_NAMES = [
self::NOT_NUMERIC_ERROR => 'NOT_NUMERIC_ERROR',
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'Unsupported card type or invalid card number.';
public $schemes;

public function __construct(array|string|null $schemes, ?string $message = null, ?array $groups = null, mixed $payload = null, array $options = [])
{
if (\is_array($schemes) && \is_string(key($schemes))) {
$options = array_merge($schemes, $options);
} elseif (null !== $schemes) {
$options['value'] = $schemes;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}

public function getDefaultOption(): ?string
{
return 'schemes';
}

public function getRequiredOptions(): array
{
return ['schemes'];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MissingOptionsException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Count extends Constraint
{
public const TOO_FEW_ERROR = 'bef8e338-6ae5-4caf-b8e2-50e7b0579e69';
public const TOO_MANY_ERROR = '756b1212-697c-468d-a9ad-50dd783bb169';
public const NOT_EQUAL_COUNT_ERROR = '9fe5d43f-3784-4ece-a0e1-473fc02dadbc';
public const NOT_DIVISIBLE_BY_ERROR = DivisibleBy::NOT_DIVISIBLE_BY;

protected const ERROR_NAMES = [
self::TOO_FEW_ERROR => 'TOO_FEW_ERROR',
self::TOO_MANY_ERROR => 'TOO_MANY_ERROR',
self::NOT_EQUAL_COUNT_ERROR => 'NOT_EQUAL_COUNT_ERROR',
self::NOT_DIVISIBLE_BY_ERROR => 'NOT_DIVISIBLE_BY_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $minMessage = 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.';
public $maxMessage = 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.';
public $exactMessage = 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.';
public $divisibleByMessage = 'The number of elements in this collection should be a multiple of {{ compared_value }}.';
public $min;
public $max;
public $divisibleBy;

public function __construct(
int|array|null $exactly = null,
?int $min = null,
?int $max = null,
?int $divisibleBy = null,
?string $exactMessage = null,
?string $minMessage = null,
?string $maxMessage = null,
?string $divisibleByMessage = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
) {
if (\is_array($exactly)) {
$options = array_merge($exactly, $options);
$exactly = $options['value'] ?? null;
}

$min ??= $options['min'] ?? null;
$max ??= $options['max'] ?? null;

unset($options['value'], $options['min'], $options['max']);

if (null !== $exactly && null === $min && null === $max) {
$min = $max = $exactly;
}

parent::__construct($options, $groups, $payload);

$this->min = $min;
$this->max = $max;
$this->divisibleBy = $divisibleBy ?? $this->divisibleBy;
$this->exactMessage = $exactMessage ?? $this->exactMessage;
$this->minMessage = $minMessage ?? $this->minMessage;
$this->maxMessage = $maxMessage ?? $this->maxMessage;
$this->divisibleByMessage = $divisibleByMessage ?? $this->divisibleByMessage;

if (null === $this->min && null === $this->max && null === $this->divisibleBy) {
throw new MissingOptionsException(\sprintf('Either option "min", "max" or "divisibleBy" must be given for constraint "%s".', __CLASS__), ['min', 'max', 'divisibleBy']);
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;






abstract class Compound extends Composite
{

public $constraints = [];

public function __construct(mixed $options = null)
{
if (isset($options[$this->getCompositeOption()])) {
throw new ConstraintDefinitionException(\sprintf('You can\'t redefine the "%s" option. Use the "%s::getConstraints()" method instead.', $this->getCompositeOption(), __CLASS__));
}

$this->constraints = $this->getConstraints($this->normalizeOptions($options));

parent::__construct($options);
}

final protected function getCompositeOption(): string
{
return 'constraints';
}

final public function validatedBy(): string
{
return CompoundValidator::class;
}




abstract protected function getConstraints(array $options): array;
}
<?php










namespace Symfony\Component\Validator\Constraints;







class LessThanValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return null === $value2 || $value1 < $value2;
}

protected function getErrorCode(): ?string
{
return LessThan::TOO_HIGH_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

trigger_deprecation('symfony/validator', '6.1', 'The "%s" constraint is deprecated since symfony 6.1, use "ExpressionSyntax" instead.', ExpressionLanguageSyntax::class);









#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class ExpressionLanguageSyntax extends Constraint
{
public const EXPRESSION_LANGUAGE_SYNTAX_ERROR = '1766a3f3-ff03-40eb-b053-ab7aa23d988a';

protected const ERROR_NAMES = [
self::EXPRESSION_LANGUAGE_SYNTAX_ERROR => 'EXPRESSION_LANGUAGE_SYNTAX_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be a valid expression.';
public $service;
public $allowedVariables;

public function __construct(?array $options = null, ?string $message = null, ?string $service = null, ?array $allowedVariables = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->service = $service ?? $this->service;
$this->allowedVariables = $allowedVariables ?? $this->allowedVariables;
}

public function validatedBy(): string
{
return $this->service ?? static::class.'Validator';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class AllValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof All) {
throw new UnexpectedTypeException($constraint, All::class);
}

if (null === $value) {
return;
}

if (!\is_array($value) && !$value instanceof \Traversable) {
throw new UnexpectedValueException($value, 'iterable');
}

$context = $this->context;

$validator = $context->getValidator()->inContext($context);

foreach ($value as $key => $element) {
$validator->atPath('['.$key.']')->validate($element, $constraint->constraints);
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NoSuspiciousCharacters extends Constraint
{
public const RESTRICTION_LEVEL_ERROR = '1ece07dc-dca2-45f1-ba47-8d7dc3a12774';
public const INVISIBLE_ERROR = '6ed60e6c-179b-4e93-8a6c-667d85c6de5e';
public const MIXED_NUMBERS_ERROR = '9f01fc26-3bc4-44b1-a6b1-c08e2412053a';
public const HIDDEN_OVERLAY_ERROR = '56380dc5-0476-4f04-bbaa-b68cd1c2d974';

protected const ERROR_NAMES = [
self::RESTRICTION_LEVEL_ERROR => 'RESTRICTION_LEVEL_ERROR',
self::INVISIBLE_ERROR => 'INVISIBLE_ERROR',
self::MIXED_NUMBERS_ERROR => 'MIXED_NUMBERS_ERROR',
self::HIDDEN_OVERLAY_ERROR => 'INVALID_CASE_ERROR',
];





public const CHECK_INVISIBLE = 32;





public const CHECK_MIXED_NUMBERS = 128;





public const CHECK_HIDDEN_OVERLAY = 256;


public const RESTRICTION_LEVEL_ASCII = 268435456;


public const RESTRICTION_LEVEL_SINGLE_SCRIPT = 536870912;


public const RESTRICTION_LEVEL_HIGH = 805306368;


public const RESTRICTION_LEVEL_MODERATE = 1073741824;


public const RESTRICTION_LEVEL_MINIMAL = 1342177280;


public const RESTRICTION_LEVEL_NONE = 1610612736;

public string $restrictionLevelMessage = 'This value contains characters that are not allowed by the current restriction-level.';
public string $invisibleMessage = 'Using invisible characters is not allowed.';
public string $mixedNumbersMessage = 'Mixing numbers from different scripts is not allowed.';
public string $hiddenOverlayMessage = 'Using hidden overlay characters is not allowed.';

public int $checks = self::CHECK_INVISIBLE | self::CHECK_MIXED_NUMBERS | self::CHECK_HIDDEN_OVERLAY;
public ?int $restrictionLevel = null;
public ?array $locales = null;





public function __construct(
?array $options = null,
?string $restrictionLevelMessage = null,
?string $invisibleMessage = null,
?string $mixedNumbersMessage = null,
?string $hiddenOverlayMessage = null,
?int $checks = null,
?int $restrictionLevel = null,
?array $locales = null,
?array $groups = null,
mixed $payload = null,
) {
if (!class_exists(\Spoofchecker::class)) {
throw new LogicException('The intl extension is required to use the NoSuspiciousCharacters constraint.');
}

parent::__construct($options, $groups, $payload);

$this->restrictionLevelMessage = $restrictionLevelMessage ?? $this->restrictionLevelMessage;
$this->invisibleMessage = $invisibleMessage ?? $this->invisibleMessage;
$this->mixedNumbersMessage = $mixedNumbersMessage ?? $this->mixedNumbersMessage;
$this->hiddenOverlayMessage = $hiddenOverlayMessage ?? $this->hiddenOverlayMessage;
$this->checks = $checks ?? $this->checks;
$this->restrictionLevel = $restrictionLevel ?? $this->restrictionLevel;
$this->locales = $locales ?? $this->locales;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;













class UuidValidator extends ConstraintValidator
{








public const STRICT_LENGTH = 36;
public const STRICT_FIRST_HYPHEN_POSITION = 8;
public const STRICT_LAST_HYPHEN_POSITION = 23;
public const STRICT_VERSION_POSITION = 14;
public const STRICT_VARIANT_POSITION = 19;













public const LOOSE_MAX_LENGTH = 39;
public const LOOSE_FIRST_HYPHEN_POSITION = 4;




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Uuid) {
throw new UnexpectedTypeException($constraint, Uuid::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

if ($constraint->strict) {
$this->validateStrict($value, $constraint);

return;
}

$this->validateLoose($value, $constraint);
}

private function validateLoose(string $value, Uuid $constraint): void
{






$trimmed = trim($value, '[]{}');


$h = self::LOOSE_FIRST_HYPHEN_POSITION;


$l = self::LOOSE_MAX_LENGTH;

for ($i = 0; $i < $l; ++$i) {

if (!isset($trimmed[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::TOO_SHORT_ERROR)
->addViolation();

return;
}




if ('-' === $trimmed[$i]) {
if ($i !== $h) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_HYPHEN_PLACEMENT_ERROR)
->addViolation();

return;
}

$h += 5;

continue;
}


if ($i === $h) {
$h += 4;
--$l;
}


if (!ctype_xdigit($trimmed[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}
}


if (isset($trimmed[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::TOO_LONG_ERROR)
->addViolation();
}
}

private function validateStrict(string $value, Uuid $constraint): void
{








$h = self::STRICT_FIRST_HYPHEN_POSITION;

for ($i = 0; $i < self::STRICT_LENGTH; ++$i) {

if (!isset($value[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::TOO_SHORT_ERROR)
->addViolation();

return;
}




if ('-' === $value[$i]) {
if ($i !== $h) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_HYPHEN_PLACEMENT_ERROR)
->addViolation();

return;
}



if ($h < self::STRICT_LAST_HYPHEN_POSITION) {
$h += 5;
}

continue;
}


if (!ctype_xdigit($value[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}


if ($i === $h) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_HYPHEN_PLACEMENT_ERROR)
->addViolation();

return;
}
}


if (isset($value[$i])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::TOO_LONG_ERROR)
->addViolation();
}


if (!\in_array($value[self::STRICT_VERSION_POSITION], $constraint->versions)) {
$code = Uuid::TIME_BASED_VERSIONS === $constraint->versions ? Uuid::INVALID_TIME_BASED_VERSION_ERROR : Uuid::INVALID_VERSION_ERROR;

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($code)
->addViolation();
}





if (8 !== (hexdec($value[self::STRICT_VARIANT_POSITION]) & 12)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Uuid::INVALID_VARIANT_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class IsinValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Isin) {
throw new UnexpectedTypeException($constraint, Isin::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = strtoupper($value);

if (Isin::VALIDATION_LENGTH !== \strlen($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Isin::INVALID_LENGTH_ERROR)
->addViolation();

return;
}

if (!preg_match(Isin::VALIDATION_PATTERN, $value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Isin::INVALID_PATTERN_ERROR)
->addViolation();

return;
}

if (!$this->isCorrectChecksum($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Isin::INVALID_CHECKSUM_ERROR)
->addViolation();
}
}

private function isCorrectChecksum(string $input): bool
{
$characters = str_split($input);
foreach ($characters as $i => $char) {
$characters[$i] = \intval($char, 36);
}
$number = implode('', $characters);

return 0 === $this->context->getValidator()->validate($number, new Luhn())->count();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Egulias\EmailValidator\EmailValidator as EguliasEmailValidator;
use Egulias\EmailValidator\Validation\EmailValidation;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\InvalidArgumentException;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class EmailValidator extends ConstraintValidator
{
private const PATTERN_HTML5_ALLOW_NO_TLD = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/D';
private const PATTERN_HTML5 = '/^[a-zA-Z0-9.!#$%&\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/D';
private const PATTERN_LOOSE = '/^.+\@\S+\.\S+$/D';

private const EMAIL_PATTERNS = [
Email::VALIDATION_MODE_LOOSE => self::PATTERN_LOOSE,
Email::VALIDATION_MODE_HTML5 => self::PATTERN_HTML5,
Email::VALIDATION_MODE_HTML5_ALLOW_NO_TLD => self::PATTERN_HTML5_ALLOW_NO_TLD,
];

private string $defaultMode;

public function __construct(string $defaultMode = Email::VALIDATION_MODE_LOOSE)
{
if (!\in_array($defaultMode, Email::VALIDATION_MODES, true)) {
throw new InvalidArgumentException('The "defaultMode" parameter value is not valid.');
}

if (Email::VALIDATION_MODE_LOOSE === $defaultMode) {
trigger_deprecation('symfony/validator', '6.2', 'The "%s" mode is deprecated. It will be removed in 7.0 and the default mode will be changed to "%s".', Email::VALIDATION_MODE_LOOSE, Email::VALIDATION_MODE_HTML5);
}

$this->defaultMode = $defaultMode;
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Email) {
throw new UnexpectedTypeException($constraint, Email::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
if ('' === $value) {
return;
}

if (null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

if (null === $constraint->mode) {
if (Email::VALIDATION_MODE_STRICT === $this->defaultMode && !class_exists(EguliasEmailValidator::class)) {
throw new LogicException(\sprintf('The "egulias/email-validator" component is required to make the "%s" constraint default to strict mode. Try running "composer require egulias/email-validator".', Email::class));
}

$constraint->mode = $this->defaultMode;
}

if (!\in_array($constraint->mode, Email::VALIDATION_MODES, true)) {
throw new InvalidArgumentException(\sprintf('The "%s::$mode" parameter value is not valid.', get_debug_type($constraint)));
}

if (Email::VALIDATION_MODE_STRICT === $constraint->mode) {
$strictValidator = new EguliasEmailValidator();

if (interface_exists(EmailValidation::class) && !$strictValidator->isValid($value, new NoRFCWarningsValidation())) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Email::INVALID_FORMAT_ERROR)
->addViolation();

return;
} elseif (!interface_exists(EmailValidation::class) && !$strictValidator->isValid($value, false, true)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Email::INVALID_FORMAT_ERROR)
->addViolation();

return;
}
} elseif (!preg_match(self::EMAIL_PATTERNS[$constraint->mode], $value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Email::INVALID_FORMAT_ERROR)
->addViolation();

return;
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class ExpressionSyntax extends Constraint
{
public const EXPRESSION_SYNTAX_ERROR = 'e219aa22-8b11-48ec-81a0-fc07cdb0e13f';

protected const ERROR_NAMES = [
self::EXPRESSION_SYNTAX_ERROR => 'EXPRESSION_SYNTAX_ERROR',
];

public $message = 'This value should be a valid expression.';
public $service;
public $allowedVariables;

public function __construct(?array $options = null, ?string $message = null, ?string $service = null, ?array $allowedVariables = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->service = $service ?? $this->service;
$this->allowedVariables = $allowedVariables ?? $this->allowedVariables;
}

public function validatedBy(): string
{
return $this->service ?? static::class.'Validator';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Exception\MissingResourceException;
use Symfony\Component\Intl\Timezones;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;







class TimezoneValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Timezone) {
throw new UnexpectedTypeException($constraint, Timezone::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if ($constraint->intlCompatible && 'Etc/Unknown' === \IntlTimeZone::createTimeZone($value)->getID()) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Timezone::TIMEZONE_IDENTIFIER_INTL_ERROR)
->addViolation();

return;
}

if (
\in_array($value, self::getPhpTimezones($constraint->zone, $constraint->countryCode), true)
|| \in_array($value, self::getIntlTimezones($constraint->zone, $constraint->countryCode), true)
) {
return;
}

if ($constraint->countryCode) {
$code = Timezone::TIMEZONE_IDENTIFIER_IN_COUNTRY_ERROR;
} elseif (\DateTimeZone::ALL !== $constraint->zone) {
$code = Timezone::TIMEZONE_IDENTIFIER_IN_ZONE_ERROR;
} else {
$code = Timezone::TIMEZONE_IDENTIFIER_ERROR;
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($code)
->addViolation();
}

private static function getPhpTimezones(int $zone, ?string $countryCode = null): array
{
if (null !== $countryCode) {
try {
return @\DateTimeZone::listIdentifiers($zone, $countryCode) ?: [];
} catch (\ValueError) {
return [];
}
}

return \DateTimeZone::listIdentifiers($zone);
}

private static function getIntlTimezones(int $zone, ?string $countryCode = null): array
{
if (!class_exists(Timezones::class)) {
return [];
}

if (null !== $countryCode) {
try {
return Timezones::forCountryCode($countryCode);
} catch (MissingResourceException) {
return [];
}
}

$timezones = Timezones::getIds();

if (\DateTimeZone::ALL === (\DateTimeZone::ALL & $zone)) {
return $timezones;
}

$filtered = [];
foreach ((new \ReflectionClass(\DateTimeZone::class))->getConstants() as $const => $flag) {
if ($flag !== ($flag & $zone)) {
continue;
}

$filtered[] = array_filter($timezones, static fn ($id) => 0 === stripos($id, $const.'/'));
}

return $filtered ? array_merge(...$filtered) : [];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

final class WhenValidator extends ConstraintValidator
{
public function __construct(private ?ExpressionLanguage $expressionLanguage = null)
{
}

public function validate(mixed $value, Constraint $constraint): void
{
if (!$constraint instanceof When) {
throw new UnexpectedTypeException($constraint, When::class);
}

$context = $this->context;
$variables = $constraint->values;
$variables['value'] = $value;
$variables['this'] = $context->getObject();

if ($this->getExpressionLanguage()->evaluate($constraint->expression, $variables)) {
$context->getValidator()->inContext($context)
->validate($value, $constraint->constraints);
}
}

private function getExpressionLanguage(): ExpressionLanguage
{
if (!class_exists(ExpressionLanguage::class)) {
throw new LogicException(\sprintf('The "symfony/expression-language" component is required to use the "%s" validator. Try running "composer require symfony/expression-language".', __CLASS__));
}

return $this->expressionLanguage ??= new ExpressionLanguage();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NotNull extends Constraint
{
public const IS_NULL_ERROR = 'ad32d13f-c3d4-423b-909a-857b961eb720';

protected const ERROR_NAMES = [
self::IS_NULL_ERROR => 'IS_NULL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should not be null.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class JsonValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Json) {
throw new UnexpectedTypeException($constraint, Json::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (!json_validate($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Json::INVALID_JSON_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Json extends Constraint
{
public const INVALID_JSON_ERROR = '0789c8ad-2d2b-49a4-8356-e2ce63998504';

protected const ERROR_NAMES = [
self::INVALID_JSON_ERROR => 'INVALID_JSON_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be valid JSON.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class PositiveOrZero extends GreaterThanOrEqual
{
use ZeroComparisonConstraintTrait;

public $message = 'This value should be either positive or zero.';
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NegativeOrZero extends LessThanOrEqual
{
use ZeroComparisonConstraintTrait;

public $message = 'This value should be either negative or zero.';
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class EqualTo extends AbstractComparison
{
public const NOT_EQUAL_ERROR = '478618a7-95ba-473d-9101-cabd45e49115';

protected const ERROR_NAMES = [
self::NOT_EQUAL_ERROR => 'NOT_EQUAL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be equal to {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Currencies;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;







class CurrencyValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Currency) {
throw new UnexpectedTypeException($constraint, Currency::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (!Currencies::exists($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Currency::NO_SUCH_CURRENCY_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;









#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Isbn extends Constraint
{
public const ISBN_10 = 'isbn10';
public const ISBN_13 = 'isbn13';

public const TOO_SHORT_ERROR = '949acbb0-8ef5-43ed-a0e9-032dfd08ae45';
public const TOO_LONG_ERROR = '3171387d-f80a-47b3-bd6e-60598545316a';
public const INVALID_CHARACTERS_ERROR = '23d21cea-da99-453d-98b1-a7d916fbb339';
public const CHECKSUM_FAILED_ERROR = '2881c032-660f-46b6-8153-d352d9706640';
public const TYPE_NOT_RECOGNIZED_ERROR = 'fa54a457-f042-441f-89c4-066ee5bdd3e1';

protected const ERROR_NAMES = [
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::CHECKSUM_FAILED_ERROR => 'CHECKSUM_FAILED_ERROR',
self::TYPE_NOT_RECOGNIZED_ERROR => 'TYPE_NOT_RECOGNIZED_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $isbn10Message = 'This value is not a valid ISBN-10.';
public $isbn13Message = 'This value is not a valid ISBN-13.';
public $bothIsbnMessage = 'This value is neither a valid ISBN-10 nor a valid ISBN-13.';
public $type;
public $message;

public function __construct(
string|array|null $type = null,
?string $message = null,
?string $isbn10Message = null,
?string $isbn13Message = null,
?string $bothIsbnMessage = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
) {
if (\is_array($type)) {
$options = array_merge($type, $options);
} elseif (null !== $type) {
$options['value'] = $type;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->isbn10Message = $isbn10Message ?? $this->isbn10Message;
$this->isbn13Message = $isbn13Message ?? $this->isbn13Message;
$this->bothIsbnMessage = $bothIsbnMessage ?? $this->bothIsbnMessage;
}

public function getDefaultOption(): ?string
{
return 'type';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class CollectionValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Collection) {
throw new UnexpectedTypeException($constraint, Collection::class);
}

if (null === $value) {
return;
}

if (!\is_array($value) && !($value instanceof \Traversable && $value instanceof \ArrayAccess)) {
throw new UnexpectedValueException($value, 'array|(Traversable&ArrayAccess)');
}










$context = $this->context;

foreach ($constraint->fields as $field => $fieldConstraint) {
$existsInArray = \is_array($value) && \array_key_exists($field, $value);
$existsInArrayAccess = $value instanceof \ArrayAccess && $value->offsetExists($field);

if ($existsInArray || $existsInArrayAccess) {
if (\count($fieldConstraint->constraints) > 0) {
$context->getValidator()
->inContext($context)
->atPath('['.$field.']')
->validate($value[$field], $fieldConstraint->constraints);
}
} elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
$context->buildViolation($constraint->missingFieldsMessage)
->atPath('['.$field.']')
->setParameter('{{ field }}', $this->formatValue($field))
->setInvalidValue(null)
->setCode(Collection::MISSING_FIELD_ERROR)
->addViolation();
}
}

if (!$constraint->allowExtraFields) {
foreach ($value as $field => $fieldValue) {
if (!isset($constraint->fields[$field])) {
$context->buildViolation($constraint->extraFieldsMessage)
->atPath('['.$field.']')
->setParameter('{{ field }}', $this->formatValue($field))
->setInvalidValue($fieldValue)
->setCode(Collection::NO_SUCH_FIELD_ERROR)
->addViolation();
}
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;








class ImageValidator extends FileValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Image) {
throw new UnexpectedTypeException($constraint, Image::class);
}

$violations = \count($this->context->getViolations());

parent::validate($value, $constraint);

$failed = \count($this->context->getViolations()) !== $violations;

if ($failed || null === $value || '' === $value) {
return;
}

if (null === $constraint->minWidth && null === $constraint->maxWidth
&& null === $constraint->minHeight && null === $constraint->maxHeight
&& null === $constraint->minPixels && null === $constraint->maxPixels
&& null === $constraint->minRatio && null === $constraint->maxRatio
&& $constraint->allowSquare && $constraint->allowLandscape && $constraint->allowPortrait
&& !$constraint->detectCorrupted) {
return;
}

$size = @getimagesize($value);

if (empty($size) || (0 === $size[0]) || (0 === $size[1])) {
$this->context->buildViolation($constraint->sizeNotDetectedMessage)
->setCode(Image::SIZE_NOT_DETECTED_ERROR)
->addViolation();

return;
}

$width = $size[0];
$height = $size[1];

if ($constraint->minWidth) {
if (!ctype_digit((string) $constraint->minWidth)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid minimum width.', $constraint->minWidth));
}

if ($width < $constraint->minWidth) {
$this->context->buildViolation($constraint->minWidthMessage)
->setParameter('{{ width }}', $width)
->setParameter('{{ min_width }}', $constraint->minWidth)
->setCode(Image::TOO_NARROW_ERROR)
->addViolation();

return;
}
}

if ($constraint->maxWidth) {
if (!ctype_digit((string) $constraint->maxWidth)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid maximum width.', $constraint->maxWidth));
}

if ($width > $constraint->maxWidth) {
$this->context->buildViolation($constraint->maxWidthMessage)
->setParameter('{{ width }}', $width)
->setParameter('{{ max_width }}', $constraint->maxWidth)
->setCode(Image::TOO_WIDE_ERROR)
->addViolation();

return;
}
}

if ($constraint->minHeight) {
if (!ctype_digit((string) $constraint->minHeight)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid minimum height.', $constraint->minHeight));
}

if ($height < $constraint->minHeight) {
$this->context->buildViolation($constraint->minHeightMessage)
->setParameter('{{ height }}', $height)
->setParameter('{{ min_height }}', $constraint->minHeight)
->setCode(Image::TOO_LOW_ERROR)
->addViolation();

return;
}
}

if ($constraint->maxHeight) {
if (!ctype_digit((string) $constraint->maxHeight)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid maximum height.', $constraint->maxHeight));
}

if ($height > $constraint->maxHeight) {
$this->context->buildViolation($constraint->maxHeightMessage)
->setParameter('{{ height }}', $height)
->setParameter('{{ max_height }}', $constraint->maxHeight)
->setCode(Image::TOO_HIGH_ERROR)
->addViolation();
}
}

$pixels = $width * $height;

if (null !== $constraint->minPixels) {
if (!ctype_digit((string) $constraint->minPixels)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid minimum amount of pixels.', $constraint->minPixels));
}

if ($pixels < $constraint->minPixels) {
$this->context->buildViolation($constraint->minPixelsMessage)
->setParameter('{{ pixels }}', $pixels)
->setParameter('{{ min_pixels }}', $constraint->minPixels)
->setParameter('{{ height }}', $height)
->setParameter('{{ width }}', $width)
->setCode(Image::TOO_FEW_PIXEL_ERROR)
->addViolation();
}
}

if (null !== $constraint->maxPixels) {
if (!ctype_digit((string) $constraint->maxPixels)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid maximum amount of pixels.', $constraint->maxPixels));
}

if ($pixels > $constraint->maxPixels) {
$this->context->buildViolation($constraint->maxPixelsMessage)
->setParameter('{{ pixels }}', $pixels)
->setParameter('{{ max_pixels }}', $constraint->maxPixels)
->setParameter('{{ height }}', $height)
->setParameter('{{ width }}', $width)
->setCode(Image::TOO_MANY_PIXEL_ERROR)
->addViolation();
}
}

$ratio = round($width / $height, 2);

if (null !== $constraint->minRatio) {
if (!is_numeric((string) $constraint->minRatio)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid minimum ratio.', $constraint->minRatio));
}

if ($ratio < round($constraint->minRatio, 2)) {
$this->context->buildViolation($constraint->minRatioMessage)
->setParameter('{{ ratio }}', $ratio)
->setParameter('{{ min_ratio }}', round($constraint->minRatio, 2))
->setCode(Image::RATIO_TOO_SMALL_ERROR)
->addViolation();
}
}

if (null !== $constraint->maxRatio) {
if (!is_numeric((string) $constraint->maxRatio)) {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid maximum ratio.', $constraint->maxRatio));
}

if ($ratio > round($constraint->maxRatio, 2)) {
$this->context->buildViolation($constraint->maxRatioMessage)
->setParameter('{{ ratio }}', $ratio)
->setParameter('{{ max_ratio }}', round($constraint->maxRatio, 2))
->setCode(Image::RATIO_TOO_BIG_ERROR)
->addViolation();
}
}

if (!$constraint->allowSquare && $width == $height) {
$this->context->buildViolation($constraint->allowSquareMessage)
->setParameter('{{ width }}', $width)
->setParameter('{{ height }}', $height)
->setCode(Image::SQUARE_NOT_ALLOWED_ERROR)
->addViolation();
}

if (!$constraint->allowLandscape && $width > $height) {
$this->context->buildViolation($constraint->allowLandscapeMessage)
->setParameter('{{ width }}', $width)
->setParameter('{{ height }}', $height)
->setCode(Image::LANDSCAPE_NOT_ALLOWED_ERROR)
->addViolation();
}

if (!$constraint->allowPortrait && $width < $height) {
$this->context->buildViolation($constraint->allowPortraitMessage)
->setParameter('{{ width }}', $width)
->setParameter('{{ height }}', $height)
->setCode(Image::PORTRAIT_NOT_ALLOWED_ERROR)
->addViolation();
}

if ($constraint->detectCorrupted) {
if (!\function_exists('imagecreatefromstring')) {
throw new LogicException('Corrupted images detection requires installed and enabled GD extension.');
}

$resource = @imagecreatefromstring(file_get_contents($value));

if (false === $resource) {
$this->context->buildViolation($constraint->corruptedMessage)
->setCode(Image::CORRUPTED_IMAGE_ERROR)
->addViolation();

return;
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;













abstract class Composite extends Constraint
{





















public function __construct(mixed $options = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->initializeNestedConstraints();


$compositeOption = $this->getCompositeOption();
$nestedConstraints = $this->$compositeOption;

if (!\is_array($nestedConstraints)) {
$nestedConstraints = [$nestedConstraints];
}

foreach ($nestedConstraints as $constraint) {
if (!$constraint instanceof Constraint) {
if (\is_object($constraint)) {
$constraint = $constraint::class;
}

throw new ConstraintDefinitionException(\sprintf('The value "%s" is not an instance of Constraint in constraint "%s".', $constraint, static::class));
}

if ($constraint instanceof Valid) {
throw new ConstraintDefinitionException(\sprintf('The constraint Valid cannot be nested inside constraint "%s". You can only declare the Valid constraint directly on a field or method.', static::class));
}
}

if (!isset(((array) $this)['groups'])) {
$mergedGroups = [];

foreach ($nestedConstraints as $constraint) {
foreach ($constraint->groups as $group) {
$mergedGroups[$group] = true;
}
}


$this->groups = array_keys($mergedGroups) ?: [self::DEFAULT_GROUP];
$this->$compositeOption = $nestedConstraints;

return;
}

foreach ($nestedConstraints as $constraint) {
if (isset(((array) $constraint)['groups'])) {
$excessGroups = array_diff($constraint->groups, $this->groups);

if (\count($excessGroups) > 0) {
throw new ConstraintDefinitionException(\sprintf('The group(s) "%s" passed to the constraint "%s" should also be passed to its containing constraint "%s".', implode('", "', $excessGroups), get_debug_type($constraint), static::class));
}
} else {
$constraint->groups = $this->groups;
}
}

$this->$compositeOption = $nestedConstraints;
}






public function addImplicitGroupName(string $group)
{
parent::addImplicitGroupName($group);


$nestedConstraints = $this->{$this->getCompositeOption()};

foreach ($nestedConstraints as $constraint) {
$constraint->addImplicitGroupName($group);
}
}




abstract protected function getCompositeOption(): string;






public function getNestedConstraints(): array
{

return $this->{$this->getCompositeOption()};
}











protected function initializeNestedConstraints()
{
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Image extends File
{
public const SIZE_NOT_DETECTED_ERROR = '6d55c3f4-e58e-4fe3-91ee-74b492199956';
public const TOO_WIDE_ERROR = '7f87163d-878f-47f5-99ba-a8eb723a1ab2';
public const TOO_NARROW_ERROR = '9afbd561-4f90-4a27-be62-1780fc43604a';
public const TOO_HIGH_ERROR = '7efae81c-4877-47ba-aa65-d01ccb0d4645';
public const TOO_LOW_ERROR = 'aef0cb6a-c07f-4894-bc08-1781420d7b4c';
public const TOO_FEW_PIXEL_ERROR = '1b06b97d-ae48-474e-978f-038a74854c43';
public const TOO_MANY_PIXEL_ERROR = 'ee0804e8-44db-4eac-9775-be91aaf72ce1';
public const RATIO_TOO_BIG_ERROR = '70cafca6-168f-41c9-8c8c-4e47a52be643';
public const RATIO_TOO_SMALL_ERROR = '59b8c6ef-bcf2-4ceb-afff-4642ed92f12e';
public const SQUARE_NOT_ALLOWED_ERROR = '5d41425b-facb-47f7-a55a-de9fbe45cb46';
public const LANDSCAPE_NOT_ALLOWED_ERROR = '6f895685-7cf2-4d65-b3da-9029c5581d88';
public const PORTRAIT_NOT_ALLOWED_ERROR = '65608156-77da-4c79-a88c-02ef6d18c782';
public const CORRUPTED_IMAGE_ERROR = '5d4163f3-648f-4e39-87fd-cc5ea7aad2d1';



protected const ERROR_NAMES = [
self::NOT_FOUND_ERROR => 'NOT_FOUND_ERROR',
self::NOT_READABLE_ERROR => 'NOT_READABLE_ERROR',
self::EMPTY_ERROR => 'EMPTY_ERROR',
self::TOO_LARGE_ERROR => 'TOO_LARGE_ERROR',
self::INVALID_MIME_TYPE_ERROR => 'INVALID_MIME_TYPE_ERROR',
self::FILENAME_TOO_LONG => 'FILENAME_TOO_LONG',
self::SIZE_NOT_DETECTED_ERROR => 'SIZE_NOT_DETECTED_ERROR',
self::TOO_WIDE_ERROR => 'TOO_WIDE_ERROR',
self::TOO_NARROW_ERROR => 'TOO_NARROW_ERROR',
self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
self::TOO_FEW_PIXEL_ERROR => 'TOO_FEW_PIXEL_ERROR',
self::TOO_MANY_PIXEL_ERROR => 'TOO_MANY_PIXEL_ERROR',
self::RATIO_TOO_BIG_ERROR => 'RATIO_TOO_BIG_ERROR',
self::RATIO_TOO_SMALL_ERROR => 'RATIO_TOO_SMALL_ERROR',
self::SQUARE_NOT_ALLOWED_ERROR => 'SQUARE_NOT_ALLOWED_ERROR',
self::LANDSCAPE_NOT_ALLOWED_ERROR => 'LANDSCAPE_NOT_ALLOWED_ERROR',
self::PORTRAIT_NOT_ALLOWED_ERROR => 'PORTRAIT_NOT_ALLOWED_ERROR',
self::CORRUPTED_IMAGE_ERROR => 'CORRUPTED_IMAGE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $mimeTypes;
public $minWidth;
public $maxWidth;
public $maxHeight;
public $minHeight;
public $maxRatio;
public $minRatio;
public $minPixels;
public $maxPixels;
public $allowSquare = true;
public $allowLandscape = true;
public $allowPortrait = true;
public $detectCorrupted = false;


public $mimeTypesMessage = 'This file is not a valid image.';
public $sizeNotDetectedMessage = 'The size of the image could not be detected.';
public $maxWidthMessage = 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.';
public $minWidthMessage = 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.';
public $maxHeightMessage = 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.';
public $minHeightMessage = 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.';
public $minPixelsMessage = 'The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels.';
public $maxPixelsMessage = 'The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels.';
public $maxRatioMessage = 'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.';
public $minRatioMessage = 'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.';
public $allowSquareMessage = 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.';
public $allowLandscapeMessage = 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.';
public $allowPortraitMessage = 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.';
public $corruptedMessage = 'The image file is corrupted.';

public function __construct(
?array $options = null,
int|string|null $maxSize = null,
?bool $binaryFormat = null,
?array $mimeTypes = null,
?int $filenameMaxLength = null,
?int $minWidth = null,
?int $maxWidth = null,
?int $maxHeight = null,
?int $minHeight = null,
int|float|null $maxRatio = null,
int|float|null $minRatio = null,
int|float|null $minPixels = null,
int|float|null $maxPixels = null,
?bool $allowSquare = null,
?bool $allowLandscape = null,
?bool $allowPortrait = null,
?bool $detectCorrupted = null,
?string $notFoundMessage = null,
?string $notReadableMessage = null,
?string $maxSizeMessage = null,
?string $mimeTypesMessage = null,
?string $disallowEmptyMessage = null,
?string $filenameTooLongMessage = null,
?string $uploadIniSizeErrorMessage = null,
?string $uploadFormSizeErrorMessage = null,
?string $uploadPartialErrorMessage = null,
?string $uploadNoFileErrorMessage = null,
?string $uploadNoTmpDirErrorMessage = null,
?string $uploadCantWriteErrorMessage = null,
?string $uploadExtensionErrorMessage = null,
?string $uploadErrorMessage = null,
?string $sizeNotDetectedMessage = null,
?string $maxWidthMessage = null,
?string $minWidthMessage = null,
?string $maxHeightMessage = null,
?string $minHeightMessage = null,
?string $minPixelsMessage = null,
?string $maxPixelsMessage = null,
?string $maxRatioMessage = null,
?string $minRatioMessage = null,
?string $allowSquareMessage = null,
?string $allowLandscapeMessage = null,
?string $allowPortraitMessage = null,
?string $corruptedMessage = null,
?array $groups = null,
mixed $payload = null,
array|string|null $extensions = null,
?string $extensionsMessage = null,
) {
parent::__construct(
$options,
$maxSize,
$binaryFormat,
$mimeTypes,
$filenameMaxLength,
$notFoundMessage,
$notReadableMessage,
$maxSizeMessage,
$mimeTypesMessage,
$disallowEmptyMessage,
$filenameTooLongMessage,
$uploadIniSizeErrorMessage,
$uploadFormSizeErrorMessage,
$uploadPartialErrorMessage,
$uploadNoFileErrorMessage,
$uploadNoTmpDirErrorMessage,
$uploadCantWriteErrorMessage,
$uploadExtensionErrorMessage,
$uploadErrorMessage,
$groups,
$payload,
$extensions,
$extensionsMessage,
);

$this->minWidth = $minWidth ?? $this->minWidth;
$this->maxWidth = $maxWidth ?? $this->maxWidth;
$this->maxHeight = $maxHeight ?? $this->maxHeight;
$this->minHeight = $minHeight ?? $this->minHeight;
$this->maxRatio = $maxRatio ?? $this->maxRatio;
$this->minRatio = $minRatio ?? $this->minRatio;
$this->minPixels = $minPixels ?? $this->minPixels;
$this->maxPixels = $maxPixels ?? $this->maxPixels;
$this->allowSquare = $allowSquare ?? $this->allowSquare;
$this->allowLandscape = $allowLandscape ?? $this->allowLandscape;
$this->allowPortrait = $allowPortrait ?? $this->allowPortrait;
$this->detectCorrupted = $detectCorrupted ?? $this->detectCorrupted;
$this->sizeNotDetectedMessage = $sizeNotDetectedMessage ?? $this->sizeNotDetectedMessage;
$this->maxWidthMessage = $maxWidthMessage ?? $this->maxWidthMessage;
$this->minWidthMessage = $minWidthMessage ?? $this->minWidthMessage;
$this->maxHeightMessage = $maxHeightMessage ?? $this->maxHeightMessage;
$this->minHeightMessage = $minHeightMessage ?? $this->minHeightMessage;
$this->minPixelsMessage = $minPixelsMessage ?? $this->minPixelsMessage;
$this->maxPixelsMessage = $maxPixelsMessage ?? $this->maxPixelsMessage;
$this->maxRatioMessage = $maxRatioMessage ?? $this->maxRatioMessage;
$this->minRatioMessage = $minRatioMessage ?? $this->minRatioMessage;
$this->allowSquareMessage = $allowSquareMessage ?? $this->allowSquareMessage;
$this->allowLandscapeMessage = $allowLandscapeMessage ?? $this->allowLandscapeMessage;
$this->allowPortraitMessage = $allowPortraitMessage ?? $this->allowPortraitMessage;
$this->corruptedMessage = $corruptedMessage ?? $this->corruptedMessage;

if (null === $this->mimeTypes && [] === $this->extensions) {
$this->mimeTypes = 'image/*';
}

if (!\in_array('image/*', (array) $this->mimeTypes, true) && !\array_key_exists('mimeTypesMessage', $options ?? []) && null === $mimeTypesMessage) {
$this->mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.';
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class AtLeastOneOfValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof AtLeastOneOf) {
throw new UnexpectedTypeException($constraint, AtLeastOneOf::class);
}

$validator = $this->context->getValidator();


$baseMessageContext = clone $this->context;
$baseMessageContext->buildViolation($constraint->message)->addViolation();
$baseViolations = $baseMessageContext->getViolations();
$messages = [(string) $baseViolations->get(\count($baseViolations) - 1)->getMessage()];

foreach ($constraint->constraints as $key => $item) {
if (!\in_array($this->context->getGroup(), $item->groups, true)) {
continue;
}

$context = $this->context;
$executionContext = clone $this->context;
$executionContext->setNode($value, $this->context->getObject(), $this->context->getMetadata(), $this->context->getPropertyPath());
$violations = $validator->inContext($executionContext)->validate($value, $item, $this->context->getGroup())->getViolations();
$this->context = $context;

if (\count($this->context->getViolations()) === \count($violations)) {
return;
}

if ($constraint->includeInternalMessages) {
$message = ' ['.($key + 1).'] ';

if ($item instanceof All || $item instanceof Collection) {
$message .= $constraint->messageCollection;
} else {
$message .= $violations->get(\count($violations) - 1)->getMessage();
}

$messages[] = $message;
}
}

$this->context->buildViolation(implode('', $messages))
->setCode(AtLeastOneOf::AT_LEAST_ONE_OF_ERROR)
->addViolation()
;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class Optional extends Existence
{
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\Expression as ExpressionObject;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
class Expression extends Constraint
{
public const EXPRESSION_FAILED_ERROR = '6b3befbc-2f01-4ddf-be21-b57898905284';

protected const ERROR_NAMES = [
self::EXPRESSION_FAILED_ERROR => 'EXPRESSION_FAILED_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not valid.';
public $expression;
public $values = [];
public bool $negate = true;

public function __construct(
string|ExpressionObject|array|null $expression,
?string $message = null,
?array $values = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
?bool $negate = null,
) {
if (!class_exists(ExpressionLanguage::class)) {
throw new LogicException(\sprintf('The "symfony/expression-language" component is required to use the "%s" constraint. Try running "composer require symfony/expression-language".', __CLASS__));
}

if (\is_array($expression)) {
$options = array_merge($expression, $options);
} elseif (null !== $expression) {
$options['value'] = $expression;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->values = $values ?? $this->values;
$this->negate = $negate ?? $this->negate;
}

public function getDefaultOption(): ?string
{
return 'expression';
}

public function getRequiredOptions(): array
{
return ['expression'];
}

public function getTargets(): string|array
{
return [self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT];
}

public function validatedBy(): string
{
return 'validator.expression';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;





class NotBlankValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof NotBlank) {
throw new UnexpectedTypeException($constraint, NotBlank::class);
}

if ($constraint->allowNull && null === $value) {
return;
}

if (\is_string($value) && null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

if (false === $value || (empty($value) && '0' != $value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(NotBlank::IS_BLANK_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Exception\ConstraintDefinitionException;







trait ZeroComparisonConstraintTrait
{
public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
$options ??= [];

if (isset($options['propertyPath'])) {
throw new ConstraintDefinitionException(\sprintf('The "propertyPath" option of the "%s" constraint cannot be set.', static::class));
}

if (isset($options['value'])) {
throw new ConstraintDefinitionException(\sprintf('The "value" option of the "%s" constraint cannot be set.', static::class));
}

parent::__construct(0, null, $message, $groups, $payload, $options);
}

public function validatedBy(): string
{
return parent::class.'Validator';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class GreaterThan extends AbstractComparison
{
public const TOO_LOW_ERROR = '778b7ae0-84d3-481a-9dec-35fdb64b1d78';

protected const ERROR_NAMES = [
self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be greater than {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;










#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Sequentially extends Composite
{
public $constraints = [];

public function __construct(mixed $constraints = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($constraints ?? [], $groups, $payload);
}

public function getDefaultOption(): ?string
{
return 'constraints';
}

public function getRequiredOptions(): array
{
return ['constraints'];
}

protected function getCompositeOption(): string
{
return 'constraints';
}

public function getTargets(): string|array
{
return [self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class DateValidator extends ConstraintValidator
{
public const PATTERN = '/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/D';






public static function checkDate(int $year, int $month, int $day): bool
{
return checkdate($month, $day, $year);
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Date) {
throw new UnexpectedTypeException($constraint, Date::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (!preg_match(static::PATTERN, $value, $matches)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Date::INVALID_FORMAT_ERROR)
->addViolation();

return;
}

if (!self::checkDate(
$matches['year'] ?? $matches[1],
$matches['month'] ?? $matches[2],
$matches['day'] ?? $matches[3]
)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Date::INVALID_DATE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;







class RegexValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Regex) {
throw new UnexpectedTypeException($constraint, Regex::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

if ($constraint->match xor preg_match($constraint->pattern, $value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ pattern }}', $constraint->pattern)
->setCode(Regex::REGEX_FAILED_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class TimeValidator extends ConstraintValidator
{
public const PATTERN = '/^(\d{2}):(\d{2}):(\d{2})$/D';
public const PATTERN_WITHOUT_SECONDS = '/^(\d{2}):(\d{2})$/D';






public static function checkTime(int $hour, int $minute, float $second): bool
{
return $hour >= 0 && $hour < 24 && $minute >= 0 && $minute < 60 && $second >= 0 && $second < 60;
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Time) {
throw new UnexpectedTypeException($constraint, Time::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (!preg_match($constraint->withSeconds ? static::PATTERN : static::PATTERN_WITHOUT_SECONDS, $value, $matches)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Time::INVALID_FORMAT_ERROR)
->addViolation();

return;
}

if (!self::checkTime($matches[1], $matches[2], $constraint->withSeconds ? $matches[3] : 0)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Time::INVALID_TIME_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class AtLeastOneOf extends Composite
{
public const AT_LEAST_ONE_OF_ERROR = 'f27e6d6c-261a-4056-b391-6673a623531c';

protected const ERROR_NAMES = [
self::AT_LEAST_ONE_OF_ERROR => 'AT_LEAST_ONE_OF_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $constraints = [];
public $message = 'This value should satisfy at least one of the following constraints:';
public $messageCollection = 'Each element of this collection should satisfy its own set of constraints.';
public $includeInternalMessages = true;

public function __construct(mixed $constraints = null, ?array $groups = null, mixed $payload = null, ?string $message = null, ?string $messageCollection = null, ?bool $includeInternalMessages = null)
{
parent::__construct($constraints ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
$this->messageCollection = $messageCollection ?? $this->messageCollection;
$this->includeInternalMessages = $includeInternalMessages ?? $this->includeInternalMessages;
}

public function getDefaultOption(): ?string
{
return 'constraints';
}

public function getRequiredOptions(): array
{
return ['constraints'];
}

protected function getCompositeOption(): string
{
return 'constraints';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\InvalidArgumentException;










#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Ip extends Constraint
{
public const V4 = '4';
public const V6 = '6';
public const ALL = 'all';


public const V4_NO_PRIV = '4_no_priv';
public const V6_NO_PRIV = '6_no_priv';
public const ALL_NO_PRIV = 'all_no_priv';


public const V4_NO_RES = '4_no_res';
public const V6_NO_RES = '6_no_res';
public const ALL_NO_RES = 'all_no_res';


public const V4_ONLY_PUBLIC = '4_public';
public const V6_ONLY_PUBLIC = '6_public';
public const ALL_ONLY_PUBLIC = 'all_public';

public const INVALID_IP_ERROR = 'b1b427ae-9f6f-41b0-aa9b-84511fbb3c5b';

protected const VERSIONS = [
self::V4,
self::V6,
self::ALL,

self::V4_NO_PRIV,
self::V6_NO_PRIV,
self::ALL_NO_PRIV,

self::V4_NO_RES,
self::V6_NO_RES,
self::ALL_NO_RES,

self::V4_ONLY_PUBLIC,
self::V6_ONLY_PUBLIC,
self::ALL_ONLY_PUBLIC,
];

protected const ERROR_NAMES = [
self::INVALID_IP_ERROR => 'INVALID_IP_ERROR',
];




protected static $versions = self::VERSIONS;




protected static $errorNames = self::ERROR_NAMES;

public $version = self::V4;

public $message = 'This is not a valid IP address.';


public $normalizer;

public function __construct(
?array $options = null,
?string $version = null,
?string $message = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->version = $version ?? $this->version;
$this->message = $message ?? $this->message;
$this->normalizer = $normalizer ?? $this->normalizer;

if (!\in_array($this->version, self::$versions)) {
throw new ConstraintDefinitionException(\sprintf('The option "version" must be one of "%s".', implode('", "', self::$versions)));
}

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Date extends Constraint
{
public const INVALID_FORMAT_ERROR = '69819696-02ac-4a99-9ff0-14e127c4d1bc';
public const INVALID_DATE_ERROR = '3c184ce5-b31d-4de7-8b76-326da7b2be93';

protected const ERROR_NAMES = [
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
self::INVALID_DATE_ERROR => 'INVALID_DATE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid date.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Collection extends Composite
{
public const MISSING_FIELD_ERROR = '2fa2158c-2a7f-484b-98aa-975522539ff8';
public const NO_SUCH_FIELD_ERROR = '7703c766-b5d5-4cef-ace7-ae0dd82304e9';

protected const ERROR_NAMES = [
self::MISSING_FIELD_ERROR => 'MISSING_FIELD_ERROR',
self::NO_SUCH_FIELD_ERROR => 'NO_SUCH_FIELD_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $fields = [];
public $allowExtraFields = false;
public $allowMissingFields = false;
public $extraFieldsMessage = 'This field was not expected.';
public $missingFieldsMessage = 'This field is missing.';

public function __construct(mixed $fields = null, ?array $groups = null, mixed $payload = null, ?bool $allowExtraFields = null, ?bool $allowMissingFields = null, ?string $extraFieldsMessage = null, ?string $missingFieldsMessage = null)
{
if (self::isFieldsOption($fields)) {
$fields = ['fields' => $fields];
}

parent::__construct($fields, $groups, $payload);

$this->allowExtraFields = $allowExtraFields ?? $this->allowExtraFields;
$this->allowMissingFields = $allowMissingFields ?? $this->allowMissingFields;
$this->extraFieldsMessage = $extraFieldsMessage ?? $this->extraFieldsMessage;
$this->missingFieldsMessage = $missingFieldsMessage ?? $this->missingFieldsMessage;
}




protected function initializeNestedConstraints()
{
parent::initializeNestedConstraints();

if (!\is_array($this->fields)) {
throw new ConstraintDefinitionException(\sprintf('The option "fields" is expected to be an array in constraint "%s".', __CLASS__));
}

foreach ($this->fields as $fieldName => $field) {


if (\is_array($field) && 1 == \count($field)) {
$this->fields[$fieldName] = $field = $field[0];
}

if (!$field instanceof Optional && !$field instanceof Required) {
$this->fields[$fieldName] = new Required($field);
}
}
}

public function getRequiredOptions(): array
{
return ['fields'];
}

protected function getCompositeOption(): string
{
return 'fields';
}

private static function isFieldsOption($options): bool
{
if (!\is_array($options)) {
return false;
}

foreach ($options as $optionOrField) {
if ($optionOrField instanceof Constraint) {
return true;
}

if (null === $optionOrField) {
continue;
}

if (!\is_array($optionOrField)) {
return false;
}

if ($optionOrField && !($optionOrField[0] ?? null) instanceof Constraint) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Negative extends LessThan
{
use ZeroComparisonConstraintTrait;

public $message = 'This value should be negative.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class IsTrueValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof IsTrue) {
throw new UnexpectedTypeException($constraint, IsTrue::class);
}

if (null === $value || true === $value || 1 === $value || '1' === $value) {
return;
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(IsTrue::NOT_TRUE_ERROR)
->addViolation();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Countries;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Bic extends Constraint
{
public const INVALID_LENGTH_ERROR = '66dad313-af0b-4214-8566-6c799be9789c';
public const INVALID_CHARACTERS_ERROR = 'f424c529-7add-4417-8f2d-4b656e4833e2';
public const INVALID_BANK_CODE_ERROR = '00559357-6170-4f29-aebd-d19330aa19cf';
public const INVALID_COUNTRY_CODE_ERROR = '1ce76f8d-3c1f-451c-9e62-fe9c3ed486ae';
public const INVALID_CASE_ERROR = '11884038-3312-4ae5-9d04-699f782130c7';
public const INVALID_IBAN_COUNTRY_CODE_ERROR = '29a2c3bb-587b-4996-b6f5-53081364cea5';

protected const ERROR_NAMES = [
self::INVALID_LENGTH_ERROR => 'INVALID_LENGTH_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::INVALID_BANK_CODE_ERROR => 'INVALID_BANK_CODE_ERROR',
self::INVALID_COUNTRY_CODE_ERROR => 'INVALID_COUNTRY_CODE_ERROR',
self::INVALID_CASE_ERROR => 'INVALID_CASE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This is not a valid Business Identifier Code (BIC).';
public $ibanMessage = 'This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.';
public $iban;
public $ibanPropertyPath;

public function __construct(?array $options = null, ?string $message = null, ?string $iban = null, ?string $ibanPropertyPath = null, ?string $ibanMessage = null, ?array $groups = null, mixed $payload = null)
{
if (!class_exists(Countries::class)) {
throw new LogicException('The Intl component is required to use the Bic constraint. Try running "composer require symfony/intl".');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->ibanMessage = $ibanMessage ?? $this->ibanMessage;
$this->iban = $iban ?? $this->iban;
$this->ibanPropertyPath = $ibanPropertyPath ?? $this->ibanPropertyPath;

if (null !== $this->iban && null !== $this->ibanPropertyPath) {
throw new ConstraintDefinitionException('The "iban" and "ibanPropertyPath" options of the Iban constraint cannot be used at the same time.');
}

if (null !== $this->ibanPropertyPath && !class_exists(PropertyAccess::class)) {
throw new LogicException(\sprintf('The "symfony/property-access" component is required to use the "%s" constraint with the "ibanPropertyPath" option. Try running "composer require symfony/property-access".', self::class));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;

class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions(): array
{
return [
new ExpressionFunction('is_valid', function (...$arguments) {
return \sprintf(
'0 === $context->getValidator()->inContext($context)->validate(%s)->getViolations()->count()',
implode(', ', $arguments)
);
}, function (array $variables, ...$arguments): bool {
return 0 === $variables['context']->getValidator()->inContext($variables['context'])->validate(...$arguments)->getViolations()->count();
}),
];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class IdenticalToValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return $value1 === $value2;
}

protected function getErrorCode(): ?string
{
return IdenticalTo::NOT_IDENTICAL_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class SequentiallyValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Sequentially) {
throw new UnexpectedTypeException($constraint, Sequentially::class);
}

$context = $this->context;

$validator = $context->getValidator()->inContext($context);

$originalCount = $validator->getViolations()->count();

foreach ($constraint->constraints as $c) {
if ($originalCount !== $validator->validate($value, $c)->getViolations()->count()) {
break;
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;







#[\Attribute(\Attribute::TARGET_CLASS)]
class Cascade extends Constraint
{
public array $exclude = [];

public function __construct(array|string|null $exclude = null, ?array $options = null)
{
if (\is_array($exclude) && !array_is_list($exclude)) {
$options = array_merge($exclude, $options ?? []);
$options['exclude'] = array_flip((array) ($options['exclude'] ?? []));
} else {
$this->exclude = array_flip((array) $exclude);
}

if (\is_array($options) && \array_key_exists('groups', $options)) {
throw new ConstraintDefinitionException(\sprintf('The option "groups" is not supported by the constraint "%s".', __CLASS__));
}

parent::__construct($options);
}

public function getTargets(): string|array
{
return self::CLASS_CONSTRAINT;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

final class PasswordStrengthValidator extends ConstraintValidator
{



public function __construct(
private readonly ?\Closure $passwordStrengthEstimator = null,
) {
}

public function validate(#[\SensitiveParameter] mixed $value, Constraint $constraint): void
{
if (!$constraint instanceof PasswordStrength) {
throw new UnexpectedTypeException($constraint, PasswordStrength::class);
}

if (null === $value) {
return;
}

if (!\is_string($value)) {
throw new UnexpectedValueException($value, 'string');
}
$passwordStrengthEstimator = $this->passwordStrengthEstimator ?? self::estimateStrength(...);
$strength = $passwordStrengthEstimator($value);

if ($strength < $constraint->minScore) {
$this->context->buildViolation($constraint->message)
->setCode(PasswordStrength::PASSWORD_STRENGTH_ERROR)
->addViolation();
}
}








private static function estimateStrength(#[\SensitiveParameter] string $password): int
{
if (!$length = \strlen($password)) {
return PasswordStrength::STRENGTH_VERY_WEAK;
}
$password = count_chars($password, 1);
$chars = \count($password);

$control = $digit = $upper = $lower = $symbol = $other = 0;
foreach ($password as $chr => $count) {
match (true) {
$chr < 32 || 127 === $chr => $control = 33,
48 <= $chr && $chr <= 57 => $digit = 10,
65 <= $chr && $chr <= 90 => $upper = 26,
97 <= $chr && $chr <= 122 => $lower = 26,
128 <= $chr => $other = 128,
default => $symbol = 33,
};
}

$pool = $lower + $upper + $digit + $symbol + $control + $other;
$entropy = $chars * log($pool, 2) + ($length - $chars) * log($chars, 2);

return match (true) {
$entropy >= 120 => PasswordStrength::STRENGTH_VERY_STRONG,
$entropy >= 100 => PasswordStrength::STRENGTH_STRONG,
$entropy >= 80 => PasswordStrength::STRENGTH_MEDIUM,
$entropy >= 60 => PasswordStrength::STRENGTH_WEAK,
default => PasswordStrength::STRENGTH_VERY_WEAK,
};
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class CssColorValidator extends ConstraintValidator
{
private const PATTERN_HEX_LONG = '/^#[0-9a-f]{6}$/iD';
private const PATTERN_HEX_LONG_WITH_ALPHA = '/^#[0-9a-f]{8}$/iD';
private const PATTERN_HEX_SHORT = '/^#[0-9a-f]{3}$/iD';
private const PATTERN_HEX_SHORT_WITH_ALPHA = '/^#[0-9a-f]{4}$/iD';

private const PATTERN_BASIC_NAMED_COLORS = '/^(black|silver|gray|white|maroon|red|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua)$/iD';

private const PATTERN_EXTENDED_NAMED_COLORS = '/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)$/iD';

private const PATTERN_SYSTEM_COLORS = '/^(Canvas|CanvasText|LinkText|VisitedText|ActiveText|ButtonFace|ButtonText|ButtonBorder|Field|FieldText|Highlight|HighlightText|SelectedItem|SelectedItemText|Mark|MarkText|GrayText)$/iD';
private const PATTERN_KEYWORDS = '/^(transparent|currentColor)$/iD';
private const PATTERN_RGB = '/^rgb\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d)\s*\)$/iD';
private const PATTERN_RGBA = '/^rgba\(\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|255|25[0-4]|2[0-4]\d|1\d\d|0?\d?\d),\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';
private const PATTERN_HSL = '/^hsl\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%\s*\)$/iD';
private const PATTERN_HSLA = '/^hsla\(\s*(0|360|35\d|3[0-4]\d|[12]\d\d|0?\d?\d),\s*(0|100|\d{1,2})%,\s*(0|100|\d{1,2})%,\s*(0|0?\.\d+|1(\.0)?)\s*\)$/iD';

private const COLOR_PATTERNS = [
CssColor::HEX_LONG => self::PATTERN_HEX_LONG,
CssColor::HEX_LONG_WITH_ALPHA => self::PATTERN_HEX_LONG_WITH_ALPHA,
CssColor::HEX_SHORT => self::PATTERN_HEX_SHORT,
CssColor::HEX_SHORT_WITH_ALPHA => self::PATTERN_HEX_SHORT_WITH_ALPHA,
CssColor::BASIC_NAMED_COLORS => self::PATTERN_BASIC_NAMED_COLORS,
CssColor::EXTENDED_NAMED_COLORS => self::PATTERN_EXTENDED_NAMED_COLORS,
CssColor::SYSTEM_COLORS => self::PATTERN_SYSTEM_COLORS,
CssColor::KEYWORDS => self::PATTERN_KEYWORDS,
CssColor::RGB => self::PATTERN_RGB,
CssColor::RGBA => self::PATTERN_RGBA,
CssColor::HSL => self::PATTERN_HSL,
CssColor::HSLA => self::PATTERN_HSLA,
];

public function validate($value, Constraint $constraint): void
{
if (!$constraint instanceof CssColor) {
throw new UnexpectedTypeException($constraint, CssColor::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_string($value)) {
throw new UnexpectedValueException($value, 'string');
}

$formats = array_flip((array) $constraint->formats);
$formatRegexes = array_intersect_key(self::COLOR_PATTERNS, $formats);

foreach ($formatRegexes as $regex) {
if (preg_match($regex, (string) $value)) {
return;
}
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(CssColor::INVALID_FORMAT_ERROR)
->addViolation();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Blank extends Constraint
{
public const NOT_BLANK_ERROR = '183ad2de-533d-4796-a439-6d3c3852b549';

protected const ERROR_NAMES = [
self::NOT_BLANK_ERROR => 'NOT_BLANK_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be blank.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Uuid extends Constraint
{
public const TOO_SHORT_ERROR = 'aa314679-dac9-4f54-bf97-b2049df8f2a3';
public const TOO_LONG_ERROR = '494897dd-36f8-4d31-8923-71a8d5f3000d';
public const INVALID_CHARACTERS_ERROR = '51120b12-a2bc-41bf-aa53-cd73daf330d0';
public const INVALID_HYPHEN_PLACEMENT_ERROR = '98469c83-0309-4f5d-bf95-a496dcaa869c';
public const INVALID_VERSION_ERROR = '21ba13b4-b185-4882-ac6f-d147355987eb';
public const INVALID_TIME_BASED_VERSION_ERROR = '484081ca-6fbd-11ed-ade8-a3bdfd0fcf2f';
public const INVALID_VARIANT_ERROR = '164ef693-2b9d-46de-ad7f-836201f0c2db';

protected const ERROR_NAMES = [
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::INVALID_HYPHEN_PLACEMENT_ERROR => 'INVALID_HYPHEN_PLACEMENT_ERROR',
self::INVALID_VERSION_ERROR => 'INVALID_VERSION_ERROR',
self::INVALID_VARIANT_ERROR => 'INVALID_VARIANT_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;


public const V1_MAC = 1;
public const V2_DCE = 2;
public const V3_MD5 = 3;
public const V4_RANDOM = 4;
public const V5_SHA1 = 5;
public const V6_SORTABLE = 6;
public const V7_MONOTONIC = 7;
public const V8_CUSTOM = 8;

public const ALL_VERSIONS = [
self::V1_MAC,
self::V2_DCE,
self::V3_MD5,
self::V4_RANDOM,
self::V5_SHA1,
self::V6_SORTABLE,
self::V7_MONOTONIC,
self::V8_CUSTOM,
];

public const TIME_BASED_VERSIONS = [
self::V1_MAC,
self::V6_SORTABLE,
self::V7_MONOTONIC,
];






public $message = 'This is not a valid UUID.';








public $strict = true;








public $versions = self::ALL_VERSIONS;


public $normalizer;




public function __construct(
?array $options = null,
?string $message = null,
array|int|null $versions = null,
?bool $strict = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->versions = (array) ($versions ?? $this->versions);
$this->strict = $strict ?? $this->strict;
$this->normalizer = $normalizer ?? $this->normalizer;

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Currencies;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Currency extends Constraint
{
public const NO_SUCH_CURRENCY_ERROR = '69945ac1-2db4-405f-bec7-d2772f73df52';

protected const ERROR_NAMES = [
self::NO_SUCH_CURRENCY_ERROR => 'NO_SUCH_CURRENCY_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid currency.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
if (!class_exists(Currencies::class)) {
throw new LogicException('The Intl component is required to use the Currency constraint. Try running "composer require symfony/intl".');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Regex extends Constraint
{
public const REGEX_FAILED_ERROR = 'de1e3db3-5ed4-4941-aae4-59f3667cc3a3';

protected const ERROR_NAMES = [
self::REGEX_FAILED_ERROR => 'REGEX_FAILED_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not valid.';
public $pattern;
public $htmlPattern;
public $match = true;

public $normalizer;

public function __construct(
string|array|null $pattern,
?string $message = null,
?string $htmlPattern = null,
?bool $match = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
) {
if (\is_array($pattern)) {
$options = array_merge($pattern, $options);
} elseif (null !== $pattern) {
$options['value'] = $pattern;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->htmlPattern = $htmlPattern ?? $this->htmlPattern;
$this->match = $match ?? $this->match;
$this->normalizer = $normalizer ?? $this->normalizer;

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}

public function getDefaultOption(): ?string
{
return 'pattern';
}

public function getRequiredOptions(): array
{
return ['pattern'];
}








public function getHtmlPattern(): ?string
{

if (null !== $this->htmlPattern) {
return empty($this->htmlPattern)
? null
: $this->htmlPattern;
}


if ($this->pattern[0] !== $this->pattern[\strlen($this->pattern) - 1]) {
return null;
}

$delimiter = $this->pattern[0];


$pattern = str_replace('\\'.$delimiter, $delimiter, substr($this->pattern, 1, -1));



if (!$this->match) {
return '((?!'.$pattern.').)*';
}



if (str_contains($pattern, '|')) {
return '.*('.$pattern.').*';
}


$pattern = '^' === $pattern[0] ? substr($pattern, 1) : '.*'.$pattern;


$pattern = '$' === $pattern[\strlen($pattern) - 1] ? substr($pattern, 0, -1) : $pattern.'.*';

return $pattern;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Egulias\EmailValidator\EmailValidator as StrictEmailValidator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Email extends Constraint
{
public const VALIDATION_MODE_HTML5_ALLOW_NO_TLD = 'html5-allow-no-tld';
public const VALIDATION_MODE_HTML5 = 'html5';
public const VALIDATION_MODE_STRICT = 'strict';



public const VALIDATION_MODE_LOOSE = 'loose';

public const INVALID_FORMAT_ERROR = 'bd79c0ab-ddba-46cc-a703-a7a4b08de310';

public const VALIDATION_MODES = [
self::VALIDATION_MODE_HTML5_ALLOW_NO_TLD,
self::VALIDATION_MODE_HTML5,
self::VALIDATION_MODE_STRICT,
self::VALIDATION_MODE_LOOSE,
];

protected const ERROR_NAMES = [
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid email address.';
public $mode;

public $normalizer;

public function __construct(
?array $options = null,
?string $message = null,
?string $mode = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
) {
if (\is_array($options) && \array_key_exists('mode', $options) && !\in_array($options['mode'], self::VALIDATION_MODES, true)) {
throw new InvalidArgumentException('The "mode" parameter value is not valid.');
}

if (null !== $mode && !\in_array($mode, self::VALIDATION_MODES, true)) {
throw new InvalidArgumentException('The "mode" parameter value is not valid.');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->mode = $mode ?? $this->mode;
$this->normalizer = $normalizer ?? $this->normalizer;

if (self::VALIDATION_MODE_LOOSE === $this->mode) {
trigger_deprecation('symfony/validator', '6.2', 'The "%s" mode is deprecated. It will be removed in 7.0 and the default mode will be changed to "%s".', self::VALIDATION_MODE_LOOSE, self::VALIDATION_MODE_HTML5);
}

if (self::VALIDATION_MODE_STRICT === $this->mode && !class_exists(StrictEmailValidator::class)) {
throw new LogicException(\sprintf('The "egulias/email-validator" component is required to use the "%s" constraint in strict mode. Try running "composer require egulias/email-validator".', __CLASS__));
}

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class GreaterThanOrEqual extends AbstractComparison
{
public const TOO_LOW_ERROR = 'ea4e51d1-3342-48bd-87f1-9e672cd90cad';

protected const ERROR_NAMES = [
self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be greater than or equal to {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class IsFalse extends Constraint
{
public const NOT_FALSE_ERROR = 'd53a91b0-def3-426a-83d7-269da7ab4200';

protected const ERROR_NAMES = [
self::NOT_FALSE_ERROR => 'NOT_FALSE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be false.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class DateTime extends Constraint
{
public const INVALID_FORMAT_ERROR = '1a9da513-2640-4f84-9b6a-4d99dcddc628';
public const INVALID_DATE_ERROR = 'd52afa47-620d-4d99-9f08-f4d85b36e33c';
public const INVALID_TIME_ERROR = '5e797c9d-74f7-4098-baa3-94390c447b27';

protected const ERROR_NAMES = [
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
self::INVALID_DATE_ERROR => 'INVALID_DATE_ERROR',
self::INVALID_TIME_ERROR => 'INVALID_TIME_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $format = 'Y-m-d H:i:s';
public $message = 'This value is not a valid datetime.';

public function __construct(string|array|null $format = null, ?string $message = null, ?array $groups = null, mixed $payload = null, array $options = [])
{
if (\is_array($format)) {
$options = array_merge($format, $options);
} elseif (null !== $format) {
$options['value'] = $format;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}

public function getDefaultOption(): ?string
{
return 'format';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;









#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NotCompromisedPassword extends Constraint
{
public const COMPROMISED_PASSWORD_ERROR = 'd9bcdbfe-a9d6-4bfa-a8ff-da5fd93e0f6d';

protected const ERROR_NAMES = [
self::COMPROMISED_PASSWORD_ERROR => 'COMPROMISED_PASSWORD_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This password has been leaked in a data breach, it must not be used. Please use another password.';
public $threshold = 1;
public $skipOnError = false;

public function __construct(
?array $options = null,
?string $message = null,
?int $threshold = null,
?bool $skipOnError = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->threshold = $threshold ?? $this->threshold;
$this->skipOnError = $skipOnError ?? $this->skipOnError;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Hostname extends Constraint
{
public const INVALID_HOSTNAME_ERROR = '7057ffdb-0af4-4f7e-bd5e-e9acfa6d7a2d';

protected const ERROR_NAMES = [
self::INVALID_HOSTNAME_ERROR => 'INVALID_HOSTNAME_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid hostname.';
public $requireTld = true;

public function __construct(
?array $options = null,
?string $message = null,
?bool $requireTld = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->requireTld = $requireTld ?? $this->requireTld;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class NotNullValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof NotNull) {
throw new UnexpectedTypeException($constraint, NotNull::class);
}

if (null === $value) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(NotNull::IS_NULL_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;













class LuhnValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Luhn) {
throw new UnexpectedTypeException($constraint, Luhn::class);
}

if (null === $value || '' === $value) {
return;
}



if (!\is_string($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (!ctype_digit($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Luhn::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}

$checkSum = 0;
$length = \strlen($value);

for ($i = $length - 1; $i >= 0; --$i) {
if (($i % 2) ^ ($length % 2)) {





$checkSum += (int) $value[$i];
} else {






$checkSum += (((int) (2 * $value[$i] / 10)) + (2 * $value[$i]) % 10);
}
}

if (0 === $checkSum || 0 !== $checkSum % 10) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Luhn::CHECKSUM_FAILED_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Exception\UnexpectedValueException;






class DivisibleByValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
if (!is_numeric($value1)) {
throw new UnexpectedValueException($value1, 'numeric');
}

if (!is_numeric($value2)) {
throw new UnexpectedValueException($value2, 'numeric');
}

if (!$value2 = abs($value2)) {
return false;
}
if (\is_int($value1 = abs($value1)) && \is_int($value2)) {
return 0 === ($value1 % $value2);
}
if (!$remainder = fmod($value1, $value2)) {
return true;
}
if (\is_float($value2) && \INF !== $value2) {
$quotient = $value1 / $value2;
$rounded = round($quotient);

return \sprintf('%.12e', $quotient) === \sprintf('%.12e', $rounded);
}

return \sprintf('%.12e', $value2) === \sprintf('%.12e', $remainder);
}

protected function getErrorCode(): ?string
{
return DivisibleBy::NOT_DIVISIBLE_BY;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class TypeValidator extends ConstraintValidator
{
private const VALIDATION_FUNCTIONS = [
'bool' => 'is_bool',
'boolean' => 'is_bool',
'int' => 'is_int',
'integer' => 'is_int',
'long' => 'is_int',
'float' => 'is_float',
'double' => 'is_float',
'real' => 'is_float',
'number' => 'is_int || is_float && !is_nan',
'finite-float' => 'is_float && is_finite',
'finite-number' => 'is_int || is_float && is_finite',
'numeric' => 'is_numeric',
'string' => 'is_string',
'scalar' => 'is_scalar',
'array' => 'is_array',
'iterable' => 'is_iterable',
'countable' => 'is_countable',
'callable' => 'is_callable',
'object' => 'is_object',
'resource' => 'is_resource',
'null' => 'is_null',
'alnum' => 'ctype_alnum',
'alpha' => 'ctype_alpha',
'cntrl' => 'ctype_cntrl',
'digit' => 'ctype_digit',
'graph' => 'ctype_graph',
'lower' => 'ctype_lower',
'print' => 'ctype_print',
'punct' => 'ctype_punct',
'space' => 'ctype_space',
'upper' => 'ctype_upper',
'xdigit' => 'ctype_xdigit',
];




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Type) {
throw new UnexpectedTypeException($constraint, Type::class);
}

if (null === $value) {
return;
}

$types = (array) $constraint->type;

foreach ($types as $type) {
$type = strtolower($type);
if (isset(self::VALIDATION_FUNCTIONS[$type]) && match ($type) {
'finite-float' => \is_float($value) && is_finite($value),
'finite-number' => \is_int($value) || \is_float($value) && is_finite($value),
'number' => \is_int($value) || \is_float($value) && !is_nan($value),
default => self::VALIDATION_FUNCTIONS[$type]($value),
}) {
return;
}

if ($value instanceof $type) {
return;
}
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ type }}', implode('|', $types))
->setCode(Type::INVALID_TYPE_ERROR)
->addViolation();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







































#[\Attribute(\Attribute::TARGET_CLASS)]
class GroupSequence
{





public $groups;















public $cascadedGroup;






public function __construct(array $groups)
{
$this->groups = $groups['value'] ?? $groups;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;
use Symfony\Component\Validator\Exception\MissingOptionsException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Length extends Constraint
{
public const TOO_SHORT_ERROR = '9ff3fdc4-b214-49db-8718-39c315e33d45';
public const TOO_LONG_ERROR = 'd94b19cc-114f-4f44-9cc4-4138e80a87b9';
public const NOT_EQUAL_LENGTH_ERROR = '4b6f5c76-22b4-409d-af16-fbe823ba9332';
public const INVALID_CHARACTERS_ERROR = '35e6a710-aa2e-4719-b58e-24b35749b767';

protected const ERROR_NAMES = [
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
self::NOT_EQUAL_LENGTH_ERROR => 'NOT_EQUAL_LENGTH_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
];

public const COUNT_BYTES = 'bytes';
public const COUNT_CODEPOINTS = 'codepoints';
public const COUNT_GRAPHEMES = 'graphemes';

private const VALID_COUNT_UNITS = [
self::COUNT_BYTES,
self::COUNT_CODEPOINTS,
self::COUNT_GRAPHEMES,
];




protected static $errorNames = self::ERROR_NAMES;

public $maxMessage = 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.';
public $minMessage = 'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.';
public $exactMessage = 'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.';
public $charsetMessage = 'This value does not match the expected {{ charset }} charset.';
public $max;
public $min;
public $charset = 'UTF-8';

public $normalizer;

public string $countUnit = self::COUNT_CODEPOINTS;




public function __construct(
int|array|null $exactly = null,
?int $min = null,
?int $max = null,
?string $charset = null,
?callable $normalizer = null,
?string $countUnit = null,
?string $exactMessage = null,
?string $minMessage = null,
?string $maxMessage = null,
?string $charsetMessage = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
) {
if (\is_array($exactly)) {
$options = array_merge($exactly, $options);
$exactly = $options['value'] ?? null;
}

$min ??= $options['min'] ?? null;
$max ??= $options['max'] ?? null;

unset($options['value'], $options['min'], $options['max']);

if (null !== $exactly && null === $min && null === $max) {
$min = $max = $exactly;
}

parent::__construct($options, $groups, $payload);

$this->min = $min;
$this->max = $max;
$this->charset = $charset ?? $this->charset;
$this->normalizer = $normalizer ?? $this->normalizer;
$this->countUnit = $countUnit ?? $this->countUnit;
$this->exactMessage = $exactMessage ?? $this->exactMessage;
$this->minMessage = $minMessage ?? $this->minMessage;
$this->maxMessage = $maxMessage ?? $this->maxMessage;
$this->charsetMessage = $charsetMessage ?? $this->charsetMessage;

if (null === $this->min && null === $this->max) {
throw new MissingOptionsException(\sprintf('Either option "min" or "max" must be given for constraint "%s".', __CLASS__), ['min', 'max']);
}

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}

if (!\in_array($this->countUnit, self::VALID_COUNT_UNITS)) {
throw new InvalidArgumentException(\sprintf('The "countUnit" option must be one of the "%s"::COUNT_* constants ("%s" given).', __CLASS__, $this->countUnit));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class NoSuspiciousCharactersValidator extends ConstraintValidator
{
private const CHECK_RESTRICTION_LEVEL = 16;
private const CHECK_SINGLE_SCRIPT = 16;
private const CHECK_CHAR_LIMIT = 64;

private const CHECK_ERROR = [
self::CHECK_RESTRICTION_LEVEL => [
'code' => NoSuspiciousCharacters::RESTRICTION_LEVEL_ERROR,
'messageProperty' => 'restrictionLevelMessage',
],
NoSuspiciousCharacters::CHECK_INVISIBLE => [
'code' => NoSuspiciousCharacters::INVISIBLE_ERROR,
'messageProperty' => 'invisibleMessage',
],
self::CHECK_CHAR_LIMIT => [
'code' => NoSuspiciousCharacters::RESTRICTION_LEVEL_ERROR,
'messageProperty' => 'restrictionLevelMessage',
],
NoSuspiciousCharacters::CHECK_MIXED_NUMBERS => [
'code' => NoSuspiciousCharacters::MIXED_NUMBERS_ERROR,
'messageProperty' => 'mixedNumbersMessage',
],
NoSuspiciousCharacters::CHECK_HIDDEN_OVERLAY => [
'code' => NoSuspiciousCharacters::HIDDEN_OVERLAY_ERROR,
'messageProperty' => 'hiddenOverlayMessage',
],
];




public function __construct(private readonly array $defaultLocales = [])
{
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof NoSuspiciousCharacters) {
throw new UnexpectedTypeException($constraint, NoSuspiciousCharacters::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

if ('' === $value = (string) $value) {
return;
}

$checker = new \Spoofchecker();
$checks = $constraint->checks;

if (method_exists($checker, 'setRestrictionLevel')) {
$checks |= self::CHECK_RESTRICTION_LEVEL;
$checker->setRestrictionLevel($constraint->restrictionLevel ?? NoSuspiciousCharacters::RESTRICTION_LEVEL_MODERATE);
} elseif (NoSuspiciousCharacters::RESTRICTION_LEVEL_MINIMAL === $constraint->restrictionLevel) {
$checks |= self::CHECK_CHAR_LIMIT;
} elseif (NoSuspiciousCharacters::RESTRICTION_LEVEL_SINGLE_SCRIPT === $constraint->restrictionLevel) {
$checks |= self::CHECK_SINGLE_SCRIPT | self::CHECK_CHAR_LIMIT;
} elseif ($constraint->restrictionLevel) {
throw new LogicException('You can only use one of RESTRICTION_LEVEL_NONE, RESTRICTION_LEVEL_MINIMAL or RESTRICTION_LEVEL_SINGLE_SCRIPT with intl compiled against ICU < 58.');
} else {
$checks |= self::CHECK_SINGLE_SCRIPT;
}

$checker->setAllowedLocales(implode(',', $constraint->locales ?? $this->defaultLocales));

$checker->setChecks($checks);

if (!$checker->isSuspicious($value)) {
return;
}

foreach (self::CHECK_ERROR as $check => $error) {
if (!($checks & $check)) {
continue;
}

$checker->setChecks($check);

if (!$checker->isSuspicious($value)) {
continue;
}

$this->context->buildViolation($constraint->{$error['messageProperty']})
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($error['code'])
->addViolation()
;
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class LessThanOrEqual extends AbstractComparison
{
public const TOO_HIGH_ERROR = '30fbb013-d015-4232-8b3b-8f3be97a7e14';

protected const ERROR_NAMES = [
self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be less than or equal to {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Languages;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Language extends Constraint
{
public const NO_SUCH_LANGUAGE_ERROR = 'ee65fec4-9a20-4202-9f39-ca558cd7bdf7';

protected const ERROR_NAMES = [
self::NO_SUCH_LANGUAGE_ERROR => 'NO_SUCH_LANGUAGE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid language.';
public $alpha3 = false;

public function __construct(
?array $options = null,
?string $message = null,
?bool $alpha3 = null,
?array $groups = null,
mixed $payload = null,
) {
if (!class_exists(Languages::class)) {
throw new LogicException('The Intl component is required to use the Language constraint. Try running "composer require symfony/intl".');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->alpha3 = $alpha3 ?? $this->alpha3;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class All extends Composite
{
public $constraints = [];

public function __construct(mixed $constraints = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($constraints ?? [], $groups, $payload);
}

public function getDefaultOption(): ?string
{
return 'constraints';
}

public function getRequiredOptions(): array
{
return ['constraints'];
}

protected function getCompositeOption(): string
{
return 'constraints';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\SyntaxError;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class ExpressionSyntaxValidator extends ConstraintValidator
{
private ?ExpressionLanguage $expressionLanguage;

public function __construct(?ExpressionLanguage $expressionLanguage = null)
{
$this->expressionLanguage = $expressionLanguage;
}

public function validate(mixed $expression, Constraint $constraint): void
{
if (!$constraint instanceof ExpressionSyntax) {
throw new UnexpectedTypeException($constraint, ExpressionSyntax::class);
}

if (null === $expression || '' === $expression) {
return;
}

if (!\is_string($expression)) {
throw new UnexpectedValueException($expression, 'string');
}

$this->expressionLanguage ??= new ExpressionLanguage();

try {
$this->expressionLanguage->lint($expression, $constraint->allowedVariables);
} catch (SyntaxError $exception) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ syntax_error }}', $this->formatValue($exception->getMessage()))
->setInvalidValue((string) $expression)
->setCode(ExpressionSyntax::EXPRESSION_SYNTAX_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class HostnameValidator extends ConstraintValidator
{



private const RESERVED_TLDS = [
'example',
'invalid',
'localhost',
'test',
];




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Hostname) {
throw new UnexpectedTypeException($constraint, Hostname::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
if ('' === $value) {
return;
}
if (!$this->isValid($value) || ($constraint->requireTld && !$this->hasValidTld($value))) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Hostname::INVALID_HOSTNAME_ERROR)
->addViolation();
}
}

private function isValid(string $domain): bool
{
return false !== filter_var($domain, \FILTER_VALIDATE_DOMAIN, \FILTER_FLAG_HOSTNAME);
}

private function hasValidTld(string $domain): bool
{
return str_contains($domain, '.') && !\in_array(substr($domain, strrpos($domain, '.') + 1), self::RESERVED_TLDS, true);
}
}
<?php










namespace Symfony\Component\Validator\Constraints;




abstract class Existence extends Composite
{
public $constraints = [];

public function getDefaultOption(): ?string
{
return 'constraints';
}

protected function getCompositeOption(): string
{
return 'constraints';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class IsNullValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof IsNull) {
throw new UnexpectedTypeException($constraint, IsNull::class);
}

if (null !== $value) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(IsNull::NOT_NULL_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Unique extends Constraint
{
public const IS_NOT_UNIQUE = '7911c98d-b845-4da0-94b7-a8dac36bc55a';

public array|string $fields = [];

protected const ERROR_NAMES = [
self::IS_NOT_UNIQUE => 'IS_NOT_UNIQUE',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This collection should contain only unique elements.';

public $normalizer;




public function __construct(
?array $options = null,
?string $message = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
array|string|null $fields = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->normalizer = $normalizer ?? $this->normalizer;
$this->fields = $fields ?? $this->fields;

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;





class DateTimeValidator extends DateValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof DateTime) {
throw new UnexpectedTypeException($constraint, DateTime::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

\DateTimeImmutable::createFromFormat($constraint->format, $value);

$errors = \DateTimeImmutable::getLastErrors() ?: ['error_count' => 0, 'warnings' => []];

if (0 < $errors['error_count']) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_FORMAT_ERROR)
->addViolation();

return;
}

if (str_ends_with($constraint->format, '+')) {
$errors['warnings'] = array_filter($errors['warnings'], fn ($warning) => 'Trailing data' !== $warning);
}

foreach ($errors['warnings'] as $warning) {
if ('The parsed date was invalid' === $warning) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_DATE_ERROR)
->addViolation();
} elseif ('The parsed time was invalid' === $warning) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_TIME_ERROR)
->addViolation();
} else {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(DateTime::INVALID_FORMAT_ERROR)
->addViolation();
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class IsNull extends Constraint
{
public const NOT_NULL_ERROR = '60d2f30b-8cfa-4372-b155-9656634de120';

protected const ERROR_NAMES = [
self::NOT_NULL_ERROR => 'NOT_NULL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be null.';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Type extends Constraint
{
public const INVALID_TYPE_ERROR = 'ba785a8c-82cb-4283-967c-3cf342181b40';

protected const ERROR_NAMES = [
self::INVALID_TYPE_ERROR => 'INVALID_TYPE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be of type {{ type }}.';
public $type;

public function __construct(string|array|null $type, ?string $message = null, ?array $groups = null, mixed $payload = null, array $options = [])
{
if (\is_array($type) && \is_string(key($type))) {
$options = array_merge($type, $options);
} elseif (null !== $type) {
$options['value'] = $type;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}

public function getDefaultOption(): ?string
{
return 'type';
}

public function getRequiredOptions(): array
{
return ['type'];
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;




class UrlValidator extends ConstraintValidator
{
public const PATTERN = <<<'REGEX'
        {^
            (%s)://                                 # protocol
            ((?:[\pL\pN\-._~!$&'()*+,;=]|%%[0-9A-Fa-f]{2})++(?::(?:[:\pL\pN\-._~!$&'()*+,;=]|%%[0-9A-Fa-f]{2})*+)?@)?  # basic auth
            (
                (?:
                    (?:
                        (?:[\pL\pN\pS\pM\-\_]++\.)+
                        (?:
                            (?:xn--[a-z0-9-]++)     # punycode in tld
                            |
                            (?:[\pL\pN\pM]++)       # no punycode in tld
                        )
                    )                               # a multi-level domain name
                        |
                    [a-z0-9\-\_]++                  # a single-level domain name
                )\.?
                    |                               # or
                \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}  # an IP address
                    |                               # or
                \[
                    (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))
                \]  # an IPv6 address
            )
            (:[0-9]+)?                              # a port (optional)
            (?:/ (?:[\pL\pN\pS\pM\-._~!$&'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )*  # a path
            (?:\? (?:[\pL\pN\-._~!$&'()*+,;=:@/?[\]]|%%[0-9A-Fa-f]{2})* )?  # a query (optional)
            (?:\# (?:[\pL\pN\-._~!$&'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )?     # a fragment (optional)
        $}ixuD
        REGEX;




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Url) {
throw new UnexpectedTypeException($constraint, Url::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
if ('' === $value) {
return;
}

if (null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

$pattern = $constraint->relativeProtocol ? str_replace('(%s):', '(?:(%s):)?', static::PATTERN) : static::PATTERN;
$pattern = \sprintf($pattern, implode('|', $constraint->protocols));

if (!preg_match($pattern, $value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Url::INVALID_URL_ERROR)
->addViolation();

return;
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Issn extends Constraint
{
public const TOO_SHORT_ERROR = '6a20dd3d-f463-4460-8e7b-18a1b98abbfb';
public const TOO_LONG_ERROR = '37cef893-5871-464e-8b12-7fb79324833c';
public const MISSING_HYPHEN_ERROR = '2983286f-8134-4693-957a-1ec4ef887b15';
public const INVALID_CHARACTERS_ERROR = 'a663d266-37c2-4ece-a914-ae891940c588';
public const INVALID_CASE_ERROR = '7b6dd393-7523-4a6c-b84d-72b91bba5e1a';
public const CHECKSUM_FAILED_ERROR = 'b0f92dbc-667c-48de-b526-ad9586d43e85';

protected const ERROR_NAMES = [
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
self::MISSING_HYPHEN_ERROR => 'MISSING_HYPHEN_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::INVALID_CASE_ERROR => 'INVALID_CASE_ERROR',
self::CHECKSUM_FAILED_ERROR => 'CHECKSUM_FAILED_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid ISSN.';
public $caseSensitive = false;
public $requireHyphen = false;

public function __construct(
?array $options = null,
?string $message = null,
?bool $caseSensitive = null,
?bool $requireHyphen = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->caseSensitive = $caseSensitive ?? $this->caseSensitive;
$this->requireHyphen = $requireHyphen ?? $this->requireHyphen;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Locales;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\LogicException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Locale extends Constraint
{
public const NO_SUCH_LOCALE_ERROR = 'a0af4293-1f1a-4a1c-a328-979cba6182a2';

protected const ERROR_NAMES = [
self::NO_SUCH_LOCALE_ERROR => 'NO_SUCH_LOCALE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid locale.';
public $canonicalize = true;

public function __construct(
?array $options = null,
?string $message = null,
?bool $canonicalize = null,
?array $groups = null,
mixed $payload = null,
) {
if (!class_exists(Locales::class)) {
throw new LogicException('The Intl component is required to use the Locale constraint. Try running "composer require symfony/intl".');
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->canonicalize = $canonicalize ?? $this->canonicalize;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\LogicException;







abstract class AbstractComparison extends Constraint
{
public $message;
public $value;
public $propertyPath;

public function __construct(mixed $value = null, ?string $propertyPath = null, ?string $message = null, ?array $groups = null, mixed $payload = null, array $options = [])
{
if (\is_array($value)) {
$options = array_merge($value, $options);
} elseif (null !== $value) {
$options['value'] = $value;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->propertyPath = $propertyPath ?? $this->propertyPath;

if (null === $this->value && null === $this->propertyPath) {
throw new ConstraintDefinitionException(\sprintf('The "%s" constraint requires either the "value" or "propertyPath" option to be set.', static::class));
}

if (null !== $this->value && null !== $this->propertyPath) {
throw new ConstraintDefinitionException(\sprintf('The "%s" constraint requires only one of the "value" or "propertyPath" options to be set, not both.', static::class));
}

if (null !== $this->propertyPath && !class_exists(PropertyAccess::class)) {
throw new LogicException(\sprintf('The "%s" constraint requires the Symfony PropertyAccess component to use the "propertyPath" option. Try running "composer require symfony/property-access".', static::class));
}
}

public function getDefaultOption(): ?string
{
return 'value';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class GreaterThanOrEqualValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return null === $value2 || $value1 >= $value2;
}

protected function getErrorCode(): ?string
{
return GreaterThanOrEqual::TOO_LOW_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class NotEqualToValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return $value1 != $value2;
}

protected function getErrorCode(): ?string
{
return NotEqualTo::IS_EQUAL_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Languages;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class LanguageValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Language) {
throw new UnexpectedTypeException($constraint, Language::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if ($constraint->alpha3 ? !Languages::alpha3CodeExists($value) : !Languages::exists($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Language::NO_SUCH_LANGUAGE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;









#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Iban extends Constraint
{
public const INVALID_COUNTRY_CODE_ERROR = 'de78ee2c-bd50-44e2-aec8-3d8228aeadb9';
public const INVALID_CHARACTERS_ERROR = '8d3d85e4-784f-4719-a5bc-d9e40d45a3a5';
public const CHECKSUM_FAILED_ERROR = 'b9401321-f9bf-4dcb-83c1-f31094440795';
public const INVALID_FORMAT_ERROR = 'c8d318f1-2ecc-41ba-b983-df70d225cf5a';
public const NOT_SUPPORTED_COUNTRY_CODE_ERROR = 'e2c259f3-4b46-48e6-b72e-891658158ec8';

protected const ERROR_NAMES = [
self::INVALID_COUNTRY_CODE_ERROR => 'INVALID_COUNTRY_CODE_ERROR',
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::CHECKSUM_FAILED_ERROR => 'CHECKSUM_FAILED_ERROR',
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
self::NOT_SUPPORTED_COUNTRY_CODE_ERROR => 'NOT_SUPPORTED_COUNTRY_CODE_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This is not a valid International Bank Account Number (IBAN).';

public function __construct(?array $options = null, ?string $message = null, ?array $groups = null, mixed $payload = null)
{
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class LessThanOrEqualValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return null === $value2 || $value1 <= $value2;
}

protected function getErrorCode(): ?string
{
return LessThanOrEqual::TOO_HIGH_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class DivisibleBy extends AbstractComparison
{
public const NOT_DIVISIBLE_BY = '6d99d6c3-1464-4ccf-bdc7-14d083cf455c';

protected const ERROR_NAMES = [
self::NOT_DIVISIBLE_BY => 'NOT_DIVISIBLE_BY',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be a multiple of {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class LessThan extends AbstractComparison
{
public const TOO_HIGH_ERROR = '079d7420-2d13-460c-8756-de810eeb37d2';

protected const ERROR_NAMES = [
self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should be less than {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\InvalidArgumentException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Url extends Constraint
{
public const INVALID_URL_ERROR = '57c2f299-1154-4870-89bb-ef3b1f5ad229';

protected const ERROR_NAMES = [
self::INVALID_URL_ERROR => 'INVALID_URL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value is not a valid URL.';
public $protocols = ['http', 'https'];
public $relativeProtocol = false;

public $normalizer;

public function __construct(
?array $options = null,
?string $message = null,
?array $protocols = null,
?bool $relativeProtocol = null,
?callable $normalizer = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->protocols = $protocols ?? $this->protocols;
$this->relativeProtocol = $relativeProtocol ?? $this->relativeProtocol;
$this->normalizer = $normalizer ?? $this->normalizer;

if (null !== $this->normalizer && !\is_callable($this->normalizer)) {
throw new InvalidArgumentException(\sprintf('The "normalizer" option must be a valid callable ("%s" given).', get_debug_type($this->normalizer)));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;










class CardSchemeValidator extends ConstraintValidator
{
protected $schemes = [

CardScheme::AMEX => [
'/^3[47][0-9]{13}$/D',
],


CardScheme::CHINA_UNIONPAY => [
'/^62[0-9]{14,17}$/D',
],



CardScheme::DINERS => [
'/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/D',
],


CardScheme::DISCOVER => [
'/^6011[0-9]{12}$/D',
'/^64[4-9][0-9]{13}$/D',
'/^65[0-9]{14}$/D',
'/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/D',
],

CardScheme::INSTAPAYMENT => [
'/^63[7-9][0-9]{13}$/D',
],


CardScheme::JCB => [
'/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/D',
],

CardScheme::LASER => [
'/^(6304|670[69]|6771)[0-9]{12,15}$/D',
],


CardScheme::MAESTRO => [
'/^(6759[0-9]{2})[0-9]{6,13}$/D',
'/^(50[0-9]{4})[0-9]{6,13}$/D',
'/^5[6-9][0-9]{10,17}$/D',
'/^6[0-9]{11,18}$/D',
],


CardScheme::MASTERCARD => [
'/^5[1-5][0-9]{14}$/D',
'/^2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12})$/D',
],

CardScheme::MIR => [
'/^220[0-4][0-9]{12,15}$/D',
],

CardScheme::UATP => [
'/^1[0-9]{14}$/D',
],

CardScheme::VISA => [
'/^4([0-9]{12}|[0-9]{15}|[0-9]{18})$/D',
],
];






public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof CardScheme) {
throw new UnexpectedTypeException($constraint, CardScheme::class);
}

if (null === $value || '' === $value) {
return;
}

if (!is_numeric($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(CardScheme::NOT_NUMERIC_ERROR)
->addViolation();

return;
}

$schemes = array_flip((array) $constraint->schemes);
$schemeRegexes = array_intersect_key($this->schemes, $schemes);

foreach ($schemeRegexes as $regexes) {
foreach ($regexes as $regex) {
if (preg_match($regex, $value)) {
return;
}
}
}

$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(CardScheme::INVALID_FORMAT_ERROR)
->addViolation();
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Valid extends Constraint
{
public $traverse = true;

public function __construct(?array $options = null, ?array $groups = null, $payload = null, ?bool $traverse = null)
{
parent::__construct($options ?? [], $groups, $payload);

$this->traverse = $traverse ?? $this->traverse;
}

public function __get(string $option): mixed
{
if ('groups' === $option) {

return null;
}

return parent::__get($option);
}




public function addImplicitGroupName(string $group)
{
if (null !== $this->groups) {
parent::addImplicitGroupName($group);
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\MissingOptionsException;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Range extends Constraint
{
public const INVALID_CHARACTERS_ERROR = 'ad9a9798-7a99-4df7-8ce9-46e416a1e60b';
public const NOT_IN_RANGE_ERROR = '04b91c99-a946-4221-afc5-e65ebac401eb';
public const TOO_HIGH_ERROR = '2d28afcb-e32e-45fb-a815-01c431a86a69';
public const TOO_LOW_ERROR = '76454e69-502c-46c5-9643-f447d837c4d5';

protected const ERROR_NAMES = [
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::NOT_IN_RANGE_ERROR => 'NOT_IN_RANGE_ERROR',
self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $notInRangeMessage = 'This value should be between {{ min }} and {{ max }}.';
public $minMessage = 'This value should be {{ limit }} or more.';
public $maxMessage = 'This value should be {{ limit }} or less.';
public $invalidMessage = 'This value should be a valid number.';
public $invalidDateTimeMessage = 'This value is not a valid datetime.';
public $min;
public $minPropertyPath;
public $max;
public $maxPropertyPath;

public function __construct(
?array $options = null,
?string $notInRangeMessage = null,
?string $minMessage = null,
?string $maxMessage = null,
?string $invalidMessage = null,
?string $invalidDateTimeMessage = null,
mixed $min = null,
?string $minPropertyPath = null,
mixed $max = null,
?string $maxPropertyPath = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->notInRangeMessage = $notInRangeMessage ?? $this->notInRangeMessage;
$this->minMessage = $minMessage ?? $this->minMessage;
$this->maxMessage = $maxMessage ?? $this->maxMessage;
$this->invalidMessage = $invalidMessage ?? $this->invalidMessage;
$this->invalidDateTimeMessage = $invalidDateTimeMessage ?? $this->invalidDateTimeMessage;
$this->min = $min ?? $this->min;
$this->minPropertyPath = $minPropertyPath ?? $this->minPropertyPath;
$this->max = $max ?? $this->max;
$this->maxPropertyPath = $maxPropertyPath ?? $this->maxPropertyPath;

if (null === $this->min && null === $this->minPropertyPath && null === $this->max && null === $this->maxPropertyPath) {
throw new MissingOptionsException(\sprintf('Either option "min", "minPropertyPath", "max" or "maxPropertyPath" must be given for constraint "%s".', __CLASS__), ['min', 'minPropertyPath', 'max', 'maxPropertyPath']);
}

if (null !== $this->min && null !== $this->minPropertyPath) {
throw new ConstraintDefinitionException(\sprintf('The "%s" constraint requires only one of the "min" or "minPropertyPath" options to be set, not both.', static::class));
}

if (null !== $this->max && null !== $this->maxPropertyPath) {
throw new ConstraintDefinitionException(\sprintf('The "%s" constraint requires only one of the "max" or "maxPropertyPath" options to be set, not both.', static::class));
}

if ((null !== $this->minPropertyPath || null !== $this->maxPropertyPath) && !class_exists(PropertyAccess::class)) {
throw new LogicException(\sprintf('The "%s" constraint requires the Symfony PropertyAccess component to use the "minPropertyPath" or "maxPropertyPath" option. Try running "composer require symfony/property-access".', static::class));
}

if (null !== $this->min && null !== $this->max && ($minMessage || $maxMessage || isset($options['minMessage']) || isset($options['maxMessage']))) {
throw new ConstraintDefinitionException(\sprintf('The "%s" constraint can not use "minMessage" and "maxMessage" when the "min" and "max" options are both set. Use "notInRangeMessage" instead.', static::class));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;






#[\Attribute(\Attribute::TARGET_CLASS)]
class Traverse extends Constraint
{
public $traverse = true;

public function __construct(bool|array|null $traverse = null)
{
if (\is_array($traverse) && \array_key_exists('groups', $traverse)) {
throw new ConstraintDefinitionException(\sprintf('The option "groups" is not supported by the constraint "%s".', __CLASS__));
}

parent::__construct($traverse);
}

public function getDefaultOption(): ?string
{
return 'traverse';
}

public function getTargets(): string|array
{
return self::CLASS_CONSTRAINT;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;




class CompoundValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Compound) {
throw new UnexpectedTypeException($constraint, Compound::class);
}

$context = $this->context;

$validator = $context->getValidator()->inContext($context);

$validator->validate($value, $constraint->constraints);
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;







#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Time extends Constraint
{
public const INVALID_FORMAT_ERROR = '9d27b2bb-f755-4fbf-b725-39b1edbdebdf';
public const INVALID_TIME_ERROR = '8532f9e1-84b2-4d67-8989-0818bc38533b';

protected const ERROR_NAMES = [
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
self::INVALID_TIME_ERROR => 'INVALID_TIME_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $withSeconds = true;
public $message = 'This value is not a valid time.';

public function __construct(
?array $options = null,
?string $message = null,
?array $groups = null,
mixed $payload = null,
?bool $withSeconds = null,
) {
parent::__construct($options, $groups, $payload);

$this->withSeconds = $withSeconds ?? $this->withSeconds;
$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;







class IpValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Ip) {
throw new UnexpectedTypeException($constraint, Ip::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if (null !== $constraint->normalizer) {
$value = ($constraint->normalizer)($value);
}

$flag = match ($constraint->version) {
Ip::V4 => \FILTER_FLAG_IPV4,
Ip::V6 => \FILTER_FLAG_IPV6,
Ip::V4_NO_PRIV => \FILTER_FLAG_IPV4 | \FILTER_FLAG_NO_PRIV_RANGE,
Ip::V6_NO_PRIV => \FILTER_FLAG_IPV6 | \FILTER_FLAG_NO_PRIV_RANGE,
Ip::ALL_NO_PRIV => \FILTER_FLAG_NO_PRIV_RANGE,
Ip::V4_NO_RES => \FILTER_FLAG_IPV4 | \FILTER_FLAG_NO_RES_RANGE,
Ip::V6_NO_RES => \FILTER_FLAG_IPV6 | \FILTER_FLAG_NO_RES_RANGE,
Ip::ALL_NO_RES => \FILTER_FLAG_NO_RES_RANGE,
Ip::V4_ONLY_PUBLIC => \FILTER_FLAG_IPV4 | \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE,
Ip::V6_ONLY_PUBLIC => \FILTER_FLAG_IPV6 | \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE,
Ip::ALL_ONLY_PUBLIC => \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE,
default => 0,
};

if (!filter_var($value, \FILTER_VALIDATE_IP, $flag)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Ip::INVALID_IP_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;










class IsbnValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Isbn) {
throw new UnexpectedTypeException($constraint, Isbn::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
$canonical = str_replace('-', '', $value);


if (Isbn::ISBN_10 === $constraint->type) {
if (true !== ($code = $this->validateIsbn10($canonical))) {
$this->context->buildViolation($this->getMessage($constraint, $constraint->type))
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($code)
->addViolation();
}

return;
}


if (Isbn::ISBN_13 === $constraint->type) {
if (true !== ($code = $this->validateIsbn13($canonical))) {
$this->context->buildViolation($this->getMessage($constraint, $constraint->type))
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($code)
->addViolation();
}

return;
}




$code = $this->validateIsbn10($canonical);


if (Isbn::TOO_LONG_ERROR === $code) {

$code = $this->validateIsbn13($canonical);


if (Isbn::TOO_SHORT_ERROR === $code) {
$code = Isbn::TYPE_NOT_RECOGNIZED_ERROR;
}
}

if (true !== $code) {
$this->context->buildViolation($this->getMessage($constraint))
->setParameter('{{ value }}', $this->formatValue($value))
->setCode($code)
->addViolation();
}
}




protected function validateIsbn10(string $isbn)
{










$checkSum = 0;

for ($i = 0; $i < 10; ++$i) {



if (!isset($isbn[$i])) {
return Isbn::TOO_SHORT_ERROR;
}

if ('X' === $isbn[$i]) {
$digit = 10;
} elseif (ctype_digit($isbn[$i])) {
$digit = $isbn[$i];
} else {
return Isbn::INVALID_CHARACTERS_ERROR;
}

$checkSum += $digit * (10 - $i);
}

if (isset($isbn[$i])) {
return Isbn::TOO_LONG_ERROR;
}

return 0 === $checkSum % 11 ? true : Isbn::CHECKSUM_FAILED_ERROR;
}




protected function validateIsbn13(string $isbn)
{





if (!ctype_digit($isbn)) {
return Isbn::INVALID_CHARACTERS_ERROR;
}

$length = \strlen($isbn);

if ($length < 13) {
return Isbn::TOO_SHORT_ERROR;
}

if ($length > 13) {
return Isbn::TOO_LONG_ERROR;
}

$checkSum = 0;

for ($i = 0; $i < 13; $i += 2) {
$checkSum += $isbn[$i];
}

for ($i = 1; $i < 12; $i += 2) {
$checkSum += $isbn[$i] * 3;
}

return 0 === $checkSum % 10 ? true : Isbn::CHECKSUM_FAILED_ERROR;
}




protected function getMessage(Isbn $constraint, ?string $type = null)
{
if (null !== $constraint->message) {
return $constraint->message;
} elseif (Isbn::ISBN_10 === $type) {
return $constraint->isbn10Message;
} elseif (Isbn::ISBN_13 === $type) {
return $constraint->isbn13Message;
}

return $constraint->bothIsbnMessage;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\RuntimeException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;








class ChoiceValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Choice) {
throw new UnexpectedTypeException($constraint, Choice::class);
}

if (!\is_array($constraint->choices) && !$constraint->callback) {
throw new ConstraintDefinitionException('Either "choices" or "callback" must be specified on constraint Choice.');
}

if (null === $value) {
return;
}

if ($constraint->multiple && !\is_array($value)) {
throw new UnexpectedValueException($value, 'array');
}

if ($constraint->callback) {
if (!\is_callable($choices = [$this->context->getObject(), $constraint->callback])
&& !\is_callable($choices = [$this->context->getClassName(), $constraint->callback])
&& !\is_callable($choices = $constraint->callback)
) {
throw new ConstraintDefinitionException('The Choice constraint expects a valid callback.');
}
$choices = $choices();
if (!\is_array($choices)) {
throw new ConstraintDefinitionException(\sprintf('The Choice constraint callback "%s" is expected to return an array, but returned "%s".', trim($this->formatValue($constraint->callback), '"'), get_debug_type($choices)));
}
} else {
$choices = $constraint->choices;
}

if (true !== $constraint->strict) {
throw new RuntimeException('The "strict" option of the Choice constraint should not be used.');
}

if ($constraint->multiple) {
foreach ($value as $_value) {
if ($constraint->match xor \in_array($_value, $choices, true)) {
$this->context->buildViolation($constraint->multipleMessage)
->setParameter('{{ value }}', $this->formatValue($_value))
->setParameter('{{ choices }}', $this->formatValues($choices))
->setCode(Choice::NO_SUCH_CHOICE_ERROR)
->setInvalidValue($_value)
->addViolation();

return;
}
}

$count = \count($value);

if (null !== $constraint->min && $count < $constraint->min) {
$this->context->buildViolation($constraint->minMessage)
->setParameter('{{ limit }}', $constraint->min)
->setPlural((int) $constraint->min)
->setCode(Choice::TOO_FEW_ERROR)
->addViolation();

return;
}

if (null !== $constraint->max && $count > $constraint->max) {
$this->context->buildViolation($constraint->maxMessage)
->setParameter('{{ limit }}', $constraint->max)
->setPlural((int) $constraint->max)
->setCode(Choice::TOO_MANY_ERROR)
->addViolation();

return;
}
} elseif ($constraint->match xor \in_array($value, $choices, true)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ choices }}', $this->formatValues($choices))
->setCode(Choice::NO_SUCH_CHOICE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Timezone extends Constraint
{
public const TIMEZONE_IDENTIFIER_ERROR = '5ce113e6-5e64-4ea2-90fe-d2233956db13';
public const TIMEZONE_IDENTIFIER_IN_ZONE_ERROR = 'b57767b1-36c0-40ac-a3d7-629420c775b8';
public const TIMEZONE_IDENTIFIER_IN_COUNTRY_ERROR = 'c4a22222-dc92-4fc0-abb0-d95b268c7d0b';
public const TIMEZONE_IDENTIFIER_INTL_ERROR = '45863c26-88dc-41ba-bf53-c73bd1f7e90d';

public $zone = \DateTimeZone::ALL;
public $countryCode;
public $intlCompatible = false;
public $message = 'This value is not a valid timezone.';

protected const ERROR_NAMES = [
self::TIMEZONE_IDENTIFIER_ERROR => 'TIMEZONE_IDENTIFIER_ERROR',
self::TIMEZONE_IDENTIFIER_IN_ZONE_ERROR => 'TIMEZONE_IDENTIFIER_IN_ZONE_ERROR',
self::TIMEZONE_IDENTIFIER_IN_COUNTRY_ERROR => 'TIMEZONE_IDENTIFIER_IN_COUNTRY_ERROR',
self::TIMEZONE_IDENTIFIER_INTL_ERROR => 'TIMEZONE_IDENTIFIER_INTL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public function __construct(
int|array|null $zone = null,
?string $message = null,
?string $countryCode = null,
?bool $intlCompatible = null,
?array $groups = null,
mixed $payload = null,
array $options = [],
) {
if (\is_array($zone)) {
$options = array_merge($zone, $options);
} elseif (null !== $zone) {
$options['value'] = $zone;
}

parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
$this->countryCode = $countryCode ?? $this->countryCode;
$this->intlCompatible = $intlCompatible ?? $this->intlCompatible;

if (null === $this->countryCode) {
if (0 >= $this->zone || \DateTimeZone::ALL_WITH_BC < $this->zone) {
throw new ConstraintDefinitionException('The option "zone" must be a valid range of "\DateTimeZone" constants.');
}
} elseif (\DateTimeZone::PER_COUNTRY !== (\DateTimeZone::PER_COUNTRY & $this->zone)) {
throw new ConstraintDefinitionException('The option "countryCode" can only be used when the "zone" option is configured with "\DateTimeZone::PER_COUNTRY".');
}
if ($this->intlCompatible && !class_exists(\IntlTimeZone::class)) {
throw new ConstraintDefinitionException('The option "intlCompatible" can only be used when the PHP intl extension is available.');
}
}

public function getDefaultOption(): ?string
{
return 'zone';
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;







abstract class AbstractComparisonValidator extends ConstraintValidator
{
private ?PropertyAccessorInterface $propertyAccessor;

public function __construct(?PropertyAccessorInterface $propertyAccessor = null)
{
$this->propertyAccessor = $propertyAccessor;
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof AbstractComparison) {
throw new UnexpectedTypeException($constraint, AbstractComparison::class);
}

if (null === $value) {
return;
}

if ($path = $constraint->propertyPath) {
if (null === $object = $this->context->getObject()) {
return;
}

try {
$comparedValue = $this->getPropertyAccessor()->getValue($object, $path);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(\sprintf('Invalid property path "%s" provided to "%s" constraint: ', $path, get_debug_type($constraint)).$e->getMessage(), 0, $e);
} catch (UninitializedPropertyException) {
$comparedValue = null;
}
} else {
$comparedValue = $constraint->value;
}




if (\is_string($comparedValue) && $value instanceof \DateTimeInterface) {
try {
$comparedValue = new $value($comparedValue);
} catch (\Exception) {
throw new ConstraintDefinitionException(\sprintf('The compared value "%s" could not be converted to a "%s" instance in the "%s" constraint.', $comparedValue, get_debug_type($value), get_debug_type($constraint)));
}
}

if (!$this->compareValues($value, $comparedValue)) {
$violationBuilder = $this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value }}', $this->formatValue($comparedValue, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value_type }}', $this->formatTypeOf($comparedValue))
->setCode($this->getErrorCode());

if (null !== $path) {
$violationBuilder->setParameter('{{ compared_value_path }}', $path);
}

$violationBuilder->addViolation();
}
}

private function getPropertyAccessor(): PropertyAccessorInterface
{
return $this->propertyAccessor ??= PropertyAccess::createPropertyAccessor();
}




abstract protected function compareValues(mixed $value1, mixed $value2): bool;




protected function getErrorCode(): ?string
{
return null;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class Required extends Existence
{
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;






class CallbackValidator extends ConstraintValidator
{



public function validate(mixed $object, Constraint $constraint)
{
if (!$constraint instanceof Callback) {
throw new UnexpectedTypeException($constraint, Callback::class);
}

$method = $constraint->callback;
if ($method instanceof \Closure) {
$method($object, $this->context, $constraint->payload);
} elseif (\is_array($method)) {
if (!\is_callable($method)) {
if (isset($method[0]) && \is_object($method[0])) {
$method[0] = $method[0]::class;
}
throw new ConstraintDefinitionException(json_encode($method).' targeted by Callback constraint is not a valid callable.');
}

$method($object, $this->context, $constraint->payload);
} elseif (null !== $object) {
if (!method_exists($object, $method)) {
throw new ConstraintDefinitionException(\sprintf('Method "%s" targeted by Callback constraint does not exist in class "%s".', $method, get_debug_type($object)));
}

$reflMethod = new \ReflectionMethod($object, $method);

if ($reflMethod->isStatic()) {
$reflMethod->invoke(null, $object, $this->context, $constraint->payload);
} else {
$reflMethod->invoke($object, $this->context, $constraint->payload);
}
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;








#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class NotEqualTo extends AbstractComparison
{
public const IS_EQUAL_ERROR = 'aa2e33da-25c8-4d76-8c6c-812f02ea89dd';

protected const ERROR_NAMES = [
self::IS_EQUAL_ERROR => 'IS_EQUAL_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'This value should not be equal to {{ compared_value }}.';
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

class CidrValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint): void
{
if (!$constraint instanceof Cidr) {
throw new UnexpectedTypeException($constraint, Cidr::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_string($value)) {
throw new UnexpectedValueException($value, 'string');
}

$cidrParts = explode('/', $value, 2);

if (!isset($cidrParts[1])
|| !ctype_digit($cidrParts[1])
|| '' === $cidrParts[0]
) {
$this->context
->buildViolation($constraint->message)
->setCode(Cidr::INVALID_CIDR_ERROR)
->addViolation();

return;
}

$ipAddress = $cidrParts[0];
$netmask = (int) $cidrParts[1];

$validV4 = Ip::V6 !== $constraint->version
&& filter_var($ipAddress, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)
&& $netmask <= 32;

$validV6 = Ip::V4 !== $constraint->version
&& filter_var($ipAddress, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6);

if (!$validV4 && !$validV6) {
$this->context
->buildViolation($constraint->message)
->setCode(Cidr::INVALID_CIDR_ERROR)
->addViolation();

return;
}

if ($netmask < $constraint->netmaskMin || $netmask > $constraint->netmaskMax) {
$this->context
->buildViolation($constraint->netmaskRangeViolationMessage)
->setParameter('{{ min }}', $constraint->netmaskMin)
->setParameter('{{ max }}', $constraint->netmaskMax)
->setCode(Cidr::OUT_OF_RANGE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;









#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class File extends Constraint
{


public const NOT_FOUND_ERROR = 'd2a3fb6e-7ddc-4210-8fbf-2ab345ce1998';
public const NOT_READABLE_ERROR = 'c20c92a4-5bfa-4202-9477-28e800e0f6ff';
public const EMPTY_ERROR = '5d743385-9775-4aa5-8ff5-495fb1e60137';
public const TOO_LARGE_ERROR = 'df8637af-d466-48c6-a59d-e7126250a654';
public const INVALID_MIME_TYPE_ERROR = '744f00bc-4389-4c74-92de-9a43cde55534';
public const INVALID_EXTENSION_ERROR = 'c8c7315c-6186-4719-8b71-5659e16bdcb7';
public const FILENAME_TOO_LONG = 'e5706483-91a8-49d8-9a59-5e81a3c634a8';

protected const ERROR_NAMES = [
self::NOT_FOUND_ERROR => 'NOT_FOUND_ERROR',
self::NOT_READABLE_ERROR => 'NOT_READABLE_ERROR',
self::EMPTY_ERROR => 'EMPTY_ERROR',
self::TOO_LARGE_ERROR => 'TOO_LARGE_ERROR',
self::INVALID_MIME_TYPE_ERROR => 'INVALID_MIME_TYPE_ERROR',
self::INVALID_EXTENSION_ERROR => 'INVALID_EXTENSION_ERROR',
self::FILENAME_TOO_LONG => 'FILENAME_TOO_LONG',
];




protected static $errorNames = self::ERROR_NAMES;

public $binaryFormat;
public $mimeTypes = [];
public ?int $filenameMaxLength = null;
public array|string|null $extensions = [];
public $notFoundMessage = 'The file could not be found.';
public $notReadableMessage = 'The file is not readable.';
public $maxSizeMessage = 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.';
public $mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.';
public string $extensionsMessage = 'The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.';
public $disallowEmptyMessage = 'An empty file is not allowed.';
public $filenameTooLongMessage = 'The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.';

public $uploadIniSizeErrorMessage = 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.';
public $uploadFormSizeErrorMessage = 'The file is too large.';
public $uploadPartialErrorMessage = 'The file was only partially uploaded.';
public $uploadNoFileErrorMessage = 'No file was uploaded.';
public $uploadNoTmpDirErrorMessage = 'No temporary folder was configured in php.ini.';
public $uploadCantWriteErrorMessage = 'Cannot write temporary file to disk.';
public $uploadExtensionErrorMessage = 'A PHP extension caused the upload to fail.';
public $uploadErrorMessage = 'The file could not be uploaded.';

protected $maxSize;




public function __construct(
?array $options = null,
int|string|null $maxSize = null,
?bool $binaryFormat = null,
array|string|null $mimeTypes = null,
?int $filenameMaxLength = null,
?string $notFoundMessage = null,
?string $notReadableMessage = null,
?string $maxSizeMessage = null,
?string $mimeTypesMessage = null,
?string $disallowEmptyMessage = null,
?string $filenameTooLongMessage = null,

?string $uploadIniSizeErrorMessage = null,
?string $uploadFormSizeErrorMessage = null,
?string $uploadPartialErrorMessage = null,
?string $uploadNoFileErrorMessage = null,
?string $uploadNoTmpDirErrorMessage = null,
?string $uploadCantWriteErrorMessage = null,
?string $uploadExtensionErrorMessage = null,
?string $uploadErrorMessage = null,
?array $groups = null,
mixed $payload = null,

array|string|null $extensions = null,
?string $extensionsMessage = null,
) {
parent::__construct($options, $groups, $payload);

$this->maxSize = $maxSize ?? $this->maxSize;
$this->binaryFormat = $binaryFormat ?? $this->binaryFormat;
$this->mimeTypes = $mimeTypes ?? $this->mimeTypes;
$this->filenameMaxLength = $filenameMaxLength ?? $this->filenameMaxLength;
$this->extensions = $extensions ?? $this->extensions;
$this->notFoundMessage = $notFoundMessage ?? $this->notFoundMessage;
$this->notReadableMessage = $notReadableMessage ?? $this->notReadableMessage;
$this->maxSizeMessage = $maxSizeMessage ?? $this->maxSizeMessage;
$this->mimeTypesMessage = $mimeTypesMessage ?? $this->mimeTypesMessage;
$this->extensionsMessage = $extensionsMessage ?? $this->extensionsMessage;
$this->disallowEmptyMessage = $disallowEmptyMessage ?? $this->disallowEmptyMessage;
$this->filenameTooLongMessage = $filenameTooLongMessage ?? $this->filenameTooLongMessage;
$this->uploadIniSizeErrorMessage = $uploadIniSizeErrorMessage ?? $this->uploadIniSizeErrorMessage;
$this->uploadFormSizeErrorMessage = $uploadFormSizeErrorMessage ?? $this->uploadFormSizeErrorMessage;
$this->uploadPartialErrorMessage = $uploadPartialErrorMessage ?? $this->uploadPartialErrorMessage;
$this->uploadNoFileErrorMessage = $uploadNoFileErrorMessage ?? $this->uploadNoFileErrorMessage;
$this->uploadNoTmpDirErrorMessage = $uploadNoTmpDirErrorMessage ?? $this->uploadNoTmpDirErrorMessage;
$this->uploadCantWriteErrorMessage = $uploadCantWriteErrorMessage ?? $this->uploadCantWriteErrorMessage;
$this->uploadExtensionErrorMessage = $uploadExtensionErrorMessage ?? $this->uploadExtensionErrorMessage;
$this->uploadErrorMessage = $uploadErrorMessage ?? $this->uploadErrorMessage;

if (null !== $this->maxSize) {
$this->normalizeBinaryFormat($this->maxSize);
}
}




public function __set(string $option, mixed $value)
{
if ('maxSize' === $option) {
$this->normalizeBinaryFormat($value);

return;
}

parent::__set($option, $value);
}

public function __get(string $option): mixed
{
if ('maxSize' === $option) {
return $this->maxSize;
}

return parent::__get($option);
}

public function __isset(string $option): bool
{
if ('maxSize' === $option) {
return true;
}

return parent::__isset($option);
}

private function normalizeBinaryFormat(int|string $maxSize): void
{
$factors = [
'k' => 1000,
'ki' => 1 << 10,
'm' => 1000 * 1000,
'mi' => 1 << 20,
'g' => 1000 * 1000 * 1000,
'gi' => 1 << 30,
];
if (ctype_digit((string) $maxSize)) {
$this->maxSize = (int) $maxSize;
$this->binaryFormat ??= false;
} elseif (preg_match('/^(\d++)('.implode('|', array_keys($factors)).')$/i', $maxSize, $matches)) {
$this->maxSize = $matches[1] * $factors[$unit = strtolower($matches[2])];
$this->binaryFormat ??= 2 === \strlen($unit);
} else {
throw new ConstraintDefinitionException(\sprintf('"%s" is not a valid maximum size.', $maxSize));
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;










#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Cidr extends Constraint
{
public const INVALID_CIDR_ERROR = '5649e53a-5afb-47c5-a360-ffbab3be8567';
public const OUT_OF_RANGE_ERROR = 'b9f14a51-acbd-401a-a078-8c6b204ab32f';

protected const ERROR_NAMES = [
self::INVALID_CIDR_ERROR => 'INVALID_CIDR_ERROR',
self::OUT_OF_RANGE_ERROR => 'OUT_OF_RANGE_VIOLATION',
];

private const NET_MAXES = [
Ip::ALL => 128,
Ip::V4 => 32,
Ip::V6 => 128,
];




protected static $errorNames = self::ERROR_NAMES;

public $version = Ip::ALL;

public $message = 'This value is not a valid CIDR notation.';

public $netmaskRangeViolationMessage = 'The value of the netmask should be between {{ min }} and {{ max }}.';

public $netmaskMin = 0;

public $netmaskMax;

public function __construct(
?array $options = null,
?string $version = null,
?int $netmaskMin = null,
?int $netmaskMax = null,
?string $message = null,
?array $groups = null,
$payload = null,
) {
$this->version = $version ?? $options['version'] ?? $this->version;

if (!\array_key_exists($this->version, self::NET_MAXES)) {
throw new ConstraintDefinitionException(\sprintf('The option "version" must be one of "%s".', implode('", "', array_keys(self::NET_MAXES))));
}

$this->netmaskMin = $netmaskMin ?? $options['netmaskMin'] ?? $this->netmaskMin;
$this->netmaskMax = $netmaskMax ?? $options['netmaskMax'] ?? self::NET_MAXES[$this->version];
$this->message = $message ?? $this->message;

unset($options['netmaskMin'], $options['netmaskMax'], $options['version']);

if ($this->netmaskMin < 0 || $this->netmaskMax > self::NET_MAXES[$this->version] || $this->netmaskMin > $this->netmaskMax) {
throw new ConstraintDefinitionException(\sprintf('The netmask range must be between 0 and %d.', self::NET_MAXES[$this->version]));
}

parent::__construct($options, $groups, $payload);
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;









class IssnValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Issn) {
throw new UnexpectedTypeException($constraint, Issn::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;
$canonical = $value;



if (isset($canonical[4]) && '-' === $canonical[4]) {

$canonical = substr($canonical, 0, 4).substr($canonical, 5);
} elseif ($constraint->requireHyphen) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::MISSING_HYPHEN_ERROR)
->addViolation();

return;
}

$length = \strlen($canonical);

if ($length < 8) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::TOO_SHORT_ERROR)
->addViolation();

return;
}

if ($length > 8) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::TOO_LONG_ERROR)
->addViolation();

return;
}



if (!ctype_digit(substr($canonical, 0, 7))) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}



if (!ctype_digit($canonical[7]) && 'x' !== $canonical[7] && 'X' !== $canonical[7]) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}



if ($constraint->caseSensitive && 'x' === $canonical[7]) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::INVALID_CASE_ERROR)
->addViolation();

return;
}


$checkSum = 'X' === $canonical[7] || 'x' === $canonical[7] ? 10 : $canonical[7];

for ($i = 0; $i < 7; ++$i) {

$checkSum += (8 - $i) * (int) $canonical[$i];
}

if (0 !== $checkSum % 11) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Issn::CHECKSUM_FAILED_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\SyntaxError;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

trigger_deprecation('symfony/validator', '6.1', 'The "%s" constraint is deprecated since symfony 6.1, use "ExpressionSyntaxValidator" instead.', ExpressionLanguageSyntaxValidator::class);






class ExpressionLanguageSyntaxValidator extends ConstraintValidator
{
private ?ExpressionLanguage $expressionLanguage;

public function __construct(?ExpressionLanguage $expressionLanguage = null)
{
if (!class_exists(ExpressionLanguage::class)) {
throw new \LogicException(\sprintf('The "%s" class requires the "ExpressionLanguage" component. Try running "composer require symfony/expression-language".', self::class));
}

$this->expressionLanguage = $expressionLanguage;
}

public function validate(mixed $expression, Constraint $constraint): void
{
if (!$constraint instanceof ExpressionLanguageSyntax) {
throw new UnexpectedTypeException($constraint, ExpressionLanguageSyntax::class);
}

if (!\is_string($expression)) {
throw new UnexpectedValueException($expression, 'string');
}

$this->expressionLanguage ??= new ExpressionLanguage();

try {
$this->expressionLanguage->lint($expression, $constraint->allowedVariables);
} catch (SyntaxError $exception) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ syntax_error }}', $this->formatValue($exception->getMessage()))
->setInvalidValue((string) $expression)
->setCode(ExpressionLanguageSyntax::EXPRESSION_LANGUAGE_SYNTAX_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Locales;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class LocaleValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Locale) {
throw new UnexpectedTypeException($constraint, Locale::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$inputValue = (string) $value;
$value = $inputValue;
if ($constraint->canonicalize) {
$value = \Locale::canonicalize($value);
}

if (null === $value || !Locales::exists($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($inputValue))
->setCode(Locale::NO_SUCH_LOCALE_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;





class ExpressionValidator extends ConstraintValidator
{
private ExpressionLanguage $expressionLanguage;

public function __construct(?ExpressionLanguage $expressionLanguage = null)
{
if ($expressionLanguage) {
$this->expressionLanguage = $expressionLanguage;
}
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Expression) {
throw new UnexpectedTypeException($constraint, Expression::class);
}

$variables = $constraint->values;
$variables['value'] = $value;
$variables['this'] = $this->context->getObject();
$variables['context'] = $this->context;

if ($constraint->negate xor $this->getExpressionLanguage()->evaluate($constraint->expression, $variables)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value, self::OBJECT_TO_STRING))
->setCode(Expression::EXPRESSION_FAILED_ERROR)
->addViolation();
}
}

private function getExpressionLanguage(): ExpressionLanguage
{
if (!isset($this->expressionLanguage)) {
$this->expressionLanguage = new ExpressionLanguage();
$this->expressionLanguage->registerProvider(new ExpressionLanguageProvider());
}

return $this->expressionLanguage;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Countries;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class CountryValidator extends ConstraintValidator
{



public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Country) {
throw new UnexpectedTypeException($constraint, Country::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;

if ($constraint->alpha3 ? !Countries::alpha3CodeExists($value) : !Countries::exists($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Country::NO_SUCH_COUNTRY_ERROR)
->addViolation();
}
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class NotIdenticalToValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return $value1 !== $value2;
}

protected function getErrorCode(): ?string
{
return NotIdenticalTo::IS_IDENTICAL_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;











#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class Luhn extends Constraint
{
public const INVALID_CHARACTERS_ERROR = 'dfad6d23-1b74-4374-929b-5cbb56fc0d9e';
public const CHECKSUM_FAILED_ERROR = '4d760774-3f50-4cd5-a6d5-b10a3299d8d3';

protected const ERROR_NAMES = [
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
self::CHECKSUM_FAILED_ERROR => 'CHECKSUM_FAILED_ERROR',
];




protected static $errorNames = self::ERROR_NAMES;

public $message = 'Invalid card number.';

public function __construct(
?array $options = null,
?string $message = null,
?array $groups = null,
mixed $payload = null,
) {
parent::__construct($options, $groups, $payload);

$this->message = $message ?? $this->message;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Countries;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessor;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\LogicException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class BicValidator extends ConstraintValidator
{

private const BIC_COUNTRY_TO_IBAN_COUNTRY_MAP = [

'GF' => 'FR', 
'PF' => 'FR', 
'TF' => 'FR', 
'GP' => 'FR', 
'MQ' => 'FR', 
'YT' => 'FR', 
'NC' => 'FR', 
'RE' => 'FR', 
'BL' => 'FR', 
'MF' => 'FR', 
'PM' => 'FR', 
'WF' => 'FR', 

'JE' => 'GB', 
'IM' => 'GB', 
'GG' => 'GB', 
'VG' => 'GB', 

'AX' => 'FI', 

'IC' => 'ES', 
'EA' => 'ES', 
];

private ?PropertyAccessor $propertyAccessor;

public function __construct(?PropertyAccessor $propertyAccessor = null)
{
$this->propertyAccessor = $propertyAccessor;
}




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Bic) {
throw new UnexpectedTypeException($constraint, Bic::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$canonicalize = str_replace(' ', '', $value);


if (!\in_array(\strlen($canonicalize), [8, 11])) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Bic::INVALID_LENGTH_ERROR)
->addViolation();

return;
}


if (!ctype_alnum($canonicalize)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Bic::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}

$bicCountryCode = substr($canonicalize, 4, 2);
if (!isset(self::BIC_COUNTRY_TO_IBAN_COUNTRY_MAP[$bicCountryCode]) && !Countries::exists($bicCountryCode)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Bic::INVALID_COUNTRY_CODE_ERROR)
->addViolation();

return;
}


if (strtoupper($canonicalize) !== $canonicalize) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Bic::INVALID_CASE_ERROR)
->addViolation();

return;
}


$iban = $constraint->iban;
$path = $constraint->ibanPropertyPath;
if ($path && null !== $object = $this->context->getObject()) {
try {
$iban = $this->getPropertyAccessor()->getValue($object, $path);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(\sprintf('Invalid property path "%s" provided to "%s" constraint: ', $path, get_debug_type($constraint)).$e->getMessage(), 0, $e);
} catch (UninitializedPropertyException) {
$iban = null;
}
}
if (!$iban) {
return;
}
$ibanCountryCode = substr($iban, 0, 2);
if (ctype_alpha($ibanCountryCode) && !$this->bicAndIbanCountriesMatch($bicCountryCode, $ibanCountryCode)) {
$this->context->buildViolation($constraint->ibanMessage)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ iban }}', $iban)
->setCode(Bic::INVALID_IBAN_COUNTRY_CODE_ERROR)
->addViolation();
}
}

private function getPropertyAccessor(): PropertyAccessor
{
if (null === $this->propertyAccessor) {
if (!class_exists(PropertyAccess::class)) {
throw new LogicException('Unable to use property path as the Symfony PropertyAccess component is not installed. Try running "composer require symfony/property-access".');
}
$this->propertyAccessor = PropertyAccess::createPropertyAccessor();
}

return $this->propertyAccessor;
}

private function bicAndIbanCountriesMatch(string $bicCountryCode, string $ibanCountryCode): bool
{
return $ibanCountryCode === $bicCountryCode || $ibanCountryCode === (self::BIC_COUNTRY_TO_IBAN_COUNTRY_MAP[$bicCountryCode] ?? null);
}
}
<?php










namespace Symfony\Component\Validator\Constraints;







class GreaterThanValidator extends AbstractComparisonValidator
{
protected function compareValues(mixed $value1, mixed $value2): bool
{
return null === $value2 || $value1 > $value2;
}

protected function getErrorCode(): ?string
{
return GreaterThan::TOO_LOW_ERROR;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;






class IbanValidator extends ConstraintValidator
{













private const FORMATS = [

'AD' => 'AD\d{2}\d{4}\d{4}[\dA-Z]{12}', 
'AE' => 'AE\d{2}\d{3}\d{16}', 
'AL' => 'AL\d{2}\d{8}[\dA-Z]{16}', 
'AO' => 'AO\d{2}\d{21}', 
'AT' => 'AT\d{2}\d{5}\d{11}', 
'AX' => 'FI\d{2}\d{3}\d{11}', 
'AZ' => 'AZ\d{2}[A-Z]{4}[\dA-Z]{20}', 
'BA' => 'BA\d{2}\d{3}\d{3}\d{8}\d{2}', 
'BE' => 'BE\d{2}\d{3}\d{7}\d{2}', 
'BF' => 'BF\d{2}[\dA-Z]{2}\d{22}', 
'BG' => 'BG\d{2}[A-Z]{4}\d{4}\d{2}[\dA-Z]{8}', 
'BH' => 'BH\d{2}[A-Z]{4}[\dA-Z]{14}', 
'BI' => 'BI\d{2}\d{5}\d{5}\d{11}\d{2}', 
'BJ' => 'BJ\d{2}[\dA-Z]{2}\d{22}', 
'BL' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'BR' => 'BR\d{2}\d{8}\d{5}\d{10}[A-Z]{1}[\dA-Z]{1}', 
'BY' => 'BY\d{2}[\dA-Z]{4}\d{4}[\dA-Z]{16}', 
'CF' => 'CF\d{2}\d{23}', 
'CG' => 'CG\d{2}\d{23}', 
'CH' => 'CH\d{2}\d{5}[\dA-Z]{12}', 
'CI' => 'CI\d{2}[A-Z]{1}\d{23}', 
'CM' => 'CM\d{2}\d{23}', 
'CR' => 'CR\d{2}\d{4}\d{14}', 
'CV' => 'CV\d{2}\d{21}', 
'CY' => 'CY\d{2}\d{3}\d{5}[\dA-Z]{16}', 
'CZ' => 'CZ\d{2}\d{4}\d{6}\d{10}', 
'DE' => 'DE\d{2}\d{8}\d{10}', 
'DJ' => 'DJ\d{2}\d{5}\d{5}\d{11}\d{2}', 
'DK' => 'DK\d{2}\d{4}\d{9}\d{1}', 
'DO' => 'DO\d{2}[\dA-Z]{4}\d{20}', 
'DZ' => 'DZ\d{2}\d{22}', 
'EE' => 'EE\d{2}\d{2}\d{14}', 
'EG' => 'EG\d{2}\d{4}\d{4}\d{17}', 
'ES' => 'ES\d{2}\d{4}\d{4}\d{1}\d{1}\d{10}', 
'FI' => 'FI\d{2}\d{3}\d{11}', 
'FK' => 'FK\d{2}[A-Z]{2}\d{12}', 
'FO' => 'FO\d{2}\d{4}\d{9}\d{1}', 
'FR' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'GA' => 'GA\d{2}\d{23}', 
'GB' => 'GB\d{2}[A-Z]{4}\d{6}\d{8}', 
'GE' => 'GE\d{2}[A-Z]{2}\d{16}', 
'GF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'GG' => 'GB\d{2}[A-Z]{4}\d{6}\d{8}', 
'GI' => 'GI\d{2}[A-Z]{4}[\dA-Z]{15}', 
'GL' => 'GL\d{2}\d{4}\d{9}\d{1}', 
'GP' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'GQ' => 'GQ\d{2}\d{23}', 
'GR' => 'GR\d{2}\d{3}\d{4}[\dA-Z]{16}', 
'GT' => 'GT\d{2}[\dA-Z]{4}[\dA-Z]{20}', 
'GW' => 'GW\d{2}[\dA-Z]{2}\d{19}', 
'HN' => 'HN\d{2}[A-Z]{4}\d{20}', 
'HR' => 'HR\d{2}\d{7}\d{10}', 
'HU' => 'HU\d{2}\d{3}\d{4}\d{1}\d{15}\d{1}', 
'IE' => 'IE\d{2}[A-Z]{4}\d{6}\d{8}', 
'IL' => 'IL\d{2}\d{3}\d{3}\d{13}', 
'IM' => 'GB\d{2}[A-Z]{4}\d{6}\d{8}', 
'IQ' => 'IQ\d{2}[A-Z]{4}\d{3}\d{12}', 
'IR' => 'IR\d{2}\d{22}', 
'IS' => 'IS\d{2}\d{4}\d{2}\d{6}\d{10}', 
'IT' => 'IT\d{2}[A-Z]{1}\d{5}\d{5}[\dA-Z]{12}', 
'JE' => 'GB\d{2}[A-Z]{4}\d{6}\d{8}', 
'JO' => 'JO\d{2}[A-Z]{4}\d{4}[\dA-Z]{18}', 
'KM' => 'KM\d{2}\d{23}', 
'KW' => 'KW\d{2}[A-Z]{4}[\dA-Z]{22}', 
'KZ' => 'KZ\d{2}\d{3}[\dA-Z]{13}', 
'LB' => 'LB\d{2}\d{4}[\dA-Z]{20}', 
'LC' => 'LC\d{2}[A-Z]{4}[\dA-Z]{24}', 
'LI' => 'LI\d{2}\d{5}[\dA-Z]{12}', 
'LT' => 'LT\d{2}\d{5}\d{11}', 
'LU' => 'LU\d{2}\d{3}[\dA-Z]{13}', 
'LV' => 'LV\d{2}[A-Z]{4}[\dA-Z]{13}', 
'LY' => 'LY\d{2}\d{3}\d{3}\d{15}', 
'MA' => 'MA\d{2}\d{24}', 
'MC' => 'MC\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'MD' => 'MD\d{2}[\dA-Z]{2}[\dA-Z]{18}', 
'ME' => 'ME\d{2}\d{3}\d{13}\d{2}', 
'MF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'MG' => 'MG\d{2}\d{23}', 
'MK' => 'MK\d{2}\d{3}[\dA-Z]{10}\d{2}', 
'ML' => 'ML\d{2}[\dA-Z]{2}\d{22}', 
'MN' => 'MN\d{2}\d{4}\d{12}', 
'MQ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'MR' => 'MR\d{2}\d{5}\d{5}\d{11}\d{2}', 
'MT' => 'MT\d{2}[A-Z]{4}\d{5}[\dA-Z]{18}', 
'MU' => 'MU\d{2}[A-Z]{4}\d{2}\d{2}\d{12}\d{3}[A-Z]{3}', 
'MZ' => 'MZ\d{2}\d{21}', 
'NC' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'NE' => 'NE\d{2}[A-Z]{2}\d{22}', 
'NI' => 'NI\d{2}[A-Z]{4}\d{20}', 
'NL' => 'NL\d{2}[A-Z]{4}\d{10}', 
'NO' => 'NO\d{2}\d{4}\d{6}\d{1}', 
'OM' => 'OM\d{2}\d{3}[\dA-Z]{16}', 
'PF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'PK' => 'PK\d{2}[A-Z]{4}[\dA-Z]{16}', 
'PL' => 'PL\d{2}\d{8}\d{16}', 
'PM' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'PS' => 'PS\d{2}[A-Z]{4}[\dA-Z]{21}', 
'PT' => 'PT\d{2}\d{4}\d{4}\d{11}\d{2}', 
'QA' => 'QA\d{2}[A-Z]{4}[\dA-Z]{21}', 
'RE' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'RO' => 'RO\d{2}[A-Z]{4}[\dA-Z]{16}', 
'RS' => 'RS\d{2}\d{3}\d{13}\d{2}', 
'RU' => 'RU\d{2}\d{9}\d{5}[\dA-Z]{15}', 
'SA' => 'SA\d{2}\d{2}[\dA-Z]{18}', 
'SC' => 'SC\d{2}[A-Z]{4}\d{2}\d{2}\d{16}[A-Z]{3}', 
'SD' => 'SD\d{2}\d{2}\d{12}', 
'SE' => 'SE\d{2}\d{3}\d{16}\d{1}', 
'SI' => 'SI\d{2}\d{5}\d{8}\d{2}', 
'SK' => 'SK\d{2}\d{4}\d{6}\d{10}', 
'SM' => 'SM\d{2}[A-Z]{1}\d{5}\d{5}[\dA-Z]{12}', 
'SN' => 'SN\d{2}[A-Z]{2}\d{22}', 
'SO' => 'SO\d{2}\d{4}\d{3}\d{12}', 
'ST' => 'ST\d{2}\d{8}\d{11}\d{2}', 
'SV' => 'SV\d{2}[A-Z]{4}\d{20}', 
'TD' => 'TD\d{2}\d{23}', 
'TF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'TG' => 'TG\d{2}[A-Z]{2}\d{22}', 
'TL' => 'TL\d{2}\d{3}\d{14}\d{2}', 
'TN' => 'TN\d{2}\d{2}\d{3}\d{13}\d{2}', 
'TR' => 'TR\d{2}\d{5}\d{1}[\dA-Z]{16}', 
'UA' => 'UA\d{2}\d{6}[\dA-Z]{19}', 
'VA' => 'VA\d{2}\d{3}\d{15}', 
'VG' => 'VG\d{2}[A-Z]{4}\d{16}', 
'WF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
'XK' => 'XK\d{2}\d{4}\d{10}\d{2}', 
'YE' => 'YE\d{2}[A-Z]{4}\d{4}[\dA-Z]{18}', 
'YT' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', 
];




public function validate(mixed $value, Constraint $constraint)
{
if (!$constraint instanceof Iban) {
throw new UnexpectedTypeException($constraint, Iban::class);
}

if (null === $value || '' === $value) {
return;
}

if (!\is_scalar($value) && !$value instanceof \Stringable) {
throw new UnexpectedValueException($value, 'string');
}

$value = (string) $value;


$canonicalized = str_replace(' ', '', strtoupper($value));


if (!ctype_alnum($canonicalized)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::INVALID_CHARACTERS_ERROR)
->addViolation();

return;
}


$countryCode = substr($canonicalized, 0, 2);

if (!ctype_alpha($countryCode)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::INVALID_COUNTRY_CODE_ERROR)
->addViolation();

return;
}


if (!\array_key_exists($countryCode, self::FORMATS)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::NOT_SUPPORTED_COUNTRY_CODE_ERROR)
->addViolation();

return;
}


if (!preg_match('/^'.self::FORMATS[$countryCode].'$/', $canonicalized)
) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::INVALID_FORMAT_ERROR)
->addViolation();

return;
}



$checkDigits = (int) substr($canonicalized, 2, 2);
if ($checkDigits < 2 || $checkDigits > 98) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::CHECKSUM_FAILED_ERROR)
->addViolation();

return;
}




$canonicalized = substr($canonicalized, 4).substr($canonicalized, 0, 4);






$checkSum = self::toBigInt($canonicalized);




if (1 !== self::bigModulo97($checkSum)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setCode(Iban::CHECKSUM_FAILED_ERROR)
->addViolation();
}
}

private static function toBigInt(string $string): string
{
$chars = str_split($string);
$bigInt = '';

foreach ($chars as $char) {

if (ctype_upper($char)) {
$bigInt .= (\ord($char) - 55);

continue;
}


$bigInt .= $char;
}

return $bigInt;
}

private static function bigModulo97(string $bigInt): int
{
$parts = str_split($bigInt, 7);
$rest = 0;

foreach ($parts as $part) {
$rest = ($rest.$part) % 97;
}

return $rest;
}
}
<?php










namespace Symfony\Component\Validator\Constraints;

use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use Symfony\Component\Validator\Attribute\HasNamedArguments;

/**
@NamedArgumentConstructor






*/
#[\Attribute(\Attribute::TARGET_CLASS)]
class GroupSequenceProvider
{
#[HasNamedArguments]
public function __construct(public ?string $provider = null)
{
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Context\ExecutionContextInterface;






abstract class ConstraintValidator implements ConstraintValidatorInterface
{




public const PRETTY_DATE = 1;




public const OBJECT_TO_STRING = 2;




protected $context;




public function initialize(ExecutionContextInterface $context)
{
$this->context = $context;
}









protected function formatTypeOf(mixed $value): string
{
return get_debug_type($value);
}




















protected function formatValue(mixed $value, int $format = 0): string
{
if (($format & self::PRETTY_DATE) && $value instanceof \DateTimeInterface) {
if (class_exists(\IntlDateFormatter::class)) {
$formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, 'UTC');

return $formatter->format(new \DateTimeImmutable(
$value->format('Y-m-d H:i:s.u'),
new \DateTimeZone('UTC')
));
}

return $value->format('Y-m-d H:i:s');
}

if ($value instanceof \UnitEnum) {
return $value->name;
}

if (\is_object($value)) {
if (($format & self::OBJECT_TO_STRING) && $value instanceof \Stringable) {
return $value->__toString();
}

return 'object';
}

if (\is_array($value)) {
return 'array';
}

if (\is_string($value)) {
return '"'.$value.'"';
}

if (\is_resource($value)) {
return 'resource';
}

if (null === $value) {
return 'null';
}

if (false === $value) {
return 'false';
}

if (true === $value) {
return 'true';
}

if (is_nan($value)) {
return 'NAN';
}

return (string) $value;
}













protected function formatValues(array $values, int $format = 0): string
{
foreach ($values as $key => $value) {
$values[$key] = $this->formatValue($value, $format);
}

return implode(', ', $values);
}
}
<?php










namespace Symfony\Component\Validator\DataCollector;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Symfony\Component\Validator\Validator\TraceableValidator;
use Symfony\Component\VarDumper\Caster\Caster;
use Symfony\Component\VarDumper\Caster\ClassStub;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\Stub;






class ValidatorDataCollector extends DataCollector implements LateDataCollectorInterface
{
private TraceableValidator $validator;

public function __construct(TraceableValidator $validator)
{
$this->validator = $validator;
$this->reset();
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{

}

public function reset(): void
{
$this->data = [
'calls' => $this->cloneVar([]),
'violations_count' => 0,
];
}

public function lateCollect(): void
{
$collected = $this->validator->getCollectedData();
$this->data['calls'] = $this->cloneVar($collected);
$this->data['violations_count'] = array_reduce($collected, fn ($previous, $item) => $previous + \count($item['violations']), 0);
}

public function getCalls(): Data
{
return $this->data['calls'];
}

public function getViolationsCount(): int
{
return $this->data['violations_count'];
}

public function getName(): string
{
return 'validator';
}

protected function getCasters(): array
{
return parent::getCasters() + [
\Exception::class => function (\Exception $e, array $a, Stub $s) {
foreach (["\0Exception\0previous", "\0Exception\0trace"] as $k) {
if (isset($a[$k])) {
unset($a[$k]);
++$s->cut;
}
}

return $a;
},
FormInterface::class => fn (FormInterface $f, array $a) => [
Caster::PREFIX_VIRTUAL.'name' => $f->getName(),
Caster::PREFIX_VIRTUAL.'type_class' => new ClassStub($f->getConfig()->getType()->getInnerType()::class),
Caster::PREFIX_VIRTUAL.'data' => $f->getData(),
],
];
}
}
<?php










namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\OutOfBoundsException;

/**
@extends
@extends






*/
interface ConstraintViolationListInterface extends \Traversable, \Countable, \ArrayAccess
{





public function add(ConstraintViolationInterface $violation);






public function addAll(self $otherList);








public function get(int $offset): ConstraintViolationInterface;






public function has(int $offset): bool;








public function set(int $offset, ConstraintViolationInterface $violation);








public function remove(int $offset);
}
Copyright (c) 2014-present 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.
<?php










namespace Symfony\Component\VarDumper\Cloner;

use Symfony\Component\VarDumper\Caster\Caster;
use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider;




class Data implements \ArrayAccess, \Countable, \IteratorAggregate, \Stringable
{
private array $data;
private int $position = 0;
private int|string $key = 0;
private int $maxDepth = 20;
private int $maxItemsPerDepth = -1;
private int $useRefHandles = -1;
private array $context = [];




public function __construct(array $data)
{
$this->data = $data;
}

public function getType(): ?string
{
$item = $this->data[$this->position][$this->key];

if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
$item = $item->value;
}
if (!$item instanceof Stub) {
return \gettype($item);
}
if (Stub::TYPE_STRING === $item->type) {
return 'string';
}
if (Stub::TYPE_ARRAY === $item->type) {
return 'array';
}
if (Stub::TYPE_OBJECT === $item->type) {
return $item->class;
}
if (Stub::TYPE_RESOURCE === $item->type) {
return $item->class.' resource';
}

return null;
}








public function getValue(array|bool $recursive = false): string|int|float|bool|array|null
{
$item = $this->data[$this->position][$this->key];

if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
$item = $item->value;
}
if (!($item = $this->getStub($item)) instanceof Stub) {
return $item;
}
if (Stub::TYPE_STRING === $item->type) {
return $item->value;
}

$children = $item->position ? $this->data[$item->position] : [];

foreach ($children as $k => $v) {
if ($recursive && !($v = $this->getStub($v)) instanceof Stub) {
continue;
}
$children[$k] = clone $this;
$children[$k]->key = $k;
$children[$k]->position = $item->position;

if ($recursive) {
if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) {
$recursive = (array) $recursive;
if (isset($recursive[$v->position])) {
continue;
}
$recursive[$v->position] = true;
}
$children[$k] = $children[$k]->getValue($recursive);
}
}

return $children;
}

public function count(): int
{
return \count($this->getValue());
}

public function getIterator(): \Traversable
{
if (!\is_array($value = $this->getValue())) {
throw new \LogicException(\sprintf('"%s" object holds non-iterable type "%s".', self::class, get_debug_type($value)));
}

yield from $value;
}

public function __get(string $key): mixed
{
if (null !== $data = $this->seek($key)) {
$item = $this->getStub($data->data[$data->position][$data->key]);

return $item instanceof Stub || [] === $item ? $data : $item;
}

return null;
}

public function __isset(string $key): bool
{
return null !== $this->seek($key);
}

public function offsetExists(mixed $key): bool
{
return $this->__isset($key);
}

public function offsetGet(mixed $key): mixed
{
return $this->__get($key);
}

public function offsetSet(mixed $key, mixed $value): void
{
throw new \BadMethodCallException(self::class.' objects are immutable.');
}

public function offsetUnset(mixed $key): void
{
throw new \BadMethodCallException(self::class.' objects are immutable.');
}

public function __toString(): string
{
$value = $this->getValue();

if (!\is_array($value)) {
return (string) $value;
}

return \sprintf('%s (count=%d)', $this->getType(), \count($value));
}




public function withMaxDepth(int $maxDepth): static
{
$data = clone $this;
$data->maxDepth = $maxDepth;

return $data;
}




public function withMaxItemsPerDepth(int $maxItemsPerDepth): static
{
$data = clone $this;
$data->maxItemsPerDepth = $maxItemsPerDepth;

return $data;
}






public function withRefHandles(bool $useRefHandles): static
{
$data = clone $this;
$data->useRefHandles = $useRefHandles ? -1 : 0;

return $data;
}

public function withContext(array $context): static
{
$data = clone $this;
$data->context = $context;

return $data;
}

public function getContext(): array
{
return $this->context;
}




public function seek(string|int $key): ?static
{
$item = $this->data[$this->position][$this->key];

if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
$item = $item->value;
}
if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) {
return null;
}
$keys = [$key];

switch ($item->type) {
case Stub::TYPE_OBJECT:
$keys[] = Caster::PREFIX_DYNAMIC.$key;
$keys[] = Caster::PREFIX_PROTECTED.$key;
$keys[] = Caster::PREFIX_VIRTUAL.$key;
$keys[] = "\0$item->class\0$key";

case Stub::TYPE_ARRAY:
case Stub::TYPE_RESOURCE:
break;
default:
return null;
}

$data = null;
$children = $this->data[$item->position];

foreach ($keys as $key) {
if (isset($children[$key]) || \array_key_exists($key, $children)) {
$data = clone $this;
$data->key = $key;
$data->position = $item->position;
break;
}
}

return $data;
}




public function dump(DumperInterface $dumper): void
{
$refs = [0];
$cursor = new Cursor();
$cursor->hashType = -1;
$cursor->attr = $this->context[SourceContextProvider::class] ?? [];
$label = $this->context['label'] ?? '';

if ($cursor->attr || '' !== $label) {
$dumper->dumpScalar($cursor, 'label', $label);
}
$cursor->hashType = 0;
$this->dumpItem($dumper, $cursor, $refs, $this->data[$this->position][$this->key]);
}






private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, mixed $item): void
{
$cursor->refIndex = 0;
$cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0;
$cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0;
$firstSeen = true;

if (!$item instanceof Stub) {
$cursor->attr = [];
$type = \gettype($item);
if ('array' === $type && $item) {
$item = $this->getStub($item);
}
} elseif (Stub::TYPE_REF === $item->type) {
if ($item->handle) {
if (!isset($refs[$r = $item->handle - (\PHP_INT_MAX >> 1)])) {
$cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
} else {
$firstSeen = false;
}
$cursor->hardRefTo = $refs[$r];
$cursor->hardRefHandle = $this->useRefHandles & $item->handle;
$cursor->hardRefCount = 0 < $item->handle ? $item->refCount : 0;
}
$cursor->attr = $item->attr;
$type = $item->class ?: \gettype($item->value);
$item = $this->getStub($item->value);
}
if ($item instanceof Stub) {
if ($item->refCount) {
if (!isset($refs[$r = $item->handle])) {
$cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
} else {
$firstSeen = false;
}
$cursor->softRefTo = $refs[$r];
}
$cursor->softRefHandle = $this->useRefHandles & $item->handle;
$cursor->softRefCount = $item->refCount;
$cursor->attr = $item->attr;
$cut = $item->cut;

if ($item->position && $firstSeen) {
$children = $this->data[$item->position];

if ($cursor->stop) {
if ($cut >= 0) {
$cut += \count($children);
}
$children = [];
}
} else {
$children = [];
}
switch ($item->type) {
case Stub::TYPE_STRING:
$dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut);
break;

case Stub::TYPE_ARRAY:
$item = clone $item;
$item->type = $item->class;
$item->class = $item->value;

case Stub::TYPE_OBJECT:
case Stub::TYPE_RESOURCE:
$withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth;
$dumper->enterHash($cursor, $item->type, $item->class, $withChildren);
if ($withChildren) {
if ($cursor->skipChildren) {
$withChildren = false;
$cut = -1;
} else {
$cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class);
}
} elseif ($children && 0 <= $cut) {
$cut += \count($children);
}
$cursor->skipChildren = false;
$dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut);
break;

case Stub::TYPE_SCALAR:
$dumper->dumpScalar($cursor, 'default', $item->attr['value']);
break;

default:
throw new \RuntimeException(\sprintf('Unexpected Stub type: "%s".', $item->type));
}
} elseif ('array' === $type) {
$dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false);
$dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0);
} elseif ('string' === $type) {
$dumper->dumpString($cursor, $item, false, 0);
} else {
$dumper->dumpScalar($cursor, $type, $item);
}
}






private function dumpChildren(DumperInterface $dumper, Cursor $parentCursor, array &$refs, array $children, int $hashCut, int $hashType, bool $dumpKeys): int
{
$cursor = clone $parentCursor;
++$cursor->depth;
$cursor->hashType = $hashType;
$cursor->hashIndex = 0;
$cursor->hashLength = \count($children);
$cursor->hashCut = $hashCut;
foreach ($children as $key => $child) {
$cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key);
$cursor->hashKey = $dumpKeys ? $key : null;
$this->dumpItem($dumper, $cursor, $refs, $child);
if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) {
$parentCursor->stop = true;

return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut;
}
}

return $hashCut;
}

private function getStub(mixed $item): mixed
{
if (!$item || !\is_array($item)) {
return $item;
}

$stub = new Stub();
$stub->type = Stub::TYPE_ARRAY;
foreach ($item as $stub->class => $stub->position) {
}
if (isset($item[0])) {
$stub->cut = $item[0];
}
$stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0);

return $stub;
}
}
<?php










namespace Symfony\Component\VarDumper\Cloner;




class VarCloner extends AbstractCloner
{
private static array $arrayCache = [];

protected function doClone(mixed $var): array
{
$len = 1; 
$pos = 0; 
$refsCounter = 0; 
$queue = [[$var]]; 
$hardRefs = []; 
$objRefs = []; 
$objects = []; 
$resRefs = []; 
$maxItems = $this->maxItems;
$maxString = $this->maxString;
$minDepth = $this->minDepth;
$currentDepth = 0; 
$currentDepthFinalIndex = 0; 
$minimumDepthReached = 0 === $minDepth; 
$a = null; 
$stub = null; 


$arrayStub = new Stub();
$arrayStub->type = Stub::TYPE_ARRAY;

for ($i = 0; $i < $len; ++$i) {

if ($i > $currentDepthFinalIndex) {
++$currentDepth;
$currentDepthFinalIndex = $len - 1;
if ($currentDepth >= $minDepth) {
$minimumDepthReached = true;
}
}

$vals = $queue[$i];
foreach ($vals as $k => $v) {


$zvalRef = ($r = \ReflectionReference::fromArrayElement($vals, $k)) ? $r->getId() : null;

if ($zvalRef) {
$vals[$k] = &$stub; 
unset($stub); 
if (null !== $vals[$k] = $hardRefs[$zvalRef] ?? null) {
$v = $vals[$k];
if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) {
++$v->value->refCount;
}
++$v->refCount;
continue;
}
$vals[$k] = new Stub();
$vals[$k]->value = $v;
$vals[$k]->handle = ++$refsCounter;
$hardRefs[$zvalRef] = $vals[$k];
}


switch (true) {
case null === $v:
case \is_bool($v):
case \is_int($v):
case \is_float($v):
continue 2;
case \is_string($v):
if ('' === $v) {
continue 2;
}
if (!preg_match('//u', $v)) {
$stub = new Stub();
$stub->type = Stub::TYPE_STRING;
$stub->class = Stub::STRING_BINARY;
if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) {
$stub->cut = $cut;
$stub->value = substr($v, 0, -$cut);
} else {
$stub->value = $v;
}
} elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) {
$stub = new Stub();
$stub->type = Stub::TYPE_STRING;
$stub->class = Stub::STRING_UTF8;
$stub->cut = $cut;
$stub->value = mb_substr($v, 0, $maxString, 'UTF-8');
} else {
continue 2;
}
$a = null;
break;

case \is_array($v):
if (!$v) {
continue 2;
}
$stub = $arrayStub;

$stub->class = array_is_list($v) ? Stub::ARRAY_INDEXED : Stub::ARRAY_ASSOC;
$a = $v;
break;

case \is_object($v):
if (empty($objRefs[$h = spl_object_id($v)])) {
$stub = new Stub();
$stub->type = Stub::TYPE_OBJECT;
$stub->class = $v::class;
$stub->value = $v;
$stub->handle = $h;
$a = $this->castObject($stub, 0 < $i);
if ($v !== $stub->value) {
if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) {
break;
}
$stub->handle = $h = spl_object_id($stub->value);
}
$stub->value = null;
if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) {
$stub->cut = \count($a);
$a = null;
}
}
if (empty($objRefs[$h])) {
$objRefs[$h] = $stub;
$objects[] = $v;
} else {
$stub = $objRefs[$h];
++$stub->refCount;
$a = null;
}
break;

default: 
if (empty($resRefs[$h = (int) $v])) {
$stub = new Stub();
$stub->type = Stub::TYPE_RESOURCE;
if ('Unknown' === $stub->class = @get_resource_type($v)) {
$stub->class = 'Closed';
}
$stub->value = $v;
$stub->handle = $h;
$a = $this->castResource($stub, 0 < $i);
$stub->value = null;
if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) {
$stub->cut = \count($a);
$a = null;
}
}
if (empty($resRefs[$h])) {
$resRefs[$h] = $stub;
} else {
$stub = $resRefs[$h];
++$stub->refCount;
$a = null;
}
break;
}

if ($a) {
if (!$minimumDepthReached || 0 > $maxItems) {
$queue[$len] = $a;
$stub->position = $len++;
} elseif ($pos < $maxItems) {
if ($maxItems < $pos += \count($a)) {
$a = \array_slice($a, 0, $maxItems - $pos, true);
if ($stub->cut >= 0) {
$stub->cut += $pos - $maxItems;
}
}
$queue[$len] = $a;
$stub->position = $len++;
} elseif ($stub->cut >= 0) {
$stub->cut += \count($a);
$stub->position = 0;
}
}

if ($arrayStub === $stub) {
if ($arrayStub->cut) {
$stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position];
$arrayStub->cut = 0;
} elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) {
$stub = self::$arrayCache[$arrayStub->class][$arrayStub->position];
} else {
self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position];
}
}

if (!$zvalRef) {
$vals[$k] = $stub;
} else {
$hardRefs[$zvalRef]->value = $stub;
}
}

$queue[$i] = $vals;
}

return $queue;
}
}
<?php










namespace Symfony\Component\VarDumper\Cloner;

use Symfony\Component\VarDumper\Caster\Caster;
use Symfony\Component\VarDumper\Exception\ThrowingCasterException;






abstract class AbstractCloner implements ClonerInterface
{
public static array $defaultCasters = [
'__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'],

'AddressInfo' => ['Symfony\Component\VarDumper\Caster\AddressInfoCaster', 'castAddressInfo'],
'Socket' => ['Symfony\Component\VarDumper\Caster\SocketCaster', 'castSocket'],

'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'],
'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'],
'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'],
'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'],
'Symfony\Component\VarDumper\Caster\ScalarStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castScalar'],

'Fiber' => ['Symfony\Component\VarDumper\Caster\FiberCaster', 'castFiber'],

'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'],
'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'],
'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'],
'ReflectionAttribute' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castAttribute'],
'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'],
'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'],
'ReflectionClassConstant' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClassConstant'],
'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'],
'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'],
'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'],
'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'],
'ReflectionReference' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReference'],
'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'],
'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'],

'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'],
'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'],
'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'],
'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],

'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'],
'Dom\Exception' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'],
'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'],
'Dom\Implementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'],
'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\Node' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'],
'Dom\XMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXMLDocument'],
'Dom\HTMLDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castHTMLDocument'],
'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\NodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\DTDNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\XPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\HTMLCollection' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],
'Dom\TokenList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDom'],

'XMLReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'],

'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'],
'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'],
'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'],
'Symfony\Bridge\Monolog\Logger' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Symfony\Component\EventDispatcher\EventDispatcherInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Symfony\Component\HttpClient\AmpHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
'Symfony\Component\HttpClient\CurlHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
'Symfony\Component\HttpClient\NativeHttpClient' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClient'],
'Symfony\Component\HttpClient\Response\AmpResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
'Symfony\Component\HttpClient\Response\AmpResponseV4' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
'Symfony\Component\HttpClient\Response\AmpResponseV5' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
'Symfony\Component\HttpClient\Response\CurlResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
'Symfony\Component\HttpClient\Response\NativeResponse' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castHttpClientResponse'],
'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'],
'Symfony\Component\Uid\Ulid' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castUlid'],
'Symfony\Component\Uid\Uuid' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castUuid'],
'Symfony\Component\VarExporter\Internal\LazyObjectState' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castLazyObjectState'],
'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'],
'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'],
'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'],
'Symfony\Component\VarDumper\Cloner\AbstractCloner' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Symfony\Component\ErrorHandler\Exception\FlattenException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFlattenException'],
'Symfony\Component\ErrorHandler\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'],

'Imagine\Image\ImageInterface' => ['Symfony\Component\VarDumper\Caster\ImagineCaster', 'castImage'],

'Ramsey\Uuid\UuidInterface' => ['Symfony\Component\VarDumper\Caster\UuidCaster', 'castRamseyUuid'],

'ProxyManager\Proxy\ProxyInterface' => ['Symfony\Component\VarDumper\Caster\ProxyManagerCaster', 'castProxy'],
'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],

'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'],
'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'],

'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'],
'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'],
'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'],
'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'],
'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'],

'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'],
'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'],
'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'],
'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'],
'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'],
'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'],
'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'],
'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'],
'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'],
'WeakMap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakMap'],
'WeakReference' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakReference'],

'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'],
'Relay\Relay' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'],
'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'],
'RedisCluster' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'],

'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'],
'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'],
'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'],
'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'],

'GMP' => ['Symfony\Component\VarDumper\Caster\GmpCaster', 'castGmp'],

'MessageFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castMessageFormatter'],
'NumberFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castNumberFormatter'],
'IntlTimeZone' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlTimeZone'],
'IntlCalendar' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlCalendar'],
'IntlDateFormatter' => ['Symfony\Component\VarDumper\Caster\IntlCaster', 'castIntlDateFormatter'],

'Memcached' => ['Symfony\Component\VarDumper\Caster\MemcachedCaster', 'castMemcached'],

'Ds\Collection' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castCollection'],
'Ds\Map' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castMap'],
'Ds\Pair' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPair'],
'Symfony\Component\VarDumper\Caster\DsPairStub' => ['Symfony\Component\VarDumper\Caster\DsCaster', 'castPairStub'],

'mysqli_driver' => ['Symfony\Component\VarDumper\Caster\MysqliCaster', 'castMysqliDriver'],

'CurlHandle' => ['Symfony\Component\VarDumper\Caster\CurlCaster', 'castCurl'],

'Dba\Connection' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],

'GdImage' => ['Symfony\Component\VarDumper\Caster\GdCaster', 'castGd'],

'SQLite3Result' => ['Symfony\Component\VarDumper\Caster\SqliteCaster', 'castSqlite3Result'],

'PgSql\Lob' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'],
'PgSql\Connection' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'],
'PgSql\Result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'],

':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'],
':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'],

'OpenSSLAsymmetricKey' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslAsymmetricKey'],
'OpenSSLCertificateSigningRequest' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslCsr'],
'OpenSSLCertificate' => ['Symfony\Component\VarDumper\Caster\OpenSSLCaster', 'castOpensslX509'],

':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'],
':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'],

'XmlParser' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'],

'RdKafka' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castRdKafka'],
'RdKafka\Conf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castConf'],
'RdKafka\KafkaConsumer' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castKafkaConsumer'],
'RdKafka\Metadata\Broker' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castBrokerMetadata'],
'RdKafka\Metadata\Collection' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castCollectionMetadata'],
'RdKafka\Metadata\Partition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castPartitionMetadata'],
'RdKafka\Metadata\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicMetadata'],
'RdKafka\Message' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castMessage'],
'RdKafka\Topic' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopic'],
'RdKafka\TopicPartition' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicPartition'],
'RdKafka\TopicConf' => ['Symfony\Component\VarDumper\Caster\RdKafkaCaster', 'castTopicConf'],

'FFI\CData' => ['Symfony\Component\VarDumper\Caster\FFICaster', 'castCTypeOrCData'],
'FFI\CType' => ['Symfony\Component\VarDumper\Caster\FFICaster', 'castCTypeOrCData'],
];

protected int $maxItems = 2500;
protected int $maxString = -1;
protected int $minDepth = 1;




private array $casters = [];




private $prevErrorHandler;

private array $classInfo = [];
private int $filter = 0;






public function __construct(?array $casters = null)
{
$this->addCasters($casters ?? static::$defaultCasters);
}











public function addCasters(array $casters): void
{
foreach ($casters as $type => $callback) {
$this->casters[$type][] = $callback;
}
}




public function setMaxItems(int $maxItems): void
{
$this->maxItems = $maxItems;
}




public function setMaxString(int $maxString): void
{
$this->maxString = $maxString;
}





public function setMinDepth(int $minDepth): void
{
$this->minDepth = $minDepth;
}






public function cloneVar(mixed $var, int $filter = 0): Data
{
$this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) {
if (\E_RECOVERABLE_ERROR === $type || \E_USER_ERROR === $type) {

throw new \ErrorException($msg, 0, $type, $file, $line);
}

if ($this->prevErrorHandler) {
return ($this->prevErrorHandler)($type, $msg, $file, $line, $context);
}

return false;
});
$this->filter = $filter;

if ($gc = gc_enabled()) {
gc_disable();
}
try {
return new Data($this->doClone($var));
} finally {
if ($gc) {
gc_enable();
}
restore_error_handler();
$this->prevErrorHandler = null;
}
}




abstract protected function doClone(mixed $var): array;






protected function castObject(Stub $stub, bool $isNested): array
{
$obj = $stub->value;
$class = $stub->class;

if (str_contains($class, "@anonymous\0")) {
$stub->class = get_debug_type($obj);
}
if (isset($this->classInfo[$class])) {
[$i, $parents, $hasDebugInfo, $fileInfo] = $this->classInfo[$class];
} else {
$i = 2;
$parents = [$class];
$hasDebugInfo = method_exists($class, '__debugInfo');

foreach (class_parents($class) as $p) {
$parents[] = $p;
++$i;
}
foreach (class_implements($class) as $p) {
$parents[] = $p;
++$i;
}
$parents[] = '*';

$r = new \ReflectionClass($class);
$fileInfo = $r->isInternal() || $r->isSubclassOf(Stub::class) ? [] : [
'file' => $r->getFileName(),
'line' => $r->getStartLine(),
];

$this->classInfo[$class] = [$i, $parents, $hasDebugInfo, $fileInfo];
}

$stub->attr += $fileInfo;
$a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class);

try {
while ($i--) {
if (!empty($this->casters[$p = $parents[$i]])) {
foreach ($this->casters[$p] as $callback) {
$a = $callback($obj, $a, $stub, $isNested, $this->filter);
}
}
}
} catch (\Exception $e) {
$a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a;
}

return $a;
}






protected function castResource(Stub $stub, bool $isNested): array
{
$a = [];
$res = $stub->value;
$type = $stub->class;

try {
if (!empty($this->casters[':'.$type])) {
foreach ($this->casters[':'.$type] as $callback) {
$a = $callback($res, $a, $stub, $isNested, $this->filter);
}
}
} catch (\Exception $e) {
$a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a;
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Cloner;






class Cursor
{
public const HASH_INDEXED = Stub::ARRAY_INDEXED;
public const HASH_ASSOC = Stub::ARRAY_ASSOC;
public const HASH_OBJECT = Stub::TYPE_OBJECT;
public const HASH_RESOURCE = Stub::TYPE_RESOURCE;

public int $depth = 0;
public int $refIndex = 0;
public int $softRefTo = 0;
public int $softRefCount = 0;
public int $softRefHandle = 0;
public int $hardRefTo = 0;
public int $hardRefCount = 0;
public int $hardRefHandle = 0;
public int $hashType;
public string|int|null $hashKey = null;
public bool $hashKeyIsBinary;
public int $hashIndex = 0;
public int $hashLength = 0;
public int $hashCut = 0;
public bool $stop = false;
public array $attr = [];
public bool $skipChildren = false;
}
<?php










namespace Symfony\Component\VarDumper\Cloner;






interface DumperInterface
{



public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value): void;








public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void;








public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void;









public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void;
}
<?php










namespace Symfony\Component\VarDumper\Cloner;






class Stub
{
public const TYPE_REF = 1;
public const TYPE_STRING = 2;
public const TYPE_ARRAY = 3;
public const TYPE_OBJECT = 4;
public const TYPE_RESOURCE = 5;
public const TYPE_SCALAR = 6;

public const STRING_BINARY = 1;
public const STRING_UTF8 = 2;

public const ARRAY_ASSOC = 1;
public const ARRAY_INDEXED = 2;

public int $type = self::TYPE_REF;
public string|int|null $class = '';
public mixed $value = null;
public int $cut = 0;
public int $handle = 0;
public int $refCount = 0;
public int $position = 0;
public array $attr = [];




protected static array $propertyDefaults = [];

public function __serialize(): array
{
static $noDefault = new \stdClass();

if (self::class === static::class) {
$data = [];
foreach ($this as $k => $v) {
$default = self::$propertyDefaults[$this::class][$k] ??= ($p = new \ReflectionProperty($this, $k))->hasDefaultValue() ? $p->getDefaultValue() : ($p->hasType() ? $noDefault : null);
if ($noDefault === $default || $default !== $v) {
$data[$k] = $v;
}
}

return $data;
}

return \Closure::bind(function () use ($noDefault) {
$data = [];
foreach ($this as $k => $v) {
$default = self::$propertyDefaults[$this::class][$k] ??= ($p = new \ReflectionProperty($this, $k))->hasDefaultValue() ? $p->getDefaultValue() : ($p->hasType() ? $noDefault : null);
if ($noDefault === $default || $default !== $v) {
$data[$k] = $v;
}
}

return $data;
}, $this, $this::class)();
}
}
<?php










namespace Symfony\Component\VarDumper\Cloner;




interface ClonerInterface
{



public function cloneVar(mixed $var): Data;
}
<?php










namespace Symfony\Component\VarDumper\Test;

use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;




trait VarDumperTestTrait
{



private array $varDumperConfig = [
'casters' => [],
'flags' => null,
];




protected function setUpVarDumper(array $casters, ?int $flags = null): void
{
$this->varDumperConfig['casters'] = $casters;
$this->varDumperConfig['flags'] = $flags;
}

/**
@after
*/
protected function tearDownVarDumper(): void
{
$this->varDumperConfig['casters'] = [];
$this->varDumperConfig['flags'] = null;
}

public function assertDumpEquals(mixed $expected, mixed $data, int $filter = 0, string $message = '')
{
$this->assertSame($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message);
}

public function assertDumpMatchesFormat(mixed $expected, mixed $data, int $filter = 0, string $message = '')
{
$this->assertStringMatchesFormat($this->prepareExpectation($expected, $filter), $this->getDump($data, null, $filter), $message);
}

protected function getDump(mixed $data, string|int|null $key = null, int $filter = 0): ?string
{
if (null === $flags = $this->varDumperConfig['flags']) {
$flags = getenv('DUMP_LIGHT_ARRAY') ? CliDumper::DUMP_LIGHT_ARRAY : 0;
$flags |= getenv('DUMP_STRING_LENGTH') ? CliDumper::DUMP_STRING_LENGTH : 0;
$flags |= getenv('DUMP_COMMA_SEPARATOR') ? CliDumper::DUMP_COMMA_SEPARATOR : 0;
}

$cloner = new VarCloner();
$cloner->addCasters($this->varDumperConfig['casters']);
$cloner->setMaxItems(-1);
$dumper = new CliDumper(null, null, $flags);
$dumper->setColors(false);
$data = $cloner->cloneVar($data, $filter)->withRefHandles(false);
if (null !== $key && null === $data = $data->seek($key)) {
return null;
}

return rtrim($dumper->dump($data, true));
}

private function prepareExpectation(mixed $expected, int $filter): string
{
if (!\is_string($expected)) {
$expected = $this->getDump($expected, null, $filter);
}

return rtrim($expected);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;








class Caster
{
public const EXCLUDE_VERBOSE = 1;
public const EXCLUDE_VIRTUAL = 2;
public const EXCLUDE_DYNAMIC = 4;
public const EXCLUDE_PUBLIC = 8;
public const EXCLUDE_PROTECTED = 16;
public const EXCLUDE_PRIVATE = 32;
public const EXCLUDE_NULL = 64;
public const EXCLUDE_EMPTY = 128;
public const EXCLUDE_NOT_IMPORTANT = 256;
public const EXCLUDE_STRICT = 512;
public const EXCLUDE_UNINITIALIZED = 1024;

public const PREFIX_VIRTUAL = "\0~\0";
public const PREFIX_DYNAMIC = "\0+\0";
public const PREFIX_PROTECTED = "\0*\0";

public const PATTERN_PRIVATE = "\0%s\0%s";

private static array $classProperties = [];








public static function castObject(object $obj, string $class, bool $hasDebugInfo = false, ?string $debugClass = null): array
{
if ($hasDebugInfo) {
try {
$debugInfo = $obj->__debugInfo();
} catch (\Throwable) {

$hasDebugInfo = false;
}
}

$a = $obj instanceof \Closure ? [] : (array) $obj;

if ($obj instanceof \__PHP_Incomplete_Class) {
return $a;
}

$classProperties = self::$classProperties[$class] ??= self::getClassProperties(new \ReflectionClass($class));
$a = array_replace($classProperties, $a);

if ($a) {
$debugClass ??= get_debug_type($obj);

$i = 0;
$prefixedKeys = [];
foreach ($a as $k => $v) {
if ("\0" !== ($k[0] ?? '')) {
if (!isset($classProperties[$k])) {
$prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k;
}
} elseif ($debugClass !== $class && 1 === strpos($k, $class)) {
$prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0");
}
++$i;
}
if ($prefixedKeys) {
$keys = array_keys($a);
foreach ($prefixedKeys as $i => $k) {
$keys[$i] = $k;
}
$a = array_combine($keys, $a);
}
}

if ($hasDebugInfo && \is_array($debugInfo)) {
foreach ($debugInfo as $k => $v) {
if (!isset($k[0]) || "\0" !== $k[0]) {
if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) {
continue;
}
$k = self::PREFIX_VIRTUAL.$k;
}

unset($a[$k]);
$a[$k] = $v;
}
}

return $a;
}












public static function filter(array $a, int $filter, array $listedProperties = [], ?int &$count = 0): array
{
$count = 0;

foreach ($a as $k => $v) {
$type = self::EXCLUDE_STRICT & $filter;

if (null === $v) {
$type |= self::EXCLUDE_NULL & $filter;
$type |= self::EXCLUDE_EMPTY & $filter;
} elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) {
$type |= self::EXCLUDE_EMPTY & $filter;
} elseif ($v instanceof UninitializedStub) {
$type |= self::EXCLUDE_UNINITIALIZED & $filter;
}
if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) {
$type |= self::EXCLUDE_NOT_IMPORTANT;
}
if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) {
$type |= self::EXCLUDE_VERBOSE;
}

if (!isset($k[1]) || "\0" !== $k[0]) {
$type |= self::EXCLUDE_PUBLIC & $filter;
} elseif ('~' === $k[1]) {
$type |= self::EXCLUDE_VIRTUAL & $filter;
} elseif ('+' === $k[1]) {
$type |= self::EXCLUDE_DYNAMIC & $filter;
} elseif ('*' === $k[1]) {
$type |= self::EXCLUDE_PROTECTED & $filter;
} else {
$type |= self::EXCLUDE_PRIVATE & $filter;
}

if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) {
unset($a[$k]);
++$count;
}
}

return $a;
}




public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, bool $isNested): array
{
if (isset($a['__PHP_Incomplete_Class_Name'])) {
$stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')';
unset($a['__PHP_Incomplete_Class_Name']);
}

return $a;
}

private static function getClassProperties(\ReflectionClass $class): array
{
$classProperties = [];
$className = $class->name;

if ($parent = $class->getParentClass()) {
$classProperties += self::$classProperties[$parent->name] ??= self::getClassProperties($parent);
}

foreach ($class->getProperties() as $p) {
if ($p->isStatic()) {
continue;
}

$classProperties[match (true) {
$p->isPublic() => $p->name,
$p->isProtected() => self::PREFIX_PROTECTED.$p->name,
default => "\0".$className."\0".$p->name,
}] = \PHP_VERSION_ID >= 80400 && $p->isVirtual() ? new VirtualStub($p) : new UninitializedStub($p);
}

return $classProperties;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class XmlResourceCaster
{
private const XML_ERRORS = [
\XML_ERROR_NONE => 'XML_ERROR_NONE',
\XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY',
\XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX',
\XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS',
\XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN',
\XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN',
\XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR',
\XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH',
\XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE',
\XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT',
\XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF',
\XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY',
\XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF',
\XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY',
\XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF',
\XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF',
\XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF',
\XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI',
\XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING',
\XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING',
\XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION',
\XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING',
];

public static function castXml($h, array $a, Stub $stub, bool $isNested): array
{
$a['current_byte_index'] = xml_get_current_byte_index($h);
$a['current_column_number'] = xml_get_current_column_number($h);
$a['current_line_number'] = xml_get_current_line_number($h);
$a['error_code'] = xml_get_error_code($h);

if (isset(self::XML_ERRORS[$a['error_code']])) {
$a['error_code'] = new ConstStub(self::XML_ERRORS[$a['error_code']], $a['error_code']);
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;






class UninitializedStub extends ConstStub
{
public function __construct(\ReflectionProperty $property)
{
parent::__construct('?'.($property->hasType() ? ' '.$property->getType() : ''), 'Uninitialized property');
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class PdoCaster
{
private const PDO_ATTRIBUTES = [
'CASE' => [
\PDO::CASE_LOWER => 'LOWER',
\PDO::CASE_NATURAL => 'NATURAL',
\PDO::CASE_UPPER => 'UPPER',
],
'ERRMODE' => [
\PDO::ERRMODE_SILENT => 'SILENT',
\PDO::ERRMODE_WARNING => 'WARNING',
\PDO::ERRMODE_EXCEPTION => 'EXCEPTION',
],
'TIMEOUT',
'PREFETCH',
'AUTOCOMMIT',
'PERSISTENT',
'DRIVER_NAME',
'SERVER_INFO',
'ORACLE_NULLS' => [
\PDO::NULL_NATURAL => 'NATURAL',
\PDO::NULL_EMPTY_STRING => 'EMPTY_STRING',
\PDO::NULL_TO_STRING => 'TO_STRING',
],
'CLIENT_VERSION',
'SERVER_VERSION',
'STATEMENT_CLASS',
'EMULATE_PREPARES',
'CONNECTION_STATUS',
'STRINGIFY_FETCHES',
'DEFAULT_FETCH_MODE' => [
\PDO::FETCH_ASSOC => 'ASSOC',
\PDO::FETCH_BOTH => 'BOTH',
\PDO::FETCH_LAZY => 'LAZY',
\PDO::FETCH_NUM => 'NUM',
\PDO::FETCH_OBJ => 'OBJ',
],
];

public static function castPdo(\PDO $c, array $a, Stub $stub, bool $isNested): array
{
$attr = [];
$errmode = $c->getAttribute(\PDO::ATTR_ERRMODE);
$c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

foreach (self::PDO_ATTRIBUTES as $k => $v) {
if (!isset($k[0])) {
$k = $v;
$v = [];
}

try {
$attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k));
if ($v && isset($v[$attr[$k]])) {
$attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]);
}
} catch (\Exception) {
}
}
if (isset($attr[$k = 'STATEMENT_CLASS'][1])) {
if ($attr[$k][1]) {
$attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]);
}
$attr[$k][0] = new ClassStub($attr[$k][0]);
}

$prefix = Caster::PREFIX_VIRTUAL;
$a += [
$prefix.'inTransaction' => method_exists($c, 'inTransaction'),
$prefix.'errorInfo' => $c->errorInfo(),
$prefix.'attributes' => new EnumStub($attr),
];

if ($a[$prefix.'inTransaction']) {
$a[$prefix.'inTransaction'] = $c->inTransaction();
} else {
unset($a[$prefix.'inTransaction']);
}

if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
unset($a[$prefix.'errorInfo']);
}

$c->setAttribute(\PDO::ATTR_ERRMODE, $errmode);

return $a;
}

public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$a[$prefix.'errorInfo'] = $c->errorInfo();

if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
unset($a[$prefix.'errorInfo']);
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;











class GmpCaster
{
public static function castGmp(\GMP $gmp, array $a, Stub $stub, bool $isNested, int $filter): array
{
$a[Caster::PREFIX_VIRTUAL.'value'] = new ConstStub(gmp_strval($gmp), gmp_strval($gmp));

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Imagine\Image\ImageInterface;
use Symfony\Component\VarDumper\Cloner\Stub;






final class ImagineCaster
{
public static function castImage(ImageInterface $c, array $a, Stub $stub, bool $isNested): array
{
$imgData = $c->get('png');
if (\strlen($imgData) > 1 * 1000 * 1000) {
$a += [
Caster::PREFIX_VIRTUAL.'image' => new ConstStub($c->getSize()),
];
} else {
$a += [
Caster::PREFIX_VIRTUAL.'image' => new ImgStub($imgData, 'image/png', $c->getSize()),
];
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class CutStub extends Stub
{
public function __construct(mixed $value)
{
$this->value = $value;

switch (\gettype($value)) {
case 'object':
$this->type = self::TYPE_OBJECT;
$this->class = get_debug_type($value);

if ($value instanceof \Closure) {
ReflectionCaster::castClosure($value, [], $this, true, Caster::EXCLUDE_VERBOSE);
}

$this->cut = -1;
break;

case 'array':
$this->type = self::TYPE_ARRAY;
$this->class = self::ARRAY_ASSOC;
$this->cut = $this->value = \count($value);
break;

case 'resource':
case 'unknown type':
case 'resource (closed)':
$this->type = self::TYPE_RESOURCE;
$this->handle = (int) $value;
if ('Unknown' === $this->class = @get_resource_type($value)) {
$this->class = 'Closed';
}
$this->cut = -1;
break;

case 'string':
$this->type = self::TYPE_STRING;
$this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY;
$this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8');
$this->value = '';
break;
}
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;








class MemcachedCaster
{
private static array $optionConstants;
private static array $defaultOptions;

public static function castMemcached(\Memcached $c, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'servers' => $c->getServerList(),
Caster::PREFIX_VIRTUAL.'options' => new EnumStub(
self::getNonDefaultOptions($c)
),
];

return $a;
}

private static function getNonDefaultOptions(\Memcached $c): array
{
self::$defaultOptions ??= self::discoverDefaultOptions();
self::$optionConstants ??= self::getOptionConstants();

$nonDefaultOptions = [];
foreach (self::$optionConstants as $constantKey => $value) {
if (self::$defaultOptions[$constantKey] !== $option = $c->getOption($value)) {
$nonDefaultOptions[$constantKey] = $option;
}
}

return $nonDefaultOptions;
}

private static function discoverDefaultOptions(): array
{
$defaultMemcached = new \Memcached();
$defaultMemcached->addServer('127.0.0.1', 11211);

$defaultOptions = [];
self::$optionConstants ??= self::getOptionConstants();

foreach (self::$optionConstants as $constantKey => $value) {
$defaultOptions[$constantKey] = $defaultMemcached->getOption($value);
}

return $defaultOptions;
}

private static function getOptionConstants(): array
{
$reflectedMemcached = new \ReflectionClass(\Memcached::class);

$optionConstants = [];
foreach ($reflectedMemcached->getConstants() as $constantKey => $value) {
if (str_starts_with($constantKey, 'OPT_')) {
$optionConstants[$constantKey] = $value;
}
}

return $optionConstants;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class ScalarStub extends Stub
{
public function __construct(mixed $value)
{
$this->value = $value;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class ConstStub extends Stub
{
public function __construct(string $name, string|int|float|null $value = null)
{
$this->class = $name;
$this->value = 1 < \func_num_args() ? $value : $name;
}

public function __toString(): string
{
return (string) $this->value;
}




public static function fromBitfield(int $value, array $values): self
{
$names = [];
foreach ($values as $v => $name) {
if ($value & $v) {
$names[] = $name;
}
}

if (!$names) {
$names[] = $values[0] ?? 0;
}

return new self(implode(' | ', $names), $value);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Ramsey\Uuid\UuidInterface;
use Symfony\Component\VarDumper\Cloner\Stub;






final class UuidCaster
{
public static function castRamseyUuid(UuidInterface $c, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'uuid' => (string) $c,
];

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;







final class OpenSSLCaster
{
public static function castOpensslX509(\OpenSSLCertificate $h, array $a, Stub $stub, bool $isNested): array
{
$stub->cut = -1;
$info = openssl_x509_parse($h, false);

$pin = openssl_pkey_get_public($h);
$pin = openssl_pkey_get_details($pin)['key'];
$pin = \array_slice(explode("\n", $pin), 1, -2);
$pin = base64_decode(implode('', $pin));
$pin = base64_encode(hash('sha256', $pin, true));

$a += [
Caster::PREFIX_VIRTUAL.'subject' => new EnumStub(array_intersect_key($info['subject'], ['organizationName' => true, 'commonName' => true])),
Caster::PREFIX_VIRTUAL.'issuer' => new EnumStub(array_intersect_key($info['issuer'], ['organizationName' => true, 'commonName' => true])),
Caster::PREFIX_VIRTUAL.'expiry' => new ConstStub(date(\DateTimeInterface::ISO8601, $info['validTo_time_t']), $info['validTo_time_t']),
Caster::PREFIX_VIRTUAL.'fingerprint' => new EnumStub([
'md5' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'md5')), 2, ':', true)),
'sha1' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha1')), 2, ':', true)),
'sha256' => new ConstStub(wordwrap(strtoupper(openssl_x509_fingerprint($h, 'sha256')), 2, ':', true)),
'pin-sha256' => new ConstStub($pin),
]),
];

return $a;
}

public static function castOpensslAsymmetricKey(\OpenSSLAsymmetricKey $key, array $a, Stub $stub, bool $isNested): array
{
foreach (openssl_pkey_get_details($key) as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
}

unset($a[Caster::PREFIX_VIRTUAL.'rsa']); 

return $a;
}

public static function castOpensslCsr(\OpenSSLCertificateSigningRequest $csr, array $a, Stub $stub, bool $isNested): array
{
foreach (openssl_csr_get_subject($csr, false) as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;






class FrameStub extends EnumStub
{
public function __construct(
array $frame,
public bool $keepArgs = true,
public bool $inTraceStub = false,
) {
parent::__construct($frame);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;




class ImgStub extends ConstStub
{
public function __construct(string $data, string $contentType, string $size = '')
{
$this->value = '';
$this->attr['img-data'] = $data;
$this->attr['img-size'] = $size;
$this->attr['content-type'] = $contentType;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

class VirtualStub extends ConstStub
{
public function __construct(\ReflectionProperty $property)
{
parent::__construct('~'.($property->hasType() ? ' '.$property->getType() : ''), 'Virtual property');
$this->attr['virtual'] = true;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class ClassStub extends ConstStub
{




public function __construct(string $identifier, callable|array|string|null $callable = null)
{
$this->value = $identifier;

try {
if (null !== $callable) {
if ($callable instanceof \Closure) {
$r = new \ReflectionFunction($callable);
} elseif (\is_object($callable)) {
$r = [$callable, '__invoke'];
} elseif (\is_array($callable)) {
$r = $callable;
} elseif (false !== $i = strpos($callable, '::')) {
$r = [substr($callable, 0, $i), substr($callable, 2 + $i)];
} else {
$r = new \ReflectionFunction($callable);
}
} elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) {
$r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)];
} else {
$r = new \ReflectionClass($identifier);
}

if (\is_array($r)) {
try {
$r = new \ReflectionMethod($r[0], $r[1]);
} catch (\ReflectionException) {
$r = new \ReflectionClass($r[0]);
}
}

if (str_contains($identifier, "@anonymous\0")) {
$this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $identifier);
}

if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) {
$s = ReflectionCaster::castFunctionAbstract($r, [], new Stub(), true, Caster::EXCLUDE_VERBOSE);
$s = ReflectionCaster::getSignature($s);

if (str_ends_with($identifier, '()')) {
$this->value = substr_replace($identifier, $s, -2);
} else {
$this->value .= $s;
}
}
} catch (\ReflectionException) {
return;
} finally {
if (0 < $i = strrpos($this->value, '\\')) {
$this->attr['ellipsis'] = \strlen($this->value) - $i;
$this->attr['ellipsis-type'] = 'class';
$this->attr['ellipsis-tail'] = 1;
}
}

if ($f = $r->getFileName()) {
$this->attr['file'] = $f;
$this->attr['line'] = $r->getStartLine();
}
}

public static function wrapCallable(mixed $callable): mixed
{
if (\is_object($callable) || !\is_callable($callable)) {
return $callable;
}

if (!\is_array($callable)) {
$callable = new static($callable, $callable);
} elseif (\is_string($callable[0])) {
$callable[0] = new static($callable[0], $callable);
} else {
$callable[1] = new static($callable[1], $callable);
}

return $callable;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use RdKafka\Conf;
use RdKafka\Exception as RdKafkaException;
use RdKafka\KafkaConsumer;
use RdKafka\Message;
use RdKafka\Metadata\Broker as BrokerMetadata;
use RdKafka\Metadata\Collection as CollectionMetadata;
use RdKafka\Metadata\Partition as PartitionMetadata;
use RdKafka\Metadata\Topic as TopicMetadata;
use RdKafka\Topic;
use RdKafka\TopicConf;
use RdKafka\TopicPartition;
use Symfony\Component\VarDumper\Cloner\Stub;








class RdKafkaCaster
{
public static function castKafkaConsumer(KafkaConsumer $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

try {
$assignment = $c->getAssignment();
} catch (RdKafkaException) {
$assignment = [];
}

$a += [
$prefix.'subscription' => $c->getSubscription(),
$prefix.'assignment' => $assignment,
];

$a += self::extractMetadata($c);

return $a;
}

public static function castTopic(Topic $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'name' => $c->getName(),
];

return $a;
}

public static function castTopicPartition(TopicPartition $c, array $a): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'offset' => $c->getOffset(),
$prefix.'partition' => $c->getPartition(),
$prefix.'topic' => $c->getTopic(),
];

return $a;
}

public static function castMessage(Message $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'errstr' => $c->errstr(),
];

return $a;
}

public static function castConf(Conf $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

foreach ($c->dump() as $key => $value) {
$a[$prefix.$key] = $value;
}

return $a;
}

public static function castTopicConf(TopicConf $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

foreach ($c->dump() as $key => $value) {
$a[$prefix.$key] = $value;
}

return $a;
}

public static function castRdKafka(\RdKafka $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'out_q_len' => $c->getOutQLen(),
];

$a += self::extractMetadata($c);

return $a;
}

public static function castCollectionMetadata(CollectionMetadata $c, array $a, Stub $stub, bool $isNested): array
{
$a += iterator_to_array($c);

return $a;
}

public static function castTopicMetadata(TopicMetadata $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'name' => $c->getTopic(),
$prefix.'partitions' => $c->getPartitions(),
];

return $a;
}

public static function castPartitionMetadata(PartitionMetadata $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'id' => $c->getId(),
$prefix.'err' => $c->getErr(),
$prefix.'leader' => $c->getLeader(),
];

return $a;
}

public static function castBrokerMetadata(BrokerMetadata $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'id' => $c->getId(),
$prefix.'host' => $c->getHost(),
$prefix.'port' => $c->getPort(),
];

return $a;
}

private static function extractMetadata(KafkaConsumer|\RdKafka $c): array
{
$prefix = Caster::PREFIX_VIRTUAL;

try {
$m = $c->getMetadata(true, null, 500);
} catch (RdKafkaException) {
return [];
}

return [
$prefix.'orig_broker_id' => $m->getOrigBrokerId(),
$prefix.'orig_broker_name' => $m->getOrigBrokerName(),
$prefix.'brokers' => $m->getBrokers(),
$prefix.'topics' => $m->getTopics(),
];
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;









class IntlCaster
{
public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(),
Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(),
];

return self::castError($c, $a);
}

public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$a += [
Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(),
Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(),
];

if ($filter & Caster::EXCLUDE_VERBOSE) {
$stub->cut += 3;

return self::castError($c, $a);
}

$a += [
Caster::PREFIX_VIRTUAL.'attributes' => new EnumStub(
[
'PARSE_INT_ONLY' => $c->getAttribute(\NumberFormatter::PARSE_INT_ONLY),
'GROUPING_USED' => $c->getAttribute(\NumberFormatter::GROUPING_USED),
'DECIMAL_ALWAYS_SHOWN' => $c->getAttribute(\NumberFormatter::DECIMAL_ALWAYS_SHOWN),
'MAX_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_INTEGER_DIGITS),
'MIN_INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_INTEGER_DIGITS),
'INTEGER_DIGITS' => $c->getAttribute(\NumberFormatter::INTEGER_DIGITS),
'MAX_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_FRACTION_DIGITS),
'MIN_FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_FRACTION_DIGITS),
'FRACTION_DIGITS' => $c->getAttribute(\NumberFormatter::FRACTION_DIGITS),
'MULTIPLIER' => $c->getAttribute(\NumberFormatter::MULTIPLIER),
'GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::GROUPING_SIZE),
'ROUNDING_MODE' => $c->getAttribute(\NumberFormatter::ROUNDING_MODE),
'ROUNDING_INCREMENT' => $c->getAttribute(\NumberFormatter::ROUNDING_INCREMENT),
'FORMAT_WIDTH' => $c->getAttribute(\NumberFormatter::FORMAT_WIDTH),
'PADDING_POSITION' => $c->getAttribute(\NumberFormatter::PADDING_POSITION),
'SECONDARY_GROUPING_SIZE' => $c->getAttribute(\NumberFormatter::SECONDARY_GROUPING_SIZE),
'SIGNIFICANT_DIGITS_USED' => $c->getAttribute(\NumberFormatter::SIGNIFICANT_DIGITS_USED),
'MIN_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MIN_SIGNIFICANT_DIGITS),
'MAX_SIGNIFICANT_DIGITS' => $c->getAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS),
'LENIENT_PARSE' => $c->getAttribute(\NumberFormatter::LENIENT_PARSE),
]
),
Caster::PREFIX_VIRTUAL.'text_attributes' => new EnumStub(
[
'POSITIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_PREFIX),
'POSITIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::POSITIVE_SUFFIX),
'NEGATIVE_PREFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_PREFIX),
'NEGATIVE_SUFFIX' => $c->getTextAttribute(\NumberFormatter::NEGATIVE_SUFFIX),
'PADDING_CHARACTER' => $c->getTextAttribute(\NumberFormatter::PADDING_CHARACTER),
'CURRENCY_CODE' => $c->getTextAttribute(\NumberFormatter::CURRENCY_CODE),
'DEFAULT_RULESET' => $c->getTextAttribute(\NumberFormatter::DEFAULT_RULESET),
'PUBLIC_RULESETS' => $c->getTextAttribute(\NumberFormatter::PUBLIC_RULESETS),
]
),
Caster::PREFIX_VIRTUAL.'symbols' => new EnumStub(
[
'DECIMAL_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL),
'GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL),
'PATTERN_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::PATTERN_SEPARATOR_SYMBOL),
'PERCENT_SYMBOL' => $c->getSymbol(\NumberFormatter::PERCENT_SYMBOL),
'ZERO_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::ZERO_DIGIT_SYMBOL),
'DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::DIGIT_SYMBOL),
'MINUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::MINUS_SIGN_SYMBOL),
'PLUS_SIGN_SYMBOL' => $c->getSymbol(\NumberFormatter::PLUS_SIGN_SYMBOL),
'CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::CURRENCY_SYMBOL),
'INTL_CURRENCY_SYMBOL' => $c->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL),
'MONETARY_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_SEPARATOR_SYMBOL),
'EXPONENTIAL_SYMBOL' => $c->getSymbol(\NumberFormatter::EXPONENTIAL_SYMBOL),
'PERMILL_SYMBOL' => $c->getSymbol(\NumberFormatter::PERMILL_SYMBOL),
'PAD_ESCAPE_SYMBOL' => $c->getSymbol(\NumberFormatter::PAD_ESCAPE_SYMBOL),
'INFINITY_SYMBOL' => $c->getSymbol(\NumberFormatter::INFINITY_SYMBOL),
'NAN_SYMBOL' => $c->getSymbol(\NumberFormatter::NAN_SYMBOL),
'SIGNIFICANT_DIGIT_SYMBOL' => $c->getSymbol(\NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL),
'MONETARY_GROUPING_SEPARATOR_SYMBOL' => $c->getSymbol(\NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL),
]
),
];

return self::castError($c, $a);
}

public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'display_name' => $c->getDisplayName(),
Caster::PREFIX_VIRTUAL.'id' => $c->getID(),
Caster::PREFIX_VIRTUAL.'raw_offset' => $c->getRawOffset(),
];

if ($c->useDaylightTime()) {
$a += [
Caster::PREFIX_VIRTUAL.'dst_savings' => $c->getDSTSavings(),
];
}

return self::castError($c, $a);
}

public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$a += [
Caster::PREFIX_VIRTUAL.'type' => $c->getType(),
Caster::PREFIX_VIRTUAL.'first_day_of_week' => $c->getFirstDayOfWeek(),
Caster::PREFIX_VIRTUAL.'minimal_days_in_first_week' => $c->getMinimalDaysInFirstWeek(),
Caster::PREFIX_VIRTUAL.'repeated_wall_time_option' => $c->getRepeatedWallTimeOption(),
Caster::PREFIX_VIRTUAL.'skipped_wall_time_option' => $c->getSkippedWallTimeOption(),
Caster::PREFIX_VIRTUAL.'time' => $c->getTime(),
Caster::PREFIX_VIRTUAL.'in_daylight_time' => $c->inDaylightTime(),
Caster::PREFIX_VIRTUAL.'is_lenient' => $c->isLenient(),
Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(),
];

return self::castError($c, $a);
}

public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$a += [
Caster::PREFIX_VIRTUAL.'locale' => $c->getLocale(),
Caster::PREFIX_VIRTUAL.'pattern' => $c->getPattern(),
Caster::PREFIX_VIRTUAL.'calendar' => $c->getCalendar(),
Caster::PREFIX_VIRTUAL.'time_zone_id' => $c->getTimeZoneId(),
Caster::PREFIX_VIRTUAL.'time_type' => $c->getTimeType(),
Caster::PREFIX_VIRTUAL.'date_type' => $c->getDateType(),
Caster::PREFIX_VIRTUAL.'calendar_object' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getCalendarObject()) : $c->getCalendarObject(),
Caster::PREFIX_VIRTUAL.'time_zone' => ($filter & Caster::EXCLUDE_VERBOSE) ? new CutStub($c->getTimeZone()) : $c->getTimeZone(),
];

return self::castError($c, $a);
}

private static function castError(object $c, array $a): array
{
if ($errorCode = $c->getErrorCode()) {
$a += [
Caster::PREFIX_VIRTUAL.'error_code' => $errorCode,
Caster::PREFIX_VIRTUAL.'error_message' => $c->getErrorMessage(),
];
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class XmlReaderCaster
{
private const NODE_TYPES = [
\XMLReader::NONE => 'NONE',
\XMLReader::ELEMENT => 'ELEMENT',
\XMLReader::ATTRIBUTE => 'ATTRIBUTE',
\XMLReader::TEXT => 'TEXT',
\XMLReader::CDATA => 'CDATA',
\XMLReader::ENTITY_REF => 'ENTITY_REF',
\XMLReader::ENTITY => 'ENTITY',
\XMLReader::PI => 'PI (Processing Instruction)',
\XMLReader::COMMENT => 'COMMENT',
\XMLReader::DOC => 'DOC',
\XMLReader::DOC_TYPE => 'DOC_TYPE',
\XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT',
\XMLReader::NOTATION => 'NOTATION',
\XMLReader::WHITESPACE => 'WHITESPACE',
\XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE',
\XMLReader::END_ELEMENT => 'END_ELEMENT',
\XMLReader::END_ENTITY => 'END_ENTITY',
\XMLReader::XML_DECLARATION => 'XML_DECLARATION',
];

public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, bool $isNested): array
{
try {
$properties = [
'LOADDTD' => @$reader->getParserProperty(\XMLReader::LOADDTD),
'DEFAULTATTRS' => @$reader->getParserProperty(\XMLReader::DEFAULTATTRS),
'VALIDATE' => @$reader->getParserProperty(\XMLReader::VALIDATE),
'SUBST_ENTITIES' => @$reader->getParserProperty(\XMLReader::SUBST_ENTITIES),
];
} catch (\Error) {
$properties = [
'LOADDTD' => false,
'DEFAULTATTRS' => false,
'VALIDATE' => false,
'SUBST_ENTITIES' => false,
];
}

$props = Caster::PREFIX_VIRTUAL.'parserProperties';
$info = [
'localName' => $reader->localName,
'prefix' => $reader->prefix,
'nodeType' => new ConstStub(self::NODE_TYPES[$reader->nodeType], $reader->nodeType),
'depth' => $reader->depth,
'isDefault' => $reader->isDefault,
'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement,
'xmlLang' => $reader->xmlLang,
'attributeCount' => $reader->attributeCount,
'value' => $reader->value,
'namespaceURI' => $reader->namespaceURI,
'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI,
$props => $properties,
];

if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) {
$info[$props] = new EnumStub($info[$props]);
$info[$props]->cut = $count;
}

$a = Caster::filter($a, Caster::EXCLUDE_UNINITIALIZED, [], $count);
$info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count);

$stub->cut += $count + 2;

return $a + $info;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class SqliteCaster
{
public static function castSqlite3Result(\SQLite3Result $result, array $a, Stub $stub, bool $isNested): array
{
$numColumns = $result->numColumns();
for ($i = 0; $i < $numColumns; ++$i) {
$a[Caster::PREFIX_VIRTUAL.'columnNames'][$i] = $result->columnName($i);
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class AmqpCaster
{
private const FLAGS = [
\AMQP_DURABLE => 'AMQP_DURABLE',
\AMQP_PASSIVE => 'AMQP_PASSIVE',
\AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE',
\AMQP_AUTODELETE => 'AMQP_AUTODELETE',
\AMQP_INTERNAL => 'AMQP_INTERNAL',
\AMQP_NOLOCAL => 'AMQP_NOLOCAL',
\AMQP_AUTOACK => 'AMQP_AUTOACK',
\AMQP_IFEMPTY => 'AMQP_IFEMPTY',
\AMQP_IFUNUSED => 'AMQP_IFUNUSED',
\AMQP_MANDATORY => 'AMQP_MANDATORY',
\AMQP_IMMEDIATE => 'AMQP_IMMEDIATE',
\AMQP_MULTIPLE => 'AMQP_MULTIPLE',
\AMQP_NOWAIT => 'AMQP_NOWAIT',
\AMQP_REQUEUE => 'AMQP_REQUEUE',
];

private const EXCHANGE_TYPES = [
\AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT',
\AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT',
\AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC',
\AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS',
];

public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'is_connected' => $c->isConnected(),
];


if (isset($a["\x00AMQPConnection\x00login"])) {
return $a;
}


if (method_exists($c, 'getReadTimeout')) {
$timeout = $c->getReadTimeout();
} else {
$timeout = $c->getTimeout();
}

$a += [
$prefix.'is_connected' => $c->isConnected(),
$prefix.'login' => $c->getLogin(),
$prefix.'password' => $c->getPassword(),
$prefix.'host' => $c->getHost(),
$prefix.'vhost' => $c->getVhost(),
$prefix.'port' => $c->getPort(),
$prefix.'read_timeout' => $timeout,
];

return $a;
}

public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'is_connected' => $c->isConnected(),
$prefix.'channel_id' => $c->getChannelId(),
];


if (isset($a["\x00AMQPChannel\x00connection"])) {
return $a;
}

$a += [
$prefix.'connection' => $c->getConnection(),
$prefix.'prefetch_size' => $c->getPrefetchSize(),
$prefix.'prefetch_count' => $c->getPrefetchCount(),
];

return $a;
}

public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'flags' => self::extractFlags($c->getFlags()),
];


if (isset($a["\x00AMQPQueue\x00name"])) {
return $a;
}

$a += [
$prefix.'connection' => $c->getConnection(),
$prefix.'channel' => $c->getChannel(),
$prefix.'name' => $c->getName(),
$prefix.'arguments' => $c->getArguments(),
];

return $a;
}

public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$a += [
$prefix.'flags' => self::extractFlags($c->getFlags()),
];

$type = isset(self::EXCHANGE_TYPES[$c->getType()]) ? new ConstStub(self::EXCHANGE_TYPES[$c->getType()], $c->getType()) : $c->getType();


if (isset($a["\x00AMQPExchange\x00name"])) {
$a["\x00AMQPExchange\x00type"] = $type;

return $a;
}

$a += [
$prefix.'connection' => $c->getConnection(),
$prefix.'channel' => $c->getChannel(),
$prefix.'name' => $c->getName(),
$prefix.'type' => $type,
$prefix.'arguments' => $c->getArguments(),
];

return $a;
}

public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$prefix = Caster::PREFIX_VIRTUAL;

$deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode());


if (isset($a["\x00AMQPEnvelope\x00body"])) {
$a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode;

return $a;
}

if (!($filter & Caster::EXCLUDE_VERBOSE)) {
$a += [$prefix.'body' => $c->getBody()];
}

$a += [
$prefix.'delivery_tag' => $c->getDeliveryTag(),
$prefix.'is_redelivery' => $c->isRedelivery(),
$prefix.'exchange_name' => $c->getExchangeName(),
$prefix.'routing_key' => $c->getRoutingKey(),
$prefix.'content_type' => $c->getContentType(),
$prefix.'content_encoding' => $c->getContentEncoding(),
$prefix.'headers' => $c->getHeaders(),
$prefix.'delivery_mode' => $deliveryMode,
$prefix.'priority' => $c->getPriority(),
$prefix.'correlation_id' => $c->getCorrelationId(),
$prefix.'reply_to' => $c->getReplyTo(),
$prefix.'expiration' => $c->getExpiration(),
$prefix.'message_id' => $c->getMessageId(),
$prefix.'timestamp' => $c->getTimeStamp(),
$prefix.'type' => $c->getType(),
$prefix.'user_id' => $c->getUserId(),
$prefix.'app_id' => $c->getAppId(),
];

return $a;
}

private static function extractFlags(int $flags): ConstStub
{
$flagsArray = [];

foreach (self::FLAGS as $value => $name) {
if ($flags & $value) {
$flagsArray[] = $name;
}
}

if (!$flagsArray) {
$flagsArray = ['AMQP_NOPARAM'];
}

return new ConstStub(implode('|', $flagsArray), $flags);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class StubCaster
{
public static function castStub(Stub $c, array $a, Stub $stub, bool $isNested): array
{
if ($isNested) {
$stub->type = $c->type;
$stub->class = $c->class;
$stub->value = $c->value;
$stub->handle = $c->handle;
$stub->cut = $c->cut;
$stub->attr = $c->attr;

if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) {
$stub->type = Stub::TYPE_STRING;
$stub->class = Stub::STRING_BINARY;
}

$a = [];
}

return $a;
}

public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, bool $isNested): array
{
return $isNested ? $c->preservedSubset : $a;
}

public static function cutInternals($obj, array $a, Stub $stub, bool $isNested): array
{
if ($isNested) {
$stub->cut += \count($a);

return [];
}

return $a;
}

public static function castEnum(EnumStub $c, array $a, Stub $stub, bool $isNested): array
{
if ($isNested) {
$stub->class = $c->dumpKeys ? '' : null;
$stub->handle = 0;
$stub->value = null;
$stub->cut = $c->cut;
$stub->attr = $c->attr;

$a = [];

if ($c->value) {
foreach (array_keys($c->value) as $k) {
$keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k;
}

$a = array_combine($keys, $c->value);
}
}

return $a;
}

public static function castScalar(ScalarStub $scalarStub, array $a, Stub $stub): array
{
$stub->type = Stub::TYPE_SCALAR;
$stub->attr['value'] = $scalarStub->value;

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use FFI\CData;
use FFI\CType;
use Symfony\Component\VarDumper\Cloner\Stub;






final class FFICaster
{








private const MAX_STRING_LENGTH = 255;

public static function castCTypeOrCData(CData|CType $data, array $args, Stub $stub): array
{
if ($data instanceof CType) {
$type = $data;
$data = null;
} else {
$type = \FFI::typeof($data);
}

$stub->class = \sprintf('%s<%s> size %d align %d', ($data ?? $type)::class, $type->getName(), $type->getSize(), $type->getAlignment());

return match ($type->getKind()) {
CType::TYPE_FLOAT,
CType::TYPE_DOUBLE,
\defined('\FFI\CType::TYPE_LONGDOUBLE') ? CType::TYPE_LONGDOUBLE : -1,
CType::TYPE_UINT8,
CType::TYPE_SINT8,
CType::TYPE_UINT16,
CType::TYPE_SINT16,
CType::TYPE_UINT32,
CType::TYPE_SINT32,
CType::TYPE_UINT64,
CType::TYPE_SINT64,
CType::TYPE_BOOL,
CType::TYPE_CHAR,
CType::TYPE_ENUM => null !== $data ? [Caster::PREFIX_VIRTUAL.'cdata' => $data->cdata] : [],
CType::TYPE_POINTER => self::castFFIPointer($stub, $type, $data),
CType::TYPE_STRUCT => self::castFFIStructLike($type, $data),
CType::TYPE_FUNC => self::castFFIFunction($stub, $type),
default => $args,
};
}

private static function castFFIFunction(Stub $stub, CType $type): array
{
$arguments = [];

for ($i = 0, $count = $type->getFuncParameterCount(); $i < $count; ++$i) {
$param = $type->getFuncParameterType($i);

$arguments[] = $param->getName();
}

$abi = match ($type->getFuncABI()) {
CType::ABI_DEFAULT,
CType::ABI_CDECL => '[cdecl]',
CType::ABI_FASTCALL => '[fastcall]',
CType::ABI_THISCALL => '[thiscall]',
CType::ABI_STDCALL => '[stdcall]',
CType::ABI_PASCAL => '[pascal]',
CType::ABI_REGISTER => '[register]',
CType::ABI_MS => '[ms]',
CType::ABI_SYSV => '[sysv]',
CType::ABI_VECTORCALL => '[vectorcall]',
default => '[unknown abi]',
};

$returnType = $type->getFuncReturnType();

$stub->class = $abi.' callable('.implode(', ', $arguments).'): '
.$returnType->getName();

return [Caster::PREFIX_VIRTUAL.'returnType' => $returnType];
}

private static function castFFIPointer(Stub $stub, CType $type, ?CData $data = null): array
{
$ptr = $type->getPointerType();

if (null === $data) {
return [Caster::PREFIX_VIRTUAL.'0' => $ptr];
}

return match ($ptr->getKind()) {
CType::TYPE_CHAR => [Caster::PREFIX_VIRTUAL.'cdata' => self::castFFIStringValue($data)],
CType::TYPE_FUNC => self::castFFIFunction($stub, $ptr),
default => [Caster::PREFIX_VIRTUAL.'cdata' => $data[0]],
};
}

private static function castFFIStringValue(CData $data): string|CutStub
{
$result = [];
$ffi = \FFI::cdef(<<<C
            size_t zend_get_page_size(void);
        C);

$pageSize = $ffi->zend_get_page_size();


$start = $ffi->cast('uintptr_t', $ffi->cast('char*', $data))->cdata;

$max = min(self::MAX_STRING_LENGTH, ($start | ($pageSize - 1)) - $start);

for ($i = 0; $i < $max; ++$i) {
$result[$i] = $data[$i];

if ("\0" === $data[$i]) {
return implode('', $result);
}
}

$string = implode('', $result);
$stub = new CutStub($string);
$stub->cut = -1;
$stub->value = $string;

return $stub;
}

private static function castFFIStructLike(CType $type, ?CData $data = null): array
{
$isUnion = ($type->getAttributes() & CType::ATTR_UNION) === CType::ATTR_UNION;

$result = [];

foreach ($type->getStructFieldNames() as $name) {
$field = $type->getStructFieldType($name);




$isUnsafe = $isUnion && CType::TYPE_POINTER === $field->getKind();

if ($isUnsafe) {
$result[Caster::PREFIX_VIRTUAL.$name.'?'] = $field;
} elseif (null === $data) {
$result[Caster::PREFIX_VIRTUAL.$name] = $field;
} else {
$fieldName = $data->{$name} instanceof CData ? '' : $field->getName().' ';
$result[Caster::PREFIX_VIRTUAL.$fieldName.$name] = $data->{$name};
}
}

return $result;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;






class CutArrayStub extends CutStub
{
public array $preservedSubset;

public function __construct(array $value, array $preservedKeys)
{
parent::__construct($value);

$this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys));
$this->cut -= \count($this->preservedSubset);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class ResourceCaster
{



public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNested): array
{
trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__);

return CurlCaster::castCurl($h, $a, $stub, $isNested);
}




public static function castDba(mixed $dba, array $a, Stub $stub, bool $isNested): array
{
if (\PHP_VERSION_ID < 80402 && !\is_resource($dba)) {

return $a;
}

$list = dba_list();
$a['file'] = $list[(int) $dba];

return $a;
}

public static function castProcess($process, array $a, Stub $stub, bool $isNested): array
{
return proc_get_status($process);
}

public static function castStream($stream, array $a, Stub $stub, bool $isNested): array
{
$a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested);
if ($a['uri'] ?? false) {
$a['uri'] = new LinkStub($a['uri']);
}

return $a;
}

public static function castStreamContext($stream, array $a, Stub $stub, bool $isNested): array
{
return @stream_context_get_params($stream) ?: $a;
}




public static function castGd(\GdImage $gd, array $a, Stub $stub, bool $isNested): array
{
trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__);

return GdCaster::castGd($gd, $a, $stub, $isNested);
}




public static function castOpensslX509(\OpenSSLCertificate $h, array $a, Stub $stub, bool $isNested): array
{
trigger_deprecation('symfony/var-dumper', '7.3', 'The "%s()" method is deprecated without replacement.', __METHOD__);

return OpenSSLCaster::castOpensslX509($h, $a, $stub, $isNested);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;






class LinkStub extends ConstStub
{
public bool $inVendor = false;

private static array $vendorRoots;
private static array $composerRoots = [];

public function __construct(string $label, int $line = 0, ?string $href = null)
{
$this->value = $label;

if (!\is_string($href ??= $label)) {
return;
}
if (str_starts_with($href, 'file://')) {
if ($href === $label) {
$label = substr($label, 7);
}
$href = substr($href, 7);
} elseif (str_contains($href, '://')) {
$this->attr['href'] = $href;

return;
}
if (!is_file($href)) {
return;
}
if ($line) {
$this->attr['line'] = $line;
}
if ($label !== $this->attr['file'] = realpath($href) ?: $href) {
return;
}
if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) {
$this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1;
$this->attr['ellipsis-type'] = 'path';
$this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0);
} elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) {
$this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2)));
$this->attr['ellipsis-type'] = 'path';
$this->attr['ellipsis-tail'] = 1;
}
}

private function getComposerRoot(string $file, bool &$inVendor): string|false
{
if (!isset(self::$vendorRoots)) {
self::$vendorRoots = [];

foreach (get_declared_classes() as $class) {
if ('C' === $class[0] && str_starts_with($class, 'ComposerAutoloaderInit')) {
$r = new \ReflectionClass($class);
$v = \dirname($r->getFileName(), 2);
if (is_file($v.'/composer/installed.json')) {
self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR;
}
}
}
}
$inVendor = false;

if (isset(self::$composerRoots[$dir = \dirname($file)])) {
return self::$composerRoots[$dir];
}

foreach (self::$vendorRoots as $root) {
if ($inVendor = str_starts_with($file, $root)) {
return $root;
}
}

$parent = $dir;
while (!@is_file($parent.'/composer.json')) {
if (!@file_exists($parent)) {

break;
}
if ($parent === \dirname($parent)) {
return self::$composerRoots[$dir] = false;
}

$parent = \dirname($parent);
}

return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class ReflectionCaster
{
public const UNSET_CLOSURE_FILE_INFO = ['Closure' => __CLASS__.'::unsetClosureFileInfo'];

private const EXTRA_MAP = [
'docComment' => 'getDocComment',
'extension' => 'getExtensionName',
'isDisabled' => 'isDisabled',
'isDeprecated' => 'isDeprecated',
'isInternal' => 'isInternal',
'isUserDefined' => 'isUserDefined',
'isGenerator' => 'isGenerator',
'isVariadic' => 'isVariadic',
];

public static function castClosure(\Closure $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$c = new \ReflectionFunction($c);

$a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter);

if (!$c->isAnonymous()) {
$stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name;
unset($a[$prefix.'class']);
}
unset($a[$prefix.'extra']);

$stub->class .= self::getSignature($a);

if ($f = $c->getFileName()) {
$stub->attr['file'] = $f;
$stub->attr['line'] = $c->getStartLine();
}

unset($a[$prefix.'parameters']);

if ($filter & Caster::EXCLUDE_VERBOSE) {
$stub->cut += ($c->getFileName() ? 2 : 0) + \count($a);

return [];
}

if ($f) {
$a[$prefix.'file'] = new LinkStub($f, $c->getStartLine());
$a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine();
}

return $a;
}

public static function unsetClosureFileInfo(\Closure $c, array $a): array
{
unset($a[Caster::PREFIX_VIRTUAL.'file'], $a[Caster::PREFIX_VIRTUAL.'line']);

return $a;
}

public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $isNested): array
{

try {
$reflectionGenerator = new \ReflectionGenerator($c);

return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested);
} catch (\Exception) {
$a[Caster::PREFIX_VIRTUAL.'closed'] = true;

return $a;
}
}

public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

if ($c instanceof \ReflectionNamedType) {
$a += [
$prefix.'name' => $c->getName(),
$prefix.'allowsNull' => $c->allowsNull(),
$prefix.'isBuiltin' => $c->isBuiltin(),
];
} elseif ($c instanceof \ReflectionUnionType || $c instanceof \ReflectionIntersectionType) {
$a[$prefix.'allowsNull'] = $c->allowsNull();
self::addMap($a, $c, [
'types' => 'getTypes',
]);
} else {
$a[$prefix.'allowsNull'] = $c->allowsNull();
}

return $a;
}

public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested): array
{
$map = [
'name' => 'getName',
'arguments' => 'getArguments',
];

if (\PHP_VERSION_ID >= 80400) {
unset($map['name']);
}

self::addMap($a, $c, $map);

return $a;
}

public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

if ($c->getThis()) {
$a[$prefix.'this'] = new CutStub($c->getThis());
}
$function = $c->getFunction();
$frame = [
'class' => $function->class ?? null,
'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null,
'function' => $function->name,
'file' => $c->getExecutingFile(),
'line' => $c->getExecutingLine(),
];
if ($trace = $c->getTrace(\DEBUG_BACKTRACE_IGNORE_ARGS)) {
$function = new \ReflectionGenerator($c->getExecutingGenerator());
array_unshift($trace, [
'function' => 'yield',
'file' => $function->getExecutingFile(),
'line' => $function->getExecutingLine(),
]);
$trace[] = $frame;
$a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1);
} else {
$function = new FrameStub($frame, false, true);
$function = ExceptionCaster::castFrameStub($function, [], $function, true);
$a[$prefix.'executing'] = $function[$prefix.'src'];
}

$a[Caster::PREFIX_VIRTUAL.'closed'] = false;

return $a;
}

public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$prefix = Caster::PREFIX_VIRTUAL;

if ($n = \Reflection::getModifierNames($c->getModifiers())) {
$a[$prefix.'modifiers'] = implode(' ', $n);
}

self::addMap($a, $c, [
'extends' => 'getParentClass',
'implements' => 'getInterfaceNames',
'constants' => 'getReflectionConstants',
]);

foreach ($c->getProperties() as $n) {
$a[$prefix.'properties'][$n->name] = $n;
}

foreach ($c->getMethods() as $n) {
$a[$prefix.'methods'][$n->name] = $n;
}

self::addAttributes($a, $c, $prefix);

if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) {
self::addExtra($a, $c);
}

return $a;
}

public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$prefix = Caster::PREFIX_VIRTUAL;

self::addMap($a, $c, [
'returnsReference' => 'returnsReference',
'returnType' => 'getReturnType',
'class' => 'getClosureCalledClass',
'this' => 'getClosureThis',
]);

if (isset($a[$prefix.'returnType'])) {
$v = $a[$prefix.'returnType'];
$v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v;
$a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType'] instanceof \ReflectionNamedType && $a[$prefix.'returnType']->allowsNull() && !\in_array($v, ['mixed', 'null'], true) ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']);
}
if (isset($a[$prefix.'class'])) {
$a[$prefix.'class'] = new ClassStub($a[$prefix.'class']);
}
if (isset($a[$prefix.'this'])) {
$a[$prefix.'this'] = new CutStub($a[$prefix.'this']);
}

foreach ($c->getParameters() as $v) {
$k = '$'.$v->name;
if ($v->isVariadic()) {
$k = '...'.$k;
}
if ($v->isPassedByReference()) {
$k = '&'.$k;
}
$a[$prefix.'parameters'][$k] = $v;
}
if (isset($a[$prefix.'parameters'])) {
$a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']);
}

self::addAttributes($a, $c, $prefix);

if (!($filter & Caster::EXCLUDE_VERBOSE) && $v = $c->getStaticVariables()) {
foreach ($v as $k => &$v) {
if (\is_object($v)) {
$a[$prefix.'use']['$'.$k] = new CutStub($v);
} else {
$a[$prefix.'use']['$'.$k] = &$v;
}
}
unset($v);
$a[$prefix.'use'] = new EnumStub($a[$prefix.'use']);
}

if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) {
self::addExtra($a, $c);
}

return $a;
}

public static function castClassConstant(\ReflectionClassConstant $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers()));
$a[Caster::PREFIX_VIRTUAL.'value'] = $c->getValue();

self::addAttributes($a, $c);

return $a;
}

public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers()));

return $a;
}

public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

self::addMap($a, $c, [
'position' => 'getPosition',
'isVariadic' => 'isVariadic',
'byReference' => 'isPassedByReference',
'allowsNull' => 'allowsNull',
]);

self::addAttributes($a, $c, $prefix);

if ($v = $c->getType()) {
$a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v;
}

if (isset($a[$prefix.'typeHint'])) {
$v = $a[$prefix.'typeHint'];
$a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']);
} else {
unset($a[$prefix.'allowsNull']);
}

if ($c->isOptional()) {
try {
$a[$prefix.'default'] = $v = $c->getDefaultValue();
if ($c->isDefaultValueConstant() && !\is_object($v)) {
$a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v);
}
if (null === $v) {
unset($a[$prefix.'allowsNull']);
}
} catch (\ReflectionException) {
}
}

return $a;
}

public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers()));

self::addAttributes($a, $c);
self::addExtra($a, $c);

return $a;
}

public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId();

return $a;
}

public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested): array
{
self::addMap($a, $c, [
'version' => 'getVersion',
'dependencies' => 'getDependencies',
'iniEntries' => 'getIniEntries',
'isPersistent' => 'isPersistent',
'isTemporary' => 'isTemporary',
'constants' => 'getConstants',
'functions' => 'getFunctions',
'classes' => 'getClasses',
]);

return $a;
}

public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested): array
{
self::addMap($a, $c, [
'version' => 'getVersion',
'author' => 'getAuthor',
'copyright' => 'getCopyright',
'url' => 'getURL',
]);

return $a;
}

public static function getSignature(array $a): string
{
$prefix = Caster::PREFIX_VIRTUAL;
$signature = '';

if (isset($a[$prefix.'parameters'])) {
foreach ($a[$prefix.'parameters']->value as $k => $param) {
$signature .= ', ';
if ($type = $param->getType()) {
if (!$type instanceof \ReflectionNamedType) {
$signature .= $type.' ';
} else {
if ($param->allowsNull() && !\in_array($type->getName(), ['mixed', 'null'], true)) {
$signature .= '?';
}
$signature .= substr(strrchr('\\'.$type->getName(), '\\'), 1).' ';
}
}
$signature .= $k;

if (!$param->isDefaultValueAvailable()) {
continue;
}
$v = $param->getDefaultValue();
$signature .= ' = ';

if ($param->isDefaultValueConstant()) {
$signature .= substr(strrchr('\\'.$param->getDefaultValueConstantName(), '\\'), 1);
} elseif (null === $v) {
$signature .= 'null';
} elseif (\is_array($v)) {
$signature .= $v ? '[…'.\count($v).']' : '[]';
} elseif (\is_string($v)) {
$signature .= 10 > \strlen($v) && !str_contains($v, '\\') ? "'{$v}'" : "'…".\strlen($v)."'";
} elseif (\is_bool($v)) {
$signature .= $v ? 'true' : 'false';
} elseif (\is_object($v)) {
$signature .= 'new '.substr(strrchr('\\'.get_debug_type($v), '\\'), 1);
} else {
$signature .= $v;
}
}
}
$signature = (empty($a[$prefix.'returnsReference']) ? '' : '&').'('.substr($signature, 2).')';

if (isset($a[$prefix.'returnType'])) {
$signature .= ': '.substr(strrchr('\\'.$a[$prefix.'returnType'], '\\'), 1);
}

return $signature;
}

private static function addExtra(array &$a, \Reflector $c): void
{
$x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : [];

if (method_exists($c, 'getFileName') && $m = $c->getFileName()) {
$x['file'] = new LinkStub($m, $c->getStartLine());
$x['line'] = $c->getStartLine().' to '.$c->getEndLine();
}

self::addMap($x, $c, self::EXTRA_MAP, '');

if ($x) {
$a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x);
}
}

private static function addMap(array &$a, object $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL): void
{
foreach ($map as $k => $m) {
if ('isDisabled' === $k) {
continue;
}

if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) {
$a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m;
}
}
}

private static function addAttributes(array &$a, \Reflector $c, string $prefix = Caster::PREFIX_VIRTUAL): void
{
foreach ($c->getAttributes() as $n) {
$a[$prefix.'attributes'][] = $n;
}
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Doctrine\Common\Proxy\Proxy as CommonProxy;
use Doctrine\ORM\PersistentCollection;
use Doctrine\ORM\Proxy\Proxy as OrmProxy;
use Symfony\Component\VarDumper\Cloner\Stub;










class DoctrineCaster
{
public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, bool $isNested): array
{
foreach (['__cloner__', '__initializer__'] as $k) {
if (\array_key_exists($k, $a)) {
unset($a[$k]);
++$stub->cut;
}
}

return $a;
}

public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, bool $isNested): array
{
foreach (['_entityPersister', '_identifier'] as $k) {
if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) {
unset($a[$k]);
++$stub->cut;
}
}

return $a;
}

public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, bool $isNested): array
{
foreach (['snapshot', 'association', 'typeClass'] as $k) {
if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) {
$a[$k] = new CutStub($a[$k]);
}
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class AddressInfoCaster
{
private const MAPS = [
'ai_flags' => [
1 => 'AI_PASSIVE',
2 => 'AI_CANONNAME',
4 => 'AI_NUMERICHOST',
8 => 'AI_V4MAPPED',
16 => 'AI_ALL',
32 => 'AI_ADDRCONFIG',
64 => 'AI_IDN',
128 => 'AI_CANONIDN',
1024 => 'AI_NUMERICSERV',
],
'ai_family' => [
1 => 'AF_UNIX',
2 => 'AF_INET',
10 => 'AF_INET6',
44 => 'AF_DIVERT',
],
'ai_socktype' => [
1 => 'SOCK_STREAM',
2 => 'SOCK_DGRAM',
3 => 'SOCK_RAW',
4 => 'SOCK_RDM',
5 => 'SOCK_SEQPACKET',
],
'ai_protocol' => [
1 => 'SOL_SOCKET',
6 => 'SOL_TCP',
17 => 'SOL_UDP',
136 => 'SOL_UDPLITE',
],
];

public static function castAddressInfo(\AddressInfo $h, array $a, Stub $stub, bool $isNested): array
{
static $resolvedMaps;

if (!$resolvedMaps) {
foreach (self::MAPS as $k => $map) {
foreach ($map as $v => $name) {
if (\defined($name)) {
$resolvedMaps[$k][\constant($name)] = $name;
} elseif (!isset($resolvedMaps[$k][$v])) {
$resolvedMaps[$k][$v] = $name;
}
}
}
}

foreach (socket_addrinfo_explain($h) as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = match (true) {
'ai_flags' === $k => ConstStub::fromBitfield($v, $resolvedMaps[$k]),
isset($resolvedMaps[$k][$v]) => new ConstStub($resolvedMaps[$k][$v], $v),
default => $v,
};
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;




class DsPairStub extends Stub
{
public function __construct(mixed $key, mixed $value)
{
$this->value = [
Caster::PREFIX_VIRTUAL.'key' => $key,
Caster::PREFIX_VIRTUAL.'value' => $value,
];
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class TraceStub extends Stub
{
public function __construct(
array $trace,
public bool $keepArgs = true,
public int $sliceOffset = 0,
public ?int $sliceLength = null,
public int $numberingOffset = 0,
) {
$this->value = $trace;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Uid\Ulid;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\VarDumper\Cloner\Stub;
use Symfony\Component\VarExporter\Internal\LazyObjectState;






class SymfonyCaster
{
private const REQUEST_GETTERS = [
'pathInfo' => 'getPathInfo',
'requestUri' => 'getRequestUri',
'baseUrl' => 'getBaseUrl',
'basePath' => 'getBasePath',
'method' => 'getMethod',
'format' => 'getRequestFormat',
];

public static function castRequest(Request $request, array $a, Stub $stub, bool $isNested): array
{
$clone = null;

foreach (self::REQUEST_GETTERS as $prop => $getter) {
$key = Caster::PREFIX_PROTECTED.$prop;
if (\array_key_exists($key, $a) && null === $a[$key]) {
$clone ??= clone $request;
$a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}();
}
}

return $a;
}

public static function castHttpClient($client, array $a, Stub $stub, bool $isNested): array
{
$multiKey = \sprintf("\0%s\0multi", $client::class);
if (isset($a[$multiKey])) {
$a[$multiKey] = new CutStub($a[$multiKey]);
}

return $a;
}

public static function castHttpClientResponse($response, array $a, Stub $stub, bool $isNested): array
{
$stub->cut += \count($a);
$a = [];

foreach ($response->getInfo() as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
}

return $a;
}

public static function castLazyObjectState($state, array $a, Stub $stub, bool $isNested): array
{
if (!$isNested) {
return $a;
}

$stub->cut += \count($a) - 1;

$instance = $a['realInstance'] ?? null;

if (isset($a['status'])) { 
$a = ['status' => new ConstStub(match ($a['status']) {
LazyObjectState::STATUS_INITIALIZED_FULL => 'INITIALIZED_FULL',
LazyObjectState::STATUS_INITIALIZED_PARTIAL => 'INITIALIZED_PARTIAL',
LazyObjectState::STATUS_UNINITIALIZED_FULL => 'UNINITIALIZED_FULL',
LazyObjectState::STATUS_UNINITIALIZED_PARTIAL => 'UNINITIALIZED_PARTIAL',
}, $a['status'])];
}

if ($instance) {
$a['realInstance'] = $instance;
--$stub->cut;
}

return $a;
}

public static function castUuid(Uuid $uuid, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'toBase58'] = $uuid->toBase58();
$a[Caster::PREFIX_VIRTUAL.'toBase32'] = $uuid->toBase32();


if (method_exists($uuid, 'getDateTime')) {
$a[Caster::PREFIX_VIRTUAL.'time'] = $uuid->getDateTime()->format('Y-m-d H:i:s.u \U\T\C');
}

return $a;
}

public static function castUlid(Ulid $ulid, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'toBase58'] = $ulid->toBase58();
$a[Caster::PREFIX_VIRTUAL.'toRfc4122'] = $ulid->toRfc4122();


if (method_exists($ulid, 'getDateTime')) {
$a[Caster::PREFIX_VIRTUAL.'time'] = $ulid->getDateTime()->format('Y-m-d H:i:s.v \U\T\C');
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Ds\Collection;
use Ds\Map;
use Ds\Pair;
use Symfony\Component\VarDumper\Cloner\Stub;








class DsCaster
{
public static function castCollection(Collection $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'count'] = $c->count();
$a[Caster::PREFIX_VIRTUAL.'capacity'] = $c->capacity();

if (!$c instanceof Map) {
$a += $c->toArray();
}

return $a;
}

public static function castMap(Map $c, array $a, Stub $stub, bool $isNested): array
{
foreach ($c as $k => $v) {
$a[] = new DsPairStub($k, $v);
}

return $a;
}

public static function castPair(Pair $c, array $a, Stub $stub, bool $isNested): array
{
foreach ($c->toArray() as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
}

return $a;
}

public static function castPairStub(DsPairStub $c, array $a, Stub $stub, bool $isNested): array
{
if ($isNested) {
$stub->class = Pair::class;
$stub->value = null;
$stub->handle = 0;

$a = $c->value;
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class GdCaster
{
public static function castGd(\GdImage $gd, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'size'] = imagesx($gd).'x'.imagesy($gd);
$a[Caster::PREFIX_VIRTUAL.'trueColor'] = imageistruecolor($gd);

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class DateCaster
{
private const PERIOD_LIMIT = 3;

public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, bool $isNested, int $filter): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$location = $d->getTimezone() ? $d->getTimezone()->getLocation() : null;
$fromNow = (new \DateTimeImmutable())->diff($d);

$title = $d->format('l, F j, Y')
."\n".self::formatInterval($fromNow).' from now'
.($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '')
;

unset(
$a[Caster::PREFIX_DYNAMIC.'date'],
$a[Caster::PREFIX_DYNAMIC.'timezone'],
$a[Caster::PREFIX_DYNAMIC.'timezone_type']
);
$a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title);

$stub->class .= $d->format(' @U');

return $a;
}

public static function castInterval(\DateInterval $interval, array $a, Stub $stub, bool $isNested, int $filter): array
{
$now = new \DateTimeImmutable('@0', new \DateTimeZone('UTC'));
$numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp();
$title = number_format($numberOfSeconds, 0, '.', ' ').'s';

$i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)];

return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a;
}

private static function formatInterval(\DateInterval $i): string
{
$format = '%R ';

if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) {
$d = new \DateTimeImmutable('@0', new \DateTimeZone('UTC'));
$i = $d->diff($d->add($i)); 
$format .= 0 < $i->days ? '%ad ' : '';
} else {
$format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : '');
}

$format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : '';
$format = '%R ' === $format ? '0s' : $format;

return $i->format(rtrim($format));
}

public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, bool $isNested, int $filter): array
{
$location = $timeZone->getLocation();
$formatted = (new \DateTimeImmutable('now', $timeZone))->format($location ? 'e (P)' : 'P');
$title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code']) : '';

$z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)];

return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a;
}

public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, bool $isNested, int $filter): array
{
$dates = [];
foreach (clone $p as $i => $d) {
if (self::PERIOD_LIMIT === $i) {
$now = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
$dates[] = \sprintf('%s more', ($end = $p->getEndDate())
? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u')))
: $p->recurrences - $i
);
break;
}
$dates[] = \sprintf('%s) %s', $i + 1, self::formatDateTime($d));
}

$period = \sprintf(
'every %s, from %s%s %s',
self::formatInterval($p->getDateInterval()),
$p->include_start_date ? '[' : ']',
self::formatDateTime($p->getStartDate()),
($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end).($p->include_end_date ? ']' : '[') : 'recurring '.$p->recurrences.' time/s'
);

$p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))];

return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a;
}

private static function formatDateTime(\DateTimeInterface $d, string $extra = ''): string
{
return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra);
}

private static function formatSeconds(string $s, string $us): string
{
return \sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us));
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class SplCaster
{
private const SPL_FILE_OBJECT_FLAGS = [
\SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE',
\SplFileObject::READ_AHEAD => 'READ_AHEAD',
\SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY',
\SplFileObject::READ_CSV => 'READ_CSV',
];

public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, bool $isNested): array
{
return self::castSplArray($c, $a, $stub, $isNested);
}

public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, bool $isNested): array
{
return self::castSplArray($c, $a, $stub, $isNested);
}

public static function castHeap(\Iterator $c, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c),
];

return $a;
}

public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$mode = $c->getIteratorMode();
$c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE);

$a += [
$prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode),
$prefix.'dllist' => iterator_to_array($c),
];
$c->setIteratorMode($mode);

return $a;
}

public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, bool $isNested): array
{
static $map = [
'path' => 'getPath',
'filename' => 'getFilename',
'basename' => 'getBasename',
'pathname' => 'getPathname',
'extension' => 'getExtension',
'realPath' => 'getRealPath',
'aTime' => 'getATime',
'mTime' => 'getMTime',
'cTime' => 'getCTime',
'inode' => 'getInode',
'size' => 'getSize',
'perms' => 'getPerms',
'owner' => 'getOwner',
'group' => 'getGroup',
'type' => 'getType',
'writable' => 'isWritable',
'readable' => 'isReadable',
'executable' => 'isExecutable',
'file' => 'isFile',
'dir' => 'isDir',
'link' => 'isLink',
'linkTarget' => 'getLinkTarget',
];

$prefix = Caster::PREFIX_VIRTUAL;
unset($a["\0SplFileInfo\0fileName"]);
unset($a["\0SplFileInfo\0pathName"]);

try {
$c->isReadable();
} catch (\RuntimeException $e) {
if ('Object not initialized' !== $e->getMessage()) {
throw $e;
}

$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';

return $a;
} catch (\Error $e) {
if ('Object not initialized' !== $e->getMessage()) {
throw $e;
}

$a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state';

return $a;
}

foreach ($map as $key => $accessor) {
try {
$a[$prefix.$key] = $c->$accessor();
} catch (\Exception) {
}
}

if ($a[$prefix.'realPath'] ?? false) {
$a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']);
}

if (isset($a[$prefix.'perms'])) {
$a[$prefix.'perms'] = new ConstStub(\sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']);
}

static $mapDate = ['aTime', 'mTime', 'cTime'];
foreach ($mapDate as $key) {
if (isset($a[$prefix.$key])) {
$a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]);
}
}

return $a;
}

public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, bool $isNested): array
{
static $map = [
'csvControl' => 'getCsvControl',
'flags' => 'getFlags',
'maxLineLen' => 'getMaxLineLen',
'fstat' => 'fstat',
'eof' => 'eof',
'key' => 'key',
];

$prefix = Caster::PREFIX_VIRTUAL;

foreach ($map as $key => $accessor) {
try {
$a[$prefix.$key] = $c->$accessor();
} catch (\Exception) {
}
}

if (isset($a[$prefix.'flags'])) {
$flagsArray = [];
foreach (self::SPL_FILE_OBJECT_FLAGS as $value => $name) {
if ($a[$prefix.'flags'] & $value) {
$flagsArray[] = $name;
}
}
$a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']);
}

if (isset($a[$prefix.'fstat'])) {
$a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']);
}

return $a;
}

public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, bool $isNested): array
{
$storage = [];
unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); 
unset($a["\0SplObjectStorage\0storage"]);

$clone = clone $c;
foreach ($clone as $obj) {
$storage[] = new EnumStub([
'object' => $obj,
'info' => $clone->getInfo(),
]);
}

$a += [
Caster::PREFIX_VIRTUAL.'storage' => $storage,
];

return $a;
}

public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator();

return $a;
}

public static function castWeakReference(\WeakReference $c, array $a, Stub $stub, bool $isNested): array
{
$a[Caster::PREFIX_VIRTUAL.'object'] = $c->get();

return $a;
}

public static function castWeakMap(\WeakMap $c, array $a, Stub $stub, bool $isNested): array
{
$map = [];

foreach (clone $c as $obj => $data) {
$map[] = new EnumStub([
'object' => $obj,
'data' => $data,
]);
}

$a += [
Caster::PREFIX_VIRTUAL.'map' => $map,
];

return $a;
}

private static function castSplArray(\ArrayObject|\ArrayIterator $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$flags = $c->getFlags();

if (!($flags & \ArrayObject::STD_PROP_LIST)) {
$c->setFlags(\ArrayObject::STD_PROP_LIST);
$a = Caster::castObject($c, $c::class, method_exists($c, '__debugInfo'), $stub->class);
$c->setFlags($flags);
}

unset($a["\0ArrayObject\0storage"], $a["\0ArrayIterator\0storage"]);

$a += [
$prefix.'storage' => $c->getArrayCopy(),
$prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
$prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
];
if ($c instanceof \ArrayObject) {
$a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass());
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class MysqliCaster
{
public static function castMysqliDriver(\mysqli_driver $c, array $a, Stub $stub, bool $isNested): array
{
foreach ($a as $k => $v) {
if (isset($c->$k)) {
$a[$k] = $c->$k;
}
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class EnumStub extends Stub
{
public function __construct(
array $values,
public bool $dumpKeys = true,
) {
$this->value = $values;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class FiberCaster
{
public static function castFiber(\Fiber $fiber, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
$prefix = Caster::PREFIX_VIRTUAL;

if ($fiber->isTerminated()) {
$status = 'terminated';
} elseif ($fiber->isRunning()) {
$status = 'running';
} elseif ($fiber->isSuspended()) {
$status = 'suspended';
} elseif ($fiber->isStarted()) {
$status = 'started';
} else {
$status = 'not started';
}

$a[$prefix.'status'] = $status;

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






class ArgsStub extends EnumStub
{
private static array $parameters = [];

public function __construct(array $args, string $function, ?string $class)
{
[$variadic, $params] = self::getParameters($function, $class);

$values = [];
foreach ($args as $k => $v) {
$values[$k] = !\is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v;
}
if (null === $params) {
parent::__construct($values, false);

return;
}
if (\count($values) < \count($params)) {
$params = \array_slice($params, 0, \count($values));
} elseif (\count($values) > \count($params)) {
$values[] = new EnumStub(array_splice($values, \count($params)), false);
$params[] = $variadic;
}
if (['...'] === $params) {
parent::__construct($values[0]->value, false);
} else {
parent::__construct(array_combine($params, $values));
}
}

private static function getParameters(string $function, ?string $class): array
{
if (isset(self::$parameters[$k = $class.'::'.$function])) {
return self::$parameters[$k];
}

try {
$r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function);
} catch (\ReflectionException) {
return [null, null];
}

$variadic = '...';
$params = [];
foreach ($r->getParameters() as $v) {
$k = '$'.$v->name;
if ($v->isPassedByReference()) {
$k = '&'.$k;
}
if ($v->isVariadic()) {
$variadic .= $k;
} else {
$params[] = $k;
}
}

return self::$parameters[$k] = [$variadic, $params];
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class DOMCaster
{
private const ERROR_CODES = [
0 => 'DOM_PHP_ERR',
\DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR',
\DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR',
\DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR',
\DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR',
\DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR',
\DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR',
\DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR',
\DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR',
\DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR',
\DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR',
\DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR',
\DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR',
\DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR',
\DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR',
\DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR',
\DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR',
];

private const NODE_TYPES = [
\XML_ELEMENT_NODE => 'XML_ELEMENT_NODE',
\XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE',
\XML_TEXT_NODE => 'XML_TEXT_NODE',
\XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE',
\XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE',
\XML_ENTITY_NODE => 'XML_ENTITY_NODE',
\XML_PI_NODE => 'XML_PI_NODE',
\XML_COMMENT_NODE => 'XML_COMMENT_NODE',
\XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE',
\XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE',
\XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE',
\XML_NOTATION_NODE => 'XML_NOTATION_NODE',
\XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE',
\XML_DTD_NODE => 'XML_DTD_NODE',
\XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE',
\XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE',
\XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE',
\XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE',
];

public static function castException(\DOMException|\Dom\Exception $e, array $a, Stub $stub, bool $isNested): array
{
$k = Caster::PREFIX_PROTECTED.'code';
if (isset($a[$k], self::ERROR_CODES[$a[$k]])) {
$a[$k] = new ConstStub(self::ERROR_CODES[$a[$k]], $a[$k]);
}

return $a;
}

public static function castLength($dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castImplementation(\DOMImplementation|\Dom\Implementation $dom, array $a, Stub $stub, bool $isNested): array
{
$a += [
Caster::PREFIX_VIRTUAL.'Core' => '1.0',
Caster::PREFIX_VIRTUAL.'XML' => '2.0',
];

return $a;
}

public static function castNode(\DOMNode|\Dom\Node $dom, array $a, Stub $stub, bool $isNested): array
{
return self::castDom($dom, $a, $stub, $isNested);
}

public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, bool $isNested): array
{
return self::castDom($dom, $a, $stub, $isNested);
}

public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
$formatOutput = $dom->formatOutput;
$dom->formatOutput = true;
$a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()];
$dom->formatOutput = $formatOutput;
}

return $a;
}

public static function castXMLDocument(\Dom\XMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
$formatOutput = $dom->formatOutput;
$dom->formatOutput = true;
$a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()];
$dom->formatOutput = $formatOutput;
}

return $a;
}

public static function castHTMLDocument(\Dom\HTMLDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
if (!($filter & Caster::EXCLUDE_VERBOSE)) {
$a += [Caster::PREFIX_VIRTUAL.'html' => $dom->saveHTML()];
}

return $a;
}

public static function castCharacterData(\DOMCharacterData|\Dom\CharacterData $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castAttr(\DOMAttr|\Dom\Attr $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castElement(\DOMElement|\Dom\Element $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castText(\DOMText|\Dom\Text $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castDocumentType(\DOMDocumentType|\Dom\DocumentType $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castNotation(\DOMNotation|\Dom\Notation $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castEntity(\DOMEntity|\Dom\Entity $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castProcessingInstruction(\DOMProcessingInstruction|\Dom\ProcessingInstruction $dom, array $a, Stub $stub, bool $isNested): array
{
return $a;
}

public static function castXPath(\DOMXPath|\Dom\XPath $dom, array $a, Stub $stub, bool $isNested): array
{
return self::castDom($dom, $a, $stub, $isNested);
}

public static function castDom($dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
foreach ($a as $k => $v) {
if ('encoding' === $k && $dom instanceof \DOMEntity
|| \in_array($k, ['actualEncoding', 'config', 'standalone', 'version'], true)
) {
continue; 
}

$v = $dom->$k;

$a[$k] = match (true) {
$v instanceof \DOMNode || $v instanceof \Dom\Node => new CutStub($v),
'nodeType' === $k => new ConstStub(self::NODE_TYPES[$v], $v),
'baseURI' === $k && $v,
'documentURI' === $k && $v => new LinkStub($v),
default => $v,
};
}

if ($dom instanceof \IteratorAggregate) {
foreach ($dom as $k => $v) {
$a[Caster::PREFIX_VIRTUAL.$k] = $v;
}
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;
use Symfony\Component\VarDumper\Cloner\Stub;
use Symfony\Component\VarDumper\Exception\ThrowingCasterException;










class ExceptionCaster
{
public static int $srcContext = 1;
public static bool $traceArgs = true;
public static array $errorTypes = [
\E_DEPRECATED => 'E_DEPRECATED',
\E_USER_DEPRECATED => 'E_USER_DEPRECATED',
\E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
\E_ERROR => 'E_ERROR',
\E_WARNING => 'E_WARNING',
\E_PARSE => 'E_PARSE',
\E_NOTICE => 'E_NOTICE',
\E_CORE_ERROR => 'E_CORE_ERROR',
\E_CORE_WARNING => 'E_CORE_WARNING',
\E_COMPILE_ERROR => 'E_COMPILE_ERROR',
\E_COMPILE_WARNING => 'E_COMPILE_WARNING',
\E_USER_ERROR => 'E_USER_ERROR',
\E_USER_WARNING => 'E_USER_WARNING',
\E_USER_NOTICE => 'E_USER_NOTICE',
2048 => 'E_STRICT',
];

private static array $framesCache = [];

public static function castError(\Error $e, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter);
}

public static function castException(\Exception $e, array $a, Stub $stub, bool $isNested, int $filter = 0): array
{
return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter);
}

public static function castErrorException(\ErrorException $e, array $a, Stub $stub, bool $isNested): array
{
if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) {
$a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]);
}

return $a;
}

public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, bool $isNested): array
{
$trace = Caster::PREFIX_VIRTUAL.'trace';
$prefix = Caster::PREFIX_PROTECTED;
$xPrefix = "\0Exception\0";

if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) {
$b = (array) $a[$xPrefix.'previous'];
$class = get_debug_type($a[$xPrefix.'previous']);
self::traceUnshift($b[$xPrefix.'trace'], $class, $b[$prefix.'file'], $b[$prefix.'line']);
$a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value));
}

unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']);

return $a;
}

public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, bool $isNested): array
{
$sPrefix = "\0".SilencedErrorContext::class."\0";

if (!isset($a[$s = $sPrefix.'severity'])) {
return $a;
}

if (isset(self::$errorTypes[$a[$s]])) {
$a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]);
}

$trace = [[
'file' => $a[$sPrefix.'file'],
'line' => $a[$sPrefix.'line'],
]];

if (isset($a[$sPrefix.'trace'])) {
$trace = array_merge($trace, $a[$sPrefix.'trace']);
}

unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']);
$a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs);

return $a;
}

public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, bool $isNested): array
{
if (!$isNested) {
return $a;
}
$stub->class = '';
$stub->handle = 0;
$frames = $trace->value;
$prefix = Caster::PREFIX_VIRTUAL;

$a = [];
$j = \count($frames);
if (0 > $i = $trace->sliceOffset) {
$i = max(0, $j + $i);
}
if (!isset($trace->value[$i])) {
return [];
}
$lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : '';
$frames[] = ['function' => ''];
$collapse = false;

for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) {
$f = $frames[$i];
$call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???';

$frame = new FrameStub(
[
'object' => $f['object'] ?? null,
'class' => $f['class'] ?? null,
'type' => $f['type'] ?? null,
'function' => $f['function'] ?? null,
] + $frames[$i - 1],
false,
true
);
$f = self::castFrameStub($frame, [], $frame, true);
if (isset($f[$prefix.'src'])) {
foreach ($f[$prefix.'src']->value as $label => $frame) {
if (str_starts_with($label, "\0~collapse=0")) {
if ($collapse) {
$label = substr_replace($label, '1', 11, 1);
} else {
$collapse = true;
}
}
$label = substr_replace($label, "title=Stack level $j.&", 2, 0);
}
$f = $frames[$i - 1];
if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) {
$frame->value['arguments'] = new ArgsStub($f['args'], $f['function'] ?? null, $f['class'] ?? null);
}
} elseif ('???' !== $lastCall) {
$label = new ClassStub($lastCall);
if (isset($label->attr['ellipsis'])) {
$label->attr['ellipsis'] += 2;
$label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()';
} else {
$label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()';
}
} else {
$label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall;
}
$a[substr_replace($label, \sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame;

$lastCall = $call;
}
if (null !== $trace->sliceLength) {
$a = \array_slice($a, 0, $trace->sliceLength, true);
}

return $a;
}

public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, bool $isNested): array
{
if (!$isNested) {
return $a;
}
$f = $frame->value;
$prefix = Caster::PREFIX_VIRTUAL;

if (isset($f['file'], $f['line'])) {
$cacheKey = $f;
unset($cacheKey['object'], $cacheKey['args']);
$cacheKey[] = self::$srcContext;
$cacheKey = implode('-', $cacheKey);

if (isset(self::$framesCache[$cacheKey])) {
$a[$prefix.'src'] = self::$framesCache[$cacheKey];
} else {
if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) {
$f['file'] = substr($f['file'], 0, -\strlen($match[0]));
$f['line'] = (int) $match[1];
}
$src = $f['line'];
$srcKey = $f['file'];
$ellipsis = new LinkStub($srcKey, 0);
$srcAttr = 'collapse='.(int) $ellipsis->inVendor;
$ellipsisTail = $ellipsis->attr['ellipsis-tail'] ?? 0;
$ellipsis = $ellipsis->attr['ellipsis'] ?? 0;

if (is_file($f['file']) && 0 <= self::$srcContext) {
if (!empty($f['class']) && is_subclass_of($f['class'], 'Twig\Template')) {
$template = null;
if (isset($f['object'])) {
$template = $f['object'];
} elseif ((new \ReflectionClass($f['class']))->isInstantiable()) {
$template = unserialize(\sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class']));
}
if (null !== $template) {
$ellipsis = 0;
$templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : '');
$templateInfo = $template->getDebugInfo();
if (isset($templateInfo[$f['line']])) {
if (!method_exists($template, 'getSourceContext') || !is_file($templatePath = $template->getSourceContext()->getPath())) {
$templatePath = null;
}
if ($templateSrc) {
$src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, 'twig', $templatePath, $f);
$srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']];
}
}
}
}
if ($srcKey == $f['file']) {
$src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, 'php', $f['file'], $f);
$srcKey .= ':'.$f['line'];
if ($ellipsis) {
$ellipsis += 1 + \strlen($f['line']);
}
}
$srcAttr .= \sprintf('&separator= &file=%s&line=%d', rawurlencode($f['file']), $f['line']);
} else {
$srcAttr .= '&separator=:';
}
$srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : '';
self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]);
}
}

unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']);
if ($frame->inTraceStub) {
unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']);
}
foreach ($a as $k => $v) {
if (!$v) {
unset($a[$k]);
}
}
if ($frame->keepArgs && !empty($f['args'])) {
$a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']);
}

return $a;
}

public static function castFlattenException(FlattenException $e, array $a, Stub $stub, bool $isNested): array
{
if ($isNested) {
$k = \sprintf(Caster::PATTERN_PRIVATE, FlattenException::class, 'traceAsString');
$a[$k] = new CutStub($a[$k]);
}

return $a;
}

private static function filterExceptionArray(string $xClass, array $a, string $xPrefix, int $filter): array
{
if (isset($a[$xPrefix.'trace'])) {
$trace = $a[$xPrefix.'trace'];
unset($a[$xPrefix.'trace']); 
} else {
$trace = [];
}

if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) {
if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) {
self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']);
}
$a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs);
}
if (empty($a[$xPrefix.'previous'])) {
unset($a[$xPrefix.'previous']);
}
unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message']);

if (isset($a[Caster::PREFIX_PROTECTED.'message']) && str_contains($a[Caster::PREFIX_PROTECTED.'message'], "@anonymous\0")) {
$a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $a[Caster::PREFIX_PROTECTED.'message']);
}

if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) {
$a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']);
}

return $a;
}

private static function traceUnshift(array &$trace, ?string $class, string $file, int $line): void
{
if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) {
return;
}
array_unshift($trace, [
'function' => $class ? 'new '.$class : null,
'file' => $file,
'line' => $line,
]);
}

private static function extractSource(string $srcLines, int $line, int $srcContext, string $lang, ?string $file, array $frame): EnumStub
{
$srcLines = explode("\n", $srcLines);
$src = [];

for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) {
$src[] = ($srcLines[$i] ?? '')."\n";
}

if ($frame['function'] ?? false) {
$stub = new CutStub(new \stdClass());
$stub->class = (isset($frame['class']) ? $frame['class'].$frame['type'] : '').$frame['function'];
$stub->type = Stub::TYPE_OBJECT;
$stub->attr['cut_hash'] = true;
$stub->attr['file'] = $frame['file'];
$stub->attr['line'] = $frame['line'];

try {
$caller = isset($frame['class']) ? new \ReflectionMethod($frame['class'], $frame['function']) : new \ReflectionFunction($frame['function']);
$stub->class .= ReflectionCaster::getSignature(ReflectionCaster::castFunctionAbstract($caller, [], $stub, true, Caster::EXCLUDE_VERBOSE));

if ($f = $caller->getFileName()) {
$stub->attr['file'] = $f;
$stub->attr['line'] = $caller->getStartLine();
}
} catch (\ReflectionException) {

}

$srcLines = ["\0~separator=\0" => $stub];
} else {
$stub = null;
$srcLines = [];
}

$ltrim = 0;
do {
$pad = null;
for ($i = $srcContext << 1; $i >= 0; --$i) {
if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) {
$pad ??= $c;
if ((' ' !== $c && "\t" !== $c) || $pad !== $c) {
break;
}
}
}
++$ltrim;
} while (0 > $i && null !== $pad);

--$ltrim;

foreach ($src as $i => $c) {
if ($ltrim) {
$c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t");
}
$c = substr($c, 0, -1);
if ($i !== $srcContext) {
$c = new ConstStub('default', $c);
} else {
$c = new ConstStub($c, $stub ? 'in '.$stub->class : '');
if (null !== $file) {
$c->attr['file'] = $file;
$c->attr['line'] = $line;
}
}
$c->attr['lang'] = $lang;
$srcLines[\sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c;
}

return new EnumStub($srcLines);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use ProxyManager\Proxy\ProxyInterface;
use Symfony\Component\VarDumper\Cloner\Stub;








class ProxyManagerCaster
{
public static function castProxy(ProxyInterface $c, array $a, Stub $stub, bool $isNested): array
{
if ($parent = get_parent_class($c)) {
$stub->class .= ' - '.$parent;
}
$stub->class .= '@proxy';

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Relay\Relay;
use Symfony\Component\VarDumper\Cloner\Stub;










class RedisCaster
{
private const SERIALIZERS = [
0 => 'NONE', 
1 => 'PHP', 
2 => 'IGBINARY', 
];

private const MODES = [
0 => 'ATOMIC', 
1 => 'MULTI', 
2 => 'PIPELINE', 
];

private const COMPRESSION_MODES = [
0 => 'NONE', 
1 => 'LZF', 
];

private const FAILOVER_OPTIONS = [
\RedisCluster::FAILOVER_NONE => 'NONE',
\RedisCluster::FAILOVER_ERROR => 'ERROR',
\RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE',
\RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES',
];

public static function castRedis(\Redis|Relay $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

if (!$connected = $c->isConnected()) {
return $a + [
$prefix.'isConnected' => $connected,
];
}

$mode = $c->getMode();

return $a + [
$prefix.'isConnected' => $connected,
$prefix.'host' => $c->getHost(),
$prefix.'port' => $c->getPort(),
$prefix.'auth' => $c->getAuth(),
$prefix.'mode' => isset(self::MODES[$mode]) ? new ConstStub(self::MODES[$mode], $mode) : $mode,
$prefix.'dbNum' => $c->getDbNum(),
$prefix.'timeout' => $c->getTimeout(),
$prefix.'lastError' => $c->getLastError(),
$prefix.'persistentId' => $c->getPersistentID(),
$prefix.'options' => self::getRedisOptions($c),
];
}

public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;

return $a + [
$prefix.'hosts' => $c->_hosts(),
$prefix.'function' => ClassStub::wrapCallable($c->_function()),
$prefix.'lastError' => $c->getLastError(),
$prefix.'options' => self::getRedisOptions($c),
];
}

public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, bool $isNested): array
{
$prefix = Caster::PREFIX_VIRTUAL;
$failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER);

$a += [
$prefix.'_masters' => $c->_masters(),
$prefix.'_redir' => $c->_redir(),
$prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()),
$prefix.'lastError' => $c->getLastError(),
$prefix.'options' => self::getRedisOptions($c, [
'SLAVE_FAILOVER' => isset(self::FAILOVER_OPTIONS[$failover]) ? new ConstStub(self::FAILOVER_OPTIONS[$failover], $failover) : $failover,
]),
];

return $a;
}

private static function getRedisOptions(\Redis|Relay|\RedisArray|\RedisCluster $redis, array $options = []): EnumStub
{
$serializer = $redis->getOption(\defined('Redis::OPT_SERIALIZER') ? \Redis::OPT_SERIALIZER : 1);
if (\is_array($serializer)) {
foreach ($serializer as &$v) {
if (isset(self::SERIALIZERS[$v])) {
$v = new ConstStub(self::SERIALIZERS[$v], $v);
}
}
} elseif (isset(self::SERIALIZERS[$serializer])) {
$serializer = new ConstStub(self::SERIALIZERS[$serializer], $serializer);
}

$compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0;
if (\is_array($compression)) {
foreach ($compression as &$v) {
if (isset(self::COMPRESSION_MODES[$v])) {
$v = new ConstStub(self::COMPRESSION_MODES[$v], $v);
}
}
} elseif (isset(self::COMPRESSION_MODES[$compression])) {
$compression = new ConstStub(self::COMPRESSION_MODES[$compression], $compression);
}

$retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0;
if (\is_array($retry)) {
foreach ($retry as &$v) {
$v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v);
}
} else {
$retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry);
}

$options += [
'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : Relay::OPT_TCP_KEEPALIVE,
'READ_TIMEOUT' => $redis->getOption(\defined('Redis::OPT_READ_TIMEOUT') ? \Redis::OPT_READ_TIMEOUT : Relay::OPT_READ_TIMEOUT),
'COMPRESSION' => $compression,
'SERIALIZER' => $serializer,
'PREFIX' => $redis->getOption(\defined('Redis::OPT_PREFIX') ? \Redis::OPT_PREFIX : Relay::OPT_PREFIX),
'SCAN' => $retry,
];

return new EnumStub($options);
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;






final class CurlCaster
{
public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNested): array
{
foreach (curl_getinfo($h) as $key => $val) {
$a[Caster::PREFIX_VIRTUAL.$key] = $val;
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;










class PgSqlCaster
{
private const PARAM_CODES = [
'server_encoding',
'client_encoding',
'is_superuser',
'session_authorization',
'DateStyle',
'TimeZone',
'IntervalStyle',
'integer_datetimes',
'application_name',
'standard_conforming_strings',
];

private const TRANSACTION_STATUS = [
\PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE',
\PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE',
\PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS',
\PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR',
\PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN',
];

private const RESULT_STATUS = [
\PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY',
\PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK',
\PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK',
\PGSQL_COPY_OUT => 'PGSQL_COPY_OUT',
\PGSQL_COPY_IN => 'PGSQL_COPY_IN',
\PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE',
\PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR',
\PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR',
];

private const DIAG_CODES = [
'severity' => \PGSQL_DIAG_SEVERITY,
'sqlstate' => \PGSQL_DIAG_SQLSTATE,
'message' => \PGSQL_DIAG_MESSAGE_PRIMARY,
'detail' => \PGSQL_DIAG_MESSAGE_DETAIL,
'hint' => \PGSQL_DIAG_MESSAGE_HINT,
'statement position' => \PGSQL_DIAG_STATEMENT_POSITION,
'internal position' => \PGSQL_DIAG_INTERNAL_POSITION,
'internal query' => \PGSQL_DIAG_INTERNAL_QUERY,
'context' => \PGSQL_DIAG_CONTEXT,
'file' => \PGSQL_DIAG_SOURCE_FILE,
'line' => \PGSQL_DIAG_SOURCE_LINE,
'function' => \PGSQL_DIAG_SOURCE_FUNCTION,
];

public static function castLargeObject($lo, array $a, Stub $stub, bool $isNested): array
{
$a['seek position'] = pg_lo_tell($lo);

return $a;
}

public static function castLink($link, array $a, Stub $stub, bool $isNested): array
{
$a['status'] = pg_connection_status($link);
$a['status'] = new ConstStub(\PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']);
$a['busy'] = pg_connection_busy($link);

$a['transaction'] = pg_transaction_status($link);
if (isset(self::TRANSACTION_STATUS[$a['transaction']])) {
$a['transaction'] = new ConstStub(self::TRANSACTION_STATUS[$a['transaction']], $a['transaction']);
}

$a['pid'] = pg_get_pid($link);
$a['last error'] = pg_last_error($link);
$a['last notice'] = pg_last_notice($link);
$a['host'] = pg_host($link);
$a['port'] = pg_port($link);
$a['dbname'] = pg_dbname($link);
$a['options'] = pg_options($link);
$a['version'] = pg_version($link);

foreach (self::PARAM_CODES as $v) {
if (false !== $s = pg_parameter_status($link, $v)) {
$a['param'][$v] = $s;
}
}

$a['param']['client_encoding'] = pg_client_encoding($link);
$a['param'] = new EnumStub($a['param']);

return $a;
}

public static function castResult($result, array $a, Stub $stub, bool $isNested): array
{
$a['num rows'] = pg_num_rows($result);
$a['status'] = pg_result_status($result);
if (isset(self::RESULT_STATUS[$a['status']])) {
$a['status'] = new ConstStub(self::RESULT_STATUS[$a['status']], $a['status']);
}
$a['command-completion tag'] = pg_result_status($result, \PGSQL_STATUS_STRING);

if (-1 === $a['num rows']) {
foreach (self::DIAG_CODES as $k => $v) {
$a['error'][$k] = pg_result_error_field($result, $v);
}
}

$a['affected rows'] = pg_affected_rows($result);
$a['last OID'] = pg_last_oid($result);

$fields = pg_num_fields($result);

for ($i = 0; $i < $fields; ++$i) {
$field = [
'name' => pg_field_name($result, $i),
'table' => \sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)),
'type' => \sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)),
'nullable' => (bool) (\PHP_VERSION_ID >= 80300 ? pg_field_is_null($result, null, $i) : pg_field_is_null($result, $i)),
'storage' => pg_field_size($result, $i).' bytes',
'display' => (\PHP_VERSION_ID >= 80300 ? pg_field_prtlen($result, null, $i) : pg_field_prtlen($result, $i)).' chars',
];
if (' (OID: )' === $field['table']) {
$field['table'] = null;
}
if ('-1 bytes' === $field['storage']) {
$field['storage'] = 'variable size';
} elseif ('1 bytes' === $field['storage']) {
$field['storage'] = '1 byte';
}
if ('1 chars' === $field['display']) {
$field['display'] = '1 char';
}
$a['fields'][] = new EnumStub($field);
}

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper\Caster;

use Symfony\Component\VarDumper\Cloner\Stub;







final class SocketCaster
{
public static function castSocket(\Socket $socket, array $a, Stub $stub, bool $isNested): array
{
socket_getsockname($socket, $addr, $port);
$info = stream_get_meta_data(socket_export_stream($socket));

if (\PHP_VERSION_ID >= 80300) {
$uri = ($info['uri'] ?? '//');
if (str_starts_with($uri, 'unix://')) {
$uri .= $addr;
} else {
$uri .= \sprintf(str_contains($addr, ':') ? '[%s]:%s' : '%s:%s', $addr, $port);
}

$a[Caster::PREFIX_VIRTUAL.'uri'] = $uri;

if (@socket_atmark($socket)) {
$a[Caster::PREFIX_VIRTUAL.'atmark'] = true;
}
}

$a += [
Caster::PREFIX_VIRTUAL.'timed_out' => $info['timed_out'],
Caster::PREFIX_VIRTUAL.'blocked' => $info['blocked'],
];

if (!$lastError = socket_last_error($socket)) {
return $a;
}

static $errors;

if (!$errors) {
$errors = get_defined_constants(true)['sockets'] ?? [];
$errors = array_flip(array_filter($errors, static fn ($k) => str_starts_with($k, 'SOCKET_E'), \ARRAY_FILTER_USE_KEY));
}

$a[Caster::PREFIX_VIRTUAL.'last_error'] = new ConstStub($errors[$lastError], socket_strerror($lastError));

return $a;
}
}
<?php










namespace Symfony\Component\VarDumper;

use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\VarDumper\Caster\ReflectionCaster;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\ContextProvider\CliContextProvider;
use Symfony\Component\VarDumper\Dumper\ContextProvider\RequestContextProvider;
use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider;
use Symfony\Component\VarDumper\Dumper\ContextualizedDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\Dumper\ServerDumper;


require_once __DIR__.'/Resources/functions/dump.php';




class VarDumper
{



private static $handler;

public static function dump(mixed $var, ?string $label = null): mixed
{
if (null === self::$handler) {
self::register();
}

return (self::$handler)($var, $label);
}

public static function setHandler(?callable $callable): ?callable
{
$prevHandler = self::$handler;


if (isset($_SERVER['VAR_DUMPER_FORMAT'])) {
return $prevHandler;
}

self::$handler = $callable;

return $prevHandler;
}

private static function register(): void
{
$cloner = new VarCloner();
$cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO);

$format = $_SERVER['VAR_DUMPER_FORMAT'] ?? null;
switch (true) {
case 'html' === $format:
$dumper = new HtmlDumper();
break;
case 'cli' === $format:
$dumper = new CliDumper();
break;
case 'server' === $format:
case $format && 'tcp' === parse_url($format, \PHP_URL_SCHEME):
$host = 'server' === $format ? $_SERVER['VAR_DUMPER_SERVER'] ?? '127.0.0.1:9912' : $format;
$dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? new CliDumper() : new HtmlDumper();
$dumper = new ServerDumper($host, $dumper, self::getDefaultContextProviders());
break;
default:
$dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? new CliDumper() : new HtmlDumper();
}

if (!$dumper instanceof ServerDumper) {
$dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]);
}

self::$handler = function ($var, ?string $label = null) use ($cloner, $dumper) {
$var = $cloner->cloneVar($var);

if (null !== $label) {
$var = $var->withContext(['label' => $label]);
}

$dumper->dump($var);
};
}

private static function getDefaultContextProviders(): array
{
$contextProviders = [];

if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) && class_exists(Request::class)) {
$requestStack = new RequestStack();
$requestStack->push(Request::createFromGlobals());
$contextProviders['request'] = new RequestContextProvider($requestStack);
}

$fileLinkFormatter = class_exists(FileLinkFormatter::class) ? new FileLinkFormatter(null, $requestStack ?? null) : null;

return $contextProviders + [
'cli' => new CliContextProvider(),
'source' => new SourceContextProvider(null, null, $fileLinkFormatter),
];
}
}
<?php










namespace Symfony\Component\VarDumper\Server;

use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface;






class Connection
{
private string $host;




private $socket;





public function __construct(
string $host,
private array $contextProviders = [],
) {
if (!str_contains($host, '://')) {
$host = 'tcp://'.$host;
}

$this->host = $host;
}

public function getContextProviders(): array
{
return $this->contextProviders;
}

public function write(Data $data): bool
{
$socketIsFresh = !$this->socket;
if (!$this->socket = $this->socket ?: $this->createSocket()) {
return false;
}

$context = ['timestamp' => microtime(true)];
foreach ($this->contextProviders as $name => $provider) {
$context[$name] = $provider->getContext();
}
$context = array_filter($context);
$encodedPayload = base64_encode(serialize([$data, $context]))."\n";

set_error_handler(static fn () => null);
try {
if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
return true;
}
if (!$socketIsFresh) {
stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR);
fclose($this->socket);
$this->socket = $this->createSocket();
}
if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
return true;
}
} finally {
restore_error_handler();
}

return false;
}




private function createSocket()
{
set_error_handler(static fn () => null);
try {
return stream_socket_client($this->host, $errno, $errstr, 3) ?: null;
} finally {
restore_error_handler();
}
}
}
<?php










namespace Symfony\Component\VarDumper\Server;

use Psr\Log\LoggerInterface;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\Stub;








class DumpServer
{
private string $host;




private $socket;

public function __construct(
string $host,
private ?LoggerInterface $logger = null,
) {
if (!str_contains($host, '://')) {
$host = 'tcp://'.$host;
}

$this->host = $host;
}

public function start(): void
{
if (!$this->socket = stream_socket_server($this->host, $errno, $errstr)) {
throw new \RuntimeException(\sprintf('Server start failed on "%s": ', $this->host).$errstr.' '.$errno);
}
}

public function listen(callable $callback): void
{
if (null === $this->socket) {
$this->start();
}

foreach ($this->getMessages() as $clientId => $message) {
$this->logger?->info('Received a payload from client {clientId}', ['clientId' => $clientId]);

$payload = @unserialize(base64_decode($message), ['allowed_classes' => [Data::class, Stub::class]]);


if (false === $payload) {
$this->logger?->warning('Unable to decode a message from {clientId} client.', ['clientId' => $clientId]);

continue;
}

if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) {
$this->logger?->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', ['clientId' => $clientId]);

continue;
}

[$data, $context] = $payload;

$callback($data, $context, $clientId);
}
}

public function getHost(): string
{
return $this->host;
}

private function getMessages(): iterable
{
$sockets = [(int) $this->socket => $this->socket];
$write = [];

while (true) {
$read = $sockets;
stream_select($read, $write, $write, null);

foreach ($read as $stream) {
if ($this->socket === $stream) {
$stream = stream_socket_accept($this->socket);
$sockets[(int) $stream] = $stream;
} elseif (feof($stream)) {
unset($sockets[(int) $stream]);
fclose($stream);
} else {
yield (int) $stream => fgets($stream);
}
}
}
}
}
body {
    display: flex;
    flex-direction: column-reverse;
    justify-content: flex-end;
    max-width: 1140px;
    margin: auto;
    padding: 15px;
    word-wrap: break-word;
    background-color: #F9F9F9;
    color: #222;
    font-family: Helvetica, Arial, sans-serif;
    font-size: 14px;
    line-height: 1.4;
}
p {
    margin: 0;
}
a {
    color: #218BC3;
    text-decoration: none;
}
a:hover {
    text-decoration: underline;
}
.text-small {
    font-size: 12px !important;
}
article {
    margin: 5px;
    margin-bottom: 10px;
}
article > header > .row {
    display: flex;
    flex-direction: row;
    align-items: baseline;
    margin-bottom: 10px;
}
article > header > .row > .col {
    flex: 1;
    display: flex;
    align-items: baseline;
}
article > header > .row > h2 {
    font-size: 14px;
    color: #222;
    font-weight: normal;
    font-family: "Lucida Console", monospace, sans-serif;
    word-break: break-all;
    margin: 20px 5px 0 0;
    user-select: all;
}
article > header > .row > h2 > code {
    white-space: nowrap;
    user-select: none;
    color: #cc2255;
    background-color: #f7f7f9;
    border: 1px solid #e1e1e8;
    border-radius: 3px;
    margin-right: 5px;
    padding: 0 3px;
}
article > header > .row > time.col {
    flex: 0;
    text-align: right;
    white-space: nowrap;
    color: #999;
    font-style: italic;
}
article > header ul.tags {
    list-style: none;
    padding: 0;
    margin: 0;
    font-size: 12px;
}
article > header ul.tags > li {
    user-select: all;
    margin-bottom: 2px;
}
article > header ul.tags > li > span.badge {
    display: inline-block;
    padding: .25em .4em;
    margin-right: 5px;
    border-radius: 4px;
    background-color: #6c757d3b;
    color: #524d4d;
    font-size: 12px;
    text-align: center;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    vertical-align: baseline;
    user-select: none;
}
article > section.body {
    border: 1px solid #d8d8d8;
    background: #FFF;
    padding: 10px;
    border-radius: 3px;
}
pre.sf-dump {
    border-radius: 3px;
    margin-bottom: 0;
}
.hidden {
    display: none !important;
}
.dumped-tag > .sf-dump {
    display: inline-block;
    margin: 0;
    padding: 1px 5px;
    line-height: 1.4;
    vertical-align: top;
    background-color: transparent;
    user-select: auto;
}
.dumped-tag > pre.sf-dump,
.dumped-tag > .sf-dump-default {
    color: #CC7832;
    background: none;
}
.dumped-tag > .sf-dump .sf-dump-str { color: #629755; }
.dumped-tag > .sf-dump .sf-dump-private,
.dumped-tag > .sf-dump .sf-dump-protected,
.dumped-tag > .sf-dump .sf-dump-public { color: #262626; }
.dumped-tag > .sf-dump .sf-dump-note { color: #6897BB; }
.dumped-tag > .sf-dump .sf-dump-key { color: #789339; }
.dumped-tag > .sf-dump .sf-dump-ref { color: #6E6E6E; }
.dumped-tag > .sf-dump .sf-dump-ellipsis { color: #CC7832; max-width: 100em; }
.dumped-tag > .sf-dump .sf-dump-ellipsis-path { max-width: 5em; }
.dumped-tag > .sf-dump .sf-dump-ns { user-select: none; }
document.addEventListener('DOMContentLoaded', function() {
  let prev = null;
  Array.from(document.getElementsByTagName('article')).reverse().forEach(function (article) {
    const dedupId = article.dataset.dedupId;
    if (dedupId === prev) {
      article.getElementsByTagName('header')[0].classList.add('hidden');
    }
    prev = dedupId;
  });
});
<?php










use Symfony\Component\VarDumper\Caster\ScalarStub;
use Symfony\Component\VarDumper\VarDumper;

if (!function_exists('dump')) {




function dump(mixed ...$vars): mixed
{
if (!$vars) {
VarDumper::dump(new ScalarStub('🐛'));

return null;
}

if (array_key_exists(0, $vars) && 1 === count($vars)) {
VarDumper::dump($vars[0]);
$k = 0;
} else {
foreach ($vars as $k => $v) {
VarDumper::dump($v, is_int($k) ? 1 + $k : $k);
}
}

if (1 < count($vars)) {
return $vars;
}

return $vars[$k];
}
}

if (!function_exists('dd')) {
function dd(mixed ...$vars): never
{
if (!in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) && !headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}

if (!$vars) {
VarDumper::dump(new ScalarStub('🐛'));

exit(1);
}

if (array_key_exists(0, $vars) && 1 === count($vars)) {
VarDumper::dump($vars[0]);
} else {
foreach ($vars as $k => $v) {
VarDumper::dump($v, is_int($k) ? 1 + $k : $k);
}
}

exit(1);
}
}
#!/usr/bin/env php
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if ('cli' !== PHP_SAPI) {
    throw new Exception('This script must be run from the command line.');
}

/**
 * Starts a dump server to collect and output dumps on a single place with multiple formats support.
 *
 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
 */

use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Logger\ConsoleLogger;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\VarDumper\Command\ServerDumpCommand;
use Symfony\Component\VarDumper\Server\DumpServer;

function includeIfExists(string $file): bool
{
    return file_exists($file) && include $file;
}

if (
    !includeIfExists(__DIR__ . '/../../../../autoload.php') &&
    !includeIfExists(__DIR__ . '/../../vendor/autoload.php') &&
    !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php')
) {
    fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL);
    exit(1);
}

if (!class_exists(Application::class)) {
    fwrite(STDERR, 'You need the "symfony/console" component in order to run the VarDumper server.'.PHP_EOL);
    exit(1);
}

$input = new ArgvInput();
$output = new ConsoleOutput();
$defaultHost = '127.0.0.1:9912';
$host = $input->getParameterOption(['--host'], $_SERVER['VAR_DUMPER_SERVER'] ?? $defaultHost, true);
$logger = interface_exists(LoggerInterface::class) ? new ConsoleLogger($output->getErrorOutput()) : null;

$app = new Application();

$app->getDefinition()->addOption(
    new InputOption('--host', null, InputOption::VALUE_REQUIRED, 'The address the server should listen to', $defaultHost)
);

$app->add($command = new ServerDumpCommand(new DumpServer($host, $logger)))
    ->getApplication()
    ->setDefaultCommand($command->getName(), true)
    ->run($input, $output)
;
<?php










namespace Symfony\Component\VarDumper\Exception;




class ThrowingCasterException extends \Exception
{



public function __construct(\Throwable $prev)
{
parent::__construct('Unexpected '.$prev::class.' thrown from a caster: '.$prev->getMessage(), 0, $prev);
}
}
<?php










namespace Symfony\Component\VarDumper\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Command\Descriptor\CliDescriptor;
use Symfony\Component\VarDumper\Command\Descriptor\DumpDescriptorInterface;
use Symfony\Component\VarDumper\Command\Descriptor\HtmlDescriptor;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\Server\DumpServer;








#[AsCommand(name: 'server:dump', description: 'Start a dump server that collects and displays dumps in a single place')]
class ServerDumpCommand extends Command
{

private array $descriptors;

public function __construct(
private DumpServer $server,
array $descriptors = [],
) {
$this->descriptors = $descriptors + [
'cli' => new CliDescriptor(new CliDumper()),
'html' => new HtmlDescriptor(new HtmlDumper()),
];

parent::__construct();
}

protected function configure(): void
{
$this
->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format (%s)', implode(', ', $this->getAvailableFormats())), 'cli')
->setHelp(<<<'EOF'
<info>%command.name%</info> starts a dump server that collects and displays
dumps in a single place for debugging you application:

  <info>php %command.full_name%</info>

You can consult dumped data in HTML format in your browser by providing the <comment>--format=html</comment> option
and redirecting the output to a file:

  <info>php %command.full_name% --format="html" > dump.html</info>

EOF
)
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$format = $input->getOption('format');

if (!$descriptor = $this->descriptors[$format] ?? null) {
throw new InvalidArgumentException(\sprintf('Unsupported format "%s".', $format));
}

$errorIo = $io->getErrorStyle();
$errorIo->title('Symfony Var Dumper Server');

$this->server->start();

$errorIo->success(\sprintf('Server listening on %s', $this->server->getHost()));
$errorIo->comment('Quit the server with CONTROL-C.');

$this->server->listen(function (Data $data, array $context, int $clientId) use ($descriptor, $io) {
$descriptor->describe($io, $data, $context, $clientId);
});

return 0;
}

public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestOptionValuesFor('format')) {
$suggestions->suggestValues($this->getAvailableFormats());
}
}

private function getAvailableFormats(): array
{
return array_keys($this->descriptors);
}
}
<?php










namespace Symfony\Component\VarDumper\Command\Descriptor;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\VarDumper\Cloner\Data;




interface DumpDescriptorInterface
{
public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void;
}
<?php










namespace Symfony\Component\VarDumper\Command\Descriptor;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;








class HtmlDescriptor implements DumpDescriptorInterface
{
private bool $initialized = false;

public function __construct(
private HtmlDumper $dumper,
) {
}

public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void
{
if (!$this->initialized) {
$styles = file_get_contents(__DIR__.'/../../Resources/css/htmlDescriptor.css');
$scripts = file_get_contents(__DIR__.'/../../Resources/js/htmlDescriptor.js');
$output->writeln("<style>$styles</style><script>$scripts</script>");
$this->initialized = true;
}

$title = '-';
if (isset($context['request'])) {
$request = $context['request'];
$controller = "<span class='dumped-tag'>{$this->dumper->dump($request['controller'], true, ['maxDepth' => 0])}</span>";
$title = \sprintf('<code>%s</code> <a href="%s">%s</a>', $request['method'], $uri = $request['uri'], $uri);
$dedupIdentifier = $request['identifier'];
} elseif (isset($context['cli'])) {
$title = '<code>$ </code>'.$context['cli']['command_line'];
$dedupIdentifier = $context['cli']['identifier'];
} else {
$dedupIdentifier = bin2hex(random_bytes(4));
}

$sourceDescription = '';
if (isset($context['source'])) {
$source = $context['source'];
$projectDir = $source['project_dir'] ?? null;
$sourceDescription = \sprintf('%s on line %d', $source['name'], $source['line']);
if (isset($source['file_link'])) {
$sourceDescription = \sprintf('<a href="%s">%s</a>', $source['file_link'], $sourceDescription);
}
}

$isoDate = $this->extractDate($context, 'c');
$tags = array_filter([
'controller' => $controller ?? null,
'project dir' => $projectDir ?? null,
]);

$output->writeln(<<<HTML
<article data-dedup-id="$dedupIdentifier">
    <header>
        <div class="row">
            <h2 class="col">$title</h2>
            <time class="col text-small" title="$isoDate" datetime="$isoDate">
                {$this->extractDate($context)}
            </time>
        </div>
        {$this->renderTags($tags)}
    </header>
    <section class="body">
        <p class="text-small">
            $sourceDescription
        </p>
        {$this->dumper->dump($data, true)}
    </section>
</article>
HTML
);
}

private function extractDate(array $context, string $format = 'r'): string
{
return date($format, (int) $context['timestamp']);
}

private function renderTags(array $tags): string
{
if (!$tags) {
return '';
}

$renderedTags = '';
foreach ($tags as $key => $value) {
$renderedTags .= \sprintf('<li><span class="badge">%s</span>%s</li>', $key, $value);
}

return <<<HTML
<div class="row">
    <ul class="tags">
        $renderedTags
    </ul>
</div>
HTML;
}
}
<?php










namespace Symfony\Component\VarDumper\Command\Descriptor;

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\CliDumper;








class CliDescriptor implements DumpDescriptorInterface
{
private mixed $lastIdentifier = null;

public function __construct(
private CliDumper $dumper,
) {
}

public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void
{
$io = $output instanceof SymfonyStyle ? $output : new SymfonyStyle(new ArrayInput([]), $output);
$this->dumper->setColors($output->isDecorated());

$rows = [['date', date('r', (int) $context['timestamp'])]];
$lastIdentifier = $this->lastIdentifier;
$this->lastIdentifier = $clientId;

$section = "Received from client #$clientId";
if (isset($context['request'])) {
$request = $context['request'];
$this->lastIdentifier = $request['identifier'];
$section = \sprintf('%s %s', $request['method'], $request['uri']);
if ($controller = $request['controller']) {
$rows[] = ['controller', rtrim($this->dumper->dump($controller, true), "\n")];
}
} elseif (isset($context['cli'])) {
$this->lastIdentifier = $context['cli']['identifier'];
$section = '$ '.$context['cli']['command_line'];
}

if ($this->lastIdentifier !== $lastIdentifier) {
$io->section($section);
}

if (isset($context['source'])) {
$source = $context['source'];
$sourceInfo = \sprintf('%s on line %d', $source['name'], $source['line']);
if ($fileLink = $source['file_link'] ?? null) {
$sourceInfo = \sprintf('<href=%s>%s</>', $fileLink, $sourceInfo);
}
$rows[] = ['source', $sourceInfo];
$file = $source['file_relative'] ?? $source['file'];
$rows[] = ['file', $file];
}

$io->table([], $rows);

$this->dumper->dump($data);
$io->newLine();
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\VarDumper\Cloner\Cursor;
use Symfony\Component\VarDumper\Cloner\Data;






class HtmlDumper extends CliDumper
{

public static $defaultOutput = 'php://output';

protected static $themes = [
'dark' => [
'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all',
'num' => 'font-weight:bold; color:#1299DA',
'const' => 'font-weight:bold',
'virtual' => 'font-style:italic',
'str' => 'font-weight:bold; color:#56DB3A',
'note' => 'color:#1299DA',
'ref' => 'color:#A0A0A0',
'public' => 'color:#FFFFFF',
'protected' => 'color:#FFFFFF',
'private' => 'color:#FFFFFF',
'meta' => 'color:#B729D9',
'key' => 'color:#56DB3A',
'index' => 'color:#1299DA',
'ellipsis' => 'color:#FF8400',
'ns' => 'user-select:none;',
],
'light' => [
'default' => 'background:none; color:#CC7832; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all',
'num' => 'font-weight:bold; color:#1299DA',
'const' => 'font-weight:bold',
'virtual' => 'font-style:italic',
'str' => 'font-weight:bold; color:#629755;',
'note' => 'color:#6897BB',
'ref' => 'color:#6E6E6E',
'public' => 'color:#262626',
'protected' => 'color:#262626',
'private' => 'color:#262626',
'meta' => 'color:#B729D9',
'key' => 'color:#789339',
'index' => 'color:#1299DA',
'ellipsis' => 'color:#CC7832',
'ns' => 'user-select:none;',
],
];

protected ?string $dumpHeader = null;
protected string $dumpPrefix = '<pre class=sf-dump id=%s data-indent-pad="%s">';
protected string $dumpSuffix = '</pre><script>Sfdump(%s)</script>';
protected string $dumpId;
protected bool $colors = true;
protected $headerIsDumped = false;
protected int $lastDepth = -1;

private array $displayOptions = [
'maxDepth' => 1,
'maxStringLength' => 160,
'fileLinkFormat' => null,
];
private array $extraDisplayOptions = [];

public function __construct($output = null, ?string $charset = null, int $flags = 0)
{
AbstractDumper::__construct($output, $charset, $flags);
$this->dumpId = 'sf-dump-'.mt_rand();
$this->displayOptions['fileLinkFormat'] = \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
$this->styles = static::$themes['dark'] ?? self::$themes['dark'];
}

public function setStyles(array $styles): void
{
$this->headerIsDumped = false;
$this->styles = $styles + $this->styles;
}

public function setTheme(string $themeName): void
{
if (!isset(static::$themes[$themeName])) {
throw new \InvalidArgumentException(\sprintf('Theme "%s" does not exist in class "%s".', $themeName, static::class));
}

$this->setStyles(static::$themes[$themeName]);
}






public function setDisplayOptions(array $displayOptions): void
{
$this->headerIsDumped = false;
$this->displayOptions = $displayOptions + $this->displayOptions;
}




public function setDumpHeader(?string $header): void
{
$this->dumpHeader = $header;
}




public function setDumpBoundaries(string $prefix, string $suffix): void
{
$this->dumpPrefix = $prefix;
$this->dumpSuffix = $suffix;
}

public function dump(Data $data, $output = null, array $extraDisplayOptions = []): ?string
{
$this->extraDisplayOptions = $extraDisplayOptions;
$result = parent::dump($data, $output);
$this->dumpId = 'sf-dump-'.mt_rand();

return $result;
}




protected function getDumpHeader(): string
{
$this->headerIsDumped = $this->outputStream ?? $this->lineDumper;

if (null !== $this->dumpHeader) {
return $this->dumpHeader;
}

$line = str_replace('{$options}', json_encode($this->displayOptions, \JSON_FORCE_OBJECT), <<<'EOHTML'
<script>
Sfdump = window.Sfdump || (function (doc) {
doc.documentElement.classList.add('sf-js-enabled');

var rxEsc = /([.*+?^${}()|\[\]\/\\])/g,
    idRx = /\bsf-dump-\d+-ref[012]\w+\b/,
    keyHint = 0 <= navigator.platform.toUpperCase().indexOf('MAC') ? 'Cmd' : 'Ctrl',
    addEventListener = function (e, n, cb) {
        e.addEventListener(n, cb, false);
    };

if (!doc.addEventListener) {
    addEventListener = function (element, eventName, callback) {
        element.attachEvent('on' + eventName, function (e) {
            e.preventDefault = function () {e.returnValue = false;};
            e.target = e.srcElement;
            callback(e);
        });
    };
}

function toggle(a, recursive) {
    var s = a.nextSibling || {}, oldClass = s.className, arrow, newClass;

    if (/\bsf-dump-compact\b/.test(oldClass)) {
        arrow = '▼';
        newClass = 'sf-dump-expanded';
    } else if (/\bsf-dump-expanded\b/.test(oldClass)) {
        arrow = '▶';
        newClass = 'sf-dump-compact';
    } else {
        return false;
    }

    if (doc.createEvent && s.dispatchEvent) {
        var event = doc.createEvent('Event');
        event.initEvent('sf-dump-expanded' === newClass ? 'sfbeforedumpexpand' : 'sfbeforedumpcollapse', true, false);

        s.dispatchEvent(event);
    }

    a.lastChild.innerHTML = arrow;
    s.className = s.className.replace(/\bsf-dump-(compact|expanded)\b/, newClass);

    if (recursive) {
        try {
            a = s.querySelectorAll('.'+oldClass);
            for (s = 0; s < a.length; ++s) {
                if (-1 == a[s].className.indexOf(newClass)) {
                    a[s].className = newClass;
                    a[s].previousSibling.lastChild.innerHTML = arrow;
                }
            }
        } catch (e) {
        }
    }

    return true;
};

function collapse(a, recursive) {
    var s = a.nextSibling || {}, oldClass = s.className;

    if (/\bsf-dump-expanded\b/.test(oldClass)) {
        toggle(a, recursive);

        return true;
    }

    return false;
};

function expand(a, recursive) {
    var s = a.nextSibling || {}, oldClass = s.className;

    if (/\bsf-dump-compact\b/.test(oldClass)) {
        toggle(a, recursive);

        return true;
    }

    return false;
};

function collapseAll(root) {
    var a = root.querySelector('a.sf-dump-toggle');
    if (a) {
        collapse(a, true);
        expand(a);

        return true;
    }

    return false;
}

function reveal(node) {
    var previous, parents = [];

    while ((node = node.parentNode || {}) && (previous = node.previousSibling) && 'A' === previous.tagName) {
        parents.push(previous);
    }

    if (0 !== parents.length) {
        parents.forEach(function (parent) {
            expand(parent);
        });

        return true;
    }

    return false;
}

function highlight(root, activeNode, nodes) {
    resetHighlightedNodes(root);

    Array.from(nodes||[]).forEach(function (node) {
        if (!/\bsf-dump-highlight\b/.test(node.className)) {
            node.className = node.className + ' sf-dump-highlight';
        }
    });

    if (!/\bsf-dump-highlight-active\b/.test(activeNode.className)) {
        activeNode.className = activeNode.className + ' sf-dump-highlight-active';
    }
}

function resetHighlightedNodes(root) {
    Array.from(root.querySelectorAll('.sf-dump-str, .sf-dump-key, .sf-dump-public, .sf-dump-protected, .sf-dump-private')).forEach(function (strNode) {
        strNode.className = strNode.className.replace(/\bsf-dump-highlight\b/, '');
        strNode.className = strNode.className.replace(/\bsf-dump-highlight-active\b/, '');
    });
}

return function (root, x) {
    root = doc.getElementById(root);

    var indentRx = new RegExp('^('+(root.getAttribute('data-indent-pad') || '  ').replace(rxEsc, '\\$1')+')+', 'm'),
        options = {$options},
        elt = root.getElementsByTagName('A'),
        len = elt.length,
        i = 0, s, h,
        t = [];

    while (i < len) t.push(elt[i++]);

    for (i in x) {
        options[i] = x[i];
    }

    function a(e, f) {
        addEventListener(root, e, function (e, n) {
            if ('A' == e.target.tagName) {
                f(e.target, e);
            } else if ('A' == e.target.parentNode.tagName) {
                f(e.target.parentNode, e);
            } else {
                n = /\bsf-dump-ellipsis\b/.test(e.target.className) ? e.target.parentNode : e.target;

                if ((n = n.nextElementSibling) && 'A' == n.tagName) {
                    if (!/\bsf-dump-toggle\b/.test(n.className)) {
                        n = n.nextElementSibling || n;
                    }

                    f(n, e, true);
                }
            }
        });
    };
    function isCtrlKey(e) {
        return e.ctrlKey || e.metaKey;
    }
    function xpathString(str) {
        var parts = str.match(/[^'"]+|['"]/g).map(function (part) {
            if ("'" == part)  {
                return '"\'"';
            }
            if ('"' == part) {
                return "'\"'";
            }

            return "'" + part + "'";
        });

        return "concat(" + parts.join(",") + ", '')";
    }
    function xpathHasClass(className) {
        return "contains(concat(' ', normalize-space(@class), ' '), ' " + className +" ')";
    }
    a('mouseover', function (a, e, c) {
        if (c) {
            e.target.style.cursor = "pointer";
        }
    });
    a('click', function (a, e, c) {
        if (/\bsf-dump-toggle\b/.test(a.className)) {
            e.preventDefault();
            if (!toggle(a, isCtrlKey(e))) {
                var r = doc.getElementById(a.getAttribute('href').slice(1)),
                    s = r.previousSibling,
                    f = r.parentNode,
                    t = a.parentNode;
                t.replaceChild(r, a);
                f.replaceChild(a, s);
                t.insertBefore(s, r);
                f = f.firstChild.nodeValue.match(indentRx);
                t = t.firstChild.nodeValue.match(indentRx);
                if (f && t && f[0] !== t[0]) {
                    r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\$1'), 'mg'), t[0]);
                }
                if (/\bsf-dump-compact\b/.test(r.className)) {
                    toggle(s, isCtrlKey(e));
                }
            }

            if (c) {
            } else if (doc.getSelection) {
                try {
                    doc.getSelection().removeAllRanges();
                } catch (e) {
                    doc.getSelection().empty();
                }
            } else {
                doc.selection.empty();
            }
        } else if (/\bsf-dump-str-toggle\b/.test(a.className)) {
            e.preventDefault();
            e = a.parentNode.parentNode;
            e.className = e.className.replace(/\bsf-dump-str-(expand|collapse)\b/, a.parentNode.className);
        }
    });

    elt = root.getElementsByTagName('SAMP');
    len = elt.length;
    i = 0;

    while (i < len) t.push(elt[i++]);
    len = t.length;

    for (i = 0; i < len; ++i) {
        elt = t[i];
        if ('SAMP' == elt.tagName) {
            a = elt.previousSibling || {};
            if ('A' != a.tagName) {
                a = doc.createElement('A');
                a.className = 'sf-dump-ref';
                elt.parentNode.insertBefore(a, elt);
            } else {
                a.innerHTML += ' ';
            }
            a.title = (a.title ? a.title+'\n[' : '[')+keyHint+'+click] Expand all children';
            a.innerHTML += elt.className == 'sf-dump-compact' ? '<span>▶</span>' : '<span>▼</span>';
            a.className += ' sf-dump-toggle';

            x = 1;
            if ('sf-dump' != elt.parentNode.className) {
                x += elt.parentNode.getAttribute('data-depth')/1;
            }
        } else if (/\bsf-dump-ref\b/.test(elt.className) && (a = elt.getAttribute('href'))) {
            a = a.slice(1);
            elt.className += ' sf-dump-hover';
            elt.className += ' '+a;

            if (/[\[{]$/.test(elt.previousSibling.nodeValue)) {
                a = a != elt.nextSibling.id && doc.getElementById(a);
                try {
                    s = a.nextSibling;
                    elt.appendChild(a);
                    s.parentNode.insertBefore(a, s);
                    if (/^[@#]/.test(elt.innerHTML)) {
                        elt.innerHTML += ' <span>▶</span>';
                    } else {
                        elt.innerHTML = '<span>▶</span>';
                        elt.className = 'sf-dump-ref';
                    }
                    elt.className += ' sf-dump-toggle';
                } catch (e) {
                    if ('&' == elt.innerHTML.charAt(0)) {
                        elt.innerHTML = '…';
                        elt.className = 'sf-dump-ref';
                    }
                }
            }
        }
    }

    if (doc.evaluate && Array.from && root.children.length > 1) {
        root.setAttribute('tabindex', 0);

        SearchState = function () {
            this.nodes = [];
            this.idx = 0;
        };
        SearchState.prototype = {
            next: function () {
                if (this.isEmpty()) {
                    return this.current();
                }
                this.idx = this.idx < (this.nodes.length - 1) ? this.idx + 1 : 0;

                return this.current();
            },
            previous: function () {
                if (this.isEmpty()) {
                    return this.current();
                }
                this.idx = this.idx > 0 ? this.idx - 1 : (this.nodes.length - 1);

                return this.current();
            },
            isEmpty: function () {
                return 0 === this.count();
            },
            current: function () {
                if (this.isEmpty()) {
                    return null;
                }
                return this.nodes[this.idx];
            },
            reset: function () {
                this.nodes = [];
                this.idx = 0;
            },
            count: function () {
                return this.nodes.length;
            },
        };

        function showCurrent(state)
        {
            var currentNode = state.current(), currentRect, searchRect;
            if (currentNode) {
                reveal(currentNode);
                highlight(root, currentNode, state.nodes);
                if ('scrollIntoView' in currentNode) {
                    currentNode.scrollIntoView(true);
                    currentRect = currentNode.getBoundingClientRect();
                    searchRect = search.getBoundingClientRect();
                    if (currentRect.top < (searchRect.top + searchRect.height)) {
                        window.scrollBy(0, -(searchRect.top + searchRect.height + 5));
                    }
                }
            }
            counter.textContent = (state.isEmpty() ? 0 : state.idx + 1) + ' of ' + state.count();
        }

        var search = doc.createElement('div');
        search.className = 'sf-dump-search-wrapper sf-dump-search-hidden';
        search.innerHTML = '
            <input type="text" class="sf-dump-search-input">
            <span class="sf-dump-search-count">0 of 0<\/span>
            <button type="button" class="sf-dump-search-input-previous" tabindex="-1">
                <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 1331l-166 165q-19 19-45 19t-45-19L896 965l-531 531q-19 19-45 19t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19 45-19t45 19l742 741q19 19 19 45.5t-19 45.5z"\/><\/svg>
            <\/button>
            <button type="button" class="sf-dump-search-input-next" tabindex="-1">
                <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 808l-742 741q-19 19-45 19t-45-19L109 808q-19-19-19-45.5t19-45.5l166-165q19-19 45-19t45 19l531 531 531-531q19-19 45-19t45 19l166 165q19 19 19 45.5t-19 45.5z"\/><\/svg>
            <\/button>
        ';
        root.insertBefore(search, root.firstChild);

        var state = new SearchState();
        var searchInput = search.querySelector('.sf-dump-search-input');
        var counter = search.querySelector('.sf-dump-search-count');
        var searchInputTimer = 0;
        var previousSearchQuery = '';

        addEventListener(searchInput, 'keyup', function (e) {
            var searchQuery = e.target.value;
            /* Don't perform anything if the pressed key didn't change the query */
            if (searchQuery === previousSearchQuery) {
                return;
            }
            previousSearchQuery = searchQuery;
            clearTimeout(searchInputTimer);
            searchInputTimer = setTimeout(function () {
                state.reset();
                collapseAll(root);
                resetHighlightedNodes(root);
                if ('' === searchQuery) {
                    counter.textContent = '0 of 0';

                    return;
                }

                var classMatches = [
                    "sf-dump-str",
                    "sf-dump-key",
                    "sf-dump-public",
                    "sf-dump-protected",
                    "sf-dump-private",
                ].map(xpathHasClass).join(' or ');

                var xpathResult = doc.evaluate('.//span[' + classMatches + '][contains(translate(child::text(), ' + xpathString(searchQuery.toUpperCase()) + ', ' + xpathString(searchQuery.toLowerCase()) + '), ' + xpathString(searchQuery.toLowerCase()) + ')]', root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

                while (node = xpathResult.iterateNext()) state.nodes.push(node);

                showCurrent(state);
            }, 400);
        });

        Array.from(search.querySelectorAll('.sf-dump-search-input-next, .sf-dump-search-input-previous')).forEach(function (btn) {
            addEventListener(btn, 'click', function (e) {
                e.preventDefault();
                -1 !== e.target.className.indexOf('next') ? state.next() : state.previous();
                searchInput.focus();
                collapseAll(root);
                showCurrent(state);
            })
        });

        addEventListener(root, 'keydown', function (e) {
            var isSearchActive = !/\bsf-dump-search-hidden\b/.test(search.className);
            if ((114 === e.keyCode && !isSearchActive) || (isCtrlKey(e) && 70 === e.keyCode)) {
                /* F3 or CMD/CTRL + F */
                if (70 === e.keyCode && document.activeElement === searchInput) {
                   /*
                    * If CMD/CTRL + F is hit while having focus on search input,
                    * the user probably meant to trigger browser search instead.
                    * Let the browser execute its behavior:
                    */
                    return;
                }

                e.preventDefault();
                search.className = search.className.replace(/\bsf-dump-search-hidden\b/, '');
                searchInput.focus();
            } else if (isSearchActive) {
                if (27 === e.keyCode) {
                    /* ESC key */
                    search.className += ' sf-dump-search-hidden';
                    e.preventDefault();
                    resetHighlightedNodes(root);
                    searchInput.value = '';
                } else if (
                    (isCtrlKey(e) && 71 === e.keyCode) /* CMD/CTRL + G */
                    || 13 === e.keyCode /* Enter */
                    || 114 === e.keyCode /* F3 */
                ) {
                    e.preventDefault();
                    e.shiftKey ? state.previous() : state.next();
                    collapseAll(root);
                    showCurrent(state);
                }
            }
        });
    }

    if (0 >= options.maxStringLength) {
        return;
    }
    try {
        elt = root.querySelectorAll('.sf-dump-str');
        len = elt.length;
        i = 0;
        t = [];

        while (i < len) t.push(elt[i++]);
        len = t.length;

        for (i = 0; i < len; ++i) {
            elt = t[i];
            s = elt.innerText || elt.textContent;
            x = s.length - options.maxStringLength;
            if (0 < x) {
                h = elt.innerHTML;
                elt[elt.innerText ? 'innerText' : 'textContent'] = s.substring(0, options.maxStringLength);
                elt.className += ' sf-dump-str-collapse';
                elt.innerHTML = '<span class=sf-dump-str-collapse>'+h+'<a class="sf-dump-ref sf-dump-str-toggle" title="Collapse"> ◀</a></span>'+
                    '<span class=sf-dump-str-expand>'+elt.innerHTML+'<a class="sf-dump-ref sf-dump-str-toggle" title="'+x+' remaining characters"> ▶</a></span>';
            }
        }
    } catch (e) {
    }
};

})(document);
</script><style>
.sf-js-enabled pre.sf-dump .sf-dump-compact,
.sf-js-enabled .sf-dump-str-collapse .sf-dump-str-collapse,
.sf-js-enabled .sf-dump-str-expand .sf-dump-str-expand {
    display: none;
}
.sf-dump-hover:hover {
    background-color: #B729D9;
    color: #FFF !important;
    border-radius: 2px;
}
pre.sf-dump {
    display: block;
    white-space: pre;
    padding: 5px;
    overflow: initial !important;
}
pre.sf-dump:after {
   content: "";
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
pre.sf-dump .sf-dump-ellipsization {
    display: inline-flex;
}
pre.sf-dump a {
    text-decoration: none;
    cursor: pointer;
    border: 0;
    outline: none;
    color: inherit;
}
pre.sf-dump img {
    max-width: 50em;
    max-height: 50em;
    margin: .5em 0 0 0;
    padding: 0;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #D3D3D3;
}
pre.sf-dump .sf-dump-ellipsis {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
pre.sf-dump .sf-dump-ellipsis-tail {
    flex-shrink: 0;
}
pre.sf-dump code {
    display:inline;
    padding:0;
    background:none;
}
.sf-dump-public.sf-dump-highlight,
.sf-dump-protected.sf-dump-highlight,
.sf-dump-private.sf-dump-highlight,
.sf-dump-str.sf-dump-highlight,
.sf-dump-key.sf-dump-highlight {
    background: rgba(111, 172, 204, 0.3);
    border: 1px solid #7DA0B1;
    border-radius: 3px;
}
.sf-dump-public.sf-dump-highlight-active,
.sf-dump-protected.sf-dump-highlight-active,
.sf-dump-private.sf-dump-highlight-active,
.sf-dump-str.sf-dump-highlight-active,
.sf-dump-key.sf-dump-highlight-active {
    background: rgba(253, 175, 0, 0.4);
    border: 1px solid #ffa500;
    border-radius: 3px;
}
pre.sf-dump .sf-dump-search-hidden {
    display: none !important;
}
pre.sf-dump .sf-dump-search-wrapper {
    font-size: 0;
    white-space: nowrap;
    margin-bottom: 5px;
    display: flex;
    position: -webkit-sticky;
    position: sticky;
    top: 5px;
}
pre.sf-dump .sf-dump-search-wrapper > * {
    vertical-align: top;
    box-sizing: border-box;
    height: 21px;
    font-weight: normal;
    border-radius: 0;
    background: #FFF;
    color: #757575;
    border: 1px solid #BBB;
}
pre.sf-dump .sf-dump-search-wrapper > input.sf-dump-search-input {
    padding: 3px;
    height: 21px;
    font-size: 12px;
    border-right: none;
    border-top-left-radius: 3px;
    border-bottom-left-radius: 3px;
    color: #000;
    min-width: 15px;
    width: 100%;
}
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next,
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous {
    background: #F2F2F2;
    outline: none;
    border-left: none;
    font-size: 0;
    line-height: 0;
}
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next {
    border-top-right-radius: 3px;
    border-bottom-right-radius: 3px;
}
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next > svg,
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous > svg {
    pointer-events: none;
    width: 12px;
    height: 12px;
}
pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-count {
    display: inline-block;
    padding: 0 5px;
    margin: 0;
    border-left: none;
    line-height: 21px;
    font-size: 12px;
}
EOHTML
);

foreach ($this->styles as $class => $style) {
$line .= 'pre.sf-dump'.('default' === $class ? ', pre.sf-dump' : '').' .sf-dump-'.$class.'{'.$style.'}';
}
$line .= 'pre.sf-dump .sf-dump-ellipsis-note{'.$this->styles['note'].'}';

return $this->dumpHeader = preg_replace('/\s+/', ' ', $line).'</style>'.$this->dumpHeader;
}

public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void
{
if ('' === $str && isset($cursor->attr['img-data'], $cursor->attr['content-type'])) {
$this->dumpKey($cursor);
$this->line .= $this->style('default', $cursor->attr['img-size'] ?? '', []);
$this->line .= $cursor->depth >= $this->displayOptions['maxDepth'] ? ' <samp class=sf-dump-compact>' : ' <samp class=sf-dump-expanded>';
$this->endValue($cursor);
$this->line .= $this->indentPad;
$this->line .= \sprintf('<img src="data:%s;base64,%s" /></samp>', $cursor->attr['content-type'], base64_encode($cursor->attr['img-data']));
$this->endValue($cursor);
} else {
parent::dumpString($cursor, $str, $bin, $cut);
}
}

public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void
{
if (Cursor::HASH_OBJECT === $type) {
$cursor->attr['depth'] = $cursor->depth;
}
parent::enterHash($cursor, $type, $class, false);

if ($cursor->skipChildren || $cursor->depth >= $this->displayOptions['maxDepth']) {
$cursor->skipChildren = false;
$eol = ' class=sf-dump-compact>';
} else {
$this->expandNextHash = false;
$eol = ' class=sf-dump-expanded>';
}

if ($hasChild) {
$this->line .= '<samp data-depth='.($cursor->depth + 1);
if ($cursor->refIndex) {
$r = Cursor::HASH_OBJECT !== $type ? 1 - (Cursor::HASH_RESOURCE !== $type) : 2;
$r .= $r && 0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->refIndex;

$this->line .= \sprintf(' id=%s-ref%s', $this->dumpId, $r);
}
$this->line .= $eol;
$this->dumpLine($cursor->depth);
}
}

public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void
{
$this->dumpEllipsis($cursor, $hasChild, $cut);
if ($hasChild) {
$this->line .= '</samp>';
}
parent::leaveHash($cursor, $type, $class, $hasChild, 0);
}

protected function style(string $style, string $value, array $attr = []): string
{
if ('' === $value && ('label' !== $style || !isset($attr['file']) && !isset($attr['href']))) {
return '';
}

$v = esc($value);

if ('ref' === $style) {
if (empty($attr['count'])) {
return \sprintf('<a class=sf-dump-ref>%s</a>', $v);
}
$r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1);

return \sprintf('<a class=sf-dump-ref href=#%s-ref%s title="%d occurrences">%s</a>', $this->dumpId, $r, 1 + $attr['count'], $v);
}

$dumpClasses = ['sf-dump-'.$style];
$dumpTitle = '';

if ('const' === $style && isset($attr['value'])) {
$dumpTitle = esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']));
} elseif ('public' === $style) {
$dumpTitle = empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property';
} elseif ('str' === $style && 1 < $attr['length']) {
$dumpTitle = \sprintf('%d%s characters', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
} elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) {
$attr += [
'ellipsis' => \strlen($value) - $c,
'ellipsis-type' => 'note',
'ellipsis-tail' => 1,
];
} elseif ('protected' === $style) {
$dumpTitle = 'Protected property';
} elseif ('meta' === $style && isset($attr['title'])) {
$dumpTitle = esc($this->utf8Encode($attr['title']));
} elseif ('private' === $style) {
$dumpTitle = \sprintf('Private property defined in class:&#10;`%s`', esc($this->utf8Encode($attr['class'])));
}

if (isset($attr['ellipsis'])) {
$dumpClasses[] = 'sf-dump-ellipsization';
$ellipsisClass = 'sf-dump-ellipsis';
if (isset($attr['ellipsis-type'])) {
$ellipsisClass .= ' sf-dump-ellipsis-'.$attr['ellipsis-type'];
}
$label = esc(substr($value, -$attr['ellipsis']));
$dumpTitle = $v."\n".$dumpTitle;
$v = \sprintf('<span class="%s">%s</span>', $ellipsisClass, substr($v, 0, -\strlen($label)));

if (!empty($attr['ellipsis-tail'])) {
$tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail'])));
$v .= \sprintf('<span class="%s">%s</span><span class="sf-dump-ellipsis-tail">%s</span>', $ellipsisClass, substr($label, 0, $tail), substr($label, $tail));
} else {
$v .= \sprintf('<span class="sf-dump-ellipsis-tail">%s</span>', $label);
}
}

$map = static::$controlCharsMap;
$v = \sprintf(
'<span class=%s%s%1$s%s>%s</span>',
1 === \count($dumpClasses) ? '' : '"',
implode(' ', $dumpClasses),
$dumpTitle ? ' title="'.$dumpTitle.'"' : '',
preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) {
$s = $b = '<span class="sf-dump-default';
$c = $c[$i = 0];
if ($ns = "\r" === $c[$i] || "\n" === $c[$i]) {
$s .= ' sf-dump-ns';
}
$s .= '">';
do {
if (("\r" === $c[$i] || "\n" === $c[$i]) !== $ns) {
$s .= '</span>'.$b;
if ($ns = !$ns) {
$s .= ' sf-dump-ns';
}
$s .= '">';
}

$s .= $map[$c[$i]] ?? \sprintf('\x%02X', \ord($c[$i]));
} while (isset($c[++$i]));

return $s.'</span>';
}, $v)
);

if (!($attr['binary'] ?? false)) {
$v = preg_replace_callback(static::$unicodeCharsRx, function ($c) {
return '<span class=sf-dump-default>\u{'.strtoupper(dechex(mb_ord($c[0]))).'}</span>';
}, $v);
}

if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], $attr['line'] ?? 0)) {
$attr['href'] = $href;
}
if (isset($attr['href'])) {
if ('label' === $style) {
$v .= '^';
}
$target = isset($attr['file']) ? '' : ' target="_blank"';
$v = \sprintf('<a href="%s"%s rel="noopener noreferrer">%s</a>', esc($this->utf8Encode($attr['href'])), $target, $v);
}
if (isset($attr['lang'])) {
$v = \sprintf('<code class="%s">%s</code>', esc($attr['lang']), $v);
}
if ('label' === $style) {
$v .= ' ';
}
if ($attr['virtual'] ?? false) {
$v = '<span class=sf-dump-virtual>'.$v.'</span>';
}

return $v;
}

protected function dumpLine(int $depth, bool $endOfValue = false): void
{
if (-1 === $this->lastDepth) {
$this->line = \sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line;
}
if ($this->headerIsDumped !== ($this->outputStream ?? $this->lineDumper)) {
$this->line = $this->getDumpHeader().$this->line;
}

if (-1 === $depth) {
$args = ['"'.$this->dumpId.'"'];
if ($this->extraDisplayOptions) {
$args[] = json_encode($this->extraDisplayOptions, \JSON_FORCE_OBJECT);
}

$this->line .= \sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args));
}
$this->lastDepth = $depth;

$this->line = mb_encode_numericentity($this->line, [0x80, 0x10FFFF, 0, 0x1FFFFF], 'UTF-8');

if (-1 === $depth) {
AbstractDumper::dumpLine(0);
}
AbstractDumper::dumpLine($depth);
}

private function getSourceLink(string $file, int $line): string|false
{
$options = $this->extraDisplayOptions + $this->displayOptions;

if ($fmt = $options['fileLinkFormat']) {
return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line);
}

return false;
}
}

function esc(string $str): string
{
return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8');
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface;




class ContextualizedDumper implements DataDumperInterface
{



public function __construct(
private DataDumperInterface $wrappedDumper,
private array $contextProviders,
) {
}

public function dump(Data $data): ?string
{
$context = $data->getContext();
foreach ($this->contextProviders as $contextProvider) {
$context[$contextProvider::class] = $contextProvider->getContext();
}

return $this->wrappedDumper->dump($data->withContext($context));
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\DumperInterface;






abstract class AbstractDumper implements DataDumperInterface, DumperInterface
{
public const DUMP_LIGHT_ARRAY = 1;
public const DUMP_STRING_LENGTH = 2;
public const DUMP_COMMA_SEPARATOR = 4;
public const DUMP_TRAILING_COMMA = 8;


public static $defaultOutput = 'php://output';

protected string $line = '';

protected $lineDumper;

protected $outputStream;
protected string $decimalPoint = '.';
protected string $indentPad = '  ';

private string $charset = '';






public function __construct(
$output = null,
?string $charset = null,
protected int $flags = 0,
) {
$this->setCharset($charset ?: \ini_get('php.output_encoding') ?: \ini_get('default_charset') ?: 'UTF-8');
$this->setOutput($output ?: static::$defaultOutput);
if (!$output && \is_string(static::$defaultOutput)) {
static::$defaultOutput = $this->outputStream;
}
}








public function setOutput($output)
{
$prev = $this->outputStream ?? $this->lineDumper;

if (\is_callable($output)) {
$this->outputStream = null;
$this->lineDumper = $output;
} else {
if (\is_string($output)) {
$output = fopen($output, 'w');
}
$this->outputStream = $output;
$this->lineDumper = $this->echoLine(...);
}

return $prev;
}






public function setCharset(string $charset): string
{
$prev = $this->charset;

$charset = strtoupper($charset);
$charset = 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset;

$this->charset = $charset;

return $prev;
}








public function setIndentPad(string $pad): string
{
$prev = $this->indentPad;
$this->indentPad = $pad;

return $prev;
}








public function dump(Data $data, $output = null): ?string
{
if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(\LC_NUMERIC, 0) : null) {
setlocale(\LC_NUMERIC, 'C');
}

if ($returnDump = true === $output) {
$output = fopen('php://memory', 'r+');
}
if ($output) {
$prevOutput = $this->setOutput($output);
}
try {
$data->dump($this);
$this->dumpLine(-1);

if ($returnDump) {
$result = stream_get_contents($output, -1, 0);
fclose($output);

return $result;
}
} finally {
if ($output) {
$this->setOutput($prevOutput);
}
if ($locale) {
setlocale(\LC_NUMERIC, $locale);
}
}

return null;
}







protected function dumpLine(int $depth): void
{
($this->lineDumper)($this->line, $depth, $this->indentPad);
$this->line = '';
}




protected function echoLine(string $line, int $depth, string $indentPad): void
{
if (-1 !== $depth) {
fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n");
}
}




protected function utf8Encode(?string $s): ?string
{
if (null === $s || preg_match('//u', $s)) {
return $s;
}

if (\function_exists('iconv')) {
if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) {
return $c;
}
if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) {
return $c;
}
}

$s .= $s;
$len = \strlen($s);
$mapCp1252 = false;

for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) {
if ($s[$i] < "\x80") {
$s[$j] = $s[$i];
} elseif ($s[$i] < "\xC0") {
$s[$j] = "\xC2";
$s[++$j] = $s[$i];
if ($s[$i] < "\xA0") {
$mapCp1252 = true;
}
} else {
$s[$j] = "\xC3";
$s[++$j] = \chr(\ord($s[$i]) - 64);
}
}

$s = substr($s, 0, $j);

if (!$mapCp1252) {
return $s;
}

return strtr($s, [
"\xC2\x80" => '€', "\xC2\x82" => '‚', "\xC2\x83" => 'ƒ', "\xC2\x84" => '„',
"\xC2\x85" => '…', "\xC2\x86" => '†', "\xC2\x87" => '‡', "\xC2\x88" => 'ˆ',
"\xC2\x89" => '‰', "\xC2\x8A" => 'Š', "\xC2\x8B" => '‹', "\xC2\x8C" => 'Œ',
"\xC2\x8D" => 'Ž', "\xC2\x91" => '‘', "\xC2\x92" => '’', "\xC2\x93" => '“',
"\xC2\x94" => '”', "\xC2\x95" => '•', "\xC2\x96" => '–', "\xC2\x97" => '—',
"\xC2\x98" => '˜', "\xC2\x99" => '™', "\xC2\x9A" => 'š', "\xC2\x9B" => '›',
"\xC2\x9C" => 'œ', "\xC2\x9E" => 'ž',
]);
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface;
use Symfony\Component\VarDumper\Server\Connection;






class ServerDumper implements DataDumperInterface
{
private Connection $connection;






public function __construct(
string $host,
private ?DataDumperInterface $wrappedDumper = null,
array $contextProviders = [],
) {
$this->connection = new Connection($host, $contextProviders);
}

public function getContextProviders(): array
{
return $this->connection->getContextProviders();
}

public function dump(Data $data): ?string
{
if (!$this->connection->write($data) && $this->wrappedDumper) {
return $this->wrappedDumper->dump($data);
}

return null;
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\VarDumper\Cloner\Data;






interface DataDumperInterface
{



public function dump(Data $data);
}
<?php










namespace Symfony\Component\VarDumper\Dumper;

use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
use Symfony\Component\VarDumper\Cloner\Cursor;
use Symfony\Component\VarDumper\Cloner\Stub;






class CliDumper extends AbstractDumper
{
public static bool $defaultColors;

public static $defaultOutput = 'php://stdout';

protected bool $colors;
protected int $maxStringWidth = 0;
protected array $styles = [

'default' => '0;38;5;208',
'num' => '1;38;5;38',
'const' => '1;38;5;208',
'virtual' => '3',
'str' => '1;38;5;113',
'note' => '38;5;38',
'ref' => '38;5;247',
'public' => '39',
'protected' => '39',
'private' => '39',
'meta' => '38;5;170',
'key' => '38;5;113',
'index' => '38;5;38',
];

protected static string $controlCharsRx = '/[\x00-\x1F\x7F]+/';
protected static array $controlCharsMap = [
"\t" => '\t',
"\n" => '\n',
"\v" => '\v',
"\f" => '\f',
"\r" => '\r',
"\033" => '\e',
];
protected static string $unicodeCharsRx = "/[\u{00A0}\u{00AD}\u{034F}\u{061C}\u{115F}\u{1160}\u{17B4}\u{17B5}\u{180E}\u{2000}-\u{200F}\u{202F}\u{205F}\u{2060}-\u{2064}\u{206A}-\u{206F}\u{3000}\u{2800}\u{3164}\u{FEFF}\u{FFA0}\u{1D159}\u{1D173}-\u{1D17A}]/u";

protected bool $collapseNextHash = false;
protected bool $expandNextHash = false;

private array $displayOptions = [
'fileLinkFormat' => null,
];

private bool $handlesHrefGracefully;

public function __construct($output = null, ?string $charset = null, int $flags = 0)
{
parent::__construct($output, $charset, $flags);

if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) {

$this->setStyles([
'default' => '31',
'num' => '1;34',
'const' => '1;31',
'str' => '1;32',
'note' => '34',
'ref' => '1;30',
'meta' => '35',
'key' => '32',
'index' => '34',
]);
}

$this->displayOptions['fileLinkFormat'] = class_exists(FileLinkFormatter::class) ? new FileLinkFormatter() : (\ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l');
}




public function setColors(bool $colors): void
{
$this->colors = $colors;
}




public function setMaxStringWidth(int $maxStringWidth): void
{
$this->maxStringWidth = $maxStringWidth;
}






public function setStyles(array $styles): void
{
$this->styles = $styles + $this->styles;
}






public function setDisplayOptions(array $displayOptions): void
{
$this->displayOptions = $displayOptions + $this->displayOptions;
}

public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value): void
{
$this->dumpKey($cursor);
$this->collapseNextHash = $this->expandNextHash = false;

$style = 'const';
$attr = $cursor->attr;

switch ($type) {
case 'default':
$style = 'default';
break;

case 'label':
$this->styles += ['label' => $this->styles['default']];
$style = 'label';
break;

case 'integer':
$style = 'num';

if (isset($this->styles['integer'])) {
$style = 'integer';
}

break;

case 'double':
$style = 'num';

if (isset($this->styles['float'])) {
$style = 'float';
}

$value = match (true) {
\INF === $value => 'INF',
-\INF === $value => '-INF',
is_nan($value) => 'NAN',
default => !str_contains($value = (string) $value, $this->decimalPoint) ? $value .= $this->decimalPoint.'0' : $value,
};
break;

case 'NULL':
$value = 'null';
break;

case 'boolean':
$value = $value ? 'true' : 'false';
break;

default:
$attr += ['value' => $this->utf8Encode($value)];
$value = $this->utf8Encode($type);
break;
}

$this->line .= $this->style($style, $value, $attr);

$this->endValue($cursor);
}

public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void
{
$this->dumpKey($cursor);
$this->collapseNextHash = $this->expandNextHash = false;
$attr = $cursor->attr;

if ($bin) {
$str = $this->utf8Encode($str);
}
if ('' === $str) {
$this->line .= '""';
if ($cut) {
$this->line .= '…'.$cut;
}
$this->endValue($cursor);
} else {
$attr += [
'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0,
'binary' => $bin,
];
$str = $bin && str_contains($str, "\0") ? [$str] : explode("\n", $str);
if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) {
unset($str[1]);
$str[0] .= "\n";
}
$m = \count($str) - 1;
$i = $lineCut = 0;

if (self::DUMP_STRING_LENGTH & $this->flags) {
$this->line .= '('.$attr['length'].') ';
}
if ($bin) {
$this->line .= 'b';
}

if ($m) {
$this->line .= '"""';
$this->dumpLine($cursor->depth);
} else {
$this->line .= '"';
}

foreach ($str as $str) {
if ($i < $m) {
$str .= "\n";
}
if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) {
$str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8');
$lineCut = $len - $this->maxStringWidth;
}
if ($m && 0 < $cursor->depth) {
$this->line .= $this->indentPad;
}
if ('' !== $str) {
$this->line .= $this->style('str', $str, $attr);
}
if ($i++ == $m) {
if ($m) {
if ('' !== $str) {
$this->dumpLine($cursor->depth);
if (0 < $cursor->depth) {
$this->line .= $this->indentPad;
}
}
$this->line .= '"""';
} else {
$this->line .= '"';
}
if ($cut < 0) {
$this->line .= '…';
$lineCut = 0;
} elseif ($cut) {
$lineCut += $cut;
}
}
if ($lineCut) {
$this->line .= '…'.$lineCut;
$lineCut = 0;
}

if ($i > $m) {
$this->endValue($cursor);
} else {
$this->dumpLine($cursor->depth);
}
}
}
}

public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void
{
$this->colors ??= $this->supportsColors();

$this->dumpKey($cursor);
$this->expandNextHash = false;
$attr = $cursor->attr;

if ($this->collapseNextHash) {
$cursor->skipChildren = true;
$this->collapseNextHash = $hasChild = false;
}

$class = $this->utf8Encode($class);
if (Cursor::HASH_OBJECT === $type) {
$prefix = $class && 'stdClass' !== $class ? $this->style('note', $class, $attr).(empty($attr['cut_hash']) ? ' {' : '') : '{';
} elseif (Cursor::HASH_RESOURCE === $type) {
$prefix = $this->style('note', $class.' resource', $attr).($hasChild ? ' {' : ' ');
} else {
$prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '[';
}

if (($cursor->softRefCount || 0 < $cursor->softRefHandle) && empty($attr['cut_hash'])) {
$prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]);
} elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) {
$prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]);
} elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) {
$prefix = substr($prefix, 0, -1);
}

$this->line .= $prefix;

if ($hasChild) {
$this->dumpLine($cursor->depth);
}
}

public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void
{
if (empty($cursor->attr['cut_hash'])) {
$this->dumpEllipsis($cursor, $hasChild, $cut);
$this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : ''));
}

$this->endValue($cursor);
}







protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut): void
{
if ($cut) {
$this->line .= ' …';
if (0 < $cut) {
$this->line .= $cut;
}
if ($hasChild) {
$this->dumpLine($cursor->depth + 1);
}
}
}




protected function dumpKey(Cursor $cursor): void
{
if (null !== $key = $cursor->hashKey) {
if ($cursor->hashKeyIsBinary) {
$key = $this->utf8Encode($key);
}
$attr = [
'binary' => $cursor->hashKeyIsBinary,
'virtual' => $cursor->attr['virtual'] ?? false,
];
$bin = $cursor->hashKeyIsBinary ? 'b' : '';
$style = 'key';
switch ($cursor->hashType) {
default:
case Cursor::HASH_INDEXED:
if (self::DUMP_LIGHT_ARRAY & $this->flags) {
break;
}
$style = 'index';

case Cursor::HASH_ASSOC:
if (\is_int($key)) {
$this->line .= $this->style($style, $key).' => ';
} else {
$this->line .= $bin.'"'.$this->style($style, $key).'" => ';
}
break;

case Cursor::HASH_RESOURCE:
$key = "\0~\0".$key;

case Cursor::HASH_OBJECT:
if (!isset($key[0]) || "\0" !== $key[0]) {
$this->line .= '+'.$bin.$this->style('public', $key, $attr).': ';
} elseif (0 < strpos($key, "\0", 1)) {
$key = explode("\0", substr($key, 1), 2);

switch ($key[0][0]) {
case '+': 
$attr['dynamic'] = true;
$this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": ';
break 2;
case '~':
$style = 'meta';
if (isset($key[0][1])) {
parse_str(substr($key[0], 1), $attr);
$attr += ['binary' => $cursor->hashKeyIsBinary];
}
break;
case '*':
$style = 'protected';
$bin = '#'.$bin;
break;
default:
$attr['class'] = $key[0];
$style = 'private';
$bin = '-'.$bin;
break;
}

if (isset($attr['collapse'])) {
if ($attr['collapse']) {
$this->collapseNextHash = true;
} else {
$this->expandNextHash = true;
}
}

$this->line .= $bin.$this->style($style, $key[1], $attr).($attr['separator'] ?? ': ');
} else {

$this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": ';
}
break;
}

if ($cursor->hardRefTo) {
$this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' ';
}
}
}








protected function style(string $style, string $value, array $attr = []): string
{
$this->colors ??= $this->supportsColors();

$this->handlesHrefGracefully ??= 'JetBrains-JediTerm' !== getenv('TERMINAL_EMULATOR')
&& (!getenv('KONSOLE_VERSION') || (int) getenv('KONSOLE_VERSION') > 201100)
&& !isset($_SERVER['IDEA_INITIAL_DIRECTORY']);

if (isset($attr['ellipsis'], $attr['ellipsis-type'])) {
$prefix = substr($value, 0, -$attr['ellipsis']);
if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && str_starts_with($prefix, $_SERVER[$pwd])) {
$prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd]));
}
if (!empty($attr['ellipsis-tail'])) {
$prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']);
$value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']);
} else {
$value = substr($value, -$attr['ellipsis']);
}

$value = $this->style('default', $prefix).$this->style($style, $value);

goto href;
}

$map = static::$controlCharsMap;
$startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : '';
$endCchr = $this->colors ? "\033[m\033[{$this->styles[$style]}m" : '';
$value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) {
$s = $startCchr;
$c = $c[$i = 0];
do {
$s .= $map[$c[$i]] ?? \sprintf('\x%02X', \ord($c[$i]));
} while (isset($c[++$i]));

return $s.$endCchr;
}, $value, -1, $cchrCount);

if (!($attr['binary'] ?? false)) {
$value = preg_replace_callback(static::$unicodeCharsRx, function ($c) use (&$cchrCount, $startCchr, $endCchr) {
++$cchrCount;

return $startCchr.'\u{'.strtoupper(dechex(mb_ord($c[0]))).'}'.$endCchr;
}, $value);
}

if ($this->colors && '' !== $value) {
if ($cchrCount && "\033" === $value[0]) {
$value = substr($value, \strlen($startCchr));
} else {
$value = "\033[{$this->styles[$style]}m".$value;
}
if ($cchrCount && str_ends_with($value, $endCchr)) {
$value = substr($value, 0, -\strlen($endCchr));
} else {
$value .= "\033[{$this->styles['default']}m";
}
}

href:
if ($this->colors && $this->handlesHrefGracefully) {
if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], $attr['line'] ?? 0)) {
if ('note' === $style) {
$value .= "\033]8;;{$href}\033\\^\033]8;;\033\\";
} else {
$attr['href'] = $href;
}
}
if (isset($attr['href'])) {
if ('label' === $style) {
$value .= '^';
}
$value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\";
}
}

if ('label' === $style && '' !== $value) {
$value .= ' ';
}
if ($this->colors && ($attr['virtual'] ?? false)) {
$value = "\033[{$this->styles['virtual']}m".$value;
}

return $value;
}

protected function supportsColors(): bool
{
if ($this->outputStream !== static::$defaultOutput) {
return $this->hasColorSupport($this->outputStream);
}
if (isset(static::$defaultColors)) {
return static::$defaultColors;
}
if (isset($_SERVER['argv'][1])) {
$colors = $_SERVER['argv'];
$i = \count($colors);
while (--$i > 0) {
if (isset($colors[$i][5])) {
switch ($colors[$i]) {
case '--ansi':
case '--color':
case '--color=yes':
case '--color=force':
case '--color=always':
case '--colors=always':
return static::$defaultColors = true;

case '--no-ansi':
case '--color=no':
case '--color=none':
case '--color=never':
case '--colors=never':
return static::$defaultColors = false;
}
}
}
}

$h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null];
$h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'w') : $this->outputStream;

return static::$defaultColors = $this->hasColorSupport($h);
}

protected function dumpLine(int $depth, bool $endOfValue = false): void
{
if ($this->colors ??= $this->supportsColors()) {
$this->line = \sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line);
}
parent::dumpLine($depth);
}

protected function endValue(Cursor $cursor): void
{
if (-1 === $cursor->hashType) {
return;
}

if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) {
if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) {
$this->line .= ',';
} elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) {
$this->line .= ',';
}
}

$this->dumpLine($cursor->depth, true);
}







private function hasColorSupport(mixed $stream): bool
{
if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) {
return false;
}


if ('' !== (($_SERVER['NO_COLOR'] ?? getenv('NO_COLOR'))[0] ?? '')) {
return false;
}


if ('' !== (($_SERVER['FORCE_COLOR'] ?? getenv('FORCE_COLOR'))[0] ?? '')) {
return true;
}



if (!@stream_isatty($stream) && !\in_array(strtoupper((string) getenv('MSYSTEM')), ['MINGW32', 'MINGW64'], true)) {
return false;
}

if ('\\' === \DIRECTORY_SEPARATOR && @sapi_windows_vt100_support($stream)) {
return true;
}

if ('Hyper' === getenv('TERM_PROGRAM')
|| false !== getenv('COLORTERM')
|| false !== getenv('ANSICON')
|| 'ON' === getenv('ConEmuANSI')
) {
return true;
}

if ('dumb' === $term = (string) getenv('TERM')) {
return false;
}


return preg_match('/^((screen|xterm|vt100|vt220|putty|rxvt|ansi|cygwin|linux).*)|(.*-256(color)?(-bce)?)$/', $term);
}








private function isWindowsTrueColor(): bool
{
$result = 183 <= getenv('ANSICON_VER')
|| 'ON' === getenv('ConEmuANSI')
|| 'xterm' === getenv('TERM')
|| 'Hyper' === getenv('TERM_PROGRAM');

if (!$result) {
$version = \sprintf(
'%s.%s.%s',
PHP_WINDOWS_VERSION_MAJOR,
PHP_WINDOWS_VERSION_MINOR,
PHP_WINDOWS_VERSION_BUILD
);
$result = $version >= '10.0.15063';
}

return $result;
}

private function getSourceLink(string $file, int $line): string|false
{
if ($fmt = $this->displayOptions['fileLinkFormat']) {
return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : ($fmt->format($file, $line) ?: 'file://'.$file.'#L'.$line);
}

return false;
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper\ContextProvider;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\VarDumper\Caster\ReflectionCaster;
use Symfony\Component\VarDumper\Cloner\VarCloner;






final class RequestContextProvider implements ContextProviderInterface
{
private VarCloner $cloner;

public function __construct(
private RequestStack $requestStack,
) {
$this->cloner = new VarCloner();
$this->cloner->setMaxItems(0);
$this->cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO);
}

public function getContext(): ?array
{
if (null === $request = $this->requestStack->getCurrentRequest()) {
return null;
}

$controller = $request->attributes->get('_controller');

return [
'uri' => $request->getUri(),
'method' => $request->getMethod(),
'controller' => $controller ? $this->cloner->cloneVar($controller) : $controller,
'identifier' => hash('xxh128', spl_object_id($request).'@'.$_SERVER['REQUEST_TIME_FLOAT']),
];
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper\ContextProvider;






interface ContextProviderInterface
{
public function getContext(): ?array;
}
<?php










namespace Symfony\Component\VarDumper\Dumper\ContextProvider;






final class CliContextProvider implements ContextProviderInterface
{
public function getContext(): ?array
{
if ('cli' !== \PHP_SAPI) {
return null;
}

return [
'command_line' => $commandLine = implode(' ', $_SERVER['argv'] ?? []),
'identifier' => hash('xxh128', $commandLine.'@'.$_SERVER['REQUEST_TIME_FLOAT']),
];
}
}
<?php










namespace Symfony\Component\VarDumper\Dumper\ContextProvider;

use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\VarDumper;
use Twig\Template;







final class SourceContextProvider implements ContextProviderInterface
{
public function __construct(
private ?string $charset = null,
private ?string $projectDir = null,
private ?FileLinkFormatter $fileLinkFormatter = null,
private int $limit = 9,
) {
}

public function getContext(): ?array
{
$trace = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, $this->limit);

$file = $trace[1]['file'];
$line = $trace[1]['line'];
$name = '-' === $file || 'Standard input code' === $file ? 'Standard input code' : false;
$fileExcerpt = false;

for ($i = 2; $i < $this->limit; ++$i) {
if (isset($trace[$i]['class'], $trace[$i]['function'])
&& 'dump' === $trace[$i]['function']
&& VarDumper::class === $trace[$i]['class']
) {
$file = $trace[$i]['file'] ?? $file;
$line = $trace[$i]['line'] ?? $line;

while (++$i < $this->limit) {
if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && !str_starts_with($trace[$i]['function'], 'call_user_func')) {
$file = $trace[$i]['file'];
$line = $trace[$i]['line'];

break;
} elseif (isset($trace[$i]['object']) && $trace[$i]['object'] instanceof Template) {
$template = $trace[$i]['object'];
$name = $template->getTemplateName();
$src = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : false);
$info = $template->getDebugInfo();
if (isset($info[$trace[$i - 1]['line']])) {
$line = $info[$trace[$i - 1]['line']];
$file = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getPath() : null;

if ($src) {
$src = explode("\n", $src);
$fileExcerpt = [];

for ($i = max($line - 3, 1), $max = min($line + 3, \count($src)); $i <= $max; ++$i) {
$fileExcerpt[] = '<li'.($i === $line ? ' class="selected"' : '').'><code>'.$this->htmlEncode($src[$i - 1]).'</code></li>';
}

$fileExcerpt = '<ol start="'.max($line - 3, 1).'">'.implode("\n", $fileExcerpt).'</ol>';
}
}
break;
}
}
break;
}
}

if (false === $name) {
$name = str_replace('\\', '/', $file);
$name = substr($name, strrpos($name, '/') + 1);
}

$context = ['name' => $name, 'file' => $file, 'line' => $line];
$context['file_excerpt'] = $fileExcerpt;

if (null !== $this->projectDir) {
$context['project_dir'] = $this->projectDir;
if (str_starts_with($file, $this->projectDir)) {
$context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
}
}

if ($this->fileLinkFormatter && $fileLink = $this->fileLinkFormatter->format($context['file'], $context['line'])) {
$context['file_link'] = $fileLink;
}

return $context;
}

private function htmlEncode(string $s): string
{
$html = '';

$dumper = new HtmlDumper(function ($line) use (&$html) { $html .= $line; }, $this->charset);
$dumper->setDumpHeader('');
$dumper->setDumpBoundaries('', '');

$cloner = new VarCloner();
$dumper->dump($cloner->cloneVar($s));

return substr(strip_tags($html), 1, -1);
}
}
<?php










namespace Symfony\Component\ErrorHandler\Internal;






class TentativeTypes
{
public const RETURN_TYPES = [
'CURLFile' => [
'getFilename' => 'string',
'getMimeType' => 'string',
'getPostFilename' => 'string',
'setMimeType' => 'void',
'setPostFilename' => 'void',
],
'DateTimeInterface' => [
'format' => 'string',
'getTimezone' => 'DateTimeZone|false',
'getOffset' => 'int',
'getTimestamp' => 'int',
'diff' => 'DateInterval',
'__wakeup' => 'void',
],
'DateTime' => [
'__wakeup' => 'void',
'__set_state' => 'DateTime',
'createFromImmutable' => 'static',
'createFromFormat' => 'DateTime|false',
'getLastErrors' => 'array|false',
'format' => 'string',
'modify' => 'DateTime|false',
'add' => 'DateTime',
'sub' => 'DateTime',
'getTimezone' => 'DateTimeZone|false',
'setTimezone' => 'DateTime',
'getOffset' => 'int',
'setTime' => 'DateTime',
'setDate' => 'DateTime',
'setISODate' => 'DateTime',
'setTimestamp' => 'DateTime',
'getTimestamp' => 'int',
'diff' => 'DateInterval',
],
'DateTimeImmutable' => [
'__wakeup' => 'void',
'__set_state' => 'DateTimeImmutable',
'createFromFormat' => 'DateTimeImmutable|false',
'getLastErrors' => 'array|false',
'format' => 'string',
'getTimezone' => 'DateTimeZone|false',
'getOffset' => 'int',
'getTimestamp' => 'int',
'diff' => 'DateInterval',
'modify' => 'DateTimeImmutable|false',
'add' => 'DateTimeImmutable',
'sub' => 'DateTimeImmutable',
'setTimezone' => 'DateTimeImmutable',
'setTime' => 'DateTimeImmutable',
'setDate' => 'DateTimeImmutable',
'setISODate' => 'DateTimeImmutable',
'setTimestamp' => 'DateTimeImmutable',
'createFromMutable' => 'static',
],
'DateTimeZone' => [
'getName' => 'string',
'getOffset' => 'int',
'getTransitions' => 'array|false',
'getLocation' => 'array|false',
'listAbbreviations' => 'array',
'listIdentifiers' => 'array',
'__wakeup' => 'void',
'__set_state' => 'DateTimeZone',
],
'DateInterval' => [
'createFromDateString' => 'DateInterval|false',
'format' => 'string',
'__wakeup' => 'void',
'__set_state' => 'DateInterval',
],
'DatePeriod' => [
'getStartDate' => 'DateTimeInterface',
'getEndDate' => '?DateTimeInterface',
'getDateInterval' => 'DateInterval',
'getRecurrences' => '?int',
'__wakeup' => 'void',
'__set_state' => 'DatePeriod',
],
'DOMNode' => [
'C14N' => 'string|false',
'C14NFile' => 'int|false',
'getLineNo' => 'int',
'getNodePath' => '?string',
'hasAttributes' => 'bool',
'hasChildNodes' => 'bool',
'isDefaultNamespace' => 'bool',
'isSameNode' => 'bool',
'isSupported' => 'bool',
'lookupNamespaceURI' => '?string',
'lookupPrefix' => '?string',
'normalize' => 'void',
],
'DOMImplementation' => [
'getFeature' => 'never',
'hasFeature' => 'bool',
],
'DOMDocumentFragment' => [
'appendXML' => 'bool',
],
'DOMNodeList' => [
'count' => 'int',
],
'DOMCharacterData' => [
'appendData' => 'bool',
'insertData' => 'bool',
'deleteData' => 'bool',
'replaceData' => 'bool',
],
'DOMAttr' => [
'isId' => 'bool',
],
'DOMElement' => [
'getAttribute' => 'string',
'getAttributeNS' => 'string',
'getElementsByTagName' => 'DOMNodeList',
'getElementsByTagNameNS' => 'DOMNodeList',
'hasAttribute' => 'bool',
'hasAttributeNS' => 'bool',
'removeAttribute' => 'bool',
'removeAttributeNS' => 'void',
'setAttributeNS' => 'void',
'setIdAttribute' => 'void',
'setIdAttributeNS' => 'void',
'setIdAttributeNode' => 'void',
],
'DOMDocument' => [
'createComment' => 'DOMComment',
'createDocumentFragment' => 'DOMDocumentFragment',
'createTextNode' => 'DOMText',
'getElementById' => '?DOMElement',
'getElementsByTagName' => 'DOMNodeList',
'getElementsByTagNameNS' => 'DOMNodeList',
'normalizeDocument' => 'void',
'registerNodeClass' => 'bool',
'save' => 'int|false',
'saveHTML' => 'string|false',
'saveHTMLFile' => 'int|false',
'saveXML' => 'string|false',
'schemaValidate' => 'bool',
'schemaValidateSource' => 'bool',
'relaxNGValidate' => 'bool',
'relaxNGValidateSource' => 'bool',
'validate' => 'bool',
'xinclude' => 'int|false',
],
'DOMText' => [
'isWhitespaceInElementContent' => 'bool',
'isElementContentWhitespace' => 'bool',
],
'DOMNamedNodeMap' => [
'getNamedItem' => '?DOMNode',
'getNamedItemNS' => '?DOMNode',
'item' => '?DOMNode',
'count' => 'int',
],
'DOMXPath' => [
'evaluate' => 'mixed',
'query' => 'mixed',
'registerNamespace' => 'bool',
'registerPhpFunctions' => 'void',
],
'finfo' => [
'file' => 'string|false',
'buffer' => 'string|false',
],
'IntlPartsIterator' => [
'getBreakIterator' => 'IntlBreakIterator',
'getRuleStatus' => 'int',
],
'IntlBreakIterator' => [
'createCharacterInstance' => '?IntlBreakIterator',
'createCodePointInstance' => 'IntlCodePointBreakIterator',
'createLineInstance' => '?IntlBreakIterator',
'createSentenceInstance' => '?IntlBreakIterator',
'createTitleInstance' => '?IntlBreakIterator',
'createWordInstance' => '?IntlBreakIterator',
'current' => 'int',
'first' => 'int',
'following' => 'int',
'getErrorCode' => 'int',
'getErrorMessage' => 'string',
'getLocale' => 'string|false',
'getPartsIterator' => 'IntlPartsIterator',
'getText' => '?string',
'isBoundary' => 'bool',
'last' => 'int',
'next' => 'int',
'preceding' => 'int',
'previous' => 'int',
'setText' => '?bool',
],
'IntlRuleBasedBreakIterator' => [
'getBinaryRules' => 'string|false',
'getRules' => 'string|false',
'getRuleStatus' => 'int',
'getRuleStatusVec' => 'array|false',
],
'IntlCodePointBreakIterator' => [
'getLastCodePoint' => 'int',
],
'IntlCalendar' => [
'createInstance' => '?IntlCalendar',
'equals' => 'bool',
'fieldDifference' => 'int|false',
'add' => 'bool',
'after' => 'bool',
'before' => 'bool',
'fromDateTime' => '?IntlCalendar',
'get' => 'int|false',
'getActualMaximum' => 'int|false',
'getActualMinimum' => 'int|false',
'getAvailableLocales' => 'array',
'getDayOfWeekType' => 'int|false',
'getErrorCode' => 'int|false',
'getErrorMessage' => 'string|false',
'getFirstDayOfWeek' => 'int|false',
'getGreatestMinimum' => 'int|false',
'getKeywordValuesForLocale' => 'IntlIterator|false',
'getLeastMaximum' => 'int|false',
'getLocale' => 'string|false',
'getMaximum' => 'int|false',
'getMinimalDaysInFirstWeek' => 'int|false',
'getMinimum' => 'int|false',
'getNow' => 'float',
'getRepeatedWallTimeOption' => 'int',
'getSkippedWallTimeOption' => 'int',
'getTime' => 'float|false',
'getTimeZone' => 'IntlTimeZone|false',
'getType' => 'string',
'getWeekendTransition' => 'int|false',
'inDaylightTime' => 'bool',
'isEquivalentTo' => 'bool',
'isLenient' => 'bool',
'isWeekend' => 'bool',
'roll' => 'bool',
'isSet' => 'bool',
'setTime' => 'bool',
'setTimeZone' => 'bool',
'toDateTime' => 'DateTime|false',
],
'IntlGregorianCalendar' => [
'setGregorianChange' => 'bool',
'getGregorianChange' => 'float',
'isLeapYear' => 'bool',
],
'Collator' => [
'create' => '?Collator',
'compare' => 'int|false',
'sort' => 'bool',
'sortWithSortKeys' => 'bool',
'asort' => 'bool',
'getAttribute' => 'int|false',
'setAttribute' => 'bool',
'getStrength' => 'int',
'getLocale' => 'string|false',
'getErrorCode' => 'int|false',
'getErrorMessage' => 'string|false',
'getSortKey' => 'string|false',
],
'IntlIterator' => [
'current' => 'mixed',
'key' => 'mixed',
'next' => 'void',
'rewind' => 'void',
'valid' => 'bool',
],
'UConverter' => [
'convert' => 'string|false',
'fromUCallback' => 'string|int|array|null',
'getAliases' => 'array|false|null',
'getAvailable' => 'array',
'getDestinationEncoding' => 'string|false|null',
'getDestinationType' => 'int|false|null',
'getErrorCode' => 'int',
'getErrorMessage' => '?string',
'getSourceEncoding' => 'string|false|null',
'getSourceType' => 'int|false|null',
'getStandards' => '?array',
'getSubstChars' => 'string|false|null',
'reasonText' => 'string',
'setDestinationEncoding' => 'bool',
'setSourceEncoding' => 'bool',
'setSubstChars' => 'bool',
'toUCallback' => 'string|int|array|null',
'transcode' => 'string|false',
],
'IntlDateFormatter' => [
'create' => '?IntlDateFormatter',
'getDateType' => 'int|false',
'getTimeType' => 'int|false',
'getCalendar' => 'int|false',
'setCalendar' => 'bool',
'getTimeZoneId' => 'string|false',
'getCalendarObject' => 'IntlCalendar|false|null',
'getTimeZone' => 'IntlTimeZone|false',
'setTimeZone' => '?bool',
'setPattern' => 'bool',
'getPattern' => 'string|false',
'getLocale' => 'string|false',
'setLenient' => 'void',
'isLenient' => 'bool',
'format' => 'string|false',
'formatObject' => 'string|false',
'parse' => 'int|float|false',
'localtime' => 'array|false',
'getErrorCode' => 'int',
'getErrorMessage' => 'string',
],
'NumberFormatter' => [
'create' => '?NumberFormatter',
'format' => 'string|false',
'parse' => 'int|float|false',
'formatCurrency' => 'string|false',
'parseCurrency' => 'float|false',
'setAttribute' => 'bool',
'getAttribute' => 'int|float|false',
'setTextAttribute' => 'bool',
'getTextAttribute' => 'string|false',
'setSymbol' => 'bool',
'getSymbol' => 'string|false',
'setPattern' => 'bool',
'getPattern' => 'string|false',
'getLocale' => 'string|false',
'getErrorCode' => 'int',
'getErrorMessage' => 'string',
],
'Locale' => [
'getDefault' => 'string',
'getPrimaryLanguage' => '?string',
'getScript' => '?string',
'getRegion' => '?string',
'getKeywords' => 'array|false|null',
'getDisplayScript' => 'string|false',
'getDisplayRegion' => 'string|false',
'getDisplayName' => 'string|false',
'getDisplayLanguage' => 'string|false',
'getDisplayVariant' => 'string|false',
'composeLocale' => 'string|false',
'parseLocale' => '?array',
'getAllVariants' => '?array',
'filterMatches' => '?bool',
'lookup' => '?string',
'canonicalize' => '?string',
'acceptFromHttp' => 'string|false',
],
'MessageFormatter' => [
'create' => '?MessageFormatter',
'format' => 'string|false',
'formatMessage' => 'string|false',
'parse' => 'array|false',
'parseMessage' => 'array|false',
'setPattern' => 'bool',
'getPattern' => 'string|false',
'getLocale' => 'string',
'getErrorCode' => 'int',
'getErrorMessage' => 'string',
],
'Normalizer' => [
'normalize' => 'string|false',
'isNormalized' => 'bool',
'getRawDecomposition' => '?string',
],
'ResourceBundle' => [
'create' => '?ResourceBundle',
'get' => 'mixed',
'count' => 'int',
'getLocales' => 'array|false',
'getErrorCode' => 'int',
'getErrorMessage' => 'string',
],
'Spoofchecker' => [
'isSuspicious' => 'bool',
'areConfusable' => 'bool',
'setAllowedLocales' => 'void',
'setChecks' => 'void',
'setRestrictionLevel' => 'void',
],
'IntlTimeZone' => [
'countEquivalentIDs' => 'int|false',
'createDefault' => 'IntlTimeZone',
'createEnumeration' => 'IntlIterator|false',
'createTimeZone' => '?IntlTimeZone',
'createTimeZoneIDEnumeration' => 'IntlIterator|false',
'fromDateTimeZone' => '?IntlTimeZone',
'getCanonicalID' => 'string|false',
'getDisplayName' => 'string|false',
'getDSTSavings' => 'int',
'getEquivalentID' => 'string|false',
'getErrorCode' => 'int|false',
'getErrorMessage' => 'string|false',
'getGMT' => 'IntlTimeZone',
'getID' => 'string|false',
'getOffset' => 'bool',
'getRawOffset' => 'int',
'getRegion' => 'string|false',
'getTZDataVersion' => 'string|false',
'getUnknown' => 'IntlTimeZone',
'getWindowsID' => 'string|false',
'getIDForWindowsID' => 'string|false',
'hasSameRules' => 'bool',
'toDateTimeZone' => 'DateTimeZone|false',
'useDaylightTime' => 'bool',
],
'Transliterator' => [
'create' => '?Transliterator',
'createFromRules' => '?Transliterator',
'createInverse' => '?Transliterator',
'listIDs' => 'array|false',
'transliterate' => 'string|false',
'getErrorCode' => 'int|false',
'getErrorMessage' => 'string|false',
],
'IntlChar' => [
'hasBinaryProperty' => '?bool',
'charAge' => '?array',
'charDigitValue' => '?int',
'charDirection' => '?int',
'charFromName' => '?int',
'charMirror' => 'int|string|null',
'charName' => '?string',
'charType' => '?int',
'chr' => '?string',
'digit' => 'int|false|null',
'enumCharNames' => '?bool',
'enumCharTypes' => 'void',
'foldCase' => 'int|string|null',
'forDigit' => 'int',
'getBidiPairedBracket' => 'int|string|null',
'getBlockCode' => '?int',
'getCombiningClass' => '?int',
'getFC_NFKC_Closure' => 'string|false|null',
'getIntPropertyMaxValue' => 'int',
'getIntPropertyMinValue' => 'int',
'getIntPropertyValue' => '?int',
'getNumericValue' => '?float',
'getPropertyEnum' => 'int',
'getPropertyName' => 'string|false',
'getPropertyValueEnum' => 'int',
'getPropertyValueName' => 'string|false',
'getUnicodeVersion' => 'array',
'isalnum' => '?bool',
'isalpha' => '?bool',
'isbase' => '?bool',
'isblank' => '?bool',
'iscntrl' => '?bool',
'isdefined' => '?bool',
'isdigit' => '?bool',
'isgraph' => '?bool',
'isIDIgnorable' => '?bool',
'isIDPart' => '?bool',
'isIDStart' => '?bool',
'isISOControl' => '?bool',
'isJavaIDPart' => '?bool',
'isJavaIDStart' => '?bool',
'isJavaSpaceChar' => '?bool',
'islower' => '?bool',
'isMirrored' => '?bool',
'isprint' => '?bool',
'ispunct' => '?bool',
'isspace' => '?bool',
'istitle' => '?bool',
'isUAlphabetic' => '?bool',
'isULowercase' => '?bool',
'isupper' => '?bool',
'isUUppercase' => '?bool',
'isUWhiteSpace' => '?bool',
'isWhitespace' => '?bool',
'isxdigit' => '?bool',
'ord' => '?int',
'tolower' => 'int|string|null',
'totitle' => 'int|string|null',
'toupper' => 'int|string|null',
],
'JsonSerializable' => [
'jsonSerialize' => 'mixed',
],
'mysqli' => [
'autocommit' => 'bool',
'begin_transaction' => 'bool',
'change_user' => 'bool',
'character_set_name' => 'string',
'commit' => 'bool',
'connect' => 'bool',
'dump_debug_info' => 'bool',
'get_charset' => '?object',
'get_client_info' => 'string',
'get_connection_stats' => 'array',
'get_server_info' => 'string',
'get_warnings' => 'mysqli_warning|false',
'kill' => 'bool',
'multi_query' => 'bool',
'more_results' => 'bool',
'next_result' => 'bool',
'ping' => 'bool',
'poll' => 'int|false',
'prepare' => 'mysqli_stmt|false',
'query' => 'mysqli_result|bool',
'real_connect' => 'bool',
'real_escape_string' => 'string',
'reap_async_query' => 'mysqli_result|bool',
'escape_string' => 'string',
'real_query' => 'bool',
'release_savepoint' => 'bool',
'rollback' => 'bool',
'savepoint' => 'bool',
'select_db' => 'bool',
'set_charset' => 'bool',
'options' => 'bool',
'set_opt' => 'bool',
'stat' => 'string|false',
'stmt_init' => 'mysqli_stmt|false',
'store_result' => 'mysqli_result|false',
'thread_safe' => 'bool',
'use_result' => 'mysqli_result|false',
'refresh' => 'bool',
],
'mysqli_result' => [
'close' => 'void',
'free' => 'void',
'data_seek' => 'bool',
'fetch_field' => 'object|false',
'fetch_fields' => 'array',
'fetch_field_direct' => 'object|false',
'fetch_all' => 'array',
'fetch_array' => 'array|null|false',
'fetch_assoc' => 'array|null|false',
'fetch_object' => 'object|null|false',
'fetch_row' => 'array|null|false',
'field_seek' => 'bool',
'free_result' => 'void',
],
'mysqli_stmt' => [
'attr_get' => 'int',
'attr_set' => 'bool',
'bind_param' => 'bool',
'bind_result' => 'bool',
'data_seek' => 'void',
'execute' => 'bool',
'fetch' => '?bool',
'get_warnings' => 'mysqli_warning|false',
'result_metadata' => 'mysqli_result|false',
'more_results' => 'bool',
'next_result' => 'bool',
'num_rows' => 'int|string',
'send_long_data' => 'bool',
'free_result' => 'void',
'reset' => 'bool',
'prepare' => 'bool',
'store_result' => 'bool',
'get_result' => 'mysqli_result|false',
],
'OCILob' => [
'save' => 'bool',
'import' => 'bool',
'saveFile' => 'bool',
'load' => 'string|false',
'read' => 'string|false',
'eof' => 'bool',
'tell' => 'int|false',
'rewind' => 'bool',
'seek' => 'bool',
'size' => 'int|false',
'write' => 'int|false',
'append' => 'bool',
'truncate' => 'bool',
'erase' => 'int|false',
'flush' => 'bool',
'setBuffering' => 'bool',
'getBuffering' => 'bool',
'writeToFile' => 'bool',
'export' => 'bool',
'writeTemporary' => 'bool',
'close' => 'bool',
'free' => 'bool',
],
'OCICollection' => [
'free' => 'bool',
'append' => 'bool',
'getElem' => 'string|float|null|false',
'assign' => 'bool',
'assignElem' => 'bool',
'size' => 'int|false',
'max' => 'int|false',
'trim' => 'bool',
],
'PDO' => [
'beginTransaction' => 'bool',
'commit' => 'bool',
'errorCode' => '?string',
'errorInfo' => 'array',
'exec' => 'int|false',
'getAttribute' => 'mixed',
'getAvailableDrivers' => 'array',
'inTransaction' => 'bool',
'lastInsertId' => 'string|false',
'prepare' => 'PDOStatement|false',
'query' => 'PDOStatement|false',
'quote' => 'string|false',
'rollBack' => 'bool',
'setAttribute' => 'bool',
],
'PDOStatement' => [
'bindColumn' => 'bool',
'bindParam' => 'bool',
'bindValue' => 'bool',
'closeCursor' => 'bool',
'columnCount' => 'int',
'debugDumpParams' => '?bool',
'errorCode' => '?string',
'errorInfo' => 'array',
'execute' => 'bool',
'fetch' => 'mixed',
'fetchAll' => 'array',
'fetchColumn' => 'mixed',
'fetchObject' => 'object|false',
'getAttribute' => 'mixed',
'getColumnMeta' => 'array|false',
'nextRowset' => 'bool',
'rowCount' => 'int',
'setAttribute' => 'bool',
],
'PDO_PGSql_Ext' => [
'pgsqlCopyFromArray' => 'bool',
'pgsqlCopyFromFile' => 'bool',
'pgsqlCopyToArray' => 'array|false',
'pgsqlCopyToFile' => 'bool',
'pgsqlLOBCreate' => 'string|false',
'pgsqlLOBUnlink' => 'bool',
'pgsqlGetNotify' => 'array|false',
'pgsqlGetPid' => 'int',
],
'PDO_SQLite_Ext' => [
'sqliteCreateFunction' => 'bool',
'sqliteCreateAggregate' => 'bool',
'sqliteCreateCollation' => 'bool',
],
'Phar' => [
'addEmptyDir' => 'void',
'addFile' => 'void',
'addFromString' => 'void',
'buildFromDirectory' => 'array',
'buildFromIterator' => 'array',
'compressFiles' => 'void',
'compress' => '?Phar',
'decompress' => '?Phar',
'convertToExecutable' => '?Phar',
'convertToData' => '?PharData',
'count' => 'int',
'extractTo' => 'bool',
'getAlias' => '?string',
'getPath' => 'string',
'getMetadata' => 'mixed',
'getModified' => 'bool',
'getSignature' => 'array|false',
'getStub' => 'string',
'getVersion' => 'string',
'hasMetadata' => 'bool',
'isBuffering' => 'bool',
'isCompressed' => 'int|false',
'isFileFormat' => 'bool',
'isWritable' => 'bool',
'offsetExists' => 'bool',
'offsetGet' => 'SplFileInfo',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'setAlias' => 'bool',
'setDefaultStub' => 'bool',
'setMetadata' => 'void',
'setSignatureAlgorithm' => 'void',
'startBuffering' => 'void',
'stopBuffering' => 'void',
],
'PharData' => [
'addEmptyDir' => 'void',
'addFile' => 'void',
'addFromString' => 'void',
'buildFromDirectory' => 'array',
'buildFromIterator' => 'array',
'compressFiles' => 'void',
'compress' => '?PharData',
'decompress' => '?PharData',
'convertToExecutable' => '?Phar',
'convertToData' => '?PharData',
'count' => 'int',
'extractTo' => 'bool',
'getAlias' => '?string',
'getPath' => 'string',
'getMetadata' => 'mixed',
'getModified' => 'bool',
'getSignature' => 'array|false',
'getStub' => 'string',
'getVersion' => 'string',
'hasMetadata' => 'bool',
'isBuffering' => 'bool',
'isCompressed' => 'int|false',
'isFileFormat' => 'bool',
'isWritable' => 'bool',
'offsetExists' => 'bool',
'offsetGet' => 'SplFileInfo',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'setAlias' => 'bool',
'setDefaultStub' => 'bool',
'setMetadata' => 'void',
'setSignatureAlgorithm' => 'void',
'startBuffering' => 'void',
'stopBuffering' => 'void',
],
'PharFileInfo' => [
'chmod' => 'void',
'getCompressedSize' => 'int',
'getCRC32' => 'int',
'getContent' => 'string',
'getMetadata' => 'mixed',
'getPharFlags' => 'int',
'hasMetadata' => 'bool',
'isCompressed' => 'bool',
'isCRCChecked' => 'bool',
'setMetadata' => 'void',
],
'Reflection' => [
'getModifierNames' => 'array',
],
'ReflectionFunctionAbstract' => [
'inNamespace' => 'bool',
'isClosure' => 'bool',
'isDeprecated' => 'bool',
'isInternal' => 'bool',
'isUserDefined' => 'bool',
'isGenerator' => 'bool',
'isVariadic' => 'bool',
'isStatic' => 'bool',
'getClosureThis' => '?object',
'getClosureCalledClass' => '?ReflectionClass',
'getClosureScopeClass' => '?ReflectionClass',
'getDocComment' => 'string|false',
'getEndLine' => 'int|false',
'getExtension' => '?ReflectionExtension',
'getExtensionName' => 'string|false',
'getFileName' => 'string|false',
'getName' => 'string',
'getNamespaceName' => 'string',
'getNumberOfParameters' => 'int',
'getNumberOfRequiredParameters' => 'int',
'getParameters' => 'array',
'getShortName' => 'string',
'getStartLine' => 'int|false',
'getStaticVariables' => 'array',
'returnsReference' => 'bool',
'hasReturnType' => 'bool',
'getReturnType' => '?ReflectionType',
],
'ReflectionFunction' => [
'isDisabled' => 'bool',
'invoke' => 'mixed',
'invokeArgs' => 'mixed',
'getClosure' => 'Closure',
'getExecutingLine' => 'int',
'getExecutingFile' => 'string',
'getTrace' => 'array',
'getFunction' => 'ReflectionFunctionAbstract',
'getThis' => '?object',
'getExecutingGenerator' => 'Generator',
],
'ReflectionMethod' => [
'isPublic' => 'bool',
'isPrivate' => 'bool',
'isProtected' => 'bool',
'isAbstract' => 'bool',
'isFinal' => 'bool',
'isConstructor' => 'bool',
'isDestructor' => 'bool',
'getClosure' => 'Closure',
'getModifiers' => 'int',
'invoke' => 'mixed',
'invokeArgs' => 'mixed',
'getDeclaringClass' => 'ReflectionClass',
'getPrototype' => 'ReflectionMethod',
'setAccessible' => 'void',
],
'ReflectionClass' => [
'getName' => 'string',
'isInternal' => 'bool',
'isUserDefined' => 'bool',
'isAnonymous' => 'bool',
'isInstantiable' => 'bool',
'isCloneable' => 'bool',
'getFileName' => 'string|false',
'getStartLine' => 'int|false',
'getEndLine' => 'int|false',
'getDocComment' => 'string|false',
'getConstructor' => '?ReflectionMethod',
'hasMethod' => 'bool',
'getMethod' => 'ReflectionMethod',
'getMethods' => 'array',
'hasProperty' => 'bool',
'getProperty' => 'ReflectionProperty',
'getProperties' => 'array',
'hasConstant' => 'bool',
'getConstants' => 'array',
'getReflectionConstants' => 'array',
'getConstant' => 'mixed',
'getReflectionConstant' => 'ReflectionClassConstant|false',
'getInterfaces' => 'array',
'getInterfaceNames' => 'array',
'isInterface' => 'bool',
'getTraits' => 'array',
'getTraitNames' => 'array',
'getTraitAliases' => 'array',
'isTrait' => 'bool',
'isAbstract' => 'bool',
'isFinal' => 'bool',
'getModifiers' => 'int',
'isInstance' => 'bool',
'newInstance' => 'object',
'newInstanceWithoutConstructor' => 'object',
'newInstanceArgs' => '?object',
'getParentClass' => 'ReflectionClass|false',
'isSubclassOf' => 'bool',
'getStaticProperties' => '?array',
'getStaticPropertyValue' => 'mixed',
'setStaticPropertyValue' => 'void',
'getDefaultProperties' => 'array',
'isIterable' => 'bool',
'isIterateable' => 'bool',
'implementsInterface' => 'bool',
'getExtension' => '?ReflectionExtension',
'getExtensionName' => 'string|false',
'inNamespace' => 'bool',
'getNamespaceName' => 'string',
'getShortName' => 'string',
],
'ReflectionProperty' => [
'getName' => 'string',
'getValue' => 'mixed',
'setValue' => 'void',
'isInitialized' => 'bool',
'isPublic' => 'bool',
'isPrivate' => 'bool',
'isProtected' => 'bool',
'isStatic' => 'bool',
'isDefault' => 'bool',
'getModifiers' => 'int',
'getDeclaringClass' => 'ReflectionClass',
'getDocComment' => 'string|false',
'setAccessible' => 'void',
'getType' => '?ReflectionType',
'hasType' => 'bool',
'getDefaultValue' => 'mixed',
],
'ReflectionClassConstant' => [
'getName' => 'string',
'getValue' => 'mixed',
'isPublic' => 'bool',
'isPrivate' => 'bool',
'isProtected' => 'bool',
'getModifiers' => 'int',
'getDeclaringClass' => 'ReflectionClass',
'getDocComment' => 'string|false',
],
'ReflectionParameter' => [
'getName' => 'string',
'isPassedByReference' => 'bool',
'canBePassedByValue' => 'bool',
'getDeclaringFunction' => 'ReflectionFunctionAbstract',
'getDeclaringClass' => '?ReflectionClass',
'getClass' => '?ReflectionClass',
'hasType' => 'bool',
'getType' => '?ReflectionType',
'isArray' => 'bool',
'isCallable' => 'bool',
'allowsNull' => 'bool',
'getPosition' => 'int',
'isOptional' => 'bool',
'isDefaultValueAvailable' => 'bool',
'getDefaultValue' => 'mixed',
'isDefaultValueConstant' => 'bool',
'getDefaultValueConstantName' => '?string',
'isVariadic' => 'bool',
],
'ReflectionType' => [
'allowsNull' => 'bool',
],
'ReflectionNamedType' => [
'getName' => 'string',
'isBuiltin' => 'bool',
],
'ReflectionExtension' => [
'getName' => 'string',
'getVersion' => '?string',
'getFunctions' => 'array',
'getConstants' => 'array',
'getINIEntries' => 'array',
'getClasses' => 'array',
'getClassNames' => 'array',
'getDependencies' => 'array',
'info' => 'void',
'isPersistent' => 'bool',
'isTemporary' => 'bool',
],
'ReflectionZendExtension' => [
'getName' => 'string',
'getVersion' => 'string',
'getAuthor' => 'string',
'getURL' => 'string',
'getCopyright' => 'string',
],
'SessionHandlerInterface' => [
'open' => 'bool',
'close' => 'bool',
'read' => 'string|false',
'write' => 'bool',
'destroy' => 'bool',
'gc' => 'int|false',
],
'SessionIdInterface' => [
'create_sid' => 'string',
],
'SessionUpdateTimestampHandlerInterface' => [
'validateId' => 'bool',
'updateTimestamp' => 'bool',
],
'SessionHandler' => [
'open' => 'bool',
'close' => 'bool',
'read' => 'string|false',
'write' => 'bool',
'destroy' => 'bool',
'gc' => 'int|false',
'create_sid' => 'string',
],
'SimpleXMLElement' => [
'xpath' => 'array|null|false',
'registerXPathNamespace' => 'bool',
'asXML' => 'string|bool',
'saveXML' => 'string|bool',
'getNamespaces' => 'array',
'getDocNamespaces' => 'array|false',
'children' => '?SimpleXMLElement',
'attributes' => '?SimpleXMLElement',
'addChild' => '?SimpleXMLElement',
'addAttribute' => 'void',
'getName' => 'string',
'count' => 'int',
'rewind' => 'void',
'valid' => 'bool',
'current' => 'SimpleXMLElement',
'key' => 'string',
'next' => 'void',
'hasChildren' => 'bool',
'getChildren' => '?SimpleXMLElement',
],
'SNMP' => [
'close' => 'bool',
'setSecurity' => 'bool',
'get' => 'mixed',
'getnext' => 'mixed',
'walk' => 'array|false',
'set' => 'bool',
'getErrno' => 'int',
'getError' => 'string',
],
'SoapServer' => [
'fault' => 'void',
'addSoapHeader' => 'void',
'setPersistence' => 'void',
'setClass' => 'void',
'setObject' => 'void',
'getFunctions' => 'array',
'addFunction' => 'void',
'handle' => 'void',
],
'SoapClient' => [
'__call' => 'mixed',
'__soapCall' => 'mixed',
'__getFunctions' => '?array',
'__getTypes' => '?array',
'__getLastRequest' => '?string',
'__getLastResponse' => '?string',
'__getLastRequestHeaders' => '?string',
'__getLastResponseHeaders' => '?string',
'__doRequest' => '?string',
'__setCookie' => 'void',
'__getCookies' => 'array',
'__setSoapHeaders' => 'bool',
'__setLocation' => '?string',
],
'ArrayObject' => [
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'append' => 'void',
'getArrayCopy' => 'array',
'count' => 'int',
'getFlags' => 'int',
'setFlags' => 'void',
'asort' => 'bool',
'ksort' => 'bool',
'uasort' => 'bool',
'uksort' => 'bool',
'natsort' => 'bool',
'natcasesort' => 'bool',
'unserialize' => 'void',
'serialize' => 'string',
'__serialize' => 'array',
'__unserialize' => 'void',
'getIterator' => 'Iterator',
'exchangeArray' => 'array',
'setIteratorClass' => 'void',
'getIteratorClass' => 'string',
'__debugInfo' => 'array',
],
'ArrayIterator' => [
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'append' => 'void',
'getArrayCopy' => 'array',
'count' => 'int',
'getFlags' => 'int',
'setFlags' => 'void',
'asort' => 'bool',
'ksort' => 'bool',
'uasort' => 'bool',
'uksort' => 'bool',
'natsort' => 'bool',
'natcasesort' => 'bool',
'unserialize' => 'void',
'serialize' => 'string',
'__serialize' => 'array',
'__unserialize' => 'void',
'rewind' => 'void',
'current' => 'mixed',
'key' => 'string|int|null',
'next' => 'void',
'valid' => 'bool',
'seek' => 'void',
'__debugInfo' => 'array',
],
'RecursiveArrayIterator' => [
'hasChildren' => 'bool',
'getChildren' => '?RecursiveArrayIterator',
],
'SplFileInfo' => [
'getPath' => 'string',
'getFilename' => 'string',
'getExtension' => 'string',
'getBasename' => 'string',
'getPathname' => 'string',
'getPerms' => 'int|false',
'getInode' => 'int|false',
'getSize' => 'int|false',
'getOwner' => 'int|false',
'getGroup' => 'int|false',
'getATime' => 'int|false',
'getMTime' => 'int|false',
'getCTime' => 'int|false',
'getType' => 'string|false',
'isWritable' => 'bool',
'isReadable' => 'bool',
'isExecutable' => 'bool',
'isFile' => 'bool',
'isDir' => 'bool',
'isLink' => 'bool',
'getLinkTarget' => 'string|false',
'getRealPath' => 'string|false',
'getFileInfo' => 'SplFileInfo',
'getPathInfo' => '?SplFileInfo',
'openFile' => 'SplFileObject',
'setFileClass' => 'void',
'setInfoClass' => 'void',
'__debugInfo' => 'array',
'_bad_state_ex' => 'void',
],
'DirectoryIterator' => [
'getFilename' => 'string',
'getExtension' => 'string',
'getBasename' => 'string',
'isDot' => 'bool',
'rewind' => 'void',
'valid' => 'bool',
'key' => 'mixed',
'current' => 'mixed',
'next' => 'void',
'seek' => 'void',
],
'FilesystemIterator' => [
'rewind' => 'void',
'key' => 'string',
'current' => 'string|SplFileInfo|FilesystemIterator',
'getFlags' => 'int',
'setFlags' => 'void',
],
'RecursiveDirectoryIterator' => [
'hasChildren' => 'bool',
'getChildren' => 'RecursiveDirectoryIterator',
'getSubPath' => 'string',
'getSubPathname' => 'string',
],
'GlobIterator' => [
'count' => 'int',
],
'SplFileObject' => [
'rewind' => 'void',
'eof' => 'bool',
'valid' => 'bool',
'fgets' => 'string',
'fread' => 'string|false',
'fgetcsv' => 'array|false',
'fputcsv' => 'int|false',
'setCsvControl' => 'void',
'getCsvControl' => 'array',
'flock' => 'bool',
'fflush' => 'bool',
'ftell' => 'int|false',
'fseek' => 'int',
'fgetc' => 'string|false',
'fpassthru' => 'int',
'fscanf' => 'array|int|null',
'fwrite' => 'int|false',
'fstat' => 'array',
'ftruncate' => 'bool',
'current' => 'string|array|false',
'key' => 'int',
'next' => 'void',
'setFlags' => 'void',
'getFlags' => 'int',
'setMaxLineLen' => 'void',
'getMaxLineLen' => 'int',
'hasChildren' => 'false',
'getChildren' => 'null',
'seek' => 'void',
'getCurrentLine' => 'string',
],
'SplDoublyLinkedList' => [
'add' => 'void',
'pop' => 'mixed',
'shift' => 'mixed',
'push' => 'void',
'unshift' => 'void',
'top' => 'mixed',
'bottom' => 'mixed',
'__debugInfo' => 'array',
'count' => 'int',
'isEmpty' => 'bool',
'setIteratorMode' => 'int',
'getIteratorMode' => 'int',
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'rewind' => 'void',
'current' => 'mixed',
'key' => 'int',
'prev' => 'void',
'next' => 'void',
'valid' => 'bool',
'unserialize' => 'void',
'serialize' => 'string',
'__serialize' => 'array',
'__unserialize' => 'void',
],
'SplQueue' => [
'enqueue' => 'void',
'dequeue' => 'mixed',
],
'SplFixedArray' => [
'__wakeup' => 'void',
'count' => 'int',
'toArray' => 'array',
'fromArray' => 'SplFixedArray',
'getSize' => 'int',
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
],
'SplPriorityQueue' => [
'compare' => 'int',
'setExtractFlags' => 'int',
'top' => 'mixed',
'extract' => 'mixed',
'count' => 'int',
'isEmpty' => 'bool',
'rewind' => 'void',
'current' => 'mixed',
'key' => 'int',
'next' => 'void',
'valid' => 'bool',
'isCorrupted' => 'bool',
'getExtractFlags' => 'int',
'__debugInfo' => 'array',
],
'SplHeap' => [
'extract' => 'mixed',
'insert' => 'bool',
'top' => 'mixed',
'count' => 'int',
'isEmpty' => 'bool',
'rewind' => 'void',
'current' => 'mixed',
'key' => 'int',
'next' => 'void',
'valid' => 'bool',
'recoverFromCorruption' => 'bool',
'compare' => 'int',
'isCorrupted' => 'bool',
'__debugInfo' => 'array',
],
'SplMinHeap' => [
'compare' => 'int',
],
'SplMaxHeap' => [
'compare' => 'int',
],
'EmptyIterator' => [
'current' => 'never',
'next' => 'void',
'key' => 'never',
'valid' => 'false',
'rewind' => 'void',
],
'CallbackFilterIterator' => [
'accept' => 'bool',
],
'RecursiveCallbackFilterIterator' => [
'hasChildren' => 'bool',
'getChildren' => 'RecursiveCallbackFilterIterator',
],
'RecursiveIterator' => [
'hasChildren' => 'bool',
'getChildren' => '?RecursiveIterator',
],
'RecursiveIteratorIterator' => [
'rewind' => 'void',
'valid' => 'bool',
'key' => 'mixed',
'current' => 'mixed',
'next' => 'void',
'getDepth' => 'int',
'getSubIterator' => '?RecursiveIterator',
'getInnerIterator' => 'RecursiveIterator',
'beginIteration' => 'void',
'endIteration' => 'void',
'callHasChildren' => 'bool',
'callGetChildren' => '?RecursiveIterator',
'beginChildren' => 'void',
'endChildren' => 'void',
'nextElement' => 'void',
'setMaxDepth' => 'void',
'getMaxDepth' => 'int|false',
],
'OuterIterator' => [
'getInnerIterator' => '?Iterator',
],
'IteratorIterator' => [
'getInnerIterator' => '?Iterator',
'rewind' => 'void',
'valid' => 'bool',
'key' => 'mixed',
'current' => 'mixed',
'next' => 'void',
],
'FilterIterator' => [
'accept' => 'bool',
'rewind' => 'void',
'next' => 'void',
],
'RecursiveFilterIterator' => [
'hasChildren' => 'bool',
'getChildren' => '?RecursiveFilterIterator',
],
'ParentIterator' => [
'accept' => 'bool',
],
'SeekableIterator' => [
'seek' => 'void',
],
'LimitIterator' => [
'rewind' => 'void',
'valid' => 'bool',
'next' => 'void',
'seek' => 'int',
'getPosition' => 'int',
],
'CachingIterator' => [
'rewind' => 'void',
'valid' => 'bool',
'next' => 'void',
'hasNext' => 'bool',
'getFlags' => 'int',
'setFlags' => 'void',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'offsetExists' => 'bool',
'getCache' => 'array',
'count' => 'int',
],
'RecursiveCachingIterator' => [
'hasChildren' => 'bool',
'getChildren' => '?RecursiveCachingIterator',
],
'NoRewindIterator' => [
'rewind' => 'void',
'valid' => 'bool',
'key' => 'mixed',
'current' => 'mixed',
'next' => 'void',
],
'AppendIterator' => [
'append' => 'void',
'rewind' => 'void',
'valid' => 'bool',
'current' => 'mixed',
'next' => 'void',
'getIteratorIndex' => '?int',
'getArrayIterator' => 'ArrayIterator',
],
'InfiniteIterator' => [
'next' => 'void',
],
'RegexIterator' => [
'accept' => 'bool',
'getMode' => 'int',
'setMode' => 'void',
'getFlags' => 'int',
'setFlags' => 'void',
'getRegex' => 'string',
'getPregFlags' => 'int',
'setPregFlags' => 'void',
],
'RecursiveRegexIterator' => [
'accept' => 'bool',
'hasChildren' => 'bool',
'getChildren' => 'RecursiveRegexIterator',
],
'RecursiveTreeIterator' => [
'key' => 'mixed',
'current' => 'mixed',
'getPrefix' => 'string',
'setPostfix' => 'void',
'setPrefixPart' => 'void',
'getEntry' => 'string',
'getPostfix' => 'string',
],
'SplObserver' => [
'update' => 'void',
],
'SplSubject' => [
'attach' => 'void',
'detach' => 'void',
'notify' => 'void',
],
'SplObjectStorage' => [
'attach' => 'void',
'detach' => 'void',
'contains' => 'bool',
'addAll' => 'int',
'removeAll' => 'int',
'removeAllExcept' => 'int',
'getInfo' => 'mixed',
'setInfo' => 'void',
'count' => 'int',
'rewind' => 'void',
'valid' => 'bool',
'key' => 'int',
'current' => 'object',
'next' => 'void',
'unserialize' => 'void',
'serialize' => 'string',
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
'getHash' => 'string',
'__serialize' => 'array',
'__unserialize' => 'void',
'__debugInfo' => 'array',
],
'MultipleIterator' => [
'getFlags' => 'int',
'setFlags' => 'void',
'attachIterator' => 'void',
'detachIterator' => 'void',
'containsIterator' => 'bool',
'countIterators' => 'int',
'rewind' => 'void',
'valid' => 'bool',
'key' => 'array',
'current' => 'array',
'next' => 'void',
'__debugInfo' => 'array',
],
'SQLite3' => [
'open' => 'void',
'version' => 'array',
'lastInsertRowID' => 'int',
'lastErrorCode' => 'int',
'lastExtendedErrorCode' => 'int',
'lastErrorMsg' => 'string',
'changes' => 'int',
'busyTimeout' => 'bool',
'loadExtension' => 'bool',
'backup' => 'bool',
'escapeString' => 'string',
'prepare' => 'SQLite3Stmt|false',
'exec' => 'bool',
'query' => 'SQLite3Result|false',
'querySingle' => 'mixed',
'createFunction' => 'bool',
'createAggregate' => 'bool',
'createCollation' => 'bool',
'enableExceptions' => 'bool',
'enableExtendedResultCodes' => 'bool',
'setAuthorizer' => 'bool',
],
'SQLite3Stmt' => [
'bindParam' => 'bool',
'bindValue' => 'bool',
'clear' => 'bool',
'close' => 'bool',
'execute' => 'SQLite3Result|false',
'getSQL' => 'string|false',
'paramCount' => 'int',
'readOnly' => 'bool',
'reset' => 'bool',
],
'SQLite3Result' => [
'numColumns' => 'int',
'columnName' => 'string|false',
'columnType' => 'int|false',
'fetchArray' => 'array|false',
'reset' => 'bool',
],
'Directory' => [
'close' => 'void',
'rewind' => 'void',
'read' => 'string|false',
],
'php_user_filter' => [
'filter' => 'int',
'onCreate' => 'bool',
'onClose' => 'void',
],
'tidy' => [
'getOpt' => 'string|int|bool',
'cleanRepair' => 'bool',
'parseFile' => 'bool',
'parseString' => 'bool',
'repairString' => 'string|false',
'repairFile' => 'string|false',
'diagnose' => 'bool',
'getRelease' => 'string',
'getConfig' => 'array',
'getStatus' => 'int',
'getHtmlVer' => 'int',
'getOptDoc' => 'string|false',
'isXhtml' => 'bool',
'isXml' => 'bool',
'root' => '?tidyNode',
'head' => '?tidyNode',
'html' => '?tidyNode',
'body' => '?tidyNode',
],
'XMLReader' => [
'getAttribute' => '?string',
'getAttributeNo' => '?string',
'getAttributeNs' => '?string',
'getParserProperty' => 'bool',
'isValid' => 'bool',
'lookupNamespace' => '?string',
'moveToAttribute' => 'bool',
'moveToAttributeNo' => 'bool',
'moveToAttributeNs' => 'bool',
'moveToElement' => 'bool',
'moveToFirstAttribute' => 'bool',
'moveToNextAttribute' => 'bool',
'read' => 'bool',
'next' => 'bool',
'readInnerXml' => 'string',
'readOuterXml' => 'string',
'readString' => 'string',
'setSchema' => 'bool',
'setParserProperty' => 'bool',
'setRelaxNGSchema' => 'bool',
'setRelaxNGSchemaSource' => 'bool',
'expand' => 'DOMNode|false',
],
'XMLWriter' => [
'openUri' => 'bool',
'openMemory' => 'bool',
'setIndent' => 'bool',
'setIndentString' => 'bool',
'startComment' => 'bool',
'endComment' => 'bool',
'startAttribute' => 'bool',
'endAttribute' => 'bool',
'writeAttribute' => 'bool',
'startAttributeNs' => 'bool',
'writeAttributeNs' => 'bool',
'startElement' => 'bool',
'endElement' => 'bool',
'fullEndElement' => 'bool',
'startElementNs' => 'bool',
'writeElement' => 'bool',
'writeElementNs' => 'bool',
'startPi' => 'bool',
'endPi' => 'bool',
'writePi' => 'bool',
'startCdata' => 'bool',
'endCdata' => 'bool',
'writeCdata' => 'bool',
'text' => 'bool',
'writeRaw' => 'bool',
'startDocument' => 'bool',
'endDocument' => 'bool',
'writeComment' => 'bool',
'startDtd' => 'bool',
'endDtd' => 'bool',
'writeDtd' => 'bool',
'startDtdElement' => 'bool',
'endDtdElement' => 'bool',
'writeDtdElement' => 'bool',
'startDtdAttlist' => 'bool',
'endDtdAttlist' => 'bool',
'writeDtdAttlist' => 'bool',
'startDtdEntity' => 'bool',
'endDtdEntity' => 'bool',
'writeDtdEntity' => 'bool',
'outputMemory' => 'string',
'flush' => 'string|int',
],
'XSLTProcessor' => [
'importStylesheet' => 'bool',
'transformToDoc' => 'DOMDocument|false',
'transformToUri' => 'int',
'transformToXml' => 'string|null|false',
'setParameter' => 'bool',
'getParameter' => 'string|false',
'removeParameter' => 'bool',
'hasExsltSupport' => 'bool',
'registerPHPFunctions' => 'void',
'setSecurityPrefs' => 'int',
'getSecurityPrefs' => 'int',
],
'ZipArchive' => [
'open' => 'bool|int',
'setPassword' => 'bool',
'close' => 'bool',
'count' => 'int',
'getStatusString' => 'string',
'addEmptyDir' => 'bool',
'addFromString' => 'bool',
'addFile' => 'bool',
'replaceFile' => 'bool',
'addGlob' => 'array|false',
'addPattern' => 'array|false',
'renameIndex' => 'bool',
'renameName' => 'bool',
'setArchiveComment' => 'bool',
'getArchiveComment' => 'string|false',
'setCommentIndex' => 'bool',
'setCommentName' => 'bool',
'setMtimeIndex' => 'bool',
'setMtimeName' => 'bool',
'getCommentIndex' => 'string|false',
'getCommentName' => 'string|false',
'deleteIndex' => 'bool',
'deleteName' => 'bool',
'statName' => 'array|false',
'statIndex' => 'array|false',
'locateName' => 'int|false',
'getNameIndex' => 'string|false',
'unchangeArchive' => 'bool',
'unchangeAll' => 'bool',
'unchangeIndex' => 'bool',
'unchangeName' => 'bool',
'extractTo' => 'bool',
'getFromName' => 'string|false',
'getFromIndex' => 'string|false',
'setExternalAttributesName' => 'bool',
'setExternalAttributesIndex' => 'bool',
'getExternalAttributesName' => 'bool',
'getExternalAttributesIndex' => 'bool',
'setCompressionName' => 'bool',
'setCompressionIndex' => 'bool',
'setEncryptionName' => 'bool',
'setEncryptionIndex' => 'bool',
'registerProgressCallback' => 'bool',
'registerCancelCallback' => 'bool',
],
'Exception' => [
'__wakeup' => 'void',
],
'Error' => [
'__wakeup' => 'void',
],
'IteratorAggregate' => [
'getIterator' => 'Traversable',
],
'Iterator' => [
'current' => 'mixed',
'next' => 'void',
'key' => 'mixed',
'valid' => 'bool',
'rewind' => 'void',
],
'ArrayAccess' => [
'offsetExists' => 'bool',
'offsetGet' => 'mixed',
'offsetSet' => 'void',
'offsetUnset' => 'void',
],
'Countable' => [
'count' => 'int',
],
];
}
<?php










namespace Symfony\Component\ErrorHandler;

use Composer\InstalledVersions;
use Doctrine\Common\Persistence\Proxy as LegacyProxy;
use Doctrine\Persistence\Proxy;
use Mockery\MockInterface;
use Phake\IMock;
use PHPUnit\Framework\MockObject\Matcher\StatelessInvocation;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\MockObject\Stub;
use Prophecy\Prophecy\ProphecySubjectInterface;
use ProxyManager\Proxy\ProxyInterface;
use Symfony\Component\DependencyInjection\Argument\LazyClosure;
use Symfony\Component\ErrorHandler\Internal\TentativeTypes;
use Symfony\Component\VarExporter\LazyObjectInterface;




























class DebugClassLoader
{
private const SPECIAL_RETURN_TYPES = [
'void' => 'void',
'null' => 'null',
'resource' => 'resource',
'boolean' => 'bool',
'true' => 'true',
'false' => 'false',
'integer' => 'int',
'array' => 'array',
'bool' => 'bool',
'callable' => 'callable',
'float' => 'float',
'int' => 'int',
'iterable' => 'iterable',
'object' => 'object',
'string' => 'string',
'non-empty-string' => 'string',
'self' => 'self',
'parent' => 'parent',
'mixed' => 'mixed',
'static' => 'static',
'$this' => 'static',
'list' => 'array',
'non-empty-list' => 'array',
'class-string' => 'string',
'never' => 'never',
];

private const BUILTIN_RETURN_TYPES = [
'void' => true,
'array' => true,
'false' => true,
'bool' => true,
'callable' => true,
'float' => true,
'int' => true,
'iterable' => true,
'object' => true,
'string' => true,
'self' => true,
'parent' => true,
'mixed' => true,
'static' => true,
'null' => true,
'true' => true,
'never' => true,
];

private const MAGIC_METHODS = [
'__isset' => 'bool',
'__sleep' => 'array',
'__toString' => 'string',
'__debugInfo' => 'array',
'__serialize' => 'array',
'__set' => 'void',
'__unset' => 'void',
'__unserialize' => 'void',
'__wakeup' => 'void',
];




private $classLoader;
private bool $isFinder;
private array $loaded = [];
private array $patchTypes = [];

private static int $caseCheck;
private static array $checkedClasses = [];
private static array $final = [];
private static array $finalMethods = [];
private static array $finalProperties = [];
private static array $finalConstants = [];
private static array $deprecated = [];
private static array $internal = [];
private static array $internalMethods = [];
private static array $annotatedParameters = [];
private static array $darwinCache = ['/' => ['/', []]];
private static array $method = [];
private static array $returnTypes = [];
private static array $methodTraits = [];
private static array $fileOffsets = [];

public function __construct(callable $classLoader)
{
$this->classLoader = $classLoader;
$this->isFinder = \is_array($classLoader) && method_exists($classLoader[0], 'findFile');
parse_str($_ENV['SYMFONY_PATCH_TYPE_DECLARATIONS'] ?? $_SERVER['SYMFONY_PATCH_TYPE_DECLARATIONS'] ?? getenv('SYMFONY_PATCH_TYPE_DECLARATIONS') ?: '', $this->patchTypes);
$this->patchTypes += [
'force' => null,
'php' => \PHP_MAJOR_VERSION.'.'.\PHP_MINOR_VERSION,
'deprecations' => true,
];

if ('phpdoc' === $this->patchTypes['force']) {
$this->patchTypes['force'] = 'docblock';
}

if (!isset(self::$caseCheck)) {
$file = is_file(__FILE__) ? __FILE__ : rtrim(realpath('.'), \DIRECTORY_SEPARATOR);
$i = strrpos($file, \DIRECTORY_SEPARATOR);
$dir = substr($file, 0, 1 + $i);
$file = substr($file, 1 + $i);
$test = strtoupper($file) === $file ? strtolower($file) : strtoupper($file);
$test = realpath($dir.$test);

if (false === $test || false === $i) {

self::$caseCheck = 0;
} elseif (str_ends_with($test, $file)) {

self::$caseCheck = 1;
} elseif ('Darwin' === \PHP_OS_FAMILY) {

self::$caseCheck = 2;
} else {

self::$caseCheck = 0;
}
}
}

public function getClassLoader(): callable
{
return $this->classLoader;
}




public static function enable(): void
{

class_exists(ErrorHandler::class);
class_exists(\Psr\Log\LogLevel::class);

if (!\is_array($functions = spl_autoload_functions())) {
return;
}

foreach ($functions as $function) {
spl_autoload_unregister($function);
}

foreach ($functions as $function) {
if (!\is_array($function) || !$function[0] instanceof self) {
$function = [new static($function), 'loadClass'];
}

spl_autoload_register($function);
}
}




public static function disable(): void
{
if (!\is_array($functions = spl_autoload_functions())) {
return;
}

foreach ($functions as $function) {
spl_autoload_unregister($function);
}

foreach ($functions as $function) {
if (\is_array($function) && $function[0] instanceof self) {
$function = $function[0]->getClassLoader();
}

spl_autoload_register($function);
}
}

public static function checkClasses(): bool
{
if (!\is_array($functions = spl_autoload_functions())) {
return false;
}

$loader = null;

foreach ($functions as $function) {
if (\is_array($function) && $function[0] instanceof self) {
$loader = $function[0];
break;
}
}

if (null === $loader) {
return false;
}

static $offsets = [
'get_declared_interfaces' => 0,
'get_declared_traits' => 0,
'get_declared_classes' => 0,
];

foreach ($offsets as $getSymbols => $i) {
$symbols = $getSymbols();

for (; $i < \count($symbols); ++$i) {
if (!is_subclass_of($symbols[$i], MockObject::class)
&& !is_subclass_of($symbols[$i], Stub::class)
&& !is_subclass_of($symbols[$i], ProphecySubjectInterface::class)
&& !is_subclass_of($symbols[$i], Proxy::class)
&& !is_subclass_of($symbols[$i], ProxyInterface::class)
&& !is_subclass_of($symbols[$i], LazyObjectInterface::class)
&& !is_subclass_of($symbols[$i], LegacyProxy::class)
&& !is_subclass_of($symbols[$i], MockInterface::class)
&& !is_subclass_of($symbols[$i], IMock::class)
&& !(is_subclass_of($symbols[$i], LazyClosure::class) && str_contains($symbols[$i], "@anonymous\0"))
) {
$loader->checkClass($symbols[$i]);
}
}

$offsets[$getSymbols] = $i;
}

return true;
}

public function findFile(string $class): ?string
{
return $this->isFinder ? ($this->classLoader[0]->findFile($class) ?: null) : null;
}






public function loadClass(string $class): void
{
$e = error_reporting(error_reporting() | \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR);

try {
if ($this->isFinder && !isset($this->loaded[$class])) {
$this->loaded[$class] = true;
if (!$file = $this->classLoader[0]->findFile($class) ?: '') {

} elseif (\function_exists('opcache_is_script_cached') && @opcache_is_script_cached($file)) {
include $file;

return;
} elseif (false === include $file) {
return;
}
} else {
($this->classLoader)($class);
$file = '';
}
} finally {
error_reporting($e);
}

$this->checkClass($class, $file);
}

private function checkClass(string $class, ?string $file = null): void
{
$exists = null === $file || class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false);

if (null !== $file && $class && '\\' === $class[0]) {
$class = substr($class, 1);
}

if ($exists) {
if (isset(self::$checkedClasses[$class])) {
return;
}
self::$checkedClasses[$class] = true;

$refl = new \ReflectionClass($class);
if (null === $file && $refl->isInternal()) {
return;
}
$name = $refl->getName();

if ($name !== $class && 0 === strcasecmp($name, $class)) {
throw new \RuntimeException(\sprintf('Case mismatch between loaded and declared class names: "%s" vs "%s".', $class, $name));
}

$deprecations = $this->checkAnnotations($refl, $name);

foreach ($deprecations as $message) {
@trigger_error($message, \E_USER_DEPRECATED);
}
}

if (!$file) {
return;
}

if (!$exists) {
if (str_contains($class, '/')) {
throw new \RuntimeException(\sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
}

throw new \RuntimeException(\sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
}

if (self::$caseCheck && $message = $this->checkCase($refl, $file, $class)) {
throw new \RuntimeException(\sprintf('Case mismatch between class and real file names: "%s" vs "%s" in "%s".', $message[0], $message[1], $message[2]));
}
}

public function checkAnnotations(\ReflectionClass $refl, string $class): array
{
if (
'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV7' === $class
|| 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerForV6' === $class
) {
return [];
}
$deprecations = [];

$className = str_contains($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class;


if ($class !== $className) {
$vendor = preg_match('/^namespace ([^;\\\\\s]++)[;\\\\]/m', @file_get_contents($refl->getFileName()), $vendor) ? $vendor[1].'\\' : '';
$vendorLen = \strlen($vendor);
} elseif (2 > $vendorLen = 1 + (strpos($class, '\\') ?: strpos($class, '_'))) {
$vendorLen = 0;
$vendor = '';
} else {
$vendor = str_replace('_', '\\', substr($class, 0, $vendorLen));
}

$parent = get_parent_class($class) ?: null;
self::$returnTypes[$class] = [];
$classIsTemplate = false;


if ($doc = $this->parsePhpDoc($refl)) {
$classIsTemplate = isset($doc['template']) || isset($doc['template-covariant']);

foreach (['final', 'deprecated', 'internal'] as $annotation) {
if (null !== $description = $doc[$annotation][0] ?? null) {
self::${$annotation}[$class] = '' !== $description ? ' '.$description.(preg_match('/[.!]$/', $description) ? '' : '.') : '.';
}
}

if ($refl->isInterface() && isset($doc['method'])) {
foreach ($doc['method'] as $name => [$static, $returnType, $signature, $description]) {
self::$method[$class][] = [$class, $static, $returnType, $name.$signature, $description];

if ('' !== $returnType) {
$this->setReturnType($returnType, $refl->name, $name, $refl->getFileName(), $parent);
}
}
}
}

$parentAndOwnInterfaces = $this->getOwnInterfaces($class, $parent);
if ($parent) {
$parentAndOwnInterfaces[$parent] = $parent;

if (!isset(self::$checkedClasses[$parent])) {
$this->checkClass($parent);
}

if (isset(self::$final[$parent])) {
$deprecations[] = \sprintf('The "%s" class is considered final%s It may change without further notice as of its next major version. You should not extend it from "%s".', $parent, self::$final[$parent], $className);
}
}


foreach ($parentAndOwnInterfaces + class_uses($class, false) as $use) {
if (!isset(self::$checkedClasses[$use])) {
$this->checkClass($use);
}
if (isset(self::$deprecated[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen) && !isset(self::$deprecated[$class])) {
$type = class_exists($class, false) ? 'class' : (interface_exists($class, false) ? 'interface' : 'trait');
$verb = class_exists($use, false) || interface_exists($class, false) ? 'extends' : (interface_exists($use, false) ? 'implements' : 'uses');

$deprecations[] = \sprintf('The "%s" %s %s "%s" that is deprecated%s', $className, $type, $verb, $use, self::$deprecated[$use]);
}
if (isset(self::$internal[$use]) && strncmp($vendor, str_replace('_', '\\', $use), $vendorLen)) {
$deprecations[] = \sprintf('The "%s" %s is considered internal%s It may change without further notice. You should not use it from "%s".', $use, class_exists($use, false) ? 'class' : (interface_exists($use, false) ? 'interface' : 'trait'), self::$internal[$use], $className);
}
if (isset(self::$method[$use])) {
if ($refl->isAbstract()) {
if (isset(self::$method[$class])) {
self::$method[$class] = array_merge(self::$method[$class], self::$method[$use]);
} else {
self::$method[$class] = self::$method[$use];
}
} elseif (!$refl->isInterface()) {
if (!strncmp($vendor, str_replace('_', '\\', $use), $vendorLen)
&& str_starts_with($className, 'Symfony\\')
&& (!class_exists(InstalledVersions::class)
|| 'symfony/symfony' !== InstalledVersions::getRootPackage()['name'])
) {

continue;
}
$hasCall = $refl->hasMethod('__call');
$hasStaticCall = $refl->hasMethod('__callStatic');
foreach (self::$method[$use] as [$interface, $static, $returnType, $name, $description]) {
if ($static ? $hasStaticCall : $hasCall) {
continue;
}
$realName = substr($name, 0, strpos($name, '('));
if (!$refl->hasMethod($realName) || !($methodRefl = $refl->getMethod($realName))->isPublic() || ($static && !$methodRefl->isStatic()) || (!$static && $methodRefl->isStatic())) {
$deprecations[] = \sprintf('Class "%s" should implement method "%s::%s%s"%s', $className, ($static ? 'static ' : '').$interface, $name, $returnType ? ': '.$returnType : '', null === $description ? '.' : ': '.$description);
}
}
}
}
}

if (trait_exists($class)) {
$file = $refl->getFileName();

foreach ($refl->getMethods() as $method) {
if ($method->getFileName() === $file) {
self::$methodTraits[$file][$method->getStartLine()] = $class;
}
}

return $deprecations;
}


self::$finalMethods[$class] = [];
self::$internalMethods[$class] = [];
self::$annotatedParameters[$class] = [];
self::$finalProperties[$class] = [];
self::$finalConstants[$class] = [];
foreach ($parentAndOwnInterfaces as $use) {
foreach (['finalMethods', 'internalMethods', 'annotatedParameters', 'returnTypes', 'finalProperties', 'finalConstants'] as $property) {
if (isset(self::${$property}[$use])) {
self::${$property}[$class] = self::${$property}[$class] ? self::${$property}[$use] + self::${$property}[$class] : self::${$property}[$use];
}
}

if (null !== (TentativeTypes::RETURN_TYPES[$use] ?? null)) {
foreach (TentativeTypes::RETURN_TYPES[$use] as $method => $returnType) {
$returnType = explode('|', $returnType);
foreach ($returnType as $i => $t) {
if ('?' !== $t && !isset(self::BUILTIN_RETURN_TYPES[$t])) {
$returnType[$i] = '\\'.$t;
}
}
$returnType = implode('|', $returnType);

self::$returnTypes[$class] += [$method => [$returnType, str_starts_with($returnType, '?') ? substr($returnType, 1).'|null' : $returnType, $use, '']];
}
}
}

foreach ($refl->getMethods() as $method) {
if ($method->class !== $class) {
continue;
}

if (null === $ns = self::$methodTraits[$method->getFileName()][$method->getStartLine()] ?? null) {
$ns = $vendor;
$len = $vendorLen;
} elseif (2 > $len = 1 + (strpos($ns, '\\') ?: strpos($ns, '_'))) {
$len = 0;
$ns = '';
} else {
$ns = str_replace('_', '\\', substr($ns, 0, $len));
}

if ($parent && isset(self::$finalMethods[$parent][$method->name])) {
[$declaringClass, $message] = self::$finalMethods[$parent][$method->name];
$deprecations[] = \sprintf('The "%s::%s()" method is considered final%s It may change without further notice as of its next major version. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className);
}

if (isset(self::$internalMethods[$class][$method->name])) {
[$declaringClass, $message] = self::$internalMethods[$class][$method->name];
if (strncmp($ns, $declaringClass, $len)) {
$deprecations[] = \sprintf('The "%s::%s()" method is considered internal%s It may change without further notice. You should not extend it from "%s".', $declaringClass, $method->name, $message, $className);
}
}


$doc = $this->parsePhpDoc($method);

if (($classIsTemplate || isset($doc['template']) || isset($doc['template-covariant'])) && $method->hasReturnType()) {
unset($doc['return']);
}

if (isset(self::$annotatedParameters[$class][$method->name])) {
$definedParameters = [];
foreach ($method->getParameters() as $parameter) {
$definedParameters[$parameter->name] = true;
}

foreach (self::$annotatedParameters[$class][$method->name] as $parameterName => $deprecation) {
if (!isset($definedParameters[$parameterName]) && !isset($doc['param'][$parameterName])) {
$deprecations[] = \sprintf($deprecation, $className);
}
}
}

$forcePatchTypes = $this->patchTypes['force'];

if ($canAddReturnType = null !== $forcePatchTypes && !str_contains($method->getFileName(), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) {
$this->patchTypes['force'] = $forcePatchTypes ?: 'docblock';

$canAddReturnType = 2 === (int) $forcePatchTypes
|| false !== stripos($method->getFileName(), \DIRECTORY_SEPARATOR.'Tests'.\DIRECTORY_SEPARATOR)
|| $refl->isFinal()
|| $method->isFinal()
|| $method->isPrivate()
|| ('.' === (self::$internal[$class] ?? null) && !$refl->isAbstract())
|| '.' === (self::$final[$class] ?? null)
|| '' === ($doc['final'][0] ?? null)
|| '' === ($doc['internal'][0] ?? null)
;
}

if (null !== ($returnType = self::$returnTypes[$class][$method->name] ?? null) && 'docblock' === $this->patchTypes['force'] && !$method->hasReturnType() && isset(TentativeTypes::RETURN_TYPES[$returnType[2]][$method->name])) {
$this->patchReturnTypeWillChange($method);
}

if (null !== ($returnType ??= self::MAGIC_METHODS[$method->name] ?? null) && !$method->hasReturnType() && !isset($doc['return'])) {
[$normalizedType, $returnType, $declaringClass, $declaringFile] = \is_string($returnType) ? [$returnType, $returnType, '', ''] : $returnType;

if ($canAddReturnType && 'docblock' !== $this->patchTypes['force']) {
$this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
}
if (!isset($doc['deprecated']) && strncmp($ns, $declaringClass, $len)) {
if ('docblock' === $this->patchTypes['force']) {
$this->patchMethod($method, $returnType, $declaringFile, $normalizedType);
} elseif ('' !== $declaringClass && $this->patchTypes['deprecations']) {
$deprecations[] = \sprintf('Method "%s::%s()" might add "%s" as a native return type declaration in the future. Do the same in %s "%s" now to avoid errors or add an explicit @return annotation to suppress this message.', $declaringClass, $method->name, $normalizedType, interface_exists($declaringClass) ? 'implementation' : 'child class', $className);
}
}
}

if (!$doc) {
$this->patchTypes['force'] = $forcePatchTypes;

continue;
}

if (isset($doc['return'])) {
$this->setReturnType($doc['return'] ?? self::MAGIC_METHODS[$method->name], $method->class, $method->name, $method->getFileName(), $parent, $method->getReturnType());

if (isset(self::$returnTypes[$class][$method->name][0]) && $canAddReturnType) {
$this->fixReturnStatements($method, self::$returnTypes[$class][$method->name][0]);
}

if ($method->isPrivate()) {
unset(self::$returnTypes[$class][$method->name]);
}
}

$this->patchTypes['force'] = $forcePatchTypes;

if ($method->isPrivate()) {
continue;
}

$finalOrInternal = false;

foreach (['final', 'internal'] as $annotation) {
if (null !== $description = $doc[$annotation][0] ?? null) {
self::${$annotation.'Methods'}[$class][$method->name] = [$class, '' !== $description ? ' '.$description.(preg_match('/[[:punct:]]$/', $description) ? '' : '.') : '.'];
$finalOrInternal = true;
}
}

if ($finalOrInternal || $method->isConstructor() || !isset($doc['param']) || StatelessInvocation::class === $class) {
continue;
}
if (!isset(self::$annotatedParameters[$class][$method->name])) {
$definedParameters = [];
foreach ($method->getParameters() as $parameter) {
$definedParameters[$parameter->name] = true;
}
}
foreach ($doc['param'] as $parameterName => $parameterType) {
if (!isset($definedParameters[$parameterName])) {
self::$annotatedParameters[$class][$method->name][$parameterName] = \sprintf('The "%%s::%s()" method will require a new "%s$%s" argument in the next major version of its %s "%s", not defining it is deprecated.', $method->name, $parameterType ? $parameterType.' ' : '', $parameterName, interface_exists($className) ? 'interface' : 'parent class', $className);
}
}
}

$finals = isset(self::$final[$class]) || $refl->isFinal() ? [] : [
'finalConstants' => $refl->getReflectionConstants(\ReflectionClassConstant::IS_PUBLIC | \ReflectionClassConstant::IS_PROTECTED),
'finalProperties' => $refl->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED),
];
foreach ($finals as $type => $reflectors) {
foreach ($reflectors as $r) {
if ($r->class !== $class) {
continue;
}

$doc = $this->parsePhpDoc($r);

foreach ($parentAndOwnInterfaces as $use) {
if (isset(self::${$type}[$use][$r->name]) && !isset($doc['deprecated']) && ('finalConstants' === $type || substr($use, 0, strrpos($use, '\\')) !== substr($use, 0, strrpos($class, '\\')))) {
$msg = 'finalConstants' === $type ? '%s" constant' : '$%s" property';
$deprecations[] = \sprintf('The "%s::'.$msg.' is considered final. You should not override it in "%s".', self::${$type}[$use][$r->name], $r->name, $class);
}
}

if (isset($doc['final']) || ('finalProperties' === $type && str_starts_with($class, 'Symfony\\') && !$r->hasType())) {
self::${$type}[$class][$r->name] = $class;
}
}
}

return $deprecations;
}

public function checkCase(\ReflectionClass $refl, string $file, string $class): ?array
{
$real = explode('\\', $class.strrchr($file, '.'));
$tail = explode(\DIRECTORY_SEPARATOR, str_replace('/', \DIRECTORY_SEPARATOR, $file));

$i = \count($tail) - 1;
$j = \count($real) - 1;

while (isset($tail[$i], $real[$j]) && $tail[$i] === $real[$j]) {
--$i;
--$j;
}

array_splice($tail, 0, $i + 1);

if (!$tail) {
return null;
}

$tail = \DIRECTORY_SEPARATOR.implode(\DIRECTORY_SEPARATOR, $tail);
$tailLen = \strlen($tail);
$real = $refl->getFileName();

if (2 === self::$caseCheck) {
$real = $this->darwinRealpath($real);
}

if (0 === substr_compare($real, $tail, -$tailLen, $tailLen, true)
&& 0 !== substr_compare($real, $tail, -$tailLen, $tailLen, false)
) {
return [substr($tail, -$tailLen + 1), substr($real, -$tailLen + 1), substr($real, 0, -$tailLen + 1)];
}

return null;
}




private function darwinRealpath(string $real): string
{
$i = 1 + strrpos($real, '/');
$file = substr($real, $i);
$real = substr($real, 0, $i);

if (isset(self::$darwinCache[$real])) {
$kDir = $real;
} else {
$kDir = strtolower($real);

if (isset(self::$darwinCache[$kDir])) {
$real = self::$darwinCache[$kDir][0];
} else {
$dir = getcwd();

if (!@chdir($real)) {
return $real.$file;
}

$real = getcwd().'/';
chdir($dir);

$dir = $real;
$k = $kDir;
$i = \strlen($dir) - 1;
while (!isset(self::$darwinCache[$k])) {
self::$darwinCache[$k] = [$dir, []];
self::$darwinCache[$dir] = &self::$darwinCache[$k];

while ('/' !== $dir[--$i]) {
}
$k = substr($k, 0, ++$i);
$dir = substr($dir, 0, $i--);
}
}
}

$dirFiles = self::$darwinCache[$kDir][1];

if (!isset($dirFiles[$file]) && str_ends_with($file, ') : eval()\'d code')) {

$file = substr($file, 0, strrpos($file, '(', -17));
}

if (isset($dirFiles[$file])) {
return $real.$dirFiles[$file];
}

$kFile = strtolower($file);

if (!isset($dirFiles[$kFile])) {
foreach (scandir($real, 2) as $f) {
if ('.' !== $f[0]) {
$dirFiles[$f] = $f;
if ($f === $file) {
$kFile = $file;
} elseif ($f !== $k = strtolower($f)) {
$dirFiles[$k] = $f;
}
}
}
self::$darwinCache[$kDir][1] = $dirFiles;
}

return $real.$dirFiles[$kFile];
}






private function getOwnInterfaces(string $class, ?string $parent): array
{
$ownInterfaces = class_implements($class, false);

if ($parent) {
foreach (class_implements($parent, false) as $interface) {
unset($ownInterfaces[$interface]);
}
}

foreach ($ownInterfaces as $interface) {
foreach (class_implements($interface) as $interface) {
unset($ownInterfaces[$interface]);
}
}

return $ownInterfaces;
}

private function setReturnType(string $types, string $class, string $method, string $filename, ?string $parent, ?\ReflectionType $returnType = null): void
{
if ('__construct' === $method) {
return;
}

if ('null' === $types) {
self::$returnTypes[$class][$method] = ['null', 'null', $class, $filename];

return;
}

if ($nullable = str_starts_with($types, 'null|')) {
$types = substr($types, 5);
} elseif ($nullable = str_ends_with($types, '|null')) {
$types = substr($types, 0, -5);
}
$arrayType = ['array' => 'array'];
$typesMap = [];
$glue = str_contains($types, '&') ? '&' : '|';
foreach (explode($glue, $types) as $t) {
$t = self::SPECIAL_RETURN_TYPES[strtolower($t)] ?? $t;
$typesMap[$this->normalizeType($t, $class, $parent, $returnType)][$t] = $t;
}

if (isset($typesMap['array'])) {
if (isset($typesMap['Traversable']) || isset($typesMap['\Traversable'])) {
$typesMap['iterable'] = $arrayType !== $typesMap['array'] ? $typesMap['array'] : ['iterable'];
unset($typesMap['array'], $typesMap['Traversable'], $typesMap['\Traversable']);
} elseif ($arrayType !== $typesMap['array'] && isset(self::$returnTypes[$class][$method]) && !$returnType) {
return;
}
}

if (isset($typesMap['array']) && isset($typesMap['iterable'])) {
if ($arrayType !== $typesMap['array']) {
$typesMap['iterable'] = $typesMap['array'];
}
unset($typesMap['array']);
}

$iterable = $object = true;
foreach ($typesMap as $n => $t) {
if ('null' !== $n) {
$iterable = $iterable && (\in_array($n, ['array', 'iterable']) || str_contains($n, 'Iterator'));
$object = $object && (\in_array($n, ['callable', 'object', '$this', 'static']) || !isset(self::SPECIAL_RETURN_TYPES[$n]));
}
}

$phpTypes = [];
$docTypes = [];

foreach ($typesMap as $n => $t) {
if (str_contains($n, '::')) {
[$definingClass, $constantName] = explode('::', $n, 2);
$definingClass = match ($definingClass) {
'self', 'static', 'parent' => $class,
default => $definingClass,
};

if (!\defined($definingClass.'::'.$constantName)) {
return;
}

$constant = new \ReflectionClassConstant($definingClass, $constantName);

if (\PHP_VERSION_ID >= 80300 && $constantType = $constant->getType()) {
if ($constantType instanceof \ReflectionNamedType) {
$n = $constantType->getName();
} else {
return;
}
} else {
$n = \gettype($constant->getValue());
}
}

if ('null' === $n) {
$nullable = true;
continue;
}

$docTypes[] = $t;

if ('mixed' === $n || 'void' === $n) {
$nullable = false;
$phpTypes = ['' => $n];
continue;
}

if ('resource' === $n) {

return;
}

if (!preg_match('/^(?:\\\\?[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)+$/', $n)) {

continue;
}

if (!isset($phpTypes['']) && !\in_array($n, $phpTypes, true)) {
$phpTypes[] = $n;
}
}
$docTypes = array_merge([], ...$docTypes);

if (!$phpTypes) {
return;
}

if (1 < \count($phpTypes)) {
if ($iterable && '8.0' > $this->patchTypes['php']) {
$phpTypes = $docTypes = ['iterable'];
} elseif ($object && 'object' === $this->patchTypes['force']) {
$phpTypes = $docTypes = ['object'];
} elseif ('8.0' > $this->patchTypes['php']) {

return;
}
}

$phpType = \sprintf($nullable ? (1 < \count($phpTypes) ? '%s|null' : '?%s') : '%s', implode($glue, $phpTypes));
$docType = \sprintf($nullable ? '%s|null' : '%s', implode($glue, $docTypes));

self::$returnTypes[$class][$method] = [$phpType, $docType, $class, $filename];
}

private function normalizeType(string $type, string $class, ?string $parent, ?\ReflectionType $returnType): string
{
if (isset(self::SPECIAL_RETURN_TYPES[$lcType = strtolower($type)])) {
if ('parent' === $lcType = self::SPECIAL_RETURN_TYPES[$lcType]) {
$lcType = null !== $parent ? '\\'.$parent : 'parent';
} elseif ('self' === $lcType) {
$lcType = '\\'.$class;
}

return $lcType;
}




if (!str_ends_with($type, '[]')) {
return $type;
}

if ($returnType instanceof \ReflectionNamedType) {
$type = $returnType->getName();

if ('mixed' !== $type) {
return isset(self::SPECIAL_RETURN_TYPES[$type]) ? $type : '\\'.$type;
}
}

return 'array';
}




private function patchReturnTypeWillChange(\ReflectionMethod $method): void
{
if (\count($method->getAttributes(\ReturnTypeWillChange::class))) {
return;
}

if (!is_file($file = $method->getFileName())) {
return;
}

$fileOffset = self::$fileOffsets[$file] ?? 0;

$code = file($file);

$startLine = $method->getStartLine() + $fileOffset - 2;

if (false !== stripos($code[$startLine], 'ReturnTypeWillChange')) {
return;
}

$code[$startLine] .= "    #[\\ReturnTypeWillChange]\n";
self::$fileOffsets[$file] = 1 + $fileOffset;
file_put_contents($file, $code);
}




private function patchMethod(\ReflectionMethod $method, string $returnType, string $declaringFile, string $normalizedType): void
{
static $patchedMethods = [];
static $useStatements = [];

if (!is_file($file = $method->getFileName()) || isset($patchedMethods[$file][$startLine = $method->getStartLine()])) {
return;
}

$patchedMethods[$file][$startLine] = true;
$fileOffset = self::$fileOffsets[$file] ?? 0;
$startLine += $fileOffset - 2;
if ($nullable = str_ends_with($returnType, '|null')) {
$returnType = substr($returnType, 0, -5);
}
$glue = str_contains($returnType, '&') ? '&' : '|';
$returnType = explode($glue, $returnType);
$code = file($file);

foreach ($returnType as $i => $type) {
if (preg_match('/((?:\[\])+)$/', $type, $m)) {
$type = substr($type, 0, -\strlen($m[1]));
$format = '%s'.$m[1];
} else {
$format = null;
}

if (isset(self::SPECIAL_RETURN_TYPES[$type]) || ('\\' === $type[0] && !$p = strrpos($type, '\\', 1))) {
continue;
}

[$namespace, $useOffset, $useMap] = $useStatements[$file] ??= self::getUseStatements($file);

if ('\\' !== $type[0]) {
[$declaringNamespace, , $declaringUseMap] = $useStatements[$declaringFile] ??= self::getUseStatements($declaringFile);

$p = strpos($type, '\\', 1);
$alias = $p ? substr($type, 0, $p) : $type;

if (isset($declaringUseMap[$alias])) {
$type = '\\'.$declaringUseMap[$alias].($p ? substr($type, $p) : '');
} else {
$type = '\\'.$declaringNamespace.$type;
}

$p = strrpos($type, '\\', 1);
}

$alias = substr($type, 1 + $p);
$type = substr($type, 1);

if (!isset($useMap[$alias]) && (class_exists($c = $namespace.$alias) || interface_exists($c) || trait_exists($c))) {
$useMap[$alias] = $c;
}

if (!isset($useMap[$alias])) {
$useStatements[$file][2][$alias] = $type;
$code[$useOffset] = "use $type;\n".$code[$useOffset];
++$fileOffset;
} elseif ($useMap[$alias] !== $type) {
$alias .= 'FIXME';
$useStatements[$file][2][$alias] = $type;
$code[$useOffset] = "use $type as $alias;\n".$code[$useOffset];
++$fileOffset;
}

$returnType[$i] = null !== $format ? \sprintf($format, $alias) : $alias;
}

if ('docblock' === $this->patchTypes['force'] || ('object' === $normalizedType && '7.1' === $this->patchTypes['php'])) {
$returnType = implode($glue, $returnType).($nullable ? '|null' : '');

if (str_contains($code[$startLine], '#[')) {
--$startLine;
}

if ($method->getDocComment()) {
$code[$startLine] = "     * @return $returnType\n".$code[$startLine];
} else {
$code[$startLine] .= <<<EOTXT
    /**
     * @return $returnType
     */

EOTXT;
}

$fileOffset += substr_count($code[$startLine], "\n") - 1;
}

self::$fileOffsets[$file] = $fileOffset;
file_put_contents($file, $code);

$this->fixReturnStatements($method, $normalizedType);
}

private static function getUseStatements(string $file): array
{
$namespace = '';
$useMap = [];
$useOffset = 0;

if (!is_file($file)) {
return [$namespace, $useOffset, $useMap];
}

$file = file($file);

for ($i = 0; $i < \count($file); ++$i) {
if (preg_match('/^(class|interface|trait|abstract) /', $file[$i])) {
break;
}

if (str_starts_with($file[$i], 'namespace ')) {
$namespace = substr($file[$i], \strlen('namespace '), -2).'\\';
$useOffset = $i + 2;
}

if (str_starts_with($file[$i], 'use ')) {
$useOffset = $i;

for (; str_starts_with($file[$i], 'use '); ++$i) {
$u = explode(' as ', substr($file[$i], 4, -2), 2);

if (1 === \count($u)) {
$p = strrpos($u[0], '\\');
$useMap[substr($u[0], false !== $p ? 1 + $p : 0)] = $u[0];
} else {
$useMap[$u[1]] = $u[0];
}
}

break;
}
}

return [$namespace, $useOffset, $useMap];
}

private function fixReturnStatements(\ReflectionMethod $method, string $returnType): void
{
if ('docblock' !== $this->patchTypes['force']) {
if ('7.1' === $this->patchTypes['php'] && 'object' === ltrim($returnType, '?')) {
return;
}

if ('7.4' > $this->patchTypes['php'] && $method->hasReturnType()) {
return;
}

if ('8.0' > $this->patchTypes['php'] && (str_contains($returnType, '|') || \in_array($returnType, ['mixed', 'static'], true))) {
return;
}

if ('8.1' > $this->patchTypes['php'] && str_contains($returnType, '&')) {
return;
}
}

if (!is_file($file = $method->getFileName())) {
return;
}

$fixedCode = $code = file($file);
$i = (self::$fileOffsets[$file] ?? 0) + $method->getStartLine();

if ('?' !== $returnType && 'docblock' !== $this->patchTypes['force']) {
$fixedCode[$i - 1] = preg_replace('/\)(?::[^;\n]++)?(;?\n)/', "): $returnType\\1", $code[$i - 1]);
}

$end = $method->isGenerator() ? $i : $method->getEndLine();
$inClosure = false;
$braces = 0;
for (; $i < $end; ++$i) {
if (!$inClosure) {
$inClosure = str_contains($code[$i], 'function (');
}

if ($inClosure) {
$braces += substr_count($code[$i], '{') - substr_count($code[$i], '}');
$inClosure = $braces > 0;

continue;
}

if ('void' === $returnType) {
$fixedCode[$i] = str_replace('    return null;', '    return;', $code[$i]);
} elseif ('mixed' === $returnType || '?' === $returnType[0]) {
$fixedCode[$i] = str_replace('    return;', '    return null;', $code[$i]);
} else {
$fixedCode[$i] = str_replace('    return;', "    return $returnType!?;", $code[$i]);
}
}

if ($fixedCode !== $code) {
file_put_contents($file, $fixedCode);
}
}




private function parsePhpDoc(\Reflector $reflector): array
{
if (!$doc = $reflector->getDocComment()) {
return [];
}

$tagName = '';
$tagContent = '';

$tags = [];

foreach (explode("\n", substr($doc, 3, -2)) as $line) {
$line = ltrim($line);
$line = ltrim($line, '*');

if ('' === $line = trim($line)) {
if ('' !== $tagName) {
$tags[$tagName][] = $tagContent;
}
$tagName = $tagContent = '';
continue;
}

if ('@' === $line[0]) {
if ('' !== $tagName) {
$tags[$tagName][] = $tagContent;
$tagContent = '';
}

if (preg_match('{^@([-a-zA-Z0-9_:]++)(\s|$)}', $line, $m)) {
$tagName = $m[1];
$tagContent = str_replace("\t", ' ', ltrim(substr($line, 2 + \strlen($tagName))));
} else {
$tagName = '';
}
} elseif ('' !== $tagName) {
$tagContent .= ' '.str_replace("\t", ' ', $line);
}
}

if ('' !== $tagName) {
$tags[$tagName][] = $tagContent;
}

foreach ($tags['method'] ?? [] as $i => $method) {
unset($tags['method'][$i]);

$parts = preg_split('{(\s++|\((?:[^()]*+|(?R))*\)(?: *: *[^ ]++)?|<(?:[^<>]*+|(?R))*>|\{(?:[^{}]*+|(?R))*\})}', $method, -1, \PREG_SPLIT_DELIM_CAPTURE);
$returnType = '';
$static = 'static' === $parts[0];

for ($i = $static ? 2 : 0; null !== $p = $parts[$i] ?? null; $i += 2) {
if (\in_array($p, ['', '|', '&', 'callable'], true) || \in_array(substr($returnType, -1), ['|', '&'], true)) {
$returnType .= trim($parts[$i - 1] ?? '').$p;
continue;
}

$signature = '(' === ($parts[$i + 1][0] ?? '(') ? $parts[$i + 1] ?? '()' : null;

if (null === $signature && '' === $returnType) {
$returnType = $p;
continue;
}

if ($static && 2 === $i) {
$static = false;
$returnType = 'static';
}

if (\in_array($description = trim(implode('', \array_slice($parts, 2 + $i))), ['', '.'], true)) {
$description = null;
} elseif (!preg_match('/[.!]$/', $description)) {
$description .= '.';
}

$tags['method'][$p] = [$static, $returnType, $signature ?? '()', $description];
break;
}
}

foreach ($tags['param'] ?? [] as $i => $param) {
unset($tags['param'][$i]);

if (\strlen($param) !== strcspn($param, '<{(')) {
$param = preg_replace('{\(([^()]*+|(?R))*\)(?: *: *[^ ]++)?|<([^<>]*+|(?R))*>|\{([^{}]*+|(?R))*\}}', '', $param);
}

if (false === $i = strpos($param, '$')) {
continue;
}

$type = 0 === $i ? '' : rtrim(substr($param, 0, $i), ' &');
$param = substr($param, 1 + $i, (strpos($param, ' ', $i) ?: (1 + $i + \strlen($param))) - $i - 1);

$tags['param'][$param] = $type;
}

foreach (['var', 'return'] as $k) {
if (null === $v = $tags[$k][0] ?? null) {
continue;
}
if (\strlen($v) !== strcspn($v, '<{(')) {
$v = preg_replace('{\(([^()]*+|(?R))*\)(?: *: *[^ ]++)?|<([^<>]*+|(?R))*>|\{([^{}]*+|(?R))*\}}', '', $v);
}

$tags[$k] = substr($v, 0, strpos($v, ' ') ?: \strlen($v)) ?: null;
}

return $tags;
}
}
Copyright (c) 2019-present 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.
<?php










namespace Symfony\Component\ErrorHandler;






class Debug
{
public static function enable(): ErrorHandler
{
error_reporting(\E_ALL & ~\E_DEPRECATED & ~\E_USER_DEPRECATED);

if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
ini_set('display_errors', 0);
} elseif (!filter_var(\ini_get('log_errors'), \FILTER_VALIDATE_BOOL) || \ini_get('error_log')) {

ini_set('display_errors', 1);
}

@ini_set('zend.assertions', 1);
ini_set('assert.active', 1);
ini_set('assert.exception', 1);

DebugClassLoader::enable();

return ErrorHandler::register(new ErrorHandler(new BufferingLogger(), true));
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorEnhancer;

interface ErrorEnhancerInterface
{



public function enhance(\Throwable $error): ?\Throwable;
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorEnhancer;

use Composer\Autoload\ClassLoader;
use Symfony\Component\ErrorHandler\DebugClassLoader;
use Symfony\Component\ErrorHandler\Error\ClassNotFoundError;
use Symfony\Component\ErrorHandler\Error\FatalError;




class ClassNotFoundErrorEnhancer implements ErrorEnhancerInterface
{
public function enhance(\Throwable $error): ?\Throwable
{

$message = !$error instanceof FatalError ? $error->getMessage() : $error->getError()['message'];
if (!preg_match('/^(Class|Interface|Trait) [\'"]([^\'"]+)[\'"] not found$/', $message, $matches)) {
return null;
}
$typeName = strtolower($matches[1]);
$fullyQualifiedClassName = $matches[2];

if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedClassName, '\\')) {
$className = substr($fullyQualifiedClassName, $namespaceSeparatorIndex + 1);
$namespacePrefix = substr($fullyQualifiedClassName, 0, $namespaceSeparatorIndex);
$message = \sprintf('Attempted to load %s "%s" from namespace "%s".', $typeName, $className, $namespacePrefix);
$tail = ' for another namespace?';
} else {
$className = $fullyQualifiedClassName;
$message = \sprintf('Attempted to load %s "%s" from the global namespace.', $typeName, $className);
$tail = '?';
}

if ($candidates = $this->getClassCandidates($className)) {
$tail = array_pop($candidates).'"?';
if ($candidates) {
$tail = ' for e.g. "'.implode('", "', $candidates).'" or "'.$tail;
} else {
$tail = ' for "'.$tail;
}
}
$message .= "\nDid you forget a \"use\" statement".$tail;

return new ClassNotFoundError($message, $error);
}











private function getClassCandidates(string $class): array
{
if (!\is_array($functions = spl_autoload_functions())) {
return [];
}


$classes = [];

foreach ($functions as $function) {
if (!\is_array($function)) {
continue;
}

if ($function[0] instanceof DebugClassLoader) {
$function = $function[0]->getClassLoader();

if (!\is_array($function)) {
continue;
}
}

if ($function[0] instanceof ClassLoader) {
foreach ($function[0]->getPrefixes() as $prefix => $paths) {
foreach ($paths as $path) {
$classes[] = $this->findClassInPath($path, $class, $prefix);
}
}

foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) {
foreach ($paths as $path) {
$classes[] = $this->findClassInPath($path, $class, $prefix);
}
}
}
}

return array_unique(array_merge([], ...$classes));
}

private function findClassInPath(string $path, string $class, string $prefix): array
{
$path = realpath($path.'/'.strtr($prefix, '\\_', '//')) ?: realpath($path.'/'.\dirname(strtr($prefix, '\\_', '//'))) ?: realpath($path);
if (!$path || !is_dir($path)) {
return [];
}

$classes = [];
$filename = $class.'.php';
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
if ($filename == $file->getFileName() && $class = $this->convertFileToClass($path, $file->getPathName(), $prefix)) {
$classes[] = $class;
}
}

return $classes;
}

private function convertFileToClass(string $path, string $file, string $prefix): ?string
{
$candidates = [

$namespacedClass = str_replace([$path.\DIRECTORY_SEPARATOR, '.php', '/'], ['', '', '\\'], $file),

$prefix.$namespacedClass,

$prefix.'\\'.$namespacedClass,

str_replace('\\', '_', $namespacedClass),

str_replace('\\', '_', $prefix.$namespacedClass),

str_replace('\\', '_', $prefix.'\\'.$namespacedClass),
];

if ($prefix) {
$candidates = array_filter($candidates, fn ($candidate) => str_starts_with($candidate, $prefix));
}




foreach ($candidates as $candidate) {
if ($this->classExists($candidate)) {
return $candidate;
}
}





if (str_contains($file, 'Resources/stubs')) {
return null;
}

try {
require_once $file;
} catch (\Throwable) {
return null;
}

foreach ($candidates as $candidate) {
if ($this->classExists($candidate)) {
return $candidate;
}
}

return null;
}

private function classExists(string $class): bool
{
return class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false);
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorEnhancer;

use Symfony\Component\ErrorHandler\Error\FatalError;
use Symfony\Component\ErrorHandler\Error\UndefinedFunctionError;




class UndefinedFunctionErrorEnhancer implements ErrorEnhancerInterface
{
public function enhance(\Throwable $error): ?\Throwable
{
if ($error instanceof FatalError) {
return null;
}

$message = $error->getMessage();
$messageLen = \strlen($message);
$notFoundSuffix = '()';
$notFoundSuffixLen = \strlen($notFoundSuffix);
if ($notFoundSuffixLen > $messageLen) {
return null;
}

if (0 !== substr_compare($message, $notFoundSuffix, -$notFoundSuffixLen)) {
return null;
}

$prefix = 'Call to undefined function ';
$prefixLen = \strlen($prefix);
if (!str_starts_with($message, $prefix)) {
return null;
}

$fullyQualifiedFunctionName = substr($message, $prefixLen, -$notFoundSuffixLen);
if (false !== $namespaceSeparatorIndex = strrpos($fullyQualifiedFunctionName, '\\')) {
$functionName = substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1);
$namespacePrefix = substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex);
$message = \sprintf('Attempted to call undefined function "%s" from namespace "%s".', $functionName, $namespacePrefix);
} else {
$functionName = $fullyQualifiedFunctionName;
$message = \sprintf('Attempted to call undefined function "%s" from the global namespace.', $functionName);
}

$candidates = [];
foreach (get_defined_functions() as $type => $definedFunctionNames) {
foreach ($definedFunctionNames as $definedFunctionName) {
if (false !== $namespaceSeparatorIndex = strrpos($definedFunctionName, '\\')) {
$definedFunctionNameBasename = substr($definedFunctionName, $namespaceSeparatorIndex + 1);
} else {
$definedFunctionNameBasename = $definedFunctionName;
}

if ($definedFunctionNameBasename === $functionName) {
$candidates[] = '\\'.$definedFunctionName;
}
}
}

if ($candidates) {
sort($candidates);
$last = array_pop($candidates).'"?';
if ($candidates) {
$candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last;
} else {
$candidates = '"'.$last;
}
$message .= "\nDid you mean to call ".$candidates;
}

return new UndefinedFunctionError($message, $error);
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorEnhancer;

use Symfony\Component\ErrorHandler\Error\FatalError;
use Symfony\Component\ErrorHandler\Error\UndefinedMethodError;




class UndefinedMethodErrorEnhancer implements ErrorEnhancerInterface
{
public function enhance(\Throwable $error): ?\Throwable
{
if ($error instanceof FatalError) {
return null;
}

$message = $error->getMessage();
preg_match('/^Call to undefined method (.*)::(.*)\(\)$/', $message, $matches);
if (!$matches) {
return null;
}

$className = $matches[1];
$methodName = $matches[2];

$message = \sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className);

if ('' === $methodName || !class_exists($className) || null === $methods = get_class_methods($className)) {

return new UndefinedMethodError($message, $error);
}

$candidates = [];
foreach ($methods as $definedMethodName) {
$lev = levenshtein($methodName, $definedMethodName);
if ($lev <= \strlen($methodName) / 3 || str_contains($definedMethodName, $methodName)) {
$candidates[] = $definedMethodName;
}
}

if ($candidates) {
sort($candidates);
$last = array_pop($candidates).'"?';
if ($candidates) {
$candidates = 'e.g. "'.implode('", "', $candidates).'" or "'.$last;
} else {
$candidates = '"'.$last;
}

$message .= "\nDid you mean to call ".$candidates;
}

return new UndefinedMethodError($message, $error);
}
}
<?php










namespace Symfony\Component\ErrorHandler\Error;

class UndefinedMethodError extends \Error
{
public function __construct(string $message, \Throwable $previous)
{
parent::__construct($message, $previous->getCode(), $previous->getPrevious());

foreach ([
'file' => $previous->getFile(),
'line' => $previous->getLine(),
'trace' => $previous->getTrace(),
] as $property => $value) {
$refl = new \ReflectionProperty(\Error::class, $property);
$refl->setValue($this, $value);
}
}
}
<?php










namespace Symfony\Component\ErrorHandler\Error;

class OutOfMemoryError extends FatalError
{
}
<?php










namespace Symfony\Component\ErrorHandler\Error;

class FatalError extends \Error
{



public function __construct(
string $message,
int $code,
private array $error,
?int $traceOffset = null,
bool $traceArgs = true,
?array $trace = null,
) {
parent::__construct($message, $code);

if (null !== $trace) {
if (!$traceArgs) {
foreach ($trace as &$frame) {
unset($frame['args'], $frame['this'], $frame);
}
}
} elseif (null !== $traceOffset) {
if (\function_exists('xdebug_get_function_stack') && \in_array(\ini_get('xdebug.mode'), ['develop', false], true) && $trace = @xdebug_get_function_stack()) {
if (0 < $traceOffset) {
array_splice($trace, -$traceOffset);
}

foreach ($trace as &$frame) {
if (!isset($frame['type'])) {

if (isset($frame['class'])) {
$frame['type'] = '::';
}
} elseif ('dynamic' === $frame['type']) {
$frame['type'] = '->';
} elseif ('static' === $frame['type']) {
$frame['type'] = '::';
}


if (!$traceArgs) {
unset($frame['params'], $frame['args']);
} elseif (isset($frame['params']) && !isset($frame['args'])) {
$frame['args'] = $frame['params'];
unset($frame['params']);
}
}

unset($frame);
$trace = array_reverse($trace);
} else {
$trace = [];
}
}

foreach ([
'file' => $error['file'],
'line' => $error['line'],
'trace' => $trace,
] as $property => $value) {
if (null !== $value) {
$refl = new \ReflectionProperty(\Error::class, $property);
$refl->setValue($this, $value);
}
}
}

public function getError(): array
{
return $this->error;
}
}
<?php










namespace Symfony\Component\ErrorHandler\Error;

class ClassNotFoundError extends \Error
{
public function __construct(string $message, \Throwable $previous)
{
parent::__construct($message, $previous->getCode(), $previous->getPrevious());

foreach ([
'file' => $previous->getFile(),
'line' => $previous->getLine(),
'trace' => $previous->getTrace(),
] as $property => $value) {
$refl = new \ReflectionProperty(\Error::class, $property);
$refl->setValue($this, $value);
}
}
}
<?php










namespace Symfony\Component\ErrorHandler\Error;

class UndefinedFunctionError extends \Error
{
public function __construct(string $message, \Throwable $previous)
{
parent::__construct($message, $previous->getCode(), $previous->getPrevious());

foreach ([
'file' => $previous->getFile(),
'line' => $previous->getLine(),
'trace' => $previous->getTrace(),
] as $property => $value) {
$refl = new \ReflectionProperty(\Error::class, $property);
$refl->setValue($this, $value);
}
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorRenderer;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;








class FileLinkFormatter
{
private array|false $fileLinkFormat;




public function __construct(
string|array|null $fileLinkFormat = null,
private ?RequestStack $requestStack = null,
private ?string $baseDir = null,
private string|\Closure|null $urlFormat = null,
) {
$fileLinkFormat ??= $_ENV['SYMFONY_IDE'] ?? $_SERVER['SYMFONY_IDE'] ?? '';

if (!\is_array($f = $fileLinkFormat)) {
$f = (ErrorRendererInterface::IDE_LINK_FORMATS[$f] ?? $f) ?: \ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l';
$i = strpos($f, '&', max(strrpos($f, '%f'), strrpos($f, '%l'))) ?: \strlen($f);
$fileLinkFormat = [substr($f, 0, $i)] + preg_split('/&([^>]++)>/', substr($f, $i), -1, \PREG_SPLIT_DELIM_CAPTURE);
}

$this->fileLinkFormat = $fileLinkFormat;
}

public function format(string $file, int $line): string|false
{
if ($fmt = $this->getFileLinkFormat()) {
for ($i = 1; isset($fmt[$i]); ++$i) {
if (str_starts_with($file, $k = $fmt[$i++])) {
$file = substr_replace($file, $fmt[$i], 0, \strlen($k));
break;
}
}

return strtr($fmt[0], ['%f' => $file, '%l' => $line]);
}

return false;
}

public function __serialize(): array
{
$this->fileLinkFormat = $this->getFileLinkFormat();

return ['fileLinkFormat' => $this->fileLinkFormat];
}




public static function generateUrlFormat(UrlGeneratorInterface $router, string $routeName, string $queryString): ?string
{
try {
return $router->generate($routeName).$queryString;
} catch (\Throwable) {
return null;
}
}

private function getFileLinkFormat(): array|false
{
if ($this->fileLinkFormat) {
return $this->fileLinkFormat;
}

if ($this->requestStack && $this->baseDir && $this->urlFormat) {
$request = $this->requestStack->getMainRequest();

if ($request instanceof Request && (!$this->urlFormat instanceof \Closure || $this->urlFormat = ($this->urlFormat)())) {
return [
$request->getSchemeAndHttpHost().$this->urlFormat,
$this->baseDir.\DIRECTORY_SEPARATOR, '',
];
}
}

return false;
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorRenderer;

use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Serializer\Exception\NotEncodableValueException;
use Symfony\Component\Serializer\SerializerInterface;






class SerializerErrorRenderer implements ErrorRendererInterface
{
private string|\Closure $format;
private ErrorRendererInterface $fallbackErrorRenderer;
private bool|\Closure $debug;






public function __construct(
private SerializerInterface $serializer,
string|callable $format,
?ErrorRendererInterface $fallbackErrorRenderer = null,
bool|callable $debug = false,
) {
$this->format = \is_string($format) ? $format : $format(...);
$this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer();
$this->debug = \is_bool($debug) ? $debug : $debug(...);
}

public function render(\Throwable $exception): FlattenException
{
$headers = ['Vary' => 'Accept'];
$debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception);
if ($debug) {
$headers['X-Debug-Exception'] = rawurlencode(substr($exception->getMessage(), 0, 2000));
$headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
}

$flattenException = FlattenException::createFromThrowable($exception, null, $headers);

try {
$format = \is_string($this->format) ? $this->format : ($this->format)($flattenException);
$headers['Content-Type'] = Request::getMimeTypes($format)[0] ?? $format;

$flattenException->setAsString($this->serializer->serialize($flattenException, $format, [
'exception' => $exception,
'debug' => $debug,
]));
} catch (NotEncodableValueException) {
$flattenException = $this->fallbackErrorRenderer->render($exception);
}

return $flattenException->setHeaders($flattenException->getHeaders() + $headers);
}

public static function getPreferredFormat(RequestStack $requestStack): \Closure
{
return static function () use ($requestStack) {
if (!$request = $requestStack->getCurrentRequest()) {
throw new NotEncodableValueException();
}

return $request->getPreferredFormat();
};
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorRenderer;

use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;


class_exists(CliDumper::class);




class CliErrorRenderer implements ErrorRendererInterface
{
public function render(\Throwable $exception): FlattenException
{
$cloner = new VarCloner();
$dumper = new class extends CliDumper {
protected function supportsColors(): bool
{
$outputStream = $this->outputStream;
$this->outputStream = fopen('php://stdout', 'w');

try {
return parent::supportsColors();
} finally {
$this->outputStream = $outputStream;
}
}
};

return FlattenException::createFromThrowable($exception)
->setAsString($dumper->dump($cloner->cloneVar($exception), true));
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorRenderer;

use Psr\Log\LoggerInterface;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerConfigurator;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;




class HtmlErrorRenderer implements ErrorRendererInterface
{
private const GHOST_ADDONS = [
'02-14' => self::GHOST_HEART,
'02-29' => self::GHOST_PLUS,
'10-18' => self::GHOST_GIFT,
];

private const GHOST_GIFT = 'M124.00534057617188,5.3606138080358505 C124.40059661865234,4.644828304648399 125.1237564086914,3.712414965033531 123.88127899169922,3.487462028861046 C123.53517150878906,3.3097832053899765 123.18894958496094,2.9953975528478622 122.8432846069336,3.345616325736046 C122.07421112060547,3.649444565176964 121.40750122070312,4.074306473135948 122.2164306640625,4.869479164481163 C122.57514953613281,5.3830065578222275 122.90142822265625,6.503447040915489 123.3077621459961,6.626829609274864 C123.55027770996094,6.210384353995323 123.7774658203125,5.785196766257286 124.00534057617188,5.3606138080358505 zM122.30630493164062,7.336987480521202 C121.60028076171875,6.076864704489708 121.03211975097656,4.72498320043087 120.16796875,3.562500938773155 C119.11695098876953,2.44033907353878 117.04605865478516,2.940566048026085 116.57544708251953,4.387995228171349 C115.95028686523438,5.819030746817589 117.2991714477539,7.527640804648399 118.826171875,7.348545059561729 C119.98493194580078,7.367936596274376 121.15027618408203,7.420116886496544 122.30630493164062,7.336987480521202 zM128.1732177734375,7.379541382193565 C129.67486572265625,7.17823551595211 130.53842163085938,5.287807449698448 129.68344116210938,4.032590612769127 C128.92578125,2.693056806921959 126.74605560302734,2.6463639587163925 125.98509216308594,4.007616028189659 C125.32617950439453,5.108129009604454 124.75428009033203,6.258124336600304 124.14962768554688,7.388818249106407 C125.48638916015625,7.465229496359825 126.8357162475586,7.447416767477989 128.1732177734375,7.379541382193565 zM130.6601104736328,8.991325363516808 C131.17202758789062,8.540884003043175 133.1543731689453,8.009847149252892 131.65304565429688,7.582054600119591 C131.2811279296875,7.476506695151329 130.84751892089844,6.99234913289547 130.5132598876953,7.124847874045372 C129.78744506835938,8.02728746831417 128.67140197753906,8.55669592320919 127.50616455078125,8.501235947012901 C127.27806091308594,8.576229080557823 126.11459350585938,8.38720129430294 126.428955078125,8.601900085806847 C127.25099182128906,9.070617660880089 128.0523223876953,9.579657539725304 128.902587890625,9.995706543326378 C129.49813842773438,9.678531631827354 130.0761260986328,9.329126343131065 130.6601104736328,8.991325363516808 zM118.96446990966797,9.246344551444054 C119.4022445678711,8.991325363516808 119.84001922607422,8.736305221915245 120.27779388427734,8.481284126639366 C118.93965911865234,8.414779648184776 117.40827941894531,8.607666000723839 116.39698791503906,7.531384453177452 C116.11186981201172,7.212117180228233 115.83845520019531,6.846597656607628 115.44329071044922,7.248530372977257 C114.96995544433594,7.574637398123741 113.5140609741211,7.908811077475548 114.63501739501953,8.306883797049522 C115.61112976074219,8.883499130606651 116.58037567138672,9.474181160330772 117.58061218261719,10.008124336600304 C118.05723571777344,9.784612640738487 118.50651550292969,9.5052699893713 118.96446990966797,9.246344551444054 zM125.38018035888672,12.091858848929405 C125.9474868774414,11.636047348380089 127.32159423828125,11.201767906546593 127.36749267578125,10.712632164359093 C126.08487701416016,9.974547371268272 124.83960723876953,9.152772888541222 123.49772644042969,8.528907760977745 C123.03594207763672,8.353693947196007 122.66152954101562,8.623294815421104 122.28982543945312,8.857431396842003 C121.19065856933594,9.51122473180294 120.06505584716797,10.12446115911007 119.00167083740234,10.835315689444542 C120.39238739013672,11.69529627263546 121.79983520507812,12.529837593436241 123.22095489501953,13.338589653372765 C123.94580841064453,12.932025894522667 124.66128540039062,12.508862480521202 125.38018035888672,12.091858848929405 zM131.07164001464844,13.514615997672081 C131.66018676757812,13.143282875418663 132.2487335205078,12.771927818655968 132.8372802734375,12.400571808218956 C132.8324737548828,11.156818374991417 132.8523406982422,9.912529930472374 132.81829833984375,8.669195160269737 C131.63046264648438,9.332009300589561 130.45948791503906,10.027913078665733 129.30828857421875,10.752535805106163 C129.182373046875,12.035354599356651 129.24623107910156,13.33940313756466 129.27359008789062,14.628684982657433 C129.88104248046875,14.27079389989376 130.4737548828125,13.888019546866417 131.07164001464844,13.514640793204308 zM117.26847839355469,12.731024727225304 C117.32825469970703,11.67083452641964 117.45709991455078,10.46224020421505 116.17853546142578,10.148179039359093 C115.37110900878906,9.77159021794796 114.25194549560547,8.806716904044151 113.62991333007812,8.81639002263546 C113.61052703857422,10.0110072940588 113.62078857421875,11.20585821568966 113.61869049072266,12.400571808218956 C114.81139373779297,13.144886955618858 115.98292541503906,13.925040230154991 117.20137023925781,14.626662239432335 C117.31951141357422,14.010867103934288 117.24227905273438,13.35805033147335 117.26847839355469,12.731024727225304 zM125.80937957763672,16.836034759879112 C126.51483917236328,16.390663132071495 127.22030639648438,15.945291504263878 127.92576599121094,15.49991987645626 C127.92250061035156,14.215868934988976 127.97560119628906,12.929980263113976 127.91757202148438,11.647302612662315 C127.14225769042969,11.869626984000206 126.25550079345703,12.556857094168663 125.43866729736328,12.983742699027061 C124.82704162597656,13.342005714774132 124.21542358398438,13.700271591544151 123.60379028320312,14.05853746831417 C123.61585235595703,15.429577812552452 123.57081604003906,16.803131088614464 123.64839172363281,18.172149643301964 C124.37957000732422,17.744937881827354 125.09130859375,17.284801468253136 125.80937957763672,16.836034759879112 zM122.8521499633789,16.115344032645226 C122.8521499633789,15.429741844534874 122.8521499633789,14.744139656424522 122.8521499633789,14.05853746831417 C121.43595123291016,13.230924591422081 120.02428436279297,12.395455345511436 118.60256958007812,11.577354416251183 C118.52394104003906,12.888403877615929 118.56887817382812,14.204405769705772 118.55702209472656,15.517732605338097 C119.97289276123047,16.4041957706213 121.37410736083984,17.314891800284386 122.80789947509766,18.172149643301964 C122.86368560791016,17.488990768790245 122.84332275390625,16.800363525748253 122.8521499633789,16.115344032645226 zM131.10684204101562,18.871450409293175 C131.68399047851562,18.48711584508419 132.2611541748047,18.10278509557247 132.8383026123047,17.718475326895714 C132.81423950195312,16.499977096915245 132.89776611328125,15.264989838004112 132.77627563476562,14.05993078649044 C131.5760040283203,14.744719490408897 130.41763305664062,15.524359688162804 129.23875427246094,16.255397781729698 C129.26707458496094,17.516149505972862 129.18060302734375,18.791316971182823 129.3108367919922,20.041303619742393 C129.91973876953125,19.667551025748253 130.51010131835938,19.264152511954308 131.10684204101562,18.871450409293175 zM117.2557373046875,18.188333496451378 C117.25104522705078,17.549470886588097 117.24633026123047,16.91058538854122 117.24163055419922,16.271720871329308 C116.04924774169922,15.525708183646202 114.87187957763672,14.75476549565792 113.66158294677734,14.038097366690636 C113.5858383178711,15.262084946036339 113.62901306152344,16.49083898961544 113.61761474609375,17.717010483145714 C114.82051086425781,18.513254150748253 116.00987243652344,19.330610260367393 117.22888946533203,20.101993545889854 C117.27559661865234,19.466014847159386 117.25241088867188,18.825733169913292 117.2557373046875,18.188333496451378 zM125.8398666381836,22.38675306737423 C126.54049682617188,21.921453461050987 127.24110412597656,21.456151947379112 127.94172668457031,20.99083136022091 C127.94009399414062,19.693386062979698 127.96646118164062,18.395381912589073 127.93160247802734,17.098379120230675 C126.50540924072266,17.97775076329708 125.08877563476562,18.873308166861534 123.68258666992188,19.78428266942501 C123.52366638183594,21.03710363805294 123.626708984375,22.32878302037716 123.62647247314453,23.595300659537315 C124.06291198730469,23.86113165318966 125.1788101196289,22.68297766149044 125.8398666381836,22.38675306737423 zM122.8521499633789,21.83134649693966 C122.76741790771484,20.936696991324425 123.21651458740234,19.67745779454708 122.0794677734375,19.330633148550987 C120.93280029296875,18.604360565543175 119.7907485961914,17.870157226920128 118.62899780273438,17.16818617284298 C118.45966339111328,18.396427139639854 118.63676452636719,19.675991043448448 118.50668334960938,20.919256195425987 C119.89984130859375,21.92635916173458 121.32942199707031,22.88914106786251 122.78502655029297,23.803510650992393 C122.90177917480469,23.1627406924963 122.82917022705078,22.48402212560177 122.8521499633789,21.83134649693966 zM117.9798355102539,21.59483526647091 C116.28416442871094,20.46288488805294 114.58848571777344,19.330957397818565 112.892822265625,18.199007019400597 C112.89473724365234,14.705654129385948 112.84647369384766,11.211485847830772 112.90847778320312,7.718807205557823 C113.7575912475586,7.194885239005089 114.66117858886719,6.765397056937218 115.5350341796875,6.284702762961388 C114.97061157226562,4.668964847922325 115.78496551513672,2.7054970115423203 117.42159271240234,2.1007001250982285 C118.79354095458984,1.537783369421959 120.44731903076172,2.0457767099142075 121.32200622558594,3.23083733022213 C121.95732116699219,2.9050118774175644 122.59264373779297,2.5791852325201035 123.22796630859375,2.253336176276207 C123.86669921875,2.5821153968572617 124.50543975830078,2.9108948558568954 125.1441650390625,3.23967407643795 C126.05941009521484,2.154020771384239 127.62747192382812,1.5344576686620712 128.986328125,2.1429056972265244 C130.61741638183594,2.716217741370201 131.50650024414062,4.675290569663048 130.9215545654297,6.2884936183691025 C131.8018341064453,6.78548763692379 132.7589111328125,7.1738648265600204 133.5660400390625,7.780336365103722 C133.60182189941406,11.252970680594444 133.56637573242188,14.726140961050987 133.5631103515625,18.199007019400597 C130.18914794921875,20.431867584586143 126.86984252929688,22.74994657933712 123.44108581542969,24.897907242178917 C122.44406127929688,24.897628769278526 121.5834732055664,23.815067276358604 120.65831756591797,23.37616156041622 C119.76387023925781,22.784828171133995 118.87168884277344,22.19007681310177 117.9798355102539,21.59483526647091 z';
private const GHOST_HEART = 'M125.91386369681868,8.305165958366445 C128.95033202169043,-0.40540639102854037 140.8469835342744,8.305165958366445 125.91386369681868,19.504526138305664 C110.98208663272044,8.305165958366445 122.87795231771452,-0.40540639102854037 125.91386369681868,8.305165958366445 z';
private const GHOST_PLUS = 'M111.36824226379395,8.969108581542969 L118.69175148010254,8.969108581542969 L118.69175148010254,1.6455793380737305 L126.20429420471191,1.6455793380737305 L126.20429420471191,8.969108581542969 L133.52781105041504,8.969108581542969 L133.52781105041504,16.481630325317383 L126.20429420471191,16.481630325317383 L126.20429420471191,23.805158615112305 L118.69175148010254,23.805158615112305 L118.69175148010254,16.481630325317383 L111.36824226379395,16.481630325317383 z';

private bool|\Closure $debug;
private string $charset;
private FileLinkFormatter $fileLinkFormat;
private string|\Closure $outputBuffer;

private static string $template = 'views/error.html.php';





public function __construct(
bool|callable $debug = false,
?string $charset = null,
string|FileLinkFormatter|null $fileLinkFormat = null,
private ?string $projectDir = null,
string|callable $outputBuffer = '',
private ?LoggerInterface $logger = null,
) {
$this->debug = \is_bool($debug) ? $debug : $debug(...);
$this->charset = $charset ?: (\ini_get('default_charset') ?: 'UTF-8');
$this->fileLinkFormat = $fileLinkFormat instanceof FileLinkFormatter ? $fileLinkFormat : new FileLinkFormatter($fileLinkFormat);
$this->outputBuffer = \is_string($outputBuffer) ? $outputBuffer : $outputBuffer(...);
}

public function render(\Throwable $exception): FlattenException
{
$headers = ['Content-Type' => 'text/html; charset='.$this->charset];
if (\is_bool($this->debug) ? $this->debug : ($this->debug)($exception)) {
$headers['X-Debug-Exception'] = rawurlencode(substr($exception->getMessage(), 0, 2000));
$headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
}

$exception = FlattenException::createWithDataRepresentation($exception, null, $headers);

return $exception->setAsString($this->renderException($exception));
}




public function getBody(FlattenException $exception): string
{
return $this->renderException($exception, 'views/exception.html.php');
}




public function getStylesheet(): string
{
if (!$this->debug) {
return $this->include('assets/css/error.css');
}

return $this->include('assets/css/exception.css');
}

public static function isDebug(RequestStack $requestStack, bool $debug): \Closure
{
return static function () use ($requestStack, $debug): bool {
if (!$request = $requestStack->getCurrentRequest()) {
return $debug;
}

return $debug && $request->attributes->getBoolean('showException', true);
};
}

public static function getAndCleanOutputBuffer(RequestStack $requestStack): \Closure
{
return static function () use ($requestStack): string {
if (!$request = $requestStack->getCurrentRequest()) {
return '';
}

$startObLevel = $request->headers->get('X-Php-Ob-Level', -1);

if (ob_get_level() <= $startObLevel) {
return '';
}

Response::closeOutputBuffers($startObLevel + 1, true);

return ob_get_clean();
};
}

private function renderException(FlattenException $exception, string $debugTemplate = 'views/exception_full.html.php'): string
{
$debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception);
$statusText = $this->escape($exception->getStatusText());
$statusCode = $this->escape($exception->getStatusCode());

if (!$debug) {
return $this->include(self::$template, [
'statusText' => $statusText,
'statusCode' => $statusCode,
]);
}

$exceptionMessage = $this->escape($exception->getMessage());

return $this->include($debugTemplate, [
'exception' => $exception,
'exceptionMessage' => $exceptionMessage,
'statusText' => $statusText,
'statusCode' => $statusCode,
'logger' => null !== $this->logger && class_exists(DebugLoggerConfigurator::class) ? DebugLoggerConfigurator::getDebugLogger($this->logger) : null,
'currentContent' => \is_string($this->outputBuffer) ? $this->outputBuffer : ($this->outputBuffer)(),
]);
}

private function dumpValue(Data $value): string
{
$dumper = new HtmlDumper();
$dumper->setTheme('light');

return $dumper->dump($value, true);
}

private function formatArgs(array $args): string
{
$result = [];
foreach ($args as $key => $item) {
if ('object' === $item[0]) {
$formattedValue = \sprintf('<em>object</em>(%s)', $this->abbrClass($item[1]));
} elseif ('array' === $item[0]) {
$formattedValue = \sprintf('<em>array</em>(%s)', \is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
} elseif ('null' === $item[0]) {
$formattedValue = '<em>null</em>';
} elseif ('boolean' === $item[0]) {
$formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
} elseif ('resource' === $item[0]) {
$formattedValue = '<em>resource</em>';
} elseif (preg_match('/[^\x07-\x0D\x1B\x20-\xFF]/', $item[1])) {
$formattedValue = '<em>binary string</em>';
} else {
$formattedValue = str_replace("\n", '', $this->escape(var_export($item[1], true)));
}

$result[] = \is_int($key) ? $formattedValue : \sprintf("'%s' => %s", $this->escape($key), $formattedValue);
}

return implode(', ', $result);
}

private function formatArgsAsText(array $args): string
{
return strip_tags($this->formatArgs($args));
}

private function escape(string $string): string
{
return htmlspecialchars($string, \ENT_COMPAT | \ENT_SUBSTITUTE, $this->charset);
}

private function abbrClass(string $class): string
{
$parts = explode('\\', $class);
$short = array_pop($parts);

return \sprintf('<abbr title="%s">%s</abbr>', $class, $short);
}

private function getFileRelative(string $file): ?string
{
$file = str_replace('\\', '/', $file);

if (null !== $this->projectDir && str_starts_with($file, $this->projectDir)) {
return ltrim(substr($file, \strlen($this->projectDir)), '/');
}

return null;
}








private function formatFile(string $file, int $line, ?string $text = null): string
{
$file = trim($file);

if (null === $text) {
$text = $file;
if (null !== $rel = $this->getFileRelative($text)) {
$rel = explode('/', $rel, 2);
$text = \sprintf('<abbr title="%s%2$s">%s</abbr>%s', $this->projectDir, $rel[0], '/'.($rel[1] ?? ''));
}
}

if (0 < $line) {
$text .= ' at line '.$line;
}

if (!file_exists($file)) {
return $text;
}

$link = $this->fileLinkFormat->format($file, $line);

return \sprintf('<a href="%s" title="Click to open this file" class="file_link">%s</a>', $this->escape($link), $text);
}








private function fileExcerpt(string $file, int $line, int $srcContext = 3): string
{
if (is_file($file) && is_readable($file)) {


$code = @highlight_file($file, true);
if (\PHP_VERSION_ID >= 80300) {

$code = preg_replace('#^<pre.*?>\s*<code.*?>(.*)</code>\s*</pre>#s', '\\1', $code);

$code = preg_replace_callback('#<span ([^>]++)>((?:[^<\\n]*+\\n)++[^<]*+)</span>#', function ($m) {
return "<span $m[1]>".str_replace("\n", "</span>\n<span $m[1]>", $m[2]).'</span>';
}, $code);
$content = explode("\n", $code);
} else {

$code = preg_replace('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s', '\\1', $code);

$code = preg_replace_callback('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span>#', fn ($m) => "<span $m[1]>".str_replace('<br />', "</span><br /><span $m[1]>", $m[2]).'</span>', $code);
$content = explode('<br />', $code);
}

$lines = [];
if (0 > $srcContext) {
$srcContext = \count($content);
}

for ($i = max($line - $srcContext, 1), $max = min($line + $srcContext, \count($content)); $i <= $max; ++$i) {
$lines[] = '<li'.($i == $line ? ' class="selected"' : '').'><code>'.$this->fixCodeMarkup($content[$i - 1]).'</code></li>';
}

return '<ol start="'.max($line - $srcContext, 1).'">'.implode("\n", $lines).'</ol>';
}

return '';
}

private function fixCodeMarkup(string $line): string
{

$opening = strpos($line, '<span');
$closing = strpos($line, '</span>');
if (false !== $closing && (false === $opening || $closing < $opening)) {
$line = substr_replace($line, '', $closing, 7);
}


$opening = strrpos($line, '<span');
$closing = strrpos($line, '</span>');
if (false !== $opening && (false === $closing || $closing < $opening)) {
$line .= '</span>';
}

return trim($line);
}

private function formatFileFromText(string $text): string
{
return preg_replace_callback('/in ("|&quot;)?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', fn ($match) => 'in '.$this->formatFile($match[2], $match[3]), $text) ?? $text;
}

private function formatLogMessage(string $message, array $context): string
{
if ($context && str_contains($message, '{')) {
$replacements = [];
foreach ($context as $key => $val) {
if (\is_scalar($val)) {
$replacements['{'.$key.'}'] = $val;
}
}

if ($replacements) {
$message = strtr($message, $replacements);
}
}

return $this->escape($message);
}

private function addElementToGhost(): string
{
if (!isset(self::GHOST_ADDONS[date('m-d')])) {
return '';
}

return '<path d="'.self::GHOST_ADDONS[date('m-d')].'" fill="#fff" fill-opacity="0.6"></path>';
}

private function include(string $name, array $context = []): string
{
extract($context, \EXTR_SKIP);
ob_start();

include is_file(\dirname(__DIR__).'/Resources/'.$name) ? \dirname(__DIR__).'/Resources/'.$name : $name;

return trim(ob_get_clean());
}






public static function setTemplate(string $template): void
{
self::$template = $template;
}
}
<?php










namespace Symfony\Component\ErrorHandler\ErrorRenderer;

use Symfony\Component\ErrorHandler\Exception\FlattenException;






interface ErrorRendererInterface
{
public const IDE_LINK_FORMATS = [
'textmate' => 'txmt://open?url=file://%f&line=%l',
'macvim' => 'mvim://open?url=file://%f&line=%l',
'emacs' => 'emacs://open?url=file://%f&line=%l',
'sublime' => 'subl://open?url=file://%f&line=%l',
'phpstorm' => 'phpstorm://open?file=%f&line=%l',
'atom' => 'atom://core/open/file?filename=%f&line=%l',
'vscode' => 'vscode://file/%f:%l',
];




public function render(\Throwable $exception): FlattenException;
}
<?php










namespace Symfony\Component\ErrorHandler;

use Psr\Log\AbstractLogger;






class BufferingLogger extends AbstractLogger
{
private array $logs = [];

public function log($level, $message, array $context = []): void
{
$this->logs[] = [$level, $message, $context];
}

public function cleanLogs(): array
{
$logs = $this->logs;
$this->logs = [];

return $logs;
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
foreach ($this->logs as [$level, $message, $context]) {
if (str_contains($message, '{')) {
foreach ($context as $key => $val) {
if (null === $val || \is_scalar($val) || $val instanceof \Stringable) {
$message = str_replace("{{$key}}", $val, $message);
} elseif ($val instanceof \DateTimeInterface) {
$message = str_replace("{{$key}}", $val->format(\DateTimeInterface::RFC3339), $message);
} elseif (\is_object($val)) {
$message = str_replace("{{$key}}", '[object '.get_debug_type($val).']', $message);
} else {
$message = str_replace("{{$key}}", '['.\gettype($val).']', $message);
}
}
}

error_log(\sprintf('%s [%s] %s', date(\DateTimeInterface::RFC3339), $level, $message));
}
}
}
<table class="logs" data-filter-level="Emergency,Alert,Critical,Error,Warning,Notice,Info,Debug" data-filters>
<?php $channelIsDefined = isset($logs[0]['channel']); ?>
    <thead>
        <tr>
            <th data-filter="level">Level</th>
            <?php if ($channelIsDefined) { ?><th data-filter="channel">Channel</th><?php } ?>
            <th class="full-width">Message</th>
        </tr>
    </thead>

    <tbody>
    <?php
 foreach ($logs as $log) {
if ($log['priority'] >= 400) {
$status = 'error';
} elseif ($log['priority'] >= 300) {
$status = 'warning';
} else {
$severity = 0;
if (($exception = $log['context']['exception'] ?? null) instanceof \ErrorException || $exception instanceof \Symfony\Component\ErrorHandler\Exception\SilencedErrorContext) {
$severity = $exception->getSeverity();
}
$status = \E_DEPRECATED === $severity || \E_USER_DEPRECATED === $severity ? 'warning' : 'normal';
} ?>
        <tr class="status-<?= $status; ?>" data-filter-level="<?= strtolower($this->escape($log['priorityName'])); ?>"<?php if ($channelIsDefined) { ?> data-filter-channel="<?= $this->escape($log['channel']); ?>"<?php } ?>>
            <td class="text-small nowrap">
                <span class="colored text-bold"><?= $this->escape($log['priorityName']); ?></span>
                <span class="text-muted newline"><?= date('H:i:s', $log['timestamp']); ?></span>
            </td>
            <?php if ($channelIsDefined) { ?>
            <td class="text-small text-bold nowrap">
                <?= $this->escape($log['channel']); ?>
            </td>
            <?php } ?>
            <td>
                <?= $this->formatLogMessage($log['message'], $log['context']); ?>
                <?php if ($log['context']) { ?>
                <pre class="text-muted prewrap m-t-5"><?= $this->escape(json_encode($log['context'], \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)); ?></pre>
                <?php } ?>
            </td>
        </tr>
    <?php
 } ?>
    </tbody>
</table>
<table class="trace trace-as-text">
    <thead class="trace-head">
        <tr>
            <th class="sf-toggle" data-toggle-selector="#trace-text-<?= $index; ?>" data-toggle-initial="<?= 1 === $index ? 'display' : ''; ?>">
                <div class="trace-class">
                    <?php if ($numExceptions > 1) { ?>
                        <span class="text-muted">[<?= $numExceptions - $index + 1; ?>/<?= $numExceptions; ?>]</span>
                    <?php } ?>
                    <?= ($parts = explode('\\', $exception['class'])) ? end($parts) : ''; ?>
                    <span class="icon icon-close"><?= $this->include('assets/images/icon-minus-square-o.svg'); ?></span>
                    <span class="icon icon-open"><?= $this->include('assets/images/icon-plus-square-o.svg'); ?></span>
                </div>
            </th>
        </tr>
    </thead>

    <tbody id="trace-text-<?= $index; ?>">
        <tr>
            <td>
                <?php if ($exception['trace']) { ?>
                <pre class="stacktrace">
<?php
 echo $this->escape($exception['class']).":\n";
if ($exception['message']) {
echo $this->escape($exception['message'])."\n";
}

foreach ($exception['trace'] as $trace) {
echo "\n  ";
if ($trace['function']) {
echo $this->escape('at '.$trace['class'].$trace['type'].$trace['function']).'('.(isset($trace['args']) ? $this->formatArgsAsText($trace['args']) : '').')';
}
if ($trace['file'] && $trace['line']) {
echo($trace['function'] ? "\n     (" : 'at ').strtr(strip_tags($this->formatFile($trace['file'], $trace['line'])), [' at line '.$trace['line'] => '']).':'.$trace['line'].($trace['function'] ? ')' : '');
}
}
?>
                </pre>
                <?php } ?>
            </td>
        </tr>
    </tbody>
</table>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="<?= $this->charset; ?>" />
    <meta name="robots" content="noindex,nofollow,noarchive" />
    <title>An Error Occurred: <?= $statusText; ?></title>
    <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>❌</text></svg>" />
    <style><?= $this->include('assets/css/error.css'); ?></style>
</head>
<body>
<div class="container">
    <h1>Oops! An Error Occurred</h1>
    <h2>The server returned a "<?= $statusCode; ?> <?= $statusText; ?>".</h2>

    <p>
        Something is broken. Please let us know what you were doing when this error occurred.
        We will fix it as soon as possible. Sorry for any inconvenience caused.
    </p>
</div>
</body>
</html>
<div class="exception-summary <?= !$exceptionMessage ? 'exception-without-message' : ''; ?>">
    <div class="exception-metadata">
        <div class="container">
            <h2 class="exception-hierarchy">
                <?php foreach (array_reverse($exception->getAllPrevious(), true) as $index => $previousException) { ?>
                    <a href="#trace-box-<?= $index + 2; ?>"><?= $this->abbrClass($previousException->getClass()); ?></a>
                    <span class="icon"><?= $this->include('assets/images/chevron-right.svg'); ?></span>
                <?php } ?>
                <a href="#trace-box-1"><?= $this->abbrClass($exception->getClass()); ?></a>
            </h2>
            <h2 class="exception-http">
                HTTP <?= $statusCode; ?> <small><?= $statusText; ?></small>
            </h2>
        </div>
    </div>
    <div class="exception-message-wrapper">
        <div class="container">
            <h1 class="break-long-words exception-message<?= mb_strlen($exceptionMessage) > 180 ? ' long' : ''; ?>"><?= $this->formatFileFromText(nl2br($exceptionMessage)); ?></h1>

            <div class="exception-illustration hidden-xs-down">
                <?= $this->include('assets/images/symfony-ghost.svg.php'); ?>
            </div>
        </div>
    </div>
</div>

<div class="container">
    <div class="sf-tabs">
        <div class="tab">
            <?php
 $exceptionAsArray = $exception->toArray();
$exceptionWithUserCode = [];
$exceptionAsArrayCount = count($exceptionAsArray);
$last = $exceptionAsArrayCount - 1;
foreach ($exceptionAsArray as $i => $e) {
foreach ($e['trace'] as $trace) {
if ($trace['file'] && !str_contains($trace['file'], '/vendor/') && !str_contains($trace['file'], '/var/cache/') && $i < $last) {
$exceptionWithUserCode[] = $i;
}
}
}
?>
            <h3 class="tab-title">
                <?php if ($exceptionAsArrayCount > 1) { ?>
                    Exceptions <span class="badge"><?= $exceptionAsArrayCount; ?></span>
                <?php } else { ?>
                    Exception
                <?php } ?>
            </h3>

            <div class="tab-content">
                <?php
 foreach ($exceptionAsArray as $i => $e) {
echo $this->include('views/traces.html.php', [
'exception' => $e,
'index' => $i + 1,
'expand' => in_array($i, $exceptionWithUserCode, true) || ([] === $exceptionWithUserCode && 0 === $i),
]);
}
?>
            </div>
        </div>

        <?php if ($logger) { ?>
        <div class="tab <?= !$logger->getLogs() ? 'disabled' : ''; ?>">
            <h3 class="tab-title">
                Logs
                <?php if ($logger->countErrors()) { ?><span class="badge status-error"><?= $logger->countErrors(); ?></span><?php } ?>
            </h3>

            <div class="tab-content">
                <?php if ($logger->getLogs()) { ?>
                    <?= $this->include('views/logs.html.php', ['logs' => $logger->getLogs()]); ?>
                <?php } else { ?>
                    <div class="empty">
                        <p>No log messages</p>
                    </div>
                <?php } ?>
            </div>
        </div>
        <?php } ?>

        <div class="tab">
            <h3 class="tab-title">
                <?php if ($exceptionAsArrayCount > 1) { ?>
                    Stack Traces <span class="badge"><?= $exceptionAsArrayCount; ?></span>
                <?php } else { ?>
                    Stack Trace
                <?php } ?>
            </h3>

            <div class="tab-content">
                <?php
 foreach ($exceptionAsArray as $i => $e) {
echo $this->include('views/traces_text.html.php', [
'exception' => $e,
'index' => $i + 1,
'numExceptions' => $exceptionAsArrayCount,
]);
}
?>
            </div>
        </div>

        <?php if ($currentContent) { ?>
        <div class="tab">
            <h3 class="tab-title">Output content</h3>

            <div class="tab-content">
                <?= $currentContent; ?>
            </div>
        </div>
        <?php } ?>
    </div>
</div>
<div class="trace trace-as-html" id="trace-box-<?= $index; ?>">
    <div class="trace-details">
        <div class="trace-head">
            <div class="sf-toggle" data-toggle-selector="#trace-html-<?= $index; ?>" data-toggle-initial="<?= $expand ? 'display' : ''; ?>">
                <span class="icon icon-close"><?= $this->include('assets/images/icon-minus-square-o.svg'); ?></span>
                <span class="icon icon-open"><?= $this->include('assets/images/icon-plus-square-o.svg'); ?></span>
                <?php
 $separator = strrpos($exception['class'], '\\');
$separator = false === $separator ? 0 : $separator + 1;

$namespace = substr($exception['class'], 0, $separator);
$class = substr($exception['class'], $separator);
?>
                <?php if ('' === $class) { ?>
                    <br>
                <?php } else { ?>
                    <h3 class="trace-class">
                        <?php if ('' !== $namespace) { ?>
                            <span class="trace-namespace"><?= $namespace; ?></span>
                        <?php } ?>
                        <?= $class; ?>
                    </h3>
                <?php } ?>
                <?php if ($exception['message'] && $index > 1) { ?>
                    <p class="break-long-words trace-message"><?= $this->escape($exception['message']); ?></p>
                <?php } ?>
            </div>
            <?php if (\count($exception['data'] ?? [])) { ?>
                <details class="exception-properties-wrapper">
                    <summary>Show exception properties</summary>
                    <div class="exception-properties">
                        <?= $this->dumpValue($exception['data']) ?>
                    </div>
                </details>
            <?php } ?>
        </div>

        <div id="trace-html-<?= $index; ?>" class="sf-toggle-content">
        <?php
 $isFirstUserCode = true;
foreach ($exception['trace'] as $i => $trace) {
$isVendorTrace = $trace['file'] && (str_contains($trace['file'], '/vendor/') || str_contains($trace['file'], '/var/cache/'));
$displayCodeSnippet = $isFirstUserCode && !$isVendorTrace;
if ($displayCodeSnippet) {
$isFirstUserCode = false;
} ?>
            <div class="trace-line <?= $isVendorTrace ? 'trace-from-vendor' : ''; ?>">
                <?= $this->include('views/trace.html.php', [
'prefix' => $index,
'i' => $i,
'trace' => $trace,
'style' => $isVendorTrace ? 'compact' : ($displayCodeSnippet ? 'expanded' : ''),
]); ?>
            </div>
            <?php
 } ?>
        </div>
    </div>
</div>
<!-- <?= $_message = \sprintf('%s (%d %s)', $exceptionMessage, $statusCode, $statusText); ?> -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="<?= $this->charset; ?>" />
        <meta name="robots" content="noindex,nofollow" />
        <meta name="viewport" content="width=device-width,initial-scale=1" />
        <title><?= $_message; ?></title>
        <link rel="icon" type="image/png" href="<?= $this->include('assets/images/favicon.png.base64'); ?>" />
        <style><?= $this->include('assets/css/exception.css'); ?></style>
        <style><?= $this->include('assets/css/exception_full.css'); ?></style>
    </head>
    <body>
        <script>
            document.body.classList.add(
                localStorage.getItem('symfony/profiler/theme') || (matchMedia('(prefers-color-scheme: dark)').matches ? 'theme-dark' : 'theme-light')
            );
        </script>

        <?php if (class_exists(\Symfony\Component\HttpKernel\Kernel::class)) { ?>
            <header>
                <div class="container">
                    <h1 class="logo"><?= $this->include('assets/images/symfony-logo.svg'); ?> Symfony Exception</h1>

                    <div class="help-link">
                        <a href="https://symfony.com/doc/<?= Symfony\Component\HttpKernel\Kernel::VERSION; ?>/index.html">
                            <span class="icon"><?= $this->include('assets/images/icon-book.svg'); ?></span>
                            <span class="hidden-xs-down">Symfony</span> Docs
                        </a>
                    </div>
                </div>
            </header>
        <?php } ?>

        <?= $this->include('views/exception.html.php', $context); ?>

        <script>
            <?= $this->include('assets/js/exception.js'); ?>
        </script>
    </body>
</html>
<!-- <?= $_message; ?> -->
<div class="trace-line-header break-long-words <?= $trace['file'] ? 'sf-toggle' : ''; ?>" data-toggle-selector="#trace-html-<?= $prefix; ?>-<?= $i; ?>" data-toggle-initial="<?= 'expanded' === $style ? 'display' : ''; ?>">
    <?php if ($trace['file']) { ?>
        <span class="icon icon-close"><?= $this->include('assets/images/icon-minus-square.svg'); ?></span>
        <span class="icon icon-open"><?= $this->include('assets/images/icon-plus-square.svg'); ?></span>
    <?php } ?>

    <?php if ('compact' !== $style && $trace['function']) { ?>
        <span class="trace-class"><?= $this->abbrClass($trace['class']); ?></span><?php if ($trace['type']) { ?><span class="trace-type"><?= $trace['type']; ?></span><?php } ?><span class="trace-method"><?= $trace['function']; ?></span><?php if (isset($trace['args'])) { ?><span class="trace-arguments">(<?= $this->formatArgs($trace['args']); ?>)</span><?php } ?>
    <?php } ?>

    <?php if ($trace['file']) { ?>
        <?php
 $lineNumber = $trace['line'] ?: 1;
$fileLink = $this->fileLinkFormat->format($trace['file'], $lineNumber);
$filePath = strtr(strip_tags($this->formatFile($trace['file'], $lineNumber)), [' at line '.$lineNumber => '']);
$filePathParts = explode(\DIRECTORY_SEPARATOR, $filePath);
?>
        <span class="block trace-file-path">
            in
            <a href="<?= $fileLink; ?>">
                <?= implode(\DIRECTORY_SEPARATOR, array_slice($filePathParts, 0, -1)).\DIRECTORY_SEPARATOR; ?><strong><?= end($filePathParts); ?></strong>
            </a>
            <?php if ('compact' === $style && $trace['function']) { ?>
                <span class="trace-type"><?= $trace['type']; ?></span>
                <span class="trace-method"><?= $trace['function']; ?></span>
            <?php } ?>
            (line <?= $lineNumber; ?>)
            <span class="icon icon-copy hidden" data-clipboard-text="<?php echo implode(\DIRECTORY_SEPARATOR, $filePathParts).':'.$lineNumber; ?>">
                <?php echo $this->include('assets/images/icon-copy.svg'); ?>
            </span>
        </span>
    <?php } ?>
</div>
<?php if ($trace['file']) { ?>
    <div id="trace-html-<?= $prefix.'-'.$i; ?>" class="trace-code sf-toggle-content">
        <?= strtr($this->fileExcerpt($trace['file'], $trace['line'], 5), [
'#DD0000' => 'var(--highlight-string)',
'#007700' => 'var(--highlight-keyword)',
'#0000BB' => 'var(--highlight-default)',
'#FF8000' => 'var(--highlight-comment)',
]); ?>
    </div>
<?php } ?>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M1703 478q40 57 18 129l-275 906q-19 64-76.5 107.5T1247 1664H324q-77 0-148.5-53.5T76 1479q-24-67-2-127 0-4 3-27t4-37q1-8-3-21.5t-3-19.5q2-11 8-21t16.5-23.5T116 1179q23-38 45-91.5t30-91.5q3-10 .5-30t-.5-28q3-11 17-28t17-23q21-36 42-92t25-90q1-9-2.5-32t.5-28q4-13 22-30.5t22-22.5q19-26 42.5-84.5T404 411q1-8-3-25.5t-2-26.5q2-8 9-18t18-23 17-21q8-12 16.5-30.5t15-35 16-36 19.5-32 26.5-23.5 36-11.5T620 134l-1 3q38-9 51-9h761q74 0 114 56t18 130l-274 906q-36 119-71.5 153.5T1089 1408H220q-27 0-38 15-11 16-1 43 24 70 144 70h923q29 0 56-15.5t35-41.5l300-987q7-22 5-57 38 15 59 43zm-1064 2q-4 13 2 22.5t20 9.5h608q13 0 25.5-9.5T1311 480l21-64q4-13-2-22.5t-20-9.5H702q-13 0-25.5 9.5T660 416zm-83 256q-4 13 2 22.5t20 9.5h608q13 0 25.5-9.5T1228 736l21-64q4-13-2-22.5t-20-9.5H619q-13 0-25.5 9.5T577 672z"/></svg>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M896 0q182 0 348 71t286 191 191 286 71 348-71 348-191 286-286 191-348 71-348-71-286-191-191-286T0 896t71-348 191-286T548 71 896 0zm0 128q-190 0-361 90l194 194q82-28 167-28t167 28l194-194q-171-90-361-90zM218 1257l194-194q-28-82-28-167t28-167L218 535q-90 171-90 361t90 361zm678 407q190 0 361-90l-194-194q-82 28-167 28t-167-28l-194 194q171 90 361 90zm0-384q159 0 271.5-112.5T1280 896t-112.5-271.5T896 512 624.5 624.5 512 896t112.5 271.5T896 1280zm484-217l194 194q90-171 90-361t-90-361l-194 194q28 82 28 167t-28 167z"/></svg>
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAADVUlEQVRIx82XX0jTURTHLYPyqZdefQx66CEo80+aYpoIkqzUikz6Z5klQoWUWYRIJYEUGpQ+lIr9U5dOTLdCtkmWZis3rbnC5fw/neYW002307mX/cZvP3/7o1PwwOdh95x7vnf39zvnd29AgBer2xO6DclAXiMqZAqxIiNIN/IYSUS2BPhjmGATchUxI+ADWiRhpWK7HKuHFVBFdmU5YvnI4grFGCaReF/EBH4KsZlGgj2JBTuCYBWRIYF8YoEOJ6wBt/gEs7mBbyOjQXruPLSdOgPCiEiPSUUHDoL8Ug5IUo9B/d5wrt+G7OAKNrODPuVdB6vRCIzN6SdBlpW9RIgk/1FeAXabzRlrUPVCS/JhbmwudztnGeeH9AyXBIwtmM3wLinZJZHifjHw2V+NBoRh+9ixQrbgbnaSIcl7cGea6hoXQbNe7za241oeO5Z0p42M4BV2EqP2D50wo+6HzvwC6C4sApNOR8cmOrtcnhtj2kYRyC9eBvXzKrBZrXSs72kFd1t3MoKVbMekQkEnSNKOO8fac3LpmK6l1TlGtsxmsdKFsecPYgwxst0cwROMYDXboSotg0WLBRqjY51jLYcENElXwW2XJKPydvoI2GN9T8rBtrAArYIUruBJXkFheCQYlCpQP6uk5dAQFQNaUROMSGVQFxLmkoQsxDJrhLbTZ+nvVsERME9MgPJRKV/58AsyomTSzE813WLFvWK++qI0xSfQl8k8Pg46sYRuv5t6dS+4RqxDwaa4BGjYH+NTQvKScIp9+YL/hoZh3jDtLRHtt2C3g6bmhX+CpsFBWg7ilDSPgj0lD2ncr5ev/BP8VvyAJhqVyZeUhPOrEhEFxgEtjft846Z/guQTNT89Q5P9flMLoth4F7808wKtWWKzAwNQHxrh/1vaid2F+XpYTSbQf1XA2McOmOpROnvpvMEA4tSjq1cW0sws2gCYxswY6TKkvzYnJq1NHZLnRU4BX+4U0uburvusu8Kv8iHY7qefkM4IFngJHEOUXmLEPgiGsI8YnlZILit3vSSLRTQe/MPIZva5pshNIEmyFQlCvruJKXPkCEfmePzkphXHdzZNQdoRI9KPlBAxlj/I8U97ERPS5bjGbWDFbEdqHVe5caTBeZZx2H/IMvzeN15yoQAAAABJRU5ErkJggg==
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45L531 45q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/></svg>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1344 800v64q0 14-9 23t-23 9H960v352q0 14-9 23t-23 9h-64q-14 0-23-9t-9-23V896H480q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h352V416q0-14 9-23t23-9h64q14 0 23 9t9 23v352h352q14 0 23 9t9 23zm128 448V416q0-66-47-113t-113-47H480q-66 0-113 47t-47 113v832q0 66 47 113t113 47h832q66 0 113-47t47-113zm128-832v832q0 119-84.5 203.5T1312 1536H480q-119 0-203.5-84.5T192 1248V416q0-119 84.5-203.5T480 128h832q119 0 203.5 84.5T1600 416z"/></svg>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1408 960V832q0-26-19-45t-45-19H448q-26 0-45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45-19t19-45zm256-544v960q0 119-84.5 203.5T1376 1664H416q-119 0-203.5-84.5T128 1376V416q0-119 84.5-203.5T416 128h960q119 0 203.5 84.5T1664 416z"/></svg>
<svg viewBox="0 0 136 81" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.4"><path d="M92.4 20.4a23.2 23.2 0 0 1 9 1.9 23.7 23.7 0 0 1 5.2 3 24.3 24.3 0 0 1 3.4 3.4 24.8 24.8 0 0 1 5 9.4c.5 1.7.8 3.4 1 5.2v14.5h.4l.5.2a7.4 7.4 0 0 0 2.5.2l.2-.2.6-.8.8-1.3-.2-.1a5.5 5.5 0 0 1-.8-.3 5.6 5.6 0 0 1-2.3-1.8 5.7 5.7 0 0 1-.9-1.6 6.5 6.5 0 0 1-.2-2.8 7.3 7.3 0 0 1 .5-2l.3-.3.8-.9.3-.3c.2-.2.5-.3.8-.3H120.7c.2 0 .3-.1.4 0h.4l.2.1.3.2.2-.4.3-.4.1-.1 1.2-1 .3-.2.4-.1.4-.1h.3l1.5.1.4.1.8.5.1.2 1 1.1v.2H129.4l.4-.2 1.4-.5h1.1c.3 0 .7.2 1 .4.2 0 .3.2.5.3l.2.2.5.3.4.6.1.3.4 1.4.1.4v.6a7.8 7.8 0 0 1-.1.6 9.9 9.9 0 0 1-.8 2.4 7.8 7.8 0 0 1-3 3.3 6.4 6.4 0 0 1-1 .5 6.1 6.1 0 0 1-.6.2l-.7.1h-.1a23.4 23.4 0 0 1-.2 1.7 14.3 14.3 0 0 1-.6 2.1l-.8 2a9.2 9.2 0 0 1-.4.6l-.7 1a9.1 9.1 0 0 1-2.3 2.2c-.9.5-2 .6-3 .7l-1.4.1h-.5l-.4.1a15.8 15.8 0 0 1-2.8-.1v4.2a9.7 9.7 0 0 1-.7 3.5 9.6 9.6 0 0 1-1.7 2.8 9.3 9.3 0 0 1-3 2.3 9 9 0 0 1-5.4.7 9 9 0 0 1-3-1 9.4 9.4 0 0 1-2.7-2.5 10 10 0 0 1-1 1.2 9.3 9.3 0 0 1-2 1.3 9 9 0 0 1-2.4 1 9 9 0 0 1-6.5-1.1A9.4 9.4 0 0 1 85 77V77a10.9 10.9 0 0 1-.6.6 9.3 9.3 0 0 1-2.7 2 9 9 0 0 1-6 .8 9 9 0 0 1-2.4-1 9.3 9.3 0 0 1-2.3-1.7 9.6 9.6 0 0 1-1.8-2.8 9.7 9.7 0 0 1-.8-3.7v-4a18.5 18.5 0 0 1-2.9.2l-1.2-.1c-1.9-.3-3.7-1-5.1-2.2a8.2 8.2 0 0 1-1.1-1 10.2 10.2 0 0 1-.9-1.2 15.3 15.3 0 0 1-.7-1.3 20.8 20.8 0 0 1-1.9-6.2v-.2a6.5 6.5 0 0 1-1-.3 6.1 6.1 0 0 1-.6-.3 6.6 6.6 0 0 1-.9-.6 8.2 8.2 0 0 1-2.7-3.7 10 10 0 0 1-.3-1 10.3 10.3 0 0 1-.3-1.9V47v-.4l.1-.4.6-1.4.1-.2a2 2 0 0 1 .8-.8l.3-.2.3-.2a3.2 3.2 0 0 1 1.8-.5h.4l.3.2 1.4.6.2.2.4.3.3.4.7-.7.2-.2.4-.2.6-.2h2.1l.4.2.4.2.3.2.8 1 .2-.1h.1v-.1H63l1.1.1h.3l.8.5.3.4.7 1 .2.3.1.5a11 11 0 0 1 .2 1.5c0 .8 0 1.6-.3 2.3a6 6 0 0 1-.5 1.2 5.5 5.5 0 0 1-3.3 2.5 12.3 12.3 0 0 0 1.4 3h.1l.2.1 1 .2h1.5l.5-.2H67.8l.5-.2h.1V44v-.4a26.7 26.7 0 0 1 .3-2.3 24.7 24.7 0 0 1 5.7-12.5 24.2 24.2 0 0 1 3.5-3.3 23.7 23.7 0 0 1 4.9-3 23.2 23.2 0 0 1 5.6-1.7 23.7 23.7 0 0 1 4-.3zm-.3 2a21.2 21.2 0 0 0-8 1.7 21.6 21.6 0 0 0-4.8 2.7 22.2 22.2 0 0 0-3.2 3 22.7 22.7 0 0 0-5 9.2 23.4 23.4 0 0 0-.7 4.9v15.7l-.5.1a34.3 34.3 0 0 1-1.5.3h-.2l-.4.1h-.4l-.9.2a10 10 0 0 1-1.9 0c-.5 0-1-.2-1.5-.4a1.8 1.8 0 0 1-.3-.2 2 2 0 0 1-.3-.3 5.2 5.2 0 0 1-.1-.2 9 9 0 0 1-.6-.9 13.8 13.8 0 0 1-1-2 14.3 14.3 0 0 1-.6-2 14 14 0 0 1-.1-.8v-.2h.3a12.8 12.8 0 0 0 1.4-.2 4.4 4.4 0 0 0 .3 0 3.6 3.6 0 0 0 1.1-.7 3.4 3.4 0 0 0 1.2-1.7l.2-1.2a5.1 5.1 0 0 0 0-.8 7.2 7.2 0 0 0-.1-.8l-.7-1-1.2-.2-1 .7-.1 1.3a5 5 0 0 1 .1.4v.6a1 1 0 0 1 0 .3c-.1.3-.4.4-.7.5l-1.2.4v-.7A9.9 9.9 0 0 1 60 49l.3-.6v-.2l.1-.1v-1.6l-1-1.2h-1.5l-1 1.1v.4a5.3 5.3 0 0 0-.2.6 5.5 5.5 0 0 0 0 .5c0 .7 0 1.4.3 2 0 .4.2.8.4 1.2L57 51a9.5 9.5 0 0 1-1.1-.5h-.2a2 2 0 0 1-.4-.3c-.4-.4-.5-1-.6-1.6a5.6 5.6 0 0 1 0-.5v-.5-.5l-.6-1.5-1.4-.6-.9.3s-.2 0-.3.2a2 2 0 0 1-.1 0l-.6 1.4v.7a8.5 8.5 0 0 0 .5 2c.4 1.1 1 2.1 2 2.8a4.7 4.7 0 0 0 2.1.9h1a22.8 22.8 0 0 0 .1 1 18.1 18.1 0 0 0 .8 3.8 18.2 18.2 0 0 0 1.6 3.7l1 1.3c1 1 2.3 1.6 3.7 2a11.7 11.7 0 0 0 4.8 0h.4l.5-.2.5-.1.6-.2v6.6a8 8 0 0 0 .1 1.3 7.5 7.5 0 0 0 2.4 4.3 7.2 7.2 0 0 0 2.3 1.3 7 7 0 0 0 7-1.1 7.5 7.5 0 0 0 2-2.6A7.7 7.7 0 0 0 85 72V71a8.2 8.2 0 0 0 .2 1.3c0 .7.3 1.4.6 2a7.5 7.5 0 0 0 1.7 2.3 7.3 7.3 0 0 0 2.2 1.4 7.1 7.1 0 0 0 4.6.2 7.2 7.2 0 0 0 2.4-1.2 7.5 7.5 0 0 0 2.1-2.7 7.8 7.8 0 0 0 .7-2.4V71a9.3 9.3 0 0 0 .1.6 7.6 7.6 0 0 0 .6 2.5 7.5 7.5 0 0 0 2.4 3 7.1 7.1 0 0 0 7 .8 7.3 7.3 0 0 0 2.3-1.5 7.5 7.5 0 0 0 1.6-2.3 7.6 7.6 0 0 0 .5-2l.1-1.1v-6.7l.4.1a12.2 12.2 0 0 0 2 .5 11.1 11.1 0 0 0 2.5 0h.8l1.2-.1a9.5 9.5 0 0 0 1.4-.2l.9-.3a3.5 3.5 0 0 0 .6-.4l1.2-1.4a12.2 12.2 0 0 0 .8-1.2c0-.3.2-.5.3-.7a15.9 15.9 0 0 0 .7-2l.3-1.6v-1.3l.2-.9V54.6a15.5 15.5 0 0 0 1.8 0 4.5 4.5 0 0 0 1.4-.5 5.7 5.7 0 0 0 2.5-3.2 7.6 7.6 0 0 0 .4-1.5v-.3l-.4-1.4a5.2 5.2 0 0 1-.2-.1l-.4-.4a3.8 3.8 0 0 0-.2 0 1.4 1.4 0 0 0-.5-.2l-1.4.4-.7 1.3v.7a5.7 5.7 0 0 1-.1.8l-.7 1.4a1.9 1.9 0 0 1-.5.3h-.3a9.6 9.6 0 0 1-.8.3 8.8 8.8 0 0 1-.6 0l.2-.4.2-.5.2-.3v-.4l.1-.2V50l.1-1 .1-.6v-.6a4.8 4.8 0 0 0 0-.8v-.2l-1-1.1-1.5-.2-1.1 1-.2 1.4v.1l.2.4.2.3v.4l.1 1.1v.3l.1.5v.8a9.6 9.6 0 0 1-.8-.3l-.2-.1h-.3l-.8-.1h-.2a1.6 1.6 0 0 1-.2-.2.9.9 0 0 1-.2-.2 1 1 0 0 1-.1-.5l.2-.9v-1.2l-.9-.8h-1.2l-.8.9v.3a4.8 4.8 0 0 0-.3 2l.3.9a3.5 3.5 0 0 0 1.2 1.6l1 .5.8.2 1.4.1h.4l.2.1a12.1 12.1 0 0 1-1 2.6 13.2 13.2 0 0 1-.8 1.5 9.5 9.5 0 0 1-1 1.2l-.2.3a1.7 1.7 0 0 1-.4.3 2.4 2.4 0 0 1-.7.2h-2.5a7.8 7.8 0 0 1-.6-.2l-.7-.2h-.2a14.8 14.8 0 0 1-.6-.2 23.4 23.4 0 0 1-.4-.1l-.4-.1-.3-.1V43.9a34.6 34.6 0 0 0 0-.6 23.6 23.6 0 0 0-.4-3 22.7 22.7 0 0 0-1.5-4.7 22.6 22.6 0 0 0-4.6-6.7 21.9 21.9 0 0 0-6.9-4.7 21.2 21.2 0 0 0-8.1-1.8H92zm9.1 33.7l.3.1a1 1 0 0 1 .6.8v.4a8.4 8.4 0 0 1 0 .5 8.8 8.8 0 0 1-1.6 4.2l-1 1.3A10 10 0 0 1 95 66c-1.3.3-2.7.4-4 .3a10.4 10.4 0 0 1-2.7-.8 10 10 0 0 1-3.6-2.5 9.3 9.3 0 0 1-.8-1 9 9 0 0 1-.7-1.2 8.6 8.6 0 0 1-.8-3.4V57a1 1 0 0 1 .3-.6 1 1 0 0 1 1.3-.2 1 1 0 0 1 .4.8v.4a6.5 6.5 0 0 0 .5 2.2 7 7 0 0 0 2.1 2.8l1 .6c2.6 1.6 6 1.6 8.5 0a8 8 0 0 0 1.1-.6 7.6 7.6 0 0 0 1.2-1.2 7 7 0 0 0 1-1.7 6.5 6.5 0 0 0 .4-2.5 1 1 0 0 1 .7-1h.4zM30.7 43.7c-15.5 1-28.5-6-30.1-16.4C-1.2 15.7 11.6 4 29 1.3 46.6-1.7 62.3 5.5 64 17.1c1.6 10.4-8.7 21-23.7 25a31.2 31.2 0 0 0 0 .9v.3a19 19 0 0 0 .1 1l.1.4.1.9a4.7 4.7 0 0 0 .5 1l.7 1a9.2 9.2 0 0 0 1.2 1l1.5.8.6.8-.7.6-1.1.3a11.2 11.2 0 0 1-2.6.4 8.6 8.6 0 0 1-3-.5 8.5 8.5 0 0 1-1-.4 11.2 11.2 0 0 1-1.8-1.2 13.3 13.3 0 0 1-1-1 18 18 0 0 1-.7-.6l-.4-.4a23.4 23.4 0 0 1-1.3-1.8l-.1-.1-.3-.5V45l-.3-.6v-.7zM83.1 36c3.6 0 6.5 3.2 6.5 7.1 0 4-3 7.2-6.5 7.2S76.7 47 76.7 43 79.6 36 83 36zm18 0c3.6 0 6.5 3.2 6.5 7.1 0 4-2.9 7.2-6.4 7.2S94.7 47 94.7 43s3-7.1 6.5-7.1zm-18 6.1c2 0 3.5 1.6 3.5 3.6S85 49.2 83 49.2s-3.4-1.6-3.4-3.6S81.2 42 83 42zm17.9 0c1.9 0 3.4 1.6 3.4 3.6s-1.5 3.6-3.4 3.6c-2 0-3.5-1.6-3.5-3.6S99.1 42 101 42zM17 28c-.3 1.6-1.8 5-5.2 5.8-2.5.6-4.1-.8-4.5-2.6-.4-1.9.7-3.5 2.1-4.5A3.5 3.5 0 0 1 8 24.6c-.4-2 .8-3.7 3.2-4.2 1.9-.5 3.1.2 3.4 1.5.3 1.1-.5 2.2-1.8 2.5-.9.3-1.6 0-1.7-.6a1.4 1.4 0 0 1 0-.7s.3.2 1 0c.7-.1 1-.7.9-1.2-.2-.6-1-.8-1.8-.6-1 .2-2 1-1.7 2.6.3 1 .9 1.6 1.5 1.8l.7-.2c1-.2 1.5 0 1.6.5 0 .4-.2 1-1.2 1.2a3.3 3.3 0 0 1-1.5 0c-.9.7-1.6 1.9-1.3 3.2.3 1.3 1.3 2.2 3 1.8 2.5-.7 3.8-3.7 4.2-5-.3-.5-.6-1-.7-1.6-.1-.5.1-1 .9-1.2.4 0 .7.2.8.8a2.8 2.8 0 0 1 0 1l.7 1c.6-2 1.4-4 1.7-4 .6-.2 1.5.6 1.5.6-.8.7-1.7 2.4-2.3 4.2.8.6 1.6 1 2.1 1 .5-.1.8-.6 1-1.2-.3-2.2 1-4.3 2.3-4.6.7-.2 1.3.2 1.4.8.1.5 0 1.3-.9 1.7-.2-1-.6-1.3-1-1.3-.4.1-.7 1.4-.4 2.8.2 1 .7 1.5 1.3 1.4.8-.2 1.3-1.2 1.7-2.1-.3-2.1.9-4.2 2.2-4.5.7-.2 1.2.1 1.4 1 .4 1.4-1 2.8-2.2 3.4.3.7.7 1 1.3.9 1-.3 1.6-1.5 2-2.5l-.5-3v-.3s1.6-.3 1.8.6v.1c.2-.6.7-1.2 1.3-1.4.8-.1 1.5.6 1.7 1.6.5 2.2-.5 4.4-1.8 4.7H33a31.9 31.9 0 0 0 1 5.2c-.4.1-1.8.4-2-.4l-.5-5.6c-.5 1-1.3 2.2-2.5 2.4-1 .3-1.6-.3-2-1.1-.5 1-1.3 2.1-2.4 2.4-.8.2-1.5-.1-2-1-.3.8-.9 1.5-1.5 1.7-.7.1-1.5-.3-2.4-1-.3.8-.4 1.6-.4 2.2 0 0-.7 0-.8-.4-.1-.5 0-1.5.3-2.7a10.3 10.3 0 0 1-.7-.8zm38.2-17.8l.2.9c.5 1.9.4 4.4.8 6.4 0 .6-.4 3-1.4 3.3-.2 0-.3 0-.4-.4-.1-.7 0-1.6-.3-2.6-.2-1.1-.8-1.6-1.5-1.5-.8.2-1.3 1-1.6 2l-.1-.5c-.2-1-1.8-.6-1.8-.6a6.2 6.2 0 0 1 .4 1.3l.2 1c-.2.5-.6 1-1.2 1l-.2.1a7 7 0 0 0-.1-.8c-.3-1.1-1-2-1.6-1.8a.7.7 0 0 0-.4.3c-1.3.3-2.4 2-2.1 3.9-.2.9-.6 1.7-1 1.9-.5 0-.8-.5-1.1-1.8l-.1-1.2a4 4 0 0 0 0-1.7c0-.4-.4-.7-.8-.6-.7.2-.9 1.7-.5 3.8-.2 1-.6 2-1.3 2-.4.2-.8-.2-1-1l-.2-3c1.2-.5 2-1 1.8-1.7-.1-.5-.8-.7-.8-.7s0 .7-1 1.2l-.2-1.4c-.1-.6-.4-1-1.7-.6l.4 1 .2 1.5h-1v.8c0 .3.4.3 1 .2 0 1.3 0 2.7.2 3.6.3 1.4 1.2 2 2 1.7 1-.2 1.6-1.3 2-2.3.3 1.2 1 2 1.9 1.7.7-.2 1.2-1.1 1.6-2.2.4.8 1.1 1.1 2 1 1.2-.4 1.7-1.6 1.8-2.8h.2c.6-.2 1-.6 1.3-1 0 .8 0 1.5.2 2.1.1.5.3.7.6.6.5-.1 1-.9 1-.9a4 4 0 0 1-.3-1c-.3-1.3.3-3.6 1-3.7.2 0 .3.2.5.7v.8l.2 1.5v.7c.2.7.7 1.3 1.5 1 1.3-.2 2-2.6 2.1-3.9.3.2.6.2 1 .1-.6-2.2 0-6.1-.3-7.9-.1-.4-1-.5-1.7-.5h-.4zm-21.5 12c.4 0 .7.3 1 1.1.2 1.3-.3 2.6-.9 2.8-.2 0-.7 0-1-1.2v-.4c0-1.3.4-2 1-2.2zm-5.2 1c.3 0 .6.2.6.5.2.6-.3 1.3-1.2 2-.3-1.4.1-2.3.6-2.5zm18-.4c-.5.2-1-.4-1.2-1.2-.2-1 0-2.1.7-2.5v.5c.2.7.6 1.5 1.3 1.9 0 .7-.2 1.2-.7 1.3zm10-1.6c0 .5.4.7 1 .6.8-.2 1-1 .8-1.6 0-.5-.4-1-1-.8-.5.1-1 .9-.8 1.8zm-14.3-5.5c0-.4-.5-.7-1-.5-.8.2-1 1-.9 1.5.2.6.5 1 1 .8.5 0 1.1-1 1-1.8z" fill="#fff" fill-opacity=".6"/><?= $this->addElementToGhost(); ?></svg>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1408 960V832q0-26-19-45t-45-19h-320V448q0-26-19-45t-45-19H832q-26 0-45 19t-19 45v320H448q-26 0-45 19t-19 45v128q0 26 19 45t45 19h320v320q0 26 19 45t45 19h128q26 0 45-19t19-45v-320h320q26 0 45-19t19-45zm256-544v960q0 119-84.5 203.5T1376 1664H416q-119 0-203.5-84.5T128 1376V416q0-119 84.5-203.5T416 128h960q119 0 203.5 84.5T1664 416z"/></svg>
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1344 800v64q0 14-9 23t-23 9H480q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h832q14 0 23 9t9 23zm128 448V416q0-66-47-113t-113-47H480q-66 0-113 47t-47 113v832q0 66 47 113t113 47h832q66 0 113-47t47-113zm128-832v832q0 119-84.5 203.5T1312 1536H480q-119 0-203.5-84.5T192 1248V416q0-119 84.5-203.5T480 128h832q119 0 203.5 84.5T1600 416z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="#FFF" d="M12 .9C5.8.9.9 5.8.9 12a11 11 0 1 0 22.2 0A11 11 0 0 0 12 .9zm6.5 6c-.6 0-.9-.3-.9-.8 0-.2 0-.4.2-.6l.2-.4c0-.3-.5-.4-.6-.4-1.8.1-2.3 2.5-2.7 4.4l-.2 1c1 .2 1.8 0 2.2-.3.6-.4-.2-.7-.1-1.2.1-.3.5-.5.7-.6.5 0 .7.5.7.9 0 .7-1 1.8-3 1.8l-.6-.1-.6 2.4c-.4 1.6-.8 3.8-2.4 5.7-1.4 1.7-2.9 1.9-3.5 1.9-1.2 0-1.9-.6-2-1.5 0-.8.7-1.3 1.2-1.3.6 0 1.1.5 1.1 1s-.2.6-.4.6c-.1.1-.3.2-.3.4 0 .1.1.3.4.3.5 0 .8-.3 1.1-.5 1.2-.9 1.6-2.7 2.2-5.7l.1-.7.7-3.2c-.8-.6-1.3-1.4-2.4-1.7-.6-.1-1.1.1-1.5.5-.4.5-.2 1.1.2 1.5l.7.6c.7.8 1.2 1.6 1 2.5-.3 1.5-2 2.6-4 1.9-1.8-.6-2-1.8-1.8-2.5.2-.6.6-.7 1.1-.6.5.2.6.7.6 1.2l-.1.3c-.2.1-.3.3-.3.4-.1.4.4.6.7.7.7.3 1.6-.2 1.8-.8a1 1 0 0 0-.4-1.1l-.7-.8c-.4-.4-1.1-1.4-.7-2.6.1-.5.4-.9.7-1.3a4 4 0 0 1 2.8-.6c1.2.4 1.8 1.1 2.6 1.8.5-1.2 1-2.4 1.8-3.5.9-.9 1.9-1.6 3.1-1.7 1.3.2 2.2.7 2.2 1.6 0 .4-.2 1.1-.9 1.1z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>body { background-color: #fff; color: #222; font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; }
.container { margin: 30px; max-width: 600px; }
h1 { color: #dc3545; font-size: 24px; }
h2 { font-size: 18px; }
.sf-reset .traces {
    padding-bottom: 14px;
}
.sf-reset .traces li {
    font-size: 12px;
    color: #868686;
    padding: 5px 4px;
    list-style-type: decimal;
    margin-left: 20px;
}
.sf-reset #logs .traces li.error {
    font-style: normal;
    color: #AA3333;
    background: #f9ecec;
}
.sf-reset #logs .traces li.warning {
    font-style: normal;
    background: #ffcc00;
}
/* fix for Opera not liking empty <li> */
.sf-reset .traces li:after {
    content: "\00A0";
}
.sf-reset .trace {
    border: 1px solid #D3D3D3;
    padding: 10px;
    overflow: auto;
    margin: 10px 0 20px;
}
.sf-reset .block-exception {
    -moz-border-radius: 16px;
    -webkit-border-radius: 16px;
    border-radius: 16px;
    margin-bottom: 20px;
    background-color: #f6f6f6;
    border: 1px solid #dfdfdf;
    padding: 30px 28px;
    word-wrap: break-word;
    overflow: hidden;
}
.sf-reset .block-exception div {
    color: #313131;
    font-size: 10px;
}
.sf-reset .block-exception-detected .illustration-exception,
.sf-reset .block-exception-detected .text-exception {
    float: left;
}
.sf-reset .block-exception-detected .illustration-exception {
    width: 152px;
}
.sf-reset .block-exception-detected .text-exception {
    width: 670px;
    padding: 30px 44px 24px 46px;
    position: relative;
}
.sf-reset .text-exception .open-quote,
.sf-reset .text-exception .close-quote {
    font-family: Arial, Helvetica, sans-serif;
    position: absolute;
    color: #C9C9C9;
    font-size: 8em;
}
.sf-reset .open-quote {
    top: 0;
    left: 0;
}
.sf-reset .close-quote {
    bottom: -0.5em;
    right: 50px;
}
.sf-reset .block-exception p {
    font-family: Arial, Helvetica, sans-serif;
}
.sf-reset .block-exception p a,
.sf-reset .block-exception p a:hover {
    color: #565656;
}
.sf-reset .logs h2 {
    float: left;
    width: 654px;
}
.sf-reset .error-count, .sf-reset .support {
    float: right;
    width: 170px;
    text-align: right;
}
.sf-reset .error-count span {
    display: inline-block;
    background-color: #aacd4e;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 6px;
    padding: 4px;
    color: white;
    margin-right: 2px;
    font-size: 11px;
    font-weight: bold;
}

.sf-reset .support a {
    display: inline-block;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 6px;
    padding: 4px;
    color: #000000;
    margin-right: 2px;
    font-size: 11px;
    font-weight: bold;
}

.sf-reset .toggle {
    vertical-align: middle;
}
.sf-reset .linked ul,
.sf-reset .linked li {
    display: inline;
}
.sf-reset #output-content {
    color: #000;
    font-size: 12px;
}
.sf-reset #traces-text pre {
    white-space: pre;
    font-size: 12px;
    font-family: monospace;
}
/* This file is based on WebProfilerBundle/Resources/views/Profiler/profiler.css.twig.
   If you make any change in this file, verify the same change is needed in the other file. */
:root {
    --font-sans-serif: Helvetica, Arial, sans-serif;
    --page-background: #f9f9f9;
    --color-text: #222;
    /* when updating any of these colors, do the same in toolbar.css.twig */
    --color-success: #4f805d;
    --color-warning: #a46a1f;
    --color-error: #b0413e;
    --color-muted: #999;
    --tab-background: #f0f0f0;
    --tab-border-color: #e5e5e5;
    --tab-active-border-color: #d4d4d4;
    --tab-color: #444;
    --tab-active-background: #fff;
    --tab-active-color: var(--color-text);
    --tab-disabled-background: #f5f5f5;
    --tab-disabled-color: #999;
    --selected-badge-background: #e5e5e5;
    --selected-badge-color: #525252;
    --selected-badge-shadow: inset 0 0 0 1px #d4d4d4;
    --selected-badge-warning-background: #fde496;
    --selected-badge-warning-color: #785b02;
    --selected-badge-warning-shadow: inset 0 0 0 1px #e6af05;
    --selected-badge-danger-background: #FCE9ED;
    --selected-badge-danger-color: #83122A;
    --selected-badge-danger-shadow: inset 0 0 0 1px #F5B8C5;
    --metric-value-background: #fff;
    --metric-value-color: inherit;
    --metric-unit-color: #999;
    --metric-label-background: #e0e0e0;
    --metric-label-color: inherit;
    --table-border: #e0e0e0;
    --table-background: #fff;
    --table-header: #e0e0e0;
    --trace-selected-background: #F7E5A1;
    --tree-active-background: #F7E5A1;
    --exception-title-color: var(--base-2);
    --shadow: 0px 0px 1px rgba(128, 128, 128, .2);
    --border: 1px solid #e0e0e0;
    --background-error: var(--color-error);
    --highlight-comment: #969896;
    --highlight-default: #222222;
    --highlight-keyword: #a71d5d;
    --highlight-string: #183691;
    --base-0: #fff;
    --base-1: #f5f5f5;
    --base-2: #e0e0e0;
    --base-3: #ccc;
    --base-4: #666;
    --base-5: #444;
    --base-6: #222;
}

.theme-dark {
    --page-background: #36393e;
    --color-text: #e0e0e0;
    --color-muted: #777;
    --color-error: #f76864;
    --tab-background: #404040;
    --tab-border-color: #737373;
    --tab-active-border-color: #171717;
    --tab-color: var(--color-text);
    --tab-active-background: #d4d4d4;
    --tab-active-color: #262626;
    --tab-disabled-background: var(--page-background);
    --tab-disabled-color: #a3a3a3;
    --selected-badge-background: #555;
    --selected-badge-color: #ddd;
    --selected-badge-shadow: none;
    --selected-badge-warning-background: #fcd55f;
    --selected-badge-warning-color: #785b02;
    --selected-badge-warning-shadow: inset 0 0 0 1px #af8503;
    --selected-badge-danger-background: #B41939;
    --selected-badge-danger-color: #FCE9ED;
    --selected-badge-danger-shadow: none;
    --metric-value-background: #555;
    --metric-value-color: inherit;
    --metric-unit-color: #999;
    --metric-label-background: #777;
    --metric-label-color: #e0e0e0;
    --trace-selected-background: #5d5227cc;
    --table-border: #444;
    --table-background: #333;
    --table-header: #555;
    --info-background: rgba(79, 148, 195, 0.5);
    --tree-active-background: var(--metric-label-background);
    --exception-title-color: var(--base-2);
    --shadow: 0px 0px 1px rgba(32, 32, 32, .2);
    --border: 1px solid #666;
    --background-error: #b0413e;
    --highlight-comment: #dedede;
    --highlight-default: var(--base-6);
    --highlight-keyword: #de8986;
    --highlight-string: #70a6fd;
    --base-0: #2e3136;
    --base-1: #444;
    --base-2: #666;
    --base-3: #666;
    --base-4: #666;
    --base-5: #e0e0e0;
    --base-6: #f5f5f5;
    --card-label-background: var(--tab-active-background);
    --card-label-color: var(--tab-active-color);
}

html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}summary{cursor: pointer}

html {
    /* always display the vertical scrollbar to avoid jumps when toggling contents */
    overflow-y: scroll;
}
body { background-color: var(--page-background); color: var(--base-6); font: 14px/1.4 Helvetica, Arial, sans-serif; padding-bottom: 45px; }

a { cursor: pointer; text-decoration: none; }
a:hover { text-decoration: underline; }
abbr[title] { border-bottom: none; cursor: help; text-decoration: none; }

code, pre { font: 13px/1.5 Consolas, Monaco, Menlo, "Ubuntu Mono", "Liberation Mono", monospace; }

table, tr, th, td { background: var(--base-0); border-collapse: collapse; vertical-align: top; }
table { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 1em 0; width: 100%; }
table th, table td { border: solid var(--base-2); border-width: 1px 0; padding: 8px 10px; }
table th { background-color: var(--base-2); font-weight: bold; text-align: left; }

.m-t-5 { margin-top: 5px; }
.hidden-xs-down { display: none; }
.block { display: block; }
.full-width { width: 100%; }
.hidden { display: none; }
.prewrap { white-space: pre-wrap; }
.nowrap { white-space: nowrap; }
.newline { display: block; }
.break-long-words { word-wrap: break-word; overflow-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; hyphenate-character: ''; min-width: 0; }
.text-small { font-size: 12px !important; }
.text-muted { color: #999; }
.text-bold { font-weight: bold; }
.empty { border: 4px dashed var(--base-2); color: #999; margin: 1em 0; padding: .5em 2em; }

.status-success { background: rgba(94, 151, 110, 0.3); }
.status-warning { background: rgba(240, 181, 24, 0.3); }
.status-error { background: rgba(176, 65, 62, 0.2); }
.status-success td, .status-warning td, .status-error td { background: transparent; }
tr.status-error td, tr.status-warning td { border-bottom: 1px solid var(--base-2); border-top: 1px solid var(--base-2); }
.status-warning .colored { color: #A46A1F; }
.status-error .colored  { color: var(--color-error); }

.sf-toggle { cursor: pointer; position: relative; }
.sf-toggle-content { -moz-transition: display .25s ease; -webkit-transition: display .25s ease; transition: display .25s ease; }
.sf-toggle-content.sf-toggle-hidden { display: none; }
.sf-toggle-content.sf-toggle-visible { display: block; }
thead.sf-toggle-content.sf-toggle-visible, tbody.sf-toggle-content.sf-toggle-visible { display: table-row-group; }
.sf-toggle-off .icon-close, .sf-toggle-on .icon-open { display: none; }
.sf-toggle-off .icon-open, .sf-toggle-on .icon-close { display: block; }

.tab-navigation {
    background-color: var(--tab-background);
    border-radius: 6px;
    box-shadow: inset 0 0 0 1px var(--tab-border-color), 0 0 0 5px var(--page-background);
    display: inline-flex;
    flex-wrap: wrap;
    margin: 0 0 15px;
    padding: 0;
    user-select: none;
    -webkit-user-select: none;
}
.sf-tabs-sm .tab-navigation {
    box-shadow: inset 0 0 0 1px var(--tab-border-color), 0 0 0 4px var(--page-background);
    margin: 0 0 10px;
}
.tab-navigation .tab-control {
    background: transparent;
    border: 0;
    box-shadow: none;
    transition: box-shadow .05s ease-in, background-color .05s ease-in;
    cursor: pointer;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.4;
    margin: 0;
    padding: 4px 14px;
    position: relative;
    text-align: center;
    z-index: 1;
}
.sf-tabs-sm .tab-navigation .tab-control {
    font-size: 13px;
    padding: 2.5px 10px;
}
.tab-navigation .tab-control:before {
    background: var(--tab-border-color);
    bottom: 15%;
    content: "";
    left: 0;
    position: absolute;
    top: 15%;
    width: 1px;
}
.tab-navigation .tab-control:first-child:before,
.tab-navigation .tab-control.active + .tab-control:before,
.tab-navigation .tab-control.active:before {
    width: 0;
}
.tab-navigation .tab-control .badge {
    background: var(--selected-badge-background);
    box-shadow: var(--selected-badge-shadow);
    color: var(--selected-badge-color);
    display: inline-block;
    font-size: 12px;
    font-weight: bold;
    line-height: 1;
    margin-left: 8px;
    min-width: 10px;
    padding: 2px 6px;
    text-align: center;
    white-space: nowrap;
}
.tab-navigation .tab-control.disabled {
    color: var(--tab-disabled-color);
}
.tab-navigation .tab-control.active {
    background-color: var(--tab-active-background);
    border-radius: 6px;
    box-shadow: inset 0 0 0 1.5px var(--tab-active-border-color);
    color: var(--tab-active-color);
    position: relative;
    z-index: 1;
}
.theme-dark .tab-navigation li.active {
    box-shadow: inset 0 0 0 1px var(--tab-border-color);
}
.tab-content > *:first-child {
    margin-top: 0;
}
.tab-navigation .tab-control .badge.status-warning {
    background: var(--selected-badge-warning-background);
    box-shadow: var(--selected-badge-warning-shadow);
    color: var(--selected-badge-warning-color);
}
.tab-navigation .tab-control .badge.status-error {
    background: var(--selected-badge-danger-background);
    box-shadow: var(--selected-badge-danger-shadow);
    color: var(--selected-badge-danger-color);
}

.sf-tabs .tab:not(:first-child) { display: none; }

[data-filters] { position: relative; }
[data-filtered] { cursor: pointer; }
[data-filtered]:after { content: '\00a0\25BE'; }
[data-filtered]:hover .filter-list li { display: inline-flex; }
[class*="filter-hidden-"] { display: none; }
.filter-list { position: absolute; border: var(--border); box-shadow: var(--shadow); margin: 0; padding: 0; display: flex; flex-direction: column; }
.filter-list :after { content: ''; }
.filter-list li {
    background: var(--tab-disabled-background);
    border-bottom: var(--border);
    color: var(--tab-disabled-color);
    display: none;
    list-style: none;
    margin: 0;
    padding: 5px 10px;
    text-align: left;
    font-weight: normal;
}
.filter-list li.active {
    background: var(--tab-background);
    color: var(--tab-color);
}
.filter-list li.last-active {
    background: var(--tab-active-background);
    color: var(--tab-active-color);
}

.filter-list-level li { cursor: s-resize; }
.filter-list-level li.active { cursor: n-resize; }
.filter-list-level li.last-active { cursor: default; }
.filter-list-level li.last-active:before { content: '\2714\00a0'; }
.filter-list-choice li:before { content: '\2714\00a0'; color: transparent; }
.filter-list-choice li.active:before { color: unset; }

.container { max-width: 1024px; margin: 0 auto; padding: 0 15px; }
.container::after { content: ""; display: table; clear: both; }

header { background-color: #222; color: rgba(255, 255, 255, 0.75); font-size: 13px; height: 33px; line-height: 33px; padding: 0; }
header .container { display: flex; justify-content: space-between; }
.logo { flex: 1; font-size: 13px; font-weight: normal; margin: 0; padding: 0; }
.logo svg { height: 18px; width: 18px; opacity: .8; vertical-align: -5px; }

.help-link { margin-left: 15px; }
.help-link a { color: inherit; }
.help-link .icon svg { height: 15px; width: 15px; opacity: .7; vertical-align: -2px; }
.help-link a:hover { color: #EEE; text-decoration: none; }
.help-link a:hover svg { opacity: .9; }

.exception-summary { background: var(--background-error); border-bottom: 2px solid rgba(0, 0, 0, 0.1); border-top: 1px solid rgba(0, 0, 0, .3); flex: 0 0 auto; margin-bottom: 15px; }
.exception-metadata { background: rgba(0, 0, 0, 0.1); padding: 7px 0; }
.exception-metadata .container { display: flex; flex-direction: row; justify-content: space-between; }
.exception-metadata h2, .exception-metadata h2 > a { color: rgba(255, 255, 255, 0.8); font-size: 13px; font-weight: 400; margin: 0; }
.exception-http small { font-size: 13px; opacity: .7; }
.exception-hierarchy { flex: 1; }
.exception-hierarchy .icon { margin: 0 3px; opacity: .7; }
.exception-hierarchy .icon svg { height: 13px; width: 13px; vertical-align: -2px; }

.exception-without-message .exception-message-wrapper { display: none; }
.exception-message-wrapper .container { display: flex; align-items: flex-start; min-height: 70px; padding: 10px 15px 8px; }
.exception-message { flex-grow: 1; }
.exception-message, .exception-message a { color: #FFF; font-size: 21px; font-weight: 400; margin: 0; }
.exception-message.long { font-size: 18px; }
.exception-message a { border-bottom: 1px solid rgba(255, 255, 255, 0.5); font-size: inherit; text-decoration: none; }
.exception-message a:hover { border-bottom-color: #ffffff; }

.exception-properties-wrapper { margin: .8em 0; }
.exception-properties { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); }
.exception-properties pre { margin: 0; padding: 0.2em 0; }

.exception-illustration { flex-basis: 111px; flex-shrink: 0; height: 66px; margin-left: 15px; opacity: .7; }

.trace + .trace { margin-top: 30px; }
.trace-head { background-color: var(--base-2); padding: 10px; position: relative; }
.trace-head .trace-class { color: var(--base-6); font-size: 18px; font-weight: bold; line-height: 1.3; margin: 0; position: relative; }
.trace-head .trace-namespace { color: #999; display: block; font-size: 13px; }
.trace-head .icon { position: absolute; right: 0; top: 0; }
.trace-head .icon svg { fill: var(--base-5); height: 24px; width: 24px; }

.trace-details { background: var(--base-0); border: var(--border); box-shadow: 0px 0px 1px rgba(128, 128, 128, .2); margin: 0 0 1em; table-layout: fixed; }

.trace-message { font-size: 14px; font-weight: normal; margin: .5em 0 0; }

.trace-line { position: relative; padding-top: 8px; padding-bottom: 8px; }
.trace-line + .trace-line { border-top: var(--border); }
.trace-line:hover { background: var(--base-1); }
.trace-line a { color: var(--base-6); }
.trace-line .icon { opacity: .4; position: absolute; left: 10px; }
.trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; }
.trace-line .icon.icon-copy { left: auto; top: auto; padding-left: 5px; display: none }
.trace-line:hover .icon.icon-copy:not(.hidden) { display: inline-block }
.trace-line-header { padding-left: 36px; padding-right: 10px; }

.trace-file-path, .trace-file-path a { color: var(--base-6); font-size: 13px; }
.trace-class { color: var(--color-error); }
.trace-type { padding: 0 2px; }
.trace-method { color: var(--color-error); font-weight: bold; }
.trace-arguments { color: #777; font-weight: normal; padding-left: 2px; }

.trace-code { background: var(--base-0); font-size: 12px; margin: 10px 10px 2px 10px; padding: 10px; overflow-x: auto; white-space: nowrap; }
.trace-code ol { margin: 0; float: left; }
.trace-code li { color: #969896; margin: 0; padding-left: 10px; float: left; width: 100%; }
.trace-code li + li { margin-top: 5px; }
.trace-code li.selected { background: var(--trace-selected-background); margin-top: 2px; }
.trace-code li code { color: var(--base-6); white-space: pre; }

.trace-as-text .stacktrace { line-height: 1.8; margin: 0 0 15px; white-space: pre-wrap; }

@media (min-width: 575px) {
    .hidden-xs-down { display: initial; }
    .help-link { margin-left: 30px; }
}
/* This file is based on WebProfilerBundle/Resources/views/Profiler/base_js.html.twig.
   If you make any change in this file, verify the same change is needed in the other file. */
/*<![CDATA[*/
(function() {
    "use strict";

    if ('classList' in document.documentElement) {
        var hasClass = function (el, cssClass) { return el.classList.contains(cssClass); };
        var removeClass = function(el, cssClass) { el.classList.remove(cssClass); };
        var addClass = function(el, cssClass) { el.classList.add(cssClass); };
        var toggleClass = function(el, cssClass) { el.classList.toggle(cssClass); };
    } else {
        var hasClass = function (el, cssClass) { return el.className.match(new RegExp('\\b' + cssClass + '\\b')); };
        var removeClass = function(el, cssClass) { el.className = el.className.replace(new RegExp('\\b' + cssClass + '\\b'), ' '); };
        var addClass = function(el, cssClass) { if (!hasClass(el, cssClass)) { el.className += " " + cssClass; } };
        var toggleClass = function(el, cssClass) { hasClass(el, cssClass) ? removeClass(el, cssClass) : addClass(el, cssClass); };
    }

    var addEventListener;

    var el = document.createElement('div');
    if (!('addEventListener' in el)) {
        addEventListener = function (element, eventName, callback) {
            element.attachEvent('on' + eventName, callback);
        };
    } else {
        addEventListener = function (element, eventName, callback) {
            element.addEventListener(eventName, callback, false);
        };
    }

    if (navigator.clipboard) {
        document.querySelectorAll('[data-clipboard-text]').forEach(function(element) {
            removeClass(element, 'hidden');
            element.addEventListener('click', function() {
                navigator.clipboard.writeText(element.getAttribute('data-clipboard-text'));
            })
        });
    }

    (function createTabs() {
        /* the accessibility options of this component have been defined according to: */
        /* www.w3.org/WAI/ARIA/apg/example-index/tabs/tabs-manual.html */
        var tabGroups = document.querySelectorAll('.sf-tabs:not([data-processed=true])');

        /* create the tab navigation for each group of tabs */
        for (var i = 0; i < tabGroups.length; i++) {
            var tabs = tabGroups[i].querySelectorAll(':scope > .tab');
            var tabNavigation = document.createElement('div');
            tabNavigation.className = 'tab-navigation';
            tabNavigation.setAttribute('role', 'tablist');

            var selectedTabId = 'tab-' + i + '-0'; /* select the first tab by default */
            for (var j = 0; j < tabs.length; j++) {
                var tabId = 'tab-' + i + '-' + j;
                var tabTitle = tabs[j].querySelector('.tab-title').innerHTML;

                var tabNavigationItem = document.createElement('button');
                addClass(tabNavigationItem, 'tab-control');
                tabNavigationItem.setAttribute('data-tab-id', tabId);
                tabNavigationItem.setAttribute('role', 'tab');
                tabNavigationItem.setAttribute('aria-controls', tabId);
                if (hasClass(tabs[j], 'active')) { selectedTabId = tabId; }
                if (hasClass(tabs[j], 'disabled')) {
                    addClass(tabNavigationItem, 'disabled');
                }
                tabNavigationItem.innerHTML = tabTitle;
                tabNavigation.appendChild(tabNavigationItem);

                var tabContent = tabs[j].querySelector('.tab-content');
                tabContent.parentElement.setAttribute('id', tabId);
            }

            tabGroups[i].insertBefore(tabNavigation, tabGroups[i].firstChild);
            addClass(document.querySelector('[data-tab-id="' + selectedTabId + '"]'), 'active');
        }

        /* display the active tab and add the 'click' event listeners */
        for (i = 0; i < tabGroups.length; i++) {
            tabNavigation = tabGroups[i].querySelectorAll(':scope > .tab-navigation .tab-control');

            for (j = 0; j < tabNavigation.length; j++) {
                tabId = tabNavigation[j].getAttribute('data-tab-id');
                var tabPanel = document.getElementById(tabId);
                tabPanel.setAttribute('role', 'tabpanel');
                tabPanel.setAttribute('aria-labelledby', tabId);
                tabPanel.querySelector('.tab-title').className = 'hidden';

                if (hasClass(tabNavigation[j], 'active')) {
                    tabPanel.className = 'block';
                    tabNavigation[j].setAttribute('aria-selected', 'true');
                    tabNavigation[j].removeAttribute('tabindex');
                } else {
                    tabPanel.className = 'hidden';
                    tabNavigation[j].removeAttribute('aria-selected');
                    tabNavigation[j].setAttribute('tabindex', '-1');
                }

                tabNavigation[j].addEventListener('click', function(e) {
                    var activeTab = e.target || e.srcElement;

                    /* needed because when the tab contains HTML contents, user can click */
                    /* on any of those elements instead of their parent '<button>' element */
                    while (activeTab.tagName.toLowerCase() !== 'button') {
                        activeTab = activeTab.parentNode;
                    }

                    /* get the full list of tabs through the parent of the active tab element */
                    var tabNavigation = activeTab.parentNode.children;
                    for (var k = 0; k < tabNavigation.length; k++) {
                        var tabId = tabNavigation[k].getAttribute('data-tab-id');
                        document.getElementById(tabId).className = 'hidden';
                        removeClass(tabNavigation[k], 'active');
                        tabNavigation[k].removeAttribute('aria-selected');
                        tabNavigation[k].setAttribute('tabindex', '-1');
                    }

                    addClass(activeTab, 'active');
                    activeTab.setAttribute('aria-selected', 'true');
                    activeTab.removeAttribute('tabindex');
                    var activeTabId = activeTab.getAttribute('data-tab-id');
                    document.getElementById(activeTabId).className = 'block';
                });
            }

            tabGroups[i].setAttribute('data-processed', 'true');
        }
    })();

    (function createToggles() {
        var toggles = document.querySelectorAll('.sf-toggle:not([data-processed=true])');

        for (var i = 0; i < toggles.length; i++) {
            var elementSelector = toggles[i].getAttribute('data-toggle-selector');
            var element = document.querySelector(elementSelector);

            addClass(element, 'sf-toggle-content');

            if (toggles[i].hasAttribute('data-toggle-initial') && toggles[i].getAttribute('data-toggle-initial') == 'display') {
                addClass(toggles[i], 'sf-toggle-on');
                addClass(element, 'sf-toggle-visible');
            } else {
                addClass(toggles[i], 'sf-toggle-off');
                addClass(element, 'sf-toggle-hidden');
            }

            addEventListener(toggles[i], 'click', function(e) {
                var toggle = e.currentTarget;

                if (e.target.closest('a, span[data-clipboard-text], .sf-toggle') !== toggle) {
                    return;
                }

                e.preventDefault();

                if ('' !== window.getSelection().toString()) {
                    /* Don't do anything on text selection */
                    return;
                }

                var element = document.querySelector(toggle.getAttribute('data-toggle-selector'));

                toggleClass(toggle, 'sf-toggle-on');
                toggleClass(toggle, 'sf-toggle-off');
                toggleClass(element, 'sf-toggle-hidden');
                toggleClass(element, 'sf-toggle-visible');

                /* the toggle doesn't change its contents when clicking on it */
                if (!toggle.hasAttribute('data-toggle-alt-content')) {
                    return;
                }

                if (!toggle.hasAttribute('data-toggle-original-content')) {
                    toggle.setAttribute('data-toggle-original-content', toggle.innerHTML);
                }

                var currentContent = toggle.innerHTML;
                var originalContent = toggle.getAttribute('data-toggle-original-content');
                var altContent = toggle.getAttribute('data-toggle-alt-content');
                toggle.innerHTML = currentContent !== altContent ? altContent : originalContent;
            });

            toggles[i].setAttribute('data-processed', 'true');
        }
    })();

    (function createFilters() {
        document.querySelectorAll('[data-filters] [data-filter]').forEach(function (filter) {
            var filters = filter.closest('[data-filters]'),
                type = 'choice',
                name = filter.dataset.filter,
                ucName = name.charAt(0).toUpperCase()+name.slice(1),
                list = document.createElement('ul'),
                values = filters.dataset['filter'+ucName] || filters.querySelectorAll('[data-filter-'+name+']'),
                labels = {},
                defaults = null,
                indexed = {},
                processed = {};
            if (typeof values === 'string') {
                type = 'level';
                labels = values.split(',');
                values = values.toLowerCase().split(',');
                defaults = values.length - 1;
            }
            addClass(list, 'filter-list');
            addClass(list, 'filter-list-'+type);
            values.forEach(function (value, i) {
                if (value instanceof HTMLElement) {
                    value = value.dataset['filter'+ucName];
                }
                if (value in processed) {
                    return;
                }
                var option = document.createElement('li'),
                    label = i in labels ? labels[i] : value,
                    active = false,
                    matches;
                if ('' === label) {
                    option.innerHTML = '<em>(none)</em>';
                } else {
                    option.innerText = label;
                }
                option.dataset.filter = value;
                option.setAttribute('title', 1 === (matches = filters.querySelectorAll('[data-filter-'+name+'="'+value+'"]').length) ? 'Matches 1 row' : 'Matches '+matches+' rows');
                indexed[value] = i;
                list.appendChild(option);
                addEventListener(option, 'click', function () {
                    if ('choice' === type) {
                        filters.querySelectorAll('[data-filter-'+name+']').forEach(function (row) {
                            if (option.dataset.filter === row.dataset['filter'+ucName]) {
                                toggleClass(row, 'filter-hidden-'+name);
                            }
                        });
                        toggleClass(option, 'active');
                    } else if ('level' === type) {
                        if (i === this.parentNode.querySelectorAll('.active').length - 1) {
                            return;
                        }
                        this.parentNode.querySelectorAll('li').forEach(function (currentOption, j) {
                            if (j <= i) {
                                addClass(currentOption, 'active');
                                if (i === j) {
                                    addClass(currentOption, 'last-active');
                                } else {
                                    removeClass(currentOption, 'last-active');
                                }
                            } else {
                                removeClass(currentOption, 'active');
                                removeClass(currentOption, 'last-active');
                            }
                        });
                        filters.querySelectorAll('[data-filter-'+name+']').forEach(function (row) {
                            if (i < indexed[row.dataset['filter'+ucName]]) {
                                addClass(row, 'filter-hidden-'+name);
                            } else {
                                removeClass(row, 'filter-hidden-'+name);
                            }
                        });
                    }
                });
                if ('choice' === type) {
                    active = null === defaults || 0 <= defaults.indexOf(value);
                } else if ('level' === type) {
                    active = i <= defaults;
                    if (active && i === defaults) {
                        addClass(option, 'last-active');
                    }
                }
                if (active) {
                    addClass(option, 'active');
                } else {
                    filters.querySelectorAll('[data-filter-'+name+'="'+value+'"]').forEach(function (row) {
                        toggleClass(row, 'filter-hidden-'+name);
                    });
                }
                processed[value] = true;
            });

            if (1 < list.childNodes.length) {
                filter.appendChild(list);
                filter.dataset.filtered = '';
            }
        });
    })();
})();
/*]]>*/
#!/usr/bin/env php
<?php










if ('cli' !== \PHP_SAPI) {
throw new Exception('This script must be run from the command line.');
}






echo <<<EOPHP
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ErrorHandler\Internal;

/**
 * This class has been generated by extract-tentative-return-types.php.
 *
 * @internal
 */
class TentativeTypes
{
    public const RETURN_TYPES = [

EOPHP;

while (false !== $file = fgets(\STDIN)) {
$code = file_get_contents(substr($file, 0, -1));

if (!str_contains($code, '@tentative-return-type')) {
continue;
}

$code = preg_split('{^\s*(?:(?:abstract )?class|interface|trait) ([^\s]++)}m', $code, -1, \PREG_SPLIT_DELIM_CAPTURE);

if (1 === count($code)) {
continue;
}

for ($i = 1; null !== $class = $code[$i] ?? null; $i += 2) {
$methods = $code[1 + $i];

if (!str_contains($methods, '@tentative-return-type')) {
continue;
}

echo "        '$class' => [\n";

preg_replace_callback('{@tentative-return-type.*?[\s]function ([^(]++)[^)]++\)\s*+:\s*+([^\n;\{]++)}s', function ($m) {
$m[2] = str_replace(' ', '', $m[2]);
echo "            '$m[1]' => '$m[2]',\n";

return '';
}, $methods);

echo "        ],\n";
}
}

echo <<<EOPHP
    ];
}

EOPHP;
#!/usr/bin/env php
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if ('cli' !== \PHP_SAPI) {
    throw new Exception('This script must be run from the command line.');
}

if (\in_array('-h', $argv) || \in_array('--help', $argv)) {
    echo implode(PHP_EOL, [
        ' Patches type declarations based on "@return" PHPDoc and triggers deprecations for',
        ' incompatible method declarations.',
        '',
        ' This assists you to make your package compatible with Symfony 7, but it can be used',
        ' for any class/package.',
        '',
        ' Available configuration via environment variables:',
        '  SYMFONY_PATCH_TYPE_DECLARATIONS',
        '      A url-encoded string to change the behavior of the script. Available parameters:',
        '      - "force": any value enables deprecation notices - can be any of:',
        '          - "phpdoc" to patch only docblock annotations',
        '          - "2" to add all possible return types',
        '          - "1" to add return types but only to tests/final/internal/private methods',
        '      - "php": the target version of PHP - e.g. "7.1" doesn\'t generate "object" types',
        '      - "deprecations": "1" to trigger a deprecation notice when a child class misses a',
        '                        return type while the parent declares an "@return" annotation',
        '',
        '  SYMFONY_PATCH_TYPE_EXCLUDE',
        '      A regex matched against the full path to the class - any match will be excluded',
        '',
        ' Example: "SYMFONY_PATCH_TYPE_DECLARATIONS=php=7.4 ./patch-type-declarations"',
    ]);
    exit;
}

if (false === getenv('SYMFONY_PATCH_TYPE_DECLARATIONS')) {
    putenv('SYMFONY_PATCH_TYPE_DECLARATIONS=force=2');
    echo 'No SYMFONY_PATCH_TYPE_DECLARATIONS env var set, patching type declarations in all methods (run the command with "-h" for more information).'.PHP_EOL;
}

if (is_file($autoload = __DIR__.'/../../../../autoload.php')) {
    // noop
} elseif (is_file($autoload = __DIR__.'/../../../../../../../autoload.php')) {
    // noop
} else {
    echo PHP_EOL.'  /!\ Cannot find the Composer autoloader, did you forget to run "composer install"?'.PHP_EOL;
    exit(1);
}

if (is_file($phpunitAutoload = dirname($autoload).'/bin/.phpunit/phpunit/vendor/autoload.php')) {
    require $phpunitAutoload;
}

$loader = require $autoload;

Symfony\Component\ErrorHandler\DebugClassLoader::enable();

$deprecations = [];
set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$deprecations) {
    if (\E_USER_DEPRECATED !== $type) {
        return;
    }

    [,,,,, $class,] = explode('"', $msg);
    $deprecations[$class][] = $msg;
});

$exclude = getenv('SYMFONY_PATCH_TYPE_EXCLUDE') ?: null;
foreach ($loader->getClassMap() as $class => $file) {
    if (str_contains($file = realpath($file), \DIRECTORY_SEPARATOR.'vendor'.\DIRECTORY_SEPARATOR)) {
        continue;
    }

    if ($exclude && preg_match($exclude, $file)) {
        continue;
    }

    class_exists($class);
}

Symfony\Component\ErrorHandler\DebugClassLoader::checkClasses();

foreach ($deprecations as $class => $classDeprecations) {
    echo $class.' ('.\count($classDeprecations).')'.PHP_EOL;
    echo implode(PHP_EOL, $classDeprecations).PHP_EOL.PHP_EOL;
}

if ($deprecations && str_contains(getenv('SYMFONY_PATCH_TYPE_DECLARATIONS') ?? '', 'force')) {
    echo 'These deprecations might be fixed by the patch script, run this again to check for type deprecations.'.PHP_EOL;
}
<?php










namespace Symfony\Component\ErrorHandler\Exception;






class SilencedErrorContext implements \JsonSerializable
{
public int $count = 1;

public function __construct(
private int $severity,
private string $file,
private int $line,
private array $trace = [],
int $count = 1,
) {
$this->count = $count;
}

public function getSeverity(): int
{
return $this->severity;
}

public function getFile(): string
{
return $this->file;
}

public function getLine(): int
{
return $this->line;
}

public function getTrace(): array
{
return $this->trace;
}

public function jsonSerialize(): array
{
return [
'severity' => $this->severity,
'file' => $this->file,
'line' => $this->line,
'trace' => $this->trace,
'count' => $this->count,
];
}
}
<?php










namespace Symfony\Component\ErrorHandler\Exception;

use Symfony\Component\HttpFoundation\Exception\RequestExceptionInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\VarDumper\Caster\Caster;
use Symfony\Component\VarDumper\Cloner\Data;
use Symfony\Component\VarDumper\Cloner\Stub;
use Symfony\Component\VarDumper\Cloner\VarCloner;








class FlattenException
{
private string $message;
private string|int $code;
private ?self $previous = null;
private array $trace;
private string $traceAsString;
private string $class;
private int $statusCode;
private string $statusText;
private array $headers;
private string $file;
private int $line;
private ?string $asString = null;
private Data $dataRepresentation;

public static function create(\Exception $exception, ?int $statusCode = null, array $headers = []): static
{
return static::createFromThrowable($exception, $statusCode, $headers);
}

public static function createFromThrowable(\Throwable $exception, ?int $statusCode = null, array $headers = []): static
{
$e = new static();
$e->setMessage($exception->getMessage());
$e->setCode($exception->getCode());

if ($exception instanceof HttpExceptionInterface) {
$statusCode = $exception->getStatusCode();
$headers = array_merge($headers, $exception->getHeaders());
} elseif ($exception instanceof RequestExceptionInterface) {
$statusCode = 400;
}

$statusCode ??= 500;

if (class_exists(Response::class) && isset(Response::$statusTexts[$statusCode])) {
$statusText = Response::$statusTexts[$statusCode];
} else {
$statusText = 'Whoops, looks like something went wrong.';
}

$e->setStatusText($statusText);
$e->setStatusCode($statusCode);
$e->setHeaders($headers);
$e->setTraceFromThrowable($exception);
$e->setClass(get_debug_type($exception));
$e->setFile($exception->getFile());
$e->setLine($exception->getLine());

$previous = $exception->getPrevious();

if ($previous instanceof \Throwable) {
$e->setPrevious(static::createFromThrowable($previous));
}

return $e;
}

public static function createWithDataRepresentation(\Throwable $throwable, ?int $statusCode = null, array $headers = [], ?VarCloner $cloner = null): static
{
$e = static::createFromThrowable($throwable, $statusCode, $headers);

static $defaultCloner;

if (!$cloner ??= $defaultCloner) {
$cloner = $defaultCloner = new VarCloner();
$cloner->addCasters([
\Throwable::class => function (\Throwable $e, array $a, Stub $s, bool $isNested): array {
if (!$isNested) {
unset($a[Caster::PREFIX_PROTECTED.'message']);
unset($a[Caster::PREFIX_PROTECTED.'code']);
unset($a[Caster::PREFIX_PROTECTED.'file']);
unset($a[Caster::PREFIX_PROTECTED.'line']);
unset($a["\0Error\0trace"], $a["\0Exception\0trace"]);
unset($a["\0Error\0previous"], $a["\0Exception\0previous"]);
}

return $a;
},
]);
}

return $e->setDataRepresentation($cloner->cloneVar($throwable));
}

public function toArray(): array
{
$exceptions = [];
foreach (array_merge([$this], $this->getAllPrevious()) as $exception) {
$exceptions[] = [
'message' => $exception->getMessage(),
'class' => $exception->getClass(),
'trace' => $exception->getTrace(),
'data' => $exception->getDataRepresentation(),
];
}

return $exceptions;
}

public function getStatusCode(): int
{
return $this->statusCode;
}




public function setStatusCode(int $code): static
{
$this->statusCode = $code;

return $this;
}

public function getHeaders(): array
{
return $this->headers;
}




public function setHeaders(array $headers): static
{
$this->headers = $headers;

return $this;
}

public function getClass(): string
{
return $this->class;
}




public function setClass(string $class): static
{
$this->class = str_contains($class, "@anonymous\0") ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : $class;

return $this;
}

public function getFile(): string
{
return $this->file;
}




public function setFile(string $file): static
{
$this->file = $file;

return $this;
}

public function getLine(): int
{
return $this->line;
}




public function setLine(int $line): static
{
$this->line = $line;

return $this;
}

public function getStatusText(): string
{
return $this->statusText;
}




public function setStatusText(string $statusText): static
{
$this->statusText = $statusText;

return $this;
}

public function getMessage(): string
{
return $this->message;
}




public function setMessage(string $message): static
{
if (str_contains($message, "@anonymous\0")) {
$message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message);
}

$this->message = $message;

return $this;
}




public function getCode(): int|string
{
return $this->code;
}




public function setCode(int|string $code): static
{
$this->code = $code;

return $this;
}

public function getPrevious(): ?self
{
return $this->previous;
}




public function setPrevious(?self $previous): static
{
$this->previous = $previous;

return $this;
}




public function getAllPrevious(): array
{
$exceptions = [];
$e = $this;
while ($e = $e->getPrevious()) {
$exceptions[] = $e;
}

return $exceptions;
}

public function getTrace(): array
{
return $this->trace;
}




public function setTraceFromThrowable(\Throwable $throwable): static
{
$this->traceAsString = $throwable->getTraceAsString();

return $this->setTrace($throwable->getTrace(), $throwable->getFile(), $throwable->getLine());
}




public function setTrace(array $trace, ?string $file, ?int $line): static
{
$this->trace = [];
$this->trace[] = [
'namespace' => '',
'short_class' => '',
'class' => '',
'type' => '',
'function' => '',
'file' => $file,
'line' => $line,
'args' => [],
];
foreach ($trace as $entry) {
$class = '';
$namespace = '';
if (isset($entry['class'])) {
$parts = explode('\\', $entry['class']);
$class = array_pop($parts);
$namespace = implode('\\', $parts);
}

$this->trace[] = [
'namespace' => $namespace,
'short_class' => $class,
'class' => $entry['class'] ?? '',
'type' => $entry['type'] ?? '',
'function' => $entry['function'] ?? null,
'file' => $entry['file'] ?? null,
'line' => $entry['line'] ?? null,
'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : [],
];
}

return $this;
}

public function getDataRepresentation(): ?Data
{
return $this->dataRepresentation ?? null;
}




public function setDataRepresentation(Data $data): static
{
$this->dataRepresentation = $data;

return $this;
}

private function flattenArgs(array $args, int $level = 0, int &$count = 0): array
{
$result = [];
foreach ($args as $key => $value) {
if (++$count > 1e4) {
return ['array', '*SKIPPED over 10000 entries*'];
}
if ($value instanceof \__PHP_Incomplete_Class) {
$result[$key] = ['incomplete-object', $this->getClassNameFromIncomplete($value)];
} elseif (\is_object($value)) {
$result[$key] = ['object', get_debug_type($value)];
} elseif (\is_array($value)) {
if ($level > 10) {
$result[$key] = ['array', '*DEEP NESTED ARRAY*'];
} else {
$result[$key] = ['array', $this->flattenArgs($value, $level + 1, $count)];
}
} elseif (null === $value) {
$result[$key] = ['null', null];
} elseif (\is_bool($value)) {
$result[$key] = ['boolean', $value];
} elseif (\is_int($value)) {
$result[$key] = ['integer', $value];
} elseif (\is_float($value)) {
$result[$key] = ['float', $value];
} elseif (\is_resource($value)) {
$result[$key] = ['resource', get_resource_type($value)];
} else {
$result[$key] = ['string', (string) $value];
}
}

return $result;
}

private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value): string
{
$array = new \ArrayObject($value);

return $array['__PHP_Incomplete_Class_Name'];
}

public function getTraceAsString(): string
{
return $this->traceAsString;
}




public function setAsString(?string $asString): static
{
$this->asString = $asString;

return $this;
}

public function getAsString(): string
{
if (null !== $this->asString) {
return $this->asString;
}

$message = '';
$next = false;

foreach (array_reverse(array_merge([$this], $this->getAllPrevious())) as $exception) {
if ($next) {
$message .= 'Next ';
} else {
$next = true;
}
$message .= $exception->getClass();

if ('' != $exception->getMessage()) {
$message .= ': '.$exception->getMessage();
}

$message .= ' in '.$exception->getFile().':'.$exception->getLine().
"\nStack trace:\n".$exception->getTraceAsString()."\n\n";
}

return rtrim($message);
}
}
<?php










namespace Symfony\Component\ErrorHandler\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\WebpackEncoreBundle\Asset\EntrypointLookupInterface;






#[AsCommand(
name: 'error:dump',
description: 'Dump error pages to plain HTML files that can be directly served by a web server',
)]
final class ErrorDumpCommand extends Command
{
public function __construct(
private readonly Filesystem $filesystem,
private readonly ErrorRendererInterface $errorRenderer,
private readonly ?EntrypointLookupInterface $entrypointLookup = null,
) {
parent::__construct();
}

protected function configure(): void
{
$this
->addArgument('path', InputArgument::REQUIRED, 'Path where to dump the error pages in')
->addArgument('status-codes', InputArgument::IS_ARRAY, 'Status codes to dump error pages for, all of them by default')
->addOption('force', 'f', InputOption::VALUE_NONE, 'Force directory removal before dumping new error pages')
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$path = $input->getArgument('path');

$io = new SymfonyStyle($input, $output);
$io->title('Dumping error pages');

$this->dump($io, $path, $input->getArgument('status-codes'), (bool) $input->getOption('force'));
$io->success(\sprintf('Error pages have been dumped in "%s".', $path));

return Command::SUCCESS;
}

private function dump(SymfonyStyle $io, string $path, array $statusCodes, bool $force = false): void
{
if (!$statusCodes) {
$statusCodes = array_filter(array_keys(Response::$statusTexts), fn ($statusCode) => $statusCode >= 400);
}

if ($force || ($this->filesystem->exists($path) && $io->confirm(\sprintf('The "%s" directory already exists. Do you want to remove it before dumping the error pages?', $path), false))) {
$this->filesystem->remove($path);
}

foreach ($statusCodes as $statusCode) {

$this->entrypointLookup?->reset();

$this->filesystem->dumpFile($path.\DIRECTORY_SEPARATOR.$statusCode.'.html', $this->errorRenderer->render(new HttpException((int) $statusCode))->getAsString());
}
}
}
<?php










namespace Symfony\Component\ErrorHandler;

use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;




class ThrowableUtils
{
public static function getSeverity(SilencedErrorContext|\Throwable $throwable): int
{
if ($throwable instanceof \ErrorException || $throwable instanceof SilencedErrorContext) {
return $throwable->getSeverity();
}

if ($throwable instanceof \ParseError) {
return \E_PARSE;
}

if ($throwable instanceof \TypeError) {
return \E_RECOVERABLE_ERROR;
}

return \E_ERROR;
}
}
<?php










namespace Symfony\Component\ErrorHandler;

use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
use Symfony\Component\ErrorHandler\Error\FatalError;
use Symfony\Component\ErrorHandler\Error\OutOfMemoryError;
use Symfony\Component\ErrorHandler\ErrorEnhancer\ClassNotFoundErrorEnhancer;
use Symfony\Component\ErrorHandler\ErrorEnhancer\ErrorEnhancerInterface;
use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedFunctionErrorEnhancer;
use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedMethodErrorEnhancer;
use Symfony\Component\ErrorHandler\ErrorRenderer\CliErrorRenderer;
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext;


























class ErrorHandler
{
private array $levels = [
\E_DEPRECATED => 'Deprecated',
\E_USER_DEPRECATED => 'User Deprecated',
\E_NOTICE => 'Notice',
\E_USER_NOTICE => 'User Notice',
\E_WARNING => 'Warning',
\E_USER_WARNING => 'User Warning',
\E_COMPILE_WARNING => 'Compile Warning',
\E_CORE_WARNING => 'Core Warning',
\E_USER_ERROR => 'User Error',
\E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
\E_COMPILE_ERROR => 'Compile Error',
\E_PARSE => 'Parse Error',
\E_ERROR => 'Error',
\E_CORE_ERROR => 'Core Error',
];

private array $loggers = [
\E_DEPRECATED => [null, LogLevel::INFO],
\E_USER_DEPRECATED => [null, LogLevel::INFO],
\E_NOTICE => [null, LogLevel::ERROR],
\E_USER_NOTICE => [null, LogLevel::ERROR],
\E_WARNING => [null, LogLevel::ERROR],
\E_USER_WARNING => [null, LogLevel::ERROR],
\E_COMPILE_WARNING => [null, LogLevel::ERROR],
\E_CORE_WARNING => [null, LogLevel::ERROR],
\E_USER_ERROR => [null, LogLevel::CRITICAL],
\E_RECOVERABLE_ERROR => [null, LogLevel::CRITICAL],
\E_COMPILE_ERROR => [null, LogLevel::CRITICAL],
\E_PARSE => [null, LogLevel::CRITICAL],
\E_ERROR => [null, LogLevel::CRITICAL],
\E_CORE_ERROR => [null, LogLevel::CRITICAL],
];

private int $thrownErrors = 0x1FFF; 
private int $scopedErrors = 0x1FFF; 
private int $tracedErrors = 0x77FB; 
private int $screamedErrors = 0x55; 
private int $loggedErrors = 0;
private \Closure $configureException;

private bool $isRecursive = false;
private bool $isRoot = false;

private $exceptionHandler;
private ?BufferingLogger $bootstrappingLogger = null;

private static ?string $reservedMemory = null;
private static array $silencedErrorCache = [];
private static int $silencedErrorCount = 0;
private static int $exitCode = 0;




public static function register(?self $handler = null, bool $replace = true): self
{
if (null === self::$reservedMemory) {
self::$reservedMemory = str_repeat('x', 32768);
register_shutdown_function(self::handleFatalError(...));
}

if ($handlerIsNew = null === $handler) {
$handler = new static();
}

if (null === $prev = set_error_handler([$handler, 'handleError'])) {
restore_error_handler();

set_error_handler([$handler, 'handleError'], $handler->thrownErrors | $handler->loggedErrors);
$handler->isRoot = true;
}

if ($handlerIsNew && \is_array($prev) && $prev[0] instanceof self) {
$handler = $prev[0];
$replace = false;
}
if (!$replace && $prev) {
restore_error_handler();
$handlerIsRegistered = \is_array($prev) && $handler === $prev[0];
} else {
$handlerIsRegistered = true;
}
if (\is_array($prev = set_exception_handler([$handler, 'handleException'])) && $prev[0] instanceof self) {
restore_exception_handler();
if (!$handlerIsRegistered) {
$handler = $prev[0];
} elseif ($handler !== $prev[0] && $replace) {
set_exception_handler([$handler, 'handleException']);
$p = $prev[0]->setExceptionHandler(null);
$handler->setExceptionHandler($p);
$prev[0]->setExceptionHandler($p);
}
} else {
$handler->setExceptionHandler($prev ?? [$handler, 'renderException']);
}

$handler->throwAt(\E_ALL & $handler->thrownErrors, true);

return $handler;
}






public static function call(callable $function, mixed ...$arguments): mixed
{
set_error_handler(static function (int $type, string $message, string $file, int $line) {
if (__FILE__ === $file) {
$trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3);
$file = $trace[2]['file'] ?? $file;
$line = $trace[2]['line'] ?? $line;
}

throw new \ErrorException($message, 0, $type, $file, $line);
});

try {
return $function(...$arguments);
} finally {
restore_error_handler();
}
}

public function __construct(
?BufferingLogger $bootstrappingLogger = null,
private bool $debug = false,
) {
if (\PHP_VERSION_ID < 80400) {
$this->levels[\E_STRICT] = 'Runtime Notice';
$this->loggers[\E_STRICT] = [null, LogLevel::ERROR];
}

if ($bootstrappingLogger) {
$this->bootstrappingLogger = $bootstrappingLogger;
$this->setDefaultLogger($bootstrappingLogger);
}
$traceReflector = new \ReflectionProperty(\Exception::class, 'trace');
$this->configureException = \Closure::bind(static function ($e, $trace, $file = null, $line = null) use ($traceReflector) {
$traceReflector->setValue($e, $trace);
$e->file = $file ?? $e->file;
$e->line = $line ?? $e->line;
}, null, new class extends \Exception {
});
}








public function setDefaultLogger(LoggerInterface $logger, array|int|null $levels = \E_ALL, bool $replace = false): void
{
$loggers = [];

if (\is_array($levels)) {
foreach ($levels as $type => $logLevel) {
if (empty($this->loggers[$type][0]) || $replace || $this->loggers[$type][0] === $this->bootstrappingLogger) {
$loggers[$type] = [$logger, $logLevel];
}
}
} else {
$levels ??= \E_ALL;
foreach ($this->loggers as $type => $log) {
if (($type & $levels) && (empty($log[0]) || $replace || $log[0] === $this->bootstrappingLogger)) {
$log[0] = $logger;
$loggers[$type] = $log;
}
}
}

$this->setLoggers($loggers);
}








public function setLoggers(array $loggers): array
{
$prevLogged = $this->loggedErrors;
$prev = $this->loggers;
$flush = [];

foreach ($loggers as $type => $log) {
if (!isset($prev[$type])) {
throw new \InvalidArgumentException('Unknown error type: '.$type);
}
if (!\is_array($log)) {
$log = [$log];
} elseif (!\array_key_exists(0, $log)) {
throw new \InvalidArgumentException('No logger provided.');
}
if (null === $log[0]) {
$this->loggedErrors &= ~$type;
} elseif ($log[0] instanceof LoggerInterface) {
$this->loggedErrors |= $type;
} else {
throw new \InvalidArgumentException('Invalid logger provided.');
}
$this->loggers[$type] = $log + $prev[$type];

if ($this->bootstrappingLogger && $prev[$type][0] === $this->bootstrappingLogger) {
$flush[$type] = $type;
}
}
$this->reRegister($prevLogged | $this->thrownErrors);

if ($flush) {
foreach ($this->bootstrappingLogger->cleanLogs() as $log) {
$type = ThrowableUtils::getSeverity($log[2]['exception']);
if (!isset($flush[$type])) {
$this->bootstrappingLogger->log($log[0], $log[1], $log[2]);
} elseif ($this->loggers[$type][0]) {
$this->loggers[$type][0]->log($this->loggers[$type][1], $log[1], $log[2]);
}
}
}

return $prev;
}

public function setExceptionHandler(?callable $handler): ?callable
{
$prev = $this->exceptionHandler;
$this->exceptionHandler = $handler;

return $prev;
}







public function throwAt(int $levels, bool $replace = false): int
{
$prev = $this->thrownErrors;
$this->thrownErrors = ($levels | \E_RECOVERABLE_ERROR | \E_USER_ERROR) & ~\E_USER_DEPRECATED & ~\E_DEPRECATED;
if (!$replace) {
$this->thrownErrors |= $prev;
}
$this->reRegister($prev | $this->loggedErrors);

return $prev;
}







public function scopeAt(int $levels, bool $replace = false): int
{
$prev = $this->scopedErrors;
$this->scopedErrors = $levels;
if (!$replace) {
$this->scopedErrors |= $prev;
}

return $prev;
}







public function traceAt(int $levels, bool $replace = false): int
{
$prev = $this->tracedErrors;
$this->tracedErrors = $levels;
if (!$replace) {
$this->tracedErrors |= $prev;
}

return $prev;
}







public function screamAt(int $levels, bool $replace = false): int
{
$prev = $this->screamedErrors;
$this->screamedErrors = $levels;
if (!$replace) {
$this->screamedErrors |= $prev;
}

return $prev;
}




private function reRegister(int $prev): void
{
if ($prev !== ($this->thrownErrors | $this->loggedErrors)) {
$handler = set_error_handler(static fn () => null);
$handler = \is_array($handler) ? $handler[0] : null;
restore_error_handler();
if ($handler === $this) {
restore_error_handler();
if ($this->isRoot) {
set_error_handler([$this, 'handleError'], $this->thrownErrors | $this->loggedErrors);
} else {
set_error_handler([$this, 'handleError']);
}
}
}
}










public function handleError(int $type, string $message, string $file, int $line): bool
{
if (\E_WARNING === $type && '"' === $message[0] && str_contains($message, '" targeting switch is equivalent to "break')) {
$type = \E_DEPRECATED;
}


$level = error_reporting();
$silenced = 0 === ($level & $type);

$level |= \E_RECOVERABLE_ERROR | \E_USER_ERROR | \E_DEPRECATED | \E_USER_DEPRECATED;
$log = $this->loggedErrors & $type;
$throw = $this->thrownErrors & $type & $level;
$type &= $level | $this->screamedErrors;


if (\E_WARNING === $type && 'a' === $message[0] && 0 === strncmp($message, 'assert(): ', 10)) {
$throw = 0;
}

if (!$type || (!$log && !$throw)) {
return false;
}

$logMessage = $this->levels[$type].': '.$message;

if (!$throw && !($type & $level)) {
if (!isset(self::$silencedErrorCache[$id = $file.':'.$line])) {
$lightTrace = $this->tracedErrors & $type ? $this->cleanTrace(debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 5), $type, $file, $line, false) : [];
$errorAsException = new SilencedErrorContext($type, $file, $line, isset($lightTrace[1]) ? [$lightTrace[0]] : $lightTrace);
} elseif (isset(self::$silencedErrorCache[$id][$message])) {
$lightTrace = null;
$errorAsException = self::$silencedErrorCache[$id][$message];
++$errorAsException->count;
} else {
$lightTrace = [];
$errorAsException = null;
}

if (100 < ++self::$silencedErrorCount) {
self::$silencedErrorCache = $lightTrace = [];
self::$silencedErrorCount = 1;
}
if ($errorAsException) {
self::$silencedErrorCache[$id][$message] = $errorAsException;
}
if (null === $lightTrace) {
return true;
}
} else {
if (\PHP_VERSION_ID < 80303 && str_contains($message, '@anonymous')) {
$backtrace = debug_backtrace(false, 5);

for ($i = 1; isset($backtrace[$i]); ++$i) {
if (isset($backtrace[$i]['function'], $backtrace[$i]['args'][0])
&& ('trigger_error' === $backtrace[$i]['function'] || 'user_error' === $backtrace[$i]['function'])
) {
if ($backtrace[$i]['args'][0] !== $message) {
$message = $backtrace[$i]['args'][0];
}

break;
}
}
}

if (str_contains($message, "@anonymous\0")) {
$message = $this->parseAnonymousClass($message);
$logMessage = $this->levels[$type].': '.$message;
}

$errorAsException = new \ErrorException($logMessage, 0, $type, $file, $line);

if ($throw || $this->tracedErrors & $type) {
$backtrace = $errorAsException->getTrace();
$backtrace = $this->cleanTrace($backtrace, $type, $file, $line, $throw);
($this->configureException)($errorAsException, $backtrace, $file, $line);
} else {
($this->configureException)($errorAsException, []);
}
}

if ($throw) {
throw $errorAsException;
}

if ($this->isRecursive) {
$log = 0;
} else {
try {
$this->isRecursive = true;
$level = ($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG;
$this->loggers[$type][0]->log($level, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []);
} finally {
$this->isRecursive = false;
}
}

return !$silenced && $type && $log;
}






public function handleException(\Throwable $exception): void
{
$handlerException = null;

if (!$exception instanceof FatalError) {
self::$exitCode = 255;

$type = ThrowableUtils::getSeverity($exception);
} else {
$type = $exception->getError()['type'];
}

if ($this->loggedErrors & $type) {
if (str_contains($message = $exception->getMessage(), "@anonymous\0")) {
$message = $this->parseAnonymousClass($message);
}

if ($exception instanceof FatalError) {
$message = 'Fatal '.$message;
} elseif ($exception instanceof \Error) {
$message = 'Uncaught Error: '.$message;
} elseif ($exception instanceof \ErrorException) {
$message = 'Uncaught '.$message;
} else {
$message = 'Uncaught Exception: '.$message;
}

try {
$this->loggers[$type][0]->log($this->loggers[$type][1], $message, ['exception' => $exception]);
} catch (\Throwable $handlerException) {
}
}

$exception = $this->enhanceError($exception);

$exceptionHandler = $this->exceptionHandler;
$this->exceptionHandler = [$this, 'renderException'];

if (null === $exceptionHandler || $exceptionHandler === $this->exceptionHandler) {
$this->exceptionHandler = null;
}

try {
if (null !== $exceptionHandler) {
$exceptionHandler($exception);

return;
}
$handlerException ??= $exception;
} catch (\Throwable $handlerException) {
}
if ($exception === $handlerException && null === $this->exceptionHandler) {
self::$reservedMemory = null; 
throw $exception; 
}

$loggedErrors = $this->loggedErrors;
if ($exception === $handlerException) {
$this->loggedErrors &= ~$type;
}

try {
$this->handleException($handlerException);
} finally {
$this->loggedErrors = $loggedErrors;
}
}








public static function handleFatalError(?array $error = null): void
{
if (null === self::$reservedMemory) {
return;
}

$handler = self::$reservedMemory = null;
$handlers = [];
$previousHandler = null;
$sameHandlerLimit = 10;

while (!\is_array($handler) || !$handler[0] instanceof self) {
$handler = set_exception_handler('is_int');
restore_exception_handler();

if (!$handler) {
break;
}
restore_exception_handler();

if ($handler !== $previousHandler) {
array_unshift($handlers, $handler);
$previousHandler = $handler;
} elseif (0 === --$sameHandlerLimit) {
$handler = null;
break;
}
}
foreach ($handlers as $h) {
set_exception_handler($h);
}
if (!$handler) {
if (null === $error && $exitCode = self::$exitCode) {
register_shutdown_function('register_shutdown_function', function () use ($exitCode) { exit($exitCode); });
}

return;
}
if ($handler !== $h) {
$handler[0]->setExceptionHandler($h);
}
$handler = $handler[0];
$handlers = [];

if ($exit = null === $error) {
$error = error_get_last();
}

if ($error && $error['type'] &= \E_PARSE | \E_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR) {

$handler->throwAt(0, true);
$trace = $error['backtrace'] ?? null;

if (str_starts_with($error['message'], 'Allowed memory') || str_starts_with($error['message'], 'Out of memory')) {
$fatalError = new OutOfMemoryError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, false, $trace);
} else {
$fatalError = new FatalError($handler->levels[$error['type']].': '.$error['message'], 0, $error, 2, true, $trace);
}
} else {
$fatalError = null;
}

try {
if (null !== $fatalError) {
self::$exitCode = 255;
$handler->handleException($fatalError);
}
} catch (FatalError) {

}

if ($exit && $exitCode = self::$exitCode) {
register_shutdown_function('register_shutdown_function', function () use ($exitCode) { exit($exitCode); });
}
}







private function renderException(\Throwable $exception): void
{
$renderer = \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? new CliErrorRenderer() : new HtmlErrorRenderer($this->debug);

$exception = $renderer->render($exception);

if (!headers_sent()) {
http_response_code($exception->getStatusCode());

foreach ($exception->getHeaders() as $name => $value) {
header($name.': '.$value, false);
}
}

echo $exception->getAsString();
}

public function enhanceError(\Throwable $exception): \Throwable
{
if ($exception instanceof OutOfMemoryError) {
return $exception;
}

foreach ($this->getErrorEnhancers() as $errorEnhancer) {
if ($e = $errorEnhancer->enhance($exception)) {
return $e;
}
}

return $exception;
}






protected function getErrorEnhancers(): iterable
{
return [
new UndefinedFunctionErrorEnhancer(),
new UndefinedMethodErrorEnhancer(),
new ClassNotFoundErrorEnhancer(),
];
}




private function cleanTrace(array $backtrace, int $type, string &$file, int &$line, bool $throw): array
{
$lightTrace = $backtrace;

for ($i = 0; isset($backtrace[$i]); ++$i) {
if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) {
$lightTrace = \array_slice($lightTrace, 1 + $i);
break;
}
}
if (\E_USER_DEPRECATED === $type) {
for ($i = 0; isset($lightTrace[$i]); ++$i) {
if (!isset($lightTrace[$i]['file'], $lightTrace[$i]['line'], $lightTrace[$i]['function'])) {
continue;
}
if (!isset($lightTrace[$i]['class']) && 'trigger_deprecation' === $lightTrace[$i]['function']) {
$file = $lightTrace[$i]['file'];
$line = $lightTrace[$i]['line'];
$lightTrace = \array_slice($lightTrace, 1 + $i);
break;
}
}
}
if (class_exists(DebugClassLoader::class, false)) {
for ($i = \count($lightTrace) - 2; 0 < $i; --$i) {
if (DebugClassLoader::class === ($lightTrace[$i]['class'] ?? null)) {
array_splice($lightTrace, --$i, 2);
}
}
}
if (!($throw || $this->scopedErrors & $type)) {
for ($i = 0; isset($lightTrace[$i]); ++$i) {
unset($lightTrace[$i]['args'], $lightTrace[$i]['object']);
}
}

return $lightTrace;
}





private function parseAnonymousClass(string $message): string
{
return preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)?[0-9a-fA-F]++/', static fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message);
}
}
<?php










namespace Symfony\Contracts\EventDispatcher;

use Psr\EventDispatcher\StoppableEventInterface;
















class Event implements StoppableEventInterface
{
private bool $propagationStopped = false;

public function isPropagationStopped(): bool
{
return $this->propagationStopped;
}








public function stopPropagation(): void
{
$this->propagationStopped = true;
}
}
Copyright (c) 2018-present 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.
<?php










namespace Symfony\Contracts\EventDispatcher;

use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface;




interface EventDispatcherInterface extends PsrEventDispatcherInterface
{
/**
@template








*/
public function dispatch(object $event, ?string $eventName = null): object;
}
<?php










namespace Symfony\Component\DependencyInjection;






class Reference
{
private string $id;
private int $invalidBehavior;

public function __construct(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
{
$this->id = $id;
$this->invalidBehavior = $invalidBehavior;
}

public function __toString(): string
{
return $this->id;
}




public function getInvalidBehavior(): int
{
return $this->invalidBehavior;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\ContainerBuilder;






interface ExtensionInterface
{









public function load(array $configs, ContainerBuilder $container);






public function getNamespace();






public function getXsdValidationBasePath();








public function getAlias();
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\ContainerBuilder;

interface PrependExtensionInterface
{





public function prepend(ContainerBuilder $container);
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\Config\Definition\ConfigurableInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;




interface ConfigurableExtensionInterface extends ConfigurableInterface
{



public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void;




public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void;
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\Config\Builder\ConfigBuilderGenerator;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;




trait ExtensionTrait
{
private function executeConfiguratorCallback(ContainerBuilder $container, \Closure $callback, ConfigurableExtensionInterface $subject): void
{
$env = $container->getParameter('kernel.environment');
$loader = $this->createContainerLoader($container, $env);
$file = (new \ReflectionObject($subject))->getFileName();
$bundleLoader = $loader->getResolver()->resolve($file);
if (!$bundleLoader instanceof PhpFileLoader) {
throw new \LogicException('Unable to create the ContainerConfigurator.');
}
$bundleLoader->setCurrentDir(\dirname($file));
$instanceof = &\Closure::bind(fn &() => $this->instanceof, $bundleLoader, $bundleLoader)();

try {
$callback(new ContainerConfigurator($container, $bundleLoader, $instanceof, $file, $file, $env));
} finally {
$instanceof = [];
$bundleLoader->registerAliasesForSinglyImplementedInterfaces();
}
}

private function createContainerLoader(ContainerBuilder $container, string $env): DelegatingLoader
{
$buildDir = $container->getParameter('kernel.build_dir');
$locator = new FileLocator();
$resolver = new LoaderResolver([
new XmlFileLoader($container, $locator, $env),
new YamlFileLoader($container, $locator, $env),
new IniFileLoader($container, $locator, $env),
new PhpFileLoader($container, $locator, $env, new ConfigBuilderGenerator($buildDir)),
new GlobFileLoader($container, $locator, $env),
new DirectoryLoader($container, $locator, $env),
new ClosureLoader($container, $env),
]);

return new DelegatingLoader($resolver);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\Config\Definition\Configuration;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;






abstract class AbstractExtension extends Extension implements ConfigurableExtensionInterface, PrependExtensionInterface
{
use ExtensionTrait;

public function configure(DefinitionConfigurator $definition): void
{
}

public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
{
}

public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
}

public function getConfiguration(array $config, ContainerBuilder $container): ?ConfigurationInterface
{
return new Configuration($this, $container, $this->getAlias());
}

final public function prepend(ContainerBuilder $container): void
{
$callback = function (ContainerConfigurator $configurator) use ($container) {
$this->prependExtension($configurator, $container);
};

$this->executeConfiguratorCallback($container, $callback, $this);
}

final public function load(array $configs, ContainerBuilder $container): void
{
$config = $this->processConfiguration($this->getConfiguration([], $container), $configs);

$callback = function (ContainerConfigurator $configurator) use ($config, $container) {
$this->loadExtension($config, $configurator, $container);
};

$this->executeConfiguratorCallback($container, $callback, $this);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;






abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface
{
private array $processedConfigs = [];




public function getXsdValidationBasePath()
{
return false;
}




public function getNamespace()
{
return 'http://example.org/schema/dic/'.$this->getAlias();
}



















public function getAlias(): string
{
$className = static::class;
if (!str_ends_with($className, 'Extension')) {
throw new BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.');
}
$classBaseName = substr(strrchr($className, '\\'), 1, -9);

return Container::underscore($classBaseName);
}




public function getConfiguration(array $config, ContainerBuilder $container)
{
$class = static::class;

if (str_contains($class, "\0")) {
return null; 
}

$class = substr_replace($class, '\Configuration', strrpos($class, '\\'));
$class = $container->getReflectionClass($class);

if (!$class) {
return null;
}

if (!$class->implementsInterface(ConfigurationInterface::class)) {
throw new LogicException(\sprintf('The extension configuration class "%s" must implement "%s".', $class->getName(), ConfigurationInterface::class));
}

if (!($constructor = $class->getConstructor()) || !$constructor->getNumberOfRequiredParameters()) {
return $class->newInstance();
}

return null;
}

final protected function processConfiguration(ConfigurationInterface $configuration, array $configs): array
{
$processor = new Processor();

return $this->processedConfigs[] = $processor->processConfiguration($configuration, $configs);
}




final public function getProcessedConfigs(): array
{
try {
return $this->processedConfigs;
} finally {
$this->processedConfigs = [];
}
}




protected function isConfigEnabled(ContainerBuilder $container, array $config): bool
{
if (!\array_key_exists('enabled', $config)) {
throw new InvalidArgumentException("The config array has no 'enabled' key.");
}

return (bool) $container->getParameterBag()->resolveValue($config['enabled']);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;






interface ConfigurationExtensionInterface
{





public function getConfiguration(array $config, ContainerBuilder $container);
}
<?php










namespace Symfony\Component\DependencyInjection;

use Composer\InstalledVersions;
use Symfony\Component\Config\Resource\ClassExistenceResource;
use Symfony\Component\Config\Resource\ComposerResource;
use Symfony\Component\Config\Resource\DirectoryResource;
use Symfony\Component\Config\Resource\FileExistenceResource;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Resource\GlobResource;
use Symfony\Component\Config\Resource\ReflectionClassResource;
use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\LazyClosure;
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocator;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Attribute\Target;
use Symfony\Component\DependencyInjection\Compiler\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\Compiler\ResolveEnvPlaceholdersPass;
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\LazyServiceInstantiator;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;






class ContainerBuilder extends Container implements TaggedContainerInterface
{



private array $extensions = [];




private array $extensionsByNs = [];




private array $definitions = [];




private array $aliasDefinitions = [];




private array $resources = [];




private array $extensionConfigs = [];

private Compiler $compiler;
private bool $trackResources;
private InstantiatorInterface $proxyInstantiator;
private ExpressionLanguage $expressionLanguage;




private array $expressionLanguageProviders = [];




private array $usedTags = [];




private array $envPlaceholders = [];




private array $envCounters = [];




private array $vendors;




private array $pathsInVendor = [];




private array $autoconfiguredInstanceof = [];




private array $autoconfiguredAttributes = [];




private array $removedIds = [];




private array $removedBindingIds = [];

private const INTERNAL_TYPES = [
'int' => true,
'float' => true,
'string' => true,
'bool' => true,
'resource' => true,
'object' => true,
'array' => true,
'null' => true,
'callable' => true,
'iterable' => true,
'mixed' => true,
];

public function __construct(?ParameterBagInterface $parameterBag = null)
{
parent::__construct($parameterBag);

$this->trackResources = interface_exists(ResourceInterface::class);
$this->setDefinition('service_container', (new Definition(ContainerInterface::class))->setSynthetic(true)->setPublic(true));
}




private array $classReflectors;









public function setResourceTracking(bool $track)
{
$this->trackResources = $track;
}




public function isTrackingResources(): bool
{
return $this->trackResources;
}






public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator)
{
$this->proxyInstantiator = $proxyInstantiator;
}




public function registerExtension(ExtensionInterface $extension)
{
$this->extensions[$extension->getAlias()] = $extension;

if (false !== $extension->getNamespace()) {
$this->extensionsByNs[$extension->getNamespace() ?? ''] = $extension;
}
}






public function getExtension(string $name): ExtensionInterface
{
if (isset($this->extensions[$name])) {
return $this->extensions[$name];
}

if (isset($this->extensionsByNs[$name])) {
return $this->extensionsByNs[$name];
}

throw new LogicException(\sprintf('Container extension "%s" is not registered.', $name));
}






public function getExtensions(): array
{
return $this->extensions;
}




public function hasExtension(string $name): bool
{
return isset($this->extensions[$name]) || isset($this->extensionsByNs[$name]);
}






public function getResources(): array
{
return array_values($this->resources);
}




public function addResource(ResourceInterface $resource): static
{
if (!$this->trackResources) {
return $this;
}

if ($resource instanceof GlobResource && $this->inVendors($resource->getPrefix())) {
return $this;
}

$this->resources[(string) $resource] = $resource;

return $this;
}








public function setResources(array $resources): static
{
if (!$this->trackResources) {
return $this;
}

$this->resources = $resources;

return $this;
}








public function addObjectResource(object|string $object): static
{
if ($this->trackResources) {
if (\is_object($object)) {
$object = $object::class;
}
if (!isset($this->classReflectors[$object])) {
$this->classReflectors[$object] = new \ReflectionClass($object);
}
$class = $this->classReflectors[$object];

foreach ($class->getInterfaceNames() as $name) {
if (null === $interface = &$this->classReflectors[$name]) {
$interface = new \ReflectionClass($name);
}
$file = $interface->getFileName();
if (false !== $file && file_exists($file)) {
$this->fileExists($file);
}
}
do {
$file = $class->getFileName();
if (false !== $file && file_exists($file)) {
$this->fileExists($file);
}
foreach ($class->getTraitNames() as $name) {
$this->addObjectResource($name);
}
} while ($class = $class->getParentClass());
}

return $this;
}








public function getReflectionClass(?string $class, bool $throw = true): ?\ReflectionClass
{
if (!$class = $this->getParameterBag()->resolveValue($class)) {
return null;
}

if (isset(self::INTERNAL_TYPES[$class])) {
return null;
}

$resource = $classReflector = null;

try {
if (isset($this->classReflectors[$class])) {
$classReflector = $this->classReflectors[$class];
} elseif (class_exists(ClassExistenceResource::class)) {
$resource = new ClassExistenceResource($class, false);
$classReflector = $resource->isFresh(0) ? false : new \ReflectionClass($class);
} else {
$classReflector = class_exists($class) || interface_exists($class, false) ? new \ReflectionClass($class) : false;
}
} catch (\ReflectionException $e) {
if ($throw) {
throw $e;
}
}

if ($this->trackResources) {
if (!$classReflector) {
$this->addResource($resource ?? new ClassExistenceResource($class, false));
} elseif (!$classReflector->isInternal()) {
$path = $classReflector->getFileName();

if (!$this->inVendors($path)) {
$this->addResource(new ReflectionClassResource($classReflector, $this->vendors));
}
}
$this->classReflectors[$class] = $classReflector;
}

return $classReflector ?: null;
}










public function fileExists(string $path, bool|string $trackContents = true): bool
{
$exists = file_exists($path);

if (!$this->trackResources || $this->inVendors($path)) {
return $exists;
}

if (!$exists) {
$this->addResource(new FileExistenceResource($path));

return $exists;
}

if (is_dir($path)) {
if ($trackContents) {
$this->addResource(new DirectoryResource($path, \is_string($trackContents) ? $trackContents : null));
} else {
$this->addResource(new GlobResource($path, '/*', false));
}
} elseif ($trackContents) {
$this->addResource(new FileResource($path));
}

return $exists;
}












public function loadFromExtension(string $extension, ?array $values = null): static
{
if ($this->isCompiled()) {
throw new BadMethodCallException('Cannot load from an extension on a compiled container.');
}

$namespace = $this->getExtension($extension)->getAlias();

$this->extensionConfigs[$namespace][] = $values ?? [];

return $this;
}









public function addCompilerPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): static
{
$this->getCompiler()->addPass($pass, $type, $priority);

$this->addObjectResource($pass);

return $this;
}




public function getCompilerPassConfig(): PassConfig
{
return $this->getCompiler()->getPassConfig();
}




public function getCompiler(): Compiler
{
return $this->compiler ??= new Compiler();
}








public function set(string $id, ?object $service)
{
if ($this->isCompiled() && (isset($this->definitions[$id]) && !$this->definitions[$id]->isSynthetic())) {

throw new BadMethodCallException(\sprintf('Setting service "%s" for an unknown or non-synthetic service definition on a compiled container is not allowed.', $id));
}

unset($this->definitions[$id], $this->aliasDefinitions[$id], $this->removedIds[$id]);

parent::set($id, $service);
}






public function removeDefinition(string $id)
{
if (isset($this->definitions[$id])) {
unset($this->definitions[$id]);
$this->removedIds[$id] = true;
}
}

public function has(string $id): bool
{
return isset($this->definitions[$id]) || isset($this->aliasDefinitions[$id]) || parent::has($id);
}









public function get(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE): ?object
{
if ($this->isCompiled() && isset($this->removedIds[$id])) {
return ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $invalidBehavior ? parent::get($id) : null;
}

return $this->doGet($id, $invalidBehavior);
}

private function doGet(string $id, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, ?array &$inlineServices = null, bool $isConstructorArgument = false): mixed
{
if (isset($inlineServices[$id])) {
return $inlineServices[$id];
}
if (null === $inlineServices) {
$isConstructorArgument = true;
$inlineServices = [];
}
try {
if (ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $invalidBehavior) {
return $this->privates[$id] ?? parent::get($id, $invalidBehavior);
}
if (null !== $service = $this->privates[$id] ?? parent::get($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)) {
return $service;
}
} catch (ServiceCircularReferenceException $e) {
if ($isConstructorArgument) {
throw $e;
}
}

if (!isset($this->definitions[$id]) && isset($this->aliasDefinitions[$id])) {
$alias = $this->aliasDefinitions[$id];

if ($alias->isDeprecated()) {
$deprecation = $alias->getDeprecation($id);
trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']);
}

return $this->doGet((string) $alias, $invalidBehavior, $inlineServices, $isConstructorArgument);
}

try {
$definition = $this->getDefinition($id);
} catch (ServiceNotFoundException $e) {
if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $invalidBehavior) {
return null;
}

throw $e;
}

if ($definition->hasErrors() && $e = $definition->getErrors()) {
throw new RuntimeException(reset($e));
}

if ($isConstructorArgument) {
$this->loading[$id] = true;
}

try {
return $this->createService($definition, $inlineServices, $isConstructorArgument, $id);
} finally {
if ($isConstructorArgument) {
unset($this->loading[$id]);
}
}
}























public function merge(self $container)
{
if ($this->isCompiled()) {
throw new BadMethodCallException('Cannot merge on a compiled container.');
}

foreach ($container->getDefinitions() as $id => $definition) {
if (!$definition->hasTag('container.excluded') || !$this->has($id)) {
$this->setDefinition($id, $definition);
}
}
$this->addAliases($container->getAliases());
$parameterBag = $this->getParameterBag();
$otherBag = $container->getParameterBag();
$parameterBag->add($otherBag->all());

if ($parameterBag instanceof ParameterBag && $otherBag instanceof ParameterBag) {
foreach ($otherBag->allDeprecated() as $name => $deprecated) {
$parameterBag->deprecate($name, ...$deprecated);
}
}

if ($this->trackResources) {
foreach ($container->getResources() as $resource) {
$this->addResource($resource);
}
}

foreach ($this->extensions as $name => $extension) {
if (!isset($this->extensionConfigs[$name])) {
$this->extensionConfigs[$name] = [];
}

$this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name));
}

if ($parameterBag instanceof EnvPlaceholderParameterBag && $otherBag instanceof EnvPlaceholderParameterBag) {
$envPlaceholders = $otherBag->getEnvPlaceholders();
$parameterBag->mergeEnvPlaceholders($otherBag);
} else {
$envPlaceholders = [];
}

foreach ($container->envCounters as $env => $count) {
if (!$count && !isset($envPlaceholders[$env])) {
continue;
}
if (!isset($this->envCounters[$env])) {
$this->envCounters[$env] = $count;
} else {
$this->envCounters[$env] += $count;
}
}

foreach ($container->getAutoconfiguredInstanceof() as $interface => $childDefinition) {
if (isset($this->autoconfiguredInstanceof[$interface])) {
throw new InvalidArgumentException(\sprintf('"%s" has already been autoconfigured and merge() does not support merging autoconfiguration for the same class/interface.', $interface));
}

$this->autoconfiguredInstanceof[$interface] = $childDefinition;
}

foreach ($container->getAutoconfiguredAttributes() as $attribute => $configurator) {
if (isset($this->autoconfiguredAttributes[$attribute])) {
throw new InvalidArgumentException(\sprintf('"%s" has already been autoconfigured and merge() does not support merging autoconfiguration for the same attribute.', $attribute));
}

$this->autoconfiguredAttributes[$attribute] = $configurator;
}
}






public function getExtensionConfig(string $name): array
{
if (!isset($this->extensionConfigs[$name])) {
$this->extensionConfigs[$name] = [];
}

return $this->extensionConfigs[$name];
}








public function prependExtensionConfig(string $name, array $config)
{
if (!isset($this->extensionConfigs[$name])) {
$this->extensionConfigs[$name] = [];
}

array_unshift($this->extensionConfigs[$name], $config);
}






public function deprecateParameter(string $name, string $package, string $version, string $message = 'The parameter "%s" is deprecated.'): void
{
if (!$this->parameterBag instanceof ParameterBag) {
throw new BadMethodCallException(\sprintf('The parameter bag must be an instance of "%s" to call "%s".', ParameterBag::class, __METHOD__));
}

$this->parameterBag->deprecate($name, $package, $version, $message);
}























public function compile(bool $resolveEnvPlaceholders = false)
{
$compiler = $this->getCompiler();

if ($this->trackResources) {
foreach ($compiler->getPassConfig()->getPasses() as $pass) {
$this->addObjectResource($pass);
}
}
$bag = $this->getParameterBag();

if ($resolveEnvPlaceholders && $bag instanceof EnvPlaceholderParameterBag) {
$compiler->addPass(new ResolveEnvPlaceholdersPass(), PassConfig::TYPE_AFTER_REMOVING, -1000);
}

$compiler->compile($this);

foreach ($this->definitions as $id => $definition) {
if ($this->trackResources && $definition->isLazy()) {
$this->getReflectionClass($definition->getClass());
}
}

$this->extensionConfigs = [];

if ($bag instanceof EnvPlaceholderParameterBag) {
if ($resolveEnvPlaceholders) {
$this->parameterBag = new ParameterBag($this->resolveEnvPlaceholders($this->escapeParameters($bag->all()), true));
}

$this->envPlaceholders = $bag->getEnvPlaceholders();
}

parent::compile();

foreach ($this->definitions + $this->aliasDefinitions as $id => $definition) {
if (!$definition->isPublic() || $definition->isPrivate()) {
$this->removedIds[$id] = true;
}
}
}

public function getServiceIds(): array
{
return array_map('strval', array_unique(array_merge(array_keys($this->getDefinitions()), array_keys($this->aliasDefinitions), parent::getServiceIds())));
}






public function getRemovedIds(): array
{
return $this->removedIds;
}








public function addAliases(array $aliases)
{
foreach ($aliases as $alias => $id) {
$this->setAlias($alias, $id);
}
}








public function setAliases(array $aliases)
{
$this->aliasDefinitions = [];
$this->addAliases($aliases);
}







public function setAlias(string $alias, string|Alias $id): Alias
{
if ('' === $alias || '\\' === $alias[-1] || \strlen($alias) !== strcspn($alias, "\0\r\n'")) {
throw new InvalidArgumentException(\sprintf('Invalid alias id: "%s".', $alias));
}

if (\is_string($id)) {
$id = new Alias($id);
}

if ($alias === (string) $id) {
throw new InvalidArgumentException(\sprintf('An alias cannot reference itself, got a circular reference on "%s".', $alias));
}

unset($this->definitions[$alias], $this->removedIds[$alias]);

return $this->aliasDefinitions[$alias] = $id;
}




public function removeAlias(string $alias)
{
if (isset($this->aliasDefinitions[$alias])) {
unset($this->aliasDefinitions[$alias]);
$this->removedIds[$alias] = true;
}
}

public function hasAlias(string $id): bool
{
return isset($this->aliasDefinitions[$id]);
}




public function getAliases(): array
{
return $this->aliasDefinitions;
}




public function getAlias(string $id): Alias
{
if (!isset($this->aliasDefinitions[$id])) {
throw new InvalidArgumentException(\sprintf('The service alias "%s" does not exist.', $id));
}

return $this->aliasDefinitions[$id];
}







public function register(string $id, ?string $class = null): Definition
{
return $this->setDefinition($id, new Definition($class));
}







public function autowire(string $id, ?string $class = null): Definition
{
return $this->setDefinition($id, (new Definition($class))->setAutowired(true));
}








public function addDefinitions(array $definitions)
{
foreach ($definitions as $id => $definition) {
$this->setDefinition($id, $definition);
}
}








public function setDefinitions(array $definitions)
{
$this->definitions = [];
$this->addDefinitions($definitions);
}






public function getDefinitions(): array
{
return $this->definitions;
}






public function setDefinition(string $id, Definition $definition): Definition
{
if ($this->isCompiled()) {
throw new BadMethodCallException('Adding definition to a compiled container is not allowed.');
}

if ('' === $id || '\\' === $id[-1] || \strlen($id) !== strcspn($id, "\0\r\n'")) {
throw new InvalidArgumentException(\sprintf('Invalid service id: "%s".', $id));
}

unset($this->aliasDefinitions[$id], $this->removedIds[$id]);

return $this->definitions[$id] = $definition;
}




public function hasDefinition(string $id): bool
{
return isset($this->definitions[$id]);
}






public function getDefinition(string $id): Definition
{
if (!isset($this->definitions[$id])) {
throw new ServiceNotFoundException($id);
}

return $this->definitions[$id];
}








public function findDefinition(string $id): Definition
{
$seen = [];
while (isset($this->aliasDefinitions[$id])) {
$id = (string) $this->aliasDefinitions[$id];

if (isset($seen[$id])) {
$seen = array_values($seen);
$seen = \array_slice($seen, array_search($id, $seen));
$seen[] = $id;

throw new ServiceCircularReferenceException($id, $seen);
}

$seen[$id] = $id;
}

return $this->getDefinition($id);
}








private function createService(Definition $definition, array &$inlineServices, bool $isConstructorArgument = false, ?string $id = null, bool|object $tryProxy = true): mixed
{
if (null === $id && isset($inlineServices[$h = spl_object_hash($definition)])) {
return $inlineServices[$h];
}

if ($definition instanceof ChildDefinition) {
throw new RuntimeException(\sprintf('Constructing service "%s" from a parent definition is not supported at build time.', $id));
}

if ($definition->isSynthetic()) {
throw new RuntimeException(\sprintf('You have requested a synthetic service ("%s"). The DIC does not know how to construct this service.', $id));
}

if ($definition->isDeprecated()) {
$deprecation = $definition->getDeprecation($id);
trigger_deprecation($deprecation['package'], $deprecation['version'], $deprecation['message']);
}

$parameterBag = $this->getParameterBag();
$class = $parameterBag->resolveValue($definition->getClass()) ?: (['Closure', 'fromCallable'] === $definition->getFactory() ? 'Closure' : null);

if (['Closure', 'fromCallable'] === $definition->getFactory() && ('Closure' !== $class || $definition->isLazy())) {
$callable = $parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArgument(0)));

if ($callable instanceof Reference || $callable instanceof Definition) {
$callable = [$callable, '__invoke'];
}

if (\is_array($callable) && (
'Closure' !== $class
|| $callable[0] instanceof Reference
|| $callable[0] instanceof Definition && !isset($inlineServices[spl_object_hash($callable[0])])
)) {
$initializer = function () use ($callable, &$inlineServices) {
return $this->doResolveServices($callable[0], $inlineServices);
};

$proxy = eval('return '.LazyClosure::getCode('$initializer', $callable, $class, $this, $id).';');
$this->shareService($definition, $proxy, $id, $inlineServices);

return $proxy;
}
}

if (true === $tryProxy && $definition->isLazy() && ['Closure', 'fromCallable'] !== $definition->getFactory()
&& !$tryProxy = !($proxy = $this->proxyInstantiator ??= new LazyServiceInstantiator()) || $proxy instanceof RealServiceInstantiator
) {
$proxy = $proxy->instantiateProxy(
$this,
(clone $definition)
->setClass($class)
->setTags(($definition->hasTag('proxy') ? ['proxy' => $parameterBag->resolveValue($definition->getTag('proxy'))] : []) + $definition->getTags()),
$id, function ($proxy = false) use ($definition, &$inlineServices, $id) {
return $this->createService($definition, $inlineServices, true, $id, $proxy);
}
);
$this->shareService($definition, $proxy, $id, $inlineServices);

return $proxy;
}

if (null !== $definition->getFile()) {
require_once $parameterBag->resolveValue($definition->getFile());
}

$arguments = $definition->getArguments();

if (null !== $factory = $definition->getFactory()) {
if (\is_array($factory)) {
$factory = [$this->doResolveServices($parameterBag->resolveValue($factory[0]), $inlineServices, $isConstructorArgument), $factory[1]];
} elseif (!\is_string($factory)) {
throw new RuntimeException(\sprintf('Cannot create service "%s" because of invalid factory.', $id));
} elseif (str_starts_with($factory, '@=')) {
$factory = fn (ServiceLocator $arguments) => $this->getExpressionLanguage()->evaluate(substr($factory, 2), ['container' => $this, 'args' => $arguments]);
$arguments = [new ServiceLocatorArgument($arguments)];
}
}

$arguments = $this->doResolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($arguments)), $inlineServices, $isConstructorArgument);

if (null !== $id && $definition->isShared() && (isset($this->services[$id]) || isset($this->privates[$id])) && (true === $tryProxy || !$definition->isLazy())) {
return $this->services[$id] ?? $this->privates[$id];
}

if (!array_is_list($arguments)) {
$arguments = array_combine(array_map(fn ($k) => preg_replace('/^.*\\$/', '', $k), array_keys($arguments)), $arguments);
}

if (null !== $factory) {
$service = $factory(...$arguments);

if (!$definition->isDeprecated() && \is_array($factory) && \is_string($factory[0])) {
$r = new \ReflectionClass($factory[0]);

if (0 < strpos($r->getDocComment() ?: '', "\n * @deprecated ")) {
trigger_deprecation('', '', 'The "%s" service relies on the deprecated "%s" factory class. It should either be deprecated or its factory upgraded.', $id, $r->name);
}
}
} else {
$r = new \ReflectionClass($class);

if (\is_object($tryProxy)) {
if ($r->getConstructor()) {
$tryProxy->__construct(...$arguments);
}

$service = $tryProxy;
} else {
$service = $r->getConstructor() ? $r->newInstanceArgs($arguments) : $r->newInstance();
}

if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment() ?: '', "\n * @deprecated ")) {
trigger_deprecation('', '', 'The "%s" service relies on the deprecated "%s" class. It should either be deprecated or its implementation upgraded.', $id, $r->name);
}
}

$lastWitherIndex = null;
foreach ($definition->getMethodCalls() as $k => $call) {
if ($call[2] ?? false) {
$lastWitherIndex = $k;
}
}

if (null === $lastWitherIndex && (true === $tryProxy || !$definition->isLazy())) {

$this->shareService($definition, $service, $id, $inlineServices);
}

$properties = $this->doResolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getProperties())), $inlineServices);
foreach ($properties as $name => $value) {
$service->$name = $value;
}

foreach ($definition->getMethodCalls() as $k => $call) {
$service = $this->callMethod($service, $call, $inlineServices);

if ($lastWitherIndex === $k && (true === $tryProxy || !$definition->isLazy())) {

$this->shareService($definition, $service, $id, $inlineServices);
}
}

if ($callable = $definition->getConfigurator()) {
if (\is_array($callable)) {
$callable[0] = $parameterBag->resolveValue($callable[0]);

if ($callable[0] instanceof Reference) {
$callable[0] = $this->doGet((string) $callable[0], $callable[0]->getInvalidBehavior(), $inlineServices);
} elseif ($callable[0] instanceof Definition) {
$callable[0] = $this->createService($callable[0], $inlineServices);
}
}

if (!\is_callable($callable)) {
throw new InvalidArgumentException(\sprintf('The configure callable for class "%s" is not a callable.', get_debug_type($service)));
}

$callable($service);
}

return $service;
}







public function resolveServices(mixed $value): mixed
{
return $this->doResolveServices($value);
}

private function doResolveServices(mixed $value, array &$inlineServices = [], bool $isConstructorArgument = false): mixed
{
if (\is_array($value)) {
foreach ($value as $k => $v) {
$value[$k] = $this->doResolveServices($v, $inlineServices, $isConstructorArgument);
}
} elseif ($value instanceof ServiceClosureArgument) {
$reference = $value->getValues()[0];
$value = fn () => $this->resolveServices($reference);
} elseif ($value instanceof IteratorArgument) {
$value = new RewindableGenerator(function () use ($value, &$inlineServices) {
foreach ($value->getValues() as $k => $v) {
foreach (self::getServiceConditionals($v) as $s) {
if (!$this->has($s)) {
continue 2;
}
}
foreach (self::getInitializedConditionals($v) as $s) {
if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE, $inlineServices)) {
continue 2;
}
}

yield $k => $this->doResolveServices($v, $inlineServices);
}
}, function () use ($value): int {
$count = 0;
foreach ($value->getValues() as $v) {
foreach (self::getServiceConditionals($v) as $s) {
if (!$this->has($s)) {
continue 2;
}
}
foreach (self::getInitializedConditionals($v) as $s) {
if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE)) {
continue 2;
}
}

++$count;
}

return $count;
});
} elseif ($value instanceof ServiceLocatorArgument) {
$refs = $types = [];
foreach ($value->getValues() as $k => $v) {
$refs[$k] = [$v, null];
$types[$k] = $v instanceof TypedReference ? $v->getType() : '?';
}
$value = new ServiceLocator($this->resolveServices(...), $refs, $types);
} elseif ($value instanceof Reference) {
$value = $this->doGet((string) $value, $value->getInvalidBehavior(), $inlineServices, $isConstructorArgument);
} elseif ($value instanceof Definition) {
$value = $this->createService($value, $inlineServices, $isConstructorArgument);
} elseif ($value instanceof Parameter) {
$value = $this->getParameter((string) $value);
} elseif ($value instanceof Expression) {
$value = $this->getExpressionLanguage()->evaluate($value, ['container' => $this]);
} elseif ($value instanceof AbstractArgument) {
throw new RuntimeException($value->getTextWithContext());
}

return $value;
}

















public function findTaggedServiceIds(string $name, bool $throwOnAbstract = false): array
{
$this->usedTags[] = $name;
$tags = [];
foreach ($this->getDefinitions() as $id => $definition) {
if ($definition->hasTag($name) && !$definition->hasTag('container.excluded')) {
if ($throwOnAbstract && $definition->isAbstract()) {
throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must not be abstract.', $id, $name));
}
$tags[$id] = $definition->getTag($name);
}
}

return $tags;
}






public function findTags(): array
{
$tags = [];
foreach ($this->getDefinitions() as $id => $definition) {
$tags[] = array_keys($definition->getTags());
}

return array_unique(array_merge([], ...$tags));
}






public function findUnusedTags(): array
{
return array_values(array_diff($this->findTags(), $this->usedTags));
}




public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
{
$this->expressionLanguageProviders[] = $provider;
}




public function getExpressionLanguageProviders(): array
{
return $this->expressionLanguageProviders;
}




public function registerForAutoconfiguration(string $interface): ChildDefinition
{
if (!isset($this->autoconfiguredInstanceof[$interface])) {
$this->autoconfiguredInstanceof[$interface] = new ChildDefinition('');
}

return $this->autoconfiguredInstanceof[$interface];
}

/**
@template










*/
public function registerAttributeForAutoconfiguration(string $attributeClass, callable $configurator): void
{
$this->autoconfiguredAttributes[$attributeClass] = $configurator;
}









public function registerAliasForArgument(string $id, string $type, ?string $name = null): Alias
{
$parsedName = (new Target($name ??= $id))->getParsedName();

if (!preg_match('/^[a-zA-Z_\x7f-\xff]/', $parsedName)) {
if ($id !== $name) {
$id = \sprintf(' for service "%s"', $id);
}

throw new InvalidArgumentException(\sprintf('Invalid argument name "%s"'.$id.': the first character must be a letter.', $name));
}

if ($parsedName !== $name) {
$this->setAlias('.'.$type.' $'.$name, $type.' $'.$parsedName);
}

return $this->setAlias($type.' $'.$parsedName, $id);
}






public function getAutoconfiguredInstanceof(): array
{
return $this->autoconfiguredInstanceof;
}




public function getAutoconfiguredAttributes(): array
{
return $this->autoconfiguredAttributes;
}











public function resolveEnvPlaceholders(mixed $value, string|bool|null $format = null, ?array &$usedEnvs = null): mixed
{
$bag = $this->getParameterBag();
if (true === $format ??= '%%env(%s)%%') {
$value = $bag->resolveValue($value);
}

if ($value instanceof Definition) {
$value = (array) $value;
}

if (\is_array($value)) {
$result = [];
foreach ($value as $k => $v) {
$result[\is_string($k) ? $this->resolveEnvPlaceholders($k, $format, $usedEnvs) : $k] = $this->resolveEnvPlaceholders($v, $format, $usedEnvs);
}

return $result;
}

if (!\is_string($value) || 38 > \strlen($value) || false === stripos($value, 'env_')) {
return $value;
}
$envPlaceholders = $bag instanceof EnvPlaceholderParameterBag ? $bag->getEnvPlaceholders() : $this->envPlaceholders;

$completed = false;
preg_match_all('/env_[a-f0-9]{16}_\w+_[a-f0-9]{32}/Ui', $value, $matches);
$usedPlaceholders = array_flip($matches[0]);
foreach ($envPlaceholders as $env => $placeholders) {
foreach ($placeholders as $placeholder) {
if (isset($usedPlaceholders[$placeholder])) {
if (true === $format) {
$resolved = $bag->escapeValue($this->getEnv($env));
} else {
$resolved = \sprintf($format, $env);
}
if ($placeholder === $value) {
$value = $resolved;
$completed = true;
} else {
if (!\is_string($resolved) && !is_numeric($resolved)) {
throw new RuntimeException(\sprintf('A string value must be composed of strings and/or numbers, but found parameter "env(%s)" of type "%s" inside string value "%s".', $env, get_debug_type($resolved), $this->resolveEnvPlaceholders($value)));
}
$value = str_ireplace($placeholder, $resolved, $value);
}
$usedEnvs[$env] = $env;
$this->envCounters[$env] = isset($this->envCounters[$env]) ? 1 + $this->envCounters[$env] : 1;

if ($completed) {
break 2;
}
}
}
}

return $value;
}






public function getEnvCounters(): array
{
$bag = $this->getParameterBag();
$envPlaceholders = $bag instanceof EnvPlaceholderParameterBag ? $bag->getEnvPlaceholders() : $this->envPlaceholders;

foreach ($envPlaceholders as $env => $placeholders) {
if (!isset($this->envCounters[$env])) {
$this->envCounters[$env] = 0;
}
}

return $this->envCounters;
}




public function log(CompilerPassInterface $pass, string $message): void
{
$this->getCompiler()->log($pass, $this->resolveEnvPlaceholders($message));
}









final public static function willBeAvailable(string $package, string $class, array $parentPackages): bool
{
if (!class_exists(InstalledVersions::class)) {
throw new \LogicException(\sprintf('Calling "%s" when dependencies have been installed with Composer 1 is not supported. Consider upgrading to Composer 2.', __METHOD__));
}

if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
return false;
}

if (!InstalledVersions::isInstalled($package) || InstalledVersions::isInstalled($package, false)) {
return true;
}



$rootPackage = InstalledVersions::getRootPackage()['name'] ?? '';

if ('symfony/symfony' === $rootPackage) {
return true;
}

foreach ($parentPackages as $parentPackage) {
if ($rootPackage === $parentPackage || (InstalledVersions::isInstalled($parentPackage) && !InstalledVersions::isInstalled($parentPackage, false))) {
return true;
}
}

return false;
}








public function getRemovedBindingIds(): array
{
return $this->removedBindingIds;
}






public function removeBindings(string $id): void
{
if ($this->hasDefinition($id)) {
foreach ($this->getDefinition($id)->getBindings() as $key => $binding) {
[, $bindingId] = $binding->getValues();
$this->removedBindingIds[(int) $bindingId] = true;
}
}
}






public static function getServiceConditionals(mixed $value): array
{
$services = [];

if (\is_array($value)) {
foreach ($value as $v) {
$services = array_unique(array_merge($services, self::getServiceConditionals($v)));
}
} elseif ($value instanceof Reference && ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) {
$services[] = (string) $value;
}

return $services;
}






public static function getInitializedConditionals(mixed $value): array
{
$services = [];

if (\is_array($value)) {
foreach ($value as $v) {
$services = array_unique(array_merge($services, self::getInitializedConditionals($v)));
}
} elseif ($value instanceof Reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior()) {
$services[] = (string) $value;
}

return $services;
}




public static function hash(mixed $value): string
{
$hash = substr(base64_encode(hash('sha256', serialize($value), true)), 0, 7);

return str_replace(['/', '+'], ['.', '_'], $hash);
}

protected function getEnv(string $name): mixed
{
$value = parent::getEnv($name);
$bag = $this->getParameterBag();

if (!\is_string($value) || !$bag instanceof EnvPlaceholderParameterBag) {
return $value;
}

$envPlaceholders = $bag->getEnvPlaceholders();
if (isset($envPlaceholders[$name][$value])) {
$bag = new ParameterBag($bag->all());

return $bag->unescapeValue($bag->get("env($name)"));
}
foreach ($envPlaceholders as $env => $placeholders) {
if (isset($placeholders[$value])) {
return $this->getEnv($env);
}
}

$this->resolving["env($name)"] = true;
try {
return $bag->unescapeValue($this->resolveEnvPlaceholders($bag->escapeValue($value), true));
} finally {
unset($this->resolving["env($name)"]);
}
}

private function callMethod(object $service, array $call, array &$inlineServices): mixed
{
foreach (self::getServiceConditionals($call[1]) as $s) {
if (!$this->has($s)) {
return $service;
}
}
foreach (self::getInitializedConditionals($call[1]) as $s) {
if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE, $inlineServices)) {
return $service;
}
}

$result = $service->{$call[0]}(...$this->doResolveServices($this->getParameterBag()->unescapeValue($this->getParameterBag()->resolveValue($call[1])), $inlineServices));

return empty($call[2]) ? $service : $result;
}

private function shareService(Definition $definition, mixed $service, ?string $id, array &$inlineServices): void
{
$inlineServices[$id ?? spl_object_hash($definition)] = $service;

if (null !== $id && $definition->isShared()) {
if ($definition->isPrivate() && $this->isCompiled()) {
$this->privates[$id] = $service;
} else {
$this->services[$id] = $service;
}
unset($this->loading[$id]);
}
}

private function getExpressionLanguage(): ExpressionLanguage
{
if (!isset($this->expressionLanguage)) {
if (!class_exists(Expression::class)) {
throw new LogicException('Expressions cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}
$this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders, null, $this->getEnv(...));
}

return $this->expressionLanguage;
}

private function inVendors(string $path): bool
{
$path = is_file($path) ? \dirname($path) : $path;

if (isset($this->pathsInVendor[$path])) {
return $this->pathsInVendor[$path];
}

$this->vendors ??= (new ComposerResource())->getVendors();
$path = realpath($path) ?: $path;

if (isset($this->pathsInVendor[$path])) {
return $this->pathsInVendor[$path];
}

foreach ($this->vendors as $vendor) {
if (str_starts_with($path, $vendor) && false !== strpbrk(substr($path, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) {
$this->addResource(new FileResource($vendor.'/composer/installed.json'));

return $this->pathsInVendor[$path] = true;
}
}

return $this->pathsInVendor[$path] = false;
}

private function escapeParameters(array $parameters): array
{
$params = [];
foreach ($parameters as $k => $v) {
$params[$k] = match (true) {
\is_array($v) => $this->escapeParameters($v),
\is_string($v) => str_replace('%', '%%', $v),
default => $v,
};
}

return $params;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::TARGET_FUNCTION | \Attribute::IS_REPEATABLE)]
class When
{
public function __construct(
public string $env,
) {
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

#[\Attribute(\Attribute::TARGET_PARAMETER)]
class TaggedLocator extends AutowireLocator
{
public function __construct(
public string $tag,
public ?string $indexAttribute = null,
public ?string $defaultIndexMethod = null,
public ?string $defaultPriorityMethod = null,
public string|array $exclude = [],
public bool $excludeSelf = true,
) {
parent::__construct($tag, $indexAttribute, $defaultIndexMethod, $defaultPriorityMethod, $exclude, $excludeSelf);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS)]
class Exclude
{
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
class Autoconfigure
{
public function __construct(
public ?array $tags = null,
public ?array $calls = null,
public ?array $bind = null,
public bool|string|null $lazy = null,
public ?bool $public = null,
public ?bool $shared = null,
public ?bool $autowire = null,
public ?array $properties = null,
public array|string|null $configurator = null,
public ?string $constructor = null,
) {
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

#[\Attribute(\Attribute::TARGET_PARAMETER)]
class TaggedIterator extends AutowireIterator
{
public function __construct(
public string $tag,
public ?string $indexAttribute = null,
public ?string $defaultIndexMethod = null,
public ?string $defaultPriorityMethod = null,
public string|array $exclude = [],
public bool $excludeSelf = true,
) {
parent::__construct($tag, $indexAttribute, $defaultIndexMethod, $defaultPriorityMethod, $exclude, $excludeSelf);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS)]
class AsTaggedItem
{
public function __construct(
public ?string $index = null,
public ?int $priority = null,
) {
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

#[\Attribute(\Attribute::TARGET_PARAMETER)]
class AutowireDecorated
{
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
final class AsAlias
{
public function __construct(
public ?string $id = null,
public bool $public = false,
) {
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Reference;




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class AutowireCallable extends Autowire
{



public function __construct(
string|array|null $callable = null,
?string $service = null,
?string $method = null,
bool|string $lazy = false,
) {
if (!(null !== $callable xor null !== $service)) {
throw new LogicException('#[AutowireCallable] attribute must declare exactly one of $callable or $service.');
}
if (null === $service && null !== $method) {
throw new LogicException('#[AutowireCallable] attribute cannot have a $method without a $service.');
}

parent::__construct($callable ?? [new Reference($service), $method ?? '__invoke'], lazy: $lazy);
}

public function buildDefinition(mixed $value, ?string $type, \ReflectionParameter $parameter): Definition
{
return (new Definition($type = \is_array($this->lazy) ? current($this->lazy) : ($type ?: 'Closure')))
->setFactory(['Closure', 'fromCallable'])
->setArguments([\is_array($value) ? $value + [1 => '__invoke'] : $value])
->setLazy($this->lazy || 'Closure' !== $type && 'callable' !== (string) $parameter->getType());
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;






#[\Attribute(\Attribute::TARGET_PARAMETER)]
class Autowire
{
public readonly string|array|Expression|Reference|ArgumentInterface|null $value;
public readonly bool|array $lazy;











public function __construct(
string|array|ArgumentInterface|null $value = null,
?string $service = null,
?string $expression = null,
?string $env = null,
?string $param = null,
bool|string|array $lazy = false,
) {
if ($this->lazy = \is_string($lazy) ? [$lazy] : $lazy) {
if (null !== ($expression ?? $env ?? $param)) {
throw new LogicException('#[Autowire] attribute cannot be $lazy and use $expression, $env, or $param.');
}
if (null !== $value && null !== $service) {
throw new LogicException('#[Autowire] attribute cannot declare $value and $service at the same time.');
}
} elseif (!(null !== $value xor null !== $service xor null !== $expression xor null !== $env xor null !== $param)) {
throw new LogicException('#[Autowire] attribute must declare exactly one of $service, $expression, $env, $param or $value.');
}

if (\is_string($value) && str_starts_with($value, '@')) {
match (true) {
str_starts_with($value, '@@') => $value = substr($value, 1),
str_starts_with($value, '@=') => $expression = substr($value, 2),
default => $service = substr($value, 1),
};
}

$this->value = match (true) {
null !== $service => new Reference($service),
null !== $expression => class_exists(Expression::class) ? new Expression($expression) : throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".'),
null !== $env => "%env($env)%",
null !== $param => "%$param%",
default => $value,
};
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
class AutoconfigureTag extends Autoconfigure
{
public function __construct(?string $name = null, array $attributes = [])
{
parent::__construct(
tags: [
[$name ?? 0 => $attributes],
]
);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Contracts\Service\Attribute\SubscribedService;
use Symfony\Contracts\Service\ServiceSubscriberInterface;




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class AutowireLocator extends Autowire
{






public function __construct(
string|array $services,
?string $indexAttribute = null,
?string $defaultIndexMethod = null,
?string $defaultPriorityMethod = null,
string|array $exclude = [],
bool $excludeSelf = true,
) {
if (\is_string($services)) {
parent::__construct(new ServiceLocatorArgument(new TaggedIteratorArgument($services, $indexAttribute, $defaultIndexMethod, true, $defaultPriorityMethod, (array) $exclude, $excludeSelf)));

return;
}

$references = [];

foreach ($services as $key => $type) {
$attributes = [];

if ($type instanceof Autowire) {
$references[$key] = $type;
continue;
}

if ($type instanceof SubscribedService) {
$key = $type->key ?? $key;
$attributes = $type->attributes;
$type = ($type->nullable ? '?' : '').($type->type ?? throw new InvalidArgumentException(\sprintf('When "%s" is used, a type must be set.', SubscribedService::class)));
}

if (!\is_string($type) || !preg_match('/(?(DEFINE)(?<cn>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))(?(DEFINE)(?<fqcn>(?&cn)(?:\\\\(?&cn))*+))^\??(?&fqcn)(?:(?:\|(?&fqcn))*+|(?:&(?&fqcn))*+)$/', $type)) {
throw new InvalidArgumentException(\sprintf('"%s" is not a PHP type for key "%s".', \is_string($type) ? $type : get_debug_type($type), $key));
}
$optionalBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
if ('?' === $type[0]) {
$type = substr($type, 1);
$optionalBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
}
if (\is_int($name = $key)) {
$key = $type;
$name = null;
}

$references[$key] = new TypedReference($type, $type, $optionalBehavior, $name, $attributes);
}

parent::__construct(new ServiceLocatorArgument($references));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\ContainerInterface;

#[\Attribute(\Attribute::TARGET_CLASS)]
class AsDecorator
{
public function __construct(
public string $decorates,
public int $priority = 0,
public int $onInvalid = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE,
) {
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class AutowireIterator extends Autowire
{



public function __construct(
string $tag,
?string $indexAttribute = null,
?string $defaultIndexMethod = null,
?string $defaultPriorityMethod = null,
string|array $exclude = [],
bool $excludeSelf = true,
) {
parent::__construct(new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, false, $defaultPriorityMethod, (array) $exclude, $excludeSelf));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Reference;




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class AutowireServiceClosure extends Autowire
{
public function __construct(string $service)
{
parent::__construct(new ServiceClosureArgument(new Reference($service)));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;






#[\Attribute(\Attribute::TARGET_PARAMETER)]
final class Target
{
public function __construct(
public ?string $name = null,
) {
}

public function getParsedName(): string
{
if (null === $this->name) {
throw new LogicException(\sprintf('Cannot parse the name of a #[Target] attribute that has not been resolved. Did you forget to call "%s::parseName()"?', __CLASS__));
}

return lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $this->name))));
}

public static function parseName(\ReflectionParameter $parameter, ?self &$attribute = null, ?string &$parsedName = null): string
{
$attribute = null;
if (!$target = $parameter->getAttributes(self::class)[0] ?? null) {
$parsedName = (new self($parameter->name))->getParsedName();

return $parameter->name;
}

$attribute = $target->newInstance();
$name = $attribute->name ??= $parameter->name;
$parsedName = $attribute->getParsedName();

if (!preg_match('/^[a-zA-Z_\x7f-\xff]/', $parsedName)) {
if (($function = $parameter->getDeclaringFunction()) instanceof \ReflectionMethod) {
$function = $function->class.'::'.$function->name;
} else {
$function = $function->name;
}

throw new InvalidArgumentException(\sprintf('Invalid #[Target] name "%s" on parameter "$%s" of "%s()": the first character must be a letter.', $name, $parameter->name, $function));
}

return preg_match('/^[a-zA-Z0-9_\x7f-\xff]++$/', $name) ? $name : $parsedName;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Attribute;

trigger_deprecation('symfony/dependency-injection', '6.3', 'The "%s" class is deprecated, use "%s" instead.', MapDecorated::class, AutowireDecorated::class);




#[\Attribute(\Attribute::TARGET_PARAMETER)]
class MapDecorated
{
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;






class RealServiceInstantiator implements InstantiatorInterface
{
public function instantiateProxy(ContainerInterface $container, Definition $definition, string $id, callable $realInstantiator): object
{
return $realInstantiator();
}
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;







interface InstantiatorInterface
{








public function instantiateProxy(ContainerInterface $container, Definition $definition, string $id, callable $realInstantiator);
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\LazyServiceDumper;




final class LazyServiceInstantiator implements InstantiatorInterface
{
public function instantiateProxy(ContainerInterface $container, Definition $definition, string $id, callable $realInstantiator): object
{
$dumper = new LazyServiceDumper();

if (!$dumper->isProxyCandidate($definition, $asGhostObject, $id)) {
throw new InvalidArgumentException(\sprintf('Cannot instantiate lazy proxy for service "%s".', $id));
}

if (!class_exists($proxyClass = $dumper->getProxyClass($definition, $asGhostObject), false)) {
eval($dumper->getProxyCode($definition, $id));
}

return $asGhostObject ? $proxyClass::createLazyGhost($realInstantiator) : $proxyClass::createLazyProxy($realInstantiator);
}
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy;

trigger_deprecation('symfony/dependency-injection', '6.2', 'The "%s" class is deprecated, use "%s" instead.', ProxyHelper::class, \Symfony\Component\VarExporter\ProxyHelper::class);






class ProxyHelper
{



public static function getTypeHint(\ReflectionFunctionAbstract $r, ?\ReflectionParameter $p = null, bool $noBuiltin = false): ?string
{
if ($p instanceof \ReflectionParameter) {
$type = $p->getType();
} else {
$type = $r->getReturnType();
}
if (!$type) {
return null;
}

return self::getTypeHintForType($type, $r, $noBuiltin);
}

private static function getTypeHintForType(\ReflectionType $type, \ReflectionFunctionAbstract $r, bool $noBuiltin): ?string
{
$types = [];
$glue = '|';
if ($type instanceof \ReflectionUnionType) {
$reflectionTypes = $type->getTypes();
} elseif ($type instanceof \ReflectionIntersectionType) {
$reflectionTypes = $type->getTypes();
$glue = '&';
} elseif ($type instanceof \ReflectionNamedType) {
$reflectionTypes = [$type];
} else {
return null;
}

foreach ($reflectionTypes as $type) {
if ($type instanceof \ReflectionIntersectionType) {
$typeHint = self::getTypeHintForType($type, $r, $noBuiltin);
if (null === $typeHint) {
return null;
}

$types[] = \sprintf('(%s)', $typeHint);

continue;
}

if ($type->isBuiltin()) {
if (!$noBuiltin) {
$types[] = $type->getName();
}
continue;
}

$lcName = strtolower($type->getName());
$prefix = $noBuiltin ? '' : '\\';

if ('self' !== $lcName && 'parent' !== $lcName) {
$types[] = $prefix.$type->getName();
continue;
}
if (!$r instanceof \ReflectionMethod) {
continue;
}
if ('self' === $lcName) {
$types[] = $prefix.$r->getDeclaringClass()->name;
} else {
$types[] = ($parent = $r->getDeclaringClass()->getParentClass()) ? $prefix.$parent->name : null;
}
}

sort($types);

return $types ? implode($glue, $types) : null;
}
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;








class NullDumper implements DumperInterface
{
public function isProxyCandidate(Definition $definition, ?bool &$asGhostObject = null, ?string $id = null): bool
{
return $asGhostObject = false;
}

public function getProxyFactoryCode(Definition $definition, string $id, string $factoryCode): string
{
return '';
}

public function getProxyCode(Definition $definition, ?string $id = null): string
{
return '';
}
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;






interface DumperInterface
{






public function isProxyCandidate(Definition $definition): bool;




public function getProxyFactoryCode(Definition $definition, string $id, string $factoryCode): string;






public function getProxyCode(Definition $definition): string;
}
<?php










namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\VarExporter\Exception\LogicException;
use Symfony\Component\VarExporter\ProxyHelper;




final class LazyServiceDumper implements DumperInterface
{
public function __construct(
private string $salt = '',
) {
}

public function isProxyCandidate(Definition $definition, ?bool &$asGhostObject = null, ?string $id = null): bool
{
$asGhostObject = false;

if ($definition->hasTag('proxy')) {
if (!$definition->isLazy()) {
throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": setting the "proxy" tag on a service requires it to be "lazy".', $id ?? $definition->getClass()));
}

return true;
}

if (!$definition->isLazy()) {
return false;
}

if (!($class = $definition->getClass()) || !(class_exists($class) || interface_exists($class, false))) {
return false;
}

if ($definition->getFactory()) {
return true;
}

foreach ($definition->getMethodCalls() as $call) {
if ($call[2] ?? false) {
return true;
}
}

try {
$asGhostObject = (bool) ProxyHelper::generateLazyGhost(new \ReflectionClass($class));
} catch (LogicException) {
}

return true;
}

public function getProxyFactoryCode(Definition $definition, string $id, string $factoryCode): string
{
$instantiation = 'return';

if ($definition->isShared()) {
$instantiation .= \sprintf(' $container->%s[%s] =', $definition->isPublic() && !$definition->isPrivate() ? 'services' : 'privates', var_export($id, true));
}

$asGhostObject = str_contains($factoryCode, '$proxy');
$proxyClass = $this->getProxyClass($definition, $asGhostObject);

if (!$asGhostObject) {
return <<<EOF
                    if (true === \$lazyLoad) {
                        $instantiation \$container->createProxy('$proxyClass', static fn () => \\$proxyClass::createLazyProxy(static fn () => $factoryCode));
                    }


            EOF;
}

$factoryCode = \sprintf('static fn ($proxy) => %s', $factoryCode);

return <<<EOF
                if (true === \$lazyLoad) {
                    $instantiation \$container->createProxy('$proxyClass', static fn () => \\$proxyClass::createLazyGhost($factoryCode));
                }


        EOF;
}

public function getProxyCode(Definition $definition, ?string $id = null): string
{
if (!$this->isProxyCandidate($definition, $asGhostObject, $id)) {
throw new InvalidArgumentException(\sprintf('Cannot instantiate lazy proxy for service "%s".', $id ?? $definition->getClass()));
}
$proxyClass = $this->getProxyClass($definition, $asGhostObject, $class);

if ($asGhostObject) {
try {
return (\PHP_VERSION_ID >= 80200 && $class?->isReadOnly() ? 'readonly ' : '').'class '.$proxyClass.ProxyHelper::generateLazyGhost($class);
} catch (LogicException $e) {
throw new InvalidArgumentException(\sprintf('Cannot generate lazy ghost for service "%s".', $id ?? $definition->getClass()), 0, $e);
}
}
$interfaces = [];

if ($definition->hasTag('proxy')) {
foreach ($definition->getTag('proxy') as $tag) {
if (!isset($tag['interface'])) {
throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": the "interface" attribute is missing on a "proxy" tag.', $id ?? $definition->getClass()));
}
if (!interface_exists($tag['interface']) && !class_exists($tag['interface'], false)) {
throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": several "proxy" tags found but "%s" is not an interface.', $id ?? $definition->getClass(), $tag['interface']));
}
if ('object' !== $definition->getClass() && !is_a($class->name, $tag['interface'], true)) {
throw new InvalidArgumentException(\sprintf('Invalid "proxy" tag for service "%s": class "%s" doesn\'t implement "%s".', $id ?? $definition->getClass(), $definition->getClass(), $tag['interface']));
}
$interfaces[] = new \ReflectionClass($tag['interface']);
}

$class = 1 === \count($interfaces) && !$interfaces[0]->isInterface() ? array_pop($interfaces) : null;
} elseif ($class->isInterface()) {
$interfaces = [$class];
$class = null;
}

try {
return (\PHP_VERSION_ID >= 80200 && $class?->isReadOnly() ? 'readonly ' : '').'class '.$proxyClass.ProxyHelper::generateLazyProxy($class, $interfaces);
} catch (LogicException $e) {
throw new InvalidArgumentException(\sprintf('Cannot generate lazy proxy for service "%s".', $id ?? $definition->getClass()), 0, $e);
}
}

public function getProxyClass(Definition $definition, bool $asGhostObject, ?\ReflectionClass &$class = null): string
{
$class = 'object' !== $definition->getClass() ? $definition->getClass() : 'stdClass';
$class = new \ReflectionClass($class);

return preg_replace('/^.*\\\\/', '', $definition->getClass())
.($asGhostObject ? 'Ghost' : 'Proxy')
.ucfirst(substr(hash('sha256', $this->salt.'+'.$class->name.'+'.serialize($definition->getTag('proxy'))), -7));
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\DependencyInjection;






class TypedReference extends Reference
{
private string $type;
private ?string $name;
private array $attributes;








public function __construct(string $id, string $type, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, ?string $name = null, array $attributes = [])
{
$this->name = $type === $id ? $name : null;
parent::__construct($id, $invalidBehavior);
$this->type = $type;
$this->attributes = $attributes;
}




public function getType()
{
return $this->type;
}

public function getName(): ?string
{
return $this->name;
}

public function getAttributes(): array
{
return $this->attributes;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Contracts\Service\ServiceLocatorTrait;
use Symfony\Contracts\Service\ServiceProviderInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;

/**
@template-covariant
@implements




*/
class ServiceLocator implements ServiceProviderInterface, \Countable
{
use ServiceLocatorTrait {
get as private doGet;
}

private ?string $externalId = null;
private ?Container $container = null;

public function get(string $id): mixed
{
if (!$this->externalId) {
return $this->doGet($id);
}

try {
return $this->doGet($id);
} catch (RuntimeException $e) {
$what = \sprintf('service "%s" required by "%s"', $id, $this->externalId);
$message = preg_replace('/service "\.service_locator\.[^"]++"/', $what, $e->getMessage());

if ($e->getMessage() === $message) {
$message = \sprintf('Cannot resolve %s: %s', $what, $message);
}

$r = new \ReflectionProperty($e, 'message');
$r->setValue($e, $message);

throw $e;
}
}




public function __invoke(string $id)
{
return isset($this->factories[$id]) ? $this->get($id) : null;
}




public function withContext(string $externalId, Container $container): static
{
$locator = clone $this;
$locator->externalId = $externalId;
$locator->container = $container;

return $locator;
}

public function count(): int
{
return \count($this->getProvidedServices());
}

private function createNotFoundException(string $id): NotFoundExceptionInterface
{
if ($this->loading) {
$msg = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $this->formatAlternatives());

return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], $msg);
}

$class = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 4);
$class = isset($class[3]['object']) ? $class[3]['object']::class : null;
$externalId = $this->externalId ?: $class;

$msg = [];
$msg[] = \sprintf('Service "%s" not found:', $id);

if (!$this->container) {
$class = null;
} elseif ($this->container->has($id) || isset($this->container->getRemovedIds()[$id])) {
$msg[] = 'even though it exists in the app\'s container,';
} else {
try {
$this->container->get($id);
$class = null;
} catch (ServiceNotFoundException $e) {
if ($e->getAlternatives()) {
$msg[] = \sprintf('did you mean %s? Anyway,', $this->formatAlternatives($e->getAlternatives(), 'or'));
} else {
$class = null;
}
}
}
if ($externalId) {
$msg[] = \sprintf('the container inside "%s" is a smaller service locator that %s', $externalId, $this->formatAlternatives());
} else {
$msg[] = \sprintf('the current service locator %s', $this->formatAlternatives());
}

if (!$class) {

} elseif (is_subclass_of($class, ServiceSubscriberInterface::class)) {
$msg[] = \sprintf('Unless you need extra laziness, try using dependency injection instead. Otherwise, you need to declare it using "%s::getSubscribedServices()".', preg_replace('/([^\\\\]++\\\\)++/', '', $class));
} else {
$msg[] = 'Try using dependency injection instead.';
}

return new ServiceNotFoundException($id, end($this->loading) ?: null, null, [], implode(' ', $msg));
}

private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
{
return new ServiceCircularReferenceException($id, $path);
}

private function formatAlternatives(?array $alternatives = null, string $separator = 'and'): string
{
$format = '"%s"%s';
if (null === $alternatives) {
if (!$alternatives = array_keys($this->factories)) {
return 'is empty...';
}
$format = \sprintf('only knows about the %s service%s.', $format, 1 < \count($alternatives) ? 's' : '');
}
$last = array_pop($alternatives);

return \sprintf($format, $alternatives ? implode('", "', $alternatives) : $last, $alternatives ? \sprintf(' %s "%s"', $separator, $last) : '');
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

class Alias
{
private const DEFAULT_DEPRECATION_TEMPLATE = 'The "%alias_id%" service alias is deprecated. You should stop using it, as it will be removed in the future.';

private string $id;
private bool $public;
private array $deprecation = [];

public function __construct(string $id, bool $public = false)
{
$this->id = $id;
$this->public = $public;
}




public function isPublic(): bool
{
return $this->public;
}






public function setPublic(bool $boolean): static
{
$this->public = $boolean;

return $this;
}




public function isPrivate(): bool
{
return !$this->public;
}













public function setDeprecated(string $package, string $version, string $message): static
{
if ('' !== $message) {
if (preg_match('#[\r\n]|\*/#', $message)) {
throw new InvalidArgumentException('Invalid characters found in deprecation template.');
}

if (!str_contains($message, '%alias_id%')) {
throw new InvalidArgumentException('The deprecation template must contain the "%alias_id%" placeholder.');
}
}

$this->deprecation = ['package' => $package, 'version' => $version, 'message' => $message ?: self::DEFAULT_DEPRECATION_TEMPLATE];

return $this;
}

public function isDeprecated(): bool
{
return (bool) $this->deprecation;
}




public function getDeprecation(string $id): array
{
return [
'package' => $this->deprecation['package'],
'version' => $this->deprecation['version'],
'message' => str_replace('%alias_id%', $id, $this->deprecation['message']),
];
}

public function __toString(): string
{
return $this->id;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;






class Definition
{
private const DEFAULT_DEPRECATION_TEMPLATE = 'The "%service_id%" service is deprecated. You should stop using it, as it will be removed in the future.';

private ?string $class = null;
private ?string $file = null;
private string|array|null $factory = null;
private bool $shared = true;
private array $deprecation = [];
private array $properties = [];
private array $calls = [];
private array $instanceof = [];
private bool $autoconfigured = false;
private string|array|null $configurator = null;
private array $tags = [];
private bool $public = false;
private bool $synthetic = false;
private bool $abstract = false;
private bool $lazy = false;
private ?array $decoratedService = null;
private bool $autowired = false;
private array $changes = [];
private array $bindings = [];
private array $errors = [];

protected $arguments = [];






public ?string $innerServiceId = null;






public ?int $decorationOnInvalid = null;

public function __construct(?string $class = null, array $arguments = [])
{
if (null !== $class) {
$this->setClass($class);
}
$this->arguments = $arguments;
}




public function getChanges(): array
{
return $this->changes;
}








public function setChanges(array $changes): static
{
$this->changes = $changes;

return $this;
}








public function setFactory(string|array|Reference|null $factory): static
{
$this->changes['factory'] = true;

if (\is_string($factory) && str_contains($factory, '::')) {
$factory = explode('::', $factory, 2);
} elseif ($factory instanceof Reference) {
$factory = [$factory, '__invoke'];
}

$this->factory = $factory;

return $this;
}






public function getFactory(): string|array|null
{
return $this->factory;
}











public function setDecoratedService(?string $id, ?string $renamedId = null, int $priority = 0, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE): static
{
if ($renamedId && $id === $renamedId) {
throw new InvalidArgumentException(\sprintf('The decorated service inner name for "%s" must be different than the service name itself.', $id));
}

$this->changes['decorated_service'] = true;

if (null === $id) {
$this->decoratedService = null;
} else {
$this->decoratedService = [$id, $renamedId, $priority];

if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
$this->decoratedService[] = $invalidBehavior;
}
}

return $this;
}






public function getDecoratedService(): ?array
{
return $this->decoratedService;
}






public function setClass(?string $class): static
{
$this->changes['class'] = true;

$this->class = $class;

return $this;
}




public function getClass(): ?string
{
return $this->class;
}






public function setArguments(array $arguments): static
{
$this->arguments = $arguments;

return $this;
}






public function setProperties(array $properties): static
{
$this->properties = $properties;

return $this;
}




public function getProperties(): array
{
return $this->properties;
}






public function setProperty(string $name, mixed $value): static
{
$this->properties[$name] = $value;

return $this;
}






public function addArgument(mixed $argument): static
{
$this->arguments[] = $argument;

return $this;
}








public function replaceArgument(int|string $index, mixed $argument): static
{
if (0 === \count($this->arguments)) {
throw new OutOfBoundsException(\sprintf('Cannot replace arguments for class "%s" if none have been configured yet.', $this->class));
}

if (\is_int($index) && ($index < 0 || $index > \count($this->arguments) - 1)) {
throw new OutOfBoundsException(\sprintf('The index "%d" is not in the range [0, %d] of the arguments of class "%s".', $index, \count($this->arguments) - 1, $this->class));
}

if (!\array_key_exists($index, $this->arguments)) {
throw new OutOfBoundsException(\sprintf('The argument "%s" doesn\'t exist in class "%s".', $index, $this->class));
}

$this->arguments[$index] = $argument;

return $this;
}






public function setArgument(int|string $key, mixed $value): static
{
$this->arguments[$key] = $value;

return $this;
}




public function getArguments(): array
{
return $this->arguments;
}






public function getArgument(int|string $index): mixed
{
if (!\array_key_exists($index, $this->arguments)) {
throw new OutOfBoundsException(\sprintf('The argument "%s" doesn\'t exist in class "%s".', $index, $this->class));
}

return $this->arguments[$index];
}






public function setMethodCalls(array $calls = []): static
{
$this->calls = [];
foreach ($calls as $call) {
$this->addMethodCall($call[0], $call[1], $call[2] ?? false);
}

return $this;
}












public function addMethodCall(string $method, array $arguments = [], bool $returnsClone = false): static
{
if (empty($method)) {
throw new InvalidArgumentException('Method name cannot be empty.');
}
$this->calls[] = $returnsClone ? [$method, $arguments, true] : [$method, $arguments];

return $this;
}






public function removeMethodCall(string $method): static
{
foreach ($this->calls as $i => $call) {
if ($call[0] === $method) {
unset($this->calls[$i]);
}
}

return $this;
}




public function hasMethodCall(string $method): bool
{
foreach ($this->calls as $call) {
if ($call[0] === $method) {
return true;
}
}

return false;
}




public function getMethodCalls(): array
{
return $this->calls;
}








public function setInstanceofConditionals(array $instanceof): static
{
$this->instanceof = $instanceof;

return $this;
}






public function getInstanceofConditionals(): array
{
return $this->instanceof;
}






public function setAutoconfigured(bool $autoconfigured): static
{
$this->changes['autoconfigured'] = true;

$this->autoconfigured = $autoconfigured;

return $this;
}

public function isAutoconfigured(): bool
{
return $this->autoconfigured;
}






public function setTags(array $tags): static
{
$this->tags = $tags;

return $this;
}




public function getTags(): array
{
return $this->tags;
}




public function getTag(string $name): array
{
return $this->tags[$name] ?? [];
}






public function addTag(string $name, array $attributes = []): static
{
$this->tags[$name][] = $attributes;

return $this;
}




public function hasTag(string $name): bool
{
return isset($this->tags[$name]);
}






public function clearTag(string $name): static
{
unset($this->tags[$name]);

return $this;
}






public function clearTags(): static
{
$this->tags = [];

return $this;
}






public function setFile(?string $file): static
{
$this->changes['file'] = true;

$this->file = $file;

return $this;
}




public function getFile(): ?string
{
return $this->file;
}






public function setShared(bool $shared): static
{
$this->changes['shared'] = true;

$this->shared = $shared;

return $this;
}




public function isShared(): bool
{
return $this->shared;
}






public function setPublic(bool $boolean): static
{
$this->changes['public'] = true;

$this->public = $boolean;

return $this;
}




public function isPublic(): bool
{
return $this->public;
}




public function isPrivate(): bool
{
return !$this->public;
}






public function setLazy(bool $lazy): static
{
$this->changes['lazy'] = true;

$this->lazy = $lazy;

return $this;
}




public function isLazy(): bool
{
return $this->lazy;
}







public function setSynthetic(bool $boolean): static
{
$this->synthetic = $boolean;

if (!isset($this->changes['public'])) {
$this->setPublic(true);
}

return $this;
}





public function isSynthetic(): bool
{
return $this->synthetic;
}







public function setAbstract(bool $boolean): static
{
$this->abstract = $boolean;

return $this;
}





public function isAbstract(): bool
{
return $this->abstract;
}













public function setDeprecated(string $package, string $version, string $message): static
{
if ('' !== $message) {
if (preg_match('#[\r\n]|\*/#', $message)) {
throw new InvalidArgumentException('Invalid characters found in deprecation template.');
}

if (!str_contains($message, '%service_id%')) {
throw new InvalidArgumentException('The deprecation template must contain the "%service_id%" placeholder.');
}
}

$this->changes['deprecated'] = true;
$this->deprecation = ['package' => $package, 'version' => $version, 'message' => $message ?: self::DEFAULT_DEPRECATION_TEMPLATE];

return $this;
}





public function isDeprecated(): bool
{
return (bool) $this->deprecation;
}




public function getDeprecation(string $id): array
{
return [
'package' => $this->deprecation['package'],
'version' => $this->deprecation['version'],
'message' => str_replace('%service_id%', $id, $this->deprecation['message']),
];
}








public function setConfigurator(string|array|Reference|null $configurator): static
{
$this->changes['configurator'] = true;

if (\is_string($configurator) && str_contains($configurator, '::')) {
$configurator = explode('::', $configurator, 2);
} elseif ($configurator instanceof Reference) {
$configurator = [$configurator, '__invoke'];
}

$this->configurator = $configurator;

return $this;
}




public function getConfigurator(): string|array|null
{
return $this->configurator;
}




public function isAutowired(): bool
{
return $this->autowired;
}






public function setAutowired(bool $autowired): static
{
$this->changes['autowired'] = true;

$this->autowired = $autowired;

return $this;
}






public function getBindings(): array
{
return $this->bindings;
}










public function setBindings(array $bindings): static
{
foreach ($bindings as $key => $binding) {
if (0 < strpos($key, '$') && $key !== $k = preg_replace('/[ \t]*\$/', ' $', $key)) {
unset($bindings[$key]);
$bindings[$key = $k] = $binding;
}
if (!$binding instanceof BoundArgument) {
$bindings[$key] = new BoundArgument($binding);
}
}

$this->bindings = $bindings;

return $this;
}






public function addError(string|\Closure|self $error): static
{
if ($error instanceof self) {
$this->errors = array_merge($this->errors, $error->errors);
} else {
$this->errors[] = $error;
}

return $this;
}




public function getErrors(): array
{
foreach ($this->errors as $i => $error) {
if ($error instanceof \Closure) {
$this->errors[$i] = (string) $error();
} elseif (!\is_string($error)) {
$this->errors[$i] = (string) $error;
}
}

return $this->errors;
}

public function hasErrors(): bool
{
return (bool) $this->errors;
}
}
<?php










namespace Symfony\Component\DependencyInjection;








interface ContainerAwareInterface
{





public function setContainer(?ContainerInterface $container);
}
<?php










namespace Symfony\Component\DependencyInjection;






interface TaggedContainerInterface extends ContainerInterface
{





public function findTaggedServiceIds(string $name): array;
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class EnvPlaceholderParameterBag extends ParameterBag
{
private string $envPlaceholderUniquePrefix;
private array $envPlaceholders = [];
private array $unusedEnvPlaceholders = [];
private array $providedTypes = [];

private static int $counter = 0;

public function get(string $name): array|bool|string|int|float|\UnitEnum|null
{
if (str_starts_with($name, 'env(') && str_ends_with($name, ')') && 'env()' !== $name) {
$env = substr($name, 4, -1);

if (isset($this->envPlaceholders[$env])) {
foreach ($this->envPlaceholders[$env] as $placeholder) {
return $placeholder; 
}
}
if (isset($this->unusedEnvPlaceholders[$env])) {
foreach ($this->unusedEnvPlaceholders[$env] as $placeholder) {
return $placeholder; 
}
}
if (!preg_match('/^(?:[-.\w\\\\]*+:)*+\w*+$/', $env)) {
throw new InvalidArgumentException(\sprintf('Invalid %s name: only "word" characters are allowed.', $name));
}
if ($this->has($name) && null !== ($defaultValue = parent::get($name)) && !\is_string($defaultValue)) {
throw new RuntimeException(\sprintf('The default value of an env() parameter must be a string or null, but "%s" given to "%s".', get_debug_type($defaultValue), $name));
}

$uniqueName = hash('xxh128', $name.'_'.self::$counter++);
$placeholder = \sprintf('%s_%s_%s', $this->getEnvPlaceholderUniquePrefix(), strtr($env, ':-.\\', '____'), $uniqueName);
$this->envPlaceholders[$env][$placeholder] = $placeholder;

return $placeholder;
}

return parent::get($name);
}




public function getEnvPlaceholderUniquePrefix(): string
{
if (!isset($this->envPlaceholderUniquePrefix)) {
$reproducibleEntropy = unserialize(serialize($this->parameters));
array_walk_recursive($reproducibleEntropy, function (&$v) { $v = null; });
$this->envPlaceholderUniquePrefix = 'env_'.substr(hash('xxh128', serialize($reproducibleEntropy)), -16);
}

return $this->envPlaceholderUniquePrefix;
}






public function getEnvPlaceholders(): array
{
return $this->envPlaceholders;
}

public function getUnusedEnvPlaceholders(): array
{
return $this->unusedEnvPlaceholders;
}




public function clearUnusedEnvPlaceholders()
{
$this->unusedEnvPlaceholders = [];
}






public function mergeEnvPlaceholders(self $bag)
{
if ($newPlaceholders = $bag->getEnvPlaceholders()) {
$this->envPlaceholders += $newPlaceholders;

foreach ($newPlaceholders as $env => $placeholders) {
$this->envPlaceholders[$env] += $placeholders;
}
}

if ($newUnusedPlaceholders = $bag->getUnusedEnvPlaceholders()) {
$this->unusedEnvPlaceholders += $newUnusedPlaceholders;

foreach ($newUnusedPlaceholders as $env => $placeholders) {
$this->unusedEnvPlaceholders[$env] += $placeholders;
}
}
}






public function setProvidedTypes(array $providedTypes)
{
$this->providedTypes = $providedTypes;
}






public function getProvidedTypes(): array
{
return $this->providedTypes;
}




public function resolve()
{
if ($this->resolved) {
return;
}
parent::resolve();

foreach ($this->envPlaceholders as $env => $placeholders) {
if ($this->has($name = "env($env)") && null !== ($default = $this->parameters[$name]) && !\is_string($default)) {
throw new RuntimeException(\sprintf('The default value of env parameter "%s" must be a string or null, "%s" given.', $env, get_debug_type($default)));
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;






class ParameterBag implements ParameterBagInterface
{
protected $parameters = [];
protected $resolved = false;
protected array $deprecatedParameters = [];

public function __construct(array $parameters = [])
{
$this->add($parameters);
}




public function clear()
{
$this->parameters = [];
}




public function add(array $parameters)
{
foreach ($parameters as $key => $value) {
$this->set($key, $value);
}
}

public function all(): array
{
return $this->parameters;
}

public function allDeprecated(): array
{
return $this->deprecatedParameters;
}

public function get(string $name): array|bool|string|int|float|\UnitEnum|null
{
if (!\array_key_exists($name, $this->parameters)) {
if (!$name) {
throw new ParameterNotFoundException($name);
}

$alternatives = [];
foreach ($this->parameters as $key => $parameterValue) {
$lev = levenshtein($name, $key);
if ($lev <= \strlen($name) / 3 || str_contains($key, $name)) {
$alternatives[] = $key;
}
}

$nonNestedAlternative = null;
if (!\count($alternatives) && str_contains($name, '.')) {
$namePartsLength = array_map('strlen', explode('.', $name));
$key = substr($name, 0, -1 * (1 + array_pop($namePartsLength)));
while (\count($namePartsLength)) {
if ($this->has($key)) {
if (\is_array($this->get($key))) {
$nonNestedAlternative = $key;
}
break;
}

$key = substr($key, 0, -1 * (1 + array_pop($namePartsLength)));
}
}

throw new ParameterNotFoundException($name, null, null, null, $alternatives, $nonNestedAlternative);
}

if (isset($this->deprecatedParameters[$name])) {
trigger_deprecation(...$this->deprecatedParameters[$name]);
}

return $this->parameters[$name];
}




public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value)
{
if (is_numeric($name)) {
trigger_deprecation('symfony/dependency-injection', '6.2', \sprintf('Using numeric parameter name "%s" is deprecated and will throw as of 7.0.', $name));


}

$this->parameters[$name] = $value;
}








public function deprecate(string $name, string $package, string $version, string $message = 'The parameter "%s" is deprecated.')
{
if (!\array_key_exists($name, $this->parameters)) {
throw new ParameterNotFoundException($name);
}

$this->deprecatedParameters[$name] = [$package, $version, $message, $name];
}

public function has(string $name): bool
{
return \array_key_exists($name, $this->parameters);
}




public function remove(string $name)
{
unset($this->parameters[$name], $this->deprecatedParameters[$name]);
}




public function resolve()
{
if ($this->resolved) {
return;
}

$parameters = [];
foreach ($this->parameters as $key => $value) {
try {
$value = $this->resolveValue($value);
$parameters[$key] = $this->unescapeValue($value);
} catch (ParameterNotFoundException $e) {
$e->setSourceKey($key);

throw $e;
}
}

$this->parameters = $parameters;
$this->resolved = true;
}

/**
@template
@psalm-return(TValue is scalar ? array|scalar : array<array|scalar>)










*/
public function resolveValue(mixed $value, array $resolving = []): mixed
{
if (\is_array($value)) {
$args = [];
foreach ($value as $key => $v) {
$resolvedKey = \is_string($key) ? $this->resolveValue($key, $resolving) : $key;
if (!\is_scalar($resolvedKey) && !$resolvedKey instanceof \Stringable) {
throw new RuntimeException(\sprintf('Array keys must be a scalar-value, but found key "%s" to resolve to type "%s".', $key, get_debug_type($resolvedKey)));
}

$args[$resolvedKey] = $this->resolveValue($v, $resolving);
}

return $args;
}

if (!\is_string($value) || '' === $value || !str_contains($value, '%')) {
return $value;
}

return $this->resolveString($value, $resolving);
}










public function resolveString(string $value, array $resolving = []): mixed
{



if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
$key = $match[1];

if (isset($resolving[$key])) {
throw new ParameterCircularReferenceException(array_keys($resolving));
}

$resolving[$key] = true;

return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
}

return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($resolving, $value) {

if (!isset($match[1])) {
return '%%';
}

$key = $match[1];
if (isset($resolving[$key])) {
throw new ParameterCircularReferenceException(array_keys($resolving));
}

$resolved = $this->get($key);

if (!\is_string($resolved) && !is_numeric($resolved)) {
throw new RuntimeException(\sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".', $key, get_debug_type($resolved), $value));
}

$resolved = (string) $resolved;
$resolving[$key] = true;

return $this->isResolved() ? $resolved : $this->resolveString($resolved, $resolving);
}, $value);
}




public function isResolved()
{
return $this->resolved;
}

public function escapeValue(mixed $value): mixed
{
if (\is_string($value)) {
return str_replace('%', '%%', $value);
}

if (\is_array($value)) {
$result = [];
foreach ($value as $k => $v) {
$result[$k] = $this->escapeValue($v);
}

return $result;
}

return $value;
}

public function unescapeValue(mixed $value): mixed
{
if (\is_string($value)) {
return str_replace('%%', '%', $value);
}

if (\is_array($value)) {
$result = [];
foreach ($value as $k => $v) {
$result[$k] = $this->unescapeValue($v);
}

return $result;
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;






interface ContainerBagInterface extends ContainerInterface
{



public function all(): array;

/**
@template
@psalm-return(TValue is scalar ? array|scalar : array<array|scalar>)









*/
public function resolveValue(mixed $value);




public function escapeValue(mixed $value): mixed;




public function unescapeValue(mixed $value): mixed;
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Container;




class ContainerBag extends FrozenParameterBag implements ContainerBagInterface
{
private Container $container;

public function __construct(Container $container)
{
$this->container = $container;
}

public function all(): array
{
return $this->container->getParameterBag()->all();
}

public function get(string $name): array|bool|string|int|float|\UnitEnum|null
{
return $this->container->getParameter($name);
}

public function has(string $name): bool
{
return $this->container->hasParameter($name);
}
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\LogicException;






class FrozenParameterBag extends ParameterBag
{






public function __construct(
array $parameters = [],
protected array $deprecatedParameters = [],
) {
$this->parameters = $parameters;
$this->resolved = true;
}




public function clear()
{
throw new LogicException('Impossible to call clear() on a frozen ParameterBag.');
}




public function add(array $parameters)
{
throw new LogicException('Impossible to call add() on a frozen ParameterBag.');
}




public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value)
{
throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
}




public function deprecate(string $name, string $package, string $version, string $message = 'The parameter "%s" is deprecated.')
{
throw new LogicException('Impossible to call deprecate() on a frozen ParameterBag.');
}




public function remove(string $name)
{
throw new LogicException('Impossible to call remove() on a frozen ParameterBag.');
}
}
<?php










namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;






interface ParameterBagInterface
{







public function clear();








public function add(array $parameters);




public function all(): array;






public function get(string $name): array|bool|string|int|float|\UnitEnum|null;






public function remove(string $name);








public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value);




public function has(string $name): bool;






public function resolve();








public function resolveValue(mixed $value);




public function escapeValue(mixed $value): mixed;




public function unescapeValue(mixed $value): mixed;
}
<?php










namespace Symfony\Component\DependencyInjection;

use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;






final class ReverseContainer
{
private Container $serviceContainer;
private ContainerInterface $reversibleLocator;
private string $tagName;
private \Closure $getServiceId;

public function __construct(Container $serviceContainer, ContainerInterface $reversibleLocator, string $tagName = 'container.reversible')
{
$this->serviceContainer = $serviceContainer;
$this->reversibleLocator = $reversibleLocator;
$this->tagName = $tagName;
$this->getServiceId = \Closure::bind(fn (object $service): ?string => array_search($service, $this->services, true) ?: array_search($service, $this->privates, true) ?: null, $serviceContainer, Container::class);
}






public function getId(object $service): ?string
{
if ($this->serviceContainer === $service) {
return 'service_container';
}

if (null === $id = ($this->getServiceId)($service)) {
return null;
}

if ($this->serviceContainer->has($id) || $this->reversibleLocator->has($id)) {
return $id;
}

return null;
}




public function getService(string $id): object
{
if ($this->reversibleLocator->has($id)) {
return $this->reversibleLocator->get($id);
}

if (isset($this->serviceContainer->getRemovedIds()[$id])) {
throw new ServiceNotFoundException($id, null, null, [], \sprintf('The "%s" service is private and cannot be accessed by reference. You should either make it public, or tag it as "%s".', $id, $this->tagName));
}

return $this->serviceContainer->get($id);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Config;

use Symfony\Component\Config\Resource\ResourceInterface;








class ContainerParametersResource implements ResourceInterface
{
private array $parameters;




public function __construct(array $parameters)
{
$this->parameters = $parameters;
}

public function __toString(): string
{
return 'container_parameters_'.hash('xxh128', serialize($this->parameters));
}

public function getParameters(): array
{
return $this->parameters;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Config;

use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\Config\ResourceCheckerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;




class ContainerParametersResourceChecker implements ResourceCheckerInterface
{
private ContainerInterface $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}

public function supports(ResourceInterface $metadata): bool
{
return $metadata instanceof ContainerParametersResource;
}

public function isFresh(ResourceInterface $resource, int $timestamp): bool
{
foreach ($resource->getParameters() as $key => $value) {
if (!$this->container->hasParameter($key) || $this->container->getParameter($key) !== $value) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;










class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
{
private ?\Closure $serviceCompiler;

private ?\Closure $getEnv;

public function __construct(?callable $serviceCompiler = null, ?\Closure $getEnv = null)
{
$this->serviceCompiler = null === $serviceCompiler ? null : $serviceCompiler(...);
$this->getEnv = $getEnv;
}

public function getFunctions(): array
{
return [
new ExpressionFunction('service', $this->serviceCompiler ?? fn ($arg) => \sprintf('$container->get(%s)', $arg), fn (array $variables, $value) => $variables['container']->get($value)),

new ExpressionFunction('parameter', fn ($arg) => \sprintf('$container->getParameter(%s)', $arg), fn (array $variables, $value) => $variables['container']->getParameter($value)),

new ExpressionFunction('env', fn ($arg) => \sprintf('$container->getEnv(%s)', $arg), function (array $variables, $value) {
if (!$this->getEnv) {
throw new LogicException('You need to pass a getEnv closure to the expression language provider to use the "env" function.');
}

return ($this->getEnv)($value);
}),

new ExpressionFunction('arg', fn ($arg) => \sprintf('$args?->get(%s)', $arg), fn (array $variables, $value) => $variables['args']?->get($value)),
];
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ServiceLocator;






final class ServiceLocatorTagPass extends AbstractRecursivePass
{
use PriorityTaggedServiceTrait;

protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof ServiceLocatorArgument) {
if ($value->getTaggedIteratorArgument()) {
$value->setValues($this->findAndSortTaggedServices($value->getTaggedIteratorArgument(), $this->container));
}

return self::register($this->container, $value->getValues());
}

if ($value instanceof Definition) {
$value->setBindings(parent::processValue($value->getBindings()));
}

if (!$value instanceof Definition || !$value->hasTag('container.service_locator')) {
return parent::processValue($value, $isRoot);
}

if (!$value->getClass()) {
$value->setClass(ServiceLocator::class);
}

$services = $value->getArguments()[0] ?? null;

if ($services instanceof TaggedIteratorArgument) {
$services = $this->findAndSortTaggedServices($services, $this->container);
}

if (!\is_array($services)) {
throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set.', $this->currentId));
}

$i = 0;

foreach ($services as $k => $v) {
if ($v instanceof ServiceClosureArgument) {
continue;
}

if ($i === $k) {
if ($v instanceof Reference) {
unset($services[$k]);
$k = (string) $v;
}
++$i;
} elseif (\is_int($k)) {
$i = null;
}

$services[$k] = new ServiceClosureArgument($v);
}
ksort($services);

$value->setArgument(0, $services);

$id = '.service_locator.'.ContainerBuilder::hash($value);

if ($isRoot) {
if ($id !== $this->currentId) {
$this->container->setAlias($id, new Alias($this->currentId, false));
}

return $value;
}

$this->container->setDefinition($id, $value->setPublic(false));

return new Reference($id);
}

public static function register(ContainerBuilder $container, array $map, ?string $callerId = null): Reference
{
foreach ($map as $k => $v) {
$map[$k] = new ServiceClosureArgument($v);
}

$locator = (new Definition(ServiceLocator::class))
->addArgument($map)
->addTag('container.service_locator');

if (null !== $callerId && $container->hasDefinition($callerId)) {
$locator->setBindings($container->getDefinition($callerId)->getBindings());
}

if (!$container->hasDefinition($id = '.service_locator.'.ContainerBuilder::hash($locator))) {
$container->setDefinition($id, $locator);
}

if (null !== $callerId) {
$locatorId = $id;



$container->register($id .= '.'.$callerId, ServiceLocator::class)
->setFactory([new Reference($locatorId), 'withContext'])
->addTag('container.service_locator_context', ['id' => $callerId])
->addArgument($callerId)
->addArgument(new Reference('service_container'));
}

return new Reference($id);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;











class CheckCircularReferencesPass implements CompilerPassInterface
{
private array $currentPath;
private array $checkedNodes;
private array $checkedLazyNodes;






public function process(ContainerBuilder $container)
{
$graph = $container->getCompiler()->getServiceReferenceGraph();

$this->checkedNodes = [];
foreach ($graph->getNodes() as $id => $node) {
$this->currentPath = [$id];

$this->checkOutEdges($node->getOutEdges());
}
}








private function checkOutEdges(array $edges): void
{
foreach ($edges as $edge) {
$node = $edge->getDestNode();
$id = $node->getId();

if (!empty($this->checkedNodes[$id])) {
continue;
}

$isLeaf = (bool) $node->getValue();
$isConcrete = !$edge->isLazy() && !$edge->isWeak();


if (!empty($this->checkedLazyNodes[$id]) && (!$isLeaf || !$isConcrete)) {
continue;
}


if (!$isLeaf || $isConcrete) {
$searchKey = array_search($id, $this->currentPath);
$this->currentPath[] = $id;

if (false !== $searchKey) {
throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey));
}

$this->checkOutEdges($node->getOutEdges());

$this->checkedNodes[$id] = true;
unset($this->checkedLazyNodes[$id]);
} else {
$this->checkedLazyNodes[$id] = true;
}

array_pop($this->currentPath);
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;






class ValidateEnvPlaceholdersPass implements CompilerPassInterface
{
private const TYPE_FIXTURES = ['array' => [], 'bool' => false, 'float' => 0.0, 'int' => 0, 'string' => ''];

private array $extensionConfig = [];




public function process(ContainerBuilder $container)
{
$this->extensionConfig = [];

if (!class_exists(BaseNode::class) || !$extensions = $container->getExtensions()) {
return;
}

$resolvingBag = $container->getParameterBag();
if (!$resolvingBag instanceof EnvPlaceholderParameterBag) {
return;
}

$defaultBag = new ParameterBag($resolvingBag->all());
$envTypes = $resolvingBag->getProvidedTypes();
foreach ($resolvingBag->getEnvPlaceholders() + $resolvingBag->getUnusedEnvPlaceholders() as $env => $placeholders) {
$values = $this->getPlaceholderValues($env, $defaultBag, $envTypes);

foreach ($placeholders as $placeholder) {
BaseNode::setPlaceholder($placeholder, $values);
}
}

$processor = new Processor();

foreach ($extensions as $name => $extension) {
if (!($extension instanceof ConfigurationExtensionInterface || $extension instanceof ConfigurationInterface)
|| !$config = array_filter($container->getExtensionConfig($name))
) {

continue;
}

$config = $resolvingBag->resolveValue($config);

if ($extension instanceof ConfigurationInterface) {
$configuration = $extension;
} elseif (null === $configuration = $extension->getConfiguration($config, $container)) {
continue;
}

$this->extensionConfig[$name] = $processor->processConfiguration($configuration, $config);
}

$resolvingBag->clearUnusedEnvPlaceholders();
}




public function getExtensionConfig(): array
{
try {
return $this->extensionConfig;
} finally {
$this->extensionConfig = [];
}
}






private function getPlaceholderValues(string $env, ParameterBag $defaultBag, array $envTypes): array
{
if (false === $i = strpos($env, ':')) {
[$default, $defaultType] = $this->getParameterDefaultAndDefaultType("env($env)", $defaultBag);

return [$defaultType => $default];
}

$prefix = substr($env, 0, $i);
if ('default' === $prefix) {
$parts = explode(':', $env);
array_shift($parts); 
$parameter = array_shift($parts); 

[$defaultParameter, $defaultParameterType] = $this->getParameterDefaultAndDefaultType($parameter, $defaultBag);

return [
$defaultParameterType => $defaultParameter,
...$this->getPlaceholderValues(implode(':', $parts), $defaultBag, $envTypes),
];
}

$values = [];
foreach ($envTypes[$prefix] ?? ['string'] as $type) {
$values[$type] = self::TYPE_FIXTURES[$type] ?? null;
}

return $values;
}




private function getParameterDefaultAndDefaultType(string $name, ParameterBag $defaultBag): array
{
$default = $defaultBag->has($name) ? $defaultBag->get($name) : self::TYPE_FIXTURES['string'];
$defaultType = null !== $default ? get_debug_type($default) : 'string';

return [$default, $defaultType];
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;






class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
{
protected bool $skipScalars = false;

private ParameterBagInterface $bag;

public function __construct(
private bool $resolveArrays = true,
private bool $throwOnResolveException = true,
) {
}






public function process(ContainerBuilder $container)
{
$this->bag = $container->getParameterBag();

try {
parent::process($container);

$aliases = [];
foreach ($container->getAliases() as $name => $target) {
$this->currentId = $name;
$aliases[$this->bag->resolveValue($name)] = $target;
}
$container->setAliases($aliases);
} catch (ParameterNotFoundException $e) {
$e->setSourceId($this->currentId);

throw $e;
}

$this->bag->resolve();
unset($this->bag);
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (\is_string($value)) {
try {
$v = $this->bag->resolveValue($value);
} catch (ParameterNotFoundException $e) {
if ($this->throwOnResolveException) {
throw $e;
}

$v = null;
$this->container->getDefinition($this->currentId)->addError($e->getMessage());
}

return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value;
}
if ($value instanceof Definition) {
$value->setBindings($this->processValue($value->getBindings()));
$changes = $value->getChanges();
if (isset($changes['class'])) {
$value->setClass($this->bag->resolveValue($value->getClass()));
}
if (isset($changes['file'])) {
$value->setFile($this->bag->resolveValue($value->getFile()));
}
$tags = $value->getTags();
if (isset($tags['proxy'])) {
$tags['proxy'] = $this->bag->resolveValue($tags['proxy']);
$value->setTags($tags);
}
}

$value = parent::processValue($value, $isRoot);

if ($value && \is_array($value)) {
$value = array_combine($this->bag->resolveValue(array_keys($value)), $value);
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;

final class AliasDeprecatedPublicServicesPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $aliases = [];

public function process(ContainerBuilder $container): void
{
foreach ($container->findTaggedServiceIds('container.private') as $id => $tags) {
if (null === $package = $tags[0]['package'] ?? null) {
throw new InvalidArgumentException(\sprintf('The "package" attribute is mandatory for the "container.private" tag on the "%s" service.', $id));
}

if (null === $version = $tags[0]['version'] ?? null) {
throw new InvalidArgumentException(\sprintf('The "version" attribute is mandatory for the "container.private" tag on the "%s" service.', $id));
}

$definition = $container->getDefinition($id);
if (!$definition->isPublic() || $definition->isPrivate()) {
continue;
}

$container
->setAlias($id, $aliasId = '.container.private.'.$id)
->setPublic(true)
->setDeprecated($package, $version, 'Accessing the "%alias_id%" service directly from the container is deprecated, use dependency injection instead.');

$container->setDefinition($aliasId, $definition);

$this->aliases[$id] = $aliasId;
}

parent::process($container);
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Reference && isset($this->aliases[$id = (string) $value])) {
return new Reference($this->aliases[$id], $value->getInvalidBehavior());
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;








class PassConfig
{
public const TYPE_AFTER_REMOVING = 'afterRemoving';
public const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
public const TYPE_BEFORE_REMOVING = 'beforeRemoving';
public const TYPE_OPTIMIZE = 'optimization';
public const TYPE_REMOVE = 'removing';

private MergeExtensionConfigurationPass $mergePass;
private array $afterRemovingPasses;
private array $beforeOptimizationPasses;
private array $beforeRemovingPasses = [];
private array $optimizationPasses;
private array $removingPasses;

public function __construct()
{
$this->mergePass = new MergeExtensionConfigurationPass();

$this->beforeOptimizationPasses = [
100 => [
new ResolveClassPass(),
new RegisterAutoconfigureAttributesPass(),
new AutowireAsDecoratorPass(),
new AttributeAutoconfigurationPass(),
new ResolveInstanceofConditionalsPass(),
new RegisterEnvVarProcessorsPass(),
],
-1000 => [new ExtensionCompilerPass()],
];

$this->optimizationPasses = [[
new AutoAliasServicePass(),
new ValidateEnvPlaceholdersPass(),
new ResolveDecoratorStackPass(),
new ResolveChildDefinitionsPass(),
new RegisterServiceSubscribersPass(),
new ResolveParameterPlaceHoldersPass(false, false),
new ResolveFactoryClassPass(),
new ResolveNamedArgumentsPass(),
new AutowireRequiredMethodsPass(),
new AutowireRequiredPropertiesPass(),
new ResolveBindingsPass(),
new ServiceLocatorTagPass(),
new DecoratorServicePass(),
new CheckDefinitionValidityPass(),
new AutowirePass(false),
new ServiceLocatorTagPass(),
new ResolveTaggedIteratorArgumentPass(),
new ResolveServiceSubscribersPass(),
new ResolveReferencesToAliasesPass(),
new ResolveInvalidReferencesPass(),
new AnalyzeServiceReferencesPass(true),
new CheckCircularReferencesPass(),
new CheckReferenceValidityPass(),
new CheckArgumentsValidityPass(false),
]];

$this->removingPasses = [[
new RemovePrivateAliasesPass(),
new ReplaceAliasByActualDefinitionPass(),
new RemoveAbstractDefinitionsPass(),
new RemoveUnusedDefinitionsPass(),
new AnalyzeServiceReferencesPass(),
new CheckExceptionOnInvalidReferenceBehaviorPass(),
new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()),
new AnalyzeServiceReferencesPass(),
new DefinitionErrorExceptionPass(),
]];

$this->afterRemovingPasses = [
0 => [
new ResolveHotPathPass(),
new ResolveNoPreloadPass(),
new AliasDeprecatedPublicServicesPass(),
],

-2048 => [new RemoveBuildParametersPass()],
];
}






public function getPasses(): array
{
return array_merge(
[$this->mergePass],
$this->getBeforeOptimizationPasses(),
$this->getOptimizationPasses(),
$this->getBeforeRemovingPasses(),
$this->getRemovingPasses(),
$this->getAfterRemovingPasses()
);
}








public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
{
$property = $type.'Passes';
if (!isset($this->$property)) {
throw new InvalidArgumentException(\sprintf('Invalid type "%s".', $type));
}

$passes = &$this->$property;

if (!isset($passes[$priority])) {
$passes[$priority] = [];
}
$passes[$priority][] = $pass;
}






public function getAfterRemovingPasses(): array
{
return $this->sortPasses($this->afterRemovingPasses);
}






public function getBeforeOptimizationPasses(): array
{
return $this->sortPasses($this->beforeOptimizationPasses);
}






public function getBeforeRemovingPasses(): array
{
return $this->sortPasses($this->beforeRemovingPasses);
}






public function getOptimizationPasses(): array
{
return $this->sortPasses($this->optimizationPasses);
}






public function getRemovingPasses(): array
{
return $this->sortPasses($this->removingPasses);
}




public function getMergePass(): CompilerPassInterface
{
return $this->mergePass;
}




public function setMergePass(CompilerPassInterface $pass)
{
$this->mergePass = $pass;
}








public function setAfterRemovingPasses(array $passes)
{
$this->afterRemovingPasses = [$passes];
}








public function setBeforeOptimizationPasses(array $passes)
{
$this->beforeOptimizationPasses = [$passes];
}








public function setBeforeRemovingPasses(array $passes)
{
$this->beforeRemovingPasses = [$passes];
}








public function setOptimizationPasses(array $passes)
{
$this->optimizationPasses = [$passes];
}








public function setRemovingPasses(array $passes)
{
$this->removingPasses = [$passes];
}








private function sortPasses(array $passes): array
{
if (0 === \count($passes)) {
return [];
}

krsort($passes);


return array_merge(...$passes);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\Config\Definition\BaseNode;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;






class MergeExtensionConfigurationPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
$parameters = $container->getParameterBag()->all();
$definitions = $container->getDefinitions();
$aliases = $container->getAliases();
$exprLangProviders = $container->getExpressionLanguageProviders();
$configAvailable = class_exists(BaseNode::class);

foreach ($container->getExtensions() as $extension) {
if ($extension instanceof PrependExtensionInterface) {
$extension->prepend($container);
}
}

foreach ($container->getExtensions() as $name => $extension) {
if (!$config = $container->getExtensionConfig($name)) {

continue;
}
$resolvingBag = $container->getParameterBag();
if ($resolvingBag instanceof EnvPlaceholderParameterBag && $extension instanceof Extension) {

$resolvingBag = new MergeExtensionConfigurationParameterBag($resolvingBag);
if ($configAvailable) {
BaseNode::setPlaceholderUniquePrefix($resolvingBag->getEnvPlaceholderUniquePrefix());
}
}
$config = $resolvingBag->resolveValue($config);

try {
$tmpContainer = new MergeExtensionConfigurationContainerBuilder($extension, $resolvingBag);
$tmpContainer->setResourceTracking($container->isTrackingResources());
$tmpContainer->addObjectResource($extension);
if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
$tmpContainer->addObjectResource($configuration);
}

foreach ($exprLangProviders as $provider) {
$tmpContainer->addExpressionLanguageProvider($provider);
}

$extension->load($config, $tmpContainer);
} catch (\Exception $e) {
if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
$container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
}

throw $e;
}

if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {

$resolvingBag->freezeAfterProcessing($extension, $tmpContainer);
}

$container->merge($tmpContainer);
$container->getParameterBag()->add($parameters);
}

$container->addDefinitions($definitions);
$container->addAliases($aliases);
}
}




class MergeExtensionConfigurationParameterBag extends EnvPlaceholderParameterBag
{
private array $processedEnvPlaceholders;

public function __construct(parent $parameterBag)
{
parent::__construct($parameterBag->all());
$this->mergeEnvPlaceholders($parameterBag);
}

public function freezeAfterProcessing(Extension $extension, ContainerBuilder $container): void
{
if (!$config = $extension->getProcessedConfigs()) {

return;
}
$this->processedEnvPlaceholders = [];


$config = serialize($config).serialize($container->getDefinitions()).serialize($container->getAliases()).serialize($container->getParameterBag()->all());

if (false === stripos($config, 'env_')) {
return;
}

preg_match_all('/env_[a-f0-9]{16}_\w+_[a-f0-9]{32}/Ui', $config, $matches);
$usedPlaceholders = array_flip($matches[0]);
foreach (parent::getEnvPlaceholders() as $env => $placeholders) {
foreach ($placeholders as $placeholder) {
if (isset($usedPlaceholders[$placeholder])) {
$this->processedEnvPlaceholders[$env] = $placeholders;
break;
}
}
}
}

public function getEnvPlaceholders(): array
{
return $this->processedEnvPlaceholders ?? parent::getEnvPlaceholders();
}

public function getUnusedEnvPlaceholders(): array
{
return !isset($this->processedEnvPlaceholders) ? [] : array_diff_key(parent::getEnvPlaceholders(), $this->processedEnvPlaceholders);
}
}






class MergeExtensionConfigurationContainerBuilder extends ContainerBuilder
{
private string $extensionClass;

public function __construct(ExtensionInterface $extension, ?ParameterBagInterface $parameterBag = null)
{
parent::__construct($parameterBag);

$this->extensionClass = $extension::class;
}

public function addCompilerPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): static
{
throw new LogicException(\sprintf('You cannot add compiler pass "%s" from extension "%s". Compiler passes must be registered before the container is compiled.', get_debug_type($pass), $this->extensionClass));
}

public function registerExtension(ExtensionInterface $extension)
{
throw new LogicException(\sprintf('You cannot register extension "%s" from "%s". Extensions must be registered before the container is compiled.', get_debug_type($extension), $this->extensionClass));
}

public function compile(bool $resolveEnvPlaceholders = false)
{
throw new LogicException(\sprintf('Cannot compile the container in extension "%s".', $this->extensionClass));
}

public function resolveEnvPlaceholders(mixed $value, string|bool|null $format = null, ?array &$usedEnvs = null): mixed
{
if (true !== $format || !\is_string($value)) {
return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
}

$bag = $this->getParameterBag();
$value = $bag->resolveValue($value);

if (!$bag instanceof EnvPlaceholderParameterBag) {
return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
}

foreach ($bag->getEnvPlaceholders() as $env => $placeholders) {
if (!str_contains($env, ':')) {
continue;
}
foreach ($placeholders as $placeholder) {
if (false !== stripos($value, $placeholder)) {
throw new RuntimeException(\sprintf('Using a cast in "env(%s)" is incompatible with resolution at compile time in "%s". The logic in the extension should be moved to a compiler pass, or an env parameter with no cast should be used instead.', $env, $this->extensionClass));
}
}
}

return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ExceptionInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;








class ResolveChildDefinitionsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $currentPath;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}
if ($isRoot) {


$value = $this->container->getDefinition($this->currentId);
}
if ($value instanceof ChildDefinition) {
$this->currentPath = [];
$value = $this->resolveDefinition($value);
if ($isRoot) {
$this->container->setDefinition($this->currentId, $value);
}
}

return parent::processValue($value, $isRoot);
}






private function resolveDefinition(ChildDefinition $definition): Definition
{
try {
return $this->doResolveDefinition($definition);
} catch (ServiceCircularReferenceException $e) {
throw $e;
} catch (ExceptionInterface $e) {
$r = new \ReflectionProperty($e, 'message');
$r->setValue($e, \sprintf('Service "%s": %s', $this->currentId, $e->getMessage()));

throw $e;
}
}

private function doResolveDefinition(ChildDefinition $definition): Definition
{
if (!$this->container->has($parent = $definition->getParent())) {
throw new RuntimeException(\sprintf('Parent definition "%s" does not exist.', $parent));
}

$searchKey = array_search($parent, $this->currentPath);
$this->currentPath[] = $parent;

if (false !== $searchKey) {
throw new ServiceCircularReferenceException($parent, \array_slice($this->currentPath, $searchKey));
}

$parentDef = $this->container->findDefinition($parent);
if ($parentDef instanceof ChildDefinition) {
$id = $this->currentId;
$this->currentId = $parent;
$parentDef = $this->resolveDefinition($parentDef);
$this->container->setDefinition($parent, $parentDef);
$this->currentId = $id;
}

$this->container->log($this, \sprintf('Resolving inheritance for "%s" (parent: %s).', $this->currentId, $parent));
$def = new Definition();



$def->setClass($parentDef->getClass());
$def->setArguments($parentDef->getArguments());
$def->setMethodCalls($parentDef->getMethodCalls());
$def->setProperties($parentDef->getProperties());
if ($parentDef->isDeprecated()) {
$deprecation = $parentDef->getDeprecation('%service_id%');
$def->setDeprecated($deprecation['package'], $deprecation['version'], $deprecation['message']);
}
$def->setFactory($parentDef->getFactory());
$def->setConfigurator($parentDef->getConfigurator());
$def->setFile($parentDef->getFile());
$def->setPublic($parentDef->isPublic());
$def->setLazy($parentDef->isLazy());
$def->setAutowired($parentDef->isAutowired());
$def->setChanges($parentDef->getChanges());

$def->setBindings($definition->getBindings() + $parentDef->getBindings());

$def->setSynthetic($definition->isSynthetic());


$changes = $definition->getChanges();
if (isset($changes['class'])) {
$def->setClass($definition->getClass());
}
if (isset($changes['factory'])) {
$def->setFactory($definition->getFactory());
}
if (isset($changes['configurator'])) {
$def->setConfigurator($definition->getConfigurator());
}
if (isset($changes['file'])) {
$def->setFile($definition->getFile());
}
if (isset($changes['public'])) {
$def->setPublic($definition->isPublic());
} else {
$def->setPublic($parentDef->isPublic());
}
if (isset($changes['lazy'])) {
$def->setLazy($definition->isLazy());
}
if (isset($changes['deprecated']) && $definition->isDeprecated()) {
$deprecation = $definition->getDeprecation('%service_id%');
$def->setDeprecated($deprecation['package'], $deprecation['version'], $deprecation['message']);
}
if (isset($changes['autowired'])) {
$def->setAutowired($definition->isAutowired());
}
if (isset($changes['shared'])) {
$def->setShared($definition->isShared());
}
if (isset($changes['decorated_service'])) {
$decoratedService = $definition->getDecoratedService();
if (null === $decoratedService) {
$def->setDecoratedService($decoratedService);
} else {
$def->setDecoratedService($decoratedService[0], $decoratedService[1], $decoratedService[2], $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
}
}


foreach ($definition->getArguments() as $k => $v) {
if (is_numeric($k)) {
$def->addArgument($v);
} elseif (str_starts_with($k, 'index_')) {
$def->replaceArgument((int) substr($k, \strlen('index_')), $v);
} else {
$def->setArgument($k, $v);
}
}


foreach ($definition->getProperties() as $k => $v) {
$def->setProperty($k, $v);
}


if ($calls = $definition->getMethodCalls()) {
$def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
}

$def->addError($parentDef);
$def->addError($definition);


$def->setAbstract($definition->isAbstract());
$def->setTags($definition->getTags());


$def->setAutoconfigured($definition->isAutoconfigured());

if (!$def->hasTag('proxy')) {
foreach ($parentDef->getTag('proxy') as $v) {
$def->addTag('proxy', $v);
}
}

return $def;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;




class RegisterReverseContainerPass implements CompilerPassInterface
{
private bool $beforeRemoving;

public function __construct(bool $beforeRemoving)
{
$this->beforeRemoving = $beforeRemoving;
}




public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('reverse_container')) {
return;
}

$refType = $this->beforeRemoving ? ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE : ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
$services = [];
foreach ($container->findTaggedServiceIds('container.reversible') as $id => $tags) {
$services[$id] = new Reference($id, $refType);
}

if ($this->beforeRemoving) {

$services['reverse_container'] = new Reference('reverse_container', $refType);
}
$locator = $container->getDefinition('reverse_container')->getArgument(1);

if ($locator instanceof Reference) {
$locator = $container->getDefinition((string) $locator);
}
if ($locator instanceof Definition) {
foreach ($services as $id => $ref) {
$services[$id] = new ServiceClosureArgument($ref);
}
$locator->replaceArgument(0, $services);
} else {
$locator->setValues($services);
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Loader\FileLoader;













class CheckDefinitionValidityPass implements CompilerPassInterface
{







public function process(ContainerBuilder $container)
{
foreach ($container->getDefinitions() as $id => $definition) {

if ($definition->isSynthetic() && !$definition->isPublic()) {
throw new RuntimeException(\sprintf('A synthetic service ("%s") must be public.', $id));
}


if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass() && !$definition->hasTag('container.service_locator') && (!$definition->getFactory() || !preg_match(FileLoader::ANONYMOUS_ID_REGEXP, $id))) {
if ($definition->getFactory()) {
throw new RuntimeException(\sprintf('Please add the class to service "%s" even if it is constructed by a factory since we might need to add method calls based on compile-time checks.', $id));
}
if (class_exists($id) || interface_exists($id, false)) {
if (str_starts_with($id, '\\') && 1 < substr_count($id, '\\')) {
throw new RuntimeException(\sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface. Please specify the class attribute explicitly or remove the leading backslash by renaming the service to "%s" to get rid of this error.', $id, substr($id, 1)));
}

throw new RuntimeException(\sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface in the global namespace. Leaving out the "class" attribute is only allowed for namespaced classes. Please specify the class attribute explicitly to get rid of this error.', $id));
}

throw new RuntimeException(\sprintf('The definition for "%s" has no class. If you intend to inject this service dynamically at runtime, please mark it as synthetic=true. If this is an abstract definition solely used by child definitions, please add abstract=true, otherwise specify a class to get rid of this error.', $id));
}


foreach ($definition->getTags() as $name => $tags) {
foreach ($tags as $attributes) {
$this->validateAttributes($id, $name, $attributes);
}
}

if ($definition->isPublic() && !$definition->isPrivate()) {
$resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
if (null !== $usedEnvs) {
throw new EnvParameterException([$resolvedId], null, 'A service name ("%s") cannot contain dynamic values.');
}
}
}

foreach ($container->getAliases() as $id => $alias) {
if ($alias->isPublic() && !$alias->isPrivate()) {
$resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
if (null !== $usedEnvs) {
throw new EnvParameterException([$resolvedId], null, 'An alias name ("%s") cannot contain dynamic values.');
}
}
}
}

private function validateAttributes(string $id, string $tag, array $attributes, array $path = []): void
{
foreach ($attributes as $name => $value) {
if (\is_array($value)) {
$this->validateAttributes($id, $tag, $value, [...$path, $name]);
} elseif (!\is_scalar($value) && null !== $value) {
$name = implode('.', [...$path, $name]);
throw new RuntimeException(\sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $id, $tag, $name));
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;




class ResolveClassPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isSynthetic() || null !== $definition->getClass()) {
continue;
}
if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $id)) {
if ($definition instanceof ChildDefinition && !class_exists($id)) {
throw new InvalidArgumentException(\sprintf('Service definition "%s" has a parent but no class, and its name looks like an FQCN. Either the class is missing or you want to inherit it from the parent service. To resolve this ambiguity, please rename this service to a non-FQCN (e.g. using dots), or create the missing class.', $id));
}
$definition->setClass($id);
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;







class ExtensionCompilerPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
foreach ($container->getExtensions() as $extension) {
if (!$extension instanceof CompilerPassInterface) {
continue;
}

$extension->process($container);
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;







class ReplaceAliasByActualDefinitionPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $replacements;








public function process(ContainerBuilder $container)
{

$seenAliasTargets = [];
$replacements = [];

foreach ($container->getAliases() as $definitionId => $target) {
$targetId = (string) $target;

if ('service_container' === $targetId) {
continue;
}

if (isset($replacements[$targetId])) {
$container->setAlias($definitionId, $replacements[$targetId])->setPublic($target->isPublic());

if ($target->isDeprecated()) {
$container->getAlias($definitionId)->setDeprecated(...array_values($target->getDeprecation('%alias_id%')));
}
}

if (isset($seenAliasTargets[$targetId])) {
continue;
}

$seenAliasTargets[$targetId] = true;
try {
$definition = $container->getDefinition($targetId);
} catch (ServiceNotFoundException $e) {
if ('' !== $e->getId() && '@' === $e->getId()[0]) {
throw new ServiceNotFoundException($e->getId(), $e->getSourceId(), null, [substr($e->getId(), 1)]);
}

throw $e;
}
if ($definition->isPublic()) {
continue;
}

$definition->setPublic($target->isPublic());
$container->setDefinition($definitionId, $definition);
$container->removeDefinition($targetId);
$replacements[$targetId] = $definitionId;

if ($target->isPublic() && $target->isDeprecated()) {
$definition->addTag('container.private', $target->getDeprecation('%service_id%'));
}
}
$this->replacements = $replacements;

parent::process($container);
$this->replacements = [];
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Reference && isset($this->replacements[$referenceId = (string) $value])) {

$newId = $this->replacements[$referenceId];
$value = new Reference($newId, $value->getInvalidBehavior());
$this->container->log($this, \sprintf('Changed reference of service "%s" previously pointing to "%s" to "%s".', $this->currentId, $referenceId, $newId));
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;




class RemoveAbstractDefinitionsPass implements CompilerPassInterface
{





public function process(ContainerBuilder $container)
{
foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isAbstract()) {
$container->removeDefinition($id);
$container->log($this, \sprintf('Removed service "%s"; reason: abstract.', $id));
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;






class ResolveTaggedIteratorArgumentPass extends AbstractRecursivePass
{
use PriorityTaggedServiceTrait;

protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof TaggedIteratorArgument) {
return parent::processValue($value, $isRoot);
}

$exclude = $value->getExclude();
if ($value->excludeSelf()) {
$exclude[] = $this->currentId;
}

$value->setValues($this->findAndSortTaggedServices($value, $this->container, $exclude));

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;






class DefinitionErrorExceptionPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $erroredDefinitions = [];
private array $sourceReferences = [];




public function process(ContainerBuilder $container)
{
try {
parent::process($container);

$visitedIds = [];

foreach ($this->erroredDefinitions as $id => $definition) {
if ($this->isErrorForRuntime($id, $visitedIds)) {
continue;
}


$errors = $definition->getErrors();

throw new RuntimeException(reset($errors));
}
} finally {
$this->erroredDefinitions = [];
$this->sourceReferences = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof ArgumentInterface) {
parent::processValue($value->getValues());

return $value;
}

if ($value instanceof Reference && $this->currentId !== $targetId = (string) $value) {
if (
ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior()
|| ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior()
) {
$this->sourceReferences[$targetId][$this->currentId ?? ''] ??= true;
} else {
$this->sourceReferences[$targetId][$this->currentId ?? ''] = false;
}

return $value;
}

if (!$value instanceof Definition || !$value->hasErrors() || $value->hasTag('container.error')) {
return parent::processValue($value, $isRoot);
}

$this->erroredDefinitions[$this->currentId ?? ''] = $value;

return parent::processValue($value);
}

private function isErrorForRuntime(string $id, array &$visitedIds): bool
{
if (!isset($this->sourceReferences[$id])) {
return false;
}

if (isset($visitedIds[$id])) {
return $visitedIds[$id];
}

$visitedIds[$id] = true;

foreach ($this->sourceReferences[$id] as $sourceId => $isRuntime) {
if ($visitedIds[$sourceId] ?? $visitedIds[$sourceId] = $this->isErrorForRuntime($sourceId, $visitedIds)) {
continue;
}

if (!$isRuntime) {
return false;
}
}

return true;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\Attribute\AsTaggedItem;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;






trait PriorityTaggedServiceTrait
{












private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagName, ContainerBuilder $container, array $exclude = []): array
{
$indexAttribute = $defaultIndexMethod = $needsIndexes = $defaultPriorityMethod = null;

if ($tagName instanceof TaggedIteratorArgument) {
$indexAttribute = $tagName->getIndexAttribute();
$defaultIndexMethod = $tagName->getDefaultIndexMethod();
$needsIndexes = $tagName->needsIndexes();
$defaultPriorityMethod = $tagName->getDefaultPriorityMethod() ?? 'getDefaultPriority';
$exclude = array_merge($exclude, $tagName->getExclude());
$tagName = $tagName->getTag();
}

$i = 0;
$services = [];

foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $attributes) {
if (\in_array($serviceId, $exclude, true)) {
continue;
}

$defaultPriority = null;
$defaultIndex = null;
$definition = $container->getDefinition($serviceId);
$class = $definition->getClass();
$class = $container->getParameterBag()->resolveValue($class) ?: null;
$checkTaggedItem = !$definition->hasTag($definition->isAutoconfigured() ? 'container.ignore_attributes' : $tagName);

foreach ($attributes as $attribute) {
$index = $priority = null;

if (isset($attribute['priority'])) {
$priority = $attribute['priority'];
} elseif (null === $defaultPriority && $defaultPriorityMethod && $class) {
$defaultPriority = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultPriorityMethod, $tagName, 'priority', $checkTaggedItem);
}
$priority ??= $defaultPriority ??= 0;

if (null === $indexAttribute && !$defaultIndexMethod && !$needsIndexes) {
$services[] = [$priority, ++$i, null, $serviceId, null];
continue 2;
}

if (null !== $indexAttribute && isset($attribute[$indexAttribute])) {
$index = $attribute[$indexAttribute];
} elseif (null === $defaultIndex && $defaultPriorityMethod && $class) {
$defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, $checkTaggedItem);
}
$decorated = $definition->getTag('container.decorator')[0]['id'] ?? null;
$index = $index ?? $defaultIndex ?? $defaultIndex = $decorated ?? $serviceId;

$services[] = [$priority, ++$i, $index, $serviceId, $class];
}
}

uasort($services, static fn ($a, $b) => $b[0] <=> $a[0] ?: $a[1] <=> $b[1]);

$refs = [];
foreach ($services as [, , $index, $serviceId, $class]) {
if (!$class) {
$reference = new Reference($serviceId);
} elseif ($index === $serviceId) {
$reference = new TypedReference($serviceId, $class);
} else {
$reference = new TypedReference($serviceId, $class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $index);
}

if (null === $index) {
$refs[] = $reference;
} else {
$refs[$index] = $reference;
}
}

return $refs;
}
}




class PriorityTaggedServiceUtil
{
public static function getDefault(ContainerBuilder $container, string $serviceId, string $class, string $defaultMethod, string $tagName, ?string $indexAttribute, bool $checkTaggedItem): string|int|null
{
if (!($r = $container->getReflectionClass($class)) || (!$checkTaggedItem && !$r->hasMethod($defaultMethod))) {
return null;
}

if ($checkTaggedItem && !$r->hasMethod($defaultMethod)) {
foreach ($r->getAttributes(AsTaggedItem::class) as $attribute) {
return 'priority' === $indexAttribute ? $attribute->newInstance()->priority : $attribute->newInstance()->index;
}

return null;
}

if ($r->isInterface()) {
return null;
}

if (null !== $indexAttribute) {
$service = $class !== $serviceId ? \sprintf('service "%s"', $serviceId) : 'on the corresponding service';
$message = [\sprintf('Either method "%s::%s()" should ', $class, $defaultMethod), \sprintf(' or tag "%s" on %s is missing attribute "%s".', $tagName, $service, $indexAttribute)];
} else {
$message = [\sprintf('Method "%s::%s()" should ', $class, $defaultMethod), '.'];
}

if (!($rm = $r->getMethod($defaultMethod))->isStatic()) {
throw new InvalidArgumentException(implode('be static', $message));
}

if (!$rm->isPublic()) {
throw new InvalidArgumentException(implode('be public', $message));
}

$default = $rm->invoke(null);

if ('priority' === $indexAttribute) {
if (!\is_int($default)) {
throw new InvalidArgumentException(implode(\sprintf('return int (got "%s")', get_debug_type($default)), $message));
}

return $default;
}

if (\is_int($default)) {
$default = (string) $default;
}

if (!\is_string($default)) {
throw new InvalidArgumentException(implode(\sprintf('return string|int (got "%s")', get_debug_type($default)), $message));
}

return $default;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;








class RemovePrivateAliasesPass implements CompilerPassInterface
{





public function process(ContainerBuilder $container)
{
foreach ($container->getAliases() as $id => $alias) {
if ($alias->isPublic()) {
continue;
}

$container->removeAlias($id);
$container->log($this, \sprintf('Removed service "%s"; reason: private alias.', $id));
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;






class ResolveHotPathPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $resolvedIds = [];




public function process(ContainerBuilder $container)
{
try {
parent::process($container);
$container->getDefinition('service_container')->clearTag('container.hot_path');
} finally {
$this->resolvedIds = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof ArgumentInterface) {
return $value;
}

if ($value instanceof Definition && $isRoot) {
if ($value->isDeprecated()) {
return $value->clearTag('container.hot_path');
}

$this->resolvedIds[$this->currentId ?? ''] = true;

if (!$value->hasTag('container.hot_path')) {
return $value;
}
}

if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->hasDefinition($id = (string) $value)) {
$definition = $this->container->getDefinition($id);

if ($definition->isDeprecated() || $definition->hasTag('container.hot_path')) {
return $value;
}

$definition->addTag('container.hot_path');

if (isset($this->resolvedIds[$id])) {
parent::processValue($definition, false);
}

return $value;
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Psr\Container\ContainerInterface as PsrContainerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Contracts\Service\Attribute\SubscribedService;
use Symfony\Contracts\Service\ServiceProviderInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;






class RegisterServiceSubscribersPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Definition || $value->isAbstract() || $value->isSynthetic() || !$value->hasTag('container.service_subscriber')) {
return parent::processValue($value, $isRoot);
}

$serviceMap = [];
$autowire = $value->isAutowired();

foreach ($value->getTag('container.service_subscriber') as $attributes) {
if (!$attributes) {
$autowire = true;
continue;
}
ksort($attributes);
if ([] !== array_diff(array_keys($attributes), ['id', 'key'])) {
throw new InvalidArgumentException(\sprintf('The "container.service_subscriber" tag accepts only the "key" and "id" attributes, "%s" given for service "%s".', implode('", "', array_keys($attributes)), $this->currentId));
}
if (!\array_key_exists('id', $attributes)) {
throw new InvalidArgumentException(\sprintf('Missing "id" attribute on "container.service_subscriber" tag with key="%s" for service "%s".', $attributes['key'], $this->currentId));
}
if (!\array_key_exists('key', $attributes)) {
$attributes['key'] = $attributes['id'];
}
if (isset($serviceMap[$attributes['key']])) {
continue;
}
$serviceMap[$attributes['key']] = new Reference($attributes['id']);
}
$class = $value->getClass();

if (!$r = $this->container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $this->currentId));
}
if (!$r->isSubclassOf(ServiceSubscriberInterface::class)) {
throw new InvalidArgumentException(\sprintf('Service "%s" must implement interface "%s".', $this->currentId, ServiceSubscriberInterface::class));
}
$class = $r->name;

$replaceDeprecatedSession = $this->container->has('.session.deprecated') && $r->isSubclassOf(AbstractController::class);
$subscriberMap = [];

foreach ($class::getSubscribedServices() as $key => $type) {
$attributes = [];

if (!isset($serviceMap[$key]) && $type instanceof Autowire) {
$subscriberMap[$key] = $type;
continue;
}

if ($type instanceof SubscribedService) {
$key = $type->key ?? $key;
$attributes = $type->attributes;
$type = ($type->nullable ? '?' : '').($type->type ?? throw new InvalidArgumentException(\sprintf('When "%s::getSubscribedServices()" returns "%s", a type must be set.', $class, SubscribedService::class)));
}

if (!\is_string($type) || !preg_match('/(?(DEFINE)(?<cn>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))(?(DEFINE)(?<fqcn>(?&cn)(?:\\\\(?&cn))*+))^\??(?&fqcn)(?:(?:\|(?&fqcn))*+|(?:&(?&fqcn))*+)$/', $type)) {
throw new InvalidArgumentException(\sprintf('"%s::getSubscribedServices()" must return valid PHP types for service "%s" key "%s", "%s" returned.', $class, $this->currentId, $key, \is_string($type) ? $type : get_debug_type($type)));
}
$optionalBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
if ('?' === $type[0]) {
$type = substr($type, 1);
$optionalBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
}
if (\is_int($name = $key)) {
$key = $type;
$name = null;
}
if (!isset($serviceMap[$key])) {
if (!$autowire) {
throw new InvalidArgumentException(\sprintf('Service "%s" misses a "container.service_subscriber" tag with "key"/"id" attributes corresponding to entry "%s" as returned by "%s::getSubscribedServices()".', $this->currentId, $key, $class));
}
if ($replaceDeprecatedSession && SessionInterface::class === $type) {


$type = '.session.deprecated';
}
$serviceMap[$key] = new Reference($type);
}

if ($name) {
if (false !== $i = strpos($name, '::get')) {
$name = lcfirst(substr($name, 5 + $i));
} elseif (str_contains($name, '::')) {
$name = null;
}
}

if (null !== $name && !$this->container->has($name) && !$this->container->has($type.' $'.$name)) {
$camelCaseName = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $name))));
$name = $this->container->has($type.' $'.$camelCaseName) ? $camelCaseName : $name;
}

$subscriberMap[$key] = new TypedReference((string) $serviceMap[$key], $type, $optionalBehavior, $name, $attributes);
unset($serviceMap[$key]);
}

if ($serviceMap = array_keys($serviceMap)) {
$message = \sprintf(1 < \count($serviceMap) ? 'keys "%s" do' : 'key "%s" does', str_replace('%', '%%', implode('", "', $serviceMap)));
throw new InvalidArgumentException(\sprintf('Service %s not exist in the map returned by "%s::getSubscribedServices()" for service "%s".', $message, $class, $this->currentId));
}

$locatorRef = ServiceLocatorTagPass::register($this->container, $subscriberMap, $this->currentId);

$value->addTag('container.service_subscriber.locator', ['id' => (string) $locatorRef]);

$value->setBindings([
PsrContainerInterface::class => new BoundArgument($locatorRef, false),
ServiceProviderInterface::class => new BoundArgument($locatorRef, false),
] + $value->getBindings());

return parent::processValue($value);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;







class RemoveUnusedDefinitionsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $connectedIds = [];






public function process(ContainerBuilder $container)
{
try {
$this->enableExpressionProcessing();
$this->container = $container;
$connectedIds = [];
$aliases = $container->getAliases();

foreach ($aliases as $id => $alias) {
if ($alias->isPublic()) {
$this->connectedIds[] = (string) $aliases[$id];
}
}

foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isPublic()) {
$connectedIds[$id] = true;
$this->processValue($definition);
}
}

while ($this->connectedIds) {
$ids = $this->connectedIds;
$this->connectedIds = [];
foreach ($ids as $id) {
if (!isset($connectedIds[$id]) && $container->hasDefinition($id)) {
$connectedIds[$id] = true;
$this->processValue($container->getDefinition($id));
}
}
}

foreach ($container->getDefinitions() as $id => $definition) {
if (!isset($connectedIds[$id])) {
$container->removeDefinition($id);
$container->resolveEnvPlaceholders(!$definition->hasErrors() ? serialize($definition) : $definition);
$container->log($this, \sprintf('Removed service "%s"; reason: unused.', $id));
}
}
} finally {
$this->container = null;
$this->connectedIds = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Reference) {
return parent::processValue($value, $isRoot);
}

if (ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior()) {
$this->connectedIds[] = (string) $value;
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;






interface CompilerPassInterface
{





public function process(ContainerBuilder $container);
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\VarExporter\ProxyHelper;






class ResolveNamedArgumentsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof AbstractArgument && $value->getText().'.' === $value->getTextWithContext()) {
$value->setContext(\sprintf('A value found in service "%s"', $this->currentId));
}

if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}

$calls = $value->getMethodCalls();
$calls[] = ['__construct', $value->getArguments()];

foreach ($calls as $i => $call) {
[$method, $arguments] = $call;
$parameters = null;
$resolvedKeys = [];
$resolvedArguments = [];

foreach ($arguments as $key => $argument) {
if ($argument instanceof AbstractArgument && $argument->getText().'.' === $argument->getTextWithContext()) {
$argument->setContext(\sprintf('Argument '.(\is_int($key) ? 1 + $key : '"%3$s"').' of '.('__construct' === $method ? 'service "%s"' : 'method call "%s::%s()"'), $this->currentId, $method, $key));
}

if (\is_int($key)) {
$resolvedKeys[$key] = $key;
$resolvedArguments[$key] = $argument;
continue;
}

if (null === $parameters) {
$r = $this->getReflectionMethod($value, $method);
$class = $r instanceof \ReflectionMethod ? $r->class : $this->currentId;
$method = $r->getName();
$parameters = $r->getParameters();
}

if (isset($key[0]) && '$' !== $key[0] && !class_exists($key) && !interface_exists($key, false)) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": did you forget to add the "$" prefix to argument "%s"?', $this->currentId, $key));
}

if (isset($key[0]) && '$' === $key[0]) {
foreach ($parameters as $j => $p) {
if ($key === '$'.$p->name) {
if ($p->isVariadic() && \is_array($argument)) {
foreach ($argument as $variadicArgument) {
$resolvedKeys[$j] = $j;
$resolvedArguments[$j++] = $variadicArgument;
}
} else {
$resolvedKeys[$j] = $p->name;
$resolvedArguments[$j] = $argument;
}

continue 2;
}
}

throw new InvalidArgumentException(\sprintf('Invalid service "%s": method "%s()" has no argument named "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key));
}

if (null !== $argument && !$argument instanceof Reference && !$argument instanceof Definition) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": the value of argument "%s" of method "%s()" must be null, an instance of "%s" or an instance of "%s", "%s" given.', $this->currentId, $key, $class !== $this->currentId ? $class.'::'.$method : $method, Reference::class, Definition::class, get_debug_type($argument)));
}

$typeFound = false;
foreach ($parameters as $j => $p) {
if (!\array_key_exists($j, $resolvedArguments) && ProxyHelper::exportType($p, true) === $key) {
$resolvedKeys[$j] = $p->name;
$resolvedArguments[$j] = $argument;
$typeFound = true;
}
}

if (!$typeFound) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": method "%s()" has no argument type-hinted as "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key));
}
}

if ($resolvedArguments !== $call[1]) {
ksort($resolvedArguments);

if (!$value->isAutowired() && !array_is_list($resolvedArguments)) {
ksort($resolvedKeys);
$resolvedArguments = array_combine($resolvedKeys, $resolvedArguments);
}

$calls[$i][1] = $resolvedArguments;
}
}

[, $arguments] = array_pop($calls);

if ($arguments !== $value->getArguments()) {
$value->setArguments($arguments);
}
if ($calls !== $value->getMethodCalls()) {
$value->setMethodCalls($calls);
}

foreach ($value->getProperties() as $key => $argument) {
if ($argument instanceof AbstractArgument && $argument->getText().'.' === $argument->getTextWithContext()) {
$argument->setContext(\sprintf('Property "%s" of service "%s"', $key, $this->currentId));
}
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;











class ServiceReferenceGraph
{



private array $nodes = [];

public function hasNode(string $id): bool
{
return isset($this->nodes[$id]);
}






public function getNode(string $id): ServiceReferenceGraphNode
{
if (!isset($this->nodes[$id])) {
throw new InvalidArgumentException(\sprintf('There is no node with id "%s".', $id));
}

return $this->nodes[$id];
}






public function getNodes(): array
{
return $this->nodes;
}




public function clear(): void
{
foreach ($this->nodes as $node) {
$node->clear();
}
$this->nodes = [];
}




public function connect(?string $sourceId, mixed $sourceValue, ?string $destId, mixed $destValue = null, ?Reference $reference = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false): void
{
if (null === $sourceId || null === $destId) {
return;
}

$sourceNode = $this->createNode($sourceId, $sourceValue);
$destNode = $this->createNode($destId, $destValue);
$edge = new ServiceReferenceGraphEdge($sourceNode, $destNode, $reference, $lazy, $weak, $byConstructor);

$sourceNode->addOutEdge($edge);
$destNode->addInEdge($edge);
}

private function createNode(string $id, mixed $value): ServiceReferenceGraphNode
{
if (isset($this->nodes[$id]) && $this->nodes[$id]->getValue() === $value) {
return $this->nodes[$id];
}

return $this->nodes[$id] = new ServiceReferenceGraphNode($id, $value);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;











class AnalyzeServiceReferencesPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private ServiceReferenceGraph $graph;
private ?Definition $currentDefinition = null;
private bool $onlyConstructorArguments;
private bool $hasProxyDumper;
private bool $lazy;
private bool $byConstructor;
private bool $byFactory;
private array $definitions;
private array $aliases;




public function __construct(bool $onlyConstructorArguments = false, bool $hasProxyDumper = true)
{
$this->onlyConstructorArguments = $onlyConstructorArguments;
$this->hasProxyDumper = $hasProxyDumper;
$this->enableExpressionProcessing();
}






public function process(ContainerBuilder $container)
{
$this->container = $container;
$this->graph = $container->getCompiler()->getServiceReferenceGraph();
$this->graph->clear();
$this->lazy = false;
$this->byConstructor = false;
$this->byFactory = false;
$this->definitions = $container->getDefinitions();
$this->aliases = $container->getAliases();

foreach ($this->aliases as $id => $alias) {
$targetId = $this->getDefinitionId((string) $alias);
$this->graph->connect($id, $alias, $targetId, null !== $targetId ? $this->container->getDefinition($targetId) : null, null);
}

try {
parent::process($container);
} finally {
$this->aliases = $this->definitions = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
$lazy = $this->lazy;
$inExpression = $this->inExpression();

if ($value instanceof ArgumentInterface) {
$this->lazy = !$this->byFactory || !$value instanceof IteratorArgument;
parent::processValue($value->getValues());
$this->lazy = $lazy;

return $value;
}
if ($value instanceof Reference) {
$targetId = $this->getDefinitionId((string) $value);
$targetDefinition = null !== $targetId ? $this->container->getDefinition($targetId) : null;

$this->graph->connect(
$this->currentId,
$this->currentDefinition,
$targetId,
$targetDefinition,
$value,
$this->lazy || ($this->hasProxyDumper && $targetDefinition?->isLazy()),
ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior(),
$this->byConstructor
);

if ($inExpression) {
$this->graph->connect(
'.internal.reference_in_expression',
null,
$targetId,
$targetDefinition,
$value,
$this->lazy || $targetDefinition?->isLazy(),
true
);
}

return $value;
}
if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}
if ($isRoot) {
if ($value->isSynthetic() || $value->isAbstract()) {
return $value;
}
$this->currentDefinition = $value;
} elseif ($this->currentDefinition === $value) {
return $value;
}
$this->lazy = false;

$byConstructor = $this->byConstructor;
$this->byConstructor = $isRoot || $byConstructor;

$byFactory = $this->byFactory;
$this->byFactory = true;
if (\is_string($factory = $value->getFactory()) && str_starts_with($factory, '@=')) {
if (!class_exists(Expression::class)) {
throw new LogicException('Expressions cannot be used in service factories without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}

$factory = new Expression(substr($factory, 2));
}
$this->processValue($factory);
$this->byFactory = $byFactory;

$this->processValue($value->getArguments());

$properties = $value->getProperties();
$setters = $value->getMethodCalls();


$lastWitherIndex = null;
foreach ($setters as $k => $call) {
if ($call[2] ?? false) {
$lastWitherIndex = $k;
}
}

if (null !== $lastWitherIndex) {
$this->processValue($properties);
$setters = $properties = [];

foreach ($value->getMethodCalls() as $k => $call) {
if (null === $lastWitherIndex) {
$setters[] = $call;
continue;
}

if ($lastWitherIndex === $k) {
$lastWitherIndex = null;
}

$this->processValue($call);
}
}

$this->byConstructor = $byConstructor;

if (!$this->onlyConstructorArguments) {
$this->processValue($properties);
$this->processValue($setters);
$this->processValue($value->getConfigurator());
}
$this->lazy = $lazy;

return $value;
}

private function getDefinitionId(string $id): ?string
{
while (isset($this->aliases[$id])) {
$id = (string) $this->aliases[$id];
}

return isset($this->definitions[$id]) ? $id : null;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Reference;




class ResolveDecoratorStackPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
$stacks = [];

foreach ($container->findTaggedServiceIds('container.stack') as $id => $tags) {
$definition = $container->getDefinition($id);

if (!$definition instanceof ChildDefinition) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": only definitions with a "parent" can have the "container.stack" tag.', $id));
}

if (!$stack = $definition->getArguments()) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": the stack of decorators is empty.', $id));
}

$stacks[$id] = $stack;
}

if (!$stacks) {
return;
}

$resolvedDefinitions = [];

foreach ($container->getDefinitions() as $id => $definition) {
if (!isset($stacks[$id])) {
$resolvedDefinitions[$id] = $definition;
continue;
}

foreach (array_reverse($this->resolveStack($stacks, [$id]), true) as $k => $v) {
$resolvedDefinitions[$k] = $v;
}

$alias = $container->setAlias($id, $k);

if ($definition->getChanges()['public'] ?? false) {
$alias->setPublic($definition->isPublic());
}

if ($definition->isDeprecated()) {
$alias->setDeprecated(...array_values($definition->getDeprecation('%alias_id%')));
}
}

$container->setDefinitions($resolvedDefinitions);
}

private function resolveStack(array $stacks, array $path): array
{
$definitions = [];
$id = end($path);
$prefix = '.'.$id.'.';

if (!isset($stacks[$id])) {
return [$id => new ChildDefinition($id)];
}

if (key($path) !== $searchKey = array_search($id, $path)) {
throw new ServiceCircularReferenceException($id, \array_slice($path, $searchKey));
}

foreach ($stacks[$id] as $k => $definition) {
if ($definition instanceof ChildDefinition && isset($stacks[$definition->getParent()])) {
$path[] = $definition->getParent();
$definition = unserialize(serialize($definition)); 
} elseif ($definition instanceof Definition) {
$definitions[$decoratedId = $prefix.$k] = $definition;
continue;
} elseif ($definition instanceof Reference || $definition instanceof Alias) {
$path[] = (string) $definition;
} else {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": unexpected value of type "%s" found in the stack of decorators.', $id, get_debug_type($definition)));
}

$p = $prefix.$k;

foreach ($this->resolveStack($stacks, $path) as $k => $v) {
$definitions[$decoratedId = $p.$k] = $definition instanceof ChildDefinition ? $definition->setParent($k) : new ChildDefinition($k);
$definition = null;
}
array_pop($path);
}

if (1 === \count($path)) {
foreach ($definitions as $k => $definition) {
$definition->setPublic(false)->setTags([])->setDecoratedService($decoratedId);
}
$definition->setDecoratedService(null);
}

return $definitions;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Contracts\Service\ServiceProviderInterface;






class ResolveServiceSubscribersPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private ?string $serviceLocator = null;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Reference && $this->serviceLocator && \in_array((string) $value, [ContainerInterface::class, ServiceProviderInterface::class], true)) {
return new Reference($this->serviceLocator);
}

if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}

$serviceLocator = $this->serviceLocator;
$this->serviceLocator = null;

if ($value->hasTag('container.service_subscriber.locator')) {
$this->serviceLocator = $value->getTag('container.service_subscriber.locator')[0]['id'];
$value->clearTag('container.service_subscriber.locator');
}

try {
return parent::processValue($value);
} finally {
$this->serviceLocator = $serviceLocator;
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class ResolveFactoryClassPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Definition && \is_array($factory = $value->getFactory()) && null === $factory[0]) {
if (null === $class = $value->getClass()) {
throw new RuntimeException(\sprintf('The "%s" service is defined to be created by a factory, but is missing the factory class. Did you forget to define the factory or service class?', $this->currentId));
}

$factory[0] = $class;
$value->setFactory($factory);
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;







class CheckArgumentsValidityPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private bool $throwExceptions;

public function __construct(bool $throwExceptions = true)
{
$this->throwExceptions = $throwExceptions;
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}

$i = 0;
$hasNamedArgs = false;
foreach ($value->getArguments() as $k => $v) {
if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $k)) {
$hasNamedArgs = true;
continue;
}

if ($k !== $i++) {
if (!\is_int($k)) {
$msg = \sprintf('Invalid constructor argument for service "%s": integer expected but found string "%s". Check your service definition.', $this->currentId, $k);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}

break;
}

$msg = \sprintf('Invalid constructor argument %d for service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $this->currentId, $i);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}
}

if ($hasNamedArgs) {
$msg = \sprintf('Invalid constructor argument for service "%s": cannot use positional argument after named argument. Check your service definition.', $this->currentId);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}

break;
}
}

foreach ($value->getMethodCalls() as $methodCall) {
$i = 0;
$hasNamedArgs = false;
foreach ($methodCall[1] as $k => $v) {
if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $k)) {
$hasNamedArgs = true;
continue;
}

if ($k !== $i++) {
if (!\is_int($k)) {
$msg = \sprintf('Invalid argument for method call "%s" of service "%s": integer expected but found string "%s". Check your service definition.', $methodCall[0], $this->currentId, $k);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}

break;
}

$msg = \sprintf('Invalid argument %d for method call "%s" of service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $methodCall[0], $this->currentId, $i);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}
}

if ($hasNamedArgs) {
$msg = \sprintf('Invalid argument for method call "%s" of service "%s": cannot use positional argument after named argument. Check your service definition.', $methodCall[0], $this->currentId);
$value->addError($msg);
if ($this->throwExceptions) {
throw new RuntimeException($msg);
}

break;
}
}
}

return null;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

class RemoveBuildParametersPass implements CompilerPassInterface
{



private array $removedParameters = [];




public function process(ContainerBuilder $container)
{
$parameterBag = $container->getParameterBag();
$this->removedParameters = [];

foreach ($parameterBag->all() as $name => $value) {
if ('.' === ($name[0] ?? '')) {
$this->removedParameters[$name] = $value;

$parameterBag->remove($name);
$container->log($this, \sprintf('Removing build parameter "%s".', $name));
}
}
}




public function getRemovedParameters(): array
{
return $this->removedParameters;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Contracts\Service\Attribute\Required;






class AutowireRequiredMethodsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
$value = parent::processValue($value, $isRoot);

if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
return $value;
}
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) {
return $value;
}

$alreadyCalledMethods = [];
$withers = [];

foreach ($value->getMethodCalls() as [$method]) {
$alreadyCalledMethods[strtolower($method)] = true;
}

foreach ($reflectionClass->getMethods() as $reflectionMethod) {
$r = $reflectionMethod;

if ($r->isConstructor() || isset($alreadyCalledMethods[strtolower($r->name)])) {
continue;
}

while (true) {
if ($r->getAttributes(Required::class)) {
if ($this->isWither($r, $r->getDocComment() ?: '')) {
$withers[] = [$r->name, [], true];
} else {
$value->addMethodCall($r->name, []);
}
break;
}
if (false !== $doc = $r->getDocComment()) {
if (false !== stripos($doc, '@required') && preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Relying on the "@required" annotation on method "%s::%s()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.', $reflectionMethod->class, $reflectionMethod->name);

if ($this->isWither($reflectionMethod, $doc)) {
$withers[] = [$reflectionMethod->name, [], true];
} else {
$value->addMethodCall($reflectionMethod->name, []);
}
break;
}
if (false === stripos($doc, '@inheritdoc') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+(?:\{@inheritdoc\}|@inheritdoc)(?:\s|\*/$)#i', $doc)) {
break;
}
}
try {
$r = $r->getPrototype();
} catch (\ReflectionException) {
break; 
}
}
}

if ($withers) {

$setters = $value->getMethodCalls();
$value->setMethodCalls($withers);
foreach ($setters as $call) {
$value->addMethodCall($call[0], $call[1], $call[2] ?? false);
}
}

return $value;
}

private function isWither(\ReflectionMethod $reflectionMethod, string $doc): bool
{
$match = preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@return\s++(static|\$this)[\s\*]#i', $doc, $matches);
if ($match && 'static' === $matches[1]) {
return true;
}

if ($match && '$this' === $matches[1]) {
return false;
}

$reflectionType = $reflectionMethod->hasReturnType() ? $reflectionMethod->getReturnType() : null;

return $reflectionType instanceof \ReflectionNamedType && 'static' === $reflectionType->getName();
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ExpressionLanguage;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;




abstract class AbstractRecursivePass implements CompilerPassInterface
{



protected $container;
protected $currentId;
protected bool $skipScalars = false;

private bool $processExpressions = false;
private ExpressionLanguage $expressionLanguage;
private bool $inExpression = false;




public function process(ContainerBuilder $container)
{
$this->container = $container;

try {
$this->processValue($container->getDefinitions(), true);
} finally {
$this->container = null;
}
}




protected function enableExpressionProcessing()
{
$this->processExpressions = true;
}

protected function inExpression(bool $reset = true): bool
{
$inExpression = $this->inExpression;
if ($reset) {
$this->inExpression = false;
}

return $inExpression;
}






protected function processValue(mixed $value, bool $isRoot = false)
{
if (\is_array($value)) {
foreach ($value as $k => $v) {
if ((!$v || \is_scalar($v)) && $this->skipScalars) {
continue;
}
if ($isRoot) {
if ($v instanceof Definition && $v->hasTag('container.excluded')) {
continue;
}
$this->currentId = $k;
}
if ($v !== $processedValue = $this->processValue($v, $isRoot)) {
$value[$k] = $processedValue;
}
}
} elseif ($value instanceof ArgumentInterface) {
$value->setValues($this->processValue($value->getValues()));
} elseif ($value instanceof Expression && $this->processExpressions) {
$this->getExpressionLanguage()->compile((string) $value, ['this' => 'container', 'args' => 'args']);
} elseif ($value instanceof Definition) {
$value->setArguments($this->processValue($value->getArguments()));
$value->setProperties($this->processValue($value->getProperties()));
$value->setMethodCalls($this->processValue($value->getMethodCalls()));

$changes = $value->getChanges();
if (isset($changes['factory'])) {
if (\is_string($factory = $value->getFactory()) && str_starts_with($factory, '@=')) {
if (!class_exists(Expression::class)) {
throw new LogicException('Expressions cannot be used in service factories without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}
$factory = new Expression(substr($factory, 2));
}
if (($factory = $this->processValue($factory)) instanceof Expression) {
$factory = '@='.$factory;
}
$value->setFactory($factory);
}
if (isset($changes['configurator'])) {
$value->setConfigurator($this->processValue($value->getConfigurator()));
}
}

return $value;
}




protected function getConstructor(Definition $definition, bool $required): ?\ReflectionFunctionAbstract
{
if ($definition->isSynthetic()) {
return null;
}

if (\is_string($factory = $definition->getFactory())) {
if (str_starts_with($factory, '@=')) {
return new \ReflectionFunction(static function (...$args) {});
}

if (!\function_exists($factory)) {
throw new RuntimeException(\sprintf('Invalid service "%s": function "%s" does not exist.', $this->currentId, $factory));
}
$r = new \ReflectionFunction($factory);
if (false !== $r->getFileName() && file_exists($r->getFileName())) {
$this->container->fileExists($r->getFileName());
}

return $r;
}

if ($factory) {
[$class, $method] = $factory;

if ('__construct' === $method) {
throw new RuntimeException(\sprintf('Invalid service "%s": "__construct()" cannot be used as a factory method.', $this->currentId));
}

if ($class instanceof Reference) {
$factoryDefinition = $this->container->findDefinition((string) $class);
while ((null === $class = $factoryDefinition->getClass()) && $factoryDefinition instanceof ChildDefinition) {
$factoryDefinition = $this->container->findDefinition($factoryDefinition->getParent());
}
} elseif ($class instanceof Definition) {
$class = $class->getClass();
} else {
$class ??= $definition->getClass();
}

return $this->getReflectionMethod(new Definition($class), $method);
}

while ((null === $class = $definition->getClass()) && $definition instanceof ChildDefinition) {
$definition = $this->container->findDefinition($definition->getParent());
}

try {
if (!$r = $this->container->getReflectionClass($class)) {
if (null === $class) {
throw new RuntimeException(\sprintf('Invalid service "%s": the class is not set.', $this->currentId));
}

throw new RuntimeException(\sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class));
}
} catch (\ReflectionException $e) {
throw new RuntimeException(\sprintf('Invalid service "%s": ', $this->currentId).lcfirst($e->getMessage()));
}
if (!$r = $r->getConstructor()) {
if ($required) {
throw new RuntimeException(\sprintf('Invalid service "%s": class%s has no constructor.', $this->currentId, \sprintf($class !== $this->currentId ? ' "%s"' : '', $class)));
}
} elseif (!$r->isPublic()) {
throw new RuntimeException(\sprintf('Invalid service "%s": ', $this->currentId).\sprintf($class !== $this->currentId ? 'constructor of class "%s"' : 'its constructor', $class).' must be public.');
}

return $r;
}




protected function getReflectionMethod(Definition $definition, string $method): \ReflectionFunctionAbstract
{
if ('__construct' === $method) {
return $this->getConstructor($definition, true);
}

while ((null === $class = $definition->getClass()) && $definition instanceof ChildDefinition) {
$definition = $this->container->findDefinition($definition->getParent());
}

if (null === $class) {
throw new RuntimeException(\sprintf('Invalid service "%s": the class is not set.', $this->currentId));
}

if (!$r = $this->container->getReflectionClass($class)) {
throw new RuntimeException(\sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class));
}

if (!$r->hasMethod($method)) {
if ($r->hasMethod('__call') && ($r = $r->getMethod('__call')) && $r->isPublic()) {
return new \ReflectionMethod(static function (...$arguments) {}, '__invoke');
}

if ($r->hasMethod('__callStatic') && ($r = $r->getMethod('__callStatic')) && $r->isPublic()) {
return new \ReflectionMethod(static function (...$arguments) {}, '__invoke');
}

throw new RuntimeException(\sprintf('Invalid service "%s": method "%s()" does not exist.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method));
}

$r = $r->getMethod($method);
if (!$r->isPublic()) {
throw new RuntimeException(\sprintf('Invalid service "%s": method "%s()" must be public.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method));
}

return $r;
}

private function getExpressionLanguage(): ExpressionLanguage
{
if (!isset($this->expressionLanguage)) {
if (!class_exists(ExpressionLanguage::class)) {
throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".');
}

$providers = $this->container->getExpressionLanguageProviders();
$this->expressionLanguage = new ExpressionLanguage(null, $providers, function (string $arg): string {
if ('""' === substr_replace($arg, '', 1, -1)) {
$id = stripcslashes(substr($arg, 1, -1));
$this->inExpression = true;
$arg = $this->processValue(new Reference($id));
$this->inExpression = false;
if (!$arg instanceof Reference) {
throw new RuntimeException(\sprintf('"%s::processValue()" must return a Reference when processing an expression, "%s" returned for service("%s").', static::class, get_debug_type($arg), $id));
}
$arg = \sprintf('"%s"', $arg);
}

return \sprintf('$this->get(%s)', $arg);
});
}

return $this->expressionLanguage;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Reference;






class InlineServiceDefinitionsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private ?AnalyzeServiceReferencesPass $analyzingPass;
private array $cloningIds = [];
private array $connectedIds = [];
private array $notInlinedIds = [];
private array $inlinedIds = [];
private array $notInlinableIds = [];
private ?ServiceReferenceGraph $graph = null;

public function __construct(?AnalyzeServiceReferencesPass $analyzingPass = null)
{
$this->analyzingPass = $analyzingPass;
}




public function process(ContainerBuilder $container)
{
$this->container = $container;
if ($this->analyzingPass) {
$analyzedContainer = new ContainerBuilder();
$analyzedContainer->setAliases($container->getAliases());
$analyzedContainer->setDefinitions($container->getDefinitions());
foreach ($container->getExpressionLanguageProviders() as $provider) {
$analyzedContainer->addExpressionLanguageProvider($provider);
}
} else {
$analyzedContainer = $container;
}
try {
$notInlinableIds = [];
$remainingInlinedIds = [];
$this->connectedIds = $this->notInlinedIds = $container->getDefinitions();
do {
if ($this->analyzingPass) {
$analyzedContainer->setDefinitions(array_intersect_key($analyzedContainer->getDefinitions(), $this->connectedIds));
$this->analyzingPass->process($analyzedContainer);
}
$this->graph = $analyzedContainer->getCompiler()->getServiceReferenceGraph();
$notInlinedIds = $this->notInlinedIds;
$notInlinableIds += $this->notInlinableIds;
$this->connectedIds = $this->notInlinedIds = $this->inlinedIds = $this->notInlinableIds = [];

foreach ($analyzedContainer->getDefinitions() as $id => $definition) {
if (!$this->graph->hasNode($id)) {
continue;
}
if ($definition->isPublic()) {
$this->connectedIds[$id] = true;
}
foreach ($this->graph->getNode($id)->getOutEdges() as $edge) {
if (isset($notInlinedIds[$edge->getSourceNode()->getId()])) {
$this->currentId = $id;
$this->processValue($definition, true);
break;
}
}
}

foreach ($this->inlinedIds as $id => $isPublicOrNotShared) {
if ($isPublicOrNotShared) {
$remainingInlinedIds[$id] = $id;
} else {
$container->removeDefinition($id);
$analyzedContainer->removeDefinition($id);
}
}
} while ($this->inlinedIds && $this->analyzingPass);

foreach ($remainingInlinedIds as $id) {
if (isset($notInlinableIds[$id])) {
continue;
}

$definition = $container->getDefinition($id);

if (!$definition->isShared() && !$definition->isPublic()) {
$container->removeDefinition($id);
}
}
} finally {
$this->container = null;
$this->connectedIds = $this->notInlinedIds = $this->inlinedIds = [];
$this->notInlinableIds = [];
$this->graph = null;
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof ArgumentInterface) {

return $value;
}

if ($value instanceof Definition && $this->cloningIds) {
if ($value->isShared()) {
return $value;
}
$value = clone $value;
}

if (!$value instanceof Reference) {
return parent::processValue($value, $isRoot);
} elseif (!$this->container->hasDefinition($id = (string) $value)) {
return $value;
}

$definition = $this->container->getDefinition($id);

if (isset($this->notInlinableIds[$id]) || !$this->isInlineableDefinition($id, $definition)) {
if ($this->currentId !== $id) {
$this->notInlinableIds[$id] = true;
}

return $value;
}

$this->container->log($this, \sprintf('Inlined service "%s" to "%s".', $id, $this->currentId));
$this->inlinedIds[$id] = $definition->isPublic() || !$definition->isShared();
$this->notInlinedIds[$this->currentId ?? ''] = true;

if ($definition->isShared()) {
return $definition;
}

if (isset($this->cloningIds[$id])) {
$ids = array_keys($this->cloningIds);
$ids[] = $id;

throw new ServiceCircularReferenceException($id, \array_slice($ids, array_search($id, $ids)));
}

$this->cloningIds[$id] = true;
try {
return $this->processValue($definition);
} finally {
unset($this->cloningIds[$id]);
}
}




private function isInlineableDefinition(string $id, Definition $definition): bool
{
if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic() || $definition->hasTag('container.do_not_inline')) {
return false;
}

if (!$definition->isShared()) {
if (!$this->graph->hasNode($id)) {
return true;
}

foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
$srcId = $edge->getSourceNode()->getId();
$this->connectedIds[$srcId] = true;
if ($edge->isWeak() || $edge->isLazy()) {
return !$this->connectedIds[$id] = true;
}
}

return true;
}

if ($definition->isPublic()
|| $this->currentId === $id
|| !$this->graph->hasNode($id)
) {
return false;
}

$this->connectedIds[$id] = true;

$srcIds = [];
$srcCount = 0;
foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
$srcId = $edge->getSourceNode()->getId();
$this->connectedIds[$srcId] = true;
if ($edge->isWeak() || $edge->isLazy()) {
return false;
}
$srcIds[$srcId] = true;
++$srcCount;
}

if (1 !== \count($srcIds)) {
$this->notInlinedIds[$id] = true;

return false;
}

if ($srcCount > 1 && \is_array($factory = $definition->getFactory()) && ($factory[0] instanceof Reference || $factory[0] instanceof Definition)) {
return false;
}

$srcDefinition = $this->container->getDefinition($srcId);

return $srcDefinition->isShared() && !$srcDefinition->isLazy();
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ExpressionLanguage;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ServiceLocator;
use Symfony\Component\ExpressionLanguage\Expression;













final class CheckTypeDeclarationsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private const SCALAR_TYPES = [
'int' => true,
'float' => true,
'bool' => true,
'string' => true,
];

private const BUILTIN_TYPES = [
'array' => true,
'bool' => true,
'callable' => true,
'float' => true,
'int' => true,
'iterable' => true,
'object' => true,
'string' => true,
];

private bool $autoload;
private array $skippedIds;

private ExpressionLanguage $expressionLanguage;






public function __construct(bool $autoload = false, array $skippedIds = [])
{
$this->autoload = $autoload;
$this->skippedIds = $skippedIds;
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (isset($this->skippedIds[$this->currentId ?? ''])) {
return $value;
}

if (!$value instanceof Definition || $value->hasErrors() || $value->isDeprecated()) {
return parent::processValue($value, $isRoot);
}

if (!$this->autoload) {
if (!$class = $value->getClass()) {
return parent::processValue($value, $isRoot);
}
if (!class_exists($class, false) && !interface_exists($class, false)) {
return parent::processValue($value, $isRoot);
}
}

if (ServiceLocator::class === $value->getClass()) {
return parent::processValue($value, $isRoot);
}

if ($constructor = $this->getConstructor($value, false)) {
$this->checkTypeDeclarations($value, $constructor, $value->getArguments());
}

foreach ($value->getMethodCalls() as $methodCall) {
try {
$reflectionMethod = $this->getReflectionMethod($value, $methodCall[0]);
} catch (RuntimeException $e) {
if ($value->getFactory()) {
continue;
}

throw $e;
}

$this->checkTypeDeclarations($value, $reflectionMethod, $methodCall[1]);
}

return parent::processValue($value, $isRoot);
}




private function checkTypeDeclarations(Definition $checkedDefinition, \ReflectionFunctionAbstract $reflectionFunction, array $values): void
{
$numberOfRequiredParameters = $reflectionFunction->getNumberOfRequiredParameters();

if (\count($values) < $numberOfRequiredParameters) {
throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": "%s::%s()" requires %d arguments, %d passed.', $this->currentId, $reflectionFunction->class, $reflectionFunction->name, $numberOfRequiredParameters, \count($values)));
}

$reflectionParameters = $reflectionFunction->getParameters();
$checksCount = min($reflectionFunction->getNumberOfParameters(), \count($values));

$envPlaceholderUniquePrefix = $this->container->getParameterBag() instanceof EnvPlaceholderParameterBag ? $this->container->getParameterBag()->getEnvPlaceholderUniquePrefix() : null;

for ($i = 0; $i < $checksCount; ++$i) {
$p = $reflectionParameters[$i];
if (!$p->hasType() || $p->isVariadic()) {
continue;
}
if (\array_key_exists($p->name, $values)) {
$i = $p->name;
} elseif (!\array_key_exists($i, $values)) {
continue;
}

$this->checkType($checkedDefinition, $values[$i], $p, $envPlaceholderUniquePrefix);
}

if ($reflectionFunction->isVariadic() && ($lastParameter = end($reflectionParameters))->hasType()) {
$variadicParameters = \array_slice($values, $lastParameter->getPosition());

foreach ($variadicParameters as $variadicParameter) {
$this->checkType($checkedDefinition, $variadicParameter, $lastParameter, $envPlaceholderUniquePrefix);
}
}
}




private function checkType(Definition $checkedDefinition, mixed $value, \ReflectionParameter $parameter, ?string $envPlaceholderUniquePrefix, ?\ReflectionType $reflectionType = null): void
{
$reflectionType ??= $parameter->getType();

if ($reflectionType instanceof \ReflectionUnionType) {
foreach ($reflectionType->getTypes() as $t) {
try {
$this->checkType($checkedDefinition, $value, $parameter, $envPlaceholderUniquePrefix, $t);

return;
} catch (InvalidParameterTypeException $e) {
}
}

throw new InvalidParameterTypeException($this->currentId, $e->getCode(), $parameter);
}
if ($reflectionType instanceof \ReflectionIntersectionType) {
foreach ($reflectionType->getTypes() as $t) {
$this->checkType($checkedDefinition, $value, $parameter, $envPlaceholderUniquePrefix, $t);
}

return;
}
if (!$reflectionType instanceof \ReflectionNamedType) {
return;
}

$type = $reflectionType->getName();

if ($value instanceof Reference) {
if (!$this->container->has($value = (string) $value)) {
return;
}

if ('service_container' === $value && is_a($type, Container::class, true)) {
return;
}

$value = $this->container->findDefinition($value);
}

if ('self' === $type) {
$type = $parameter->getDeclaringClass()->getName();
}

if ('static' === $type) {
$type = $checkedDefinition->getClass();
}

$class = null;

if ($value instanceof Definition) {
if ($value->hasErrors() || $value->getFactory()) {
return;
}

$class = $value->getClass();

if ($class && isset(self::BUILTIN_TYPES[strtolower($class)])) {
$class = strtolower($class);
} elseif (!$class || (!$this->autoload && !class_exists($class, false) && !interface_exists($class, false))) {
return;
}
} elseif ($value instanceof Parameter) {
$value = $this->container->getParameter($value);
} elseif ($value instanceof Expression) {
try {
$value = $this->getExpressionLanguage()->evaluate($value, ['container' => $this->container]);
} catch (\Exception) {

return;
}
} elseif (\is_string($value)) {
if ('%' === ($value[0] ?? '') && preg_match('/^%([^%]+)%$/', $value, $match)) {
$value = $this->container->getParameter(substr($value, 1, -1));
}

if ($envPlaceholderUniquePrefix && \is_string($value) && str_contains($value, 'env_')) {


if ('' === preg_replace('/'.$envPlaceholderUniquePrefix.'_\w+_[a-f0-9]{32}/U', '', $value, -1, $c) && 1 === $c) {
try {
$value = $this->container->resolveEnvPlaceholders($value, true);
} catch (\Exception) {

return;
}
}
}
}

if (null === $value && $parameter->allowsNull()) {
return;
}

if (null === $class) {
if ($value instanceof IteratorArgument) {
$class = RewindableGenerator::class;
} elseif ($value instanceof ServiceClosureArgument) {
$class = \Closure::class;
} elseif ($value instanceof ServiceLocatorArgument) {
$class = ServiceLocator::class;
} elseif (\is_object($value)) {
$class = $value::class;
} else {
$class = \gettype($value);
$class = ['integer' => 'int', 'double' => 'float', 'boolean' => 'bool'][$class] ?? $class;
}
}

if (isset(self::SCALAR_TYPES[$type]) && isset(self::SCALAR_TYPES[$class])) {
return;
}

if ('string' === $type && method_exists($class, '__toString')) {
return;
}

if ('callable' === $type && (\Closure::class === $class || method_exists($class, '__invoke'))) {
return;
}

if ('callable' === $type && \is_array($value) && isset($value[0]) && ($value[0] instanceof Reference || $value[0] instanceof Definition || \is_string($value[0]))) {
return;
}

if ('iterable' === $type && (\is_array($value) || 'array' === $class || is_subclass_of($class, \Traversable::class))) {
return;
}

if ($type === $class) {
return;
}

if ('object' === $type && !isset(self::BUILTIN_TYPES[$class])) {
return;
}

if ('mixed' === $type) {
return;
}

if (is_a($class, $type, true)) {
return;
}

if ('false' === $type) {
if (false === $value) {
return;
}
} elseif ('true' === $type) {
if (true === $value) {
return;
}
} elseif ($reflectionType->isBuiltin()) {
$checkFunction = \sprintf('is_%s', $type);
if ($checkFunction($value)) {
return;
}
}

throw new InvalidParameterTypeException($this->currentId, \is_object($value) ? $class : get_debug_type($value), $parameter);
}

private function getExpressionLanguage(): ExpressionLanguage
{
return $this->expressionLanguage ??= new ExpressionLanguage(null, $this->container->getExpressionLanguageProviders());
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Definition;








class ServiceReferenceGraphNode
{
private string $id;
private array $inEdges = [];
private array $outEdges = [];
private mixed $value;

public function __construct(string $id, mixed $value)
{
$this->id = $id;
$this->value = $value;
}




public function addInEdge(ServiceReferenceGraphEdge $edge)
{
$this->inEdges[] = $edge;
}




public function addOutEdge(ServiceReferenceGraphEdge $edge)
{
$this->outEdges[] = $edge;
}




public function isAlias(): bool
{
return $this->value instanceof Alias;
}




public function isDefinition(): bool
{
return $this->value instanceof Definition;
}




public function getId(): string
{
return $this->id;
}






public function getInEdges(): array
{
return $this->inEdges;
}






public function getOutEdges(): array
{
return $this->outEdges;
}




public function getValue(): mixed
{
return $this->value;
}






public function clear()
{
$this->inEdges = $this->outEdges = [];
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;




class AutoAliasServicePass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) {
foreach ($tags as $tag) {
if (!isset($tag['format'])) {
throw new InvalidArgumentException(\sprintf('Missing tag information "format" on auto_alias service "%s".', $serviceId));
}

$aliasId = $container->getParameterBag()->resolveValue($tag['format']);
if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
$alias = new Alias($aliasId, $container->getDefinition($serviceId)->isPublic());
$container->setAlias($serviceId, $alias);
}
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




final class AttributeAutoconfigurationPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $classAttributeConfigurators = [];
private array $methodAttributeConfigurators = [];
private array $propertyAttributeConfigurators = [];
private array $parameterAttributeConfigurators = [];

public function process(ContainerBuilder $container): void
{
if (!$container->getAutoconfiguredAttributes()) {
return;
}

foreach ($container->getAutoconfiguredAttributes() as $attributeName => $callable) {
$callableReflector = new \ReflectionFunction($callable(...));
if ($callableReflector->getNumberOfParameters() <= 2) {
$this->classAttributeConfigurators[$attributeName] = $callable;
continue;
}

$reflectorParameter = $callableReflector->getParameters()[2];
$parameterType = $reflectorParameter->getType();
$types = [];
if ($parameterType instanceof \ReflectionUnionType) {
foreach ($parameterType->getTypes() as $type) {
$types[] = $type->getName();
}
} elseif ($parameterType instanceof \ReflectionNamedType) {
$types[] = $parameterType->getName();
} else {
throw new LogicException(\sprintf('Argument "$%s" of attribute autoconfigurator should have a type, use one or more of "\ReflectionClass|\ReflectionMethod|\ReflectionProperty|\ReflectionParameter|\Reflector" in "%s" on line "%d".', $reflectorParameter->getName(), $callableReflector->getFileName(), $callableReflector->getStartLine()));
}

try {
$attributeReflector = new \ReflectionClass($attributeName);
} catch (\ReflectionException) {
continue;
}

$targets = $attributeReflector->getAttributes(\Attribute::class)[0] ?? 0;
$targets = $targets ? $targets->getArguments()[0] ?? -1 : 0;

foreach (['class', 'method', 'property', 'parameter'] as $symbol) {
if (['Reflector'] !== $types) {
if (!\in_array('Reflection'.ucfirst($symbol), $types, true)) {
continue;
}
if (!($targets & \constant('Attribute::TARGET_'.strtoupper($symbol)))) {
throw new LogicException(\sprintf('Invalid type "Reflection%s" on argument "$%s": attribute "%s" cannot target a '.$symbol.' in "%s" on line "%d".', ucfirst($symbol), $reflectorParameter->getName(), $attributeName, $callableReflector->getFileName(), $callableReflector->getStartLine()));
}
}
$this->{$symbol.'AttributeConfigurators'}[$attributeName] = $callable;
}
}

parent::process($container);
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Definition
|| !$value->isAutoconfigured()
|| $value->isAbstract()
|| $value->hasTag('container.ignore_attributes')
|| !($classReflector = $this->container->getReflectionClass($value->getClass(), false))
) {
return parent::processValue($value, $isRoot);
}

$instanceof = $value->getInstanceofConditionals();
$conditionals = $instanceof[$classReflector->getName()] ?? new ChildDefinition('');

if ($this->classAttributeConfigurators) {
foreach ($classReflector->getAttributes() as $attribute) {
if ($configurator = $this->classAttributeConfigurators[$attribute->getName()] ?? null) {
$configurator($conditionals, $attribute->newInstance(), $classReflector);
}
}
}

if ($this->parameterAttributeConfigurators) {
try {
$constructorReflector = $this->getConstructor($value, false);
} catch (RuntimeException) {
$constructorReflector = null;
}

if ($constructorReflector) {
foreach ($constructorReflector->getParameters() as $parameterReflector) {
foreach ($parameterReflector->getAttributes() as $attribute) {
if ($configurator = $this->parameterAttributeConfigurators[$attribute->getName()] ?? null) {
$configurator($conditionals, $attribute->newInstance(), $parameterReflector);
}
}
}
}
}

if ($this->methodAttributeConfigurators || $this->parameterAttributeConfigurators) {
foreach ($classReflector->getMethods(\ReflectionMethod::IS_PUBLIC) as $methodReflector) {
if ($methodReflector->isConstructor() || $methodReflector->isDestructor()) {
continue;
}

if ($this->methodAttributeConfigurators) {
foreach ($methodReflector->getAttributes() as $attribute) {
if ($configurator = $this->methodAttributeConfigurators[$attribute->getName()] ?? null) {
$configurator($conditionals, $attribute->newInstance(), $methodReflector);
}
}
}

if ($this->parameterAttributeConfigurators) {
foreach ($methodReflector->getParameters() as $parameterReflector) {
foreach ($parameterReflector->getAttributes() as $attribute) {
if ($configurator = $this->parameterAttributeConfigurators[$attribute->getName()] ?? null) {
$configurator($conditionals, $attribute->newInstance(), $parameterReflector);
}
}
}
}
}
}

if ($this->propertyAttributeConfigurators) {
foreach ($classReflector->getProperties(\ReflectionProperty::IS_PUBLIC) as $propertyReflector) {
if ($propertyReflector->isStatic()) {
continue;
}

foreach ($propertyReflector->getAttributes() as $attribute) {
if ($configurator = $this->propertyAttributeConfigurators[$attribute->getName()] ?? null) {
$configurator($conditionals, $attribute->newInstance(), $propertyReflector);
}
}
}
}

if (!isset($instanceof[$classReflector->getName()]) && new ChildDefinition('') != $conditionals) {
$instanceof[$classReflector->getName()] = $conditionals;
$value->setInstanceofConditionals($instanceof);
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;






class CheckExceptionOnInvalidReferenceBehaviorPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $serviceLocatorContextIds = [];




public function process(ContainerBuilder $container)
{
$this->serviceLocatorContextIds = [];
foreach ($container->findTaggedServiceIds('container.service_locator_context') as $id => $tags) {
$this->serviceLocatorContextIds[$id] = $tags[0]['id'];
$container->getDefinition($id)->clearTag('container.service_locator_context');
}

try {
parent::process($container);
} finally {
$this->serviceLocatorContextIds = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Reference) {
return parent::processValue($value, $isRoot);
}
if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $value->getInvalidBehavior() || $this->container->has($id = (string) $value)) {
return $value;
}

$currentId = $this->currentId;
$graph = $this->container->getCompiler()->getServiceReferenceGraph();

if (isset($this->serviceLocatorContextIds[$currentId])) {
$currentId = $this->serviceLocatorContextIds[$currentId];
$locator = $this->container->getDefinition($this->currentId)->getFactory()[0];
$this->throwServiceNotFoundException($value, $currentId, $locator->getArgument(0));
}

if ('.' === $currentId[0] && $graph->hasNode($currentId)) {
foreach ($graph->getNode($currentId)->getInEdges() as $edge) {
if (!$edge->getValue() instanceof Reference || ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $edge->getValue()->getInvalidBehavior()) {
continue;
}
$sourceId = $edge->getSourceNode()->getId();

if ('.' !== $sourceId[0]) {
$currentId = $sourceId;
break;
}

if (isset($this->serviceLocatorContextIds[$sourceId])) {
$currentId = $this->serviceLocatorContextIds[$sourceId];
$locator = $this->container->getDefinition($this->currentId);
$this->throwServiceNotFoundException($value, $currentId, $locator->getArgument(0));
}
}
}

$this->throwServiceNotFoundException($value, $currentId, $value);
}

private function throwServiceNotFoundException(Reference $ref, string $sourceId, $value): void
{
$id = (string) $ref;
$alternatives = [];
foreach ($this->container->getServiceIds() as $knownId) {
if ('' === $knownId || '.' === $knownId[0] || $knownId === $this->currentId) {
continue;
}

$lev = levenshtein($id, $knownId);
if ($lev <= \strlen($id) / 3 || str_contains($knownId, $id)) {
$alternatives[] = $knownId;
}
}

$pass = new class extends AbstractRecursivePass {
public Reference $ref;
public string $sourceId;
public array $alternatives;

public function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($this->ref !== $value) {
return parent::processValue($value, $isRoot);
}
$sourceId = $this->sourceId;
if (null !== $this->currentId && $this->currentId !== (string) $value) {
$sourceId = $this->currentId.'" in the container provided to "'.$sourceId;
}

throw new ServiceNotFoundException((string) $value, $sourceId, null, $this->alternatives);
}
};
$pass->ref = $ref;
$pass->sourceId = $sourceId;
$pass->alternatives = $alternatives;

$pass->processValue($value, true);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\Config\Resource\ClassExistenceResource;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\Attribute\AutowireCallable;
use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated;
use Symfony\Component\DependencyInjection\Attribute\MapDecorated;
use Symfony\Component\DependencyInjection\Attribute\Target;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\AutowiringFailedException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\VarExporter\ProxyHelper;







class AutowirePass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $types;
private array $ambiguousServiceTypes;
private array $autowiringAliases;
private ?string $lastFailure = null;
private bool $throwOnAutowiringException;
private ?string $decoratedClass = null;
private ?string $decoratedId = null;
private ?array $methodCalls = null;
private object $defaultArgument;
private ?\Closure $getPreviousValue = null;
private ?int $decoratedMethodIndex = null;
private ?int $decoratedMethodArgumentIndex = null;
private ?self $typesClone = null;

public function __construct(bool $throwOnAutowireException = true)
{
$this->throwOnAutowiringException = $throwOnAutowireException;
$this->defaultArgument = new class {
public $value;
public $names;
public $bag;

public function withValue(\ReflectionParameter $parameter): self
{
$clone = clone $this;
$clone->value = $this->bag->escapeValue($parameter->getDefaultValue());

return $clone;
}
};
}




public function process(ContainerBuilder $container)
{
$this->defaultArgument->bag = $container->getParameterBag();

try {
$this->typesClone = clone $this;
parent::process($container);
} finally {
$this->decoratedClass = null;
$this->decoratedId = null;
$this->methodCalls = null;
$this->defaultArgument->bag = null;
$this->defaultArgument->names = null;
$this->getPreviousValue = null;
$this->decoratedMethodIndex = null;
$this->decoratedMethodArgumentIndex = null;
$this->typesClone = null;
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Autowire) {
return $this->processValue($this->container->getParameterBag()->resolveValue($value->value));
}

if ($value instanceof AutowireDecorated || $value instanceof MapDecorated) {
$definition = $this->container->getDefinition($this->currentId);

return new Reference($definition->innerServiceId ?? $this->currentId.'.inner', $definition->decorationOnInvalid ?? ContainerInterface::NULL_ON_INVALID_REFERENCE);
}

try {
return $this->doProcessValue($value, $isRoot);
} catch (AutowiringFailedException $e) {
if ($this->throwOnAutowiringException) {
throw $e;
}

$this->container->getDefinition($this->currentId)->addError($e->getMessageCallback() ?? $e->getMessage());

return parent::processValue($value, $isRoot);
}
}

private function doProcessValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof TypedReference) {
foreach ($value->getAttributes() as $attribute) {
if ($attribute === $v = $this->processValue($attribute)) {
continue;
}
if (!$attribute instanceof Autowire || !$v instanceof Reference) {
return $v;
}

$invalidBehavior = ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE !== $v->getInvalidBehavior() ? $v->getInvalidBehavior() : $value->getInvalidBehavior();
$value = $v instanceof TypedReference
? new TypedReference($v, $v->getType(), $invalidBehavior, $v->getName() ?? $value->getName(), array_merge($v->getAttributes(), $value->getAttributes()))
: new TypedReference($v, $value->getType(), $invalidBehavior, $value->getName(), $value->getAttributes());
break;
}
if ($ref = $this->getAutowiredReference($value, true)) {
return $ref;
}
if (ContainerBuilder::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) {
$message = $this->createTypeNotFoundMessageCallback($value, 'it');


$this->container->register($id = \sprintf('.errored.%s.%s', $this->currentId, (string) $value), $value->getType())
->addError($message);

return new TypedReference($id, $value->getType(), $value->getInvalidBehavior(), $value->getName());
}
}
$value = parent::processValue($value, $isRoot);

if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
return $value;
}
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) {
$this->container->log($this, \sprintf('Skipping service "%s": Class or interface "%s" cannot be loaded.', $this->currentId, $value->getClass()));

return $value;
}

$this->methodCalls = $value->getMethodCalls();

try {
$constructor = $this->getConstructor($value, false);
} catch (RuntimeException $e) {
throw new AutowiringFailedException($this->currentId, $e->getMessage(), 0, $e);
}

if ($constructor) {
array_unshift($this->methodCalls, [$constructor, $value->getArguments()]);
}

$checkAttributes = !$value->hasTag('container.ignore_attributes');
$this->methodCalls = $this->autowireCalls($reflectionClass, $isRoot, $checkAttributes);

if ($constructor) {
[, $arguments] = array_shift($this->methodCalls);

if ($arguments !== $value->getArguments()) {
$value->setArguments($arguments);
}
}

if ($this->methodCalls !== $value->getMethodCalls()) {
$value->setMethodCalls($this->methodCalls);
}

return $value;
}

private function autowireCalls(\ReflectionClass $reflectionClass, bool $isRoot, bool $checkAttributes): array
{
$this->decoratedId = null;
$this->decoratedClass = null;
$this->getPreviousValue = null;

if ($isRoot && ($definition = $this->container->getDefinition($this->currentId)) && null !== ($this->decoratedId = $definition->innerServiceId) && $this->container->has($this->decoratedId)) {
$this->decoratedClass = $this->container->findDefinition($this->decoratedId)->getClass();
}

$patchedIndexes = [];

foreach ($this->methodCalls as $i => $call) {
[$method, $arguments] = $call;

if ($method instanceof \ReflectionFunctionAbstract) {
$reflectionMethod = $method;
} else {
$definition = new Definition($reflectionClass->name);
try {
$reflectionMethod = $this->getReflectionMethod($definition, $method);
} catch (RuntimeException $e) {
if ($definition->getFactory()) {
continue;
}
throw $e;
}
}

$arguments = $this->autowireMethod($reflectionMethod, $arguments, $checkAttributes, $i);

if ($arguments !== $call[1]) {
$this->methodCalls[$i][1] = $arguments;
$patchedIndexes[] = $i;
}
}


foreach ($patchedIndexes as $i) {
$namedArguments = null;
$arguments = $this->methodCalls[$i][1];

foreach ($arguments as $j => $value) {
if ($namedArguments && !$value instanceof $this->defaultArgument) {
unset($arguments[$j]);
$arguments[$namedArguments[$j]] = $value;
}
if (!$value instanceof $this->defaultArgument) {
continue;
}

if (\is_array($value->value) ? $value->value : \is_object($value->value)) {
unset($arguments[$j]);
$namedArguments = $value->names;
}

if ($namedArguments) {
unset($arguments[$j]);
} else {
$arguments[$j] = $value->value;
}
}

$this->methodCalls[$i][1] = $arguments;
}

return $this->methodCalls;
}






private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, array $arguments, bool $checkAttributes, int $methodIndex): array
{
$class = $reflectionMethod instanceof \ReflectionMethod ? $reflectionMethod->class : $this->currentId;
$method = $reflectionMethod->name;
$parameters = $reflectionMethod->getParameters();
if ($reflectionMethod->isVariadic()) {
array_pop($parameters);
}
$this->defaultArgument->names = new \ArrayObject();

foreach ($parameters as $index => $parameter) {
$this->defaultArgument->names[$index] = $parameter->name;

if (\array_key_exists($parameter->name, $arguments)) {
$arguments[$index] = $arguments[$parameter->name];
unset($arguments[$parameter->name]);
}
if (\array_key_exists($index, $arguments) && '' !== $arguments[$index]) {
continue;
}

$type = ProxyHelper::exportType($parameter, true);
$target = null;
$name = Target::parseName($parameter, $target);
$target = $target ? [$target] : [];

$getValue = function () use ($type, $parameter, $class, $method, $name, $target) {
if (!$value = $this->getAutowiredReference($ref = new TypedReference($type, $type, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $name, $target), false)) {
$failureMessage = $this->createTypeNotFoundMessageCallback($ref, \sprintf('argument "$%s" of method "%s()"', $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method));

if ($parameter->isDefaultValueAvailable()) {
$value = $this->defaultArgument->withValue($parameter);
} elseif (!$parameter->allowsNull()) {
throw new AutowiringFailedException($this->currentId, $failureMessage);
}
}

return $value;
};

if ($checkAttributes) {
foreach ($parameter->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
$attribute = $attribute->newInstance();
$invalidBehavior = $parameter->allowsNull() ? ContainerInterface::NULL_ON_INVALID_REFERENCE : ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE;

try {
$value = $this->processValue(new TypedReference($type ?: '?', $type ?: 'mixed', $invalidBehavior, $name, [$attribute, ...$target]));
} catch (ParameterNotFoundException $e) {
if (!$parameter->isDefaultValueAvailable()) {
throw new AutowiringFailedException($this->currentId, $e->getMessage(), 0, $e);
}
$arguments[$index] = clone $this->defaultArgument;
$arguments[$index]->value = $parameter->getDefaultValue();

continue 2;
}

if ($attribute instanceof AutowireCallable) {
$value = $attribute->buildDefinition($value, $type, $parameter);
} elseif ($lazy = $attribute->lazy) {
$definition = (new Definition($type))
->setFactory('current')
->setArguments([[$value ??= $getValue()]])
->setLazy(true);

if (!\is_array($lazy)) {
if (str_contains($type, '|')) {
throw new AutowiringFailedException($this->currentId, \sprintf('Cannot use #[Autowire] with option "lazy: true" on union types for service "%s"; set the option to the interface(s) that should be proxied instead.', $this->currentId));
}
$lazy = str_contains($type, '&') ? explode('&', $type) : [];
}

if ($lazy) {
if (!class_exists($type) && !interface_exists($type, false)) {
$definition->setClass('object');
}
foreach ($lazy as $v) {
$definition->addTag('proxy', ['interface' => $v]);
}
}

if ($definition->getClass() !== (string) $value || $definition->getTag('proxy')) {
$value .= '.'.$this->container->hash([$definition->getClass(), $definition->getTag('proxy')]);
}
$this->container->setDefinition($value = '.lazy.'.$value, $definition);
$value = new Reference($value);
}
$arguments[$index] = $value;

continue 2;
}

foreach ($parameter->getAttributes(AutowireDecorated::class) as $attribute) {
$arguments[$index] = $this->processValue($attribute->newInstance());

continue 2;
}

foreach ($parameter->getAttributes(MapDecorated::class) as $attribute) {
$arguments[$index] = $this->processValue($attribute->newInstance());

continue 2;
}
}

if (!$type) {
if (isset($arguments[$index])) {
continue;
}


if (!$parameter->isDefaultValueAvailable()) {



if ($parameter->isOptional()) {
--$index;
break;
}
$type = ProxyHelper::exportType($parameter);
$type = $type ? \sprintf('is type-hinted "%s"', preg_replace('/(^|[(|&])\\\\|^\?\\\\?/', '\1', $type)) : 'has no type-hint';

throw new AutowiringFailedException($this->currentId, \sprintf('Cannot autowire service "%s": argument "$%s" of method "%s()" %s, you should configure its value explicitly.', $this->currentId, $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method, $type));
}


$arguments[$index] = $this->defaultArgument->withValue($parameter);

continue;
}

if ($this->decoratedClass && is_a($this->decoratedClass, $type, true)) {
if ($this->getPreviousValue) {




$getPreviousValue = $this->getPreviousValue;
$this->methodCalls[$this->decoratedMethodIndex][1][$this->decoratedMethodArgumentIndex] = $getPreviousValue();
$this->decoratedClass = null; 
} else {
$arguments[$index] = new TypedReference($this->decoratedId, $this->decoratedClass);
$this->getPreviousValue = $getValue;
$this->decoratedMethodIndex = $methodIndex;
$this->decoratedMethodArgumentIndex = $index;

continue;
}
}

$arguments[$index] = $getValue();
}

if ($parameters && !isset($arguments[++$index])) {
while (0 <= --$index) {
if (!$arguments[$index] instanceof $this->defaultArgument) {
break;
}
unset($arguments[$index]);
}
}



ksort($arguments, \SORT_NATURAL);

return $arguments;
}




private function getAutowiredReference(TypedReference $reference, bool $filterType): ?TypedReference
{
$this->lastFailure = null;
$type = $reference->getType();

if ($type !== (string) $reference) {
return $reference;
}

if ($filterType && false !== $m = strpbrk($type, '&|')) {
$types = array_diff(explode($m[0], $type), ['int', 'string', 'array', 'bool', 'float', 'iterable', 'object', 'callable', 'null']);

sort($types);

$type = implode($m[0], $types);
}

$name = $target = (array_filter($reference->getAttributes(), static fn ($a) => $a instanceof Target)[0] ?? null)?->name;

if (null !== $name ??= $reference->getName()) {
if ($this->container->has($alias = $type.' $'.$name) && !$this->container->findDefinition($alias)->isAbstract()) {
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
}

if (null !== ($alias = $this->getCombinedAlias($type, $name)) && !$this->container->findDefinition($alias)->isAbstract()) {
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
}

$parsedName = (new Target($name))->getParsedName();

if ($this->container->has($alias = $type.' $'.$parsedName) && !$this->container->findDefinition($alias)->isAbstract()) {
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
}

if (null !== ($alias = $this->getCombinedAlias($type, $parsedName)) && !$this->container->findDefinition($alias)->isAbstract()) {
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
}

if (($this->container->has($n = $name) && !$this->container->findDefinition($n)->isAbstract())
|| ($this->container->has($n = $parsedName) && !$this->container->findDefinition($n)->isAbstract())
) {
foreach ($this->container->getAliases() as $id => $alias) {
if ($n === (string) $alias && str_starts_with($id, $type.' $')) {
return new TypedReference($n, $type, $reference->getInvalidBehavior());
}
}
}

if (null !== $target) {
return null;
}
}

if ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract()) {
return new TypedReference($type, $type, $reference->getInvalidBehavior());
}

if (null !== ($alias = $this->getCombinedAlias($type)) && !$this->container->findDefinition($alias)->isAbstract()) {
return new TypedReference($alias, $type, $reference->getInvalidBehavior());
}

return null;
}




private function populateAvailableTypes(ContainerBuilder $container): void
{
$this->types = [];
$this->ambiguousServiceTypes = [];
$this->autowiringAliases = [];

foreach ($container->getDefinitions() as $id => $definition) {
$this->populateAvailableType($container, $id, $definition);
}

$prev = null;
foreach ($container->getAliases() as $id => $alias) {
$this->populateAutowiringAlias($id, $prev);
$prev = $id;
}
}




private function populateAvailableType(ContainerBuilder $container, string $id, Definition $definition): void
{

if ($definition->isAbstract()) {
return;
}

if ('' === $id || '.' === $id[0] || $definition->isDeprecated() || !$reflectionClass = $container->getReflectionClass($definition->getClass(), false)) {
return;
}

foreach ($reflectionClass->getInterfaces() as $reflectionInterface) {
$this->set($reflectionInterface->name, $id);
}

do {
$this->set($reflectionClass->name, $id);
} while ($reflectionClass = $reflectionClass->getParentClass());

$this->populateAutowiringAlias($id);
}




private function set(string $type, string $id): void
{

if (isset($this->ambiguousServiceTypes[$type])) {
$this->ambiguousServiceTypes[$type][] = $id;

return;
}


if (!isset($this->types[$type]) || $this->types[$type] === $id) {
$this->types[$type] = $id;

return;
}


if (!isset($this->ambiguousServiceTypes[$type])) {
$this->ambiguousServiceTypes[$type] = [$this->types[$type]];
unset($this->types[$type]);
}
$this->ambiguousServiceTypes[$type][] = $id;
}

private function createTypeNotFoundMessageCallback(TypedReference $reference, string $label): \Closure
{
if (!isset($this->typesClone->container)) {
$this->typesClone->container = new ContainerBuilder($this->container->getParameterBag());
$this->typesClone->container->setAliases($this->container->getAliases());
$this->typesClone->container->setDefinitions($this->container->getDefinitions());
$this->typesClone->container->setResourceTracking(false);
}
$currentId = $this->currentId;

return (fn () => $this->createTypeNotFoundMessage($reference, $label, $currentId))->bindTo($this->typesClone);
}

private function createTypeNotFoundMessage(TypedReference $reference, string $label, string $currentId): string
{
$type = $reference->getType();

$i = null;
$namespace = $type;
do {
$namespace = substr($namespace, 0, $i);

if ($this->container->hasDefinition($namespace) && $tag = $this->container->getDefinition($namespace)->getTag('container.excluded')) {
return \sprintf('Cannot autowire service "%s": %s needs an instance of "%s" but this type has been excluded %s.', $currentId, $label, $type, $tag[0]['source'] ?? 'from autowiring');
}
} while (false !== $i = strrpos($namespace, '\\'));

if (!$r = $this->container->getReflectionClass($type, false)) {

try {
if (class_exists(ClassExistenceResource::class)) {
$resource = new ClassExistenceResource($type, false);

$resource->isFresh(0);
$parentMsg = false;
} else {
$parentMsg = "couldn't be loaded. Either it was not found or it is missing a parent class or a trait";
}
} catch (\ReflectionException $e) {
$parentMsg = \sprintf('is missing a parent class (%s)', $e->getMessage());
}

$message = \sprintf('has type "%s" but this class %s.', $type, $parentMsg ?: 'was not found');
} else {
$alternatives = $this->createTypeAlternatives($this->container, $reference);

if (null !== $target = (array_filter($reference->getAttributes(), static fn ($a) => $a instanceof Target)[0] ?? null)) {
$target = null !== $target->name ? "('{$target->name}')" : '';
$message = \sprintf('has "#[Target%s]" but no such target exists.%s', $target, $alternatives);
} else {
$message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists';
$message = \sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $alternatives);
}

if ($r->isInterface() && !$alternatives) {
$message .= ' Did you create a class that implements this interface?';
}
}

$message = \sprintf('Cannot autowire service "%s": %s %s', $currentId, $label, $message);

if (null !== $this->lastFailure) {
$message = $this->lastFailure."\n".$message;
$this->lastFailure = null;
}

return $message;
}

private function createTypeAlternatives(ContainerBuilder $container, TypedReference $reference): string
{

if ($message = $this->getAliasesSuggestionForType($container, $type = $reference->getType())) {
return ' '.$message;
}
if (!isset($this->ambiguousServiceTypes)) {
$this->populateAvailableTypes($container);
}

$servicesAndAliases = $container->getServiceIds();
$autowiringAliases = $this->autowiringAliases[$type] ?? [];
unset($autowiringAliases['']);

if ($autowiringAliases) {
return \sprintf(' Did you mean to target%s "%s" instead?', 1 < \count($autowiringAliases) ? ' one of' : '', implode('", "', $autowiringAliases));
}

if (!$container->has($type) && false !== $key = array_search(strtolower($type), array_map('strtolower', $servicesAndAliases))) {
return \sprintf(' Did you mean "%s"?', $servicesAndAliases[$key]);
} elseif (isset($this->ambiguousServiceTypes[$type])) {
$message = \sprintf('one of these existing services: "%s"', implode('", "', $this->ambiguousServiceTypes[$type]));
} elseif (isset($this->types[$type])) {
$message = \sprintf('the existing "%s" service', $this->types[$type]);
} else {
return '';
}

return \sprintf(' You should maybe alias this %s to %s.', class_exists($type, false) ? 'class' : 'interface', $message);
}

private function getAliasesSuggestionForType(ContainerBuilder $container, string $type): ?string
{
$aliases = [];
foreach (class_parents($type) + class_implements($type) as $parent) {
if ($container->has($parent) && !$container->findDefinition($parent)->isAbstract()) {
$aliases[] = $parent;
}
}

if (1 < $len = \count($aliases)) {
$message = 'Try changing the type-hint to one of its parents: ';
for ($i = 0, --$len; $i < $len; ++$i) {
$message .= \sprintf('%s "%s", ', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]);
}
$message .= \sprintf('or %s "%s".', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]);

return $message;
}

if ($aliases) {
return \sprintf('Try changing the type-hint to "%s" instead.', $aliases[0]);
}

return null;
}

private function populateAutowiringAlias(string $id, ?string $target = null): void
{
if (!preg_match('/(?(DEFINE)(?<V>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))^((?&V)(?:\\\\(?&V))*+)(?: \$((?&V)))?$/', $id, $m)) {
return;
}

$type = $m[2];
$name = $m[3] ?? '';

if (class_exists($type, false) || interface_exists($type, false)) {
if (null !== $target && str_starts_with($target, '.'.$type.' $')
&& (new Target($target = substr($target, \strlen($type) + 3)))->getParsedName() === $name
) {
$name = $target;
}

$this->autowiringAliases[$type][$name] = $name;
}
}

private function getCombinedAlias(string $type, ?string $name = null): ?string
{
if (str_contains($type, '&')) {
$types = explode('&', $type);
} elseif (str_contains($type, '|')) {
$types = explode('|', $type);
} else {
return null;
}

$alias = null;
$suffix = $name ? ' $'.$name : '';

foreach ($types as $type) {
if (!$this->container->hasAlias($type.$suffix)) {
return null;
}

if (null === $alias) {
$alias = (string) $this->container->getAlias($type.$suffix);
} elseif ((string) $this->container->getAlias($type.$suffix) !== $alias) {
return null;
}
}

return $alias;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\Attribute\Target;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\VarExporter\ProxyHelper;




class ResolveBindingsPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

private array $usedBindings = [];
private array $unusedBindings = [];
private array $errorMessages = [];




public function process(ContainerBuilder $container)
{
$this->usedBindings = $container->getRemovedBindingIds();

try {
parent::process($container);

foreach ($this->unusedBindings as [$key, $serviceId, $bindingType, $file]) {
$argumentType = $argumentName = $message = null;

if (str_contains($key, ' ')) {
[$argumentType, $argumentName] = explode(' ', $key, 2);
} elseif ('$' === $key[0]) {
$argumentName = $key;
} else {
$argumentType = $key;
}

if ($argumentType) {
$message .= \sprintf('of type "%s" ', $argumentType);
}

if ($argumentName) {
$message .= \sprintf('named "%s" ', $argumentName);
}

if (BoundArgument::DEFAULTS_BINDING === $bindingType) {
$message .= 'under "_defaults"';
} elseif (BoundArgument::INSTANCEOF_BINDING === $bindingType) {
$message .= 'under "_instanceof"';
} else {
$message .= \sprintf('for service "%s"', $serviceId);
}

if ($file) {
$message .= \sprintf(' in file "%s"', $file);
}

$message = \sprintf('A binding is configured for an argument %s, but no corresponding argument has been found. It may be unused and should be removed, or it may have a typo.', $message);

if ($this->errorMessages) {
$message .= \sprintf("\nCould be related to%s:", 1 < \count($this->errorMessages) ? ' one of' : '');
}
foreach ($this->errorMessages as $m) {
$message .= "\n - ".$m;
}
throw new InvalidArgumentException($message);
}
} finally {
$this->usedBindings = [];
$this->unusedBindings = [];
$this->errorMessages = [];
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof TypedReference && $value->getType() === (string) $value) {

$bindings = $this->container->getDefinition($this->currentId)->getBindings();
$name = $value->getName();

if (isset($name, $bindings[$name = $value.' $'.$name])) {
return $this->getBindingValue($bindings[$name]);
}

if (isset($bindings[$value->getType()])) {
return $this->getBindingValue($bindings[$value->getType()]);
}

return parent::processValue($value, $isRoot);
}

if (!$value instanceof Definition || !$bindings = $value->getBindings()) {
return parent::processValue($value, $isRoot);
}

$bindingNames = [];

foreach ($bindings as $key => $binding) {
[$bindingValue, $bindingId, $used, $bindingType, $file] = $binding->getValues();
if ($used) {
$this->usedBindings[$bindingId ?? ''] = true;
unset($this->unusedBindings[$bindingId ?? '']);
} elseif (!isset($this->usedBindings[$bindingId ?? ''])) {
$this->unusedBindings[$bindingId ?? ''] = [$key, $this->currentId, $bindingType, $file];
}

if (preg_match('/^(?:(?:array|bool|float|int|string|iterable|([^ $]++)) )\$/', $key, $m)) {
$bindingNames[substr($key, \strlen($m[0]))] = $binding;
}

if (!isset($m[1])) {
continue;
}

if (is_subclass_of($m[1], \UnitEnum::class)) {
$bindingNames[substr($key, \strlen($m[0]))] = $binding;
continue;
}

if (null !== $bindingValue && !$bindingValue instanceof Reference && !$bindingValue instanceof Definition && !$bindingValue instanceof TaggedIteratorArgument && !$bindingValue instanceof ServiceLocatorArgument) {
throw new InvalidArgumentException(\sprintf('Invalid value for binding key "%s" for service "%s": expected "%s", "%s", "%s", "%s" or null, "%s" given.', $key, $this->currentId, Reference::class, Definition::class, TaggedIteratorArgument::class, ServiceLocatorArgument::class, get_debug_type($bindingValue)));
}
}

if ($value->isAbstract()) {
return parent::processValue($value, $isRoot);
}

$calls = $value->getMethodCalls();

try {
if ($constructor = $this->getConstructor($value, false)) {
$calls[] = [$constructor, $value->getArguments()];
}
} catch (RuntimeException $e) {
$this->errorMessages[] = $e->getMessage();
$this->container->getDefinition($this->currentId)->addError($e->getMessage());

return parent::processValue($value, $isRoot);
}

foreach ($calls as $i => $call) {
[$method, $arguments] = $call;

if ($method instanceof \ReflectionFunctionAbstract) {
$reflectionMethod = $method;
} else {
try {
$reflectionMethod = $this->getReflectionMethod($value, $method);
} catch (RuntimeException $e) {
if ($value->getFactory()) {
continue;
}
throw $e;
}
}

$names = [];

foreach ($reflectionMethod->getParameters() as $key => $parameter) {
$names[$key] = $parameter->name;

if (\array_key_exists($key, $arguments) && '' !== $arguments[$key] && !$arguments[$key] instanceof AbstractArgument) {
continue;
}
if (\array_key_exists($parameter->name, $arguments) && '' !== $arguments[$parameter->name] && !$arguments[$parameter->name] instanceof AbstractArgument) {
continue;
}
if (
$value->isAutowired()
&& !$value->hasTag('container.ignore_attributes')
&& $parameter->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF)
) {
continue;
}

$typeHint = ltrim(ProxyHelper::exportType($parameter) ?? '', '?');

$name = Target::parseName($parameter, parsedName: $parsedName);

if ($typeHint && (
\array_key_exists($k = preg_replace('/(^|[(|&])\\\\/', '\1', $typeHint).' $'.$name, $bindings)
|| \array_key_exists($k = preg_replace('/(^|[(|&])\\\\/', '\1', $typeHint).' $'.$parsedName, $bindings)
)) {
$arguments[$key] = $this->getBindingValue($bindings[$k]);

continue;
}

if (\array_key_exists($k = '$'.$name, $bindings) || \array_key_exists($k = '$'.$parsedName, $bindings)) {
$arguments[$key] = $this->getBindingValue($bindings[$k]);

continue;
}

if ($typeHint && '\\' === $typeHint[0] && isset($bindings[$typeHint = substr($typeHint, 1)])) {
$arguments[$key] = $this->getBindingValue($bindings[$typeHint]);

continue;
}

if (isset($bindingNames[$name]) || isset($bindingNames[$parsedName]) || isset($bindingNames[$parameter->name])) {
$bindingKey = array_search($binding, $bindings, true);
$argumentType = substr($bindingKey, 0, strpos($bindingKey, ' '));
$this->errorMessages[] = \sprintf('Did you forget to add the type "%s" to argument "$%s" of method "%s::%s()"?', $argumentType, $parameter->name, $reflectionMethod->class, $reflectionMethod->name);
}
}

foreach ($names as $key => $name) {
if (\array_key_exists($name, $arguments) && (0 === $key || \array_key_exists($key - 1, $arguments))) {
if (!\array_key_exists($key, $arguments)) {
$arguments[$key] = $arguments[$name];
}
unset($arguments[$name]);
}
}

if ($arguments !== $call[1]) {
ksort($arguments, \SORT_NATURAL);
$calls[$i][1] = $arguments;
}
}

if ($constructor) {
[, $arguments] = array_pop($calls);

if ($arguments !== $value->getArguments()) {
$value->setArguments($arguments);
}
}

if ($calls !== $value->getMethodCalls()) {
$value->setMethodCalls($calls);
}

return parent::processValue($value, $isRoot);
}

private function getBindingValue(BoundArgument $binding): mixed
{
[$bindingValue, $bindingId] = $binding->getValues();

$this->usedBindings[$bindingId ?? ''] = true;
unset($this->unusedBindings[$bindingId ?? '']);

return $bindingValue;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\EnvVarProcessor;
use Symfony\Component\DependencyInjection\EnvVarProcessorInterface;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\Reference;






class RegisterEnvVarProcessorsPass implements CompilerPassInterface
{
private const ALLOWED_TYPES = ['array', 'bool', 'float', 'int', 'string', \BackedEnum::class];




public function process(ContainerBuilder $container)
{
$bag = $container->getParameterBag();
$types = [];
$processors = [];
foreach ($container->findTaggedServiceIds('container.env_var_processor') as $id => $tags) {
if (!$r = $container->getReflectionClass($class = $container->getDefinition($id)->getClass())) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
} elseif (!$r->isSubclassOf(EnvVarProcessorInterface::class)) {
throw new InvalidArgumentException(\sprintf('Service "%s" must implement interface "%s".', $id, EnvVarProcessorInterface::class));
}
foreach ($class::getProvidedTypes() as $prefix => $type) {
$processors[$prefix] = new Reference($id);
$types[$prefix] = self::validateProvidedTypes($type, $class);
}
}

if ($bag instanceof EnvPlaceholderParameterBag) {
foreach (EnvVarProcessor::getProvidedTypes() as $prefix => $type) {
if (!isset($types[$prefix])) {
$types[$prefix] = self::validateProvidedTypes($type, EnvVarProcessor::class);
}
}
$bag->setProvidedTypes($types);
}

if ($processors) {
$container->setAlias('container.env_var_processors_locator', (string) ServiceLocatorTagPass::register($container, $processors))
->setPublic(true)
;
}
}

private static function validateProvidedTypes(string $types, string $class): array
{
$types = explode('|', $types);

foreach ($types as $type) {
if (!\in_array($type, self::ALLOWED_TYPES)) {
throw new InvalidArgumentException(\sprintf('Invalid type "%s" returned by "%s::getProvidedTypes()", expected one of "%s".', $type, $class, implode('", "', self::ALLOWED_TYPES)));
}
}

return $types;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Attribute\AsDecorator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;





final class AutowireAsDecoratorPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container): void
{
foreach ($container->getDefinitions() as $definition) {
if ($this->accept($definition) && $reflectionClass = $container->getReflectionClass($definition->getClass(), false)) {
$this->processClass($definition, $reflectionClass);
}
}
}

private function accept(Definition $definition): bool
{
return !$definition->hasTag('container.ignore_attributes') && $definition->isAutowired();
}

private function processClass(Definition $definition, \ReflectionClass $reflectionClass): void
{
foreach ($reflectionClass->getAttributes(AsDecorator::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
$attribute = $attribute->newInstance();

$definition->setDecoratedService($attribute->decorates, null, $attribute->priority, $attribute->onInvalid);
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\TypedReference;







class ResolveInvalidReferencesPass implements CompilerPassInterface
{
private ContainerBuilder $container;
private RuntimeException $signalingException;
private string $currentId;






public function process(ContainerBuilder $container)
{
$this->container = $container;
$this->signalingException = new RuntimeException('Invalid reference.');

try {
foreach ($container->getDefinitions() as $this->currentId => $definition) {
$this->processValue($definition);
}
} finally {
unset($this->container, $this->signalingException);
}
}






private function processValue(mixed $value, int $rootLevel = 0, int $level = 0): mixed
{
if ($value instanceof ServiceClosureArgument) {
$value->setValues($this->processValue($value->getValues(), 1, 1));
} elseif ($value instanceof ArgumentInterface) {
$value->setValues($this->processValue($value->getValues(), $rootLevel, 1 + $level));
} elseif ($value instanceof Definition) {
if ($value->isSynthetic() || $value->isAbstract()) {
return $value;
}
$value->setArguments($this->processValue($value->getArguments(), 0));
$value->setProperties($this->processValue($value->getProperties(), 1));
$value->setMethodCalls($this->processValue($value->getMethodCalls(), 2));
} elseif (\is_array($value)) {
$i = 0;

foreach ($value as $k => $v) {
try {
if (false !== $i && $k !== $i++) {
$i = false;
}
if ($v !== $processedValue = $this->processValue($v, $rootLevel, 1 + $level)) {
$value[$k] = $processedValue;
}
} catch (RuntimeException $e) {
if ($rootLevel < $level || ($rootLevel && !$level)) {
unset($value[$k]);
} elseif ($rootLevel) {
throw $e;
} else {
$value[$k] = null;
}
}
}


if (false !== $i) {
$value = array_values($value);
}
} elseif ($value instanceof Reference) {
if ($this->container->hasDefinition($id = (string) $value) ? !$this->container->getDefinition($id)->hasTag('container.excluded') : $this->container->hasAlias($id)) {
return $value;
}

$currentDefinition = $this->container->getDefinition($this->currentId);


if ($currentDefinition->innerServiceId === $id && ContainerInterface::NULL_ON_INVALID_REFERENCE === $currentDefinition->decorationOnInvalid) {
return null;
}

$invalidBehavior = $value->getInvalidBehavior();

if (ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior && $value instanceof TypedReference && !$this->container->has($id)) {
$e = new ServiceNotFoundException($id, $this->currentId);


$this->container->register($id = \sprintf('.errored.%s.%s', $this->currentId, $id), $value->getType())
->addError($e->getMessage());

return new TypedReference($id, $value->getType(), $value->getInvalidBehavior());
}


if (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
$value = null;
} elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
if (0 < $level || $rootLevel) {
throw $this->signalingException;
}
$value = null;
}
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;






class ResolveNoPreloadPass extends AbstractRecursivePass
{
private const DO_PRELOAD_TAG = '.container.do_preload';

protected bool $skipScalars = true;

private array $resolvedIds = [];




public function process(ContainerBuilder $container)
{
$this->container = $container;

try {
foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isPublic() && !$definition->isPrivate() && !isset($this->resolvedIds[$id])) {
$this->resolvedIds[$id] = true;
$this->processValue($definition, true);
}
}

foreach ($container->getAliases() as $alias) {
if ($alias->isPublic() && !$alias->isPrivate() && !isset($this->resolvedIds[$id = (string) $alias]) && $container->hasDefinition($id)) {
$this->resolvedIds[$id] = true;
$this->processValue($container->getDefinition($id), true);
}
}
} finally {
$this->resolvedIds = [];
$this->container = null;
}

foreach ($container->getDefinitions() as $definition) {
if ($definition->hasTag(self::DO_PRELOAD_TAG)) {
$definition->clearTag(self::DO_PRELOAD_TAG);
} elseif (!$definition->isDeprecated() && !$definition->hasErrors()) {
$definition->addTag('container.no_preload');
}
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->hasDefinition($id = (string) $value)) {
$definition = $this->container->getDefinition($id);

if (!isset($this->resolvedIds[$id]) && (!$definition->isPublic() || $definition->isPrivate())) {
$this->resolvedIds[$id] = true;
$this->processValue($definition, true);
}

return $value;
}

if (!$value instanceof Definition) {
return parent::processValue($value, $isRoot);
}

if ($value->hasTag('container.no_preload') || $value->isDeprecated() || $value->hasErrors()) {
return $value;
}

if ($isRoot) {
$value->addTag(self::DO_PRELOAD_TAG);
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Reference;






class ResolveReferencesToAliasesPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;




public function process(ContainerBuilder $container)
{
parent::process($container);

foreach ($container->getAliases() as $id => $alias) {
$aliasId = (string) $alias;
$this->currentId = $id;

if ($aliasId !== $defId = $this->getDefinitionId($aliasId, $container)) {
$container->setAlias($id, $defId)->setPublic($alias->isPublic());
}
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (!$value instanceof Reference) {
return parent::processValue($value, $isRoot);
}

$defId = $this->getDefinitionId($id = (string) $value, $this->container);

return $defId !== $id ? new Reference($defId, $value->getInvalidBehavior()) : $value;
}

private function getDefinitionId(string $id, ContainerBuilder $container): string
{
if (!$container->hasAlias($id)) {
return $id;
}

$alias = $container->getAlias($id);

if ($alias->isDeprecated()) {
$referencingDefinition = $container->hasDefinition($this->currentId) ? $container->getDefinition($this->currentId) : $container->getAlias($this->currentId);
if (!$referencingDefinition->isDeprecated()) {
$deprecation = $alias->getDeprecation($id);
trigger_deprecation($deprecation['package'], $deprecation['version'], rtrim($deprecation['message'], '. ').'. It is being referenced by the "%s" '.($container->hasDefinition($this->currentId) ? 'service.' : 'alias.'), $this->currentId);
}
}

$seen = [];
do {
if (isset($seen[$id])) {
throw new ServiceCircularReferenceException($id, array_merge(array_keys($seen), [$id]));
}

$seen[$id] = true;
$id = (string) $container->getAlias($id);
} while ($container->hasAlias($id));

return $id;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;







final class RegisterAutoconfigureAttributesPass implements CompilerPassInterface
{
private static \Closure $registerForAutoconfiguration;

public function process(ContainerBuilder $container): void
{
foreach ($container->getDefinitions() as $id => $definition) {
if ($this->accept($definition) && $class = $container->getReflectionClass($definition->getClass(), false)) {
$this->processClass($container, $class);
}
}
}

public function accept(Definition $definition): bool
{
return $definition->isAutoconfigured() && !$definition->hasTag('container.ignore_attributes');
}

public function processClass(ContainerBuilder $container, \ReflectionClass $class): void
{
foreach ($class->getAttributes(Autoconfigure::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
self::registerForAutoconfiguration($container, $class, $attribute);
}
}

private static function registerForAutoconfiguration(ContainerBuilder $container, \ReflectionClass $class, \ReflectionAttribute $attribute): void
{
if (isset(self::$registerForAutoconfiguration)) {
(self::$registerForAutoconfiguration)($container, $class, $attribute);

return;
}

$parseDefinitions = new \ReflectionMethod(YamlFileLoader::class, 'parseDefinitions');
$yamlLoader = $parseDefinitions->getDeclaringClass()->newInstanceWithoutConstructor();

self::$registerForAutoconfiguration = static function (ContainerBuilder $container, \ReflectionClass $class, \ReflectionAttribute $attribute) use ($parseDefinitions, $yamlLoader) {
$attribute = (array) $attribute->newInstance();

foreach ($attribute['tags'] ?? [] as $i => $tag) {
if (\is_array($tag) && [0] === array_keys($tag)) {
$attribute['tags'][$i] = [$class->name => $tag[0]];
}
}

$parseDefinitions->invoke(
$yamlLoader,
[
'services' => [
'_instanceof' => [
$class->name => [$container->registerForAutoconfiguration($class->name)] + $attribute,
],
],
],
$class->getFileName(),
false
);
};

(self::$registerForAutoconfiguration)($container, $class, $attribute);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Reference;








class DecoratorServicePass extends AbstractRecursivePass
{
protected bool $skipScalars = true;




public function process(ContainerBuilder $container)
{
$definitions = new \SplPriorityQueue();
$order = \PHP_INT_MAX;

foreach ($container->getDefinitions() as $id => $definition) {
if (!$decorated = $definition->getDecoratedService()) {
continue;
}
$definitions->insert([$id, $definition], [$decorated[2], --$order]);
}
$decoratingDefinitions = [];
$decoratedIds = [];

$tagsToKeep = $container->hasParameter('container.behavior_describing_tags')
? $container->getParameter('container.behavior_describing_tags')
: ['proxy', 'container.do_not_inline', 'container.service_locator', 'container.service_subscriber', 'container.service_subscriber.locator'];

foreach ($definitions as [$id, $definition]) {
$decoratedService = $definition->getDecoratedService();
[$inner, $renamedId] = $decoratedService;
$invalidBehavior = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;

$definition->setDecoratedService(null);

if (!$renamedId) {
$renamedId = $id.'.inner';
}

$decoratedIds[$inner] ??= $renamedId;
$this->currentId = $renamedId;
$this->processValue($definition);

$definition->innerServiceId = $renamedId;
$definition->decorationOnInvalid = $invalidBehavior;



if ($container->hasAlias($inner)) {
$alias = $container->getAlias($inner);
$public = $alias->isPublic();
$container->setAlias($renamedId, new Alias((string) $alias, false));
$decoratedDefinition = $container->findDefinition($alias);
} elseif ($container->hasDefinition($inner)) {
$decoratedDefinition = $container->getDefinition($inner);
$public = $decoratedDefinition->isPublic();
$decoratedDefinition->setPublic(false);
$container->setDefinition($renamedId, $decoratedDefinition);
$decoratingDefinitions[$inner] = $decoratedDefinition;
} elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
$container->removeDefinition($id);
continue;
} elseif (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
$public = $definition->isPublic();
$decoratedDefinition = null;
} else {
throw new ServiceNotFoundException($inner, $id);
}

if ($decoratedDefinition?->isSynthetic()) {
throw new InvalidArgumentException(\sprintf('A synthetic service cannot be decorated: service "%s" cannot decorate "%s".', $id, $inner));
}

if (isset($decoratingDefinitions[$inner])) {
$decoratingDefinition = $decoratingDefinitions[$inner];

$decoratingTags = $decoratingDefinition->getTags();
$resetTags = [];


foreach ($tagsToKeep as $containerTag) {
if (isset($decoratingTags[$containerTag])) {
$resetTags[$containerTag] = $decoratingTags[$containerTag];
unset($decoratingTags[$containerTag]);
}
}

$definition->setTags(array_merge($decoratingTags, $definition->getTags()));
$decoratingDefinition->setTags($resetTags);
$decoratingDefinitions[$inner] = $definition;
}

$container->setAlias($inner, $id)->setPublic($public);
}

foreach ($decoratingDefinitions as $inner => $definition) {
$definition->addTag('container.decorator', ['id' => $inner, 'inner' => $decoratedIds[$inner]]);
}
}

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($value instanceof Reference && '.inner' === (string) $value) {
return new Reference($this->currentId, $value->getInvalidBehavior());
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Contracts\Service\Attribute\Required;







class AutowireRequiredPropertiesPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
$value = parent::processValue($value, $isRoot);

if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
return $value;
}
if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) {
return $value;
}

$properties = $value->getProperties();
foreach ($reflectionClass->getProperties() as $reflectionProperty) {
if (!($type = $reflectionProperty->getType()) instanceof \ReflectionNamedType) {
continue;
}
$doc = false;
if (!$reflectionProperty->getAttributes(Required::class)
&& ((false === $doc = $reflectionProperty->getDocComment()) || false === stripos($doc, '@required') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc))
) {
continue;
}
if ($doc) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Using the "@required" annotation on property "%s::$%s" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.', $reflectionProperty->class, $reflectionProperty->name);
}
if (\array_key_exists($name = $reflectionProperty->getName(), $properties)) {
continue;
}

$type = $type->getName();
$value->setProperty($name, new TypedReference($type, $type, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name));
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;






class ResolveInstanceofConditionalsPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
foreach ($container->getAutoconfiguredInstanceof() as $interface => $definition) {
if ($definition->getArguments()) {
throw new InvalidArgumentException(\sprintf('Autoconfigured instanceof for type "%s" defines arguments but these are not supported and should be removed.', $interface));
}
}

$tagsToKeep = [];

if ($container->hasParameter('container.behavior_describing_tags')) {
$tagsToKeep = $container->getParameter('container.behavior_describing_tags');
}

foreach ($container->getDefinitions() as $id => $definition) {
$container->setDefinition($id, $this->processDefinition($container, $id, $definition, $tagsToKeep));
}

if ($container->hasParameter('container.behavior_describing_tags')) {
$container->getParameterBag()->remove('container.behavior_describing_tags');
}
}

private function processDefinition(ContainerBuilder $container, string $id, Definition $definition, array $tagsToKeep): Definition
{
$instanceofConditionals = $definition->getInstanceofConditionals();
$autoconfiguredInstanceof = $definition->isAutoconfigured() ? $container->getAutoconfiguredInstanceof() : [];
if (!$instanceofConditionals && !$autoconfiguredInstanceof) {
return $definition;
}

if (!$class = $container->getParameterBag()->resolveValue($definition->getClass())) {
return $definition;
}

$conditionals = $this->mergeConditionals($autoconfiguredInstanceof, $instanceofConditionals, $container);

$definition->setInstanceofConditionals([]);
$shared = null;
$instanceofTags = [];
$instanceofCalls = [];
$instanceofBindings = [];
$reflectionClass = null;
$parent = $definition instanceof ChildDefinition ? $definition->getParent() : null;

foreach ($conditionals as $interface => $instanceofDefs) {
if ($interface !== $class && !($reflectionClass ??= $container->getReflectionClass($class, false) ?: false)) {
continue;
}

if ($interface !== $class && !is_subclass_of($class, $interface)) {
continue;
}

foreach ($instanceofDefs as $key => $instanceofDef) {

$instanceofDef = clone $instanceofDef;
$instanceofDef->setAbstract(true)->setParent($parent ?: '.abstract.instanceof.'.$id);
$parent = '.instanceof.'.$interface.'.'.$key.'.'.$id;
$container->setDefinition($parent, $instanceofDef);
$instanceofTags[] = [$interface, $instanceofDef->getTags()];
$instanceofBindings = $instanceofDef->getBindings() + $instanceofBindings;

foreach ($instanceofDef->getMethodCalls() as $methodCall) {
$instanceofCalls[] = $methodCall;
}

$instanceofDef->setTags([]);
$instanceofDef->setMethodCalls([]);
$instanceofDef->setBindings([]);

if (isset($instanceofDef->getChanges()['shared'])) {
$shared = $instanceofDef->isShared();
}
}
}

if ($parent) {
$bindings = $definition->getBindings();
$abstract = $container->setDefinition('.abstract.instanceof.'.$id, $definition);
$definition->setBindings([]);
$definition = serialize($definition);

if (Definition::class === $abstract::class) {

$definition = substr_replace($definition, '53', 2, 2);
$definition = substr_replace($definition, 'Child', 44, 0);
}

$definition = unserialize($definition);
$definition->setParent($parent);

if (null !== $shared && !isset($definition->getChanges()['shared'])) {
$definition->setShared($shared);
}


$i = \count($instanceofTags);
while (0 <= --$i) {
[$interface, $tags] = $instanceofTags[$i];
foreach ($tags as $k => $v) {
if (null === $definition->getDecoratedService() || $interface === $definition->getClass() || \in_array($k, $tagsToKeep, true)) {
foreach ($v as $v) {
if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) {
continue;
}
$definition->addTag($k, $v);
}
}
}
}

$definition->setMethodCalls(array_merge($instanceofCalls, $definition->getMethodCalls()));
$definition->setBindings($bindings + $instanceofBindings);


$abstract
->setBindings([])
->setArguments([])
->setMethodCalls([])
->setDecoratedService(null)
->setTags([])
->setAbstract(true);
}

return $definition;
}

private function mergeConditionals(array $autoconfiguredInstanceof, array $instanceofConditionals, ContainerBuilder $container): array
{

$conditionals = array_map(fn ($childDef) => [$childDef], $autoconfiguredInstanceof);

foreach ($instanceofConditionals as $interface => $instanceofDef) {

if (!$container->getReflectionClass($interface)) {
throw new RuntimeException(\sprintf('"%s" is set as an "instanceof" conditional, but it does not exist.', $interface));
}

if (!isset($autoconfiguredInstanceof[$interface])) {
$conditionals[$interface] = [];
}

$conditionals[$interface][] = $instanceofDef;
}

return $conditionals;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;








class ServiceReferenceGraphEdge
{
private ServiceReferenceGraphNode $sourceNode;
private ServiceReferenceGraphNode $destNode;
private mixed $value;
private bool $lazy;
private bool $weak;
private bool $byConstructor;

public function __construct(ServiceReferenceGraphNode $sourceNode, ServiceReferenceGraphNode $destNode, mixed $value = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false)
{
$this->sourceNode = $sourceNode;
$this->destNode = $destNode;
$this->value = $value;
$this->lazy = $lazy;
$this->weak = $weak;
$this->byConstructor = $byConstructor;
}




public function getValue(): mixed
{
return $this->value;
}




public function getSourceNode(): ServiceReferenceGraphNode
{
return $this->sourceNode;
}




public function getDestNode(): ServiceReferenceGraphNode
{
return $this->destNode;
}




public function isLazy(): bool
{
return $this->lazy;
}




public function isWeak(): bool
{
return $this->weak;
}




public function isReferencedByConstructor(): bool
{
return $this->byConstructor;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\EnvParameterException;






class Compiler
{
private PassConfig $passConfig;
private array $log = [];
private ServiceReferenceGraph $serviceReferenceGraph;

public function __construct()
{
$this->passConfig = new PassConfig();
$this->serviceReferenceGraph = new ServiceReferenceGraph();
}

public function getPassConfig(): PassConfig
{
return $this->passConfig;
}

public function getServiceReferenceGraph(): ServiceReferenceGraph
{
return $this->serviceReferenceGraph;
}




public function addPass(CompilerPassInterface $pass, string $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
{
$this->passConfig->addPass($pass, $type, $priority);
}






public function log(CompilerPassInterface $pass, string $message)
{
if (str_contains($message, "\n")) {
$message = str_replace("\n", "\n".$pass::class.': ', trim($message));
}

$this->log[] = $pass::class.': '.$message;
}

public function getLog(): array
{
return $this->log;
}






public function compile(ContainerBuilder $container)
{
try {
foreach ($this->passConfig->getPasses() as $pass) {
$pass->process($container);
}
} catch (\Exception $e) {
$usedEnvs = [];
$prev = $e;

do {
$msg = $prev->getMessage();

if ($msg !== $resolvedMsg = $container->resolveEnvPlaceholders($msg, null, $usedEnvs)) {
$r = new \ReflectionProperty($prev, 'message');
$r->setValue($prev, $resolvedMsg);
}
} while ($prev = $prev->getPrevious());

if ($usedEnvs) {
$e = new EnvParameterException($usedEnvs, $e);
}

throw $e;
} finally {
$this->getServiceReferenceGraph()->clear();
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;









class CheckReferenceValidityPass extends AbstractRecursivePass
{
protected bool $skipScalars = true;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if ($isRoot && $value instanceof Definition && ($value->isSynthetic() || $value->isAbstract())) {
return $value;
}
if ($value instanceof Reference && $this->container->hasDefinition((string) $value)) {
$targetDefinition = $this->container->getDefinition((string) $value);

if ($targetDefinition->isAbstract()) {
throw new RuntimeException(\sprintf('The definition "%s" has a reference to an abstract definition "%s". Abstract definitions cannot be the target of references.', $this->currentId, $value));
}
}

return parent::processValue($value, $isRoot);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;




class ResolveEnvPlaceholdersPass extends AbstractRecursivePass
{
protected bool $skipScalars = false;

protected function processValue(mixed $value, bool $isRoot = false): mixed
{
if (\is_string($value)) {
return $this->container->resolveEnvPlaceholders($value, true);
}
if ($value instanceof Definition) {
$changes = $value->getChanges();
if (isset($changes['class'])) {
$value->setClass($this->container->resolveEnvPlaceholders($value->getClass(), true));
}
if (isset($changes['file'])) {
$value->setFile($this->container->resolveEnvPlaceholders($value->getFile(), true));
}
}

$value = parent::processValue($value, $isRoot);

if ($value && \is_array($value) && !$isRoot) {
$value = array_combine($this->container->resolveEnvPlaceholders(array_keys($value), true), $value);
}

return $value;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Argument\ServiceLocator as ArgumentServiceLocator;
use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Contracts\Service\ResetInterface;


class_exists(RewindableGenerator::class);
class_exists(ArgumentServiceLocator::class);



















class Container implements ContainerInterface, ResetInterface
{
protected $parameterBag;
protected $services = [];
protected $privates = [];
protected $fileMap = [];
protected $methodMap = [];
protected $factories = [];
protected $aliases = [];
protected $loading = [];
protected $resolving = [];
protected $syntheticIds = [];

private array $envCache = [];
private bool $compiled = false;
private \Closure $getEnv;

private static \Closure $make;

public function __construct(?ParameterBagInterface $parameterBag = null)
{
$this->parameterBag = $parameterBag ?? new EnvPlaceholderParameterBag();
}











public function compile()
{
$this->parameterBag->resolve();

$this->parameterBag = new FrozenParameterBag(
$this->parameterBag->all(),
$this->parameterBag instanceof ParameterBag ? $this->parameterBag->allDeprecated() : []
);

$this->compiled = true;
}




public function isCompiled(): bool
{
return $this->compiled;
}




public function getParameterBag(): ParameterBagInterface
{
return $this->parameterBag;
}








public function getParameter(string $name)
{
return $this->parameterBag->get($name);
}

public function hasParameter(string $name): bool
{
return $this->parameterBag->has($name);
}




public function setParameter(string $name, array|bool|string|int|float|\UnitEnum|null $value)
{
$this->parameterBag->set($name, $value);
}









public function set(string $id, ?object $service)
{

if (isset($this->privates['service_container']) && $this->privates['service_container'] instanceof \Closure) {
$initialize = $this->privates['service_container'];
unset($this->privates['service_container']);
$initialize($this);
}

if ('service_container' === $id) {
throw new InvalidArgumentException('You cannot set service "service_container".');
}

if (!(isset($this->fileMap[$id]) || isset($this->methodMap[$id]))) {
if (isset($this->syntheticIds[$id]) || !isset($this->getRemovedIds()[$id])) {

} elseif (null === $service) {
throw new InvalidArgumentException(\sprintf('The "%s" service is private, you cannot unset it.', $id));
} else {
throw new InvalidArgumentException(\sprintf('The "%s" service is private, you cannot replace it.', $id));
}
} elseif (isset($this->services[$id])) {
throw new InvalidArgumentException(\sprintf('The "%s" service is already initialized, you cannot replace it.', $id));
}

if (isset($this->aliases[$id])) {
unset($this->aliases[$id]);
}

if (null === $service) {
unset($this->services[$id]);

return;
}

$this->services[$id] = $service;
}

public function has(string $id): bool
{
if (isset($this->aliases[$id])) {
$id = $this->aliases[$id];
}
if (isset($this->services[$id])) {
return true;
}
if ('service_container' === $id) {
return true;
}

return isset($this->fileMap[$id]) || isset($this->methodMap[$id]);
}









public function get(string $id, int $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE): ?object
{
return $this->services[$id]
?? $this->services[$id = $this->aliases[$id] ?? $id]
?? ('service_container' === $id ? $this : ($this->factories[$id] ?? self::$make ??= self::make(...))($this, $id, $invalidBehavior));
}






private static function make(self $container, string $id, int $invalidBehavior): ?object
{
if (isset($container->loading[$id])) {
throw new ServiceCircularReferenceException($id, array_merge(array_keys($container->loading), [$id]));
}

$container->loading[$id] = true;

try {
if (isset($container->fileMap[$id])) {
return  4 === $invalidBehavior ? null : $container->load($container->fileMap[$id]);
} elseif (isset($container->methodMap[$id])) {
return  4 === $invalidBehavior ? null : $container->{$container->methodMap[$id]}($container);
}
} catch (\Exception $e) {
unset($container->services[$id]);

throw $e;
} finally {
unset($container->loading[$id]);
}

if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
if (!$id) {
throw new ServiceNotFoundException($id);
}
if (isset($container->syntheticIds[$id])) {
throw new ServiceNotFoundException($id, null, null, [], \sprintf('The "%s" service is synthetic, it needs to be set at boot time before it can be used.', $id));
}
if (isset($container->getRemovedIds()[$id])) {
throw new ServiceNotFoundException($id, null, null, [], \sprintf('The "%s" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.', $id));
}

$alternatives = [];
foreach ($container->getServiceIds() as $knownId) {
if ('' === $knownId || '.' === $knownId[0]) {
continue;
}
$lev = levenshtein($id, $knownId);
if ($lev <= \strlen($id) / 3 || str_contains($knownId, $id)) {
$alternatives[] = $knownId;
}
}

throw new ServiceNotFoundException($id, null, null, $alternatives);
}

return null;
}




public function initialized(string $id): bool
{
if (isset($this->aliases[$id])) {
$id = $this->aliases[$id];
}

if ('service_container' === $id) {
return false;
}

return isset($this->services[$id]);
}




public function reset()
{
$services = $this->services + $this->privates;

foreach ($services as $service) {
try {
if ($service instanceof ResetInterface) {
$service->reset();
}
} catch (\Throwable) {
continue;
}
}

$this->services = $this->factories = $this->privates = [];
}






public function getServiceIds(): array
{
return array_map('strval', array_unique(array_merge(['service_container'], array_keys($this->fileMap), array_keys($this->methodMap), array_keys($this->aliases), array_keys($this->services))));
}




public function getRemovedIds(): array
{
return [];
}




public static function camelize(string $id): string
{
return strtr(ucwords(strtr($id, ['_' => ' ', '.' => '_ ', '\\' => '_ '])), [' ' => '']);
}




public static function underscore(string $id): string
{
return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], str_replace('_', '.', $id)));
}






protected function load(string $file)
{
return require $file;
}






protected function getEnv(string $name): mixed
{
if (isset($this->resolving[$envName = "env($name)"])) {
throw new ParameterCircularReferenceException(array_keys($this->resolving));
}
if (isset($this->envCache[$name]) || \array_key_exists($name, $this->envCache)) {
return $this->envCache[$name];
}
if (!$this->has($id = 'container.env_var_processors_locator')) {
$this->set($id, new ServiceLocator([]));
}
$this->getEnv ??= $this->getEnv(...);
$processors = $this->get($id);

if (false !== $i = strpos($name, ':')) {
$prefix = substr($name, 0, $i);
$localName = substr($name, 1 + $i);
} else {
$prefix = 'string';
$localName = $name;
}

$processor = $processors->has($prefix) ? $processors->get($prefix) : new EnvVarProcessor($this);
if (false === $i) {
$prefix = '';
}

$this->resolving[$envName] = true;
try {
return $this->envCache[$name] = $processor->getEnv($prefix, $localName, $this->getEnv);
} finally {
unset($this->resolving[$envName]);
}
}




final protected function getService(string|false $registry, string $id, ?string $method, string|bool $load): mixed
{
if ('service_container' === $id) {
return $this;
}
if (\is_string($load)) {
throw new RuntimeException($load);
}
if (null === $method) {
return false !== $registry ? $this->{$registry}[$id] ?? null : null;
}
if (false !== $registry) {
return $this->{$registry}[$id] ??= $load ? $this->load($method) : $this->{$method}($this);
}
if (!$load) {
return $this->{$method}($this);
}

return ($factory = $this->factories[$id] ?? $this->factories['service_container'][$id] ?? null) ? $factory($this) : $this->load($method);
}

private function __clone()
{
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;






class ChildDefinition extends Definition
{
private string $parent;




public function __construct(string $parent)
{
$this->parent = $parent;
}




public function getParent(): string
{
return $this->parent;
}






public function setParent(string $parent): static
{
$this->parent = $parent;

return $this;
}









public function getArgument(int|string $index): mixed
{
if (\array_key_exists('index_'.$index, $this->arguments)) {
return $this->arguments['index_'.$index];
}

return parent::getArgument($index);
}













public function replaceArgument(int|string $index, mixed $value): static
{
if (\is_int($index)) {
$this->arguments['index_'.$index] = $value;
} elseif (str_starts_with($index, '$')) {
$this->arguments[$index] = $value;
} else {
throw new InvalidArgumentException('The argument must be an existing index or the name of a constructor\'s parameter.');
}

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection;














class Variable
{
private string $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function __toString(): string
{
return $this->name;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class EnvVarProcessor implements EnvVarProcessorInterface
{
private ContainerInterface $container;

private \Traversable $loaders;
private array $loadedVars = [];




public function __construct(ContainerInterface $container, ?\Traversable $loaders = null)
{
$this->container = $container;
$this->loaders = $loaders ?? new \ArrayIterator();
}

public static function getProvidedTypes(): array
{
return [
'base64' => 'string',
'bool' => 'bool',
'not' => 'bool',
'const' => 'bool|int|float|string|array',
'csv' => 'array',
'file' => 'string',
'float' => 'float',
'int' => 'int',
'json' => 'array',
'key' => 'bool|int|float|string|array',
'url' => 'array',
'query_string' => 'array',
'resolve' => 'string',
'default' => 'bool|int|float|string|array',
'string' => 'string',
'trim' => 'string',
'require' => 'bool|int|float|string|array',
'enum' => \BackedEnum::class,
'shuffle' => 'array',
'defined' => 'bool',
];
}

public function getEnv(string $prefix, string $name, \Closure $getEnv): mixed
{
$i = strpos($name, ':');

if ('key' === $prefix) {
if (false === $i) {
throw new RuntimeException(\sprintf('Invalid env "key:%s": a key specifier should be provided.', $name));
}

$next = substr($name, $i + 1);
$key = substr($name, 0, $i);
$array = $getEnv($next);

if (!\is_array($array)) {
throw new RuntimeException(\sprintf('Resolved value of "%s" did not result in an array value.', $next));
}

if (!isset($array[$key]) && !\array_key_exists($key, $array)) {
throw new EnvNotFoundException(\sprintf('Key "%s" not found in %s (resolved from "%s").', $key, json_encode($array), $next));
}

return $array[$key];
}

if ('enum' === $prefix) {
if (false === $i) {
throw new RuntimeException(\sprintf('Invalid env "enum:%s": a "%s" class-string should be provided.', $name, \BackedEnum::class));
}

$next = substr($name, $i + 1);
$backedEnumClassName = substr($name, 0, $i);
$backedEnumValue = $getEnv($next);

if (!\is_string($backedEnumValue) && !\is_int($backedEnumValue)) {
throw new RuntimeException(\sprintf('Resolved value of "%s" did not result in a string or int value.', $next));
}

if (!is_subclass_of($backedEnumClassName, \BackedEnum::class)) {
throw new RuntimeException(\sprintf('"%s" is not a "%s".', $backedEnumClassName, \BackedEnum::class));
}

return $backedEnumClassName::tryFrom($backedEnumValue) ?? throw new RuntimeException(\sprintf('Enum value "%s" is not backed by "%s".', $backedEnumValue, $backedEnumClassName));
}

if ('defined' === $prefix) {
try {
return '' !== ($getEnv($name) ?? '');
} catch (EnvNotFoundException) {
return false;
}
}

if ('default' === $prefix) {
if (false === $i) {
throw new RuntimeException(\sprintf('Invalid env "default:%s": a fallback parameter should be provided.', $name));
}

$next = substr($name, $i + 1);
$default = substr($name, 0, $i);

if ('' !== $default && !$this->container->hasParameter($default)) {
throw new RuntimeException(\sprintf('Invalid env fallback in "default:%s": parameter "%s" not found.', $name, $default));
}

try {
$env = $getEnv($next);

if ('' !== $env && null !== $env) {
return $env;
}
} catch (EnvNotFoundException) {

}

return '' === $default ? null : $this->container->getParameter($default);
}

if ('file' === $prefix || 'require' === $prefix) {
if (!\is_scalar($file = $getEnv($name))) {
throw new RuntimeException(\sprintf('Invalid file name: env var "%s" is non-scalar.', $name));
}
if (!is_file($file)) {
throw new EnvNotFoundException(\sprintf('File "%s" not found (resolved from "%s").', $file, $name));
}

if ('file' === $prefix) {
return file_get_contents($file);
} else {
return require $file;
}
}

$returnNull = false;
if ('' === $prefix) {
if ('' === $name) {
return null;
}
$returnNull = true;
$prefix = 'string';
}

if (false !== $i || 'string' !== $prefix) {
$env = $getEnv($name);
} elseif ('' === ($env = $_ENV[$name] ?? (str_starts_with($name, 'HTTP_') ? null : ($_SERVER[$name] ?? null)))
|| (false !== $env && false === $env ??= getenv($name) ?? false) 
) {
foreach ($this->loadedVars as $i => $vars) {
if (false === $env = $vars[$name] ?? $env) {
continue;
}
if ($env instanceof \Stringable) {
$this->loadedVars[$i][$name] = $env = (string) $env;
}
if ('' !== ($env ?? '')) {
break;
}
}

if (false === $env || '' === $env) {
$loaders = $this->loaders;
$this->loaders = new \ArrayIterator();

try {
$i = 0;
$ended = true;
$count = $loaders instanceof \Countable ? $loaders->count() : 0;
foreach ($loaders as $loader) {
if (\count($this->loadedVars) > $i++) {
continue;
}
$this->loadedVars[] = $vars = $loader->loadEnvVars();
if (false === $env = $vars[$name] ?? $env) {
continue;
}
if ($env instanceof \Stringable) {
$this->loadedVars[array_key_last($this->loadedVars)][$name] = $env = (string) $env;
}
if ('' !== ($env ?? '')) {
$ended = false;
break;
}
}
if ($ended || $count === $i) {
$loaders = $this->loaders;
}
} catch (ParameterCircularReferenceException) {

} finally {
$this->loaders = $loaders;
}
}

if (false === $env) {
if (!$this->container->hasParameter("env($name)")) {
throw new EnvNotFoundException(\sprintf('Environment variable not found: "%s".', $name));
}

$env = $this->container->getParameter("env($name)");
}
}

if (null === $env) {
if ($returnNull) {
return null;
}

if (!isset($this->getProvidedTypes()[$prefix])) {
throw new RuntimeException(\sprintf('Unsupported env var prefix "%s".', $prefix));
}

if (!\in_array($prefix, ['string', 'bool', 'not', 'int', 'float'], true)) {
return null;
}
}

if ('shuffle' === $prefix) {
\is_array($env) ? shuffle($env) : throw new RuntimeException(\sprintf('Env var "%s" cannot be shuffled, expected array, got "%s".', $name, get_debug_type($env)));

return $env;
}

if (null !== $env && !\is_scalar($env)) {
throw new RuntimeException(\sprintf('Non-scalar env var "%s" cannot be cast to "%s".', $name, $prefix));
}

if ('string' === $prefix) {
return (string) $env;
}

if (\in_array($prefix, ['bool', 'not'], true)) {
$env = (bool) (filter_var($env, \FILTER_VALIDATE_BOOL) ?: filter_var($env, \FILTER_VALIDATE_INT) ?: filter_var($env, \FILTER_VALIDATE_FLOAT));

return 'not' === $prefix xor $env;
}

if ('int' === $prefix) {
if (null !== $env && false === $env = filter_var($env, \FILTER_VALIDATE_INT) ?: filter_var($env, \FILTER_VALIDATE_FLOAT)) {
throw new RuntimeException(\sprintf('Non-numeric env var "%s" cannot be cast to int.', $name));
}

return (int) $env;
}

if ('float' === $prefix) {
if (null !== $env && false === $env = filter_var($env, \FILTER_VALIDATE_FLOAT)) {
throw new RuntimeException(\sprintf('Non-numeric env var "%s" cannot be cast to float.', $name));
}

return (float) $env;
}

if ('const' === $prefix) {
if (!\defined($env)) {
throw new RuntimeException(\sprintf('Env var "%s" maps to undefined constant "%s".', $name, $env));
}

return \constant($env);
}

if ('base64' === $prefix) {
return base64_decode(strtr($env, '-_', '+/'));
}

if ('json' === $prefix) {
$env = json_decode($env, true);

if (\JSON_ERROR_NONE !== json_last_error()) {
throw new RuntimeException(\sprintf('Invalid JSON in env var "%s": ', $name).json_last_error_msg());
}

if (null !== $env && !\is_array($env)) {
throw new RuntimeException(\sprintf('Invalid JSON env var "%s": array or null expected, "%s" given.', $name, get_debug_type($env)));
}

return $env;
}

if ('url' === $prefix) {
$params = parse_url($env);

if (false === $params) {
throw new RuntimeException(\sprintf('Invalid URL in env var "%s".', $name));
}
if (!isset($params['scheme'], $params['host'])) {
throw new RuntimeException(\sprintf('Invalid URL in env var "%s": scheme and host expected.', $name));
}
$params += [
'port' => null,
'user' => null,
'pass' => null,
'path' => null,
'query' => null,
'fragment' => null,
];

$params['user'] = null !== $params['user'] ? rawurldecode($params['user']) : null;
$params['pass'] = null !== $params['pass'] ? rawurldecode($params['pass']) : null;


$params['path'] = '/' === ($params['path'] ?? '/') ? '' : substr($params['path'], 1);

return $params;
}

if ('query_string' === $prefix) {
$queryString = parse_url($env, \PHP_URL_QUERY) ?: $env;
parse_str($queryString, $result);

return $result;
}

if ('resolve' === $prefix) {
return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($name, $getEnv) {
if (!isset($match[1])) {
return '%';
}

if (str_starts_with($match[1], 'env(') && str_ends_with($match[1], ')') && 'env()' !== $match[1]) {
$value = $getEnv(substr($match[1], 4, -1));
} else {
$value = $this->container->getParameter($match[1]);
}

if (!\is_scalar($value)) {
throw new RuntimeException(\sprintf('Parameter "%s" found when resolving env var "%s" must be scalar, "%s" given.', $match[1], $name, get_debug_type($value)));
}

return $value;
}, $env);
}

if ('csv' === $prefix) {
return '' === $env ? [] : str_getcsv($env, ',', '"', '');
}

if ('trim' === $prefix) {
return trim($env);
}

throw new RuntimeException(\sprintf('Unsupported env var prefix "%s" for env name "%s".', $prefix, $name));
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;

if (!class_exists(BaseExpressionLanguage::class)) {
return;
}








class ExpressionLanguage extends BaseExpressionLanguage
{
public function __construct(?CacheItemPoolInterface $cache = null, array $providers = [], ?callable $serviceCompiler = null, ?\Closure $getEnv = null)
{

array_unshift($providers, new ExpressionLanguageProvider($serviceCompiler, $getEnv));

parent::__construct($cache, $providers);
}
}
<?php










namespace Symfony\Component\DependencyInjection;






interface EnvVarLoaderInterface
{



public function loadEnvVars(): array;
}
<?php










namespace Symfony\Component\DependencyInjection;

trigger_deprecation('symfony/dependency-injection', '6.4', '"%s" is deprecated, use dependency injection instead.', ContainerAwareTrait::class);








trait ContainerAwareTrait
{



protected $container;




public function setContainer(?ContainerInterface $container = null)
{
if (1 > \func_num_args()) {
trigger_deprecation('symfony/dependency-injection', '6.2', 'Calling "%s::%s()" without any arguments is deprecated, pass null explicitly instead.', __CLASS__, __FUNCTION__);
}

$this->container = $container;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class EnvNotFoundException extends InvalidArgumentException
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class ParameterCircularReferenceException extends RuntimeException
{
private array $parameters;

public function __construct(array $parameters, ?\Throwable $previous = null)
{
parent::__construct(\sprintf('Circular reference detected for parameter "%s" ("%s" > "%s").', $parameters[0], implode('" > "', $parameters), $parameters[0]), 0, $previous);

$this->parameters = $parameters;
}




public function getParameters()
{
return $this->parameters;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;




class AutowiringFailedException extends RuntimeException
{
private string $serviceId;
private ?\Closure $messageCallback = null;

public function __construct(string $serviceId, string|\Closure $message = '', int $code = 0, ?\Throwable $previous = null)
{
$this->serviceId = $serviceId;

if ($message instanceof \Closure && \function_exists('xdebug_is_enabled') && xdebug_is_enabled()) {
$message = $message();
}

if (!$message instanceof \Closure) {
parent::__construct($message, $code, $previous);

return;
}

$this->messageCallback = $message;
parent::__construct('', $code, $previous);

$this->message = new class($this->message, $this->messageCallback) {
private string|self $message;
private ?\Closure $messageCallback;

public function __construct(&$message, &$messageCallback)
{
$this->message = &$message;
$this->messageCallback = &$messageCallback;
}

public function __toString(): string
{
$messageCallback = $this->messageCallback;
$this->messageCallback = null;

try {
return $this->message = $messageCallback();
} catch (\Throwable $e) {
return $this->message = $e->getMessage();
}
}
};
}

public function getMessageCallback(): ?\Closure
{
return $this->messageCallback;
}




public function getServiceId()
{
return $this->serviceId;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class ServiceCircularReferenceException extends RuntimeException
{
private string $serviceId;
private array $path;

public function __construct(string $serviceId, array $path, ?\Throwable $previous = null)
{
parent::__construct(\sprintf('Circular reference detected for service "%s", path: "%s".', $serviceId, implode(' -> ', $path)), 0, $previous);

$this->serviceId = $serviceId;
$this->path = $path;
}




public function getServiceId()
{
return $this->serviceId;
}




public function getPath()
{
return $this->path;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;







class InvalidParameterTypeException extends InvalidArgumentException
{
public function __construct(string $serviceId, string $type, \ReflectionParameter $parameter)
{
$acceptedType = $parameter->getType();
$acceptedType = $acceptedType instanceof \ReflectionNamedType ? $acceptedType->getName() : (string) $acceptedType;
$this->code = $type;

$function = $parameter->getDeclaringFunction();
$functionName = $function instanceof \ReflectionMethod
? \sprintf('%s::%s', $function->getDeclaringClass()->getName(), $function->getName())
: $function->getName();

parent::__construct(\sprintf('Invalid definition for service "%s": argument %d of "%s()" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $functionName, $acceptedType, $type));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;




class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class EnvParameterException extends InvalidArgumentException
{
public function __construct(array $envs, ?\Throwable $previous = null, string $message = 'Incompatible use of dynamic environment variables "%s" found in parameters.')
{
parent::__construct(\sprintf($message, implode('", "', $envs)), 0, $previous);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;

use Psr\Container\NotFoundExceptionInterface;






class ParameterNotFoundException extends InvalidArgumentException implements NotFoundExceptionInterface
{
private string $key;
private ?string $sourceId;
private ?string $sourceKey;
private array $alternatives;
private ?string $nonNestedAlternative;









public function __construct(string $key, ?string $sourceId = null, ?string $sourceKey = null, ?\Throwable $previous = null, array $alternatives = [], ?string $nonNestedAlternative = null)
{
$this->key = $key;
$this->sourceId = $sourceId;
$this->sourceKey = $sourceKey;
$this->alternatives = $alternatives;
$this->nonNestedAlternative = $nonNestedAlternative;

parent::__construct('', 0, $previous);

$this->updateRepr();
}




public function updateRepr()
{
if (null !== $this->sourceId) {
$this->message = \sprintf('The service "%s" has a dependency on a non-existent parameter "%s".', $this->sourceId, $this->key);
} elseif (null !== $this->sourceKey) {
$this->message = \sprintf('The parameter "%s" has a dependency on a non-existent parameter "%s".', $this->sourceKey, $this->key);
} elseif ('.' === ($this->key[0] ?? '')) {
$this->message = \sprintf('Parameter "%s" not found. It was probably deleted during the compilation of the container.', $this->key);
} else {
$this->message = \sprintf('You have requested a non-existent parameter "%s".', $this->key);
}

if ($this->alternatives) {
if (1 == \count($this->alternatives)) {
$this->message .= ' Did you mean this: "';
} else {
$this->message .= ' Did you mean one of these: "';
}
$this->message .= implode('", "', $this->alternatives).'"?';
} elseif (null !== $this->nonNestedAlternative) {
$this->message .= ' You cannot access nested array items, do you want to inject "'.$this->nonNestedAlternative.'" instead?';
}
}




public function getKey()
{
return $this->key;
}




public function getSourceId()
{
return $this->sourceId;
}




public function getSourceKey()
{
return $this->sourceKey;
}




public function setSourceId(?string $sourceId)
{
$this->sourceId = $sourceId;

$this->updateRepr();
}




public function setSourceKey(?string $sourceKey)
{
$this->sourceKey = $sourceKey;

$this->updateRepr();
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;

use Psr\Container\ContainerExceptionInterface;







interface ExceptionInterface extends ContainerExceptionInterface, \Throwable
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;

use Psr\Container\NotFoundExceptionInterface;






class ServiceNotFoundException extends InvalidArgumentException implements NotFoundExceptionInterface
{
private string $id;
private ?string $sourceId;
private array $alternatives;

public function __construct(string $id, ?string $sourceId = null, ?\Throwable $previous = null, array $alternatives = [], ?string $msg = null)
{
if (null !== $msg) {

} elseif (null === $sourceId) {
$msg = \sprintf('You have requested a non-existent service "%s".', $id);
} else {
$msg = \sprintf('The service "%s" has a dependency on a non-existent service "%s".', $sourceId, $id);
}

if ($alternatives) {
if (1 == \count($alternatives)) {
$msg .= ' Did you mean this: "';
} else {
$msg .= ' Did you mean one of these: "';
}
$msg .= implode('", "', $alternatives).'"?';
}

parent::__construct($msg, 0, $previous);

$this->id = $id;
$this->sourceId = $sourceId;
$this->alternatives = $alternatives;
}




public function getId()
{
return $this->id;
}




public function getSourceId()
{
return $this->sourceId;
}




public function getAlternatives()
{
return $this->alternatives;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;




class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;






class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\DependencyInjection\Exception;




class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;

use Symfony\Component\DependencyInjection\ServiceLocator as BaseServiceLocator;






class ServiceLocator extends BaseServiceLocator
{
private \Closure $factory;
private array $serviceMap;
private ?array $serviceTypes;

public function __construct(\Closure $factory, array $serviceMap, ?array $serviceTypes = null)
{
$this->factory = $factory;
$this->serviceMap = $serviceMap;
$this->serviceTypes = $serviceTypes;
parent::__construct($serviceMap);
}

public function get(string $id): mixed
{
return match (\count($this->serviceMap[$id] ?? [])) {
0 => parent::get($id),
1 => $this->serviceMap[$id][0],
default => ($this->factory)(...$this->serviceMap[$id]),
};
}

public function getProvidedServices(): array
{
return $this->serviceTypes ??= array_map(fn () => '?', $this->serviceMap);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;




final class AbstractArgument
{
private string $text;
private string $context = '';

public function __construct(string $text = '')
{
$this->text = trim($text, '. ');
}

public function setContext(string $context): void
{
$this->context = $context.' is abstract'.('' === $this->text ? '' : ': ');
}

public function getText(): string
{
return $this->text;
}

public function getTextWithContext(): string
{
return $this->context.$this->text.'.';
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;






class TaggedIteratorArgument extends IteratorArgument
{
private string $tag;
private mixed $indexAttribute;
private ?string $defaultIndexMethod;
private ?string $defaultPriorityMethod;
private bool $needsIndexes;
private array $exclude;
private bool $excludeSelf = true;










public function __construct(string $tag, ?string $indexAttribute = null, ?string $defaultIndexMethod = null, bool $needsIndexes = false, ?string $defaultPriorityMethod = null, array $exclude = [], bool $excludeSelf = true)
{
parent::__construct([]);

if (null === $indexAttribute && $needsIndexes) {
$indexAttribute = preg_match('/[^.]++$/', $tag, $m) ? $m[0] : $tag;
}

$this->tag = $tag;
$this->indexAttribute = $indexAttribute;
$this->defaultIndexMethod = $defaultIndexMethod ?: ($indexAttribute ? 'getDefault'.str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $indexAttribute))).'Name' : null);
$this->needsIndexes = $needsIndexes;
$this->defaultPriorityMethod = $defaultPriorityMethod ?: ($indexAttribute ? 'getDefault'.str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $indexAttribute))).'Priority' : null);
$this->exclude = $exclude;
$this->excludeSelf = $excludeSelf;
}




public function getTag()
{
return $this->tag;
}

public function getIndexAttribute(): ?string
{
return $this->indexAttribute;
}

public function getDefaultIndexMethod(): ?string
{
return $this->defaultIndexMethod;
}

public function needsIndexes(): bool
{
return $this->needsIndexes;
}

public function getDefaultPriorityMethod(): ?string
{
return $this->defaultPriorityMethod;
}

public function getExclude(): array
{
return $this->exclude;
}

public function excludeSelf(): bool
{
return $this->excludeSelf;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;

trigger_deprecation('symfony/dependency-injection', '6.1', '"%s" is deprecated.', ReferenceSetArgumentTrait::class);

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;







trait ReferenceSetArgumentTrait
{
private array $values;




public function __construct(array $values)
{
$this->setValues($values);
}




public function getValues(): array
{
return $this->values;
}






public function setValues(array $values)
{
foreach ($values as $k => $v) {
if (null !== $v && !$v instanceof Reference) {
throw new InvalidArgumentException(\sprintf('A "%s" must hold only Reference instances, "%s" given.', __CLASS__, get_debug_type($v)));
}
}

$this->values = $values;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;






class ServiceClosureArgument implements ArgumentInterface
{
private array $values;

public function __construct(mixed $value)
{
$this->values = [$value];
}

public function getValues(): array
{
return $this->values;
}




public function setValues(array $values)
{
if ([0] !== array_keys($values)) {
throw new InvalidArgumentException('A ServiceClosureArgument must hold one and only one value.');
}

$this->values = $values;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;






class IteratorArgument implements ArgumentInterface
{
private array $values;

public function __construct(array $values)
{
$this->setValues($values);
}

public function getValues(): array
{
return $this->values;
}




public function setValues(array $values)
{
$this->values = $values;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;






interface ArgumentInterface
{
public function getValues(): array;




public function setValues(array $values);
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;




final class BoundArgument implements ArgumentInterface
{
public const SERVICE_BINDING = 0;
public const DEFAULTS_BINDING = 1;
public const INSTANCEOF_BINDING = 2;

private static int $sequence = 0;

private mixed $value;
private ?int $identifier = null;
private ?bool $used = null;
private int $type;
private ?string $file;

public function __construct(mixed $value, bool $trackUsage = true, int $type = 0, ?string $file = null)
{
$this->value = $value;
if ($trackUsage) {
$this->identifier = ++self::$sequence;
} else {
$this->used = true;
}
$this->type = $type;
$this->file = $file;
}

public function getValues(): array
{
return [$this->value, $this->identifier, $this->used, $this->type, $this->file];
}

public function setValues(array $values): void
{
if (5 === \count($values)) {
[$this->value, $this->identifier, $this->used, $this->type, $this->file] = $values;
} else {
[$this->value, $this->identifier, $this->used] = $values;
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;






class ServiceLocatorArgument implements ArgumentInterface
{
private array $values;
private ?TaggedIteratorArgument $taggedIteratorArgument = null;

public function __construct(array|TaggedIteratorArgument $values = [])
{
if ($values instanceof TaggedIteratorArgument) {
$this->taggedIteratorArgument = $values;
$values = [];
}

$this->setValues($values);
}

public function getTaggedIteratorArgument(): ?TaggedIteratorArgument
{
return $this->taggedIteratorArgument;
}

public function getValues(): array
{
return $this->values;
}




public function setValues(array $values)
{
$this->values = $values;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\VarExporter\ProxyHelper;






class LazyClosure
{
public readonly object $service;

public function __construct(
private \Closure $initializer,
) {
unset($this->service);
}

public function __get(mixed $name): mixed
{
if ('service' !== $name) {
throw new InvalidArgumentException(\sprintf('Cannot read property "%s" from a lazy closure.', $name));
}

if (isset($this->initializer)) {
if (\is_string($service = ($this->initializer)())) {
$service = (new \ReflectionClass($service))->newInstanceWithoutConstructor();
}
$this->service = $service;
unset($this->initializer);
}

return $this->service;
}

public static function getCode(string $initializer, array $callable, string $class, ContainerBuilder $container, ?string $id): string
{
$method = $callable[1];

if ($asClosure = 'Closure' === $class) {
$class = ($callable[0] instanceof Reference ? $container->findDefinition($callable[0]) : $callable[0])->getClass();
}

$r = $container->getReflectionClass($class);

if (null !== $id) {
$id = \sprintf(' for service "%s"', $id);
}

if (!$asClosure) {
$id = str_replace('%', '%%', (string) $id);

if (!$r || !$r->isInterface()) {
throw new RuntimeException(\sprintf("Cannot create adapter{$id} because \"%s\" is not an interface.", $class));
}
if (1 !== \count($method = $r->getMethods())) {
throw new RuntimeException(\sprintf("Cannot create adapter{$id} because interface \"%s\" doesn't have exactly one method.", $class));
}
$method = $method[0]->name;
} elseif (!$r || !$r->hasMethod($method)) {
throw new RuntimeException("Cannot create lazy closure{$id} because its corresponding callable is invalid.");
}

$methodReflector = $r->getMethod($method);
$code = ProxyHelper::exportSignature($methodReflector, true, $args);

if ($asClosure) {
$code = ' { '.preg_replace('/: static$/', ': \\'.$r->name, $code);
} else {
$code = ' implements \\'.$r->name.' { '.$code;
}

$code = 'new class('.$initializer.') extends \\'.self::class
.$code.' { '.($methodReflector->hasReturnType() && 'void' === (string) $methodReflector->getReturnType() ? '' : 'return ').'$this->service->'.$callable[1].'('.$args.'); } '
.'}';

return $asClosure ? '('.$code.')->'.$method.'(...)' : $code;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Argument;




class RewindableGenerator implements \IteratorAggregate, \Countable
{
private \Closure $generator;
private \Closure|int $count;

public function __construct(callable $generator, int|callable $count)
{
$this->generator = $generator(...);
$this->count = \is_int($count) ? $count : $count(...);
}

public function getIterator(): \Traversable
{
$g = $this->generator;

return $g();
}

public function count(): int
{
if (!\is_int($count = $this->count)) {
$this->count = $count();
}

return $this->count;
}
}
<?php










namespace Symfony\Component\DependencyInjection;






class Parameter
{
private string $id;

public function __construct(string $id)
{
$this->id = $id;
}

public function __toString(): string
{
return $this->id;
}
}
<?php










namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\RuntimeException;






interface EnvVarProcessorInterface
{









public function getEnv(string $prefix, string $name, \Closure $getEnv): mixed;




public static function getProvidedTypes(): array;
}
<?php










namespace Symfony\Component\DependencyInjection;

use Psr\Container\ContainerInterface as PsrContainerInterface;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;







interface ContainerInterface extends PsrContainerInterface
{
public const RUNTIME_EXCEPTION_ON_INVALID_REFERENCE = 0;
public const EXCEPTION_ON_INVALID_REFERENCE = 1;
public const NULL_ON_INVALID_REFERENCE = 2;
public const IGNORE_ON_INVALID_REFERENCE = 3;
public const IGNORE_ON_UNINITIALIZED_REFERENCE = 4;




public function set(string $id, ?object $service);

/**
@template
@psalm-return(B is self::EXCEPTION_ON_INVALID_REFERENCE|self::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE ? object : object|null)








*/
public function get(string $id, int $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE): ?object;

public function has(string $id): bool;




public function initialized(string $id): bool;






public function getParameter(string $name);

public function hasParameter(string $name): bool;




public function setParameter(string $name, array|bool|string|int|float|\UnitEnum|null $value);
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;




final class Preloader
{
public static function append(string $file, array $list): void
{
if (!file_exists($file)) {
throw new \LogicException(\sprintf('File "%s" does not exist.', $file));
}

$cacheDir = \dirname($file);
$classes = [];

foreach ($list as $item) {
if (str_starts_with($item, $cacheDir)) {
file_put_contents($file, \sprintf("require_once __DIR__.%s;\n", var_export(strtr(substr($item, \strlen($cacheDir)), \DIRECTORY_SEPARATOR, '/'), true)), \FILE_APPEND);
continue;
}

$classes[] = \sprintf("\$classes[] = %s;\n", var_export($item, true));
}

file_put_contents($file, \sprintf("\n\$classes = [];\n%s\$preloaded = Preloader::preload(\$classes, \$preloaded);\n", implode('', $classes)), \FILE_APPEND);
}

public static function preload(array $classes, array $preloaded = []): array
{
set_error_handler(function ($t, $m, $f, $l) {
if (error_reporting() & $t) {
if (__FILE__ !== $f) {
throw new \ErrorException($m, 0, $t, $f, $l);
}

throw new \ReflectionException($m);
}
});

$prev = [];

try {
while ($prev !== $classes) {
$prev = $classes;
foreach ($classes as $c) {
if (!isset($preloaded[$c])) {
self::doPreload($c, $preloaded);
}
}
$classes = array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits());
}
} finally {
restore_error_handler();
}

return $preloaded;
}

private static function doPreload(string $class, array &$preloaded): void
{
if (isset($preloaded[$class]) || \in_array($class, ['self', 'static', 'parent'], true)) {
return;
}

$preloaded[$class] = true;

try {
if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
return;
}

$r = new \ReflectionClass($class);

if ($r->isInternal()) {
return;
}

$r->getConstants();
$r->getDefaultProperties();

foreach ($r->getProperties(\ReflectionProperty::IS_PUBLIC) as $p) {
self::preloadType($p->getType(), $preloaded);
}

foreach ($r->getMethods(\ReflectionMethod::IS_PUBLIC) as $m) {
foreach ($m->getParameters() as $p) {
if ($p->isDefaultValueAvailable() && $p->isDefaultValueConstant()) {
$c = $p->getDefaultValueConstantName();

if ($i = strpos($c, '::')) {
self::doPreload(substr($c, 0, $i), $preloaded);
}
}

self::preloadType($p->getType(), $preloaded);
}

self::preloadType($m->getReturnType(), $preloaded);
}
} catch (\Throwable) {

}
}

private static function preloadType(?\ReflectionType $t, array &$preloaded): void
{
if (!$t) {
return;
}

foreach (($t instanceof \ReflectionUnionType || $t instanceof \ReflectionIntersectionType) ? $t->getTypes() : [$t] as $t) {
if (!$t->isBuiltin()) {
self::doPreload($t instanceof \ReflectionNamedType ? $t->getName() : $t, $preloaded);
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;

use Composer\Autoload\ClassLoader;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\LazyClosure;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocator;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\CheckCircularReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\ServiceReferenceGraphNode;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ExpressionLanguage;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\LazyServiceDumper;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;
use Symfony\Component\DependencyInjection\Loader\FileLoader;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ServiceLocator as BaseServiceLocator;
use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\DependencyInjection\Variable;
use Symfony\Component\ErrorHandler\DebugClassLoader;
use Symfony\Component\ExpressionLanguage\Expression;







class PhpDumper extends Dumper
{



public const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz';




public const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_';


private ?\SplObjectStorage $definitionVariables = null;
private ?array $referenceVariables = null;
private int $variableCount;
private ?\SplObjectStorage $inlinedDefinitions = null;
private ?array $serviceCalls = null;
private array $reservedVariables = ['instance', 'class', 'this', 'container'];
private ExpressionLanguage $expressionLanguage;
private ?string $targetDirRegex = null;
private int $targetDirMaxMatches;
private string $docStar;
private array $serviceIdToMethodNameMap;
private array $usedMethodNames;
private string $namespace;
private bool $asFiles;
private string $hotPathTag;
private array $preloadTags;
private bool $inlineFactories;
private bool $inlineRequires;
private array $inlinedRequires = [];
private array $circularReferences = [];
private array $singleUsePrivateIds = [];
private array $preload = [];
private bool $addGetService = false;
private array $locatedIds = [];
private string $serviceLocatorTag;
private array $exportedVariables = [];
private array $dynamicParameters = [];
private string $baseClass;
private string $class;
private DumperInterface $proxyDumper;
private bool $hasProxyDumper = true;

public function __construct(ContainerBuilder $container)
{
if (!$container->isCompiled()) {
throw new LogicException('Cannot dump an uncompiled container.');
}

parent::__construct($container);
}






public function setProxyDumper(DumperInterface $proxyDumper)
{
$this->proxyDumper = $proxyDumper;
$this->hasProxyDumper = !$proxyDumper instanceof NullDumper;
}















public function dump(array $options = []): string|array
{
$this->locatedIds = [];
$this->targetDirRegex = null;
$this->inlinedRequires = [];
$this->exportedVariables = [];
$this->dynamicParameters = [];
$options = array_merge([
'class' => 'ProjectServiceContainer',
'base_class' => 'Container',
'namespace' => '',
'as_files' => false,
'debug' => true,
'hot_path_tag' => 'container.hot_path',
'preload_tags' => ['container.preload', 'container.no_preload'],
'inline_factories_parameter' => 'container.dumper.inline_factories', 
'inline_class_loader_parameter' => 'container.dumper.inline_class_loader', 
'inline_factories' => null,
'inline_class_loader' => null,
'preload_classes' => [],
'service_locator_tag' => 'container.service_locator',
'build_time' => time(),
], $options);

$this->addGetService = false;
$this->namespace = $options['namespace'];
$this->asFiles = $options['as_files'];
$this->hotPathTag = $options['hot_path_tag'];
$this->preloadTags = $options['preload_tags'];

$this->inlineFactories = false;
if (isset($options['inline_factories'])) {
$this->inlineFactories = $this->asFiles && $options['inline_factories'];
} elseif (!$options['inline_factories_parameter']) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_factories_parameter" passed to "%s()" is deprecated, use option "inline_factories" instead.', __METHOD__);
} elseif ($this->container->hasParameter($options['inline_factories_parameter'])) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_factories_parameter" passed to "%s()" is deprecated, use option "inline_factories" instead.', __METHOD__);
$this->inlineFactories = $this->asFiles && $this->container->getParameter($options['inline_factories_parameter']);
}

$this->inlineRequires = $options['debug'];
if (isset($options['inline_class_loader'])) {
$this->inlineRequires = $options['inline_class_loader'];
} elseif (!$options['inline_class_loader_parameter']) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_class_loader_parameter" passed to "%s()" is deprecated, use option "inline_class_loader" instead.', __METHOD__);
$this->inlineRequires = false;
} elseif ($this->container->hasParameter($options['inline_class_loader_parameter'])) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_class_loader_parameter" passed to "%s()" is deprecated, use option "inline_class_loader" instead.', __METHOD__);
$this->inlineRequires = $this->container->getParameter($options['inline_class_loader_parameter']);
}

$this->serviceLocatorTag = $options['service_locator_tag'];
$this->class = $options['class'];

if (!str_starts_with($baseClass = $options['base_class'], '\\') && 'Container' !== $baseClass) {
$baseClass = \sprintf('%s\%s', $options['namespace'] ? '\\'.$options['namespace'] : '', $baseClass);
$this->baseClass = $baseClass;
} elseif ('Container' === $baseClass) {
$this->baseClass = Container::class;
} else {
$this->baseClass = $baseClass;
}

$this->initializeMethodNamesMap('Container' === $baseClass ? Container::class : $baseClass);

if (!$this->hasProxyDumper) {
(new AnalyzeServiceReferencesPass(true, false))->process($this->container);
(new CheckCircularReferencesPass())->process($this->container);
}

$this->analyzeReferences();
$this->docStar = $options['debug'] ? '*' : '';

if (!empty($options['file']) && is_dir($dir = \dirname($options['file']))) {




$dir = explode(\DIRECTORY_SEPARATOR, realpath($dir));
$i = \count($dir);

if (2 + (int) ('\\' === \DIRECTORY_SEPARATOR) <= $i) {
$regex = '';
$lastOptionalDir = $i > 8 ? $i - 5 : (2 + (int) ('\\' === \DIRECTORY_SEPARATOR));
$this->targetDirMaxMatches = $i - $lastOptionalDir;

while (--$i >= $lastOptionalDir) {
$regex = \sprintf('(%s%s)?', preg_quote(\DIRECTORY_SEPARATOR.$dir[$i], '#'), $regex);
}

do {
$regex = preg_quote(\DIRECTORY_SEPARATOR.$dir[$i], '#').$regex;
} while (0 < --$i);

$this->targetDirRegex = '#(^|file://|[:;, \|\r\n])'.preg_quote($dir[0], '#').$regex.'#';
}
}

$proxyClasses = $this->inlineFactories ? $this->generateProxyClasses() : null;

if ($options['preload_classes']) {
$this->preload = array_combine($options['preload_classes'], $options['preload_classes']);
}

$code = $this->addDefaultParametersMethod();
$code =
$this->startClass($options['class'], $baseClass, $this->inlineFactories && $proxyClasses).
$this->addServices($services).
$this->addDeprecatedAliases().
$code
;

$proxyClasses ??= $this->generateProxyClasses();

if ($this->addGetService) {
$code = preg_replace(
"/\r?\n\r?\n    public function __construct.+?\\{\r?\n/s",
"\n    protected \Closure \$getService;$0",
$code,
1
);
}

if ($this->asFiles) {
$fileTemplate = <<<EOF
<?php

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/*{$this->docStar}
 * @internal This class has been auto-generated by the Symfony Dependency Injection Component.
 */
class %s extends {$options['class']}
{%s}

EOF;
$files = [];
$preloadedFiles = [];
$ids = $this->container->getRemovedIds();
foreach ($this->container->getDefinitions() as $id => $definition) {
if (!$definition->isPublic()) {
$ids[$id] = true;
}
}
if ($ids = array_keys($ids)) {
sort($ids);
$c = "<?php\n\nreturn [\n";
foreach ($ids as $id) {
$c .= '    '.$this->doExport($id)." => true,\n";
}
$files['removed-ids.php'] = $c."];\n";
}

if (!$this->inlineFactories) {
foreach ($this->generateServiceFiles($services) as $file => [$c, $preload]) {
$files[$file] = \sprintf($fileTemplate, substr($file, 0, -4), $c);

if ($preload) {
$preloadedFiles[$file] = $file;
}
}
foreach ($proxyClasses as $file => $c) {
$files[$file] = "<?php\n".$c;
$preloadedFiles[$file] = $file;
}
}

$code .= $this->endClass();

if ($this->inlineFactories && $proxyClasses) {
$files['proxy-classes.php'] = "<?php\n\n";

foreach ($proxyClasses as $c) {
$files['proxy-classes.php'] .= $c;
}
}

$files[$options['class'].'.php'] = $code;
$hash = ucfirst(strtr(ContainerBuilder::hash($files), '._', 'xx'));
$code = [];

foreach ($files as $file => $c) {
$code["Container{$hash}/{$file}"] = substr_replace($c, "<?php\n\nnamespace Container{$hash};\n", 0, 6);

if (isset($preloadedFiles[$file])) {
$preloadedFiles[$file] = "Container{$hash}/{$file}";
}
}
$namespaceLine = $this->namespace ? "\nnamespace {$this->namespace};\n" : '';
$time = $options['build_time'];
$id = hash('crc32', $hash.$time);
$this->asFiles = false;

if ($this->preload && null !== $autoloadFile = $this->getAutoloadFile()) {
$autoloadFile = trim($this->export($autoloadFile), '()\\');

$preloadedFiles = array_reverse($preloadedFiles);
if ('' !== $preloadedFiles = implode("';\nrequire __DIR__.'/", $preloadedFiles)) {
$preloadedFiles = "require __DIR__.'/$preloadedFiles';\n";
}

$code[$options['class'].'.preload.php'] = <<<EOF
<?php

// This file has been auto-generated by the Symfony Dependency Injection Component
// You can reference it in the "opcache.preload" php.ini setting on PHP >= 7.4 when preloading is desired

use Symfony\Component\DependencyInjection\Dumper\Preloader;

if (in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
    return;
}

require $autoloadFile;
(require __DIR__.'/{$options['class']}.php')->set(\\Container{$hash}\\{$options['class']}::class, null);
$preloadedFiles
\$classes = [];

EOF;

foreach ($this->preload as $class) {
if (!$class || str_contains($class, '$') || \in_array($class, ['int', 'float', 'string', 'bool', 'resource', 'object', 'array', 'null', 'callable', 'iterable', 'mixed', 'void', 'never'], true)) {
continue;
}
if (!(class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false)) || (new \ReflectionClass($class))->isUserDefined()) {
$code[$options['class'].'.preload.php'] .= \sprintf("\$classes[] = '%s';\n", $class);
}
}

$code[$options['class'].'.preload.php'] .= <<<'EOF'

$preloaded = Preloader::preload($classes);

EOF;
}

$code[$options['class'].'.php'] = <<<EOF
<?php
{$namespaceLine}
// This file has been auto-generated by the Symfony Dependency Injection Component for internal use.

if (\\class_exists(\\Container{$hash}\\{$options['class']}::class, false)) {
    // no-op
} elseif (!include __DIR__.'/Container{$hash}/{$options['class']}.php') {
    touch(__DIR__.'/Container{$hash}.legacy');

    return;
}

if (!\\class_exists({$options['class']}::class, false)) {
    \\class_alias(\\Container{$hash}\\{$options['class']}::class, {$options['class']}::class, false);
}

return new \\Container{$hash}\\{$options['class']}([
    'container.build_hash' => '$hash',
    'container.build_id' => '$id',
    'container.build_time' => $time,
    'container.runtime_mode' => \\in_array(\\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'web=0' : 'web=1',
], __DIR__.\\DIRECTORY_SEPARATOR.'Container{$hash}');

EOF;
} else {
$code .= $this->endClass();
foreach ($proxyClasses as $c) {
$code .= $c;
}
}

$this->targetDirRegex = null;
$this->inlinedRequires = [];
$this->circularReferences = [];
$this->locatedIds = [];
$this->exportedVariables = [];
$this->dynamicParameters = [];
$this->preload = [];

$unusedEnvs = [];
foreach ($this->container->getEnvCounters() as $env => $use) {
if (!$use) {
$unusedEnvs[] = $env;
}
}
if ($unusedEnvs) {
throw new EnvParameterException($unusedEnvs, null, 'Environment variables "%s" are never used. Please, check your container\'s configuration.');
}

return $code;
}




private function getProxyDumper(): DumperInterface
{
return $this->proxyDumper ??= new LazyServiceDumper($this->class);
}

private function analyzeReferences(): void
{
(new AnalyzeServiceReferencesPass(false, $this->hasProxyDumper))->process($this->container);
$checkedNodes = [];
$this->circularReferences = [];
$this->singleUsePrivateIds = [];
foreach ($this->container->getCompiler()->getServiceReferenceGraph()->getNodes() as $id => $node) {
if (!$node->getValue() instanceof Definition) {
continue;
}

if ($this->isSingleUsePrivateNode($node)) {
$this->singleUsePrivateIds[$id] = $id;
}

$this->collectCircularReferences($id, $node->getOutEdges(), $checkedNodes);
}

$this->container->getCompiler()->getServiceReferenceGraph()->clear();
$this->singleUsePrivateIds = array_diff_key($this->singleUsePrivateIds, $this->circularReferences);
}

private function collectCircularReferences(string $sourceId, array $edges, array &$checkedNodes, array &$loops = [], array $path = [], bool $byConstructor = true): void
{
$path[$sourceId] = $byConstructor;
$checkedNodes[$sourceId] = true;
foreach ($edges as $edge) {
$node = $edge->getDestNode();
$id = $node->getId();
if ($sourceId === $id || !$node->getValue() instanceof Definition || $edge->isWeak()) {
continue;
}

if (isset($path[$id])) {
$loop = null;
$loopByConstructor = $edge->isReferencedByConstructor() && !$edge->isLazy();
$pathInLoop = [$id, []];
foreach ($path as $k => $pathByConstructor) {
if (null !== $loop) {
$loop[] = $k;
$pathInLoop[1][$k] = $pathByConstructor;
$loops[$k][] = &$pathInLoop;
$loopByConstructor = $loopByConstructor && $pathByConstructor;
} elseif ($k === $id) {
$loop = [];
}
}
$this->addCircularReferences($id, $loop, $loopByConstructor);
} elseif (!isset($checkedNodes[$id])) {
$this->collectCircularReferences($id, $node->getOutEdges(), $checkedNodes, $loops, $path, $edge->isReferencedByConstructor() && !$edge->isLazy());
} elseif (isset($loops[$id])) {


foreach ($loops[$id] as [$first, $loopPath]) {
if (!isset($path[$first])) {
continue;
}

$fillPath = null;
foreach ($loopPath as $k => $pathByConstructor) {
if (null !== $fillPath) {
$fillPath[$k] = $pathByConstructor;
} elseif ($k === $id) {
$fillPath = $path;
$fillPath[$k] = $pathByConstructor;
}
}


$loop = null;
$loopByConstructor = $edge->isReferencedByConstructor() && !$edge->isLazy();
foreach ($fillPath as $k => $pathByConstructor) {
if (null !== $loop) {
$loop[] = $k;
$loopByConstructor = $loopByConstructor && $pathByConstructor;
} elseif ($k === $first) {
$loop = [];
}
}
$this->addCircularReferences($first, $loop, $loopByConstructor);
break;
}
}
}
unset($path[$sourceId]);
}

private function addCircularReferences(string $sourceId, array $currentPath, bool $byConstructor): void
{
$currentId = $sourceId;
$currentPath = array_reverse($currentPath);
$currentPath[] = $currentId;
foreach ($currentPath as $parentId) {
if (empty($this->circularReferences[$parentId][$currentId])) {
$this->circularReferences[$parentId][$currentId] = $byConstructor;
}

$currentId = $parentId;
}
}

private function collectLineage(string $class, array &$lineage): void
{
if (isset($lineage[$class])) {
return;
}
if (!$r = $this->container->getReflectionClass($class, false)) {
return;
}
if (is_a($class, $this->baseClass, true)) {
return;
}
$file = $r->getFileName();
if ($file && str_ends_with($file, ') : eval()\'d code')) {
$file = substr($file, 0, strrpos($file, '(', -17));
}
if (!$file || $this->doExport($file) === $exportedFile = $this->export($file)) {
return;
}

$lineage[$class] = substr($exportedFile, 1, -1);

if ($parent = $r->getParentClass()) {
$this->collectLineage($parent->name, $lineage);
}

foreach ($r->getInterfaces() as $parent) {
$this->collectLineage($parent->name, $lineage);
}

foreach ($r->getTraits() as $parent) {
$this->collectLineage($parent->name, $lineage);
}

unset($lineage[$class]);
$lineage[$class] = substr($exportedFile, 1, -1);
}

private function generateProxyClasses(): array
{
$proxyClasses = [];
$alreadyGenerated = [];
$definitions = $this->container->getDefinitions();
$strip = '' === $this->docStar;
$proxyDumper = $this->getProxyDumper();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if (!$definition = $this->isProxyCandidate($definition, $asGhostObject, $id)) {
continue;
}
if (isset($alreadyGenerated[$asGhostObject][$class = $definition->getClass()])) {
continue;
}
$alreadyGenerated[$asGhostObject][$class] = true;

foreach (array_column($definition->getTag('proxy'), 'interface') ?: [$class] as $r) {
if (!$r = $this->container->getReflectionClass($r)) {
continue;
}
do {
if ($file = $r->getFileName()) {
if (str_ends_with($file, ') : eval()\'d code')) {
$file = substr($file, 0, strrpos($file, '(', -17));
}
if (is_file($file)) {
$this->container->addResource(new FileResource($file));
}
}
$r = $r->getParentClass() ?: null;
} while ($r?->isUserDefined());
}

if ("\n" === $proxyCode = "\n".$proxyDumper->getProxyCode($definition, $id)) {
continue;
}

if ($this->inlineRequires) {
$lineage = [];
$this->collectLineage($class, $lineage);

$code = '';
foreach (array_diff_key(array_flip($lineage), $this->inlinedRequires) as $file => $class) {
if ($this->inlineFactories) {
$this->inlinedRequires[$file] = true;
}
$code .= \sprintf("include_once %s;\n", $file);
}

$proxyCode = $code.$proxyCode;
}

if ($strip) {
$proxyCode = "<?php\n".$proxyCode;
$proxyCode = substr(self::stripComments($proxyCode), 5);
}

$proxyClass = $this->inlineRequires ? substr($proxyCode, \strlen($code)) : $proxyCode;
$i = strpos($proxyClass, 'class');
$proxyClass = substr($proxyClass, 6 + $i, strpos($proxyClass, ' ', 7 + $i) - $i - 6);

if ($this->asFiles || $this->namespace) {
$proxyCode .= "\nif (!\\class_exists('$proxyClass', false)) {\n    \\class_alias(__NAMESPACE__.'\\\\$proxyClass', '$proxyClass', false);\n}\n";
}

$proxyClasses[$proxyClass.'.php'] = $proxyCode;
}

return $proxyClasses;
}

private function addServiceInclude(string $cId, Definition $definition, bool $isProxyCandidate): string
{
$code = '';

if ($this->inlineRequires && (!$this->isHotPath($definition) || $isProxyCandidate)) {
$lineage = [];
foreach ($this->inlinedDefinitions as $def) {
if (!$def->isDeprecated()) {
foreach ($this->getClasses($def, $cId) as $class) {
$this->collectLineage($class, $lineage);
}
}
}

foreach ($this->serviceCalls as $id => [$callCount, $behavior]) {
if ('service_container' !== $id && $id !== $cId
&& ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $behavior
&& $this->container->has($id)
&& $this->isTrivialInstance($def = $this->container->findDefinition($id))
) {
foreach ($this->getClasses($def, $cId) as $class) {
$this->collectLineage($class, $lineage);
}
}
}

foreach (array_diff_key(array_flip($lineage), $this->inlinedRequires) as $file => $class) {
$code .= \sprintf("        include_once %s;\n", $file);
}
}

foreach ($this->inlinedDefinitions as $def) {
if ($file = $def->getFile()) {
$file = $this->dumpValue($file);
$file = '(' === $file[0] ? substr($file, 1, -1) : $file;
$code .= \sprintf("        include_once %s;\n", $file);
}
}

if ('' !== $code) {
$code .= "\n";
}

return $code;
}





private function addServiceInstance(string $id, Definition $definition, bool $isSimpleInstance): string
{
$class = $this->dumpValue($definition->getClass());

if (str_starts_with($class, "'") && !str_contains($class, '$') && !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
throw new InvalidArgumentException(\sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
}

$asGhostObject = false;
$isProxyCandidate = $this->isProxyCandidate($definition, $asGhostObject, $id);
$instantiation = '';

$lastWitherIndex = null;
foreach ($definition->getMethodCalls() as $k => $call) {
if ($call[2] ?? false) {
$lastWitherIndex = $k;
}
}

if (!$isProxyCandidate && $definition->isShared() && !isset($this->singleUsePrivateIds[$id]) && null === $lastWitherIndex) {
$instantiation = \sprintf('$container->%s[%s] = %s', $this->container->getDefinition($id)->isPublic() ? 'services' : 'privates', $this->doExport($id), $isSimpleInstance ? '' : '$instance');
} elseif (!$isSimpleInstance) {
$instantiation = '$instance';
}

$return = '';
if ($isSimpleInstance) {
$return = 'return ';
} else {
$instantiation .= ' = ';
}

return $this->addNewInstance($definition, '        '.$return.$instantiation, $id, $asGhostObject);
}

private function isTrivialInstance(Definition $definition): bool
{
if ($definition->hasErrors()) {
return true;
}
if ($definition->isSynthetic() || $definition->getFile() || $definition->getMethodCalls() || $definition->getProperties() || $definition->getConfigurator()) {
return false;
}
if ($definition->isDeprecated() || $definition->isLazy() || $definition->getFactory() || 3 < \count($definition->getArguments())) {
return false;
}

foreach ($definition->getArguments() as $arg) {
if (!$arg || $arg instanceof Parameter) {
continue;
}
if (\is_array($arg) && 3 >= \count($arg)) {
foreach ($arg as $k => $v) {
if ($this->dumpValue($k) !== $this->dumpValue($k, false)) {
return false;
}
if (!$v || $v instanceof Parameter) {
continue;
}
if ($v instanceof Reference && $this->container->has($id = (string) $v) && $this->container->findDefinition($id)->isSynthetic()) {
continue;
}
if (!\is_scalar($v) || $this->dumpValue($v) !== $this->dumpValue($v, false)) {
return false;
}
}
} elseif ($arg instanceof Reference && $this->container->has($id = (string) $arg) && $this->container->findDefinition($id)->isSynthetic()) {
continue;
} elseif (!\is_scalar($arg) || $this->dumpValue($arg) !== $this->dumpValue($arg, false)) {
return false;
}
}

return true;
}

private function addServiceMethodCalls(Definition $definition, string $variableName, ?string $sharedNonLazyId): string
{
$lastWitherIndex = null;
foreach ($definition->getMethodCalls() as $k => $call) {
if ($call[2] ?? false) {
$lastWitherIndex = $k;
}
}

$calls = '';
foreach ($definition->getMethodCalls() as $k => $call) {
$arguments = [];
foreach ($call[1] as $i => $value) {
$arguments[] = (\is_string($i) ? $i.': ' : '').$this->dumpValue($value);
}

$witherAssignation = '';

if ($call[2] ?? false) {
if (null !== $sharedNonLazyId && $lastWitherIndex === $k && 'instance' === $variableName) {
$witherAssignation = \sprintf('$container->%s[\'%s\'] = ', $definition->isPublic() ? 'services' : 'privates', $sharedNonLazyId);
}
$witherAssignation .= \sprintf('$%s = ', $variableName);
}

$calls .= $this->wrapServiceConditionals($call[1], \sprintf("        %s\$%s->%s(%s);\n", $witherAssignation, $variableName, $call[0], implode(', ', $arguments)));
}

return $calls;
}

private function addServiceProperties(Definition $definition, string $variableName = 'instance'): string
{
$code = '';
foreach ($definition->getProperties() as $name => $value) {
$code .= \sprintf("        \$%s->%s = %s;\n", $variableName, $name, $this->dumpValue($value));
}

return $code;
}

private function addServiceConfigurator(Definition $definition, string $variableName = 'instance'): string
{
if (!$callable = $definition->getConfigurator()) {
return '';
}

if (\is_array($callable)) {
if ($callable[0] instanceof Reference
|| ($callable[0] instanceof Definition && $this->definitionVariables->offsetExists($callable[0]))
) {
return \sprintf("        %s->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
}

$class = $this->dumpValue($callable[0]);

if (str_starts_with($class, "'") && !str_contains($class, '$')) {
return \sprintf("        %s::%s(\$%s);\n", $this->dumpLiteralClass($class), $callable[1], $variableName);
}

if (str_starts_with($class, 'new ')) {
return \sprintf("        (%s)->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
}

return \sprintf("        [%s, '%s'](\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
}

return \sprintf("        %s(\$%s);\n", $callable, $variableName);
}

private function addService(string $id, Definition $definition): array
{
$this->definitionVariables = new \SplObjectStorage();
$this->referenceVariables = [];
$this->variableCount = 0;
$this->referenceVariables[$id] = new Variable('instance');

$return = [];

if ($class = $definition->getClass()) {
$class = $class instanceof Parameter ? '%'.$class.'%' : $this->container->resolveEnvPlaceholders($class);
$return[] = \sprintf(str_starts_with($class, '%') ? '@return object A %1$s instance' : '@return \%s', ltrim($class, '\\'));
} elseif ($factory = $definition->getFactory()) {
if (\is_string($factory) && !str_starts_with($factory, '@=')) {
$return[] = \sprintf('@return object An instance returned by %s()', $factory);
} elseif (\is_array($factory) && (\is_string($factory[0]) || $factory[0] instanceof Definition || $factory[0] instanceof Reference)) {
$class = $factory[0] instanceof Definition ? $factory[0]->getClass() : (string) $factory[0];
$class = $class instanceof Parameter ? '%'.$class.'%' : $this->container->resolveEnvPlaceholders($class);
$return[] = \sprintf('@return object An instance returned by %s::%s()', $class, $factory[1]);
}
}

if ($definition->isDeprecated()) {
if ($return && str_starts_with($return[\count($return) - 1], '@return')) {
$return[] = '';
}

$deprecation = $definition->getDeprecation($id);
$return[] = \sprintf('@deprecated %s', ($deprecation['package'] || $deprecation['version'] ? "Since {$deprecation['package']} {$deprecation['version']}: " : '').$deprecation['message']);
}

$return = str_replace("\n     * \n", "\n     *\n", implode("\n     * ", $return));
$return = $this->container->resolveEnvPlaceholders($return);

$shared = $definition->isShared() ? ' shared' : '';
$public = $definition->isPublic() ? 'public' : 'private';
$autowired = $definition->isAutowired() ? ' autowired' : '';
$asFile = $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition);
$methodName = $this->generateMethodName($id);

if ($asFile || $definition->isLazy()) {
$lazyInitialization = ', $lazyLoad = true';
} else {
$lazyInitialization = '';
}

$code = <<<EOF

    /*{$this->docStar}
     * Gets the $public '$id'$shared$autowired service.
     *
     * $return
EOF;
$code = str_replace('*/', ' ', $code).<<<EOF

     */
    protected static function {$methodName}(\$container$lazyInitialization)
    {

EOF;

if ($asFile) {
$file = $methodName.'.php';
$code = str_replace("protected static function {$methodName}(", 'public static function do(', $code);
} else {
$file = null;
}

if ($definition->hasErrors() && $e = $definition->getErrors()) {
$code .= \sprintf("        throw new RuntimeException(%s);\n", $this->export(reset($e)));
} else {
$this->serviceCalls = [];
$this->inlinedDefinitions = $this->getDefinitionsFromArguments([$definition], null, $this->serviceCalls);

if ($definition->isDeprecated()) {
$deprecation = $definition->getDeprecation($id);
$code .= \sprintf("        trigger_deprecation(%s, %s, %s);\n\n", $this->export($deprecation['package']), $this->export($deprecation['version']), $this->export($deprecation['message']));
} elseif ($definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1])) {
foreach ($this->inlinedDefinitions as $def) {
foreach ($this->getClasses($def, $id) as $class) {
$this->preload[$class] = $class;
}
}
}

if (!$definition->isShared()) {
$factory = \sprintf('$container->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id));
}

$asGhostObject = false;
if ($isProxyCandidate = $this->isProxyCandidate($definition, $asGhostObject, $id)) {
$definition = $isProxyCandidate;

if (!$definition->isShared()) {
$code .= \sprintf('        %s ??= ', $factory);

if ($definition->isPublic()) {
$code .= \sprintf("fn () => self::%s(\$container);\n\n", $asFile ? 'do' : $methodName);
} else {
$code .= \sprintf("self::%s(...);\n\n", $asFile ? 'do' : $methodName);
}
}
$lazyLoad = $asGhostObject ? '$proxy' : 'false';

$factoryCode = $asFile ? \sprintf('self::do($container, %s)', $lazyLoad) : \sprintf('self::%s($container, %s)', $methodName, $lazyLoad);
$code .= $this->getProxyDumper()->getProxyFactoryCode($definition, $id, $factoryCode);
}

$c = $this->addServiceInclude($id, $definition, null !== $isProxyCandidate);

if ('' !== $c && $isProxyCandidate && !$definition->isShared()) {
$c = implode("\n", array_map(fn ($line) => $line ? '    '.$line : $line, explode("\n", $c)));
$code .= "        static \$include = true;\n\n";
$code .= "        if (\$include) {\n";
$code .= $c;
$code .= "            \$include = false;\n";
$code .= "        }\n\n";
} else {
$code .= $c;
}

$c = $this->addInlineService($id, $definition);

if (!$isProxyCandidate && !$definition->isShared()) {
$c = implode("\n", array_map(fn ($line) => $line ? '    '.$line : $line, explode("\n", $c)));
$lazyloadInitialization = $definition->isLazy() ? ', $lazyLoad = true' : '';

$c = \sprintf("        %s = function (\$container%s) {\n%s        };\n\n        return %1\$s(\$container);\n", $factory, $lazyloadInitialization, $c);
}

$code .= $c;
}

$code .= "    }\n";

$this->definitionVariables = $this->inlinedDefinitions = null;
$this->referenceVariables = $this->serviceCalls = null;

return [$file, $code];
}

private function addInlineVariables(string $id, Definition $definition, array $arguments, bool $forConstructor): string
{
$code = '';

foreach ($arguments as $argument) {
if (\is_array($argument)) {
$code .= $this->addInlineVariables($id, $definition, $argument, $forConstructor);
} elseif ($argument instanceof Reference) {
$code .= $this->addInlineReference($id, $definition, $argument, $forConstructor);
} elseif ($argument instanceof Definition) {
$code .= $this->addInlineService($id, $definition, $argument, $forConstructor);
}
}

return $code;
}

private function addInlineReference(string $id, Definition $definition, string $targetId, bool $forConstructor): string
{
while ($this->container->hasAlias($targetId)) {
$targetId = (string) $this->container->getAlias($targetId);
}

[$callCount, $behavior] = $this->serviceCalls[$targetId];

if ($id === $targetId) {
return $this->addInlineService($id, $definition, $definition);
}

if ('service_container' === $targetId || isset($this->referenceVariables[$targetId])) {
return '';
}

if ($this->container->hasDefinition($targetId) && ($def = $this->container->getDefinition($targetId)) && !$def->isShared()) {
return '';
}

$hasSelfRef = isset($this->circularReferences[$id][$targetId]) && !isset($this->definitionVariables[$definition]) && !($this->hasProxyDumper && $definition->isLazy());

if ($hasSelfRef && !$forConstructor && !$forConstructor = !$this->circularReferences[$id][$targetId]) {
$code = $this->addInlineService($id, $definition, $definition);
} else {
$code = '';
}

if (isset($this->referenceVariables[$targetId]) || (2 > $callCount && (!$hasSelfRef || !$forConstructor))) {
return $code;
}

$name = $this->getNextVariableName();
$this->referenceVariables[$targetId] = new Variable($name);

$reference = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $behavior ? new Reference($targetId, $behavior) : null;
$code .= \sprintf("        \$%s = %s;\n", $name, $this->getServiceCall($targetId, $reference));

if (!$hasSelfRef || !$forConstructor) {
return $code;
}

$code .= \sprintf(<<<'EOTXT'

        if (isset($container->%s[%s])) {
            return $container->%1$s[%2$s];
        }

EOTXT
,
$this->container->getDefinition($id)->isPublic() ? 'services' : 'privates',
$this->doExport($id)
);

return $code;
}

private function addInlineService(string $id, Definition $definition, ?Definition $inlineDef = null, bool $forConstructor = true): string
{
$code = '';

if ($isSimpleInstance = $isRootInstance = null === $inlineDef) {
foreach ($this->serviceCalls as $targetId => [$callCount, $behavior, $byConstructor]) {
if ($byConstructor && isset($this->circularReferences[$id][$targetId]) && !$this->circularReferences[$id][$targetId] && !($this->hasProxyDumper && $definition->isLazy())) {
$code .= $this->addInlineReference($id, $definition, $targetId, $forConstructor);
}
}
}

if (isset($this->definitionVariables[$inlineDef ??= $definition])) {
return $code;
}

$arguments = [$inlineDef->getArguments(), $inlineDef->getFactory()];

$code .= $this->addInlineVariables($id, $definition, $arguments, $forConstructor);

if ($arguments = array_filter([$inlineDef->getProperties(), $inlineDef->getMethodCalls(), $inlineDef->getConfigurator()])) {
$isSimpleInstance = false;
} elseif ($definition !== $inlineDef && 2 > $this->inlinedDefinitions[$inlineDef]) {
return $code;
}

$asGhostObject = false;
$isProxyCandidate = $this->isProxyCandidate($inlineDef, $asGhostObject, $id);

if (isset($this->definitionVariables[$inlineDef])) {
$isSimpleInstance = false;
} else {
$name = $definition === $inlineDef ? 'instance' : $this->getNextVariableName();
$this->definitionVariables[$inlineDef] = new Variable($name);
$code .= '' !== $code ? "\n" : '';

if ('instance' === $name) {
$code .= $this->addServiceInstance($id, $definition, $isSimpleInstance);
} else {
$code .= $this->addNewInstance($inlineDef, '        $'.$name.' = ', $id);
}

if ('' !== $inline = $this->addInlineVariables($id, $definition, $arguments, false)) {
$code .= "\n".$inline."\n";
} elseif ($arguments && 'instance' === $name) {
$code .= "\n";
}

$code .= $this->addServiceProperties($inlineDef, $name);
$code .= $this->addServiceMethodCalls($inlineDef, $name, !$isProxyCandidate && $inlineDef->isShared() && !isset($this->singleUsePrivateIds[$id]) ? $id : null);
$code .= $this->addServiceConfigurator($inlineDef, $name);
}

if (!$isRootInstance || $isSimpleInstance) {
return $code;
}

return $code."\n        return \$instance;\n";
}

private function addServices(?array &$services = null): string
{
$publicServices = $privateServices = '';
$definitions = $this->container->getDefinitions();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if (!$definition->isSynthetic()) {
$services[$id] = $this->addService($id, $definition);
} elseif ($definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1])) {
$services[$id] = null;

foreach ($this->getClasses($definition, $id) as $class) {
$this->preload[$class] = $class;
}
}
}

foreach ($definitions as $id => $definition) {
if (!([$file, $code] = $services[$id]) || null !== $file) {
continue;
}
if ($definition->isPublic()) {
$publicServices .= $code;
} elseif (!$this->isTrivialInstance($definition) || isset($this->locatedIds[$id])) {
$privateServices .= $code;
}
}

return $publicServices.$privateServices;
}

private function generateServiceFiles(array $services): iterable
{
$definitions = $this->container->getDefinitions();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if (([$file, $code] = $services[$id]) && null !== $file && ($definition->isPublic() || !$this->isTrivialInstance($definition) || isset($this->locatedIds[$id]))) {
yield $file => [$code, $definition->hasTag($this->hotPathTag) || !$definition->hasTag($this->preloadTags[1]) && !$definition->isDeprecated() && !$definition->hasErrors()];
}
}
}

private function addNewInstance(Definition $definition, string $return = '', ?string $id = null, bool $asGhostObject = false): string
{
$tail = $return ? str_repeat(')', substr_count($return, '(') - substr_count($return, ')')).";\n" : '';

if (BaseServiceLocator::class === $definition->getClass() && $definition->hasTag($this->serviceLocatorTag)) {
$arguments = [];
foreach ($definition->getArgument(0) as $k => $argument) {
$arguments[$k] = $argument->getValues()[0];
}

return $return.$this->dumpValue(new ServiceLocatorArgument($arguments)).$tail;
}

$arguments = [];
foreach ($definition->getArguments() as $i => $value) {
$arguments[] = (\is_string($i) ? $i.': ' : '').$this->dumpValue($value);
}

if ($callable = $definition->getFactory()) {
if ('current' === $callable && [0] === array_keys($definition->getArguments()) && \is_array($value) && [0] === array_keys($value)) {
return $return.$this->dumpValue($value[0]).$tail;
}

if (['Closure', 'fromCallable'] === $callable) {
$callable = $definition->getArgument(0);
if ($callable instanceof ServiceClosureArgument) {
return $return.$this->dumpValue($callable).$tail;
}

$arguments = ['...'];

if ($callable instanceof Reference || $callable instanceof Definition) {
$callable = [$callable, '__invoke'];
}
}

if (\is_string($callable) && str_starts_with($callable, '@=')) {
return $return.\sprintf('(($args = %s) ? (%s) : null)',
$this->dumpValue(new ServiceLocatorArgument($definition->getArguments())),
$this->getExpressionLanguage()->compile(substr($callable, 2), ['container' => 'container', 'args' => 'args'])
).$tail;
}

if (!\is_array($callable)) {
return $return.\sprintf('%s(%s)', $this->dumpLiteralClass($this->dumpValue($callable)), $arguments ? implode(', ', $arguments) : '').$tail;
}

if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $callable[1])) {
throw new RuntimeException(\sprintf('Cannot dump definition because of invalid factory method (%s).', $callable[1] ?: 'n/a'));
}

if (['...'] === $arguments && ('Closure' !== ($class = $definition->getClass() ?: 'Closure') || $definition->isLazy() && (
$callable[0] instanceof Reference
|| ($callable[0] instanceof Definition && !$this->definitionVariables->offsetExists($callable[0]))
))) {
$initializer = 'fn () => '.$this->dumpValue($callable[0]);

return $return.LazyClosure::getCode($initializer, $callable, $class, $this->container, $id).$tail;
}

if ($callable[0] instanceof Reference
|| ($callable[0] instanceof Definition && $this->definitionVariables->offsetExists($callable[0]))
) {
return $return.\sprintf('%s->%s(%s)', $this->dumpValue($callable[0]), $callable[1], $arguments ? implode(', ', $arguments) : '').$tail;
}

$class = $this->dumpValue($callable[0]);

if (str_starts_with($class, "'") && !str_contains($class, '$')) {
if ("''" === $class) {
throw new RuntimeException(\sprintf('Cannot dump definition: "%s" service is defined to be created by a factory but is missing the service reference, did you forget to define the factory service id or class?', $id ? 'The "'.$id.'"' : 'inline'));
}

return $return.\sprintf('%s::%s(%s)', $this->dumpLiteralClass($class), $callable[1], $arguments ? implode(', ', $arguments) : '').$tail;
}

if (str_starts_with($class, 'new ')) {
return $return.\sprintf('(%s)->%s(%s)', $class, $callable[1], $arguments ? implode(', ', $arguments) : '').$tail;
}

return $return.\sprintf("[%s, '%s'](%s)", $class, $callable[1], $arguments ? implode(', ', $arguments) : '').$tail;
}

if (null === $class = $definition->getClass()) {
throw new RuntimeException('Cannot dump definitions which have no class nor factory.');
}

if (!$asGhostObject) {
return $return.\sprintf('new %s(%s)', $this->dumpLiteralClass($this->dumpValue($class)), implode(', ', $arguments)).$tail;
}

if (!method_exists($this->container->getParameterBag()->resolveValue($class), '__construct')) {
return $return.'$lazyLoad'.$tail;
}

return $return.\sprintf('($lazyLoad->__construct(%s) && false ?: $lazyLoad)', implode(', ', $arguments)).$tail;
}

private function startClass(string $class, string $baseClass, bool $hasProxyClasses): string
{
$namespaceLine = !$this->asFiles && $this->namespace ? "\nnamespace {$this->namespace};\n" : '';

$code = <<<EOF
<?php
$namespaceLine
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

/*{$this->docStar}
 * @internal This class has been auto-generated by the Symfony Dependency Injection Component.
 */
class $class extends $baseClass
{
    private const DEPRECATED_PARAMETERS = [];

    protected \$parameters = [];

    public function __construct()
    {

EOF;
$code = str_replace("    private const DEPRECATED_PARAMETERS = [];\n\n", $this->addDeprecatedParameters(), $code);
if ($this->asFiles) {
$code = str_replace('__construct()', '__construct(private array $buildParameters = [], protected string $containerDir = __DIR__)', $code);

if (null !== $this->targetDirRegex) {
$code = str_replace('$parameters = []', "\$targetDir;\n    protected \$parameters = []", $code);
$code .= '        $this->targetDir = \\dirname($containerDir);'."\n";
}
}

if (Container::class !== $this->baseClass) {
$r = $this->container->getReflectionClass($this->baseClass, false);
if (null !== $r
&& (null !== $constructor = $r->getConstructor())
&& 0 === $constructor->getNumberOfRequiredParameters()
&& Container::class !== $constructor->getDeclaringClass()->name
) {
$code .= "        parent::__construct();\n";
$code .= "        \$this->parameterBag = null;\n\n";
}
}

if ($this->container->getParameterBag()->all()) {
$code .= "        \$this->parameters = \$this->getDefaultParameters();\n\n";
}
$code .= "        \$this->services = \$this->privates = [];\n";

$code .= $this->addSyntheticIds();
$code .= $this->addMethodMap();
$code .= $this->asFiles && !$this->inlineFactories ? $this->addFileMap() : '';
$code .= $this->addAliases();
$code .= $this->addInlineRequires($hasProxyClasses);
$code .= <<<EOF
    }

    public function compile(): void
    {
        throw new LogicException('You cannot compile a dumped container that was already compiled.');
    }

    public function isCompiled(): bool
    {
        return true;
    }

EOF;
$code .= $this->addRemovedIds();

if ($this->asFiles && !$this->inlineFactories) {
$code .= <<<'EOF'

    protected function load($file, $lazyLoad = true): mixed
    {
        if (class_exists($class = __NAMESPACE__.'\\'.$file, false)) {
            return $class::do($this, $lazyLoad);
        }

        if ('.' === $file[-4]) {
            $class = substr($class, 0, -4);
        } else {
            $file .= '.php';
        }

        $service = require $this->containerDir.\DIRECTORY_SEPARATOR.$file;

        return class_exists($class, false) ? $class::do($this, $lazyLoad) : $service;
    }

EOF;
}

foreach ($this->container->getDefinitions() as $definition) {
if (!$definition->isLazy() || !$this->hasProxyDumper) {
continue;
}

if ($this->asFiles && !$this->inlineFactories) {
$proxyLoader = "class_exists(\$class, false) || require __DIR__.'/'.\$class.'.php';\n\n        ";
} else {
$proxyLoader = '';
}

$code .= <<<EOF

    protected function createProxy(\$class, \Closure \$factory)
    {
        {$proxyLoader}return \$factory();
    }

EOF;
break;
}

return $code;
}

private function addSyntheticIds(): string
{
$code = '';
$definitions = $this->container->getDefinitions();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if ($definition->isSynthetic() && 'service_container' !== $id) {
$code .= '            '.$this->doExport($id)." => true,\n";
}
}

return $code ? "        \$this->syntheticIds = [\n{$code}        ];\n" : '';
}

private function addRemovedIds(): string
{
$ids = $this->container->getRemovedIds();
foreach ($this->container->getDefinitions() as $id => $definition) {
if (!$definition->isPublic()) {
$ids[$id] = true;
}
}
if (!$ids) {
return '';
}
if ($this->asFiles) {
$code = "require \$this->containerDir.\\DIRECTORY_SEPARATOR.'removed-ids.php'";
} else {
$code = '';
$ids = array_keys($ids);
sort($ids);
foreach ($ids as $id) {
if (preg_match(FileLoader::ANONYMOUS_ID_REGEXP, $id)) {
continue;
}
$code .= '            '.$this->doExport($id)." => true,\n";
}

$code = "[\n{$code}        ]";
}

return <<<EOF

    public function getRemovedIds(): array
    {
        return {$code};
    }

EOF;
}

private function addDeprecatedParameters(): string
{
if (!($bag = $this->container->getParameterBag()) instanceof ParameterBag) {
return '';
}

if (!$deprecated = $bag->allDeprecated()) {
return '';
}
$code = '';
ksort($deprecated);
foreach ($deprecated as $param => $deprecation) {
$code .= '        '.$this->doExport($param).' => ['.implode(', ', array_map($this->doExport(...), $deprecation))."],\n";
}

return "    private const DEPRECATED_PARAMETERS = [\n{$code}    ];\n\n";
}

private function addMethodMap(): string
{
$code = '';
$definitions = $this->container->getDefinitions();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if (!$definition->isSynthetic() && $definition->isPublic() && (!$this->asFiles || $this->inlineFactories || $this->isHotPath($definition))) {
$code .= '            '.$this->doExport($id).' => '.$this->doExport($this->generateMethodName($id)).",\n";
}
}

$aliases = $this->container->getAliases();
foreach ($aliases as $alias => $id) {
if (!$id->isDeprecated()) {
continue;
}
$code .= '            '.$this->doExport($alias).' => '.$this->doExport($this->generateMethodName($alias)).",\n";
}

return $code ? "        \$this->methodMap = [\n{$code}        ];\n" : '';
}

private function addFileMap(): string
{
$code = '';
$definitions = $this->container->getDefinitions();
ksort($definitions);
foreach ($definitions as $id => $definition) {
if (!$definition->isSynthetic() && $definition->isPublic() && !$this->isHotPath($definition)) {
$code .= \sprintf("            %s => '%s',\n", $this->doExport($id), $this->generateMethodName($id));
}
}

return $code ? "        \$this->fileMap = [\n{$code}        ];\n" : '';
}

private function addAliases(): string
{
if (!$aliases = $this->container->getAliases()) {
return "\n        \$this->aliases = [];\n";
}

$code = "        \$this->aliases = [\n";
ksort($aliases);
foreach ($aliases as $alias => $id) {
if ($id->isDeprecated()) {
continue;
}

$id = (string) $id;
while (isset($aliases[$id])) {
$id = (string) $aliases[$id];
}
$code .= '            '.$this->doExport($alias).' => '.$this->doExport($id).",\n";
}

return $code."        ];\n";
}

private function addDeprecatedAliases(): string
{
$code = '';
$aliases = $this->container->getAliases();
foreach ($aliases as $alias => $definition) {
if (!$definition->isDeprecated()) {
continue;
}
$public = $definition->isPublic() ? 'public' : 'private';
$id = (string) $definition;
$methodNameAlias = $this->generateMethodName($alias);
$idExported = $this->export($id);
$deprecation = $definition->getDeprecation($alias);
$packageExported = $this->export($deprecation['package']);
$versionExported = $this->export($deprecation['version']);
$messageExported = $this->export($deprecation['message']);
$code .= <<<EOF

    /*{$this->docStar}
     * Gets the $public '$alias' alias.
     *
     * @return object The "$id" service.
     */
    protected static function {$methodNameAlias}(\$container)
    {
        trigger_deprecation($packageExported, $versionExported, $messageExported);

        return \$container->get($idExported);
    }

EOF;
}

return $code;
}

private function addInlineRequires(bool $hasProxyClasses): string
{
$lineage = [];
$hotPathServices = $this->hotPathTag && $this->inlineRequires ? $this->container->findTaggedServiceIds($this->hotPathTag) : [];

foreach ($hotPathServices as $id => $tags) {
$definition = $this->container->getDefinition($id);

if ($definition->isLazy() && $this->hasProxyDumper) {
continue;
}

$inlinedDefinitions = $this->getDefinitionsFromArguments([$definition]);

foreach ($inlinedDefinitions as $def) {
foreach ($this->getClasses($def, $id) as $class) {
$this->collectLineage($class, $lineage);
}
}
}

$code = '';

foreach ($lineage as $file) {
if (!isset($this->inlinedRequires[$file])) {
$this->inlinedRequires[$file] = true;
$code .= \sprintf("\n            include_once %s;", $file);
}
}

if ($hasProxyClasses) {
$code .= "\n            include_once __DIR__.'/proxy-classes.php';";
}

return $code ? \sprintf("\n        \$this->privates['service_container'] = static function (\$container) {%s\n        };\n", $code) : '';
}

private function addDefaultParametersMethod(): string
{
if (!$this->container->getParameterBag()->all()) {
return '';
}

$php = [];
$dynamicPhp = [];

foreach ($this->container->getParameterBag()->all() as $key => $value) {
if ($key !== $resolvedKey = $this->container->resolveEnvPlaceholders($key)) {
throw new InvalidArgumentException(\sprintf('Parameter name cannot use env parameters: "%s".', $resolvedKey));
}
$hasEnum = false;
$export = $this->exportParameters([$value], '', 12, $hasEnum);
$export = explode('0 => ', substr(rtrim($export, " ]\n"), 2, -1), 2);

if ($hasEnum || preg_match("/\\\$container->(?:getEnv\('(?:[-.\w\\\\]*+:)*+\w*+'\)|targetDir\.'')/", $export[1])) {
$dynamicPhp[$key] = \sprintf('%s%s => %s,', $export[0], $this->export($key), $export[1]);
$this->dynamicParameters[$key] = true;
} else {
$php[] = \sprintf('%s%s => %s,', $export[0], $this->export($key), $export[1]);
}
}
$parameters = \sprintf("[\n%s\n%s]", implode("\n", $php), str_repeat(' ', 8));

$code = <<<'EOF'

    public function getParameter(string $name): array|bool|string|int|float|\UnitEnum|null
    {
        if (isset(self::DEPRECATED_PARAMETERS[$name])) {
            trigger_deprecation(...self::DEPRECATED_PARAMETERS[$name]);
        }

        if (isset($this->buildParameters[$name])) {
            return $this->buildParameters[$name];
        }

        if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters))) {
            throw new ParameterNotFoundException($name);
        }
        if (isset($this->loadedDynamicParameters[$name])) {
            return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
        }

        return $this->parameters[$name];
    }

    public function hasParameter(string $name): bool
    {
        if (isset($this->buildParameters[$name])) {
            return true;
        }

        return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters);
    }

    public function setParameter(string $name, $value): void
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }

    public function getParameterBag(): ParameterBagInterface
    {
        if (!isset($this->parameterBag)) {
            $parameters = $this->parameters;
            foreach ($this->loadedDynamicParameters as $name => $loaded) {
                $parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
            }
            foreach ($this->buildParameters as $name => $value) {
                $parameters[$name] = $value;
            }
            $this->parameterBag = new FrozenParameterBag($parameters, self::DEPRECATED_PARAMETERS);
        }

        return $this->parameterBag;
    }

EOF;

if (!$this->asFiles) {
$code = preg_replace('/^.*buildParameters.*\n.*\n.*\n\n?/m', '', $code);
}

if (!($bag = $this->container->getParameterBag()) instanceof ParameterBag || !$bag->allDeprecated()) {
$code = preg_replace("/\n.*DEPRECATED_PARAMETERS.*\n.*\n.*\n/m", '', $code, 1);
$code = str_replace(', self::DEPRECATED_PARAMETERS', '', $code);
}

if ($dynamicPhp) {
$loadedDynamicParameters = $this->exportParameters(array_combine(array_keys($dynamicPhp), array_fill(0, \count($dynamicPhp), false)), '', 8);
$getDynamicParameter = <<<'EOF'
        $container = $this;
        $value = match ($name) {
%s
            default => throw new ParameterNotFoundException($name),
        };
        $this->loadedDynamicParameters[$name] = true;

        return $this->dynamicParameters[$name] = $value;
EOF;
$getDynamicParameter = \sprintf($getDynamicParameter, implode("\n", $dynamicPhp));
} else {
$loadedDynamicParameters = '[]';
$getDynamicParameter = str_repeat(' ', 8).'throw new ParameterNotFoundException($name);';
}

$code .= <<<EOF

    private \$loadedDynamicParameters = {$loadedDynamicParameters};
    private \$dynamicParameters = [];

    private function getDynamicParameter(string \$name)
    {
{$getDynamicParameter}
    }

    protected function getDefaultParameters(): array
    {
        return $parameters;
    }

EOF;

return $code;
}




private function exportParameters(array $parameters, string $path = '', int $indent = 12, bool &$hasEnum = false): string
{
$php = [];
foreach ($parameters as $key => $value) {
if (\is_array($value)) {
$value = $this->exportParameters($value, $path.'/'.$key, $indent + 4, $hasEnum);
} elseif ($value instanceof ArgumentInterface) {
throw new InvalidArgumentException(\sprintf('You cannot dump a container with parameters that contain special arguments. "%s" found in "%s".', get_debug_type($value), $path.'/'.$key));
} elseif ($value instanceof Variable) {
throw new InvalidArgumentException(\sprintf('You cannot dump a container with parameters that contain variable references. Variable "%s" found in "%s".', $value, $path.'/'.$key));
} elseif ($value instanceof Definition) {
throw new InvalidArgumentException(\sprintf('You cannot dump a container with parameters that contain service definitions. Definition for "%s" found in "%s".', $value->getClass(), $path.'/'.$key));
} elseif ($value instanceof Reference) {
throw new InvalidArgumentException(\sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key));
} elseif ($value instanceof Expression) {
throw new InvalidArgumentException(\sprintf('You cannot dump a container with parameters that contain expressions. Expression "%s" found in "%s".', $value, $path.'/'.$key));
} elseif ($value instanceof \UnitEnum) {
$hasEnum = true;
$value = \sprintf('\%s::%s', $value::class, $value->name);
} else {
$value = $this->export($value);
}

$php[] = \sprintf('%s%s => %s,', str_repeat(' ', $indent), $this->export($key), $value);
}

return \sprintf("[\n%s\n%s]", implode("\n", $php), str_repeat(' ', $indent - 4));
}

private function endClass(): string
{
return <<<'EOF'
}

EOF;
}

private function wrapServiceConditionals(mixed $value, string $code): string
{
if (!$condition = $this->getServiceConditionals($value)) {
return $code;
}


$code = implode("\n", array_map(fn ($line) => $line ? '    '.$line : $line, explode("\n", $code)));

return \sprintf("        if (%s) {\n%s        }\n", $condition, $code);
}

private function getServiceConditionals(mixed $value): string
{
$conditions = [];
foreach (ContainerBuilder::getInitializedConditionals($value) as $service) {
if (!$this->container->hasDefinition($service)) {
return 'false';
}
$conditions[] = \sprintf('isset($container->%s[%s])', $this->container->getDefinition($service)->isPublic() ? 'services' : 'privates', $this->doExport($service));
}
foreach (ContainerBuilder::getServiceConditionals($value) as $service) {
if ($this->container->hasDefinition($service) && !$this->container->getDefinition($service)->isPublic()) {
continue;
}

$conditions[] = \sprintf('$container->has(%s)', $this->doExport($service));
}

if (!$conditions) {
return '';
}

return implode(' && ', $conditions);
}

private function getDefinitionsFromArguments(array $arguments, ?\SplObjectStorage $definitions = null, array &$calls = [], ?bool $byConstructor = null): \SplObjectStorage
{
$definitions ??= new \SplObjectStorage();

foreach ($arguments as $argument) {
if (\is_array($argument)) {
$this->getDefinitionsFromArguments($argument, $definitions, $calls, $byConstructor);
} elseif ($argument instanceof Reference) {
$id = (string) $argument;

while ($this->container->hasAlias($id)) {
$id = (string) $this->container->getAlias($id);
}

if (!isset($calls[$id])) {
$calls[$id] = [0, $argument->getInvalidBehavior(), $byConstructor];
} else {
$calls[$id][1] = min($calls[$id][1], $argument->getInvalidBehavior());
}

++$calls[$id][0];
} elseif (!$argument instanceof Definition) {

} elseif (isset($definitions[$argument])) {
$definitions[$argument] = 1 + $definitions[$argument];
} else {
$definitions[$argument] = 1;
$arguments = [$argument->getArguments(), $argument->getFactory()];
$this->getDefinitionsFromArguments($arguments, $definitions, $calls, null === $byConstructor || $byConstructor);
$arguments = [$argument->getProperties(), $argument->getMethodCalls(), $argument->getConfigurator()];
$this->getDefinitionsFromArguments($arguments, $definitions, $calls, null !== $byConstructor && $byConstructor);
}
}

return $definitions;
}




private function dumpValue(mixed $value, bool $interpolate = true): string
{
if (\is_array($value)) {
if ($value && $interpolate && false !== $param = array_search($value, $this->container->getParameterBag()->all(), true)) {
return $this->dumpValue("%$param%");
}
$isList = array_is_list($value);
$code = [];
foreach ($value as $k => $v) {
$code[] = $isList ? $this->dumpValue($v, $interpolate) : \sprintf('%s => %s', $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate));
}

return \sprintf('[%s]', implode(', ', $code));
} elseif ($value instanceof ArgumentInterface) {
$scope = [$this->definitionVariables, $this->referenceVariables];
$this->definitionVariables = $this->referenceVariables = null;

try {
if ($value instanceof ServiceClosureArgument) {
$value = $value->getValues()[0];
$code = $this->dumpValue($value, $interpolate);

$returnedType = '';
if ($value instanceof TypedReference) {
$returnedType = \sprintf(': %s\%s', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $value->getInvalidBehavior() ? '' : '?', str_replace(['|', '&'], ['|\\', '&\\'], $value->getType()));
}

$attribute = '';
if ($value instanceof Reference) {
$attribute = 'name: '.$this->dumpValue((string) $value, $interpolate);

if ($this->container->hasDefinition($value) && ($class = $this->container->findDefinition($value)->getClass()) && $class !== (string) $value) {
$attribute .= ', class: '.$this->dumpValue($class, $interpolate);
}

$attribute = \sprintf('#[\Closure(%s)] ', $attribute);
}

return \sprintf('%sfn ()%s => %s', $attribute, $returnedType, $code);
}

if ($value instanceof IteratorArgument) {
if (!$values = $value->getValues()) {
return 'new RewindableGenerator(fn () => new \EmptyIterator(), 0)';
}

$code = [];
$code[] = 'new RewindableGenerator(function () use ($container) {';

$operands = [0];
foreach ($values as $k => $v) {
($c = $this->getServiceConditionals($v)) ? $operands[] = "(int) ($c)" : ++$operands[0];
$v = $this->wrapServiceConditionals($v, \sprintf("        yield %s => %s;\n", $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate)));
foreach (explode("\n", $v) as $v) {
if ($v) {
$code[] = '    '.$v;
}
}
}

$code[] = \sprintf('        }, %s)', \count($operands) > 1 ? 'fn () => '.implode(' + ', $operands) : $operands[0]);

return implode("\n", $code);
}

if ($value instanceof ServiceLocatorArgument) {
$serviceMap = '';
$serviceTypes = '';
foreach ($value->getValues() as $k => $v) {
if (!$v instanceof Reference) {
$serviceMap .= \sprintf("\n            %s => [%s],", $this->export($k), $this->dumpValue($v));
$serviceTypes .= \sprintf("\n            %s => '?',", $this->export($k));
continue;
}
$id = (string) $v;
while ($this->container->hasAlias($id)) {
$id = (string) $this->container->getAlias($id);
}
$definition = $this->container->getDefinition($id);
$load = !($definition->hasErrors() && $e = $definition->getErrors()) ? $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) : reset($e);
$serviceMap .= \sprintf("\n            %s => [%s, %s, %s, %s],",
$this->export($k),
$this->export($definition->isShared() ? ($definition->isPublic() ? 'services' : 'privates') : false),
$this->doExport($id),
$this->export(ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $v->getInvalidBehavior() && !\is_string($load) ? $this->generateMethodName($id) : null),
$this->export($load)
);
$serviceTypes .= \sprintf("\n            %s => %s,", $this->export($k), $this->export($v instanceof TypedReference ? $v->getType() : '?'));
$this->locatedIds[$id] = true;
}
$this->addGetService = true;

return \sprintf('new \%s($container->getService ??= $container->getService(...), [%s%s], [%s%s])', ServiceLocator::class, $serviceMap, $serviceMap ? "\n        " : '', $serviceTypes, $serviceTypes ? "\n        " : '');
}
} finally {
[$this->definitionVariables, $this->referenceVariables] = $scope;
}
} elseif ($value instanceof Definition) {
if ($value->hasErrors() && $e = $value->getErrors()) {
return \sprintf('throw new RuntimeException(%s)', $this->export(reset($e)));
}
if ($this->definitionVariables?->offsetExists($value)) {
return $this->dumpValue($this->definitionVariables[$value], $interpolate);
}
if ($value->getMethodCalls()) {
throw new RuntimeException('Cannot dump definitions which have method calls.');
}
if ($value->getProperties()) {
throw new RuntimeException('Cannot dump definitions which have properties.');
}
if (null !== $value->getConfigurator()) {
throw new RuntimeException('Cannot dump definitions which have a configurator.');
}

return $this->addNewInstance($value);
} elseif ($value instanceof Variable) {
return '$'.$value;
} elseif ($value instanceof Reference) {
$id = (string) $value;

while ($this->container->hasAlias($id)) {
$id = (string) $this->container->getAlias($id);
}

if (null !== $this->referenceVariables && isset($this->referenceVariables[$id])) {
return $this->dumpValue($this->referenceVariables[$id], $interpolate);
}

return $this->getServiceCall($id, $value);
} elseif ($value instanceof Expression) {
return $this->getExpressionLanguage()->compile((string) $value, ['container' => 'container']);
} elseif ($value instanceof Parameter) {
return $this->dumpParameter($value);
} elseif (true === $interpolate && \is_string($value)) {
if (preg_match('/^%([^%]+)%$/', $value, $match)) {


return $this->dumpParameter($match[1]);
} else {
$replaceParameters = fn ($match) => "'.".$this->dumpParameter($match[2]).".'";

$code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, $this->export($value)));

return $code;
}
} elseif ($value instanceof \UnitEnum) {
return \sprintf('\%s::%s', $value::class, $value->name);
} elseif ($value instanceof AbstractArgument) {
throw new RuntimeException($value->getTextWithContext());
} elseif (\is_object($value) || \is_resource($value)) {
throw new RuntimeException(\sprintf('Unable to dump a service container if a parameter is an object or a resource, got "%s".', get_debug_type($value)));
}

return $this->export($value);
}






private function dumpLiteralClass(string $class): string
{
if (str_contains($class, '$')) {
return \sprintf('${($_ = %s) && false ?: "_"}', $class);
}
if (!str_starts_with($class, "'") || !preg_match('/^\'(?:\\\{2})?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
throw new RuntimeException(\sprintf('Cannot dump definition because of invalid class name (%s).', $class ?: 'n/a'));
}

$class = substr(str_replace('\\\\', '\\', $class), 1, -1);

return str_starts_with($class, '\\') ? $class : '\\'.$class;
}

private function dumpParameter(string $name): string
{
if (!$this->container->hasParameter($name) || ($this->dynamicParameters[$name] ?? false)) {
return \sprintf('$container->getParameter(%s)', $this->doExport($name));
}

$value = $this->container->getParameter($name);
$dumpedValue = $this->dumpValue($value, false);

if (!$value || !\is_array($value)) {
return $dumpedValue;
}

return \sprintf('$container->parameters[%s]', $this->doExport($name));
}

private function getServiceCall(string $id, ?Reference $reference = null): string
{
while ($this->container->hasAlias($id)) {
$id = (string) $this->container->getAlias($id);
}

if ('service_container' === $id) {
return '$container';
}

if ($this->container->hasDefinition($id) && $definition = $this->container->getDefinition($id)) {
if ($definition->isSynthetic()) {
$code = \sprintf('$container->get(%s%s)', $this->doExport($id), null !== $reference ? ', '.$reference->getInvalidBehavior() : '');
} elseif (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) {
$code = 'null';
if (!$definition->isShared()) {
return $code;
}
} elseif ($this->isTrivialInstance($definition)) {
if ($definition->hasErrors() && $e = $definition->getErrors()) {
return \sprintf('throw new RuntimeException(%s)', $this->export(reset($e)));
}
$code = $this->addNewInstance($definition, '', $id);
if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) {
return \sprintf('($container->%s[%s] ??= %s)', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code);
}
$code = "($code)";
} else {
$code = $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) ? "\$container->load('%s')" : 'self::%s($container)';
$code = \sprintf($code, $this->generateMethodName($id));

if (!$definition->isShared()) {
$factory = \sprintf('$container->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id));
$code = \sprintf('(isset(%s) ? %1$s($container) : %s)', $factory, $code);
}
}
if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) {
$code = \sprintf('($container->%s[%s] ?? %s)', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code);
}

return $code;
}
if (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) {
return 'null';
}
if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $reference->getInvalidBehavior()) {
$code = \sprintf('$container->get(%s, ContainerInterface::NULL_ON_INVALID_REFERENCE)', $this->doExport($id));
} else {
$code = \sprintf('$container->get(%s)', $this->doExport($id));
}

return \sprintf('($container->services[%s] ?? %s)', $this->doExport($id), $code);
}




private function initializeMethodNamesMap(string $class): void
{
$this->serviceIdToMethodNameMap = [];
$this->usedMethodNames = [];

if ($reflectionClass = $this->container->getReflectionClass($class)) {
foreach ($reflectionClass->getMethods() as $method) {
$this->usedMethodNames[strtolower($method->getName())] = true;
}
}
}




private function generateMethodName(string $id): string
{
if (isset($this->serviceIdToMethodNameMap[$id])) {
return $this->serviceIdToMethodNameMap[$id];
}

$i = strrpos($id, '\\');
$name = Container::camelize(false !== $i && isset($id[1 + $i]) ? substr($id, 1 + $i) : $id);
$name = preg_replace('/[^a-zA-Z0-9_\x7f-\xff]/', '', $name);
$methodName = 'get'.$name.'Service';
$suffix = 1;

while (isset($this->usedMethodNames[strtolower($methodName)])) {
++$suffix;
$methodName = 'get'.$name.$suffix.'Service';
}

$this->serviceIdToMethodNameMap[$id] = $methodName;
$this->usedMethodNames[strtolower($methodName)] = true;

return $methodName;
}

private function getNextVariableName(): string
{
$firstChars = self::FIRST_CHARS;
$firstCharsLength = \strlen($firstChars);
$nonFirstChars = self::NON_FIRST_CHARS;
$nonFirstCharsLength = \strlen($nonFirstChars);

while (true) {
$name = '';
$i = $this->variableCount;

if ('' === $name) {
$name .= $firstChars[$i % $firstCharsLength];
$i = (int) ($i / $firstCharsLength);
}

while ($i > 0) {
--$i;
$name .= $nonFirstChars[$i % $nonFirstCharsLength];
$i = (int) ($i / $nonFirstCharsLength);
}

++$this->variableCount;


if (\in_array($name, $this->reservedVariables, true)) {
continue;
}

return $name;
}
}

private function getExpressionLanguage(): ExpressionLanguage
{
if (!isset($this->expressionLanguage)) {
if (!class_exists(\Symfony\Component\ExpressionLanguage\ExpressionLanguage::class)) {
throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed. Try running "composer require symfony/expression-language".');
}
$providers = $this->container->getExpressionLanguageProviders();
$this->expressionLanguage = new ExpressionLanguage(null, $providers, function ($arg) {
$id = '""' === substr_replace($arg, '', 1, -1) ? stripcslashes(substr($arg, 1, -1)) : null;

if (null !== $id && ($this->container->hasAlias($id) || $this->container->hasDefinition($id))) {
return $this->getServiceCall($id);
}

return \sprintf('$container->get(%s)', $arg);
});

if ($this->container->isTrackingResources()) {
foreach ($providers as $provider) {
$this->container->addObjectResource($provider);
}
}
}

return $this->expressionLanguage;
}

private function isHotPath(Definition $definition): bool
{
return $this->hotPathTag && $definition->hasTag($this->hotPathTag) && !$definition->isDeprecated();
}

private function isSingleUsePrivateNode(ServiceReferenceGraphNode $node): bool
{
if ($node->getValue()->isPublic()) {
return false;
}
$ids = [];
foreach ($node->getInEdges() as $edge) {
if (!$value = $edge->getSourceNode()->getValue()) {
continue;
}
if ($edge->isLazy() || !$value instanceof Definition || !$value->isShared()) {
return false;
}



if ($this->getProxyDumper()->isProxyCandidate($value)) {
return false;
}
$ids[$edge->getSourceNode()->getId()] = true;
}

return 1 === \count($ids);
}

private function export(mixed $value): mixed
{
if (null !== $this->targetDirRegex && \is_string($value) && preg_match($this->targetDirRegex, $value, $matches, \PREG_OFFSET_CAPTURE)) {
$suffix = $matches[0][1] + \strlen($matches[0][0]);
$matches[0][1] += \strlen($matches[1][0]);
$prefix = $matches[0][1] ? $this->doExport(substr($value, 0, $matches[0][1]), true).'.' : '';

if ('\\' === \DIRECTORY_SEPARATOR && isset($value[$suffix])) {
$cookie = '\\'.random_int(100000, \PHP_INT_MAX);
$suffix = '.'.$this->doExport(str_replace('\\', $cookie, substr($value, $suffix)), true);
$suffix = str_replace('\\'.$cookie, "'.\\DIRECTORY_SEPARATOR.'", $suffix);
} else {
$suffix = isset($value[$suffix]) ? '.'.$this->doExport(substr($value, $suffix), true) : '';
}

$dirname = $this->asFiles ? '$container->containerDir' : '__DIR__';
$offset = 2 + $this->targetDirMaxMatches - \count($matches);

if (0 < $offset) {
$dirname = \sprintf('\dirname(__DIR__, %d)', $offset + (int) $this->asFiles);
} elseif ($this->asFiles) {
$dirname = "\$container->targetDir.''"; 
}

if ($prefix || $suffix) {
return \sprintf('(%s%s%s)', $prefix, $dirname, $suffix);
}

return $dirname;
}

return $this->doExport($value, true);
}

private function doExport(mixed $value, bool $resolveEnv = false): mixed
{
$shouldCacheValue = $resolveEnv && \is_string($value);
if ($shouldCacheValue && isset($this->exportedVariables[$value])) {
return $this->exportedVariables[$value];
}
if (\is_string($value) && str_contains($value, "\n")) {
$cleanParts = explode("\n", $value);
$cleanParts = array_map(fn ($part) => var_export($part, true), $cleanParts);
$export = implode('."\n".', $cleanParts);
} else {
$export = var_export($value, true);
}

if ($resolveEnv && "'" === $export[0] && $export !== $resolvedExport = $this->container->resolveEnvPlaceholders($export, "'.\$container->getEnv('string:%s').'")) {
$export = $resolvedExport;
if (str_ends_with($export, ".''")) {
$export = substr($export, 0, -3);
if ("'" === $export[1]) {
$export = substr_replace($export, '', 23, 7);
}
}
if ("'" === $export[1]) {
$export = substr($export, 3);
}
}

if ($shouldCacheValue) {
$this->exportedVariables[$value] = $export;
}

return $export;
}

private function getAutoloadFile(): ?string
{
$file = null;

foreach (spl_autoload_functions() as $autoloader) {
if (!\is_array($autoloader)) {
continue;
}

if ($autoloader[0] instanceof DebugClassLoader) {
$autoloader = $autoloader[0]->getClassLoader();
}

if (!\is_array($autoloader) || !$autoloader[0] instanceof ClassLoader || !$autoloader[0]->findFile(__CLASS__)) {
continue;
}

foreach (get_declared_classes() as $class) {
if (str_starts_with($class, 'ComposerAutoloaderInit') && $class::getLoader() === $autoloader[0]) {
$file = \dirname((new \ReflectionClass($class))->getFileName(), 2).'/autoload.php';

if (null !== $this->targetDirRegex && preg_match($this->targetDirRegex.'A', $file)) {
return $file;
}
}
}
}

return $file;
}

private function getClasses(Definition $definition, string $id): array
{
$classes = [];

while ($definition instanceof Definition) {
foreach ($definition->getTag($this->preloadTags[0]) as $tag) {
if (!isset($tag['class'])) {
throw new InvalidArgumentException(\sprintf('Missing attribute "class" on tag "%s" for service "%s".', $this->preloadTags[0], $id));
}

$classes[] = trim($tag['class'], '\\');
}

if ($class = $definition->getClass()) {
$classes[] = trim($class, '\\');
}
$factory = $definition->getFactory();

if (\is_string($factory) && !str_starts_with($factory, '@=') && str_contains($factory, '::')) {
$factory = explode('::', $factory);
}

if (!\is_array($factory)) {
$definition = $factory;
continue;
}

$definition = $factory[0] ?? null;

if (\is_string($definition)) {
$classes[] = trim($factory[0], '\\');
}
}

return $classes;
}

private function isProxyCandidate(Definition $definition, ?bool &$asGhostObject, string $id): ?Definition
{
$asGhostObject = false;

if (['Closure', 'fromCallable'] === $definition->getFactory()) {
return null;
}

if (!$definition->isLazy() || !$this->hasProxyDumper) {
return null;
}

return $this->getProxyDumper()->isProxyCandidate($definition, $asGhostObject, $id) ? $definition : null;
}







private static function stripComments(string $source): string
{
if (!\function_exists('token_get_all')) {
return $source;
}

$rawChunk = '';
$output = '';
$tokens = token_get_all($source);
$ignoreSpace = false;
for ($i = 0; isset($tokens[$i]); ++$i) {
$token = $tokens[$i];
if (!isset($token[1]) || 'b"' === $token) {
$rawChunk .= $token;
} elseif (\T_START_HEREDOC === $token[0]) {
$output .= $rawChunk.$token[1];
do {
$token = $tokens[++$i];
$output .= isset($token[1]) && 'b"' !== $token ? $token[1] : $token;
} while (\T_END_HEREDOC !== $token[0]);
$rawChunk = '';
} elseif (\T_WHITESPACE === $token[0]) {
if ($ignoreSpace) {
$ignoreSpace = false;

continue;
}


$rawChunk .= preg_replace(['/\n{2,}/S'], "\n", $token[1]);
} elseif (\in_array($token[0], [\T_COMMENT, \T_DOC_COMMENT])) {
if (!\in_array($rawChunk[\strlen($rawChunk) - 1], [' ', "\n", "\r", "\t"], true)) {
$rawChunk .= ' ';
}
$ignoreSpace = true;
} else {
$rawChunk .= $token[1];


if (\T_OPEN_TAG === $token[0]) {
$ignoreSpace = true;
} else {
$ignoreSpace = false;
}
}
}

$output .= $rawChunk;

unset($tokens, $rawChunk);
gc_mem_caches();

return $output;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Reference;










class GraphvizDumper extends Dumper
{
private array $nodes;
private array $edges;

private array $options = [
'graph' => ['ratio' => 'compress'],
'node' => ['fontsize' => '11', 'fontname' => 'Arial', 'shape' => 'record'],
'edge' => ['fontsize' => '9', 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => '0.5'],
'node.instance' => ['fillcolor' => '#9999ff', 'style' => 'filled'],
'node.definition' => ['fillcolor' => '#eeeeee'],
'node.missing' => ['fillcolor' => '#ff9999', 'style' => 'filled'],
];













public function dump(array $options = []): string
{
foreach (['graph', 'node', 'edge', 'node.instance', 'node.definition', 'node.missing'] as $key) {
if (isset($options[$key])) {
$this->options[$key] = array_merge($this->options[$key], $options[$key]);
}
}

$this->nodes = $this->findNodes();

$this->edges = [];
foreach ($this->container->getDefinitions() as $id => $definition) {
$this->edges[$id] = array_merge(
$this->findEdges($id, $definition->getArguments(), true, ''),
$this->findEdges($id, $definition->getProperties(), false, '')
);

foreach ($definition->getMethodCalls() as $call) {
$this->edges[$id] = array_merge(
$this->edges[$id],
$this->findEdges($id, $call[1], false, $call[0].'()')
);
}
}

return $this->container->resolveEnvPlaceholders($this->startDot().$this->addNodes().$this->addEdges().$this->endDot(), '__ENV_%s__');
}

private function addNodes(): string
{
$code = '';
foreach ($this->nodes as $id => $node) {
$aliases = $this->getAliases($id);

$code .= \sprintf("  node_%s [label=\"%s\\n%s\\n\", shape=%s%s];\n", $this->dotize($id), $id.($aliases ? ' ('.implode(', ', $aliases).')' : ''), $node['class'], $this->options['node']['shape'], $this->addAttributes($node['attributes']));
}

return $code;
}

private function addEdges(): string
{
$code = '';
foreach ($this->edges as $id => $edges) {
foreach ($edges as $edge) {
$code .= \sprintf("  node_%s -> node_%s [label=\"%s\" style=\"%s\"%s];\n", $this->dotize($id), $this->dotize($edge['to']), $edge['name'], $edge['required'] ? 'filled' : 'dashed', $edge['lazy'] ? ' color="#9999ff"' : '');
}
}

return $code;
}




private function findEdges(string $id, array $arguments, bool $required, string $name, bool $lazy = false): array
{
$edges = [];
foreach ($arguments as $argument) {
if ($argument instanceof Parameter) {
$argument = $this->container->hasParameter($argument) ? $this->container->getParameter($argument) : null;
} elseif (\is_string($argument) && preg_match('/^%([^%]+)%$/', $argument, $match)) {
$argument = $this->container->hasParameter($match[1]) ? $this->container->getParameter($match[1]) : null;
}

if ($argument instanceof Reference) {
$lazyEdge = $lazy;

if (!$this->container->has((string) $argument)) {
$this->nodes[(string) $argument] = ['name' => $name, 'required' => $required, 'class' => '', 'attributes' => $this->options['node.missing']];
} elseif ('service_container' !== (string) $argument) {
$lazyEdge = $lazy || $this->container->getDefinition((string) $argument)->isLazy();
}

$edges[] = [['name' => $name, 'required' => $required, 'to' => $argument, 'lazy' => $lazyEdge]];
} elseif ($argument instanceof ArgumentInterface) {
$edges[] = $this->findEdges($id, $argument->getValues(), $required, $name, true);
} elseif ($argument instanceof Definition) {
$edges[] = $this->findEdges($id, $argument->getArguments(), $required, '');
$edges[] = $this->findEdges($id, $argument->getProperties(), false, '');

foreach ($argument->getMethodCalls() as $call) {
$edges[] = $this->findEdges($id, $call[1], false, $call[0].'()');
}
} elseif (\is_array($argument)) {
$edges[] = $this->findEdges($id, $argument, $required, $name, $lazy);
}
}

return array_merge([], ...$edges);
}

private function findNodes(): array
{
$nodes = [];

$container = $this->cloneContainer();

foreach ($container->getDefinitions() as $id => $definition) {
$class = $definition->getClass();

if (str_starts_with($class, '\\')) {
$class = substr($class, 1);
}

try {
$class = $this->container->getParameterBag()->resolveValue($class);
} catch (ParameterNotFoundException) {
}

$nodes[$id] = ['class' => str_replace('\\', '\\\\', $class), 'attributes' => array_merge($this->options['node.definition'], ['style' => $definition->isShared() ? 'filled' : 'dotted'])];
$container->setDefinition($id, new Definition('stdClass'));
}

foreach ($container->getServiceIds() as $id) {
if (\array_key_exists($id, $container->getAliases())) {
continue;
}

if (!$container->hasDefinition($id)) {
$nodes[$id] = ['class' => str_replace('\\', '\\\\', $container->get($id)::class), 'attributes' => $this->options['node.instance']];
}
}

return $nodes;
}

private function cloneContainer(): ContainerBuilder
{
$parameterBag = new ParameterBag($this->container->getParameterBag()->all());

$container = new ContainerBuilder($parameterBag);
$container->setDefinitions($this->container->getDefinitions());
$container->setAliases($this->container->getAliases());
$container->setResources($this->container->getResources());
foreach ($this->container->getExtensions() as $extension) {
$container->registerExtension($extension);
}

return $container;
}

private function startDot(): string
{
return \sprintf("digraph sc {\n  %s\n  node [%s];\n  edge [%s];\n\n",
$this->addOptions($this->options['graph']),
$this->addOptions($this->options['node']),
$this->addOptions($this->options['edge'])
);
}

private function endDot(): string
{
return "}\n";
}

private function addAttributes(array $attributes): string
{
$code = [];
foreach ($attributes as $k => $v) {
$code[] = \sprintf('%s="%s"', $k, $v);
}

return $code ? ', '.implode(', ', $code) : '';
}

private function addOptions(array $options): string
{
$code = [];
foreach ($options as $k => $v) {
$code[] = \sprintf('%s="%s"', $k, $v);
}

return implode(' ', $code);
}

private function dotize(string $id): string
{
return preg_replace('/\W/i', '_', $id);
}

private function getAliases(string $id): array
{
$aliases = [];
foreach ($this->container->getAliases() as $alias => $origin) {
if ($id == $origin) {
$aliases[] = $alias;
}
}

return $aliases;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;






interface DumperInterface
{



public function dump(array $options = []): string|array;
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;







class XmlDumper extends Dumper
{
private \DOMDocument $document;




public function dump(array $options = []): string
{
$this->document = new \DOMDocument('1.0', 'utf-8');
$this->document->formatOutput = true;

$container = $this->document->createElementNS('http://symfony.com/schema/dic/services', 'container');
$container->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$container->setAttribute('xsi:schemaLocation', 'http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd');

$this->addParameters($container);
$this->addServices($container);

$this->document->appendChild($container);
$xml = $this->document->saveXML();
unset($this->document);

return $this->container->resolveEnvPlaceholders($xml);
}

private function addParameters(\DOMElement $parent): void
{
$data = $this->container->getParameterBag()->all();
if (!$data) {
return;
}

if ($this->container->isCompiled()) {
$data = $this->escape($data);
}

$parameters = $this->document->createElement('parameters');
$parent->appendChild($parameters);
$this->convertParameters($data, 'parameter', $parameters);
}

private function addMethodCalls(array $methodcalls, \DOMElement $parent): void
{
foreach ($methodcalls as $methodcall) {
$call = $this->document->createElement('call');
$call->setAttribute('method', $methodcall[0]);
if (\count($methodcall[1])) {
$this->convertParameters($methodcall[1], 'argument', $call);
}
if ($methodcall[2] ?? false) {
$call->setAttribute('returns-clone', 'true');
}
$parent->appendChild($call);
}
}

private function addService(Definition $definition, ?string $id, \DOMElement $parent): void
{
$service = $this->document->createElement('service');
if (null !== $id) {
$service->setAttribute('id', $id);
}
if ($class = $definition->getClass()) {
if (str_starts_with($class, '\\')) {
$class = substr($class, 1);
}

$service->setAttribute('class', $class);
}
if (!$definition->isShared()) {
$service->setAttribute('shared', 'false');
}
if ($definition->isPublic()) {
$service->setAttribute('public', 'true');
}
if ($definition->isSynthetic()) {
$service->setAttribute('synthetic', 'true');
}
if ($definition->isLazy()) {
$service->setAttribute('lazy', 'true');
}
if (null !== $decoratedService = $definition->getDecoratedService()) {
[$decorated, $renamedId, $priority] = $decoratedService;
$service->setAttribute('decorates', $decorated);

$decorationOnInvalid = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
if (\in_array($decorationOnInvalid, [ContainerInterface::IGNORE_ON_INVALID_REFERENCE, ContainerInterface::NULL_ON_INVALID_REFERENCE], true)) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE === $decorationOnInvalid ? 'null' : 'ignore';
$service->setAttribute('decoration-on-invalid', $invalidBehavior);
}
if (null !== $renamedId) {
$service->setAttribute('decoration-inner-name', $renamedId);
}
if (0 !== $priority) {
$service->setAttribute('decoration-priority', $priority);
}
}

$tags = $definition->getTags();
$tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
foreach ($tags as $name => $tags) {
foreach ($tags as $attributes) {
$tag = $this->document->createElement('tag');


if (array_filter($attributes, \is_array(...))) {
$tag->setAttribute('name', $name);
$this->addTagRecursiveAttributes($tag, $attributes);
} else {
if (!\array_key_exists('name', $attributes)) {
$tag->setAttribute('name', $name);
} else {
$tag->appendChild($this->document->createTextNode($name));
}
foreach ($attributes as $key => $value) {
$tag->setAttribute($key, $value ?? '');
}
}
$service->appendChild($tag);
}
}

if ($definition->getFile()) {
$file = $this->document->createElement('file');
$file->appendChild($this->document->createTextNode($definition->getFile()));
$service->appendChild($file);
}

if ($parameters = $definition->getArguments()) {
$this->convertParameters($parameters, 'argument', $service);
}

if ($parameters = $definition->getProperties()) {
$this->convertParameters($parameters, 'property', $service, 'name');
}

$this->addMethodCalls($definition->getMethodCalls(), $service);

if ($callable = $definition->getFactory()) {
if (\is_array($callable) && ['Closure', 'fromCallable'] !== $callable && $definition->getClass() === $callable[0]) {
$service->setAttribute('constructor', $callable[1]);
} else {
$factory = $this->document->createElement('factory');

if (\is_array($callable) && $callable[0] instanceof Definition) {
$this->addService($callable[0], null, $factory);
$factory->setAttribute('method', $callable[1]);
} elseif (\is_array($callable)) {
if (null !== $callable[0]) {
$factory->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]);
}
$factory->setAttribute('method', $callable[1]);
} else {
$factory->setAttribute('function', $callable);
}
$service->appendChild($factory);
}
}

if ($definition->isDeprecated()) {
$deprecation = $definition->getDeprecation('%service_id%');
$deprecated = $this->document->createElement('deprecated');
$deprecated->appendChild($this->document->createTextNode($definition->getDeprecation('%service_id%')['message']));
$deprecated->setAttribute('package', $deprecation['package']);
$deprecated->setAttribute('version', $deprecation['version']);

$service->appendChild($deprecated);
}

if ($definition->isAutowired()) {
$service->setAttribute('autowire', 'true');
}

if ($definition->isAutoconfigured()) {
$service->setAttribute('autoconfigure', 'true');
}

if ($definition->isAbstract()) {
$service->setAttribute('abstract', 'true');
}

if ($callable = $definition->getConfigurator()) {
$configurator = $this->document->createElement('configurator');

if (\is_array($callable) && $callable[0] instanceof Definition) {
$this->addService($callable[0], null, $configurator);
$configurator->setAttribute('method', $callable[1]);
} elseif (\is_array($callable)) {
$configurator->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]);
$configurator->setAttribute('method', $callable[1]);
} else {
$configurator->setAttribute('function', $callable);
}
$service->appendChild($configurator);
}

$parent->appendChild($service);
}

private function addServiceAlias(string $alias, Alias $id, \DOMElement $parent): void
{
$service = $this->document->createElement('service');
$service->setAttribute('id', $alias);
$service->setAttribute('alias', $id);
if ($id->isPublic()) {
$service->setAttribute('public', 'true');
}

if ($id->isDeprecated()) {
$deprecation = $id->getDeprecation('%alias_id%');
$deprecated = $this->document->createElement('deprecated');
$deprecated->appendChild($this->document->createTextNode($deprecation['message']));
$deprecated->setAttribute('package', $deprecation['package']);
$deprecated->setAttribute('version', $deprecation['version']);

$service->appendChild($deprecated);
}

$parent->appendChild($service);
}

private function addServices(\DOMElement $parent): void
{
$definitions = $this->container->getDefinitions();
if (!$definitions) {
return;
}

$services = $this->document->createElement('services');
foreach ($definitions as $id => $definition) {
$this->addService($definition, $id, $services);
}

$aliases = $this->container->getAliases();
foreach ($aliases as $alias => $id) {
while (isset($aliases[(string) $id])) {
$id = $aliases[(string) $id];
}
$this->addServiceAlias($alias, $id, $services);
}
$parent->appendChild($services);
}

private function addTagRecursiveAttributes(\DOMElement $parent, array $attributes): void
{
foreach ($attributes as $name => $value) {
$attribute = $this->document->createElement('attribute');
$attribute->setAttribute('name', $name);

if (\is_array($value)) {
$this->addTagRecursiveAttributes($attribute, $value);
} else {
$attribute->appendChild($this->document->createTextNode($value));
}

$parent->appendChild($attribute);
}
}

private function convertParameters(array $parameters, string $type, \DOMElement $parent, string $keyAttribute = 'key'): void
{
$withKeys = !array_is_list($parameters);
foreach ($parameters as $key => $value) {
$element = $this->document->createElement($type);
if ($withKeys) {
$element->setAttribute($keyAttribute, $key);
}

if (\is_array($tag = $value)) {
$element->setAttribute('type', 'collection');
$this->convertParameters($value, $type, $element, 'key');
} elseif ($value instanceof TaggedIteratorArgument || ($value instanceof ServiceLocatorArgument && $tag = $value->getTaggedIteratorArgument())) {
$element->setAttribute('type', $value instanceof TaggedIteratorArgument ? 'tagged_iterator' : 'tagged_locator');
$element->setAttribute('tag', $tag->getTag());

if (null !== $tag->getIndexAttribute()) {
$element->setAttribute('index-by', $tag->getIndexAttribute());

if (null !== $tag->getDefaultIndexMethod()) {
$element->setAttribute('default-index-method', $tag->getDefaultIndexMethod());
}
if (null !== $tag->getDefaultPriorityMethod()) {
$element->setAttribute('default-priority-method', $tag->getDefaultPriorityMethod());
}
}
if ($excludes = $tag->getExclude()) {
if (1 === \count($excludes)) {
$element->setAttribute('exclude', $excludes[0]);
} else {
foreach ($excludes as $exclude) {
$element->appendChild($this->document->createElement('exclude', $exclude));
}
}
}
if (!$tag->excludeSelf()) {
$element->setAttribute('exclude-self', 'false');
}
} elseif ($value instanceof IteratorArgument) {
$element->setAttribute('type', 'iterator');
$this->convertParameters($value->getValues(), $type, $element, 'key');
} elseif ($value instanceof ServiceLocatorArgument) {
$element->setAttribute('type', 'service_locator');
$this->convertParameters($value->getValues(), $type, $element, 'key');
} elseif ($value instanceof ServiceClosureArgument && !$value->getValues()[0] instanceof Reference) {
$element->setAttribute('type', 'service_closure');
$this->convertParameters($value->getValues(), $type, $element, 'key');
} elseif ($value instanceof Reference || $value instanceof ServiceClosureArgument) {
$element->setAttribute('type', 'service');
if ($value instanceof ServiceClosureArgument) {
$element->setAttribute('type', 'service_closure');
$value = $value->getValues()[0];
}
$element->setAttribute('id', (string) $value);
$behavior = $value->getInvalidBehavior();
if (ContainerInterface::NULL_ON_INVALID_REFERENCE == $behavior) {
$element->setAttribute('on-invalid', 'null');
} elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE == $behavior) {
$element->setAttribute('on-invalid', 'ignore');
} elseif (ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE == $behavior) {
$element->setAttribute('on-invalid', 'ignore_uninitialized');
}
} elseif ($value instanceof Definition) {
$element->setAttribute('type', 'service');
$this->addService($value, null, $element);
} elseif ($value instanceof Expression) {
$element->setAttribute('type', 'expression');
$text = $this->document->createTextNode(self::phpToXml((string) $value));
$element->appendChild($text);
} elseif (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*+$/u', $value)) {
$element->setAttribute('type', 'binary');
$text = $this->document->createTextNode(self::phpToXml(base64_encode($value)));
$element->appendChild($text);
} elseif ($value instanceof \UnitEnum) {
$element->setAttribute('type', 'constant');
$element->appendChild($this->document->createTextNode(self::phpToXml($value)));
} elseif ($value instanceof AbstractArgument) {
$element->setAttribute('type', 'abstract');
$text = $this->document->createTextNode(self::phpToXml($value->getText()));
$element->appendChild($text);
} else {
if (\in_array($value, ['null', 'true', 'false'], true)) {
$element->setAttribute('type', 'string');
}

if (\is_string($value) && (is_numeric($value) || preg_match('/^0b[01]*$/', $value) || preg_match('/^0x[0-9a-f]++$/i', $value))) {
$element->setAttribute('type', 'string');
}

$text = $this->document->createTextNode(self::phpToXml($value));
$element->appendChild($text);
}
$parent->appendChild($element);
}
}




private function escape(array $arguments): array
{
$args = [];
foreach ($arguments as $k => $v) {
if (\is_array($v)) {
$args[$k] = $this->escape($v);
} elseif (\is_string($v)) {
$args[$k] = str_replace('%', '%%', $v);
} else {
$args[$k] = $v;
}
}

return $args;
}






public static function phpToXml(mixed $value): string
{
switch (true) {
case null === $value:
return 'null';
case true === $value:
return 'true';
case false === $value:
return 'false';
case $value instanceof Parameter:
return '%'.$value.'%';
case $value instanceof \UnitEnum:
return \sprintf('%s::%s', $value::class, $value->name);
case \is_object($value) || \is_resource($value):
throw new RuntimeException(\sprintf('Unable to dump a service container if a parameter is an object or a resource, got "%s".', get_debug_type($value)));
default:
return (string) $value;
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;






abstract class Dumper implements DumperInterface
{
protected $container;

public function __construct(ContainerBuilder $container)
{
$this->container = $container;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\Yaml\Dumper as YmlDumper;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\Yaml\Tag\TaggedValue;
use Symfony\Component\Yaml\Yaml;






class YamlDumper extends Dumper
{
private YmlDumper $dumper;




public function dump(array $options = []): string
{
if (!class_exists(YmlDumper::class)) {
throw new LogicException('Unable to dump the container as the Symfony Yaml Component is not installed. Try running "composer require symfony/yaml".');
}

$this->dumper ??= new YmlDumper();

return $this->addParameters()."\n".$this->addServices();
}

private function addService(string $id, Definition $definition): string
{
$code = "    {$this->dumper->dump($id)}:\n";
if ($class = $definition->getClass()) {
if (str_starts_with($class, '\\')) {
$class = substr($class, 1);
}

$code .= \sprintf("        class: %s\n", $this->dumper->dump($this->container->resolveEnvPlaceholders($class)));
}

if (!$definition->isPrivate()) {
$code .= \sprintf("        public: %s\n", $definition->isPublic() ? 'true' : 'false');
}

$tagsCode = '';
$tags = $definition->getTags();
$tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
foreach ($tags as $name => $tags) {
foreach ($tags as $attributes) {
$att = [];
foreach ($attributes as $key => $value) {
$att[] = \sprintf('%s: %s', $this->dumper->dump($key), $this->dumper->dump($value));
}
$att = $att ? ': { '.implode(', ', $att).' }' : '';

$tagsCode .= \sprintf("            - %s%s\n", $this->dumper->dump($name), $att);
}
}
if ($tagsCode) {
$code .= "        tags:\n".$tagsCode;
}

if ($definition->getFile()) {
$code .= \sprintf("        file: %s\n", $this->dumper->dump($this->container->resolveEnvPlaceholders($definition->getFile())));
}

if ($definition->isSynthetic()) {
$code .= "        synthetic: true\n";
}

if ($definition->isDeprecated()) {
$code .= "        deprecated:\n";
foreach ($definition->getDeprecation('%service_id%') as $key => $value) {
if ('' !== $value) {
$code .= \sprintf("            %s: %s\n", $key, $this->dumper->dump($value));
}
}
}

if ($definition->isAutowired()) {
$code .= "        autowire: true\n";
}

if ($definition->isAutoconfigured()) {
$code .= "        autoconfigure: true\n";
}

if ($definition->isAbstract()) {
$code .= "        abstract: true\n";
}

if ($definition->isLazy()) {
$code .= "        lazy: true\n";
}

if ($definition->getArguments()) {
$code .= \sprintf("        arguments: %s\n", $this->dumper->dump($this->dumpValue($definition->getArguments()), 0));
}

if ($definition->getProperties()) {
$code .= \sprintf("        properties: %s\n", $this->dumper->dump($this->dumpValue($definition->getProperties()), 0));
}

if ($definition->getMethodCalls()) {
$code .= \sprintf("        calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12));
}

if (!$definition->isShared()) {
$code .= "        shared: false\n";
}

if (null !== $decoratedService = $definition->getDecoratedService()) {
[$decorated, $renamedId, $priority] = $decoratedService;
$code .= \sprintf("        decorates: %s\n", $decorated);
if (null !== $renamedId) {
$code .= \sprintf("        decoration_inner_name: %s\n", $renamedId);
}
if (0 !== $priority) {
$code .= \sprintf("        decoration_priority: %s\n", $priority);
}

$decorationOnInvalid = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
if (\in_array($decorationOnInvalid, [ContainerInterface::IGNORE_ON_INVALID_REFERENCE, ContainerInterface::NULL_ON_INVALID_REFERENCE])) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE === $decorationOnInvalid ? 'null' : 'ignore';
$code .= \sprintf("        decoration_on_invalid: %s\n", $invalidBehavior);
}
}

if ($callable = $definition->getFactory()) {
if (\is_array($callable) && ['Closure', 'fromCallable'] !== $callable && $definition->getClass() === $callable[0]) {
$code .= \sprintf("        constructor: %s\n", $callable[1]);
} else {
$code .= \sprintf("        factory: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0));
}
}

if ($callable = $definition->getConfigurator()) {
$code .= \sprintf("        configurator: %s\n", $this->dumper->dump($this->dumpCallable($callable), 0));
}

return $code;
}

private function addServiceAlias(string $alias, Alias $id): string
{
$deprecated = '';

if ($id->isDeprecated()) {
$deprecated = "        deprecated:\n";

foreach ($id->getDeprecation('%alias_id%') as $key => $value) {
if ('' !== $value) {
$deprecated .= \sprintf("            %s: %s\n", $key, $value);
}
}
}

if (!$id->isDeprecated() && $id->isPrivate()) {
return \sprintf("    %s: '@%s'\n", $alias, $id);
}

if ($id->isPublic()) {
$deprecated = "        public: true\n".$deprecated;
}

return \sprintf("    %s:\n        alias: %s\n%s", $alias, $id, $deprecated);
}

private function addServices(): string
{
if (!$this->container->getDefinitions()) {
return '';
}

$code = "services:\n";
foreach ($this->container->getDefinitions() as $id => $definition) {
$code .= $this->addService($id, $definition);
}

$aliases = $this->container->getAliases();
foreach ($aliases as $alias => $id) {
while (isset($aliases[(string) $id])) {
$id = $aliases[(string) $id];
}
$code .= $this->addServiceAlias($alias, $id);
}

return $code;
}

private function addParameters(): string
{
if (!$this->container->getParameterBag()->all()) {
return '';
}

$parameters = $this->prepareParameters($this->container->getParameterBag()->all(), $this->container->isCompiled());

return $this->dumper->dump(['parameters' => $parameters], 2);
}




private function dumpCallable(mixed $callable): mixed
{
if (\is_array($callable)) {
if ($callable[0] instanceof Reference) {
$callable = [$this->getServiceCall((string) $callable[0], $callable[0]), $callable[1]];
} else {
$callable = [$callable[0], $callable[1]];
}
}

return $this->container->resolveEnvPlaceholders($callable);
}






private function dumpValue(mixed $value): mixed
{
if ($value instanceof ServiceClosureArgument) {
$value = $value->getValues()[0];

return new TaggedValue('service_closure', $this->dumpValue($value));
}
if ($value instanceof ArgumentInterface) {
$tag = $value;

if ($value instanceof TaggedIteratorArgument || ($value instanceof ServiceLocatorArgument && $tag = $value->getTaggedIteratorArgument())) {
if (null === $tag->getIndexAttribute()) {
$content = $tag->getTag();
} else {
$content = [
'tag' => $tag->getTag(),
'index_by' => $tag->getIndexAttribute(),
];

if (null !== $tag->getDefaultIndexMethod()) {
$content['default_index_method'] = $tag->getDefaultIndexMethod();
}
if (null !== $tag->getDefaultPriorityMethod()) {
$content['default_priority_method'] = $tag->getDefaultPriorityMethod();
}
}
if ($excludes = $tag->getExclude()) {
if (!\is_array($content)) {
$content = ['tag' => $content];
}
$content['exclude'] = 1 === \count($excludes) ? $excludes[0] : $excludes;
}
if (!$tag->excludeSelf()) {
$content['exclude_self'] = false;
}

return new TaggedValue($value instanceof TaggedIteratorArgument ? 'tagged_iterator' : 'tagged_locator', $content);
}

if ($value instanceof IteratorArgument) {
$tag = 'iterator';
} elseif ($value instanceof ServiceLocatorArgument) {
$tag = 'service_locator';
} else {
throw new RuntimeException(\sprintf('Unspecified Yaml tag for type "%s".', get_debug_type($value)));
}

return new TaggedValue($tag, $this->dumpValue($value->getValues()));
}

if (\is_array($value)) {
$code = [];
foreach ($value as $k => $v) {
$code[$this->container->resolveEnvPlaceholders($k)] = $this->dumpValue($v);
}

return $code;
} elseif ($value instanceof Reference) {
return $this->getServiceCall((string) $value, $value);
} elseif ($value instanceof Parameter) {
return $this->getParameterCall((string) $value);
} elseif ($value instanceof Expression) {
return $this->getExpressionCall((string) $value);
} elseif ($value instanceof Definition) {
return new TaggedValue('service', (new Parser())->parse("_:\n".$this->addService('_', $value), Yaml::PARSE_CUSTOM_TAGS)['_']['_']);
} elseif ($value instanceof \UnitEnum) {
return new TaggedValue('php/const', \sprintf('%s::%s', $value::class, $value->name));
} elseif ($value instanceof AbstractArgument) {
return new TaggedValue('abstract', $value->getText());
} elseif (\is_object($value) || \is_resource($value)) {
throw new RuntimeException(\sprintf('Unable to dump a service container if a parameter is an object or a resource, got "%s".', get_debug_type($value)));
}

return $this->container->resolveEnvPlaceholders($value);
}

private function getServiceCall(string $id, ?Reference $reference = null): string
{
if (null !== $reference) {
switch ($reference->getInvalidBehavior()) {
case ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE: break;
case ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE: break;
case ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE: return \sprintf('@!%s', $id);
default: return \sprintf('@?%s', $id);
}
}

return \sprintf('@%s', $id);
}

private function getParameterCall(string $id): string
{
return \sprintf('%%%s%%', $id);
}

private function getExpressionCall(string $expression): string
{
return \sprintf('@=%s', $expression);
}

private function prepareParameters(array $parameters, bool $escape = true): array
{
$filtered = [];
foreach ($parameters as $key => $value) {
if (\is_array($value)) {
$value = $this->prepareParameters($value, $escape);
} elseif ($value instanceof Reference || \is_string($value) && str_starts_with($value, '@')) {
$value = '@'.$value;
}

$filtered[$key] = $value;
}

return $escape ? $this->container->resolveEnvPlaceholders($this->escape($filtered)) : $filtered;
}

private function escape(array $arguments): array
{
$args = [];
foreach ($arguments as $k => $v) {
if (\is_array($v)) {
$args[$k] = $this->escape($v);
} elseif (\is_string($v)) {
$args[$k] = str_replace('%', '%%', $v);
} else {
$args[$k] = $v;
}
}

return $args;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;






class GlobFileLoader extends FileLoader
{
public function load(mixed $resource, ?string $type = null): mixed
{
foreach ($this->glob($resource, false, $globResource) as $path => $info) {
$this->import($path);
}

$this->container->addResource($globResource);

return null;
}

public function supports(mixed $resource, ?string $type = null): bool
{
return 'glob' === $type;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;




class ServicesConfigurator extends AbstractConfigurator
{
public const FACTORY = 'services';

private Definition $defaults;
private ContainerBuilder $container;
private PhpFileLoader $loader;
private array $instanceof;
private ?string $path;
private string $anonymousHash;
private int $anonymousCount;

public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, ?string $path = null, int &$anonymousCount = 0)
{
$this->defaults = new Definition();
$this->container = $container;
$this->loader = $loader;
$this->instanceof = &$instanceof;
$this->path = $path;
$this->anonymousHash = ContainerBuilder::hash($path ?: mt_rand());
$this->anonymousCount = &$anonymousCount;
$instanceof = [];
}




final public function defaults(): DefaultsConfigurator
{
return new DefaultsConfigurator($this, $this->defaults = new Definition(), $this->path);
}




final public function instanceof(string $fqcn): InstanceofConfigurator
{
$this->instanceof[$fqcn] = $definition = new ChildDefinition('');

return new InstanceofConfigurator($this, $definition, $fqcn, $this->path);
}







final public function set(?string $id, ?string $class = null): ServiceConfigurator
{
$defaults = $this->defaults;
$definition = new Definition();

if (null === $id) {
if (!$class) {
throw new \LogicException('Anonymous services must have a class name.');
}

$id = \sprintf('.%d_%s', ++$this->anonymousCount, preg_replace('/^.*\\\\/', '', $class).'~'.$this->anonymousHash);
} elseif (!$defaults->isPublic() || !$defaults->isPrivate()) {
$definition->setPublic($defaults->isPublic() && !$defaults->isPrivate());
}

$definition->setAutowired($defaults->isAutowired());
$definition->setAutoconfigured($defaults->isAutoconfigured());

$definition->setBindings(unserialize(serialize($defaults->getBindings())));
$definition->setChanges([]);

$configurator = new ServiceConfigurator($this->container, $this->instanceof, true, $this, $definition, $id, $defaults->getTags(), $this->path);

return null !== $class ? $configurator->class($class) : $configurator;
}






final public function remove(string $id): static
{
$this->container->removeDefinition($id);
$this->container->removeAlias($id);

return $this;
}




final public function alias(string $id, string $referencedId): AliasConfigurator
{
$ref = static::processValue($referencedId, true);
$alias = new Alias((string) $ref);
if (!$this->defaults->isPublic() || !$this->defaults->isPrivate()) {
$alias->setPublic($this->defaults->isPublic());
}
$this->container->setAlias($id, $alias);

return new AliasConfigurator($this, $alias);
}




final public function load(string $namespace, string $resource): PrototypeConfigurator
{
return new PrototypeConfigurator($this, $this->loader, $this->defaults, $namespace, $resource, true, $this->path);
}






final public function get(string $id): ServiceConfigurator
{
$definition = $this->container->getDefinition($id);

return new ServiceConfigurator($this->container, $definition->getInstanceofConditionals(), true, $this, $definition, $id, []);
}






final public function stack(string $id, array $services): AliasConfigurator
{
foreach ($services as $i => $service) {
if ($service instanceof InlineServiceConfigurator) {
$definition = $service->definition->setInstanceofConditionals($this->instanceof);

$changes = $definition->getChanges();
$definition->setAutowired((isset($changes['autowired']) ? $definition : $this->defaults)->isAutowired());
$definition->setAutoconfigured((isset($changes['autoconfigured']) ? $definition : $this->defaults)->isAutoconfigured());
$definition->setBindings(array_merge($this->defaults->getBindings(), $definition->getBindings()));
$definition->setChanges($changes);

$services[$i] = $definition;
} elseif (!$service instanceof ReferenceConfigurator) {
throw new InvalidArgumentException(\sprintf('"%s()" expects a list of definitions as returned by "%s()" or "%s()", "%s" given at index "%s" for service "%s".', __METHOD__, InlineServiceConfigurator::FACTORY, ReferenceConfigurator::FACTORY, $service instanceof AbstractConfigurator ? $service::FACTORY.'()' : get_debug_type($service), $i, $id));
}
}

$alias = $this->alias($id, '');
$alias->definition = $this->set($id)
->parent('')
->args($services)
->tag('container.stack')
->definition;

return $alias;
}




final public function __invoke(string $id, ?string $class = null): ServiceConfigurator
{
return $this->set($id, $class);
}

public function __destruct()
{
$this->loader->registerAliasesForSinglyImplementedInterfaces();
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;




class FromCallableConfigurator extends AbstractServiceConfigurator
{
use Traits\AbstractTrait;
use Traits\AutoconfigureTrait;
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\DecorateTrait;
use Traits\DeprecateTrait;
use Traits\LazyTrait;
use Traits\PublicTrait;
use Traits\ShareTrait;
use Traits\TagTrait;

public const FACTORY = 'services';

private ServiceConfigurator $serviceConfigurator;

public function __construct(ServiceConfigurator $serviceConfigurator, Definition $definition)
{
$this->serviceConfigurator = $serviceConfigurator;

parent::__construct($serviceConfigurator->parent, $definition, $serviceConfigurator->id);
}

public function __destruct()
{
$this->serviceConfigurator->__destruct();
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

class ClosureReferenceConfigurator extends ReferenceConfigurator
{
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;




class ServiceConfigurator extends AbstractServiceConfigurator
{
use Traits\AbstractTrait;
use Traits\ArgumentTrait;
use Traits\AutoconfigureTrait;
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\CallTrait;
use Traits\ClassTrait;
use Traits\ConfiguratorTrait;
use Traits\ConstructorTrait;
use Traits\DecorateTrait;
use Traits\DeprecateTrait;
use Traits\FactoryTrait;
use Traits\FileTrait;
use Traits\FromCallableTrait;
use Traits\LazyTrait;
use Traits\ParentTrait;
use Traits\PropertyTrait;
use Traits\PublicTrait;
use Traits\ShareTrait;
use Traits\SyntheticTrait;
use Traits\TagTrait;

public const FACTORY = 'services';

private ContainerBuilder $container;
private array $instanceof;
private bool $allowParent;
private ?string $path;
private bool $destructed = false;

public function __construct(ContainerBuilder $container, array $instanceof, bool $allowParent, ServicesConfigurator $parent, Definition $definition, ?string $id, array $defaultTags, ?string $path = null)
{
$this->container = $container;
$this->instanceof = $instanceof;
$this->allowParent = $allowParent;
$this->path = $path;

parent::__construct($parent, $definition, $id, $defaultTags);
}

public function __destruct()
{
if ($this->destructed) {
return;
}
$this->destructed = true;

parent::__destruct();

$this->container->removeBindings($this->id);
$this->container->setDefinition($this->id, $this->definition->setInstanceofConditionals($this->instanceof));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;




class InlineServiceConfigurator extends AbstractConfigurator
{
use Traits\ArgumentTrait;
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\CallTrait;
use Traits\ConfiguratorTrait;
use Traits\ConstructorTrait;
use Traits\FactoryTrait;
use Traits\FileTrait;
use Traits\LazyTrait;
use Traits\ParentTrait;
use Traits\PropertyTrait;
use Traits\TagTrait;

public const FACTORY = 'service';

private string $id = '[inline]';
private bool $allowParent = true;
private ?string $path = null;

public function __construct(Definition $definition)
{
$this->definition = $definition;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\Config\Loader\ParamConfigurator;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;

abstract class AbstractConfigurator
{
public const FACTORY = 'unknown';




public static $valuePreProcessor;


protected Definition|Alias|null $definition = null;




public function __call(string $method, array $args)
{
if (method_exists($this, 'set'.$method)) {
return $this->{'set'.$method}(...$args);
}

throw new \BadMethodCallException(\sprintf('Call to undefined method "%s::%s()".', static::class, $method));
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}








public static function processValue(mixed $value, bool $allowServices = false): mixed
{
if (\is_array($value)) {
foreach ($value as $k => $v) {
$value[$k] = static::processValue($v, $allowServices);
}

return self::$valuePreProcessor ? (self::$valuePreProcessor)($value, $allowServices) : $value;
}

if (self::$valuePreProcessor) {
$value = (self::$valuePreProcessor)($value, $allowServices);
}

if ($value instanceof ReferenceConfigurator) {
$reference = new Reference($value->id, $value->invalidBehavior);

return $value instanceof ClosureReferenceConfigurator ? new ServiceClosureArgument($reference) : $reference;
}

if ($value instanceof InlineServiceConfigurator) {
$def = $value->definition;
$value->definition = null;

return $def;
}

if ($value instanceof ParamConfigurator) {
return (string) $value;
}

if ($value instanceof self) {
throw new InvalidArgumentException(\sprintf('"%s()" can be used only at the root of service configuration files.', $value::FACTORY));
}

switch (true) {
case null === $value:
case \is_scalar($value):
case $value instanceof \UnitEnum:
return $value;

case $value instanceof ArgumentInterface:
case $value instanceof Definition:
case $value instanceof Expression:
case $value instanceof Parameter:
case $value instanceof AbstractArgument:
case $value instanceof Reference:
if ($allowServices) {
return $value;
}
}

throw new InvalidArgumentException(\sprintf('Cannot use values of type "%s" in service configuration files.', get_debug_type($value)));
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\ContainerInterface;




class ReferenceConfigurator extends AbstractConfigurator
{

protected string $id;


protected int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;

public function __construct(string $id)
{
$this->id = $id;
}




final public function ignoreOnInvalid(): static
{
$this->invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;

return $this;
}




final public function nullOnInvalid(): static
{
$this->invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;

return $this;
}




final public function ignoreOnUninitialized(): static
{
$this->invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE;

return $this;
}

public function __toString(): string
{
return $this->id;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;




class PrototypeConfigurator extends AbstractServiceConfigurator
{
use Traits\AbstractTrait;
use Traits\ArgumentTrait;
use Traits\AutoconfigureTrait;
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\CallTrait;
use Traits\ConfiguratorTrait;
use Traits\ConstructorTrait;
use Traits\DeprecateTrait;
use Traits\FactoryTrait;
use Traits\LazyTrait;
use Traits\ParentTrait;
use Traits\PropertyTrait;
use Traits\PublicTrait;
use Traits\ShareTrait;
use Traits\TagTrait;

public const FACTORY = 'load';

private PhpFileLoader $loader;
private string $resource;
private ?array $excludes = null;
private bool $allowParent;
private ?string $path;

public function __construct(ServicesConfigurator $parent, PhpFileLoader $loader, Definition $defaults, string $namespace, string $resource, bool $allowParent, ?string $path = null)
{
$definition = new Definition();
if (!$defaults->isPublic() || !$defaults->isPrivate()) {
$definition->setPublic($defaults->isPublic());
}
$definition->setAutowired($defaults->isAutowired());
$definition->setAutoconfigured($defaults->isAutoconfigured());

$definition->setBindings(unserialize(serialize($defaults->getBindings())));
$definition->setChanges([]);

$this->loader = $loader;
$this->resource = $resource;
$this->allowParent = $allowParent;
$this->path = $path;

parent::__construct($parent, $definition, $namespace, $defaults->getTags());
}

public function __destruct()
{
parent::__destruct();

if (isset($this->loader)) {
$this->loader->registerClasses($this->definition, $this->id, $this->resource, $this->excludes, $this->path);
}
unset($this->loader);
}








final public function exclude(array|string $excludes): static
{
$this->excludes = (array) $excludes;

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\Config\Loader\ParamConfigurator;

class EnvConfigurator extends ParamConfigurator
{



private array $stack;

public function __construct(string $name)
{
$this->stack = explode(':', $name);
}

public function __toString(): string
{
return '%env('.implode(':', $this->stack).')%';
}




public function __call(string $name, array $arguments): static
{
$processor = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $name));

$this->custom($processor, ...$arguments);

return $this;
}




public function custom(string $processor, ...$args): static
{
array_unshift($this->stack, $processor, ...$args);

return $this;
}




public function base64(): static
{
array_unshift($this->stack, 'base64');

return $this;
}




public function bool(): static
{
array_unshift($this->stack, 'bool');

return $this;
}




public function not(): static
{
array_unshift($this->stack, 'not');

return $this;
}




public function const(): static
{
array_unshift($this->stack, 'const');

return $this;
}




public function csv(): static
{
array_unshift($this->stack, 'csv');

return $this;
}




public function file(): static
{
array_unshift($this->stack, 'file');

return $this;
}




public function float(): static
{
array_unshift($this->stack, 'float');

return $this;
}




public function int(): static
{
array_unshift($this->stack, 'int');

return $this;
}




public function json(): static
{
array_unshift($this->stack, 'json');

return $this;
}




public function key(string $key): static
{
array_unshift($this->stack, 'key', $key);

return $this;
}




public function url(): static
{
array_unshift($this->stack, 'url');

return $this;
}




public function queryString(): static
{
array_unshift($this->stack, 'query_string');

return $this;
}




public function resolve(): static
{
array_unshift($this->stack, 'resolve');

return $this;
}




public function default(string $fallbackParam): static
{
array_unshift($this->stack, 'default', $fallbackParam);

return $this;
}




public function string(): static
{
array_unshift($this->stack, 'string');

return $this;
}




public function trim(): static
{
array_unshift($this->stack, 'trim');

return $this;
}




public function require(): static
{
array_unshift($this->stack, 'require');

return $this;
}






public function enum(string $backedEnumClassName): static
{
array_unshift($this->stack, 'enum', $backedEnumClassName);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\Config\Loader\ParamConfigurator;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\ExpressionLanguage\Expression;




class ContainerConfigurator extends AbstractConfigurator
{
public const FACTORY = 'container';

private ContainerBuilder $container;
private PhpFileLoader $loader;
private array $instanceof;
private string $path;
private string $file;
private int $anonymousCount = 0;
private ?string $env;

public function __construct(ContainerBuilder $container, PhpFileLoader $loader, array &$instanceof, string $path, string $file, ?string $env = null)
{
$this->container = $container;
$this->loader = $loader;
$this->instanceof = &$instanceof;
$this->path = $path;
$this->file = $file;
$this->env = $env;
}

final public function extension(string $namespace, array $config): void
{
if (!$this->container->hasExtension($namespace)) {
$extensions = array_filter(array_map(fn (ExtensionInterface $ext) => $ext->getAlias(), $this->container->getExtensions()));
throw new InvalidArgumentException(\sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $namespace, $this->file, $namespace, $extensions ? implode('", "', $extensions) : 'none'));
}

$this->container->loadFromExtension($namespace, static::processValue($config));
}

final public function import(string $resource, ?string $type = null, bool|string $ignoreErrors = false): void
{
$this->loader->setCurrentDir(\dirname($this->path));
$this->loader->import($resource, $type, $ignoreErrors, $this->file);
}

final public function parameters(): ParametersConfigurator
{
return new ParametersConfigurator($this->container);
}

final public function services(): ServicesConfigurator
{
return new ServicesConfigurator($this->container, $this->loader, $this->instanceof, $this->path, $this->anonymousCount);
}




final public function env(): ?string
{
return $this->env;
}

final public function withPath(string $path): static
{
$clone = clone $this;
$clone->path = $clone->file = $path;
$clone->loader->setCurrentDir(\dirname($path));

return $clone;
}
}




function param(string $name): ParamConfigurator
{
return new ParamConfigurator($name);
}




function service(string $serviceId): ReferenceConfigurator
{
return new ReferenceConfigurator($serviceId);
}




function inline_service(?string $class = null): InlineServiceConfigurator
{
return new InlineServiceConfigurator(new Definition($class));
}






function service_locator(array $values): ServiceLocatorArgument
{
$values = AbstractConfigurator::processValue($values, true);

if (isset($values[0])) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Using integers as keys in a "service_locator()" argument is deprecated. The keys will default to the IDs of the original services in 7.0.');
}

return new ServiceLocatorArgument($values);
}






function iterator(array $values): IteratorArgument
{
return new IteratorArgument(AbstractConfigurator::processValue($values, true));
}




function tagged_iterator(string $tag, ?string $indexAttribute = null, ?string $defaultIndexMethod = null, ?string $defaultPriorityMethod = null, string|array $exclude = [], bool $excludeSelf = true): TaggedIteratorArgument
{
return new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, false, $defaultPriorityMethod, (array) $exclude, $excludeSelf);
}




function tagged_locator(string $tag, ?string $indexAttribute = null, ?string $defaultIndexMethod = null, ?string $defaultPriorityMethod = null, string|array $exclude = [], bool $excludeSelf = true): ServiceLocatorArgument
{
return new ServiceLocatorArgument(new TaggedIteratorArgument($tag, $indexAttribute, $defaultIndexMethod, true, $defaultPriorityMethod, (array) $exclude, $excludeSelf));
}




function expr(string $expression): Expression
{
return new Expression($expression);
}




function abstract_arg(string $description): AbstractArgument
{
return new AbstractArgument($description);
}




function env(string $name): EnvConfigurator
{
return new EnvConfigurator($name);
}




function service_closure(string $serviceId): ClosureReferenceConfigurator
{
return new ClosureReferenceConfigurator($serviceId);
}




function closure(string|array|ReferenceConfigurator|Expression $callable): InlineServiceConfigurator
{
return (new InlineServiceConfigurator(new Definition('Closure')))
->factory(['Closure', 'fromCallable'])
->args([$callable]);
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Alias;




class AliasConfigurator extends AbstractServiceConfigurator
{
use Traits\DeprecateTrait;
use Traits\PublicTrait;

public const FACTORY = 'alias';

public function __construct(ServicesConfigurator $parent, Alias $alias)
{
$this->parent = $parent;
$this->definition = $alias;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;




class InstanceofConfigurator extends AbstractServiceConfigurator
{
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\CallTrait;
use Traits\ConfiguratorTrait;
use Traits\ConstructorTrait;
use Traits\LazyTrait;
use Traits\PropertyTrait;
use Traits\PublicTrait;
use Traits\ShareTrait;
use Traits\TagTrait;

public const FACTORY = 'instanceof';

private ?string $path;

public function __construct(ServicesConfigurator $parent, Definition $definition, string $id, ?string $path = null)
{
parent::__construct($parent, $definition, $id, []);

$this->path = $path;
}




final public function instanceof(string $fqcn): self
{
return $this->parent->instanceof($fqcn);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;

abstract class AbstractServiceConfigurator extends AbstractConfigurator
{
protected $parent;
protected $id;
private array $defaultTags = [];

public function __construct(ServicesConfigurator $parent, Definition $definition, ?string $id = null, array $defaultTags = [])
{
$this->parent = $parent;
$this->definition = $definition;
$this->id = $id;
$this->defaultTags = $defaultTags;
}

public function __destruct()
{

foreach ($this->defaultTags as $name => $attributes) {
foreach ($attributes as $attribute) {
$this->definition->addTag($name, $attribute);
}
}
$this->defaultTags = [];
}




final public function set(?string $id, ?string $class = null): ServiceConfigurator
{
$this->__destruct();

return $this->parent->set($id, $class);
}




final public function alias(string $id, string $referencedId): AliasConfigurator
{
$this->__destruct();

return $this->parent->alias($id, $referencedId);
}




final public function load(string $namespace, string $resource): PrototypeConfigurator
{
$this->__destruct();

return $this->parent->load($namespace, $resource);
}






final public function get(string $id): ServiceConfigurator
{
$this->__destruct();

return $this->parent->get($id);
}




final public function remove(string $id): ServicesConfigurator
{
$this->__destruct();

return $this->parent->remove($id);
}






final public function stack(string $id, array $services): AliasConfigurator
{
$this->__destruct();

return $this->parent->stack($id, $services);
}




final public function __invoke(string $id, ?string $class = null): ServiceConfigurator
{
$this->__destruct();

return $this->parent->set($id, $class);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\ExpressionLanguage\Expression;




class ParametersConfigurator extends AbstractConfigurator
{
public const FACTORY = 'parameters';

private ContainerBuilder $container;

public function __construct(ContainerBuilder $container)
{
$this->container = $container;
}




final public function set(string $name, mixed $value): static
{
if ($value instanceof Expression) {
throw new InvalidArgumentException(\sprintf('Using an expression in parameter "%s" is not allowed.', $name));
}

$this->container->setParameter($name, static::processValue($value, true));

return $this;
}




final public function __invoke(string $name, mixed $value): static
{
return $this->set($name, $value);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;




class DefaultsConfigurator extends AbstractServiceConfigurator
{
use Traits\AutoconfigureTrait;
use Traits\AutowireTrait;
use Traits\BindTrait;
use Traits\PublicTrait;

public const FACTORY = 'defaults';

private ?string $path;

public function __construct(ServicesConfigurator $parent, Definition $definition, ?string $path = null)
{
parent::__construct($parent, $definition, null, []);

$this->path = $path;
}








final public function tag(string $name, array $attributes = []): static
{
if ('' === $name) {
throw new InvalidArgumentException('The tag name in "_defaults" must be a non-empty string.');
}

$this->validateAttributes($name, $attributes);

$this->definition->addTag($name, $attributes);

return $this;
}




final public function instanceof(string $fqcn): InstanceofConfigurator
{
return $this->parent->instanceof($fqcn);
}

private function validateAttributes(string $tag, array $attributes, array $path = []): void
{
foreach ($attributes as $name => $value) {
if (\is_array($value)) {
$this->validateAttributes($tag, $value, [...$path, $name]);
} elseif (!\is_scalar($value ?? '')) {
$name = implode('.', [...$path, $name]);
throw new InvalidArgumentException(\sprintf('Tag "%s", attribute "%s" in "_defaults" must be of a scalar-type or an array of scalar-type.', $tag, $name));
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait DeprecateTrait
{











final public function deprecate(string $package, string $version, string $message): static
{
$this->definition->setDeprecated($package, $version, $message);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait ClassTrait
{





final public function class(?string $class): static
{
$this->definition->setClass($class);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Loader\Configurator\DefaultsConfigurator;
use Symfony\Component\DependencyInjection\Loader\Configurator\InstanceofConfigurator;

trait BindTrait
{












final public function bind(string $nameOrFqcn, mixed $valueOrRef): static
{
$valueOrRef = static::processValue($valueOrRef, true);
$bindings = $this->definition->getBindings();
$type = $this instanceof DefaultsConfigurator ? BoundArgument::DEFAULTS_BINDING : ($this instanceof InstanceofConfigurator ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING);
$bindings[$nameOrFqcn] = new BoundArgument($valueOrRef, true, $type, $this->path ?? null);
$this->definition->setBindings($bindings);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait LazyTrait
{







final public function lazy(bool|string $lazy = true): static
{
$this->definition->setLazy((bool) $lazy);
if (\is_string($lazy)) {
$this->definition->addTag('proxy', ['interface' => $lazy]);
}

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Loader\Configurator\FromCallableConfigurator;
use Symfony\Component\DependencyInjection\Loader\Configurator\ReferenceConfigurator;
use Symfony\Component\ExpressionLanguage\Expression;

trait FromCallableTrait
{
final public function fromCallable(string|array|ReferenceConfigurator|Expression $callable): FromCallableConfigurator
{
if ($this->definition instanceof ChildDefinition) {
throw new InvalidArgumentException('The configuration key "parent" is unsupported when using "fromCallable()".');
}

foreach ([
'synthetic' => 'isSynthetic',
'factory' => 'getFactory',
'file' => 'getFile',
'arguments' => 'getArguments',
'properties' => 'getProperties',
'configurator' => 'getConfigurator',
'calls' => 'getMethodCalls',
] as $key => $method) {
if ($this->definition->$method()) {
throw new InvalidArgumentException(\sprintf('The configuration key "%s" is unsupported when using "fromCallable()".', $key));
}
}

$this->definition->setFactory(['Closure', 'fromCallable']);

if (\is_string($callable) && 1 === substr_count($callable, ':')) {
$parts = explode(':', $callable);

throw new InvalidArgumentException(\sprintf('Invalid callable "%s": the "service:method" notation is not available when using PHP-based DI configuration. Use "[service(\'%s\'), \'%s\']" instead.', $callable, $parts[0], $parts[1]));
}

if ($callable instanceof Expression) {
$callable = '@='.$callable;
}

$this->definition->setArguments([static::processValue($callable, true)]);

if ('Closure' !== ($this->definition->getClass() ?? 'Closure')) {
$this->definition->setLazy(true);
} else {
$this->definition->setClass('Closure');
}

return new FromCallableConfigurator($this, $this->definition);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait FileTrait
{





final public function file(string $file): static
{
$this->definition->setFile($file);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait TagTrait
{





final public function tag(string $name, array $attributes = []): static
{
if ('' === $name) {
throw new InvalidArgumentException(\sprintf('The tag name for service "%s" must be a non-empty string.', $this->id));
}

$this->validateAttributes($name, $attributes);

$this->definition->addTag($name, $attributes);

return $this;
}

private function validateAttributes(string $tag, array $attributes, array $path = []): void
{
foreach ($attributes as $name => $value) {
if (\is_array($value)) {
$this->validateAttributes($tag, $value, [...$path, $name]);
} elseif (!\is_scalar($value ?? '')) {
$name = implode('.', [...$path, $name]);
throw new InvalidArgumentException(\sprintf('A tag attribute must be of a scalar-type or an array of scalar-types for service "%s", tag "%s", attribute "%s".', $this->id, $tag, $name));
}
}
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait AutoconfigureTrait
{







final public function autoconfigure(bool $autoconfigured = true): static
{
$this->definition->setAutoconfigured($autoconfigured);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait ConstructorTrait
{





final public function constructor(string $constructor): static
{
$this->definition->setFactory([null, $constructor]);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Loader\Configurator\ReferenceConfigurator;
use Symfony\Component\ExpressionLanguage\Expression;

trait FactoryTrait
{





final public function factory(string|array|ReferenceConfigurator|Expression $factory): static
{
if (\is_string($factory) && 1 === substr_count($factory, ':')) {
$factoryParts = explode(':', $factory);

throw new InvalidArgumentException(\sprintf('Invalid factory "%s": the "service:method" notation is not available when using PHP-based DI configuration. Use "[service(\'%s\'), \'%s\']" instead.', $factory, $factoryParts[0], $factoryParts[1]));
}

if ($factory instanceof Expression) {
$factory = '@='.$factory;
}

$this->definition->setFactory(static::processValue($factory, true));

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait PropertyTrait
{





final public function property(string $name, mixed $value): static
{
$this->definition->setProperty($name, static::processValue($value, true));

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait SyntheticTrait
{






final public function synthetic(bool $synthetic = true): static
{
$this->definition->setSynthetic($synthetic);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait PublicTrait
{



final public function public(): static
{
$this->definition->setPublic(true);

return $this;
}




final public function private(): static
{
$this->definition->setPublic(false);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait AbstractTrait
{






final public function abstract(bool $abstract = true): static
{
$this->definition->setAbstract($abstract);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait ShareTrait
{





final public function share(bool $shared = true): static
{
$this->definition->setShared($shared);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait ArgumentTrait
{





final public function args(array $arguments): static
{
$this->definition->setArguments(static::processValue($arguments, true));

return $this;
}






final public function arg(string|int $key, mixed $value): static
{
$this->definition->setArgument($key, static::processValue($value, true));

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait DecorateTrait
{









final public function decorate(?string $id, ?string $renamedId = null, int $priority = 0, int $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE): static
{
$this->definition->setDecoratedService($id, $renamedId, $priority, $invalidBehavior);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Loader\Configurator\ReferenceConfigurator;

trait ConfiguratorTrait
{





final public function configurator(string|array|ReferenceConfigurator $configurator): static
{
$this->definition->setConfigurator(static::processValue($configurator, true));

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

trait AutowireTrait
{





final public function autowire(bool $autowired = true): static
{
$this->definition->setAutowired($autowired);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait ParentTrait
{







final public function parent(string $parent): static
{
if (!$this->allowParent) {
throw new InvalidArgumentException(\sprintf('A parent cannot be defined when either "_instanceof" or "_defaults" are also defined for service prototype "%s".', $this->id));
}

if ($this->definition instanceof ChildDefinition) {
$this->definition->setParent($parent);
} else {

$definition = serialize($this->definition);
$definition = substr_replace($definition, '53', 2, 2);
$definition = substr_replace($definition, 'Child', 44, 0);
$definition = unserialize($definition);

$this->definition = $definition->setParent($parent);
}

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

trait CallTrait
{











final public function call(string $method, array $arguments = [], bool $returnsClone = false): static
{
$this->definition->addMethodCall($method, static::processValue($arguments, true), $returnsClone);

return $this;
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;






class IniFileLoader extends FileLoader
{
public function load(mixed $resource, ?string $type = null): mixed
{
$path = $this->locator->locate($resource);

$this->container->fileExists($path);


$result = parse_ini_file($path, true);
if (false === $result || [] === $result) {
throw new InvalidArgumentException(\sprintf('The "%s" file is not valid.', $resource));
}


$result = parse_ini_file($path, true, \INI_SCANNER_RAW);

if (isset($result['parameters']) && \is_array($result['parameters'])) {
foreach ($result['parameters'] as $key => $value) {
if (\is_array($value)) {
$this->container->setParameter($key, array_map($this->phpize(...), $value));
} else {
$this->container->setParameter($key, $this->phpize($value));
}
}
}

if ($this->env && \is_array($result['parameters@'.$this->env] ?? null)) {
foreach ($result['parameters@'.$this->env] as $key => $value) {
$this->container->setParameter($key, $this->phpize($value));
}
}

return null;
}

public function supports(mixed $resource, ?string $type = null): bool
{
if (!\is_string($resource)) {
return false;
}

if (null === $type && 'ini' === pathinfo($resource, \PATHINFO_EXTENSION)) {
return true;
}

return 'ini' === $type;
}






private function phpize(string $value): mixed
{

if ($value !== $v = rtrim($value)) {
$value = '""' === substr_replace($v, '', 1, -1) ? substr($v, 1, -1) : $v;
}
$lowercaseValue = strtolower($value);

return match (true) {
\defined($value) => \constant($value),
'yes' === $lowercaseValue,
'on' === $lowercaseValue => true,
'no' === $lowercaseValue,
'off' === $lowercaseValue,
'none' === $lowercaseValue => false,
isset($value[1]) && (
("'" === $value[0] && "'" === $value[\strlen($value) - 1])
|| ('"' === $value[0] && '"' === $value[\strlen($value) - 1])
) => substr($value, 1, -1), 
default => XmlUtils::phpize($value),
};
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
use Symfony\Component\Config\Exception\LoaderLoadException;
use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Config\Loader\FileLoader as BaseFileLoader;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Config\Resource\GlobResource;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Attribute\AsAlias;
use Symfony\Component\DependencyInjection\Attribute\Exclude;
use Symfony\Component\DependencyInjection\Attribute\When;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\Compiler\RegisterAutoconfigureAttributesPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;






abstract class FileLoader extends BaseFileLoader
{
public const ANONYMOUS_ID_REGEXP = '/^\.\d+_[^~]*+~[._a-zA-Z\d]{7}$/';

protected $container;
protected $isLoadingInstanceof = false;
protected $instanceof = [];
protected $interfaces = [];
protected $singlyImplemented = [];

protected $aliases = [];
protected $autoRegisterAliasesForSinglyImplementedInterfaces = true;

public function __construct(ContainerBuilder $container, FileLocatorInterface $locator, ?string $env = null)
{
$this->container = $container;

parent::__construct($locator, $env);
}




public function import(mixed $resource, ?string $type = null, bool|string $ignoreErrors = false, ?string $sourceResource = null, $exclude = null): mixed
{
$args = \func_get_args();

if ($ignoreNotFound = 'not_found' === $ignoreErrors) {
$args[2] = false;
} elseif (!\is_bool($ignoreErrors)) {
throw new \TypeError(\sprintf('Invalid argument $ignoreErrors provided to "%s::import()": boolean or "not_found" expected, "%s" given.', static::class, get_debug_type($ignoreErrors)));
}

try {
return parent::import(...$args);
} catch (LoaderLoadException $e) {
if (!$ignoreNotFound || !($prev = $e->getPrevious()) instanceof FileLocatorFileNotFoundException) {
throw $e;
}

foreach ($prev->getTrace() as $frame) {
if ('import' === ($frame['function'] ?? null) && is_a($frame['class'] ?? '', Loader::class, true)) {
break;
}
}

if (__FILE__ !== $frame['file']) {
throw $e;
}
}

return null;
}












public function registerClasses(Definition $prototype, string $namespace, string $resource, string|array|null $exclude = null)
{
if (!str_ends_with($namespace, '\\')) {
throw new InvalidArgumentException(\sprintf('Namespace prefix must end with a "\\": "%s".', $namespace));
}
if (!preg_match('/^(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+\\\\)++$/', $namespace)) {
throw new InvalidArgumentException(\sprintf('Namespace is not a valid PSR-4 prefix: "%s".', $namespace));
}

if (\is_array($exclude) && \in_array(null, $exclude, true)) {
throw new InvalidArgumentException('The exclude list must not contain a "null" value.');
}

if (\is_array($exclude) && \in_array('', $exclude, true)) {
throw new InvalidArgumentException('The exclude list must not contain an empty value.');
}

$source = \func_num_args() > 4 ? func_get_arg(4) : null;
$autoconfigureAttributes = new RegisterAutoconfigureAttributesPass();
$autoconfigureAttributes = $autoconfigureAttributes->accept($prototype) ? $autoconfigureAttributes : null;
$classes = $this->findClasses($namespace, $resource, (array) $exclude, $autoconfigureAttributes, $source);

$getPrototype = static fn () => clone $prototype;
$serialized = serialize($prototype);


if (strpos($serialized, 'O:48:"Symfony\Component\DependencyInjection\Definition"', 55)
|| strpos($serialized, 'O:53:"Symfony\Component\DependencyInjection\ChildDefinition"', 55)
) {

foreach (['Arguments', 'Properties', 'MethodCalls', 'Configurator', 'Factory', 'Bindings'] as $key) {
$serialized = serialize($prototype->{'get'.$key}());

if (strpos($serialized, 'O:48:"Symfony\Component\DependencyInjection\Definition"')
|| strpos($serialized, 'O:53:"Symfony\Component\DependencyInjection\ChildDefinition"')
) {
$getPrototype = static fn () => $getPrototype()->{'set'.$key}(unserialize($serialized));
}
}
}
unset($serialized);

foreach ($classes as $class => $errorMessage) {
if (null === $errorMessage && $autoconfigureAttributes) {
$r = $this->container->getReflectionClass($class);
if ($r->getAttributes(Exclude::class)[0] ?? null) {
$this->addContainerExcludedTag($class, $source);
continue;
}
if ($this->env) {
$attribute = null;
foreach ($r->getAttributes(When::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
if ($this->env === $attribute->newInstance()->env) {
$attribute = null;
break;
}
}
if (null !== $attribute) {
$this->addContainerExcludedTag($class, $source);
continue;
}
}
}

if (interface_exists($class, false)) {
$this->interfaces[] = $class;
} else {
$this->setDefinition($class, $definition = $getPrototype());
if (null !== $errorMessage) {
$definition->addError($errorMessage);

continue;
}
$definition->setClass($class);

$interfaces = [];
foreach (class_implements($class, false) as $interface) {
$this->singlyImplemented[$interface] = ($this->singlyImplemented[$interface] ?? $class) !== $class ? false : $class;
$interfaces[] = $interface;
}

if (!$autoconfigureAttributes) {
continue;
}
$r = $this->container->getReflectionClass($class);
$defaultAlias = 1 === \count($interfaces) ? $interfaces[0] : null;
foreach ($r->getAttributes(AsAlias::class) as $attr) {

$attribute = $attr->newInstance();
$alias = $attribute->id ?? $defaultAlias;
$public = $attribute->public;
if (null === $alias) {
throw new LogicException(\sprintf('Alias cannot be automatically determined for class "%s". If you have used the #[AsAlias] attribute with a class implementing multiple interfaces, add the interface you want to alias to the first parameter of #[AsAlias].', $class));
}
if (isset($this->aliases[$alias])) {
throw new LogicException(\sprintf('The "%s" alias has already been defined with the #[AsAlias] attribute in "%s".', $alias, $this->aliases[$alias]));
}
$this->aliases[$alias] = new Alias($class, $public);
}
}
}

foreach ($this->aliases as $alias => $aliasDefinition) {
$this->container->setAlias($alias, $aliasDefinition);
}

if ($this->autoRegisterAliasesForSinglyImplementedInterfaces) {
$this->registerAliasesForSinglyImplementedInterfaces();
}
}




public function registerAliasesForSinglyImplementedInterfaces()
{
foreach ($this->interfaces as $interface) {
if (!empty($this->singlyImplemented[$interface]) && !isset($this->aliases[$interface]) && !$this->container->has($interface)) {
$this->container->setAlias($interface, $this->singlyImplemented[$interface]);
}
}

$this->interfaces = $this->singlyImplemented = $this->aliases = [];
}






protected function setDefinition(string $id, Definition $definition)
{
$this->container->removeBindings($id);

foreach ($definition->getTag('container.error') as $error) {
if (isset($error['message'])) {
$definition->addError($error['message']);
}
}

if ($this->isLoadingInstanceof) {
if (!$definition instanceof ChildDefinition) {
throw new InvalidArgumentException(\sprintf('Invalid type definition "%s": ChildDefinition expected, "%s" given.', $id, get_debug_type($definition)));
}
$this->instanceof[$id] = $definition;
} else {
$this->container->setDefinition($id, $definition->setInstanceofConditionals($this->instanceof));
}
}

private function findClasses(string $namespace, string $pattern, array $excludePatterns, ?RegisterAutoconfigureAttributesPass $autoconfigureAttributes, ?string $source): array
{
$parameterBag = $this->container->getParameterBag();

$excludePaths = [];
$excludePrefix = null;
$excludePatterns = $parameterBag->unescapeValue($parameterBag->resolveValue($excludePatterns));
foreach ($excludePatterns as $excludePattern) {
foreach ($this->glob($excludePattern, true, $resource, true, true) as $path => $info) {
$excludePrefix ??= $resource->getPrefix();


$excludePaths[rtrim(str_replace('\\', '/', $path), '/')] = true;
}
}

$pattern = $parameterBag->unescapeValue($parameterBag->resolveValue($pattern));
$classes = [];
$prefixLen = null;
foreach ($this->glob($pattern, true, $resource, false, false, $excludePaths) as $path => $info) {
if (null === $prefixLen) {
$prefixLen = \strlen($resource->getPrefix());

if ($excludePrefix && !str_starts_with($excludePrefix, $resource->getPrefix())) {
throw new InvalidArgumentException(\sprintf('Invalid "exclude" pattern when importing classes for "%s": make sure your "exclude" pattern (%s) is a subset of the "resource" pattern (%s).', $namespace, $excludePattern, $pattern));
}
}

if (isset($excludePaths[str_replace('\\', '/', $path)])) {
continue;
}

if (!str_ends_with($path, '.php')) {
continue;
}
$class = $namespace.ltrim(str_replace('/', '\\', substr($path, $prefixLen, -4)), '\\');

if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $class)) {
continue;
}

try {
$r = $this->container->getReflectionClass($class);
} catch (\ReflectionException $e) {
$classes[$class] = $e->getMessage();
continue;
}

if (!$r) {
throw new InvalidArgumentException(\sprintf('Expected to find class "%s" in file "%s" while importing services from resource "%s", but it was not found! Check the namespace prefix used with the resource.', $class, $path, $pattern));
}

if ($r->isInstantiable() || $r->isInterface()) {
$classes[$class] = null;
}

if ($autoconfigureAttributes && !$r->isInstantiable()) {
$autoconfigureAttributes->processClass($this->container, $r);
}
}


if ($resource instanceof GlobResource) {
$this->container->addResource($resource);
} else {
foreach ($resource as $path) {
$this->container->fileExists($path, false);
}
}

if (null !== $prefixLen) {
foreach ($excludePaths as $path => $_) {
$class = $namespace.ltrim(str_replace('/', '\\', substr($path, $prefixLen, str_ends_with($path, '.php') ? -4 : null)), '\\');
$this->addContainerExcludedTag($class, $source);
}
}

return $classes;
}

private function addContainerExcludedTag(string $class, ?string $source): void
{
if ($this->container->has($class)) {
return;
}

static $attributes = [];

if (null !== $source && !isset($attributes[$source])) {
$attributes[$source] = ['source' => \sprintf('in "%s/%s"', basename(\dirname($source)), basename($source))];
}

$this->container->register($class, $class)
->setAbstract(true)
->addTag('container.excluded', null !== $source ? $attributes[$source] : []);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;






class XmlFileLoader extends FileLoader
{
public const NS = 'http://symfony.com/schema/dic/services';

protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;

public function load(mixed $resource, ?string $type = null): mixed
{
$path = $this->locator->locate($resource);

$xml = $this->parseFileToDOM($path);

$this->container->fileExists($path);

$this->loadXml($xml, $path);

if ($this->env) {
$xpath = new \DOMXPath($xml);
$xpath->registerNamespace('container', self::NS);
foreach ($xpath->query(\sprintf('//container:when[@env="%s"]', $this->env)) ?: [] as $root) {
$env = $this->env;
$this->env = null;
try {
$this->loadXml($xml, $path, $root);
} finally {
$this->env = $env;
}
}
}

return null;
}

private function loadXml(\DOMDocument $xml, string $path, ?\DOMNode $root = null): void
{
$defaults = $this->getServiceDefaults($xml, $path, $root);


$this->processAnonymousServices($xml, $path, $root);


$this->parseImports($xml, $path, $root);


$this->parseParameters($xml, $path, $root);


$this->loadFromExtensions($xml, $root);


try {
$this->parseDefinitions($xml, $path, $defaults, $root);
} finally {
$this->instanceof = [];
$this->registerAliasesForSinglyImplementedInterfaces();
}
}

public function supports(mixed $resource, ?string $type = null): bool
{
if (!\is_string($resource)) {
return false;
}

if (null === $type && 'xml' === pathinfo($resource, \PATHINFO_EXTENSION)) {
return true;
}

return 'xml' === $type;
}

private function parseParameters(\DOMDocument $xml, string $file, ?\DOMNode $root = null): void
{
if ($parameters = $this->getChildren($root ?? $xml->documentElement, 'parameters')) {
$this->container->getParameterBag()->add($this->getArgumentsAsPhp($parameters[0], 'parameter', $file));
}
}

private function parseImports(\DOMDocument $xml, string $file, ?\DOMNode $root = null): void
{
$xpath = new \DOMXPath($xml);
$xpath->registerNamespace('container', self::NS);

if (false === $imports = $xpath->query('./container:imports/container:import', $root)) {
return;
}

$defaultDirectory = \dirname($file);
foreach ($imports as $import) {
$this->setCurrentDir($defaultDirectory);
$this->import($import->getAttribute('resource'), XmlUtils::phpize($import->getAttribute('type')) ?: null, XmlUtils::phpize($import->getAttribute('ignore-errors')) ?: false, $file);
}
}

private function parseDefinitions(\DOMDocument $xml, string $file, Definition $defaults, ?\DOMNode $root = null): void
{
$xpath = new \DOMXPath($xml);
$xpath->registerNamespace('container', self::NS);

if (false === $services = $xpath->query('./container:services/container:service|./container:services/container:prototype|./container:services/container:stack', $root)) {
return;
}
$this->setCurrentDir(\dirname($file));

$this->instanceof = [];
$this->isLoadingInstanceof = true;
$instanceof = $xpath->query('./container:services/container:instanceof', $root);
foreach ($instanceof as $service) {
$this->setDefinition((string) $service->getAttribute('id'), $this->parseDefinition($service, $file, new Definition()));
}

$this->isLoadingInstanceof = false;
foreach ($services as $service) {
if ('stack' === $service->tagName) {
$service->setAttribute('parent', '-');
$definition = $this->parseDefinition($service, $file, $defaults)
->setTags(array_merge_recursive(['container.stack' => [[]]], $defaults->getTags()))
;
$this->setDefinition($id = (string) $service->getAttribute('id'), $definition);
$stack = [];

foreach ($this->getChildren($service, 'service') as $k => $frame) {
$k = $frame->getAttribute('id') ?: $k;
$frame->setAttribute('id', $id.'" at index "'.$k);

if ($alias = $frame->getAttribute('alias')) {
$this->validateAlias($frame, $file);
$stack[$k] = new Reference($alias);
} else {
$stack[$k] = $this->parseDefinition($frame, $file, $defaults)
->setInstanceofConditionals($this->instanceof);
}
}

$definition->setArguments($stack);
} elseif (null !== $definition = $this->parseDefinition($service, $file, $defaults)) {
if ('prototype' === $service->tagName) {
$excludes = array_column($this->getChildren($service, 'exclude'), 'nodeValue');
if ($service->hasAttribute('exclude')) {
if (\count($excludes) > 0) {
throw new InvalidArgumentException('You cannot use both the attribute "exclude" and <exclude> tags at the same time.');
}
$excludes = [$service->getAttribute('exclude')];
}
$this->registerClasses($definition, (string) $service->getAttribute('namespace'), (string) $service->getAttribute('resource'), $excludes, $file);
} else {
$this->setDefinition((string) $service->getAttribute('id'), $definition);
}
}
}
}

private function getServiceDefaults(\DOMDocument $xml, string $file, ?\DOMNode $root = null): Definition
{
$xpath = new \DOMXPath($xml);
$xpath->registerNamespace('container', self::NS);

if (null === $defaultsNode = $xpath->query('./container:services/container:defaults', $root)->item(0)) {
return new Definition();
}

$defaultsNode->setAttribute('id', '<defaults>');

return $this->parseDefinition($defaultsNode, $file, new Definition());
}




private function parseDefinition(\DOMElement $service, string $file, Definition $defaults): ?Definition
{
if ($alias = $service->getAttribute('alias')) {
$this->validateAlias($service, $file);

$this->container->setAlias($service->getAttribute('id'), $alias = new Alias($alias));
if ($publicAttr = $service->getAttribute('public')) {
$alias->setPublic(XmlUtils::phpize($publicAttr));
} elseif ($defaults->getChanges()['public'] ?? false) {
$alias->setPublic($defaults->isPublic());
}

if ($deprecated = $this->getChildren($service, 'deprecated')) {
$message = $deprecated[0]->nodeValue ?: '';
$package = $deprecated[0]->getAttribute('package') ?: '';
$version = $deprecated[0]->getAttribute('version') ?: '';

if (!$deprecated[0]->hasAttribute('package')) {
throw new InvalidArgumentException(\sprintf('Missing attribute "package" at node "deprecated" in "%s".', $file));
}

if (!$deprecated[0]->hasAttribute('version')) {
throw new InvalidArgumentException(\sprintf('Missing attribute "version" at node "deprecated" in "%s".', $file));
}

$alias->setDeprecated($package, $version, $message);
}

return null;
}

if ($this->isLoadingInstanceof) {
$definition = new ChildDefinition('');
} elseif ($parent = $service->getAttribute('parent')) {
$definition = new ChildDefinition($parent);
} else {
$definition = new Definition();
}

if ($defaults->getChanges()['public'] ?? false) {
$definition->setPublic($defaults->isPublic());
}
$definition->setAutowired($defaults->isAutowired());
$definition->setAutoconfigured($defaults->isAutoconfigured());
$definition->setChanges([]);

foreach (['class', 'public', 'shared', 'synthetic', 'abstract'] as $key) {
if ($value = $service->getAttribute($key)) {
$method = 'set'.$key;
$definition->$method(XmlUtils::phpize($value));
}
}

if ($value = $service->getAttribute('lazy')) {
$definition->setLazy((bool) $value = XmlUtils::phpize($value));
if (\is_string($value)) {
$definition->addTag('proxy', ['interface' => $value]);
}
}

if ($value = $service->getAttribute('autowire')) {
$definition->setAutowired(XmlUtils::phpize($value));
}

if ($value = $service->getAttribute('autoconfigure')) {
$definition->setAutoconfigured(XmlUtils::phpize($value));
}

if ($files = $this->getChildren($service, 'file')) {
$definition->setFile($files[0]->nodeValue);
}

if ($deprecated = $this->getChildren($service, 'deprecated')) {
$message = $deprecated[0]->nodeValue ?: '';
$package = $deprecated[0]->getAttribute('package') ?: '';
$version = $deprecated[0]->getAttribute('version') ?: '';

if (!$deprecated[0]->hasAttribute('package')) {
throw new InvalidArgumentException(\sprintf('Missing attribute "package" at node "deprecated" in "%s".', $file));
}

if (!$deprecated[0]->hasAttribute('version')) {
throw new InvalidArgumentException(\sprintf('Missing attribute "version" at node "deprecated" in "%s".', $file));
}

$definition->setDeprecated($package, $version, $message);
}

$definition->setArguments($this->getArgumentsAsPhp($service, 'argument', $file, $definition instanceof ChildDefinition));
$definition->setProperties($this->getArgumentsAsPhp($service, 'property', $file));

if ($factories = $this->getChildren($service, 'factory')) {
$factory = $factories[0];
if ($function = $factory->getAttribute('function')) {
$definition->setFactory($function);
} elseif ($expression = $factory->getAttribute('expression')) {
if (!class_exists(Expression::class)) {
throw new \LogicException('The "expression" attribute cannot be used on factories without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}
$definition->setFactory('@='.$expression);
} else {
if ($childService = $factory->getAttribute('service')) {
$class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
} else {
$class = $factory->hasAttribute('class') ? $factory->getAttribute('class') : null;
}

$definition->setFactory([$class, $factory->getAttribute('method') ?: '__invoke']);
}
}

if ($constructor = $service->getAttribute('constructor')) {
if (null !== $definition->getFactory()) {
throw new LogicException(\sprintf('The "%s" service cannot declare a factory as well as a constructor.', $service->getAttribute('id')));
}

$definition->setFactory([null, $constructor]);
}

if ($configurators = $this->getChildren($service, 'configurator')) {
$configurator = $configurators[0];
if ($function = $configurator->getAttribute('function')) {
$definition->setConfigurator($function);
} else {
if ($childService = $configurator->getAttribute('service')) {
$class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
} else {
$class = $configurator->getAttribute('class');
}

$definition->setConfigurator([$class, $configurator->getAttribute('method') ?: '__invoke']);
}
}

foreach ($this->getChildren($service, 'call') as $call) {
$definition->addMethodCall(
$call->getAttribute('method'),
$this->getArgumentsAsPhp($call, 'argument', $file),
XmlUtils::phpize($call->getAttribute('returns-clone')) ?: false
);
}

$tags = $this->getChildren($service, 'tag');

foreach ($tags as $tag) {
$tagNameComesFromAttribute = $tag->childElementCount || '' === $tag->nodeValue;
if ('' === $tagName = $tagNameComesFromAttribute ? $tag->getAttribute('name') : $tag->nodeValue) {
throw new InvalidArgumentException(\sprintf('The tag name for service "%s" in "%s" must be a non-empty string.', (string) $service->getAttribute('id'), $file));
}

$parameters = $this->getTagAttributes($tag, \sprintf('The attribute name of tag "%s" for service "%s" in %s must be a non-empty string.', $tagName, (string) $service->getAttribute('id'), $file));
foreach ($tag->attributes as $name => $node) {
if ($tagNameComesFromAttribute && 'name' === $name) {
continue;
}

if (str_contains($name, '-') && !str_contains($name, '_') && !\array_key_exists($normalizedName = str_replace('-', '_', $name), $parameters)) {
$parameters[$normalizedName] = XmlUtils::phpize($node->nodeValue);
}

$parameters[$name] = XmlUtils::phpize($node->nodeValue);
}

$definition->addTag($tagName, $parameters);
}

$definition->setTags(array_merge_recursive($definition->getTags(), $defaults->getTags()));

$bindings = $this->getArgumentsAsPhp($service, 'bind', $file);
$bindingType = $this->isLoadingInstanceof ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING;
foreach ($bindings as $argument => $value) {
$bindings[$argument] = new BoundArgument($value, true, $bindingType, $file);
}


$bindings = array_merge(unserialize(serialize($defaults->getBindings())), $bindings);

if ($bindings) {
$definition->setBindings($bindings);
}

if ($decorates = $service->getAttribute('decorates')) {
$decorationOnInvalid = $service->getAttribute('decoration-on-invalid') ?: 'exception';
if ('exception' === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
} elseif ('ignore' === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
} elseif ('null' === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
} else {
throw new InvalidArgumentException(\sprintf('Invalid value "%s" for attribute "decoration-on-invalid" on service "%s". Did you mean "exception", "ignore" or "null" in "%s"?', $decorationOnInvalid, $service->getAttribute('id'), $file));
}

$renameId = $service->hasAttribute('decoration-inner-name') ? $service->getAttribute('decoration-inner-name') : null;
$priority = $service->hasAttribute('decoration-priority') ? $service->getAttribute('decoration-priority') : 0;

$definition->setDecoratedService($decorates, $renameId, $priority, $invalidBehavior);
}

if ($callable = $this->getChildren($service, 'from-callable')) {
if ($definition instanceof ChildDefinition) {
throw new InvalidArgumentException(\sprintf('Attribute "parent" is unsupported when using "<from-callable>" on service "%s".', (string) $service->getAttribute('id')));
}

foreach ([
'Attribute "synthetic"' => 'isSynthetic',
'Attribute "file"' => 'getFile',
'Tag "<factory>"' => 'getFactory',
'Tag "<argument>"' => 'getArguments',
'Tag "<property>"' => 'getProperties',
'Tag "<configurator>"' => 'getConfigurator',
'Tag "<call>"' => 'getMethodCalls',
] as $key => $method) {
if ($definition->$method()) {
throw new InvalidArgumentException($key.\sprintf(' is unsupported when using "<from-callable>" on service "%s".', (string) $service->getAttribute('id')));
}
}

$definition->setFactory(['Closure', 'fromCallable']);

if ('Closure' !== ($definition->getClass() ?? 'Closure')) {
$definition->setLazy(true);
} else {
$definition->setClass('Closure');
}

$callable = $callable[0];
if ($function = $callable->getAttribute('function')) {
$definition->setArguments([$function]);
} elseif ($expression = $callable->getAttribute('expression')) {
if (!class_exists(Expression::class)) {
throw new \LogicException('The "expression" attribute cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}
$definition->setArguments(['@='.$expression]);
} else {
if ($childService = $callable->getAttribute('service')) {
$class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
} else {
$class = $callable->hasAttribute('class') ? $callable->getAttribute('class') : null;
}

$definition->setArguments([[$class, $callable->getAttribute('method') ?: '__invoke']]);
}
}

return $definition;
}






private function parseFileToDOM(string $file): \DOMDocument
{
try {
$dom = XmlUtils::loadFile($file, $this->validateSchema(...));
} catch (\InvalidArgumentException $e) {
$invalidSecurityElements = [];
$errors = explode("\n", $e->getMessage());
foreach ($errors as $i => $error) {
if (preg_match("#^\[ERROR 1871] Element '\{http://symfony\.com/schema/dic/security}([^']+)'#", $error, $matches)) {
$invalidSecurityElements[$i] = $matches[1];
}
}
if ($invalidSecurityElements) {
$dom = XmlUtils::loadFile($file);

foreach ($invalidSecurityElements as $errorIndex => $tagName) {
foreach ($dom->getElementsByTagNameNS('http://symfony.com/schema/dic/security', $tagName) as $element) {
if (!$parent = $element->parentNode) {
continue;
}
if ('http://symfony.com/schema/dic/security' !== $parent->namespaceURI) {
continue;
}
if ('provider' === $parent->localName || 'firewall' === $parent->localName) {
unset($errors[$errorIndex]);
}
}
}
}
if ($errors) {
throw new InvalidArgumentException(\sprintf('Unable to parse file "%s": ', $file).implode("\n", $errors), $e->getCode(), $e);
}
}

$this->validateExtensions($dom, $file);

return $dom;
}




private function processAnonymousServices(\DOMDocument $xml, string $file, ?\DOMNode $root = null): void
{
$definitions = [];
$count = 0;
$suffix = '~'.ContainerBuilder::hash($file);

$xpath = new \DOMXPath($xml);
$xpath->registerNamespace('container', self::NS);


if (false !== $nodes = $xpath->query('.//container:argument[@type="service"][not(@id)]|.//container:property[@type="service"][not(@id)]|.//container:bind[not(@id)]|.//container:factory[not(@service)]|.//container:configurator[not(@service)]', $root)) {
foreach ($nodes as $node) {
if ($services = $this->getChildren($node, 'service')) {

$id = \sprintf('.%d_%s', ++$count, preg_replace('/^.*\\\\/', '', $services[0]->getAttribute('class')).$suffix);
$node->setAttribute('id', $id);
$node->setAttribute('service', $id);

$definitions[$id] = [$services[0], $file];
$services[0]->setAttribute('id', $id);



$services[0]->setAttribute('public', 'false');
}
}
}


if (false !== $nodes = $xpath->query('.//container:services/container:service[not(@id)]', $root)) {
foreach ($nodes as $node) {
throw new InvalidArgumentException(\sprintf('Top-level services must have "id" attribute, none found in "%s" at line %d.', $file, $node->getLineNo()));
}
}


uksort($definitions, 'strnatcmp');
foreach (array_reverse($definitions) as $id => [$domElement, $file]) {
if (null !== $definition = $this->parseDefinition($domElement, $file, new Definition())) {
$this->setDefinition($id, $definition);
}
}
}

private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file, bool $isChildDefinition = false): array
{
$arguments = [];
foreach ($this->getChildren($node, $name) as $arg) {
if ($arg->hasAttribute('name')) {
$arg->setAttribute('key', $arg->getAttribute('name'));
}



if ($arg->hasAttribute('index')) {
$key = ($isChildDefinition ? 'index_' : '').$arg->getAttribute('index');
} elseif (!$arg->hasAttribute('key')) {

$arguments[] = null;
$keys = array_keys($arguments);
$key = array_pop($keys);
} else {
$key = $arg->getAttribute('key');
}

$trim = $arg->hasAttribute('trim') && XmlUtils::phpize($arg->getAttribute('trim'));
$onInvalid = $arg->getAttribute('on-invalid');
$invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
if ('ignore' == $onInvalid) {
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
} elseif ('ignore_uninitialized' == $onInvalid) {
$invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE;
} elseif ('null' == $onInvalid) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
}

switch ($type = $arg->getAttribute('type')) {
case 'service':
if ('' === $arg->getAttribute('id')) {
throw new InvalidArgumentException(\sprintf('Tag "<%s>" with type="service" has no or empty "id" attribute in "%s".', $name, $file));
}

$arguments[$key] = new Reference($arg->getAttribute('id'), $invalidBehavior);
break;
case 'expression':
if (!class_exists(Expression::class)) {
throw new \LogicException('The type="expression" attribute cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}

$arguments[$key] = new Expression($arg->nodeValue);
break;
case 'collection':
$arguments[$key] = $this->getArgumentsAsPhp($arg, $name, $file);
break;
case 'iterator':
$arg = $this->getArgumentsAsPhp($arg, $name, $file);
$arguments[$key] = new IteratorArgument($arg);
break;
case 'closure':
case 'service_closure':
if ('' !== $arg->getAttribute('id')) {
$arg = new Reference($arg->getAttribute('id'), $invalidBehavior);
} else {
$arg = $this->getArgumentsAsPhp($arg, $name, $file);
}
$arguments[$key] = match ($type) {
'service_closure' => new ServiceClosureArgument($arg),
'closure' => (new Definition('Closure'))
->setFactory(['Closure', 'fromCallable'])
->addArgument($arg),
};
break;
case 'service_locator':
$arg = $this->getArgumentsAsPhp($arg, $name, $file);

if (isset($arg[0])) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Skipping "key" argument or using integers as values in a "service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.');
}

$arguments[$key] = new ServiceLocatorArgument($arg);
break;
case 'tagged':
case 'tagged_iterator':
case 'tagged_locator':
$forLocator = 'tagged_locator' === $type;

if (!$arg->getAttribute('tag')) {
throw new InvalidArgumentException(\sprintf('Tag "<%s>" with type="%s" has no or empty "tag" attribute in "%s".', $name, $type, $file));
}

$excludes = array_column($this->getChildren($arg, 'exclude'), 'nodeValue');
if ($arg->hasAttribute('exclude')) {
if (\count($excludes) > 0) {
throw new InvalidArgumentException('You cannot use both the attribute "exclude" and <exclude> tags at the same time.');
}
$excludes = [$arg->getAttribute('exclude')];
}

$arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag'), $arg->getAttribute('index-by') ?: null, $arg->getAttribute('default-index-method') ?: null, $forLocator, $arg->getAttribute('default-priority-method') ?: null, $excludes, !$arg->hasAttribute('exclude-self') || XmlUtils::phpize($arg->getAttribute('exclude-self')));

if ($forLocator) {
$arguments[$key] = new ServiceLocatorArgument($arguments[$key]);
}
break;
case 'binary':
if (false === $value = base64_decode($arg->nodeValue)) {
throw new InvalidArgumentException(\sprintf('Tag "<%s>" with type="binary" is not a valid base64 encoded string.', $name));
}
$arguments[$key] = $value;
break;
case 'abstract':
$arguments[$key] = new AbstractArgument($arg->nodeValue);
break;
case 'string':
$arguments[$key] = $trim ? trim($arg->nodeValue) : $arg->nodeValue;
break;
case 'constant':
$arguments[$key] = \constant(trim($arg->nodeValue));
break;
default:
$arguments[$key] = XmlUtils::phpize($trim ? trim($arg->nodeValue) : $arg->nodeValue);
}
}

return $arguments;
}






private function getChildren(\DOMNode $node, string $name): array
{
$children = [];
foreach ($node->childNodes as $child) {
if ($child instanceof \DOMElement && $child->localName === $name && self::NS === $child->namespaceURI) {
$children[] = $child;
}
}

return $children;
}

private function getTagAttributes(\DOMNode $node, string $missingName): array
{
$parameters = [];
$children = $this->getChildren($node, 'attribute');

foreach ($children as $childNode) {
if ('' === $name = $childNode->getAttribute('name')) {
throw new InvalidArgumentException($missingName);
}

if ($this->getChildren($childNode, 'attribute')) {
$parameters[$name] = $this->getTagAttributes($childNode, $missingName);
} else {
if (str_contains($name, '-') && !str_contains($name, '_') && !\array_key_exists($normalizedName = str_replace('-', '_', $name), $parameters)) {
$parameters[$normalizedName] = XmlUtils::phpize($childNode->nodeValue);
}

$parameters[$name] = XmlUtils::phpize($childNode->nodeValue);
}
}

return $parameters;
}






public function validateSchema(\DOMDocument $dom): bool
{
$schemaLocations = ['http://symfony.com/schema/dic/services' => str_replace('\\', '/', __DIR__.'/schema/dic/services/services-1.0.xsd')];

if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) {
$items = preg_split('/\s+/', $element);
for ($i = 0, $nb = \count($items); $i < $nb; $i += 2) {
if (!$this->container->hasExtension($items[$i])) {
continue;
}

if (($extension = $this->container->getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) {
$ns = $extension->getNamespace();
$path = str_replace([$ns, str_replace('http://', 'https://', $ns)], str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]);

if (!is_file($path)) {
throw new RuntimeException(\sprintf('Extension "%s" references a non-existent XSD file "%s".', get_debug_type($extension), $path));
}

$schemaLocations[$items[$i]] = $path;
}
}
}

$tmpfiles = [];
$imports = '';
foreach ($schemaLocations as $namespace => $location) {
$parts = explode('/', $location);
$locationstart = 'file:///';
if (0 === stripos($location, 'phar://')) {
$tmpfile = tempnam(sys_get_temp_dir(), 'symfony');
if ($tmpfile) {
copy($location, $tmpfile);
$tmpfiles[] = $tmpfile;
$parts = explode('/', str_replace('\\', '/', $tmpfile));
} else {
array_shift($parts);
$locationstart = 'phar:///';
}
} elseif ('\\' === \DIRECTORY_SEPARATOR && str_starts_with($location, '\\\\')) {
$locationstart = '';
}
$drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
$location = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts));

$imports .= \sprintf('  <xsd:import namespace="%s" schemaLocation="%s" />'."\n", $namespace, $location);
}

$source = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns="http://symfony.com/schema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema"
    elementFormDefault="qualified">

    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
$imports
</xsd:schema>
EOF
;

if ($this->shouldEnableEntityLoader()) {
$disableEntities = libxml_disable_entity_loader(false);
$valid = @$dom->schemaValidateSource($source);
libxml_disable_entity_loader($disableEntities);
} else {
$valid = @$dom->schemaValidateSource($source);
}
foreach ($tmpfiles as $tmpfile) {
@unlink($tmpfile);
}

return $valid;
}

private function shouldEnableEntityLoader(): bool
{
static $dom, $schema;
if (null === $dom) {
$dom = new \DOMDocument();
$dom->loadXML('<?xml version="1.0"?><test/>');

$tmpfile = tempnam(sys_get_temp_dir(), 'symfony');
register_shutdown_function(static function () use ($tmpfile) {
@unlink($tmpfile);
});
$schema = '<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:include schemaLocation="file:///'.rawurlencode(str_replace('\\', '/', $tmpfile)).'" />
</xsd:schema>';
file_put_contents($tmpfile, '<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="test" type="testType" />
  <xsd:complexType name="testType"/>
</xsd:schema>');
}

return !@$dom->schemaValidateSource($schema);
}

private function validateAlias(\DOMElement $alias, string $file): void
{
foreach ($alias->attributes as $name => $node) {
if (!\in_array($name, ['alias', 'id', 'public'])) {
throw new InvalidArgumentException(\sprintf('Invalid attribute "%s" defined for alias "%s" in "%s".', $name, $alias->getAttribute('id'), $file));
}
}

foreach ($alias->childNodes as $child) {
if (!$child instanceof \DOMElement || self::NS !== $child->namespaceURI) {
continue;
}
if ('deprecated' !== $child->localName) {
throw new InvalidArgumentException(\sprintf('Invalid child element "%s" defined for alias "%s" in "%s".', $child->localName, $alias->getAttribute('id'), $file));
}
}
}






private function validateExtensions(\DOMDocument $dom, string $file): void
{
foreach ($dom->documentElement->childNodes as $node) {
if (!$node instanceof \DOMElement || 'http://symfony.com/schema/dic/services' === $node->namespaceURI) {
continue;
}


if (!$this->container->hasExtension($node->namespaceURI)) {
$extensionNamespaces = array_filter(array_map(fn (ExtensionInterface $ext) => $ext->getNamespace(), $this->container->getExtensions()));
throw new InvalidArgumentException(\sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $node->tagName, $file, $node->namespaceURI, $extensionNamespaces ? implode('", "', $extensionNamespaces) : 'none'));
}
}
}




private function loadFromExtensions(\DOMDocument $xml): void
{
foreach ($xml->documentElement->childNodes as $node) {
if (!$node instanceof \DOMElement || self::NS === $node->namespaceURI) {
continue;
}

$values = static::convertDomElementToArray($node);
if (!\is_array($values)) {
$values = [];
}

$this->container->loadFromExtension($node->namespaceURI, $values);
}
}


















public static function convertDomElementToArray(\DOMElement $element): mixed
{
return XmlUtils::convertDomElementToArray($element, false);
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\AbstractArgument;
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\Yaml\Tag\TaggedValue;
use Symfony\Component\Yaml\Yaml;






class YamlFileLoader extends FileLoader
{
private const SERVICE_KEYWORDS = [
'alias' => 'alias',
'parent' => 'parent',
'class' => 'class',
'shared' => 'shared',
'synthetic' => 'synthetic',
'lazy' => 'lazy',
'public' => 'public',
'abstract' => 'abstract',
'deprecated' => 'deprecated',
'factory' => 'factory',
'file' => 'file',
'arguments' => 'arguments',
'properties' => 'properties',
'configurator' => 'configurator',
'calls' => 'calls',
'tags' => 'tags',
'decorates' => 'decorates',
'decoration_inner_name' => 'decoration_inner_name',
'decoration_priority' => 'decoration_priority',
'decoration_on_invalid' => 'decoration_on_invalid',
'autowire' => 'autowire',
'autoconfigure' => 'autoconfigure',
'bind' => 'bind',
'constructor' => 'constructor',
];

private const PROTOTYPE_KEYWORDS = [
'resource' => 'resource',
'namespace' => 'namespace',
'exclude' => 'exclude',
'parent' => 'parent',
'shared' => 'shared',
'lazy' => 'lazy',
'public' => 'public',
'abstract' => 'abstract',
'deprecated' => 'deprecated',
'factory' => 'factory',
'arguments' => 'arguments',
'properties' => 'properties',
'configurator' => 'configurator',
'calls' => 'calls',
'tags' => 'tags',
'autowire' => 'autowire',
'autoconfigure' => 'autoconfigure',
'bind' => 'bind',
'constructor' => 'constructor',
];

private const INSTANCEOF_KEYWORDS = [
'shared' => 'shared',
'lazy' => 'lazy',
'public' => 'public',
'properties' => 'properties',
'configurator' => 'configurator',
'calls' => 'calls',
'tags' => 'tags',
'autowire' => 'autowire',
'bind' => 'bind',
'constructor' => 'constructor',
];

private const DEFAULTS_KEYWORDS = [
'public' => 'public',
'tags' => 'tags',
'autowire' => 'autowire',
'autoconfigure' => 'autoconfigure',
'bind' => 'bind',
];

private YamlParser $yamlParser;

private int $anonymousServicesCount;
private string $anonymousServicesSuffix;

protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;

public function load(mixed $resource, ?string $type = null): mixed
{
$path = $this->locator->locate($resource);

$content = $this->loadFile($path);

$this->container->fileExists($path);


if (null === $content) {
return null;
}

$this->loadContent($content, $path);


if ($this->env && isset($content['when@'.$this->env])) {
if (!\is_array($content['when@'.$this->env])) {
throw new InvalidArgumentException(\sprintf('The "when@%s" key should contain an array in "%s". Check your YAML syntax.', $this->env, $path));
}

$env = $this->env;
$this->env = null;
try {
$this->loadContent($content['when@'.$env], $path);
} finally {
$this->env = $env;
}
}

return null;
}

private function loadContent(array $content, string $path): void
{

$this->parseImports($content, $path);


if (isset($content['parameters'])) {
if (!\is_array($content['parameters'])) {
throw new InvalidArgumentException(\sprintf('The "parameters" key should contain an array in "%s". Check your YAML syntax.', $path));
}

foreach ($content['parameters'] as $key => $value) {
$this->container->setParameter($key, $this->resolveServices($value, $path, true));
}
}


$this->loadFromExtensions($content);


$this->anonymousServicesCount = 0;
$this->anonymousServicesSuffix = '~'.ContainerBuilder::hash($path);
$this->setCurrentDir(\dirname($path));
try {
$this->parseDefinitions($content, $path);
} finally {
$this->instanceof = [];
$this->registerAliasesForSinglyImplementedInterfaces();
}
}

public function supports(mixed $resource, ?string $type = null): bool
{
if (!\is_string($resource)) {
return false;
}

if (null === $type && \in_array(pathinfo($resource, \PATHINFO_EXTENSION), ['yaml', 'yml'], true)) {
return true;
}

return \in_array($type, ['yaml', 'yml'], true);
}

private function parseImports(array $content, string $file): void
{
if (!isset($content['imports'])) {
return;
}

if (!\is_array($content['imports'])) {
throw new InvalidArgumentException(\sprintf('The "imports" key should contain an array in "%s". Check your YAML syntax.', $file));
}

$defaultDirectory = \dirname($file);
foreach ($content['imports'] as $import) {
if (!\is_array($import)) {
$import = ['resource' => $import];
}
if (!isset($import['resource'])) {
throw new InvalidArgumentException(\sprintf('An import should provide a resource in "%s". Check your YAML syntax.', $file));
}

$this->setCurrentDir($defaultDirectory);
$this->import($import['resource'], $import['type'] ?? null, $import['ignore_errors'] ?? false, $file);
}
}

private function parseDefinitions(array $content, string $file, bool $trackBindings = true): void
{
if (!isset($content['services'])) {
return;
}

if (!\is_array($content['services'])) {
throw new InvalidArgumentException(\sprintf('The "services" key should contain an array in "%s". Check your YAML syntax.', $file));
}

if (\array_key_exists('_instanceof', $content['services'])) {
$instanceof = $content['services']['_instanceof'];
unset($content['services']['_instanceof']);

if (!\is_array($instanceof)) {
throw new InvalidArgumentException(\sprintf('Service "_instanceof" key must be an array, "%s" given in "%s".', get_debug_type($instanceof), $file));
}
$this->instanceof = [];
$this->isLoadingInstanceof = true;
foreach ($instanceof as $id => $service) {
if (!$service || !\is_array($service)) {
throw new InvalidArgumentException(\sprintf('Type definition "%s" must be a non-empty array within "_instanceof" in "%s". Check your YAML syntax.', $id, $file));
}
if (\is_string($service) && str_starts_with($service, '@')) {
throw new InvalidArgumentException(\sprintf('Type definition "%s" cannot be an alias within "_instanceof" in "%s". Check your YAML syntax.', $id, $file));
}
$this->parseDefinition($id, $service, $file, [], false, $trackBindings);
}
}

$this->isLoadingInstanceof = false;
$defaults = $this->parseDefaults($content, $file);
foreach ($content['services'] as $id => $service) {
$this->parseDefinition($id, $service, $file, $defaults, false, $trackBindings);
}
}




private function parseDefaults(array &$content, string $file): array
{
if (!\array_key_exists('_defaults', $content['services'])) {
return [];
}
$defaults = $content['services']['_defaults'];
unset($content['services']['_defaults']);

if (!\is_array($defaults)) {
throw new InvalidArgumentException(\sprintf('Service "_defaults" key must be an array, "%s" given in "%s".', get_debug_type($defaults), $file));
}

foreach ($defaults as $key => $default) {
if (!isset(self::DEFAULTS_KEYWORDS[$key])) {
throw new InvalidArgumentException(\sprintf('The configuration key "%s" cannot be used to define a default value in "%s". Allowed keys are "%s".', $key, $file, implode('", "', self::DEFAULTS_KEYWORDS)));
}
}

if (isset($defaults['tags'])) {
if (!\is_array($tags = $defaults['tags'])) {
throw new InvalidArgumentException(\sprintf('Parameter "tags" in "_defaults" must be an array in "%s". Check your YAML syntax.', $file));
}

foreach ($tags as $tag) {
if (!\is_array($tag)) {
$tag = ['name' => $tag];
}

if (1 === \count($tag) && \is_array(current($tag))) {
$name = key($tag);
$tag = current($tag);
} else {
if (!isset($tag['name'])) {
throw new InvalidArgumentException(\sprintf('A "tags" entry in "_defaults" is missing a "name" key in "%s".', $file));
}
$name = $tag['name'];
unset($tag['name']);
}

if (!\is_string($name) || '' === $name) {
throw new InvalidArgumentException(\sprintf('The tag name in "_defaults" must be a non-empty string in "%s".', $file));
}

$this->validateAttributes(\sprintf('Tag "%s", attribute "%s" in "_defaults" must be of a scalar-type in "%s". Check your YAML syntax.', $name, '%s', $file), $tag);
}
}

if (isset($defaults['bind'])) {
if (!\is_array($defaults['bind'])) {
throw new InvalidArgumentException(\sprintf('Parameter "bind" in "_defaults" must be an array in "%s". Check your YAML syntax.', $file));
}

foreach ($this->resolveServices($defaults['bind'], $file) as $argument => $value) {
$defaults['bind'][$argument] = new BoundArgument($value, true, BoundArgument::DEFAULTS_BINDING, $file);
}
}

return $defaults;
}

private function isUsingShortSyntax(array $service): bool
{
foreach ($service as $key => $value) {
if (\is_string($key) && ('' === $key || ('$' !== $key[0] && !str_contains($key, '\\')))) {
return false;
}
}

return true;
}




private function parseDefinition(string $id, array|string|null $service, string $file, array $defaults, bool $return = false, bool $trackBindings = true): Definition|Alias|null
{
if (preg_match('/^_[a-zA-Z0-9_]*$/', $id)) {
throw new InvalidArgumentException(\sprintf('Service names that start with an underscore are reserved. Rename the "%s" service or define it in XML instead.', $id));
}

if (\is_string($service) && str_starts_with($service, '@')) {
$alias = new Alias(substr($service, 1));

if (isset($defaults['public'])) {
$alias->setPublic($defaults['public']);
}

return $return ? $alias : $this->container->setAlias($id, $alias);
}

if (\is_array($service) && $this->isUsingShortSyntax($service)) {
$service = ['arguments' => $service];
}

if (!\is_array($service ??= [])) {
throw new InvalidArgumentException(\sprintf('A service definition must be an array or a string starting with "@" but "%s" found for service "%s" in "%s". Check your YAML syntax.', get_debug_type($service), $id, $file));
}

if (isset($service['stack'])) {
if (!\is_array($service['stack'])) {
throw new InvalidArgumentException(\sprintf('A stack must be an array of definitions, "%s" given for service "%s" in "%s". Check your YAML syntax.', get_debug_type($service), $id, $file));
}

$stack = [];

foreach ($service['stack'] as $k => $frame) {
if (\is_array($frame) && 1 === \count($frame) && !isset(self::SERVICE_KEYWORDS[key($frame)])) {
$frame = [
'class' => key($frame),
'arguments' => current($frame),
];
}

if (\is_array($frame) && isset($frame['stack'])) {
throw new InvalidArgumentException(\sprintf('Service stack "%s" cannot contain another stack in "%s".', $id, $file));
}

$definition = $this->parseDefinition($id.'" at index "'.$k, $frame, $file, $defaults, true);

if ($definition instanceof Definition) {
$definition->setInstanceofConditionals($this->instanceof);
}

$stack[$k] = $definition;
}

if ($diff = array_diff(array_keys($service), ['stack', 'public', 'deprecated'])) {
throw new InvalidArgumentException(\sprintf('Invalid attribute "%s"; supported ones are "public" and "deprecated" for service "%s" in "%s". Check your YAML syntax.', implode('", "', $diff), $id, $file));
}

$service = [
'parent' => '',
'arguments' => $stack,
'tags' => ['container.stack'],
'public' => $service['public'] ?? null,
'deprecated' => $service['deprecated'] ?? null,
];
}

$definition = isset($service[0]) && $service[0] instanceof Definition ? array_shift($service) : null;
$return = null === $definition ? $return : true;

if (isset($service['from_callable'])) {
foreach (['alias', 'parent', 'synthetic', 'factory', 'file', 'arguments', 'properties', 'configurator', 'calls'] as $key) {
if (isset($service['factory'])) {
throw new InvalidArgumentException(\sprintf('The configuration key "%s" is unsupported for the service "%s" when using "from_callable" in "%s".', $key, $id, $file));
}
}

if ('Closure' !== $service['class'] ??= 'Closure') {
$service['lazy'] = true;
}

$service['factory'] = ['Closure', 'fromCallable'];
$service['arguments'] = [$service['from_callable']];
unset($service['from_callable']);
}

$this->checkDefinition($id, $service, $file);

if (isset($service['alias'])) {
$alias = new Alias($service['alias']);

if (isset($service['public'])) {
$alias->setPublic($service['public']);
} elseif (isset($defaults['public'])) {
$alias->setPublic($defaults['public']);
}

foreach ($service as $key => $value) {
if (!\in_array($key, ['alias', 'public', 'deprecated'])) {
throw new InvalidArgumentException(\sprintf('The configuration key "%s" is unsupported for the service "%s" which is defined as an alias in "%s". Allowed configuration keys for service aliases are "alias", "public" and "deprecated".', $key, $id, $file));
}

if ('deprecated' === $key) {
$deprecation = \is_array($value) ? $value : ['message' => $value];

if (!isset($deprecation['package'])) {
throw new InvalidArgumentException(\sprintf('Missing attribute "package" of the "deprecated" option in "%s".', $file));
}

if (!isset($deprecation['version'])) {
throw new InvalidArgumentException(\sprintf('Missing attribute "version" of the "deprecated" option in "%s".', $file));
}

$alias->setDeprecated($deprecation['package'] ?? '', $deprecation['version'] ?? '', $deprecation['message'] ?? '');
}
}

return $return ? $alias : $this->container->setAlias($id, $alias);
}

$changes = [];
if (null !== $definition) {
$changes = $definition->getChanges();
} elseif ($this->isLoadingInstanceof) {
$definition = new ChildDefinition('');
} elseif (isset($service['parent'])) {
if ('' !== $service['parent'] && '@' === $service['parent'][0]) {
throw new InvalidArgumentException(\sprintf('The value of the "parent" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['parent'], substr($service['parent'], 1)));
}

$definition = new ChildDefinition($service['parent']);
} else {
$definition = new Definition();
}

if (isset($defaults['public'])) {
$definition->setPublic($defaults['public']);
}
if (isset($defaults['autowire'])) {
$definition->setAutowired($defaults['autowire']);
}
if (isset($defaults['autoconfigure'])) {
$definition->setAutoconfigured($defaults['autoconfigure']);
}

$definition->setChanges($changes);

if (isset($service['class'])) {
$definition->setClass($service['class']);
}

if (isset($service['shared'])) {
$definition->setShared($service['shared']);
}

if (isset($service['synthetic'])) {
$definition->setSynthetic($service['synthetic']);
}

if (isset($service['lazy'])) {
$definition->setLazy((bool) $service['lazy']);
if (\is_string($service['lazy'])) {
$definition->addTag('proxy', ['interface' => $service['lazy']]);
}
}

if (isset($service['public'])) {
$definition->setPublic($service['public']);
}

if (isset($service['abstract'])) {
$definition->setAbstract($service['abstract']);
}

if (isset($service['deprecated'])) {
$deprecation = \is_array($service['deprecated']) ? $service['deprecated'] : ['message' => $service['deprecated']];

if (!isset($deprecation['package'])) {
throw new InvalidArgumentException(\sprintf('Missing attribute "package" of the "deprecated" option in "%s".', $file));
}

if (!isset($deprecation['version'])) {
throw new InvalidArgumentException(\sprintf('Missing attribute "version" of the "deprecated" option in "%s".', $file));
}

$definition->setDeprecated($deprecation['package'] ?? '', $deprecation['version'] ?? '', $deprecation['message'] ?? '');
}

if (isset($service['factory'])) {
$definition->setFactory($this->parseCallable($service['factory'], 'factory', $id, $file));
}

if (isset($service['constructor'])) {
if (null !== $definition->getFactory()) {
throw new LogicException(\sprintf('The "%s" service cannot declare a factory as well as a constructor.', $id));
}

$definition->setFactory([null, $service['constructor']]);
}

if (isset($service['file'])) {
$definition->setFile($service['file']);
}

if (isset($service['arguments'])) {
$definition->setArguments($this->resolveServices($service['arguments'], $file));
}

if (isset($service['properties'])) {
$definition->setProperties($this->resolveServices($service['properties'], $file));
}

if (isset($service['configurator'])) {
$definition->setConfigurator($this->parseCallable($service['configurator'], 'configurator', $id, $file));
}

if (isset($service['calls'])) {
if (!\is_array($service['calls'])) {
throw new InvalidArgumentException(\sprintf('Parameter "calls" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}

foreach ($service['calls'] as $k => $call) {
if (!\is_array($call) && (!\is_string($k) || !$call instanceof TaggedValue)) {
throw new InvalidArgumentException(\sprintf('Invalid method call for service "%s": expected map or array, "%s" given in "%s".', $id, $call instanceof TaggedValue ? '!'.$call->getTag() : get_debug_type($call), $file));
}

if (\is_string($k)) {
throw new InvalidArgumentException(\sprintf('Invalid method call for service "%s", did you forget a leading dash before "%s: ..." in "%s"?', $id, $k, $file));
}

if (isset($call['method']) && \is_string($call['method'])) {
$method = $call['method'];
$args = $call['arguments'] ?? [];
$returnsClone = $call['returns_clone'] ?? false;
} else {
if (1 === \count($call) && \is_string(key($call))) {
$method = key($call);
$args = $call[$method];

if ($args instanceof TaggedValue) {
if ('returns_clone' !== $args->getTag()) {
throw new InvalidArgumentException(\sprintf('Unsupported tag "!%s", did you mean "!returns_clone" for service "%s" in "%s"?', $args->getTag(), $id, $file));
}

$returnsClone = true;
$args = $args->getValue();
} else {
$returnsClone = false;
}
} elseif (empty($call[0])) {
throw new InvalidArgumentException(\sprintf('Invalid call for service "%s": the method must be defined as the first index of an array or as the only key of a map in "%s".', $id, $file));
} else {
$method = $call[0];
$args = $call[1] ?? [];
$returnsClone = $call[2] ?? false;
}
}

if (!\is_array($args)) {
throw new InvalidArgumentException(\sprintf('The second parameter for function call "%s" must be an array of its arguments for service "%s" in "%s". Check your YAML syntax.', $method, $id, $file));
}

$args = $this->resolveServices($args, $file);
$definition->addMethodCall($method, $args, $returnsClone);
}
}

$tags = $service['tags'] ?? [];
if (!\is_array($tags)) {
throw new InvalidArgumentException(\sprintf('Parameter "tags" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}

if (isset($defaults['tags'])) {
$tags = array_merge($tags, $defaults['tags']);
}

foreach ($tags as $tag) {
if (!\is_array($tag)) {
$tag = ['name' => $tag];
}

if (1 === \count($tag) && \is_array(current($tag))) {
$name = key($tag);
$tag = current($tag);
} else {
if (!isset($tag['name'])) {
throw new InvalidArgumentException(\sprintf('A "tags" entry is missing a "name" key for service "%s" in "%s".', $id, $file));
}
$name = $tag['name'];
unset($tag['name']);
}

if (!\is_string($name) || '' === $name) {
throw new InvalidArgumentException(\sprintf('The tag name for service "%s" in "%s" must be a non-empty string.', $id, $file));
}

$this->validateAttributes(\sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s" in "%s". Check your YAML syntax.', $id, $name, '%s', $file), $tag);

$definition->addTag($name, $tag);
}

if (null !== $decorates = $service['decorates'] ?? null) {
if ('' !== $decorates && '@' === $decorates[0]) {
throw new InvalidArgumentException(\sprintf('The value of the "decorates" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s").', $id, $service['decorates'], substr($decorates, 1)));
}

$decorationOnInvalid = \array_key_exists('decoration_on_invalid', $service) ? $service['decoration_on_invalid'] : 'exception';
if ('exception' === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
} elseif ('ignore' === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
} elseif (null === $decorationOnInvalid) {
$invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
} elseif ('null' === $decorationOnInvalid) {
throw new InvalidArgumentException(\sprintf('Invalid value "%s" for attribute "decoration_on_invalid" on service "%s". Did you mean null (without quotes) in "%s"?', $decorationOnInvalid, $id, $file));
} else {
throw new InvalidArgumentException(\sprintf('Invalid value "%s" for attribute "decoration_on_invalid" on service "%s". Did you mean "exception", "ignore" or null in "%s"?', $decorationOnInvalid, $id, $file));
}

$renameId = $service['decoration_inner_name'] ?? null;
$priority = $service['decoration_priority'] ?? 0;

$definition->setDecoratedService($decorates, $renameId, $priority, $invalidBehavior);
}

if (isset($service['autowire'])) {
$definition->setAutowired($service['autowire']);
}

if (isset($defaults['bind']) || isset($service['bind'])) {

$bindings = $definition->getBindings();
$bindings += isset($defaults['bind']) ? unserialize(serialize($defaults['bind'])) : [];

if (isset($service['bind'])) {
if (!\is_array($service['bind'])) {
throw new InvalidArgumentException(\sprintf('Parameter "bind" must be an array for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}

$bindings = array_merge($bindings, $this->resolveServices($service['bind'], $file));
$bindingType = $this->isLoadingInstanceof ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING;
foreach ($bindings as $argument => $value) {
if (!$value instanceof BoundArgument) {
$bindings[$argument] = new BoundArgument($value, $trackBindings, $bindingType, $file);
}
}
}

$definition->setBindings($bindings);
}

if (isset($service['autoconfigure'])) {
$definition->setAutoconfigured($service['autoconfigure']);
}

if (\array_key_exists('namespace', $service) && !\array_key_exists('resource', $service)) {
throw new InvalidArgumentException(\sprintf('A "resource" attribute must be set when the "namespace" attribute is set for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}

if ($return) {
if (\array_key_exists('resource', $service)) {
throw new InvalidArgumentException(\sprintf('Invalid "resource" attribute found for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}

return $definition;
}

if (\array_key_exists('resource', $service)) {
if (!\is_string($service['resource'])) {
throw new InvalidArgumentException(\sprintf('A "resource" attribute must be of type string for service "%s" in "%s". Check your YAML syntax.', $id, $file));
}
$exclude = $service['exclude'] ?? null;
$namespace = $service['namespace'] ?? $id;
$this->registerClasses($definition, $namespace, $service['resource'], $exclude, $file);
} else {
$this->setDefinition($id, $definition);
}

return null;
}




private function parseCallable(mixed $callable, string $parameter, string $id, string $file): string|array|Reference
{
if (\is_string($callable)) {
if (str_starts_with($callable, '@=')) {
if ('factory' !== $parameter) {
throw new InvalidArgumentException(\sprintf('Using expressions in "%s" for the "%s" service is not supported in "%s".', $parameter, $id, $file));
}
if (!class_exists(Expression::class)) {
throw new \LogicException('The "@=" expression syntax cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}

return $callable;
}

if ('' !== $callable && '@' === $callable[0]) {
if (!str_contains($callable, ':')) {
return [$this->resolveServices($callable, $file), '__invoke'];
}

throw new InvalidArgumentException(\sprintf('The value of the "%s" option for the "%s" service must be the id of the service without the "@" prefix (replace "%s" with "%s" in "%s").', $parameter, $id, $callable, substr($callable, 1), $file));
}

return $callable;
}

if (\is_array($callable)) {
if (isset($callable[0]) && isset($callable[1])) {
return [$this->resolveServices($callable[0], $file), $callable[1]];
}

if ('factory' === $parameter && isset($callable[1]) && null === $callable[0]) {
return $callable;
}

throw new InvalidArgumentException(\sprintf('Parameter "%s" must contain an array with two elements for service "%s" in "%s". Check your YAML syntax.', $parameter, $id, $file));
}

throw new InvalidArgumentException(\sprintf('Parameter "%s" must be a string or an array for service "%s" in "%s". Check your YAML syntax.', $parameter, $id, $file));
}






protected function loadFile(string $file): ?array
{
if (!class_exists(YamlParser::class)) {
throw new RuntimeException('Unable to load YAML config files as the Symfony Yaml Component is not installed. Try running "composer require symfony/yaml".');
}

if (!stream_is_local($file)) {
throw new InvalidArgumentException(\sprintf('This is not a local file "%s".', $file));
}

if (!is_file($file)) {
throw new InvalidArgumentException(\sprintf('The file "%s" does not exist.', $file));
}

$this->yamlParser ??= new YamlParser();

try {
$configuration = $this->yamlParser->parseFile($file, Yaml::PARSE_CONSTANT | Yaml::PARSE_CUSTOM_TAGS);
} catch (ParseException $e) {
throw new InvalidArgumentException(\sprintf('The file "%s" does not contain valid YAML: ', $file).$e->getMessage(), 0, $e);
}

return $this->validate($configuration, $file);
}






private function validate(mixed $content, string $file): ?array
{
if (null === $content) {
return $content;
}

if (!\is_array($content)) {
throw new InvalidArgumentException(\sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file));
}

foreach ($content as $namespace => $data) {
if (\in_array($namespace, ['imports', 'parameters', 'services']) || str_starts_with($namespace, 'when@')) {
continue;
}

if (!$this->container->hasExtension($namespace)) {
$extensionNamespaces = array_filter(array_map(fn (ExtensionInterface $ext) => $ext->getAlias(), $this->container->getExtensions()));
throw new InvalidArgumentException(\sprintf('There is no extension able to load the configuration for "%s" (in "%s"). Looked for namespace "%s", found "%s".', $namespace, $file, $namespace, $extensionNamespaces ? \sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'));
}
}

return $content;
}

private function resolveServices(mixed $value, string $file, bool $isParameter = false): mixed
{
if ($value instanceof TaggedValue) {
$argument = $value->getValue();

if ('closure' === $value->getTag()) {
$argument = $this->resolveServices($argument, $file, $isParameter);

return (new Definition('Closure'))
->setFactory(['Closure', 'fromCallable'])
->addArgument($argument);
}
if ('iterator' === $value->getTag()) {
if (!\is_array($argument)) {
throw new InvalidArgumentException(\sprintf('"!iterator" tag only accepts sequences in "%s".', $file));
}
$argument = $this->resolveServices($argument, $file, $isParameter);

return new IteratorArgument($argument);
}
if ('service_closure' === $value->getTag()) {
$argument = $this->resolveServices($argument, $file, $isParameter);

return new ServiceClosureArgument($argument);
}
if ('service_locator' === $value->getTag()) {
if (!\is_array($argument)) {
throw new InvalidArgumentException(\sprintf('"!service_locator" tag only accepts maps in "%s".', $file));
}

$argument = $this->resolveServices($argument, $file, $isParameter);

if (isset($argument[0])) {
trigger_deprecation('symfony/dependency-injection', '6.3', 'Using integers as keys in a "!service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.');
}

return new ServiceLocatorArgument($argument);
}
if (\in_array($value->getTag(), ['tagged', 'tagged_iterator', 'tagged_locator'], true)) {
$forLocator = 'tagged_locator' === $value->getTag();

if (\is_array($argument) && isset($argument['tag']) && $argument['tag']) {
if ($diff = array_diff(array_keys($argument), $supportedKeys = ['tag', 'index_by', 'default_index_method', 'default_priority_method', 'exclude', 'exclude_self'])) {
throw new InvalidArgumentException(\sprintf('"!%s" tag contains unsupported key "%s"; supported ones are "%s".', $value->getTag(), implode('", "', $diff), implode('", "', $supportedKeys)));
}

$argument = new TaggedIteratorArgument($argument['tag'], $argument['index_by'] ?? null, $argument['default_index_method'] ?? null, $forLocator, $argument['default_priority_method'] ?? null, (array) ($argument['exclude'] ?? null), $argument['exclude_self'] ?? true);
} elseif (\is_string($argument) && $argument) {
$argument = new TaggedIteratorArgument($argument, null, null, $forLocator);
} else {
throw new InvalidArgumentException(\sprintf('"!%s" tags only accept a non empty string or an array with a key "tag" in "%s".', $value->getTag(), $file));
}

if ($forLocator) {
$argument = new ServiceLocatorArgument($argument);
}

return $argument;
}
if ('service' === $value->getTag()) {
if ($isParameter) {
throw new InvalidArgumentException(\sprintf('Using an anonymous service in a parameter is not allowed in "%s".', $file));
}

$isLoadingInstanceof = $this->isLoadingInstanceof;
$this->isLoadingInstanceof = false;
$instanceof = $this->instanceof;
$this->instanceof = [];

$id = \sprintf('.%d_%s', ++$this->anonymousServicesCount, preg_replace('/^.*\\\\/', '', $argument['class'] ?? '').$this->anonymousServicesSuffix);
$this->parseDefinition($id, $argument, $file, []);

if (!$this->container->hasDefinition($id)) {
throw new InvalidArgumentException(\sprintf('Creating an alias using the tag "!service" is not allowed in "%s".', $file));
}

$this->container->getDefinition($id);

$this->isLoadingInstanceof = $isLoadingInstanceof;
$this->instanceof = $instanceof;

return new Reference($id);
}
if ('abstract' === $value->getTag()) {
return new AbstractArgument($value->getValue());
}

throw new InvalidArgumentException(\sprintf('Unsupported tag "!%s".', $value->getTag()));
}

if (\is_array($value)) {
foreach ($value as $k => $v) {
$value[$k] = $this->resolveServices($v, $file, $isParameter);
}
} elseif (\is_string($value) && str_starts_with($value, '@=')) {
if ($isParameter) {
throw new InvalidArgumentException(\sprintf('Using expressions in parameters is not allowed in "%s".', $file));
}

if (!class_exists(Expression::class)) {
throw new \LogicException('The "@=" expression syntax cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".');
}

return new Expression(substr($value, 2));
} elseif (\is_string($value) && str_starts_with($value, '@')) {
if (str_starts_with($value, '@@')) {
$value = substr($value, 1);
$invalidBehavior = null;
} elseif (str_starts_with($value, '@!')) {
$value = substr($value, 2);
$invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE;
} elseif (str_starts_with($value, '@?')) {
$value = substr($value, 2);
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
} else {
$value = substr($value, 1);
$invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
}

if (null !== $invalidBehavior) {
$value = new Reference($value, $invalidBehavior);
}
}

return $value;
}

private function loadFromExtensions(array $content): void
{
foreach ($content as $namespace => $values) {
if (\in_array($namespace, ['imports', 'parameters', 'services']) || str_starts_with($namespace, 'when@')) {
continue;
}

if (!\is_array($values) && null !== $values) {
$values = [];
}

$this->container->loadFromExtension($namespace, $values);
}
}

private function checkDefinition(string $id, array $definition, string $file): void
{
if ($this->isLoadingInstanceof) {
$keywords = self::INSTANCEOF_KEYWORDS;
} elseif (isset($definition['resource']) || isset($definition['namespace'])) {
$keywords = self::PROTOTYPE_KEYWORDS;
} else {
$keywords = self::SERVICE_KEYWORDS;
}

foreach ($definition as $key => $value) {
if (!isset($keywords[$key])) {
throw new InvalidArgumentException(\sprintf('The configuration key "%s" is unsupported for definition "%s" in "%s". Allowed configuration keys are "%s".', $key, $id, $file, implode('", "', $keywords)));
}
}
}

private function validateAttributes(string $message, array $attributes, array $path = []): void
{
foreach ($attributes as $name => $value) {
if (\is_array($value)) {
$this->validateAttributes($message, $value, [...$path, $name]);
} elseif (!\is_scalar($value ?? '')) {
$name = implode('.', [...$path, $name]);
throw new InvalidArgumentException(\sprintf($message, $name));
}
}
}
}
<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://symfony.com/schema/dic/services"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://symfony.com/schema/dic/services"
     elementFormDefault="qualified">

  <xsd:annotation>
    <xsd:documentation><![CDATA[
      Symfony XML Services Schema, version 1.0
      Authors: Fabien Potencier

      This defines a way to describe PHP objects (services) and their
      dependencies.
    ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:element name="container" type="container" />

  <xsd:complexType name="container">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        The root element of a service file.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:group ref="foreign" />
      <xsd:sequence minOccurs="0">
        <xsd:element name="imports" type="imports" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
      <xsd:sequence minOccurs="0">
        <xsd:element name="parameters" type="parameters" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
      <xsd:sequence minOccurs="0">
        <xsd:element name="services" type="services" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="when" type="when" />
      </xsd:sequence>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="when">
    <xsd:sequence>
      <xsd:group ref="foreign" />
      <xsd:sequence minOccurs="0">
        <xsd:element name="imports" type="imports" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
      <xsd:sequence minOccurs="0">
        <xsd:element name="parameters" type="parameters" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
      <xsd:sequence minOccurs="0">
        <xsd:element name="services" type="services" />
        <xsd:group ref="foreign" />
      </xsd:sequence>
    </xsd:sequence>
    <xsd:attribute name="env" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:group name="foreign">
    <xsd:sequence>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:group>

  <xsd:complexType name="services">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Enclosing element for the definition of all services
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="service" type="service" minOccurs="1" />
      <xsd:element name="prototype" type="prototype" minOccurs="0" />
      <xsd:element name="defaults" type="defaults" minOccurs="0" maxOccurs="1" />
      <xsd:element name="instanceof" type="instanceof" minOccurs="0" />
      <xsd:element name="stack" type="stack" minOccurs="0" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="imports">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Enclosing element for the import elements
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="1" maxOccurs="unbounded">
      <xsd:element name="import" type="import" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="import">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Import an external resource defining other services or parameters
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="resource" type="xsd:string" use="required" />
    <xsd:attribute name="ignore-errors" type="ignore_errors" />
    <xsd:attribute name="type" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="callable">
    <xsd:choice minOccurs="0" maxOccurs="1">
      <xsd:element name="service" type="service" minOccurs="0" maxOccurs="1" />
    </xsd:choice>
    <xsd:attribute name="service" type="xsd:string" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="method" type="xsd:string" />
    <xsd:attribute name="function" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="factory">
    <xsd:choice minOccurs="0" maxOccurs="1">
      <xsd:element name="service" type="service" minOccurs="0" maxOccurs="1" />
    </xsd:choice>
    <xsd:attribute name="service" type="xsd:string" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="method" type="xsd:string" />
    <xsd:attribute name="function" type="xsd:string" />
    <xsd:attribute name="expression" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="defaults">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Enclosing element for the service definitions' defaults for the current file
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="bind" type="bind" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="public" type="boolean" />
    <xsd:attribute name="autowire" type="boolean" />
    <xsd:attribute name="autoconfigure" type="boolean" />
  </xsd:complexType>

  <xsd:complexType name="service">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="file" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="configurator" type="callable" minOccurs="0" maxOccurs="1" />
      <xsd:element name="factory" type="factory" minOccurs="0" maxOccurs="1" />
      <xsd:element name="from-callable" type="factory" minOccurs="0" maxOccurs="1" />
      <xsd:element name="deprecated" type="deprecated" minOccurs="0" maxOccurs="1" />
      <xsd:element name="call" type="call" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="bind" type="bind" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="shared" type="boolean" />
    <xsd:attribute name="public" type="boolean" />
    <xsd:attribute name="synthetic" type="boolean" />
    <xsd:attribute name="lazy" type="xsd:string" />
    <xsd:attribute name="abstract" type="boolean" />
    <xsd:attribute name="alias" type="xsd:string" />
    <xsd:attribute name="parent" type="xsd:string" />
    <xsd:attribute name="decorates" type="xsd:string" />
    <xsd:attribute name="decoration-on-invalid" type="invalid_decorated_service_sequence" />
    <xsd:attribute name="decoration-inner-name" type="xsd:string" />
    <xsd:attribute name="decoration-priority" type="xsd:integer" />
    <xsd:attribute name="autowire" type="boolean" />
    <xsd:attribute name="autoconfigure" type="boolean" />
    <xsd:attribute name="constructor" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="instanceof">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="configurator" type="callable" minOccurs="0" maxOccurs="1" />
      <xsd:element name="call" type="call" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="bind" type="bind" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="id" type="xsd:string" use="required" />
    <xsd:attribute name="shared" type="boolean" />
    <xsd:attribute name="public" type="boolean" />
    <xsd:attribute name="lazy" type="xsd:string" />
    <xsd:attribute name="autowire" type="boolean" />
    <xsd:attribute name="autoconfigure" type="boolean" />
    <xsd:attribute name="constructor" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="prototype">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="configurator" type="callable" minOccurs="0" maxOccurs="1" />
      <xsd:element name="factory" type="factory" minOccurs="0" maxOccurs="1" />
      <xsd:element name="deprecated" type="deprecated" minOccurs="0" maxOccurs="1" />
      <xsd:element name="call" type="call" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="bind" type="bind" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="exclude" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="namespace" type="xsd:string" use="required" />
    <xsd:attribute name="resource" type="xsd:string" use="required" />
    <xsd:attribute name="exclude" type="xsd:string" />
    <xsd:attribute name="shared" type="boolean" />
    <xsd:attribute name="public" type="boolean" />
    <xsd:attribute name="lazy" type="xsd:string" />
    <xsd:attribute name="abstract" type="boolean" />
    <xsd:attribute name="parent" type="xsd:string" />
    <xsd:attribute name="autowire" type="boolean" />
    <xsd:attribute name="autoconfigure" type="boolean" />
    <xsd:attribute name="constructor" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="stack">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="service" type="service" minOccurs="1" />
      <xsd:element name="deprecated" type="deprecated" minOccurs="0" maxOccurs="1" />
    </xsd:choice>
    <xsd:attribute name="id" type="xsd:string" use="required" />
    <xsd:attribute name="public" type="boolean" />
  </xsd:complexType>

  <xsd:complexType name="tag" mixed="true">
    <xsd:choice minOccurs="0">
      <xsd:element name="attribute" type="tag_attribute" maxOccurs="unbounded"/>
    </xsd:choice>
    <xsd:anyAttribute namespace="##any" processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="deprecated">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="package" type="xsd:string" use="required" />
        <xsd:attribute name="version" type="xsd:string" use="required" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="tag_attribute" mixed="true">
    <xsd:choice minOccurs="0">
      <xsd:element name="attribute" type="tag_attribute" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="parameters">
    <xsd:choice minOccurs="1" maxOccurs="unbounded">
      <xsd:element name="parameter" type="parameter" />
    </xsd:choice>
    <xsd:attribute name="type" type="parameter_type" />
    <xsd:attribute name="key" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="parameter" mixed="true">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="parameter" type="parameter" />
    </xsd:choice>
    <xsd:attribute name="type" type="parameter_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
    <xsd:attribute name="trim" type="xsd:boolean" />
  </xsd:complexType>

  <xsd:complexType name="property" mixed="true">
    <xsd:choice minOccurs="0">
      <xsd:element name="property" type="property" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="name" type="xsd:string" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
    <xsd:attribute name="tag" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="bind" mixed="true">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="bind" type="bind_argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" use="required" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
    <xsd:attribute name="method" type="xsd:string" />
    <xsd:attribute name="tag" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="bind_argument" mixed="true">
    <xsd:choice minOccurs="0">
      <xsd:element name="bind" type="bind_argument" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
      <xsd:element name="exclude" type="xsd:string" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="index" type="xsd:integer" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
    <xsd:attribute name="tag" type="xsd:string" />
    <xsd:attribute name="index-by" type="xsd:string" />
    <xsd:attribute name="default-index-method" type="xsd:string" />
    <xsd:attribute name="default-priority-method" type="xsd:string" />
    <xsd:attribute name="exclude" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="argument" mixed="true">
    <xsd:choice minOccurs="0">
      <xsd:element name="argument" type="argument" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
      <xsd:element name="exclude" type="xsd:string" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="index" type="xsd:integer" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
    <xsd:attribute name="tag" type="xsd:string" />
    <xsd:attribute name="index-by" type="xsd:string" />
    <xsd:attribute name="default-index-method" type="xsd:string" />
    <xsd:attribute name="default-priority-method" type="xsd:string" />
    <xsd:attribute name="exclude" type="xsd:string" />
    <xsd:attribute name="exclude-self" type="xsd:boolean" />
  </xsd:complexType>

  <xsd:complexType name="call">
    <xsd:choice minOccurs="0">
      <xsd:element name="argument" type="argument" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="method" type="xsd:string" />
    <xsd:attribute name="returns-clone" type="boolean" />
  </xsd:complexType>

  <xsd:simpleType name="parameter_type">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="collection" />
      <xsd:enumeration value="string" />
      <xsd:enumeration value="constant" />
      <xsd:enumeration value="binary" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="argument_type">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="abstract" />
      <xsd:enumeration value="collection" />
      <xsd:enumeration value="service" />
      <xsd:enumeration value="expression" />
      <xsd:enumeration value="string" />
      <xsd:enumeration value="constant" />
      <xsd:enumeration value="binary" />
      <xsd:enumeration value="iterator" />
      <xsd:enumeration value="closure" />
      <xsd:enumeration value="service_closure" />
      <xsd:enumeration value="service_locator" />
      <!-- "tagged" is an alias of "tagged_iterator", using "tagged_iterator" is preferred. -->
      <xsd:enumeration value="tagged" />
      <xsd:enumeration value="tagged_iterator" />
      <xsd:enumeration value="tagged_locator" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="ignore_errors">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(true|false|not_found)" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="invalid_sequence">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="null" />
      <xsd:enumeration value="ignore" />
      <xsd:enumeration value="exception" />
      <xsd:enumeration value="ignore_uninitialized" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="invalid_decorated_service_sequence">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="null" />
      <xsd:enumeration value="ignore" />
      <xsd:enumeration value="exception" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="boolean">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(%.+%|true|false)" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Builder\ConfigBuilderGenerator;
use Symfony\Component\Config\Builder\ConfigBuilderGeneratorInterface;
use Symfony\Component\Config\Builder\ConfigBuilderInterface;
use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\DependencyInjection\Attribute\When;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;









class PhpFileLoader extends FileLoader
{
protected $autoRegisterAliasesForSinglyImplementedInterfaces = false;
private ?ConfigBuilderGeneratorInterface $generator;

public function __construct(ContainerBuilder $container, FileLocatorInterface $locator, ?string $env = null, ?ConfigBuilderGeneratorInterface $generator = null)
{
parent::__construct($container, $locator, $env);
$this->generator = $generator;
}

public function load(mixed $resource, ?string $type = null): mixed
{

$container = $this->container;
$loader = $this;

$path = $this->locator->locate($resource);
$this->setCurrentDir(\dirname($path));
$this->container->fileExists($path);


$load = \Closure::bind(function ($path, $env) use ($container, $loader, $resource, $type) {
return include $path;
}, $this, ProtectedPhpFileLoader::class);

try {
$callback = $load($path, $this->env);

if (\is_object($callback) && \is_callable($callback)) {
$this->executeCallback($callback, new ContainerConfigurator($this->container, $this, $this->instanceof, $path, $resource, $this->env), $path);
}
} finally {
$this->instanceof = [];
$this->registerAliasesForSinglyImplementedInterfaces();
}

return null;
}

public function supports(mixed $resource, ?string $type = null): bool
{
if (!\is_string($resource)) {
return false;
}

if (null === $type && 'php' === pathinfo($resource, \PATHINFO_EXTENSION)) {
return true;
}

return 'php' === $type;
}




private function executeCallback(callable $callback, ContainerConfigurator $containerConfigurator, string $path): void
{
$callback = $callback(...);
$arguments = [];
$configBuilders = [];
$r = new \ReflectionFunction($callback);

$attribute = null;
foreach ($r->getAttributes(When::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) {
if ($this->env === $attribute->newInstance()->env) {
$attribute = null;
break;
}
}
if (null !== $attribute) {
return;
}

foreach ($r->getParameters() as $parameter) {
$reflectionType = $parameter->getType();
if (!$reflectionType instanceof \ReflectionNamedType) {
throw new \InvalidArgumentException(\sprintf('Could not resolve argument "$%s" for "%s". You must typehint it (for example with "%s" or "%s").', $parameter->getName(), $path, ContainerConfigurator::class, ContainerBuilder::class));
}
$type = $reflectionType->getName();

switch ($type) {
case ContainerConfigurator::class:
$arguments[] = $containerConfigurator;
break;
case ContainerBuilder::class:
$arguments[] = $this->container;
break;
case FileLoader::class:
case self::class:
$arguments[] = $this;
break;
case 'string':
if (null !== $this->env && 'env' === $parameter->getName()) {
$arguments[] = $this->env;
break;
}

default:
try {
$configBuilder = $this->configBuilder($type);
} catch (InvalidArgumentException|\LogicException $e) {
throw new \InvalidArgumentException(\sprintf('Could not resolve argument "%s" for "%s".', $type.' $'.$parameter->getName(), $path), 0, $e);
}
$configBuilders[] = $configBuilder;
$arguments[] = $configBuilder;
}
}


class_exists(ContainerConfigurator::class);

$callback(...$arguments);


foreach ($configBuilders as $configBuilder) {
$containerConfigurator->extension($configBuilder->getExtensionAlias(), $configBuilder->toArray());
}
}




private function configBuilder(string $namespace): ConfigBuilderInterface
{
if (!class_exists(ConfigBuilderGenerator::class)) {
throw new \LogicException('You cannot use the config builder as the Config component is not installed. Try running "composer require symfony/config".');
}

if (null === $this->generator) {
throw new \LogicException('You cannot use the ConfigBuilders without providing a class implementing ConfigBuilderGeneratorInterface.');
}


if (class_exists($namespace) && is_subclass_of($namespace, ConfigBuilderInterface::class)) {
return new $namespace();
}


if (!str_starts_with($namespace, 'Symfony\\Config\\')) {
throw new InvalidArgumentException(\sprintf('Could not find or generate class "%s".', $namespace));
}


$alias = Container::underscore(substr($namespace, 15, -6));

if (str_contains($alias, '\\')) {
throw new InvalidArgumentException('You can only use "root" ConfigBuilders from "Symfony\\Config\\" namespace. Nested classes like "Symfony\\Config\\Framework\\CacheConfig" cannot be used.');
}

if (!$this->container->hasExtension($alias)) {
$extensions = array_filter(array_map(fn (ExtensionInterface $ext) => $ext->getAlias(), $this->container->getExtensions()));
throw new InvalidArgumentException(\sprintf('There is no extension able to load the configuration for "%s". Looked for namespace "%s", found "%s".', $namespace, $alias, $extensions ? implode('", "', $extensions) : 'none'));
}

$extension = $this->container->getExtension($alias);
if (!$extension instanceof ConfigurationExtensionInterface) {
throw new \LogicException(\sprintf('You cannot use the config builder for "%s" because the extension does not implement "%s".', $namespace, ConfigurationExtensionInterface::class));
}

$configuration = $extension->getConfiguration([], $this->container);
$loader = $this->generator->build($configuration);

return $loader();
}
}




final class ProtectedPhpFileLoader extends PhpFileLoader
{
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;






class DirectoryLoader extends FileLoader
{
public function load(mixed $file, ?string $type = null): mixed
{
$file = rtrim($file, '/');
$path = $this->locator->locate($file);
$this->container->fileExists($path, false);

foreach (scandir($path) as $dir) {
if ('.' !== $dir[0]) {
if (is_dir($path.'/'.$dir)) {
$dir .= '/'; 
}

$this->setCurrentDir($path);

$this->import($dir, null, false, $path);
}
}

return null;
}

public function supports(mixed $resource, ?string $type = null): bool
{
if ('directory' === $type) {
return true;
}

return null === $type && \is_string($resource) && str_ends_with($resource, '/');
}
}
<?php










namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\DependencyInjection\ContainerBuilder;








class ClosureLoader extends Loader
{
private ContainerBuilder $container;

public function __construct(ContainerBuilder $container, ?string $env = null)
{
$this->container = $container;
parent::__construct($env);
}

public function load(mixed $resource, ?string $type = null): mixed
{
return $resource($this->container, $this->env);
}

public function supports(mixed $resource, ?string $type = null): bool
{
return $resource instanceof \Closure;
}
}
<?php










namespace Symfony\Component\OptionsResolver;

use Symfony\Component\OptionsResolver\Exception\AccessException;

final class OptionConfigurator
{
public function __construct(
private string $name,
private OptionsResolver $resolver,
) {
$this->resolver->setDefined($name);
}








public function allowedTypes(string ...$types): static
{
$this->resolver->setAllowedTypes($this->name, $types);

return $this;
}










public function allowedValues(mixed ...$values): static
{
$this->resolver->setAllowedValues($this->name, $values);

return $this;
}








public function default(mixed $value): static
{
$this->resolver->setDefault($this->name, $value);

return $this;
}




public function define(string $option): self
{
return $this->resolver->define($option);
}










public function deprecated(string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static
{
$this->resolver->setDeprecated($this->name, $package, $version, $message);

return $this;
}








public function normalize(\Closure $normalizer): static
{
$this->resolver->setNormalizer($this->name, $normalizer);

return $this;
}








public function required(): static
{
$this->resolver->setRequired($this->name);

return $this;
}








public function info(string $info): static
{
$this->resolver->setInfo($this->name, $info);

return $this;
}






public function ignoreUndefined(bool $ignore = true): static
{
$this->resolver->setIgnoreUndefined($ignore);

return $this;
}








public function options(\Closure $nested): static
{
$this->resolver->setOptions($this->name, $nested);

return $this;
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\OptionsResolver;







interface Options extends \ArrayAccess, \Countable
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;







class AccessException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;

use Symfony\Component\OptionsResolver\Debug\OptionsResolverIntrospector;









class NoConfigurationException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;






class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;








class InvalidOptionsException extends InvalidArgumentException
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;








class MissingOptionsException extends InvalidArgumentException
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;






class OptionDefinitionException extends \LogicException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;











class NoSuchOptionException extends \OutOfBoundsException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\OptionsResolver\Exception;









class UndefinedOptionsException extends InvalidArgumentException
{
}
<?php










namespace Symfony\Component\OptionsResolver;

use Symfony\Component\OptionsResolver\Exception\AccessException;
use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException;
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\MissingOptionsException;
use Symfony\Component\OptionsResolver\Exception\NoSuchOptionException;
use Symfony\Component\OptionsResolver\Exception\OptionDefinitionException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;







class OptionsResolver implements Options
{
private const VALIDATION_FUNCTIONS = [
'bool' => 'is_bool',
'boolean' => 'is_bool',
'int' => 'is_int',
'integer' => 'is_int',
'long' => 'is_int',
'float' => 'is_float',
'double' => 'is_float',
'real' => 'is_float',
'numeric' => 'is_numeric',
'string' => 'is_string',
'scalar' => 'is_scalar',
'array' => 'is_array',
'iterable' => 'is_iterable',
'countable' => 'is_countable',
'callable' => 'is_callable',
'object' => 'is_object',
'resource' => 'is_resource',
];




private array $defined = [];




private array $defaults = [];






private array $nested = [];






private array $deprecatedNestedOptions = [];




private array $required = [];




private array $resolved = [];






private array $normalizers = [];




private array $allowedValues = [];




private array $allowedTypes = [];




private array $info = [];




private array $lazy = [];






private array $calling = [];




private array $deprecated = [];




private array $given = [];









private bool $locked = false;

private array $parentsOptions = [];




private ?bool $prototype = null;




private int|string|null $prototypeIndex = null;




private bool $ignoreUndefined = false;






































public function setDefault(string $option, mixed $value): static
{



if ($this->locked) {
throw new AccessException('Default values cannot be set from a lazy option or normalizer.');
}



if ($value instanceof \Closure) {
$reflClosure = new \ReflectionFunction($value);
$params = $reflClosure->getParameters();

if (isset($params[0]) && Options::class === $this->getParameterClassName($params[0])) {

if (!isset($this->defaults[$option])) {
$this->defaults[$option] = null;
}


if (!isset($this->lazy[$option]) || !isset($params[1])) {
$this->lazy[$option] = [];
}


$this->lazy[$option][] = $value;
$this->defined[$option] = true;


unset($this->resolved[$option]);


if (isset($this->deprecatedNestedOptions[$option])) {
unset($this->nested[$option]);
}

return $this;
}


if (isset($params[0]) && ($type = $params[0]->getType()) instanceof \ReflectionNamedType && self::class === $type->getName() && (!isset($params[1]) || (($type = $params[1]->getType()) instanceof \ReflectionNamedType && Options::class === $type->getName()))) {
trigger_deprecation('symfony/options-resolver', '7.3', 'Defining nested options via "%s()" is deprecated and will be removed in Symfony 8.0, use "setOptions()" method instead.', __METHOD__);
$this->deprecatedNestedOptions[$option] = true;


$this->nested[$option][] = $value;
$this->defaults[$option] = [];
$this->defined[$option] = true;


unset($this->resolved[$option], $this->lazy[$option]);

return $this;
}
}


unset($this->lazy[$option]);


if (isset($this->deprecatedNestedOptions[$option])) {
unset($this->nested[$option]);
}





if (!isset($this->defined[$option]) || \array_key_exists($option, $this->resolved)) {
$this->resolved[$option] = $value;
}

$this->defaults[$option] = $value;
$this->defined[$option] = true;

return $this;
}






public function setDefaults(array $defaults): static
{
foreach ($defaults as $option => $value) {
$this->setDefault($option, $value);
}

return $this;
}







public function hasDefault(string $option): bool
{
return \array_key_exists($option, $this->defaults);
}










public function setRequired(string|array $optionNames): static
{
if ($this->locked) {
throw new AccessException('Options cannot be made required from a lazy option or normalizer.');
}

foreach ((array) $optionNames as $option) {
$this->defined[$option] = true;
$this->required[$option] = true;
}

return $this;
}






public function isRequired(string $option): bool
{
return isset($this->required[$option]);
}








public function getRequiredOptions(): array
{
return array_keys($this->required);
}








public function isMissing(string $option): bool
{
return isset($this->required[$option]) && !\array_key_exists($option, $this->defaults);
}






public function getMissingOptions(): array
{
return array_keys(array_diff_key($this->required, $this->defaults));
}














public function setDefined(string|array $optionNames): static
{
if ($this->locked) {
throw new AccessException('Options cannot be defined from a lazy option or normalizer.');
}

foreach ((array) $optionNames as $option) {
$this->defined[$option] = true;
}

return $this;
}







public function isDefined(string $option): bool
{
return isset($this->defined[$option]);
}








public function getDefinedOptions(): array
{
return array_keys($this->defined);
}








public function setOptions(string $option, \Closure $nested): static
{
if ($this->locked) {
throw new AccessException('Nested options cannot be defined from a lazy option or normalizer.');
}


$this->nested[$option][] = $nested;
$this->defaults[$option] = [];
$this->defined[$option] = true;


unset($this->resolved[$option]);

return $this;
}

public function isNested(string $option): bool
{
return isset($this->nested[$option]);
}
























public function setDeprecated(string $option, string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static
{
if ($this->locked) {
throw new AccessException('Options cannot be deprecated from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist, defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

if (!\is_string($message) && !$message instanceof \Closure) {
throw new InvalidArgumentException(\sprintf('Invalid type for deprecation message argument, expected string or \Closure, but got "%s".', get_debug_type($message)));
}


if ('' === $message) {
return $this;
}

$this->deprecated[$option] = [
'package' => $package,
'version' => $version,
'message' => $message,
];


unset($this->resolved[$option]);

return $this;
}

public function isDeprecated(string $option): bool
{
return isset($this->deprecated[$option]);
}
























public function setNormalizer(string $option, \Closure $normalizer): static
{
if ($this->locked) {
throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

$this->normalizers[$option] = [$normalizer];


unset($this->resolved[$option]);

return $this;
}
























public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): static
{
if ($this->locked) {
throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

if ($forcePrepend) {
$this->normalizers[$option] ??= [];
array_unshift($this->normalizers[$option], $normalizer);
} else {
$this->normalizers[$option][] = $normalizer;
}


unset($this->resolved[$option]);

return $this;
}





















public function setAllowedValues(string $option, mixed $allowedValues): static
{
if ($this->locked) {
throw new AccessException('Allowed values cannot be set from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

$this->allowedValues[$option] = \is_array($allowedValues) ? $allowedValues : [$allowedValues];


unset($this->resolved[$option]);

return $this;
}























public function addAllowedValues(string $option, mixed $allowedValues): static
{
if ($this->locked) {
throw new AccessException('Allowed values cannot be added from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

if (!\is_array($allowedValues)) {
$allowedValues = [$allowedValues];
}

if (!isset($this->allowedValues[$option])) {
$this->allowedValues[$option] = $allowedValues;
} else {
$this->allowedValues[$option] = array_merge($this->allowedValues[$option], $allowedValues);
}


unset($this->resolved[$option]);

return $this;
}















public function setAllowedTypes(string $option, string|array $allowedTypes): static
{
if ($this->locked) {
throw new AccessException('Allowed types cannot be set from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

$this->allowedTypes[$option] = (array) $allowedTypes;


unset($this->resolved[$option]);

return $this;
}

















public function addAllowedTypes(string $option, string|array $allowedTypes): static
{
if ($this->locked) {
throw new AccessException('Allowed types cannot be added from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

if (!isset($this->allowedTypes[$option])) {
$this->allowedTypes[$option] = (array) $allowedTypes;
} else {
$this->allowedTypes[$option] = array_merge($this->allowedTypes[$option], (array) $allowedTypes);
}


unset($this->resolved[$option]);

return $this;
}




public function define(string $option): OptionConfigurator
{
if (isset($this->defined[$option])) {
throw new OptionDefinitionException(\sprintf('The option "%s" is already defined.', $option));
}

return new OptionConfigurator($option, $this);
}









public function setInfo(string $option, string $info): static
{
if ($this->locked) {
throw new AccessException('The Info message cannot be set from a lazy option or normalizer.');
}

if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

$this->info[$option] = $info;

return $this;
}




public function getInfo(string $option): ?string
{
if (!isset($this->defined[$option])) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

return $this->info[$option] ?? null;
}








public function setPrototype(bool $prototype): static
{
if ($this->locked) {
throw new AccessException('The prototype property cannot be set from a lazy option or normalizer.');
}

if (null === $this->prototype && $prototype) {
throw new AccessException('The prototype property cannot be set from a root definition.');
}

$this->prototype = $prototype;

return $this;
}

public function isPrototype(): bool
{
return $this->prototype ?? false;
}












public function remove(string|array $optionNames): static
{
if ($this->locked) {
throw new AccessException('Options cannot be removed from a lazy option or normalizer.');
}

foreach ((array) $optionNames as $option) {
unset($this->defined[$option], $this->defaults[$option], $this->required[$option], $this->resolved[$option]);
unset($this->lazy[$option], $this->normalizers[$option], $this->allowedTypes[$option], $this->allowedValues[$option], $this->info[$option]);
}

return $this;
}








public function clear(): static
{
if ($this->locked) {
throw new AccessException('Options cannot be cleared from a lazy option or normalizer.');
}

$this->defined = [];
$this->defaults = [];
$this->nested = [];
$this->required = [];
$this->resolved = [];
$this->lazy = [];
$this->normalizers = [];
$this->allowedTypes = [];
$this->allowedValues = [];
$this->deprecated = [];
$this->info = [];

return $this;
}





















public function resolve(array $options = []): array
{
if ($this->locked) {
throw new AccessException('Options cannot be resolved from a lazy option or normalizer.');
}


$clone = clone $this;


$diff = $this->ignoreUndefined ? [] : array_diff_key($options, $clone->defined);

if (\count($diff) > 0) {
ksort($clone->defined);
ksort($diff);

throw new UndefinedOptionsException(\sprintf((\count($diff) > 1 ? 'The options "%s" do not exist.' : 'The option "%s" does not exist.').' Defined options are: "%s".', $this->formatOptions(array_keys($diff)), implode('", "', array_keys($clone->defined))));
}


foreach ($options as $option => $value) {
if ($this->ignoreUndefined && !isset($clone->defined[$option])) {
continue;
}

$clone->given[$option] = true;
$clone->defaults[$option] = $value;
unset($clone->resolved[$option], $clone->lazy[$option]);
}


$diff = array_diff_key($clone->required, $clone->defaults);

if (\count($diff) > 0) {
ksort($diff);

throw new MissingOptionsException(\sprintf(\count($diff) > 1 ? 'The required options "%s" are missing.' : 'The required option "%s" is missing.', $this->formatOptions(array_keys($diff))));
}


$clone->locked = true;



foreach ($clone->defaults as $option => $_) {
$clone->offsetGet($option);
}

return $clone->resolved;
}














public function offsetGet(mixed $option, bool $triggerDeprecation = true): mixed
{
if (!$this->locked) {
throw new AccessException('Array access is only supported within closures of lazy options and normalizers.');
}


if (isset($this->resolved[$option]) || \array_key_exists($option, $this->resolved)) {
if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || $this->calling) && \is_string($this->deprecated[$option]['message'])) {
trigger_deprecation($this->deprecated[$option]['package'], $this->deprecated[$option]['version'], strtr($this->deprecated[$option]['message'], ['%name%' => $option]));
}

return $this->resolved[$option];
}


if (!isset($this->defaults[$option]) && !\array_key_exists($option, $this->defaults)) {
if (!isset($this->defined[$option])) {
throw new NoSuchOptionException(\sprintf('The option "%s" does not exist. Defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}

throw new NoSuchOptionException(\sprintf('The optional option "%s" has no value set. You should make sure it is set with "isset" before reading it.', $this->formatOptions([$option])));
}

$value = $this->defaults[$option];


if (isset($this->lazy[$option])) {

if (isset($this->calling[$option])) {
throw new OptionDefinitionException(\sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling))));
}

$this->calling[$option] = true;
try {
foreach ($this->lazy[$option] as $closure) {
$value = $closure($this, $value);
}
} finally {
unset($this->calling[$option]);
}
}


if (isset($this->nested[$option])) {

if (isset($this->calling[$option])) {
throw new OptionDefinitionException(\sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling))));
}

if (!\is_array($value)) {
throw new InvalidOptionsException(\sprintf('The nested option "%s" with value %s is expected to be of type array, but is of type "%s".', $this->formatOptions([$option]), $this->formatValue($value), get_debug_type($value)));
}

$this->calling[$option] = true;
try {
$resolver = new self();
$resolver->prototype = false;
$resolver->parentsOptions = $this->parentsOptions;
$resolver->parentsOptions[] = $option;
foreach ($this->nested[$option] as $closure) {
$closure($resolver, $this);
}

if ($resolver->prototype) {
$values = [];
foreach ($value as $index => $prototypeValue) {
if (!\is_array($prototypeValue)) {
throw new InvalidOptionsException(\sprintf('The value of the option "%s" is expected to be of type array of array, but is of type array of "%s".', $this->formatOptions([$option]), get_debug_type($prototypeValue)));
}

$resolver->prototypeIndex = $index;
$values[$index] = $resolver->resolve($prototypeValue);
}
$value = $values;
} else {
$value = $resolver->resolve($value);
}
} finally {
$resolver->prototypeIndex = null;
unset($this->calling[$option]);
}
}


if (isset($this->allowedTypes[$option])) {
$valid = true;
$invalidTypes = [];

foreach ($this->allowedTypes[$option] as $type) {
if ($valid = $this->verifyTypes($type, $value, $invalidTypes)) {
break;
}
}

if (!$valid) {
$fmtActualValue = $this->formatValue($value);
$fmtAllowedTypes = implode('" or "', $this->allowedTypes[$option]);
$fmtProvidedTypes = implode('|', array_keys($invalidTypes));
$allowedContainsArrayType = \count(array_filter($this->allowedTypes[$option], static fn ($item) => str_ends_with($item, '[]'))) > 0;

if (\is_array($value) && $allowedContainsArrayType) {
throw new InvalidOptionsException(\sprintf('The option "%s" with value %s is expected to be of type "%s", but one of the elements is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes));
}

throw new InvalidOptionsException(\sprintf('The option "%s" with value %s is expected to be of type "%s", but is of type "%s".', $this->formatOptions([$option]), $fmtActualValue, $fmtAllowedTypes, $fmtProvidedTypes));
}
}


if (isset($this->allowedValues[$option])) {
$success = false;
$printableAllowedValues = [];

foreach ($this->allowedValues[$option] as $allowedValue) {
if ($allowedValue instanceof \Closure) {
if ($allowedValue($value)) {
$success = true;
break;
}


continue;
}

if ($value === $allowedValue) {
$success = true;
break;
}

$printableAllowedValues[] = $allowedValue;
}

if (!$success) {
$message = \sprintf(
'The option "%s" with value %s is invalid.',
$this->formatOptions([$option]),
$this->formatValue($value)
);

if (\count($printableAllowedValues) > 0) {
$message .= \sprintf(
' Accepted values are: %s.',
$this->formatValues($printableAllowedValues)
);
}

if (isset($this->info[$option])) {
$message .= \sprintf(' Info: %s.', $this->info[$option]);
}

throw new InvalidOptionsException($message);
}
}



if ($triggerDeprecation && isset($this->deprecated[$option]) && (isset($this->given[$option]) || ($this->calling && \is_string($this->deprecated[$option]['message'])))) {
$deprecation = $this->deprecated[$option];
$message = $this->deprecated[$option]['message'];

if ($message instanceof \Closure) {

if (isset($this->calling[$option])) {
throw new OptionDefinitionException(\sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling))));
}

$this->calling[$option] = true;
try {
if (!\is_string($message = $message($this, $value))) {
throw new InvalidOptionsException(\sprintf('Invalid type for deprecation message, expected string but got "%s", return an empty string to ignore.', get_debug_type($message)));
}
} finally {
unset($this->calling[$option]);
}
}

if ('' !== $message) {
trigger_deprecation($deprecation['package'], $deprecation['version'], strtr($message, ['%name%' => $option]));
}
}


if (isset($this->normalizers[$option])) {


if (isset($this->calling[$option])) {
throw new OptionDefinitionException(\sprintf('The options "%s" have a cyclic dependency.', $this->formatOptions(array_keys($this->calling))));
}





$this->calling[$option] = true;
try {
foreach ($this->normalizers[$option] as $normalizer) {
$value = $normalizer($this, $value);
}
} finally {
unset($this->calling[$option]);
}

}


$this->resolved[$option] = $value;

return $value;
}

private function verifyTypes(string $type, mixed $value, ?array &$invalidTypes = null, int $level = 0): bool
{
$type = trim($type);
$allowedTypes = $this->splitOutsideParenthesis($type);
if (\count($allowedTypes) > 1) {
foreach ($allowedTypes as $allowedType) {
if ($this->verifyTypes($allowedType, $value)) {
return true;
}
}

if (\is_array($invalidTypes) && (!$invalidTypes || $level > 0)) {
$invalidTypes[get_debug_type($value)] = true;
}

return false;
}

$type = $allowedTypes[0];
if (str_starts_with($type, '(') && str_ends_with($type, ')')) {
return $this->verifyTypes(substr($type, 1, -1), $value, $invalidTypes, $level);
}

if (\is_array($value) && str_ends_with($type, '[]')) {
$type = substr($type, 0, -2);
$valid = true;

foreach ($value as $val) {
if (!$this->verifyTypes($type, $val, $invalidTypes, $level + 1)) {
$valid = false;
}
}

return $valid;
}

if (('null' === $type && null === $value) || (isset(self::VALIDATION_FUNCTIONS[$type]) ? self::VALIDATION_FUNCTIONS[$type]($value) : $value instanceof $type)) {
return true;
}

if (\is_array($invalidTypes) && (!$invalidTypes || $level > 0)) {
$invalidTypes[get_debug_type($value)] = true;
}

return false;
}




private function splitOutsideParenthesis(string $type): array
{
$parts = [];
$currentPart = '';
$parenthesisLevel = 0;

$typeLength = \strlen($type);
for ($i = 0; $i < $typeLength; ++$i) {
$char = $type[$i];

if ('(' === $char) {
++$parenthesisLevel;
} elseif (')' === $char) {
--$parenthesisLevel;
}

if ('|' === $char && 0 === $parenthesisLevel) {
$parts[] = $currentPart;
$currentPart = '';
} else {
$currentPart .= $char;
}
}

if ('' !== $currentPart) {
$parts[] = $currentPart;
}

return $parts;
}








public function offsetExists(mixed $option): bool
{
if (!$this->locked) {
throw new AccessException('Array access is only supported within closures of lazy options and normalizers.');
}

return \array_key_exists($option, $this->defaults);
}






public function offsetSet(mixed $option, mixed $value): void
{
throw new AccessException('Setting options via array access is not supported. Use setDefault() instead.');
}






public function offsetUnset(mixed $option): void
{
throw new AccessException('Removing options via array access is not supported. Use remove() instead.');
}










public function count(): int
{
if (!$this->locked) {
throw new AccessException('Counting is only supported within closures of lazy options and normalizers.');
}

return \count($this->defaults);
}






public function setIgnoreUndefined(bool $ignore = true): static
{
$this->ignoreUndefined = $ignore;

return $this;
}








private function formatValue(mixed $value): string
{
if (\is_object($value)) {
return $value::class;
}

if (\is_array($value)) {
return 'array';
}

if (\is_string($value)) {
return '"'.$value.'"';
}

if (\is_resource($value)) {
return 'resource';
}

if (null === $value) {
return 'null';
}

if (false === $value) {
return 'false';
}

if (true === $value) {
return 'true';
}

return (string) $value;
}









private function formatValues(array $values): string
{
foreach ($values as $key => $value) {
$values[$key] = $this->formatValue($value);
}

return implode(', ', $values);
}

private function formatOptions(array $options): string
{
if ($this->parentsOptions) {
$prefix = array_shift($this->parentsOptions);
if ($this->parentsOptions) {
$prefix .= \sprintf('[%s]', implode('][', $this->parentsOptions));
}

if ($this->prototype && null !== $this->prototypeIndex) {
$prefix .= \sprintf('[%s]', $this->prototypeIndex);
}

$options = array_map(static fn (string $option): string => \sprintf('%s[%s]', $prefix, $option), $options);
}

return implode('", "', $options);
}

private function getParameterClassName(\ReflectionParameter $parameter): ?string
{
if (!($type = $parameter->getType()) instanceof \ReflectionNamedType || $type->isBuiltin()) {
return null;
}

return $type->getName();
}
}
<?php










namespace Symfony\Component\OptionsResolver\Debug;

use Symfony\Component\OptionsResolver\Exception\NoConfigurationException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\OptionsResolver;






class OptionsResolverIntrospector
{
private \Closure $get;

public function __construct(OptionsResolver $optionsResolver)
{
$this->get = \Closure::bind(function ($property, $option, $message) {

if (!$this->isDefined($option)) {
throw new UndefinedOptionsException(\sprintf('The option "%s" does not exist.', $option));
}

if (!\array_key_exists($option, $this->{$property})) {
throw new NoConfigurationException($message);
}

return $this->{$property}[$option];
}, $optionsResolver, $optionsResolver);
}




public function getDefault(string $option): mixed
{
return ($this->get)('defaults', $option, \sprintf('No default value was set for the "%s" option.', $option));
}






public function getLazyClosures(string $option): array
{
return ($this->get)('lazy', $option, \sprintf('No lazy closures were set for the "%s" option.', $option));
}






public function getAllowedTypes(string $option): array
{
return ($this->get)('allowedTypes', $option, \sprintf('No allowed types were set for the "%s" option.', $option));
}






public function getAllowedValues(string $option): array
{
return ($this->get)('allowedValues', $option, \sprintf('No allowed values were set for the "%s" option.', $option));
}




public function getNormalizer(string $option): \Closure
{
return current($this->getNormalizers($option));
}




public function getNormalizers(string $option): array
{
return ($this->get)('normalizers', $option, \sprintf('No normalizer was set for the "%s" option.', $option));
}




public function getDeprecation(string $option): array
{
return ($this->get)('deprecated', $option, \sprintf('No deprecation was set for the "%s" option.', $option));
}






public function getNestedOptions(string $option): array
{
return ($this->get)('nested', $option, \sprintf('No nested option was set for the "%s" option.', $option));
}
}
Copyright (c) 2016-present 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.
<?php










namespace Symfony\Component\Dotenv\Exception;






final class FormatException extends \LogicException implements ExceptionInterface
{
private FormatExceptionContext $context;

public function __construct(string $message, FormatExceptionContext $context, int $code = 0, ?\Throwable $previous = null)
{
$this->context = $context;

parent::__construct(\sprintf("%s in \"%s\" at line %d.\n%s", $message, $context->getPath(), $context->getLineno(), $context->getDetails()), $code, $previous);
}

public function getContext(): FormatExceptionContext
{
return $this->context;
}
}
<?php










namespace Symfony\Component\Dotenv\Exception;




final class FormatExceptionContext
{
private string $data;
private string $path;
private int $lineno;
private int $cursor;

public function __construct(string $data, string $path, int $lineno, int $cursor)
{
$this->data = $data;
$this->path = $path;
$this->lineno = $lineno;
$this->cursor = $cursor;
}

public function getPath(): string
{
return $this->path;
}

public function getLineno(): int
{
return $this->lineno;
}

public function getDetails(): string
{
$before = str_replace("\n", '\n', substr($this->data, max(0, $this->cursor - 20), min(20, $this->cursor)));
$after = str_replace("\n", '\n', substr($this->data, $this->cursor, 20));

return '...'.$before.$after."...\n".str_repeat(' ', \strlen($before) + 2).'^ line '.$this->lineno.' offset '.$this->cursor;
}
}
<?php










namespace Symfony\Component\Dotenv\Exception;






final class PathException extends \RuntimeException implements ExceptionInterface
{
public function __construct(string $path, int $code = 0, ?\Throwable $previous = null)
{
parent::__construct(\sprintf('Unable to read the "%s" environment file.', $path), $code, $previous);
}
}
<?php










namespace Symfony\Component\Dotenv\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Dotenv\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Dotenv\Dotenv;






#[AsCommand(name: 'debug:dotenv', description: 'List all dotenv files with variables and values')]
final class DebugCommand extends Command
{



protected static $defaultName = 'debug:dotenv';




protected static $defaultDescription = 'List all dotenv files with variables and values';

private string $kernelEnvironment;
private string $projectDirectory;

public function __construct(string $kernelEnvironment, string $projectDirectory)
{
$this->kernelEnvironment = $kernelEnvironment;
$this->projectDirectory = $projectDirectory;

parent::__construct();
}

protected function configure(): void
{
$this
->setDefinition([
new InputArgument('filter', InputArgument::OPTIONAL, 'The name of an environment variable or a filter.', null, $this->getAvailableVars(...)),
])
->setHelp(<<<'EOT'
The <info>%command.full_name%</info> command displays all the environment variables configured by dotenv:

  <info>php %command.full_name%</info>

To get specific variables, specify its full or partial name:

    <info>php %command.full_name% FOO_BAR</info>

EOT
);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title('Dotenv Variables & Files');

if (!\array_key_exists('SYMFONY_DOTENV_VARS', $_SERVER)) {
$io->error('Dotenv component is not initialized.');

return 1;
}

if (!$filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? null) {
$dotenvPath = $this->projectDirectory;

if (is_file($composerFile = $this->projectDirectory.'/composer.json')) {
$runtimeConfig = json_decode(file_get_contents($composerFile), true)['extra']['runtime'] ?? [];

if (isset($runtimeConfig['dotenv_path'])) {
$dotenvPath = $this->projectDirectory.'/'.$runtimeConfig['dotenv_path'];
}
}

$filePath = $dotenvPath.'/.env';
}

$envFiles = $this->getEnvFiles($filePath);
$availableFiles = array_filter($envFiles, 'is_file');

if (\in_array(\sprintf('%s.local.php', $filePath), $availableFiles, true)) {
$io->warning(\sprintf('Due to existing dump file (%s.local.php) all other dotenv files are skipped.', $this->getRelativeName($filePath)));
}

if (is_file($filePath) && is_file(\sprintf('%s.dist', $filePath))) {
$io->warning(\sprintf('The file %s.dist gets skipped due to the existence of %1$s.', $this->getRelativeName($filePath)));
}

$io->section('Scanned Files (in descending priority)');
$io->listing(array_map(fn (string $envFile) => \in_array($envFile, $availableFiles, true)
? \sprintf('<fg=green>✓</> %s', $this->getRelativeName($envFile))
: \sprintf('<fg=red>⨯</> %s', $this->getRelativeName($envFile)), $envFiles));

$nameFilter = $input->getArgument('filter');
$variables = $this->getVariables($availableFiles, $nameFilter);

$io->section('Variables');

if ($variables || null === $nameFilter) {
$io->table(
array_merge(['Variable', 'Value'], array_map($this->getRelativeName(...), $availableFiles)),
$variables
);

$io->comment('Note that values might be different between web and CLI.');
} else {
$io->warning(\sprintf('No variables match the given filter "%s".', $nameFilter));
}

return 0;
}

public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor('filter')) {
$suggestions->suggestValues($this->getAvailableVars());
}
}

private function getVariables(array $envFiles, ?string $nameFilter): array
{
$variables = [];
$fileValues = [];
$dotenvVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? ''));

foreach ($envFiles as $envFile) {
$fileValues[$envFile] = $this->loadValues($envFile);
$variables += $fileValues[$envFile];
}

foreach ($variables as $var => $varDetails) {
if (null !== $nameFilter && 0 !== stripos($var, $nameFilter)) {
unset($variables[$var]);
continue;
}

$realValue = $_SERVER[$var] ?? '';
$varDetails = [$var, '<fg=green>'.OutputFormatter::escape($realValue).'</>'];
$varSeen = !isset($dotenvVars[$var]);

foreach ($envFiles as $envFile) {
if (null === $value = $fileValues[$envFile][$var] ?? null) {
$varDetails[] = '<fg=yellow>n/a</>';
continue;
}

$shortenedValue = OutputFormatter::escape($this->getHelper('formatter')->truncate($value, 30));
$varDetails[] = $value === $realValue && !$varSeen ? '<fg=green>'.$shortenedValue.'</>' : $shortenedValue;
$varSeen = $varSeen || $value === $realValue;
}

$variables[$var] = $varDetails;
}

ksort($variables);

return $variables;
}

private function getAvailableVars(): array
{
$filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? $this->projectDirectory.\DIRECTORY_SEPARATOR.'.env';
$envFiles = $this->getEnvFiles($filePath);

return array_keys($this->getVariables(array_filter($envFiles, 'is_file'), null));
}

private function getEnvFiles(string $filePath): array
{
$files = [
\sprintf('%s.local.php', $filePath),
\sprintf('%s.%s.local', $filePath, $this->kernelEnvironment),
\sprintf('%s.%s', $filePath, $this->kernelEnvironment),
];

if ('test' !== $this->kernelEnvironment) {
$files[] = \sprintf('%s.local', $filePath);
}

if (!is_file($filePath) && is_file(\sprintf('%s.dist', $filePath))) {
$files[] = \sprintf('%s.dist', $filePath);
} else {
$files[] = $filePath;
}

return $files;
}

private function getRelativeName(string $filePath): string
{
if (str_starts_with($filePath, $this->projectDirectory)) {
return substr($filePath, \strlen($this->projectDirectory) + 1);
}

return basename($filePath);
}

private function loadValues(string $filePath): array
{
if (str_ends_with($filePath, '.php')) {
return include $filePath;
}

return (new Dotenv())->parse(file_get_contents($filePath));
}
}
<?php










namespace Symfony\Component\Dotenv\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use Symfony\Component\Dotenv\Dotenv;






#[Autoconfigure(bind: ['$projectDir' => '%kernel.project_dir%', '$defaultEnv' => '%kernel.environment%'])]
#[AsCommand(name: 'dotenv:dump', description: 'Compile .env files to .env.local.php')]
final class DotenvDumpCommand extends Command
{
private string $projectDir;
private ?string $defaultEnv;

public function __construct(string $projectDir, ?string $defaultEnv = null)
{
$this->projectDir = $projectDir;
$this->defaultEnv = $defaultEnv;

parent::__construct();
}

protected function configure(): void
{
$this
->setDefinition([
new InputArgument('env', null === $this->defaultEnv ? InputArgument::REQUIRED : InputArgument::OPTIONAL, 'The application environment to dump .env files for - e.g. "prod".'),
])
->addOption('empty', null, InputOption::VALUE_NONE, 'Ignore the content of .env files')
->setHelp(<<<'EOT'
The <info>%command.name%</info> command compiles .env files into a PHP-optimized file called .env.local.php.

    <info>%command.full_name%</info>
EOT
)
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$config = [];
if (is_file($projectDir = $this->projectDir)) {
$config = ['dotenv_path' => basename($projectDir)];
$projectDir = \dirname($projectDir);
}

$composerFile = $projectDir.'/composer.json';
$config += (is_file($composerFile) ? json_decode(file_get_contents($composerFile), true) : [])['extra']['runtime'] ?? [];
$dotenvPath = $projectDir.'/'.($config['dotenv_path'] ?? '.env');
$env = $input->getArgument('env') ?? $this->defaultEnv;
$envKey = $config['env_var_name'] ?? 'APP_ENV';

if ($input->getOption('empty')) {
$vars = [$envKey => $env];
} else {
$vars = $this->loadEnv($dotenvPath, $env, $config);
$env = $vars[$envKey];
}

$vars = var_export($vars, true);
$vars = <<<EOF
<?php

// This file was generated by running "php bin/console dotenv:dump $env"

return $vars;

EOF;
file_put_contents($dotenvPath.'.local.php', $vars, \LOCK_EX);

$output->writeln(\sprintf('Successfully dumped .env files in <info>.env.local.php</> for the <info>%s</> environment.', $env));

return 0;
}

private function loadEnv(string $dotenvPath, string $env, array $config): array
{
$envKey = $config['env_var_name'] ?? 'APP_ENV';
$testEnvs = $config['test_envs'] ?? ['test'];

$dotenv = new Dotenv($envKey);

$globalsBackup = [$_SERVER, $_ENV];
unset($_SERVER[$envKey]);
$_ENV = [$envKey => $env];
$_SERVER['SYMFONY_DOTENV_VARS'] = implode(',', array_keys($_SERVER));

try {
$dotenv->loadEnv($dotenvPath, null, 'dev', $testEnvs);
unset($_ENV['SYMFONY_DOTENV_VARS']);

return $_ENV;
} finally {
[$_SERVER, $_ENV] = $globalsBackup;
}
}
}
<?php










namespace Symfony\Component\Dotenv;

use Symfony\Component\Dotenv\Exception\FormatException;
use Symfony\Component\Dotenv\Exception\FormatExceptionContext;
use Symfony\Component\Dotenv\Exception\PathException;
use Symfony\Component\Process\Exception\ExceptionInterface as ProcessException;
use Symfony\Component\Process\Process;







final class Dotenv
{
public const VARNAME_REGEX = '(?i:_?[A-Z][A-Z0-9_]*+)';
public const STATE_VARNAME = 0;
public const STATE_VALUE = 1;

private string $path;
private int $cursor;
private int $lineno;
private string $data;
private int $end;
private array $values = [];
private string $envKey;
private string $debugKey;
private array $prodEnvs = ['prod'];
private bool $usePutenv = false;

public function __construct(string $envKey = 'APP_ENV', string $debugKey = 'APP_DEBUG')
{
$this->envKey = $envKey;
$this->debugKey = $debugKey;
}




public function setProdEnvs(array $prodEnvs): static
{
$this->prodEnvs = $prodEnvs;

return $this;
}







public function usePutenv(bool $usePutenv = true): static
{
$this->usePutenv = $usePutenv;

return $this;
}










public function load(string $path, string ...$extraPaths): void
{
$this->doLoad(false, \func_get_args());
}
















public function loadEnv(string $path, ?string $envKey = null, string $defaultEnv = 'dev', array $testEnvs = ['test'], bool $overrideExistingVars = false): void
{
$k = $envKey ?? $this->envKey;

if (is_file($path) || !is_file($p = "$path.dist")) {
$this->doLoad($overrideExistingVars, [$path]);
} else {
$this->doLoad($overrideExistingVars, [$p]);
}

if (null === $env = $_SERVER[$k] ?? $_ENV[$k] ?? null) {
$this->populate([$k => $env = $defaultEnv], $overrideExistingVars);
}

if (!\in_array($env, $testEnvs, true) && is_file($p = "$path.local")) {
$this->doLoad($overrideExistingVars, [$p]);
$env = $_SERVER[$k] ?? $_ENV[$k] ?? $env;
}

if ('local' === $env) {
return;
}

if (is_file($p = "$path.$env")) {
$this->doLoad($overrideExistingVars, [$p]);
}

if (is_file($p = "$path.$env.local")) {
$this->doLoad($overrideExistingVars, [$p]);
}
}








public function bootEnv(string $path, string $defaultEnv = 'dev', array $testEnvs = ['test'], bool $overrideExistingVars = false): void
{
$p = $path.'.local.php';
$env = is_file($p) ? include $p : null;
$k = $this->envKey;

if (\is_array($env) && ($overrideExistingVars || !isset($env[$k]) || ($_SERVER[$k] ?? $_ENV[$k] ?? $env[$k]) === $env[$k])) {
$this->populate($env, $overrideExistingVars);
} else {
$this->loadEnv($path, $k, $defaultEnv, $testEnvs, $overrideExistingVars);
}

$_SERVER += $_ENV;

$k = $this->debugKey;
$debug = $_SERVER[$k] ?? !\in_array($_SERVER[$this->envKey], $this->prodEnvs, true);
$_SERVER[$k] = $_ENV[$k] = (int) $debug || (!\is_bool($debug) && filter_var($debug, \FILTER_VALIDATE_BOOL)) ? '1' : '0';
}










public function overload(string $path, string ...$extraPaths): void
{
$this->doLoad(true, \func_get_args());
}







public function populate(array $values, bool $overrideExistingVars = false): void
{
$updateLoadedVars = false;
$loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? ''));

foreach ($values as $name => $value) {
$notHttpName = !str_starts_with($name, 'HTTP_');
if (isset($_SERVER[$name]) && $notHttpName && !isset($_ENV[$name])) {
$_ENV[$name] = $_SERVER[$name];
}


if (!isset($loadedVars[$name]) && !$overrideExistingVars && isset($_ENV[$name])) {
continue;
}

if ($this->usePutenv) {
putenv("$name=$value");
}

$_ENV[$name] = $value;
if ($notHttpName) {
$_SERVER[$name] = $value;
}

if (!isset($loadedVars[$name])) {
$loadedVars[$name] = $updateLoadedVars = true;
}
}

if ($updateLoadedVars) {
unset($loadedVars['']);
$loadedVars = implode(',', array_keys($loadedVars));
$_ENV['SYMFONY_DOTENV_VARS'] = $_SERVER['SYMFONY_DOTENV_VARS'] = $loadedVars;

if ($this->usePutenv) {
putenv('SYMFONY_DOTENV_VARS='.$loadedVars);
}
}
}









public function parse(string $data, string $path = '.env'): array
{
$this->path = $path;
$this->data = str_replace(["\r\n", "\r"], "\n", $data);
$this->lineno = 1;
$this->cursor = 0;
$this->end = \strlen($this->data);
$state = self::STATE_VARNAME;
$this->values = [];
$name = '';

$this->skipEmptyLines();

while ($this->cursor < $this->end) {
switch ($state) {
case self::STATE_VARNAME:
$name = $this->lexVarname();
$state = self::STATE_VALUE;
break;

case self::STATE_VALUE:
$this->values[$name] = $this->lexValue();
$state = self::STATE_VARNAME;
break;
}
}

if (self::STATE_VALUE === $state) {
$this->values[$name] = '';
}

try {
return $this->values;
} finally {
$this->values = [];
unset($this->path, $this->cursor, $this->lineno, $this->data, $this->end);
}
}

private function lexVarname(): string
{

if (!preg_match('/(export[ \t]++)?('.self::VARNAME_REGEX.')/A', $this->data, $matches, 0, $this->cursor)) {
throw $this->createFormatException('Invalid character in variable name');
}
$this->moveCursor($matches[0]);

if ($this->cursor === $this->end || "\n" === $this->data[$this->cursor] || '#' === $this->data[$this->cursor]) {
if ($matches[1]) {
throw $this->createFormatException('Unable to unset an environment variable');
}

throw $this->createFormatException('Missing = in the environment variable declaration');
}

if (' ' === $this->data[$this->cursor] || "\t" === $this->data[$this->cursor]) {
throw $this->createFormatException('Whitespace characters are not supported after the variable name');
}

if ('=' !== $this->data[$this->cursor]) {
throw $this->createFormatException('Missing = in the environment variable declaration');
}
++$this->cursor;

return $matches[2];
}

private function lexValue(): string
{
if (preg_match('/[ \t]*+(?:#.*)?$/Am', $this->data, $matches, 0, $this->cursor)) {
$this->moveCursor($matches[0]);
$this->skipEmptyLines();

return '';
}

if (' ' === $this->data[$this->cursor] || "\t" === $this->data[$this->cursor]) {
throw $this->createFormatException('Whitespace are not supported before the value');
}

$loadedVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? ''));
unset($loadedVars['']);
$v = '';

do {
if ("'" === $this->data[$this->cursor]) {
$len = 0;

do {
if ($this->cursor + ++$len === $this->end) {
$this->cursor += $len;

throw $this->createFormatException('Missing quote to end the value');
}
} while ("'" !== $this->data[$this->cursor + $len]);

$v .= substr($this->data, 1 + $this->cursor, $len - 1);
$this->cursor += 1 + $len;
} elseif ('"' === $this->data[$this->cursor]) {
$value = '';

if (++$this->cursor === $this->end) {
throw $this->createFormatException('Missing quote to end the value');
}

while ('"' !== $this->data[$this->cursor] || ('\\' === $this->data[$this->cursor - 1] && '\\' !== $this->data[$this->cursor - 2])) {
$value .= $this->data[$this->cursor];
++$this->cursor;

if ($this->cursor === $this->end) {
throw $this->createFormatException('Missing quote to end the value');
}
}
++$this->cursor;
$value = str_replace(['\\"', '\r', '\n'], ['"', "\r", "\n"], $value);
$resolvedValue = $value;
$resolvedValue = $this->resolveCommands($resolvedValue, $loadedVars);
$resolvedValue = $this->resolveVariables($resolvedValue, $loadedVars);
$resolvedValue = str_replace('\\\\', '\\', $resolvedValue);
$v .= $resolvedValue;
} else {
$value = '';
$prevChr = $this->data[$this->cursor - 1];
while ($this->cursor < $this->end && !\in_array($this->data[$this->cursor], ["\n", '"', "'"], true) && !((' ' === $prevChr || "\t" === $prevChr) && '#' === $this->data[$this->cursor])) {
if ('\\' === $this->data[$this->cursor] && isset($this->data[$this->cursor + 1]) && ('"' === $this->data[$this->cursor + 1] || "'" === $this->data[$this->cursor + 1])) {
++$this->cursor;
}

$value .= $prevChr = $this->data[$this->cursor];

if ('$' === $this->data[$this->cursor] && isset($this->data[$this->cursor + 1]) && '(' === $this->data[$this->cursor + 1]) {
++$this->cursor;
$value .= '('.$this->lexNestedExpression().')';
}

++$this->cursor;
}
$value = rtrim($value);
$resolvedValue = $value;
$resolvedValue = $this->resolveCommands($resolvedValue, $loadedVars);
$resolvedValue = $this->resolveVariables($resolvedValue, $loadedVars);
$resolvedValue = str_replace('\\\\', '\\', $resolvedValue);

if ($resolvedValue === $value && preg_match('/\s+/', $value)) {
throw $this->createFormatException('A value containing spaces must be surrounded by quotes');
}

$v .= $resolvedValue;

if ($this->cursor < $this->end && '#' === $this->data[$this->cursor]) {
break;
}
}
} while ($this->cursor < $this->end && "\n" !== $this->data[$this->cursor]);

$this->skipEmptyLines();

return $v;
}

private function lexNestedExpression(): string
{
++$this->cursor;
$value = '';

while ("\n" !== $this->data[$this->cursor] && ')' !== $this->data[$this->cursor]) {
$value .= $this->data[$this->cursor];

if ('(' === $this->data[$this->cursor]) {
$value .= $this->lexNestedExpression().')';
}

++$this->cursor;

if ($this->cursor === $this->end) {
throw $this->createFormatException('Missing closing parenthesis.');
}
}

if ("\n" === $this->data[$this->cursor]) {
throw $this->createFormatException('Missing closing parenthesis.');
}

return $value;
}

private function skipEmptyLines(): void
{
if (preg_match('/(?:\s*+(?:#[^\n]*+)?+)++/A', $this->data, $match, 0, $this->cursor)) {
$this->moveCursor($match[0]);
}
}

private function resolveCommands(string $value, array $loadedVars): string
{
if (!str_contains($value, '$')) {
return $value;
}

$regex = '/
            (\\\\)?               # escaped with a backslash?
            \$
            (?<cmd>
                \(                # require opening parenthesis
                ([^()]|\g<cmd>)+  # allow any number of non-parens, or balanced parens (by nesting the <cmd> expression recursively)
                \)                # require closing paren
            )
        /x';

return preg_replace_callback($regex, function ($matches) use ($loadedVars) {
if ('\\' === $matches[1]) {
return substr($matches[0], 1);
}

if ('\\' === \DIRECTORY_SEPARATOR) {
throw new \LogicException('Resolving commands is not supported on Windows.');
}

if (!class_exists(Process::class)) {
throw new \LogicException('Resolving commands requires the Symfony Process component. Try running "composer require symfony/process".');
}

$process = Process::fromShellCommandline('echo '.$matches[0]);

$env = [];
foreach ($this->values as $name => $value) {
if (isset($loadedVars[$name]) || (!isset($_ENV[$name]) && !(isset($_SERVER[$name]) && !str_starts_with($name, 'HTTP_')))) {
$env[$name] = $value;
}
}
$process->setEnv($env);

try {
$process->mustRun();
} catch (ProcessException) {
throw $this->createFormatException(\sprintf('Issue expanding a command (%s)', $process->getErrorOutput()));
}

return preg_replace('/[\r\n]+$/', '', $process->getOutput());
}, $value);
}

private function resolveVariables(string $value, array $loadedVars): string
{
if (!str_contains($value, '$')) {
return $value;
}

$regex = '/
            (?<!\\\\)
            (?P<backslashes>\\\\*)             # escaped with a backslash?
            \$
            (?!\()                             # no opening parenthesis
            (?P<opening_brace>\{)?             # optional brace
            (?P<name>'.self::VARNAME_REGEX.')? # var name
            (?P<default_value>:[-=][^\}]*+)?   # optional default value
            (?P<closing_brace>\})?             # optional closing brace
        /x';

$value = preg_replace_callback($regex, function ($matches) use ($loadedVars) {

if (1 === \strlen($matches['backslashes']) % 2) {
return substr($matches[0], 1);
}


if (!isset($matches['name'])) {
return $matches[0];
}

if ('{' === $matches['opening_brace'] && !isset($matches['closing_brace'])) {
throw $this->createFormatException('Unclosed braces on variable expansion');
}

$name = $matches['name'];
if (isset($loadedVars[$name]) && isset($this->values[$name])) {
$value = $this->values[$name];
} elseif (isset($_ENV[$name])) {
$value = $_ENV[$name];
} elseif (isset($_SERVER[$name]) && !str_starts_with($name, 'HTTP_')) {
$value = $_SERVER[$name];
} elseif (isset($this->values[$name])) {
$value = $this->values[$name];
} else {
$value = (string) getenv($name);
}

if ('' === $value && isset($matches['default_value']) && '' !== $matches['default_value']) {
$unsupportedChars = strpbrk($matches['default_value'], '\'"{$');
if (false !== $unsupportedChars) {
throw $this->createFormatException(\sprintf('Unsupported character "%s" found in the default value of variable "$%s".', $unsupportedChars[0], $name));
}

$value = substr($matches['default_value'], 2);

if ('=' === $matches['default_value'][1]) {
$this->values[$name] = $value;
}
}

if (!$matches['opening_brace'] && isset($matches['closing_brace'])) {
$value .= '}';
}

return $matches['backslashes'].$value;
}, $value);

return $value;
}

private function moveCursor(string $text): void
{
$this->cursor += \strlen($text);
$this->lineno += substr_count($text, "\n");
}

private function createFormatException(string $message): FormatException
{
return new FormatException($message, new FormatExceptionContext($this->data, $this->path, $this->lineno, $this->cursor));
}

private function doLoad(bool $overrideExistingVars, array $paths): void
{
foreach ($paths as $path) {
if (!is_readable($path) || is_dir($path)) {
throw new PathException($path);
}

$data = file_get_contents($path);

if ("\xEF\xBB\xBF" === substr($data, 0, 3)) {
throw new FormatException('Loading files starting with a byte-order-mark (BOM) is not supported.', new FormatExceptionContext($data, $path, 1, 0));
}

$this->populate($this->parse($data, $path), $overrideExistingVars);
}
}
}
<?php










namespace Symfony\Contracts\Service\Attribute;

use Symfony\Contracts\Service\ServiceMethodsSubscriberTrait;
use Symfony\Contracts\Service\ServiceSubscriberInterface;











#[\Attribute(\Attribute::TARGET_METHOD)]
final class SubscribedService
{

public array $attributes;







public function __construct(
public ?string $key = null,
public ?string $type = null,
public bool $nullable = false,
array|object $attributes = [],
) {
$this->attributes = \is_array($attributes) ? $attributes : [$attributes];
}
}
<?php










namespace Symfony\Contracts\Service\Attribute;









#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)]
final class Required
{
}
Copyright (c) 2018-present 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.
<?php










namespace Symfony\Contracts\Service;

/**
@template-covariant
@extends
@extends





*/
interface ServiceCollectionInterface extends ServiceProviderInterface, \Countable, \IteratorAggregate
{
}
<?php










namespace Symfony\Contracts\Service;

use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\Attribute\Required;
use Symfony\Contracts\Service\Attribute\SubscribedService;

trigger_deprecation('symfony/contracts', 'v3.5', '"%s" is deprecated, use "ServiceMethodsSubscriberTrait" instead.', ServiceSubscriberTrait::class);














trait ServiceSubscriberTrait
{
public static function getSubscribedServices(): array
{
$services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];

foreach ((new \ReflectionClass(self::class))->getMethods() as $method) {
if (self::class !== $method->getDeclaringClass()->name) {
continue;
}

if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {
continue;
}

if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
}

if (!$returnType = $method->getReturnType()) {
throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
}


$attribute = $attribute->newInstance();
$attribute->key ??= self::class.'::'.$method->name;
$attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType;
$attribute->nullable = $attribute->nullable ?: $returnType->allowsNull();

if ($attribute->attributes) {
$services[] = $attribute;
} else {
$services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;
}
}

return $services;
}

#[Required]
public function setContainer(ContainerInterface $container): ?ContainerInterface
{
$ret = null;
if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {
$ret = parent::setContainer($container);
}

$this->container = $container;

return $ret;
}
}
<?php










namespace Symfony\Contracts\Service;














interface ResetInterface
{



public function reset();
}
<?php










namespace Symfony\Contracts\Service;

use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;


class_exists(ContainerExceptionInterface::class);
class_exists(NotFoundExceptionInterface::class);







trait ServiceLocatorTrait
{
private array $loading = [];
private array $providedTypes;




public function __construct(
private array $factories,
) {
}

public function has(string $id): bool
{
return isset($this->factories[$id]);
}

public function get(string $id): mixed
{
if (!isset($this->factories[$id])) {
throw $this->createNotFoundException($id);
}

if (isset($this->loading[$id])) {
$ids = array_values($this->loading);
$ids = \array_slice($this->loading, array_search($id, $ids));
$ids[] = $id;

throw $this->createCircularReferenceException($id, $ids);
}

$this->loading[$id] = $id;
try {
return $this->factories[$id]($this);
} finally {
unset($this->loading[$id]);
}
}

public function getProvidedServices(): array
{
if (!isset($this->providedTypes)) {
$this->providedTypes = [];

foreach ($this->factories as $name => $factory) {
if (!\is_callable($factory)) {
$this->providedTypes[$name] = '?';
} else {
$type = (new \ReflectionFunction($factory))->getReturnType();

$this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?';
}
}
}

return $this->providedTypes;
}

private function createNotFoundException(string $id): NotFoundExceptionInterface
{
if (!$alternatives = array_keys($this->factories)) {
$message = 'is empty...';
} else {
$last = array_pop($alternatives);
if ($alternatives) {
$message = \sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last);
} else {
$message = \sprintf('only knows about the "%s" service.', $last);
}
}

if ($this->loading) {
$message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message);
} else {
$message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message);
}

return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface {
};
}

private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface
{
return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface {
};
}
}
<?php










namespace Symfony\Contracts\Service;

use Symfony\Contracts\Service\Attribute\SubscribedService;
















interface ServiceSubscriberInterface
{




























public static function getSubscribedServices(): array;
}
<?php










namespace Symfony\Contracts\Service\Test;

class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class);

if (false) {



class ServiceLocatorTest
{
}
}
<?php










namespace Symfony\Contracts\Service\Test;

use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Contracts\Service\ServiceLocatorTrait;

abstract class ServiceLocatorTestCase extends TestCase
{



protected function getServiceLocator(array $factories): ContainerInterface
{
return new class($factories) implements ContainerInterface {
use ServiceLocatorTrait;
};
}

public function testHas()
{
$locator = $this->getServiceLocator([
'foo' => fn () => 'bar',
'bar' => fn () => 'baz',
fn () => 'dummy',
]);

$this->assertTrue($locator->has('foo'));
$this->assertTrue($locator->has('bar'));
$this->assertFalse($locator->has('dummy'));
}

public function testGet()
{
$locator = $this->getServiceLocator([
'foo' => fn () => 'bar',
'bar' => fn () => 'baz',
]);

$this->assertSame('bar', $locator->get('foo'));
$this->assertSame('baz', $locator->get('bar'));
}

public function testGetDoesNotMemoize()
{
$i = 0;
$locator = $this->getServiceLocator([
'foo' => function () use (&$i) {
++$i;

return 'bar';
},
]);

$this->assertSame('bar', $locator->get('foo'));
$this->assertSame('bar', $locator->get('foo'));
$this->assertSame(2, $i);
}

public function testThrowsOnUndefinedInternalService()
{
$locator = $this->getServiceLocator([
'foo' => function () use (&$locator) { return $locator->get('bar'); },
]);

$this->expectException(NotFoundExceptionInterface::class);
$this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.');

$locator->get('foo');
}

public function testThrowsOnCircularReference()
{
$locator = $this->getServiceLocator([
'foo' => function () use (&$locator) { return $locator->get('bar'); },
'bar' => function () use (&$locator) { return $locator->get('baz'); },
'baz' => function () use (&$locator) { return $locator->get('bar'); },
]);

$this->expectException(ContainerExceptionInterface::class);
$this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".');

$locator->get('foo');
}
}
<?php










namespace Symfony\Contracts\Service;

use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\Attribute\Required;
use Symfony\Contracts\Service\Attribute\SubscribedService;










trait ServiceMethodsSubscriberTrait
{
protected ContainerInterface $container;

public static function getSubscribedServices(): array
{
$services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];

foreach ((new \ReflectionClass(self::class))->getMethods() as $method) {
if (self::class !== $method->getDeclaringClass()->name) {
continue;
}

if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) {
continue;
}

if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
}

if (!$returnType = $method->getReturnType()) {
throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
}


$attribute = $attribute->newInstance();
$attribute->key ??= self::class.'::'.$method->name;
$attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType;
$attribute->nullable = $attribute->nullable ?: $returnType->allowsNull();

if ($attribute->attributes) {
$services[] = $attribute;
} else {
$services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;
}
}

return $services;
}

#[Required]
public function setContainer(ContainerInterface $container): ?ContainerInterface
{
$ret = null;
if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {
$ret = parent::setContainer($container);
}

$this->container = $container;

return $ret;
}
}
<?php










namespace Symfony\Contracts\Service;

use Psr\Container\ContainerInterface;

/**
@template-covariant





*/
interface ServiceProviderInterface extends ContainerInterface
{



public function get(string $id): mixed;

public function has(string $id): bool;












public function getProvidedServices(): array;
}
<?php










namespace Symfony\Component\Cache;

use Symfony\Contracts\Service\ResetInterface;




interface ResettableInterface extends ResetInterface
{
}
<?php










namespace Symfony\Component\Cache;




interface PruneableInterface
{
public function prune(): bool;
}
Copyright (c) 2016-present 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.
<?php










namespace Symfony\Component\Cache\Marshaller;









interface MarshallerInterface
{






public function marshall(array $values, ?array &$failed): array;






public function unmarshall(string $value): mixed;
}
<?php










namespace Symfony\Component\Cache\Marshaller;

use Symfony\Component\Cache\Exception\CacheException;






class DeflateMarshaller implements MarshallerInterface
{
private MarshallerInterface $marshaller;

public function __construct(MarshallerInterface $marshaller)
{
if (!\function_exists('gzdeflate')) {
throw new CacheException('The "zlib" PHP extension is not loaded.');
}

$this->marshaller = $marshaller;
}

public function marshall(array $values, ?array &$failed): array
{
return array_map('gzdeflate', $this->marshaller->marshall($values, $failed));
}

public function unmarshall(string $value): mixed
{
if (false !== $inflatedValue = @gzinflate($value)) {
$value = $inflatedValue;
}

return $this->marshaller->unmarshall($value);
}
}
<?php










namespace Symfony\Component\Cache\Marshaller;

use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;






class SodiumMarshaller implements MarshallerInterface
{
private MarshallerInterface $marshaller;
private array $decryptionKeys;






public function __construct(array $decryptionKeys, ?MarshallerInterface $marshaller = null)
{
if (!self::isSupported()) {
throw new CacheException('The "sodium" PHP extension is not loaded.');
}

if (!isset($decryptionKeys[0])) {
throw new InvalidArgumentException('At least one decryption key must be provided at index "0".');
}

$this->marshaller = $marshaller ?? new DefaultMarshaller();
$this->decryptionKeys = $decryptionKeys;
}

public static function isSupported(): bool
{
return \function_exists('sodium_crypto_box_seal');
}

public function marshall(array $values, ?array &$failed): array
{
$encryptionKey = sodium_crypto_box_publickey($this->decryptionKeys[0]);

$encryptedValues = [];
foreach ($this->marshaller->marshall($values, $failed) as $k => $v) {
$encryptedValues[$k] = sodium_crypto_box_seal($v, $encryptionKey);
}

return $encryptedValues;
}

public function unmarshall(string $value): mixed
{
foreach ($this->decryptionKeys as $k) {
if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) {
$value = $decryptedValue;
break;
}
}

return $this->marshaller->unmarshall($value);
}
}
<?php










namespace Symfony\Component\Cache\Marshaller;






class TagAwareMarshaller implements MarshallerInterface
{
private MarshallerInterface $marshaller;

public function __construct(?MarshallerInterface $marshaller = null)
{
$this->marshaller = $marshaller ?? new DefaultMarshaller();
}

public function marshall(array $values, ?array &$failed): array
{
$failed = $notSerialized = $serialized = [];

foreach ($values as $id => $value) {
if (\is_array($value) && \is_array($value['tags'] ?? null) && \array_key_exists('value', $value) && \count($value) === 2 + (\is_string($value['meta'] ?? null) && 8 === \strlen($value['meta']))) {



$v = $this->marshaller->marshall($value, $f);

if ($f) {
$f = [];
$failed[] = $id;
} else {
if ([] === $value['tags']) {
$v['tags'] = '';
}

$serialized[$id] = "\x9D".($value['meta'] ?? "\0\0\0\0\0\0\0\0").pack('N', \strlen($v['tags'])).$v['tags'].$v['value'];
$serialized[$id][9] = "\x5F";
}
} else {

$notSerialized[$id] = $value;
}
}

if ($notSerialized) {
$serialized += $this->marshaller->marshall($notSerialized, $f);
$failed = array_merge($failed, $f);
}

return $serialized;
}

public function unmarshall(string $value): mixed
{

if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) {
return $this->marshaller->unmarshall($value);
}


$meta = substr($value, 1, 12);
$meta[8] = "\0";
$tagLen = unpack('Nlen', $meta, 8)['len'];
$meta = substr($meta, 0, 8);

return [
'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)),
'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [],
'meta' => "\0\0\0\0\0\0\0\0" === $meta ? null : $meta,
];
}
}
<?php










namespace Symfony\Component\Cache\Marshaller;

use Symfony\Component\Cache\Exception\CacheException;






class DefaultMarshaller implements MarshallerInterface
{
private bool $useIgbinarySerialize = true;
private bool $throwOnSerializationFailure = false;

public function __construct(?bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false)
{
if (null === $useIgbinarySerialize) {
$useIgbinarySerialize = \extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<=');
} elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) {
throw new CacheException(\extension_loaded('igbinary') ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.');
}
$this->useIgbinarySerialize = $useIgbinarySerialize;
$this->throwOnSerializationFailure = $throwOnSerializationFailure;
}

public function marshall(array $values, ?array &$failed): array
{
$serialized = $failed = [];

foreach ($values as $id => $value) {
try {
if ($this->useIgbinarySerialize) {
$serialized[$id] = igbinary_serialize($value);
} else {
$serialized[$id] = serialize($value);
}
} catch (\Exception $e) {
if ($this->throwOnSerializationFailure) {
throw new \ValueError($e->getMessage(), 0, $e);
}
$failed[] = $id;
}
}

return $serialized;
}

public function unmarshall(string $value): mixed
{
if ('b:0;' === $value) {
return false;
}
if ('N;' === $value) {
return null;
}
static $igbinaryNull;
if ($value === $igbinaryNull ??= \extension_loaded('igbinary') ? igbinary_serialize(null) : false) {
return null;
}
$unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
try {
if (':' === ($value[1] ?? ':')) {
if (false !== $value = unserialize($value)) {
return $value;
}
} elseif (false === $igbinaryNull) {
throw new \RuntimeException('Failed to unserialize values, did you forget to install the "igbinary" extension?');
} elseif (null !== $value = igbinary_unserialize($value)) {
return $value;
}

throw new \DomainException(error_get_last() ? error_get_last()['message'] : 'Failed to unserialize values.');
} catch (\Error $e) {
throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
} finally {
ini_set('unserialize_callback_func', $unserializeCallbackHandler);
}
}




public static function handleUnserializeCallback(string $class): never
{
throw new \DomainException('Class not found: '.$class);
}
}
<?php










namespace Symfony\Component\Cache\DependencyInjection;

use Symfony\Component\Cache\Adapter\AbstractAdapter;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\ChainAdapter;
use Symfony\Component\Cache\Adapter\NullAdapter;
use Symfony\Component\Cache\Adapter\ParameterNormalizer;
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
use Symfony\Component\Cache\Messenger\EarlyExpirationDispatcher;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;




class CachePoolPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if ($container->hasParameter('cache.prefix.seed')) {
$seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed'));
} else {
$seed = '_'.$container->getParameter('kernel.project_dir');
$seed .= '.'.$container->getParameter('kernel.container_class');
}

$needsMessageHandler = false;
$allPools = [];
$clearers = [];
$attributes = [
'provider',
'name',
'namespace',
'default_lifetime',
'early_expiration_message_bus',
'reset',
];
foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) {
$adapter = $pool = $container->getDefinition($id);
if ($pool->isAbstract()) {
continue;
}
$class = $adapter->getClass();
$providers = $adapter->getArguments();
while ($adapter instanceof ChildDefinition) {
$adapter = $container->findDefinition($adapter->getParent());
$class = $class ?: $adapter->getClass();
$providers += $adapter->getArguments();
if ($t = $adapter->getTag('cache.pool')) {
$tags[0] += $t[0];
}
}
$name = $tags[0]['name'] ?? $id;
if (!isset($tags[0]['namespace'])) {
$namespaceSeed = $seed;
if (null !== $class) {
$namespaceSeed .= '.'.$class;
}

$tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name);
}
if (isset($tags[0]['clearer'])) {
$clearer = $tags[0]['clearer'];
while ($container->hasAlias($clearer)) {
$clearer = (string) $container->getAlias($clearer);
}
} else {
$clearer = null;
}
unset($tags[0]['clearer'], $tags[0]['name']);

if (isset($tags[0]['provider'])) {
$tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider']));
}

if (ChainAdapter::class === $class) {
$adapters = [];
foreach ($providers['index_0'] ?? $providers[0] as $provider => $adapter) {
if ($adapter instanceof ChildDefinition) {
$chainedPool = $adapter;
} else {
$chainedPool = $adapter = new ChildDefinition($adapter);
}

$chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]];
$chainedClass = '';

while ($adapter instanceof ChildDefinition) {
$adapter = $container->findDefinition($adapter->getParent());
$chainedClass = $chainedClass ?: $adapter->getClass();
if ($t = $adapter->getTag('cache.pool')) {
$chainedTags[0] += $t[0];
}
}

if (ChainAdapter::class === $chainedClass) {
throw new InvalidArgumentException(\sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent()));
}

$i = 0;

if (isset($chainedTags[0]['provider'])) {
$chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider'])));
}

if (isset($tags[0]['namespace']) && !\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], true)) {
$chainedPool->replaceArgument($i++, $tags[0]['namespace']);
}

if (isset($tags[0]['default_lifetime'])) {
$chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']);
}

$adapters[] = $chainedPool;
}

$pool->replaceArgument(0, $adapters);
unset($tags[0]['provider'], $tags[0]['namespace']);
$i = 1;
} else {
$i = 0;
}

foreach ($attributes as $attr) {
if (!isset($tags[0][$attr])) {

} elseif ('reset' === $attr) {
if ($tags[0][$attr]) {
$pool->addTag('kernel.reset', ['method' => $tags[0][$attr]]);
}
} elseif ('early_expiration_message_bus' === $attr) {
$needsMessageHandler = true;
$pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class))
->addArgument(new Reference($tags[0]['early_expiration_message_bus']))
->addArgument(new Reference('reverse_container'))
->addArgument((new Definition('callable'))
->setFactory([new Reference($id), 'setCallbackWrapper'])
->addArgument(null)
),
]);
$pool->addTag('container.reversible');
} elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class, TagAwareAdapter::class], true)) {
$argument = $tags[0][$attr];

if ('default_lifetime' === $attr && !is_numeric($argument)) {
$argument = (new Definition('int', [$argument]))
->setFactory([ParameterNormalizer::class, 'normalizeDuration']);
}

$pool->replaceArgument($i++, $argument);
}
unset($tags[0][$attr]);
}
if (!empty($tags[0])) {
throw new InvalidArgumentException(\sprintf('Invalid "cache.pool" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $id, implode('", "', array_keys($tags[0]))));
}

if (null !== $clearer) {
$clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);
}

$allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE);
}

if (!$needsMessageHandler) {
$container->removeDefinition('cache.early_expiration_handler');
}

$notAliasedCacheClearerId = 'cache.global_clearer';
while ($container->hasAlias($notAliasedCacheClearerId)) {
$notAliasedCacheClearerId = (string) $container->getAlias($notAliasedCacheClearerId);
}
if ($container->hasDefinition($notAliasedCacheClearerId)) {
$clearers[$notAliasedCacheClearerId] = $allPools;
}

foreach ($clearers as $id => $pools) {
$clearer = $container->getDefinition($id);
if ($clearer instanceof ChildDefinition) {
$clearer->replaceArgument(0, $pools);
} else {
$clearer->setArgument(0, $pools);
}
$clearer->addTag('cache.pool.clearer');
}

$allPoolsKeys = array_keys($allPools);

if ($container->hasDefinition('console.command.cache_pool_list')) {
$container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys);
}

if ($container->hasDefinition('console.command.cache_pool_clear')) {
$container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys);
}

if ($container->hasDefinition('console.command.cache_pool_delete')) {
$container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys);
}
}

private function getNamespace(string $seed, string $id): string
{
return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10);
}




public static function getServiceProvider(ContainerBuilder $container, string $name): string
{
$container->resolveEnvPlaceholders($name, null, $usedEnvs);

if ($usedEnvs || preg_match('#^[a-z]++:#', $name)) {
$dsn = $name;

if (!$container->hasDefinition($name = '.cache_connection.'.ContainerBuilder::hash($dsn))) {
$definition = new Definition(AbstractAdapter::class);
$definition->setFactory([AbstractAdapter::class, 'createConnection']);
$definition->setArguments([$dsn, ['lazy' => true]]);
$container->setDefinition($name, $definition);
}
}

return $name;
}
}
<?php










namespace Symfony\Component\Cache\DependencyInjection;

use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;




class CachePoolPrunerPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('console.command.cache_pool_prune')) {
return;
}

$services = [];

foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) {
$class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass());

if (!$reflection = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}

if ($reflection->implementsInterface(PruneableInterface::class)) {
$services[$id] = new Reference($id);
}
}

$container->getDefinition('console.command.cache_pool_prune')->replaceArgument(0, new IteratorArgument($services));
}
}
<?php










namespace Symfony\Component\Cache\DependencyInjection;

use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
use Symfony\Component\Cache\Adapter\TraceableAdapter;
use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;






class CacheCollectorPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('data_collector.cache')) {
return;
}

foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) {
$poolName = $attributes[0]['name'] ?? $id;

$this->addToCollector($id, $poolName, $container);
}
}

private function addToCollector(string $id, string $name, ContainerBuilder $container): void
{
$definition = $container->getDefinition($id);
if ($definition->isAbstract()) {
return;
}

$collectorDefinition = $container->getDefinition('data_collector.cache');
$recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class);
$recorder->setTags($definition->getTags());
if (!$definition->isPublic() || !$definition->isPrivate()) {
$recorder->setPublic($definition->isPublic());
}
$recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]);

foreach ($definition->getMethodCalls() as [$method, $args]) {
if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) {
continue;
}
if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) {
$args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']);
}
}

$definition->setTags([]);
$definition->setPublic(false);

$container->setDefinition($innerId, $definition);
$container->setDefinition($id, $recorder);


$collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]);
}
}
<?php










namespace Symfony\Component\Cache\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;




class CachePoolClearerPass implements CompilerPassInterface
{



public function process(ContainerBuilder $container)
{
$container->getParameterBag()->remove('cache.prefix.seed');

foreach ($container->findTaggedServiceIds('cache.pool.clearer') as $id => $attr) {
$clearer = $container->getDefinition($id);
$pools = [];
foreach ($clearer->getArgument(0) as $name => $ref) {
if ($container->hasDefinition($ref)) {
$pools[$name] = new Reference($ref);
}
}
$clearer->replaceArgument(0, $pools);
}
}
}
<?php










namespace Symfony\Component\Cache\Exception;

use Psr\Cache\CacheException as Psr6CacheInterface;
use Psr\SimpleCache\CacheException as SimpleCacheInterface;

if (interface_exists(SimpleCacheInterface::class)) {
class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface
{
}
} else {
class CacheException extends \Exception implements Psr6CacheInterface
{
}
}
<?php










namespace Symfony\Component\Cache\Exception;

use Psr\Cache\CacheException as Psr6CacheInterface;
use Psr\SimpleCache\CacheException as SimpleCacheInterface;

if (interface_exists(SimpleCacheInterface::class)) {
class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface
{
}
} else {
class LogicException extends \LogicException implements Psr6CacheInterface
{
}
}
<?php










namespace Symfony\Component\Cache\Exception;

use Psr\Cache\InvalidArgumentException as Psr6CacheInterface;
use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface;

if (interface_exists(SimpleCacheInterface::class)) {
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface
{
}
} else {
class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface
{
}
}
<?php










namespace Symfony\Component\Cache;

use Psr\Cache\CacheException as Psr6CacheException;
use Psr\Cache\CacheItemPoolInterface;
use Psr\SimpleCache\CacheException as SimpleCacheException;
use Psr\SimpleCache\CacheInterface;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Traits\ProxyTrait;






class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface
{
use ProxyTrait;

private ?\Closure $createCacheItem = null;
private ?CacheItem $cacheItemPrototype = null;
private static \Closure $packCacheItem;

public function __construct(CacheItemPoolInterface $pool)
{
$this->pool = $pool;

if (!$pool instanceof AdapterInterface) {
return;
}
$cacheItemPrototype = &$this->cacheItemPrototype;
$createCacheItem = \Closure::bind(
static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) {
$item = clone $cacheItemPrototype;
$item->poolHash = $item->innerItem = null;
if ($allowInt && \is_int($key)) {
$item->key = (string) $key;
} else {
\assert('' !== CacheItem::validateKey($key));
$item->key = $key;
}
$item->value = $value;
$item->isHit = false;

return $item;
},
null,
CacheItem::class
);
$this->createCacheItem = function ($key, $value, $allowInt = false) use ($createCacheItem) {
if (null === $this->cacheItemPrototype) {
$this->get($allowInt && \is_int($key) ? (string) $key : $key);
}
$this->createCacheItem = $createCacheItem;

return $createCacheItem($key, null, $allowInt)->set($value);
};
self::$packCacheItem ??= \Closure::bind(
static function (CacheItem $item) {
$item->newMetadata = $item->metadata;

return $item->pack();
},
null,
CacheItem::class
);
}

public function get($key, $default = null): mixed
{
try {
$item = $this->pool->getItem($key);
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
if (null === $this->cacheItemPrototype) {
$this->cacheItemPrototype = clone $item;
$this->cacheItemPrototype->set(null);
}

return $item->isHit() ? $item->get() : $default;
}

public function set($key, $value, $ttl = null): bool
{
try {
if (null !== $f = $this->createCacheItem) {
$item = $f($key, $value);
} else {
$item = $this->pool->getItem($key)->set($value);
}
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
if (null !== $ttl) {
$item->expiresAfter($ttl);
}

return $this->pool->save($item);
}

public function delete($key): bool
{
try {
return $this->pool->deleteItem($key);
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
}

public function clear(): bool
{
return $this->pool->clear();
}

public function getMultiple($keys, $default = null): iterable
{
if ($keys instanceof \Traversable) {
$keys = iterator_to_array($keys, false);
} elseif (!\is_array($keys)) {
throw new InvalidArgumentException(\sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys)));
}

try {
$items = $this->pool->getItems($keys);
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
$values = [];

if (!$this->pool instanceof AdapterInterface) {
foreach ($items as $key => $item) {
$values[$key] = $item->isHit() ? $item->get() : $default;
}

return $values;
}

foreach ($items as $key => $item) {
$values[$key] = $item->isHit() ? (self::$packCacheItem)($item) : $default;
}

return $values;
}

public function setMultiple($values, $ttl = null): bool
{
$valuesIsArray = \is_array($values);
if (!$valuesIsArray && !$values instanceof \Traversable) {
throw new InvalidArgumentException(\sprintf('Cache values must be array or Traversable, "%s" given.', get_debug_type($values)));
}
$items = [];

try {
if (null !== $f = $this->createCacheItem) {
$valuesIsArray = false;
foreach ($values as $key => $value) {
$items[$key] = $f($key, $value, true);
}
} elseif ($valuesIsArray) {
$items = [];
foreach ($values as $key => $value) {
$items[] = (string) $key;
}
$items = $this->pool->getItems($items);
} else {
foreach ($values as $key => $value) {
if (\is_int($key)) {
$key = (string) $key;
}
$items[$key] = $this->pool->getItem($key)->set($value);
}
}
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
$ok = true;

foreach ($items as $key => $item) {
if ($valuesIsArray) {
$item->set($values[$key]);
}
if (null !== $ttl) {
$item->expiresAfter($ttl);
}
$ok = $this->pool->saveDeferred($item) && $ok;
}

return $this->pool->commit() && $ok;
}

public function deleteMultiple($keys): bool
{
if ($keys instanceof \Traversable) {
$keys = iterator_to_array($keys, false);
} elseif (!\is_array($keys)) {
throw new InvalidArgumentException(\sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys)));
}

try {
return $this->pool->deleteItems($keys);
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
}

public function has($key): bool
{
try {
return $this->pool->hasItem($key);
} catch (SimpleCacheException $e) {
throw $e;
} catch (Psr6CacheException $e) {
throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
}
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;


class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);




class Redis6Proxy extends \Redis implements ResetInterface, LazyObjectInterface
{
use Redis6ProxyTrait;
use LazyProxyTrait {
resetLazyObject as reset;
}

private const LAZY_OBJECT_PROPERTY_SCOPES = [];

public function __construct($options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
}

public function _compress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args());
}

public function _uncompress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args());
}

public function _prefix($key): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args());
}

public function _serialize($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args());
}

public function _unserialize($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args());
}

public function _pack($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args());
}

public function _unpack($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args());
}

public function acl($subcmd, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args());
}

public function append($key, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
}

public function auth(#[\SensitiveParameter] $credentials): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args());
}

public function bgSave(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\func_get_args());
}

public function bgrewriteaof(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
}

public function bitcount($key, $start = 0, $end = -1, $bybit = false): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());
}

public function bitop($operation, $deskey, $srckey, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args());
}

public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args());
}

public function blPop($key_or_keys, $timeout_or_key, ...$extra_args): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\func_get_args());
}

public function brPop($key_or_keys, $timeout_or_key, ...$extra_args): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\func_get_args());
}

public function brpoplpush($src, $dst, $timeout): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args());
}

public function bzPopMax($key, $timeout_or_key, ...$extra_args): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\func_get_args());
}

public function bzPopMin($key, $timeout_or_key, ...$extra_args): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\func_get_args());
}

public function bzmpop($timeout, $keys, $from, $count = 1): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args());
}

public function zmpop($keys, $from, $count = 1): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args());
}

public function blmpop($timeout, $keys, $from, $count = 1): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args());
}

public function lmpop($keys, $from, $count = 1): \Redis|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args());
}

public function clearLastError(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args());
}

public function client($opt, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args());
}

public function close(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args());
}

public function command($opt = null, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args());
}

public function config($operation, $key_or_settings = null, $value = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args());
}

public function connect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args());
}

public function copy($src, $dst, $options = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
}

public function dbSize(): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\func_get_args());
}

public function debug($key): \Redis|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\func_get_args());
}

public function decr($key, $by = 1): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args());
}

public function decrBy($key, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\func_get_args());
}

public function del($key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args());
}

public function delete($key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\func_get_args());
}

public function discard(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args());
}

public function echo($str): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args());
}

public function eval($script, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args());
}

public function eval_ro($script_sha, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args());
}

public function evalsha($sha1, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args());
}

public function evalsha_ro($sha1, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args());
}

public function exec(): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args());
}

public function exists($key, ...$other_keys): \Redis|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args());
}

public function expire($key, $timeout, $mode = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args());
}

public function expireAt($key, $timestamp, $mode = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\func_get_args());
}

public function failover($to = null, $abort = false, $timeout = 0): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->failover(...\func_get_args());
}

public function expiretime($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args());
}

public function pexpiretime($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args());
}

public function fcall($fn, $keys = [], $args = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\func_get_args());
}

public function fcall_ro($fn, $keys = [], $args = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\func_get_args());
}

public function flushAll($sync = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\func_get_args());
}

public function flushDB($sync = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\func_get_args());
}

public function function($operation, ...$args): \Redis|array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\func_get_args());
}

public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}

public function geodist($key, $src, $dst, $unit = null): \Redis|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function geohash($key, $member, ...$other_members): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
}

public function geopos($key, $member, ...$other_members): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args());
}

public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args());
}

public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}

public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args());
}

public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args());
}

public function geosearch($key, $position, $shape, $unit, $options = []): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
}

public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \Redis|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args());
}

public function get($key): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args());
}

public function getAuth(): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args());
}

public function getBit($key, $idx): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\func_get_args());
}

public function getEx($key, $options = []): \Redis|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getEx(...\func_get_args());
}

public function getDBNum(): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\func_get_args());
}

public function getDel($key): \Redis|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDel(...\func_get_args());
}

public function getHost(): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args());
}

public function getLastError(): ?string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args());
}

public function getMode(): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args());
}

public function getOption($option): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args());
}

public function getPersistentID(): ?string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args());
}

public function getPort(): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args());
}

public function getRange($key, $start, $end): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\func_get_args());
}

public function lcs($key1, $key2, $options = null): \Redis|array|false|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args());
}

public function getReadTimeout(): float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args());
}

public function getset($key, $value): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args());
}

public function getTimeout(): false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args());
}

public function getTransferredBytes(): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTransferredBytes(...\func_get_args());
}

public function clearTransferredBytes(): void
{
($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearTransferredBytes(...\func_get_args());
}

public function hDel($key, $field, ...$other_fields): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\func_get_args());
}

public function hExists($key, $field): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\func_get_args());
}

public function hGet($key, $member): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\func_get_args());
}

public function hGetAll($key): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\func_get_args());
}

public function hIncrBy($key, $field, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\func_get_args());
}

public function hIncrByFloat($key, $field, $value): \Redis|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\func_get_args());
}

public function hKeys($key): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\func_get_args());
}

public function hLen($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\func_get_args());
}

public function hMget($key, $fields): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\func_get_args());
}

public function hMset($key, $fieldvals): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\func_get_args());
}

public function hSetNx($key, $field, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\func_get_args());
}

public function hStrLen($key, $field): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\func_get_args());
}

public function hVals($key): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\func_get_args());
}

public function hscan($key, &$iterator, $pattern = null, $count = 0): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function incr($key, $by = 1): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args());
}

public function incrBy($key, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\func_get_args());
}

public function incrByFloat($key, $value): \Redis|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\func_get_args());
}

public function info(...$sections): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args());
}

public function isConnected(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args());
}

public function keys($pattern)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args());
}

public function lInsert($key, $pos, $pivot, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\func_get_args());
}

public function lLen($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\func_get_args());
}

public function lMove($src, $dst, $wherefrom, $whereto): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lMove(...\func_get_args());
}

public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
}

public function lPop($key, $count = 0): \Redis|array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\func_get_args());
}

public function lPos($key, $value, $options = null): \Redis|array|bool|int|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPos(...\func_get_args());
}

public function lPush($key, ...$elements): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\func_get_args());
}

public function rPush($key, ...$elements): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\func_get_args());
}

public function lPushx($key, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\func_get_args());
}

public function rPushx($key, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\func_get_args());
}

public function lSet($key, $index, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\func_get_args());
}

public function lastSave(): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\func_get_args());
}

public function lindex($key, $index): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args());
}

public function lrange($key, $start, $end): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
}

public function lrem($key, $value, $count = 0): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args());
}

public function ltrim($key, $start, $end): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args());
}

public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\SensitiveParameter] $credentials = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args());
}

public function move($key, $index): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args());
}

public function mset($key_values): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args());
}

public function msetnx($key_values): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args());
}

public function multi($value = \Redis::MULTI): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args());
}

public function object($subcommand, $key): \Redis|false|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args());
}

public function open($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\func_get_args());
}

public function pconnect($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args());
}

public function persist($key): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args());
}

public function pexpire($key, $timeout, $mode = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args());
}

public function pexpireAt($key, $timestamp, $mode = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\func_get_args());
}

public function pfadd($key, $elements): \Redis|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}

public function pfcount($key_or_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}

public function pfmerge($dst, $srckeys): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
}

public function ping($message = null): \Redis|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args());
}

public function pipeline(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args());
}

public function popen($host, $port = 6379, $timeout = 0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0, $context = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\func_get_args());
}

public function psetex($key, $expire, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args());
}

public function psubscribe($patterns, $cb): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args());
}

public function pttl($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args());
}

public function publish($channel, $message): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}

public function pubsub($command, $arg = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args());
}

public function punsubscribe($patterns): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args());
}

public function rPop($key, $count = 0): \Redis|array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\func_get_args());
}

public function randomKey(): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\func_get_args());
}

public function rawcommand($command, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args());
}

public function rename($old_name, $new_name): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args());
}

public function renameNx($key_src, $key_dst): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\func_get_args());
}

public function restore($key, $ttl, $value, $options = null): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args());
}

public function role(): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args());
}

public function rpoplpush($srckey, $dstkey): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args());
}

public function sAdd($key, $value, ...$other_values): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\func_get_args());
}

public function sAddArray($key, $values): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\func_get_args());
}

public function sDiff($key, ...$other_keys): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\func_get_args());
}

public function sDiffStore($dst, $key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\func_get_args());
}

public function sInter($key, ...$other_keys): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\func_get_args());
}

public function sintercard($keys, $limit = -1): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args());
}

public function sInterStore($key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\func_get_args());
}

public function sMembers($key): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\func_get_args());
}

public function sMisMember($key, $member, ...$other_members): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\func_get_args());
}

public function sMove($src, $dst, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\func_get_args());
}

public function sPop($key, $count = 0): \Redis|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\func_get_args());
}

public function sUnion($key, ...$other_keys): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\func_get_args());
}

public function sUnionStore($dst, $key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\func_get_args());
}

public function save(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args());
}

public function scan(&$iterator, $pattern = null, $count = 0, $type = null): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1));
}

public function scard($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args());
}

public function script($command, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args());
}

public function select($db): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args());
}

public function set($key, $value, $options = null): \Redis|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args());
}

public function setBit($key, $idx, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\func_get_args());
}

public function setRange($key, $index, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\func_get_args());
}

public function setOption($option, $value): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args());
}

public function setex($key, $expire, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args());
}

public function setnx($key, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args());
}

public function sismember($key, $value): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args());
}

public function slaveof($host = null, $port = 6379): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\func_get_args());
}

public function replicaof($host = null, $port = 6379): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\func_get_args());
}

public function touch($key_or_array, ...$more_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args());
}

public function slowlog($operation, $length = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args());
}

public function sort($key, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args());
}

public function sort_ro($key, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args());
}

public function sortAsc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\func_get_args());
}

public function sortAscAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\func_get_args());
}

public function sortDesc($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\func_get_args());
}

public function sortDescAlpha($key, $pattern = null, $get = null, $offset = -1, $count = -1, $store = null): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\func_get_args());
}

public function srem($key, $value, ...$other_values): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args());
}

public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function ssubscribe($channels, $cb): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\func_get_args());
}

public function strlen($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args());
}

public function subscribe($channels, $cb): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args());
}

public function sunsubscribe($channels): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\func_get_args());
}

public function swapdb($src, $dst): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\func_get_args());
}

public function time(): \Redis|array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args());
}

public function ttl($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args());
}

public function type($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}

public function unlink($key, ...$other_keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args());
}

public function unsubscribe($channels): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args());
}

public function unwatch(): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args());
}

public function watch($key, ...$other_keys): \Redis|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}

public function wait($numreplicas, $timeout): false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args());
}

public function xack($key, $group, $ids): false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}

public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args());
}

public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
}

public function xdel($key, $ids): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args());
}

public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args());
}

public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args());
}

public function xlen($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args());
}

public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args());
}

public function xrange($key, $start, $end, $count = -1): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args());
}

public function xread($streams, $count = -1, $block = -1): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args());
}

public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args());
}

public function xrevrange($key, $end, $start, $count = -1): \Redis|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args());
}

public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args());
}

public function zAdd($key, $score_or_options, ...$more_scores_and_mems): \Redis|false|float|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\func_get_args());
}

public function zCard($key): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\func_get_args());
}

public function zCount($key, $start, $end): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\func_get_args());
}

public function zIncrBy($key, $value, $member): \Redis|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\func_get_args());
}

public function zLexCount($key, $min, $max): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\func_get_args());
}

public function zMscore($key, $member, ...$other_members): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zMscore(...\func_get_args());
}

public function zPopMax($key, $count = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\func_get_args());
}

public function zPopMin($key, $count = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\func_get_args());
}

public function zRange($key, $start, $end, $options = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\func_get_args());
}

public function zRangeByLex($key, $min, $max, $offset = -1, $count = -1): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\func_get_args());
}

public function zRangeByScore($key, $start, $end, $options = []): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\func_get_args());
}

public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args());
}

public function zRandMember($key, $options = null): \Redis|array|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRandMember(...\func_get_args());
}

public function zRank($key, $member): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\func_get_args());
}

public function zRem($key, $member, ...$other_members): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\func_get_args());
}

public function zRemRangeByLex($key, $min, $max): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\func_get_args());
}

public function zRemRangeByRank($key, $start, $end): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\func_get_args());
}

public function zRemRangeByScore($key, $start, $end): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\func_get_args());
}

public function zRevRange($key, $start, $end, $scores = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\func_get_args());
}

public function zRevRangeByLex($key, $max, $min, $offset = -1, $count = -1): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\func_get_args());
}

public function zRevRangeByScore($key, $max, $min, $options = []): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\func_get_args());
}

public function zRevRank($key, $member): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\func_get_args());
}

public function zScore($key, $member): \Redis|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\func_get_args());
}

public function zdiff($keys, $options = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args());
}

public function zdiffstore($dst, $keys): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args());
}

public function zinter($keys, $weights = null, $options = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args());
}

public function zintercard($keys, $limit = -1): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args());
}

public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args());
}

public function zscan($key, &$iterator, $pattern = null, $count = 0): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function zunion($keys, $weights = null, $options = null): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args());
}

public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args());
}
}
<?php

















class 
{
private const EXPIRY_OFFSET = 1648206727;
private const INT32_MAX = 2147483647;

public readonly mixed $value;
public readonly array $metadata;

public function __construct(mixed $value, array $metadata)
{
$this->value = $value;
$this->metadata = $metadata;
}

public function __serialize(): array
{

$c = $this->metadata['ctime'] ?? 0;
$c = match (true) {
$c > self::INT32_MAX - 2 => self::INT32_MAX,
$c > 0 => 1 + $c,
default => 1,
};
$e = 0;
while (!(0x40000000 & $c)) {
$c <<= 1;
++$e;
}
$c = (0x7FE0 & ($c >> 16)) | $e;

$pack = pack('Vn', (int) (0.1 + ($this->metadata['expiry'] ?: self::INT32_MAX + self::EXPIRY_OFFSET) - self::EXPIRY_OFFSET), $c);

if (isset($this->metadata['tags'])) {
$pack[4] = $pack[4] | "\x80";
}

return [$pack => $this->value] + ($this->metadata['tags'] ?? []);
}

public function __unserialize(array $data): void
{
$pack = array_key_first($data);
$this->value = $data[$pack];

if ($hasTags = "\x80" === ($pack[4] & "\x80")) {
unset($data[$pack]);
$pack[4] = $pack[4] & "\x7F";
}

$metadata = unpack('Vexpiry/nctime', $pack);
$metadata['expiry'] += self::EXPIRY_OFFSET;

if (!$metadata['ctime'] = ((0x4000 | $metadata['ctime']) << 16 >> (0x1F & $metadata['ctime'])) - 1) {
unset($metadata['ctime']);
}

if ($hasTags) {
$metadata['tags'] = $data;
}

$this->metadata = $metadata;
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Psr\Log\LoggerInterface;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\LockRegistry;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\CacheTrait;
use Symfony\Contracts\Cache\ItemInterface;






trait ContractsTrait
{
use CacheTrait {
doGet as private contractsGet;
}

private \Closure $callbackWrapper;
private array $computing = [];






public function setCallbackWrapper(?callable $callbackWrapper): callable
{
if (!isset($this->callbackWrapper)) {
$this->callbackWrapper = LockRegistry::compute(...);

if (\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
$this->setCallbackWrapper(null);
}
}

if (null !== $callbackWrapper && !$callbackWrapper instanceof \Closure) {
$callbackWrapper = $callbackWrapper(...);
}

$previousWrapper = $this->callbackWrapper;
$this->callbackWrapper = $callbackWrapper ?? static fn (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) => $callback($item, $save);

return $previousWrapper;
}

private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null): mixed
{
if (0 > $beta ??= 1.0) {
throw new InvalidArgumentException(\sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta));
}

static $setMetadata;

$setMetadata ??= \Closure::bind(
static function (CacheItem $item, float $startTime, ?array &$metadata) {
if ($item->expiry > $endTime = microtime(true)) {
$item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
$item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));
} else {
unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME], $metadata[CacheItem::METADATA_TAGS]);
}
},
null,
CacheItem::class
);

$this->callbackWrapper ??= LockRegistry::compute(...);

return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) {

if (isset($this->computing[$key])) {
$value = $callback($item, $save);
$save = false;

return $value;
}

$this->computing[$key] = $key;
$startTime = microtime(true);

if (!isset($this->callbackWrapper)) {
$this->setCallbackWrapper($this->setCallbackWrapper(null));
}

try {
$value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {
$setMetadata($item, $startTime, $metadata);
}, $this->logger ?? null);
$setMetadata($item, $startTime, $metadata);

return $value;
} finally {
unset($this->computing[$key]);
}
}, $beta, $metadata, $this->logger ?? null);
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;


class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);




class RedisCluster5Proxy extends \RedisCluster implements ResetInterface, LazyObjectInterface
{
use LazyProxyTrait {
resetLazyObject as reset;
}

private const LAZY_OBJECT_PROPERTY_SCOPES = [];

public function __construct($name, $seeds = null, $timeout = null, $read_timeout = null, $persistent = null, #[\SensitiveParameter] $auth = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
}

public function _masters()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\func_get_args());
}

public function _prefix($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args());
}

public function _redir()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\func_get_args());
}

public function _serialize($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args());
}

public function _unserialize($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args());
}

public function _compress($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args());
}

public function _uncompress($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args());
}

public function _pack($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args());
}

public function _unpack($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args());
}

public function acl($key_or_address, $subcmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args());
}

public function append($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
}

public function bgrewriteaof($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
}

public function bgsave($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args());
}

public function bitcount($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());
}

public function bitop($operation, $ret_key, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args());
}

public function bitpos($key, $bit, $start = null, $end = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args());
}

public function blpop($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args());
}

public function brpop($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args());
}

public function brpoplpush($src, $dst, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args());
}

public function clearlasterror()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\func_get_args());
}

public function bzpopmax($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args());
}

public function bzpopmin($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args());
}

public function client($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args());
}

public function close()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args());
}

public function cluster($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\func_get_args());
}

public function command(...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args());
}

public function config($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args());
}

public function dbsize($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args());
}

public function decr($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args());
}

public function decrby($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args());
}

public function del($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args());
}

public function discard()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args());
}

public function dump($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function echo($msg)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args());
}

public function eval($script, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args());
}

public function evalsha($script_sha, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args());
}

public function exec()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args());
}

public function exists($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args());
}

public function expire($key, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args());
}

public function expireat($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args());
}

public function flushall($key_or_address, $async = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args());
}

public function flushdb($key_or_address, $async = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args());
}

public function geoadd($key, $lng, $lat, $member, ...$other_triples)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}

public function geodist($key, $src, $dst, $unit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function geohash($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
}

public function geopos($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args());
}

public function georadius($key, $lng, $lan, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args());
}

public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}

public function georadiusbymember($key, $member, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args());
}

public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args());
}

public function get($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args());
}

public function getbit($key, $offset)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args());
}

public function getlasterror()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\func_get_args());
}

public function getmode()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\func_get_args());
}

public function getoption($option)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\func_get_args());
}

public function getrange($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
}

public function getset($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args());
}

public function hdel($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args());
}

public function hexists($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args());
}

public function hget($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args());
}

public function hgetall($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args());
}

public function hincrby($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args());
}

public function hincrbyfloat($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args());
}

public function hkeys($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args());
}

public function hlen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args());
}

public function hmget($key, $keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args());
}

public function hmset($key, $pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args());
}

public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function hset($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
}

public function hsetnx($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args());
}

public function hstrlen($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args());
}

public function hvals($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args());
}

public function incr($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args());
}

public function incrby($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args());
}

public function incrbyfloat($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args());
}

public function info($key_or_address, $option = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args());
}

public function keys($pattern)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args());
}

public function lastsave($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args());
}

public function lget($key, $index)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\func_get_args());
}

public function lindex($key, $index)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args());
}

public function linsert($key, $position, $pivot, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args());
}

public function llen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args());
}

public function lpop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args());
}

public function lpush($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args());
}

public function lpushx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args());
}

public function lrange($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
}

public function lrem($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args());
}

public function lset($key, $index, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args());
}

public function ltrim($key, $start, $stop)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args());
}

public function mget($keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function mset($pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args());
}

public function msetnx($pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args());
}

public function multi()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args());
}

public function object($field, $key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args());
}

public function persist($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args());
}

public function pexpire($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args());
}

public function pexpireat($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args());
}

public function pfadd($key, $elements)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}

public function pfcount($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}

public function pfmerge($dstkey, $keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
}

public function ping($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args());
}

public function psetex($key, $expire, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args());
}

public function psubscribe($patterns, $callback)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args());
}

public function pttl($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args());
}

public function publish($channel, $message)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}

public function pubsub($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args());
}

public function punsubscribe($pattern, ...$other_patterns)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args());
}

public function randomkey($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args());
}

public function rawcommand($cmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args());
}

public function rename($key, $newkey)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args());
}

public function renamenx($key, $newkey)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args());
}

public function restore($ttl, $key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args());
}

public function role()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args());
}

public function rpop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args());
}

public function rpoplpush($src, $dst)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args());
}

public function rpush($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args());
}

public function rpushx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args());
}

public function sadd($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args());
}

public function saddarray($key, $options)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\func_get_args());
}

public function save($key_or_address)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args());
}

public function scan(&$i_iterator, $str_node, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\array_slice(\func_get_args(), 1));
}

public function scard($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args());
}

public function script($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args());
}

public function sdiff($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args());
}

public function sdiffstore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args());
}

public function set($key, $value, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args());
}

public function setbit($key, $offset, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args());
}

public function setex($key, $expire, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args());
}

public function setnx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args());
}

public function setoption($option, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\func_get_args());
}

public function setrange($key, $offset, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args());
}

public function sinter($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args());
}

public function sinterstore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args());
}

public function sismember($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args());
}

public function slowlog($key_or_address, $arg = null, ...$other_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args());
}

public function smembers($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args());
}

public function smove($src, $dst, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args());
}

public function sort($key, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args());
}

public function spop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args());
}

public function srandmember($key, $count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args());
}

public function srem($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args());
}

public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function strlen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args());
}

public function subscribe($channels, $callback)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args());
}

public function sunion($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args());
}

public function sunionstore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args());
}

public function time()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args());
}

public function ttl($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args());
}

public function type($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}

public function unsubscribe($channel, ...$other_channels)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args());
}

public function unlink($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args());
}

public function unwatch()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args());
}

public function watch($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}

public function xack($str_key, $str_group, $arr_ids)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}

public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
}

public function xdel($str_key, $arr_ids)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args());
}

public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args());
}

public function xinfo($str_cmd, $str_key = null, $str_group = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args());
}

public function xlen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args());
}

public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args());
}

public function xrange($str_key, $str_start, $str_end, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args());
}

public function xread($arr_streams, $i_count = null, $i_block = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args());
}

public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args());
}

public function xrevrange($str_key, $str_start, $str_end, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args());
}

public function xtrim($str_key, $i_maxlen, $boo_approximate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args());
}

public function zadd($key, $score, $value, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args());
}

public function zcard($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args());
}

public function zcount($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args());
}

public function zincrby($key, $value, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args());
}

public function zinterstore($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args());
}

public function zlexcount($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args());
}

public function zpopmax($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args());
}

public function zpopmin($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args());
}

public function zrange($key, $start, $end, $scores = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args());
}

public function zrangebylex($key, $min, $max, $offset = null, $limit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args());
}

public function zrangebyscore($key, $start, $end, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args());
}

public function zrank($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
}

public function zrem($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args());
}

public function zremrangebylex($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args());
}

public function zremrangebyrank($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args());
}

public function zremrangebyscore($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args());
}

public function zrevrange($key, $start, $end, $scores = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args());
}

public function zrevrangebylex($key, $min, $max, $offset = null, $limit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args());
}

public function zrevrangebyscore($key, $start, $end, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args());
}

public function zrevrank($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
}

public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function zscore($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
}

public function zunionstore($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args());
}
}
<?php










namespace Symfony\Component\Cache\Traits;

if (version_compare(phpversion('redis'), '6.1.0-dev', '>')) {



trait RedisCluster6ProxyTrait
{
public function getex($key, $options = []): \RedisCluster|string|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getex(...\func_get_args());
}

public function publish($channel, $message): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}

public function waitaof($key_or_address, $numlocal, $numreplicas, $timeout): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->waitaof(...\func_get_args());
}
}
} else {



trait RedisCluster6ProxyTrait
{
public function publish($channel, $message): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits;

if (version_compare(phpversion('redis'), '6.1.0-dev', '>=')) {



trait Redis6ProxyTrait
{
public function dump($key): \Redis|string|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function hRandField($key, $options = null): \Redis|array|string|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hRandField(...\func_get_args());
}

public function hSet($key, ...$fields_and_vals): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args());
}

public function mget($keys): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function sRandMember($key, $count = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\func_get_args());
}

public function waitaof($numlocal, $numreplicas, $timeout): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->waitaof(...\func_get_args());
}
}
} else {



trait Redis6ProxyTrait
{
public function dump($key): \Redis|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function hRandField($key, $options = null): \Redis|array|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hRandField(...\func_get_args());
}

public function hSet($key, $member, $value): \Redis|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args());
}

public function mget($keys): \Redis|array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function sRandMember($key, $count = 0): \Redis|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\Cache\PruneableInterface;
use Symfony\Contracts\Service\ResetInterface;






trait ProxyTrait
{
private object $pool;

public function prune(): bool
{
return $this->pool instanceof PruneableInterface && $this->pool->prune();
}

public function reset(): void
{
if ($this->pool instanceof ResetInterface) {
$this->pool->reset();
}
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Predis\Command\Redis\UNLINK;
use Predis\Connection\Aggregate\ClusterInterface;
use Predis\Connection\Aggregate\RedisCluster;
use Predis\Connection\Aggregate\ReplicationInterface;
use Predis\Connection\Cluster\ClusterInterface as Predis2ClusterInterface;
use Predis\Connection\Cluster\RedisCluster as Predis2RedisCluster;
use Predis\Connection\Replication\ReplicationInterface as Predis2ReplicationInterface;
use Predis\Response\ErrorInterface;
use Predis\Response\Status;
use Relay\Relay;
use Relay\Sentinel;
use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;







trait RedisTrait
{
private static array $defaultConnectionOptions = [
'class' => null,
'persistent' => 0,
'persistent_id' => null,
'timeout' => 30,
'read_timeout' => 0,
'retry_interval' => 0,
'tcp_keepalive' => 0,
'lazy' => null,
'redis_cluster' => false,
'redis_sentinel' => null,
'dbindex' => 0,
'failover' => 'none',
'ssl' => null, 
];
private \Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis;
private MarshallerInterface $marshaller;

private function init(\Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller): void
{
parent::__construct($namespace, $defaultLifetime);

if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
throw new InvalidArgumentException(\sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
}

if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) {
$options = clone $redis->getOptions();
\Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)();
$redis = new $redis($redis->getConnection(), $options);
}

$this->redis = $redis;
$this->marshaller = $marshaller ?? new DefaultMarshaller();
}















public static function createConnection(#[\SensitiveParameter] string $dsn, array $options = []): \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|Relay
{
if (str_starts_with($dsn, 'redis:')) {
$scheme = 'redis';
} elseif (str_starts_with($dsn, 'rediss:')) {
$scheme = 'rediss';
} else {
throw new InvalidArgumentException('Invalid Redis DSN: it does not start with "redis[s]:".');
}

if (!\extension_loaded('redis') && !class_exists(\Predis\Client::class)) {
throw new CacheException('Cannot find the "redis" extension nor the "predis/predis" package.');
}

$params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?<user>[^:@]*+):)?(?<password>[^@]*+)@)?#', function ($m) use (&$auth) {
if (isset($m['password'])) {
if (\in_array($m['user'], ['', 'default'], true)) {
$auth = rawurldecode($m['password']);
} else {
$auth = [rawurldecode($m['user']), rawurldecode($m['password'])];
}

if ('' === $auth) {
$auth = null;
}
}

return 'file:'.($m[1] ?? '');
}, $dsn);

if (false === $params = parse_url($params)) {
throw new InvalidArgumentException('Invalid Redis DSN.');
}

$query = $hosts = [];

$tls = 'rediss' === $scheme;
$tcpScheme = $tls ? 'tls' : 'tcp';

if (isset($params['query'])) {
parse_str($params['query'], $query);

if (isset($query['host'])) {
if (!\is_array($hosts = $query['host'])) {
throw new InvalidArgumentException('Invalid Redis DSN: query parameter "host" must be an array.');
}
foreach ($hosts as $host => $parameters) {
if (\is_string($parameters)) {
parse_str($parameters, $parameters);
}
if (false === $i = strrpos($host, ':')) {
$hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters;
} elseif ($port = (int) substr($host, 1 + $i)) {
$hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;
} else {
$hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters;
}
}
$hosts = array_values($hosts);
}
}

if (isset($params['host']) || isset($params['path'])) {
if (!isset($params['dbindex']) && isset($params['path'])) {
if (preg_match('#/(\d+)?$#', $params['path'], $m)) {
$params['dbindex'] = $m[1] ?? $query['dbindex'] ?? '0';
$params['path'] = substr($params['path'], 0, -\strlen($m[0]));
} elseif (isset($params['host'])) {
throw new InvalidArgumentException('Invalid Redis DSN: parameter "dbindex" must be a number.');
}
}

if (isset($params['host'])) {
array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);
} else {
array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]);
}
}

if (!$hosts) {
throw new InvalidArgumentException('Invalid Redis DSN: missing host.');
}

if (isset($params['dbindex'], $query['dbindex']) && $params['dbindex'] !== $query['dbindex']) {
throw new InvalidArgumentException('Invalid Redis DSN: path and query "dbindex" parameters mismatch.');
}

$params += $query + $options + self::$defaultConnectionOptions;

if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) {
throw new CacheException('Redis Sentinel support requires one of: "predis/predis", "ext-redis >= 5.2", "ext-relay".');
}

if (isset($params['lazy'])) {
$params['lazy'] = filter_var($params['lazy'], \FILTER_VALIDATE_BOOLEAN);
}
$params['redis_cluster'] = filter_var($params['redis_cluster'], \FILTER_VALIDATE_BOOLEAN);

if ($params['redis_cluster'] && isset($params['redis_sentinel'])) {
throw new InvalidArgumentException('Cannot use both "redis_cluster" and "redis_sentinel" at the same time.');
}

$class = $params['class'] ?? match (true) {
$params['redis_cluster'] => \extension_loaded('redis') ? \RedisCluster::class : \Predis\Client::class,
isset($params['redis_sentinel']) => match (true) {
\extension_loaded('redis') => \Redis::class,
\extension_loaded('relay') => Relay::class,
default => \Predis\Client::class,
},
1 < \count($hosts) && \extension_loaded('redis') => 1 < \count($hosts) ? \RedisArray::class : \Redis::class,
\extension_loaded('redis') => \Redis::class,
\extension_loaded('relay') => Relay::class,
default => \Predis\Client::class,
};

if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) {
throw new CacheException(\sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client" and neither ext-redis >= 5.2 nor ext-relay have been found.', $class));
}

$isRedisExt = is_a($class, \Redis::class, true);
$isRelayExt = !$isRedisExt && is_a($class, Relay::class, true);

if ($isRedisExt || $isRelayExt) {
$connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';

$initializer = static function () use ($class, $isRedisExt, $connect, $params, $auth, $hosts, $tls) {
$sentinelClass = $isRedisExt ? \RedisSentinel::class : Sentinel::class;
$redis = new $class();
$hostIndex = 0;
do {
$host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path'];
$port = $hosts[$hostIndex]['port'] ?? 0;
$passAuth = isset($params['auth']) && (!$isRedisExt || \defined('Redis::OPT_NULL_MULTIBULK_AS_NULL'));
$address = false;

if (isset($hosts[$hostIndex]['host']) && $tls) {
$host = 'tls://'.$host;
}

if (!isset($params['redis_sentinel'])) {
break;
}

try {
if (version_compare(phpversion('redis'), '6.0.0', '>=') && $isRedisExt) {
$options = [
'host' => $host,
'port' => $port,
'connectTimeout' => (float) $params['timeout'],
'persistent' => $params['persistent_id'],
'retryInterval' => (int) $params['retry_interval'],
'readTimeout' => (float) $params['read_timeout'],
];

if ($passAuth) {
$options['auth'] = $params['auth'];
}

$sentinel = new \RedisSentinel($options);
} else {
$extra = $passAuth ? [$params['auth']] : [];

$sentinel = @new $sentinelClass($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...$extra);
}

if ($address = @$sentinel->getMasterAddrByName($params['redis_sentinel'])) {
[$host, $port] = $address;
}
} catch (\RedisException|\Relay\Exception $redisException) {
}
} while (++$hostIndex < \count($hosts) && !$address);

if (isset($params['redis_sentinel']) && !$address) {
throw new InvalidArgumentException(\sprintf('Failed to retrieve master information from sentinel "%s".', $params['redis_sentinel']), previous: $redisException ?? null);
}

try {
$extra = [
'stream' => $params['ssl'] ?? null,
];
$booleanStreamOptions = [
'allow_self_signed',
'capture_peer_cert',
'capture_peer_cert_chain',
'disable_compression',
'SNI_enabled',
'verify_peer',
'verify_peer_name',
];

foreach ($extra['stream'] ?? [] as $streamOption => $value) {
if (\in_array($streamOption, $booleanStreamOptions, true) && \is_string($value)) {
$extra['stream'][$streamOption] = filter_var($value, \FILTER_VALIDATE_BOOL);
}
}

if (isset($params['auth'])) {
$extra['auth'] = $params['auth'];
}
@$redis->{$connect}($host, $port, (float) $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') || !$isRedisExt ? [$extra] : []);

set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
try {
$isConnected = $redis->isConnected();
} finally {
restore_error_handler();
}
if (!$isConnected) {
$error = preg_match('/^Redis::p?connect\(\): (.*)/', $error ?? $redis->getLastError() ?? '', $error) ? \sprintf(' (%s)', $error[1]) : '';
throw new InvalidArgumentException('Redis connection failed: '.$error.'.');
}

if ((null !== $auth && !$redis->auth($auth))



|| (($params['dbindex'] || ('pconnect' === $connect && '0' !== \ini_get('redis.pconnect.pooling_enabled'))) && !$redis->select($params['dbindex']))
) {
$e = preg_replace('/^ERR /', '', $redis->getLastError());
throw new InvalidArgumentException('Redis connection failed: '.$e.'.');
}

if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) {
$redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
}
} catch (\RedisException|\Relay\Exception $e) {
throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());
}

return $redis;
};

if ($params['lazy']) {
$redis = $isRedisExt ? RedisProxy::createLazyProxy($initializer) : RelayProxy::createLazyProxy($initializer);
} else {
$redis = $initializer();
}
} elseif (is_a($class, \RedisArray::class, true)) {
foreach ($hosts as $i => $host) {
$hosts[$i] = match ($host['scheme']) {
'tcp' => $host['host'].':'.$host['port'],
'tls' => 'tls://'.$host['host'].':'.$host['port'],
default => $host['path'],
};
}
$params['lazy_connect'] = $params['lazy'] ?? true;
$params['connect_timeout'] = $params['timeout'];

try {
$redis = new $class($hosts, $params);
} catch (\RedisClusterException $e) {
throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());
}

if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) {
$redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
}
} elseif (is_a($class, \RedisCluster::class, true)) {
$initializer = static function () use ($isRedisExt, $class, $params, $hosts) {
foreach ($hosts as $i => $host) {
$hosts[$i] = match ($host['scheme']) {
'tcp' => $host['host'].':'.$host['port'],
'tls' => 'tls://'.$host['host'].':'.$host['port'],
default => $host['path'],
};
}

try {
$redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []);
} catch (\RedisClusterException $e) {
throw new InvalidArgumentException('Redis connection failed: '.$e->getMessage());
}

if (0 < $params['tcp_keepalive'] && (!$isRedisExt || \defined('Redis::OPT_TCP_KEEPALIVE'))) {
$redis->setOption($isRedisExt ? \Redis::OPT_TCP_KEEPALIVE : Relay::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
}
$redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, match ($params['failover']) {
'error' => \RedisCluster::FAILOVER_ERROR,
'distribute' => \RedisCluster::FAILOVER_DISTRIBUTE,
'slaves' => \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES,
'none' => \RedisCluster::FAILOVER_NONE,
});

return $redis;
};

$redis = $params['lazy'] ? RedisClusterProxy::createLazyProxy($initializer) : $initializer();
} elseif (is_a($class, \Predis\ClientInterface::class, true)) {
if ($params['redis_cluster']) {
$params['cluster'] = 'redis';
} elseif (isset($params['redis_sentinel'])) {
$params['replication'] = 'sentinel';
$params['service'] = $params['redis_sentinel'];
}
$params += ['parameters' => []];
$params['parameters'] += [
'persistent' => $params['persistent'],
'timeout' => $params['timeout'],
'read_write_timeout' => $params['read_timeout'],
'tcp_nodelay' => true,
];
if ($params['dbindex']) {
$params['parameters']['database'] = $params['dbindex'];
}
if (null !== $auth) {
if (\is_array($auth)) {

$params['parameters']['username'] = $auth[0];
$params['parameters']['password'] = $auth[1];
} else {
$params['parameters']['password'] = $auth;
}
}

if (isset($params['ssl'])) {
foreach ($hosts as $i => $host) {
$hosts[$i]['ssl'] ??= $params['ssl'];
}
}

if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) {
$hosts = $hosts[0];
} elseif (\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) {
$params['replication'] = true;
$hosts[0] += ['alias' => 'master'];
}
$params['exceptions'] = false;

$redis = new $class($hosts, array_diff_key($params, self::$defaultConnectionOptions));
if (isset($params['redis_sentinel'])) {
$redis->getConnection()->setSentinelTimeout($params['timeout']);
}
} elseif (class_exists($class, false)) {
throw new InvalidArgumentException(\sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster", "Relay\Relay" nor "Predis\ClientInterface".', $class));
} else {
throw new InvalidArgumentException(\sprintf('Class "%s" does not exist.', $class));
}

return $redis;
}

protected function doFetch(array $ids): iterable
{
if (!$ids) {
return [];
}

$result = [];

if (($this->redis instanceof \Predis\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) || $this->redis instanceof RelayCluster) {
$values = $this->pipeline(function () use ($ids) {
foreach ($ids as $id) {
yield 'get' => [$id];
}
});
} else {
$values = $this->redis->mget($ids);

if (!\is_array($values) || \count($values) !== \count($ids)) {
return [];
}

$values = array_combine($ids, $values);
}

foreach ($values as $id => $v) {
if ($v) {
$result[$id] = $this->marshaller->unmarshall($v);
}
}

return $result;
}

protected function doHave(string $id): bool
{
return (bool) $this->redis->exists($id);
}

protected function doClear(string $namespace): bool
{
if ($this->redis instanceof \Predis\ClientInterface) {
$prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';
$prefixLen = \strlen($prefix ?? '');
}

$cleared = true;
$hosts = $this->getHosts();
$host = reset($hosts);
if ($host instanceof \Predis\Client) {
$connection = $host->getConnection();

if ($connection instanceof ReplicationInterface) {
$hosts = [$host->getClientFor('master')];
} elseif ($connection instanceof Predis2ReplicationInterface) {
$connection->switchToMaster();

$hosts = [$host];
}
}

foreach ($hosts as $host) {
if (!isset($namespace[0])) {
$cleared = $host->flushDb() && $cleared;
continue;
}

$info = $host->info('Server');
$info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0'];

if ($host instanceof Relay) {
$prefix = Relay::SCAN_PREFIX & $host->getOption(Relay::OPT_SCAN) ? '' : $host->getOption(Relay::OPT_PREFIX);
$prefixLen = \strlen($host->getOption(Relay::OPT_PREFIX) ?? '');
} elseif (!$host instanceof \Predis\ClientInterface) {
$prefix = \defined('Redis::SCAN_PREFIX') && (\Redis::SCAN_PREFIX & $host->getOption(\Redis::OPT_SCAN)) ? '' : $host->getOption(\Redis::OPT_PREFIX);
$prefixLen = \strlen($host->getOption(\Redis::OPT_PREFIX) ?? '');
}
$pattern = $prefix.$namespace.'*';

if (!version_compare($info['redis_version'], '2.8', '>=')) {



$unlink = version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL';
$args = $this->redis instanceof \Predis\ClientInterface ? [0, $pattern] : [[$pattern], 0];
$cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]) for i=1,#keys,5000 do redis.call('$unlink',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $args[0], $args[1]) && $cleared;
continue;
}

$cursor = null;
do {
$keys = $host instanceof \Predis\ClientInterface ? $host->scan($cursor ?? 0, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000);
if (isset($keys[1]) && \is_array($keys[1])) {
$cursor = $keys[0];
$keys = $keys[1];
}
if ($keys) {
if ($prefixLen) {
foreach ($keys as $i => $key) {
$keys[$i] = substr($key, $prefixLen);
}
}
$this->doDelete($keys);
}
} while ($cursor);
}

return $cleared;
}

protected function doDelete(array $ids): bool
{
if (!$ids) {
return true;
}

if ($this->redis instanceof \Predis\ClientInterface && ($this->redis->getConnection() instanceof ClusterInterface || $this->redis->getConnection() instanceof Predis2ClusterInterface)) {
static $del;
$del ??= (class_exists(UNLINK::class) ? 'unlink' : 'del');

$this->pipeline(function () use ($ids, $del) {
foreach ($ids as $id) {
yield $del => [$id];
}
})->rewind();
} else {
static $unlink = true;

if ($unlink) {
try {
$unlink = false !== $this->redis->unlink($ids);
} catch (\Throwable) {
$unlink = false;
}
}

if (!$unlink) {
$this->redis->del($ids);
}
}

return true;
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

$results = $this->pipeline(function () use ($values, $lifetime) {
foreach ($values as $id => $value) {
if (0 >= $lifetime) {
yield 'set' => [$id, $value];
} else {
yield 'setEx' => [$id, $lifetime, $value];
}
}
});

foreach ($results as $id => $result) {
if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {
$failed[] = $id;
}
}

return $failed;
}

private function pipeline(\Closure $generator, ?object $redis = null): \Generator
{
$ids = [];
$redis ??= $this->redis;

if ($redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && ($redis->getConnection() instanceof RedisCluster || $redis->getConnection() instanceof Predis2RedisCluster))) {



$results = [];
foreach ($generator() as $command => $args) {
$results[] = $redis->{$command}(...$args);
$ids[] = 'eval' === $command ? ($redis instanceof \Predis\ClientInterface ? $args[2] : $args[1][0]) : $args[0];
}
} elseif ($redis instanceof \Predis\ClientInterface) {
$results = $redis->pipeline(static function ($redis) use ($generator, &$ids) {
foreach ($generator() as $command => $args) {
$redis->{$command}(...$args);
$ids[] = 'eval' === $command ? $args[2] : $args[0];
}
});
} elseif ($redis instanceof \RedisArray) {
$connections = $results = $ids = [];
foreach ($generator() as $command => $args) {
$id = 'eval' === $command ? $args[1][0] : $args[0];
if (!isset($connections[$h = $redis->_target($id)])) {
$connections[$h] = [$redis->_instance($h), -1];
$connections[$h][0]->multi(\Redis::PIPELINE);
}
$connections[$h][0]->{$command}(...$args);
$results[] = [$h, ++$connections[$h][1]];
$ids[] = $id;
}
foreach ($connections as $h => $c) {
$connections[$h] = $c[0]->exec();
}
foreach ($results as $k => [$h, $c]) {
$results[$k] = $connections[$h][$c];
}
} else {
$redis->multi($redis instanceof Relay ? Relay::PIPELINE : \Redis::PIPELINE);
foreach ($generator() as $command => $args) {
$redis->{$command}(...$args);
$ids[] = 'eval' === $command ? $args[1][0] : $args[0];
}
$results = $redis->exec();
}

if (!$redis instanceof \Predis\ClientInterface && 'eval' === $command && $redis->getLastError()) {
$e = $redis instanceof Relay ? new \Relay\Exception($redis->getLastError()) : new \RedisException($redis->getLastError());
$results = array_map(fn ($v) => false === $v ? $e : $v, (array) $results);
}

if (\is_bool($results)) {
return;
}

foreach ($ids as $k => $id) {
yield $id => $results[$k];
}
}

private function getHosts(): array
{
$hosts = [$this->redis];
if ($this->redis instanceof \Predis\ClientInterface) {
$connection = $this->redis->getConnection();
if (($connection instanceof ClusterInterface || $connection instanceof Predis2ClusterInterface) && $connection instanceof \Traversable) {
$hosts = [];
foreach ($connection as $c) {
$hosts[] = new \Predis\Client($c);
}
}
} elseif ($this->redis instanceof \RedisArray) {
$hosts = [];
foreach ($this->redis->_hosts() as $host) {
$hosts[] = $this->redis->_instance($host);
}
} elseif ($this->redis instanceof \RedisCluster) {
$hosts = [];
foreach ($this->redis->_masters() as $host) {
$hosts[] = new RedisClusterNodeProxy($host, $this->redis);
}
}

return $hosts;
}
}
<?php










namespace Symfony\Component\Cache\Traits;

class_alias(6.0 <= (float) phpversion('redis') ? RedisCluster6Proxy::class : RedisCluster5Proxy::class, RedisClusterProxy::class);

if (false) {



class RedisClusterProxy extends \RedisCluster
{
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\Cache\Exception\InvalidArgumentException;






trait FilesystemCommonTrait
{
private string $directory;
private string $tmpSuffix;

private function init(string $namespace, ?string $directory): void
{
if (!isset($directory[0])) {
$directory = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'symfony-cache';
} else {
$directory = realpath($directory) ?: $directory;
}
if (isset($namespace[0])) {
if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
}
$directory .= \DIRECTORY_SEPARATOR.$namespace;
} else {
$directory .= \DIRECTORY_SEPARATOR.'@';
}
if (!is_dir($directory)) {
@mkdir($directory, 0777, true);
}
$directory .= \DIRECTORY_SEPARATOR;

if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) {
throw new InvalidArgumentException(\sprintf('Cache directory too long (%s).', $directory));
}

$this->directory = $directory;
}

protected function doClear(string $namespace): bool
{
$ok = true;

foreach ($this->scanHashDir($this->directory) as $file) {
if ('' !== $namespace && !str_starts_with($this->getFileKey($file), $namespace)) {
continue;
}

$ok = ($this->doUnlink($file) || !file_exists($file)) && $ok;
}

return $ok;
}

protected function doDelete(array $ids): bool
{
$ok = true;

foreach ($ids as $id) {
$file = $this->getFile($id);
$ok = (!is_file($file) || $this->doUnlink($file) || !file_exists($file)) && $ok;
}

return $ok;
}




protected function doUnlink(string $file)
{
return @unlink($file);
}

private function write(string $file, string $data, ?int $expiresAt = null): bool
{
$unlink = false;
set_error_handler(static fn ($type, $message, $file, $line) => throw new \ErrorException($message, 0, $type, $file, $line));
try {
$tmp = $this->directory.$this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));
try {
$h = fopen($tmp, 'x');
} catch (\ErrorException $e) {
if (!str_contains($e->getMessage(), 'File exists')) {
throw $e;
}

$tmp = $this->directory.$this->tmpSuffix = str_replace('/', '-', base64_encode(random_bytes(6)));
$h = fopen($tmp, 'x');
}
fwrite($h, $data);
fclose($h);
$unlink = true;

if (null !== $expiresAt) {
touch($tmp, $expiresAt ?: time() + 31556952); 
}

if ('\\' === \DIRECTORY_SEPARATOR) {
$success = copy($tmp, $file);
$unlink = true;
} else {
$success = rename($tmp, $file);
$unlink = !$success;
}

return $success;
} finally {
restore_error_handler();

if ($unlink) {
@unlink($tmp);
}
}
}

private function getFile(string $id, bool $mkdir = false, ?string $directory = null): string
{

$hash = str_replace('/', '-', base64_encode(hash('xxh128', static::class.$id, true)));
$dir = ($directory ?? $this->directory).strtoupper($hash[0].\DIRECTORY_SEPARATOR.$hash[1].\DIRECTORY_SEPARATOR);

if ($mkdir && !is_dir($dir)) {
@mkdir($dir, 0777, true);
}

return $dir.substr($hash, 2, 20);
}

private function getFileKey(string $file): string
{
return '';
}

private function scanHashDir(string $directory): \Generator
{
if (!is_dir($directory)) {
return;
}

$chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

for ($i = 0; $i < 38; ++$i) {
if (!is_dir($directory.$chars[$i])) {
continue;
}

for ($j = 0; $j < 38; ++$j) {
if (!is_dir($dir = $directory.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
continue;
}

foreach (@scandir($dir, \SCANDIR_SORT_NONE) ?: [] as $file) {
if ('.' !== $file && '..' !== $file) {
yield $dir.\DIRECTORY_SEPARATOR.$file;
}
}
}
}
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
if (method_exists(parent::class, '__destruct')) {
parent::__destruct();
}
if (isset($this->tmpSuffix) && is_file($this->directory.$this->tmpSuffix)) {
unlink($this->directory.$this->tmpSuffix);
}
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;


class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);




class RedisCluster6Proxy extends \RedisCluster implements ResetInterface, LazyObjectInterface
{
use RedisCluster6ProxyTrait;
use LazyProxyTrait {
resetLazyObject as reset;
}

private const LAZY_OBJECT_PROPERTY_SCOPES = [];

public function __construct($name, $seeds = null, $timeout = 0, $read_timeout = 0, $persistent = false, #[\SensitiveParameter] $auth = null, $context = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
}

public function _compress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args());
}

public function _uncompress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args());
}

public function _serialize($value): bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args());
}

public function _unserialize($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args());
}

public function _pack($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args());
}

public function _unpack($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args());
}

public function _prefix($key): bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args());
}

public function _masters(): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_masters(...\func_get_args());
}

public function _redir(): ?string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_redir(...\func_get_args());
}

public function acl($key_or_address, $subcmd, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args());
}

public function append($key, $value): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
}

public function bgrewriteaof($key_or_address): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
}

public function bgsave($key_or_address): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args());
}

public function bitcount($key, $start = 0, $end = -1, $bybit = false): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());
}

public function bitop($operation, $deskey, $srckey, ...$otherkeys): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args());
}

public function bitpos($key, $bit, $start = 0, $end = -1, $bybit = false): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args());
}

public function blpop($key, $timeout_or_key, ...$extra_args): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args());
}

public function brpop($key, $timeout_or_key, ...$extra_args): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args());
}

public function brpoplpush($srckey, $deskey, $timeout): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args());
}

public function lmove($src, $dst, $wherefrom, $whereto): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
}

public function blmove($src, $dst, $wherefrom, $whereto, $timeout): \Redis|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
}

public function bzpopmax($key, $timeout_or_key, ...$extra_args): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args());
}

public function bzpopmin($key, $timeout_or_key, ...$extra_args): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args());
}

public function bzmpop($timeout, $keys, $from, $count = 1): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args());
}

public function zmpop($keys, $from, $count = 1): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args());
}

public function blmpop($timeout, $keys, $from, $count = 1): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args());
}

public function lmpop($keys, $from, $count = 1): \RedisCluster|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args());
}

public function clearlasterror(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearlasterror(...\func_get_args());
}

public function client($key_or_address, $subcommand, $arg = null): array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args());
}

public function close(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args());
}

public function cluster($key_or_address, $command, ...$extra_args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cluster(...\func_get_args());
}

public function command(...$extra_args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args());
}

public function config($key_or_address, $subcommand, ...$extra_args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args());
}

public function dbsize($key_or_address): \RedisCluster|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args());
}

public function copy($src, $dst, $options = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
}

public function decr($key, $by = 1): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args());
}

public function decrby($key, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args());
}

public function decrbyfloat($key, $value): float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrbyfloat(...\func_get_args());
}

public function del($key, ...$other_keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args());
}

public function discard(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args());
}

public function dump($key): \RedisCluster|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function echo($key_or_address, $msg): \RedisCluster|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args());
}

public function eval($script, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args());
}

public function eval_ro($script, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args());
}

public function evalsha($script_sha, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args());
}

public function evalsha_ro($script_sha, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args());
}

public function exec(): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args());
}

public function exists($key, ...$other_keys): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args());
}

public function touch($key, ...$other_keys): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args());
}

public function expire($key, $timeout, $mode = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args());
}

public function expireat($key, $timestamp, $mode = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args());
}

public function expiretime($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args());
}

public function pexpiretime($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args());
}

public function flushall($key_or_address, $async = false): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args());
}

public function flushdb($key_or_address, $async = false): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args());
}

public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}

public function geodist($key, $src, $dest, $unit = null): \RedisCluster|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function geohash($key, $member, ...$other_members): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
}

public function geopos($key, $member, ...$other_members): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args());
}

public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args());
}

public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}

public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args());
}

public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args());
}

public function geosearch($key, $position, $shape, $unit, $options = []): \RedisCluster|array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
}

public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \RedisCluster|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args());
}

public function get($key): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args());
}

public function getbit($key, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args());
}

public function getlasterror(): ?string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getlasterror(...\func_get_args());
}

public function getmode(): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getmode(...\func_get_args());
}

public function getoption($option): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getoption(...\func_get_args());
}

public function getrange($key, $start, $end): \RedisCluster|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
}

public function lcs($key1, $key2, $options = null): \RedisCluster|array|false|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args());
}

public function getset($key, $value): \RedisCluster|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args());
}

public function gettransferredbytes(): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->gettransferredbytes(...\func_get_args());
}

public function cleartransferredbytes(): void
{
($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cleartransferredbytes(...\func_get_args());
}

public function hdel($key, $member, ...$other_members): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args());
}

public function hexists($key, $member): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args());
}

public function hget($key, $member): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args());
}

public function hgetall($key): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args());
}

public function hincrby($key, $member, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args());
}

public function hincrbyfloat($key, $member, $value): \RedisCluster|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args());
}

public function hkeys($key): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args());
}

public function hlen($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args());
}

public function hmget($key, $keys): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args());
}

public function hmset($key, $key_values): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args());
}

public function hscan($key, &$iterator, $pattern = null, $count = 0): array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function hrandfield($key, $options = null): \RedisCluster|array|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
}

public function hset($key, $member, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
}

public function hsetnx($key, $member, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args());
}

public function hstrlen($key, $field): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args());
}

public function hvals($key): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args());
}

public function incr($key, $by = 1): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args());
}

public function incrby($key, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args());
}

public function incrbyfloat($key, $value): \RedisCluster|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args());
}

public function info($key_or_address, ...$sections): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args());
}

public function keys($pattern): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args());
}

public function lastsave($key_or_address): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args());
}

public function lget($key, $index): \RedisCluster|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lget(...\func_get_args());
}

public function lindex($key, $index): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args());
}

public function linsert($key, $pos, $pivot, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args());
}

public function llen($key): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args());
}

public function lpop($key, $count = 0): \RedisCluster|array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args());
}

public function lpos($key, $value, $options = null): \Redis|array|bool|int|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\func_get_args());
}

public function lpush($key, $value, ...$other_values): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args());
}

public function lpushx($key, $value): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args());
}

public function lrange($key, $start, $end): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
}

public function lrem($key, $value, $count = 0): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args());
}

public function lset($key, $index, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args());
}

public function ltrim($key, $start, $end): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args());
}

public function mget($keys): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function mset($key_values): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args());
}

public function msetnx($key_values): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args());
}

public function multi($value = \Redis::MULTI): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args());
}

public function object($subcommand, $key): \RedisCluster|false|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args());
}

public function persist($key): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args());
}

public function pexpire($key, $timeout, $mode = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args());
}

public function pexpireat($key, $timestamp, $mode = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args());
}

public function pfadd($key, $elements): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}

public function pfcount($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}

public function pfmerge($key, $keys): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
}

public function ping($key_or_address, $message = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args());
}

public function psetex($key, $timeout, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args());
}

public function psubscribe($patterns, $callback): void
{
($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args());
}

public function pttl($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args());
}

public function pubsub($key_or_address, ...$values): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args());
}

public function punsubscribe($pattern, ...$other_patterns): array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args());
}

public function randomkey($key_or_address): \RedisCluster|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args());
}

public function rawcommand($key_or_address, $command, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args());
}

public function rename($key_src, $key_dst): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args());
}

public function renamenx($key, $newkey): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args());
}

public function restore($key, $timeout, $value, $options = null): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args());
}

public function role($key_or_address): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args());
}

public function rpop($key, $count = 0): \RedisCluster|array|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args());
}

public function rpoplpush($src, $dst): \RedisCluster|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args());
}

public function rpush($key, ...$elements): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args());
}

public function rpushx($key, $value): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args());
}

public function sadd($key, $value, ...$other_values): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args());
}

public function saddarray($key, $values): \RedisCluster|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->saddarray(...\func_get_args());
}

public function save($key_or_address): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args());
}

public function scan(&$iterator, $key_or_address, $pattern = null, $count = 0): array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1));
}

public function scard($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args());
}

public function script($key_or_address, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args());
}

public function sdiff($key, ...$other_keys): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args());
}

public function sdiffstore($dst, $key, ...$other_keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args());
}

public function set($key, $value, $options = null): \RedisCluster|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args());
}

public function setbit($key, $offset, $onoff): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args());
}

public function setex($key, $expire, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args());
}

public function setnx($key, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args());
}

public function setoption($option, $value): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setoption(...\func_get_args());
}

public function setrange($key, $offset, $value): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args());
}

public function sinter($key, ...$other_keys): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args());
}

public function sintercard($keys, $limit = -1): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args());
}

public function sinterstore($key, ...$other_keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args());
}

public function sismember($key, $value): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args());
}

public function smismember($key, $member, ...$other_members): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\func_get_args());
}

public function slowlog($key_or_address, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args());
}

public function smembers($key): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args());
}

public function smove($src, $dst, $member): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args());
}

public function sort($key, $options = null): \RedisCluster|array|bool|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args());
}

public function sort_ro($key, $options = null): \RedisCluster|array|bool|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args());
}

public function spop($key, $count = 0): \RedisCluster|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args());
}

public function srandmember($key, $count = 0): \RedisCluster|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args());
}

public function srem($key, $value, ...$other_values): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args());
}

public function sscan($key, &$iterator, $pattern = null, $count = 0): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function strlen($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args());
}

public function subscribe($channels, $cb): void
{
($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args());
}

public function sunion($key, ...$other_keys): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args());
}

public function sunionstore($dst, $key, ...$other_keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args());
}

public function time($key_or_address): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args());
}

public function ttl($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args());
}

public function type($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}

public function unsubscribe($channels): array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args());
}

public function unlink($key, ...$other_keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args());
}

public function unwatch(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args());
}

public function watch($key, ...$other_keys): \RedisCluster|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}

public function xack($key, $group, $ids): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}

public function xadd($key, $id, $values, $maxlen = 0, $approx = false): \RedisCluster|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function xclaim($key, $group, $consumer, $min_iddle, $ids, $options): \RedisCluster|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
}

public function xdel($key, $ids): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args());
}

public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args());
}

public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args());
}

public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args());
}

public function xlen($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args());
}

public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args());
}

public function xrange($key, $start, $end, $count = -1): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args());
}

public function xread($streams, $count = -1, $block = -1): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args());
}

public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args());
}

public function xrevrange($key, $start, $end, $count = -1): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args());
}

public function xtrim($key, $maxlen, $approx = false, $minid = false, $limit = -1): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args());
}

public function zadd($key, $score_or_options, ...$more_scores_and_mems): \RedisCluster|false|float|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args());
}

public function zcard($key): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args());
}

public function zcount($key, $start, $end): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args());
}

public function zincrby($key, $value, $member): \RedisCluster|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args());
}

public function zinterstore($dst, $keys, $weights = null, $aggregate = null): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args());
}

public function zintercard($keys, $limit = -1): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args());
}

public function zlexcount($key, $min, $max): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args());
}

public function zpopmax($key, $value = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args());
}

public function zpopmin($key, $value = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args());
}

public function zrange($key, $start, $end, $options = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args());
}

public function zrangestore($dstkey, $srckey, $start, $end, $options = null): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args());
}

public function zrandmember($key, $options = null): \RedisCluster|array|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\func_get_args());
}

public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args());
}

public function zrangebyscore($key, $start, $end, $options = []): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args());
}

public function zrank($key, $member): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
}

public function zrem($key, $value, ...$other_values): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args());
}

public function zremrangebylex($key, $min, $max): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args());
}

public function zremrangebyrank($key, $min, $max): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args());
}

public function zremrangebyscore($key, $min, $max): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args());
}

public function zrevrange($key, $min, $max, $options = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args());
}

public function zrevrangebylex($key, $min, $max, $options = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args());
}

public function zrevrangebyscore($key, $min, $max, $options = null): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args());
}

public function zrevrank($key, $member): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
}

public function zscan($key, &$iterator, $pattern = null, $count = 0): \RedisCluster|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function zscore($key, $member): \RedisCluster|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
}

public function zmscore($key, $member, ...$other_members): \Redis|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\func_get_args());
}

public function zunionstore($dst, $keys, $weights = null, $aggregate = null): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args());
}

public function zinter($keys, $weights = null, $options = null): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args());
}

public function zdiffstore($dst, $keys): \RedisCluster|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args());
}

public function zunion($keys, $weights = null, $options = null): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args());
}

public function zdiff($keys, $options = null): \RedisCluster|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args());
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\Cache\Traits\Relay\BgsaveTrait;
use Symfony\Component\Cache\Traits\Relay\CopyTrait;
use Symfony\Component\Cache\Traits\Relay\FtTrait;
use Symfony\Component\Cache\Traits\Relay\GeosearchTrait;
use Symfony\Component\Cache\Traits\Relay\GetrangeTrait;
use Symfony\Component\Cache\Traits\Relay\GetWithMetaTrait;
use Symfony\Component\Cache\Traits\Relay\HsetTrait;
use Symfony\Component\Cache\Traits\Relay\IsTrackedTrait;
use Symfony\Component\Cache\Traits\Relay\MoveTrait;
use Symfony\Component\Cache\Traits\Relay\NullableReturnTrait;
use Symfony\Component\Cache\Traits\Relay\PfcountTrait;
use Symfony\Component\Cache\Traits\Relay\Relay11Trait;
use Symfony\Component\Cache\Traits\Relay\Relay121Trait;
use Symfony\Component\Cache\Traits\Relay\Relay12Trait;
use Symfony\Component\Cache\Traits\Relay\SwapdbTrait;
use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;


class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);




class RelayProxy extends \Relay\Relay implements ResetInterface, LazyObjectInterface
{
use BgsaveTrait;
use CopyTrait;
use FtTrait;
use GeosearchTrait;
use GetrangeTrait;
use GetWithMetaTrait;
use HsetTrait;
use IsTrackedTrait;
use LazyProxyTrait {
resetLazyObject as reset;
}
use MoveTrait;
use NullableReturnTrait;
use PfcountTrait;
use RelayProxyTrait;
use Relay11Trait;
use Relay12Trait;
use Relay121Trait;
use SwapdbTrait;

private const LAZY_OBJECT_PROPERTY_SCOPES = [];

public function __construct($host = null, $port = 6379, $connect_timeout = 0.0, $command_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
}

public function connect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args());
}

public function pconnect($host, $port = 6379, $timeout = 0.0, $persistent_id = null, $retry_interval = 0, $read_timeout = 0.0, #[\SensitiveParameter] $context = [], $database = 0): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args());
}

public function close(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args());
}

public function pclose(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pclose(...\func_get_args());
}

public function listen($callback): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listen(...\func_get_args());
}

public function onFlushed($callback): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onFlushed(...\func_get_args());
}

public function onInvalidated($callback, $pattern = null): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->onInvalidated(...\func_get_args());
}

public function dispatchEvents(): false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dispatchEvents(...\func_get_args());
}

public function getOption($option): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args());
}

public function option($option, $value = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->option(...\func_get_args());
}

public function setOption($option, $value): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args());
}

public function addIgnorePatterns(...$pattern): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addIgnorePatterns(...\func_get_args());
}

public function addAllowPatterns(...$pattern): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->addAllowPatterns(...\func_get_args());
}

public function getTimeout(): false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args());
}

public function timeout(): false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->timeout(...\func_get_args());
}

public function getReadTimeout(): false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args());
}

public function readTimeout(): false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->readTimeout(...\func_get_args());
}

public function getBytes(): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBytes(...\func_get_args());
}

public function bytes(): array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bytes(...\func_get_args());
}

public function getHost(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args());
}

public function isConnected(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args());
}

public function getPort(): false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args());
}

public function getAuth(): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args());
}

public function getDbNum(): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDbNum(...\func_get_args());
}

public function _serialize($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args());
}

public function _unserialize($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args());
}

public function _compress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args());
}

public function _uncompress($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args());
}

public function _pack($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args());
}

public function _unpack($value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args());
}

public function _prefix($value): string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args());
}

public function getLastError(): ?string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args());
}

public function clearLastError(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args());
}

public function endpointId(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->endpointId(...\func_get_args());
}

public function getPersistentID(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args());
}

public function socketId(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->socketId(...\func_get_args());
}

public function rawCommand($cmd, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawCommand(...\func_get_args());
}

public function auth(#[\SensitiveParameter] $auth): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args());
}

public function info(...$sections): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args());
}

public function flushdb($sync = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushdb(...\func_get_args());
}

public function flushall($sync = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushall(...\func_get_args());
}

public function fcall($name, $keys = [], $argv = [], $handler = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall(...\func_get_args());
}

public function fcall_ro($name, $keys = [], $argv = [], $handler = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->fcall_ro(...\func_get_args());
}

public function function($op, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->function(...\func_get_args());
}

public function dbsize(): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbsize(...\func_get_args());
}

public function replicaof($host = null, $port = 0): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->replicaof(...\func_get_args());
}

public function waitaof($numlocal, $numremote, $timeout): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->waitaof(...\func_get_args());
}

public function restore($key, $ttl, $value, $options = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args());
}

public function migrate($host, $port, $key, $dstdb, $timeout, $copy = false, $replace = false, #[\SensitiveParameter] $credentials = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args());
}

public function echo($arg): \Relay\Relay|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args());
}

public function ping($arg = null): \Relay\Relay|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args());
}

public function idleTime(): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->idleTime(...\func_get_args());
}

public function randomkey(): \Relay\Relay|bool|null|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomkey(...\func_get_args());
}

public function time(): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args());
}

public function bgrewriteaof(): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
}

public function lastsave(): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastsave(...\func_get_args());
}

public function lcs($key1, $key2, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lcs(...\func_get_args());
}

public function save(): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args());
}

public function role(): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args());
}

public function ttl($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args());
}

public function pttl($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args());
}

public function exists(...$keys): \Relay\Relay|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args());
}

public function eval($script, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args());
}

public function eval_ro($script, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval_ro(...\func_get_args());
}

public function evalsha($sha, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args());
}

public function evalsha_ro($sha, $args = [], $num_keys = 0): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha_ro(...\func_get_args());
}

public function client($operation, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args());
}

public function geoadd($key, $lng, $lat, $member, ...$other_triples_and_options): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}

public function geohash($key, $member, ...$other_members): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
}

public function georadius($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args());
}

public function georadiusbymember($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args());
}

public function georadiusbymember_ro($key, $member, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args());
}

public function georadius_ro($key, $lng, $lat, $radius, $unit, $options = []): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}

public function geosearchstore($dst, $src, $position, $shape, $unit, $options = []): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearchstore(...\func_get_args());
}

public function get($key): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args());
}

public function getset($key, $value): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getset(...\func_get_args());
}

public function setrange($key, $start, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setrange(...\func_get_args());
}

public function getbit($key, $pos): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getbit(...\func_get_args());
}

public function bitcount($key, $start = 0, $end = -1, $by_bit = false): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());
}

public function bitfield($key, ...$args): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitfield(...\func_get_args());
}

public function config($operation, $key = null, $value = null): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args());
}

public function command(...$args): \Relay\Relay|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args());
}

public function bitop($operation, $dstkey, $srckey, ...$other_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args());
}

public function bitpos($key, $bit, $start = null, $end = null, $bybit = false): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args());
}

public function setbit($key, $pos, $val): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setbit(...\func_get_args());
}

public function acl($cmd, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args());
}

public function append($key, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
}

public function set($key, $value, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args());
}

public function getex($key, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getex(...\func_get_args());
}

public function getdel($key): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getdel(...\func_get_args());
}

public function setex($key, $seconds, $value): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args());
}

public function pfadd($key, $elements): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}

public function pfmerge($dst, $srckeys): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
}

public function psetex($key, $milliseconds, $value): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args());
}

public function publish($channel, $message): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}

public function pubsub($operation, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args());
}

public function spublish($channel, $message): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spublish(...\func_get_args());
}

public function setnx($key, $value): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args());
}

public function mget($keys): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function move($key, $db): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args());
}

public function mset($kvals): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args());
}

public function msetnx($kvals): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args());
}

public function rename($key, $newkey): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args());
}

public function renamenx($key, $newkey): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renamenx(...\func_get_args());
}

public function del(...$keys): \Relay\Relay|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args());
}

public function unlink(...$keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args());
}

public function expire($key, $seconds, $mode = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args());
}

public function pexpire($key, $milliseconds): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args());
}

public function expireat($key, $timestamp): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireat(...\func_get_args());
}

public function expiretime($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expiretime(...\func_get_args());
}

public function pexpireat($key, $timestamp_ms): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireat(...\func_get_args());
}

public function pexpiretime($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpiretime(...\func_get_args());
}

public function persist($key): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args());
}

public function type($key): \Relay\Relay|bool|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}

public function lrange($key, $start, $stop): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
}

public function lpush($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpush(...\func_get_args());
}

public function rpush($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpush(...\func_get_args());
}

public function lpushx($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpushx(...\func_get_args());
}

public function rpushx($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpushx(...\func_get_args());
}

public function lset($key, $index, $mem): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lset(...\func_get_args());
}

public function lpop($key, $count = 1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpop(...\func_get_args());
}

public function lpos($key, $value, $options = null): \Relay\Relay|array|false|int|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lpos(...\func_get_args());
}

public function rpop($key, $count = 1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpop(...\func_get_args());
}

public function rpoplpush($source, $dest): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args());
}

public function brpoplpush($source, $dest, $timeout): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args());
}

public function blpop($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blpop(...\func_get_args());
}

public function blmpop($timeout, $keys, $from, $count = 1): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmpop(...\func_get_args());
}

public function bzmpop($timeout, $keys, $from, $count = 1): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzmpop(...\func_get_args());
}

public function lmpop($keys, $from, $count = 1): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmpop(...\func_get_args());
}

public function zmpop($keys, $from, $count = 1): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmpop(...\func_get_args());
}

public function brpop($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpop(...\func_get_args());
}

public function bzpopmax($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmax(...\func_get_args());
}

public function bzpopmin($key, $timeout_or_key, ...$extra_args): \Relay\Relay|array|false|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzpopmin(...\func_get_args());
}

public function object($op, $key): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args());
}

public function geopos($key, ...$members): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args());
}

public function lrem($key, $mem, $count = 0): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args());
}

public function lindex($key, $index): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args());
}

public function linsert($key, $op, $pivot, $element): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->linsert(...\func_get_args());
}

public function ltrim($key, $start, $end): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args());
}

public function hget($hash, $member): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hget(...\func_get_args());
}

public function hstrlen($hash, $member): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hstrlen(...\func_get_args());
}

public function hgetall($hash): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetall(...\func_get_args());
}

public function hkeys($hash): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hkeys(...\func_get_args());
}

public function hvals($hash): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hvals(...\func_get_args());
}

public function hmget($hash, $members): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmget(...\func_get_args());
}

public function hmset($hash, $members): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hmset(...\func_get_args());
}

public function hexists($hash, $member): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexists(...\func_get_args());
}

public function hsetnx($hash, $member, $value): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetnx(...\func_get_args());
}

public function hdel($key, $mem, ...$mems): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hdel(...\func_get_args());
}

public function hincrby($key, $mem, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrby(...\func_get_args());
}

public function hincrbyfloat($key, $mem, $value): \Relay\Relay|bool|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hincrbyfloat(...\func_get_args());
}

public function incr($key, $by = 1): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args());
}

public function decr($key, $by = 1): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args());
}

public function incrby($key, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrby(...\func_get_args());
}

public function decrby($key, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrby(...\func_get_args());
}

public function incrbyfloat($key, $value): \Relay\Relay|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrbyfloat(...\func_get_args());
}

public function sdiff($key, ...$other_keys): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiff(...\func_get_args());
}

public function sdiffstore($key, ...$other_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sdiffstore(...\func_get_args());
}

public function sinter($key, ...$other_keys): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinter(...\func_get_args());
}

public function sintercard($keys, $limit = -1): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sintercard(...\func_get_args());
}

public function sinterstore($key, ...$other_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sinterstore(...\func_get_args());
}

public function sunion($key, ...$other_keys): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunion(...\func_get_args());
}

public function sunionstore($key, ...$other_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunionstore(...\func_get_args());
}

public function subscribe($channels, $callback): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args());
}

public function unsubscribe($channels = []): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args());
}

public function psubscribe($patterns, $callback): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args());
}

public function punsubscribe($patterns = []): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args());
}

public function ssubscribe($channels, $callback): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ssubscribe(...\func_get_args());
}

public function sunsubscribe($channels = []): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sunsubscribe(...\func_get_args());
}

public function touch($key_or_array, ...$more_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->touch(...\func_get_args());
}

public function pipeline(): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args());
}

public function multi($mode = 0): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args());
}

public function exec(): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args());
}

public function wait($replicas, $timeout): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args());
}

public function unwatch(): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args());
}

public function discard(): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args());
}

public function getMode($masked = false): int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args());
}

public function clearBytes(): void
{
($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearBytes(...\func_get_args());
}

public function scan(&$iterator, $match = null, $count = 0, $type = null): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($iterator, ...\array_slice(\func_get_args(), 1));
}

public function hscan($key, &$iterator, $match = null, $count = 0): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function sscan($key, &$iterator, $match = null, $count = 0): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function zscan($key, &$iterator, $match = null, $count = 0): array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($key, $iterator, ...\array_slice(\func_get_args(), 2));
}

public function keys($pattern): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args());
}

public function slowlog($operation, ...$extra_args): \Relay\Relay|array|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args());
}

public function smembers($set): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smembers(...\func_get_args());
}

public function sismember($set, $member): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args());
}

public function smismember($set, ...$members): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smismember(...\func_get_args());
}

public function srem($set, $member, ...$members): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args());
}

public function sadd($set, $member, ...$members): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sadd(...\func_get_args());
}

public function sort($key, $options = []): \Relay\Relay|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args());
}

public function sort_ro($key, $options = []): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort_ro(...\func_get_args());
}

public function smove($srcset, $dstset, $member): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->smove(...\func_get_args());
}

public function spop($set, $count = 1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->spop(...\func_get_args());
}

public function srandmember($set, $count = 1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srandmember(...\func_get_args());
}

public function scard($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args());
}

public function script($command, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args());
}

public function strlen($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args());
}

public function hlen($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hlen(...\func_get_args());
}

public function llen($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->llen(...\func_get_args());
}

public function xack($key, $group, $ids): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}

public function xclaim($key, $group, $consumer, $min_idle, $ids, $options): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
}

public function xautoclaim($key, $group, $consumer, $min_idle, $start, $count = -1, $justid = false): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xautoclaim(...\func_get_args());
}

public function xlen($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args());
}

public function xgroup($operation, $key = null, $group = null, $id_or_consumer = null, $mkstream = false, $entries_read = -2): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args());
}

public function xdel($key, $ids): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args());
}

public function xinfo($operation, $arg1 = null, $arg2 = null, $count = -1): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args());
}

public function xpending($key, $group, $start = null, $end = null, $count = -1, $consumer = null, $idle = 0): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args());
}

public function xrange($key, $start, $end, $count = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args());
}

public function xrevrange($key, $end, $start, $count = -1): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args());
}

public function xread($streams, $count = -1, $block = -1): \Relay\Relay|array|bool|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args());
}

public function xreadgroup($group, $consumer, $streams, $count = 1, $block = 1): \Relay\Relay|array|bool|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args());
}

public function xtrim($key, $threshold, $approx = false, $minid = false, $limit = -1): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args());
}

public function zadd($key, ...$args): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zadd(...\func_get_args());
}

public function zrandmember($key, $options = null): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrandmember(...\func_get_args());
}

public function zrange($key, $start, $end, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrange(...\func_get_args());
}

public function zrevrange($key, $start, $end, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrange(...\func_get_args());
}

public function zrangebyscore($key, $start, $end, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebyscore(...\func_get_args());
}

public function zrevrangebyscore($key, $start, $end, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebyscore(...\func_get_args());
}

public function zrangestore($dst, $src, $start, $end, $options = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangestore(...\func_get_args());
}

public function zrangebylex($key, $min, $max, $offset = -1, $count = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrangebylex(...\func_get_args());
}

public function zrevrangebylex($key, $max, $min, $offset = -1, $count = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrangebylex(...\func_get_args());
}

public function zrem($key, ...$args): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrem(...\func_get_args());
}

public function zremrangebylex($key, $min, $max): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebylex(...\func_get_args());
}

public function zremrangebyrank($key, $start, $end): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyrank(...\func_get_args());
}

public function zremrangebyscore($key, $min, $max): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zremrangebyscore(...\func_get_args());
}

public function zcard($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcard(...\func_get_args());
}

public function zcount($key, $min, $max): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zcount(...\func_get_args());
}

public function zdiff($keys, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiff(...\func_get_args());
}

public function zdiffstore($dst, $keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zdiffstore(...\func_get_args());
}

public function zincrby($key, $score, $mem): \Relay\Relay|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zincrby(...\func_get_args());
}

public function zlexcount($key, $min, $max): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zlexcount(...\func_get_args());
}

public function zmscore($key, ...$mems): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zmscore(...\func_get_args());
}

public function zinter($keys, $weights = null, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinter(...\func_get_args());
}

public function zintercard($keys, $limit = -1): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zintercard(...\func_get_args());
}

public function zinterstore($dst, $keys, $weights = null, $options = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args());
}

public function zunion($keys, $weights = null, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunion(...\func_get_args());
}

public function zunionstore($dst, $keys, $weights = null, $options = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args());
}

public function zpopmin($key, $count = 1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmin(...\func_get_args());
}

public function zpopmax($key, $count = 1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zpopmax(...\func_get_args());
}

public function _getKeys()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_getKeys(...\func_get_args());
}
}
<?php










namespace Symfony\Component\Cache\Traits;

class_alias(6.0 <= (float) phpversion('redis') ? Redis6Proxy::class : Redis5Proxy::class, RedisProxy::class);

if (false) {



class RedisProxy extends \Redis
{
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Psr\Cache\CacheItemInterface;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;






trait AbstractAdapterTrait
{
use LoggerAwareTrait;




private static \Closure $createCacheItem;




private static \Closure $mergeByLifetime;

private string $namespace = '';
private int $defaultLifetime;
private string $namespaceVersion = '';
private bool $versioningIsEnabled = false;
private array $deferred = [];
private array $ids = [];




protected $maxIdLength;






abstract protected function doFetch(array $ids): iterable;






abstract protected function doHave(string $id): bool;






abstract protected function doClear(string $namespace): bool;






abstract protected function doDelete(array $ids): bool;









abstract protected function doSave(array $values, int $lifetime): array|bool;

public function hasItem(mixed $key): bool
{
$id = $this->getId($key);

if (isset($this->deferred[$key])) {
$this->commit();
}

try {
return $this->doHave($id);
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);

return false;
}
}

public function clear(string $prefix = ''): bool
{
$this->deferred = [];
if ($cleared = $this->versioningIsEnabled) {
if ('' === $namespaceVersionToClear = $this->namespaceVersion) {
foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {
$namespaceVersionToClear = $v;
}
}
$namespaceToClear = $this->namespace.$namespaceVersionToClear;
$namespaceVersion = self::formatNamespaceVersion(mt_rand());
try {
$e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0);
} catch (\Exception $e) {
}
if (true !== $e && [] !== $e) {
$cleared = false;
$message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
} else {
$this->namespaceVersion = $namespaceVersion;
$this->ids = [];
}
} else {
$namespaceToClear = $this->namespace.$prefix;
}

try {
return $this->doClear($namespaceToClear) || $cleared;
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);

return false;
}
}

public function deleteItem(mixed $key): bool
{
return $this->deleteItems([$key]);
}

public function deleteItems(array $keys): bool
{
$ids = [];

foreach ($keys as $key) {
$ids[$key] = $this->getId($key);
unset($this->deferred[$key]);
}

try {
if ($this->doDelete($ids)) {
return true;
}
} catch (\Exception) {
}

$ok = true;


foreach ($ids as $key => $id) {
try {
$e = null;
if ($this->doDelete([$id])) {
continue;
}
} catch (\Exception $e) {
}
$message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
$ok = false;
}

return $ok;
}

public function getItem(mixed $key): CacheItem
{
$id = $this->getId($key);

if (isset($this->deferred[$key])) {
$this->commit();
}

$isHit = false;
$value = null;

try {
foreach ($this->doFetch([$id]) as $value) {
$isHit = true;
}

return (self::$createCacheItem)($key, $value, $isHit);
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to fetch key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
}

return (self::$createCacheItem)($key, null, false);
}

public function getItems(array $keys = []): iterable
{
$ids = [];
$commit = false;

foreach ($keys as $key) {
$ids[] = $this->getId($key);
$commit = $commit || isset($this->deferred[$key]);
}

if ($commit) {
$this->commit();
}

try {
$items = $this->doFetch($ids);
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
$items = [];
}
$ids = array_combine($ids, $keys);

return $this->generateItems($items, $ids);
}

public function save(CacheItemInterface $item): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$this->deferred[$item->getKey()] = $item;

return $this->commit();
}

public function saveDeferred(CacheItemInterface $item): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$this->deferred[$item->getKey()] = $item;

return true;
}











public function enableVersioning(bool $enable = true): bool
{
$wasEnabled = $this->versioningIsEnabled;
$this->versioningIsEnabled = $enable;
$this->namespaceVersion = '';
$this->ids = [];

return $wasEnabled;
}

public function reset(): void
{
if ($this->deferred) {
$this->commit();
}
$this->namespaceVersion = '';
$this->ids = [];
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
if ($this->deferred) {
$this->commit();
}
}

private function generateItems(iterable $items, array &$keys): \Generator
{
$f = self::$createCacheItem;

try {
foreach ($items as $id => $value) {
if (!isset($keys[$id])) {
throw new InvalidArgumentException(\sprintf('Could not match value id "%s" to keys "%s".', $id, implode('", "', $keys)));
}
$key = $keys[$id];
unset($keys[$id]);
yield $key => $f($key, $value, true);
}
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
}

foreach ($keys as $key) {
yield $key => $f($key, null, false);
}
}




protected function getId(mixed $key): string
{
if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {
$this->ids = [];
$this->namespaceVersion = '1'.static::NS_SEPARATOR;
try {
foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {
$this->namespaceVersion = $v;
}
$e = true;
if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) {
$this->namespaceVersion = self::formatNamespaceVersion(time());
$e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0);
}
} catch (\Exception $e) {
}
if (true !== $e && [] !== $e) {
$message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
}
}

if (\is_string($key) && isset($this->ids[$key])) {
return $this->namespace.$this->namespaceVersion.$this->ids[$key];
}
\assert('' !== CacheItem::validateKey($key));
$this->ids[$key] = $key;

if (\count($this->ids) > 1000) {
$this->ids = \array_slice($this->ids, 500, null, true); 
}

if (null === $this->maxIdLength) {
return $this->namespace.$this->namespaceVersion.$key;
}
if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {

$this->ids[$key] = $id = substr_replace(base64_encode(hash('xxh128', $key, true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2));
$id = $this->namespace.$this->namespaceVersion.$id;
}

return $id;
}




public static function handleUnserializeCallback(string $class): never
{
throw new \DomainException('Class not found: '.$class);
}

private static function formatNamespaceVersion(int $value): string
{
return strtr(substr_replace(base64_encode(pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_');
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;







trait FilesystemTrait
{
use FilesystemCommonTrait;

private MarshallerInterface $marshaller;

public function prune(): bool
{
$time = time();
$pruned = true;

foreach ($this->scanHashDir($this->directory) as $file) {
if (!$h = @fopen($file, 'r')) {
continue;
}

if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) {
fclose($h);
$pruned = (@unlink($file) || !file_exists($file)) && $pruned;
} else {
fclose($h);
}
}

return $pruned;
}

protected function doFetch(array $ids): iterable
{
$values = [];
$now = time();

foreach ($ids as $id) {
$file = $this->getFile($id);
if (!is_file($file) || !$h = @fopen($file, 'r')) {
continue;
}
if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) {
fclose($h);
@unlink($file);
} else {
$i = rawurldecode(rtrim(fgets($h)));
$value = stream_get_contents($h);
fclose($h);
if ($i === $id) {
$values[$id] = $this->marshaller->unmarshall($value);
}
}
}

return $values;
}

protected function doHave(string $id): bool
{
$file = $this->getFile($id);

return is_file($file) && (@filemtime($file) > time() || $this->doFetch([$id]));
}

protected function doSave(array $values, int $lifetime): array|bool
{
$expiresAt = $lifetime ? (time() + $lifetime) : 0;
$values = $this->marshaller->marshall($values, $failed);

foreach ($values as $id => $value) {
if (!$this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".$value, $expiresAt)) {
$failed[] = $id;
}
}

if ($failed && !is_writable($this->directory)) {
throw new CacheException(\sprintf('Cache directory is not writable (%s).', $this->directory));
}

return $failed;
}

private function getFileKey(string $file): string
{
if (!$h = @fopen($file, 'r')) {
return '';
}

fgets($h); 
$encodedKey = fgets($h);
fclose($h);

return rawurldecode(rtrim($encodedKey));
}
}
<?php










namespace Symfony\Component\Cache\Traits;

use Symfony\Component\VarExporter\LazyObjectInterface;
use Symfony\Component\VarExporter\LazyProxyTrait;
use Symfony\Contracts\Service\ResetInterface;


class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);




class Redis5Proxy extends \Redis implements ResetInterface, LazyObjectInterface
{
use LazyProxyTrait {
resetLazyObject as reset;
}

private const LAZY_OBJECT_PROPERTY_SCOPES = [];

public function __construct()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->__construct(...\func_get_args());
}

public function _prefix($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_prefix(...\func_get_args());
}

public function _serialize($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_serialize(...\func_get_args());
}

public function _unserialize($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unserialize(...\func_get_args());
}

public function _pack($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_pack(...\func_get_args());
}

public function _unpack($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_unpack(...\func_get_args());
}

public function _compress($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_compress(...\func_get_args());
}

public function _uncompress($value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->_uncompress(...\func_get_args());
}

public function acl($subcmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->acl(...\func_get_args());
}

public function append($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->append(...\func_get_args());
}

public function auth(#[\SensitiveParameter] $auth)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->auth(...\func_get_args());
}

public function bgSave()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgSave(...\func_get_args());
}

public function bgrewriteaof()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgrewriteaof(...\func_get_args());
}

public function bitcount($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitcount(...\func_get_args());
}

public function bitop($operation, $ret_key, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitop(...\func_get_args());
}

public function bitpos($key, $bit, $start = null, $end = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bitpos(...\func_get_args());
}

public function blPop($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blPop(...\func_get_args());
}

public function brPop($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brPop(...\func_get_args());
}

public function brpoplpush($src, $dst, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->brpoplpush(...\func_get_args());
}

public function bzPopMax($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMax(...\func_get_args());
}

public function bzPopMin($key, $timeout_or_key, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bzPopMin(...\func_get_args());
}

public function clearLastError()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->clearLastError(...\func_get_args());
}

public function client($cmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->client(...\func_get_args());
}

public function close()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->close(...\func_get_args());
}

public function command(...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->command(...\func_get_args());
}

public function config($cmd, $key, $value = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->config(...\func_get_args());
}

public function connect($host, $port = null, $timeout = null, $retry_interval = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->connect(...\func_get_args());
}

public function dbSize()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dbSize(...\func_get_args());
}

public function debug($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->debug(...\func_get_args());
}

public function decr($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decr(...\func_get_args());
}

public function decrBy($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->decrBy(...\func_get_args());
}

public function del($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->del(...\func_get_args());
}

public function discard()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->discard(...\func_get_args());
}

public function dump($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function echo($msg)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->echo(...\func_get_args());
}

public function eval($script, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->eval(...\func_get_args());
}

public function evalsha($script_sha, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evalsha(...\func_get_args());
}

public function exec()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exec(...\func_get_args());
}

public function exists($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->exists(...\func_get_args());
}

public function expire($key, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expire(...\func_get_args());
}

public function expireAt($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->expireAt(...\func_get_args());
}

public function flushAll($async = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushAll(...\func_get_args());
}

public function flushDB($async = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->flushDB(...\func_get_args());
}

public function geoadd($key, $lng, $lat, $member, ...$other_triples)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geoadd(...\func_get_args());
}

public function geodist($key, $src, $dst, $unit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function geohash($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geohash(...\func_get_args());
}

public function geopos($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geopos(...\func_get_args());
}

public function georadius($key, $lng, $lan, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius(...\func_get_args());
}

public function georadius_ro($key, $lng, $lan, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadius_ro(...\func_get_args());
}

public function georadiusbymember($key, $member, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember(...\func_get_args());
}

public function georadiusbymember_ro($key, $member, $radius, $unit, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->georadiusbymember_ro(...\func_get_args());
}

public function get($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->get(...\func_get_args());
}

public function getAuth()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getAuth(...\func_get_args());
}

public function getBit($key, $offset)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getBit(...\func_get_args());
}

public function getDBNum()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getDBNum(...\func_get_args());
}

public function getHost()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getHost(...\func_get_args());
}

public function getLastError()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getLastError(...\func_get_args());
}

public function getMode()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMode(...\func_get_args());
}

public function getOption($option)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getOption(...\func_get_args());
}

public function getPersistentID()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPersistentID(...\func_get_args());
}

public function getPort()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getPort(...\func_get_args());
}

public function getRange($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getRange(...\func_get_args());
}

public function getReadTimeout()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getReadTimeout(...\func_get_args());
}

public function getSet($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getSet(...\func_get_args());
}

public function getTimeout()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getTimeout(...\func_get_args());
}

public function hDel($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hDel(...\func_get_args());
}

public function hExists($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hExists(...\func_get_args());
}

public function hGet($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGet(...\func_get_args());
}

public function hGetAll($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hGetAll(...\func_get_args());
}

public function hIncrBy($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrBy(...\func_get_args());
}

public function hIncrByFloat($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hIncrByFloat(...\func_get_args());
}

public function hKeys($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hKeys(...\func_get_args());
}

public function hLen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hLen(...\func_get_args());
}

public function hMget($key, $keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMget(...\func_get_args());
}

public function hMset($key, $pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hMset(...\func_get_args());
}

public function hSet($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args());
}

public function hSetNx($key, $member, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSetNx(...\func_get_args());
}

public function hStrLen($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hStrLen(...\func_get_args());
}

public function hVals($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hVals(...\func_get_args());
}

public function hscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function incr($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incr(...\func_get_args());
}

public function incrBy($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrBy(...\func_get_args());
}

public function incrByFloat($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->incrByFloat(...\func_get_args());
}

public function info($option = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->info(...\func_get_args());
}

public function isConnected()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isConnected(...\func_get_args());
}

public function keys($pattern)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->keys(...\func_get_args());
}

public function lInsert($key, $position, $pivot, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lInsert(...\func_get_args());
}

public function lLen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lLen(...\func_get_args());
}

public function lPop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPop(...\func_get_args());
}

public function lPush($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPush(...\func_get_args());
}

public function lPushx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lPushx(...\func_get_args());
}

public function lSet($key, $index, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSet(...\func_get_args());
}

public function lastSave()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lastSave(...\func_get_args());
}

public function lindex($key, $index)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lindex(...\func_get_args());
}

public function lrange($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrange(...\func_get_args());
}

public function lrem($key, $value, $count)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lrem(...\func_get_args());
}

public function ltrim($key, $start, $stop)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ltrim(...\func_get_args());
}

public function mget($keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mget(...\func_get_args());
}

public function migrate($host, $port, $key, $db, $timeout, $copy = null, $replace = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->migrate(...\func_get_args());
}

public function move($key, $dbindex)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->move(...\func_get_args());
}

public function mset($pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->mset(...\func_get_args());
}

public function msetnx($pairs)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->msetnx(...\func_get_args());
}

public function multi($mode = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->multi(...\func_get_args());
}

public function object($field, $key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->object(...\func_get_args());
}

public function pconnect($host, $port = null, $timeout = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pconnect(...\func_get_args());
}

public function persist($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->persist(...\func_get_args());
}

public function pexpire($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpire(...\func_get_args());
}

public function pexpireAt($key, $timestamp)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pexpireAt(...\func_get_args());
}

public function pfadd($key, $elements)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfadd(...\func_get_args());
}

public function pfcount($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}

public function pfmerge($dstkey, $keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfmerge(...\func_get_args());
}

public function ping()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ping(...\func_get_args());
}

public function pipeline()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pipeline(...\func_get_args());
}

public function psetex($key, $expire, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psetex(...\func_get_args());
}

public function psubscribe($patterns, $callback)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->psubscribe(...\func_get_args());
}

public function pttl($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pttl(...\func_get_args());
}

public function publish($channel, $message)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->publish(...\func_get_args());
}

public function pubsub($cmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pubsub(...\func_get_args());
}

public function punsubscribe($pattern, ...$other_patterns)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->punsubscribe(...\func_get_args());
}

public function rPop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPop(...\func_get_args());
}

public function rPush($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPush(...\func_get_args());
}

public function rPushx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rPushx(...\func_get_args());
}

public function randomKey()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->randomKey(...\func_get_args());
}

public function rawcommand($cmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rawcommand(...\func_get_args());
}

public function rename($key, $newkey)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rename(...\func_get_args());
}

public function renameNx($key, $newkey)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameNx(...\func_get_args());
}

public function restore($ttl, $key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->restore(...\func_get_args());
}

public function role()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->role(...\func_get_args());
}

public function rpoplpush($src, $dst)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->rpoplpush(...\func_get_args());
}

public function sAdd($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAdd(...\func_get_args());
}

public function sAddArray($key, $options)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sAddArray(...\func_get_args());
}

public function sDiff($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiff(...\func_get_args());
}

public function sDiffStore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sDiffStore(...\func_get_args());
}

public function sInter($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInter(...\func_get_args());
}

public function sInterStore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sInterStore(...\func_get_args());
}

public function sMembers($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMembers(...\func_get_args());
}

public function sMisMember($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMisMember(...\func_get_args());
}

public function sMove($src, $dst, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sMove(...\func_get_args());
}

public function sPop($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sPop(...\func_get_args());
}

public function sRandMember($key, $count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRandMember(...\func_get_args());
}

public function sUnion($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnion(...\func_get_args());
}

public function sUnionStore($dst, $key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sUnionStore(...\func_get_args());
}

public function save()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->save(...\func_get_args());
}

public function scan(&$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scan($i_iterator, ...\array_slice(\func_get_args(), 1));
}

public function scard($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->scard(...\func_get_args());
}

public function script($cmd, ...$args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->script(...\func_get_args());
}

public function select($dbindex)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args());
}

public function set($key, $value, $opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->set(...\func_get_args());
}

public function setBit($key, $offset, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setBit(...\func_get_args());
}

public function setOption($option, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setOption(...\func_get_args());
}

public function setRange($key, $offset, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setRange(...\func_get_args());
}

public function setex($key, $expire, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setex(...\func_get_args());
}

public function setnx($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setnx(...\func_get_args());
}

public function sismember($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sismember(...\func_get_args());
}

public function slaveof($host = null, $port = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slaveof(...\func_get_args());
}

public function slowlog($arg, $option = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->slowlog(...\func_get_args());
}

public function sort($key, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sort(...\func_get_args());
}

public function sortAsc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAsc(...\func_get_args());
}

public function sortAscAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortAscAlpha(...\func_get_args());
}

public function sortDesc($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDesc(...\func_get_args());
}

public function sortDescAlpha($key, $pattern = null, $get = null, $start = null, $end = null, $getList = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sortDescAlpha(...\func_get_args());
}

public function srem($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->srem(...\func_get_args());
}

public function sscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function strlen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->strlen(...\func_get_args());
}

public function subscribe($channels, $callback)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->subscribe(...\func_get_args());
}

public function swapdb($srcdb, $dstdb)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\func_get_args());
}

public function time()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->time(...\func_get_args());
}

public function ttl($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ttl(...\func_get_args());
}

public function type($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->type(...\func_get_args());
}

public function unlink($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unlink(...\func_get_args());
}

public function unsubscribe($channel, ...$other_channels)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unsubscribe(...\func_get_args());
}

public function unwatch()
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->unwatch(...\func_get_args());
}

public function wait($numslaves, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->wait(...\func_get_args());
}

public function watch($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}

public function xack($str_key, $str_group, $arr_ids)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xack(...\func_get_args());
}

public function xadd($str_key, $str_id, $arr_fields, $i_maxlen = null, $boo_approximate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function xclaim($str_key, $str_group, $str_consumer, $i_min_idle, $arr_ids, $arr_opts = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xclaim(...\func_get_args());
}

public function xdel($str_key, $arr_ids)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdel(...\func_get_args());
}

public function xgroup($str_operation, $str_key = null, $str_arg1 = null, $str_arg2 = null, $str_arg3 = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xgroup(...\func_get_args());
}

public function xinfo($str_cmd, $str_key = null, $str_group = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xinfo(...\func_get_args());
}

public function xlen($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xlen(...\func_get_args());
}

public function xpending($str_key, $str_group, $str_start = null, $str_end = null, $i_count = null, $str_consumer = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xpending(...\func_get_args());
}

public function xrange($str_key, $str_start, $str_end, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrange(...\func_get_args());
}

public function xread($arr_streams, $i_count = null, $i_block = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xread(...\func_get_args());
}

public function xreadgroup($str_group, $str_consumer, $arr_streams, $i_count = null, $i_block = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xreadgroup(...\func_get_args());
}

public function xrevrange($str_key, $str_start, $str_end, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xrevrange(...\func_get_args());
}

public function xtrim($str_key, $i_maxlen, $boo_approximate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xtrim(...\func_get_args());
}

public function zAdd($key, $score, $value, ...$extra_args)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zAdd(...\func_get_args());
}

public function zCard($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCard(...\func_get_args());
}

public function zCount($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zCount(...\func_get_args());
}

public function zIncrBy($key, $value, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zIncrBy(...\func_get_args());
}

public function zLexCount($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zLexCount(...\func_get_args());
}

public function zPopMax($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMax(...\func_get_args());
}

public function zPopMin($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zPopMin(...\func_get_args());
}

public function zRange($key, $start, $end, $scores = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRange(...\func_get_args());
}

public function zRangeByLex($key, $min, $max, $offset = null, $limit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByLex(...\func_get_args());
}

public function zRangeByScore($key, $start, $end, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRangeByScore(...\func_get_args());
}

public function zRank($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRank(...\func_get_args());
}

public function zRem($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRem(...\func_get_args());
}

public function zRemRangeByLex($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByLex(...\func_get_args());
}

public function zRemRangeByRank($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByRank(...\func_get_args());
}

public function zRemRangeByScore($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemRangeByScore(...\func_get_args());
}

public function zRevRange($key, $start, $end, $scores = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRange(...\func_get_args());
}

public function zRevRangeByLex($key, $min, $max, $offset = null, $limit = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByLex(...\func_get_args());
}

public function zRevRangeByScore($key, $start, $end, $options = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRangeByScore(...\func_get_args());
}

public function zRevRank($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRevRank(...\func_get_args());
}

public function zScore($key, $member)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zScore(...\func_get_args());
}

public function zinterstore($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zinterstore(...\func_get_args());
}

public function zscan($str_key, &$i_iterator, $str_pattern = null, $i_count = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscan($str_key, $i_iterator, ...\array_slice(\func_get_args(), 2));
}

public function zunionstore($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zunionstore(...\func_get_args());
}

public function delete($key, ...$other_keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delete(...\func_get_args());
}

public function evaluate($script, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluate(...\func_get_args());
}

public function evaluateSha($script_sha, $args = null, $num_keys = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->evaluateSha(...\func_get_args());
}

public function getKeys($pattern)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getKeys(...\func_get_args());
}

public function getMultiple($keys)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getMultiple(...\func_get_args());
}

public function lGet($key, $index)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGet(...\func_get_args());
}

public function lGetRange($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lGetRange(...\func_get_args());
}

public function lRemove($key, $value, $count)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lRemove(...\func_get_args());
}

public function lSize($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lSize(...\func_get_args());
}

public function listTrim($key, $start, $stop)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->listTrim(...\func_get_args());
}

public function open($host, $port = null, $timeout = null, $retry_interval = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->open(...\func_get_args());
}

public function popen($host, $port = null, $timeout = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->popen(...\func_get_args());
}

public function renameKey($key, $newkey)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->renameKey(...\func_get_args());
}

public function sContains($key, $value)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sContains(...\func_get_args());
}

public function sGetMembers($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sGetMembers(...\func_get_args());
}

public function sRemove($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sRemove(...\func_get_args());
}

public function sSize($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sSize(...\func_get_args());
}

public function sendEcho($msg)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->sendEcho(...\func_get_args());
}

public function setTimeout($key, $timeout)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->setTimeout(...\func_get_args());
}

public function substr($key, $start, $end)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->substr(...\func_get_args());
}

public function zDelete($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDelete(...\func_get_args());
}

public function zDeleteRangeByRank($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByRank(...\func_get_args());
}

public function zDeleteRangeByScore($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zDeleteRangeByScore(...\func_get_args());
}

public function zInter($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zInter(...\func_get_args());
}

public function zRemove($key, $member, ...$other_members)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemove(...\func_get_args());
}

public function zRemoveRangeByScore($key, $min, $max)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zRemoveRangeByScore(...\func_get_args());
}

public function zReverseRange($key, $start, $end, $scores = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zReverseRange(...\func_get_args());
}

public function zSize($key)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zSize(...\func_get_args());
}

public function zUnion($key, $keys, $weights = null, $aggregate = null)
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zUnion(...\func_get_args());
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait GeosearchTrait
{
public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
}
}
} else {



trait GeosearchTrait
{
public function geosearch($key, $position, $shape, $unit, $options = []): \Relay\Relay|array
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geosearch(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait MoveTrait
{
public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
}

public function lmove($srckey, $dstkey, $srcpos, $dstpos): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
}
}
} else {



trait MoveTrait
{
public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|string|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->blmove(...\func_get_args());
}

public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|string|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->lmove(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait HsetTrait
{
public function hset($key, ...$keys_and_vals): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
}
}
} else {



trait HsetTrait
{
public function hset($key, $mem, $val, ...$kvals): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hset(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.11.0', '>=')) {



trait Relay11Trait
{
public function cmsIncrBy($key, $field, $value, ...$fields_and_falues): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsIncrBy(...\func_get_args());
}

public function cmsInfo($key): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsInfo(...\func_get_args());
}

public function cmsInitByDim($key, $width, $depth): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsInitByDim(...\func_get_args());
}

public function cmsInitByProb($key, $error, $probability): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsInitByProb(...\func_get_args());
}

public function cmsMerge($dstkey, $keys, $weights = []): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsMerge(...\func_get_args());
}

public function cmsQuery($key, ...$fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->cmsQuery(...\func_get_args());
}

public function commandlog($subcmd, ...$args): \Relay\Relay|array|bool|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->commandlog(...\func_get_args());
}

public function hexpire($hash, $ttl, $fields, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexpire(...\func_get_args());
}

public function hexpireat($hash, $ttl, $fields, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexpireat(...\func_get_args());
}

public function hexpiretime($hash, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hexpiretime(...\func_get_args());
}

public function hgetdel($key, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetdel(...\func_get_args());
}

public function hgetex($hash, $fields, $expiry = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetex(...\func_get_args());
}

public function hpersist($hash, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hpersist(...\func_get_args());
}

public function hpexpire($hash, $ttl, $fields, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hpexpire(...\func_get_args());
}

public function hpexpireat($hash, $ttl, $fields, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hpexpireat(...\func_get_args());
}

public function hpexpiretime($hash, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hpexpiretime(...\func_get_args());
}

public function hpttl($hash, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hpttl(...\func_get_args());
}

public function hsetex($key, $fields, $expiry = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hsetex(...\func_get_args());
}

public function httl($hash, $fields): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->httl(...\func_get_args());
}

public function serverName(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->serverName(...\func_get_args());
}

public function serverVersion(): false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->serverVersion(...\func_get_args());
}
}
} else {



trait Relay11Trait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait FtTrait
{
public function ftAggregate($index, $query, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftAggregate(...\func_get_args());
}

public function ftAliasAdd($index, $alias): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftAliasAdd(...\func_get_args());
}

public function ftAliasDel($alias): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftAliasDel(...\func_get_args());
}

public function ftAliasUpdate($index, $alias): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftAliasUpdate(...\func_get_args());
}

public function ftAlter($index, $schema, $skipinitialscan = false): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftAlter(...\func_get_args());
}

public function ftConfig($operation, $option, $value = null): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftConfig(...\func_get_args());
}

public function ftCreate($index, $schema, $options = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftCreate(...\func_get_args());
}

public function ftCursor($operation, $index, $cursor, $options = null): \Relay\Relay|array|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftCursor(...\func_get_args());
}

public function ftDictAdd($dict, $term, ...$other_terms): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftDictAdd(...\func_get_args());
}

public function ftDictDel($dict, $term, ...$other_terms): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftDictDel(...\func_get_args());
}

public function ftDictDump($dict): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftDictDump(...\func_get_args());
}

public function ftDropIndex($index, $dd = false): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftDropIndex(...\func_get_args());
}

public function ftExplain($index, $query, $dialect = 0): \Relay\Relay|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftExplain(...\func_get_args());
}

public function ftExplainCli($index, $query, $dialect = 0): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftExplainCli(...\func_get_args());
}

public function ftInfo($index): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftInfo(...\func_get_args());
}

public function ftProfile($index, $command, $query, $limited = false): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftProfile(...\func_get_args());
}

public function ftSearch($index, $query, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftSearch(...\func_get_args());
}

public function ftSpellCheck($index, $query, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftSpellCheck(...\func_get_args());
}

public function ftSynDump($index): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftSynDump(...\func_get_args());
}

public function ftSynUpdate($index, $synonym, $term_or_terms, $skipinitialscan = false): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftSynUpdate(...\func_get_args());
}

public function ftTagVals($index, $tag): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->ftTagVals(...\func_get_args());
}
}
} else {



trait FtTrait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait SwapdbTrait
{
public function swapdb($index1, $index2): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->swapdb(...\func_get_args());
}
}
} else {



trait SwapdbTrait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.11', '>=')) {



trait BgsaveTrait
{
public function bgsave($arg = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args());
}
}
} else {



trait BgsaveTrait
{
public function bgsave($schedule = false): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->bgsave(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait NullableReturnTrait
{
public function dump($key): \Relay\Relay|false|string|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
}

public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
}

public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
}

public function zscore($key, $member): \Relay\Relay|false|float|null
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
}
}
} else {



trait NullableReturnTrait
{
public function dump($key): \Relay\Relay|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->dump(...\func_get_args());
}

public function geodist($key, $src, $dst, $unit = null): \Relay\Relay|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->geodist(...\func_get_args());
}

public function hrandfield($hash, $options = null): \Relay\Relay|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hrandfield(...\func_get_args());
}

public function xadd($key, $id, $values, $maxlen = 0, $approx = false, $nomkstream = false): \Relay\Relay|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xadd(...\func_get_args());
}

public function zrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrank(...\func_get_args());
}

public function zrevrank($key, $rank, $withscore = false): \Relay\Relay|array|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zrevrank(...\func_get_args());
}

public function zscore($key, $member): \Relay\Relay|false|float
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->zscore(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait GetrangeTrait
{
public function getrange($key, $start, $end): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
}
}
} else {



trait GetrangeTrait
{
public function getrange($key, $start, $end): \Relay\Relay|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getrange(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.8.1', '>=')) {



trait CopyTrait
{
public function copy($src, $dst, $options = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
}
}
} else {



trait CopyTrait
{
public function copy($src, $dst, $options = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->copy(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.9.0', '>=')) {



trait PfcountTrait
{
public function pfcount($key_or_keys): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}
}
} else {



trait PfcountTrait
{
public function pfcount($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->pfcount(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.12.1', '>=')) {



trait Relay121Trait
{
public function hgetWithMeta($hash, $member): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hgetWithMeta(...\func_get_args());
}

public function select($db): \Relay\Relay|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args());
}

public function watch($key, ...$other_keys): \Relay\Relay|bool|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}
}
} else {



trait Relay121Trait
{
public function select($db): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->select(...\func_get_args());
}

public function watch($key, ...$other_keys): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->watch(...\func_get_args());
}
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.11.1', '>=')) {



trait IsTrackedTrait
{
public function isTracked($key): bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->isTracked(...\func_get_args());
}
}
} else {



trait IsTrackedTrait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.10.1', '>=')) {



trait GetWithMetaTrait
{
public function getWithMeta($key): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->getWithMeta(...\func_get_args());
}
}
} else {



trait GetWithMetaTrait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits\Relay;

if (version_compare(phpversion('relay'), '0.12.0', '>=')) {



trait Relay12Trait
{
public function delifeq($key, $value): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->delifeq(...\func_get_args());
}

public function vadd($key, $values, $element, $options = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vadd(...\func_get_args());
}

public function vcard($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vcard(...\func_get_args());
}

public function vdim($key): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vdim(...\func_get_args());
}

public function vemb($key, $element, $raw = false): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vemb(...\func_get_args());
}

public function vgetattr($key, $element, $raw = false): \Relay\Relay|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vgetattr(...\func_get_args());
}

public function vinfo($key): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vinfo(...\func_get_args());
}

public function vismember($key, $element): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vismember(...\func_get_args());
}

public function vlinks($key, $element, $withscores): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vlinks(...\func_get_args());
}

public function vrandmember($key, $count = 0): \Relay\Relay|array|false|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vrandmember(...\func_get_args());
}

public function vrange($key, $min, $max, $count = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vrange(...\func_get_args());
}

public function vrem($key, $element): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vrem(...\func_get_args());
}

public function vsetattr($key, $element, $attributes): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vsetattr(...\func_get_args());
}

public function vsim($key, $member, $options = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->vsim(...\func_get_args());
}

public function xdelex($key, $ids, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xdelex(...\func_get_args());
}

public function xackdel($key, $group, $ids, $mode = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->xackdel(...\func_get_args());
}
}
} else {



trait Relay12Trait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits;




interface CachedValueInterface
{
public function getValue(): mixed;
}
<?php










namespace Symfony\Component\Cache\Traits;

if (version_compare(phpversion('relay'), '0.8.1', '>=')) {



trait RelayProxyTrait
{
public function jsonArrAppend($key, $value_or_array, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrAppend(...\func_get_args());
}

public function jsonArrIndex($key, $path, $value, $start = 0, $stop = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrIndex(...\func_get_args());
}

public function jsonArrInsert($key, $path, $index, $value, ...$other_values): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrInsert(...\func_get_args());
}

public function jsonArrLen($key, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrLen(...\func_get_args());
}

public function jsonArrPop($key, $path = null, $index = -1): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrPop(...\func_get_args());
}

public function jsonArrTrim($key, $path, $start, $stop): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonArrTrim(...\func_get_args());
}

public function jsonClear($key, $path = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonClear(...\func_get_args());
}

public function jsonDebug($command, $key, $path = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonDebug(...\func_get_args());
}

public function jsonDel($key, $path = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonDel(...\func_get_args());
}

public function jsonForget($key, $path = null): \Relay\Relay|false|int
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonForget(...\func_get_args());
}

public function jsonGet($key, $options = [], ...$paths): mixed
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonGet(...\func_get_args());
}

public function jsonMerge($key, $path, $value): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonMerge(...\func_get_args());
}

public function jsonMget($key_or_array, $path): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonMget(...\func_get_args());
}

public function jsonMset($key, $path, $value, ...$other_triples): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonMset(...\func_get_args());
}

public function jsonNumIncrBy($key, $path, $value): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonNumIncrBy(...\func_get_args());
}

public function jsonNumMultBy($key, $path, $value): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonNumMultBy(...\func_get_args());
}

public function jsonObjKeys($key, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonObjKeys(...\func_get_args());
}

public function jsonObjLen($key, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonObjLen(...\func_get_args());
}

public function jsonResp($key, $path = null): \Relay\Relay|array|false|int|string
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonResp(...\func_get_args());
}

public function jsonSet($key, $path, $value, $condition = null): \Relay\Relay|bool
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonSet(...\func_get_args());
}

public function jsonStrAppend($key, $value, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonStrAppend(...\func_get_args());
}

public function jsonStrLen($key, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonStrLen(...\func_get_args());
}

public function jsonToggle($key, $path): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonToggle(...\func_get_args());
}

public function jsonType($key, $path = null): \Relay\Relay|array|false
{
return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->jsonType(...\func_get_args());
}
}
} else {



trait RelayProxyTrait
{
}
}
<?php










namespace Symfony\Component\Cache\Traits;












class RedisClusterNodeProxy
{
public function __construct(
private array $host,
private \RedisCluster $redis,
) {
}

public function __call(string $method, array $args)
{
return $this->redis->{$method}($this->host, ...$args);
}

public function scan(&$iIterator, $strPattern = null, $iCount = null)
{
return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount);
}

public function getOption($name)
{
return $this->redis->getOption($name);
}
}
<?php










namespace Symfony\Component\Cache;

use Psr\Cache\CacheItemInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Exception\LogicException;
use Symfony\Contracts\Cache\ItemInterface;




final class CacheItem implements ItemInterface
{
private const METADATA_EXPIRY_OFFSET = 1527506807;
private const VALUE_WRAPPER = "\xA9";

protected string $key;
protected mixed $value = null;
protected bool $isHit = false;
protected float|int|null $expiry = null;
protected array $metadata = [];
protected array $newMetadata = [];
protected ?CacheItemInterface $innerItem = null;
protected ?string $poolHash = null;
protected bool $isTaggable = false;

public function getKey(): string
{
return $this->key;
}

public function get(): mixed
{
return $this->value;
}

public function isHit(): bool
{
return $this->isHit;
}




public function set($value): static
{
$this->value = $value;

return $this;
}




public function expiresAt(?\DateTimeInterface $expiration): static
{
$this->expiry = null !== $expiration ? (float) $expiration->format('U.u') : null;

return $this;
}




public function expiresAfter(mixed $time): static
{
if (null === $time) {
$this->expiry = null;
} elseif ($time instanceof \DateInterval) {
$this->expiry = microtime(true) + \DateTimeImmutable::createFromFormat('U', 0)->add($time)->format('U.u');
} elseif (\is_int($time)) {
$this->expiry = $time + microtime(true);
} else {
throw new InvalidArgumentException(\sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given.', get_debug_type($time)));
}

return $this;
}

public function tag(mixed $tags): static
{
if (!$this->isTaggable) {
throw new LogicException(\sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key));
}
if (!\is_array($tags) && !$tags instanceof \Traversable) { 
$tags = [$tags];
}
foreach ($tags as $tag) {
if (!\is_string($tag) && !$tag instanceof \Stringable) {
throw new InvalidArgumentException(\sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', get_debug_type($tag)));
}
$tag = (string) $tag;
if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) {
continue;
}
if ('' === $tag) {
throw new InvalidArgumentException('Cache tag length must be greater than zero.');
}
if (false !== strpbrk($tag, self::RESERVED_CHARACTERS)) {
throw new InvalidArgumentException(\sprintf('Cache tag "%s" contains reserved characters "%s".', $tag, self::RESERVED_CHARACTERS));
}
$this->newMetadata[self::METADATA_TAGS][$tag] = $tag;
}

return $this;
}

public function getMetadata(): array
{
return $this->metadata;
}








public static function validateKey($key): string
{
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}
if ('' === $key) {
throw new InvalidArgumentException('Cache key length must be greater than zero.');
}
if (false !== strpbrk($key, self::RESERVED_CHARACTERS)) {
throw new InvalidArgumentException(\sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS));
}

return $key;
}






public static function log(?LoggerInterface $logger, string $message, array $context = []): void
{
if ($logger) {
$logger->warning($message, $context);
} else {
$replace = [];
foreach ($context as $k => $v) {
if (\is_scalar($v)) {
$replace['{'.$k.'}'] = $v;
}
}
@trigger_error(strtr($message, $replace), \E_USER_WARNING);
}
}

private function pack(): mixed
{
if (!$m = $this->newMetadata) {
return $this->value;
}
$valueWrapper = self::VALUE_WRAPPER;

return new $valueWrapper($this->value, $m + ['expiry' => $this->expiry]);
}

private function unpack(): bool
{
$v = $this->value;
$valueWrapper = self::VALUE_WRAPPER;

if ($v instanceof $valueWrapper) {
$this->value = $v->value;
$this->metadata = $v->metadata;

return true;
}

if (!\is_array($v) || 1 !== \count($v) || 10 !== \strlen($k = (string) array_key_first($v)) || "\x9D" !== $k[0] || "\0" !== $k[5] || "\x5F" !== $k[9]) {
return false;
}


$this->value = $v[$k];
$this->metadata = unpack('Vexpiry/Nctime', substr($k, 1, -1));
$this->metadata['expiry'] += self::METADATA_EXPIRY_OFFSET;

return true;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;




class CouchbaseBucketAdapter extends AbstractAdapter
{
private const THIRTY_DAYS_IN_SECONDS = 2592000;
private const MAX_KEY_LENGTH = 250;
private const KEY_NOT_FOUND = 13;
private const VALID_DSN_OPTIONS = [
'operationTimeout',
'configTimeout',
'configNodeTimeout',
'n1qlTimeout',
'httpTimeout',
'configDelay',
'htconfigIdleTimeout',
'durabilityInterval',
'durabilityTimeout',
];

private \CouchbaseBucket $bucket;
private MarshallerInterface $marshaller;

public function __construct(\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)
{
if (!static::isSupported()) {
throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');
}

$this->maxIdLength = static::MAX_KEY_LENGTH;

$this->bucket = $bucket;

parent::__construct($namespace, $defaultLifetime);
$this->enableVersioning();
$this->marshaller = $marshaller ?? new DefaultMarshaller();
}

public static function createConnection(#[\SensitiveParameter] array|string $servers, array $options = []): \CouchbaseBucket
{
if (\is_string($servers)) {
$servers = [$servers];
}

if (!static::isSupported()) {
throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.');
}

set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line));

$dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?'
.'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\?]+))(?:\?(?<options>.*))?$/i';

$newServers = [];
$protocol = 'couchbase';
try {
$options = self::initOptions($options);
$username = $options['username'];
$password = $options['password'];

foreach ($servers as $dsn) {
if (!str_starts_with($dsn, 'couchbase:')) {
throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with "couchbase:".');
}

preg_match($dsnPattern, $dsn, $matches);

$username = $matches['username'] ?: $username;
$password = $matches['password'] ?: $password;
$protocol = $matches['protocol'] ?: $protocol;

if (isset($matches['options'])) {
$optionsInDsn = self::getOptions($matches['options']);

foreach ($optionsInDsn as $parameter => $value) {
$options[$parameter] = $value;
}
}

$newServers[] = $matches['host'];
}

$connectionString = $protocol.'://'.implode(',', $newServers);

$client = new \CouchbaseCluster($connectionString);
$client->authenticateAs($username, $password);

$bucket = $client->openBucket($matches['bucketName']);

unset($options['username'], $options['password']);
foreach ($options as $option => $value) {
if (!empty($value)) {
$bucket->$option = $value;
}
}

return $bucket;
} finally {
restore_error_handler();
}
}

public static function isSupported(): bool
{
return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '2.6.0', '>=') && version_compare(phpversion('couchbase'), '3.0', '<');
}

private static function getOptions(string $options): array
{
$results = [];
$optionsInArray = explode('&', $options);

foreach ($optionsInArray as $option) {
[$key, $value] = explode('=', $option);

if (\in_array($key, static::VALID_DSN_OPTIONS, true)) {
$results[$key] = $value;
}
}

return $results;
}

private static function initOptions(array $options): array
{
$options['username'] ??= '';
$options['password'] ??= '';
$options['operationTimeout'] ??= 0;
$options['configTimeout'] ??= 0;
$options['configNodeTimeout'] ??= 0;
$options['n1qlTimeout'] ??= 0;
$options['httpTimeout'] ??= 0;
$options['configDelay'] ??= 0;
$options['htconfigIdleTimeout'] ??= 0;
$options['durabilityInterval'] ??= 0;
$options['durabilityTimeout'] ??= 0;

return $options;
}

protected function doFetch(array $ids): iterable
{
$resultsCouchbase = $this->bucket->get($ids);

$results = [];
foreach ($resultsCouchbase as $key => $value) {
if (null !== $value->error) {
continue;
}
$results[$key] = $this->marshaller->unmarshall($value->value);
}

return $results;
}

protected function doHave(string $id): bool
{
return false !== $this->bucket->get($id);
}

protected function doClear(string $namespace): bool
{
if ('' === $namespace) {
$this->bucket->manager()->flush();

return true;
}

return false;
}

protected function doDelete(array $ids): bool
{
$results = $this->bucket->remove(array_values($ids));

foreach ($results as $key => $result) {
if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) {
continue;
}
unset($results[$key]);
}

return 0 === \count($results);
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

$lifetime = $this->normalizeExpiry($lifetime);

$ko = [];
foreach ($values as $key => $value) {
$result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]);

if (null !== $result->error) {
$ko[$key] = $result;
}
}

return [] === $ko ? true : $ko;
}

private function normalizeExpiry(int $expiry): int
{
if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) {
$expiry += time();
}

return $expiry;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Component\Cache\Traits\ProxyTrait;
use Symfony\Contracts\Cache\CacheInterface;




class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
{
use ContractsTrait;
use ProxyTrait;

private string $namespace = '';
private int $namespaceLen;
private string $poolHash;
private int $defaultLifetime;

private static \Closure $createCacheItem;
private static \Closure $setInnerItem;

public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0)
{
$this->pool = $pool;
$this->poolHash = spl_object_hash($pool);
if ('' !== $namespace) {
\assert('' !== CacheItem::validateKey($namespace));
$this->namespace = $namespace;
}
$this->namespaceLen = \strlen($namespace);
$this->defaultLifetime = $defaultLifetime;
self::$createCacheItem ??= \Closure::bind(
static function ($key, $innerItem, $poolHash) {
$item = new CacheItem();
$item->key = $key;

if (null === $innerItem) {
return $item;
}

$item->value = $innerItem->get();
$item->isHit = $innerItem->isHit();
$item->innerItem = $innerItem;
$item->poolHash = $poolHash;

if (!$item->unpack() && $innerItem instanceof CacheItem) {
$item->metadata = $innerItem->metadata;
}
$innerItem->set(null);

return $item;
},
null,
CacheItem::class
);
self::$setInnerItem ??= \Closure::bind(
static function (CacheItemInterface $innerItem, CacheItem $item, $expiry = null) {
$innerItem->set($item->pack());
$innerItem->expiresAt(($expiry ?? $item->expiry) ? \DateTimeImmutable::createFromFormat('U.u', \sprintf('%.6F', $expiry ?? $item->expiry)) : null);
},
null,
CacheItem::class
);
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
if (!$this->pool instanceof CacheInterface) {
return $this->doGet($this, $key, $callback, $beta, $metadata);
}

return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) {
$item = (self::$createCacheItem)($key, $innerItem, $this->poolHash);
$item->set($value = $callback($item, $save));
(self::$setInnerItem)($innerItem, $item);

return $value;
}, $beta, $metadata);
}

public function getItem(mixed $key): CacheItem
{
$item = $this->pool->getItem($this->getId($key));

return (self::$createCacheItem)($key, $item, $this->poolHash);
}

public function getItems(array $keys = []): iterable
{
if ($this->namespaceLen) {
foreach ($keys as $i => $key) {
$keys[$i] = $this->getId($key);
}
}

return $this->generateItems($this->pool->getItems($keys));
}

public function hasItem(mixed $key): bool
{
return $this->pool->hasItem($this->getId($key));
}

public function clear(string $prefix = ''): bool
{
if ($this->pool instanceof AdapterInterface) {
return $this->pool->clear($this->namespace.$prefix);
}

return $this->pool->clear();
}

public function deleteItem(mixed $key): bool
{
return $this->pool->deleteItem($this->getId($key));
}

public function deleteItems(array $keys): bool
{
if ($this->namespaceLen) {
foreach ($keys as $i => $key) {
$keys[$i] = $this->getId($key);
}
}

return $this->pool->deleteItems($keys);
}

public function save(CacheItemInterface $item): bool
{
return $this->doSave($item, __FUNCTION__);
}

public function saveDeferred(CacheItemInterface $item): bool
{
return $this->doSave($item, __FUNCTION__);
}

public function commit(): bool
{
return $this->pool->commit();
}

private function doSave(CacheItemInterface $item, string $method): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$castItem = (array) $item;

if (null === $castItem["\0*\0expiry"] && 0 < $this->defaultLifetime) {
$castItem["\0*\0expiry"] = microtime(true) + $this->defaultLifetime;
}

if ($castItem["\0*\0poolHash"] === $this->poolHash && $castItem["\0*\0innerItem"]) {
$innerItem = $castItem["\0*\0innerItem"];
} elseif ($this->pool instanceof AdapterInterface) {


$innerItem = (self::$createCacheItem)($this->namespace.$castItem["\0*\0key"], null, $this->poolHash);
} else {
$innerItem = $this->pool->getItem($this->namespace.$castItem["\0*\0key"]);
}

(self::$setInnerItem)($innerItem, $item, $castItem["\0*\0expiry"]);

return $this->pool->$method($innerItem);
}

private function generateItems(iterable $items): \Generator
{
$f = self::$createCacheItem;

foreach ($items as $key => $item) {
if ($this->namespaceLen) {
$key = substr($key, $this->namespaceLen);
}

yield $key => $f($key, $item, $this->poolHash);
}
}

private function getId(mixed $key): string
{
\assert('' !== CacheItem::validateKey($key));

return $this->namespace.$key;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\Traits\FilesystemTrait;

class FilesystemAdapter extends AbstractAdapter implements PruneableInterface
{
use FilesystemTrait;

public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null)
{
$this->marshaller = $marshaller ?? new DefaultMarshaller();
parent::__construct('', $defaultLifetime);
$this->init($namespace, $directory);
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;




class ApcuAdapter extends AbstractAdapter
{
private ?MarshallerInterface $marshaller;




public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $version = null, ?MarshallerInterface $marshaller = null)
{
if (!static::isSupported()) {
throw new CacheException('APCu is not enabled.');
}
if ('cli' === \PHP_SAPI) {
ini_set('apc.use_request_time', 0);
}
parent::__construct($namespace, $defaultLifetime);

if (null !== $version) {
CacheItem::validateKey($version);

if (!apcu_exists($version.'@'.$namespace)) {
$this->doClear($namespace);
apcu_add($version.'@'.$namespace, null);
}
}

$this->marshaller = $marshaller;
}




public static function isSupported()
{
return \function_exists('apcu_fetch') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOL);
}

protected function doFetch(array $ids): iterable
{
$unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
try {
$values = [];
foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) {
if (null !== $v || $ok) {
$values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v;
}
}

return $values;
} catch (\Error $e) {
throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
} finally {
ini_set('unserialize_callback_func', $unserializeCallbackHandler);
}
}

protected function doHave(string $id): bool
{
return apcu_exists($id);
}

protected function doClear(string $namespace): bool
{
return isset($namespace[0]) && class_exists(\APCUIterator::class, false) && ('cli' !== \PHP_SAPI || filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL))
? apcu_delete(new \APCUIterator(\sprintf('/^%s/', preg_quote($namespace, '/')), \APC_ITER_KEY))
: apcu_clear_cache();
}

protected function doDelete(array $ids): bool
{
foreach ($ids as $id) {
apcu_delete($id);
}

return true;
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) {
return $failed;
}

if (false === $failures = apcu_store($values, null, $lifetime)) {
$failures = $values;
}

return array_keys($failures);
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Log\LoggerAwareInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\AbstractAdapterTrait;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Contracts\Cache\TagAwareCacheInterface;












abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface
{
use AbstractAdapterTrait;
use ContractsTrait;

private const TAGS_PREFIX = "\1tags\1";

protected function __construct(string $namespace = '', int $defaultLifetime = 0)
{
$this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';
$this->defaultLifetime = $defaultLifetime;
if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) {
throw new InvalidArgumentException(\sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace));
}
self::$createCacheItem ??= \Closure::bind(
static function ($key, $value, $isHit) {
$item = new CacheItem();
$item->key = $key;
$item->isTaggable = true;

if (!\is_array($value) || !\array_key_exists('value', $value)) {
return $item;
}
$item->isHit = $isHit;

$item->value = $value['value'];
$item->metadata[CacheItem::METADATA_TAGS] = isset($value['tags']) ? array_combine($value['tags'], $value['tags']) : [];
if (isset($value['meta'])) {

$v = unpack('Ve/Nc', $value['meta']);
$item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET;
$item->metadata[CacheItem::METADATA_CTIME] = $v['c'];
}

return $item;
},
null,
CacheItem::class
);
self::$mergeByLifetime ??= \Closure::bind(
static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) {
$byLifetime = [];
$now = microtime(true);
$expiredIds = [];

foreach ($deferred as $key => $item) {
$key = (string) $key;
if (null === $item->expiry) {
$ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;
} elseif (!$item->expiry) {
$ttl = 0;
} elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {
$expiredIds[] = $getId($key);
continue;
}

if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) {
$value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]];
unset($metadata[CacheItem::METADATA_TAGS]);
} else {
$value = ['value' => $item->value, 'tags' => []];
}

if ($metadata) {

$value['meta'] = pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - CacheItem::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME]);
}


$value['tag-operations'] = ['add' => [], 'remove' => []];
$oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? [];
foreach (array_diff_key($value['tags'], $oldTags) as $addedTag) {
$value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag);
}
foreach (array_diff_key($oldTags, $value['tags']) as $removedTag) {
$value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag);
}
$value['tags'] = array_keys($value['tags']);

$byLifetime[$ttl][$getId($key)] = $value;
$item->metadata = $item->newMetadata;
}

return $byLifetime;
},
null,
CacheItem::class
);
}











abstract protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array;






abstract protected function doDelete(array $ids): bool;






abstract protected function doDeleteTagRelations(array $tagData): bool;






abstract protected function doInvalidate(array $tagIds): bool;




protected function doDeleteYieldTags(array $ids): iterable
{
foreach ($this->doFetch($ids) as $id => $value) {
yield $id => \is_array($value) && \is_array($value['tags'] ?? null) ? $value['tags'] : [];
}

$this->doDelete($ids);
}

public function commit(): bool
{
$ok = true;
$byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, $this->getId(...), self::TAGS_PREFIX, $this->defaultLifetime);
$retry = $this->deferred = [];

if ($expiredIds) {

try {
$this->doDelete($expiredIds);
} catch (\Exception $e) {
$ok = false;
CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
}
}
foreach ($byLifetime as $lifetime => $values) {
try {
$values = $this->extractTagData($values, $addTagData, $removeTagData);
$e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);
} catch (\Exception $e) {
}
if (true === $e || [] === $e) {
continue;
}
if (\is_array($e) || 1 === \count($values)) {
foreach (\is_array($e) ? $e : array_keys($values) as $id) {
$ok = false;
$v = $values[$id];
$type = get_debug_type($v);
$message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
}
} else {
foreach ($values as $id => $v) {
$retry[$lifetime][] = $id;
}
}
}


foreach ($retry as $lifetime => $ids) {
foreach ($ids as $id) {
try {
$v = $byLifetime[$lifetime][$id];
$values = $this->extractTagData([$id => $v], $addTagData, $removeTagData);
$e = $this->doSave($values, $lifetime, $addTagData, $removeTagData);
} catch (\Exception $e) {
}
if (true === $e || [] === $e) {
continue;
}
$ok = false;
$type = get_debug_type($v);
$message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
}
}

return $ok;
}

public function deleteItems(array $keys): bool
{
if (!$keys) {
return true;
}

$ok = true;
$ids = [];
$tagData = [];

foreach ($keys as $key) {
$ids[$key] = $this->getId($key);
unset($this->deferred[$key]);
}

try {
foreach ($this->doDeleteYieldTags(array_values($ids)) as $id => $tags) {
foreach ($tags as $tag) {
$tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id;
}
}
} catch (\Exception) {
$ok = false;
}

try {
if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) {
return true;
}
} catch (\Exception) {
}


foreach ($ids as $key => $id) {
try {
$e = null;
if ($this->doDelete([$id])) {
continue;
}
} catch (\Exception $e) {
}
$message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
$ok = false;
}

return $ok;
}

public function invalidateTags(array $tags): bool
{
if (!$tags) {
return false;
}

$tagIds = [];
foreach (array_unique($tags) as $tag) {
$tagIds[] = $this->getId(self::TAGS_PREFIX.$tag);
}

try {
if ($this->doInvalidate($tagIds)) {
return true;
}
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to invalidate tags: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
}

return false;
}




private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData): array
{
$addTagData = $removeTagData = [];
foreach ($values as $id => $value) {
foreach ($value['tag-operations']['add'] as $tag => $tagId) {
$addTagData[$tagId][] = $id;
}

foreach ($value['tag-operations']['remove'] as $tag => $tagId) {
$removeTagData[$tagId][] = $id;
}

unset($values[$id]['tag-operations']);
}

return $values;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\Marshaller\TagAwareMarshaller;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\Traits\FilesystemTrait;







class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface
{
use FilesystemTrait {
prune as private doPrune;
doClear as private doClearCache;
doSave as private doSaveCache;
}




private const TAG_FOLDER = 'tags';

public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, ?MarshallerInterface $marshaller = null)
{
$this->marshaller = new TagAwareMarshaller($marshaller);
parent::__construct('', $defaultLifetime);
$this->init($namespace, $directory);
}

public function prune(): bool
{
$ok = $this->doPrune();

set_error_handler(static function () {});
$chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

try {
foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) {
$dir .= \DIRECTORY_SEPARATOR;
$keepDir = false;
for ($i = 0; $i < 38; ++$i) {
if (!is_dir($dir.$chars[$i])) {
continue;
}
for ($j = 0; $j < 38; ++$j) {
if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
continue;
}
foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) {
if ('.' === $link || '..' === $link) {
continue;
}
if ('_' !== $dir[-2] && realpath($d.\DIRECTORY_SEPARATOR.$link)) {
$keepDir = true;
} else {
unlink($d.\DIRECTORY_SEPARATOR.$link);
}
}
$keepDir ?: rmdir($d);
}
$keepDir ?: rmdir($dir.$chars[$i]);
}
$keepDir ?: rmdir($dir);
}
} finally {
restore_error_handler();
}

return $ok;
}

protected function doClear(string $namespace): bool
{
$ok = $this->doClearCache($namespace);

if ('' !== $namespace) {
return $ok;
}

set_error_handler(static function () {});
$chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

$this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));

try {
foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) {
if (rename($dir, $renamed = substr_replace($dir, $this->tmpSuffix.'_', -9))) {
$dir = $renamed.\DIRECTORY_SEPARATOR;
} else {
$dir .= \DIRECTORY_SEPARATOR;
$renamed = null;
}

for ($i = 0; $i < 38; ++$i) {
if (!is_dir($dir.$chars[$i])) {
continue;
}
for ($j = 0; $j < 38; ++$j) {
if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
continue;
}
foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) {
if ('.' !== $link && '..' !== $link && (null !== $renamed || !realpath($d.\DIRECTORY_SEPARATOR.$link))) {
unlink($d.\DIRECTORY_SEPARATOR.$link);
}
}
null === $renamed ?: rmdir($d);
}
null === $renamed ?: rmdir($dir.$chars[$i]);
}
null === $renamed ?: rmdir($renamed);
}
} finally {
restore_error_handler();
}

return $ok;
}

protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array
{
$failed = $this->doSaveCache($values, $lifetime);


foreach ($addTagData as $tagId => $ids) {
$tagFolder = $this->getTagFolder($tagId);
foreach ($ids as $id) {
if ($failed && \in_array($id, $failed, true)) {
continue;
}

$file = $this->getFile($id);

if (!@symlink($file, $tagLink = $this->getFile($id, true, $tagFolder)) && !is_link($tagLink)) {
@unlink($file);
$failed[] = $id;
}
}
}


foreach ($removeTagData as $tagId => $ids) {
$tagFolder = $this->getTagFolder($tagId);
foreach ($ids as $id) {
if ($failed && \in_array($id, $failed, true)) {
continue;
}

@unlink($this->getFile($id, false, $tagFolder));
}
}

return $failed;
}

protected function doDeleteYieldTags(array $ids): iterable
{
foreach ($ids as $id) {
$file = $this->getFile($id);
if (!is_file($file) || !$h = @fopen($file, 'r')) {
continue;
}

if (!@unlink($file)) {
fclose($h);
continue;
}

$meta = explode("\n", fread($h, 4096), 3)[2] ?? '';


if (13 < \strlen($meta) && "\x9D" === $meta[0] && "\0" === $meta[5] && "\x5F" === $meta[9]) {
$meta[9] = "\0";
$tagLen = unpack('Nlen', $meta, 9)['len'];
$meta = substr($meta, 13, $tagLen);

if (0 < $tagLen -= \strlen($meta)) {
$meta .= fread($h, $tagLen);
}

try {
yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta);
} catch (\Exception) {
yield $id => [];
}
}

fclose($h);
}
}

protected function doDeleteTagRelations(array $tagData): bool
{
foreach ($tagData as $tagId => $idList) {
$tagFolder = $this->getTagFolder($tagId);
foreach ($idList as $id) {
@unlink($this->getFile($id, false, $tagFolder));
}
}

return true;
}

protected function doInvalidate(array $tagIds): bool
{
foreach ($tagIds as $tagId) {
if (!is_dir($tagFolder = $this->getTagFolder($tagId))) {
continue;
}

$this->tmpSuffix ??= str_replace('/', '-', base64_encode(random_bytes(6)));

set_error_handler(static function () {});

try {
if (rename($tagFolder, $renamed = substr_replace($tagFolder, $this->tmpSuffix.'_', -10))) {
$tagFolder = $renamed.\DIRECTORY_SEPARATOR;
} else {
$renamed = null;
}

foreach ($this->scanHashDir($tagFolder) as $itemLink) {
unlink(realpath($itemLink) ?: $itemLink);
unlink($itemLink);
}

if (null === $renamed) {
continue;
}

$chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

for ($i = 0; $i < 38; ++$i) {
for ($j = 0; $j < 38; ++$j) {
rmdir($tagFolder.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j]);
}
rmdir($tagFolder.$chars[$i]);
}
rmdir($renamed);
} finally {
restore_error_handler();
}
}

return true;
}

private function getTagFolder(string $tagId): string
{
return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Doctrine\DBAL\ArrayParameterType;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\Exception\TableNotFoundException;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\ServerVersionProvider;
use Doctrine\DBAL\Tools\DsnParser;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\PruneableInterface;

class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface
{
private const MAX_KEY_LENGTH = 255;

private MarshallerInterface $marshaller;
private Connection $conn;
private string $platformName;
private string $serverVersion;
private string $table = 'cache_items';
private string $idCol = 'item_id';
private string $dataCol = 'item_data';
private string $lifetimeCol = 'item_lifetime';
private string $timeCol = 'item_time';
private string $namespace;

















public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null)
{
if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
}

if ($connOrDsn instanceof Connection) {
$this->conn = $connOrDsn;
} else {
if (!class_exists(DriverManager::class)) {
throw new InvalidArgumentException('Failed to parse DSN. Try running "composer require doctrine/dbal".');
}
if (class_exists(DsnParser::class)) {
$params = (new DsnParser([
'db2' => 'ibm_db2',
'mssql' => 'pdo_sqlsrv',
'mysql' => 'pdo_mysql',
'mysql2' => 'pdo_mysql',
'postgres' => 'pdo_pgsql',
'postgresql' => 'pdo_pgsql',
'pgsql' => 'pdo_pgsql',
'sqlite' => 'pdo_sqlite',
'sqlite3' => 'pdo_sqlite',
]))->parse($connOrDsn);
} else {
$params = ['url' => $connOrDsn];
}

$config = new Configuration();
if (class_exists(DefaultSchemaManagerFactory::class)) {
$config->setSchemaManagerFactory(new DefaultSchemaManagerFactory());
}

$this->conn = DriverManager::getConnection($params, $config);
}

$this->maxIdLength = self::MAX_KEY_LENGTH;
$this->table = $options['db_table'] ?? $this->table;
$this->idCol = $options['db_id_col'] ?? $this->idCol;
$this->dataCol = $options['db_data_col'] ?? $this->dataCol;
$this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;
$this->timeCol = $options['db_time_col'] ?? $this->timeCol;
$this->namespace = $namespace;
$this->marshaller = $marshaller ?? new DefaultMarshaller();

parent::__construct($namespace, $defaultLifetime);
}









public function createTable(): void
{
$schema = new Schema();
$this->addTableToSchema($schema);

foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) {
$this->conn->executeStatement($sql);
}
}




public function configureSchema(Schema $schema, Connection $forConnection): void
{
if ($schema->hasTable($this->table)) {
return;
}

$isSameDatabase = 2 < \func_num_args() ? func_get_arg(2) : static fn () => false;

if ($forConnection !== $this->conn && !$isSameDatabase($this->conn->executeStatement(...))) {
return;
}

$this->addTableToSchema($schema);
}

public function prune(): bool
{
$deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ?";
$params = [time()];
$paramTypes = [ParameterType::INTEGER];

if ('' !== $this->namespace) {
$deleteSql .= " AND $this->idCol LIKE ?";
$params[] = \sprintf('%s%%', $this->namespace);
$paramTypes[] = ParameterType::STRING;
}

try {
$this->conn->executeStatement($deleteSql, $params, $paramTypes);
} catch (TableNotFoundException) {
}

return true;
}

protected function doFetch(array $ids): iterable
{
$now = time();
$expired = [];

$sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN (?)";
$result = $this->conn->executeQuery($sql, [
$now,
$ids,
], [
ParameterType::INTEGER,
class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY,
])->iterateNumeric();

foreach ($result as $row) {
if (null === $row[1]) {
$expired[] = $row[0];
} else {
yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
}
}

if ($expired) {
$sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN (?)";
$this->conn->executeStatement($sql, [
$now,
$expired,
], [
ParameterType::INTEGER,
class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY,
]);
}
}

protected function doHave(string $id): bool
{
$sql = "SELECT 1 FROM $this->table WHERE $this->idCol = ? AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ?)";
$result = $this->conn->executeQuery($sql, [
$id,
time(),
], [
ParameterType::STRING,
ParameterType::INTEGER,
]);

return (bool) $result->fetchOne();
}

protected function doClear(string $namespace): bool
{
if ('' === $namespace) {
$sql = $this->conn->getDatabasePlatform()->getTruncateTableSQL($this->table);
} else {
$sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
}

try {
$this->conn->executeStatement($sql);
} catch (TableNotFoundException) {
}

return true;
}

protected function doDelete(array $ids): bool
{
$sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)";
try {
$this->conn->executeStatement($sql, [array_values($ids)], [class_exists(ArrayParameterType::class) ? ArrayParameterType::STRING : Connection::PARAM_STR_ARRAY]);
} catch (TableNotFoundException) {
}

return true;
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

$platformName = $this->getPlatformName();
$insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)";

switch (true) {
case 'mysql' === $platformName:
$sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
break;
case 'oci' === $platformName:

$sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
break;
case 'sqlsrv' === $platformName && version_compare($this->getServerVersion(), '10', '>='):


$sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
break;
case 'sqlite' === $platformName:
$sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
break;
case 'pgsql' === $platformName && version_compare($this->getServerVersion(), '9.5', '>='):
$sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
break;
default:
$platformName = null;
$sql = "UPDATE $this->table SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ? WHERE $this->idCol = ?";
break;
}

$now = time();
$lifetime = $lifetime ?: null;
try {
$stmt = $this->conn->prepare($sql);
} catch (TableNotFoundException) {
if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
$this->createTable();
}
$stmt = $this->conn->prepare($sql);
}

if ('sqlsrv' === $platformName || 'oci' === $platformName) {
$bind = static function ($id, $data) use ($stmt) {
$stmt->bindValue(1, $id);
$stmt->bindValue(2, $id);
$stmt->bindValue(3, $data, ParameterType::LARGE_OBJECT);
$stmt->bindValue(6, $data, ParameterType::LARGE_OBJECT);
};
$stmt->bindValue(4, $lifetime, ParameterType::INTEGER);
$stmt->bindValue(5, $now, ParameterType::INTEGER);
$stmt->bindValue(7, $lifetime, ParameterType::INTEGER);
$stmt->bindValue(8, $now, ParameterType::INTEGER);
} elseif (null !== $platformName) {
$bind = static function ($id, $data) use ($stmt) {
$stmt->bindValue(1, $id);
$stmt->bindValue(2, $data, ParameterType::LARGE_OBJECT);
};
$stmt->bindValue(3, $lifetime, ParameterType::INTEGER);
$stmt->bindValue(4, $now, ParameterType::INTEGER);
} else {
$stmt->bindValue(2, $lifetime, ParameterType::INTEGER);
$stmt->bindValue(3, $now, ParameterType::INTEGER);

$insertStmt = $this->conn->prepare($insertSql);
$insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER);
$insertStmt->bindValue(4, $now, ParameterType::INTEGER);

$bind = static function ($id, $data) use ($stmt, $insertStmt) {
$stmt->bindValue(1, $data, ParameterType::LARGE_OBJECT);
$stmt->bindValue(4, $id);
$insertStmt->bindValue(1, $id);
$insertStmt->bindValue(2, $data, ParameterType::LARGE_OBJECT);
};
}

foreach ($values as $id => $data) {
$bind($id, $data);
try {
$rowCount = $stmt->executeStatement();
} catch (TableNotFoundException) {
if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
$this->createTable();
}
$rowCount = $stmt->executeStatement();
}
if (null === $platformName && 0 === $rowCount) {
try {
$insertStmt->executeStatement();
} catch (DBALException) {

}
}
}

return $failed;
}




protected function getId(mixed $key): string
{
if ('pgsql' !== $this->platformName ??= $this->getPlatformName()) {
return parent::getId($key);
}

if (str_contains($key, "\0") || str_contains($key, '%') || !preg_match('//u', $key)) {
$key = rawurlencode($key);
}

return parent::getId($key);
}

private function getPlatformName(): string
{
if (isset($this->platformName)) {
return $this->platformName;
}

$platform = $this->conn->getDatabasePlatform();

return $this->platformName = match (true) {
$platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform,
$platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform => 'mysql',
$platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => 'sqlite',
$platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform,
$platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform => 'pgsql',
$platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => 'oci',
$platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform,
$platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform => 'sqlsrv',
default => $platform::class,
};
}

private function getServerVersion(): string
{
if (isset($this->serverVersion)) {
return $this->serverVersion;
}

if ($this->conn instanceof ServerVersionProvider || $this->conn instanceof ServerInfoAwareConnection) {
return $this->serverVersion = $this->conn->getServerVersion();
}


$conn = method_exists($this->conn, 'getNativeConnection') ? $this->conn->getNativeConnection() : $this->conn->getWrappedConnection();

return $this->serverVersion = $conn->getAttribute(\PDO::ATTR_SERVER_VERSION);
}

private function addTableToSchema(Schema $schema): void
{
$types = [
'mysql' => 'binary',
'sqlite' => 'text',
];

$table = $schema->createTable($this->table);
$table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]);
$table->addColumn($this->dataCol, 'blob', ['length' => 16777215]);
$table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]);
$table->addColumn($this->timeCol, 'integer', ['unsigned' => true]);
$table->setPrimaryKey([$this->idCol]);
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Contracts\Cache\CacheInterface;








class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface
{
use LoggerAwareTrait;

private bool $storeSerialized;
private array $values = [];
private array $tags = [];
private array $expiries = [];
private int $defaultLifetime;
private float $maxLifetime;
private int $maxItems;

private static \Closure $createCacheItem;




public function __construct(int $defaultLifetime = 0, bool $storeSerialized = true, float $maxLifetime = 0, int $maxItems = 0)
{
if (0 > $maxLifetime) {
throw new InvalidArgumentException(\sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime));
}

if (0 > $maxItems) {
throw new InvalidArgumentException(\sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems));
}

$this->defaultLifetime = $defaultLifetime;
$this->storeSerialized = $storeSerialized;
$this->maxLifetime = $maxLifetime;
$this->maxItems = $maxItems;
self::$createCacheItem ??= \Closure::bind(
static function ($key, $value, $isHit, $tags) {
$item = new CacheItem();
$item->key = $key;
$item->value = $value;
$item->isHit = $isHit;
if (null !== $tags) {
$item->metadata[CacheItem::METADATA_TAGS] = $tags;
}

return $item;
},
null,
CacheItem::class
);
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
$item = $this->getItem($key);
$metadata = $item->getMetadata();


if (\INF === $beta || !$item->isHit()) {
$save = true;
$item->set($callback($item, $save));
if ($save) {
$this->save($item);
}
}

return $item->get();
}

public function delete(string $key): bool
{
return $this->deleteItem($key);
}

public function hasItem(mixed $key): bool
{
if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) {
if ($this->maxItems) {

$value = $this->values[$key];
unset($this->values[$key]);
$this->values[$key] = $value;
}

return true;
}
\assert('' !== CacheItem::validateKey($key));

return isset($this->expiries[$key]) && !$this->deleteItem($key);
}

public function getItem(mixed $key): CacheItem
{
if (!$isHit = $this->hasItem($key)) {
$value = null;

if (!$this->maxItems) {

$this->values[$key] = null;
}
} else {
$value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];
}

return (self::$createCacheItem)($key, $value, $isHit, $this->tags[$key] ?? null);
}

public function getItems(array $keys = []): iterable
{
\assert(self::validateKeys($keys));

return $this->generateItems($keys, microtime(true), self::$createCacheItem);
}

public function deleteItem(mixed $key): bool
{
\assert('' !== CacheItem::validateKey($key));
unset($this->values[$key], $this->tags[$key], $this->expiries[$key]);

return true;
}

public function deleteItems(array $keys): bool
{
foreach ($keys as $key) {
$this->deleteItem($key);
}

return true;
}

public function save(CacheItemInterface $item): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$item = (array) $item;
$key = $item["\0*\0key"];
$value = $item["\0*\0value"];
$expiry = $item["\0*\0expiry"];

$now = microtime(true);

if (null !== $expiry) {
if (!$expiry) {
$expiry = \PHP_INT_MAX;
} elseif ($expiry <= $now) {
$this->deleteItem($key);

return true;
}
}
if ($this->storeSerialized && null === $value = $this->freeze($value, $key)) {
return false;
}
if (null === $expiry && 0 < $this->defaultLifetime) {
$expiry = $this->defaultLifetime;
$expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry);
} elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) {
$expiry = $now + $this->maxLifetime;
}

if ($this->maxItems) {
unset($this->values[$key], $this->tags[$key]);


foreach ($this->values as $k => $v) {
if ($this->expiries[$k] > $now && \count($this->values) < $this->maxItems) {
break;
}

unset($this->values[$k], $this->tags[$k], $this->expiries[$k]);
}
}

$this->values[$key] = $value;
$this->expiries[$key] = $expiry ?? \PHP_INT_MAX;

if (null === $this->tags[$key] = $item["\0*\0newMetadata"][CacheItem::METADATA_TAGS] ?? null) {
unset($this->tags[$key]);
}

return true;
}

public function saveDeferred(CacheItemInterface $item): bool
{
return $this->save($item);
}

public function commit(): bool
{
return true;
}

public function clear(string $prefix = ''): bool
{
if ('' !== $prefix) {
$now = microtime(true);

foreach ($this->values as $key => $value) {
if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || str_starts_with($key, $prefix)) {
unset($this->values[$key], $this->tags[$key], $this->expiries[$key]);
}
}

if ($this->values) {
return true;
}
}

$this->values = $this->tags = $this->expiries = [];

return true;
}




public function getValues(): array
{
if (!$this->storeSerialized) {
return $this->values;
}

$values = $this->values;
foreach ($values as $k => $v) {
if (null === $v || 'N;' === $v) {
continue;
}
if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) {
$values[$k] = serialize($v);
}
}

return $values;
}




public function reset()
{
$this->clear();
}

private function generateItems(array $keys, float $now, \Closure $f): \Generator
{
foreach ($keys as $i => $key) {
if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) {
$value = null;

if (!$this->maxItems) {

$this->values[$key] = null;
}
} else {
if ($this->maxItems) {

$value = $this->values[$key];
unset($this->values[$key]);
$this->values[$key] = $value;
}

$value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];
}
unset($keys[$i]);

yield $key => $f($key, $value, $isHit, $this->tags[$key] ?? null);
}

foreach ($keys as $key) {
yield $key => $f($key, null, false);
}
}

private function freeze($value, string $key): string|int|float|bool|array|\UnitEnum|null
{
if (null === $value) {
return 'N;';
}
if (\is_string($value)) {

if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {
return serialize($value);
}
} elseif (!\is_scalar($value)) {
try {
$serialized = serialize($value);
} catch (\Exception $e) {
if (!isset($this->expiries[$key])) {
unset($this->values[$key]);
}
$type = get_debug_type($value);
$message = \sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage());
CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);

return null;
}

if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) {
return $serialized;
}
}

return $value;
}

private function unfreeze(string $key, bool &$isHit): mixed
{
if ('N;' === $value = $this->values[$key]) {
return null;
}
if (\is_string($value) && isset($value[2]) && ':' === $value[1]) {
try {
$value = unserialize($value);
} catch (\Exception $e) {
CacheItem::log($this->logger, 'Failed to unserialize key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]);
$value = false;
}
if (false === $value) {
$value = null;
$isHit = false;

if (!$this->maxItems) {
$this->values[$key] = null;
}
}
}

return $value;
}

private function validateKeys(array $keys): bool
{
foreach ($keys as $key) {
if (!\is_string($key) || !isset($this->expiries[$key])) {
CacheItem::validateKey($key);
}
}

return true;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\Traits\CachedValueInterface;
use Symfony\Component\Cache\Traits\FilesystemCommonTrait;
use Symfony\Component\VarExporter\VarExporter;






class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface
{
use FilesystemCommonTrait {
doClear as private doCommonClear;
doDelete as private doCommonDelete;
}

private \Closure $includeHandler;
private bool $appendOnly;
private array $values = [];
private array $files = [];

private static int $startTime;
private static array $valuesCache = [];







public function __construct(string $namespace = '', int $defaultLifetime = 0, ?string $directory = null, bool $appendOnly = false)
{
$this->appendOnly = $appendOnly;
self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time();
parent::__construct('', $defaultLifetime);
$this->init($namespace, $directory);
$this->includeHandler = static function ($type, $msg, $file, $line) {
throw new \ErrorException($msg, 0, $type, $file, $line);
};
}




public static function isSupported()
{
self::$startTime ??= $_SERVER['REQUEST_TIME'] ?? time();

return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOL));
}

public function prune(): bool
{
$time = time();
$pruned = true;
$getExpiry = true;

set_error_handler($this->includeHandler);
try {
foreach ($this->scanHashDir($this->directory) as $file) {
try {
if (\is_array($expiresAt = include $file)) {
$expiresAt = $expiresAt[0];
}
} catch (\ErrorException $e) {
$expiresAt = $time;
}

if ($time >= $expiresAt) {
$pruned = ($this->doUnlink($file) || !file_exists($file)) && $pruned;
}
}
} finally {
restore_error_handler();
}

return $pruned;
}

protected function doFetch(array $ids): iterable
{
if ($this->appendOnly) {
$now = 0;
$missingIds = [];
} else {
$now = time();
$missingIds = $ids;
$ids = [];
}
$values = [];

begin:
$getExpiry = false;

foreach ($ids as $id) {
if (null === $value = $this->values[$id] ?? null) {
$missingIds[] = $id;
} elseif ('N;' === $value) {
$values[$id] = null;
} elseif (!\is_object($value)) {
$values[$id] = $value;
} elseif ($value instanceof CachedValueInterface) {
$values[$id] = $value->getValue();
} elseif (!$value instanceof LazyValue) {
$values[$id] = $value;
} elseif (false === $values[$id] = include $value->file) {
unset($values[$id], $this->values[$id]);
$missingIds[] = $id;
}
if (!$this->appendOnly) {
unset($this->values[$id]);
}
}

if (!$missingIds) {
return $values;
}

set_error_handler($this->includeHandler);
try {
$getExpiry = true;

foreach ($missingIds as $k => $id) {
try {
$file = $this->files[$id] ??= $this->getFile($id);

if (isset(self::$valuesCache[$file])) {
[$expiresAt, $this->values[$id]] = self::$valuesCache[$file];
} elseif (\is_array($expiresAt = include $file)) {
if ($this->appendOnly) {
self::$valuesCache[$file] = $expiresAt;
}

[$expiresAt, $this->values[$id]] = $expiresAt;
} elseif ($now < $expiresAt) {
$this->values[$id] = new LazyValue($file);
}

if ($now >= $expiresAt) {
unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]);
}
} catch (\ErrorException) {
unset($missingIds[$k]);
}
}
} finally {
restore_error_handler();
}

$ids = $missingIds;
$missingIds = [];
goto begin;
}

protected function doHave(string $id): bool
{
if ($this->appendOnly && isset($this->values[$id])) {
return true;
}

set_error_handler($this->includeHandler);
try {
$file = $this->files[$id] ??= $this->getFile($id);
$getExpiry = true;

if (isset(self::$valuesCache[$file])) {
[$expiresAt, $value] = self::$valuesCache[$file];
} elseif (\is_array($expiresAt = include $file)) {
if ($this->appendOnly) {
self::$valuesCache[$file] = $expiresAt;
}

[$expiresAt, $value] = $expiresAt;
} elseif ($this->appendOnly) {
$value = new LazyValue($file);
}
} catch (\ErrorException) {
return false;
} finally {
restore_error_handler();
}
if ($this->appendOnly) {
$now = 0;
$this->values[$id] = $value;
} else {
$now = time();
}

return $now < $expiresAt;
}

protected function doSave(array $values, int $lifetime): array|bool
{
$ok = true;
$expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX';
$allowCompile = self::isSupported();

foreach ($values as $key => $value) {
unset($this->values[$key]);
$isStaticValue = true;
if (null === $value) {
$value = "'N;'";
} elseif (\is_object($value) || \is_array($value)) {
try {
$value = VarExporter::export($value, $isStaticValue);
} catch (\Exception $e) {
throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e);
}
} elseif (\is_string($value)) {

if ('N;' === $value) {
$isStaticValue = false;
}
$value = var_export($value, true);
} elseif (!\is_scalar($value)) {
throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)));
} else {
$value = var_export($value, true);
}

$encodedKey = rawurlencode($key);

if ($isStaticValue) {
$value = "return [{$expiry}, {$value}];";
} elseif ($this->appendOnly) {
$value = "return [{$expiry}, new class() implements \\".CachedValueInterface::class." { public function getValue(): mixed { return {$value}; } }];";
} else {

$value = str_replace('\Symfony\Component\VarExporter\Internal\\', '', $value);
$value = "namespace Symfony\Component\VarExporter\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};";
}

$file = $this->files[$key] = $this->getFile($key, true);

$ok = $this->write($file, "<?php //{$encodedKey}\n\n{$value}\n", self::$startTime - 10) && $ok;

if ($allowCompile) {
@opcache_invalidate($file, true);
@opcache_compile_file($file);
}
unset(self::$valuesCache[$file]);
}

if (!$ok && !is_writable($this->directory)) {
throw new CacheException(\sprintf('Cache directory is not writable (%s).', $this->directory));
}

return $ok;
}

protected function doClear(string $namespace): bool
{
$this->values = [];

return $this->doCommonClear($namespace);
}

protected function doDelete(array $ids): bool
{
foreach ($ids as $id) {
unset($this->values[$id]);
}

return $this->doCommonDelete($ids);
}




protected function doUnlink(string $file)
{
unset(self::$valuesCache[$file]);

if (self::isSupported()) {
@opcache_invalidate($file, true);
}

return @unlink($file);
}

private function getFileKey(string $file): string
{
if (!$h = @fopen($file, 'r')) {
return '';
}

$encodedKey = substr(fgets($h), 8);
fclose($h);

return rawurldecode(rtrim($encodedKey));
}
}




class LazyValue
{
public string $file;

public function __construct(string $file)
{
$this->file = $file;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\InvalidArgumentException;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Contracts\Cache\TagAwareCacheInterface;













class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface
{
use ContractsTrait;
use LoggerAwareTrait;

public const TAGS_PREFIX = "\1tags\1";

private array $deferred = [];
private AdapterInterface $pool;
private AdapterInterface $tags;
private array $knownTagVersions = [];
private float $knownTagVersionsTtl;

private static \Closure $setCacheItemTags;
private static \Closure $setTagVersions;
private static \Closure $getTagsByKey;
private static \Closure $saveTags;

public function __construct(AdapterInterface $itemsPool, ?AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15)
{
$this->pool = $itemsPool;
$this->tags = $tagsPool ?? $itemsPool;
$this->knownTagVersionsTtl = $knownTagVersionsTtl;
self::$setCacheItemTags ??= \Closure::bind(
static function (array $items, array $itemTags) {
foreach ($items as $key => $item) {
$item->isTaggable = true;

if (isset($itemTags[$key])) {
$tags = array_keys($itemTags[$key]);
$item->metadata[CacheItem::METADATA_TAGS] = array_combine($tags, $tags);
} else {
$item->value = null;
$item->isHit = false;
$item->metadata = [];
}
}

return $items;
},
null,
CacheItem::class
);
self::$setTagVersions ??= \Closure::bind(
static function (array $items, array $tagVersions) {
foreach ($items as $item) {
$item->newMetadata[CacheItem::METADATA_TAGS] = array_intersect_key($tagVersions, $item->newMetadata[CacheItem::METADATA_TAGS] ?? []);
}
},
null,
CacheItem::class
);
self::$getTagsByKey ??= \Closure::bind(
static function ($deferred) {
$tagsByKey = [];
foreach ($deferred as $key => $item) {
$tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? [];
$item->metadata = $item->newMetadata;
}

return $tagsByKey;
},
null,
CacheItem::class
);
self::$saveTags ??= \Closure::bind(
static function (AdapterInterface $tagsAdapter, array $tags) {
ksort($tags);

foreach ($tags as $v) {
$v->expiry = 0;
$tagsAdapter->saveDeferred($v);
}

return $tagsAdapter->commit();
},
null,
CacheItem::class
);
}

public function invalidateTags(array $tags): bool
{
$ids = [];
foreach ($tags as $tag) {
\assert('' !== CacheItem::validateKey($tag));
unset($this->knownTagVersions[$tag]);
$ids[] = $tag.static::TAGS_PREFIX;
}

return !$tags || $this->tags->deleteItems($ids);
}

public function hasItem(mixed $key): bool
{
return $this->getItem($key)->isHit();
}

public function getItem(mixed $key): CacheItem
{
foreach ($this->getItems([$key]) as $item) {
return $item;
}
}

public function getItems(array $keys = []): iterable
{
$tagKeys = [];
$commit = false;

foreach ($keys as $key) {
if ('' !== $key && \is_string($key)) {
$commit = $commit || isset($this->deferred[$key]);
}
}

if ($commit) {
$this->commit();
}

try {
$items = $this->pool->getItems($keys);
} catch (InvalidArgumentException $e) {
$this->pool->getItems($keys); 

throw $e;
}

$bufferedItems = $itemTags = [];

foreach ($items as $key => $item) {
if (null !== $tags = $item->getMetadata()[CacheItem::METADATA_TAGS] ?? null) {
$itemTags[$key] = $tags;
}

$bufferedItems[$key] = $item;

if (null === $tags) {
$key = "\0tags\0".$key;
$tagKeys[$key] = $key; 
}
}

if ($tagKeys) {
foreach ($this->pool->getItems($tagKeys) as $key => $item) {
if ($item->isHit()) {
$itemTags[substr($key, \strlen("\0tags\0"))] = $item->get() ?: [];
}
}
}

$tagVersions = $this->getTagVersions($itemTags, false);
foreach ($itemTags as $key => $tags) {
foreach ($tags as $tag => $version) {
if ($tagVersions[$tag] !== $version) {
unset($itemTags[$key]);
continue 2;
}
}
}
$tagVersions = null;

return (self::$setCacheItemTags)($bufferedItems, $itemTags);
}

public function clear(string $prefix = ''): bool
{
if ('' !== $prefix) {
foreach ($this->deferred as $key => $item) {
if (str_starts_with($key, $prefix)) {
unset($this->deferred[$key]);
}
}
} else {
$this->deferred = [];
}

if ($this->pool instanceof AdapterInterface) {
return $this->pool->clear($prefix);
}

return $this->pool->clear();
}

public function deleteItem(mixed $key): bool
{
return $this->deleteItems([$key]);
}

public function deleteItems(array $keys): bool
{
foreach ($keys as $key) {
if ('' !== $key && \is_string($key)) {
$keys[] = "\0tags\0".$key; 
}
}

return $this->pool->deleteItems($keys);
}

public function save(CacheItemInterface $item): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$this->deferred[$item->getKey()] = $item;

return $this->commit();
}

public function saveDeferred(CacheItemInterface $item): bool
{
if (!$item instanceof CacheItem) {
return false;
}
$this->deferred[$item->getKey()] = $item;

return true;
}

public function commit(): bool
{
if (!$items = $this->deferred) {
return true;
}

$tagVersions = $this->getTagVersions((self::$getTagsByKey)($items), true);
(self::$setTagVersions)($items, $tagVersions);

$ok = true;
foreach ($items as $key => $item) {
if ($this->pool->saveDeferred($item)) {
unset($this->deferred[$key]);
} else {
$ok = false;
}
}
$ok = $this->pool->commit() && $ok;

$tagVersions = array_keys($tagVersions);
(self::$setTagVersions)($items, array_combine($tagVersions, $tagVersions));

return $ok;
}

public function prune(): bool
{
return $this->pool instanceof PruneableInterface && $this->pool->prune();
}




public function reset()
{
$this->commit();
$this->knownTagVersions = [];
$this->pool instanceof ResettableInterface && $this->pool->reset();
$this->tags instanceof ResettableInterface && $this->tags->reset();
}

public function __serialize(): array
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}

public function __unserialize(array $data): void
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}

public function __destruct()
{
$this->commit();
}

private function getTagVersions(array $tagsByKey, bool $persistTags): array
{
$tagVersions = [];
$fetchTagVersions = $persistTags;

foreach ($tagsByKey as $tags) {
$tagVersions += $tags;
if ($fetchTagVersions) {
continue;
}
foreach ($tags as $tag => $version) {
if ($tagVersions[$tag] !== $version) {
$fetchTagVersions = true;
}
}
}

if (!$tagVersions) {
return [];
}

$now = microtime(true);
$tags = [];
foreach ($tagVersions as $tag => $version) {
$tags[$tag.static::TAGS_PREFIX] = $tag;
$knownTagVersion = $this->knownTagVersions[$tag] ?? [0, null];
if ($fetchTagVersions || $now > $knownTagVersion[0] || $knownTagVersion[1] !== $version) {

$fetchTagVersions = true;
}
}

if (!$fetchTagVersions) {
return $tagVersions;
}

$newTags = [];
$newVersion = null;
$expiration = $now + $this->knownTagVersionsTtl;
foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) {
unset($this->knownTagVersions[$tag = $tags[$tag]]); 
if (null !== $tagVersions[$tag] = $version->get()) {
$this->knownTagVersions[$tag] = [$expiration, $tagVersions[$tag]];
} elseif ($persistTags) {
$newTags[$tag] = $version->set($newVersion ??= random_bytes(6));
$tagVersions[$tag] = $newVersion;
$this->knownTagVersions[$tag] = [$expiration, $newVersion];
}
}

if ($newTags) {
(self::$saveTags)($this->tags, $newTags);
}

while ($now > ($this->knownTagVersions[$tag = array_key_first($this->knownTagVersions) ?? ''][0] ?? \INF)) {
unset($this->knownTagVersions[$tag]);
}

return $tagVersions;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Couchbase\Bucket;
use Couchbase\Cluster;
use Couchbase\ClusterOptions;
use Couchbase\Collection;
use Couchbase\DocumentNotFoundException;
use Couchbase\UpsertOptions;
use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;




class CouchbaseCollectionAdapter extends AbstractAdapter
{
private const MAX_KEY_LENGTH = 250;

private Collection $connection;
private MarshallerInterface $marshaller;

public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)
{
if (!static::isSupported()) {
throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.');
}

$this->maxIdLength = static::MAX_KEY_LENGTH;

$this->connection = $connection;

parent::__construct($namespace, $defaultLifetime);
$this->enableVersioning();
$this->marshaller = $marshaller ?? new DefaultMarshaller();
}

public static function createConnection(#[\SensitiveParameter] array|string $dsn, array $options = []): Bucket|Collection
{
if (\is_string($dsn)) {
$dsn = [$dsn];
}

if (!static::isSupported()) {
throw new CacheException('Couchbase >= 3.0.5 < 4.0.0 is required.');
}

set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line));

$dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?'
.'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\/\?]+))(?:(?:\/(?<scopeName>[^\/]+))'
.'(?:\/(?<collectionName>[^\/\?]+)))?(?:\/)?(?:\?(?<options>.*))?$/i';

$newServers = [];
$protocol = 'couchbase';
try {
$username = $options['username'] ?? '';
$password = $options['password'] ?? '';

foreach ($dsn as $server) {
if (!str_starts_with($server, 'couchbase:')) {
throw new InvalidArgumentException('Invalid Couchbase DSN: it does not start with "couchbase:".');
}

preg_match($dsnPattern, $server, $matches);

$username = $matches['username'] ?: $username;
$password = $matches['password'] ?: $password;
$protocol = $matches['protocol'] ?: $protocol;

if (isset($matches['options'])) {
$optionsInDsn = self::getOptions($matches['options']);

foreach ($optionsInDsn as $parameter => $value) {
$options[$parameter] = $value;
}
}

$newServers[] = $matches['host'];
}

$option = isset($matches['options']) ? '?'.$matches['options'] : '';
$connectionString = $protocol.'://'.implode(',', $newServers).$option;

$clusterOptions = new ClusterOptions();
$clusterOptions->credentials($username, $password);

$client = new Cluster($connectionString, $clusterOptions);

$bucket = $client->bucket($matches['bucketName']);
$collection = $bucket->defaultCollection();
if (!empty($matches['scopeName'])) {
$scope = $bucket->scope($matches['scopeName']);
$collection = $scope->collection($matches['collectionName']);
}

return $collection;
} finally {
restore_error_handler();
}
}

public static function isSupported(): bool
{
return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '3.0.5', '>=') && version_compare(phpversion('couchbase'), '4.0', '<');
}

private static function getOptions(string $options): array
{
$results = [];
$optionsInArray = explode('&', $options);

foreach ($optionsInArray as $option) {
[$key, $value] = explode('=', $option);

$results[$key] = $value;
}

return $results;
}

protected function doFetch(array $ids): array
{
$results = [];
foreach ($ids as $id) {
try {
$resultCouchbase = $this->connection->get($id);
} catch (DocumentNotFoundException) {
continue;
}

$content = $resultCouchbase->value ?? $resultCouchbase->content();

$results[$id] = $this->marshaller->unmarshall($content);
}

return $results;
}

protected function doHave($id): bool
{
return $this->connection->exists($id)->exists();
}

protected function doClear($namespace): bool
{
return false;
}

protected function doDelete(array $ids): bool
{
$idsErrors = [];
foreach ($ids as $id) {
try {
$result = $this->connection->remove($id);

if (null === $result->mutationToken()) {
$idsErrors[] = $id;
}
} catch (DocumentNotFoundException) {
}
}

return 0 === \count($idsErrors);
}

protected function doSave(array $values, $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

$upsertOptions = new UpsertOptions();
$upsertOptions->expiry($lifetime);

$ko = [];
foreach ($values as $key => $value) {
try {
$this->connection->upsert($key, $value, $upsertOptions);
} catch (\Exception) {
$ko[$key] = '';
}
}

return [] === $ko ? true : $ko;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\AbstractAdapterTrait;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Contracts\Cache\CacheInterface;




abstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface
{
use AbstractAdapterTrait;
use ContractsTrait;




protected const NS_SEPARATOR = ':';

private static bool $apcuSupported;

protected function __construct(string $namespace = '', int $defaultLifetime = 0)
{
$this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR;
$this->defaultLifetime = $defaultLifetime;
if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) {
throw new InvalidArgumentException(\sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace));
}
self::$createCacheItem ??= \Closure::bind(
static function ($key, $value, $isHit) {
$item = new CacheItem();
$item->key = $key;
$item->value = $value;
$item->isHit = $isHit;
$item->unpack();

return $item;
},
null,
CacheItem::class
);
self::$mergeByLifetime ??= \Closure::bind(
static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) {
$byLifetime = [];
$now = microtime(true);
$expiredIds = [];

foreach ($deferred as $key => $item) {
$key = (string) $key;
if (null === $item->expiry) {
$ttl = 0 < $defaultLifetime ? $defaultLifetime : 0;
} elseif (!$item->expiry) {
$ttl = 0;
} elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) {
$expiredIds[] = $getId($key);
continue;
}
$byLifetime[$ttl][$getId($key)] = $item->pack();
}

return $byLifetime;
},
null,
CacheItem::class
);
}






public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, ?LoggerInterface $logger = null): AdapterInterface
{
$opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true);
if (null !== $logger) {
$opcache->setLogger($logger);
}

if (!self::$apcuSupported ??= ApcuAdapter::isSupported()) {
return $opcache;
}

if ('cli' === \PHP_SAPI && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL)) {
return $opcache;
}

$apcu = new ApcuAdapter($namespace, intdiv($defaultLifetime, 5), $version);
if (null !== $logger) {
$apcu->setLogger($logger);
}

return new ChainAdapter([$apcu, $opcache]);
}

public static function createConnection(#[\SensitiveParameter] string $dsn, array $options = []): mixed
{
if (str_starts_with($dsn, 'redis:') || str_starts_with($dsn, 'rediss:')) {
return RedisAdapter::createConnection($dsn, $options);
}
if (str_starts_with($dsn, 'memcached:')) {
return MemcachedAdapter::createConnection($dsn, $options);
}
if (str_starts_with($dsn, 'couchbase:')) {
if (CouchbaseBucketAdapter::isSupported()) {
return CouchbaseBucketAdapter::createConnection($dsn, $options);
}

return CouchbaseCollectionAdapter::createConnection($dsn, $options);
}

throw new InvalidArgumentException('Unsupported DSN: it does not start with "redis[s]:", "memcached:" nor "couchbase:".');
}

public function commit(): bool
{
$ok = true;
$byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, $this->getId(...), $this->defaultLifetime);
$retry = $this->deferred = [];

if ($expiredIds) {
try {
$this->doDelete($expiredIds);
} catch (\Exception $e) {
$ok = false;
CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]);
}
}
foreach ($byLifetime as $lifetime => $values) {
try {
$e = $this->doSave($values, $lifetime);
} catch (\Exception $e) {
}
if (true === $e || [] === $e) {
continue;
}
if (\is_array($e) || 1 === \count($values)) {
foreach (\is_array($e) ? $e : array_keys($values) as $id) {
$ok = false;
$v = $values[$id];
$type = get_debug_type($v);
$message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
}
} else {
foreach ($values as $id => $v) {
$retry[$lifetime][] = $id;
}
}
}


foreach ($retry as $lifetime => $ids) {
foreach ($ids as $id) {
try {
$v = $byLifetime[$lifetime][$id];
$e = $this->doSave([$id => $v], $lifetime);
} catch (\Exception $e) {
}
if (true === $e || [] === $e) {
continue;
}
$ok = false;
$type = get_debug_type($v);
$message = \sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.');
CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]);
}
}

return $ok;
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\Traits\RedisTrait;

class RedisAdapter extends AbstractAdapter
{
use RedisTrait;

public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|\Relay\Relay $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)
{
$this->init($redis, $namespace, $defaultLifetime, $marshaller);
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Service\ResetInterface;








class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
{
protected $pool;
private array $calls = [];

public function __construct(AdapterInterface $pool)
{
$this->pool = $pool;
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
if (!$this->pool instanceof CacheInterface) {
throw new \BadMethodCallException(\sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class));
}

$isHit = true;
$callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) {
$isHit = $item->isHit();

return $callback($item, $save);
};

$event = $this->start(__FUNCTION__);
try {
$value = $this->pool->get($key, $callback, $beta, $metadata);
$event->result[$key] = get_debug_type($value);
} finally {
$event->end = microtime(true);
}
if ($isHit) {
++$event->hits;
} else {
++$event->misses;
}

return $value;
}

public function getItem(mixed $key): CacheItem
{
$event = $this->start(__FUNCTION__);
try {
$item = $this->pool->getItem($key);
} finally {
$event->end = microtime(true);
}
if ($event->result[$key] = $item->isHit()) {
++$event->hits;
} else {
++$event->misses;
}

return $item;
}

public function hasItem(mixed $key): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result[$key] = $this->pool->hasItem($key);
} finally {
$event->end = microtime(true);
}
}

public function deleteItem(mixed $key): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result[$key] = $this->pool->deleteItem($key);
} finally {
$event->end = microtime(true);
}
}

public function save(CacheItemInterface $item): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result[$item->getKey()] = $this->pool->save($item);
} finally {
$event->end = microtime(true);
}
}

public function saveDeferred(CacheItemInterface $item): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result[$item->getKey()] = $this->pool->saveDeferred($item);
} finally {
$event->end = microtime(true);
}
}

public function getItems(array $keys = []): iterable
{
$event = $this->start(__FUNCTION__);
try {
$result = $this->pool->getItems($keys);
} finally {
$event->end = microtime(true);
}
$f = function () use ($result, $event) {
$event->result = [];
foreach ($result as $key => $item) {
if ($event->result[$key] = $item->isHit()) {
++$event->hits;
} else {
++$event->misses;
}
yield $key => $item;
}
};

return $f();
}

public function clear(string $prefix = ''): bool
{
$event = $this->start(__FUNCTION__);
try {
if ($this->pool instanceof AdapterInterface) {
return $event->result = $this->pool->clear($prefix);
}

return $event->result = $this->pool->clear();
} finally {
$event->end = microtime(true);
}
}

public function deleteItems(array $keys): bool
{
$event = $this->start(__FUNCTION__);
$event->result['keys'] = $keys;
try {
return $event->result['result'] = $this->pool->deleteItems($keys);
} finally {
$event->end = microtime(true);
}
}

public function commit(): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result = $this->pool->commit();
} finally {
$event->end = microtime(true);
}
}

public function prune(): bool
{
if (!$this->pool instanceof PruneableInterface) {
return false;
}
$event = $this->start(__FUNCTION__);
try {
return $event->result = $this->pool->prune();
} finally {
$event->end = microtime(true);
}
}




public function reset()
{
if ($this->pool instanceof ResetInterface) {
$this->pool->reset();
}

$this->clearCalls();
}

public function delete(string $key): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result[$key] = $this->pool->deleteItem($key);
} finally {
$event->end = microtime(true);
}
}




public function getCalls()
{
return $this->calls;
}




public function clearCalls()
{
$this->calls = [];
}

public function getPool(): AdapterInterface
{
return $this->pool;
}




protected function start(string $name)
{
$this->calls[] = $event = new TraceableAdapterEvent();
$event->name = $name;
$event->start = microtime(true);

return $event;
}
}




class TraceableAdapterEvent
{
public string $name;
public float $start;
public float $end;
public array|bool $result;
public int $hits = 0;
public int $misses = 0;
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\PruneableInterface;

class PdoAdapter extends AbstractAdapter implements PruneableInterface
{
private const MAX_KEY_LENGTH = 255;

private MarshallerInterface $marshaller;
private \PDO $conn;
private string $dsn;
private string $driver;
private string $serverVersion;
private string $table = 'cache_items';
private string $idCol = 'item_id';
private string $dataCol = 'item_data';
private string $lifetimeCol = 'item_lifetime';
private string $timeCol = 'item_time';
private ?string $username = null;
private ?string $password = null;
private array $connectionOptions = [];
private string $namespace;




















public function __construct(#[\SensitiveParameter] \PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], ?MarshallerInterface $marshaller = null)
{
if (\is_string($connOrDsn) && str_contains($connOrDsn, '://')) {
throw new InvalidArgumentException(\sprintf('Usage of Doctrine DBAL URL with "%s" is not supported. Use a PDO DSN or "%s" instead.', __CLASS__, DoctrineDbalAdapter::class));
}

if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
throw new InvalidArgumentException(\sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
}

if ($connOrDsn instanceof \PDO) {
if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
throw new InvalidArgumentException(\sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__));
}

$this->conn = $connOrDsn;
} else {
$this->dsn = $connOrDsn;
}

$this->maxIdLength = self::MAX_KEY_LENGTH;
$this->table = $options['db_table'] ?? $this->table;
$this->idCol = $options['db_id_col'] ?? $this->idCol;
$this->dataCol = $options['db_data_col'] ?? $this->dataCol;
$this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol;
$this->timeCol = $options['db_time_col'] ?? $this->timeCol;
$this->username = $options['db_username'] ?? $this->username;
$this->password = $options['db_password'] ?? $this->password;
$this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions;
$this->namespace = $namespace;
$this->marshaller = $marshaller ?? new DefaultMarshaller();

parent::__construct($namespace, $defaultLifetime);
}












public function createTable()
{
$sql = match ($driver = $this->getDriver()) {





'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB",
'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)",
'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)",
'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)",
'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)",
default => throw new \DomainException(\sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $driver)),
};

$this->getConnection()->exec($sql);
}

public function prune(): bool
{
$deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time";

if ('' !== $this->namespace) {
$deleteSql .= " AND $this->idCol LIKE :namespace";
}

$connection = $this->getConnection();

try {
$delete = $connection->prepare($deleteSql);
} catch (\PDOException) {
return true;
}
$delete->bindValue(':time', time(), \PDO::PARAM_INT);

if ('' !== $this->namespace) {
$delete->bindValue(':namespace', \sprintf('%s%%', $this->namespace), \PDO::PARAM_STR);
}
try {
return $delete->execute();
} catch (\PDOException) {
return true;
}
}

protected function doFetch(array $ids): iterable
{
$connection = $this->getConnection();

$now = time();
$expired = [];

$sql = str_pad('', (\count($ids) << 1) - 1, '?,');
$sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)";
$stmt = $connection->prepare($sql);
$stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
foreach ($ids as $id) {
$stmt->bindValue(++$i, $id);
}
$result = $stmt->execute();

if (\is_object($result)) {
$result = $result->iterateNumeric();
} else {
$stmt->setFetchMode(\PDO::FETCH_NUM);
$result = $stmt;
}

foreach ($result as $row) {
if (null === $row[1]) {
$expired[] = $row[0];
} else {
yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
}
}

if ($expired) {
$sql = str_pad('', (\count($expired) << 1) - 1, '?,');
$sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)";
$stmt = $connection->prepare($sql);
$stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
foreach ($expired as $id) {
$stmt->bindValue(++$i, $id);
}
$stmt->execute();
}
}

protected function doHave(string $id): bool
{
$connection = $this->getConnection();

$sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)";
$stmt = $connection->prepare($sql);

$stmt->bindValue(':id', $id);
$stmt->bindValue(':time', time(), \PDO::PARAM_INT);
$stmt->execute();

return (bool) $stmt->fetchColumn();
}

protected function doClear(string $namespace): bool
{
$conn = $this->getConnection();

if ('' === $namespace) {
if ('sqlite' === $this->getDriver()) {
$sql = "DELETE FROM $this->table";
} else {
$sql = "TRUNCATE TABLE $this->table";
}
} else {
$sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
}

try {
$conn->exec($sql);
} catch (\PDOException) {
}

return true;
}

protected function doDelete(array $ids): bool
{
$sql = str_pad('', (\count($ids) << 1) - 1, '?,');
$sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)";
try {
$stmt = $this->getConnection()->prepare($sql);
$stmt->execute(array_values($ids));
} catch (\PDOException) {
}

return true;
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

$conn = $this->getConnection();

$driver = $this->getDriver();
$insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";

switch (true) {
case 'mysql' === $driver:
$sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
break;
case 'oci' === $driver:

$sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
break;
case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='):


$sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
"WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
"WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
break;
case 'sqlite' === $driver:
$sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
break;
case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='):
$sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
break;
default:
$driver = null;
$sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id";
break;
}

$now = time();
$lifetime = $lifetime ?: null;
try {
$stmt = $conn->prepare($sql);
} catch (\PDOException $e) {
if ($this->isTableMissing($e) && (!$conn->inTransaction() || \in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) {
$this->createTable();
}
$stmt = $conn->prepare($sql);
}


if ('sqlsrv' === $driver || 'oci' === $driver) {
$stmt->bindParam(1, $id);
$stmt->bindParam(2, $id);
$stmt->bindParam(3, $data, \PDO::PARAM_LOB);
$stmt->bindValue(4, $lifetime, \PDO::PARAM_INT);
$stmt->bindValue(5, $now, \PDO::PARAM_INT);
$stmt->bindParam(6, $data, \PDO::PARAM_LOB);
$stmt->bindValue(7, $lifetime, \PDO::PARAM_INT);
$stmt->bindValue(8, $now, \PDO::PARAM_INT);
} else {
$stmt->bindParam(':id', $id);
$stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
$stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
$stmt->bindValue(':time', $now, \PDO::PARAM_INT);
}
if (null === $driver) {
$insertStmt = $conn->prepare($insertSql);

$insertStmt->bindParam(':id', $id);
$insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
$insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
$insertStmt->bindValue(':time', $now, \PDO::PARAM_INT);
}

foreach ($values as $id => $data) {
try {
$stmt->execute();
} catch (\PDOException $e) {
if ($this->isTableMissing($e) && (!$conn->inTransaction() || \in_array($driver, ['pgsql', 'sqlite', 'sqlsrv'], true))) {
$this->createTable();
}
$stmt->execute();
}
if (null === $driver && !$stmt->rowCount()) {
try {
$insertStmt->execute();
} catch (\PDOException) {

}
}
}

return $failed;
}




protected function getId(mixed $key): string
{
if ('pgsql' !== $this->getDriver()) {
return parent::getId($key);
}

if (str_contains($key, "\0") || str_contains($key, '%') || !preg_match('//u', $key)) {
$key = rawurlencode($key);
}

return parent::getId($key);
}

private function getConnection(): \PDO
{
if (!isset($this->conn)) {
$this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions);
$this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}

return $this->conn;
}

private function getDriver(): string
{
return $this->driver ??= $this->getConnection()->getAttribute(\PDO::ATTR_DRIVER_NAME);
}

private function getServerVersion(): string
{
return $this->serverVersion ??= $this->getConnection()->getAttribute(\PDO::ATTR_SERVER_VERSION);
}

private function isTableMissing(\PDOException $exception): bool
{
$driver = $this->getDriver();
[$sqlState, $code] = $exception->errorInfo ?? [null, $exception->getCode()];

return match ($driver) {
'pgsql' => '42P01' === $sqlState,
'sqlite' => str_contains($exception->getMessage(), 'no such table:'),
'oci' => 942 === $code,
'sqlsrv' => 208 === $code,
'mysql' => 1146 === $code,
default => false,
};
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Contracts\Cache\TagAwareCacheInterface;




class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface
{
public function __construct(TagAwareAdapterInterface $pool)
{
parent::__construct($pool);
}

public function invalidateTags(array $tags): bool
{
$event = $this->start(__FUNCTION__);
try {
return $event->result = $this->pool->invalidateTags($tags);
} finally {
$event->end = microtime(true);
}
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Contracts\Cache\CacheInterface;




class NullAdapter implements AdapterInterface, CacheInterface
{
private static \Closure $createCacheItem;

public function __construct()
{
self::$createCacheItem ??= \Closure::bind(
static function ($key) {
$item = new CacheItem();
$item->key = $key;
$item->isHit = false;

return $item;
},
null,
CacheItem::class
);
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
$save = true;

return $callback((self::$createCacheItem)($key), $save);
}

public function getItem(mixed $key): CacheItem
{
return (self::$createCacheItem)($key);
}

public function getItems(array $keys = []): iterable
{
return $this->generateItems($keys);
}

public function hasItem(mixed $key): bool
{
return false;
}

public function clear(string $prefix = ''): bool
{
return true;
}

public function deleteItem(mixed $key): bool
{
return true;
}

public function deleteItems(array $keys): bool
{
return true;
}

public function save(CacheItemInterface $item): bool
{
return true;
}

public function saveDeferred(CacheItemInterface $item): bool
{
return true;
}

public function commit(): bool
{
return true;
}

public function delete(string $key): bool
{
return $this->deleteItem($key);
}

private function generateItems(array $keys): \Generator
{
$f = self::$createCacheItem;

foreach ($keys as $key) {
yield $key => $f($key);
}
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\InvalidArgumentException;






interface TagAwareAdapterInterface extends AdapterInterface
{







public function invalidateTags(array $tags): bool;
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Service\ResetInterface;









class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
{
use ContractsTrait;

private array $adapters = [];
private int $adapterCount;
private int $defaultLifetime;

private static \Closure $syncItem;





public function __construct(array $adapters, int $defaultLifetime = 0)
{
if (!$adapters) {
throw new InvalidArgumentException('At least one adapter must be specified.');
}

foreach ($adapters as $adapter) {
if (!$adapter instanceof CacheItemPoolInterface) {
throw new InvalidArgumentException(\sprintf('The class "%s" does not implement the "%s" interface.', get_debug_type($adapter), CacheItemPoolInterface::class));
}
if ('cli' === \PHP_SAPI && $adapter instanceof ApcuAdapter && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOL)) {
continue; 
}

if ($adapter instanceof AdapterInterface) {
$this->adapters[] = $adapter;
} else {
$this->adapters[] = new ProxyAdapter($adapter);
}
}
$this->adapterCount = \count($this->adapters);
$this->defaultLifetime = $defaultLifetime;

self::$syncItem ??= \Closure::bind(
static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) {
$sourceItem->isTaggable = false;
$sourceMetadata ??= $sourceItem->metadata;

$item->value = $sourceItem->value;
$item->isHit = $sourceItem->isHit;
$item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata;

if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) {
$item->expiresAt(\DateTimeImmutable::createFromFormat('U.u', \sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY])));
} elseif (0 < $defaultLifetime) {
$item->expiresAfter($defaultLifetime);
}

return $item;
},
null,
CacheItem::class
);
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
$doSave = true;
$callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) {
$value = $callback($item, $save);
$doSave = $save;

return $value;
};

$wrap = function (?CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$doSave, &$metadata) {
static $lastItem;
static $i = 0;
$adapter = $this->adapters[$i];
if (isset($this->adapters[++$i])) {
$callback = $wrap;
$beta = \INF === $beta ? \INF : 0;
}
if ($adapter instanceof CacheInterface) {
$value = $adapter->get($key, $callback, $beta, $metadata);
} else {
$value = $this->doGet($adapter, $key, $callback, $beta, $metadata);
}
if (null !== $item) {
(self::$syncItem)($lastItem ??= $item, $item, $this->defaultLifetime, $metadata);
}
$save = $doSave;

return $value;
};

return $wrap();
}

public function getItem(mixed $key): CacheItem
{
$syncItem = self::$syncItem;
$misses = [];

foreach ($this->adapters as $i => $adapter) {
$item = $adapter->getItem($key);

if ($item->isHit()) {
while (0 <= --$i) {
$this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime));
}

return $item;
}

$misses[$i] = $item;
}

return $item;
}

public function getItems(array $keys = []): iterable
{
return $this->generateItems($this->adapters[0]->getItems($keys), 0);
}

private function generateItems(iterable $items, int $adapterIndex): \Generator
{
$missing = [];
$misses = [];
$nextAdapterIndex = $adapterIndex + 1;
$nextAdapter = $this->adapters[$nextAdapterIndex] ?? null;

foreach ($items as $k => $item) {
if (!$nextAdapter || $item->isHit()) {
yield $k => $item;
} else {
$missing[] = $k;
$misses[$k] = $item;
}
}

if ($missing) {
$syncItem = self::$syncItem;
$adapter = $this->adapters[$adapterIndex];
$items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex);

foreach ($items as $k => $item) {
if ($item->isHit()) {
$adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime));
}

yield $k => $item;
}
}
}

public function hasItem(mixed $key): bool
{
foreach ($this->adapters as $adapter) {
if ($adapter->hasItem($key)) {
return true;
}
}

return false;
}

public function clear(string $prefix = ''): bool
{
$cleared = true;
$i = $this->adapterCount;

while ($i--) {
if ($this->adapters[$i] instanceof AdapterInterface) {
$cleared = $this->adapters[$i]->clear($prefix) && $cleared;
} else {
$cleared = $this->adapters[$i]->clear() && $cleared;
}
}

return $cleared;
}

public function deleteItem(mixed $key): bool
{
$deleted = true;
$i = $this->adapterCount;

while ($i--) {
$deleted = $this->adapters[$i]->deleteItem($key) && $deleted;
}

return $deleted;
}

public function deleteItems(array $keys): bool
{
$deleted = true;
$i = $this->adapterCount;

while ($i--) {
$deleted = $this->adapters[$i]->deleteItems($keys) && $deleted;
}

return $deleted;
}

public function save(CacheItemInterface $item): bool
{
$saved = true;
$i = $this->adapterCount;

while ($i--) {
$saved = $this->adapters[$i]->save($item) && $saved;
}

return $saved;
}

public function saveDeferred(CacheItemInterface $item): bool
{
$saved = true;
$i = $this->adapterCount;

while ($i--) {
$saved = $this->adapters[$i]->saveDeferred($item) && $saved;
}

return $saved;
}

public function commit(): bool
{
$committed = true;
$i = $this->adapterCount;

while ($i--) {
$committed = $this->adapters[$i]->commit() && $committed;
}

return $committed;
}

public function prune(): bool
{
$pruned = true;

foreach ($this->adapters as $adapter) {
if ($adapter instanceof PruneableInterface) {
$pruned = $adapter->prune() && $pruned;
}
}

return $pruned;
}




public function reset()
{
foreach ($this->adapters as $adapter) {
if ($adapter instanceof ResetInterface) {
$adapter->reset();
}
}
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Predis\Connection\Aggregate\ClusterInterface;
use Predis\Connection\Aggregate\PredisCluster;
use Predis\Connection\Aggregate\ReplicationInterface;
use Predis\Connection\Replication\ReplicationInterface as Predis2ReplicationInterface;
use Predis\Response\ErrorInterface;
use Predis\Response\Status;
use Relay\Relay;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Exception\LogicException;
use Symfony\Component\Cache\Marshaller\DeflateMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;
use Symfony\Component\Cache\Marshaller\TagAwareMarshaller;
use Symfony\Component\Cache\Traits\RedisTrait;




















class RedisTagAwareAdapter extends AbstractTagAwareAdapter
{
use RedisTrait;





private const DEFAULT_CACHE_TTL = 8640000;




private string $redisEvictionPolicy;
private string $namespace;

public function __construct(\Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)
{
if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) {
throw new InvalidArgumentException(\sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection())));
}

$isRelay = $redis instanceof Relay;
if ($isRelay || \defined('Redis::OPT_COMPRESSION') && \in_array($redis::class, [\Redis::class, \RedisArray::class, \RedisCluster::class], true)) {
$compression = $redis->getOption($isRelay ? Relay::OPT_COMPRESSION : \Redis::OPT_COMPRESSION);

foreach (\is_array($compression) ? $compression : [$compression] as $c) {
if ($isRelay ? Relay::COMPRESSION_NONE : \Redis::COMPRESSION_NONE !== $c) {
throw new InvalidArgumentException(\sprintf('redis compression must be disabled when using "%s", use "%s" instead.', static::class, DeflateMarshaller::class));
}
}
}

$this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller));
$this->namespace = $namespace;
}

protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []): array
{
$eviction = $this->getRedisEvictionPolicy();
if ('noeviction' !== $eviction && !str_starts_with($eviction, 'volatile-')) {
throw new LogicException(\sprintf('Redis maxmemory-policy setting "%s" is *not* supported by RedisTagAwareAdapter, use "noeviction" or "volatile-*" eviction policies.', $eviction));
}


if (!$serialized = $this->marshaller->marshall($values, $failed)) {
return $failed;
}


$results = $this->pipeline(static function () use ($serialized, $lifetime, $addTagData, $delTagData, $failed) {

foreach ($serialized as $id => $value) {
yield 'setEx' => [
$id,
0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime,
$value,
];
}


foreach ($addTagData as $tagId => $ids) {
if (!$failed || $ids = array_diff($ids, $failed)) {
yield 'sAdd' => array_merge([$tagId], $ids);
}
}

foreach ($delTagData as $tagId => $ids) {
if (!$failed || $ids = array_diff($ids, $failed)) {
yield 'sRem' => array_merge([$tagId], $ids);
}
}
});

foreach ($results as $id => $result) {

if (is_numeric($result)) {
continue;
}

if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {
$failed[] = $id;
}
}

return $failed;
}

protected function doDeleteYieldTags(array $ids): iterable
{
$lua = <<<'EOLUA'
            local v = redis.call('GET', KEYS[1])
            local e = redis.pcall('UNLINK', KEYS[1])

            if type(e) ~= 'number' then
                redis.call('DEL', KEYS[1])
            end

            if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then
                return ''
            end

            return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536)
EOLUA;

$results = $this->pipeline(function () use ($ids, $lua) {
foreach ($ids as $id) {
yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1];
}
});

foreach ($results as $id => $result) {
if ($result instanceof \RedisException || $result instanceof \Relay\Exception || $result instanceof ErrorInterface) {
CacheItem::log($this->logger, 'Failed to delete key "{key}": '.$result->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $result]);

continue;
}

try {
yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result);
} catch (\Exception) {
yield $id => [];
}
}
}

protected function doDeleteTagRelations(array $tagData): bool
{
$results = $this->pipeline(static function () use ($tagData) {
foreach ($tagData as $tagId => $idList) {
array_unshift($idList, $tagId);
yield 'sRem' => $idList;
}
});
foreach ($results as $result) {

}

return true;
}

protected function doInvalidate(array $tagIds): bool
{






$lua = <<<'EOLUA'
            redis.replicate_commands()

            local cursor = '0'
            local id = KEYS[1]
            repeat
                local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000);
                cursor = result[1];
                local rems = {}

                for _, v in ipairs(result[2]) do
                    local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v)
                    if ok then
                        table.insert(rems, v)
                    end
                end
                if 0 < #rems then
                    redis.call('SREM', id, unpack(rems))
                end
            until '0' == cursor;

            redis.call('SUNIONSTORE', '{'..id..'}'..id, id)
            redis.call('DEL', id)

            return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000)
EOLUA;

$results = $this->pipeline(function () use ($tagIds, $lua) {
if ($this->redis instanceof \Predis\ClientInterface) {
$prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : '';
} elseif (\is_array($prefix = $this->redis->getOption($this->redis instanceof Relay ? Relay::OPT_PREFIX : \Redis::OPT_PREFIX) ?? '')) {
$prefix = current($prefix);
}

foreach ($tagIds as $id) {
yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1];
}
});

$lua = <<<'EOLUA'
            redis.replicate_commands()

            local id = KEYS[1]
            local cursor = table.remove(ARGV)
            redis.call('SREM', '{'..id..'}'..id, unpack(ARGV))

            return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000)
EOLUA;

$success = true;
foreach ($results as $id => $values) {
if ($values instanceof \RedisException || $values instanceof \Relay\Exception || $values instanceof ErrorInterface) {
CacheItem::log($this->logger, 'Failed to invalidate key "{key}": '.$values->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $values]);
$success = false;

continue;
}

[$cursor, $ids] = $values;

while ($ids || '0' !== $cursor) {
$this->doDelete($ids);

$evalArgs = [$id, $cursor];
array_splice($evalArgs, 1, 0, $ids);

if ($this->redis instanceof \Predis\ClientInterface) {
array_unshift($evalArgs, $lua, 1);
} else {
$evalArgs = [$lua, $evalArgs, 1];
}

$results = $this->pipeline(function () use ($evalArgs) {
yield 'eval' => $evalArgs;
});

foreach ($results as [$cursor, $ids]) {

}
}
}

return $success;
}

private function getRedisEvictionPolicy(): string
{
if (isset($this->redisEvictionPolicy)) {
return $this->redisEvictionPolicy;
}

$hosts = $this->getHosts();
$host = reset($hosts);
if ($host instanceof \Predis\Client) {
$connection = $host->getConnection();


if ($connection instanceof ReplicationInterface) {
$hosts = [$host->getClientFor('master')];
} elseif ($connection instanceof Predis2ReplicationInterface) {
$connection->switchToMaster();
$hosts = [$host];
}
}

foreach ($hosts as $host) {
$info = $host->info('Memory');

if (false === $info || null === $info || $info instanceof ErrorInterface) {
continue;
}

$info = $info['Memory'] ?? $info;

return $this->redisEvictionPolicy = $info['maxmemory_policy'] ?? '';
}

return $this->redisEvictionPolicy = '';
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\CacheItem;


class_exists(CacheItem::class);






interface AdapterInterface extends CacheItemPoolInterface
{
public function getItem(mixed $key): CacheItem;




public function getItems(array $keys = []): iterable;

public function clear(string $prefix = ''): bool;
}
<?php










namespace Symfony\Component\Cache\Adapter;




final class ParameterNormalizer
{
public static function normalizeDuration(string $duration): int
{
if (is_numeric($duration)) {
return $duration;
}

if (false !== $time = strtotime($duration, 0)) {
return $time;
}

try {
return \DateTimeImmutable::createFromFormat('U', 0)->add(new \DateInterval($duration))->getTimestamp();
} catch (\Exception $e) {
throw new \InvalidArgumentException(\sprintf('Cannot parse date interval "%s".', $duration), 0, $e);
}
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\SimpleCache\CacheInterface;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\ProxyTrait;






class Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface
{
use ProxyTrait;




protected const NS_SEPARATOR = '_';

private object $miss;

public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0)
{
parent::__construct($namespace, $defaultLifetime);

$this->pool = $pool;
$this->miss = new \stdClass();
}

protected function doFetch(array $ids): iterable
{
foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) {
if ($this->miss !== $value) {
yield $key => $value;
}
}
}

protected function doHave(string $id): bool
{
return $this->pool->has($id);
}

protected function doClear(string $namespace): bool
{
return $this->pool->clear();
}

protected function doDelete(array $ids): bool
{
return $this->pool->deleteMultiple($ids);
}

protected function doSave(array $values, int $lifetime): array|bool
{
return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime);
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\PruneableInterface;
use Symfony\Component\Cache\ResettableInterface;
use Symfony\Component\Cache\Traits\CachedValueInterface;
use Symfony\Component\Cache\Traits\ContractsTrait;
use Symfony\Component\Cache\Traits\ProxyTrait;
use Symfony\Component\VarExporter\VarExporter;
use Symfony\Contracts\Cache\CacheInterface;








class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface
{
use ContractsTrait;
use ProxyTrait;

private string $file;
private array $keys;
private array $values;

private static \Closure $createCacheItem;
private static array $valuesCache = [];





public function __construct(string $file, AdapterInterface $fallbackPool)
{
$this->file = $file;
$this->pool = $fallbackPool;
self::$createCacheItem ??= \Closure::bind(
static function ($key, $value, $isHit) {
$item = new CacheItem();
$item->key = $key;
$item->value = $value;
$item->isHit = $isHit;

return $item;
},
null,
CacheItem::class
);
}







public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface
{
if (!$fallbackPool instanceof AdapterInterface) {
$fallbackPool = new ProxyAdapter($fallbackPool);
}

return new static($file, $fallbackPool);
}

public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
if (!isset($this->values)) {
$this->initialize();
}
if (!isset($this->keys[$key])) {
get_from_pool:
if ($this->pool instanceof CacheInterface) {
return $this->pool->get($key, $callback, $beta, $metadata);
}

return $this->doGet($this->pool, $key, $callback, $beta, $metadata);
}
$value = $this->values[$this->keys[$key]];

if ('N;' === $value) {
return null;
}
if (!$value instanceof CachedValueInterface) {
return $value;
}
try {
return $value->getValue();
} catch (\Throwable) {
unset($this->keys[$key]);
goto get_from_pool;
}
}

public function getItem(mixed $key): CacheItem
{
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}
if (!isset($this->values)) {
$this->initialize();
}
if (!isset($this->keys[$key])) {
return $this->pool->getItem($key);
}

$value = $this->values[$this->keys[$key]];
$isHit = true;

if ('N;' === $value) {
$value = null;
} elseif ($value instanceof CachedValueInterface) {
try {
$value = $value->getValue();
} catch (\Throwable) {
$value = null;
$isHit = false;
}
}

return (self::$createCacheItem)($key, $value, $isHit);
}

public function getItems(array $keys = []): iterable
{
foreach ($keys as $key) {
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}
}
if (!isset($this->values)) {
$this->initialize();
}

return $this->generateItems($keys);
}

public function hasItem(mixed $key): bool
{
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}
if (!isset($this->values)) {
$this->initialize();
}

return isset($this->keys[$key]) || $this->pool->hasItem($key);
}

public function deleteItem(mixed $key): bool
{
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}
if (!isset($this->values)) {
$this->initialize();
}

return !isset($this->keys[$key]) && $this->pool->deleteItem($key);
}

public function deleteItems(array $keys): bool
{
$deleted = true;
$fallbackKeys = [];

foreach ($keys as $key) {
if (!\is_string($key)) {
throw new InvalidArgumentException(\sprintf('Cache key must be string, "%s" given.', get_debug_type($key)));
}

if (isset($this->keys[$key])) {
$deleted = false;
} else {
$fallbackKeys[] = $key;
}
}
if (!isset($this->values)) {
$this->initialize();
}

if ($fallbackKeys) {
$deleted = $this->pool->deleteItems($fallbackKeys) && $deleted;
}

return $deleted;
}

public function save(CacheItemInterface $item): bool
{
if (!isset($this->values)) {
$this->initialize();
}

return !isset($this->keys[$item->getKey()]) && $this->pool->save($item);
}

public function saveDeferred(CacheItemInterface $item): bool
{
if (!isset($this->values)) {
$this->initialize();
}

return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item);
}

public function commit(): bool
{
return $this->pool->commit();
}

public function clear(string $prefix = ''): bool
{
$this->keys = $this->values = [];

$cleared = @unlink($this->file) || !file_exists($this->file);
unset(self::$valuesCache[$this->file]);

if ($this->pool instanceof AdapterInterface) {
return $this->pool->clear($prefix) && $cleared;
}

return $this->pool->clear() && $cleared;
}








public function warmUp(array $values): array
{
if (file_exists($this->file)) {
if (!is_file($this->file)) {
throw new InvalidArgumentException(\sprintf('Cache path exists and is not a file: "%s".', $this->file));
}

if (!is_writable($this->file)) {
throw new InvalidArgumentException(\sprintf('Cache file is not writable: "%s".', $this->file));
}
} else {
$directory = \dirname($this->file);

if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {
throw new InvalidArgumentException(\sprintf('Cache directory does not exist and cannot be created: "%s".', $directory));
}

if (!is_writable($directory)) {
throw new InvalidArgumentException(\sprintf('Cache directory is not writable: "%s".', $directory));
}
}

$preload = [];
$dumpedValues = '';
$dumpedMap = [];
$dump = <<<'EOF'
<?php

// This file has been auto-generated by the Symfony Cache Component.

return [[


EOF;

foreach ($values as $key => $value) {
CacheItem::validateKey(\is_int($key) ? (string) $key : $key);
$isStaticValue = true;

if (null === $value) {
$value = "'N;'";
} elseif (\is_object($value) || \is_array($value)) {
try {
$value = VarExporter::export($value, $isStaticValue, $preload);
} catch (\Exception $e) {
throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e);
}
} elseif (\is_string($value)) {

if ('N;' === $value) {
$isStaticValue = false;
}
$value = var_export($value, true);
} elseif (!\is_scalar($value)) {
throw new InvalidArgumentException(\sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)));
} else {
$value = var_export($value, true);
}

if (!$isStaticValue) {
$value = 'new class() implements \\'.CachedValueInterface::class." { public function getValue(): mixed { return {$value}; } }";
}
$hash = hash('xxh128', $value);

if (null === $id = $dumpedMap[$hash] ?? null) {
$id = $dumpedMap[$hash] = \count($dumpedMap);
$dumpedValues .= "{$id} => {$value},\n";
}

$dump .= var_export($key, true)." => {$id},\n";
}

$dump .= "\n], [\n\n{$dumpedValues}\n]];\n";

$tmpFile = uniqid($this->file, true);

file_put_contents($tmpFile, $dump);
@chmod($tmpFile, 0666 & ~umask());
unset($serialized, $value, $dump);

@rename($tmpFile, $this->file);
unset(self::$valuesCache[$this->file]);

$this->initialize();

return $preload;
}




private function initialize(): void
{
if (isset(self::$valuesCache[$this->file])) {
$values = self::$valuesCache[$this->file];
} elseif (!is_file($this->file)) {
$this->keys = $this->values = [];

return;
} else {
$values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []];
}

if (2 !== \count($values) || !isset($values[0], $values[1])) {
$this->keys = $this->values = [];
} else {
[$this->keys, $this->values] = $values;
}
}

private function generateItems(array $keys): \Generator
{
$f = self::$createCacheItem;
$fallbackKeys = [];

foreach ($keys as $key) {
if (isset($this->keys[$key])) {
$value = $this->values[$this->keys[$key]];

if ('N;' === $value) {
yield $key => $f($key, null, true);
} elseif ($value instanceof CachedValueInterface) {
try {
yield $key => $f($key, $value->getValue(), true);
} catch (\Throwable) {
yield $key => $f($key, null, false);
}
} else {
yield $key => $f($key, $value, true);
}
} else {
$fallbackKeys[] = $key;
}
}

if ($fallbackKeys) {
yield from $this->pool->getItems($fallbackKeys);
}
}
}
<?php










namespace Symfony\Component\Cache\Adapter;

use Symfony\Component\Cache\Exception\CacheException;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
use Symfony\Component\Cache\Marshaller\MarshallerInterface;





class MemcachedAdapter extends AbstractAdapter
{





private const RESERVED_MEMCACHED = " \n\r\t\v\f\0";
private const RESERVED_PSR6 = '@()\{}/';
private const MAX_KEY_LENGTH = 250;

private MarshallerInterface $marshaller;
private \Memcached $client;
private \Memcached $lazyClient;











public function __construct(\Memcached $client, string $namespace = '', int $defaultLifetime = 0, ?MarshallerInterface $marshaller = null)
{
if (!static::isSupported()) {
throw new CacheException('Memcached > 3.1.5 is required.');
}
$this->maxIdLength = self::MAX_KEY_LENGTH;

if ('Memcached' === $client::class) {
$opt = $client->getOption(\Memcached::OPT_SERIALIZER);
if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
}
$this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY));
$this->client = $client;
} else {
$this->lazyClient = $client;
}

parent::__construct($namespace, $defaultLifetime);
$this->enableVersioning();
$this->marshaller = $marshaller ?? new DefaultMarshaller();
}




public static function isSupported()
{
return \extension_loaded('memcached') && version_compare(phpversion('memcached'), '3.1.6', '>=');
}














public static function createConnection(#[\SensitiveParameter] array|string $servers, array $options = []): \Memcached
{
if (\is_string($servers)) {
$servers = [$servers];
}
if (!static::isSupported()) {
throw new CacheException('Memcached > 3.1.5 is required.');
}
set_error_handler(static fn ($type, $msg, $file, $line) => throw new \ErrorException($msg, 0, $type, $file, $line));
try {
$client = new \Memcached($options['persistent_id'] ?? null);
$username = $options['username'] ?? null;
$password = $options['password'] ?? null;


foreach ($servers as $i => $dsn) {
if (\is_array($dsn)) {
continue;
}
if (!str_starts_with($dsn, 'memcached:')) {
throw new InvalidArgumentException('Invalid Memcached DSN: it does not start with "memcached:".');
}
$params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) {
if (!empty($m[2])) {
[$username, $password] = explode(':', $m[2], 2) + [1 => null];
$username = rawurldecode($username);
$password = null !== $password ? rawurldecode($password) : null;
}

return 'file:'.($m[1] ?? '');
}, $dsn);
if (false === $params = parse_url($params)) {
throw new InvalidArgumentException('Invalid Memcached DSN.');
}
$query = $hosts = [];
if (isset($params['query'])) {
parse_str($params['query'], $query);

if (isset($query['host'])) {
if (!\is_array($hosts = $query['host'])) {
throw new InvalidArgumentException('Invalid Memcached DSN: query parameter "host" must be an array.');
}
foreach ($hosts as $host => $weight) {
if (false === $port = strrpos($host, ':')) {
$hosts[$host] = [$host, 11211, (int) $weight];
} else {
$hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight];
}
}
$hosts = array_values($hosts);
unset($query['host']);
}
if ($hosts && !isset($params['host']) && !isset($params['path'])) {
unset($servers[$i]);
$servers = array_merge($servers, $hosts);
continue;
}
}
if (!isset($params['host']) && !isset($params['path'])) {
throw new InvalidArgumentException('Invalid Memcached DSN: missing host or path.');
}
if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
$params['weight'] = $m[1];
$params['path'] = substr($params['path'], 0, -\strlen($m[0]));
}
$params += [
'host' => $params['host'] ?? $params['path'],
'port' => isset($params['host']) ? 11211 : null,
'weight' => 0,
];
if ($query) {
$params += $query;
$options = $query + $options;
}

$servers[$i] = [$params['host'], $params['port'], $params['weight']];

if ($hosts) {
$servers = array_merge($servers, $hosts);
}
}


unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']);
$options = array_change_key_case($options, \CASE_UPPER);
$client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
$client->setOption(\Memcached::OPT_NO_BLOCK, true);
$client->setOption(\Memcached::OPT_TCP_NODELAY, true);
if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {
$client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
}
foreach ($options as $name => $value) {
if (\is_int($name)) {
continue;
}
if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) {
$value = \constant('Memcached::'.$name.'_'.strtoupper($value));
}
unset($options[$name]);

if (\defined('Memcached::OPT_'.$name)) {
$options[\constant('Memcached::OPT_'.$name)] = $value;
}
}
$client->setOptions($options + [\Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP]);


if (!$client->isPristine()) {
$oldServers = [];
foreach ($client->getServerList() as $server) {
$oldServers[] = [$server['host'], $server['port']];
}

$newServers = [];
foreach ($servers as $server) {
if (1 < \count($server)) {
$server = array_values($server);
unset($server[2]);
$server[1] = (int) $server[1];
}
$newServers[] = $server;
}

if ($oldServers !== $newServers) {
$client->resetServerList();
$client->addServers($servers);
}
} else {
$client->addServers($servers);
}

if (null !== $username || null !== $password) {
if (!method_exists($client, 'setSaslAuthData')) {
trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.');
}
$client->setSaslAuthData($username, $password);
}

return $client;
} finally {
restore_error_handler();
}
}

protected function doSave(array $values, int $lifetime): array|bool
{
if (!$values = $this->marshaller->marshall($values, $failed)) {
return $failed;
}

if ($lifetime && $lifetime > 30 * 86400) {
$lifetime += time();
}

$encodedValues = [];
foreach ($values as $key => $value) {
$encodedValues[self::encodeKey($key)] = $value;
}

return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false;
}

protected function doFetch(array $ids): iterable
{
try {
$encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);

$encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds));

$result = [];
foreach ($encodedResult as $key => $value) {
$result[self::decodeKey($key)] = $this->marshaller->unmarshall($value);
}

return $result;
} catch (\Error $e) {
throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine());
}
}

protected function doHave(string $id): bool
{
return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode());
}

protected function doDelete(array $ids): bool
{
$ok = true;
$encodedIds = array_map([__CLASS__, 'encodeKey'], $ids);
foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) {
if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) {
$ok = false;
}
}

return $ok;
}

protected function doClear(string $namespace): bool
{
return '' === $namespace && $this->getClient()->flush();
}

private function checkResultCode(mixed $result): mixed
{
$code = $this->client->getResultCode();

if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) {
return $result;
}

throw new CacheException('MemcachedAdapter client error: '.strtolower($this->client->getResultMessage()));
}

private function getClient(): \Memcached
{
if (isset($this->client)) {
return $this->client;
}

$opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER);
if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
}
if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) {
throw new CacheException(\sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix));
}

return $this->client = $this->lazyClient;
}

private static function encodeKey(string $key): string
{
return strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6);
}

private static function decodeKey(string $key): string
{
return strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED);
}
}
<?php










namespace Symfony\Component\Cache\DataCollector;

use Symfony\Component\Cache\Adapter\TraceableAdapter;
use Symfony\Component\Cache\Adapter\TraceableAdapterEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;







class CacheDataCollector extends DataCollector implements LateDataCollectorInterface
{



private array $instances = [];

public function addInstance(string $name, TraceableAdapter $instance): void
{
$this->instances[$name] = $instance;
}

public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
{
$this->lateCollect();
}

public function reset(): void
{
$this->data = [];
foreach ($this->instances as $instance) {
$instance->clearCalls();
}
}

public function lateCollect(): void
{
$empty = ['calls' => [], 'adapters' => [], 'config' => [], 'options' => [], 'statistics' => []];
$this->data = ['instances' => $empty, 'total' => $empty];
foreach ($this->instances as $name => $instance) {
$this->data['instances']['calls'][$name] = $instance->getCalls();
$this->data['instances']['adapters'][$name] = get_debug_type($instance->getPool());
}

$this->data['instances']['statistics'] = $this->calculateStatistics();
$this->data['total']['statistics'] = $this->calculateTotalStatistics();
$this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']);
}

public function getName(): string
{
return 'cache';
}




public function getStatistics(): array
{
return $this->data['instances']['statistics'];
}




public function getTotals(): array
{
return $this->data['total']['statistics'];
}




public function getCalls(): mixed
{
return $this->data['instances']['calls'];
}




public function getAdapters(): array
{
return $this->data['instances']['adapters'];
}

private function calculateStatistics(): array
{
$statistics = [];
foreach ($this->data['instances']['calls'] as $name => $calls) {
$statistics[$name] = [
'calls' => 0,
'time' => 0,
'reads' => 0,
'writes' => 0,
'deletes' => 0,
'hits' => 0,
'misses' => 0,
];

foreach ($calls as $call) {
++$statistics[$name]['calls'];
$statistics[$name]['time'] += ($call->end ?? microtime(true)) - $call->start;
if ('get' === $call->name) {
++$statistics[$name]['reads'];
if ($call->hits) {
++$statistics[$name]['hits'];
} else {
++$statistics[$name]['misses'];
++$statistics[$name]['writes'];
}
} elseif ('getItem' === $call->name) {
++$statistics[$name]['reads'];
if ($call->hits) {
++$statistics[$name]['hits'];
} else {
++$statistics[$name]['misses'];
}
} elseif ('getItems' === $call->name) {
$statistics[$name]['reads'] += $call->hits + $call->misses;
$statistics[$name]['hits'] += $call->hits;
$statistics[$name]['misses'] += $call->misses;
} elseif ('hasItem' === $call->name) {
++$statistics[$name]['reads'];
foreach ($call->result ?? [] as $result) {
++$statistics[$name][$result ? 'hits' : 'misses'];
}
} elseif ('save' === $call->name) {
++$statistics[$name]['writes'];
} elseif ('deleteItem' === $call->name) {
++$statistics[$name]['deletes'];
}
}
if ($statistics[$name]['reads']) {
$statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2);
} else {
$statistics[$name]['hit_read_ratio'] = null;
}
}

return $statistics;
}

private function calculateTotalStatistics(): array
{
$statistics = $this->getStatistics();
$totals = [
'calls' => 0,
'time' => 0,
'reads' => 0,
'writes' => 0,
'deletes' => 0,
'hits' => 0,
'misses' => 0,
];
foreach ($statistics as $name => $values) {
foreach ($totals as $key => $value) {
$totals[$key] += $statistics[$name][$key];
}
}
if ($totals['reads']) {
$totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2);
} else {
$totals['hit_read_ratio'] = null;
}

return $totals;
}
}
<?php










namespace Symfony\Component\Cache\Messenger;

use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\DependencyInjection\ReverseContainer;




final class EarlyExpirationMessage
{
private CacheItem $item;
private string $pool;
private string|array $callback;

public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self
{
try {
$item = clone $item;
$item->set(null);
} catch (\Exception) {
return null;
}

$pool = $reverseContainer->getId($pool);

if (\is_object($callback)) {
if (null === $id = $reverseContainer->getId($callback)) {
return null;
}

$callback = '@'.$id;
} elseif (!\is_array($callback)) {
$callback = (string) $callback;
} elseif (!\is_object($callback[0])) {
$callback = [(string) $callback[0], (string) $callback[1]];
} else {
if (null === $id = $reverseContainer->getId($callback[0])) {
return null;
}

$callback = ['@'.$id, (string) $callback[1]];
}

return new self($item, $pool, $callback);
}

public function getItem(): CacheItem
{
return $this->item;
}

public function getPool(): string
{
return $this->pool;
}




public function getCallback(): string|array
{
return $this->callback;
}

public function findPool(ReverseContainer $reverseContainer): AdapterInterface
{
return $reverseContainer->getService($this->pool);
}

public function findCallback(ReverseContainer $reverseContainer): callable
{
if (\is_string($callback = $this->callback)) {
return '@' === $callback[0] ? $reverseContainer->getService(substr($callback, 1)) : $callback;
}
if ('@' === $callback[0][0]) {
$callback[0] = $reverseContainer->getService(substr($callback[0], 1));
}

return $callback;
}

private function __construct(CacheItem $item, string $pool, string|array $callback)
{
$this->item = $item;
$this->pool = $pool;
$this->callback = $callback;
}
}
<?php










namespace Symfony\Component\Cache\Messenger;

use Psr\Log\LoggerInterface;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\CacheItem;
use Symfony\Component\DependencyInjection\ReverseContainer;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\HandledStamp;




class EarlyExpirationDispatcher
{
private MessageBusInterface $bus;
private ReverseContainer $reverseContainer;
private ?\Closure $callbackWrapper;

public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, ?callable $callbackWrapper = null)
{
$this->bus = $bus;
$this->reverseContainer = $reverseContainer;
$this->callbackWrapper = null === $callbackWrapper ? null : $callbackWrapper(...);
}




public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger = null)
{
if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) {

$logger?->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]);

return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save);
}

$envelope = $this->bus->dispatch($message);

if ($logger) {
if ($envelope->last(HandledStamp::class)) {
$logger->info('Item "{key}" was computed online', ['key' => $item->getKey()]);
} else {
$logger->info('Item "{key}" sent for recomputation', ['key' => $item->getKey()]);
}
}


$save = false;

return $message->getItem()->get() ?? $item->get();
}
}
<?php










namespace Symfony\Component\Cache\Messenger;

use Symfony\Component\Cache\CacheItem;
use Symfony\Component\DependencyInjection\ReverseContainer;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;




#[AsMessageHandler]
class EarlyExpirationHandler
{
private ReverseContainer $reverseContainer;
private array $processedNonces = [];

public function __construct(ReverseContainer $reverseContainer)
{
$this->reverseContainer = $reverseContainer;
}




public function __invoke(EarlyExpirationMessage $message)
{
$item = $message->getItem();
$metadata = $item->getMetadata();
$expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0;
$ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0;

if ($expiry && $ctime) {


$processingNonce = [$expiry, $ctime];
$pool = $message->getPool();
$key = $item->getKey();

if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) {
return;
}

if (microtime(true) >= $expiry) {
return;
}

$this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []);

if (\count($this->processedNonces[$pool]) > 100) {
array_pop($this->processedNonces[$pool]);
}
}

static $setMetadata;

$setMetadata ??= \Closure::bind(
function (CacheItem $item, float $startTime) {
if ($item->expiry > $endTime = microtime(true)) {
$item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
$item->newMetadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));
}
},
null,
CacheItem::class
);

$startTime = microtime(true);
$pool = $message->findPool($this->reverseContainer);
$callback = $message->findCallback($this->reverseContainer);
$save = true;
$value = $callback($item, $save);
$setMetadata($item, $startTime);
$pool->save($item->set($value));
}
}
<?php










namespace Symfony\Component\Cache;

use Psr\Log\LoggerInterface;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;










final class LockRegistry
{
private static array $openedFiles = [];
private static ?array $lockedFiles = null;
private static \Exception $signalingException;
private static \Closure $signalingCallback;




private static array $files = [
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractTagAwareAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AdapterInterface.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ApcuAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ArrayAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'MemcachedAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'NullAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ParameterNormalizer.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PdoAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpArrayAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpFilesAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ProxyAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'Psr16Adapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisTagAwareAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapterInterface.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableTagAwareAdapter.php',
];






public static function setFiles(array $files): array
{
$previousFiles = self::$files;
self::$files = $files;

foreach (self::$openedFiles as $file) {
if ($file) {
flock($file, \LOCK_UN);
fclose($file);
}
}
self::$openedFiles = self::$lockedFiles = [];

return $previousFiles;
}

public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, ?\Closure $setMetadata = null, ?LoggerInterface $logger = null): mixed
{
if ('\\' === \DIRECTORY_SEPARATOR && null === self::$lockedFiles) {

self::$files = self::$lockedFiles = [];
}

$key = self::$files ? abs(crc32($item->getKey())) % \count(self::$files) : -1;

if ($key < 0 || self::$lockedFiles || !$lock = self::open($key)) {
return $callback($item, $save);
}

self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}");
self::$signalingCallback ??= fn () => throw self::$signalingException;

while (true) {
try {

$locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock);

if ($locked || !$wouldBlock) {
$logger?->info(\sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);
self::$lockedFiles[$key] = true;

$value = $callback($item, $save);

if ($save) {
if ($setMetadata) {
$setMetadata($item);
}

$pool->save($item->set($value));
$save = false;
}

return $value;
}

$logger?->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]);
flock($lock, \LOCK_SH);
} finally {
flock($lock, \LOCK_UN);
unset(self::$lockedFiles[$key]);
}

try {
$value = $pool->get($item->getKey(), self::$signalingCallback, 0);
$logger?->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]);
$save = false;

return $value;
} catch (\Exception $e) {
if (self::$signalingException !== $e) {
throw $e;
}
$logger?->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]);
}
}

return null;
}




private static function open(int $key)
{
if (null !== $h = self::$openedFiles[$key] ?? null) {
return $h;
}
set_error_handler(static fn () => null);
try {
$h = fopen(self::$files[$key], 'r+');
} finally {
restore_error_handler();
}

return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r');
}
}
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\CacheItemInterface;
use Psr\Cache\InvalidArgumentException;






interface CacheInterface
{
/**
@template




















*/
public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed;










public function delete(string $key): bool;
}
Copyright (c) 2018-present 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.
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\CacheItemPoolInterface;
use Psr\Cache\InvalidArgumentException;
use Psr\Log\LoggerInterface;


class_exists(InvalidArgumentException::class);






trait CacheTrait
{
public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{
return $this->doGet($this, $key, $callback, $beta, $metadata);
}

public function delete(string $key): bool
{
return $this->deleteItem($key);
}

private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, ?array &$metadata = null, ?LoggerInterface $logger = null): mixed
{
if (0 > $beta ??= 1.0) {
throw new class(\sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException {};
}

$item = $pool->getItem($key);
$recompute = !$item->isHit() || \INF === $beta;
$metadata = $item instanceof ItemInterface ? $item->getMetadata() : [];

if (!$recompute && $metadata) {
$expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false;
$ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false;

if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) {

$item->expiresAt(null);
$logger?->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [
'key' => $key,
'delta' => \sprintf('%.1f', $expiry - $now),
]);
}
}

if ($recompute) {
$save = true;
$item->set($callback($item, $save));
if ($save) {
$pool->save($item);
}
}

return $item->get();
}
}
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\CacheException;
use Psr\Cache\CacheItemInterface;
use Psr\Cache\InvalidArgumentException;






interface ItemInterface extends CacheItemInterface
{



public const METADATA_EXPIRY = 'expiry';




public const METADATA_CTIME = 'ctime';




public const METADATA_TAGS = 'tags';




public const RESERVED_CHARACTERS = '{}()/\@:';













public function tag(string|iterable $tags): static;






public function getMetadata(): array;
}
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\CacheItemInterface;

/**
@template




*/
interface CallbackInterface
{






public function __invoke(CacheItemInterface $item, bool &$save): mixed;
}
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\InvalidArgumentException;










interface NamespacedPoolInterface
{



public function withSubNamespace(string $namespace): static;
}
<?php










namespace Symfony\Contracts\Cache;

use Psr\Cache\InvalidArgumentException;






interface TagAwareCacheInterface extends CacheInterface
{














public function invalidateTags(array $tags): bool;
}
Copyright (c) 2018-present 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.
<?php










namespace Symfony\Contracts\Translation\Test;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use PHPUnit\Framework\TestCase;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorTrait;














class TranslatorTest extends TestCase
{
private string $defaultLocale;

protected function setUp(): void
{
$this->defaultLocale = \Locale::getDefault();
\Locale::setDefault('en');
}

protected function tearDown(): void
{
\Locale::setDefault($this->defaultLocale);
}

public function getTranslator(): TranslatorInterface
{
return new class implements TranslatorInterface {
use TranslatorTrait;
};
}

/**
@dataProvider
*/
#[DataProvider('getTransTests')]
public function testTrans($expected, $id, $parameters)
{
$translator = $this->getTranslator();

$this->assertEquals($expected, $translator->trans($id, $parameters));
}

/**
@dataProvider
*/
#[DataProvider('getTransChoiceTests')]
public function testTransChoiceWithExplicitLocale($expected, $id, $number)
{
$translator = $this->getTranslator();

$this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
}

/**
@requires
@dataProvider

*/
#[DataProvider('getTransChoiceTests')]
#[RequiresPhpExtension('intl')]
public function testTransChoiceWithDefaultLocale($expected, $id, $number)
{
$translator = $this->getTranslator();

$this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
}

/**
@dataProvider
*/
#[DataProvider('getTransChoiceTests')]
public function testTransChoiceWithEnUsPosix($expected, $id, $number)
{
$translator = $this->getTranslator();
$translator->setLocale('en_US_POSIX');

$this->assertEquals($expected, $translator->trans($id, ['%count%' => $number]));
}

public function testGetSetLocale()
{
$translator = $this->getTranslator();

$this->assertEquals('en', $translator->getLocale());
}

/**
@requires
*/
#[RequiresPhpExtension('intl')]
public function testGetLocaleReturnsDefaultLocaleIfNotSet()
{
$translator = $this->getTranslator();

\Locale::setDefault('pt_BR');
$this->assertEquals('pt_BR', $translator->getLocale());

\Locale::setDefault('en');
$this->assertEquals('en', $translator->getLocale());
}

public static function getTransTests()
{
return [
['Symfony is great!', 'Symfony is great!', []],
['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']],
];
}

public static function getTransChoiceTests()
{
return [
['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1],
['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
['There are 0 apples', 'There is 1 apple|There are %count% apples', 0],
['There is 1 apple', 'There is 1 apple|There are %count% apples', 1],
['There are 10 apples', 'There is 1 apple|There are %count% apples', 10],

['There are 2 apples', 'There are 2 apples', 2],
];
}

/**
@dataProvider
*/
#[DataProvider('getInterval')]
public function testInterval($expected, $number, $interval)
{
$translator = $this->getTranslator();

$this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', ['%count%' => $number]));
}

public static function getInterval()
{
return [
['foo', 3, '{1,2, 3 ,4}'],
['bar', 10, '{1,2, 3 ,4}'],
['bar', 3, '[1,2]'],
['foo', 1, '[1,2]'],
['foo', 2, '[1,2]'],
['bar', 1, ']1,2['],
['bar', 2, ']1,2['],
['foo', log(0), '[-Inf,2['],
['foo', -log(0), '[-2,+Inf]'],
];
}

/**
@dataProvider
*/
#[DataProvider('getChooseTests')]
public function testChoose($expected, $id, $number, $locale = null)
{
$translator = $this->getTranslator();

$this->assertEquals($expected, $translator->trans($id, ['%count%' => $number], null, $locale));
}

public function testReturnMessageIfExactlyOneStandardRuleIsGiven()
{
$translator = $this->getTranslator();

$this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2]));
}

/**
@dataProvider
*/
#[DataProvider('getNonMatchingMessages')]
public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
{
$translator = $this->getTranslator();

$this->expectException(\InvalidArgumentException::class);

$translator->trans($id, ['%count%' => $number]);
}

public static function getNonMatchingMessages()
{
return [
['{0} There are no apples|{1} There is one apple', 2],
['{1} There is one apple|]1,Inf] There are %count% apples', 0],
['{1} There is one apple|]2,Inf] There are %count% apples', 2],
['{0} There are no apples|There is one apple', 2],
];
}

public static function getChooseTests()
{
return [
['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
['There are no apples', '{0}     There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],
['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0],

['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1],

['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10],
['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10],
['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]     There are %count% apples', 10],

['There are 0 apples', 'There is one apple|There are %count% apples', 0],
['There is one apple', 'There is one apple|There are %count% apples', 1],
['There are 10 apples', 'There is one apple|There are %count% apples', 10],

['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0],
['There is one apple', 'one: There is one apple|more: There are %count% apples', 1],
['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10],

['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0],
['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1],
['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10],

['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0],
['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1],


['There are 0 apples', 'There is one apple|There are %count% apples', 0],
['There is one apple', 'There is one apple|There are %count% apples', 1],
['There are 2 apples', 'There is one apple|There are %count% apples', 2],


['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7],
['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1],
['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7],
['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],
['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0],
['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0],



["This is a text with a\n            new-line in it. Selector = 0.", '{0}This is a text with a
            new-line in it. Selector = 0.|{1}This is a text with a
            new-line in it. Selector = 1.|[1,Inf]This is a text with a
            new-line in it. Selector > 1.', 0],

["This is a text with a\n            new-line in it. Selector = 1.", '{0}This is a text with a
            new-line in it. Selector = 0.|{1}This is a text with a
            new-line in it. Selector = 1.|[1,Inf]This is a text with a
            new-line in it. Selector > 1.', 1],
["This is a text with a\n            new-line in it. Selector > 1.", '{0}This is a text with a
            new-line in it. Selector = 0.|{1}This is a text with a
            new-line in it. Selector = 1.|[1,Inf]This is a text with a
            new-line in it. Selector > 1.', 5],

['This is a text with a
            new-line in it. Selector = 1.', '{0}This is a text with a
            new-line in it. Selector = 0.|{1}This is a text with a
            new-line in it. Selector = 1.|[1,Inf]This is a text with a
            new-line in it. Selector > 1.', 1],

['This is a text with a
            new-line in it. Selector > 1.', '{0}This is a text with a
            new-line in it. Selector = 0.|{1}This is a text with a
            new-line in it. Selector = 1.|[1,Inf]This is a text with a
            new-line in it. Selector > 1.', 5],

['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0],

["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1],

['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0],

['', '|', 1],

['', '||', 1],


['1.5 liters', '%count% liter|%count% liters', 1.5],
['1.5 litre', '%count% litre|%count% litres', 1.5, 'fr'],


['-1 degree', '%count% degree|%count% degrees', -1],
['-1 degré', '%count% degré|%count% degrés', -1],
['-1.5 degrees', '%count% degree|%count% degrees', -1.5],
['-1.5 degré', '%count% degré|%count% degrés', -1.5, 'fr'],
['-2 degrees', '%count% degree|%count% degrees', -2],
['-2 degrés', '%count% degré|%count% degrés', -2],
];
}

/**
@dataProvider
*/
#[DataProvider('failingLangcodes')]
public function testFailedLangcodes($nplural, $langCodes)
{
$matrix = $this->generateTestData($langCodes);
$this->validateMatrix($nplural, $matrix, false);
}

/**
@dataProvider
*/
#[DataProvider('successLangcodes')]
public function testLangcodes($nplural, $langCodes)
{
$matrix = $this->generateTestData($langCodes);
$this->validateMatrix($nplural, $matrix);
}






public static function successLangcodes(): array
{
return [
['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']],
['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM', 'en_US_POSIX']],
['3', ['be', 'bs', 'cs', 'hr']],
['4', ['cy', 'mt', 'sl']],
['6', ['ar']],
];
}









public static function failingLangcodes(): array
{
return [
['1', ['fa']],
['2', ['jbo']],
['3', ['cbs']],
['4', ['gd', 'kw']],
['5', ['ga']],
];
}







protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = true)
{
foreach ($matrix as $langCode => $data) {
$indexes = array_flip($data);
if ($expectSuccess) {
$this->assertCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms.");
} else {
$this->assertNotCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms.");
}
}
}

protected function generateTestData($langCodes)
{
$translator = new class {
use TranslatorTrait {
getPluralizationRule as public;
}
};

$matrix = [];
foreach ($langCodes as $langCode) {
for ($count = 0; $count < 200; ++$count) {
$plural = $translator->getPluralizationRule($count, $langCode);
$matrix[$langCode][$count] = $plural;
}
}

return $matrix;
}
}
<?php










namespace Symfony\Contracts\Translation;

interface LocaleAwareInterface
{







public function setLocale(string $locale);




public function getLocale(): string;
}
<?php










namespace Symfony\Contracts\Translation;




interface TranslatableInterface
{
public function trans(TranslatorInterface $translator, ?string $locale = null): string;
}
<?php










namespace Symfony\Contracts\Translation;

use Symfony\Component\Translation\Exception\InvalidArgumentException;






trait TranslatorTrait
{
private ?string $locale = null;




public function setLocale(string $locale)
{
$this->locale = $locale;
}

public function getLocale(): string
{
return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en');
}

public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string
{
if (null === $id || '' === $id) {
return '';
}

if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) {
return strtr($id, $parameters);
}

$number = (float) $parameters['%count%'];
$locale = $locale ?: $this->getLocale();

$parts = [];
if (preg_match('/^\|++$/', $id)) {
$parts = explode('|', $id);
} elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) {
$parts = $matches[0];
}

$intervalRegexp = <<<'EOF'
/^(?P<interval>
    ({\s*
        (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
    \s*})

        |

    (?P<left_delimiter>[\[\]])
        \s*
        (?P<left>-Inf|\-?\d+(\.\d+)?)
        \s*,\s*
        (?P<right>\+?Inf|\-?\d+(\.\d+)?)
        \s*
    (?P<right_delimiter>[\[\]])
)\s*(?P<message>.*?)$/xs
EOF;

$standardRules = [];
foreach ($parts as $part) {
$part = trim(str_replace('||', '|', $part));


if (preg_match($intervalRegexp, $part, $matches)) {
if ($matches[2]) {
foreach (explode(',', $matches[3]) as $n) {
if ($number == $n) {
return strtr($matches['message'], $parameters);
}
}
} else {
$leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left'];
$rightNumber = is_numeric($matches['right']) ? (float) $matches['right'] : \INF;

if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
&& (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
) {
return strtr($matches['message'], $parameters);
}
}
} elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
$standardRules[] = $matches[1];
} else {
$standardRules[] = $part;
}
}

$position = $this->getPluralizationRule($number, $locale);

if (!isset($standardRules[$position])) {


if (1 === \count($parts) && isset($standardRules[0])) {
return strtr($standardRules[0], $parameters);
}

$message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number);

if (class_exists(InvalidArgumentException::class)) {
throw new InvalidArgumentException($message);
}

throw new \InvalidArgumentException($message);
}

return strtr($standardRules[$position], $parameters);
}








private function getPluralizationRule(float $number, string $locale): int
{
$number = abs($number);

return match ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) {
'af',
'bn',
'bg',
'ca',
'da',
'de',
'el',
'en',
'en_US_POSIX',
'eo',
'es',
'et',
'eu',
'fa',
'fi',
'fo',
'fur',
'fy',
'gl',
'gu',
'ha',
'he',
'hu',
'is',
'it',
'ku',
'lb',
'ml',
'mn',
'mr',
'nah',
'nb',
'ne',
'nl',
'nn',
'no',
'oc',
'om',
'or',
'pa',
'pap',
'ps',
'pt',
'so',
'sq',
'sv',
'sw',
'ta',
'te',
'tk',
'ur',
'zu' => (1 == $number) ? 0 : 1,
'am',
'bh',
'fil',
'fr',
'gun',
'hi',
'hy',
'ln',
'mg',
'nso',
'pt_BR',
'ti',
'wa' => ($number < 2) ? 0 : 1,
'be',
'bs',
'hr',
'ru',
'sh',
'sr',
'uk' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2),
'cs',
'sk' => (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2),
'ga' => (1 == $number) ? 0 : ((2 == $number) ? 1 : 2),
'lt' => ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2),
'sl' => (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)),
'mk' => (1 == $number % 10) ? 0 : 1,
'mt' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)),
'lv' => (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2),
'pl' => (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2),
'cy' => (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)),
'ro' => (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2),
'ar' => (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))),
default => 0,
};
}
}
<?php










namespace Symfony\Contracts\Translation;




interface TranslatorInterface
{











































public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string;




public function getLocale(): string;
}
<?php










namespace Symfony\Component\EventDispatcher;












interface EventSubscriberInterface
{





















public static function getSubscribedEvents();
}
<?php










namespace Symfony\Component\EventDispatcher\Attribute;






#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class AsEventListener
{
public function __construct(
public ?string $event = null,
public ?string $method = null,
public int $priority = 0,
public ?string $dispatcher = null,
) {
}
}
<?php










namespace Symfony\Component\EventDispatcher;

use Psr\EventDispatcher\StoppableEventInterface;
use Symfony\Component\EventDispatcher\Debug\WrappedListener;
















class EventDispatcher implements EventDispatcherInterface
{
private array $listeners = [];
private array $sorted = [];
private array $optimized;

public function __construct()
{
if (__CLASS__ === static::class) {
$this->optimized = [];
}
}

public function dispatch(object $event, ?string $eventName = null): object
{
$eventName ??= $event::class;

if (isset($this->optimized)) {
$listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName]) ? [] : $this->optimizeListeners($eventName));
} else {
$listeners = $this->getListeners($eventName);
}

if ($listeners) {
$this->callListeners($listeners, $eventName, $event);
}

return $event;
}

public function getListeners(?string $eventName = null): array
{
if (null !== $eventName) {
if (empty($this->listeners[$eventName])) {
return [];
}

if (!isset($this->sorted[$eventName])) {
$this->sortListeners($eventName);
}

return $this->sorted[$eventName];
}

foreach ($this->listeners as $eventName => $eventListeners) {
if (!isset($this->sorted[$eventName])) {
$this->sortListeners($eventName);
}
}

return array_filter($this->sorted);
}

public function getListenerPriority(string $eventName, callable|array $listener): ?int
{
if (empty($this->listeners[$eventName])) {
return null;
}

if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
$listener[1] ??= '__invoke';
}

foreach ($this->listeners[$eventName] as $priority => &$listeners) {
foreach ($listeners as &$v) {
if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) {
$v[0] = $v[0]();
$v[1] ??= '__invoke';
}
if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
return $priority;
}
}
}

return null;
}

public function hasListeners(?string $eventName = null): bool
{
if (null !== $eventName) {
return !empty($this->listeners[$eventName]);
}

foreach ($this->listeners as $eventListeners) {
if ($eventListeners) {
return true;
}
}

return false;
}




public function addListener(string $eventName, callable|array $listener, int $priority = 0)
{
$this->listeners[$eventName][$priority][] = $listener;
unset($this->sorted[$eventName], $this->optimized[$eventName]);
}




public function removeListener(string $eventName, callable|array $listener)
{
if (empty($this->listeners[$eventName])) {
return;
}

if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
$listener[1] ??= '__invoke';
}

foreach ($this->listeners[$eventName] as $priority => &$listeners) {
foreach ($listeners as $k => &$v) {
if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure && 2 >= \count($v)) {
$v[0] = $v[0]();
$v[1] ??= '__invoke';
}
if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]);
}
}

if (!$listeners) {
unset($this->listeners[$eventName][$priority]);
}
}
}




public function addSubscriber(EventSubscriberInterface $subscriber)
{
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
if (\is_string($params)) {
$this->addListener($eventName, [$subscriber, $params]);
} elseif (\is_string($params[0])) {
$this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0);
} else {
foreach ($params as $listener) {
$this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0);
}
}
}
}




public function removeSubscriber(EventSubscriberInterface $subscriber)
{
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
if (\is_array($params) && \is_array($params[0])) {
foreach ($params as $listener) {
$this->removeListener($eventName, [$subscriber, $listener[0]]);
}
} else {
$this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]);
}
}
}













protected function callListeners(iterable $listeners, string $eventName, object $event)
{
$stoppable = $event instanceof StoppableEventInterface;

foreach ($listeners as $listener) {
if ($stoppable && $event->isPropagationStopped()) {
break;
}
$listener($event, $eventName, $this);
}
}




private function sortListeners(string $eventName): void
{
krsort($this->listeners[$eventName]);
$this->sorted[$eventName] = [];

foreach ($this->listeners[$eventName] as &$listeners) {
foreach ($listeners as &$listener) {
if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$listener[0] = $listener[0]();
$listener[1] ??= '__invoke';
}
$this->sorted[$eventName][] = $listener;
}
}
}




private function optimizeListeners(string $eventName): array
{
krsort($this->listeners[$eventName]);
$this->optimized[$eventName] = [];

foreach ($this->listeners[$eventName] as &$listeners) {
foreach ($listeners as &$listener) {
$closure = &$this->optimized[$eventName][];
if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure && 2 >= \count($listener)) {
$closure = static function (...$args) use (&$listener, &$closure) {
if ($listener[0] instanceof \Closure) {
$listener[0] = $listener[0]();
$listener[1] ??= '__invoke';
}
($closure = $listener(...))(...$args);
};
} else {
$closure = $listener instanceof WrappedListener ? $listener : $listener(...);
}
}
}

return $this->optimized[$eventName];
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\EventDispatcher;

use Symfony\Contracts\EventDispatcher\Event;

/**
@implements
@implements






*/
class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
{
protected $subject;
protected $arguments;







public function __construct(mixed $subject = null, array $arguments = [])
{
$this->subject = $subject;
$this->arguments = $arguments;
}




public function getSubject(): mixed
{
return $this->subject;
}






public function getArgument(string $key): mixed
{
if ($this->hasArgument($key)) {
return $this->arguments[$key];
}

throw new \InvalidArgumentException(\sprintf('Argument "%s" not found.', $key));
}






public function setArgument(string $key, mixed $value): static
{
$this->arguments[$key] = $value;

return $this;
}




public function getArguments(): array
{
return $this->arguments;
}






public function setArguments(array $args = []): static
{
$this->arguments = $args;

return $this;
}




public function hasArgument(string $key): bool
{
return \array_key_exists($key, $this->arguments);
}








public function offsetGet(mixed $key): mixed
{
return $this->getArgument($key);
}






public function offsetSet(mixed $key, mixed $value): void
{
$this->setArgument($key, $value);
}






public function offsetUnset(mixed $key): void
{
if ($this->hasArgument($key)) {
unset($this->arguments[$key]);
}
}






public function offsetExists(mixed $key): bool
{
return $this->hasArgument($key);
}






public function getIterator(): \ArrayIterator
{
return new \ArrayIterator($this->arguments);
}
}
<?php










namespace Symfony\Component\EventDispatcher\DependencyInjection;

use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\Event;




class RegisterListenersPass implements CompilerPassInterface
{
private array $hotPathEvents = [];
private array $noPreloadEvents = [];




public function setHotPathEvents(array $hotPathEvents): static
{
$this->hotPathEvents = array_flip($hotPathEvents);

return $this;
}




public function setNoPreloadEvents(array $noPreloadEvents): static
{
$this->noPreloadEvents = array_flip($noPreloadEvents);

return $this;
}




public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('event_dispatcher') && !$container->hasAlias('event_dispatcher')) {
return;
}

$aliases = [];

if ($container->hasParameter('event_dispatcher.event_aliases')) {
$aliases = $container->getParameter('event_dispatcher.event_aliases');
}

$globalDispatcherDefinition = $container->findDefinition('event_dispatcher');

foreach ($container->findTaggedServiceIds('kernel.event_listener', true) as $id => $events) {
$noPreload = 0;

foreach ($events as $event) {
$priority = $event['priority'] ?? 0;

if (!isset($event['event'])) {
if ($container->getDefinition($id)->hasTag('kernel.event_subscriber')) {
continue;
}

$event['method'] ??= '__invoke';
$event['event'] = $this->getEventFromTypeDeclaration($container, $id, $event['method']);
}

$event['event'] = $aliases[$event['event']] ?? $event['event'];

if (!isset($event['method'])) {
$event['method'] = 'on'.preg_replace_callback([
'/(?<=\b|_)[a-z]/i',
'/[^a-z0-9]/i',
], fn ($matches) => strtoupper($matches[0]), $event['event']);
$event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);

if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) {
if (!$r->hasMethod('__invoke')) {
throw new InvalidArgumentException(\sprintf('None of the "%s" or "__invoke" methods exist for the service "%s". Please define the "method" attribute on "kernel.event_listener" tags.', $event['method'], $id));
}

$event['method'] = '__invoke';
}
}

$dispatcherDefinition = $globalDispatcherDefinition;
if (isset($event['dispatcher'])) {
$dispatcherDefinition = $container->findDefinition($event['dispatcher']);
}

$dispatcherDefinition->addMethodCall('addListener', [$event['event'], [new ServiceClosureArgument(new Reference($id)), $event['method']], $priority]);

if (isset($this->hotPathEvents[$event['event']])) {
$container->getDefinition($id)->addTag('container.hot_path');
} elseif (isset($this->noPreloadEvents[$event['event']])) {
++$noPreload;
}
}

if ($noPreload && \count($events) === $noPreload) {
$container->getDefinition($id)->addTag('container.no_preload');
}
}

$extractingDispatcher = new ExtractingEventDispatcher();

foreach ($container->findTaggedServiceIds('kernel.event_subscriber', true) as $id => $tags) {
$def = $container->getDefinition($id);


$class = $def->getClass();

if (!$r = $container->getReflectionClass($class)) {
throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
}
if (!$r->isSubclassOf(EventSubscriberInterface::class)) {
throw new InvalidArgumentException(\sprintf('Service "%s" must implement interface "%s".', $id, EventSubscriberInterface::class));
}
$class = $r->name;

$dispatcherDefinitions = [];
foreach ($tags as $attributes) {
if (!isset($attributes['dispatcher']) || isset($dispatcherDefinitions[$attributes['dispatcher']])) {
continue;
}

$dispatcherDefinitions[$attributes['dispatcher']] = $container->findDefinition($attributes['dispatcher']);
}

if (!$dispatcherDefinitions) {
$dispatcherDefinitions = [$globalDispatcherDefinition];
}

$noPreload = 0;
ExtractingEventDispatcher::$aliases = $aliases;
ExtractingEventDispatcher::$subscriber = $class;
$extractingDispatcher->addSubscriber($extractingDispatcher);
foreach ($extractingDispatcher->listeners as $args) {
$args[1] = [new ServiceClosureArgument(new Reference($id)), $args[1]];
foreach ($dispatcherDefinitions as $dispatcherDefinition) {
$dispatcherDefinition->addMethodCall('addListener', $args);
}

if (isset($this->hotPathEvents[$args[0]])) {
$container->getDefinition($id)->addTag('container.hot_path');
} elseif (isset($this->noPreloadEvents[$args[0]])) {
++$noPreload;
}
}
if ($noPreload && \count($extractingDispatcher->listeners) === $noPreload) {
$container->getDefinition($id)->addTag('container.no_preload');
}
$extractingDispatcher->listeners = [];
ExtractingEventDispatcher::$aliases = [];
}
}

private function getEventFromTypeDeclaration(ContainerBuilder $container, string $id, string $method): string
{
if (
null === ($class = $container->getDefinition($id)->getClass())
|| !($r = $container->getReflectionClass($class, false))
|| !$r->hasMethod($method)
|| 1 > ($m = $r->getMethod($method))->getNumberOfParameters()
|| !($type = $m->getParameters()[0]->getType()) instanceof \ReflectionNamedType
|| $type->isBuiltin()
|| Event::class === ($name = $type->getName())
) {
throw new InvalidArgumentException(\sprintf('Service "%s" must define the "event" attribute on "kernel.event_listener" tags.', $id));
}

return $name;
}
}




class ExtractingEventDispatcher extends EventDispatcher implements EventSubscriberInterface
{
public array $listeners = [];

public static array $aliases = [];
public static string $subscriber;

public function addListener(string $eventName, callable|array $listener, int $priority = 0): void
{
$this->listeners[] = [$eventName, $listener[1], $priority];
}

public static function getSubscribedEvents(): array
{
$events = [];

foreach ([self::$subscriber, 'getSubscribedEvents']() as $eventName => $params) {
$events[self::$aliases[$eventName] ?? $eventName] = $params;
}

return $events;
}
}
<?php










namespace Symfony\Component\EventDispatcher\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;






class AddEventAliasesPass implements CompilerPassInterface
{
private array $eventAliases;

public function __construct(array $eventAliases)
{
$this->eventAliases = $eventAliases;
}

public function process(ContainerBuilder $container): void
{
$eventAliases = $container->hasParameter('event_dispatcher.event_aliases') ? $container->getParameter('event_dispatcher.event_aliases') : [];

$container->setParameter(
'event_dispatcher.event_aliases',
array_merge($eventAliases, $this->eventAliases)
);
}
}
<?php










namespace Symfony\Component\EventDispatcher;

use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface;








interface EventDispatcherInterface extends ContractsEventDispatcherInterface
{








public function addListener(string $eventName, callable $listener, int $priority = 0);









public function addSubscriber(EventSubscriberInterface $subscriber);






public function removeListener(string $eventName, callable $listener);




public function removeSubscriber(EventSubscriberInterface $subscriber);






public function getListeners(?string $eventName = null): array;






public function getListenerPriority(string $eventName, callable $listener): ?int;




public function hasListeners(?string $eventName = null): bool;
}
<?php










namespace Symfony\Component\EventDispatcher\Debug;

use Psr\EventDispatcher\StoppableEventInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Contracts\Service\ResetInterface;








class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterface
{
protected $logger;
protected $stopwatch;




private ?\SplObjectStorage $callStack = null;
private EventDispatcherInterface $dispatcher;
private array $wrappedListeners = [];
private array $orphanedEvents = [];
private ?RequestStack $requestStack;
private string $currentRequestHash = '';

public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, ?LoggerInterface $logger = null, ?RequestStack $requestStack = null)
{
$this->dispatcher = $dispatcher;
$this->stopwatch = $stopwatch;
$this->logger = $logger;
$this->requestStack = $requestStack;
}




public function addListener(string $eventName, callable|array $listener, int $priority = 0)
{
$this->dispatcher->addListener($eventName, $listener, $priority);
}




public function addSubscriber(EventSubscriberInterface $subscriber)
{
$this->dispatcher->addSubscriber($subscriber);
}




public function removeListener(string $eventName, callable|array $listener)
{
if (isset($this->wrappedListeners[$eventName])) {
foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
$listener = $wrappedListener;
unset($this->wrappedListeners[$eventName][$index]);
break;
}
}
}

$this->dispatcher->removeListener($eventName, $listener);
}




public function removeSubscriber(EventSubscriberInterface $subscriber)
{
$this->dispatcher->removeSubscriber($subscriber);
}

public function getListeners(?string $eventName = null): array
{
return $this->dispatcher->getListeners($eventName);
}

public function getListenerPriority(string $eventName, callable|array $listener): ?int
{


if (isset($this->wrappedListeners[$eventName])) {
foreach ($this->wrappedListeners[$eventName] as $wrappedListener) {
if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
return $this->dispatcher->getListenerPriority($eventName, $wrappedListener);
}
}
}

return $this->dispatcher->getListenerPriority($eventName, $listener);
}

public function hasListeners(?string $eventName = null): bool
{
return $this->dispatcher->hasListeners($eventName);
}

public function dispatch(object $event, ?string $eventName = null): object
{
$eventName ??= $event::class;

$this->callStack ??= new \SplObjectStorage();

$currentRequestHash = $this->currentRequestHash = $this->requestStack && ($request = $this->requestStack->getCurrentRequest()) ? spl_object_hash($request) : '';

if (null !== $this->logger && $event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
$this->logger->debug(\sprintf('The "%s" event is already stopped. No listeners have been called.', $eventName));
}

$this->preProcess($eventName);
try {
$this->beforeDispatch($eventName, $event);
try {
$e = $this->stopwatch->start($eventName, 'section');
try {
$this->dispatcher->dispatch($event, $eventName);
} finally {
if ($e->isStarted()) {
$e->stop();
}
}
} finally {
$this->afterDispatch($eventName, $event);
}
} finally {
$this->currentRequestHash = $currentRequestHash;
$this->postProcess($eventName);
}

return $event;
}

public function getCalledListeners(?Request $request = null): array
{
if (null === $this->callStack) {
return [];
}

$hash = $request ? spl_object_hash($request) : null;
$called = [];
foreach ($this->callStack as $listener) {
[$eventName, $requestHash] = $this->callStack->getInfo();
if (null === $hash || $hash === $requestHash) {
$called[] = $listener->getInfo($eventName);
}
}

return $called;
}

public function getNotCalledListeners(?Request $request = null): array
{
try {
$allListeners = $this->dispatcher instanceof EventDispatcher ? $this->getListenersWithPriority() : $this->getListenersWithoutPriority();
} catch (\Exception $e) {
$this->logger?->info('An exception was thrown while getting the uncalled listeners.', ['exception' => $e]);


return [];
}

$hash = $request ? spl_object_hash($request) : null;
$calledListeners = [];

if (null !== $this->callStack) {
foreach ($this->callStack as $calledListener) {
[, $requestHash] = $this->callStack->getInfo();

if (null === $hash || $hash === $requestHash) {
$calledListeners[] = $calledListener->getWrappedListener();
}
}
}

$notCalled = [];

foreach ($allListeners as $eventName => $listeners) {
foreach ($listeners as [$listener, $priority]) {
if (!\in_array($listener, $calledListeners, true)) {
if (!$listener instanceof WrappedListener) {
$listener = new WrappedListener($listener, null, $this->stopwatch, $this, $priority);
}
$notCalled[] = $listener->getInfo($eventName);
}
}
}

uasort($notCalled, $this->sortNotCalledListeners(...));

return $notCalled;
}

public function getOrphanedEvents(?Request $request = null): array
{
if ($request) {
return $this->orphanedEvents[spl_object_hash($request)] ?? [];
}

if (!$this->orphanedEvents) {
return [];
}

return array_merge(...array_values($this->orphanedEvents));
}




public function reset()
{
$this->callStack = null;
$this->orphanedEvents = [];
$this->currentRequestHash = '';
}







public function __call(string $method, array $arguments): mixed
{
return $this->dispatcher->{$method}(...$arguments);
}






protected function beforeDispatch(string $eventName, object $event)
{
}






protected function afterDispatch(string $eventName, object $event)
{
}

private function preProcess(string $eventName): void
{
if (!$this->dispatcher->hasListeners($eventName)) {
$this->orphanedEvents[$this->currentRequestHash][] = $eventName;

return;
}

foreach ($this->dispatcher->getListeners($eventName) as $listener) {
$priority = $this->getListenerPriority($eventName, $listener);
$wrappedListener = new WrappedListener($listener instanceof WrappedListener ? $listener->getWrappedListener() : $listener, null, $this->stopwatch, $this);
$this->wrappedListeners[$eventName][] = $wrappedListener;
$this->dispatcher->removeListener($eventName, $listener);
$this->dispatcher->addListener($eventName, $wrappedListener, $priority);
$this->callStack[$wrappedListener] = [$eventName, $this->currentRequestHash];
}
}

private function postProcess(string $eventName): void
{
unset($this->wrappedListeners[$eventName]);
$skipped = false;
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
if (!$listener instanceof WrappedListener) { 
continue;
}

$priority = $this->getListenerPriority($eventName, $listener);
$this->dispatcher->removeListener($eventName, $listener);
$this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);

if (null !== $this->logger) {
$context = ['event' => $eventName, 'listener' => $listener->getPretty()];
}

if ($listener->wasCalled()) {
$this->logger?->debug('Notified event "{event}" to listener "{listener}".', $context);
} else {
unset($this->callStack[$listener]);
}

if (null !== $this->logger && $skipped) {
$this->logger->debug('Listener "{listener}" was not called for event "{event}".', $context);
}

if ($listener->stoppedPropagation()) {
$this->logger?->debug('Listener "{listener}" stopped propagation of the event "{event}".', $context);

$skipped = true;
}
}
}

private function sortNotCalledListeners(array $a, array $b): int
{
if (0 !== $cmp = strcmp($a['event'], $b['event'])) {
return $cmp;
}

if (\is_int($a['priority']) && !\is_int($b['priority'])) {
return 1;
}

if (!\is_int($a['priority']) && \is_int($b['priority'])) {
return -1;
}

if ($a['priority'] === $b['priority']) {
return 0;
}

if ($a['priority'] > $b['priority']) {
return -1;
}

return 1;
}

private function getListenersWithPriority(): array
{
$result = [];

$allListeners = new \ReflectionProperty(EventDispatcher::class, 'listeners');

foreach ($allListeners->getValue($this->dispatcher) as $eventName => $listenersByPriority) {
foreach ($listenersByPriority as $priority => $listeners) {
foreach ($listeners as $listener) {
$result[$eventName][] = [$listener, $priority];
}
}
}

return $result;
}

private function getListenersWithoutPriority(): array
{
$result = [];

foreach ($this->getListeners() as $eventName => $listeners) {
foreach ($listeners as $listener) {
$result[$eventName][] = [$listener, null];
}
}

return $result;
}
}
<?php










namespace Symfony\Component\EventDispatcher\Debug;

use Psr\EventDispatcher\StoppableEventInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\VarDumper\Caster\ClassStub;




final class WrappedListener
{
private string|array|object $listener;
private ?\Closure $optimizedListener;
private string $name;
private bool $called = false;
private bool $stoppedPropagation = false;
private Stopwatch $stopwatch;
private ?EventDispatcherInterface $dispatcher;
private string $pretty;
private string $callableRef;
private ClassStub|string $stub;
private ?int $priority = null;
private static bool $hasClassStub;

public function __construct(callable|array $listener, ?string $name, Stopwatch $stopwatch, ?EventDispatcherInterface $dispatcher = null, ?int $priority = null)
{
$this->listener = $listener;
$this->optimizedListener = $listener instanceof \Closure ? $listener : (\is_callable($listener) ? $listener(...) : null);
$this->stopwatch = $stopwatch;
$this->dispatcher = $dispatcher;
$this->priority = $priority;

if (\is_array($listener)) {
[$this->name, $this->callableRef] = $this->parseListener($listener);
$this->pretty = $this->name.'::'.$listener[1];
$this->callableRef .= '::'.$listener[1];
} elseif ($listener instanceof \Closure) {
$r = new \ReflectionFunction($listener);
if (str_contains($r->name, '{closure')) {
$this->pretty = $this->name = 'closure';
} elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
$this->name = $class->name;
$this->pretty = $this->name.'::'.$r->name;
} else {
$this->pretty = $this->name = $r->name;
}
} elseif (\is_string($listener)) {
$this->pretty = $this->name = $listener;
} else {
$this->name = get_debug_type($listener);
$this->pretty = $this->name.'::__invoke';
$this->callableRef = $listener::class.'::__invoke';
}

if (null !== $name) {
$this->name = $name;
}

self::$hasClassStub ??= class_exists(ClassStub::class);
}

public function getWrappedListener(): callable|array
{
return $this->listener;
}

public function wasCalled(): bool
{
return $this->called;
}

public function stoppedPropagation(): bool
{
return $this->stoppedPropagation;
}

public function getPretty(): string
{
return $this->pretty;
}

public function getInfo(string $eventName): array
{
$this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()', $this->callableRef ?? $this->listener) : $this->pretty.'()';

return [
'event' => $eventName,
'priority' => $this->priority ??= $this->dispatcher?->getListenerPriority($eventName, $this->listener),
'pretty' => $this->pretty,
'stub' => $this->stub,
];
}

public function __invoke(object $event, string $eventName, EventDispatcherInterface $dispatcher): void
{
$dispatcher = $this->dispatcher ?: $dispatcher;

$this->called = true;
$this->priority ??= $dispatcher->getListenerPriority($eventName, $this->listener);

$e = $this->stopwatch->start($this->name, 'event_listener');

try {
($this->optimizedListener ?? $this->listener)($event, $eventName, $dispatcher);
} finally {
if ($e->isStarted()) {
$e->stop();
}
}

if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
$this->stoppedPropagation = true;
}
}

private function parseListener(array $listener): array
{
if ($listener[0] instanceof \Closure) {
foreach ((new \ReflectionFunction($listener[0]))->getAttributes(\Closure::class) as $attribute) {
if ($name = $attribute->getArguments()['name'] ?? false) {
return [$name, $attribute->getArguments()['class'] ?? $name];
}
}
}

if (\is_object($listener[0])) {
return [get_debug_type($listener[0]), $listener[0]::class];
}

return [$listener[0], $listener[0]];
}
}
<?php










namespace Symfony\Component\EventDispatcher;






class ImmutableEventDispatcher implements EventDispatcherInterface
{
private EventDispatcherInterface $dispatcher;

public function __construct(EventDispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}

public function dispatch(object $event, ?string $eventName = null): object
{
return $this->dispatcher->dispatch($event, $eventName);
}




public function addListener(string $eventName, callable|array $listener, int $priority = 0)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}




public function addSubscriber(EventSubscriberInterface $subscriber)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}




public function removeListener(string $eventName, callable|array $listener)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}




public function removeSubscriber(EventSubscriberInterface $subscriber)
{
throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
}

public function getListeners(?string $eventName = null): array
{
return $this->dispatcher->getListeners($eventName);
}

public function getListenerPriority(string $eventName, callable|array $listener): ?int
{
return $this->dispatcher->getListenerPriority($eventName, $listener);
}

public function hasListeners(?string $eventName = null): bool
{
return $this->dispatcher->hasListeners($eventName);
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;




interface ExpressionFunctionProviderInterface
{



public function getFunctions();
}
<?php










namespace Symfony\Component\ExpressionLanguage;






class Lexer
{





public function tokenize(string $expression): TokenStream
{
$expression = str_replace(["\r", "\n", "\t", "\v", "\f"], ' ', $expression);
$cursor = 0;
$tokens = [];
$brackets = [];
$end = \strlen($expression);

while ($cursor < $end) {
if (' ' == $expression[$cursor]) {
++$cursor;

continue;
}

if (preg_match('/
                (?(DEFINE)(?P<LNUM>[0-9]+(_[0-9]+)*))
                (?:\.(?&LNUM)|(?&LNUM)(?:\.(?!\.)(?&LNUM)?)?)(?:[eE][+-]?(?&LNUM))?/Ax',
$expression, $match, 0, $cursor)
) {

$tokens[] = new Token(Token::NUMBER_TYPE, 0 + str_replace('_', '', $match[0]), $cursor + 1);
$cursor += \strlen($match[0]);
} elseif (str_contains('([{', $expression[$cursor])) {

$brackets[] = [$expression[$cursor], $cursor];

$tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
++$cursor;
} elseif (str_contains(')]}', $expression[$cursor])) {

if (!$brackets) {
throw new SyntaxError(\sprintf('Unexpected "%s".', $expression[$cursor]), $cursor, $expression);
}

[$expect, $cur] = array_pop($brackets);
if ($expression[$cursor] != strtr($expect, '([{', ')]}')) {
throw new SyntaxError(\sprintf('Unclosed "%s".', $expect), $cur, $expression);
}

$tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
++$cursor;
} elseif (preg_match('/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As', $expression, $match, 0, $cursor)) {

$tokens[] = new Token(Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)), $cursor + 1);
$cursor += \strlen($match[0]);
} elseif (preg_match('/(?<=^|[\s(])starts with(?=[\s(])|(?<=^|[\s(])ends with(?=[\s(])|(?<=^|[\s(])contains(?=[\s(])|(?<=^|[\s(])matches(?=[\s(])|(?<=^|[\s(])not in(?=[\s(])|(?<=^|[\s(])not(?=[\s(])|(?<=^|[\s(])and(?=[\s(])|\=\=\=|\!\=\=|(?<=^|[\s(])or(?=[\s(])|\|\||&&|\=\=|\!\=|\>\=|\<\=|(?<=^|[\s(])in(?=[\s(])|\.\.|\*\*|\!|\||\^|&|\<|\>|\+|\-|~|\*|\/|%/A', $expression, $match, 0, $cursor)) {

$tokens[] = new Token(Token::OPERATOR_TYPE, $match[0], $cursor + 1);
$cursor += \strlen($match[0]);
} elseif ('?' === $expression[$cursor] && '.' === ($expression[$cursor + 1] ?? '')) {

$tokens[] = new Token(Token::PUNCTUATION_TYPE, '?.', ++$cursor);
++$cursor;
} elseif ('?' === $expression[$cursor] && '?' === ($expression[$cursor + 1] ?? '')) {

$tokens[] = new Token(Token::PUNCTUATION_TYPE, '??', ++$cursor);
++$cursor;
} elseif (str_contains('.,?:', $expression[$cursor])) {

$tokens[] = new Token(Token::PUNCTUATION_TYPE, $expression[$cursor], $cursor + 1);
++$cursor;
} elseif (preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A', $expression, $match, 0, $cursor)) {

$tokens[] = new Token(Token::NAME_TYPE, $match[0], $cursor + 1);
$cursor += \strlen($match[0]);
} else {

throw new SyntaxError(\sprintf('Unexpected character "%s".', $expression[$cursor]), $cursor, $expression);
}
}

$tokens[] = new Token(Token::EOF_TYPE, null, $cursor + 1);

if ($brackets) {
[$expect, $cur] = array_pop($brackets);
throw new SyntaxError(\sprintf('Unclosed "%s".', $expect), $cur, $expression);
}

return new TokenStream($tokens, $expression);
}
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\ExpressionLanguage;

use Symfony\Component\ExpressionLanguage\Node\Node;






class ParsedExpression extends Expression
{
private Node $nodes;

public function __construct(string $expression, Node $nodes)
{
parent::__construct($expression);

$this->nodes = $nodes;
}




public function getNodes()
{
return $this->nodes;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class NameNode extends Node
{
public function __construct(string $name)
{
parent::__construct(
[],
['name' => $name]
);
}

public function compile(Compiler $compiler): void
{
$compiler->raw('$'.$this->attributes['name']);
}

public function evaluate(array $functions, array $values): mixed
{
return $values[$this->attributes['name']];
}

public function toArray(): array
{
return [$this->attributes['name']];
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class ConditionalNode extends Node
{
public function __construct(Node $expr1, Node $expr2, Node $expr3)
{
parent::__construct(
['expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3]
);
}

public function compile(Compiler $compiler): void
{
$compiler
->raw('((')
->compile($this->nodes['expr1'])
->raw(') ? (')
->compile($this->nodes['expr2'])
->raw(') : (')
->compile($this->nodes['expr3'])
->raw('))')
;
}

public function evaluate(array $functions, array $values): mixed
{
if ($this->nodes['expr1']->evaluate($functions, $values)) {
return $this->nodes['expr2']->evaluate($functions, $values);
}

return $this->nodes['expr3']->evaluate($functions, $values);
}

public function toArray(): array
{
return ['(', $this->nodes['expr1'], ' ? ', $this->nodes['expr2'], ' : ', $this->nodes['expr3'], ')'];
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class GetAttrNode extends Node
{
public const PROPERTY_CALL = 1;
public const METHOD_CALL = 2;
public const ARRAY_CALL = 3;




public function __construct(Node $node, Node $attribute, ArrayNode $arguments, int $type)
{
parent::__construct(
['node' => $node, 'attribute' => $attribute, 'arguments' => $arguments],
['type' => $type, 'is_null_coalesce' => false, 'is_short_circuited' => false],
);
}

public function compile(Compiler $compiler): void
{
$nullSafe = $this->nodes['attribute'] instanceof ConstantNode && $this->nodes['attribute']->isNullSafe;
switch ($this->attributes['type']) {
case self::PROPERTY_CALL:
$compiler
->compile($this->nodes['node'])
->raw($nullSafe ? '?->' : '->')
->raw($this->nodes['attribute']->attributes['value'])
;
break;

case self::METHOD_CALL:
$compiler
->compile($this->nodes['node'])
->raw($nullSafe ? '?->' : '->')
->raw($this->nodes['attribute']->attributes['value'])
->raw('(')
->compile($this->nodes['arguments'])
->raw(')')
;
break;

case self::ARRAY_CALL:
$compiler
->compile($this->nodes['node'])
->raw('[')
->compile($this->nodes['attribute'])->raw(']')
;
break;
}
}

public function evaluate(array $functions, array $values): mixed
{
switch ($this->attributes['type']) {
case self::PROPERTY_CALL:
$obj = $this->nodes['node']->evaluate($functions, $values);
if (null === $obj && ($this->nodes['attribute']->isNullSafe || $this->attributes['is_null_coalesce'])) {
$this->attributes['is_short_circuited'] = true;

return null;
}
if (null === $obj && $this->isShortCircuited()) {
return null;
}

if (!\is_object($obj)) {
throw new \RuntimeException(\sprintf('Unable to get property "%s" of non-object "%s".', $this->nodes['attribute']->dump(), $this->nodes['node']->dump()));
}

$property = $this->nodes['attribute']->attributes['value'];

if ($this->attributes['is_null_coalesce']) {
return $obj->$property ?? null;
}

return $obj->$property;

case self::METHOD_CALL:
$obj = $this->nodes['node']->evaluate($functions, $values);

if (null === $obj && $this->nodes['attribute']->isNullSafe) {
$this->attributes['is_short_circuited'] = true;

return null;
}
if (null === $obj && $this->isShortCircuited()) {
return null;
}

if (!\is_object($obj)) {
throw new \RuntimeException(\sprintf('Unable to call method "%s" of non-object "%s".', $this->nodes['attribute']->dump(), $this->nodes['node']->dump()));
}
if (!\is_callable($toCall = [$obj, $this->nodes['attribute']->attributes['value']])) {
throw new \RuntimeException(\sprintf('Unable to call method "%s" of object "%s".', $this->nodes['attribute']->attributes['value'], get_debug_type($obj)));
}

return $toCall(...array_values($this->nodes['arguments']->evaluate($functions, $values)));

case self::ARRAY_CALL:
$array = $this->nodes['node']->evaluate($functions, $values);

if (null === $array && $this->isShortCircuited()) {
return null;
}

if (!\is_array($array) && !$array instanceof \ArrayAccess && !(null === $array && $this->attributes['is_null_coalesce'])) {
throw new \RuntimeException(\sprintf('Unable to get an item of non-array "%s".', $this->nodes['node']->dump()));
}

if ($this->attributes['is_null_coalesce']) {
return $array[$this->nodes['attribute']->evaluate($functions, $values)] ?? null;
}

return $array[$this->nodes['attribute']->evaluate($functions, $values)];
}
}

private function isShortCircuited(): bool
{
return $this->attributes['is_short_circuited'] || ($this->nodes['node'] instanceof self && $this->nodes['node']->isShortCircuited());
}

public function toArray(): array
{
$nullSafe = $this->nodes['attribute'] instanceof ConstantNode && $this->nodes['attribute']->isNullSafe;
switch ($this->attributes['type']) {
case self::PROPERTY_CALL:
return [$this->nodes['node'], $nullSafe ? '?.' : '.', $this->nodes['attribute']];

case self::METHOD_CALL:
return [$this->nodes['node'], $nullSafe ? '?.' : '.', $this->nodes['attribute'], '(', $this->nodes['arguments'], ')'];

case self::ARRAY_CALL:
return [$this->nodes['node'], '[', $this->nodes['attribute'], ']'];
}
}




public function __unserialize(array $data): void
{
$this->nodes = $data['nodes'];
$this->attributes = $data['attributes'];
$this->attributes['is_null_coalesce'] ??= false;
$this->attributes['is_short_circuited'] ??= $data["\x00Symfony\Component\ExpressionLanguage\Node\GetAttrNode\x00isShortCircuited"] ?? false;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class ConstantNode extends Node
{
public readonly bool $isNullSafe;
private bool $isIdentifier;

public function __construct(mixed $value, bool $isIdentifier = false, bool $isNullSafe = false)
{
$this->isIdentifier = $isIdentifier;
$this->isNullSafe = $isNullSafe;
parent::__construct(
[],
['value' => $value]
);
}

public function compile(Compiler $compiler): void
{
$compiler->repr($this->attributes['value']);
}

public function evaluate(array $functions, array $values): mixed
{
return $this->attributes['value'];
}

public function toArray(): array
{
$array = [];
$value = $this->attributes['value'];

if ($this->isIdentifier) {
$array[] = $value;
} elseif (true === $value) {
$array[] = 'true';
} elseif (false === $value) {
$array[] = 'false';
} elseif (null === $value) {
$array[] = 'null';
} elseif (is_numeric($value)) {
$array[] = $value;
} elseif (!\is_array($value)) {
$array[] = $this->dumpString($value);
} elseif ($this->isHash($value)) {
foreach ($value as $k => $v) {
$array[] = ', ';
$array[] = new self($k);
$array[] = ': ';
$array[] = new self($v);
}
$array[0] = '{';
$array[] = '}';
} else {
foreach ($value as $v) {
$array[] = ', ';
$array[] = new self($v);
}
$array[0] = '[';
$array[] = ']';
}

return $array;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;
use Symfony\Component\ExpressionLanguage\SyntaxError;






class BinaryNode extends Node
{
private const OPERATORS = [
'~' => '.',
'and' => '&&',
'or' => '||',
];

private const FUNCTIONS = [
'**' => 'pow',
'..' => 'range',
'in' => '\\'.self::class.'::inArray',
'not in' => '!\\'.self::class.'::inArray',
'contains' => 'str_contains',
'starts with' => 'str_starts_with',
'ends with' => 'str_ends_with',
];

public function __construct(string $operator, Node $left, Node $right)
{
parent::__construct(
['left' => $left, 'right' => $right],
['operator' => $operator]
);
}

public function compile(Compiler $compiler): void
{
$operator = $this->attributes['operator'];

if ('matches' == $operator) {
if ($this->nodes['right'] instanceof ConstantNode) {
$this->evaluateMatches($this->nodes['right']->evaluate([], []), '');
}

$compiler
->raw('(static function ($regexp, $str) { set_error_handler(static fn ($t, $m) => throw new \Symfony\Component\ExpressionLanguage\SyntaxError(sprintf(\'Regexp "%s" passed to "matches" is not valid\', $regexp).substr($m, 12))); try { return preg_match($regexp, (string) $str); } finally { restore_error_handler(); } })(')
->compile($this->nodes['right'])
->raw(', ')
->compile($this->nodes['left'])
->raw(')')
;

return;
}

if (isset(self::FUNCTIONS[$operator])) {
$compiler
->raw(\sprintf('%s(', self::FUNCTIONS[$operator]))
->compile($this->nodes['left'])
->raw(', ')
->compile($this->nodes['right'])
->raw(')')
;

return;
}

if (isset(self::OPERATORS[$operator])) {
$operator = self::OPERATORS[$operator];
}

$compiler
->raw('(')
->compile($this->nodes['left'])
->raw(' ')
->raw($operator)
->raw(' ')
->compile($this->nodes['right'])
->raw(')')
;
}

public function evaluate(array $functions, array $values): mixed
{
$operator = $this->attributes['operator'];
$left = $this->nodes['left']->evaluate($functions, $values);

if (isset(self::FUNCTIONS[$operator])) {
$right = $this->nodes['right']->evaluate($functions, $values);

if ('not in' === $operator) {
return !self::inArray($left, $right);
}
$f = self::FUNCTIONS[$operator];

return $f($left, $right);
}

switch ($operator) {
case 'or':
case '||':
return $left || $this->nodes['right']->evaluate($functions, $values);
case 'and':
case '&&':
return $left && $this->nodes['right']->evaluate($functions, $values);
}

$right = $this->nodes['right']->evaluate($functions, $values);

switch ($operator) {
case '|':
return $left | $right;
case '^':
return $left ^ $right;
case '&':
return $left & $right;
case '==':
return $left == $right;
case '===':
return $left === $right;
case '!=':
return $left != $right;
case '!==':
return $left !== $right;
case '<':
return $left < $right;
case '>':
return $left > $right;
case '>=':
return $left >= $right;
case '<=':
return $left <= $right;
case 'not in':
return !self::inArray($left, $right);
case 'in':
return self::inArray($left, $right);
case '+':
return $left + $right;
case '-':
return $left - $right;
case '~':
return $left.$right;
case '*':
return $left * $right;
case '/':
if (0 == $right) {
throw new \DivisionByZeroError('Division by zero.');
}

return $left / $right;
case '%':
if (0 == $right) {
throw new \DivisionByZeroError('Modulo by zero.');
}

return $left % $right;
case 'matches':
return $this->evaluateMatches($right, $left);
}
}

public function toArray(): array
{
return ['(', $this->nodes['left'], ' '.$this->attributes['operator'].' ', $this->nodes['right'], ')'];
}




public static function inArray($value, array $array): bool
{
if (false === $key = array_search($value, $array)) {
return false;
}

if (!\in_array($value, $array, true)) {
trigger_deprecation('symfony/expression-language', '6.3', 'The "in" operator will use strict comparisons in Symfony 7.0. Loose match found with key "%s" for value %s. Normalize the array parameter so it only has the expected types or implement loose matching in your own expression function.', $key, json_encode($value));
}

return true;
}

private function evaluateMatches(string $regexp, ?string $str): int
{
set_error_handler(static fn ($t, $m) => throw new SyntaxError(\sprintf('Regexp "%s" passed to "matches" is not valid', $regexp).substr($m, 12)));
try {
return preg_match($regexp, (string) $str);
} finally {
restore_error_handler();
}
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class FunctionNode extends Node
{
public function __construct(string $name, Node $arguments)
{
parent::__construct(
['arguments' => $arguments],
['name' => $name]
);
}

public function compile(Compiler $compiler): void
{
$arguments = [];
foreach ($this->nodes['arguments']->nodes as $node) {
$arguments[] = $compiler->subcompile($node);
}

$function = $compiler->getFunction($this->attributes['name']);

$compiler->raw($function['compiler'](...$arguments));
}

public function evaluate(array $functions, array $values): mixed
{
$arguments = [$values];
foreach ($this->nodes['arguments']->nodes as $node) {
$arguments[] = $node->evaluate($functions, $values);
}

return $functions[$this->attributes['name']]['evaluator'](...$arguments);
}




public function toArray()
{
$array = [];
$array[] = $this->attributes['name'];

foreach ($this->nodes['arguments']->nodes as $node) {
$array[] = ', ';
$array[] = $node;
}
$array[1] = '(';
$array[] = ')';

return $array;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class ArgumentsNode extends ArrayNode
{
public function compile(Compiler $compiler): void
{
$this->compileArguments($compiler, false);
}

public function toArray(): array
{
$array = [];

foreach ($this->getKeyValuePairs() as $pair) {
$array[] = $pair['value'];
$array[] = ', ';
}
array_pop($array);

return $array;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class ArrayNode extends Node
{
protected int $index;

public function __construct()
{
$this->index = -1;
}

public function addElement(Node $value, ?Node $key = null): void
{
$key ??= new ConstantNode(++$this->index);

array_push($this->nodes, $key, $value);
}




public function compile(Compiler $compiler): void
{
$compiler->raw('[');
$this->compileArguments($compiler);
$compiler->raw(']');
}

public function evaluate(array $functions, array $values): array
{
$result = [];
foreach ($this->getKeyValuePairs() as $pair) {
$result[$pair['key']->evaluate($functions, $values)] = $pair['value']->evaluate($functions, $values);
}

return $result;
}

public function toArray(): array
{
$value = [];
foreach ($this->getKeyValuePairs() as $pair) {
$value[$pair['key']->attributes['value']] = $pair['value'];
}

$array = [];

if ($this->isHash($value)) {
foreach ($value as $k => $v) {
$array[] = ', ';
$array[] = new ConstantNode($k);
$array[] = ': ';
$array[] = $v;
}
$array[0] = '{';
$array[] = '}';
} else {
foreach ($value as $v) {
$array[] = ', ';
$array[] = $v;
}
$array[0] = '[';
$array[] = ']';
}

return $array;
}

protected function getKeyValuePairs(): array
{
$pairs = [];
foreach (array_chunk($this->nodes, 2) as $pair) {
$pairs[] = ['key' => $pair[0], 'value' => $pair[1]];
}

return $pairs;
}

protected function compileArguments(Compiler $compiler, bool $withKeys = true): void
{
$first = true;
foreach ($this->getKeyValuePairs() as $pair) {
if (!$first) {
$compiler->raw(', ');
}
$first = false;

if ($withKeys) {
$compiler
->compile($pair['key'])
->raw(' => ')
;
}

$compiler->compile($pair['value']);
}
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class Node
{
public $nodes = [];
public $attributes = [];





public function __construct(array $nodes = [], array $attributes = [])
{
$this->nodes = $nodes;
$this->attributes = $attributes;
}

public function __toString(): string
{
$attributes = [];
foreach ($this->attributes as $name => $value) {
$attributes[] = \sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
}

$repr = [str_replace('Symfony\Component\ExpressionLanguage\Node\\', '', static::class).'('.implode(', ', $attributes)];

if (\count($this->nodes)) {
foreach ($this->nodes as $node) {
foreach (explode("\n", (string) $node) as $line) {
$repr[] = '    '.$line;
}
}

$repr[] = ')';
} else {
$repr[0] .= ')';
}

return implode("\n", $repr);
}




public function compile(Compiler $compiler)
{
foreach ($this->nodes as $node) {
$node->compile($compiler);
}
}




public function evaluate(array $functions, array $values)
{
$results = [];
foreach ($this->nodes as $node) {
$results[] = $node->evaluate($functions, $values);
}

return $results;
}






public function toArray()
{
throw new \BadMethodCallException(\sprintf('Dumping a "%s" instance is not supported yet.', static::class));
}




public function dump()
{
$dump = '';

foreach ($this->toArray() as $v) {
$dump .= \is_scalar($v) ? $v : $v->dump();
}

return $dump;
}




protected function dumpString(string $value)
{
return \sprintf('"%s"', addcslashes($value, "\0\t\"\\"));
}




protected function isHash(array $value)
{
$expectedKey = 0;

foreach ($value as $key => $val) {
if ($key !== $expectedKey++) {
return true;
}
}

return false;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class NullCoalesceNode extends Node
{
public function __construct(Node $expr1, Node $expr2)
{
parent::__construct(['expr1' => $expr1, 'expr2' => $expr2]);
}

public function compile(Compiler $compiler): void
{
$compiler
->raw('((')
->compile($this->nodes['expr1'])
->raw(') ?? (')
->compile($this->nodes['expr2'])
->raw('))')
;
}

public function evaluate(array $functions, array $values): mixed
{
if ($this->nodes['expr1'] instanceof GetAttrNode) {
$this->addNullCoalesceAttributeToGetAttrNodes($this->nodes['expr1']);
}

return $this->nodes['expr1']->evaluate($functions, $values) ?? $this->nodes['expr2']->evaluate($functions, $values);
}

public function toArray(): array
{
return ['(', $this->nodes['expr1'], ') ?? (', $this->nodes['expr2'], ')'];
}

private function addNullCoalesceAttributeToGetAttrNodes(Node $node): void
{
if (!$node instanceof GetAttrNode) {
return;
}

$node->attributes['is_null_coalesce'] = true;

foreach ($node->nodes as $node) {
$this->addNullCoalesceAttributeToGetAttrNodes($node);
}
}
}
<?php










namespace Symfony\Component\ExpressionLanguage\Node;

use Symfony\Component\ExpressionLanguage\Compiler;






class UnaryNode extends Node
{
private const OPERATORS = [
'!' => '!',
'not' => '!',
'+' => '+',
'-' => '-',
];

public function __construct(string $operator, Node $node)
{
parent::__construct(
['node' => $node],
['operator' => $operator]
);
}

public function compile(Compiler $compiler): void
{
$compiler
->raw('(')
->raw(self::OPERATORS[$this->attributes['operator']])
->compile($this->nodes['node'])
->raw(')')
;
}

public function evaluate(array $functions, array $values): mixed
{
$value = $this->nodes['node']->evaluate($functions, $values);

return match ($this->attributes['operator']) {
'not',
'!' => !$value,
'-' => -$value,
default => $value,
};
}

public function toArray(): array
{
return ['(', $this->attributes['operator'].' ', $this->nodes['node'], ')'];
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;

class SyntaxError extends \LogicException
{
public function __construct(string $message, int $cursor = 0, string $expression = '', ?string $subject = null, ?array $proposals = null)
{
$message = \sprintf('%s around position %d', rtrim($message, '.'), $cursor);
if ($expression) {
$message = \sprintf('%s for expression `%s`', $message, $expression);
}
$message .= '.';

if (null !== $subject && null !== $proposals) {
$minScore = \INF;
foreach ($proposals as $proposal) {
$distance = levenshtein($subject, $proposal);
if ($distance < $minScore) {
$guess = $proposal;
$minScore = $distance;
}
}

if (isset($guess) && $minScore < 3) {
$message .= \sprintf(' Did you mean "%s"?', $guess);
}
}

parent::__construct($message);
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;

use Symfony\Component\ExpressionLanguage\Node\Node;






class SerializedParsedExpression extends ParsedExpression
{
private string $nodes;





public function __construct(string $expression, string $nodes)
{
$this->expression = $expression;
$this->nodes = $nodes;
}




public function getNodes()
{
return unserialize($this->nodes);
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;






class Expression
{
protected $expression;

public function __construct(string $expression)
{
$this->expression = $expression;
}




public function __toString(): string
{
return $this->expression;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;






class Token
{
public $value;
public $type;
public $cursor;

public const EOF_TYPE = 'end of expression';
public const NAME_TYPE = 'name';
public const NUMBER_TYPE = 'number';
public const STRING_TYPE = 'string';
public const OPERATOR_TYPE = 'operator';
public const PUNCTUATION_TYPE = 'punctuation';





public function __construct(string $type, string|int|float|null $value, ?int $cursor)
{
$this->type = $type;
$this->value = $value;
$this->cursor = $cursor;
}




public function __toString(): string
{
return \sprintf('%3d %-11s %s', $this->cursor, strtoupper($this->type), $this->value);
}




public function test(string $type, ?string $value = null): bool
{
return $this->type === $type && (null === $value || $this->value == $value);
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;











class Parser
{
public const OPERATOR_LEFT = 1;
public const OPERATOR_RIGHT = 2;

private TokenStream $stream;
private array $unaryOperators;
private array $binaryOperators;
private array $functions;
private ?array $names;
private bool $lint = false;

public function __construct(array $functions)
{
$this->functions = $functions;

$this->unaryOperators = [
'not' => ['precedence' => 50],
'!' => ['precedence' => 50],
'-' => ['precedence' => 500],
'+' => ['precedence' => 500],
];
$this->binaryOperators = [
'or' => ['precedence' => 10, 'associativity' => self::OPERATOR_LEFT],
'||' => ['precedence' => 10, 'associativity' => self::OPERATOR_LEFT],
'and' => ['precedence' => 15, 'associativity' => self::OPERATOR_LEFT],
'&&' => ['precedence' => 15, 'associativity' => self::OPERATOR_LEFT],
'|' => ['precedence' => 16, 'associativity' => self::OPERATOR_LEFT],
'^' => ['precedence' => 17, 'associativity' => self::OPERATOR_LEFT],
'&' => ['precedence' => 18, 'associativity' => self::OPERATOR_LEFT],
'==' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'===' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'!=' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'!==' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'<' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'>' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'>=' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'<=' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'not in' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'in' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'contains' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'starts with' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'ends with' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'matches' => ['precedence' => 20, 'associativity' => self::OPERATOR_LEFT],
'..' => ['precedence' => 25, 'associativity' => self::OPERATOR_LEFT],
'+' => ['precedence' => 30, 'associativity' => self::OPERATOR_LEFT],
'-' => ['precedence' => 30, 'associativity' => self::OPERATOR_LEFT],
'~' => ['precedence' => 40, 'associativity' => self::OPERATOR_LEFT],
'*' => ['precedence' => 60, 'associativity' => self::OPERATOR_LEFT],
'/' => ['precedence' => 60, 'associativity' => self::OPERATOR_LEFT],
'%' => ['precedence' => 60, 'associativity' => self::OPERATOR_LEFT],
'**' => ['precedence' => 200, 'associativity' => self::OPERATOR_RIGHT],
];
}
















public function parse(TokenStream $stream, array $names = []): Node\Node
{
$this->lint = false;

return $this->doParse($stream, $names);
}









public function lint(TokenStream $stream, ?array $names = []): void
{
$this->lint = true;
$this->doParse($stream, $names);
}




private function doParse(TokenStream $stream, ?array $names = []): Node\Node
{
$this->stream = $stream;
$this->names = $names;

$node = $this->parseExpression();
if (!$stream->isEOF()) {
throw new SyntaxError(\sprintf('Unexpected token "%s" of value "%s".', $stream->current->type, $stream->current->value), $stream->current->cursor, $stream->getExpression());
}

unset($this->stream, $this->names);

return $node;
}




public function parseExpression(int $precedence = 0)
{
$expr = $this->getPrimary();
$token = $this->stream->current;
while ($token->test(Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->value]) && $this->binaryOperators[$token->value]['precedence'] >= $precedence) {
$op = $this->binaryOperators[$token->value];
$this->stream->next();

$expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
$expr = new Node\BinaryNode($token->value, $expr, $expr1);

$token = $this->stream->current;
}

if (0 === $precedence) {
return $this->parseConditionalExpression($expr);
}

return $expr;
}




protected function getPrimary()
{
$token = $this->stream->current;

if ($token->test(Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->value])) {
$operator = $this->unaryOperators[$token->value];
$this->stream->next();
$expr = $this->parseExpression($operator['precedence']);

return $this->parsePostfixExpression(new Node\UnaryNode($token->value, $expr));
}

if ($token->test(Token::PUNCTUATION_TYPE, '(')) {
$this->stream->next();
$expr = $this->parseExpression();
$this->stream->expect(Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed');

return $this->parsePostfixExpression($expr);
}

return $this->parsePrimaryExpression();
}




protected function parseConditionalExpression(Node\Node $expr)
{
while ($this->stream->current->test(Token::PUNCTUATION_TYPE, '??')) {
$this->stream->next();
$expr2 = $this->parseExpression();

$expr = new Node\NullCoalesceNode($expr, $expr2);
}

while ($this->stream->current->test(Token::PUNCTUATION_TYPE, '?')) {
$this->stream->next();
if (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ':')) {
$expr2 = $this->parseExpression();
if ($this->stream->current->test(Token::PUNCTUATION_TYPE, ':')) {
$this->stream->next();
$expr3 = $this->parseExpression();
} else {
$expr3 = new Node\ConstantNode(null);
}
} else {
$this->stream->next();
$expr2 = $expr;
$expr3 = $this->parseExpression();
}

$expr = new Node\ConditionalNode($expr, $expr2, $expr3);
}

return $expr;
}




public function parsePrimaryExpression()
{
$token = $this->stream->current;
switch ($token->type) {
case Token::NAME_TYPE:
$this->stream->next();
switch ($token->value) {
case 'true':
case 'TRUE':
return new Node\ConstantNode(true);

case 'false':
case 'FALSE':
return new Node\ConstantNode(false);

case 'null':
case 'NULL':
return new Node\ConstantNode(null);

default:
if ('(' === $this->stream->current->value) {
if (false === isset($this->functions[$token->value])) {
throw new SyntaxError(\sprintf('The function "%s" does not exist.', $token->value), $token->cursor, $this->stream->getExpression(), $token->value, array_keys($this->functions));
}

$node = new Node\FunctionNode($token->value, $this->parseArguments());
} else {
if (!$this->lint || \is_array($this->names)) {
if (!\in_array($token->value, $this->names, true)) {
throw new SyntaxError(\sprintf('Variable "%s" is not valid.', $token->value), $token->cursor, $this->stream->getExpression(), $token->value, $this->names);
}



if (\is_int($name = array_search($token->value, $this->names))) {
$name = $token->value;
}
} else {
$name = $token->value;
}

$node = new Node\NameNode($name);
}
}
break;

case Token::NUMBER_TYPE:
case Token::STRING_TYPE:
$this->stream->next();

return new Node\ConstantNode($token->value);

default:
if ($token->test(Token::PUNCTUATION_TYPE, '[')) {
$node = $this->parseArrayExpression();
} elseif ($token->test(Token::PUNCTUATION_TYPE, '{')) {
$node = $this->parseHashExpression();
} else {
throw new SyntaxError(\sprintf('Unexpected token "%s" of value "%s".', $token->type, $token->value), $token->cursor, $this->stream->getExpression());
}
}

return $this->parsePostfixExpression($node);
}




public function parseArrayExpression()
{
$this->stream->expect(Token::PUNCTUATION_TYPE, '[', 'An array element was expected');

$node = new Node\ArrayNode();
$first = true;
while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ']')) {
if (!$first) {
$this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma');


if ($this->stream->current->test(Token::PUNCTUATION_TYPE, ']')) {
break;
}
}
$first = false;

$node->addElement($this->parseExpression());
}
$this->stream->expect(Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed');

return $node;
}




public function parseHashExpression()
{
$this->stream->expect(Token::PUNCTUATION_TYPE, '{', 'A hash element was expected');

$node = new Node\ArrayNode();
$first = true;
while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, '}')) {
if (!$first) {
$this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma');


if ($this->stream->current->test(Token::PUNCTUATION_TYPE, '}')) {
break;
}
}
$first = false;







if ($this->stream->current->test(Token::STRING_TYPE) || $this->stream->current->test(Token::NAME_TYPE) || $this->stream->current->test(Token::NUMBER_TYPE)) {
$key = new Node\ConstantNode($this->stream->current->value);
$this->stream->next();
} elseif ($this->stream->current->test(Token::PUNCTUATION_TYPE, '(')) {
$key = $this->parseExpression();
} else {
$current = $this->stream->current;

throw new SyntaxError(\sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', $current->type, $current->value), $current->cursor, $this->stream->getExpression());
}

$this->stream->expect(Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)');
$value = $this->parseExpression();

$node->addElement($value, $key);
}
$this->stream->expect(Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed');

return $node;
}




public function parsePostfixExpression(Node\Node $node)
{
$token = $this->stream->current;
while (Token::PUNCTUATION_TYPE == $token->type) {
if ('.' === $token->value || '?.' === $token->value) {
$isNullSafe = '?.' === $token->value;
$this->stream->next();
$token = $this->stream->current;
$this->stream->next();

if (
Token::NAME_TYPE !== $token->type











&& (Token::OPERATOR_TYPE !== $token->type || !preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A', $token->value))
) {
throw new SyntaxError('Expected name.', $token->cursor, $this->stream->getExpression());
}

$arg = new Node\ConstantNode($token->value, true, $isNullSafe);

$arguments = new Node\ArgumentsNode();
if ($this->stream->current->test(Token::PUNCTUATION_TYPE, '(')) {
$type = Node\GetAttrNode::METHOD_CALL;
foreach ($this->parseArguments()->nodes as $n) {
$arguments->addElement($n);
}
} else {
$type = Node\GetAttrNode::PROPERTY_CALL;
}

$node = new Node\GetAttrNode($node, $arg, $arguments, $type);
} elseif ('[' === $token->value) {
$this->stream->next();
$arg = $this->parseExpression();
$this->stream->expect(Token::PUNCTUATION_TYPE, ']');

$node = new Node\GetAttrNode($node, $arg, new Node\ArgumentsNode(), Node\GetAttrNode::ARRAY_CALL);
} else {
break;
}

$token = $this->stream->current;
}

return $node;
}






public function parseArguments()
{
$args = [];
$this->stream->expect(Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis');
while (!$this->stream->current->test(Token::PUNCTUATION_TYPE, ')')) {
if ($args) {
$this->stream->expect(Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
}

$args[] = $this->parseExpression();
}
$this->stream->expect(Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');

return new Node\Node($args);
}
}
<?php










if ('cli' !== \PHP_SAPI) {
throw new Exception('This script must be run from the command line.');
}

$operators = ['not', '!', 'or', '||', '&&', 'and', '|', '^', '&', '==', '===', '!=', '!==', '<', '>', '>=', '<=', 'not in', 'in', '..', '+', '-', '~', '*', '/', '%', 'contains', 'starts with', 'ends with', 'matches', '**'];
$operators = array_combine($operators, array_map('strlen', $operators));
arsort($operators);

$regex = [];
foreach ($operators as $operator => $length) {



$regex[] =
(ctype_alpha($operator[0]) ? '(?<=^|[\s(])' : '')
.preg_quote($operator, '/')
.(ctype_alpha($operator[$length - 1]) ? '(?=[\s(])' : '');
}

echo '/'.implode('|', $regex).'/A';
<?php










namespace Symfony\Component\ExpressionLanguage;






class TokenStream
{
public $current;

private array $tokens;
private int $position = 0;
private string $expression;

public function __construct(array $tokens, string $expression = '')
{
$this->tokens = $tokens;
$this->current = $tokens[0];
$this->expression = $expression;
}




public function __toString(): string
{
return implode("\n", $this->tokens);
}






public function next()
{
++$this->position;

if (!isset($this->tokens[$this->position])) {
throw new SyntaxError('Unexpected end of expression.', $this->current->cursor, $this->expression);
}

$this->current = $this->tokens[$this->position];
}






public function expect(string $type, ?string $value = null, ?string $message = null)
{
$token = $this->current;
if (!$token->test($type, $value)) {
throw new SyntaxError(\sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s).', $message ? $message.'. ' : '', $token->type, $token->value, $type, $value ? \sprintf(' with value "%s"', $value) : ''), $token->cursor, $this->expression);
}
$this->next();
}




public function isEOF(): bool
{
return Token::EOF_TYPE === $this->current->type;
}




public function getExpression(): string
{
return $this->expression;
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;

use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;


class_exists(ParsedExpression::class);






class ExpressionLanguage
{
private CacheItemPoolInterface $cache;
private Lexer $lexer;
private Parser $parser;
private Compiler $compiler;

protected array $functions = [];




public function __construct(?CacheItemPoolInterface $cache = null, array $providers = [])
{
$this->cache = $cache ?? new ArrayAdapter();
$this->registerFunctions();
foreach ($providers as $provider) {
$this->registerProvider($provider);
}
}




public function compile(Expression|string $expression, array $names = []): string
{
return $this->getCompiler()->compile($this->parse($expression, $names)->getNodes())->getSource();
}




public function evaluate(Expression|string $expression, array $values = []): mixed
{
return $this->parse($expression, array_keys($values))->getNodes()->evaluate($this->functions, $values);
}




public function parse(Expression|string $expression, array $names): ParsedExpression
{
if ($expression instanceof ParsedExpression) {
return $expression;
}

asort($names);
$cacheKeyItems = [];

foreach ($names as $nameKey => $name) {
$cacheKeyItems[] = \is_int($nameKey) ? $name : $nameKey.':'.$name;
}

$cacheItem = $this->cache->getItem(rawurlencode($expression.'//'.implode('|', $cacheKeyItems)));

if (null === $parsedExpression = $cacheItem->get()) {
$nodes = $this->getParser()->parse($this->getLexer()->tokenize((string) $expression), $names);
$parsedExpression = new ParsedExpression((string) $expression, $nodes);

$cacheItem->set($parsedExpression);
$this->cache->save($cacheItem);
}

return $parsedExpression;
}








public function lint(Expression|string $expression, ?array $names): void
{
if ($expression instanceof ParsedExpression) {
return;
}

$this->getParser()->lint($this->getLexer()->tokenize((string) $expression), $names);
}













public function register(string $name, callable $compiler, callable $evaluator)
{
if (isset($this->parser)) {
throw new \LogicException('Registering functions after calling evaluate(), compile() or parse() is not supported.');
}

$this->functions[$name] = ['compiler' => $compiler, 'evaluator' => $evaluator];
}




public function addFunction(ExpressionFunction $function)
{
$this->register($function->getName(), $function->getCompiler(), $function->getEvaluator());
}




public function registerProvider(ExpressionFunctionProviderInterface $provider)
{
foreach ($provider->getFunctions() as $function) {
$this->addFunction($function);
}
}




protected function registerFunctions()
{
$this->addFunction(ExpressionFunction::fromPhp('constant'));

$this->addFunction(new ExpressionFunction('enum',
static fn ($str): string => \sprintf("(\constant(\$v = (%s))) instanceof \UnitEnum ? \constant(\$v) : throw new \TypeError(\sprintf('The string \"%%s\" is not the name of a valid enum case.', \$v))", $str),
static function ($arguments, $str): \UnitEnum {
$value = \constant($str);

if (!$value instanceof \UnitEnum) {
throw new \TypeError(\sprintf('The string "%s" is not the name of a valid enum case.', $str));
}

return $value;
}
));
}

private function getLexer(): Lexer
{
return $this->lexer ??= new Lexer();
}

private function getParser(): Parser
{
return $this->parser ??= new Parser($this->functions);
}

private function getCompiler(): Compiler
{
$this->compiler ??= new Compiler($this->functions);

return $this->compiler->reset();
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;


















class ExpressionFunction
{
private string $name;
private \Closure $compiler;
private \Closure $evaluator;






public function __construct(string $name, callable $compiler, callable $evaluator)
{
$this->name = $name;
$this->compiler = $compiler(...);
$this->evaluator = $evaluator(...);
}

public function getName(): string
{
return $this->name;
}

public function getCompiler(): \Closure
{
return $this->compiler;
}

public function getEvaluator(): \Closure
{
return $this->evaluator;
}










public static function fromPhp(string $phpFunctionName, ?string $expressionFunctionName = null): self
{
$phpFunctionName = ltrim($phpFunctionName, '\\');
if (!\function_exists($phpFunctionName)) {
throw new \InvalidArgumentException(\sprintf('PHP function "%s" does not exist.', $phpFunctionName));
}

$parts = explode('\\', $phpFunctionName);
if (!$expressionFunctionName && \count($parts) > 1) {
throw new \InvalidArgumentException(\sprintf('An expression function name must be defined when PHP function "%s" is namespaced.', $phpFunctionName));
}

$compiler = fn (...$args) => \sprintf('\%s(%s)', $phpFunctionName, implode(', ', $args));

$evaluator = fn ($p, ...$args) => $phpFunctionName(...$args);

return new self($expressionFunctionName ?: end($parts), $compiler, $evaluator);
}
}
<?php










namespace Symfony\Component\ExpressionLanguage;

use Symfony\Contracts\Service\ResetInterface;






class Compiler implements ResetInterface
{
private string $source = '';
private array $functions;

public function __construct(array $functions)
{
$this->functions = $functions;
}




public function getFunction(string $name)
{
return $this->functions[$name];
}




public function getSource(): string
{
return $this->source;
}




public function reset(): static
{
$this->source = '';

return $this;
}






public function compile(Node\Node $node): static
{
$node->compile($this);

return $this;
}




public function subcompile(Node\Node $node)
{
$current = $this->source;
$this->source = '';

$node->compile($this);

$source = $this->source;
$this->source = $current;

return $source;
}






public function raw(string $string): static
{
$this->source .= $string;

return $this;
}






public function string(string $value): static
{
$this->source .= \sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));

return $this;
}






public function repr(mixed $value): static
{
if (\is_int($value) || \is_float($value)) {
if (false !== $locale = setlocale(\LC_NUMERIC, 0)) {
setlocale(\LC_NUMERIC, 'C');
}

$this->raw($value);

if (false !== $locale) {
setlocale(\LC_NUMERIC, $locale);
}
} elseif (null === $value) {
$this->raw('null');
} elseif (\is_bool($value)) {
$this->raw($value ? 'true' : 'false');
} elseif (\is_array($value)) {
$this->raw('[');
$first = true;
foreach ($value as $key => $value) {
if (!$first) {
$this->raw(', ');
}
$first = false;
$this->repr($key);
$this->raw(' => ');
$this->repr($value);
}
$this->raw(']');
} else {
$this->string($value);
}

return $this;
}
}
Copyright (c) 2022-present 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.
<?php










namespace Symfony\Polyfill\Php83;







final class Php83
{
private const JSON_MAX_DEPTH = 0x7FFFFFFF; 

public static function json_validate(string $json, int $depth = 512, int $flags = 0): bool
{
if (0 !== $flags && \defined('JSON_INVALID_UTF8_IGNORE') && \JSON_INVALID_UTF8_IGNORE !== $flags) {
throw new \ValueError('json_validate(): Argument #3 ($flags) must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)');
}

if ($depth <= 0) {
throw new \ValueError('json_validate(): Argument #2 ($depth) must be greater than 0');
}

if ($depth > self::JSON_MAX_DEPTH) {
throw new \ValueError(sprintf('json_validate(): Argument #2 ($depth) must be less than %d', self::JSON_MAX_DEPTH));
}

json_decode($json, true, $depth, $flags);

return \JSON_ERROR_NONE === json_last_error();
}

public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string
{
if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) {
throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH');
}

if (null === $encoding) {
$encoding = mb_internal_encoding();
}

try {
$validEncoding = @mb_check_encoding('', $encoding);
} catch (\ValueError $e) {
throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
}


if (!$validEncoding) {
throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding));
}

if (mb_strlen($pad_string, $encoding) <= 0) {
throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string');
}

$paddingRequired = $length - mb_strlen($string, $encoding);

if ($paddingRequired < 1) {
return $string;
}

switch ($pad_type) {
case \STR_PAD_LEFT:
return mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string;
case \STR_PAD_RIGHT:
return $string.mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding);
default:
$leftPaddingLength = floor($paddingRequired / 2);
$rightPaddingLength = $paddingRequired - $leftPaddingLength;

return mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding);
}
}

public static function str_increment(string $string): string
{
if ('' === $string) {
throw new \ValueError('str_increment(): Argument #1 ($string) cannot be empty');
}

if (!preg_match('/^[a-zA-Z0-9]+$/', $string)) {
throw new \ValueError('str_increment(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters');
}

if (is_numeric($string)) {
$offset = stripos($string, 'e');
if (false !== $offset) {
$char = $string[$offset];
++$char;
$string[$offset] = $char;
++$string;

switch ($string[$offset]) {
case 'f':
$string[$offset] = 'e';
break;
case 'F':
$string[$offset] = 'E';
break;
case 'g':
$string[$offset] = 'f';
break;
case 'G':
$string[$offset] = 'F';
break;
}

return $string;
}
}

return ++$string;
}

public static function str_decrement(string $string): string
{
if ('' === $string) {
throw new \ValueError('str_decrement(): Argument #1 ($string) cannot be empty');
}

if (!preg_match('/^[a-zA-Z0-9]+$/', $string)) {
throw new \ValueError('str_decrement(): Argument #1 ($string) must be composed only of alphanumeric ASCII characters');
}

if (preg_match('/\A(?:0[aA0]?|[aA])\z/', $string)) {
throw new \ValueError(sprintf('str_decrement(): Argument #1 ($string) "%s" is out of decrement range', $string));
}

if (!\in_array(substr($string, -1), ['A', 'a', '0'], true)) {
return implode('', \array_slice(str_split($string), 0, -1)).\chr(\ord(substr($string, -1)) - 1);
}

$carry = '';
$decremented = '';

for ($i = \strlen($string) - 1; $i >= 0; --$i) {
$char = $string[$i];

switch ($char) {
case 'A':
if ('' !== $carry) {
$decremented = $carry.$decremented;
$carry = '';
}
$carry = 'Z';

break;
case 'a':
if ('' !== $carry) {
$decremented = $carry.$decremented;
$carry = '';
}
$carry = 'z';

break;
case '0':
if ('' !== $carry) {
$decremented = $carry.$decremented;
$carry = '';
}
$carry = '9';

break;
case '1':
if ('' !== $carry) {
$decremented = $carry.$decremented;
$carry = '';
}

break;
default:
if ('' !== $carry) {
$decremented = $carry.$decremented;
$carry = '';
}

if (!\in_array($char, ['A', 'a', '0'], true)) {
$decremented = \chr(\ord($char) - 1).$decremented;
}
}
}

return $decremented;
}
}
<?php










if (\PHP_VERSION_ID >= 80300) {
return;
}

if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) {
function ldap_exop_sync(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); }
}

if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) {
function ldap_connect_wallet(?string $uri, string $wallet, #[\SensitiveParameter] string $password, int $auth_mode = \GSLC_SSL_NO_AUTH): \LDAP\Connection|false { return ldap_connect($uri, $wallet, $password, $auth_mode); }
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateObjectError extends DateError
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateError extends Error
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateInvalidOperationException extends DateException
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateRangeError extends DateError
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateException extends Exception
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateMalformedPeriodStringException extends DateException
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateMalformedIntervalStringException extends DateException
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class SQLite3Exception extends Exception
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateMalformedStringException extends DateException
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
class DateInvalidTimeZoneException extends DateException
{
}
}
<?php










if (\PHP_VERSION_ID < 80300) {
#[Attribute(Attribute::TARGET_METHOD)]
final class Override
{
public function __construct()
{
}
}
}
<?php










use Symfony\Polyfill\Php83 as p;

if (\PHP_VERSION_ID >= 80300) {
return;
}

if (!function_exists('json_validate')) {
function json_validate(string $json, int $depth = 512, int $flags = 0): bool { return p\Php83::json_validate($json, $depth, $flags); }
}

if (extension_loaded('mbstring')) {
if (!function_exists('mb_str_pad')) {
function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Php83::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); }
}
}

if (!function_exists('stream_context_set_options')) {
function stream_context_set_options($context, array $options): bool { return stream_context_set_option($context, $options); }
}

if (!function_exists('str_increment')) {
function str_increment(string $string): string { return p\Php83::str_increment($string); }
}

if (!function_exists('str_decrement')) {
function str_decrement(string $string): string { return p\Php83::str_decrement($string); }
}

if (\PHP_VERSION_ID >= 80100) {
return require __DIR__.'/bootstrap81.php';
}

if (!function_exists('ldap_exop_sync') && function_exists('ldap_exop')) {
function ldap_exop_sync($ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, &$response_data = null, &$response_oid = null): bool { return ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid); }
}

if (!function_exists('ldap_connect_wallet') && function_exists('ldap_connect')) {
function ldap_connect_wallet(?string $uri, string $wallet, string $password, int $auth_mode = \GSLC_SSL_NO_AUTH) { return ldap_connect($uri, $wallet, $password, $auth_mode); }
}
Copyright (c) 2004-present 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.
<?php










namespace Symfony\Component\Yaml;









class Escaper
{

public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";





private const ESCAPEES = ['\\', '\\\\', '\\"', '"',
"\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07",
"\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f",
"\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17",
"\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f",
"\x7f",
"\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",
];
private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"',
'\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
'\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f',
'\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
'\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f',
'\\x7f',
'\\N', '\\_', '\\L', '\\P',
];






public static function requiresDoubleQuoting(string $value): bool
{
return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
}






public static function escapeWithDoubleQuotes(string $value): string
{
return \sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value));
}






public static function requiresSingleQuoting(string $value): bool
{


if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) {
return true;
}



return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value);
}






public static function escapeWithSingleQuotes(string $value): string
{
return \sprintf("'%s'", str_replace('\'', '\'\'', $value));
}
}
<?php










namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;








class Yaml
{
public const DUMP_OBJECT = 1;
public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2;
public const PARSE_OBJECT = 4;
public const PARSE_OBJECT_FOR_MAP = 8;
public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16;
public const PARSE_DATETIME = 32;
public const DUMP_OBJECT_AS_MAP = 64;
public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128;
public const PARSE_CONSTANT = 256;
public const PARSE_CUSTOM_TAGS = 512;
public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;
public const DUMP_NULL_AS_TILDE = 2048;
public const DUMP_NUMERIC_KEY_AS_STRING = 4096;














public static function parseFile(string $filename, int $flags = 0): mixed
{
$yaml = new Parser();

return $yaml->parseFile($filename, $flags);
}















public static function parse(string $input, int $flags = 0): mixed
{
$yaml = new Parser();

return $yaml->parse($input, $flags);
}












public static function dump(mixed $input, int $inline = 2, int $indent = 4, int $flags = 0): string
{
$yaml = new Dumper($indent);

return $yaml->dump($input, $inline, 0, $flags);
}
}
<?php










namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\DumpException;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Tag\TaggedValue;








class Inline
{
public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')';

public static int $parsedLineNumber = -1;
public static ?string $parsedFilename = null;

private static bool $exceptionOnInvalidType = false;
private static bool $objectSupport = false;
private static bool $objectForMap = false;
private static bool $constantSupport = false;

public static function initialize(int $flags, ?int $parsedLineNumber = null, ?string $parsedFilename = null): void
{
self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
self::$parsedFilename = $parsedFilename;

if (null !== $parsedLineNumber) {
self::$parsedLineNumber = $parsedLineNumber;
}
}









public static function parse(string $value, int $flags = 0, array &$references = []): mixed
{
self::initialize($flags);

$value = trim($value);

if ('' === $value) {
return '';
}

$i = 0;
$tag = self::parseTag($value, $i, $flags);
switch ($value[$i]) {
case '[':
$result = self::parseSequence($value, $flags, $i, $references);
++$i;
break;
case '{':
$result = self::parseMapping($value, $flags, $i, $references);
++$i;
break;
default:
$result = self::parseScalar($value, $flags, null, $i, true, $references);
}


if (preg_replace('/\s*#.*$/A', '', substr($value, $i))) {
throw new ParseException(\sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

if (null !== $tag && '' !== $tag) {
return new TaggedValue($tag, $result);
}

return $result;
}









public static function dump(mixed $value, int $flags = 0): string
{
switch (true) {
case \is_resource($value):
if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
throw new DumpException(\sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
}

return self::dumpNull($flags);
case $value instanceof \DateTimeInterface:
return $value->format(match (true) {
!$length = \strlen(rtrim($value->format('u'), '0')) => 'c',
$length < 4 => 'Y-m-d\TH:i:s.vP',
default => 'Y-m-d\TH:i:s.uP',
});
case $value instanceof \UnitEnum:
return \sprintf('!php/const %s::%s', $value::class, $value->name);
case \is_object($value):
if ($value instanceof TaggedValue) {
return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);
}

if (Yaml::DUMP_OBJECT & $flags) {
return '!php/object '.self::dump(serialize($value));
}

if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) {
return self::dumpHashArray($value, $flags);
}

if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
throw new DumpException('Object support when dumping a YAML file has been disabled.');
}

return self::dumpNull($flags);
case \is_array($value):
return self::dumpArray($value, $flags);
case null === $value:
return self::dumpNull($flags);
case true === $value:
return 'true';
case false === $value:
return 'false';
case \is_int($value):
return $value;
case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"):
$locale = setlocale(\LC_NUMERIC, 0);
if (false !== $locale) {
setlocale(\LC_NUMERIC, 'C');
}
if (\is_float($value)) {
$repr = (string) $value;
if (is_infinite($value)) {
$repr = str_ireplace('INF', '.Inf', $repr);
} elseif (floor($value) == $value && $repr == $value) {

if (!str_contains($repr, 'E')) {
$repr .= '.0';
}
}
} else {
$repr = \is_string($value) ? "'$value'" : (string) $value;
}
if (false !== $locale) {
setlocale(\LC_NUMERIC, $locale);
}

return $repr;
case '' == $value:
return "''";
case self::isBinaryString($value):
return '!!binary '.base64_encode($value);
case Escaper::requiresDoubleQuoting($value):
return Escaper::escapeWithDoubleQuotes($value);
case Escaper::requiresSingleQuoting($value):
$singleQuoted = Escaper::escapeWithSingleQuotes($value);
if (!str_contains($value, "'")) {
return $singleQuoted;
}

$doubleQuoted = Escaper::escapeWithDoubleQuotes($value);

return \strlen($doubleQuoted) < \strlen($singleQuoted) ? $doubleQuoted : $singleQuoted;
case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value):
case Parser::preg_match(self::getHexRegex(), $value):
case Parser::preg_match(self::getTimestampRegex(), $value):
return Escaper::escapeWithSingleQuotes($value);
default:
return $value;
}
}




public static function isHash(array|\ArrayObject|\stdClass $value): bool
{
if ($value instanceof \stdClass || $value instanceof \ArrayObject) {
return true;
}

$expectedKey = 0;

foreach ($value as $key => $val) {
if ($key !== $expectedKey++) {
return true;
}
}

return false;
}







private static function dumpArray(array $value, int $flags): string
{

if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {
$output = [];
foreach ($value as $val) {
$output[] = self::dump($val, $flags);
}

return \sprintf('[%s]', implode(', ', $output));
}

return self::dumpHashArray($value, $flags);
}







private static function dumpHashArray(array|\ArrayObject|\stdClass $value, int $flags): string
{
$output = [];
foreach ($value as $key => $val) {
if (\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) {
$key = (string) $key;
}

$output[] = \sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
}

return \sprintf('{ %s }', implode(', ', $output));
}

private static function dumpNull(int $flags): string
{
if (Yaml::DUMP_NULL_AS_TILDE & $flags) {
return '~';
}

return 'null';
}






public static function parseScalar(string $scalar, int $flags = 0, ?array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], ?bool &$isQuoted = null): mixed
{
if (\in_array($scalar[$i], ['"', "'"], true)) {

$isQuoted = true;
$output = self::parseQuotedScalar($scalar, $i);

if (null !== $delimiters) {
$tmp = ltrim(substr($scalar, $i), " \n");
if ('' === $tmp) {
throw new ParseException(\sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}
if (!\in_array($tmp[0], $delimiters)) {
throw new ParseException(\sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}
}
} else {

$isQuoted = false;

if (!$delimiters) {
$output = substr($scalar, $i);
$i += \strlen($output);


if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) {
$output = substr($output, 0, $match[0][1]);
}
} elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
$output = $match[1];
$i += \strlen($output);
$output = trim($output);
} else {
throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);
}


if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {
throw new ParseException(\sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename);
}

if ($evaluate) {
$output = self::evaluateScalar($output, $flags, $references, $isQuoted);
}
}

return $output;
}






private static function parseQuotedScalar(string $scalar, int &$i = 0): string
{
if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

$output = substr($match[0], 1, -1);

$unescaper = new Unescaper();
if ('"' == $scalar[$i]) {
$output = $unescaper->unescapeDoubleQuotedString($output);
} else {
$output = $unescaper->unescapeSingleQuotedString($output);
}

$i += \strlen($match[0]);

return $output;
}






private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array
{
$output = [];
$len = \strlen($sequence);
++$i;


$lastToken = null;
while ($i < $len) {
if (']' === $sequence[$i]) {
return $output;
}
if (',' === $sequence[$i] || ' ' === $sequence[$i]) {
if (',' === $sequence[$i] && (null === $lastToken || 'separator' === $lastToken)) {
$output[] = null;
} elseif (',' === $sequence[$i]) {
$lastToken = 'separator';
}

++$i;

continue;
}

$tag = self::parseTag($sequence, $i, $flags);
switch ($sequence[$i]) {
case '[':

$value = self::parseSequence($sequence, $flags, $i, $references);
break;
case '{':

$value = self::parseMapping($sequence, $flags, $i, $references);
break;
default:
$value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted);


if (\is_string($value) && !$isQuoted && str_contains($value, ': ')) {

try {
$pos = 0;
$value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
} catch (\InvalidArgumentException) {

}
}

if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
$references[$matches['ref']] = $matches['value'];
$value = $matches['value'];
}

--$i;
}

if (null !== $tag && '' !== $tag) {
$value = new TaggedValue($tag, $value);
}

$output[] = $value;

$lastToken = 'value';
++$i;
}

throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);
}






private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = []): array|\stdClass
{
$output = [];
$len = \strlen($mapping);
++$i;
$allowOverwrite = false;


while ($i < $len) {
switch ($mapping[$i]) {
case ' ':
case ',':
case "\n":
++$i;
continue 2;
case '}':
if (self::$objectForMap) {
return (object) $output;
}

return $output;
}


$offsetBeforeKeyParsing = $i;
$isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true);
$key = self::parseScalar($mapping, $flags, [':', ' '], $i, false);

if ($offsetBeforeKeyParsing === $i) {
throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);
}

if ('!php/const' === $key || '!php/enum' === $key) {
$key .= ' '.self::parseScalar($mapping, $flags, ['(?<!:):(?!:)'], $i, false);
$key = self::evaluateScalar($key, $flags);
}

if (false === $i = strpos($mapping, ':', $i)) {
break;
}

if (!$isKeyQuoted) {
$evaluatedKey = self::evaluateScalar($key, $flags, $references);

if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) {
throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);
}
}

if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) {
throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping);
}

if ('<<' === $key) {
$allowOverwrite = true;
}

while ($i < $len) {
if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) {
++$i;

continue;
}

$tag = self::parseTag($mapping, $i, $flags);
switch ($mapping[$i]) {
case '[':

$value = self::parseSequence($mapping, $flags, $i, $references);




if ('<<' === $key) {
foreach ($value as $parsedValue) {
$output += $parsedValue;
}
} elseif ($allowOverwrite || !isset($output[$key])) {
if (null !== $tag) {
$output[$key] = new TaggedValue($tag, $value);
} else {
$output[$key] = $value;
}
} elseif (isset($output[$key])) {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
}
break;
case '{':

$value = self::parseMapping($mapping, $flags, $i, $references);




if ('<<' === $key) {
$output += $value;
} elseif ($allowOverwrite || !isset($output[$key])) {
if (null !== $tag) {
$output[$key] = new TaggedValue($tag, $value);
} else {
$output[$key] = $value;
}
} elseif (isset($output[$key])) {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
}
break;
default:
$value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted);




if ('<<' === $key) {
$output += $value;
} elseif ($allowOverwrite || !isset($output[$key])) {
if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && !self::isBinaryString($value) && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
$references[$matches['ref']] = $matches['value'];
$value = $matches['value'];
}

if (null !== $tag) {
$output[$key] = new TaggedValue($tag, $value);
} else {
$output[$key] = $value;
}
} elseif (isset($output[$key])) {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
}
--$i;
}
++$i;

continue 2;
}
}

throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);
}






private static function evaluateScalar(string $scalar, int $flags, array &$references = [], ?bool &$isQuotedString = null): mixed
{
$isQuotedString = false;
$scalar = trim($scalar);

if (str_starts_with($scalar, '*')) {
if (false !== $pos = strpos($scalar, '#')) {
$value = substr($scalar, 1, $pos - 2);
} else {
$value = substr($scalar, 1);
}


if (false === $value || '' === $value) {
throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

if (!\array_key_exists($value, $references)) {
throw new ParseException(\sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

return $references[$value];
}

$scalarLower = strtolower($scalar);

switch (true) {
case 'null' === $scalarLower:
case '' === $scalar:
case '~' === $scalar:
return null;
case 'true' === $scalarLower:
return true;
case 'false' === $scalarLower:
return false;
case '!' === $scalar[0]:
switch (true) {
case str_starts_with($scalar, '!!str '):
$s = (string) substr($scalar, 6);

if (\in_array($s[0] ?? '', ['"', "'"], true)) {
$isQuotedString = true;
$s = self::parseQuotedScalar($s);
}

return $s;
case str_starts_with($scalar, '! '):
return substr($scalar, 2);
case str_starts_with($scalar, '!php/object'):
if (self::$objectSupport) {
if (!isset($scalar[12])) {
throw new ParseException('Missing value for tag "!php/object".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return unserialize(self::parseScalar(substr($scalar, 12)));
}

if (self::$exceptionOnInvalidType) {
throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return null;
case str_starts_with($scalar, '!php/const'):
if (self::$constantSupport) {
if (!isset($scalar[11])) {
throw new ParseException('Missing value for tag "!php/const".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

$i = 0;
if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
return \constant($const);
}

throw new ParseException(\sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}
if (self::$exceptionOnInvalidType) {
throw new ParseException(\sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return null;
case str_starts_with($scalar, '!php/enum'):
if (self::$constantSupport) {
if (!isset($scalar[11])) {
throw new ParseException('Missing value for tag "!php/enum".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

$i = 0;
$enum = self::parseScalar(substr($scalar, 10), 0, null, $i, false);
if ($useValue = str_ends_with($enum, '->value')) {
$enum = substr($enum, 0, -7);
}
if (!\defined($enum)) {
throw new ParseException(\sprintf('The enum "%s" is not defined.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

$value = \constant($enum);

if (!$value instanceof \UnitEnum) {
throw new ParseException(\sprintf('The string "%s" is not the name of a valid enum.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}
if (!$useValue) {
return $value;
}
if (!$value instanceof \BackedEnum) {
throw new ParseException(\sprintf('The enum "%s" defines no value next to its name.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return $value->value;
}
if (self::$exceptionOnInvalidType) {
throw new ParseException(\sprintf('The string "%s" could not be parsed as an enum. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return null;
case str_starts_with($scalar, '!!float '):
return (float) substr($scalar, 8);
case str_starts_with($scalar, '!!binary '):
return self::evaluateBinaryScalar(substr($scalar, 9));
}

throw new ParseException(\sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);
case preg_match('/^(?:\+|-)?0o(?P<value>[0-7_]++)$/', $scalar, $matches):
$value = str_replace('_', '', $matches['value']);

if ('-' === $scalar[0]) {
return -octdec($value);
}

return octdec($value);
case \in_array($scalar[0], ['+', '-', '.'], true) || is_numeric($scalar[0]):
if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {
$scalar = str_replace('_', '', $scalar);
}

switch (true) {
case ctype_digit($scalar):
case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
if ($scalar < \PHP_INT_MIN || \PHP_INT_MAX < $scalar) {
return $scalar;
}

$cast = (int) $scalar;

return ($scalar === (string) $cast) ? $cast : $scalar;
case is_numeric($scalar):
case Parser::preg_match(self::getHexRegex(), $scalar):
$scalar = str_replace('_', '', $scalar);

return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
case '.inf' === $scalarLower:
case '.nan' === $scalarLower:
return -log(0);
case '-.inf' === $scalarLower:
return log(0);
case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
return (float) str_replace('_', '', $scalar);
case Parser::preg_match(self::getTimestampRegex(), $scalar):
try {

$time = new \DateTimeImmutable($scalar, new \DateTimeZone('UTC'));
} catch (\Exception $e) {

throw new ParseException(\sprintf('The date "%s" could not be parsed as it is an invalid date.', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename, $e);
}

if (Yaml::PARSE_DATETIME & $flags) {
return $time;
}

if ('' !== rtrim($time->format('u'), '0')) {
return (float) $time->format('U.u');
}

try {
if (false !== $scalar = $time->getTimestamp()) {
return $scalar;
}
} catch (\DateRangeError|\ValueError) {

}

return $time->format('U');
}
}

return (string) $scalar;
}

private static function parseTag(string $value, int &$i, int $flags): ?string
{
if ('!' !== $value[$i]) {
return null;
}

$tagLength = strcspn($value, " \t\n[]{},", $i + 1);
$tag = substr($value, $i + 1, $tagLength);

$nextOffset = $i + $tagLength + 1;
$nextOffset += strspn($value, ' ', $nextOffset);

if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) {
throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}


if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || \in_array($tag, ['str', 'php/const', 'php/enum', 'php/object'], true))) {

return null;
}

$i = $nextOffset;


if ('' !== $tag && '!' === $tag[0]) {
throw new ParseException(\sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

if ('' !== $tag && !isset($value[$i])) {
throw new ParseException(\sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {
return $tag;
}

throw new ParseException(\sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
}

public static function evaluateBinaryScalar(string $scalar): string
{
$parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar));

if (0 !== (\strlen($parsedBinaryData) % 4)) {
throw new ParseException(\sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {
throw new ParseException(\sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
}

return base64_decode($parsedBinaryData, true);
}

private static function isBinaryString(string $value): bool
{
return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value);
}






private static function getTimestampRegex(): string
{
return <<<EOF
        ~^
        (?P<year>[0-9][0-9][0-9][0-9])
        -(?P<month>[0-9][0-9]?)
        -(?P<day>[0-9][0-9]?)
        (?:(?:[Tt]|[ \t]+)
        (?P<hour>[0-9][0-9]?)
        :(?P<minute>[0-9][0-9])
        :(?P<second>[0-9][0-9])
        (?:\.(?P<fraction>[0-9]*))?
        (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
        (?::(?P<tz_minute>[0-9][0-9]))?))?)?
        $~x
EOF;
}




private static function getHexRegex(): string
{
return '~^0x[0-9a-f_]++$~i';
}
}
<?php










namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Tag\TaggedValue;








class Parser
{
public const TAG_PATTERN = '(?P<tag>![\w!.\/:-]+)';
public const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
public const REFERENCE_PATTERN = '#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u';

private ?string $filename = null;
private int $offset = 0;
private int $numberOfParsedLines = 0;
private ?int $totalNumberOfLines = null;
private array $lines = [];
private int $currentLineNb = -1;
private string $currentLine = '';
private array $refs = [];
private array $skippedLineNumbers = [];
private array $locallySkippedLineNumbers = [];
private array $refsBeingParsed = [];









public function parseFile(string $filename, int $flags = 0): mixed
{
if (!is_file($filename)) {
throw new ParseException(\sprintf('File "%s" does not exist.', $filename));
}

if (!is_readable($filename)) {
throw new ParseException(\sprintf('File "%s" cannot be read.', $filename));
}

$this->filename = $filename;

try {
return $this->parse(file_get_contents($filename), $flags);
} finally {
$this->filename = null;
}
}









public function parse(string $value, int $flags = 0): mixed
{
if (false === preg_match('//u', $value)) {
throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);
}

$this->refs = [];

try {
$data = $this->doParse($value, $flags);
} finally {
$this->refsBeingParsed = [];
$this->offset = 0;
$this->lines = [];
$this->currentLine = '';
$this->numberOfParsedLines = 0;
$this->refs = [];
$this->skippedLineNumbers = [];
$this->locallySkippedLineNumbers = [];
$this->totalNumberOfLines = null;
}

return $data;
}

private function doParse(string $value, int $flags): mixed
{
$this->currentLineNb = -1;
$this->currentLine = '';
$value = $this->cleanup($value);
$this->lines = explode("\n", $value);
$this->numberOfParsedLines = \count($this->lines);
$this->locallySkippedLineNumbers = [];
$this->totalNumberOfLines ??= $this->numberOfParsedLines;

if (!$this->moveToNextLine()) {
return null;
}

$data = [];
$context = null;
$allowOverwrite = false;

while ($this->isCurrentLineEmpty()) {
if (!$this->moveToNextLine()) {
return null;
}
}


if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) {
return new TaggedValue($tag, '');
}

do {
if ($this->isCurrentLineEmpty()) {
continue;
}


if ("\t" === $this->currentLine[0]) {
throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);

$isRef = $mergeNode = false;
if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {
if ($context && 'mapping' == $context) {
throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
$context = 'sequence';

if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
$isRef = $matches['ref'];
$this->refsBeingParsed[] = $isRef;
$values['value'] = $matches['value'];
}

if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {
throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
}


if (isset($values['value']) && str_starts_with(ltrim($values['value'], ' '), '-')) {

$currentLineNumber = $this->getRealCurrentLineNb();

$sequenceIndentation = \strlen($values['leadspaces']) + 1;
$sequenceYaml = substr($this->currentLine, $sequenceIndentation);
$sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true);

$data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags);
} elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || str_starts_with(ltrim($values['value'], ' '), '#')) {
$data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);
} elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {
$data[] = new TaggedValue(
$subTag,
$this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags)
);
} else {
if (
isset($values['leadspaces'])
&& (
'!' === $values['value'][0]
|| self::preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->trimTag($values['value']), $matches)
)
) {
$block = $values['value'];
if ($this->isNextLineIndented() || isset($matches['value']) && '>-' === $matches['value']) {
$block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1);
}

$data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);
} else {
$data[] = $this->parseValue($values['value'], $flags, $context);
}
}
if ($isRef) {
$this->refs[$isRef] = end($data);
array_pop($this->refsBeingParsed);
}
} elseif (

self::preg_match('#^(?P<key>(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)
&& (!str_contains($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"]))
) {
if (str_starts_with($values['key'], '!php/const:')) {
trigger_deprecation('symfony/yaml', '6.2', 'YAML syntax for key "%s" is deprecated and replaced by "!php/const %s".', $values['key'], substr($values['key'], 11));
}

if ($context && 'sequence' == $context) {
throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
}
$context = 'mapping';

try {
$key = Inline::parseScalar($values['key']);
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}

if (!\is_string($key) && !\is_int($key)) {
throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
}


if (\is_float($key)) {
$key = (string) $key;
}

if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P<ref>[^ ]+)#u', $values['value'], $refMatches))) {
$mergeNode = true;
$allowOverwrite = true;
if (isset($values['value'][0]) && '*' === $values['value'][0]) {
$refName = substr(rtrim($values['value']), 1);
if (!\array_key_exists($refName, $this->refs)) {
if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {
throw new ParseException(\sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);
}

throw new ParseException(\sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

$refValue = $this->refs[$refName];

if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) {
$refValue = (array) $refValue;
}

if (!\is_array($refValue)) {
throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

$data += $refValue; 
} else {
if (isset($values['value']) && '' !== $values['value']) {
$value = $values['value'];
} else {
$value = $this->getNextEmbedBlock();
}
$parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);

if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) {
$parsed = (array) $parsed;
}

if (!\is_array($parsed)) {
throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

if (isset($parsed[0])) {



foreach ($parsed as $parsedItem) {
if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) {
$parsedItem = (array) $parsedItem;
}

if (!\is_array($parsedItem)) {
throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);
}

$data += $parsedItem; 
}
} else {


$data += $parsed; 
}
}
} elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
$isRef = $matches['ref'];
$this->refsBeingParsed[] = $isRef;
$values['value'] = $matches['value'];
}

$subTag = null;
if ($mergeNode) {

} elseif (!isset($values['value']) || '' === $values['value'] || str_starts_with($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {


if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {


if ($allowOverwrite || !isset($data[$key])) {
if (null !== $subTag) {
$data[$key] = new TaggedValue($subTag, '');
} else {
$data[$key] = null;
}
} else {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
}
} else {

$realCurrentLineNbKey = $this->getRealCurrentLineNb();
$value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);
if ('<<' === $key) {
$this->refs[$refMatches['ref']] = $value;

if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) {
$value = (array) $value;
}

$data += $value;
} elseif ($allowOverwrite || !isset($data[$key])) {


if (null !== $subTag) {
$data[$key] = new TaggedValue($subTag, $value);
} else {
$data[$key] = $value;
}
} else {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);
}
}
} else {
$value = $this->parseValue(rtrim($values['value']), $flags, $context);


if ($allowOverwrite || !isset($data[$key])) {
$data[$key] = $value;
} else {
throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
}
}
if ($isRef) {
$this->refs[$isRef] = $data[$key];
array_pop($this->refsBeingParsed);
}
} elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) {
if (null !== $context) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

try {
return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs);
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}
} elseif ('{' === $this->currentLine[0]) {
if (null !== $context) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

try {
$parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs);

while ($this->moveToNextLine()) {
if (!$this->isCurrentLineEmpty()) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
}

return $parsedMapping;
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}
} elseif ('[' === $this->currentLine[0]) {
if (null !== $context) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

try {
$parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs);

while ($this->moveToNextLine()) {
if (!$this->isCurrentLineEmpty()) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
}

return $parsedSequence;
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}
} else {

if ('---' === $this->currentLine) {
throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
}

if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) {
throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
}


if (\is_string($value) && $this->lines[0] === trim($value)) {
try {
$value = Inline::parse($this->lines[0], $flags, $this->refs);
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}

return $value;
}


if (0 === $this->currentLineNb) {
$previousLineWasNewline = false;
$previousLineWasTerminatedWithBackslash = false;
$value = '';

foreach ($this->lines as $line) {
$trimmedLine = trim($line);
if ('#' === ($trimmedLine[0] ?? '')) {
continue;
}

if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) {
throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

if (str_contains($line, ': ')) {
throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}

if ('' === $trimmedLine) {
$value .= "\n";
} elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
$value .= ' ';
}

if ('' !== $trimmedLine && str_ends_with($line, '\\')) {
$value .= ltrim(substr($line, 0, -1));
} elseif ('' !== $trimmedLine) {
$value .= $trimmedLine;
}

if ('' === $trimmedLine) {
$previousLineWasNewline = true;
$previousLineWasTerminatedWithBackslash = false;
} elseif (str_ends_with($line, '\\')) {
$previousLineWasNewline = false;
$previousLineWasTerminatedWithBackslash = true;
} else {
$previousLineWasNewline = false;
$previousLineWasTerminatedWithBackslash = false;
}
}

try {
return Inline::parse(trim($value));
} catch (ParseException) {

}
}

throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
} while ($this->moveToNextLine());

if (null !== $tag) {
$data = new TaggedValue($tag, $data);
}

if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\is_object($data)) {
$object = new \stdClass();

foreach ($data as $key => $value) {
$object->$key = $value;
}

$data = $object;
}

return empty($data) ? null : $data;
}

private function parseBlock(int $offset, string $yaml, int $flags): mixed
{
$skippedLineNumbers = $this->skippedLineNumbers;

foreach ($this->locallySkippedLineNumbers as $lineNumber) {
if ($lineNumber < $offset) {
continue;
}

$skippedLineNumbers[] = $lineNumber;
}

$parser = new self();
$parser->offset = $offset;
$parser->totalNumberOfLines = $this->totalNumberOfLines;
$parser->skippedLineNumbers = $skippedLineNumbers;
$parser->refs = &$this->refs;
$parser->refsBeingParsed = $this->refsBeingParsed;

return $parser->doParse($yaml, $flags);
}






public function getRealCurrentLineNb(): int
{
$realCurrentLineNumber = $this->currentLineNb + $this->offset;

foreach ($this->skippedLineNumbers as $skippedLineNumber) {
if ($skippedLineNumber > $realCurrentLineNumber) {
break;
}

++$realCurrentLineNumber;
}

return $realCurrentLineNumber;
}

private function getCurrentLineIndentation(): int
{
if (' ' !== ($this->currentLine[0] ?? '')) {
return 0;
}

return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' '));
}









private function getNextEmbedBlock(?int $indentation = null, bool $inSequence = false): string
{
$oldLineIndentation = $this->getCurrentLineIndentation();

if (!$this->moveToNextLine()) {
return '';
}

if (null === $indentation) {
$newIndent = null;
$movements = 0;

do {
$EOF = false;


if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
$EOF = !$this->moveToNextLine();

if (!$EOF) {
++$movements;
}
} else {
$newIndent = $this->getCurrentLineIndentation();
}
} while (!$EOF && null === $newIndent);

for ($i = 0; $i < $movements; ++$i) {
$this->moveToPreviousLine();
}

$unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();

if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
} else {
$newIndent = $indentation;
}

$data = [];

if ($this->getCurrentLineIndentation() >= $newIndent) {
$data[] = substr($this->currentLine, $newIndent ?? 0);
} elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
$data[] = $this->currentLine;
} else {
$this->moveToPreviousLine();

return '';
}

if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {


$this->moveToPreviousLine();

return '';
}

$isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
$isItComment = $this->isCurrentLineComment();

while ($this->moveToNextLine()) {
if ($isItComment && !$isItUnindentedCollection) {
$isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
$isItComment = $this->isCurrentLineComment();
}

$indent = $this->getCurrentLineIndentation();

if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
$this->moveToPreviousLine();
break;
}

if ($this->isCurrentLineBlank()) {
$data[] = substr($this->currentLine, $newIndent ?? 0);
continue;
}

if ($indent >= $newIndent) {
$data[] = substr($this->currentLine, $newIndent ?? 0);
} elseif ($this->isCurrentLineComment()) {
$data[] = $this->currentLine;
} elseif (0 == $indent) {
$this->moveToPreviousLine();

break;
} else {
throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
}
}

return implode("\n", $data);
}

private function hasMoreLines(): bool
{
return (\count($this->lines) - 1) > $this->currentLineNb;
}




private function moveToNextLine(): bool
{
if ($this->currentLineNb >= $this->numberOfParsedLines - 1) {
return false;
}

$this->currentLine = $this->lines[++$this->currentLineNb];

return true;
}




private function moveToPreviousLine(): bool
{
if ($this->currentLineNb < 1) {
return false;
}

$this->currentLine = $this->lines[--$this->currentLineNb];

return true;
}










private function parseValue(string $value, int $flags, string $context): mixed
{
if (str_starts_with($value, '*')) {
if (false !== $pos = strpos($value, '#')) {
$value = substr($value, 1, $pos - 2);
} else {
$value = substr($value, 1);
}

if (!\array_key_exists($value, $this->refs)) {
if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {
throw new ParseException(\sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
}

throw new ParseException(\sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
}

return $this->refs[$value];
}

if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
$modifiers = $matches['modifiers'] ?? '';

$data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers));

if ('' !== $matches['tag'] && '!' !== $matches['tag']) {
if ('!!binary' === $matches['tag']) {
return Inline::evaluateBinaryScalar($data);
}

return new TaggedValue(substr($matches['tag'], 1), $data);
}

return $data;
}

try {
if ('' !== $value && '{' === $value[0]) {
$cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));

return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs);
} elseif ('' !== $value && '[' === $value[0]) {
$cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));

return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs);
}

switch ($value[0] ?? '') {
case '"':
case "'":
$cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
$parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs);

if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) {
throw new ParseException(\sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor)));
}

return $parsedValue;
default:
$lines = [];

while ($this->moveToNextLine()) {

if (0 === $this->getCurrentLineIndentation()) {
$this->moveToPreviousLine();

break;
}

$lines[] = trim($this->currentLine);
}

for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
if ('' === $lines[$i]) {
$value .= "\n";
$previousLineBlank = true;
} elseif ($previousLineBlank) {
$value .= $lines[$i];
$previousLineBlank = false;
} else {
$value .= ' '.$lines[$i];
$previousLineBlank = false;
}
}

Inline::$parsedLineNumber = $this->getRealCurrentLineNb();

$parsedValue = Inline::parse($value, $flags, $this->refs);

if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && str_contains($parsedValue, ': ')) {
throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);
}

return $parsedValue;
}
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);

throw $e;
}
}








private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string
{
$notEOF = $this->moveToNextLine();
if (!$notEOF) {
return '';
}

$isCurrentLineBlank = $this->isCurrentLineBlank();
$blockLines = [];


while ($notEOF && $isCurrentLineBlank) {

if ($notEOF = $this->moveToNextLine()) {
$blockLines[] = '';
$isCurrentLineBlank = $this->isCurrentLineBlank();
}
}


if (0 === $indentation) {
$currentLineLength = \strlen($this->currentLine);

for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {
++$indentation;
}
}

if ($indentation > 0) {
$pattern = \sprintf('/^ {%d}(.*)$/', $indentation);

while (
$notEOF && (
$isCurrentLineBlank
|| self::preg_match($pattern, $this->currentLine, $matches)
)
) {
if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) {
$blockLines[] = substr($this->currentLine, $indentation);
} elseif ($isCurrentLineBlank) {
$blockLines[] = '';
} else {
$blockLines[] = $matches[1];
}


if ($notEOF = $this->moveToNextLine()) {
$isCurrentLineBlank = $this->isCurrentLineBlank();
}
}
} elseif ($notEOF) {
$blockLines[] = '';
}

if ($notEOF) {
$blockLines[] = '';
$this->moveToPreviousLine();
} elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) {
$blockLines[] = '';
}


if ('>' === $style) {
$text = '';
$previousLineIndented = false;
$previousLineBlank = false;

for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) {
if ('' === $blockLines[$i]) {
$text .= "\n";
$previousLineIndented = false;
$previousLineBlank = true;
} elseif (' ' === $blockLines[$i][0]) {
$text .= "\n".$blockLines[$i];
$previousLineIndented = true;
$previousLineBlank = false;
} elseif ($previousLineIndented) {
$text .= "\n".$blockLines[$i];
$previousLineIndented = false;
$previousLineBlank = false;
} elseif ($previousLineBlank || 0 === $i) {
$text .= $blockLines[$i];
$previousLineIndented = false;
$previousLineBlank = false;
} else {
$text .= ' '.$blockLines[$i];
$previousLineIndented = false;
$previousLineBlank = false;
}
}
} else {
$text = implode("\n", $blockLines);
}


if ('' === $chomping) {
$text = preg_replace('/\n+$/', "\n", $text);
} elseif ('-' === $chomping) {
$text = preg_replace('/\n+$/', '', $text);
}

return $text;
}




private function isNextLineIndented(): bool
{
$currentIndentation = $this->getCurrentLineIndentation();
$movements = 0;

do {
$EOF = !$this->moveToNextLine();

if (!$EOF) {
++$movements;
}
} while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));

if ($EOF) {
for ($i = 0; $i < $movements; ++$i) {
$this->moveToPreviousLine();
}

return false;
}

$ret = $this->getCurrentLineIndentation() > $currentIndentation;

for ($i = 0; $i < $movements; ++$i) {
$this->moveToPreviousLine();
}

return $ret;
}

private function isCurrentLineEmpty(): bool
{
return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
}

private function isCurrentLineBlank(): bool
{
return '' === $this->currentLine || '' === trim($this->currentLine, ' ');
}

private function isCurrentLineComment(): bool
{

$ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? ltrim($this->currentLine, ' ') : $this->currentLine;

return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];
}

private function isCurrentLineLastLineInDocument(): bool
{
return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
}

private function cleanup(string $value): string
{
$value = str_replace(["\r\n", "\r"], "\n", $value);


$count = 0;
$value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
$this->offset += $count;


$trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
if (1 === $count) {

$this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
$value = $trimmedValue;
}


$trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
if (1 === $count) {

$this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
$value = $trimmedValue;


$value = preg_replace('#\.\.\.\s*$#', '', $value);
}

return $value;
}

private function isNextLineUnIndentedCollection(): bool
{
$currentIndentation = $this->getCurrentLineIndentation();
$movements = 0;

do {
$EOF = !$this->moveToNextLine();

if (!$EOF) {
++$movements;
}
} while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));

if ($EOF) {
return false;
}

$ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();

for ($i = 0; $i < $movements; ++$i) {
$this->moveToPreviousLine();
}

return $ret;
}

private function isStringUnIndentedCollectionItem(): bool
{
return '-' === rtrim($this->currentLine) || str_starts_with($this->currentLine, '- ');
}












public static function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {
throw new ParseException(preg_last_error_msg());
}

return $ret;
}







private function trimTag(string $value): string
{
if ('!' === $value[0]) {
return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' ');
}

return $value;
}

private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string
{
if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {
return null;
}

if ($nextLineCheck && !$this->isNextLineIndented()) {
return null;
}

$tag = substr($matches['tag'], 1);


if ($tag && '!' === $tag[0]) {
throw new ParseException(\sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
}

if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
return $tag;
}

throw new ParseException(\sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
}

private function lexInlineQuotedString(int &$cursor = 0): string
{
$quotation = $this->currentLine[$cursor];
$value = $quotation;
++$cursor;

$previousLineWasNewline = true;
$previousLineWasTerminatedWithBackslash = false;
$lineNumber = 0;

do {
if (++$lineNumber > 1) {
$cursor += strspn($this->currentLine, ' ', $cursor);
}

if ($this->isCurrentLineBlank()) {
$value .= "\n";
} elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
$value .= ' ';
}

for (; \strlen($this->currentLine) > $cursor; ++$cursor) {
switch ($this->currentLine[$cursor]) {
case '\\':
if ("'" === $quotation) {
$value .= '\\';
} elseif (isset($this->currentLine[++$cursor])) {
$value .= '\\'.$this->currentLine[$cursor];
}

break;
case $quotation:
++$cursor;

if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) {
$value .= "''";
break;
}

return $value.$quotation;
default:
$value .= $this->currentLine[$cursor];
}
}

if ($this->isCurrentLineBlank()) {
$previousLineWasNewline = true;
$previousLineWasTerminatedWithBackslash = false;
} elseif ('\\' === $this->currentLine[-1]) {
$previousLineWasNewline = false;
$previousLineWasTerminatedWithBackslash = true;
} else {
$previousLineWasNewline = false;
$previousLineWasTerminatedWithBackslash = false;
}

if ($this->hasMoreLines()) {
$cursor = 0;
}
} while ($this->moveToNextLine());

throw new ParseException('Malformed inline YAML string.');
}

private function lexUnquotedString(int &$cursor): string
{
$offset = $cursor;

while ($cursor < \strlen($this->currentLine)) {
if (\in_array($this->currentLine[$cursor], ['[', ']', '{', '}', ',', ':'], true)) {
break;
}

if (\in_array($this->currentLine[$cursor], [' ', "\t"], true) && '#' === ($this->currentLine[$cursor + 1] ?? '')) {
break;
}

++$cursor;
}

if ($cursor === $offset) {
throw new ParseException('Malformed unquoted YAML string.');
}

return substr($this->currentLine, $offset, $cursor - $offset);
}

private function lexInlineMapping(int &$cursor = 0, bool $consumeUntilEol = true): string
{
return $this->lexInlineStructure($cursor, '}', $consumeUntilEol);
}

private function lexInlineSequence(int &$cursor = 0, bool $consumeUntilEol = true): string
{
return $this->lexInlineStructure($cursor, ']', $consumeUntilEol);
}

private function lexInlineStructure(int &$cursor, string $closingTag, bool $consumeUntilEol = true): string
{
$value = $this->currentLine[$cursor];
++$cursor;

do {
$this->consumeWhitespaces($cursor);

while (isset($this->currentLine[$cursor])) {
switch ($this->currentLine[$cursor]) {
case '"':
case "'":
$value .= $this->lexInlineQuotedString($cursor);
break;
case ':':
case ',':
$value .= $this->currentLine[$cursor];
++$cursor;
break;
case '{':
$value .= $this->lexInlineMapping($cursor, false);
break;
case '[':
$value .= $this->lexInlineSequence($cursor, false);
break;
case $closingTag:
$value .= $this->currentLine[$cursor];
++$cursor;

if ($consumeUntilEol && isset($this->currentLine[$cursor]) && ($whitespaces = strspn($this->currentLine, ' ', $cursor) + $cursor) < \strlen($this->currentLine) && '#' !== $this->currentLine[$whitespaces]) {
throw new ParseException(\sprintf('Unexpected token "%s".', trim(substr($this->currentLine, $cursor))));
}

return $value;
case '#':
break 2;
default:
$value .= $this->lexUnquotedString($cursor);
}

if ($this->consumeWhitespaces($cursor)) {
$value .= ' ';
}
}

if ($this->hasMoreLines()) {
$cursor = 0;
}
} while ($this->moveToNextLine());

throw new ParseException('Malformed inline YAML string.');
}

private function consumeWhitespaces(int &$cursor): bool
{
$whitespacesConsumed = 0;

do {
$whitespaceOnlyTokenLength = strspn($this->currentLine, " \t", $cursor);
$whitespacesConsumed += $whitespaceOnlyTokenLength;
$cursor += $whitespaceOnlyTokenLength;

if (isset($this->currentLine[$cursor])) {
return 0 < $whitespacesConsumed;
}

if ($this->hasMoreLines()) {
$cursor = 0;
}
} while ($this->moveToNextLine());

return 0 < $whitespacesConsumed;
}
}
<?php










namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;









class Unescaper
{



public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)';






public function unescapeSingleQuotedString(string $value): string
{
return str_replace('\'\'', '\'', $value);
}






public function unescapeDoubleQuotedString(string $value): string
{
$callback = fn ($match) => $this->unescapeCharacter($match[0]);


return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
}






private function unescapeCharacter(string $value): string
{
return match ($value[1]) {
'0' => "\x0",
'a' => "\x7",
'b' => "\x8",
't' => "\t",
"\t" => "\t",
'n' => "\n",
'v' => "\xB",
'f' => "\xC",
'r' => "\r",
'e' => "\x1B",
' ' => ' ',
'"' => '"',
'/' => '/',
'\\' => '\\',

'N' => "\xC2\x85",

'_' => "\xC2\xA0",

'L' => "\xE2\x80\xA8",

'P' => "\xE2\x80\xA9",
'x' => self::utf8chr(hexdec(substr($value, 2, 2))),
'u' => self::utf8chr(hexdec(substr($value, 2, 4))),
'U' => self::utf8chr(hexdec(substr($value, 2, 8))),
default => throw new ParseException(\sprintf('Found unknown escape character "%s".', $value)),
};
}




private static function utf8chr(int $c): string
{
if (0x80 > $c %= 0x200000) {
return \chr($c);
}
if (0x800 > $c) {
return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F);
}
if (0x10000 > $c) {
return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
}

return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
}
}
#!/usr/bin/env php
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if ('cli' !== \PHP_SAPI) {
    throw new Exception('This script must be run from the command line.');
}

/**
 * Runs the Yaml lint command.
 *
 * @author Jan Schädlich <jan.schaedlich@sensiolabs.de>
 */

use Symfony\Component\Console\Application;
use Symfony\Component\Yaml\Command\LintCommand;

function includeIfExists(string $file): bool
{
    return file_exists($file) && include $file;
}

if (
    !includeIfExists(__DIR__ . '/../../../../autoload.php') &&
    !includeIfExists(__DIR__ . '/../../vendor/autoload.php') &&
    !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php')
) {
    fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL);
    exit(1);
}

if (!class_exists(Application::class)) {
    fwrite(STDERR, 'You need the "symfony/console" component in order to run the Yaml linter.'.PHP_EOL);
    exit(1);
}

(new Application())->add($command = new LintCommand())
    ->getApplication()
    ->setDefaultCommand($command->getName(), true)
    ->run()
;
<?php










namespace Symfony\Component\Yaml\Exception;






class ParseException extends RuntimeException
{
private ?string $parsedFile;
private int $parsedLine;
private ?string $snippet;
private string $rawMessage;







public function __construct(string $message, int $parsedLine = -1, ?string $snippet = null, ?string $parsedFile = null, ?\Throwable $previous = null)
{
$this->parsedFile = $parsedFile;
$this->parsedLine = $parsedLine;
$this->snippet = $snippet;
$this->rawMessage = $message;

$this->updateRepr();

parent::__construct($this->message, 0, $previous);
}




public function getSnippet(): string
{
return $this->snippet;
}






public function setSnippet(string $snippet)
{
$this->snippet = $snippet;

$this->updateRepr();
}






public function getParsedFile(): string
{
return $this->parsedFile;
}






public function setParsedFile(string $parsedFile)
{
$this->parsedFile = $parsedFile;

$this->updateRepr();
}




public function getParsedLine(): int
{
return $this->parsedLine;
}






public function setParsedLine(int $parsedLine)
{
$this->parsedLine = $parsedLine;

$this->updateRepr();
}

private function updateRepr(): void
{
$this->message = $this->rawMessage;

$dot = false;
if (str_ends_with($this->message, '.')) {
$this->message = substr($this->message, 0, -1);
$dot = true;
}

if (null !== $this->parsedFile) {
$this->message .= \sprintf(' in %s', json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE));
}

if ($this->parsedLine >= 0) {
$this->message .= \sprintf(' at line %d', $this->parsedLine);
}

if ($this->snippet) {
$this->message .= \sprintf(' (near "%s")', $this->snippet);
}

if ($dot) {
$this->message .= '.';
}
}
}
<?php










namespace Symfony\Component\Yaml\Exception;






class DumpException extends RuntimeException
{
}
<?php










namespace Symfony\Component\Yaml\Exception;






interface ExceptionInterface extends \Throwable
{
}
<?php










namespace Symfony\Component\Yaml\Exception;






class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php










namespace Symfony\Component\Yaml\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\CI\GithubActionReporter;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Exception\RuntimeException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\Yaml\Yaml;







#[AsCommand(name: 'lint:yaml', description: 'Lint a YAML file and outputs encountered errors')]
class LintCommand extends Command
{
private Parser $parser;
private ?string $format = null;
private bool $displayCorrectFiles;
private ?\Closure $directoryIteratorProvider;
private ?\Closure $isReadableProvider;

public function __construct(?string $name = null, ?callable $directoryIteratorProvider = null, ?callable $isReadableProvider = null)
{
parent::__construct($name);

$this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : $directoryIteratorProvider(...);
$this->isReadableProvider = null === $isReadableProvider ? null : $isReadableProvider(...);
}




protected function configure()
{
$this
->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')
->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format ("%s")', implode('", "', $this->getAvailableFormatOptions())))
->addOption('exclude', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path(s) to exclude')
->addOption('parse-tags', null, InputOption::VALUE_NEGATABLE, 'Parse custom tags', null)
->setHelp(<<<EOF
The <info>%command.name%</info> command lints a YAML file and outputs to STDOUT
the first encountered syntax error.

You can validates YAML contents passed from STDIN:

  <info>cat filename | php %command.full_name% -</info>

You can also validate the syntax of a file:

  <info>php %command.full_name% filename</info>

Or of a whole directory:

  <info>php %command.full_name% dirname</info>
  <info>php %command.full_name% dirname --format=json</info>

You can also exclude one or more specific files:

  <info>php %command.full_name% dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml"</info>

EOF
)
;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$filenames = (array) $input->getArgument('filename');
$excludes = $input->getOption('exclude');
$this->format = $input->getOption('format');
$flags = $input->getOption('parse-tags');

if (null === $this->format) {

$this->format = class_exists(GithubActionReporter::class) && GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt';
}

$flags = $flags ? Yaml::PARSE_CUSTOM_TAGS : 0;

$this->displayCorrectFiles = $output->isVerbose();

if (['-'] === $filenames) {
return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]);
}

if (!$filenames) {
throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');
}

$filesInfo = [];
foreach ($filenames as $filename) {
if (!$this->isReadable($filename)) {
throw new RuntimeException(\sprintf('File or directory "%s" is not readable.', $filename));
}

foreach ($this->getFiles($filename) as $file) {
if (!\in_array($file->getPathname(), $excludes, true)) {
$filesInfo[] = $this->validate(file_get_contents($file), $flags, $file);
}
}
}

return $this->display($io, $filesInfo);
}

private function validate(string $content, int $flags, ?string $file = null): array
{
$prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) {
if (\E_USER_DEPRECATED === $level) {
throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1);
}

return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false;
});

try {
$this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags);
} catch (ParseException $e) {
return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()];
} finally {
restore_error_handler();
}

return ['file' => $file, 'valid' => true];
}

private function display(SymfonyStyle $io, array $files): int
{
return match ($this->format) {
'txt' => $this->displayTxt($io, $files),
'json' => $this->displayJson($io, $files),
'github' => $this->displayTxt($io, $files, true),
default => throw new InvalidArgumentException(\sprintf('Supported formats are "%s".', implode('", "', $this->getAvailableFormatOptions()))),
};
}

private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false): int
{
$countFiles = \count($filesInfo);
$erroredFiles = 0;
$suggestTagOption = false;

if ($errorAsGithubAnnotations) {
$githubReporter = new GithubActionReporter($io);
}

foreach ($filesInfo as $info) {
if ($info['valid'] && $this->displayCorrectFiles) {
$io->comment('<info>OK</info>'.($info['file'] ? \sprintf(' in %s', $info['file']) : ''));
} elseif (!$info['valid']) {
++$erroredFiles;
$io->text('<error> ERROR </error>'.($info['file'] ? \sprintf(' in %s', $info['file']) : ''));
$io->text(\sprintf('<error> >> %s</error>', $info['message']));

if (str_contains($info['message'], 'PARSE_CUSTOM_TAGS')) {
$suggestTagOption = true;
}

if ($errorAsGithubAnnotations) {
$githubReporter->error($info['message'], $info['file'] ?? 'php://stdin', $info['line']);
}
}
}

if (0 === $erroredFiles) {
$io->success(\sprintf('All %d YAML files contain valid syntax.', $countFiles));
} else {
$io->warning(\sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : ''));
}

return min($erroredFiles, 1);
}

private function displayJson(SymfonyStyle $io, array $filesInfo): int
{
$errors = 0;

array_walk($filesInfo, function (&$v) use (&$errors) {
$v['file'] = (string) $v['file'];
if (!$v['valid']) {
++$errors;
}

if (isset($v['message']) && str_contains($v['message'], 'PARSE_CUSTOM_TAGS')) {
$v['message'] .= ' Use the --parse-tags option if you want parse custom tags.';
}
});

$io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES));

return min($errors, 1);
}

private function getFiles(string $fileOrDirectory): iterable
{
if (is_file($fileOrDirectory)) {
yield new \SplFileInfo($fileOrDirectory);

return;
}

foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
if (!\in_array($file->getExtension(), ['yml', 'yaml'])) {
continue;
}

yield $file;
}
}

private function getParser(): Parser
{
return $this->parser ??= new Parser();
}

private function getDirectoryIterator(string $directory): iterable
{
$default = fn ($directory) => new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS),
\RecursiveIteratorIterator::LEAVES_ONLY
);

if (null !== $this->directoryIteratorProvider) {
return ($this->directoryIteratorProvider)($directory, $default);
}

return $default($directory);
}

private function isReadable(string $fileOrDirectory): bool
{
$default = is_readable(...);

if (null !== $this->isReadableProvider) {
return ($this->isReadableProvider)($fileOrDirectory, $default);
}

return $default($fileOrDirectory);
}

public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestOptionValuesFor('format')) {
$suggestions->suggestValues($this->getAvailableFormatOptions());
}
}

private function getAvailableFormatOptions(): array
{
return ['txt', 'json', 'github'];
}
}
<?php










namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Tag\TaggedValue;








class Dumper
{



private int $indentation;

public function __construct(int $indentation = 4)
{
if ($indentation < 1) {
throw new \InvalidArgumentException('The indentation must be greater than zero.');
}

$this->indentation = $indentation;
}









public function dump(mixed $input, int $inline = 0, int $indent = 0, int $flags = 0): string
{
$output = '';
$prefix = $indent ? str_repeat(' ', $indent) : '';
$dumpObjectAsInlineMap = true;

if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \ArrayObject || $input instanceof \stdClass)) {
$dumpObjectAsInlineMap = empty((array) $input);
}

if ($inline <= 0 || (!\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap) || empty($input)) {
$output .= $prefix.Inline::dump($input, $flags);
} elseif ($input instanceof TaggedValue) {
$output .= $this->dumpTaggedValue($input, $inline, $indent, $flags, $prefix);
} else {
$dumpAsMap = Inline::isHash($input);

foreach ($input as $key => $value) {
if ('' !== $output && "\n" !== $output[-1]) {
$output .= "\n";
}

if (\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) {
$key = (string) $key;
}

if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && str_contains($value, "\n") && !str_contains($value, "\r")) {
$blockIndentationIndicator = $this->getBlockIndentationIndicator($value);

if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) {
$blockChompingIndicator = '+';
} elseif ("\n" === $value[-1]) {
$blockChompingIndicator = '';
} else {
$blockChompingIndicator = '-';
}

$output .= \sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator);

foreach (explode("\n", $value) as $row) {
if ('' === $row) {
$output .= "\n";
} else {
$output .= \sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
}
}

continue;
}

if ($value instanceof TaggedValue) {
$output .= \sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag());

if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && str_contains($value->getValue(), "\n") && !str_contains($value->getValue(), "\r\n")) {
$blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue());
$output .= \sprintf(' |%s', $blockIndentationIndicator);

foreach (explode("\n", $value->getValue()) as $row) {
$output .= \sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
}

continue;
}

if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) {
$output .= ' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n";
} else {
$output .= "\n";
$output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags);
}

continue;
}

$dumpObjectAsInlineMap = true;

if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \ArrayObject || $value instanceof \stdClass)) {
$dumpObjectAsInlineMap = empty((array) $value);
}

$willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value);

$output .= \sprintf('%s%s%s%s',
$prefix,
$dumpAsMap ? Inline::dump($key, $flags).':' : '-',
$willBeInlined ? ' ' : "\n",
$this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags)
).($willBeInlined ? "\n" : '');
}
}

return $output;
}

private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, int $flags, string $prefix): string
{
$output = \sprintf('%s!%s', $prefix ? $prefix.' ' : '', $value->getTag());

if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && str_contains($value->getValue(), "\n") && !str_contains($value->getValue(), "\r\n")) {
$blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue());
$output .= \sprintf(' |%s', $blockIndentationIndicator);

foreach (explode("\n", $value->getValue()) as $row) {
$output .= \sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row);
}

return $output;
}

if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) {
return $output.' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n";
}

return $output."\n".$this->dump($value->getValue(), $inline - 1, $indent, $flags);
}

private function getBlockIndentationIndicator(string $value): string
{
$lines = explode("\n", $value);




foreach ($lines as $line) {
if ('' !== trim($line, ' ')) {
return (' ' === substr($line, 0, 1)) ? (string) $this->indentation : '';
}
}

return '';
}
}
<?php










namespace Symfony\Component\Yaml\Tag;





final class TaggedValue
{
private string $tag;
private mixed $value;

public function __construct(string $tag, mixed $value)
{
$this->tag = $tag;
$this->value = $value;
}

public function getTag(): string
{
return $this->tag;
}

public function getValue(): mixed
{
return $this->value;
}
}
The MIT License (MIT)

Copyright (c) 2013-present Benjamin Morel

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.
<?php

declare(strict_types=1);

namespace Brick\Math\Internal;

use Brick\Math\Exception\RoundingNecessaryException;
use Brick\Math\RoundingMode;












abstract readonly class Calculator
{



public const MAX_POWER = 1_000_000;




public const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';

/**
@pure




*/
final protected function init(string $a, string $b) : array
{
return [
$aNeg = ($a[0] === '-'),
$bNeg = ($b[0] === '-'),

$aNeg ? \substr($a, 1) : $a,
$bNeg ? \substr($b, 1) : $b,
];
}

/**
@pure


*/
final public function abs(string $n) : string
{
return ($n[0] === '-') ? \substr($n, 1) : $n;
}

/**
@pure


*/
final public function neg(string $n) : string
{
if ($n === '0') {
return '0';
}

if ($n[0] === '-') {
return \substr($n, 1);
}

return '-' . $n;
}

/**
@pure






*/
final public function cmp(string $a, string $b) : int
{
[$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);

if ($aNeg && ! $bNeg) {
return -1;
}

if ($bNeg && ! $aNeg) {
return 1;
}

$aLen = \strlen($aDig);
$bLen = \strlen($bDig);

if ($aLen < $bLen) {
$result = -1;
} elseif ($aLen > $bLen) {
$result = 1;
} else {
$result = $aDig <=> $bDig;
}

return $aNeg ? -$result : $result;
}

/**
@pure


*/
abstract public function add(string $a, string $b) : string;

/**
@pure


*/
abstract public function sub(string $a, string $b) : string;

/**
@pure


*/
abstract public function mul(string $a, string $b) : string;

/**
@pure







*/
abstract public function divQ(string $a, string $b) : string;

/**
@pure







*/
abstract public function divR(string $a, string $b) : string;

/**
@pure







*/
abstract public function divQR(string $a, string $b) : array;

/**
@pure







*/
abstract public function pow(string $a, int $e) : string;

/**
@pure


*/
public function mod(string $a, string $b) : string
{
return $this->divR($this->add($this->divR($a, $b), $b), $b);
}

/**
@pure








*/
public function modInverse(string $x, string $m) : ?string
{
if ($m === '1') {
return '0';
}

$modVal = $x;

if ($x[0] === '-' || ($this->cmp($this->abs($x), $m) >= 0)) {
$modVal = $this->mod($x, $m);
}

[$g, $x] = $this->gcdExtended($modVal, $m);

if ($g !== '1') {
return null;
}

return $this->mod($this->add($this->mod($x, $m), $m), $m);
}

/**
@pure






*/
abstract public function modPow(string $base, string $exp, string $mod) : string;

/**
@pure







*/
public function gcd(string $a, string $b) : string
{
if ($a === '0') {
return $this->abs($b);
}

if ($b === '0') {
return $this->abs($a);
}

return $this->gcd($b, $this->divR($a, $b));
}

/**
@pure


*/
private function gcdExtended(string $a, string $b) : array
{
if ($a === '0') {
return [$b, '0', '1'];
}

[$gcd, $x1, $y1] = $this->gcdExtended($this->mod($b, $a), $a);

$x = $this->sub($y1, $this->mul($this->divQ($b, $a), $x1));
$y = $x1;

return [$gcd, $x, $y];
}

/**
@pure





*/
abstract public function sqrt(string $n) : string;

/**
@pure










*/
public function fromBase(string $number, int $base) : string
{
return $this->fromArbitraryBase(\strtolower($number), self::ALPHABET, $base);
}

/**
@pure










*/
public function toBase(string $number, int $base) : string
{
$negative = ($number[0] === '-');

if ($negative) {
$number = \substr($number, 1);
}

$number = $this->toArbitraryBase($number, self::ALPHABET, $base);

if ($negative) {
return '-' . $number;
}

return $number;
}

/**
@pure









*/
final public function fromArbitraryBase(string $number, string $alphabet, int $base) : string
{

$number = \ltrim($number, $alphabet[0]);

if ($number === '') {
return '0';
}


if ($number === $alphabet[1]) {
return '1';
}

$result = '0';
$power = '1';

$base = (string) $base;

for ($i = \strlen($number) - 1; $i >= 0; $i--) {
$index = \strpos($alphabet, $number[$i]);

if ($index !== 0) {
$result = $this->add($result, ($index === 1)
? $power
: $this->mul($power, (string) $index)
);
}

if ($i !== 0) {
$power = $this->mul($power, $base);
}
}

return $result;
}

/**
@pure








*/
final public function toArbitraryBase(string $number, string $alphabet, int $base) : string
{
if ($number === '0') {
return $alphabet[0];
}

$base = (string) $base;
$result = '';

while ($number !== '0') {
[$number, $remainder] = $this->divQR($number, $base);
$remainder = (int) $remainder;

$result .= $alphabet[$remainder];
}

return \strrev($result);
}

/**
@pure










*/
final public function divRound(string $a, string $b, RoundingMode $roundingMode) : string
{
[$quotient, $remainder] = $this->divQR($a, $b);

$hasDiscardedFraction = ($remainder !== '0');
$isPositiveOrZero = ($a[0] === '-') === ($b[0] === '-');

$discardedFractionSign = function() use ($remainder, $b) : int {
$r = $this->abs($this->mul($remainder, '2'));
$b = $this->abs($b);

return $this->cmp($r, $b);
};

$increment = false;

switch ($roundingMode) {
case RoundingMode::UNNECESSARY:
if ($hasDiscardedFraction) {
throw RoundingNecessaryException::roundingNecessary();
}
break;

case RoundingMode::UP:
$increment = $hasDiscardedFraction;
break;

case RoundingMode::DOWN:
break;

case RoundingMode::CEILING:
$increment = $hasDiscardedFraction && $isPositiveOrZero;
break;

case RoundingMode::FLOOR:
$increment = $hasDiscardedFraction && ! $isPositiveOrZero;
break;

case RoundingMode::HALF_UP:
$increment = $discardedFractionSign() >= 0;
break;

case RoundingMode::HALF_DOWN:
$increment = $discardedFractionSign() > 0;
break;

case RoundingMode::HALF_CEILING:
$increment = $isPositiveOrZero ? $discardedFractionSign() >= 0 : $discardedFractionSign() > 0;
break;

case RoundingMode::HALF_FLOOR:
$increment = $isPositiveOrZero ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0;
break;

case RoundingMode::HALF_EVEN:
$lastDigit = (int) $quotient[-1];
$lastDigitIsEven = ($lastDigit % 2 === 0);
$increment = $lastDigitIsEven ? $discardedFractionSign() > 0 : $discardedFractionSign() >= 0;
break;
}

if ($increment) {
return $this->add($quotient, $isPositiveOrZero ? '1' : '-1');
}

return $quotient;
}

/**
@pure





*/
public function and(string $a, string $b) : string
{
return $this->bitwise('and', $a, $b);
}

/**
@pure





*/
public function or(string $a, string $b) : string
{
return $this->bitwise('or', $a, $b);
}

/**
@pure





*/
public function xor(string $a, string $b) : string
{
return $this->bitwise('xor', $a, $b);
}

/**
@pure






*/
private function bitwise(string $operator, string $a, string $b) : string
{
[$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);

$aBin = $this->toBinary($aDig);
$bBin = $this->toBinary($bDig);

$aLen = \strlen($aBin);
$bLen = \strlen($bBin);

if ($aLen > $bLen) {
$bBin = \str_repeat("\x00", $aLen - $bLen) . $bBin;
} elseif ($bLen > $aLen) {
$aBin = \str_repeat("\x00", $bLen - $aLen) . $aBin;
}

if ($aNeg) {
$aBin = $this->twosComplement($aBin);
}
if ($bNeg) {
$bBin = $this->twosComplement($bBin);
}

$value = match ($operator) {
'and' => $aBin & $bBin,
'or' => $aBin | $bBin,
'xor' => $aBin ^ $bBin,
};

$negative = match ($operator) {
'and' => $aNeg and $bNeg,
'or' => $aNeg or $bNeg,
'xor' => $aNeg xor $bNeg,
};

if ($negative) {
$value = $this->twosComplement($value);
}

$result = $this->toDecimal($value);

return $negative ? $this->neg($result) : $result;
}

/**
@pure


*/
private function twosComplement(string $number) : string
{
$xor = \str_repeat("\xff", \strlen($number));

$number ^= $xor;

for ($i = \strlen($number) - 1; $i >= 0; $i--) {
$byte = \ord($number[$i]);

if (++$byte !== 256) {
$number[$i] = \chr($byte);
break;
}

$number[$i] = "\x00";

if ($i === 0) {
$number = "\x01" . $number;
}
}

return $number;
}

/**
@pure




*/
private function toBinary(string $number) : string
{
$result = '';

while ($number !== '0') {
[$number, $remainder] = $this->divQR($number, '256');
$result .= \chr((int) $remainder);
}

return \strrev($result);
}

/**
@pure




*/
private function toDecimal(string $bytes) : string
{
$result = '0';
$power = '1';

for ($i = \strlen($bytes) - 1; $i >= 0; $i--) {
$index = \ord($bytes[$i]);

if ($index !== 0) {
$result = $this->add($result, ($index === 1)
? $power
: $this->mul($power, (string) $index)
);
}

if ($i !== 0) {
$power = $this->mul($power, '256');
}
}

return $result;
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Internal\Calculator;

use Brick\Math\Internal\Calculator;
use GMP;
use Override;






final readonly class GmpCalculator extends Calculator
{
#[Override]
public function add(string $a, string $b) : string
{
return \gmp_strval(\gmp_add($a, $b));
}

#[Override]
public function sub(string $a, string $b) : string
{
return \gmp_strval(\gmp_sub($a, $b));
}

#[Override]
public function mul(string $a, string $b) : string
{
return \gmp_strval(\gmp_mul($a, $b));
}

#[Override]
public function divQ(string $a, string $b) : string
{
return \gmp_strval(\gmp_div_q($a, $b));
}

#[Override]
public function divR(string $a, string $b) : string
{
return \gmp_strval(\gmp_div_r($a, $b));
}

#[Override]
public function divQR(string $a, string $b) : array
{
[$q, $r] = \gmp_div_qr($a, $b);





return [
\gmp_strval($q),
\gmp_strval($r)
];
}

#[Override]
public function pow(string $a, int $e) : string
{
return \gmp_strval(\gmp_pow($a, $e));
}

#[Override]
public function modInverse(string $x, string $m) : ?string
{
$result = \gmp_invert($x, $m);

if ($result === false) {
return null;
}

return \gmp_strval($result);
}

#[Override]
public function modPow(string $base, string $exp, string $mod) : string
{
return \gmp_strval(\gmp_powm($base, $exp, $mod));
}

#[Override]
public function gcd(string $a, string $b) : string
{
return \gmp_strval(\gmp_gcd($a, $b));
}

#[Override]
public function fromBase(string $number, int $base) : string
{
return \gmp_strval(\gmp_init($number, $base));
}

#[Override]
public function toBase(string $number, int $base) : string
{
return \gmp_strval($number, $base);
}

#[Override]
public function and(string $a, string $b) : string
{
return \gmp_strval(\gmp_and($a, $b));
}

#[Override]
public function or(string $a, string $b) : string
{
return \gmp_strval(\gmp_or($a, $b));
}

#[Override]
public function xor(string $a, string $b) : string
{
return \gmp_strval(\gmp_xor($a, $b));
}

#[Override]
public function sqrt(string $n) : string
{
return \gmp_strval(\gmp_sqrt($n));
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Internal\Calculator;

use Brick\Math\Internal\Calculator;
use Override;






final readonly class NativeCalculator extends Calculator
{








private int $maxDigits;

/**
@pure

*/
public function __construct()
{
$this->maxDigits = match (PHP_INT_SIZE) {
4 => 9,
8 => 18,
};
}

#[Override]
public function add(string $a, string $b) : string
{




$result = $a + $b;

if (is_int($result)) {
return (string) $result;
}

if ($a === '0') {
return $b;
}

if ($b === '0') {
return $a;
}

[$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);

$result = $aNeg === $bNeg ? $this->doAdd($aDig, $bDig) : $this->doSub($aDig, $bDig);

if ($aNeg) {
$result = $this->neg($result);
}

return $result;
}

#[Override]
public function sub(string $a, string $b) : string
{
return $this->add($a, $this->neg($b));
}

#[Override]
public function mul(string $a, string $b) : string
{




$result = $a * $b;

if (is_int($result)) {
return (string) $result;
}

if ($a === '0' || $b === '0') {
return '0';
}

if ($a === '1') {
return $b;
}

if ($b === '1') {
return $a;
}

if ($a === '-1') {
return $this->neg($b);
}

if ($b === '-1') {
return $this->neg($a);
}

[$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);

$result = $this->doMul($aDig, $bDig);

if ($aNeg !== $bNeg) {
$result = $this->neg($result);
}

return $result;
}

#[Override]
public function divQ(string $a, string $b) : string
{
return $this->divQR($a, $b)[0];
}

#[Override]
public function divR(string $a, string $b): string
{
return $this->divQR($a, $b)[1];
}

#[Override]
public function divQR(string $a, string $b) : array
{
if ($a === '0') {
return ['0', '0'];
}

if ($a === $b) {
return ['1', '0'];
}

if ($b === '1') {
return [$a, '0'];
}

if ($b === '-1') {
return [$this->neg($a), '0'];
}


$na = $a * 1; 

if (is_int($na)) {

$nb = $b * 1;

if (is_int($nb)) {


$q = intdiv($na, $nb);
$r = $na % $nb;

return [
(string) $q,
(string) $r
];
}
}

[$aNeg, $bNeg, $aDig, $bDig] = $this->init($a, $b);

[$q, $r] = $this->doDiv($aDig, $bDig);

if ($aNeg !== $bNeg) {
$q = $this->neg($q);
}

if ($aNeg) {
$r = $this->neg($r);
}

return [$q, $r];
}

#[Override]
public function pow(string $a, int $e) : string
{
if ($e === 0) {
return '1';
}

if ($e === 1) {
return $a;
}

$odd = $e % 2;
$e -= $odd;

$aa = $this->mul($a, $a);

$result = $this->pow($aa, $e / 2);

if ($odd === 1) {
$result = $this->mul($result, $a);
}

return $result;
}




#[Override]
public function modPow(string $base, string $exp, string $mod) : string
{

if ($base === '0' && $exp === '0' && $mod === '1') {
return '0';
}


if ($exp === '0' && $mod === '1') {
return '0';
}

$x = $base;

$res = '1';


$x = $this->divR($x, $mod);

while ($exp !== '0') {
if (in_array($exp[-1], ['1', '3', '5', '7', '9'])) { 
$res = $this->divR($this->mul($res, $x), $mod);
}

$exp = $this->divQ($exp, '2');
$x = $this->divR($this->mul($x, $x), $mod);
}

return $res;
}




#[Override]
public function sqrt(string $n) : string
{
if ($n === '0') {
return '0';
}


$x = \str_repeat('9', \intdiv(\strlen($n), 2) ?: 1);

$decreased = false;

for (;;) {
$nx = $this->divQ($this->add($x, $this->divQ($n, $x)), '2');

if ($x === $nx || $this->cmp($nx, $x) > 0 && $decreased) {
break;
}

$decreased = $this->cmp($nx, $x) < 0;
$x = $nx;
}

return $x;
}

/**
@pure


*/
private function doAdd(string $a, string $b) : string
{
[$a, $b, $length] = $this->pad($a, $b);

$carry = 0;
$result = '';

for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) {
$blockLength = $this->maxDigits;

if ($i < 0) {
$blockLength += $i;
$i = 0;
}


$blockA = \substr($a, $i, $blockLength);


$blockB = \substr($b, $i, $blockLength);

$sum = (string) ($blockA + $blockB + $carry);
$sumLength = \strlen($sum);

if ($sumLength > $blockLength) {
$sum = \substr($sum, 1);
$carry = 1;
} else {
if ($sumLength < $blockLength) {
$sum = \str_repeat('0', $blockLength - $sumLength) . $sum;
}
$carry = 0;
}

$result = $sum . $result;

if ($i === 0) {
break;
}
}

if ($carry === 1) {
$result = '1' . $result;
}

return $result;
}

/**
@pure


*/
private function doSub(string $a, string $b) : string
{
if ($a === $b) {
return '0';
}


$cmp = $this->doCmp($a, $b);

$invert = ($cmp === -1);

if ($invert) {
$c = $a;
$a = $b;
$b = $c;
}

[$a, $b, $length] = $this->pad($a, $b);

$carry = 0;
$result = '';

$complement = 10 ** $this->maxDigits;

for ($i = $length - $this->maxDigits;; $i -= $this->maxDigits) {
$blockLength = $this->maxDigits;

if ($i < 0) {
$blockLength += $i;
$i = 0;
}


$blockA = \substr($a, $i, $blockLength);


$blockB = \substr($b, $i, $blockLength);

$sum = $blockA - $blockB - $carry;

if ($sum < 0) {
$sum += $complement;
$carry = 1;
} else {
$carry = 0;
}

$sum = (string) $sum;
$sumLength = \strlen($sum);

if ($sumLength < $blockLength) {
$sum = \str_repeat('0', $blockLength - $sumLength) . $sum;
}

$result = $sum . $result;

if ($i === 0) {
break;
}
}


assert($carry === 0);

$result = \ltrim($result, '0');

if ($invert) {
$result = $this->neg($result);
}

return $result;
}

/**
@pure


*/
private function doMul(string $a, string $b) : string
{
$x = \strlen($a);
$y = \strlen($b);

$maxDigits = \intdiv($this->maxDigits, 2);
$complement = 10 ** $maxDigits;

$result = '0';

for ($i = $x - $maxDigits;; $i -= $maxDigits) {
$blockALength = $maxDigits;

if ($i < 0) {
$blockALength += $i;
$i = 0;
}

$blockA = (int) \substr($a, $i, $blockALength);

$line = '';
$carry = 0;

for ($j = $y - $maxDigits;; $j -= $maxDigits) {
$blockBLength = $maxDigits;

if ($j < 0) {
$blockBLength += $j;
$j = 0;
}

$blockB = (int) \substr($b, $j, $blockBLength);

$mul = $blockA * $blockB + $carry;
$value = $mul % $complement;
$carry = ($mul - $value) / $complement;

$value = (string) $value;
$value = \str_pad($value, $maxDigits, '0', STR_PAD_LEFT);

$line = $value . $line;

if ($j === 0) {
break;
}
}

if ($carry !== 0) {
$line = $carry . $line;
}

$line = \ltrim($line, '0');

if ($line !== '') {
$line .= \str_repeat('0', $x - $blockALength - $i);
$result = $this->add($result, $line);
}

if ($i === 0) {
break;
}
}

return $result;
}

/**
@pure




*/
private function doDiv(string $a, string $b) : array
{
$cmp = $this->doCmp($a, $b);

if ($cmp === -1) {
return ['0', $a];
}

$x = \strlen($a);
$y = \strlen($b);



$q = '0'; 
$r = $a; 
$z = $y; 


$nb = $b * 1; 

if (is_int(($nb - 1) * 10 + 9)) {
$r = (int) \substr($a, 0, $z - 1);

for ($i = $z - 1; $i < $x; $i++) {
$n = $r * 10 + (int) $a[$i];

$q .= \intdiv($n, $nb);
$r = $n % $nb;
}

return [\ltrim($q, '0') ?: '0', (string) $r];
}

for (;;) {
$focus = \substr($a, 0, $z);

$cmp = $this->doCmp($focus, $b);

if ($cmp === -1) {
if ($z === $x) { 
break;
}

$z++;
}

$zeros = \str_repeat('0', $x - $z);

$q = $this->add($q, '1' . $zeros);
$a = $this->sub($a, $b . $zeros);

$r = $a;

if ($r === '0') { 
break;
}

$x = \strlen($a);

if ($x < $y) { 
break;
}

$z = $y;
}

return [$q, $r];
}

/**
@pure




*/
private function doCmp(string $a, string $b) : int
{
$x = \strlen($a);
$y = \strlen($b);

$cmp = $x <=> $y;

if ($cmp !== 0) {
return $cmp;
}

return \strcmp($a, $b) <=> 0; 
}

/**
@pure






*/
private function pad(string $a, string $b) : array
{
$x = \strlen($a);
$y = \strlen($b);

if ($x > $y) {
$b = \str_repeat('0', $x - $y) . $b;

return [$a, $b, $x];
}

if ($x < $y) {
$a = \str_repeat('0', $y - $x) . $a;

return [$a, $b, $y];
}

return [$a, $b, $x];
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Internal\Calculator;

use Brick\Math\Internal\Calculator;
use Override;






final readonly class BcMathCalculator extends Calculator
{
#[Override]
public function add(string $a, string $b) : string
{
return \bcadd($a, $b, 0);
}

#[Override]
public function sub(string $a, string $b) : string
{
return \bcsub($a, $b, 0);
}

#[Override]
public function mul(string $a, string $b) : string
{
return \bcmul($a, $b, 0);
}

#[Override]
public function divQ(string $a, string $b) : string
{
return \bcdiv($a, $b, 0);
}

#[Override]
public function divR(string $a, string $b) : string
{
return \bcmod($a, $b, 0);
}

#[Override]
public function divQR(string $a, string $b) : array
{
$q = \bcdiv($a, $b, 0);
$r = \bcmod($a, $b, 0);

return [$q, $r];
}

#[Override]
public function pow(string $a, int $e) : string
{
return \bcpow($a, (string) $e, 0);
}

#[Override]
public function modPow(string $base, string $exp, string $mod) : string
{
return \bcpowmod($base, $exp, $mod, 0);
}

#[Override]
public function sqrt(string $n) : string
{
return \bcsqrt($n, 0);
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Internal;

use function extension_loaded;






final class CalculatorRegistry
{



private static ?Calculator $instance = null;








final public static function set(?Calculator $calculator) : void
{
self::$instance = $calculator;
}

/**
@pure







*/
final public static function get() : Calculator
{
/**
@phpstan-ignore */
if (self::$instance === null) {
/**
@phpstan-ignore */
self::$instance = self::detect();
}

/**
@phpstan-ignore */
return self::$instance;
}

/**
@pure



*/
private static function detect() : Calculator
{
if (extension_loaded('gmp')) {
return new Calculator\GmpCalculator();
}

if (extension_loaded('bcmath')) {
return new Calculator\BcMathCalculator();
}

return new Calculator\NativeCalculator();
}
}
<?php

declare(strict_types=1);

namespace Brick\Math;

use Brick\Math\Exception\DivisionByZeroException;
use Brick\Math\Exception\MathException;
use Brick\Math\Exception\NumberFormatException;
use Brick\Math\Exception\RoundingNecessaryException;
use Override;






final readonly class BigRational extends BigNumber
{



private BigInteger $numerator;




private BigInteger $denominator;

/**
@pure








*/
protected function __construct(BigInteger $numerator, BigInteger $denominator, bool $checkDenominator)
{
if ($checkDenominator) {
if ($denominator->isZero()) {
throw DivisionByZeroException::denominatorMustNotBeZero();
}

if ($denominator->isNegative()) {
$numerator = $numerator->negated();
$denominator = $denominator->negated();
}
}

$this->numerator = $numerator;
$this->denominator = $denominator;
}

#[Override]
protected static function from(BigNumber $number): static
{
return $number->toBigRational();
}

/**
@pure












*/
public static function nd(
BigNumber|int|float|string $numerator,
BigNumber|int|float|string $denominator,
) : BigRational {
$numerator = BigInteger::of($numerator);
$denominator = BigInteger::of($denominator);

return new BigRational($numerator, $denominator, true);
}

/**
@pure


*/
public static function zero() : BigRational
{

static $zero;

if ($zero === null) {
$zero = new BigRational(BigInteger::zero(), BigInteger::one(), false);
}

return $zero;
}

/**
@pure


*/
public static function one() : BigRational
{

static $one;

if ($one === null) {
$one = new BigRational(BigInteger::one(), BigInteger::one(), false);
}

return $one;
}

/**
@pure


*/
public static function ten() : BigRational
{

static $ten;

if ($ten === null) {
$ten = new BigRational(BigInteger::ten(), BigInteger::one(), false);
}

return $ten;
}

/**
@pure
*/
public function getNumerator() : BigInteger
{
return $this->numerator;
}

/**
@pure
*/
public function getDenominator() : BigInteger
{
return $this->denominator;
}

/**
@pure


*/
public function quotient() : BigInteger
{
return $this->numerator->quotient($this->denominator);
}

/**
@pure


*/
public function remainder() : BigInteger
{
return $this->numerator->remainder($this->denominator);
}

/**
@pure




*/
public function quotientAndRemainder() : array
{
return $this->numerator->quotientAndRemainder($this->denominator);
}

/**
@pure






*/
public function plus(BigNumber|int|float|string $that) : BigRational
{
$that = BigRational::of($that);

$numerator = $this->numerator->multipliedBy($that->denominator);
$numerator = $numerator->plus($that->numerator->multipliedBy($this->denominator));
$denominator = $this->denominator->multipliedBy($that->denominator);

return new BigRational($numerator, $denominator, false);
}

/**
@pure






*/
public function minus(BigNumber|int|float|string $that) : BigRational
{
$that = BigRational::of($that);

$numerator = $this->numerator->multipliedBy($that->denominator);
$numerator = $numerator->minus($that->numerator->multipliedBy($this->denominator));
$denominator = $this->denominator->multipliedBy($that->denominator);

return new BigRational($numerator, $denominator, false);
}

/**
@pure






*/
public function multipliedBy(BigNumber|int|float|string $that) : BigRational
{
$that = BigRational::of($that);

$numerator = $this->numerator->multipliedBy($that->numerator);
$denominator = $this->denominator->multipliedBy($that->denominator);

return new BigRational($numerator, $denominator, false);
}

/**
@pure






*/
public function dividedBy(BigNumber|int|float|string $that) : BigRational
{
$that = BigRational::of($that);

$numerator = $this->numerator->multipliedBy($that->denominator);
$denominator = $this->denominator->multipliedBy($that->numerator);

return new BigRational($numerator, $denominator, true);
}

/**
@pure




*/
public function power(int $exponent) : BigRational
{
if ($exponent === 0) {
$one = BigInteger::one();

return new BigRational($one, $one, false);
}

if ($exponent === 1) {
return $this;
}

return new BigRational(
$this->numerator->power($exponent),
$this->denominator->power($exponent),
false
);
}

/**
@pure






*/
public function reciprocal() : BigRational
{
return new BigRational($this->denominator, $this->numerator, true);
}

/**
@pure


*/
public function abs() : BigRational
{
return new BigRational($this->numerator->abs(), $this->denominator, false);
}

/**
@pure


*/
public function negated() : BigRational
{
return new BigRational($this->numerator->negated(), $this->denominator, false);
}

/**
@pure


*/
public function simplified() : BigRational
{
$gcd = $this->numerator->gcd($this->denominator);

$numerator = $this->numerator->quotient($gcd);
$denominator = $this->denominator->quotient($gcd);

return new BigRational($numerator, $denominator, false);
}

#[Override]
public function compareTo(BigNumber|int|float|string $that) : int
{
return $this->minus($that)->getSign();
}

#[Override]
public function getSign() : int
{
return $this->numerator->getSign();
}

#[Override]
public function toBigInteger() : BigInteger
{
$simplified = $this->simplified();

if (! $simplified->denominator->isEqualTo(1)) {
throw new RoundingNecessaryException('This rational number cannot be represented as an integer value without rounding.');
}

return $simplified->numerator;
}

#[Override]
public function toBigDecimal() : BigDecimal
{
return $this->numerator->toBigDecimal()->exactlyDividedBy($this->denominator);
}

#[Override]
public function toBigRational() : BigRational
{
return $this;
}

#[Override]
public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
{
return $this->numerator->toBigDecimal()->dividedBy($this->denominator, $scale, $roundingMode);
}

#[Override]
public function toInt() : int
{
return $this->toBigInteger()->toInt();
}

#[Override]
public function toFloat() : float
{
$simplified = $this->simplified();
return $simplified->numerator->toFloat() / $simplified->denominator->toFloat();
}

#[Override]
public function __toString() : string
{
$numerator = (string) $this->numerator;
$denominator = (string) $this->denominator;

if ($denominator === '1') {
return $numerator;
}

return $numerator . '/' . $denominator;
}








public function __serialize(): array
{
return ['numerator' => $this->numerator, 'denominator' => $this->denominator];
}










public function __unserialize(array $data): void
{
/**
@phpstan-ignore */
if (isset($this->numerator)) {
throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
}

/**
@phpstan-ignore */
$this->numerator = $data['numerator'];
$this->denominator = $data['denominator'];
}
}
<?php

declare(strict_types=1);

namespace Brick\Math;

use Brick\Math\Exception\DivisionByZeroException;
use Brick\Math\Exception\MathException;
use Brick\Math\Exception\NegativeNumberException;
use Brick\Math\Internal\Calculator;
use Brick\Math\Internal\CalculatorRegistry;
use Override;




final readonly class BigDecimal extends BigNumber
{







private string $value;






private int $scale;

/**
@pure





*/
protected function __construct(string $value, int $scale = 0)
{
$this->value = $value;
$this->scale = $scale;
}

#[Override]
protected static function from(BigNumber $number): static
{
return $number->toBigDecimal();
}

/**
@pure








*/
public static function ofUnscaledValue(BigNumber|int|float|string $value, int $scale = 0) : BigDecimal
{
$value = (string) BigInteger::of($value);

if ($scale < 0) {
if ($value !== '0') {
$value .= \str_repeat('0', -$scale);
}
$scale = 0;
}

return new BigDecimal($value, $scale);
}

/**
@pure


*/
public static function zero() : BigDecimal
{

static $zero;

if ($zero === null) {
$zero = new BigDecimal('0');
}

return $zero;
}

/**
@pure


*/
public static function one() : BigDecimal
{

static $one;

if ($one === null) {
$one = new BigDecimal('1');
}

return $one;
}

/**
@pure


*/
public static function ten() : BigDecimal
{

static $ten;

if ($ten === null) {
$ten = new BigDecimal('10');
}

return $ten;
}

/**
@pure








*/
public function plus(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->value === '0' && $that->scale <= $this->scale) {
return $this;
}

if ($this->value === '0' && $this->scale <= $that->scale) {
return $that;
}

[$a, $b] = $this->scaleValues($this, $that);

$value = CalculatorRegistry::get()->add($a, $b);
$scale = $this->scale > $that->scale ? $this->scale : $that->scale;

return new BigDecimal($value, $scale);
}

/**
@pure








*/
public function minus(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->value === '0' && $that->scale <= $this->scale) {
return $this;
}

[$a, $b] = $this->scaleValues($this, $that);

$value = CalculatorRegistry::get()->sub($a, $b);
$scale = $this->scale > $that->scale ? $this->scale : $that->scale;

return new BigDecimal($value, $scale);
}

/**
@pure








*/
public function multipliedBy(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->value === '1' && $that->scale === 0) {
return $this;
}

if ($this->value === '1' && $this->scale === 0) {
return $that;
}

$value = CalculatorRegistry::get()->mul($this->value, $that->value);
$scale = $this->scale + $that->scale;

return new BigDecimal($value, $scale);
}

/**
@pure









*/
public function dividedBy(BigNumber|int|float|string $that, ?int $scale = null, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->isZero()) {
throw DivisionByZeroException::divisionByZero();
}

if ($scale === null) {
$scale = $this->scale;
} elseif ($scale < 0) {
throw new \InvalidArgumentException('Scale cannot be negative.');
}

if ($that->value === '1' && $that->scale === 0 && $scale === $this->scale) {
return $this;
}

$p = $this->valueWithMinScale($that->scale + $scale);
$q = $that->valueWithMinScale($this->scale - $scale);

$result = CalculatorRegistry::get()->divRound($p, $q, $roundingMode);

return new BigDecimal($result, $scale);
}

/**
@pure









*/
public function exactlyDividedBy(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->value === '0') {
throw DivisionByZeroException::divisionByZero();
}

[, $b] = $this->scaleValues($this, $that);

$d = \rtrim($b, '0');
$scale = \strlen($b) - \strlen($d);

$calculator = CalculatorRegistry::get();

foreach ([5, 2] as $prime) {
for (;;) {
$lastDigit = (int) $d[-1];

if ($lastDigit % $prime !== 0) {
break;
}

$d = $calculator->divQ($d, (string) $prime);
$scale++;
}
}

return $this->dividedBy($that, $scale)->stripTrailingZeros();
}













public function clamp(BigNumber|int|float|string $min, BigNumber|int|float|string $max) : BigDecimal
{
if ($this->isLessThan($min)) {
return BigDecimal::of($min);
} elseif ($this->isGreaterThan($max)) {
return BigDecimal::of($max);
}
return $this;
}

/**
@pure






*/
public function power(int $exponent) : BigDecimal
{
if ($exponent === 0) {
return BigDecimal::one();
}

if ($exponent === 1) {
return $this;
}

if ($exponent < 0 || $exponent > Calculator::MAX_POWER) {
throw new \InvalidArgumentException(\sprintf(
'The exponent %d is not in the range 0 to %d.',
$exponent,
Calculator::MAX_POWER
));
}

return new BigDecimal(CalculatorRegistry::get()->pow($this->value, $exponent), $this->scale * $exponent);
}

/**
@pure








*/
public function quotient(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->isZero()) {
throw DivisionByZeroException::divisionByZero();
}

$p = $this->valueWithMinScale($that->scale);
$q = $that->valueWithMinScale($this->scale);

$quotient = CalculatorRegistry::get()->divQ($p, $q);

return new BigDecimal($quotient, 0);
}

/**
@pure








*/
public function remainder(BigNumber|int|float|string $that) : BigDecimal
{
$that = BigDecimal::of($that);

if ($that->isZero()) {
throw DivisionByZeroException::divisionByZero();
}

$p = $this->valueWithMinScale($that->scale);
$q = $that->valueWithMinScale($this->scale);

$remainder = CalculatorRegistry::get()->divR($p, $q);

$scale = $this->scale > $that->scale ? $this->scale : $that->scale;

return new BigDecimal($remainder, $scale);
}

/**
@pure










*/
public function quotientAndRemainder(BigNumber|int|float|string $that) : array
{
$that = BigDecimal::of($that);

if ($that->isZero()) {
throw DivisionByZeroException::divisionByZero();
}

$p = $this->valueWithMinScale($that->scale);
$q = $that->valueWithMinScale($this->scale);

[$quotient, $remainder] = CalculatorRegistry::get()->divQR($p, $q);

$scale = $this->scale > $that->scale ? $this->scale : $that->scale;

$quotient = new BigDecimal($quotient, 0);
$remainder = new BigDecimal($remainder, $scale);

return [$quotient, $remainder];
}

/**
@pure





*/
public function sqrt(int $scale) : BigDecimal
{
if ($scale < 0) {
throw new \InvalidArgumentException('Scale cannot be negative.');
}

if ($this->value === '0') {
return new BigDecimal('0', $scale);
}

if ($this->value[0] === '-') {
throw new NegativeNumberException('Cannot calculate the square root of a negative number.');
}

$value = $this->value;
$addDigits = 2 * $scale - $this->scale;

if ($addDigits > 0) {

$value .= \str_repeat('0', $addDigits);
} elseif ($addDigits < 0) {

if (-$addDigits >= \strlen($this->value)) {

return new BigDecimal('0', $scale);
}

$value = \substr($value, 0, $addDigits);
}

$value = CalculatorRegistry::get()->sqrt($value);

return new BigDecimal($value, $scale);
}

/**
@pure


*/
public function withPointMovedLeft(int $n) : BigDecimal
{
if ($n === 0) {
return $this;
}

if ($n < 0) {
return $this->withPointMovedRight(-$n);
}

return new BigDecimal($this->value, $this->scale + $n);
}

/**
@pure


*/
public function withPointMovedRight(int $n) : BigDecimal
{
if ($n === 0) {
return $this;
}

if ($n < 0) {
return $this->withPointMovedLeft(-$n);
}

$value = $this->value;
$scale = $this->scale - $n;

if ($scale < 0) {
if ($value !== '0') {
$value .= \str_repeat('0', -$scale);
}
$scale = 0;
}

return new BigDecimal($value, $scale);
}

/**
@pure


*/
public function stripTrailingZeros() : BigDecimal
{
if ($this->scale === 0) {
return $this;
}

$trimmedValue = \rtrim($this->value, '0');

if ($trimmedValue === '') {
return BigDecimal::zero();
}

$trimmableZeros = \strlen($this->value) - \strlen($trimmedValue);

if ($trimmableZeros === 0) {
return $this;
}

if ($trimmableZeros > $this->scale) {
$trimmableZeros = $this->scale;
}

$value = \substr($this->value, 0, -$trimmableZeros);
$scale = $this->scale - $trimmableZeros;

return new BigDecimal($value, $scale);
}

/**
@pure


*/
public function abs() : BigDecimal
{
return $this->isNegative() ? $this->negated() : $this;
}

/**
@pure


*/
public function negated() : BigDecimal
{
return new BigDecimal(CalculatorRegistry::get()->neg($this->value), $this->scale);
}

#[Override]
public function compareTo(BigNumber|int|float|string $that) : int
{
$that = BigNumber::of($that);

if ($that instanceof BigInteger) {
$that = $that->toBigDecimal();
}

if ($that instanceof BigDecimal) {
[$a, $b] = $this->scaleValues($this, $that);

return CalculatorRegistry::get()->cmp($a, $b);
}

return - $that->compareTo($this);
}

#[Override]
public function getSign() : int
{
return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1);
}

/**
@pure
*/
public function getUnscaledValue() : BigInteger
{
return self::newBigInteger($this->value);
}

/**
@pure
*/
public function getScale() : int
{
return $this->scale;
}

/**
@pure













*/
public function getPrecision(): int
{
$value = $this->value;

if ($value === '0') {
return 0;
}

$length = \strlen($value);

return ($value[0] === '-') ? $length - 1 : $length;
}

/**
@pure




*/
public function getIntegralPart() : string
{
if ($this->scale === 0) {
return $this->value;
}

$value = $this->getUnscaledValueWithLeadingZeros();

return \substr($value, 0, -$this->scale);
}

/**
@pure






*/
public function getFractionalPart() : string
{
if ($this->scale === 0) {
return '';
}

$value = $this->getUnscaledValueWithLeadingZeros();

return \substr($value, -$this->scale);
}

/**
@pure


*/
public function hasNonZeroFractionalPart() : bool
{
return $this->getFractionalPart() !== \str_repeat('0', $this->scale);
}

#[Override]
public function toBigInteger() : BigInteger
{
$zeroScaleDecimal = $this->scale === 0 ? $this : $this->dividedBy(1, 0);

return self::newBigInteger($zeroScaleDecimal->value);
}

#[Override]
public function toBigDecimal() : BigDecimal
{
return $this;
}

#[Override]
public function toBigRational() : BigRational
{
$numerator = self::newBigInteger($this->value);
$denominator = self::newBigInteger('1' . \str_repeat('0', $this->scale));

return self::newBigRational($numerator, $denominator, false);
}

#[Override]
public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
{
if ($scale === $this->scale) {
return $this;
}

return $this->dividedBy(BigDecimal::one(), $scale, $roundingMode);
}

#[Override]
public function toInt() : int
{
return $this->toBigInteger()->toInt();
}

#[Override]
public function toFloat() : float
{
return (float) (string) $this;
}




#[Override]
public function __toString() : string
{
if ($this->scale === 0) {

return $this->value;
}

$value = $this->getUnscaledValueWithLeadingZeros();

/**
@phpstan-ignore */
return \substr($value, 0, -$this->scale) . '.' . \substr($value, -$this->scale);
}








public function __serialize(): array
{
return ['value' => $this->value, 'scale' => $this->scale];
}










public function __unserialize(array $data): void
{
/**
@phpstan-ignore */
if (isset($this->value)) {
throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
}

/**
@phpstan-ignore */
$this->value = $data['value'];
$this->scale = $data['scale'];
}

/**
@pure




*/
private function scaleValues(BigDecimal $x, BigDecimal $y) : array
{
$a = $x->value;
$b = $y->value;

if ($b !== '0' && $x->scale > $y->scale) {
$b .= \str_repeat('0', $x->scale - $y->scale);
} elseif ($a !== '0' && $x->scale < $y->scale) {
$a .= \str_repeat('0', $y->scale - $x->scale);
}

return [$a, $b];
}

/**
@pure
*/
private function valueWithMinScale(int $scale) : string
{
$value = $this->value;

if ($this->value !== '0' && $scale > $this->scale) {
$value .= \str_repeat('0', $scale - $this->scale);
}

return $value;
}

/**
@pure


*/
private function getUnscaledValueWithLeadingZeros() : string
{
$value = $this->value;
$targetLength = $this->scale + 1;
$negative = ($value[0] === '-');
$length = \strlen($value);

if ($negative) {
$length--;
}

if ($length >= $targetLength) {
return $this->value;
}

if ($negative) {
$value = \substr($value, 1);
}

$value = \str_pad($value, $targetLength, '0', STR_PAD_LEFT);

if ($negative) {
$value = '-' . $value;
}

return $value;
}
}
<?php

declare(strict_types=1);

namespace Brick\Math;










enum RoundingMode
{






case UNNECESSARY;







case UP;







case DOWN;







case CEILING;







case FLOOR;







case HALF_UP;






case HALF_DOWN;






case HALF_CEILING;






case HALF_FLOOR;











case HALF_EVEN;
}
<?php

declare(strict_types=1);

namespace Brick\Math;

use Brick\Math\Exception\DivisionByZeroException;
use Brick\Math\Exception\IntegerOverflowException;
use Brick\Math\Exception\MathException;
use Brick\Math\Exception\NegativeNumberException;
use Brick\Math\Exception\NumberFormatException;
use Brick\Math\Internal\Calculator;
use Brick\Math\Internal\CalculatorRegistry;
use Override;







final readonly class BigInteger extends BigNumber
{






private string $value;

/**
@pure




*/
protected function __construct(string $value)
{
$this->value = $value;
}

#[Override]
protected static function from(BigNumber $number): static
{
return $number->toBigInteger();
}

/**
@pure
















*/
public static function fromBase(string $number, int $base) : BigInteger
{
if ($number === '') {
throw new NumberFormatException('The number cannot be empty.');
}

if ($base < 2 || $base > 36) {
throw new \InvalidArgumentException(\sprintf('Base %d is not in range 2 to 36.', $base));
}

if ($number[0] === '-') {
$sign = '-';
$number = \substr($number, 1);
} elseif ($number[0] === '+') {
$sign = '';
$number = \substr($number, 1);
} else {
$sign = '';
}

if ($number === '') {
throw new NumberFormatException('The number cannot be empty.');
}

$number = \ltrim($number, '0');

if ($number === '') {

return BigInteger::zero();
}

if ($number === '1') {

return new BigInteger($sign . '1');
}

$pattern = '/[^' . \substr(Calculator::ALPHABET, 0, $base) . ']/';

if (\preg_match($pattern, \strtolower($number), $matches) === 1) {
throw new NumberFormatException(\sprintf('"%s" is not a valid character in base %d.', $matches[0], $base));
}

if ($base === 10) {

return new BigInteger($sign . $number);
}

$result = CalculatorRegistry::get()->fromBase($number, $base);

return new BigInteger($sign . $result);
}

/**
@pure










*/
public static function fromArbitraryBase(string $number, string $alphabet) : BigInteger
{
if ($number === '') {
throw new NumberFormatException('The number cannot be empty.');
}

$base = \strlen($alphabet);

if ($base < 2) {
throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.');
}

$pattern = '/[^' . \preg_quote($alphabet, '/') . ']/';

if (\preg_match($pattern, $number, $matches) === 1) {
throw NumberFormatException::charNotInAlphabet($matches[0]);
}

$number = CalculatorRegistry::get()->fromArbitraryBase($number, $alphabet, $base);

return new BigInteger($number);
}

/**
@pure
















*/
public static function fromBytes(string $value, bool $signed = true) : BigInteger
{
if ($value === '') {
throw new NumberFormatException('The byte string must not be empty.');
}

$twosComplement = false;

if ($signed) {
$x = \ord($value[0]);

if (($twosComplement = ($x >= 0x80))) {
$value = ~$value;
}
}

$number = self::fromBase(\bin2hex($value), 16);

if ($twosComplement) {
return $number->plus(1)->negated();
}

return $number;
}













public static function randomBits(int $numBits, ?callable $randomBytesGenerator = null) : BigInteger
{
if ($numBits < 0) {
throw new \InvalidArgumentException('The number of bits cannot be negative.');
}

if ($numBits === 0) {
return BigInteger::zero();
}

if ($randomBytesGenerator === null) {
$randomBytesGenerator = random_bytes(...);
}


$byteLength = \intdiv($numBits - 1, 8) + 1;

$extraBits = ($byteLength * 8 - $numBits);
$bitmask = \chr(0xFF >> $extraBits);

$randomBytes = $randomBytesGenerator($byteLength);
$randomBytes[0] = $randomBytes[0] & $bitmask;

return self::fromBytes($randomBytes, false);
}















public static function randomRange(
BigNumber|int|float|string $min,
BigNumber|int|float|string $max,
?callable $randomBytesGenerator = null
) : BigInteger {
$min = BigInteger::of($min);
$max = BigInteger::of($max);

if ($min->isGreaterThan($max)) {
throw new MathException('$min cannot be greater than $max.');
}

if ($min->isEqualTo($max)) {
return $min;
}

$diff = $max->minus($min);
$bitLength = $diff->getBitLength();


do {
$randomNumber = self::randomBits($bitLength, $randomBytesGenerator);
} while ($randomNumber->isGreaterThan($diff));

return $randomNumber->plus($min);
}

/**
@pure


*/
public static function zero() : BigInteger
{

static $zero;

if ($zero === null) {
$zero = new BigInteger('0');
}

return $zero;
}

/**
@pure


*/
public static function one() : BigInteger
{

static $one;

if ($one === null) {
$one = new BigInteger('1');
}

return $one;
}

/**
@pure


*/
public static function ten() : BigInteger
{

static $ten;

if ($ten === null) {
$ten = new BigInteger('10');
}

return $ten;
}

/**
@pure
*/
public static function gcdMultiple(BigInteger $a, BigInteger ...$n): BigInteger
{
$result = $a;

foreach ($n as $next) {
$result = $result->gcd($next);

if ($result->isEqualTo(1)) {
return $result;
}
}

return $result;
}

/**
@pure






*/
public function plus(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '0') {
return $this;
}

if ($this->value === '0') {
return $that;
}

$value = CalculatorRegistry::get()->add($this->value, $that->value);

return new BigInteger($value);
}

/**
@pure






*/
public function minus(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '0') {
return $this;
}

$value = CalculatorRegistry::get()->sub($this->value, $that->value);

return new BigInteger($value);
}

/**
@pure






*/
public function multipliedBy(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '1') {
return $this;
}

if ($this->value === '1') {
return $that;
}

$value = CalculatorRegistry::get()->mul($this->value, $that->value);

return new BigInteger($value);
}

/**
@pure








*/
public function dividedBy(BigNumber|int|float|string $that, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '1') {
return $this;
}

if ($that->value === '0') {
throw DivisionByZeroException::divisionByZero();
}

$result = CalculatorRegistry::get()->divRound($this->value, $that->value, $roundingMode);

return new BigInteger($result);
}













public function clamp(BigNumber|int|float|string $min, BigNumber|int|float|string $max) : BigInteger
{
if ($this->isLessThan($min)) {
return BigInteger::of($min);
} elseif ($this->isGreaterThan($max)) {
return BigInteger::of($max);
}
return $this;
}


/**
@pure




*/
public function power(int $exponent) : BigInteger
{
if ($exponent === 0) {
return BigInteger::one();
}

if ($exponent === 1) {
return $this;
}

if ($exponent < 0 || $exponent > Calculator::MAX_POWER) {
throw new \InvalidArgumentException(\sprintf(
'The exponent %d is not in the range 0 to %d.',
$exponent,
Calculator::MAX_POWER
));
}

return new BigInteger(CalculatorRegistry::get()->pow($this->value, $exponent));
}

/**
@pure






*/
public function quotient(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '1') {
return $this;
}

if ($that->value === '0') {
throw DivisionByZeroException::divisionByZero();
}

$quotient = CalculatorRegistry::get()->divQ($this->value, $that->value);

return new BigInteger($quotient);
}

/**
@pure








*/
public function remainder(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '1') {
return BigInteger::zero();
}

if ($that->value === '0') {
throw DivisionByZeroException::divisionByZero();
}

$remainder = CalculatorRegistry::get()->divR($this->value, $that->value);

return new BigInteger($remainder);
}

/**
@pure








*/
public function quotientAndRemainder(BigNumber|int|float|string $that) : array
{
$that = BigInteger::of($that);

if ($that->value === '0') {
throw DivisionByZeroException::divisionByZero();
}

[$quotient, $remainder] = CalculatorRegistry::get()->divQR($this->value, $that->value);

return [
new BigInteger($quotient),
new BigInteger($remainder)
];
}

/**
@pure











*/
public function mod(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '0') {
throw DivisionByZeroException::modulusMustNotBeZero();
}

$value = CalculatorRegistry::get()->mod($this->value, $that->value);

return new BigInteger($value);
}

/**
@pure







*/
public function modInverse(BigInteger $m) : BigInteger
{
if ($m->value === '0') {
throw DivisionByZeroException::modulusMustNotBeZero();
}

if ($m->isNegative()) {
throw new NegativeNumberException('Modulus must not be negative.');
}

if ($m->value === '1') {
return BigInteger::zero();
}

$value = CalculatorRegistry::get()->modInverse($this->value, $m->value);

if ($value === null) {
throw new MathException('Unable to compute the modInverse for the given modulus.');
}

return new BigInteger($value);
}

/**
@pure










*/
public function modPow(BigNumber|int|float|string $exp, BigNumber|int|float|string $mod) : BigInteger
{
$exp = BigInteger::of($exp);
$mod = BigInteger::of($mod);

if ($this->isNegative() || $exp->isNegative() || $mod->isNegative()) {
throw new NegativeNumberException('The operands cannot be negative.');
}

if ($mod->isZero()) {
throw DivisionByZeroException::modulusMustNotBeZero();
}

$result = CalculatorRegistry::get()->modPow($this->value, $exp->value, $mod->value);

return new BigInteger($result);
}

/**
@pure






*/
public function gcd(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

if ($that->value === '0' && $this->value[0] !== '-') {
return $this;
}

if ($this->value === '0' && $that->value[0] !== '-') {
return $that;
}

$value = CalculatorRegistry::get()->gcd($this->value, $that->value);

return new BigInteger($value);
}

/**
@pure






*/
public function sqrt() : BigInteger
{
if ($this->value[0] === '-') {
throw new NegativeNumberException('Cannot calculate the square root of a negative number.');
}

$value = CalculatorRegistry::get()->sqrt($this->value);

return new BigInteger($value);
}

/**
@pure


*/
public function abs() : BigInteger
{
return $this->isNegative() ? $this->negated() : $this;
}

/**
@pure


*/
public function negated() : BigInteger
{
return new BigInteger(CalculatorRegistry::get()->neg($this->value));
}

/**
@pure






*/
public function and(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

return new BigInteger(CalculatorRegistry::get()->and($this->value, $that->value));
}

/**
@pure






*/
public function or(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

return new BigInteger(CalculatorRegistry::get()->or($this->value, $that->value));
}

/**
@pure






*/
public function xor(BigNumber|int|float|string $that) : BigInteger
{
$that = BigInteger::of($that);

return new BigInteger(CalculatorRegistry::get()->xor($this->value, $that->value));
}

/**
@pure


*/
public function not() : BigInteger
{
return $this->negated()->minus(1);
}

/**
@pure


*/
public function shiftedLeft(int $distance) : BigInteger
{
if ($distance === 0) {
return $this;
}

if ($distance < 0) {
return $this->shiftedRight(- $distance);
}

return $this->multipliedBy(BigInteger::of(2)->power($distance));
}

/**
@pure


*/
public function shiftedRight(int $distance) : BigInteger
{
if ($distance === 0) {
return $this;
}

if ($distance < 0) {
return $this->shiftedLeft(- $distance);
}

$operand = BigInteger::of(2)->power($distance);

if ($this->isPositiveOrZero()) {
return $this->quotient($operand);
}

return $this->dividedBy($operand, RoundingMode::UP);
}

/**
@pure





*/
public function getBitLength() : int
{
if ($this->value === '0') {
return 0;
}

if ($this->isNegative()) {
return $this->abs()->minus(1)->getBitLength();
}

return \strlen($this->toBase(2));
}

/**
@pure




*/
public function getLowestSetBit() : int
{
$n = $this;
$bitLength = $this->getBitLength();

for ($i = 0; $i <= $bitLength; $i++) {
if ($n->isOdd()) {
return $i;
}

$n = $n->shiftedRight(1);
}

return -1;
}

/**
@pure


*/
public function isEven() : bool
{
return \in_array($this->value[-1], ['0', '2', '4', '6', '8'], true);
}

/**
@pure


*/
public function isOdd() : bool
{
return \in_array($this->value[-1], ['1', '3', '5', '7', '9'], true);
}

/**
@pure








*/
public function testBit(int $n) : bool
{
if ($n < 0) {
throw new \InvalidArgumentException('The bit to test cannot be negative.');
}

return $this->shiftedRight($n)->isOdd();
}

#[Override]
public function compareTo(BigNumber|int|float|string $that) : int
{
$that = BigNumber::of($that);

if ($that instanceof BigInteger) {
return CalculatorRegistry::get()->cmp($this->value, $that->value);
}

return - $that->compareTo($this);
}

#[Override]
public function getSign() : int
{
return ($this->value === '0') ? 0 : (($this->value[0] === '-') ? -1 : 1);
}

#[Override]
public function toBigInteger() : BigInteger
{
return $this;
}

#[Override]
public function toBigDecimal() : BigDecimal
{
return self::newBigDecimal($this->value);
}

#[Override]
public function toBigRational() : BigRational
{
return self::newBigRational($this, BigInteger::one(), false);
}

#[Override]
public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal
{
return $this->toBigDecimal()->toScale($scale, $roundingMode);
}

#[Override]
public function toInt() : int
{
$intValue = (int) $this->value;

if ($this->value !== (string) $intValue) {
throw IntegerOverflowException::toIntOverflow($this);
}

return $intValue;
}

#[Override]
public function toFloat() : float
{
return (float) $this->value;
}

/**
@pure






*/
public function toBase(int $base) : string
{
if ($base === 10) {
return $this->value;
}

if ($base < 2 || $base > 36) {
throw new \InvalidArgumentException(\sprintf('Base %d is out of range [2, 36]', $base));
}

return CalculatorRegistry::get()->toBase($this->value, $base);
}

/**
@pure










*/
public function toArbitraryBase(string $alphabet) : string
{
$base = \strlen($alphabet);

if ($base < 2) {
throw new \InvalidArgumentException('The alphabet must contain at least 2 chars.');
}

if ($this->value[0] === '-') {
throw new NegativeNumberException(__FUNCTION__ . '() does not support negative numbers.');
}

return CalculatorRegistry::get()->toArbitraryBase($this->value, $alphabet, $base);
}

/**
@pure

















*/
public function toBytes(bool $signed = true) : string
{
if (! $signed && $this->isNegative()) {
throw new NegativeNumberException('Cannot convert a negative number to a byte string when $signed is false.');
}

$hex = $this->abs()->toBase(16);

if (\strlen($hex) % 2 !== 0) {
$hex = '0' . $hex;
}

$baseHexLength = \strlen($hex);

if ($signed) {
if ($this->isNegative()) {
$bin = \hex2bin($hex);
assert($bin !== false);

$hex = \bin2hex(~$bin);
$hex = self::fromBase($hex, 16)->plus(1)->toBase(16);

$hexLength = \strlen($hex);

if ($hexLength < $baseHexLength) {
$hex = \str_repeat('0', $baseHexLength - $hexLength) . $hex;
}

if ($hex[0] < '8') {
$hex = 'FF' . $hex;
}
} else {
if ($hex[0] >= '8') {
$hex = '00' . $hex;
}
}
}

$result = \hex2bin($hex);
assert($result !== false);

return $result;
}




#[Override]
public function __toString() : string
{

return $this->value;
}








public function __serialize(): array
{
return ['value' => $this->value];
}










public function __unserialize(array $data): void
{
/**
@phpstan-ignore */
if (isset($this->value)) {
throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
}

/**
@phpstan-ignore */
$this->value = $data['value'];
}
}
<?php

declare(strict_types=1);

namespace Brick\Math;

use Brick\Math\Exception\DivisionByZeroException;
use Brick\Math\Exception\MathException;
use Brick\Math\Exception\NumberFormatException;
use Brick\Math\Exception\RoundingNecessaryException;
use Override;

/**
@phpstan-sealed





*/
abstract readonly class BigNumber implements \JsonSerializable, \Stringable
{



private const PARSE_REGEXP_NUMERICAL =
'/^' .
'(?<sign>[\-\+])?' .
'(?<integral>[0-9]+)?' .
'(?<point>\.)?' .
'(?<fractional>[0-9]+)?' .
'(?:[eE](?<exponent>[\-\+]?[0-9]+))?' .
'$/';




private const PARSE_REGEXP_RATIONAL =
'/^' .
'(?<sign>[\-\+])?' .
'(?<numerator>[0-9]+)' .
'\/?' .
'(?<denominator>[0-9]+)' .
'$/';

/**
@pure



















*/
final public static function of(BigNumber|int|float|string $value) : static
{
$value = self::_of($value);

if (static::class === BigNumber::class) {
assert($value instanceof static);

return $value;
}

return static::from($value);
}

/**
@pure



*/
private static function _of(BigNumber|int|float|string $value) : BigNumber
{
if ($value instanceof BigNumber) {
return $value;
}

if (\is_int($value)) {
return new BigInteger((string) $value);
}

if (is_float($value)) {
$value = (string) $value;
}

if (str_contains($value, '/')) {

if (\preg_match(self::PARSE_REGEXP_RATIONAL, $value, $matches, PREG_UNMATCHED_AS_NULL) !== 1) {
throw NumberFormatException::invalidFormat($value);
}

$sign = $matches['sign'];
$numerator = $matches['numerator'];
$denominator = $matches['denominator'];

$numerator = self::cleanUp($sign, $numerator);
$denominator = self::cleanUp(null, $denominator);

if ($denominator === '0') {
throw DivisionByZeroException::denominatorMustNotBeZero();
}

return new BigRational(
new BigInteger($numerator),
new BigInteger($denominator),
false
);
} else {

if (\preg_match(self::PARSE_REGEXP_NUMERICAL, $value, $matches, PREG_UNMATCHED_AS_NULL) !== 1) {
throw NumberFormatException::invalidFormat($value);
}

$sign = $matches['sign'];
$point = $matches['point'];
$integral = $matches['integral'];
$fractional = $matches['fractional'];
$exponent = $matches['exponent'];

if ($integral === null && $fractional === null) {
throw NumberFormatException::invalidFormat($value);
}

if ($integral === null) {
$integral = '0';
}

if ($point !== null || $exponent !== null) {
$fractional ??= '';
$exponent = ($exponent !== null) ? (int)$exponent : 0;

if ($exponent === PHP_INT_MIN || $exponent === PHP_INT_MAX) {
throw new NumberFormatException('Exponent too large.');
}

$unscaledValue = self::cleanUp($sign, $integral . $fractional);

$scale = \strlen($fractional) - $exponent;

if ($scale < 0) {
if ($unscaledValue !== '0') {
$unscaledValue .= \str_repeat('0', -$scale);
}
$scale = 0;
}

return new BigDecimal($unscaledValue, $scale);
}

$integral = self::cleanUp($sign, $integral);

return new BigInteger($integral);
}
}

/**
@pure




*/
abstract protected static function from(BigNumber $number): static;

/**
@pure



*/
final protected function newBigInteger(string $value) : BigInteger
{
return new BigInteger($value);
}

/**
@pure



*/
final protected function newBigDecimal(string $value, int $scale = 0) : BigDecimal
{
return new BigDecimal($value, $scale);
}

/**
@pure



*/
final protected function newBigRational(BigInteger $numerator, BigInteger $denominator, bool $checkDenominator) : BigRational
{
return new BigRational($numerator, $denominator, $checkDenominator);
}

/**
@pure








*/
final public static function min(BigNumber|int|float|string ...$values) : static
{
$min = null;

foreach ($values as $value) {
$value = static::of($value);

if ($min === null || $value->isLessThan($min)) {
$min = $value;
}
}

if ($min === null) {
throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
}

return $min;
}

/**
@pure








*/
final public static function max(BigNumber|int|float|string ...$values) : static
{
$max = null;

foreach ($values as $value) {
$value = static::of($value);

if ($max === null || $value->isGreaterThan($max)) {
$max = $value;
}
}

if ($max === null) {
throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
}

return $max;
}

/**
@pure














*/
final public static function sum(BigNumber|int|float|string ...$values) : static
{
$first = array_shift($values);

if ($first === null) {
throw new \InvalidArgumentException(__METHOD__ . '() expects at least one value.');
}

$sum = static::of($first);

foreach ($values as $value) {
$sum = self::add($sum, static::of($value));
}

assert($sum instanceof static);

return $sum;
}

/**
@pure


*/
private static function add(BigNumber $a, BigNumber $b) : BigNumber
{
if ($a instanceof BigRational) {
return $a->plus($b);
}

if ($b instanceof BigRational) {
return $b->plus($a);
}

if ($a instanceof BigDecimal) {
return $a->plus($b);
}

if ($b instanceof BigDecimal) {
return $b->plus($a);
}

return $a->plus($b);
}

/**
@pure





*/
private static function cleanUp(string|null $sign, string $number) : string
{
$number = \ltrim($number, '0');

if ($number === '') {
return '0';
}

return $sign === '-' ? '-' . $number : $number;
}

/**
@pure


*/
final public function isEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) === 0;
}

/**
@pure


*/
final public function isLessThan(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) < 0;
}

/**
@pure


*/
final public function isLessThanOrEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) <= 0;
}

/**
@pure


*/
final public function isGreaterThan(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) > 0;
}

/**
@pure


*/
final public function isGreaterThanOrEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) >= 0;
}

/**
@pure


*/
final public function isZero() : bool
{
return $this->getSign() === 0;
}

/**
@pure


*/
final public function isNegative() : bool
{
return $this->getSign() < 0;
}

/**
@pure


*/
final public function isNegativeOrZero() : bool
{
return $this->getSign() <= 0;
}

/**
@pure


*/
final public function isPositive() : bool
{
return $this->getSign() > 0;
}

/**
@pure


*/
final public function isPositiveOrZero() : bool
{
return $this->getSign() >= 0;
}

/**
@pure






*/
abstract public function getSign() : int;

/**
@pure








*/
abstract public function compareTo(BigNumber|int|float|string $that) : int;

/**
@pure




*/
abstract public function toBigInteger() : BigInteger;

/**
@pure




*/
abstract public function toBigDecimal() : BigDecimal;

/**
@pure


*/
abstract public function toBigRational() : BigRational;

/**
@pure








*/
abstract public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal;

/**
@pure







*/
abstract public function toInt() : int;

/**
@pure








*/
abstract public function toFloat() : float;

/**
@pure





*/
abstract public function __toString() : string;

#[Override]
final public function jsonSerialize() : string
{
return $this->__toString();
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;




final class RoundingNecessaryException extends MathException
{
/**
@pure
*/
public static function roundingNecessary() : RoundingNecessaryException
{
return new self('Rounding is necessary to represent the result of the operation at this scale.');
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;




final class NumberFormatException extends MathException
{
/**
@pure
*/
public static function invalidFormat(string $value) : self
{
return new self(\sprintf(
'The given value "%s" does not represent a valid number.',
$value,
));
}

/**
@pure


*/
public static function charNotInAlphabet(string $char) : self
{
$ord = \ord($char);

if ($ord < 32 || $ord > 126) {
$char = \strtoupper(\dechex($ord));

if ($ord < 10) {
$char = '0' . $char;
}
} else {
$char = '"' . $char . '"';
}

return new self(\sprintf('Char %s is not a valid character in the given alphabet.', $char));
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;




final class DivisionByZeroException extends MathException
{
/**
@pure
*/
public static function divisionByZero() : DivisionByZeroException
{
return new self('Division by zero.');
}

/**
@pure
*/
public static function modulusMustNotBeZero() : DivisionByZeroException
{
return new self('The modulus must not be zero.');
}

/**
@pure
*/
public static function denominatorMustNotBeZero() : DivisionByZeroException
{
return new self('The denominator of a rational number cannot be zero.');
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;

use Brick\Math\BigInteger;




final class IntegerOverflowException extends MathException
{
/**
@pure
*/
public static function toIntOverflow(BigInteger $value) : IntegerOverflowException
{
$message = '%s is out of range %d to %d and cannot be represented as an integer.';

return new self(\sprintf($message, (string) $value, PHP_INT_MIN, PHP_INT_MAX));
}
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;




final class NegativeNumberException extends MathException
{
}
<?php

declare(strict_types=1);

namespace Brick\Math\Exception;




class MathException extends \RuntimeException
{
}
Copyright (c) 2012 Dragonfly Development Inc.

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.
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData;

use ArrayAccess;
use Dflydev\DotAccessData\Exception\DataException;
use Dflydev\DotAccessData\Exception\InvalidPathException;
use Dflydev\DotAccessData\Exception\MissingPathException;

/**
@implements
*/
class Data implements DataInterface, ArrayAccess
{
private const DELIMITERS = ['.', '/'];






protected $data;






public function __construct(array $data = [])
{
$this->data = $data;
}




public function append(string $key, $value = null): void
{
$currentValue =& $this->data;
$keyPath = self::keyToPathArray($key);

$endKey = array_pop($keyPath);
foreach ($keyPath as $currentKey) {
if (! isset($currentValue[$currentKey])) {
$currentValue[$currentKey] = [];
}
$currentValue =& $currentValue[$currentKey];
}

if (!isset($currentValue[$endKey])) {
$currentValue[$endKey] = [];
}

if (!is_array($currentValue[$endKey])) {


$currentValue[$endKey] = [$currentValue[$endKey]];
}

$currentValue[$endKey][] = $value;
}




public function set(string $key, $value = null): void
{
$currentValue =& $this->data;
$keyPath = self::keyToPathArray($key);

$endKey = array_pop($keyPath);
foreach ($keyPath as $currentKey) {
if (!isset($currentValue[$currentKey])) {
$currentValue[$currentKey] = [];
}
if (!is_array($currentValue[$currentKey])) {
throw new DataException(sprintf('Key path "%s" within "%s" cannot be indexed into (is not an array)', $currentKey, self::formatPath($key)));
}
$currentValue =& $currentValue[$currentKey];
}
$currentValue[$endKey] = $value;
}




public function remove(string $key): void
{
$currentValue =& $this->data;
$keyPath = self::keyToPathArray($key);

$endKey = array_pop($keyPath);
foreach ($keyPath as $currentKey) {
if (!isset($currentValue[$currentKey])) {
return;
}
$currentValue =& $currentValue[$currentKey];
}
unset($currentValue[$endKey]);
}

/**
@psalm-mutation-free


*/
public function get(string $key, $default = null)
{
/**
@psalm-suppress */
$hasDefault = \func_num_args() > 1;

$currentValue = $this->data;
$keyPath = self::keyToPathArray($key);

foreach ($keyPath as $currentKey) {
if (!is_array($currentValue) || !array_key_exists($currentKey, $currentValue)) {
if ($hasDefault) {
return $default;
}

throw new MissingPathException($key, sprintf('No data exists at the given path: "%s"', self::formatPath($keyPath)));
}

$currentValue = $currentValue[$currentKey];
}

return $currentValue === null ? $default : $currentValue;
}

/**
@psalm-mutation-free


*/
public function has(string $key): bool
{
$currentValue = $this->data;

foreach (self::keyToPathArray($key) as $currentKey) {
if (
!is_array($currentValue) ||
!array_key_exists($currentKey, $currentValue)
) {
return false;
}
$currentValue = $currentValue[$currentKey];
}

return true;
}

/**
@psalm-mutation-free


*/
public function getData(string $key): DataInterface
{
$value = $this->get($key);
if (is_array($value) && Util::isAssoc($value)) {
return new Data($value);
}

throw new DataException(sprintf('Value at "%s" could not be represented as a DataInterface', self::formatPath($key)));
}




public function import(array $data, int $mode = self::REPLACE): void
{
$this->data = Util::mergeAssocArray($this->data, $data, $mode);
}




public function importData(DataInterface $data, int $mode = self::REPLACE): void
{
$this->import($data->export(), $mode);
}

/**
@psalm-mutation-free


*/
public function export(): array
{
return $this->data;
}






#[\ReturnTypeWillChange]
public function offsetExists($key)
{
return $this->has($key);
}






#[\ReturnTypeWillChange]
public function offsetGet($key)
{
return $this->get($key, null);
}









#[\ReturnTypeWillChange]
public function offsetSet($key, $value)
{
$this->set($key, $value);
}






#[\ReturnTypeWillChange]
public function offsetUnset($key)
{
$this->remove($key);
}

/**
@psalm-return
@psalm-pure





*/
protected static function keyToPathArray(string $path): array
{
if (\strlen($path) === 0) {
throw new InvalidPathException('Path cannot be an empty string');
}

$path = \str_replace(self::DELIMITERS, '.', $path);

return \explode('.', $path);
}

/**
@psalm-pure




*/
protected static function formatPath($path): string
{
if (is_string($path)) {
$path = self::keyToPathArray($path);
}

return implode(' » ', $path);
}
}
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData;

use Dflydev\DotAccessData\Exception\DataException;
use Dflydev\DotAccessData\Exception\InvalidPathException;

interface DataInterface
{
public const PRESERVE = 0;
public const REPLACE = 1;
public const MERGE = 2;












public function append(string $key, $value = null): void;












public function set(string $key, $value = null): void;










public function remove(string $key): void;

/**
@psalm-mutation-free













*/
public function get(string $key, $default = null);

/**
@psalm-mutation-free








*/
public function has(string $key): bool;

/**
@psalm-mutation-free









*/
public function getData(string $key): DataInterface;







public function import(array $data, int $mode = self::REPLACE): void;







public function importData(DataInterface $data, int $mode = self::REPLACE): void;

/**
@psalm-mutation-free




*/
public function export(): array;
}
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData\Exception;

use Throwable;




class MissingPathException extends DataException
{

protected $path;

public function __construct(string $path, string $message = '', int $code = 0, ?Throwable $previous = null)
{
$this->path = $path;

parent::__construct($message, $code, $previous);
}

public function getPath(): string
{
return $this->path;
}
}
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData\Exception;




class DataException extends \RuntimeException
{
}
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData\Exception;




class InvalidPathException extends DataException
{
}
<?php

declare(strict_types=1);










namespace Dflydev\DotAccessData;

class Util
{
/**
@psalm-pure









*/
public static function isAssoc(array $arr): bool
{
return !count($arr) || count(array_filter(array_keys($arr), 'is_string')) == count($arr);
}

/**
@psalm-pure








*/
public static function mergeAssocArray($to, $from, int $mode = DataInterface::REPLACE)
{
if ($mode === DataInterface::MERGE && self::isList($to) && self::isList($from)) {
return array_merge($to, $from);
}

if (is_array($from) && is_array($to)) {
foreach ($from as $k => $v) {
if (!isset($to[$k])) {
$to[$k] = $v;
} else {
$to[$k] = self::mergeAssocArray($to[$k], $v, $mode);
}
}

return $to;
}

return $mode === DataInterface::PRESERVE ? $to : $from;
}

/**
@psalm-pure




*/
private static function isList($value): bool
{
return is_array($value) && array_values($value) === $value;
}
}
The MIT License (MIT)

Copyright (c) 2013-2016 container-interop
Copyright (c) 2016 PHP Framework Interoperability Group

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.
<?php

namespace Psr\Container;




interface NotFoundExceptionInterface extends ContainerExceptionInterface
{
}
<?php

namespace Psr\Container;

use Throwable;




interface ContainerExceptionInterface extends Throwable
{
}
<?php

declare(strict_types=1);

namespace Psr\Container;




interface ContainerInterface
{










public function get(string $id);












public function has(string $id);
}
Copyright (c) 2017 PHP Framework Interoperability Group

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.
<?php

namespace Psr\Http\Client;




interface ClientExceptionInterface extends \Throwable
{
}
<?php

namespace Psr\Http\Client;

use Psr\Http\Message\RequestInterface;








interface NetworkExceptionInterface extends ClientExceptionInterface
{







public function getRequest(): RequestInterface;
}
<?php

namespace Psr\Http\Client;

use Psr\Http\Message\RequestInterface;








interface RequestExceptionInterface extends ClientExceptionInterface
{







public function getRequest(): RequestInterface;
}
<?php

namespace Psr\Http\Client;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

interface ClientInterface
{









public function sendRequest(RequestInterface $request): ResponseInterface;
}
Copyright (c) 2012 PHP Framework Interoperability Group

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.
<?php

namespace Psr\Log;








abstract class AbstractLogger implements LoggerInterface
{
use LoggerTrait;
}
<?php

namespace Psr\Log;









class NullLogger extends AbstractLogger
{







public function log($level, string|\Stringable $message, array $context = []): void
{

}
}
<?php

namespace Psr\Log;




trait LoggerAwareTrait
{



protected ?LoggerInterface $logger = null;




public function setLogger(LoggerInterface $logger): void
{
$this->logger = $logger;
}
}
<?php

namespace Psr\Log;

class InvalidArgumentException extends \InvalidArgumentException
{
}
<?php

namespace Psr\Log;




class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
<?php

namespace Psr\Log;




interface LoggerAwareInterface
{



public function setLogger(LoggerInterface $logger): void;
}
<?php

namespace Psr\Log;
















interface LoggerInterface
{





public function emergency(string|\Stringable $message, array $context = []): void;









public function alert(string|\Stringable $message, array $context = []): void;








public function critical(string|\Stringable $message, array $context = []): void;







public function error(string|\Stringable $message, array $context = []): void;









public function warning(string|\Stringable $message, array $context = []): void;






public function notice(string|\Stringable $message, array $context = []): void;








public function info(string|\Stringable $message, array $context = []): void;






public function debug(string|\Stringable $message, array $context = []): void;









public function log($level, string|\Stringable $message, array $context = []): void;
}
<?php

namespace Psr\Log;









trait LoggerTrait
{



public function emergency(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::EMERGENCY, $message, $context);
}







public function alert(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::ALERT, $message, $context);
}






public function critical(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::CRITICAL, $message, $context);
}





public function error(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::ERROR, $message, $context);
}







public function warning(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::WARNING, $message, $context);
}




public function notice(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::NOTICE, $message, $context);
}






public function info(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::INFO, $message, $context);
}




public function debug(string|\Stringable $message, array $context = []): void
{
$this->log(LogLevel::DEBUG, $message, $context);
}








abstract public function log($level, string|\Stringable $message, array $context = []): void;
}
MIT License

Copyright (c) 2018 PHP-FIG

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.
<?php

namespace Psr\Http\Message;

interface ResponseFactoryInterface
{










public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface;
}
<?php

namespace Psr\Http\Message;

interface StreamFactoryInterface
{









public function createStream(string $content = ''): StreamInterface;
















public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface;










public function createStreamFromResource($resource): StreamInterface;
}
<?php

namespace Psr\Http\Message;

interface ServerRequestFactoryInterface
{
















public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface;
}
<?php

namespace Psr\Http\Message;

interface RequestFactoryInterface
{










public function createRequest(string $method, $uri): RequestInterface;
}
<?php

namespace Psr\Http\Message;

interface UploadedFileFactoryInterface
{




















public function createUploadedFile(
StreamInterface $stream,
?int $size = null,
int $error = \UPLOAD_ERR_OK,
?string $clientFilename = null,
?string $clientMediaType = null
): UploadedFileInterface;
}
<?php

namespace Psr\Http\Message;

interface UriFactoryInterface
{









public function createUri(string $uri = ''): UriInterface;
}
Copyright (c) 2014 PHP Framework Interoperability Group

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.
<?php

namespace Psr\Http\Message;
















interface ResponseInterface extends MessageInterface
{








public function getStatusCode(): int;





















public function withStatus(int $code, string $reasonPhrase = ''): ResponseInterface;














public function getReasonPhrase(): string;
}
<?php

namespace Psr\Http\Message;







































interface ServerRequestInterface extends RequestInterface
{









public function getServerParams(): array;











public function getCookieParams(): array;


















public function withCookieParams(array $cookies): ServerRequestInterface;













public function getQueryParams(): array;























public function withQueryParams(array $query): ServerRequestInterface;













public function getUploadedFiles(): array;












public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface;
















public function getParsedBody();





























public function withParsedBody($data): ServerRequestInterface;












public function getAttributes(): array;
















public function getAttribute(string $name, $default = null);
















public function withAttribute(string $name, $value): ServerRequestInterface;















public function withoutAttribute(string $name): ServerRequestInterface;
}
<?php

namespace Psr\Http\Message;









interface UploadedFileInterface
{
















public function getStream(): StreamInterface;

































public function moveTo(string $targetPath): void;










public function getSize(): ?int;















public function getError(): int;














public function getClientFilename(): ?string;














public function getClientMediaType(): ?string;
}
<?php

namespace Psr\Http\Message;








interface StreamInterface
{














public function __toString(): string;






public function close(): void;








public function detach();






public function getSize(): ?int;







public function tell(): int;






public function eof(): bool;






public function isSeekable(): bool;













public function seek(int $offset, int $whence = SEEK_SET): void;











public function rewind(): void;






public function isWritable(): bool;








public function write(string $string): int;






public function isReadable(): bool;











public function read(int $length): string;








public function getContents(): string;













public function getMetadata(?string $key = null);
}
<?php

namespace Psr\Http\Message;













interface MessageInterface
{







public function getProtocolVersion(): string;














public function withProtocolVersion(string $version): MessageInterface;


























public function getHeaders(): array;









public function hasHeader(string $name): bool;















public function getHeader(string $name): array;




















public function getHeaderLine(string $name): string;
















public function withHeader(string $name, $value): MessageInterface;

















public function withAddedHeader(string $name, $value): MessageInterface;













public function withoutHeader(string $name): MessageInterface;






public function getBody(): StreamInterface;














public function withBody(StreamInterface $body): MessageInterface;
}
<?php

namespace Psr\Http\Message;





















interface UriInterface
{














public function getScheme(): string;



















public function getAuthority(): string;
















public function getUserInfo(): string;












public function getHost(): string;
















public function getPort(): ?int;


























public function getPath(): string;





















public function getQuery(): string;

















public function getFragment(): string;
















public function withScheme(string $scheme): UriInterface;















public function withUserInfo(string $user, ?string $password = null): UriInterface;













public function withHost(string $host): UriInterface;


















public function withPort(?int $port): UriInterface;























public function withPath(string $path): UriInterface;
















public function withQuery(string $query): UriInterface;















public function withFragment(string $fragment): UriInterface;
























public function __toString(): string;
}
<?php

namespace Psr\Http\Message;




















interface RequestInterface extends MessageInterface
{
















public function getRequestTarget(): string;


















public function withRequestTarget(string $requestTarget): RequestInterface;







public function getMethod(): string;
















public function withMethod(string $method): RequestInterface;










public function getUri(): UriInterface;































public function withUri(UriInterface $uri, bool $preserveHost = false): RequestInterface;
}
<?php

namespace Psr\Cache;




interface CacheException extends \Throwable
{
}
<?php

namespace Psr\Cache;










interface CacheItemPoolInterface
{
















public function getItem(string $key): CacheItemInterface;

















public function getItems(array $keys = []): iterable;


















public function hasItem(string $key): bool;







public function clear(): bool;














public function deleteItem(string $key): bool;














public function deleteItems(array $keys): bool;










public function save(CacheItemInterface $item): bool;










public function saveDeferred(CacheItemInterface $item): bool;







public function commit(): bool;
}
<?php

namespace Psr\Cache;







interface InvalidArgumentException extends CacheException
{
}
<?php

namespace Psr\Cache;




















interface CacheItemInterface
{









public function getKey(): string;













public function get(): mixed;










public function isHit(): bool;














public function set(mixed $value): static;













public function expiresAt(?\DateTimeInterface $expiration): static;














public function expiresAfter(int|\DateInterval|null $time): static;
}
Copyright (c) 2015 PHP Framework Interoperability Group

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.
MIT License

Copyright (c) 2018 PHP-FIG

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.
<?php
declare(strict_types=1);

namespace Psr\EventDispatcher;




interface EventDispatcherInterface
{









public function dispatch(object $event);
}
<?php
declare(strict_types=1);

namespace Psr\EventDispatcher;




interface ListenerProviderInterface
{







public function getListenersForEvent(object $event) : iterable;
}
<?php
declare(strict_types=1);

namespace Psr\EventDispatcher;








interface StoppableEventInterface
{










public function isPropagationStopped() : bool;
}
Copyright (c) 2011 Igor Wiedler

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.
<?php declare(strict_types=1);










namespace Evenement;

class EventEmitter implements EventEmitterInterface
{
use EventEmitterTrait;
}
<?php declare(strict_types=1);










namespace Evenement;

use InvalidArgumentException;

use function count;
use function array_keys;
use function array_merge;
use function array_search;
use function array_unique;
use function array_values;

trait EventEmitterTrait
{
protected $listeners = [];
protected $onceListeners = [];

public function on($event, callable $listener)
{
if ($event === null) {
throw new InvalidArgumentException('event name must not be null');
}

if (!isset($this->listeners[$event])) {
$this->listeners[$event] = [];
}

$this->listeners[$event][] = $listener;

return $this;
}

public function once($event, callable $listener)
{
if ($event === null) {
throw new InvalidArgumentException('event name must not be null');
}

if (!isset($this->onceListeners[$event])) {
$this->onceListeners[$event] = [];
}

$this->onceListeners[$event][] = $listener;

return $this;
}

public function removeListener($event, callable $listener)
{
if ($event === null) {
throw new InvalidArgumentException('event name must not be null');
}

if (isset($this->listeners[$event])) {
$index = array_search($listener, $this->listeners[$event], true);
if (false !== $index) {
unset($this->listeners[$event][$index]);
if (count($this->listeners[$event]) === 0) {
unset($this->listeners[$event]);
}
}
}

if (isset($this->onceListeners[$event])) {
$index = array_search($listener, $this->onceListeners[$event], true);
if (false !== $index) {
unset($this->onceListeners[$event][$index]);
if (count($this->onceListeners[$event]) === 0) {
unset($this->onceListeners[$event]);
}
}
}
}

public function removeAllListeners($event = null)
{
if ($event !== null) {
unset($this->listeners[$event]);
} else {
$this->listeners = [];
}

if ($event !== null) {
unset($this->onceListeners[$event]);
} else {
$this->onceListeners = [];
}
}

public function listeners($event = null): array
{
if ($event === null) {
$events = [];
$eventNames = array_unique(
array_merge(
array_keys($this->listeners),
array_keys($this->onceListeners)
)
);
foreach ($eventNames as $eventName) {
$events[$eventName] = array_merge(
isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [],
isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : []
);
}
return $events;
}

return array_merge(
isset($this->listeners[$event]) ? $this->listeners[$event] : [],
isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : []
);
}

public function emit($event, array $arguments = [])
{
if ($event === null) {
throw new InvalidArgumentException('event name must not be null');
}

$listeners = [];
if (isset($this->listeners[$event])) {
$listeners = array_values($this->listeners[$event]);
}

$onceListeners = [];
if (isset($this->onceListeners[$event])) {
$onceListeners = array_values($this->onceListeners[$event]);
}

if(empty($listeners) === false) {
foreach ($listeners as $listener) {
$listener(...$arguments);
}
}

if(empty($onceListeners) === false) {
unset($this->onceListeners[$event]);
foreach ($onceListeners as $listener) {
$listener(...$arguments);
}
}
}
}
<?php declare(strict_types=1);










namespace Evenement;

interface EventEmitterInterface
{
public function on($event, callable $listener);
public function once($event, callable $listener);
public function removeListener($event, callable $listener);
public function removeAllListeners($event = null);
public function listeners($event = null);
public function emit($event, array $arguments = []);
}
<?php

namespace Grasmash\Expander;





class Stringifier implements StringifierInterface
{









public static function stringifyArray(array $array): string
{
return implode(',', $array);
}
}
<?php

namespace Grasmash\Expander;

interface StringifierInterface
{









public static function stringifyArray(array $array): string;
}
<?php

namespace Grasmash\Expander;

use Dflydev\DotAccessData\Data;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;





class Expander implements LoggerAwareInterface
{



protected StringifierInterface $stringifier;



protected LoggerInterface $logger;

public function __construct()
{
$this->setLogger(new NullLogger());
$this->setStringifier(new Stringifier());
}




public function getStringifier(): StringifierInterface
{
return $this->stringifier;
}




public function setStringifier(StringifierInterface $stringifier)
{
$this->stringifier = $stringifier;
}




public function getLogger(): LoggerInterface
{
return $this->logger;
}




public function setLogger(LoggerInterface $logger): void
{
$this->logger = $logger;
}













public function expandArrayProperties(array $array, $reference_array = []): array
{
$data = new Data($array);
if ($reference_array) {
$reference_data = new Data($reference_array);
$this->doExpandArrayProperties($data, $array, '', $reference_data);
} else {
$this->doExpandArrayProperties($data, $array);
}

return $data->export();
}















protected function doExpandArrayProperties(
Data $data,
array $array,
string $parent_keys = '',
?Data $reference_data = null
) {
foreach ($array as $key => $value) {

if ($value === null || is_bool($value)) {
continue;
}

if (is_array($value)) {
$this->doExpandArrayProperties($data, $value, $parent_keys . "$key.", $reference_data);
} else {

$this->expandStringProperties($data, $parent_keys, $reference_data, $value, $key);
}
}
}



















protected function expandStringProperties(
Data $data,
string $parent_keys,
?Data $reference_data,
string $value,
string $key
): mixed {
$pattern = '/\$\{([^\$}]+)\}/';


while (str_contains((string) $value, '${')) {
$original_value = $value;
$value = preg_replace_callback(
$pattern,
function ($matches) use ($data, $reference_data) {
return $this->expandStringPropertiesCallback($matches, $data, $reference_data);
},
$value,
-1,
$count
);


if ($count === 1) {
preg_match($pattern, $original_value, $matches);
if ($matches[0] === $original_value) {
$value = $this->expandStringPropertiesCallback($matches, $data, $reference_data);
}
}



if ($original_value === $value) {
break;
}


if ($parent_keys) {
$full_key = $parent_keys . "$key";
} else {
$full_key = $key;
}
$data->set($full_key, $value);
}
return $value;
}














public function expandStringPropertiesCallback(
array $matches,
Data $data,
?Data $reference_data = null
): mixed {
$property_name = $matches[1];
$unexpanded_value = $matches[0];


if (!$reference_data) {
return $this->expandProperty($property_name, $unexpanded_value, $data);
} else {

return $this->expandPropertyWithReferenceData(
$property_name,
$unexpanded_value,
$data,
$reference_data
);
}
}

















public function expandPropertyWithReferenceData(
string $property_name,
string $unexpanded_value,
Data $data,
?Data $reference_data
): ?string {
$expanded_value = $this->expandProperty(
$property_name,
$unexpanded_value,
$data
);


if ($expanded_value === $unexpanded_value) {
$expanded_value = $this->expandProperty(
$property_name,
$unexpanded_value,
$reference_data
);
}

return $expanded_value;
}













public function expandProperty(string $property_name, string $unexpanded_value, Data $data): mixed
{
if (str_starts_with($property_name, "env.") &&
!$data->has($property_name)) {
$env_key = substr($property_name, 4);
if (isset($_SERVER[$env_key])) {
$data->set($property_name, $_SERVER[$env_key]);
} elseif (getenv($env_key)) {
$data->set($property_name, getenv($env_key));
}
}

if (!$data->has($property_name)) {
$this->log("Property \${'$property_name'} could not be expanded.");
return $unexpanded_value;
} else {
$expanded_value = $data->get($property_name);
if (is_array($expanded_value)) {
return $this->getStringifier()->stringifyArray($expanded_value);
}
$this->log("Expanding property \${'$property_name'} => $expanded_value.");
return $expanded_value;
}
}







public function log(string $message)
{
$this->getLogger()?->debug($message);
}
}
                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
<?php

namespace Acquia\DrupalEnvironmentDetector;




class AcquiaDrupalEnvironmentDetector {




public static function isAhEnv(): bool {
return (bool) self::getAhEnv();
}
















public static function isAcsfEnv(?string $ah_group = NULL, ?string $ah_env = NULL): bool {
if (is_null($ah_group)) {
$ah_group = self::getAhGroup();
}

if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}

if (empty($ah_group) || empty($ah_env)) {
return FALSE;
}

return file_exists(FilePaths::acsfSitesJson($ah_group, $ah_env));
}










public static function isAhProdEnv(?string $ah_env = NULL): bool {
if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}
return EnvironmentNames::isAhProdEnv($ah_env);
}










public static function isAhStageEnv(?string $ah_env = NULL): bool {
if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}
return EnvironmentNames::isAhStageEnv($ah_env);
}










public static function isAhDevEnv(?string $ah_env = NULL): bool {
if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}
return EnvironmentNames::isAhDevEnv($ah_env);
}










public static function isAhOdeEnv(?string $ah_env = NULL): bool {
if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}
return EnvironmentNames::isAhOdeEnv($ah_env);
}










public static function isAhIdeEnv(?string $ah_env = NULL): bool {
if (is_null($ah_env)) {
$ah_env = self::getAhEnv();
}
return EnvironmentNames::isAhIdeEnv($ah_env);
}






public static function isAhDevCloud(): bool {
return self::getAhRealm() === 'devcloud';
}







public static function getAhGroup(): string {
return getenv('AH_SITE_GROUP');
}









public static function getAhEnv(): string {
return getenv('AH_SITE_ENVIRONMENT');
}









public static function getAhRealm(): string {
return getenv('AH_REALM');
}




public static function getAhNonProduction(): string {
return getenv('AH_NON_PRODUCTION');
}




public static function getAhApplicationUuid(): string {
return getenv('AH_APPLICATION_UUID');
}









public static function getAhFilesRoot(): string {
return FilePaths::ahFilesRoot(self::getAhGroup(), self::getAhEnv());
}







public static function getAcsfDbName(): ?string {


return isset($GLOBALS['gardens_site_settings']) && self::isAcsfEnv() ? $GLOBALS['gardens_site_settings']['conf']['acsf_db_name'] : NULL;

}















public static function getSiteName(string $site_path): ?string {
if (self::isAcsfEnv()) {
return self::getAcsfDbName();
}

return str_replace('sites/', '', $site_path);
}




public static function isAcquiaLandoEnv(): bool {
return getenv('AH_SITE_ENVIRONMENT') === 'LANDO';
}




public static function isLandoEnv(): bool {
return getenv('LANDO') === 'ON';
}




public static function getLandoInfo(): string {
return getenv('LANDO_INFO');
}




public static function isLocalEnv(): bool {
return !self::isAhEnv() || self::isAcquiaLandoEnv();
}




public static function isCodeStudioEnv(): bool {
$gitlab_job_id = getenv('CI_JOB_ID');
$gitlab_token = getenv('ACQUIA_GLAB_TOKEN_NAME');
return (bool) (!empty($gitlab_job_id) && !empty($gitlab_token));
}










public static function getAhEnvGroup(string $ah_env): string {
if (EnvironmentNames::isAhProdEnv($ah_env)) {
return 'prod';
}
elseif (EnvironmentNames::isAhStageEnv($ah_env)) {
return 'stage';
}
elseif (EnvironmentNames::isAhDevEnv($ah_env)) {
return 'dev';
}
elseif (EnvironmentNames::isAhOdeEnv($ah_env)) {
return 'ode';
}
elseif (EnvironmentNames::isAhIdeEnv($ah_env)) {
return 'ide';
}
elseif (self::isAhEnv()) {
return 'other_acquia_env';
}
else {
return 'non_acquia_env';
}
}

}
<?php

namespace Acquia\DrupalEnvironmentDetector;






class EnvironmentNames {










public static function isAhProdEnv(string $ah_env): bool {

return $ah_env === 'prod' || preg_match('/^\d*live$/', $ah_env);
}














public static function isAhStageEnv(string $ah_env): bool {

return preg_match('/^\d*test$/', $ah_env) || $ah_env === 'stg' || $ah_env === 'stage';
}










public static function isAhDevEnv(string $ah_env): bool {

return (bool) preg_match('/^\d*dev\d*$/', $ah_env);
}










public static function isAhOdeEnv(string $ah_env): bool {

return (bool) preg_match('/^ode\d*$/', $ah_env);
}










public static function isAhIdeEnv(string $ah_env): bool {
return strtolower($ah_env) === 'ide';
}

}
<?php

namespace Acquia\DrupalEnvironmentDetector;






class FilePaths {












public static function ahSettingsFile(string $ah_group, string $site_name) {

if ($site_name === 'default') {
$site_name = $ah_group;
}


$site_name = str_replace(['.', '-'], '_', $site_name);

return "/var/www/site-php/$ah_group/$site_name-settings.inc";
}














public static function acsfSitesJson(string $ah_group, string $ah_env) {
return "/var/www/site-php/$ah_group.$ah_env/multisite-config.json";
}









public static function ahFilesRoot(string $ah_group, string $ah_env) {
return '/mnt/files/' . $ah_group . '.' . $ah_env;
}

}
The MIT License (MIT)

Copyright (c) 2020-2024 Graham Campbell <hello@gjcampbell.co.uk>

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.
<?php

declare(strict_types=1);










namespace GrahamCampbell\ResultType;

use PhpOption\None;
use PhpOption\Some;

/**
@template
@template
@extends

*/
final class Error extends Result
{



private $value;








private function __construct($value)
{
$this->value = $value;
}

/**
@template






*/
public static function create($value)
{
return new self($value);
}






public function success()
{
return None::create();
}

/**
@template






*/
public function map(callable $f)
{
return self::create($this->value);
}

/**
@template
@template






*/
public function flatMap(callable $f)
{

return self::create($this->value);
}






public function error()
{
return Some::create($this->value);
}

/**
@template






*/
public function mapError(callable $f)
{
return self::create($f($this->value));
}
}
<?php

declare(strict_types=1);










namespace GrahamCampbell\ResultType;

use PhpOption\None;
use PhpOption\Some;

/**
@template
@template
@extends

*/
final class Success extends Result
{



private $value;








private function __construct($value)
{
$this->value = $value;
}

/**
@template






*/
public static function create($value)
{
return new self($value);
}






public function success()
{
return Some::create($this->value);
}

/**
@template






*/
public function map(callable $f)
{
return self::create($f($this->value));
}

/**
@template
@template






*/
public function flatMap(callable $f)
{
return $f($this->value);
}






public function error()
{
return None::create();
}

/**
@template






*/
public function mapError(callable $f)
{
return self::create($this->value);
}
}
<?php

declare(strict_types=1);










namespace GrahamCampbell\ResultType;

/**
@template
@template
*/
abstract class Result
{





abstract public function success();

/**
@template






*/
abstract public function map(callable $f);

/**
@template
@template






*/
abstract public function flatMap(callable $f);






abstract public function error();

/**
@template






*/
abstract public function mapError(callable $f);
}
The MIT License (MIT)

Copyright (c) 2013-2023 Alex Bilbie <hello@alexbilbie.com>

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.
<?php













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;





class GenericProvider extends AbstractProvider
{
use BearerAuthorizationTrait;




private $urlAuthorize;




private $urlAccessToken;




private $urlResourceOwnerDetails;




private $accessTokenMethod;




private $accessTokenResourceOwnerId;




private $scopes = null;




private $scopeSeparator;




private $responseError = 'error';




private $responseCode;




private $responseResourceOwnerId = 'id';




private $pkceMethod = null;





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;
}


$options = array_diff_key($options, $configured);

parent::__construct($options, $collaborators);
}






protected function getConfigurableOptions()
{
return array_merge($this->getRequiredOptions(), [
'accessTokenMethod',
'accessTokenResourceOwnerId',
'scopeSeparator',
'responseError',
'responseCode',
'responseResourceOwnerId',
'scopes',
'pkceMethod',
]);
}






protected function getRequiredOptions()
{
return [
'urlAuthorize',
'urlAccessToken',
'urlResourceOwnerDetails',
];
}








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))
);
}
}




public function getBaseAuthorizationUrl()
{
return $this->urlAuthorize;
}




public function getBaseAccessTokenUrl(array $params)
{
return $this->urlAccessToken;
}




public function getResourceOwnerDetailsUrl(AccessToken $token)
{
return $this->urlResourceOwnerDetails;
}




public function getDefaultScopes()
{
return $this->scopes;
}




protected function getAccessTokenMethod()
{
return $this->accessTokenMethod ?: parent::getAccessTokenMethod();
}




protected function getAccessTokenResourceOwnerId()
{
return $this->accessTokenResourceOwnerId ?: parent::getAccessTokenResourceOwnerId();
}




protected function getScopeSeparator()
{
return $this->scopeSeparator ?: parent::getScopeSeparator();
}




protected function getPkceMethod()
{
return $this->pkceMethod ?: parent::getPkceMethod();
}




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);
}
}




protected function createResourceOwner(array $response, AccessToken $token)
{
return new GenericResourceOwner($response, $this->responseResourceOwnerId);
}
}
<?php













namespace League\OAuth2\Client\Provider;




class GenericResourceOwner implements ResourceOwnerInterface
{



protected $response;




protected $resourceOwnerId;





public function __construct(array $response, $resourceOwnerId)
{
$this->response = $response;
$this->resourceOwnerId = $resourceOwnerId;
}






public function getId()
{
return $this->response[$this->resourceOwnerId];
}






public function toArray()
{
return $this->response;
}
}
<?php













namespace League\OAuth2\Client\Provider;





interface ResourceOwnerInterface
{





public function getId();






public function toArray();
}
<?php













namespace League\OAuth2\Client\Provider\Exception;




class IdentityProviderException extends \Exception
{



protected $response;






public function __construct($message, $code, $response)
{
$this->response = $response;

parent::__construct($message, $code);
}






public function getResponseBody()
{
return $this->response;
}
}
<?php













namespace League\OAuth2\Client\Provider;

use GuzzleHttp\Client as HttpClient;
use GuzzleHttp\ClientInterface as HttpClientInterface;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\GuzzleException;
use InvalidArgumentException;
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;






abstract class AbstractProvider
{
use ArrayAccessorTrait;
use GuardedPropertyTrait;
use QueryBuilderTrait;




const ACCESS_TOKEN_RESOURCE_OWNER_ID = null;




const METHOD_GET = 'GET';




const METHOD_POST = 'POST';





const PKCE_METHOD_S256 = 'S256';






const PKCE_METHOD_PLAIN = 'plain';




protected $clientId;




protected $clientSecret;




protected $redirectUri;




protected $state;




protected $pkceCode = null;




protected $grantFactory;




protected $requestFactory;




protected $httpClient;




protected $optionProvider;












public function __construct(array $options = [], array $collaborators = [])
{


$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']);
}









protected function getAllowedClientOptions(array $options)
{
$client_options = ['timeout', 'proxy'];


if (!empty($options['proxy'])) {
$client_options[] = 'verify';
}

return $client_options;
}







public function setGrantFactory(GrantFactory $factory)
{
$this->grantFactory = $factory;

return $this;
}






public function getGrantFactory()
{
return $this->grantFactory;
}







public function setRequestFactory(RequestFactory $factory)
{
$this->requestFactory = $factory;

return $this;
}






public function getRequestFactory()
{
return $this->requestFactory;
}







public function setHttpClient(HttpClientInterface $client)
{
$this->httpClient = $client;

return $this;
}






public function getHttpClient()
{
return $this->httpClient;
}







public function setOptionProvider(OptionProviderInterface $provider)
{
$this->optionProvider = $provider;

return $this;
}






public function getOptionProvider()
{
return $this->optionProvider;
}








public function getState()
{
return $this->state;
}









public function setPkceCode($pkceCode)
{
$this->pkceCode = $pkceCode;
return $this;
}








public function getPkceCode()
{
return $this->pkceCode;
}








abstract public function getBaseAuthorizationUrl();









abstract public function getBaseAccessTokenUrl(array $params);







abstract public function getResourceOwnerDetailsUrl(AccessToken $token);








protected function getRandomState($length = 32)
{


return bin2hex(random_bytes($length / 2));
}









protected function getRandomPkceCode($length = 64)
{
return substr(
strtr(
base64_encode(random_bytes($length)),
'+/',
'-_'
),
0,
$length
);
}









abstract protected function getDefaultScopes();







protected function getScopeSeparator()
{
return ',';
}




protected function getPkceMethod()
{
return null;
}








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']);
}


$this->state = $options['state'];

$pkceMethod = $this->getPkceMethod();
if (!empty($pkceMethod)) {
$this->pkceCode = $this->getRandomPkceCode();
if ($pkceMethod === static::PKCE_METHOD_S256) {
$options['code_challenge'] = trim(
strtr(
base64_encode(hash('sha256', $this->pkceCode, true)),
'+/',
'-_'
),
'='
);
} elseif ($pkceMethod === static::PKCE_METHOD_PLAIN) {
$options['code_challenge'] = $this->pkceCode;
} else {
throw new InvalidArgumentException('Unknown PKCE method "' . $pkceMethod . '".');
}
$options['code_challenge_method'] = $pkceMethod;
}



if (!isset($options['redirect_uri'])) {
$options['redirect_uri'] = $this->redirectUri;
}

$options['client_id'] = $this->clientId;

return $options;
}







protected function getAuthorizationQuery(array $params)
{
return $this->buildQueryString($params);
}








public function getAuthorizationUrl(array $options = [])
{
$base = $this->getBaseAuthorizationUrl();
$params = $this->getAuthorizationParameters($options);
$query = $this->getAuthorizationQuery($params);

return $this->appendQuery($base, $query);
}









public function authorize(
array $options = [],
?callable $redirectHandler = null
) {
$url = $this->getAuthorizationUrl($options);
if ($redirectHandler) {
return $redirectHandler($url, $this);
}


header('Location: ' . $url);
exit;

}








protected function appendQuery($url, $query)
{
$query = trim($query, '?&');

if ($query) {
$glue = strstr($url, '?') === false ? '?' : '&';
return $url . $glue . $query;
}

return $url;
}






protected function getAccessTokenMethod()
{
return self::METHOD_POST;
}






protected function getAccessTokenResourceOwnerId()
{
return static::ACCESS_TOKEN_RESOURCE_OWNER_ID;
}







protected function getAccessTokenQuery(array $params)
{
return $this->buildQueryString($params);
}








protected function verifyGrant($grant)
{
if (is_string($grant)) {
return $this->grantFactory->getGrant($grant);
}

$this->grantFactory->checkGrant($grant);
return $grant;
}







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;
}







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);
}











public function getAccessToken($grant, array $options = [])
{
$grant = $this->verifyGrant($grant);

if (isset($options['scope']) && is_array($options['scope'])) {
$separator = $this->getScopeSeparator();
$options['scope'] = implode($separator, $options['scope']);
}

$params = [
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
'redirect_uri' => $this->redirectUri,
];

if (!empty($this->pkceCode)) {
$params['code_verifier'] = $this->pkceCode;
}

$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;
}









public function getRequest($method, $url, array $options = [])
{
return $this->createRequest($method, $url, null, $options);
}










public function getAuthenticatedRequest($method, $url, $token, array $options = [])
{
return $this->createRequest($method, $url, $token, $options);
}










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);
}











public function getResponse(RequestInterface $request)
{
return $this->getHttpClient()->send($request);
}










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;
}








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;
}







protected function getContentType(ResponseInterface $response)
{
return implode(';', $response->getHeader('content-type'));
}








protected function parseResponse(ResponseInterface $response)
{
$content = (string) $response->getBody();
$type = $this->getContentType($response);

if (strpos($type, 'urlencoded') !== false) {
parse_str($content, $parsed);
return $parsed;
}




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;
}
}









abstract protected function checkResponse(ResponseInterface $response, $data);










protected function prepareAccessTokenResponse(array $result)
{
if ($this->getAccessTokenResourceOwnerId() !== null) {
$result['resource_owner_id'] = $this->getValueByKey(
$result,
$this->getAccessTokenResourceOwnerId()
);
}
return $result;
}











protected function createAccessToken(array $response, AbstractGrant $grant)
{
return new AccessToken($response);
}









abstract protected function createResourceOwner(array $response, AccessToken $token);










public function getResourceOwner(AccessToken $token)
{
$response = $this->fetchResourceOwnerDetails($token);

return $this->createResourceOwner($response, $token);
}










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;
}








protected function getDefaultHeaders()
{
return [];
}













protected function getAuthorizationHeaders($token = null)
{
return [];
}









public function getHeaders($token = null)
{
if ($token) {
return array_merge(
$this->getDefaultHeaders(),
$this->getAuthorizationHeaders($token)
);
}

return $this->getDefaultHeaders();
}
}
<?php













namespace League\OAuth2\Client\Tool;




trait QueryBuilderTrait
{







protected function buildQueryString(array $params)
{
return http_build_query($params, '', '&', \PHP_QUERY_RFC3986);
}
}
<?php













namespace League\OAuth2\Client\Tool;

use BadMethodCallException;




trait RequiredParameterTrait
{








private function checkRequiredParameter($name, array $params)
{
if (!isset($params[$name])) {
throw new BadMethodCallException(sprintf(
'Required parameter not passed: "%s"',
$name
));
}
}









private function checkRequiredParameters(array $names, array $params)
{
foreach ($names as $name) {
$this->checkRequiredParameter($name, $params);
}
}
}
<?php













namespace League\OAuth2\Client\Tool;

use League\OAuth2\Client\Token\AccessToken;
use League\OAuth2\Client\Token\AccessTokenInterface;






trait MacAuthorizationTrait
{






abstract protected function getTokenId(AccessToken $token);









abstract protected function getMacSignature($id, $ts, $nonce);








abstract protected function getRandomState($length = 32);












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)];
}
}
<?php













namespace League\OAuth2\Client\Tool;

use League\OAuth2\Client\Token\AccessTokenInterface;






trait BearerAuthorizationTrait
{






protected function getAuthorizationHeaders($token = null)
{
return ['Authorization' => 'Bearer ' . $token];
}
}
<?php













namespace League\OAuth2\Client\Tool;




trait ArrayAccessorTrait
{








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;
}
}
<?php

namespace League\OAuth2\Client\Tool;

use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Psr7\Uri;
use InvalidArgumentException;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

trait ProviderRedirectTrait
{





protected $redirectLimit = 2;









protected function followRequestRedirects(RequestInterface $request)
{
$response = null;
$attempts = 0;

while ($attempts < $this->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;
}






abstract public function getHttpClient();






public function getRedirectLimit()
{
return $this->redirectLimit;
}








protected function isRedirect(ResponseInterface $response)
{
$statusCode = $response->getStatusCode();

return $statusCode > 300 && $statusCode < 400 && $response->hasHeader('Location');
}










public function getResponse(RequestInterface $request)
{
try {
$response = $this->followRequestRedirects($request);
} catch (BadResponseException $e) {
$response = $e->getResponse();
}

return $response;
}








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;
}
}
<?php













namespace League\OAuth2\Client\Tool;

use GuzzleHttp\Psr7\Request;






class RequestFactory
{











public function getRequest(
$method,
$uri,
array $headers = [],
$body = null,
$version = '1.1'
) {
return new Request($method, $uri, $headers, $body, $version);
}








protected function parseOptions(array $options)
{

$defaults = [
'headers' => [],
'body' => null,
'version' => '1.1',
];

return array_merge($defaults, $options);
}










public function getRequestWithOptions($method, $uri, array $options = [])
{
$options = $this->parseOptions($options);

return $this->getRequest(
$method,
$uri,
$options['headers'],
$options['body'],
$options['version']
);
}
}
<?php













namespace League\OAuth2\Client\Tool;





trait GuardedPropertyTrait
{





protected $guarded = [];








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;
}
}
}






public function getGuarded()
{
return $this->guarded;
}







public function isGuarded($property)
{
return in_array($property, $this->getGuarded());
}
}
<?php













namespace League\OAuth2\Client\Token;

interface SettableRefreshTokenInterface
{






public function setRefreshToken($refreshToken);
}
<?php













namespace League\OAuth2\Client\Token;

use JsonSerializable;
use ReturnTypeWillChange;
use RuntimeException;

interface AccessTokenInterface extends JsonSerializable
{





public function getToken();






public function getRefreshToken();






public function getExpires();







public function hasExpired();






public function getValues();






public function __toString();







#[ReturnTypeWillChange]
public function jsonSerialize();
}
<?php













namespace League\OAuth2\Client\Token;

interface ResourceOwnerAccessTokenInterface extends AccessTokenInterface
{





public function getResourceOwnerId();
}
<?php













namespace League\OAuth2\Client\Token;

use InvalidArgumentException;
use RuntimeException;






class AccessToken implements AccessTokenInterface, ResourceOwnerAccessTokenInterface, SettableRefreshTokenInterface
{



protected $accessToken;




protected $expires;




protected $refreshToken;




protected $resourceOwnerId;




protected $values = [];




private static $timeNow;







public static function setTimeNow($timeNow)
{
self::$timeNow = $timeNow;
}






public static function resetTimeNow()
{
self::$timeNow = null;
}




public function getTimeNow()
{
return self::$timeNow ? self::$timeNow : time();
}








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'];
}




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'])) {


$expires = (int) $options['expires'];

if (!$this->isExpirationTimestamp($expires)) {
$expires += $this->getTimeNow();
}

$this->expires = $expires;
}




$this->values = array_diff_key($options, array_flip([
'access_token',
'resource_owner_id',
'refresh_token',
'expires_in',
'expires',
]));
}







protected function isExpirationTimestamp($value)
{


$oauth2InceptionDate = 1349067600; 
return ($value > $oauth2InceptionDate);
}




public function getToken()
{
return $this->accessToken;
}




public function getRefreshToken()
{
return $this->refreshToken;
}




public function setRefreshToken($refreshToken)
{
$this->refreshToken = $refreshToken;
}




public function getExpires()
{
return $this->expires;
}




public function getResourceOwnerId()
{
return $this->resourceOwnerId;
}




public function hasExpired()
{
$expires = $this->getExpires();

if (empty($expires)) {
throw new RuntimeException('"expires" is not set on the token');
}

return $expires < $this->getTimeNow();
}




public function getValues()
{
return $this->values;
}




public function __toString()
{
return (string) $this->getToken();
}




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;
}
}
<?php













namespace League\OAuth2\Client\OptionProvider;

use InvalidArgumentException;





class HttpBasicAuthOptionProvider extends PostAuthOptionProvider
{



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;
}
}
<?php













namespace League\OAuth2\Client\OptionProvider;

use League\OAuth2\Client\Provider\AbstractProvider;
use League\OAuth2\Client\Tool\QueryBuilderTrait;




class PostAuthOptionProvider implements OptionProviderInterface
{
use QueryBuilderTrait;




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;
}







protected function getAccessTokenBody(array $params)
{
return $this->buildQueryString($params);
}
}
<?php













namespace League\OAuth2\Client\OptionProvider;




interface OptionProviderInterface
{







public function getAccessTokenOptions($method, array $params);
}
<?php













namespace League\OAuth2\Client\Grant;






class ClientCredentials extends AbstractGrant
{



protected function getName()
{
return 'client_credentials';
}




protected function getRequiredRequestParameters()
{
return [];
}
}
<?php













namespace League\OAuth2\Client\Grant;

use League\OAuth2\Client\Grant\Exception\InvalidGrantException;




class GrantFactory
{



protected $registry = [];








public function setGrant($name, AbstractGrant $grant)
{
$this->registry[$name] = $grant;

return $this;
}









public function getGrant($name)
{
if (empty($this->registry[$name])) {
$this->registerDefaultGrant($name);
}

return $this->registry[$name];
}







protected function registerDefaultGrant($name)
{

$class = str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $name)));
$class = 'League\\OAuth2\\Client\\Grant\\' . $class;

$this->checkGrant($class);

return $this->setGrant($name, new $class);
}







public function isGrant($class)
{
return is_subclass_of($class, AbstractGrant::class);
}








public function checkGrant($class)
{
if (!$this->isGrant($class)) {
throw new InvalidGrantException(sprintf(
'Grant "%s" must extend AbstractGrant',
is_object($class) ? get_class($class) : $class
));
}
}
}
<?php













namespace League\OAuth2\Client\Grant;






class RefreshToken extends AbstractGrant
{



protected function getName()
{
return 'refresh_token';
}




protected function getRequiredRequestParameters()
{
return [
'refresh_token',
];
}
}
<?php













namespace League\OAuth2\Client\Grant;






class AuthorizationCode extends AbstractGrant
{



protected function getName()
{
return 'authorization_code';
}




protected function getRequiredRequestParameters()
{
return [
'code',
];
}
}
<?php













namespace League\OAuth2\Client\Grant\Exception;

use InvalidArgumentException;






class InvalidGrantException extends InvalidArgumentException
{
}
<?php













namespace League\OAuth2\Client\Grant;

use League\OAuth2\Client\Tool\RequiredParameterTrait;













abstract class AbstractGrant
{
use RequiredParameterTrait;







abstract protected function getName();






abstract protected function getRequiredRequestParameters();







public function __toString()
{
return $this->getName();
}









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;
}
}
<?php













namespace League\OAuth2\Client\Grant;






class Password extends AbstractGrant
{



protected function getName()
{
return 'password';
}




protected function getRequiredRequestParameters()
{
return [
'username',
'password',
];
}
}
The MIT License (MIT)

Copyright (c) 2013 ignace nyamagana butera

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.
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Deprecated;
use League\Csv\MapIterator;
use LimitIterator;

final class Limit
{
public function __construct(
public readonly int $offset,
public readonly int $length,
) {
0 <= $this->offset || throw new QueryException(self::class.' expects the offset to be greater or equal to 0, '.$this->offset.' given.');
-2 < $this->length || throw new QueryException(self::class.' expects the length to be greater or equal to -1, '.$this->length.' given.');
}








#[Deprecated(message:'use League\Csv\JsonConverter::__construct() instead', since:'league/csv:9.25.0')]
public static function new(int $offset, int $length): self
{
return new self($offset, $length);
}




public function slice(iterable $value): LimitIterator
{
return new LimitIterator(MapIterator::toIterator($value), $this->offset, $this->length);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Iterator;











interface Sort
{







public function __invoke(mixed $valueA, mixed $valueB): int;




public function sort(iterable $value): Iterator;
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Closure;

/**
@phpstan-type
@phpstan-type
*/
interface SortCombinator extends Sort
{









public function append(Sort|Closure ...$sorts): self;










public function prepend(Sort|Closure ...$sorts): self;
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Iterator;










interface Predicate
{






public function __invoke(mixed $value, string|int $key): bool;






public function filter(iterable $value): Iterator;
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Closure;

/**
@phpstan-type
@phpstan-type
*/
interface PredicateCombinator extends Predicate
{










public function and(Predicate|Closure ...$predicates): self;











public function or(Predicate|Closure ...$predicates): self;











public function not(Predicate|Closure ...$predicates): self;











public function xor(Predicate|Closure ...$predicates): self;
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use Exception;
use League\Csv\UnableToProcessCsv;

final class QueryException extends Exception implements UnableToProcessCsv
{
public static function dueToUnknownColumn(string|int $column, array|object $value): self
{
return match (true) {
is_object($value) => match (is_int($column)) {
true => new self('The object property name can not be the integer`'.$column.'`.'),
default => new self('The object property name `'.$column.'` could not be retrieved from the object.'),
},
default => match (is_string($column)) {
true => new self('The column `'.$column.'` does not exist in the input array.'),
default => new self('The column with the offset `'.$column.'` does not exist in the input array.'),
},
};
}

public static function dueToMissingColumn(): self
{
return new self('No valid column were found with the given data.');
}

public static function dueToUnknownOperator(string $operator): self
{
return new self('Unknown or unsupported comparison operator `'.$operator.'`');
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Ordering;

use ArrayIterator;
use Closure;
use Iterator;
use League\Csv\Query\QueryException;
use League\Csv\Query\Row;
use League\Csv\Query\Sort;
use OutOfBoundsException;
use ReflectionException;

use function is_array;
use function is_string;
use function iterator_to_array;
use function strtoupper;
use function trim;




final class Column implements Sort
{
private const ASCENDING = 'ASC';
private const DESCENDING = 'DESC';




private function __construct(
public readonly string $direction,
public readonly string|int $column,
public readonly Closure $callback,
) {
}






public static function sortOn(
string|int $column,
string|int $direction,
Closure|callable|null $callback = null
): self {

$operator = match (true) {
SORT_ASC === $direction => self::ASCENDING,
SORT_DESC === $direction => self::DESCENDING,
is_string($direction) => match (strtoupper(trim($direction))) {
'ASC', 'ASCENDING', 'UP' => self::ASCENDING,
'DESC', 'DESCENDING', 'DOWN' => self::DESCENDING,
default => throw new QueryException('Unknown or unsupported ordering operator value: '.$direction),
},
default => throw new QueryException('Unknown or unsupported ordering operator value: '.$direction),
};

$callback = match (true) {
null === $callback => static fn (mixed $first, mixed $second): int => $first <=> $second,
$callback instanceof Closure => $callback,
default => $callback(...),
};

return new self($operator, $column, $callback);
}





public function __invoke(mixed $valueA, mixed $valueB): int
{
$first = Row::from($valueA)->value($this->column);
$second = Row::from($valueB)->value($this->column);

return match ($this->direction) {
self::ASCENDING => ($this->callback)($first, $second),
default => ($this->callback)($second, $first),
};
}

public function sort(iterable $value): Iterator
{
$class = new class () extends ArrayIterator {
public function seek(int $offset): void
{
try {
parent::seek($offset);
} catch (OutOfBoundsException) {
return;
}
}
};

$it = new $class(!is_array($value) ? iterator_to_array($value) : $value);
$it->uasort($this);

return $it;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Ordering;

use ArrayIterator;
use Closure;
use Iterator;
use League\Csv\MapIterator;
use League\Csv\Query\Sort;
use League\Csv\Query\SortCombinator;
use OutOfBoundsException;

use function array_map;

/**
@phpstan-import-type
@phpstan-import-type




*/
final class MultiSort implements SortCombinator
{

private readonly array $sorts;




private function __construct(Sort|Closure|callable ...$sorts)
{
$this->sorts = array_map(
static fn (Sort|Closure|callable $sort): Sort|Closure => $sort instanceof Closure || $sort instanceof Sort ? $sort : $sort(...),
$sorts
);
}




public static function all(Sort|Closure|callable ...$sorts): self
{
return new self(...$sorts);
}




public function append(Sort|Closure|callable ...$sorts): self
{
if ([] === $sorts) {
return $this;
}

return new self(...$this->sorts, ...$sorts);
}




public function prepend(Sort|Closure|callable ...$sorts): self
{
if ([] === $sorts) {
return $this;
}

return (new self(...$sorts))->append(...$this->sorts);
}

public function __invoke(mixed $valueA, mixed $valueB): int
{
foreach ($this->sorts as $sort) {
if (0 !== ($result = $sort($valueA, $valueB))) {
return $result;
}
}

return $result ?? 0;
}

public function sort(iterable $value): Iterator
{
if ([] === $this->sorts) {
return MapIterator::toIterator($value);
}

$class = new class () extends ArrayIterator {
public function seek(int $offset): void
{
try {
parent::seek($offset);
} catch (OutOfBoundsException) {
return;
}
}
};

$it = new $class(!is_array($value) ? iterator_to_array($value) : $value);
$it->uasort($this);

return $it;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query;

use ArrayAccess;
use ReflectionException;
use ReflectionObject;
use TypeError;

use function array_is_list;
use function array_key_exists;
use function array_map;
use function array_values;
use function count;
use function explode;
use function implode;
use function is_array;
use function is_int;
use function is_object;
use function lcfirst;
use function str_replace;

final class Row
{
public static function from(mixed $value): Row
{
return new self(match (true) {
is_object($value),
is_array($value) => $value,
default => throw new TypeError('The value must be an array or an object; received '.gettype($value).'.'),
});
}

private function __construct(private readonly array|object $row)
{
}









public function value(string|int $key): mixed
{
return $this->select($key)[$key];
}













public function select(string|int ...$key): array
{
return match (true) {
is_object($this->row) => self::getObjectPropertyValue($this->row, ...$key),
default => self::getArrayEntry($this->row, ...$key),
};
}






private function getArrayEntry(array $row, string|int ...$keys): array
{
$res = [];
$arrValues = array_values($row);
foreach ($keys as $key) {
if (array_key_exists($key, $res)) {
continue;
}
$offset = $key;
if (is_int($offset)) {
if (!array_is_list($row)) {
$row = $arrValues;
}

if ($offset < 0) {
$offset += count($row);
}
}

$res[$key] = array_key_exists($offset, $row) ? $row[$offset] : throw QueryException::dueToUnknownColumn($key, $row);
}

return [] !== $res ? $res : throw QueryException::dueToMissingColumn();
}







private static function getObjectPropertyValue(object $row, string|int ...$keys): array
{
$res = [];
$object = new ReflectionObject($row);
foreach ($keys as $key) {
if (array_key_exists($key, $res)) {
continue;
}

!is_int($key) || throw QueryException::dueToUnknownColumn($key, $row);

if ($object->hasProperty($key) && $object->getProperty($key)->isPublic()) {
$res[$key] = $object->getProperty($key)->getValue($row);
continue;
}

$methodNameList = [$key];
if (($camelCasedKey = self::camelCase($key)) !== $key) {
$methodNameList[] = $camelCasedKey;
}
$methodNameList[] = self::camelCase($key, 'get');
foreach ($methodNameList as $methodName) {
if ($object->hasMethod($methodName)
&& $object->getMethod($methodName)->isPublic()
&& 1 > $object->getMethod($methodName)->getNumberOfRequiredParameters()
) {
$res[$key] = $object->getMethod($methodName)->invoke($row);
continue 2;
}
}

if (method_exists($row, '__call')) {
$res[$key] = $object->getMethod('__call')->invoke($row, $methodNameList[1]);
continue;
}

if ($row instanceof ArrayAccess && $row->offsetExists($key)) {
$res[$key] = $row->offsetGet($key);
continue;
}

throw QueryException::dueToUnknownColumn($key, $row);
}

return [] !== $res ? $res : throw QueryException::dueToMissingColumn();
}

private static function camelCase(string $value, string $prefix = ''): string
{
if ('' !== $prefix) {
$prefix .= '_';
}

return lcfirst(implode('', array_map(
ucfirst(...),
explode(' ', str_replace(['-', '_'], ' ', $prefix.$value))
)));
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Constraint;

use CallbackFilterIterator;
use Closure;
use Iterator;
use League\Csv\MapIterator;
use League\Csv\Query\Predicate;
use League\Csv\Query\PredicateCombinator;

use function array_reduce;

/**
@phpstan-import-type
@phpstan-import-type
*/
final class Criteria implements PredicateCombinator
{



private function __construct(private readonly Predicate|Closure $predicate)
{
}






public static function all(Predicate|Closure|callable ...$predicates): self
{
return new self(function (mixed $value, int|string $key) use ($predicates): bool {
foreach ($predicates as $predicate) {
if (!$predicate($value, $key)) {
return false;
}
}

return true;
});
}






public static function none(Predicate|Closure|callable ...$predicates): self
{
return new self(function (mixed $value, int|string $key) use ($predicates): bool {
foreach ($predicates as $predicate) {
if ($predicate($value, $key)) {
return false;
}
}

return true;
});
}






public static function any(Predicate|Closure|callable ...$predicates): self
{
return new self(function (mixed $value, int|string $key) use ($predicates): bool {
foreach ($predicates as $predicate) {
if ($predicate($value, $key)) {
return true;
}
}

return false;
});
}






public static function xany(Predicate|Closure|callable ...$predicates): self
{
return new self(fn (mixed $value, int|string $key): bool => array_reduce(
$predicates,
fn (bool $bool, Predicate|Closure|callable $predicate) => $predicate($value, $key) xor $bool,
false
));
}

public function __invoke(mixed $value, int|string $key): bool
{
return ($this->predicate)($value, $key);
}

public function filter(iterable $value): Iterator
{
return new CallbackFilterIterator(MapIterator::toIterator($value), $this);
}




public function and(Predicate|Closure|callable ...$predicates): self
{
return self::all($this->predicate, ...$predicates);
}

public function andNot(Predicate|Closure|callable ...$predicates): self
{
return self::all($this->predicate, self::none(...$predicates));
}




public function not(Predicate|Closure|callable ...$predicates): self
{
return self::none($this->predicate, ...$predicates);
}




public function or(Predicate|Closure|callable ...$predicates): self
{
return self::any($this->predicate, ...$predicates);
}




public function orNot(Predicate|Closure|callable ...$predicates): self
{
return self::any($this->predicate, self::none(...$predicates));
}




public function xor(Predicate|Closure|callable ...$predicates): self
{
return self::xany($this->predicate, ...$predicates);
}




public function xorNot(Predicate|Closure|callable ...$predicates): self
{
return self::xany($this->predicate, self::none(...$predicates));
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Constraint;

use CallbackFilterIterator;
use Closure;
use Iterator;
use League\Csv\MapIterator;
use League\Csv\Query;
use ReflectionException;







final class Column implements Query\Predicate
{



private function __construct(
public readonly string|int $column,
public readonly Comparison|Closure $operator,
public readonly mixed $value,
) {
if (!$this->operator instanceof Closure) {
$this->operator->accept($this->value);
}
}




public static function filterOn(
string|int $column,
Comparison|Closure|callable|string $operator,
mixed $value = null,
): self {
if ($operator instanceof Closure) {
return new self($column, $operator, null);
}

if (is_callable($operator)) {
return new self($column, $operator(...), $value);
}

return new self(
$column,
is_string($operator) ? Comparison::fromOperator($operator) : $operator,
$value
);
}





public function __invoke(mixed $value, int|string $key): bool
{
$subject = Query\Row::from($value)->value($this->column);
if ($this->operator instanceof Closure) {
return ($this->operator)($subject);
}

return $this->operator->compare($subject, $this->value);
}

public function filter(iterable $value): Iterator
{
return new CallbackFilterIterator(MapIterator::toIterator($value), $this);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Constraint;

use CallbackFilterIterator;
use Closure;
use Iterator;
use League\Csv\MapIterator;
use League\Csv\Query;







final class Offset implements Query\Predicate
{



private function __construct(
public readonly Comparison|Closure $operator,
public readonly mixed $value,
) {
if (!$this->operator instanceof Closure) {
$this->operator->accept($this->value);
}
}




public static function filterOn(
Comparison|Closure|callable|string $operator,
mixed $value = null,
): self {
if ($operator instanceof Closure) {
return new self($operator, null);
}

if (is_callable($operator)) {
return new self(Closure::fromCallable($operator), $value);
}

return new self(
is_string($operator) ? Comparison::fromOperator($operator) : $operator,
$value
);
}




public function __invoke(mixed $value, int|string $key): bool
{
if ($this->operator instanceof Closure) {
return ($this->operator)($key);
}

return $this->operator->compare($key, $this->value);
}

public function filter(iterable $value): Iterator
{
return new CallbackFilterIterator(MapIterator::toIterator($value), $this);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Constraint;

use League\Csv\Query\QueryException;

use function array_is_list;
use function count;
use function in_array;
use function is_array;
use function is_scalar;
use function is_string;
use function str_contains;
use function str_ends_with;
use function str_starts_with;
use function strtoupper;
use function trim;

enum Comparison: string
{
case Equals = '=';
case NotEquals = '!=';
case GreaterThan = '>';
case GreaterThanOrEqual = '>=';
case LesserThan = '<';
case LesserThanOrEqual = '<=';
case Between = 'BETWEEN';
case NotBetween = 'NBETWEEN';
case Regexp = 'REGEXP';
case NotRegexp = 'NREGEXP';
case In = 'IN';
case NotIn = 'NIN';
case Contains = 'CONTAINS';
case NotContain = 'NCONTAIN';
case StartsWith = 'STARTS_WITH';
case EndsWith = 'ENDS_WITH';

public static function tryFromOperator(string $operator): ?self
{
$operator = strtoupper(trim($operator));

return match ($operator) {
'<>', 'NEQ', 'IS NOT', 'NOT EQUAL' => self::NotEquals,
'EQ', 'IS', 'EQUAL', 'EQUALS' => self::Equals,
'GT', 'GREATER THAN' => self::GreaterThan,
'GTE', 'GREATER THAN OR EQUAL' => self::GreaterThanOrEqual,
'LT', 'LESSER THAN' => self::LesserThan,
'LTE', 'LESSER THAN OR EQUAL' => self::LesserThanOrEqual,
'NOT_REGEXP', 'NOT REGEXP' => self::NotRegexp,
'NOT_CONTAIN', 'NOT CONTAIN', 'DOES_NOT_CONTAIN', 'DOES NOT CONTAIN' => self::NotContain,
'NOT_IN', 'NOT IN' => self::NotIn,
'NOT_BETWEEN', 'NOT BETWEEN' => self::Between,
'STARTS WITH', 'START WITH' => self::StartsWith,
'ENDS WITH', 'END WITH' => self::EndsWith,
default => self::tryFrom($operator),
};
}




public static function fromOperator(string $operator): self
{
return self::tryFromOperator($operator) ?? throw QueryException::dueToUnknownOperator($operator);
}








public function compare(mixed $subject, mixed $reference): bool
{
$this->accept($reference);

return match ($this) {
self::Equals => self::isSingleValue($subject) ? $subject === $reference : $subject == $reference,
self::NotEquals => self::isSingleValue($subject) ? $subject !== $reference : $subject != $reference,
self::GreaterThan => $subject > $reference,
self::GreaterThanOrEqual => $subject >= $reference,
self::LesserThan => $subject < $reference,
self::LesserThanOrEqual => $subject <= $reference,
self::Between => $subject >= $reference[0] && $subject <= $reference[1], 
self::NotBetween => $subject < $reference[0] || $subject > $reference[1], 
self::In => in_array($subject, $reference, self::isSingleValue($subject)), 
self::NotIn => !in_array($subject, $reference, self::isSingleValue($subject)), 
self::Regexp => is_string($subject) && 1 === preg_match($reference, $subject), 
self::NotRegexp => is_string($subject) && 1 !== preg_match($reference, $subject), 
self::Contains => is_string($subject) && str_contains($subject, $reference), 
self::NotContain => is_string($subject) && !str_contains($subject, $reference), 
self::StartsWith => is_string($subject) && str_starts_with($subject, $reference), 
self::EndsWith => is_string($subject) && str_ends_with($subject, $reference), 
};
}

private static function isSingleValue(mixed $value): bool
{
return is_scalar($value) || null === $value;
}






public function accept(mixed $reference): void
{
match ($this) {
self::Between,
self::NotBetween => match (true) {
!is_array($reference),
!array_is_list($reference),
2 !== count($reference) => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be an list containing 2 values, the minimum and maximum values.'),
default => true,
},
self::In,
self::NotIn => match (true) {
!is_array($reference) => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be an array.'),
default => true,
},
self::Regexp,
self::NotRegexp => match (true) {
!is_string($reference),
'' === $reference,
false === @preg_match($reference, '') => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be a valid regular expression pattern string.'),
default => true,
},
self::Contains,
self::NotContain,
self::StartsWith,
self::EndsWith => match (true) {
!is_string($reference),
'' === $reference => throw new QueryException('The value used for comparison with the `'.$this->name.'` operator must be a non empty string.'),
default => true,
},
self::Equals,
self::NotEquals,
self::GreaterThanOrEqual,
self::GreaterThan,
self::LesserThanOrEqual,
self::LesserThan => true,
};
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Query\Constraint;

use CallbackFilterIterator;
use Closure;
use Iterator;
use League\Csv\MapIterator;
use League\Csv\Query\Predicate;
use League\Csv\Query\QueryException;
use League\Csv\Query\Row;
use ReflectionException;

use function array_filter;
use function is_array;
use function is_int;
use function is_string;

use const ARRAY_FILTER_USE_BOTH;







final class TwoColumns implements Predicate
{



private function __construct(
public readonly string|int $first,
public readonly Comparison|Closure $operator,
public readonly array|string|int $second,
) {
!$this->operator instanceof Closure || !is_array($this->second) || throw new QueryException('The second column must be a string if the operator is a callback.');

if (is_array($this->second)) {
$res = array_filter($this->second, fn (mixed $value): bool => !is_string($value) && !is_int($value));
if ([] !== $res) {
throw new QueryException('The second column must be a string, an integer or a list of strings and/or integer when the operator is not a callback.');
}
}
}




public static function filterOn(
string|int $firstColumn,
Comparison|Closure|callable|string $operator,
array|string|int $secondColumn
): self {
if (is_string($operator)) {
$operator = Comparison::fromOperator($operator);
}

if (is_callable($operator)) {
return new self($firstColumn, Closure::fromCallable($operator), $secondColumn);
}

return new self($firstColumn, $operator, $secondColumn);
}





public function __invoke(mixed $value, int|string $key): bool
{
$val = match (true) {
is_array($this->second) => array_values(Row::from($value)->select(...$this->second)),
default => Row::from($value)->value($this->second),
};

if ($this->operator instanceof Closure) {
return ($this->operator)(Row::from($value)->value($this->first), $val);
}

return Column::filterOn($this->first, $this->operator, $val)($value, $key);
}

public function filter(iterable $value): Iterator
{
return new CallbackFilterIterator(MapIterator::toIterator($value), $this);
}
}
<?php










if (!function_exists('League\Csv\delimiter_detect')) {
require __DIR__.'/functions.php';
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use Deprecated;
use Generator;
use InvalidArgumentException;
use RuntimeException;
use SplFileInfo;
use SplFileObject;
use Stringable;
use Throwable;
use TypeError;

use function filter_var;
use function get_class;
use function gettype;
use function is_resource;
use function rawurlencode;
use function sprintf;
use function str_replace;
use function str_split;
use function strcspn;
use function strlen;

use const FILTER_FLAG_STRIP_HIGH;
use const FILTER_FLAG_STRIP_LOW;
use const FILTER_UNSAFE_RAW;
use const STREAM_FILTER_READ;
use const STREAM_FILTER_WRITE;




abstract class AbstractCsv implements ByteSequence
{
protected const STREAM_FILTER_MODE = STREAM_FILTER_READ;


protected array $stream_filters = [];
protected ?Bom $input_bom = null;
protected ?Bom $output_bom = null;
protected string $delimiter = ',';
protected string $enclosure = '"';
protected string $escape = '\\';
protected bool $is_input_bom_included = false;

protected array $formatters = [];




protected function __construct(protected readonly SplFileObject|Stream $document)
{
[$this->delimiter, $this->enclosure, $this->escape] = $this->document->getCsvControl();
$this->resetProperties();
}




protected function resetProperties(): void
{
}




public function __clone()
{
throw UnavailableStream::dueToForbiddenCloning(static::class);
}




public static function fromString(Stringable|string $content = ''): static
{
return new static(Stream::fromString($content));
}










public static function from($filename, string $mode = 'r+', $context = null): static
{
return match (true) {
$filename instanceof SplFileObject => new static($filename),
$filename instanceof SplFileInfo => new static($filename->openFile(mode: $mode, context: $context)),
default => new static(Stream::from($filename, $mode, $context)),
};
}




public function getDelimiter(): string
{
return $this->delimiter;
}




public function getEnclosure(): string
{
return $this->enclosure;
}




public function getPathname(): string
{
return $this->document->getPathname();
}




public function getEscape(): string
{
return $this->escape;
}




public function getOutputBOM(): string
{
return $this->output_bom?->value ?? '';
}




public function getInputBOM(): string
{
if (null === $this->input_bom) {
$this->document->setFlags(SplFileObject::READ_CSV);
$this->input_bom = Bom::tryFromSequence($this->document);
}

return $this->input_bom?->value ?? '';
}




public function supportsStreamFilterOnRead(): bool
{
if (!$this->document instanceof Stream) {
return false;
}

$mode = $this->document->getMode();

return strcspn($mode, 'r+') !== strlen($mode);
}




public function supportsStreamFilterOnWrite(): bool
{
if (!$this->document instanceof Stream) {
return false;
}

$mode = $this->document->getMode();

return strcspn($mode, 'wae+') !== strlen($mode);
}




public function hasStreamFilter(string $filtername): bool
{
return $this->stream_filters[$filtername] ?? false;
}




public function isInputBOMIncluded(): bool
{
return $this->is_input_bom_included;
}






public function chunk(int $length): Generator
{
0 < $length || throw InvalidArgument::dueToInvalidChunkSize($length, __METHOD__);

$this->getInputBOM();
$this->document->rewind();
$this->document->setFlags(0);
$this->is_input_bom_included || -1 < $this->document->fseek($this->input_bom?->length() ?? 0) || throw new RuntimeException('Unable to seek the document.');

yield from str_split($this->output_bom?->value.$this->document->fread($length), $length);

while (!$this->document->eof()) {
$chunk = $this->document->fread($length);
false !== $chunk || throw new RuntimeException('Unable to read the document.');

yield $chunk;
}
}






public function toString(): string
{
$raw = '';
foreach ($this->chunk(8192) as $chunk) {
$raw .= $chunk;
}

return $raw;
}








public function download(?string $filename = null): int
{
if (null !== $filename) {
HttpHeaders::forFileDownload($filename, 'text/csv');
}

$bytes = 0;
$output = new SplFileObject('php://output', 'wb');
if (null !== $this->output_bom) {
$bytes += $output->fwrite($this->output_bom->value);
}

$this->getInputBOM();
$this->document->rewind();
$this->document->setFlags(0);
$this->is_input_bom_included || -1 < $this->document->fseek($this->input_bom?->length() ?? 0) || throw new RuntimeException('Unable to seek the document.');

while (!$this->document->eof()) {
$chunk = $this->document->fread(8192);
false !== $chunk || throw new RuntimeException('Unable to read the document.');
$bytes += $output->fwrite($chunk);
$output->fflush();
}

return $bytes;
}






public function setDelimiter(string $delimiter): static
{
if ($delimiter === $this->delimiter) {
return $this;
}

1 === strlen($delimiter) || throw InvalidArgument::dueToInvalidDelimiterCharacter($delimiter, __METHOD__);

$this->delimiter = $delimiter;
$this->resetProperties();

return $this;
}






public function setEnclosure(string $enclosure): static
{
if ($enclosure === $this->enclosure) {
return $this;
}

1 === strlen($enclosure) || throw InvalidArgument::dueToInvalidEnclosureCharacter($enclosure, __METHOD__);

$this->enclosure = $enclosure;
$this->resetProperties();

return $this;
}






public function setEscape(string $escape): static
{
if ($escape === $this->escape) {
return $this;
}

if ('' !== $escape && 1 !== strlen($escape)) {
throw InvalidArgument::dueToInvalidEscapeCharacter($escape, __METHOD__);
}

$this->escape = $escape;
$this->resetProperties();

return $this;
}






public function addFormatter(callable $formatter): static
{
$this->formatters[] = !$formatter instanceof Closure ? $formatter(...) : $formatter;

return $this;
}




public function skipInputBOM(): static
{
$this->is_input_bom_included = false;

return $this;
}




public function includeInputBOM(): static
{
$this->is_input_bom_included = true;

return $this;
}






public function setOutputBOM(Bom|string|null $str): static
{
try {
$this->output_bom = match (true) {
$str instanceof Bom => $str,
null === $str,
'' === $str => null,
default => Bom::fromSequence($str),
};

return $this;
} catch (Throwable $exception) {
throw InvalidArgument::dueToInvalidBOMCharacter(__METHOD__, $exception);
}
}







public function appendStreamFilterOnRead(string $filtername, mixed $params = null): static
{
$this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document));

$this->document->appendFilter($filtername, STREAM_FILTER_READ, $params);
$this->stream_filters[$filtername] = true;
$this->resetProperties();
$this->input_bom = null;

return $this;
}







public function appendStreamFilterOnWrite(string $filtername, mixed $params = null): static
{
$this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document));

$this->document->appendFilter($filtername, STREAM_FILTER_WRITE, $params);
$this->stream_filters[$filtername] = true;
$this->resetProperties();
$this->input_bom = null;

return $this;
}







public function prependStreamFilterOnWrite(string $filtername, mixed $params = null): static
{
$this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document));

$this->document->prependFilter($filtername, STREAM_FILTER_READ, $params);
$this->stream_filters[$filtername] = true;
$this->resetProperties();
$this->input_bom = null;

return $this;
}







public function prependStreamFilterOnRead(string $filtername, mixed $params = null): static
{
$this->document instanceof Stream || throw UnavailableFeature::dueToUnsupportedStreamFilterApi(get_class($this->document));

$this->document->prependFilter($filtername, STREAM_FILTER_READ, $params);
$this->stream_filters[$filtername] = true;
$this->resetProperties();
$this->input_bom = null;

return $this;
}











#[Deprecated(message:'use League\Csv\AbstractCsv::supportsStreamFilterOnRead() or League\Csv\AbstractCsv::supportsStreamFilterOnWrite() instead', since:'league/csv:9.7.0')]
public function getStreamFilterMode(): int
{
return static::STREAM_FILTER_MODE;
}











#[Deprecated(message:'use League\Csv\AbstractCsv::supportsStreamFilterOnRead() or League\Csv\AbstractCsv::supportsStreamFilterOnWrite() instead', since:'league/csv:9.7.0')]
public function supportsStreamFilter(): bool
{
return $this->document instanceof Stream;
}










#[Deprecated(message:'use League\Csv\AbstractCsv::toString() instead', since:'league/csv:9.7.0')]
public function getContent(): string
{
return $this->toString();
}










#[Deprecated(message:'use League\Csv\AbstractCsv::toString() instead', since:'league/csv:9.1.0')]
public function __toString(): string
{
return $this->toString();
}
















#[Deprecated(message:'the method no longer affect the outcome of the class, use League\Csv\HttpHeaders::forFileDownload instead', since:'league/csv:9.17.0')]
protected function sendHeaders(string $filename): void
{
if (strlen($filename) !== strcspn($filename, '\\/')) {
throw InvalidArgument::dueToInvalidHeaderFilename($filename);
}

$flag = FILTER_FLAG_STRIP_LOW;
if (1 === preg_match('/[^\x20-\x7E]/', $filename)) {
$flag |= FILTER_FLAG_STRIP_HIGH;
}


$filtered_name = filter_var($filename, FILTER_UNSAFE_RAW, $flag);
$filename_fallback = str_replace('%', '', $filtered_name);

$disposition = sprintf('attachment; filename="%s"', str_replace('"', '\\"', $filename_fallback));
if ($filename !== $filename_fallback) {
$disposition .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
}

header('Content-Type: text/csv');
header('Content-Transfer-Encoding: binary');
header('Content-Description: File Transfer');
header('Content-Disposition: '.$disposition);
}














#[Deprecated(message:'use League\Csv\AbstractCsv::download() instead', since:'league/csv:9.18.0')]
public function output(?string $filename = null): int
{
try {
return $this->download($filename);
} catch (InvalidArgumentException $exception) {
throw new InvalidArgument($exception->getMessage());
}
}













#[Deprecated(message:'use League\Csv\AbstractCsv::appendStreamFilterOnRead() or League\Csv\AbstractCsv::prependStreamFilterOnRead() instead', since:'league/csv:9.18.0')]
public function addStreamFilter(string $filtername, ?array $params = null): static
{
if (STREAM_FILTER_READ === static::STREAM_FILTER_MODE) {
return $this->appendStreamFilterOnRead($filtername, $params);
}

return $this->appendStreamFilterOnWrite($filtername, $params);
}








#[Deprecated(message:'use League\Csv\AbstractCsv::from() instead', since:'league/csv:9.27.0')]
public static function createFromFileObject(SplFileObject $file): static
{
return new static($file);
}










#[Deprecated(message:'use League\Csv\AbstractCsv::from() instead', since:'league/csv:9.27.0')]
public static function createFromStream($stream): static
{
is_resource($stream) || throw new TypeError('Argument passed must be a stream resource or a string, '.gettype($stream).' given.');

return new static(Stream::from($stream));
}








#[Deprecated(message:'use League\Csv\AbstractCsv::fromString() instead', since:'league/csv:9.27.0')]
public static function createFromString(Stringable|string $content = ''): static
{
return self::fromString($content);
}













#[Deprecated(message:'use League\Csv\AbstractCsv::from() instead', since:'league/csv:9.27.0')]
public static function createFromPath(string $path, string $open_mode = 'r+', $context = null): static
{
return new static(Stream::from($path, $open_mode, $context));
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use ArrayIterator;
use Iterator;
use IteratorAggregate;
use IteratorIterator;
use Traversable;






final class MapIterator extends IteratorIterator
{

private $callable;

public function __construct(Traversable $iterator, callable $callable)
{
parent::__construct($iterator);
$this->callable = $callable;
}

public static function fromIterable(iterable $iterator, callable $callable): self
{
return match (true) {
$iterator instanceof Traversable => new self($iterator, $callable),
is_array($iterator) => new self(new ArrayIterator($iterator), $callable),
};
}

public function current(): mixed
{
return ($this->callable)(parent::current(), parent::key());
}

public static function toIterator(iterable $value): Iterator
{
if ($value instanceof IteratorAggregate) {
$value = $value->getIterator();
}

return match (true) {
$value instanceof Iterator => $value,
$value instanceof Traversable => (function () use ($value): Iterator {
foreach ($value as $offset => $record) {
yield $offset => $record;
}
})(),
default => new ArrayIterator($value),
};
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use InvalidArgumentException;

use function filter_var;
use function header;
use function rawurlencode;
use function str_contains;
use function str_replace;

use const FILTER_FLAG_STRIP_HIGH;
use const FILTER_FLAG_STRIP_LOW;










final class HttpHeaders
{



public static function forFileDownload(string $filename, string $contentType): void
{
if (str_contains($filename, '/') || str_contains($filename, '\\')) {
throw new InvalidArgumentException('The filename `'.$filename.'` cannot contain the "/" or "\" characters.');
}


$filteredName = filter_var($filename, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$fallbackName = str_replace('%', '', $filteredName);
$disposition = 'attachment;filename="'.str_replace('"', '\\"', $fallbackName).'"';
if ($filename !== $fallbackName) {
$disposition .= ";filename*=UTF-8''".preg_replace_callback(
'/[%"\x00-\x1F\x7F-\xFF]/',
static fn (array $matches): string => strtolower(rawurlencode($matches[0])),
$filename
);
}

header('content-type: '.$contentType);
header('content-transfer-encoding: binary');
header('content-description: File Transfer');
header('content-disposition: '.$disposition);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;

use function array_fill_keys;
use function array_filter;
use function array_reduce;
use function array_unique;
use function count;
use function strlen;

use const COUNT_RECURSIVE;

final class Info implements ByteSequence
{









#[Deprecated(message:'use League\Csv\Bom::tryFromSequence() instead', since:'league/csv:9.16.0')]
public static function fetchBOMSequence(string $str): ?string
{
return Bom::tryFromSequence($str)?->value;
}













public static function getDelimiterStats(Reader $csv, array $delimiters, int $limit = 1): array
{
$currentHeaderOffset = $csv->getHeaderOffset();
$currentDelimiter = $csv->getDelimiter();

$stats = array_reduce(
array_unique(array_filter($delimiters, fn (string $value): bool => 1 === strlen($value))),
fn (array $stats, string $delimiter): array => [
...$stats,
...[$delimiter => count([
...$csv
->setHeaderOffset(null)
->setDelimiter($delimiter)
->slice(0, $limit)
->filter(fn (array $record, int|string $key): bool => 1 < count($record)),
], COUNT_RECURSIVE)],
],
array_fill_keys($delimiters, 0)
);

$csv->setHeaderOffset($currentHeaderOffset);
$csv->setDelimiter($currentDelimiter);

return $stats;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;












#[Deprecated(message:'use League\Csv\Bom::tryFromSequence()', since:'league/csv:9.7.0')]
function bom_match(string $str): string
{
return Bom::tryFromSequence($str)?->value ?? '';
}



















#[Deprecated(message:'use League\Csv\Info::getDelimiterStats() instead', since:'league/csv:9.8.0')]
function delimiter_detect(Reader $csv, array $delimiters, int $limit = 1): array
{
return Info::getDelimiterStats($csv, $delimiters, $limit);
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Generator;
use mysqli_result;
use PDO;
use PDOStatement;
use PgSql\Result;
use RuntimeException;
use SQLite3Result;

use function array_column;
use function array_map;
use function pg_fetch_assoc;
use function pg_field_name;
use function pg_num_fields;
use function range;

use const SQLITE3_ASSOC;

final class RdbmsResult
{





public static function columnNames(PDOStatement|Result|mysqli_result|SQLite3Result $result): array
{
return match (true) {
$result instanceof PDOStatement => array_map(fn (int $index): string => $result->getColumnMeta($index)['name'] ?? throw new RuntimeException('Unable to get metadata for column '.$index), range(0, $result->columnCount() - 1)),
$result instanceof mysqli_result => array_column($result->fetch_fields(), 'name'),
$result instanceof Result => array_map(fn (int $index) => pg_field_name($result, $index), range(0, pg_num_fields($result) - 1)),
$result instanceof SQLite3Result => array_map($result->columnName(...), range(0, $result->numColumns() - 1)),
};
}




public static function rows(PDOStatement|Result|mysqli_result|SQLite3Result $result): Generator
{
if ($result instanceof PDOStatement) {
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
yield $row; 
}

return;
}

if ($result instanceof Result) {
while ($row = pg_fetch_assoc($result)) {
yield $row;
}

return;
}

if ($result instanceof mysqli_result) {
while ($row = $result->fetch_assoc()) {
yield $row;
}

return;
}

while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
yield $row;
}
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionException;
use ReflectionMethod;
use ReflectionProperty;

use function array_key_exists;
use function is_string;




final class PropertySetter
{
public function __construct(
public readonly ReflectionMethod|ReflectionProperty $accessor,
public readonly int $offset,
public readonly TypeCasting $cast,
public readonly bool $convertEmptyStringToNull,
public readonly bool $trimFieldValueBeforeCasting,
) {
}





public function __invoke(object $object, array $recordValues): void
{
$typeCastedValue = $this->cast->toVariable($this->getRecordValue($recordValues));

match (true) {
$this->accessor instanceof ReflectionMethod => $this->accessor->invoke($object, $typeCastedValue),
$this->accessor instanceof ReflectionProperty => $this->accessor->setValue($object, $typeCastedValue),
};
}




private function getRecordValue(array $record): mixed
{
if (!array_key_exists($this->offset, $record)) {
throw TypeCastingFailed::dueToUndefinedValue($this->offset, TypeCastingInfo::fromAccessor($this->accessor));
}

$value = $record[$this->offset];
if (is_string($value) && $this->trimFieldValueBeforeCasting) {
$value = trim($value);
}

if ('' === $value && $this->convertEmptyStringToNull) {
return null;
}

return $value;
}
}
<?php










namespace League\Csv\Serializer;

use function in_array;

enum ArrayShape: string
{
case List = 'list';
case Csv = 'csv';
case Json = 'json';

public function equals(mixed $value): bool
{
return $value instanceof self
&& $value === $this;
}

public function isOneOf(self ...$types): bool
{
return in_array($this, $types, true);
}
}
<?php










namespace League\Csv\Serializer;

use ReflectionParameter;
use ReflectionProperty;

enum TypeCastingTargetType
{
case PropertyName;
case MethodFirstArgument;

public static function fromAccessor(ReflectionParameter|ReflectionProperty $accessor): self
{
if ($accessor instanceof ReflectionProperty) {
return self::PropertyName;
}

return self::MethodFirstArgument;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Closure;
use Deprecated;
use Iterator;
use League\Csv\MapIterator;
use ReflectionAttribute;
use ReflectionClass;
use ReflectionException;
use ReflectionMethod;
use ReflectionParameter;
use ReflectionProperty;
use Throwable;

use function array_search;
use function array_values;
use function count;
use function is_int;

final class Denormalizer
{
private static bool $convertEmptyStringToNull = true;

private readonly ReflectionClass $class;

private readonly array $properties;

private readonly array $propertySetters;

private readonly array $afterMappingCalls;
private readonly ?MapRecord $mapRecord;







public function __construct(string $className, array $propertyNames = [])
{
$this->class = $this->setClass($className);
$this->properties = $this->class->getProperties();
$this->mapRecord = MapRecord::tryFrom($this->class);
$this->propertySetters = $this->setPropertySetters($propertyNames);
$this->afterMappingCalls = $this->setAfterMappingCalls();
}









#[Deprecated(message:'use League\Csv\Serializer\MapRecord::$convertEmptyStringToNull or League\Csv\Serializer\MapCell::$convertEmptyStringToNullinstead', since:'league/csv:9.17.0')]
public static function allowEmptyStringAsNull(): void
{
self::$convertEmptyStringToNull = true;
}









#[Deprecated(message:'use League\Csv\Serializer\MapRecord::$convertEmptyStringToNull or League\Csv\Serializer\MapCell::$convertEmptyStringToNullinstead', since:'league/csv:9.17.0')]
public static function disallowEmptyStringAsNull(): void
{
self::$convertEmptyStringToNull = false;
}






public static function registerType(string $type, Closure $callback): void
{
CallbackCasting::register($type, $callback);
}






public static function unregisterType(string $type): bool
{
return CallbackCasting::unregisterType($type);
}

public static function unregisterAllTypes(): void
{
CallbackCasting::unregisterTypes();
}






public static function registerAlias(string $alias, string $type, Closure $callback): void
{
CallbackCasting::register($type, $callback, $alias);
}

public static function unregisterAlias(string $alias): bool
{
return CallbackCasting::unregisterAlias($alias);
}

public static function unregisterAllAliases(): void
{
CallbackCasting::unregisterAliases();
}

public static function unregisterAll(): void
{
CallbackCasting::unregisterAll();
}




public static function types(): array
{
$default = [...array_column(Type::cases(), 'value'), ...CallbackCasting::types()];

return array_values(array_unique($default));
}




public static function aliases(): array
{
return CallbackCasting::aliases();
}

public static function supportsAlias(string $alias): bool
{
return CallbackCasting::supportsAlias($alias);
}










public static function assign(string $className, array $record): object
{
return (new self($className, array_keys($record)))->denormalize($record);
}








public static function assignAll(string $className, iterable $records, array $propertyNames = []): Iterator
{
return (new self($className, $propertyNames))->denormalizeAll($records);
}

public function denormalizeAll(iterable $records): Iterator
{
return MapIterator::fromIterable($records, $this->denormalize(...));
}






public function denormalize(array $record): object
{
$object = $this->class->newInstanceWithoutConstructor();
$values = array_values($record);

foreach ($this->propertySetters as $propertySetter) {
$propertySetter($object, $values);
}

foreach ($this->afterMappingCalls as $callback) {
$callback->invoke($object);
}

foreach ($this->properties as $property) {
$property->isInitialized($object) || throw DenormalizationFailed::dueToUninitializedProperty($property);
}

return $object;
}






private function setClass(string $className): ReflectionClass
{
class_exists($className) || throw new MappingFailed('The class `'.$className.'` can not be denormalized; The class does not exist or could not be found.');

$class = new ReflectionClass($className);
if ($class->isInternal() && $class->isFinal()) {
throw new MappingFailed('The class `'.$className.'` can not be denormalized; PHP internal class marked as final can not be instantiated without using the constructor.');
}

return $class;
}








private function setPropertySetters(array $propertyNames): array
{
$propertySetters = [];
$methodNames = array_map(fn (string $propertyName) => 'set'.ucfirst($propertyName), $propertyNames);

foreach ([...$this->properties, ...$this->class->getMethods()] as $accessor) {
$attributes = $accessor->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF);
$propertySetter = match (count($attributes)) {
0 => $this->autoDiscoverPropertySetter($accessor, $propertyNames, $methodNames),
1 => $this->findPropertySetter($attributes[0]->newInstance(), $accessor, $propertyNames),
default => throw new MappingFailed('Using more than one `'.MapCell::class.'` attribute on a class property or method is not supported.'),
};
if (null !== $propertySetter) {
$propertySetters[] = $propertySetter;
}
}

return match ([]) {
$propertySetters => throw new MappingFailed('No property or method from `'.$this->class->getName().'` could be used for denormalization.'),
default => $propertySetters,
};
}



private function setAfterMappingCalls(): array
{
return $this->mapRecord?->afterMappingMethods($this->class)
?? AfterMapping::from($this->class)?->mapRecord->afterMappingMethods($this->class) 
?? [];
}







private function autoDiscoverPropertySetter(ReflectionMethod|ReflectionProperty $accessor, array $propertyNames, array $methodNames): ?PropertySetter
{
if ($accessor->isStatic() || !$accessor->isPublic()) {
return null;
}

if ($accessor instanceof ReflectionMethod) {
if ($accessor->isConstructor()) {
return null;
}

if ([] === $accessor->getParameters()) {
return null;
}

if (1 < $accessor->getNumberOfRequiredParameters()) {
return null;
}
}



[$offset, $reflectionProperty] = match (true) {
$accessor instanceof ReflectionMethod => [array_search($accessor->getName(), $methodNames, true), $accessor->getParameters()[0]],
$accessor instanceof ReflectionProperty => [array_search($accessor->getName(), $propertyNames, true), $accessor],
};

return match (true) {
false === $offset,
null === $reflectionProperty->getType() => null,
default => new PropertySetter(
$accessor,
$offset,
$this->resolveTypeCasting($reflectionProperty),
$this->mapRecord?->convertEmptyStringToNull ?? self::$convertEmptyStringToNull,
$this->mapRecord?->trimFieldValueBeforeCasting ?? false
),
};
}






private function findPropertySetter(MapCell $mapCell, ReflectionMethod|ReflectionProperty $accessor, array $propertyNames): ?PropertySetter
{
if ($mapCell->ignore) {
return null;
}

$typeCaster = $this->resolveTypeCaster($mapCell, $accessor);

$offset = $mapCell->column ?? match (true) {
$accessor instanceof ReflectionMethod => $this->getMethodFirstArgument($accessor)->getName(),
$accessor instanceof ReflectionProperty => $accessor->getName(),
};

if (!is_int($offset)) {
if ([] === $propertyNames) {
throw new MappingFailed('offset as string are only supported if the property names list is not empty.');
}


$index = array_search($offset, $propertyNames, true);
if (false === $index) {
throw new MappingFailed('The `'.$offset.'` property could not be found in the property names list; Please verify your property names list.');
}

$offset = $index;
}

$reflectionProperty = match (true) {
$accessor instanceof ReflectionMethod => $accessor->getParameters()[0],
$accessor instanceof ReflectionProperty => $accessor,
};

$convertEmptyStringToNull = $mapCell->convertEmptyStringToNull
?? $this->mapRecord?->convertEmptyStringToNull
?? self::$convertEmptyStringToNull;

$trimFieldValueBeforeCasting = $mapCell->trimFieldValueBeforeCasting
?? $this->mapRecord?->trimFieldValueBeforeCasting
?? false;

return match (true) {
0 > $offset => throw new MappingFailed('offset integer position can only be positive or equals to 0; received `'.$offset.'`'),
[] !== $propertyNames && $offset > count($propertyNames) - 1 => throw new MappingFailed('offset integer position can not exceed property names count.'),
null === $typeCaster => new PropertySetter($accessor, $offset, $this->resolveTypeCasting($reflectionProperty, $mapCell->options), $convertEmptyStringToNull, $trimFieldValueBeforeCasting),
default => new PropertySetter($accessor, $offset, $this->getTypeCasting($typeCaster, $reflectionProperty, $mapCell->options), $convertEmptyStringToNull, $trimFieldValueBeforeCasting),
};
}




private function getMethodFirstArgument(ReflectionMethod $reflectionMethod): ReflectionParameter
{
$arguments = $reflectionMethod->getParameters();

return match (true) {
[] === $arguments => throw new MappingFailed('The method `'.$reflectionMethod->getDeclaringClass()->getName().'::'.$reflectionMethod->getName().'` does not use parameters.'),
1 < $reflectionMethod->getNumberOfRequiredParameters() => throw new MappingFailed('The method `'.$reflectionMethod->getDeclaringClass()->getName().'::'.$reflectionMethod->getName().'` has too many required parameters.'),
default => $arguments[0]
};
}




private function getTypeCasting(
string $typeCaster,
ReflectionProperty|ReflectionParameter $reflectionProperty,
array $options
): TypeCasting {
try {

$cast = match (str_starts_with($typeCaster, CallbackCasting::class.'@')) {
true => new CallbackCasting($reflectionProperty, substr($typeCaster, strlen(CallbackCasting::class))),
false => new $typeCaster($reflectionProperty),
};
$cast->setOptions(...$options);

return $cast;
} catch (MappingFailed $exception) {
throw $exception;
} catch (Throwable $exception) {
throw MappingFailed::dueToInvalidCastingArguments($exception);
}
}




private function resolveTypeCasting(ReflectionProperty|ReflectionParameter $reflectionProperty, array $options = []): TypeCasting
{
$castResolver = function (ReflectionProperty|ReflectionParameter $reflectionProperty, $options): CallbackCasting {
$cast = new CallbackCasting($reflectionProperty);
$cast->setOptions(...$options);

return $cast;
};

try {
return match (true) {
CallbackCasting::supports($reflectionProperty) => $castResolver($reflectionProperty, $options),
default => Type::resolve($reflectionProperty, $options),
};
} catch (MappingFailed $exception) {
throw $exception;
} catch (Throwable $exception) {
throw MappingFailed::dueToInvalidCastingArguments($exception);
}
}

public function resolveTypeCaster(MapCell $mapCell, ReflectionMethod|ReflectionProperty $accessor): ?string
{

$typeCaster = $mapCell->cast;
if (null === $typeCaster) {
return null;
}

if (class_exists($typeCaster)) {
if (!(new ReflectionClass($typeCaster))->implementsInterface(TypeCasting::class)) {
throw MappingFailed::dueToInvalidTypeCastingClass($typeCaster);
}

return $typeCaster;
}

if ($accessor instanceof ReflectionMethod) {
$accessor = $accessor->getParameters()[0];
}

if (!CallbackCasting::supports($accessor, $typeCaster)) {
throw MappingFailed::dueToInvalidTypeCastingClass($typeCaster);
}

return CallbackCasting::class.$typeCaster;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Attribute;

#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_PROPERTY)]
final class MapCell
{



public function __construct(
public readonly string|int|null $column = null,
public readonly ?string $cast = null,
public readonly array $options = [],
public readonly bool $ignore = false,
public readonly ?bool $convertEmptyStringToNull = null,
public readonly ?bool $trimFieldValueBeforeCasting = false,
) {
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Closure;
use Deprecated;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;
use ReflectionProperty;
use ReflectionType;
use ReflectionUnionType;
use Throwable;

use function array_key_exists;
use function class_exists;

/**
@template

*/
final class CallbackCasting implements TypeCasting
{

private static array $types = [];

private static array $aliases = [];

private string $type;
private readonly bool $isNullable;

private Closure $callback;
private array $options = [];
private string $message;
private readonly TypeCastingInfo $info;

public function __construct(
ReflectionProperty|ReflectionParameter $reflectionProperty,
private readonly ?string $alias = null
) {
[$this->type, $this->isNullable] = self::resolve($reflectionProperty);

$this->message = match (true) {
$reflectionProperty instanceof ReflectionParameter => 'The method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` argument `'.$reflectionProperty->getName().'` must be typed with a supported type.',
$reflectionProperty instanceof ReflectionProperty => 'The property `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` must be typed with a supported type.',
};

$this->callback = fn (mixed $value, bool $isNullable, mixed ...$arguments): mixed => $value;
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->info;
}




public function setOptions(?string $type = null, mixed ...$options): void
{
if (null === $this->alias) {
if (Type::Mixed->value === $this->type && null !== $type) {
$this->type = $type;
}

try {
$this->callback = self::resolveTypeCallback($this->type); 
$this->options = $options;

return;
} catch (Throwable) {

}

throw new MappingFailed($this->message);
}

if (Type::Mixed->value === $this->type) {
$this->type = self::aliases()[$this->alias];
}

$this->callback = self::resolveAliasCallback($this->type, $this->alias);
$this->options = $options;
}




public function toVariable(mixed $value): mixed
{
try {
return ($this->callback)($value, $this->isNullable, ...$this->options);
} catch (Throwable $exception) {
! $exception instanceof TypeCastingFailed || throw $exception;
null !== $value || throw TypeCastingFailed::dueToNotNullableType($this->type, $exception, $this->info);

throw TypeCastingFailed::dueToInvalidValue(match (true) {
'' === $value => 'empty string',
default => $value,
}, $this->type, $exception, $this->info);
}
}




public static function register(string $type, Closure $callback, ?string $alias = null): void
{
if (null === $alias) {
self::$types[$type] = match (true) {
class_exists($type),
interface_exists($type),
Type::tryFrom($type) instanceof Type => $callback,
default => throw new MappingFailed('The `'.$type.'` could not be register.'),
};

return;
}

1 === preg_match('/^@\w+$/', $alias) || throw new MappingFailed("The alias `$alias` is invalid. It must start with an `@` character and contain alphanumeric (letters, numbers, regardless of case) plus underscore (_).");

foreach (self::$aliases as $aliases) {
foreach ($aliases as $registeredAlias => $__) {
$alias !== $registeredAlias || throw new MappingFailed("The alias `$alias` is already registered. Please choose another name.");
}
}

self::$aliases[$type][$alias] = match (true) {
class_exists($type),
interface_exists($type),
Type::tryFrom($type) instanceof Type => $callback,
default => throw new MappingFailed('The `'.$type.'` could not be register.'),
};
}

public static function unregisterType(string $type): bool
{
if (!array_key_exists($type, self::$types)) {
return false;
}

unset(self::$types[$type]);

return true;
}

public static function unregisterTypes(): void
{
self::$types = [];
}

public static function unregisterAlias(string $alias): bool
{
if (1 !== preg_match('/^@\w+$/', $alias)) {
return false;
}

foreach (self::$aliases as $type => $aliases) {
foreach ($aliases as $registeredAlias => $__) {
if ($registeredAlias === $alias) {
unset(self::$aliases[$type][$registeredAlias]);

return true;
}
}
}

return false;
}

public static function unregisterAliases(): void
{
self::$aliases = [];
}

public static function unregisterAll(): void
{
self::unregisterTypes();
self::unregisterAliases();
}

public static function supportsAlias(?string $alias): bool
{
return null !== $alias && array_key_exists($alias, self::aliases());
}

public static function supportsType(?string $type): bool
{
if (null === $type) {
return false;
}

try {
self::resolveTypeCallback($type); 

return true;
} catch (Throwable) {
return false;
}
}




public static function types(): array
{
return array_keys(self::$types);
}




public static function aliases(): array
{
$res = [];
foreach (self::$aliases as $registeredType => $aliases) {
foreach ($aliases as $registeredAlias => $__) {
$res[$registeredAlias] = $registeredType;
}
}

return $res;
}

public static function supports(ReflectionParameter|ReflectionProperty $reflectionProperty, ?string $alias = null): bool
{
$propertyTypeList = self::getTypes($reflectionProperty->getType());
if ([] === $propertyTypeList && self::supportsAlias($alias)) {
return true;
}

foreach ($propertyTypeList as $propertyType) {
$type = $propertyType->getName();
if (null === $alias) {
if (self::supportsType($type)) {
return true;
}

continue;
}

if (self::aliasSupportsType($type) || (Type::Mixed->value === $type && self::supportsAlias($alias))) {
return true;
}
}

return false;
}

private static function aliasSupportsType(string $type): bool
{
foreach (self::aliases() as $registeredType) {
if ($type === $registeredType) {
return true;
}

try {
if ((new ReflectionClass($type))->implementsInterface($registeredType)) { 
return true;
}
} catch (Throwable) {
}
}

return false;
}




private static function resolveTypeCallback(string $type): Closure
{
foreach (self::$types as $registeredType => $callback) {
if ($type === $registeredType) {
return $callback;
}

try {
$reflType = new ReflectionClass($type);
if ($reflType->implementsInterface($registeredType)) {
return $callback;
}
} catch (Throwable) {
}
}

throw new MappingFailed('The `'.$type.'` could not be resolved.');
}

private static function resolveAliasCallback(string $type, string $alias): Closure
{
$rType = self::aliases()[$alias] ?? null;
if (isset($rType)) {
return self::$aliases[$rType][$alias];
}

foreach (self::aliases() as $aliasName => $registeredType) {
try {
$reflType = new ReflectionClass($type); 
if ($reflType->implementsInterface($registeredType)) {
return self::$aliases[$registeredType][$aliasName];
}
} catch (Throwable) {
}
}

throw new MappingFailed('The `'.$type.'` could not be resolved.');
}






private static function resolve(ReflectionParameter|ReflectionProperty $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed->value, true];
}

$types = self::getTypes($reflectionProperty->getType());

$type = null;
$isNullable = false;
$hasMixed = false;
foreach ($types as $foundType) {
if (!$isNullable && $foundType->allowsNull()) {
$isNullable = true;
}

if (null === $type) {
$instanceName = $foundType->getName();
if (self::supportsType($instanceName) || array_key_exists($instanceName, self::$aliases)) {
$type = $foundType;
}

if (true !== $hasMixed && Type::Mixed->value === $instanceName) {
$hasMixed = true;
}
}
}

return match (true) {
$type instanceof ReflectionNamedType => [$type->getName(), $isNullable],
$hasMixed => [Type::Mixed->value, true],
default => throw new MappingFailed(match (true) {
$reflectionProperty instanceof ReflectionParameter => 'The method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` argument `'.$reflectionProperty->getName().'` must be typed with a supported type.',
$reflectionProperty instanceof ReflectionProperty => 'The property `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` must be typed with a supported type.',
}),
};
}




private static function getTypes(?ReflectionType $type): array
{
return match (true) {
$type instanceof ReflectionNamedType => [$type],
$type instanceof ReflectionUnionType => array_filter(
$type->getTypes(),
fn (ReflectionType $innerType) => $innerType instanceof ReflectionNamedType
),
default => [],
};
}








#[Deprecated(message:'use League\Csv\Serializer\CallbackCasting::unregisterType() instead', since:'league/csv:9.13.0')]
public static function unregister(string $type): bool
{
return self::unregisterType($type);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionParameter;
use ReflectionProperty;

use function filter_var;

/**
@implements
*/
final class CastToInt implements TypeCasting
{
private readonly bool $isNullable;
private ?int $default = null;
private readonly TypeCastingInfo $info;

public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
$this->isNullable = $this->init($reflectionProperty);
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->info;
}

public function setOptions(
?int $default = null,
bool $emptyStringAsNull = false,
): void {
$this->default = $default;
}




public function toVariable(mixed $value): ?int
{
if (null === $value) {
return match ($this->isNullable) {
true => $this->default,
false => throw TypeCastingFailed::dueToNotNullableType('integer', info: $this->info),
};
}

is_scalar($value) || throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info);

$int = filter_var($value, Type::Int->filterFlag());

return match ($int) {
false => throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info),
default => $int,
};
}

private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): bool
{
if (null === $reflectionProperty->getType()) {
return true;
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Int, Type::Float)) {
$type = $found;
}
}

null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'int', 'float', 'null', 'mixed');

return $isNullable;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use LogicException;
use ReflectionParameter;
use ReflectionProperty;
use Throwable;

final class MappingFailed extends LogicException implements SerializationFailed
{
public static function dueToUnsupportedType(ReflectionProperty|ReflectionParameter $reflectionProperty): self
{
$suffix = 'is missing; register it using the `'.Denormalizer::class.'` class.';

return new self(match (true) {
$reflectionProperty instanceof ReflectionParameter => 'The type definition for the method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` first argument `'.$reflectionProperty->getName().'` '.$suffix,
$reflectionProperty instanceof ReflectionProperty => 'The property type definition for `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` '.$suffix,
});
}

public static function dueToTypeCastingUnsupportedType(
ReflectionProperty|ReflectionParameter $reflectionProperty,
TypeCasting $typeCasting,
string ...$types
): self {

$suffix = 'is invalid; `'.implode('` or `', $types).'` type must be used with the `'.$typeCasting::class.'`.';

return new self(match (true) {
$reflectionProperty instanceof ReflectionParameter => 'The type for the method `'.$reflectionProperty->getDeclaringClass()?->getName().'::'.$reflectionProperty->getDeclaringFunction()->getName().'` first argument `'.$reflectionProperty->getName().'` '.$suffix,
$reflectionProperty instanceof ReflectionProperty => 'The property type for `'.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().'` '.$suffix,
});
}

public static function dueToInvalidCastingArguments(?Throwable $exception = null): self
{
return new self('Unable to load the casting mechanism. Please verify your casting arguments', 0, $exception);
}

public static function dueToInvalidTypeCastingClass(string $typeCaster): self
{
return new self('`'.$typeCaster.'` must be an resolvable class implementing the `'.TypeCasting::class.'` interface or a supported alias.');
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionParameter;
use ReflectionProperty;

use function filter_var;

/**
@implements
*/
final class CastToFloat implements TypeCasting
{
private readonly bool $isNullable;
private ?float $default = null;
private readonly TypeCastingInfo $info;

public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
$this->isNullable = $this->init($reflectionProperty);
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->info;
}

public function setOptions(
int|float|null $default = null,
bool $emptyStringAsNull = false,
): void {
$this->default = $default;
}




public function toVariable(mixed $value): ?float
{
if (null === $value) {
return match ($this->isNullable) {
true => $this->default,
false => throw TypeCastingFailed::dueToNotNullableType('float', info: $this->info),
};
}

is_scalar($value) || throw TypeCastingFailed::dueToInvalidValue($value, Type::Int->value, info: $this->info);

$float = filter_var($value, Type::Float->filterFlag());

return match ($float) {
false => throw TypeCastingFailed::dueToInvalidValue($value, Type::Float->value, info: $this->info),
default => $float,
};
}

private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): bool
{
if (null === $reflectionProperty->getType()) {
return true;
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Float)) {
$type = $found;
}
}

null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'float', 'null', 'mixed');

return $isNullable;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Throwable;

interface SerializationFailed extends Throwable
{
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionAttribute;
use ReflectionFunctionAbstract;
use ReflectionMethod;
use ReflectionParameter;
use ReflectionProperty;
use ValueError;

use function strtolower;
use function substr;

final class TypeCastingInfo
{
public function __construct(
public readonly int|string $source,
public readonly TypeCastingTargetType $targetType,
public readonly string $targetName,
public readonly ?string $targetMethodName,
public readonly ?string $targetClassName,
) {
}

public static function fromAccessor(ReflectionMethod|ReflectionProperty|ReflectionParameter $accessor): self
{
return match (true) {
$accessor instanceof ReflectionMethod => self::fromMethod($accessor),
$accessor instanceof ReflectionParameter => self::fromMethodFirstArgument($accessor),
$accessor instanceof ReflectionProperty => self::fromProperty($accessor),
};
}

public static function fromMethod(ReflectionMethod $accessor): self
{
$accessor = $accessor->getParameters()[0] ?? null;
if (null === $accessor) {
throw new ValueError('The method must contain at least one parameter in its signature.');
}

return self::fromMethodFirstArgument($accessor);
}

public static function fromMethodFirstArgument(ReflectionParameter $accessor): self
{

$method = $accessor->getDeclaringFunction();
$className = $method->getDeclaringClass()->getName();

return new self(
self::resolveSource($method),
TypeCastingTargetType::MethodFirstArgument,
$accessor->getName(),
$method->getName(),
$className,
);
}

public static function fromProperty(ReflectionProperty $accessor): self
{
$attributes = $accessor->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF);
$source = [] === $attributes ? $accessor->getName() : ($attributes[0]->newInstance()->column ?? $accessor->getName());

$className = $accessor->getDeclaringClass()->getName();

return new self(
$source,
TypeCastingTargetType::PropertyName,
$accessor->getName(),
null,
$className,
);
}

private static function resolveSource(ReflectionFunctionAbstract $method): int|string
{
$attributes = $method->getAttributes(MapCell::class, ReflectionAttribute::IS_INSTANCEOF);
if ([] === $attributes) {
return self::getColumnName($method);
}

$name = $attributes[0]->newInstance()->column;
if (null !== $name) {
return $name;
}

return self::getColumnName($method);
}

private static function getColumnName(ReflectionFunctionAbstract $method): string
{
$name = $method->getName();
if (!str_starts_with($name, 'set')) {
throw new ValueError('The method `'.$name.'` has no Mapping information and does not start with `set`.');
}

return strtolower($name[3]).substr($name, 4);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use RuntimeException;
use Throwable;

use function is_int;

final class TypeCastingFailed extends RuntimeException implements SerializationFailed
{
public readonly ?TypeCastingInfo $info;

public function __construct(string $message, int $code = 0, ?Throwable $previous = null, ?TypeCastingInfo $info = null)
{
parent::__construct(self::format($message, $info), $code, $previous);

$this->info = $info;
}

private static function format(string $message, ?TypeCastingInfo $info = null): string
{
if (null === $info) {
return $message;
}

$className = $info->targetClassName;
if (null !== $className) {
$className .= '::';
}

$target = $info->targetName;
$target = (TypeCastingTargetType::MethodFirstArgument === $info->targetType)
? 'the first argument `'.$target.'` of the method `'.$className.$info->targetMethodName.'()`'
: 'the property `'.$className.$target.'`';

$source = $info->source;
$source = is_int($source)
? "the record field offset `$source`"
: "the record field `$source`";

return "Casting $target using $source failed; $message";
}

public static function dueToNotNullableType(string $type, ?Throwable $exception = null, ?TypeCastingInfo $info = null): self
{
return new self('The `null` value can not be cast to a `'.$type.'`; the property type is not nullable.', 0, $exception, $info);
}

public static function dueToInvalidValue(mixed $value, string $type, ?Throwable $previous = null, ?TypeCastingInfo $info = null): self
{
if (!is_scalar($value)) {
$value = gettype($value);
}

return new self('Unable to cast the given data `'.$value.'` to a `'.$type.'`.', 0, $previous, $info);
}

public static function dueToUndefinedValue(string|int $offset, ?TypeCastingInfo $info = null): self
{
return new self('Unable to cast the record value; Missing value was for offset `'.$offset.'`.', 0, info: $info);
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Attribute;
use ReflectionAttribute;
use ReflectionClass;
use ReflectionException;
use ReflectionMethod;
use ValueError;

#[Attribute(Attribute::TARGET_CLASS)]
final class MapRecord
{
public function __construct(

public readonly array $afterMapping = [],
public readonly ?bool $convertEmptyStringToNull = null,
public readonly bool $trimFieldValueBeforeCasting = false,
) {
foreach ($this->afterMapping as $method) {
is_string($method) || throw new ValueError('The method names must be string.');
}
}




public function afterMappingMethods(ReflectionClass $class): array
{
$methods = [];
foreach ($this->afterMapping as $method) {
try {
$accessor = $class->getMethod($method);
} catch (ReflectionException $exception) {
throw new MappingFailed('The method `'.$method.'` is not defined on the `'.$class->getName().'` class.', 0, $exception);
}

0 === $accessor->getNumberOfRequiredParameters() || throw new MappingFailed('The method `'.$class->getName().'::'.$accessor->getName().'` has too many required parameters.');
$methods[] = $accessor;
}

return $methods;
}




public static function tryFrom(ReflectionClass $class): ?self
{
$attributes = $class->getAttributes(self::class, ReflectionAttribute::IS_INSTANCEOF);
$nbAttributes = count($attributes);

return match ($nbAttributes) {
0 => null,
1 => $attributes[0]->newInstance(),
default => throw new MappingFailed('Using more than one `'.self::class.'` attribute on a class property or method is not supported.'),
};
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionParameter;
use ReflectionProperty;

/**
@implements
*/
final class CastToString implements TypeCasting
{
private readonly bool $isNullable;
private readonly Type $type;
private ?string $default = null;
private readonly TypeCastingInfo $variableName;

public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
[$this->type, $this->isNullable] = $this->init($reflectionProperty);
$this->variableName = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->variableName;
}

public function setOptions(
?string $default = null,
bool $emptyStringAsNull = false,
): void {
$this->default = $default;
}




public function toVariable(mixed $value): ?string
{
$returnedValue = match (true) {
is_string($value) => $value,
$this->isNullable => $this->default,
default => throw TypeCastingFailed::dueToNotNullableType($this->type->value, info: $this->variableName),
};

return match (true) {
Type::Null->equals($this->type) && null !== $returnedValue => throw TypeCastingFailed::dueToInvalidValue(match (true) {
null === $value => 'null',
'' === $value => 'empty string',
default => $value,
}, $this->type->value, info: $this->variableName),
default => $returnedValue,
};
}




private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed, true];
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::String, Type::Mixed, Type::Null)) {
$type = $found;
}
}

null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'string', 'mixed', 'null');

return [$type[0], $isNullable];
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use DateTimeZone;
use ReflectionClass;
use ReflectionParameter;
use ReflectionProperty;
use Throwable;

use function class_exists;
use function is_string;

/**
@implements
*/
final class CastToDate implements TypeCasting
{

private string $class;
private readonly bool $isNullable;
private DateTimeImmutable|DateTime|null $default = null;
private readonly Type $type;
private readonly TypeCastingInfo $info;
private ?DateTimeZone $timezone = null;
private ?string $format = null;




public function __construct(
ReflectionProperty|ReflectionParameter $reflectionProperty,
) {
[$this->type, $this->class, $this->isNullable] = $this->init($reflectionProperty);
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}






public function setOptions(
?string $default = null,
?string $format = null,
DateTimeZone|string|null $timezone = null,
?string $className = null,
): void {
$this->class = match (true) {
!interface_exists($this->class) && !Type::Mixed->equals($this->type) => $this->class,
DateTimeInterface::class === $this->class && null === $className => DateTimeImmutable::class,
interface_exists($this->class) && null !== $className && class_exists($className) && (new ReflectionClass($className))->implementsInterface($this->class) => $className,
default => throw new MappingFailed('`'.$this->info->targetName.'` type is `'.($this->class ?? 'mixed').'` but the specified class via the `$className` argument is invalid or could not be found.'),
};

try {
$this->format = $format;
$this->timezone = is_string($timezone) ? new DateTimeZone($timezone) : $timezone;
$this->default = (null !== $default) ? $this->cast($default) : $default;
} catch (Throwable $exception) {
throw new MappingFailed('The `timezone` and/or `format` options used for `'.self::class.'` are invalud.', 0, $exception);
}
}

public function info(): TypeCastingInfo
{
return $this->info;
}




public function toVariable(mixed $value): DateTimeImmutable|DateTime|null
{
return match (true) {
null !== $value && '' !== $value => $this->cast($value),
$this->isNullable => $this->default,
default => throw TypeCastingFailed::dueToNotNullableType($this->class, info: $this->info),
};
}




private function cast(mixed $value): DateTimeImmutable|DateTime
{
if ($value instanceof DateTimeInterface) {
if ($value instanceof $this->class) {
return $value;
}

return ($this->class)::createFromInterface($value);
}

is_string($value) || throw TypeCastingFailed::dueToInvalidValue($value, $this->class, info: $this->info);

try {
$date = null !== $this->format ?
($this->class)::createFromFormat($this->format, $value, $this->timezone) :
new ($this->class)($value, $this->timezone);
if (false === $date) {
throw TypeCastingFailed::dueToInvalidValue($value, $this->class);
}
} catch (Throwable $exception) {
if ($exception instanceof TypeCastingFailed) {
throw $exception;
}

throw TypeCastingFailed::dueToInvalidValue($value, $this->class, $exception, $this->info);
}

return $date;
}






private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed, DateTimeInterface::class, true];
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Date)) {
$type = $found;
}
}

null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, DateTimeInterface::class, 'mixed');


$className = $type[1]->getName();

return [$type[0], $className, $isNullable];
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionParameter;
use ReflectionProperty;

use function filter_var;

/**
@implements
*/
final class CastToBool implements TypeCasting
{
private readonly bool $isNullable;
private readonly Type $type;
private readonly TypeCastingInfo $info;
private ?bool $default = null;

public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
[$this->type, $this->isNullable] = $this->init($reflectionProperty);
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function setOptions(
?bool $default = null,
bool $emptyStringAsNull = false,
): void {
$this->default = $default;
}

public function info(): TypeCastingInfo
{
return $this->info;
}




public function toVariable(mixed $value): ?bool
{
$returnValue = match (true) {
is_bool($value) => $value,
null !== $value => filter_var($value, Type::Bool->filterFlag()),
$this->isNullable => $this->default,
default => throw TypeCastingFailed::dueToNotNullableType('boolean', info: $this->info),
};

return match (true) {
Type::True->equals($this->type) && true !== $returnValue && !$this->isNullable,
Type::False->equals($this->type) && false !== $returnValue && !$this->isNullable => throw TypeCastingFailed::dueToInvalidValue(match (true) {
null === $value => 'null',
'' === $value => 'empty string',
default => $value,
}, $this->type->value, info: $this->info),
default => $returnValue,
};
}




private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed, true];
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Bool, Type::True, Type::False)) {
$type = $found;
}
}

if (null === $type) {
throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'bool', 'mixed');
}

return [$type[0], $isNullable];
}
}
<?php










namespace League\Csv\Serializer;

use DateTimeInterface;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;
use ReflectionProperty;
use ReflectionType;
use ReflectionUnionType;
use Throwable;
use UnitEnum;

use function class_exists;
use function enum_exists;
use function in_array;

use const FILTER_UNSAFE_RAW;
use const FILTER_VALIDATE_BOOL;
use const FILTER_VALIDATE_FLOAT;
use const FILTER_VALIDATE_INT;

enum Type: string
{
case Bool = 'bool';
case True = 'true';
case False = 'false';
case Null = 'null';
case Int = 'int';
case Float = 'float';
case String = 'string';
case Mixed = 'mixed';
case Array = 'array';
case Iterable = 'iterable';
case Enum = UnitEnum::class;
case Date = DateTimeInterface::class;

public function equals(mixed $value): bool
{
return $value instanceof self
&& $value === $this;
}

public function isOneOf(self ...$types): bool
{
return in_array($this, $types, true);
}

public function filterFlag(): int
{
return match ($this) {
self::Bool,
self::True,
self::False => FILTER_VALIDATE_BOOL,
self::Int => FILTER_VALIDATE_INT,
self::Float => FILTER_VALIDATE_FLOAT,
default => FILTER_UNSAFE_RAW,
};
}

public static function resolve(ReflectionProperty|ReflectionParameter $reflectionProperty, array $arguments = []): TypeCasting
{
try {
$cast = match (self::tryFromAccessor($reflectionProperty)) {
self::Mixed, self::Null, self::String => new CastToString($reflectionProperty),
self::Iterable, self::Array => new CastToArray($reflectionProperty),
self::False, self::True, self::Bool => new CastToBool($reflectionProperty),
self::Float => new CastToFloat($reflectionProperty),
self::Int => new CastToInt($reflectionProperty),
self::Date => new CastToDate($reflectionProperty),
self::Enum => new CastToEnum($reflectionProperty),
null => throw MappingFailed::dueToUnsupportedType($reflectionProperty),
};

$cast->setOptions(...$arguments);

return $cast;
} catch (MappingFailed $exception) {
throw $exception;
} catch (Throwable $exception) {
throw MappingFailed::dueToInvalidCastingArguments($exception);
}
}




public static function list(ReflectionParameter|ReflectionProperty $reflectionProperty): array
{
$reflectionType = $reflectionProperty->getType() ?? throw MappingFailed::dueToUnsupportedType($reflectionProperty);

$foundTypes = static function (array $res, ReflectionType $reflectionType) {
if (!$reflectionType instanceof ReflectionNamedType) {
return $res;
}

$type = self::tryFromName($reflectionType->getName());
if (null !== $type) {
$res[] = [$type, $reflectionType];
}

return $res;
};

return match (true) {
$reflectionType instanceof ReflectionNamedType => $foundTypes([], $reflectionType),
$reflectionType instanceof ReflectionUnionType => array_reduce($reflectionType->getTypes(), $foundTypes, []),
default => [],
};
}

public static function tryFromName(string $propertyType): ?self
{
$interfaceExists = interface_exists($propertyType);

return match (true) {
enum_exists($propertyType),
$interfaceExists && (new ReflectionClass($propertyType))->implementsInterface(UnitEnum::class) => self::Enum,
$interfaceExists && (new ReflectionClass($propertyType))->implementsInterface(DateTimeInterface::class),
class_exists($propertyType) && (new ReflectionClass($propertyType))->implementsInterface(DateTimeInterface::class) => self::Date,
default => self::tryFrom($propertyType),
};
}

public static function tryFromAccessor(ReflectionProperty|ReflectionParameter $reflectionProperty): ?self
{
$type = $reflectionProperty->getType();
if (null === $type) {
return Type::Mixed;
}

if ($type instanceof ReflectionNamedType) {
return self::tryFromName($type->getName());
}

if (!$type instanceof ReflectionUnionType) {
return null;
}

foreach ($type->getTypes() as $innerType) {
if (!$innerType instanceof ReflectionNamedType) {
continue;
}

$result = self::tryFromName($innerType->getName());
if ($result instanceof self) {
return $result;
}
}

return null;
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use Attribute;
use Deprecated;
use ReflectionAttribute;
use ReflectionClass;






#[Attribute(Attribute::TARGET_CLASS)]
final class AfterMapping
{
public readonly MapRecord $mapRecord;
public readonly array $methods;

#[Deprecated(message: 'use League\Csv\Serializer\MapRecord instead', since: 'league/csv:9.17.0')]
public function __construct(string ...$methods)
{
$this->mapRecord = new MapRecord($methods);
$this->methods = $this->mapRecord->afterMapping;
}

public static function from(ReflectionClass $class): ?self
{
$attributes = $class->getAttributes(self::class, ReflectionAttribute::IS_INSTANCEOF);
$nbAttributes = count($attributes);

return match (true) {
0 === $nbAttributes => null,
1 < $nbAttributes => throw new MappingFailed('Using more than one `'.self::class.'` attribute on a class property or method is not supported.'),
default => $attributes[0]->newInstance(),
};
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

/**
@template


*/
interface TypeCasting
{





public function toVariable(mixed $value): mixed;








public function setOptions(): void;
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use ReflectionProperty;
use RuntimeException;

final class DenormalizationFailed extends RuntimeException implements SerializationFailed
{
public static function dueToUninitializedProperty(ReflectionProperty $reflectionProperty): self
{
return new self('The property '.$reflectionProperty->getDeclaringClass()->getName().'::'.$reflectionProperty->getName().' is not initialized; its value is missing from the source data.');
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use BackedEnum;
use ReflectionEnum;
use ReflectionParameter;
use ReflectionProperty;
use Throwable;
use UnitEnum;

/**
@implements
*/
class CastToEnum implements TypeCasting
{
private readonly bool $isNullable;
private readonly Type $type;
private ?UnitEnum $default = null;
private readonly TypeCastingInfo $info;

private string $class;




public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
[$this->type, $this->class, $this->isNullable] = $this->init($reflectionProperty);
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->info;
}






public function setOptions(
?string $default = null,
?string $className = null,
bool $emptyStringAsNull = false,
): void {
if (Type::Mixed->equals($this->type) || in_array($this->class, [BackedEnum::class , UnitEnum::class], true)) {
(null !== $className && enum_exists($className)) || throw new MappingFailed('`'.$this->info->targetName.'` type is `'.($this->class ?? 'mixed').'` but the specified class via the `$className` argument is invalid or could not be found.');
$this->class = $className;
}

try {
$this->default = (null !== $default) ? $this->cast($default) : $default;
} catch (TypeCastingFailed $exception) {
throw new MappingFailed(message:'The `default` option is invalid.', previous: $exception);
}
}




public function toVariable(mixed $value): BackedEnum|UnitEnum|null
{
return match (true) {
null !== $value => $this->cast($value),
$this->isNullable => $this->default,
default => throw TypeCastingFailed::dueToNotNullableType($this->class, info: $this->info),
};
}




private function cast(mixed $value): BackedEnum|UnitEnum
{
if ($value instanceof $this->class) {
return $value;
}

is_string($value) || throw throw TypeCastingFailed::dueToInvalidValue($value, $this->class, info: $this->info);

try {
$enum = new ReflectionEnum($this->class);
if (!$enum->isBacked()) {
return $enum->getCase($value)->getValue();
}

$backedValue = 'int' === $enum->getBackingType()->getName() ? filter_var($value, Type::Int->filterFlag()) : $value;

return $this->class::from($backedValue); 
} catch (Throwable $exception) {
throw throw TypeCastingFailed::dueToInvalidValue($value, $this->class, $exception, $this->info);
}
}




private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed, UnitEnum::class, true];
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Enum)) {
$type = $found;
}
}

null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'enum', 'mixed');


$className = $type[1]->getName();

return [$type[0], $className, $isNullable];
}
}
<?php










declare(strict_types=1);

namespace League\Csv\Serializer;

use JsonException;
use League\Csv\Exception;
use League\Csv\Reader;
use ReflectionParameter;
use ReflectionProperty;

use function array_map;
use function explode;
use function filter_var;
use function is_array;
use function json_decode;
use function strlen;

use const FILTER_REQUIRE_ARRAY;
use const JSON_THROW_ON_ERROR;

/**
@implements
*/
final class CastToArray implements TypeCasting
{
private readonly Type $type;
private readonly bool $isNullable;
private ArrayShape $shape;
private int $filterFlag;

private string $separator = ',';
private string $delimiter = '';
private string $enclosure = '"';

private int $depth = 512;
private int $flags = 0;
private ?array $default = null;
private bool $trimElementValueBeforeCasting = false;
private ?int $headerOffset = null;
private readonly TypeCastingInfo $info;




public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
{
[$this->type, $this->isNullable] = $this->init($reflectionProperty);
$this->shape = ArrayShape::List;
$this->filterFlag = Type::String->filterFlag();
$this->info = TypeCastingInfo::fromAccessor($reflectionProperty);
}

public function info(): TypeCastingInfo
{
return $this->info;
}








public function setOptions(
?array $default = null,
ArrayShape|string $shape = ArrayShape::List,
string $separator = ',',
string $delimiter = ',',
string $enclosure = '"',
int $depth = 512,
int $flags = 0,
Type|string $type = Type::String,
bool $trimElementValueBeforeCasting = false,
?int $headerOffset = null,
): void {
if (!$shape instanceof ArrayShape) {
$shape = ArrayShape::tryFrom($shape) ?? throw new MappingFailed('Unable to resolve the array shape; Verify your options arguments.');
}

if (!$type instanceof Type) {
$type = Type::tryFrom($type) ?? throw new MappingFailed('Unable to resolve the array value type; Verify your options arguments.');
}

$this->shape = $shape;
$this->depth = $depth;
$this->separator = $separator;
$this->delimiter = $delimiter;
$this->enclosure = $enclosure;
$this->flags = $flags;
$this->default = $default;
$this->filterFlag = match (true) {
1 > $this->depth && $this->shape->equals(ArrayShape::Json) => throw new MappingFailed('the json depth can not be less than 1.'),
1 > strlen($this->separator) && $this->shape->equals(ArrayShape::List) => throw new MappingFailed('expects separator to be a non-empty string for list conversion; empty string given.'),
1 !== strlen($this->delimiter) && $this->shape->equals(ArrayShape::Csv) => throw new MappingFailed('expects delimiter to be a single character for CSV conversion; `'.$this->delimiter.'` given.'),
1 !== strlen($this->enclosure) && $this->shape->equals(ArrayShape::Csv) => throw new MappingFailed('expects enclosure to be a single character; `'.$this->enclosure.'` given.'),
default => $this->resolveFilterFlag($type),
};
$this->trimElementValueBeforeCasting = $trimElementValueBeforeCasting;
$this->headerOffset = $headerOffset;
}

public function toVariable(mixed $value): ?array
{
if (null === $value) {
return match (true) {
$this->isNullable,
Type::Mixed->equals($this->type) => $this->default,
default => throw TypeCastingFailed::dueToNotNullableType($this->type->value, info: $this->info),
};
}

if ('' === $value) {
return [];
}

if (is_array($value)) {
return $value;
}

if (!is_string($value)) {
throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, info: $this->info);
}

if ($this->shape->equals(ArrayShape::Json)) {
try {
$data = json_decode($value, true, $this->depth, $this->flags | JSON_THROW_ON_ERROR);
} catch (JsonException $exception) {
throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, $exception, $this->info);
}

if (!is_array($data)) {
throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, info: $this->info);
}

return $data;
}

if ($this->shape->equals(ArrayShape::Csv)) {
try {
$data = Reader::fromString($value);
$data->setDelimiter($this->delimiter);
$data->setEnclosure($this->enclosure);
$data->setEscape('');
$data->setHeaderOffset($this->headerOffset);
if ($this->trimElementValueBeforeCasting) {
$data->addFormatter($this->trimString(...));
}
$data->addFormatter($this->filterElement(...));

return [...$data];
} catch (Exception $exception) {
throw TypeCastingFailed::dueToInvalidValue($value, $this->type->value, $exception, $this->info);
}
}

$data = explode($this->separator, $value);

return $this->filterElement(match (true) {
$this->trimElementValueBeforeCasting => $this->trimString($data),
default => $data,
});
}

private function trimString(array $record): array
{
return array_map(
fn (mixed $value): mixed => is_string($value) ? trim($value) : $value,
$record
);
}

private function filterElement(array $record): array
{
return filter_var($record, $this->filterFlag, FILTER_REQUIRE_ARRAY);
}




private function resolveFilterFlag(?Type $type): int
{
return match (true) {
$this->shape->equals(ArrayShape::Json) => Type::String->filterFlag(),
$type instanceof Type && $type->isOneOf(Type::Bool, Type::True, Type::False, Type::String, Type::Float, Type::Int) => $type->filterFlag(),
default => throw new MappingFailed('Only scalar type are supported for `array` value casting.'),
};
}




private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
{
if (null === $reflectionProperty->getType()) {
return [Type::Mixed, true];
}

$type = null;
$isNullable = false;
foreach (Type::list($reflectionProperty) as $found) {
if (!$isNullable && $found[1]->allowsNull()) {
$isNullable = true;
}

if (null === $type && $found[0]->isOneOf(Type::Mixed, Type::Array, Type::Iterable)) {
$type = $found;
}
}

if (null === $type) {
throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'array', 'iterable', 'mixed');
}

return [$type[0], $isNullable];
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use php_user_filter;
use RuntimeException;
use TypeError;

use function get_resource_type;
use function gettype;
use function in_array;
use function is_resource;
use function str_replace;
use function stream_bucket_append;
use function stream_bucket_make_writeable;
use function stream_bucket_new;
use function stream_filter_append;
use function stream_filter_register;
use function stream_get_filters;
use function stream_get_meta_data;

use const PSFS_PASS_ON;

final class SwapDelimiter extends php_user_filter
{
private const FILTER_NAME = 'string.league.csv.delimiter';
public const MODE_READ = 'read';
public const MODE_WRITE = 'write';
private string $search = '';
private string $replace = '';

public static function getFiltername(): string
{
return self::FILTER_NAME;
}




public static function register(): void
{
in_array(self::FILTER_NAME, stream_get_filters(), true) || stream_filter_register(self::FILTER_NAME, self::class);
}




public static function addTo(AbstractCsv $csv, string $inputDelimiter): void
{
self::register();

if ($csv instanceof Reader) {
$csv->appendStreamFilterOnRead(self::getFiltername(), [
'mb_separator' => $inputDelimiter,
'separator' => $csv->getDelimiter(),
'mode' => self::MODE_READ,
]);
return;
}

$csv->appendStreamFilterOnWrite(self::getFiltername(), [
'mb_separator' => $inputDelimiter,
'separator' => $csv->getDelimiter(),
'mode' => self::MODE_WRITE,
]);
}









public static function appendTo(mixed $stream, string $inputDelimiter, string $delimiter): mixed
{
self::register();

is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.');
'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given');


$filter = Warning::cloak(fn () => stream_filter_append($stream, self::getFiltername(), params: [
'mb_separator' => $inputDelimiter,
'separator' => $delimiter,
'mode' => str_contains(stream_get_meta_data($stream)['mode'], 'r') ? self::MODE_READ : self::MODE_WRITE,
]));

is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.self::getFiltername());

return $filter;
}









public static function prependTo(mixed $stream, string $inputDelimiter, string $delimiter): mixed
{
self::register();

is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.');
'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given');

$filtername = self::getFiltername();

$filter = Warning::cloak(fn () => stream_filter_append($stream, $filtername, params: [
'mb_separator' => $inputDelimiter,
'separator' => $delimiter,
'mode' => str_contains(stream_get_meta_data($stream)['mode'], 'r') ? self::MODE_READ : self::MODE_WRITE,
]));
is_resource($filter) || throw new RuntimeException('Could not prepend the registered stream filter: '.$filtername);

return $filter;
}

public function onCreate(): bool
{
if (self::FILTER_NAME !== $this->filtername) {
return false;
}

if (!is_array($this->params)) {
return false;
}

$mode = $this->params['mode'] ?? '';
[$this->search, $this->replace] = match ($mode) {
self::MODE_READ => [trim($this->params['mb_separator'] ?? ''), trim($this->params['separator'] ?? '')],
self::MODE_WRITE => [trim($this->params['separator'] ?? ''), trim($this->params['mb_separator'] ?? '')],
default => ['', ''],
};

return !in_array('', [$this->replace, $this->search], true);
}

public function filter($in, $out, &$consumed, bool $closing): int
{
$data = '';
while (null !== ($bucket = stream_bucket_make_writeable($in))) {
$data .= $bucket->data;
$consumed += $bucket->datalen;
}

$data = str_replace($this->search, $this->replace, $data);
Warning::cloak(function () use ($data, $out) {
stream_bucket_append($out, stream_bucket_new($this->stream, $data));
});

return PSFS_PASS_ON;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;

use function array_filter;
use function array_map;
use function array_reduce;
use function count;
use function explode;
use function filter_var;
use function preg_match;
use function range;

use const FILTER_VALIDATE_INT;

/**
@phpstan-type
@experimental



*/
class FragmentFinder
{
private const REGEXP_URI_FRAGMENT = ',^(?<type>row|cell|col)=(?<selections>.*)$,i';
private const REGEXP_ROWS_COLUMNS_SELECTION = '/^(?<start>\d+)(-(?<end>\d+|\*))?$/';
private const REGEXP_CELLS_SELECTION = '/^(?<csr>\d+),(?<csc>\d+)(-(?<end>((?<cer>\d+),(?<cec>\d+))|\*))?$/';
private const TYPE_ROW = 'row';
private const TYPE_COLUMN = 'col';
private const TYPE_UNKNOWN = 'unknown';

/**
@experimental







*/
public function findAll(string $expression, TabularData|TabularDataProvider $tabularData): iterable
{
$tabularData = self::tabularData($tabularData);

return $this->find($this->parseExpression($expression, $tabularData), $tabularData);
}

private static function tabularData(TabularData|TabularDataProvider $tabularData): TabularData
{
if ($tabularData instanceof TabularData) {
return $tabularData;
}

return $tabularData->getTabularData();
}

/**
@experimental






*/
public function findFirst(string $expression, TabularData|TabularDataProvider $tabularData): ?TabularDataReader
{
$tabularData = self::tabularData($tabularData);
$fragment = $this->find($this->parseExpression($expression, $tabularData), $tabularData)[0];

return match ([]) {
$fragment->first() => null,
default => $fragment,
};
}

/**
@experimental







*/
public function findFirstOrFail(string $expression, TabularData|TabularDataProvider $tabularData): TabularDataReader
{
$tabularData = self::tabularData($tabularData);
$parsedExpression = $this->parseExpression($expression, $tabularData);
if ([] !== array_filter($parsedExpression['selections'], fn (array $selection) => -1 === $selection['start'])) {
throw new FragmentNotFound('The expression `'.$expression.'` contains an invalid or an unsupported selection for the tabular data.');
}

$fragment = $this->find($parsedExpression, $tabularData)[0];

return match ([]) {
$fragment->first() => throw new FragmentNotFound('No fragment found in the tabular data with the expression `'.$expression.'`.'),
default => $fragment,
};
}








private function find(array $parsedExpression, TabularData $tabularData): array
{
['type' => $type, 'selections' => $selections] = $parsedExpression;

$selections = array_filter($selections, fn (array $selection) => -1 !== $selection['start']);
if ([] === $selections) {
return [new ResultSet()];
}

if (self::TYPE_ROW === $type) {
$rowFilter = fn (array $record, int $offset): bool => [] !== array_filter(
$selections,
fn (array $selection) =>
$offset >= $selection['start'] &&
(null === $selection['end'] || $offset <= $selection['end'])
);

return [
(new Statement())
->where($rowFilter)
->process($tabularData),
];
}

if (self::TYPE_COLUMN === $type) {
$columns = array_reduce(
$selections,
fn (array $columns, array $selection) => [...$columns, ...$selection['columns']],
[]
);

return [match ([]) {
$columns => new ResultSet(),
default => (new Statement())->select(...$columns)->process($tabularData),
}];
}

return array_map(
fn (array $selection) => (new Statement())
->offset($selection['start'])
->limit($selection['length'])
->select(...$selection['columns'])
->process($tabularData),
$selections
);
}




private function parseExpression(string $expression, TabularData $tabularData): array
{
if (1 !== preg_match(self::REGEXP_URI_FRAGMENT, $expression, $matches)) {
return [
'type' => self::TYPE_UNKNOWN,
'selections' => [
[
'selection' => $expression,
'start' => -1,
'end' => null,
'length' => -1,
'columns' => [],
],
],
];
}

$type = strtolower($matches['type']);


$res = array_reduce(
explode(';', $matches['selections']),
fn (array $selections, string $selection): array => [...$selections, match ($type) {
self::TYPE_ROW => $this->parseRowSelection($selection),
self::TYPE_COLUMN => $this->parseColumnSelection($selection, $tabularData),
default => $this->parseCellSelection($selection, $tabularData),
}],
[]
);

return [
'type' => $type,
'selections' => $res,
];
}




private function parseRowSelection(string $selection): array
{
[$start, $end] = $this->parseRowColumnSelection($selection);

return match (true) {
-1 === $start,
null === $end => [
'selection' => $selection,
'start' => $start,
'end' => $start,
'length' => 1,
'columns' => [],
],
'*' === $end => [
'selection' => $selection,
'start' => $start,
'end' => null,
'length' => -1,
'columns' => [],
],
default => [
'selection' => $selection,
'start' => $start,
'end' => $end,
'length' => $end - $start + 1,
'columns' => [],
],
};
}




private function parseColumnSelection(string $selection, TabularData $tabularData): array
{
[$start, $end] = $this->parseRowColumnSelection($selection);
$header = $tabularData->getHeader();
if ([] === $header) {
$header = $tabularData->nth(0);
}

$nbColumns = count($header);

return match (true) {
-1 === $start,
$start >= $nbColumns => [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => -1,
'columns' => [],
],
null === $end => [
'selection' => $selection,
'start' => 0,
'end' => null,
'length' => -1,
'columns' => [$start],
],
'*' === $end,
$end > ($nbColumns - 1) => [
'selection' => $selection,
'start' => 0,
'end' => null,
'length' => -1,
'columns' => range($start, $nbColumns - 1),
],
default => [
'selection' => $selection,
'start' => 0,
'end' => $end,
'length' => -1,
'columns' => range($start, $end),
],
};
}




private function parseRowColumnSelection(string $selection): array
{
if (1 !== preg_match(self::REGEXP_ROWS_COLUMNS_SELECTION, $selection, $found)) {
return [-1, 0];
}

$start = $found['start'];
$end = $found['end'] ?? null;
$start = filter_var($start, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if (false === $start) {
return [-1, 0];
}
--$start;

if (null === $end || '*' === $end) {
return [$start, $end];
}

$end = filter_var($end, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if (false === $end) {
return [-1, 0];
}
--$end;

if ($end <= $start) {
return [-1, 0];
}

return [$start, $end];
}




private function parseCellSelection(string $selection, TabularData $tabularData): array
{
if (1 !== preg_match(self::REGEXP_CELLS_SELECTION, $selection, $found)) {
return [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => 1,
'columns' => [],
];
}

$cellStartRow = filter_var($found['csr'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
$cellStartCol = filter_var($found['csc'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if (false === $cellStartRow || false === $cellStartCol) {
return [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => 1,
'columns' => [],
];
}

--$cellStartRow;
--$cellStartCol;

$header = $tabularData->getHeader();
if ([] === $header) {
$header = $tabularData->nth(0);
}

$nbColumns = count($header);

if ($cellStartCol > $nbColumns - 1) {
return [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => 1,
'columns' => [],
];
}

$cellEnd = $found['end'] ?? null;
if (null === $cellEnd) {
return [
'selection' => $selection,
'start' => $cellStartRow,
'end' => null,
'length' => 1,
'columns' => [$cellStartCol],
];
}

if ('*' === $cellEnd) {
return [
'selection' => $selection,
'start' => $cellStartRow,
'end' => null,
'length' => -1,
'columns' => range($cellStartCol, $nbColumns - 1),
];
}

$cellEndRow = filter_var($found['cer'] ?? '', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
$cellEndCol = filter_var($found['cec'] ?? '', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);

if (false === $cellEndRow || false === $cellEndCol) {
return [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => 1,
'columns' => [],
];
}

--$cellEndRow;
--$cellEndCol;

if ($cellEndRow < $cellStartRow || $cellEndCol < $cellStartCol) {
return [
'selection' => $selection,
'start' => -1,
'end' => null,
'length' => 1,
'columns' => [],
];
}

return [
'selection' => $selection,
'start' => $cellStartRow,
'end' => $cellEndRow,
'length' => $cellEndRow - $cellStartRow + 1,
'columns' => range($cellStartCol, ($cellEndCol > $nbColumns - 1) ? $nbColumns - 1 : $cellEndCol),
];
}










#[Deprecated(message:'use League\Csv\FragmentFinder::__construct()', since:'league/csv:9.22.0')]
public static function create(): self
{
return new self();
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use Throwable;

use function array_count_values;
use function array_filter;
use function array_keys;




class SyntaxError extends Exception
{



protected array $duplicateColumnNames = [];






public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}

public static function dueToHeaderNotFound(int $offset): self
{
return new self('The header record does not exist or is empty at offset: `'.$offset.'`');
}

public static function dueToInvalidHeaderColumnNames(): self
{
return new self('The header record contains non string colum names.');
}

public static function dueToDuplicateHeaderColumnNames(array $header): self
{
$instance = new self('The header record contains duplicate column names.');
$instance->duplicateColumnNames = array_keys(array_filter(array_count_values($header), fn (int $value): bool => $value > 1));

return $instance;
}

public function duplicateColumnNames(): array
{
return $this->duplicateColumnNames;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use function count;




class ColumnConsistency
{



public function __construct(
protected int $columns_count = -1
) {
$this->columns_count >= -1 || throw InvalidArgument::dueToInvalidColumnCount($this->columns_count, __METHOD__);
}




public function getColumnCount(): int
{
return $this->columns_count;
}




public function __invoke(array $record): bool
{
$count = count($record);
if (-1 === $this->columns_count) {
$this->columns_count = $count;

return true;
}

return $count === $this->columns_count;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use ArrayIterator;
use CallbackFilterIterator;
use Closure;
use Deprecated;
use Iterator;
use OutOfBoundsException;
use ReflectionException;
use ReflectionFunction;

use function array_key_exists;
use function array_reduce;
use function array_search;
use function array_values;
use function is_string;

/**
@phpstan-import-type
@phpstan-import-type


*/
class Statement
{
final protected const COLUMN_ALL = 0;
final protected const COLUMN_INCLUDE = 1;
final protected const COLUMN_EXCLUDE = 2;


protected array $where = [];

protected array $order_by = [];

protected int $offset = 0;

protected int $limit = -1;

protected array $select = [];

protected int $select_mode = self::COLUMN_ALL;




public function select(string|int ...$columns): self
{
if ($columns === $this->select && self::COLUMN_INCLUDE === $this->select_mode) {
return $this;
}

$clone = clone $this;
$clone->select = $columns;
$clone->select_mode = [] === $columns ? self::COLUMN_ALL : self::COLUMN_INCLUDE;

return $clone;
}




public function selectAllExcept(string|int ...$columns): self
{
if ($columns === $this->select && self::COLUMN_EXCLUDE === $this->select_mode) {
return $this;
}

$clone = clone $this;
$clone->select = $columns;
$clone->select_mode = [] === $columns ? self::COLUMN_ALL : self::COLUMN_EXCLUDE;

return $clone;
}









public function where(callable $where): self
{
$where = self::wrapSingleArgumentCallable($where);

$clone = clone $this;
$clone->where[] = $where;

return $clone;
}












final protected static function wrapSingleArgumentCallable(callable $where): callable
{
if ($where instanceof Query\Predicate) {
return $where;
}

$reflection = new ReflectionFunction($where instanceof Closure ? $where : $where(...));

return match ($reflection->getNumberOfRequiredParameters()) {
0 => throw new InvalidArgument('The where condition must be callable with 2 required parameters.'),
1 => fn (mixed $record, int $key) => $where($record),
default => $where,
};
}

public function andWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('and', Query\Constraint\Column::filterOn($column, $operator, $value));
}

public function orWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('or', Query\Constraint\Column::filterOn($column, $operator, $value));
}

public function whereNot(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('not', Query\Constraint\Column::filterOn($column, $operator, $value));
}

public function xorWhere(string|int $column, Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('xor', Query\Constraint\Column::filterOn($column, $operator, $value));
}

public function andWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self
{
return $this->appendWhere('and', Query\Constraint\TwoColumns::filterOn($first, $operator, $second));
}

public function orWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self
{
return $this->appendWhere('or', Query\Constraint\TwoColumns::filterOn($first, $operator, $second));
}

public function xorWhereColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self
{
return $this->appendWhere('xor', Query\Constraint\TwoColumns::filterOn($first, $operator, $second));
}

public function whereNotColumn(string|int $first, Query\Constraint\Comparison|callable|string $operator, array|int|string $second): self
{
return $this->appendWhere('not', Query\Constraint\TwoColumns::filterOn($first, $operator, $second));
}

public function andWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('and', Query\Constraint\Offset::filterOn($operator, $value));
}

public function orWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('or', Query\Constraint\Offset::filterOn($operator, $value));
}

public function xorWhereOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('xor', Query\Constraint\Offset::filterOn($operator, $value));
}

public function whereNotOffset(Query\Constraint\Comparison|Closure|callable|string $operator, mixed $value = null): self
{
return $this->appendWhere('not', Query\Constraint\Offset::filterOn($operator, $value));
}




final protected function appendWhere(string $joiner, Query\Predicate $predicate): self
{
if ([] === $this->where) {
return $this->where(match ($joiner) {
'and' => $predicate,
'not' => Query\Constraint\Criteria::none($predicate),
'or' => Query\Constraint\Criteria::any($predicate),
'xor' => Query\Constraint\Criteria::xany($predicate),
});
}

$predicates = Query\Constraint\Criteria::all(...$this->where);

$clone = clone $this;
$clone->where = [match ($joiner) {
'and' => $predicates->and($predicate),
'not' => $predicates->not($predicate),
'or' => $predicates->or($predicate),
'xor' => $predicates->xor($predicate),
}];

return $clone;
}






public function orderBy(callable|Query\Sort|Closure $order_by): self
{
$clone = clone $this;
$clone->order_by[] = $order_by;

return $clone;
}






public function orderByAsc(string|int $column, callable|Closure|null $callback = null): self
{
return $this->orderBy(Query\Ordering\Column::sortOn($column, 'asc', $callback));
}






public function orderByDesc(string|int $column, callable|Closure|null $callback = null): self
{
return $this->orderBy(Query\Ordering\Column::sortOn($column, 'desc', $callback));
}






public function offset(int $offset): self
{
if (0 > $offset) {
throw InvalidArgument::dueToInvalidRecordOffset($offset, __METHOD__);
}

if ($offset === $this->offset) {
return $this;
}

$clone = clone $this;
$clone->offset = $offset;

return $clone;
}






public function limit(int $limit): self
{
$limit >= -1 || throw InvalidArgument::dueToInvalidLimit($limit, __METHOD__);
if ($limit === $this->limit) {
return $this;
}

$clone = clone $this;
$clone->limit = $limit;

return $clone;
}








public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self
{
if (!is_bool($condition)) {
$condition = $condition($this);
}

return match (true) {
$condition => $onSuccess($this),
null !== $onFail => $onFail($this),
default => $this,
} ?? $this;
}









public function process(TabularData|TabularDataProvider $tabular_data, array $header = []): TabularDataReader
{
if ($tabular_data instanceof TabularDataProvider) {
$tabular_data = $tabular_data->getTabularData();
}

if ([] === $header) {
$header = $tabular_data->getHeader();
}

$iterator = $tabular_data->getRecords($header);
if ([] !== $this->where) {
$iterator = Query\Constraint\Criteria::all(...$this->where)->filter($iterator);
}

if ([] !== $this->order_by) {
$iterator = Query\Ordering\MultiSort::all(...$this->order_by)->sort($iterator);
}

if (0 !== $this->offset || -1 !== $this->limit) {
$iterator = (new Query\Limit($this->offset, $this->limit))->slice($iterator);
}

$iterator = new ResultSet($iterator, $header);

return match ($this->select_mode) {
self::COLUMN_EXCLUDE => $iterator->selectAllExcept(...$this->select),
self::COLUMN_INCLUDE => $iterator->select(...$this->select),
default => $iterator,
};
}










#[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')]
protected function applySelect(Iterator $records, array $recordsHeader, array $select): TabularDataReader
{
$hasHeader = [] !== $recordsHeader;
$selectColumn = function (array $header, string|int $field) use ($recordsHeader, $hasHeader): array {
if (is_string($field)) {
$index = array_search($field, $recordsHeader, true);
if (false === $index) {
throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__);
}

$header[$index] = $field;

return $header;
}

if ($hasHeader && !array_key_exists($field, $recordsHeader)) {
throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__);
}

$header[$field] = $recordsHeader[$field] ?? $field;

return $header;
};


$header = array_reduce($select, $selectColumn, []);
$callback = function (array $record) use ($header): array {
$element = [];
$row = array_values($record);
foreach ($header as $offset => $headerName) {
$element[$headerName] = $row[$offset] ?? null;
}

return $element;
};

return new ResultSet(new MapIterator($records, $callback), $hasHeader ? $header : []);
}










#[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::applyFilter() instead', since:'league/csv:9.15.0')]
protected function filter(Iterator $iterator, callable $callable): CallbackFilterIterator
{
return new CallbackFilterIterator($iterator, $callable);
}










#[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')]
protected function applyFilter(Iterator $iterator): Iterator
{
$filter = function (array $record, string|int $key): bool {
foreach ($this->where as $where) {
if (true !== $where($record, $key)) {
return false;
}
}

return true;
};

return new CallbackFilterIterator($iterator, $filter);
}










#[Deprecated(message:'this method no longer affects on the outcome of the class, use League\Csv\Statement::process() instead', since:'league/csv:9.16.0')]
protected function buildOrderBy(Iterator $iterator): Iterator
{
if ([] === $this->order_by) {
return $iterator;
}

$compare = function (array $record_a, array $record_b): int {
foreach ($this->order_by as $callable) {
if (0 !== ($cmp = $callable($record_a, $record_b))) {
return $cmp;
}
}

return $cmp ?? 0;
};

$class = new class () extends ArrayIterator {
public function seek(int $offset): void
{
try {
parent::seek($offset);
} catch (OutOfBoundsException) {
return;
}
}
};


$it = new $class([...$iterator]);
$it->uasort($compare);

return $it;
}

















#[Deprecated(message:'use League\Csv\Statement::__construct() instead', since:'league/csv:9.22.0')]
public static function create(?callable $where = null, int $offset = 0, int $limit = -1): self
{
$stmt = new self();
if (null !== $where) {
$stmt = $stmt->where($where);
}

if (0 !== $offset) {
$stmt = $stmt->offset($offset);
}

if (-1 !== $limit) {
$stmt = $stmt->limit($limit);
}

return $stmt;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use Deprecated;
use Dom\Element;
use Dom\XMLDocument;
use DOMDocument;
use DOMElement;
use DOMException;
use Exception;
use RuntimeException;
use Throwable;
use ValueError;

use function class_exists;
use function extension_loaded;
use function in_array;
use function is_bool;
use function strtolower;
use function strtoupper;




class XMLConverter
{

protected string $root_name = 'csv';

protected string $record_name = 'row';

protected ?string $field_name = 'cell';

protected string $column_attr = '';

protected string $offset_attr = '';

protected ?Closure $formatter = null;






private static function newXmlDocument(string $xml_class): DOMDocument|XMLDocument
{
return match (true) {
!extension_loaded('dom') => throw new RuntimeException('The DOM extension is not loaded.'),
!in_array($xml_class, [XMLDocument::class , DOMDocument::class], true) => throw new ValueError('The xml class is invalid.'),
XMLDocument::class === $xml_class && class_exists(XMLDocument::class) => XMLDocument::createEmpty(),
default => new DOMDocument(encoding: 'UTF-8'),
};
}

public static function supportsHeader(array $header): bool
{
$document = self::newXmlDocument(XMLDocument::class);
foreach ($header as $header_value) {
try {
$document->createElement($header_value);
} catch (Throwable) {
return false;
}
}

return [] !== $header;
}

public function __construct()
{
}






public function rootElement(string $node_name): self
{
$clone = clone $this;
$clone->root_name = (string) $this->filterElementName($node_name);

return $clone;
}






public function recordElement(string $node_name, string $record_offset_attribute_name = ''): self
{
$clone = clone $this;
$clone->record_name = (string) $this->filterElementName($node_name);
$clone->offset_attr = $this->filterAttributeName($record_offset_attribute_name);

return $clone;
}






public function fieldElement(?string $node_name, string $fieldname_attribute_name = ''): self
{
$clone = clone $this;
$clone->field_name = $this->filterElementName($node_name);
$clone->column_attr = $this->filterAttributeName($fieldname_attribute_name);

return $clone;
}






public function formatter(?callable $formatter): self
{
$clone = clone $this;
$clone->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...);

return $clone;
}








public function download(TabularDataProvider|TabularData|iterable $records, ?string $filename = null, string $encoding = 'utf-8', bool $formatOutput = false): int|false
{

$document = self::newXmlDocument(XMLDocument::class);
$document->appendChild($this->import($records, $document));
if (null !== $filename) {
HttpHeaders::forFileDownload($filename, 'application/xml; charset='.strtolower($encoding));
}

$document->formatOutput = $formatOutput;
if ($document instanceof DOMDocument) {
$document->encoding = strtoupper($encoding);

return $document->save('php://output');
}

return $document->saveXmlFile('php://output');
}






public function import(TabularDataProvider|TabularData|iterable $records, DOMDocument|XMLDocument $doc): DOMElement|Element
{
if ($records instanceof TabularDataProvider) {
$records = $records->getTabularData();
}

if ($records instanceof TabularData) {
$records = $records->getRecords();
}

if (null !== $this->formatter) {
$records = MapIterator::fromIterable($records, $this->formatter);
}

$root = $doc->createElement($this->root_name);
foreach ($records as $offset => $record) {
$root->appendChild($this->recordToElement($doc, $record, $offset));
}

return $root;
}





protected function recordToElement(DOMDocument|XMLDocument $document, array $record, int $offset): DOMElement|Element
{
$node = $document->createElement($this->record_name);
foreach ($record as $node_name => $value) {
$node->appendChild($this->fieldToElement($document, (string) $value, $node_name));
}

if ('' !== $this->offset_attr) {
$node->setAttribute($this->offset_attr, (string) $offset);
}

return $node;
}







protected function fieldToElement(DOMDocument|XMLDocument $document, string $value, int|string $node_name): DOMElement|Element
{
$node_name = (string) $node_name;
$item = $document->createElement($this->field_name ?? $node_name);
$item->appendChild($document->createTextNode($value));

if ('' !== $this->column_attr) {
$item->setAttribute($this->column_attr, $node_name);
}

return $item;
}








public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self
{
if (!is_bool($condition)) {
$condition = $condition($this);
}

return match (true) {
$condition => $onSuccess($this),
null !== $onFail => $onFail($this),
default => $this,
} ?? $this;
}






protected function filterElementName(?string $value): ?string
{
if (null === $value) {
return null;
}

return self::newXmlDocument(XMLDocument::class)->createElement($value)->tagName;
}








protected function filterAttributeName(string $value): string
{
if ('' === $value) {
return $value;
}

$element = self::newXmlDocument(XMLDocument::class)->createElement('foo');
$element->setAttribute($value, 'foo');

return $value;
}










#[Deprecated(message:'use League\Csv\XMLConverter::impoprt()', since:'league/csv:9.22.0')]
public function convert(TabularDataProvider|TabularData|iterable $records): DOMDocument
{
$document = new DOMDocument(encoding: 'UTF-8');
$document->appendChild($this->import($records, $document));

return $document;
}










#[Deprecated(message:'use League\Csv\XMLConverter::__construct()', since:'league/csv:9.22.0')]
public static function create(): self
{
return new self();
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use OutOfRangeException;
use php_user_filter;
use RuntimeException;
use Throwable;
use TypeError;

use function array_map;
use function array_reduce;
use function get_resource_type;
use function gettype;
use function in_array;
use function is_numeric;
use function is_resource;
use function mb_convert_encoding;
use function mb_list_encodings;
use function preg_match;
use function sprintf;
use function stream_bucket_append;
use function stream_bucket_make_writeable;
use function stream_bucket_new;
use function stream_filter_register;
use function stream_get_filters;
use function strtolower;
use function substr;

use const PSFS_ERR_FATAL;
use const PSFS_FEED_ME;
use const PSFS_PASS_ON;
use const STREAM_FILTER_READ;
use const STREAM_FILTER_WRITE;




class CharsetConverter extends php_user_filter
{
public const FILTERNAME = 'convert.league.csv';
public const BOM_SEQUENCE = 'bom_sequence';
public const SKIP_BOM_SEQUENCE = 'skip_bom_sequence';

protected string $input_encoding = 'UTF-8';
protected string $output_encoding = 'UTF-8';
protected bool $skipBomSequence = false;
protected string $buffer = '';




public static function register(): void
{
$filter_name = self::FILTERNAME.'.*';

in_array($filter_name, stream_get_filters(), true) || stream_filter_register($filter_name, self::class);
}




public static function addTo(AbstractCsv $csv, string $input_encoding, string $output_encoding, ?array $params = null): AbstractCsv
{
self::register();

if ($csv instanceof Reader) {
return $csv->appendStreamFilterOnRead(self::getFiltername($input_encoding, $output_encoding), $params);
}

return $csv->appendStreamFilterOnWrite(self::getFiltername($input_encoding, $output_encoding), $params);
}









public static function appendOnReadTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::appendFilter($stream, STREAM_FILTER_READ, $input_encoding, $output_encoding);
}









public static function appendOnWriteTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::appendFilter($stream, STREAM_FILTER_WRITE, $input_encoding, $output_encoding);
}









public static function prependOnReadTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::prependFilter($stream, STREAM_FILTER_READ, $input_encoding, $output_encoding);
}









public static function prependOnWriteTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::prependFilter($stream, STREAM_FILTER_WRITE, $input_encoding, $output_encoding);
}








final protected static function appendFilter(mixed $stream, int $mode, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
self::register();
$filtername = self::getFiltername($input_encoding, $output_encoding);


$filter = Warning::cloak(stream_filter_append(...), self::filterStream($stream), $filtername, $mode);
is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.$filtername);

return $filter;
}








final protected static function prependFilter(mixed $stream, int $mode, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
self::register();
$filtername = self::getFiltername($input_encoding, $output_encoding);


$filter = Warning::cloak(stream_filter_prepend(...), self::filterStream($stream), $filtername, $mode);
is_resource($filter) || throw new RuntimeException('Could not append the registered stream filter: '.$filtername);

return $filter;
}








final protected static function filterStream(mixed $stream): mixed
{
is_resource($stream) || throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.');
'stream' === ($type = get_resource_type($stream)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given');

return $stream;
}




public static function getFiltername(string $input_encoding, string $output_encoding): string
{
return sprintf(
'%s.%s/%s',
self::FILTERNAME,
self::filterEncoding($input_encoding),
self::filterEncoding($output_encoding)
);
}






final protected static function filterEncoding(string $encoding): string
{
static $encoding_list;

$encoding_list ??= array_reduce(mb_list_encodings(), fn (array $list, string $encoding): array => [...$list, ...[strtolower($encoding) => $encoding]], []);

return $encoding_list[strtolower($encoding)] ?? throw new OutOfRangeException('The submitted charset '.$encoding.' is not supported by the mbstring extension.');
}

public function onCreate(): bool
{
$prefix = self::FILTERNAME.'.';
if (!str_starts_with($this->filtername, $prefix)) {
return false;
}

$encodings = substr($this->filtername, strlen($prefix));
if (1 !== preg_match(',^(?<input>[-\w]+)/(?<output>[-\w]+)$,', $encodings, $matches)) {
return false;
}

try {
$this->input_encoding = self::filterEncoding($matches['input']);
$this->output_encoding = self::filterEncoding($matches['output']);
$this->skipBomSequence = is_array($this->params)
&& isset($this->params[self::BOM_SEQUENCE])
&& self::SKIP_BOM_SEQUENCE === $this->params[self::BOM_SEQUENCE];
} catch (OutOfRangeException) {
return false;
}

return true;
}

public function filter($in, $out, &$consumed, bool $closing): int
{
$inputBuffer = $this->buffer;
while (null !== ($bucket = stream_bucket_make_writeable($in))) {
$inputBuffer .= $bucket->data;
$consumed += $bucket->datalen;
}

if ('' === $inputBuffer && !$closing) {
return PSFS_FEED_ME;
}

if ($this->skipBomSequence && null !== ($bom = Bom::tryFromSequence($inputBuffer))) {
$inputBuffer = substr($inputBuffer, $bom->length());
}



if (!mb_check_encoding($inputBuffer, $this->input_encoding) && !$closing) {
$this->buffer = $inputBuffer;

return PSFS_FEED_ME;
}

try {
Warning::cloak(function () use ($inputBuffer, $out) {
$outputBuffer = (string) mb_convert_encoding($inputBuffer, $this->output_encoding, $this->input_encoding);
$streamBucket = stream_bucket_new($this->stream, $outputBuffer);

stream_bucket_append($out, $streamBucket);
});
return PSFS_PASS_ON;
} catch (Throwable) {
return PSFS_ERR_FATAL;
} finally {
$this->buffer = '';
}
}




public function convert(iterable $records): iterable
{
return match (true) {
$this->output_encoding === $this->input_encoding => $records,
is_array($records) => array_map($this, $records),
default => MapIterator::fromIterable($records, $this),
};
}




public function __invoke(array $record): array
{
$outputRecord = [];
foreach ($record as $offset => $value) {
[$newOffset, $newValue] = $this->encodeField($value, $offset);
$outputRecord[$newOffset] = $newValue;
}

return $outputRecord;
}




final protected function encodeField(int|float|string|null $value, int|string $offset): array
{
if (null !== $value && !is_numeric($value)) {
$value = mb_convert_encoding($value, $this->output_encoding, $this->input_encoding);
}

if (!is_numeric($offset)) {
$offset = mb_convert_encoding($offset, $this->output_encoding, $this->input_encoding);
}

return [$offset, $value];
}




public function inputEncoding(string $encoding): self
{
$encoding = self::filterEncoding($encoding);
if ($encoding === $this->input_encoding) {
return $this;
}

$clone = clone $this;
$clone->input_encoding = $encoding;

return $clone;
}




public function outputEncoding(string $encoding): self
{
$encoding = self::filterEncoding($encoding);
if ($encoding === $this->output_encoding) {
return $this;
}

$clone = clone $this;
$clone->output_encoding = $encoding;

return $clone;
}
















#[Deprecated(message:'use League\Csv\CharserConverter::appendOnReadTo() or League\Csv\CharserConverter::appendOnWriteTo() instead', since:'league/csv:9.22.0')]
public static function appendTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::appendFilter($stream, 0, $input_encoding, $output_encoding);
}
















#[Deprecated(message:'use League\Csv\CharserConverter::prependOnReadTo() or League\Csv\CharserConverter::prependOnWriteTo() instead', since:'league/csv:9.22.0')]
public static function prependTo(mixed $stream, string $input_encoding = 'UTF-8', string $output_encoding = 'UTF-8'): mixed
{
return self::prependFilter($stream, 0, $input_encoding, $output_encoding);
}




public static function addBOMSkippingTo(Reader $document, string $output_encoding = 'UTF-8'): Reader
{
self::register();

$document->appendStreamFilterOnRead(
self::getFiltername((Bom::tryFrom($document->getInputBOM()) ?? Bom::Utf8)->encoding(), $output_encoding),
[self::BOM_SEQUENCE => self::SKIP_BOM_SEQUENCE]
);

return $document;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Exception as PhpException;




class Exception extends PhpException implements UnableToProcessCsv
{
}
<?php










declare(strict_types=1);

namespace League\Csv;

use RuntimeException;

final class FragmentNotFound extends RuntimeException implements UnableToProcessCsv
{
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use Deprecated;

use function array_map;
use function array_reduce;
use function implode;
use function str_replace;

use const STREAM_FILTER_WRITE;




class Writer extends AbstractCsv implements TabularDataWriter
{
protected const ENCLOSE_ALL = 1;
protected const ENCLOSE_NECESSARY = 0;
protected const ENCLOSE_NONE = -1;

protected const STREAM_FILTER_MODE = STREAM_FILTER_WRITE;

protected array $validators = [];
protected string $newline = "\n";
protected int $flush_counter = 0;
protected ?int $flush_threshold = null;
protected int $enclose_all = self::ENCLOSE_NECESSARY;

protected array $enclosure_replace = [[], []];

protected function resetProperties(): void
{
parent::resetProperties();

$this->enclosure_replace = [
[$this->enclosure, $this->escape.$this->enclosure.$this->enclosure],
[$this->enclosure.$this->enclosure, $this->escape.$this->enclosure],
];
}

protected function insertRecord(array $record): int|false
{
return match ($this->enclose_all) {
self::ENCLOSE_ALL => $this->document->fwrite(implode(
$this->delimiter,
array_map(
fn ($content) => $this->enclosure.$content.$this->enclosure,
str_replace($this->enclosure_replace[0], $this->enclosure_replace[1], $record)
)
).$this->newline),
self::ENCLOSE_NONE => $this->document->fwrite(implode($this->delimiter, $record).$this->newline),
default => $this->document->fputcsv($record, $this->delimiter, $this->enclosure, $this->escape, $this->newline),
};
}




public function getEndOfLine(): string
{
return $this->newline;
}




public function getFlushThreshold(): ?int
{
return $this->flush_threshold;
}




public function encloseAll(): bool
{
return self::ENCLOSE_ALL === $this->enclose_all;
}





public function encloseNecessary(): bool
{
return self::ENCLOSE_NECESSARY === $this->enclose_all;
}




public function encloseNone(): bool
{
return self::ENCLOSE_NONE === $this->enclose_all;
}








public function insertAll(TabularDataProvider|TabularData|iterable $records): int
{
if ($records instanceof TabularDataProvider) {
$records = $records->getTabularData();
}

if ($records instanceof TabularData) {
$records = $records->getRecords();
}

$bytes = 0;
foreach ($records as $record) {
$bytes += $this->insertOne($record);
}

$this->flush_counter = 0;
$this->document->fflush();

return $bytes;
}










public function insertOne(array $record): int
{
$record = array_reduce($this->formatters, fn (array $record, callable $formatter): array => $formatter($record), $record);
$this->validateRecord($record);

$bytes = Warning::cloak($this->insertRecord(...), $record);
if (false === $bytes) {
throw CannotInsertRecord::triggerOnInsertion($record);
}

if (null === $this->flush_threshold) {
return $bytes;
}

++$this->flush_counter;
if (0 === $this->flush_counter % $this->flush_threshold) {
$this->flush_counter = 0;
$this->document->fflush();
}

return $bytes;
}






protected function validateRecord(array $record): void
{
foreach ($this->validators as $name => $validator) {
true === $validator($record) || throw CannotInsertRecord::triggerOnValidation($name, $record);
}
}






public function addValidator(callable $validator, string $validator_name): self
{
$this->validators[$validator_name] = !$validator instanceof Closure ? $validator(...) : $validator;

return $this;
}




public function setEndOfLine(string $endOfLine): self
{
$this->newline = $endOfLine;

return $this;
}






public function setFlushThreshold(?int $threshold): self
{
if ($threshold === $this->flush_threshold) {
return $this;
}

null === $threshold || 1 <= $threshold || throw InvalidArgument::dueToInvalidThreshold($threshold, __METHOD__);

$this->flush_threshold = $threshold;
$this->flush_counter = 0;
$this->document->fflush();

return $this;
}

public function necessaryEnclosure(): self
{
$this->enclose_all = self::ENCLOSE_NECESSARY;
$this->resetProperties();

return $this;
}

public function forceEnclosure(): self
{
$this->enclose_all = self::ENCLOSE_ALL;
$this->resetProperties();

return $this;
}

public function noEnclosure(): self
{
$this->enclose_all = self::ENCLOSE_NONE;
$this->resetProperties();

return $this;
}














#[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.8.0')]
protected function formatRecord(array $record, callable $formatter): array
{
return $formatter($record);
}











#[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.9.0')]
protected function addRecord(array $record): int|false
{
return $this->document->fputcsv($record, $this->delimiter, $this->enclosure, $this->escape, $this->newline);
}









#[Deprecated(message:'no longer affecting the class behaviour', since:'league/csv:9.9.0')]
protected function consolidate(): int
{
if (null === $this->flush_threshold) {
return 0;
}

++$this->flush_counter;
if (0 === $this->flush_counter % $this->flush_threshold) {
$this->flush_counter = 0;
$this->document->fflush();
}

return 0;
}










#[Deprecated(message:'use League\Csv\Writer::getEndOfLine()', since:'league/csv:9.10.0')]
public function getNewline(): string
{
return $this->getEndOfLine();
}










#[Deprecated(message:'use League\Csv\Writer::setEndOfLine()', since:'league/csv:9.10.0')]
public function setNewline(string $newline): self
{
return $this->setEndOfLine($newline);
}










#[Deprecated(message:'use League\Csv\Writer::necessaryEnclosure()', since:'league/csv:9.22.0')]
public function relaxEnclosure(): self
{
return $this->necessaryEnclosure();
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use InvalidArgumentException;
use Stringable;

use function array_fill_keys;
use function array_keys;
use function array_map;
use function is_string;






class EscapeFormula
{

public const FORMULA_STARTING_CHARS = ['=', '-', '+', '@', "\t", "\r"];


protected array $special_chars = [];





public function __construct(
protected string $escape = "'",
array $special_chars = []
) {
$this->special_chars = array_fill_keys([
...self::FORMULA_STARTING_CHARS,
...$this->filterSpecialCharacters(...$special_chars),
], 1);
}








protected function filterSpecialCharacters(string ...$characters): array
{
foreach ($characters as $str) {
1 === strlen($str) || throw new InvalidArgumentException('The submitted string '.$str.' must be a single character');
}

return $characters;
}






public function getSpecialCharacters(): array
{
return array_keys($this->special_chars);
}




public function getEscape(): string
{
return $this->escape;
}




public function escapeRecord(array $record): array
{
return array_map($this->escapeField(...), $record);
}

public function unescapeRecord(array $record): array
{
return array_map($this->unescapeField(...), $record);
}




protected function escapeField(mixed $cell): mixed
{
$strOrNull = match (true) {
is_string($cell) => $cell,
$cell instanceof Stringable => (string) $cell,
default => null,
};

return match (true) {
null == $strOrNull,
!isset($strOrNull[0], $this->special_chars[$strOrNull[0]]) => $cell,
default => $this->escape.$strOrNull,
};
}

protected function unescapeField(mixed $cell): mixed
{
$strOrNull = match (true) {
is_string($cell) => $cell,
$cell instanceof Stringable => (string) $cell,
default => null,
};

return match (true) {
null === $strOrNull,
!isset($strOrNull[0], $strOrNull[1]),
$strOrNull[0] !== $this->escape,
!isset($this->special_chars[$strOrNull[1]]) => $cell,
default => substr($strOrNull, 1),
};
}









protected function isStringable(mixed $value): bool
{
return is_string($value) || $value instanceof Stringable;
}









#[Deprecated(message:'use League\Csv\EscapeFormula::escapeRecord() instead', since:'league/csv:9.11.0')]
public function __invoke(array $record): array
{
return $this->escapeRecord($record);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Iterator;











interface TabularData
{








public function getHeader(): array;

















public function getRecords(array $header = []): Iterator;












public function fetchColumn(string|int $index = 0): Iterator;
}
<?php










declare(strict_types=1);

namespace League\Csv;

use CallbackFilterIterator;
use Closure;
use Deprecated;
use Iterator;
use JsonSerializable;
use League\Csv\Serializer\Denormalizer;
use League\Csv\Serializer\MappingFailed;
use League\Csv\Serializer\TypeCastingFailed;
use ReflectionException;
use SplFileObject;

use function array_filter;
use function array_reduce;
use function array_unique;
use function is_array;
use function iterator_count;
use function strlen;
use function substr;

use const PHP_INT_MAX;
use const STREAM_FILTER_READ;

/**
@template


*/
class Reader extends AbstractCsv implements TabularDataReader, JsonSerializable
{
protected const STREAM_FILTER_MODE = STREAM_FILTER_READ;

protected ?int $header_offset = null;
protected int $nb_records = -1;
protected bool $is_empty_records_included = false;

protected array $header = [];

public static function from($filename, string $mode = 'r', $context = null): static
{
return parent::from($filename, $mode, $context);
}











public function setHeaderOffset(?int $offset): static
{
if ($offset === $this->header_offset) {
return $this;
}

null === $offset || -1 < $offset || throw InvalidArgument::dueToInvalidHeaderOffset($offset, __METHOD__);

$this->header_offset = $offset;
$this->resetProperties();

return $this;
}




public function skipEmptyRecords(): static
{
if ($this->is_empty_records_included) {
$this->is_empty_records_included = false;
$this->nb_records = -1;
}

return $this;
}




public function includeEmptyRecords(): static
{
if (!$this->is_empty_records_included) {
$this->is_empty_records_included = true;
$this->nb_records = -1;
}

return $this;
}




public function isEmptyRecordsIncluded(): bool
{
return $this->is_empty_records_included;
}

protected function resetProperties(): void
{
parent::resetProperties();

$this->nb_records = -1;
$this->header = [];
}




public function getHeaderOffset(): ?int
{
return $this->header_offset;
}






public function getHeader(): array
{
return match (true) {
null === $this->header_offset,
[] !== $this->header => $this->header,
default => ($this->header = $this->setHeader($this->header_offset)),
};
}








protected function setHeader(int $offset): array
{
$inputBom = null;
$header = $this->seekRow($offset);
if (0 === $offset) {
$inputBom = Bom::tryFrom($this->getInputBOM());
$header = $this->removeBOM(
$header,
!$this->is_input_bom_included ? $inputBom?->length() ?? 0 : 0,
$this->enclosure
);
}

return match (true) {
[] === $header,
[null] === $header,
[false] === $header,
[''] === $header && 0 === $offset && null !== $inputBom => throw SyntaxError::dueToHeaderNotFound($offset),
default => $header,
};
}






protected function seekRow(int $offset): array
{
$this->getDocument()->seek($offset);
$record = $this->document->current();

return match (true) {
false === $record => [],
default => (array) $record,
};
}






protected function getDocument(): SplFileObject|Stream
{
$this->document->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD);
$this->document->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
$this->document->rewind();

return $this->document;
}








protected function removeBOM(array $record, int $bom_length, string $enclosure): array
{
if ([] === $record || !is_string($record[0]) || 0 === $bom_length || strlen($record[0]) < $bom_length) {
return $record;
}

$record[0] = substr($record[0], $bom_length);
if ($enclosure.$enclosure !== substr($record[0].$record[0], strlen($record[0]) - 1, 2)) {
return $record;
}

$record[0] = substr($record[0], 1, -1);

return $record;
}

public function fetchColumn(string|int $index = 0): Iterator
{
return ResultSet::from($this)->fetchColumn($index);
}

public function value(int|string $column = 0): mixed
{
return ResultSet::from($this)->value($column);
}




public function first(): array
{
return ResultSet::from($this)->first();
}

protected function getLastRecord(array $header): array
{
$this->document->setFlags(SplFileObject::READ_CSV);
$this->document->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
$this->document->seek(PHP_INT_MAX);
$offset = $this->document->key();
$row = false;
for (; $offset >= 0; --$offset) {
if ($this->header_offset === $offset) {
continue;
}
$this->document->seek($offset);

$row = $this->document->current();
if ($row !== [null] && false !== $row) {
break;
}
}

if (false === $row || $row === [null]) {
return [];
}

if (0 === $offset) {
$row = $this->removeBOM($row, $this->input_bom?->length() ?? 0, $this->enclosure);
}

$formatter = fn (array $record): array => array_reduce(
$this->formatters,
fn (array $record, Closure $formatter): array => $formatter($record),
$record
);

$record = $row;
if ([] === $header) {
$header = $this->getHeader();
;
}

if ([] !== $header) {
$record = [];
foreach ($header as $index => $headerName) {
$record[$headerName] = $row[$index] ?? null;
}
}

return $formatter($record);
}

public function last(): array
{
return $this->getLastRecord([]);
}






public function lastAsObject(string $className, array $header = []): ?object
{
$lastRecord = $this->getLastRecord($header);
if ([] === $lastRecord) {
return null;
}

return Denormalizer::assign($className, $lastRecord);
}




public function nth(int $nth): array
{
return ResultSet::from($this)->nth($nth);
}






public function nthAsObject(int $nth, string $className, array $header = []): ?object
{
return ResultSet::from($this)->nthAsObject($nth, $className, $header);
}






public function firstAsObject(string $className, array $header = []): ?object
{
return ResultSet::from($this)->firstAsObject($className, $header);
}

public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator
{
return ResultSet::from($this)->fetchPairs($offset_index, $value_index);
}




public function count(): int
{
if (-1 === $this->nb_records) {
$this->nb_records = iterator_count($this->getRecords());
}

return $this->nb_records;
}




public function getIterator(): Iterator
{
return $this->getRecords();
}




public function jsonSerialize(): array
{
return array_values([...$this->getRecords()]);
}




public function each(callable $callback): bool
{
return ResultSet::from($this)->each($callback);
}




public function exists(callable $callback): bool
{
return ResultSet::from($this)->exists($callback);
}

/**
@template





*/
public function reduce(callable $callback, mixed $initial = null): mixed
{
return ResultSet::from($this)->reduce($callback, $initial);
}

/**
@template






*/
public function map(callable $callback): Iterator
{
return MapIterator::fromIterable($this, $callback);
}








public function chunkBy(int $recordsCount): iterable
{
return ResultSet::from($this)->chunkBy($recordsCount);
}




public function mapHeader(array $headers): TabularDataReader
{
return (new Statement())->process($this, $headers);
}







public function filter(Query\Predicate|Closure $predicate): TabularDataReader
{
return (new Statement())->where($predicate)->process($this);
}








public function slice(int $offset, int $length = -1): TabularDataReader
{
return (new Statement())->offset($offset)->limit($length)->process($this);
}







public function sorted(Query\Sort|Closure $orderBy): TabularDataReader
{
return (new Statement())->orderBy($orderBy)->process($this);
}

/**
@experimental







*/
public function matching(string $expression): iterable
{
return (new FragmentFinder())->findAll($expression, $this);
}

/**
@experimental






*/
public function matchingFirst(string $expression): ?TabularDataReader
{
return (new FragmentFinder())->findFirst($expression, $this);
}

/**
@experimental







*/
public function matchingFirstOrFail(string $expression): TabularDataReader
{
return (new FragmentFinder())->findFirstOrFail($expression, $this);
}

public function select(string|int ...$columns): TabularDataReader
{
return ResultSet::from($this)->select(...$columns);
}

public function selectAllExcept(string|int ...$columns): TabularDataReader
{
return ResultSet::from($this)->selectAllExcept(...$columns);
}








public function getRecords(array $header = []): Iterator
{
return $this->combineHeader(
$this->prepareRecords(),
$this->prepareHeader($header)
);
}

/**
@template








*/
public function getRecordsAsObject(string $className, array $header = []): Iterator
{

$header = $this->prepareHeader($header);

return Denormalizer::assignAll(
$className,
$this->combineHeader($this->prepareRecords(), $header),
$header
);
}




protected function prepareRecords(): Iterator
{
$normalized = fn ($record): bool => is_array($record) && ($this->is_empty_records_included || $record !== [null]);
$bom = null;
if (!$this->is_input_bom_included) {
$bom = Bom::tryFrom($this->getInputBOM());
}

$records = $this->stripBOM(new CallbackFilterIterator($this->getDocument(), $normalized), $bom);
if (null !== $this->header_offset) {
$records = new CallbackFilterIterator($records, fn (array $record, int $offset): bool => $offset !== $this->header_offset);
}

if ($this->is_empty_records_included) {
$records = new MapIterator($records, fn (array $record): array => ([null] === $record) ? [] : $record);
}

return $records;
}




protected function stripBOM(Iterator $iterator, ?Bom $bom): Iterator
{
if (null === $bom) {
return $iterator;
}

$bomLength = $bom->length();
$mapper = function (array $record, int $index) use ($bomLength): array {
if (0 !== $index) {
return $record;
}

$record = $this->removeBOM($record, $bomLength, $this->enclosure);

return match ($record) {
[''] => [null],
default => $record,
};
};

return new CallbackFilterIterator(
new MapIterator($iterator, $mapper),
fn (array $record): bool => $this->is_empty_records_included || $record !== [null]
);
}








protected function prepareHeader($header = []): array
{
$header == array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames();

return $this->computeHeader($header);
}










protected function computeHeader(array $header): array
{
if ([] === $header) {
$header = $this->getHeader();
}

return match (true) {
$header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header),
[] !== array_filter(array_keys($header), fn (string|int $value) => !is_int($value) || $value < 0) => throw new SyntaxError('The header mapper indexes should only contain positive integer or 0.'),
default => $header,
};
}

protected function combineHeader(Iterator $iterator, array $header): Iterator
{
$formatter = fn (array $record): array => array_reduce(
$this->formatters,
fn (array $record, Closure $formatter): array => $formatter($record),
$record
);

return match ([]) {
$header => new MapIterator($iterator, $formatter(...)),
default => new MapIterator($iterator, function (array $record) use ($header, $formatter): array {
$assocRecord = [];
foreach ($header as $offset => $headerName) {
$assocRecord[$headerName] = $record[$offset] ?? null;
}

return $formatter($assocRecord);
}),
};
}











#[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')]
public function fetchColumnByName(string $name): Iterator
{
return ResultSet::from($this)->fetchColumnByName($name);
}











#[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')]
public function fetchColumnByOffset(int $offset = 0): Iterator
{
return ResultSet::from($this)->fetchColumnByOffset($offset);
}








#[Deprecated(message:'use League\Csv\Reader::nth() instead', since:'league/csv:9.9.0')]
public function fetchOne(int $nth_record = 0): array
{
return $this->nth($nth_record);
}















#[Deprecated(message:'use League\Csv\Reader::getRecordsAsObject() instead', since:'league/csv:9.15.0')]
public function getObjects(string $className, array $header = []): Iterator
{
return $this->getRecordsAsObject($className, $header);
}













#[Deprecated(message:'use League\Csv\AbstractCsv::from() instead', since:'league/csv:9.27.0')]
public static function createFromPath(string $path, string $open_mode = 'r', $context = null): static
{
return parent::from($path, $open_mode, $context);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use Countable;
use Deprecated;
use Iterator;
use IteratorAggregate;

/**
@template
@template-extends




















*/
interface TabularDataReader extends TabularData, IteratorAggregate, Countable
{













public function getIterator(): Iterator;





public function count(): int;














public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator;














#[Deprecated(message:'use League\Csv\TabularDataReader::nth() instead', since:'league/csv:9.9.0')]
public function fetchOne(int $nth_record = 0): array;
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use Deprecated;
use Dom\HTMLDocument;
use Dom\HTMLElement;
use Dom\XMLDocument;
use DOMDocument;
use DOMElement;
use DOMException;

use function is_bool;
use function preg_match;




class HTMLConverter
{

protected string $class_name = 'table-csv-data';

protected string $id_value = '';

protected ?Closure $formatter = null;
protected string $offset_attr = '';
protected string $column_attr = '';

private static function supportsModernDom(): bool
{
return extension_loaded('dom') && class_exists(HTMLDocument::class);
}

public function __construct()
{
}







public function convert(iterable|TabularData|TabularDataProvider $records, array $header_record = [], array $footer_record = []): string
{
if ($records instanceof TabularDataProvider) {
$records = $records->getTabularData();
}

if ($records instanceof TabularData) {
$records = $records->getRecords();
}

if (null !== $this->formatter) {
$records = MapIterator::fromIterable($records, $this->formatter);
}

$document = self::supportsModernDom() ? HTMLDocument::createEmpty() : new DOMDocument('1.0');
$table = $document->createElement('table');
if ('' !== $this->class_name) {
$table->setAttribute('class', $this->class_name);
}

if ('' !== $this->id_value) {
$table->setAttribute('id', $this->id_value);
}

$this->appendHeaderSection('thead', $header_record, $table);
$this->appendHeaderSection('tfoot', $footer_record, $table);

$tbody = $table;
if ($table->hasChildNodes()) {
$tbody = $document->createElement('tbody');
$table->appendChild($tbody);
}

foreach ($records as $offset => $record) {
$tr = $document->createElement('tr');
if ('' !== $this->offset_attr) {
$tr->setAttribute($this->offset_attr, (string) $offset);
}

foreach ($record as $field_name => $field_value) {
$td = $document->createElement('td');
if ('' !== $this->column_attr) {
$td->setAttribute($this->column_attr, (string) $field_name);
}
$td->appendChild($document->createTextNode((string) $field_value));
$tr->appendChild($td);
}

$tbody->appendChild($tr);
}

$document->appendChild($table);

return (string) $document->saveHTML($table);
}






protected function appendHeaderSection(string $node_name, array $record, DOMElement|HTMLElement $table): void
{
if ([] === $record) {
return;
}


$document = $table->ownerDocument;
$header = $document->createElement($node_name);
$tr = $document->createElement('tr');
foreach ($record as $field_value) {
$th = $document->createElement('th');
$th->setAttribute('scope', 'col');
$th->appendChild($document->createTextNode((string) $field_value));
$tr->appendChild($th);
}

$header->appendChild($tr);
$table->appendChild($header);
}






public function table(string $class_name, string $id_value = ''): self
{
1 !== preg_match(",\s,", $id_value) || throw new DOMException("The id attribute's value must not contain whitespace (spaces, tabs etc.)");

$clone = clone $this;
$clone->class_name = $class_name;
$clone->id_value = $id_value;

return $clone;
}




public function tr(string $record_offset_attribute_name): self
{
if ($record_offset_attribute_name === $this->offset_attr) {
return $this;
}

if (!self::filterAttributeNme($record_offset_attribute_name)) {
throw new DOMException('The submitted attribute name `'.$record_offset_attribute_name.'` is not valid.');
}

$clone = clone $this;
$clone->offset_attr = $record_offset_attribute_name;

return $clone;
}




public function td(string $fieldname_attribute_name): self
{
if ($fieldname_attribute_name === $this->column_attr) {
return $this;
}

if (!self::filterAttributeNme($fieldname_attribute_name)) {
throw new DOMException('The submitted attribute name `'.$fieldname_attribute_name.'` is not valid.');
}

$clone = clone $this;
$clone->column_attr = $fieldname_attribute_name;

return $clone;
}

private static function filterAttributeNme(string $attribute_name): bool
{
try {
$document = self::supportsModernDom() ? XmlDocument::createEmpty() : new DOMDocument('1.0');
$div = $document->createElement('div');
$div->setAttribute($attribute_name, 'foo');

return true;
} catch (DOMException) {
return false;
}
}






public function formatter(?callable $formatter): self
{
$clone = clone $this;
$clone->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...);

return $clone;
}








public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self
{
if (!is_bool($condition)) {
$condition = $condition($this);
}

return match (true) {
$condition => $onSuccess($this),
null !== $onFail => $onFail($this),
default => $this,
} ?? $this;
}










#[Deprecated(message:'use League\Csv\HTMLConverter::__construct()', since:'league/csv:9.22.0')]
public static function create(): self
{
return new self();
}
}
<?php










namespace League\Csv;

use Deprecated;







interface ByteSequence
{
#[Deprecated(message: 'use League\Csv\Bom:Utf8 instead', since: 'league/csv:9.16.0')]
public const BOM_UTF8 = "\xEF\xBB\xBF";
#[Deprecated(message: 'use League\Csv\Bom:Utf16be instead', since: 'league/csv:9.16.0')]
public const BOM_UTF16_BE = "\xFE\xFF";
#[Deprecated(message: 'use League\Csv\Bom:Utf16Le instead', since: 'league/csv:9.16.0')]
public const BOM_UTF16_LE = "\xFF\xFE";
#[Deprecated(message: 'use League\Csv\Bom:Utf32Be instead', since: 'league/csv:9.16.0')]
public const BOM_UTF32_BE = "\x00\x00\xFE\xFF";
#[Deprecated(message: 'use League\Csv\Bom:Utf32Le instead', since: 'league/csv:9.16.0')]
public const BOM_UTF32_LE = "\xFF\xFE\x00\x00";
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Closure;
use LogicException;
use OutOfBoundsException;
use php_user_filter;
use ReflectionException;
use ReflectionFunction;
use RuntimeException;
use Throwable;
use ValueError;

use function array_keys;
use function in_array;
use function stream_bucket_append;
use function stream_bucket_make_writeable;
use function stream_bucket_new;
use function stream_filter_register;
use function stream_get_filters;

use const PSFS_ERR_FATAL;
use const PSFS_FEED_ME;
use const PSFS_PASS_ON;

final class CallbackStreamFilter extends php_user_filter
{

private static array $filters = [];


private ?Closure $callback;

public function onCreate(): bool
{
$this->callback = self::$filters[$this->filtername] ?? null;

return $this->callback instanceof Closure;
}

public function onClose(): void
{
$this->callback = null;
}

public function filter($in, $out, &$consumed, bool $closing): int
{
$data = '';
while (null !== ($bucket = stream_bucket_make_writeable($in))) {
$data .= $bucket->data;
$consumed += $bucket->datalen;
}

if (null === $this->callback) {
return PSFS_FEED_ME;
}

try {
$data = ($this->callback)($data, $this->params);
} catch (Throwable $exception) {
$this->onClose();
trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING);

return PSFS_ERR_FATAL;
}

Warning::cloak(function () use ($out, $data) {
stream_bucket_append($out, stream_bucket_new($this->stream, $data));
});

return PSFS_PASS_ON;
}






public static function register(string $filtername, callable $callback): void
{
if (isset(self::$filters[$filtername]) || in_array($filtername, stream_get_filters(), true)) {
throw new LogicException('The stream filter "'.$filtername.'" is already registered.');
}

$callback = self::normalizeCallback($callback);
if (!stream_filter_register($filtername, self::class)) {
throw new RuntimeException('The stream filter "'.$filtername.'" could not be registered.');
}

self::$filters[$filtername] = $callback;
}








private static function normalizeCallback(callable $callback): Closure
{
if (!$callback instanceof Closure) {
$callback = $callback(...);
}

$reflection = new ReflectionFunction($callback);
if (!$reflection->isInternal()) {
return $callback;
}

if (1 !== $reflection->getNumberOfParameters()) {
throw new ValueError('The PHP function "'.$reflection->getName().'" can not be used directly; wrap it in a callback.');
}

return fn (string $bucket, mixed $params): string => $callback($bucket);
}




public static function isRegistered(string $filtername): bool
{
return isset(self::$filters[$filtername]);
}






public static function registeredFilternames(): array
{
return array_keys(self::$filters);
}








public static function callback(string $filtername): Closure
{
return self::$filters[$filtername] ?? throw new OutOfBoundsException('No callback is attached to the stream filter "'.$filtername.'".');
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use ErrorException;
use Throwable;

use function in_array;
use function restore_error_handler;
use function set_error_handler;

use const E_USER_WARNING;
use const E_WARNING;

/**
@template


*/
final class Warning
{










public static function trap(callable $callback, mixed ...$arguments): mixed
{
set_error_handler(
fn (int $errno, string $errstr, string $errfile, int $errline): bool =>
in_array($errno, [E_WARNING, E_USER_WARNING], true)
? throw new ErrorException($errstr, 0, $errno, $errfile, $errline)
: false
);

return self::execute($callback, $arguments);
}










public static function cloak(callable $callback, mixed ...$arguments): mixed
{
set_error_handler(
fn (int $errno, string $errstr, string $errfile, int $errline): bool =>
in_array($errno, [E_WARNING, E_USER_WARNING], true),
);

return self::execute($callback, $arguments);
}






private static function execute(callable $callback, array $arguments)
{
try {
return $callback(...$arguments);
} finally {
restore_error_handler();
}
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use ArrayIterator;
use CallbackFilterIterator;
use Closure;
use Deprecated;
use Generator;
use Iterator;
use JsonSerializable;
use League\Csv\Serializer\Denormalizer;
use League\Csv\Serializer\MappingFailed;
use League\Csv\Serializer\TypeCastingFailed;
use LimitIterator;
use mysqli_result;
use PDOStatement;
use PgSql\Result;
use ReflectionException;
use RuntimeException;
use SQLite3Result;
use Throwable;

use function array_filter;
use function array_flip;
use function array_key_exists;
use function array_reduce;
use function array_search;
use function array_values;
use function is_int;
use function is_string;
use function iterator_count;

/**
@template


*/
class ResultSet implements TabularDataReader, JsonSerializable
{

protected array $header;


protected Iterator $records;









public function __construct(Iterator|array $records = [], array $header = [])
{
$header === array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames();

$this->header = array_values($this->validateHeader($header));
$this->records = match (true) {
$records instanceof Iterator => $records,
default => new ArrayIterator($records),
};
}




protected function validateHeader(array $header): array
{
return match (true) {
$header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header),
[] !== array_filter(array_keys($header), fn (string|int $value) => !is_int($value) || $value < 0) => throw new SyntaxError('The header mapper indexes should only contain positive integer or 0.'),
default => $header,
};
}






public static function tryFrom(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData|TabularDataProvider $tabularData): ?self
{
try {
return self::from($tabularData);
} catch (Throwable) {
return null;
}
}






public static function from(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData|TabularDataProvider $tabularData): self
{
if ($tabularData instanceof TabularDataProvider) {
$tabularData = $tabularData->getTabularData();
}

if (!$tabularData instanceof TabularData) {

$data = new ArrayIterator();
foreach (RdbmsResult::rows($tabularData) as $offset => $row) {
$data[$offset] = $row;
}

return new self($data, RdbmsResult::columnNames($tabularData));
}

return new self($tabularData->getRecords(), $tabularData->getHeader());
}

public function __destruct()
{
unset($this->records);
}






public function getHeader(): array
{
return $this->header;
}




public function getIterator(): Iterator
{
return $this->getRecords();
}




public function each(callable $callback): bool
{
foreach ($this as $offset => $record) {
if (false === $callback($record, $offset)) {
return false;
}
}

return true;
}




public function exists(callable $callback): bool
{
foreach ($this as $offset => $record) {
if (true === $callback($record, $offset)) {
return true;
}
}

return false;
}

/**
@template





*/
public function reduce(callable $callback, mixed $initial = null): mixed
{
foreach ($this as $offset => $record) {
$initial = $callback($initial, $record, $offset);
}

return $initial;
}

/**
@template






*/
public function map(callable $callback): Iterator
{
return MapIterator::fromIterable($this, $callback);
}








public function chunkBy(int $recordsCount): iterable
{
$recordsCount > 0 || throw InvalidArgument::dueToInvalidChunkSize($recordsCount, __METHOD__);

$header = $this->getHeader();
$records = [];
$nbRecords = 0;
foreach ($this->getRecords() as $record) {
$records[] = $record;
++$nbRecords;
if ($nbRecords === $recordsCount) {
yield new self($records, $header);
$records = [];
$nbRecords = 0;
}
}

if ([] !== $records) {
yield new self($records, $header);
}
}




public function mapHeader(array $headers): TabularDataReader
{
return (new Statement())->process($this, $headers);
}

public function filter(Query\Predicate|Closure $predicate): TabularDataReader
{
return (new Statement())->where($predicate)->process($this);
}

public function slice(int $offset, ?int $length = null): TabularDataReader
{
return (new Statement())->offset($offset)->limit($length ?? -1)->process($this);
}

public function sorted(Query\Sort|Closure $orderBy): TabularDataReader
{
return (new Statement())->orderBy($orderBy)->process($this);
}

public function select(string|int ...$columns): TabularDataReader
{
if ([] === $columns) {
return $this;
}

$recordsHeader = $this->getHeader();
$hasHeader = [] !== $recordsHeader;
$selectColumn = function (array $header, string|int $field) use ($recordsHeader, $hasHeader): array {
if (is_string($field)) {
$index = array_search($field, $recordsHeader, true);
if (false === $index) {
throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__);
}

$header[$index] = $field;

return $header;
}

if ($hasHeader && !array_key_exists($field, $recordsHeader)) {
throw InvalidArgument::dueToInvalidColumnIndex($field, 'offset', __METHOD__);
}

$header[$field] = $recordsHeader[$field] ?? $field;

return $header;
};


$header = array_reduce($columns, $selectColumn, []);
$callback = function (array $record) use ($header): array {
$element = [];
$row = array_values($record);
foreach ($header as $offset => $headerName) {
$element[$headerName] = $row[$offset] ?? null;
}

return $element;
};

return new self(new MapIterator($this, $callback), $hasHeader ? $header : []);
}

public function selectAllExcept(string|int ...$columns): TabularDataReader
{
if ([] === $columns) {
return $this;
}

$recordsHeader = $this->getHeader();
$hasHeader = [] !== $recordsHeader;
$selectColumnsToSkip = function (array $res, string|int $column) use ($recordsHeader, $hasHeader): array {
if ($hasHeader) {
if (is_string($column)) {
$index = array_search($column, $recordsHeader, true);
if (false === $index) {
throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__);
}

$res[$index] = 1;

return $res;
}

if (!array_key_exists($column, $recordsHeader)) {
throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__);
}

$res[$column] = 1;

return $res;
}

if (!is_int($column)) {
throw InvalidArgument::dueToInvalidColumnIndex($column, 'offset', __METHOD__);
}

$res[$column] = 1;

return $res;
};


$columnsToSkip = array_reduce($columns, $selectColumnsToSkip, []);
$callback = function (array $record) use ($columnsToSkip): array {
$element = [];
$index = 0;
foreach ($record as $name => $value) {
if (!array_key_exists($index, $columnsToSkip)) {
$element[$name] = $value;
}
++$index;
}

return $element;
};

$newHeader = [];
if ($hasHeader) {
$newHeader = array_values(
array_filter(
$recordsHeader,
fn (string|int $key) => !array_key_exists($key, $columnsToSkip),
ARRAY_FILTER_USE_KEY
)
);
}

return new self(new MapIterator($this, $callback), $newHeader);
}

/**
@experimental







*/
public function matching(string $expression): iterable
{
return (new FragmentFinder())->findAll($expression, $this);
}

/**
@experimental






*/
public function matchingFirst(string $expression): ?TabularDataReader
{
return (new FragmentFinder())->findFirst($expression, $this);
}

/**
@experimental







*/
public function matchingFirstOrFail(string $expression): TabularDataReader
{
return (new FragmentFinder())->findFirstOrFail($expression, $this);
}








public function getRecords(array $header = []): Iterator
{
return $this->combineHeader($this->prepareHeader($header));
}

/**
@template







*/
public function getRecordsAsObject(string $className, array $header = []): Iterator
{
$header = $this->prepareHeader($header);

return Denormalizer::assignAll(
$className,
$this->combineHeader($header),
$header
);
}







protected function prepareHeader(array $header): array
{
$header === array_filter($header, is_string(...)) || throw SyntaxError::dueToInvalidHeaderColumnNames();
$header = $this->validateHeader($header);
if ([] === $header) {
$header = $this->header;
}
return $header;
}








protected function combineHeader(array $header): Iterator
{
return match (true) {
[] === $header => $this->records,
default => new MapIterator($this->records, function (array $record) use ($header): array {
$assocRecord = [];
$row = array_values($record);
foreach ($header as $offset => $headerName) {
$assocRecord[$headerName] = $row[$offset] ?? null;
}

return $assocRecord;
}),
};
}

public function count(): int
{
return iterator_count($this->records);
}

public function jsonSerialize(): array
{
return array_values([...$this->records]);
}

public function first(): array
{
return $this->nth(0);
}

public function last(): array
{
$last = [];
foreach ($this->getRecords() as $last); 

return $last;
}

public function value(int|string $column = 0): mixed
{
return match (true) {
is_string($column) => $this->first()[$column] ?? null,
default => array_values($this->first())[$column] ?? null,
};
}

public function nth(int $nth): array
{
0 <= $nth || throw InvalidArgument::dueToInvalidRecordOffset($nth, __METHOD__);

$iterator = new LimitIterator($this->getIterator(), $nth, 1);
$iterator->rewind();


$result = $iterator->current();

return $result ?? [];
}






public function nthAsObject(int $nth, string $className, array $header = []): ?object
{
$header = $this->prepareHeader($header);
$record = $this->nth($nth);
if ([] === $record) {
return null;
}

if ([] === $header || $this->header === $header) {
return Denormalizer::assign($className, $record);
}

$row = array_values($record);
$record = [];
foreach ($header as $offset => $headerName) {
$record[$headerName] = $row[$offset] ?? null;
}

return Denormalizer::assign($className, $record);
}






public function firstAsObject(string $className, array $header = []): ?object
{
return $this->nthAsObject(0, $className, $header);
}







public function lastAsObject(string $className, array $header = []): ?object
{
$header = $this->prepareHeader($header);
$record = $this->last();
if ([] === $record) {
return null;
}

if ([] === $header || $this->header === $header) {
return Denormalizer::assign($className, $record);
}

$row = array_values($record);
$record = [];
foreach ($header as $offset => $headerName) {
$record[$headerName] = $row[$offset] ?? null;
}

return Denormalizer::assign($className, $record);
}

public function fetchColumn(string|int $index = 0): Iterator
{
return $this->yieldColumn(
$this->getColumnIndex($index, 'offset', __METHOD__)
);
}

protected function yieldColumn(string|int $offset): Generator
{
yield from new MapIterator(
new CallbackFilterIterator($this->records, fn (array $record): bool => isset($record[$offset])),
fn (array $record) => $record[$offset]
);
}






protected function getColumnIndex(string|int $field, string $type, string $method): string|int
{
return match (true) {
is_string($field) => $this->getColumnIndexByValue($field, $type, $method),
default => $this->getColumnIndexByKey($field, $type, $method),
};
}






protected function getColumnIndexByValue(string $value, string $type, string $method): string
{
return match (true) {
false === array_search($value, $this->header, true) => throw InvalidArgument::dueToInvalidColumnIndex($value, $type, $method),
default => $value,
};
}






protected function getColumnIndexByKey(int $index, string $type, string $method): int|string
{
return match (true) {
$index < 0 => throw InvalidArgument::dueToInvalidColumnIndex($index, $type, $method),
[] === $this->header => $index,
false !== ($value = array_search($index, array_flip($this->header), true)) => $value,
default => throw InvalidArgument::dueToInvalidColumnIndex($index, $type, $method),
};
}

public function fetchPairs(string|int $offset_index = 0, string|int $value_index = 1): Iterator
{
$offset = $this->getColumnIndex($offset_index, 'offset', __METHOD__);
$value = $this->getColumnIndex($value_index, 'value', __METHOD__);

$iterator = new MapIterator(
new CallbackFilterIterator($this->records, fn (array $record): bool => isset($record[$offset])),
fn (array $record): array => [$record[$offset], $record[$value] ?? null]
);


foreach ($iterator as $pair) {
yield $pair[0] => $pair[1];
}
}











#[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')]
public function fetchColumnByName(string $name): Iterator
{
return $this->yieldColumn(
$this->getColumnIndexByValue($name, 'name', __METHOD__)
);
}











#[Deprecated(message:'use League\Csv\Resultset::fetchColumn() instead', since:'league/csv:9.23.0')]
public function fetchColumnByOffset(int $offset): Iterator
{
return $this->yieldColumn(
$this->getColumnIndexByKey($offset, 'offset', __METHOD__)
);
}








#[Deprecated(message:'use League\Csv\Resultset::nth() instead', since:'league/csv:9.9.0')]
public function fetchOne(int $nth_record = 0): array
{
return $this->nth($nth_record);
}















#[Deprecated(message:'use League\Csv\ResultSet::getRecordsAsObject() instead', since:'league/csv:9.15.0')]
public function getObjects(string $className, array $header = []): Iterator
{
return $this->getRecordsAsObject($className, $header);
}






#[Deprecated(message:'use League\Csv\ResultSet::from() instead', since:'league/csv:9.22.0')]
public static function createFromTabularDataReader(TabularDataReader $reader): self
{
return self::from($reader);
}




#[Deprecated(message:'use League\Csv\ResultSet::from() instead', since:'league/csv:9.22.0')]
public static function createFromRecords(iterable $records = []): self
{
return new self(MapIterator::toIterator($records));
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use RuntimeException;
use SeekableIterator;
use SplFileObject;
use Stringable;
use TypeError;
use ValueError;

use function array_keys;
use function fclose;
use function feof;
use function fflush;
use function fgetcsv;
use function fopen;
use function fpassthru;
use function fputcsv;
use function fread;
use function fseek;
use function fwrite;
use function get_resource_type;
use function gettype;
use function is_array;
use function is_resource;
use function is_string;
use function rewind;
use function stream_filter_remove;
use function stream_get_meta_data;
use function strlen;

use const SEEK_SET;






final class Stream implements SeekableIterator
{

private mixed $value = null;

private int $offset = -1;

private int $flags = 0;
private string $delimiter = ',';
private string $enclosure = '"';
private string $escape = '\\';

private array $filters = [];
private int $maxLength = 0;




private function __construct(
private $stream,
private readonly bool $is_seekable,
private readonly bool $should_close_stream = false,
) {
}

public function __destruct()
{
Warning::cloak(
array_walk_recursive(...),
$this->filters,
static function ($filter): void {
if (is_resource($filter)) {
stream_filter_remove($filter);
}
}
);

if ($this->should_close_stream && is_resource($this->stream)) {
fclose($this->stream);
}

unset($this->stream);
}

public function __clone(): void
{
throw UnavailableStream::dueToForbiddenCloning(self::class);
}

public function __debugInfo(): array
{
return stream_get_meta_data($this->stream) + [
'delimiter' => $this->delimiter,
'enclosure' => $this->enclosure,
'escape' => $this->escape,
'stream_filters' => array_keys($this->filters),
];
}




public function getMode(): string
{
return stream_get_meta_data($this->stream)['mode'];
}

public function ftell(): int|false
{
return ftell($this->stream);
}









public static function from($filename, string $mode = 'r', $context = null): self
{
$should_close_stream = false;
if (is_string($filename)) {
$should_close_stream = true;

$resource = @fopen(filename: $filename, mode: $mode, context: $context);
is_resource($resource) || throw UnavailableStream::dueToPathNotFound($filename);

$filename = $resource;
}

is_resource($filename) || throw new TypeError('Argument passed must be a stream resource or a string, '.gettype($filename).' given.');
'stream' === ($type = get_resource_type($filename)) || throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given');

return new self($filename, stream_get_meta_data($filename)['seekable'], $should_close_stream);
}




public static function fromString(Stringable|string $content = ''): self
{
$instance = self::from('php://temp', 'r+');
$instance->fwrite((string) $content);

return $instance;
}






public function getPathname(): string
{
return stream_get_meta_data($this->stream)['uri'];
}








public function appendFilter(string $filtername, int $read_write, mixed $params = null): void
{

$res = Warning::cloak(stream_filter_append(...), $this->stream, $filtername, $read_write, $params);
is_resource($res) || throw InvalidArgument::dueToStreamFilterNotFound($filtername);

$this->filters[$filtername][] = $res;
}








public function prependFilter(string $filtername, int $read_write, mixed $params = null): void
{

$res = Warning::cloak(stream_filter_prepend(...), $this->stream, $filtername, $read_write, $params);
is_resource($res) || throw InvalidArgument::dueToStreamFilterNotFound($filtername);

$this->filters[$filtername][] = $res;
}








public function setCsvControl(string $delimiter = ',', string $enclosure = '"', string $escape = '\\'): void
{
[$this->delimiter, $this->enclosure, $this->escape] = $this->filterControl($delimiter, $enclosure, $escape, __METHOD__);
}








private function filterControl(string $delimiter, string $enclosure, string $escape, string $caller): array
{
return match (true) {
1 !== strlen($delimiter) => throw InvalidArgument::dueToInvalidDelimiterCharacter($delimiter, $caller),
1 !== strlen($enclosure) => throw InvalidArgument::dueToInvalidEnclosureCharacter($enclosure, $caller),
1 !== strlen($escape) && '' !== $escape => throw InvalidArgument::dueToInvalidEscapeCharacter($escape, $caller),
default => [$delimiter, $enclosure, $escape],
};
}








public function getCsvControl(): array
{
return [$this->delimiter, $this->enclosure, $this->escape];
}






public function setFlags(int $flags): void
{
$this->flags = $flags;
}








public function fputcsv(array $fields, string $delimiter = ',', string $enclosure = '"', string $escape = '\\', string $eol = "\n"): int|false
{
return fputcsv(
$this->stream,
$fields,
...[...$this->filterControl($delimiter, $enclosure, $escape, __METHOD__), $eol]
);
}






public function key(): int
{
return $this->offset;
}






public function next(): void
{
$this->value = false;
$this->offset++;
}









public function rewind(): void
{
$this->is_seekable || throw UnavailableFeature::dueToMissingStreamSeekability();
false !== rewind($this->stream) || throw new RuntimeException('Unable to rewind the document.');

$this->offset = 0;
$this->value = false;
if (SplFileObject::READ_AHEAD === ($this->flags & SplFileObject::READ_AHEAD)) {
$this->current();
}
}






public function valid(): bool
{
return match (true) {
SplFileObject::READ_AHEAD === ($this->flags & SplFileObject::READ_AHEAD) => false !== $this->current(),
default => !feof($this->stream),
};
}






public function current(): mixed
{
if (false !== $this->value) {
return $this->value;
}

$this->value = match (true) {
SplFileObject::READ_CSV === ($this->flags & SplFileObject::READ_CSV) => $this->getCurrentRecord(),
default => $this->getCurrentLine(),
};

return $this->value;
}

public function fgets(): string|false
{
$arg = [$this->stream];
if (0 < $this->maxLength) {
$arg[] = $this->maxLength;
}
return fgets(...$arg);
}






public function setMaxLineLen(int $maxLength): void
{
0 <= $maxLength || throw new ValueError(' Argument #1 ($maxLength) must be greater than or equal to 0');

$this->maxLength = $maxLength;
}






public function getMaxLineLen(): int
{
return $this->maxLength;
}






public function eof(): bool
{
return feof($this->stream);
}




private function getCurrentRecord(): array|false
{
$isEmptyLine = SplFileObject::SKIP_EMPTY === ($this->flags & SplFileObject::SKIP_EMPTY);
do {
$ret = fgetcsv($this->stream, 0, $this->delimiter, $this->enclosure, $this->escape);
} while ($isEmptyLine && is_array($ret) && null === $ret[0]);

return $ret;
}




private function getCurrentLine(): string|false
{
$isEmptyLine = SplFileObject::SKIP_EMPTY === ($this->flags & SplFileObject::SKIP_EMPTY);
$dropNewLine = SplFileObject::DROP_NEW_LINE === ($this->flags & SplFileObject::DROP_NEW_LINE);
$shouldBeIgnored = fn (string|false $line): bool => ($isEmptyLine || $dropNewLine)
&& (false !== $line && '' === rtrim($line, "\r\n"));
$arguments = [$this->stream];
if (0 < $this->maxLength) {
$arguments[] = $this->maxLength;
}

do {
$line = fgets(...$arguments);
} while ($shouldBeIgnored($line));

if ($dropNewLine && false !== $line) {
return rtrim($line, "\r\n");
}

return $line;
}








public function seek(int $offset): void
{
$offset >= 0 || throw InvalidArgument::dueToInvalidSeekingPosition($offset, __METHOD__);

$this->rewind();
while ($this->key() !== $offset && $this->valid()) {
$this->current();
$this->next();
}

if (0 !== $offset) {
$this->offset--;
}

$this->current();
}






public function fpassthru(): int|false
{
return fpassthru($this->stream);
}








public function fread(int $length): string|false
{
return fread($this->stream, $length);
}








public function fseek(int $offset, int $whence = SEEK_SET): int
{
return match (true) {
!$this->is_seekable => throw UnavailableFeature::dueToMissingStreamSeekability(),
default => fseek($this->stream, $offset, $whence),
};
}






public function fwrite(string $str, ?int $length = null): int|false
{
$args = [$this->stream, $str];
if (null !== $length) {
$args[] = $length;
}

return fwrite(...$args);
}






public function fflush(): bool
{
return fflush($this->stream);
}






public function getSize(): int|false
{
return fstat($this->stream)['size'] ?? false;
}

public function getContents(?int $length = null, int $offset = -1): string|false
{
return stream_get_contents($this->stream, $length, $offset);
}












#[Deprecated(message:'use League\Csv\Stream::from() instead', since:'league/csv:9.27.0')]
public static function createFromResource(mixed $stream): self
{
is_resource($stream) || throw new TypeError('Argument passed must be a stream resource or a string, '.gettype($stream).' given.');

return self::from($stream);
}












#[Deprecated(message:'use League\Csv\Stream::from() instead', since:'league/csv:9.27.0')]
public static function createFromPath(string $path, string $open_mode = 'r', $context = null): self
{
return self::from($path, $open_mode, $context);
}








#[Deprecated(message:'use League\Csv\Stream::fromString() instead', since:'league/csv:9.27.0')]
public static function createFromString(Stringable|string $content = ''): self
{
return self::fromString($content);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use BadMethodCallException;
use Closure;
use Deprecated;
use Exception;
use Generator;
use InvalidArgumentException;
use Iterator;
use JsonException;
use RuntimeException;
use SplFileInfo;
use SplFileObject;
use TypeError;

use function array_filter;
use function array_map;
use function array_reduce;
use function array_values;
use function get_defined_constants;
use function implode;
use function in_array;
use function is_bool;
use function json_encode;
use function json_last_error;
use function preg_match;
use function str_repeat;
use function str_replace;
use function str_starts_with;
use function strlen;
use function strtolower;
use function substr;
use function ucwords;

use const ARRAY_FILTER_USE_KEY;
use const JSON_ERROR_NONE;
use const JSON_PRETTY_PRINT;
use const JSON_THROW_ON_ERROR;

/**
@template














































*/
final class JsonConverter
{
public readonly int $flags;

public readonly int $depth;

public readonly int $indentSize;

public readonly ?Closure $formatter;

public readonly int $chunkSize;
public readonly JsonFormat $format;
private readonly string $start;
private readonly string $end;
private readonly string $separator;
private readonly string $emptyIterable;

private readonly string $indentation;

private readonly Closure $jsonEncodeChunk;

private array $indentationLevels = [];









public function __construct(
int $flags = 0,
int $depth = 512,
int $indentSize = 4,
?callable $formatter = null,
int $chunkSize = 500,
JsonFormat $jsonFormat = JsonFormat::Standard,
) {
json_encode([], $flags & ~JSON_THROW_ON_ERROR, $depth);

JSON_ERROR_NONE === ($errorCode = json_last_error()) || throw new InvalidArgumentException('The flags or the depth given are not valid JSON encoding parameters in PHP; '.json_last_error_msg(), $errorCode);
1 <= $indentSize || throw new InvalidArgumentException('The indentation space must be greater or equal to 1.');
1 <= $chunkSize || throw new InvalidArgumentException('The chunk size must be greater or equal to 1.');

$this->flags = $flags;
$this->depth = $depth;
$this->indentSize = $indentSize;
$this->formatter = ($formatter instanceof Closure || null === $formatter) ? $formatter : $formatter(...);
$this->format = $jsonFormat;



$this->indentation = str_repeat(' ', $this->indentSize);
$start = '[';
$end = ']';
$separator = ',';
$chunkFormatter = fn (array $value): array => $value;
if (JsonFormat::Standard === $this->format) {
$chunkFormatter = array_values(...);
}

$prettyPrintFormatter = fn (string $json): string => $json;
if ($this->useForceObject()) {
$start = '{';
$end = '}';
$chunkFormatter = fn (array $value): array => $value;
}

if (JsonFormat::Standard !== $this->format) {
$start = '';
$end = "\n";
$separator = "\n";
}

$this->emptyIterable = JsonFormat::Standard !== $this->format ? '' : $start.$end;
if ($this->usePrettyPrint()) {
$start .= "\n";
$end = "\n".$end;
$separator .= "\n";
if (JsonFormat::Standard !== $this->format) {
$start = '';
$end = "\n";
$separator = "\n";
}
$prettyPrintFormatter = $this->prettyPrint(...);
}

$flags = ($this->flags & ~JSON_PRETTY_PRINT) | JSON_THROW_ON_ERROR;
$this->chunkSize = $chunkSize;
$this->start = $start;
$this->end = $end;
$this->separator = $separator;
$this->jsonEncodeChunk = match ($this->format) {
JsonFormat::Standard => fn (array $chunk): string => ($prettyPrintFormatter)(substr(json_encode(($chunkFormatter)($chunk), $flags, $this->depth),  1, -1)),
default => fn (array $chunk): string => implode($this->separator, array_map(fn ($value) => json_encode(($chunkFormatter)($value), $flags, $this->depth), $chunk)),
};
}





private function prettyPrint(string $json): string
{
$level = 1;
$inQuotes = false;
$escape = false;
$length = strlen($json);
$str = [$this->indentation];
for ($i = 0; $i < $length; $i++) {
$char = $json[$i];
if ('"' === $char && !$escape) {
$inQuotes = !$inQuotes;
}

$escape = '\\' === $char && !$escape;
$str[] = $inQuotes ? $char : match ($char) {
'{', '[' => $char.($this->indentationLevels[++$level] ??= "\n".str_repeat($this->indentation, $level)),
'}', ']' => ($this->indentationLevels[--$level] ??= "\n".str_repeat($this->indentation, $level)).$char,
',' => $char.($this->indentationLevels[$level] ??= "\n".str_repeat($this->indentation, $level)),
':' => $char.' ',
default => $char,
};
}

return implode('', $str);
}




public function __call(string $name, array $arguments): self|bool
{
return match (true) {
str_starts_with($name, 'without') => $this->removeFlags(self::methodToFlag($name, 7)),
str_starts_with($name, 'with') => $this->addFlags(self::methodToFlag($name, 4)),
str_starts_with($name, 'use') => $this->useFlags(self::methodToFlag($name, 3)),
default => throw new BadMethodCallException('The method "'.self::class.'::'.$name.'" does not exist.'),
};
}




public function withPrettyPrint(?int $indentSize = null): self
{
$flags = $this->flags | JSON_PRETTY_PRINT;
$indentSize = $indentSize ?? $this->indentSize;

return match (true) {
$flags === $this->flags && $indentSize === $this->indentSize => $this,
default => new self($flags, $this->depth, $indentSize, $this->formatter, $this->chunkSize, $this->format),
};
}




private static function methodToFlag(string $method, int $prefixSize): int
{
static $suffix2Flag;

if (null === $suffix2Flag) {
$suffix2Flag = [];

$jsonFlags = get_defined_constants(true)['json'];
$jsonEncodeFlags = array_filter(
$jsonFlags,
fn (string $key) => 1 !== preg_match('/^(JSON_BIGINT_AS_STRING|JSON_OBJECT_AS_ARRAY|JSON_ERROR_)(.*)?$/', $key),
ARRAY_FILTER_USE_KEY
);

foreach ($jsonEncodeFlags as $name => $value) {
$suffix2Flag[str_replace('_', '', ucwords(strtolower(substr($name, 5)), '_'))] = $value;
}
}

return $suffix2Flag[substr($method, $prefixSize)]
?? throw new BadMethodCallException('The method "'.self::class.'::'.$method.'" does not exist.');
}




public function addFlags(int ...$flags): self
{
return $this->setFlags(
array_reduce($flags, fn (int $carry, int $flag): int => $carry | $flag, $this->flags)
);
}




public function removeFlags(int ...$flags): self
{
return $this->setFlags(
array_reduce($flags, fn (int $carry, int $flag): int => $carry & ~$flag, $this->flags)
);
}




public function useFlags(int ...$flags): bool
{
foreach ($flags as $flag) {

if (JSON_THROW_ON_ERROR !== $flag && ($this->flags & $flag) !== $flag) {
return false;
}
}

return [] !== $flags;
}

public function format(JsonFormat $format): self
{
return match ($format) {
$this->format => $this,
default => new self($this->flags, $this->depth, $this->indentSize, $this->formatter, $this->chunkSize, $format),
};
}




private function setFlags(int $flags): self
{
return match ($flags) {
$this->flags => $this,
default => new self($flags, $this->depth, $this->indentSize, $this->formatter, $this->chunkSize, $this->format),
};
}






public function depth(int $depth): self
{
return match ($depth) {
$this->depth => $this,
default => new self($this->flags, $depth, $this->indentSize, $this->formatter, $this->chunkSize, $this->format),
};
}






public function chunkSize(int $chunkSize): self
{
return match ($chunkSize) {
$this->chunkSize => $this,
default => new self($this->flags, $this->depth, $this->indentSize, $this->formatter, $chunkSize, $this->format),
};
}




public function formatter(?callable $formatter): self
{
return new self($this->flags, $this->depth, $this->indentSize, $formatter, $this->chunkSize, $this->format);
}








public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self
{
if (!is_bool($condition)) {
$condition = $condition($this);
}

return match (true) {
$condition => $onSuccess($this),
null !== $onFail => $onFail($this),
default => $this,
} ?? $this;
}












public function download(TabularDataProvider|TabularData|iterable $records, ?string $filename = null, array $header = []): int
{
if (null !== $filename) {
$mimetype = JsonFormat::Standard === $this->format ? 'application/json' : 'application/x-ndjson';
HttpHeaders::forFileDownload($filename, $mimetype.'; charset=utf-8');
}

return $this->save(
records: $records,
destination: new SplFileObject('php://output', 'wb'),
header: $header,
);
}










public function encode(TabularDataProvider|TabularData|iterable $records, array $header = []): string
{
$stream = Stream::fromString();
$this->save(records: $records, destination: $stream, header: $header);
$stream->rewind();

return (string) $stream->getContents();
}




















public function save(TabularDataProvider|TabularData|iterable $records, mixed $destination, $context = null, array $header = []): int
{
$stream = match (true) {
$destination instanceof Stream,
$destination instanceof SplFileObject => $destination,
$destination instanceof SplFileInfo => $destination->openFile(mode:'wb', context: $context),
default => Stream::from($destination, 'wb', $context),
};
$bytes = 0;
$writtenBytes = 0;
foreach ($this->convert($records, $header) as $line) {

$writtenBytes = Warning::cloak($stream->fwrite(...), $line);
if (false === $writtenBytes) {
break;
}
$bytes += $writtenBytes;
}

false !== $writtenBytes || throw new RuntimeException('Unable to write '.(isset($line) ? '`'.$line.'`' : '').' to the destination path `'.$stream->getPathname().'`.');

return $bytes;
}












public function convert(TabularDataProvider|TabularData|iterable $records, array $header = []): Iterator
{
if ($records instanceof TabularDataProvider) {
$records = $records->getTabularData();
}

if ($records instanceof TabularData) {
$records = $records->getRecords();
}

$iterator = match ($this->formatter) {
null => MapIterator::toIterator($records),
default => MapIterator::fromIterable($records, $this->formatter)
};

if (in_array($this->format, [JsonFormat::NdJsonHeader, JsonFormat::NdJsonHeaderLess], true)) {
$iterator = self::getList($iterator, $header, $this->format)();
}

$iterator->rewind();
if (!$iterator->valid()) {
yield $this->emptyIterable;

return;
}

$chunk = [];
$chunkOffset = 0;
$offset = 0;
$current = $iterator->current();
$iterator->next();

if (JsonFormat::Standard === $this->format) {
yield $this->start;
}

while ($iterator->valid()) {
if ($chunkOffset === $this->chunkSize) {
yield ($this->jsonEncodeChunk)($chunk).$this->separator;

$chunkOffset = 0;
$chunk = [];
}

$chunk[$offset] = $current;
++$chunkOffset;
++$offset;
$current = $iterator->current();
$iterator->next();
}

if ([] !== $chunk) {
yield ($this->jsonEncodeChunk)($chunk).$this->separator;
}

yield ($this->jsonEncodeChunk)([$offset => $current]).$this->end;
}








private static function getList(Iterator $data, array $header, JsonFormat $format): Closure
{
if (JsonFormat::NdJsonHeaderLess === $format) {
return fn () => yield from new MapIterator($data, fn (array $record): array => array_values($record));
}

[] !== $header || throw new InvalidArgument('A non empty header must be provided when using `JsonFormat::NdJsonHeader`.');

return function () use ($header, $data) {
yield $header;

yield from new MapIterator($data, fn (array $record): array => array_values($record));
};
}












#[Deprecated(message:'use League\Csv\JsonConverter::withPrettyPrint() instead', since:'league/csv:9.19.0')]
public function indentSize(int $indentSize): self
{
return match ($indentSize) {
$this->indentSize => $this,
default => new self($this->flags, $this->depth, $indentSize, $this->formatter, $this->chunkSize, $this->format),
};
}








#[Deprecated(message:'use League\Csv\JsonConverter::__construct() instead', since:'league/csv:9.22.0')]
public static function create(): self
{
return new self(
flags: 0,
depth: 512,
indentSize: 4,
formatter: null,
chunkSize: 500,
jsonFormat: JsonFormat::Standard
);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;




class CannotInsertRecord extends Exception
{

protected array $record = [];

protected string $name = '';




public static function triggerOnInsertion(array $record): self
{
$exception = new self('Unable to write record to the CSV document');
$exception->record = $record;

return $exception;
}




public static function triggerOnValidation(string $name, array $record): self
{
$exception = new self('Record validation failed');
$exception->name = $name;
$exception->record = $record;

return $exception;
}




public function getName(): string
{
return $this->name;
}




public function getRecord(): array
{
return $this->record;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use InvalidArgumentException;
use php_user_filter;
use Throwable;

use function array_map;
use function in_array;
use function str_replace;
use function strcspn;
use function stream_bucket_append;
use function stream_bucket_make_writeable;
use function stream_bucket_new;
use function stream_filter_register;
use function stream_get_filters;
use function strlen;
use function trigger_error;

use const E_USER_WARNING;
use const PSFS_ERR_FATAL;
use const PSFS_PASS_ON;












class EncloseField extends php_user_filter
{
#[Deprecated(message: 'use League\Csv\Writer::forceEnclosure() instead', since: 'league/csv:9.10.0')]
public const FILTERNAME = 'convert.league.csv.enclosure';


protected string $sequence = '';

protected static string $force_enclosure = "\n\r\t ";




public static function getFiltername(): string
{
return self::FILTERNAME;
}




public static function register(): void
{
if (!in_array(self::FILTERNAME, stream_get_filters(), true)) {
stream_filter_register(self::FILTERNAME, self::class);
}
}







public static function addTo(Writer $csv, string $sequence): Writer
{
self::register();

if (!self::isValidSequence($sequence)) {
throw new InvalidArgumentException('The sequence must contain at least one character to force enclosure');
}

return $csv
->addFormatter(fn (array $record): array => array_map(fn (?string $value): string => $sequence.$value, $record))
->addStreamFilter(self::FILTERNAME, ['sequence' => $sequence]);
}






protected static function isValidSequence(string $sequence): bool
{
return strlen($sequence) !== strcspn($sequence, self::$force_enclosure);
}

#[Deprecated(message: 'use League\Csv\Writer::forceEnclosure() instead', since: 'league/csv:9.10.0')]
public function onCreate(): bool
{
return is_array($this->params)
&& isset($this->params['sequence'])
&& self::isValidSequence($this->params['sequence']);
}






public function filter($in, $out, &$consumed, bool $closing): int
{
$data = '';
while (null !== ($bucket = stream_bucket_make_writeable($in))) {
$data .= $bucket->data;
$consumed += $bucket->datalen;
}


$params = $this->params;
try {
$data = str_replace($params['sequence'], '', $data);
} catch (Throwable $exception) {
trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING);

return PSFS_ERR_FATAL;
}

Warning::cloak(function () use ($data, $out) {
stream_bucket_append($out, stream_bucket_new($this->stream, $data));
});

return PSFS_PASS_ON;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Stringable;




interface TabularDataWriter
{










public function insertAll(iterable $records): int;












public function insertOne(array $record): int;
}
<?php










declare(strict_types=1);

namespace League\Csv;

use CallbackFilterIterator;
use Closure;
use Iterator;
use League\Csv\Query\Constraint\Criteria;
use League\Csv\Query\Predicate;
use League\Csv\Serializer\Denormalizer;
use League\Csv\Serializer\MappingFailed;
use League\Csv\Serializer\TypeCastingFailed;
use mysqli_result;
use PDOStatement;
use PgSql\Result;
use ReflectionException;
use RuntimeException;
use SQLite3Result;

use function array_combine;
use function array_diff;
use function array_fill_keys;
use function array_filter;
use function array_is_list;
use function array_key_exists;
use function array_key_first;
use function array_key_last;
use function array_keys;
use function array_map;
use function array_push;
use function array_reduce;
use function array_unique;
use function array_values;
use function count;
use function in_array;
use function is_int;
use function sort;

use const ARRAY_FILTER_USE_KEY;

final class Buffer implements TabularData
{
public const INCLUDE_HEADER = 1;
public const EXCLUDE_HEADER = 2;


private readonly array $header;

private readonly array $sortedHeader;

private readonly array $nullRecord;

private array $rows = [];

private array $validators = [];

private array $formatters = [];






public function __construct(array $header = [])
{
$this->header = match (true) {
!array_is_list($header) => throw new SyntaxError('The header must be a list of unique column names.'),
$header !== array_filter($header, is_string(...)) => throw SyntaxError::dueToInvalidHeaderColumnNames(),
$header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header),
default => $header,
};
sort($header);
$this->sortedHeader = $header;
$this->nullRecord = array_fill_keys($this->header, null);
}






public static function from(PDOStatement|Result|mysqli_result|SQLite3Result|TabularData|TabularDataProvider $dataStorage, int $options = self::INCLUDE_HEADER): self
{
if ($dataStorage instanceof TabularDataProvider) {
$dataStorage = $dataStorage->getTabularData();
}


$rows = $dataStorage instanceof TabularData ? $dataStorage->getRecords() : RdbmsResult::rows($dataStorage);
$instance = new self(match (true) {
self::EXCLUDE_HEADER === $options => [],
$dataStorage instanceof TabularData => $dataStorage->getHeader(),
default => RdbmsResult::columnNames($dataStorage),
});





foreach (new MapIterator($rows, fn (array $record): array => array_values($record)) as $offset => $row) {
$instance->rows[$offset] = $row;
}

return $instance;
}





public function to(TabularDataWriter $dataStorage, int $options = self::INCLUDE_HEADER): int
{
$bytes = 0;
$header = $this->getHeader();
if (self::INCLUDE_HEADER === $options && [] !== $header) {
$bytes += $dataStorage->insertOne($header);
}

return $bytes + $dataStorage->insertAll($this->getRecords());
}

public function isEmpty(): bool
{
return [] === $this->rows;
}

public function hasHeader(): bool
{
return [] !== $this->header;
}

public function recordCount(): int
{
return count($this->rows);
}




public function getHeader(): array
{
return $this->header;
}






public function getRecords(array $header = []): Iterator
{
$header = match (true) {
[] === $header => $this->header,
$header !== array_filter($header, is_int(...), ARRAY_FILTER_USE_KEY) => throw new SyntaxError('The header must be a list of unique column names.'),
$header !== array_filter($header, is_string(...)) => throw SyntaxError::dueToInvalidHeaderColumnNames(),
$header !== array_unique($header) => throw SyntaxError::dueToDuplicateHeaderColumnNames($header),
default => $header,
};

return MapIterator::fromIterable($this->rows, fn (array $row): array => $this->rowToRecord($row, $header));
}

/**
@template








*/
public function getRecordsAsObject(string $className, array $header = []): Iterator
{
return Denormalizer::assignAll($className, $this->getRecords($header), [] === $header ? $this->header : $header);
}

/**
@template








*/
public function map(callable $callback): Iterator
{
return MapIterator::fromIterable($this->getRecords(), $callback);
}






public function nth(int $nth): array
{
if ([] === ($row = $this->nthRow($nth, __METHOD__))) {
return [];
}

return $this->rowToRecord($row, $this->header);
}

/**
@template







*/
public function nthAsObject(int $nth, string $className, array $header = []): ?object
{
if ([] === ($row = $this->nthRow($nth, __METHOD__))) {
return null;
}

return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header));
}

public function firstOffset(): ?int
{
return array_key_first($this->rows);
}

public function first(): array
{
return null === ($offset = $this->firstOffset()) ? [] : $this->rowToRecord($this->rows[$offset], $this->header);
}







public function firstAsObject(string $className, array $header = []): ?object
{
if ([] === ($row = $this->rows[$this->firstOffset()] ?? [])) {
return null;
}

return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header));
}

public function lastOffset(): ?int
{
return array_key_last($this->rows);
}

public function last(): array
{
return null === ($offset = $this->lastOffset()) ? [] : $this->rowToRecord($this->rows[$offset], $this->header);
}







public function lastAsObject(string $className, array $header = []): ?object
{
if ([] === ($row = $this->rows[$this->lastOffset()] ?? [])) {
return null;
}

return Denormalizer::assign($className, $this->rowToRecord($row, [] !== $header ? $header : $this->header));
}




private function nthRow(int $nth, string $method): array
{
-1 < $nth || throw InvalidArgument::dueToInvalidRecordOffset($nth, $method);
if (null === ($first = $this->firstOffset())) {
return [];
}

$offset = $first + $nth;
if (!array_key_exists($offset, $this->rows)) {
return [];
}

return $this->rows[$nth + $first];
}

public function fetchColumn(int|string $index = 0): Iterator
{
if (is_int($index)) {
$index > -1 || throw InvalidArgument::dueToInvalidColumnIndex($index, 'offset', __METHOD__);
[] === $this->header || array_key_exists($index, $this->header) || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__);

$iterator = new MapIterator($this->getRecords(), fn (array $row) => array_values($row));
$iterator = new CallbackFilterIterator($iterator, fn (array $row) => array_key_exists($index, $row));

return new MapIterator($iterator, fn (array $row) => $row[$index]);
}

[] !== $this->header || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__);
in_array($index, $this->header, true) || throw InvalidArgument::dueToInvalidColumnIndex($index, 'name', __METHOD__);

$iterator = new CallbackFilterIterator($this->getRecords(), fn (array $row) => array_key_exists($index, $row));

return new MapIterator($iterator, fn (array $row) => $row[$index]);
}






public function addValidator(callable $validator, string $name): self
{
$this->validators[$name] = !$validator instanceof Closure ? $validator(...) : $validator;

return $this;
}






public function addFormatter(callable $formatter): self
{
$this->formatters[] = !$formatter instanceof Closure ? $formatter(...) : $formatter;

return $this;
}




public function insert(array ...$records): int
{
[] !== $records || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_insert', $records);

array_push($this->rows, ...array_map($this->formatInsertRecord(...), $records));

return count($records);
}





public function update(Predicate|Closure|callable $where, array $record): int
{
$record = $this->filterUpdateRecord($record);
$updateRecord = function (array $row) use ($record): array {
foreach ($record as $index => $value) {
$row[$index] = $value;
}

return $this->validateRecord($row);
};

$affectedRecords = 0;

$iterator = new MapIterator(new CallbackFilterIterator($this->getRecords(), $this->filterPredicate($where)), $updateRecord);
foreach ($iterator as $offset => $row) {
$this->rows[$offset] = $row;
$affectedRecords++;
}

return $affectedRecords;
}




public function delete(Predicate|Closure|callable $where): int
{
$affectedRecords = 0;
foreach (new CallbackFilterIterator($this->getRecords(), $this->filterPredicate($where)) as $offset => $row) {
unset($this->rows[$offset]);
$affectedRecords++;
}

return $affectedRecords;
}

public function truncate(): void
{
$this->rows = [];
}




private function formatInsertRecord(array $record): array
{
$this->filterInsertRecord($record) || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_insert', $record);

return $this->validateRecord(match (true) {
[] === $this->header => !array_is_list($record) ? array_values($record) : $record,
array_is_list($record) => array_combine($this->header, $record),
default => [...$this->nullRecord, ...$record],
});
}

private function filterInsertRecord(array $record): bool
{
if ([] === $this->header) {
return true;
}

if (array_is_list($record)) {
return count($record) === count($this->header);
}

$keys = array_keys($record);
sort($keys);

return $keys === $this->sortedHeader;
}




private function filterUpdateRecord(array $record): array
{
[] !== $record || throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_update', $record);
if (array_is_list($record)) {
return $this->rowToRecord($record, $this->header);
}

$keys = array_keys($record);

return match (true) {
$keys === array_filter($keys, is_int(...)) => $record,
$keys !== array_filter($keys, is_string(...)),
[] !== array_diff($keys, $this->header) => throw CannotInsertRecord::triggerOnValidation('@buffer_record_validation_on_update', $record),
default => $record,
};
}






private function validateRecord(array $record): array
{
$record = array_reduce($this->formatters, fn (array $record, callable $formatter): array => $formatter($record), $record);
foreach ($this->validators as $name => $validator) {
true === $validator($record) || throw CannotInsertRecord::triggerOnValidation($name, $record);
}

return !array_is_list($record) ? array_values($record) : $record;
}

private function filterPredicate(Predicate|Closure|callable $predicate): Predicate
{
return !$predicate instanceof Predicate ? Criteria::all($predicate) : $predicate;
}

private function rowToRecord(array $row, array $header): array
{
if ([] === $header) {
return $row;
}

$record = [];
foreach ($header as $offset => $headerName) {
$record[$headerName] = $row[$offset] ?? null;
}

return $record;
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

interface TabularDataProvider
{
public function getTabularData(): TabularData;
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use Throwable;




class UnavailableFeature extends Exception
{





public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}

public static function dueToUnsupportedStreamFilterApi(string $className): self
{
return new self('The stream filter API can not be used with a '.$className.' instance.');
}

public static function dueToMissingStreamSeekability(): self
{
return new self('stream does not support seeking.');
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use SplFileObject;
use Stringable;
use Throwable;
use ValueError;

enum Bom: string
{
case Utf32Le = "\xFF\xFE\x00\x00";
case Utf32Be = "\x00\x00\xFE\xFF";
case Utf16Be = "\xFE\xFF";
case Utf16Le = "\xFF\xFE";
case Utf8 = "\xEF\xBB\xBF";

public static function fromSequence(mixed $sequence): self
{
return self::tryFromSequence($sequence)
?? throw new ValueError('No BOM sequence could be found on the given sequence.');
}

public static function tryFromSequence(mixed $sequence): ?self
{
$str = match (true) {
$sequence instanceof SplFileObject,
$sequence instanceof Stream => self::getContents($sequence, 4, 0),
is_resource($sequence) => stream_get_contents($sequence, 4, 0),
$sequence instanceof AbstractCsv => $sequence->getInputBOM(),
$sequence instanceof Stringable,
is_string($sequence) => substr((string) $sequence, 0, 4),
default => $sequence,
};

if (!is_string($str) || '' === rtrim($str)) {
return null;
}

foreach (self::cases() as $bom) {
if (str_starts_with($str, $bom->value)) {
return $bom;
}
}

return null;
}

private static function getContents(Stream|SplFileObject $sequence, int $length, int $offset): ?string
{
$position = $sequence->ftell();
if (false === $position) {
return null;
}

try {
$sequence->fseek($offset);
$str = $sequence->fread($length);
$sequence->fseek($position);
if (false === $str) {
return null;
}

return $str;
} catch (Throwable) {
return null;
}
}

public static function fromEncoding(string $name): self
{
return self::tryFromEncoding($name)
?? throw new ValueError('Unknown or unsupported BOM name `'.$name.'`.');
}




public static function tryFromEncoding(string $name): ?self
{
return match (strtoupper(str_replace(['_', '-'], '', $name))) {
'UTF8' => self::Utf8,
'UTF16',
'UTF16BE' => self::Utf16Be,
'UTF16LE' => self::Utf16Le,
'UTF32',
'UTF32BE' => self::Utf32Be,
'UTF32LE' => self::Utf32Le,
default => null,
};
}

public function length(): int
{
return strlen($this->value);
}

public function encoding(): string
{
return match ($this) {
self::Utf16Le => 'UTF-16LE',
self::Utf16Be => 'UTF-16BE',
self::Utf32Le => 'UTF-32LE',
self::Utf32Be => 'UTF-32BE',
self::Utf8 => 'UTF-8',
};
}

public function isUtf8(): bool
{
return match ($this) {
self::Utf8 => true,
default => false,
};
}

public function isUtf16(): bool
{
return match ($this) {
self::Utf16Le,
self::Utf16Be => true,
default => false,
};
}

public function isUtf32(): bool
{
return match ($this) {
self::Utf32Le,
self::Utf32Be => true,
default => false,
};
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

final class UnavailableStream extends Exception
{
private function __construct(string $message)
{
parent::__construct($message);
}

public static function dueToPathNotFound(string $path): self
{
return new self('`'.$path.'`: failed to open stream: No such file or directory.');
}

public static function dueToForbiddenCloning(string $class_name): self
{
return new self('An object of class '.$class_name.' cannot be cloned.');
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

enum JsonFormat
{
case Standard;
case NdJson;
case NdJsonHeader;
case NdJsonHeaderLess;
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use InvalidArgumentException;
use php_user_filter;
use Throwable;
use TypeError;

use function array_map;
use function in_array;
use function is_string;
use function str_replace;
use function strcspn;
use function stream_bucket_append;
use function stream_bucket_make_writeable;
use function stream_bucket_new;
use function stream_filter_register;
use function stream_get_filters;
use function strlen;
use function trigger_error;

use const E_USER_WARNING;
use const PSFS_ERR_FATAL;
use const PSFS_PASS_ON;
use const STREAM_FILTER_READ;
use const STREAM_FILTER_WRITE;











class RFC4180Field extends php_user_filter
{
#[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')]
public const FILTERNAME = 'convert.league.csv.rfc4180';






protected array $search = [];






protected array $replace = [];




protected static string $force_enclosure = "\n\r\t ";




public static function addTo(AbstractCsv $csv, string $whitespace_replace = ''): AbstractCsv
{
self::register();

$params = [
'enclosure' => $csv->getEnclosure(),
'escape' => $csv->getEscape(),
'mode' => $csv instanceof Writer ? STREAM_FILTER_WRITE : STREAM_FILTER_READ,
];

if ($csv instanceof Writer && '' !== $whitespace_replace) {
self::addFormatterTo($csv, $whitespace_replace);
$params['whitespace_replace'] = $whitespace_replace;
}

return $csv->addStreamFilter(self::FILTERNAME, $params);
}





#[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')]
public static function addFormatterTo(Writer $csv, string $whitespace_replace): Writer
{
if ('' == $whitespace_replace || strlen($whitespace_replace) !== strcspn($whitespace_replace, self::$force_enclosure)) {
throw new InvalidArgumentException('The sequence contains a character that enforces enclosure or is a CSV control character or is an empty string.');
}

$mapper = fn ($value) => is_string($value)
? str_replace(' ', $whitespace_replace, $value)
: $value;

return $csv->addFormatter(fn (array $record): array => array_map($mapper, $record));
}




public static function register(): void
{
if (!in_array(self::FILTERNAME, stream_get_filters(), true)) {
stream_filter_register(self::FILTERNAME, self::class);
}
}




public static function getFiltername(): string
{
return self::FILTERNAME;
}






public function filter($in, $out, &$consumed, bool $closing): int
{
$data = '';
while (null !== ($bucket = stream_bucket_make_writeable($in))) {
$data .= $bucket->data;
$consumed += $bucket->datalen;
}

try {
$data = str_replace($this->search, $this->replace, $data);
} catch (Throwable $exception) {
trigger_error('An error occurred while executing the stream filter `'.$this->filtername.'`: '.$exception->getMessage(), E_USER_WARNING);

return PSFS_ERR_FATAL;
}

Warning::cloak(function () use ($data, $out) {
stream_bucket_append($out, stream_bucket_new($this->stream, $data));
});

return PSFS_PASS_ON;
}

#[Deprecated(message: 'use League\Csv\Reader::setEscape or League\Csv\Writer::setEscape instead', since: 'league/csv:9.2.0')]
public function onCreate(): bool
{
if (!is_array($this->params)) {
throw new TypeError('The filter parameters must be an array.');
}

static $mode_list = [STREAM_FILTER_READ => 1, STREAM_FILTER_WRITE => 1];

$state = isset($this->params['enclosure'], $this->params['escape'], $this->params['mode'], $mode_list[$this->params['mode']])
&& 1 === strlen($this->params['enclosure'])
&& 1 === strlen($this->params['escape']);

if (false === $state) {
return false;
}

$this->search = [$this->params['escape'].$this->params['enclosure']];
$this->replace = [$this->params['enclosure'].$this->params['enclosure']];
if (STREAM_FILTER_WRITE !== $this->params['mode']) {
return true;
}

$this->search = [$this->params['escape'].$this->params['enclosure']];
$this->replace = [$this->params['escape'].$this->params['enclosure'].$this->params['enclosure']];
if ($this->isValidSequence($this->params)) {
$this->search[] = $this->params['whitespace_replace'];
$this->replace[] = ' ';
}

return true;
}





protected function isValidParams(array $params): bool
{
static $mode_list = [STREAM_FILTER_READ => 1, STREAM_FILTER_WRITE => 1];

return isset($params['enclosure'], $params['escape'], $params['mode'], $mode_list[$params['mode']])
&& 1 === strlen($params['enclosure'])
&& 1 === strlen($params['escape']);
}




protected function isValidSequence(array $params): bool
{
return isset($params['whitespace_replace'])
&& strlen($params['whitespace_replace']) === strcspn($params['whitespace_replace'], self::$force_enclosure);
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Deprecated;
use Throwable;




class InvalidArgument extends Exception
{





public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}

public static function dueToInvalidChunkSize(int $length, string $method): self
{
return new self($method.'() expects the length to be a positive integer '.$length.' given.');
}

public static function dueToInvalidHeaderFilename(string $filename): self
{
return new self('The filename `'.$filename.'` cannot contain the "/" and "\\" characters.');
}

public static function dueToInvalidDelimiterCharacter(string $delimiter, string $method): self
{
return new self($method.'() expects delimiter to be a single character; `'.$delimiter.'` given.');
}

public static function dueToInvalidEnclosureCharacter(string $enclosure, string $method): self
{
return new self($method.'() expects enclosure to be a single character; `'.$enclosure.'` given.');
}

public static function dueToInvalidEscapeCharacter(string $escape, string $method): self
{
return new self($method.'() expects escape to be a single character or an empty string; `'.$escape.'` given.');
}

public static function dueToInvalidBOMCharacter(string $method, Throwable $exception): self
{
return new self($method.'() expects a valid Byte Order Mark.', 0, $exception);
}

public static function dueToInvalidColumnCount(int $columns_count, string $method): self
{
return new self($method.'() expects the column count to be greater or equal to -1 '.$columns_count.' given.');
}

public static function dueToInvalidHeaderOffset(int $offset, string $method): self
{
return new self($method.'() expects header offset to be greater or equal to 0; `'.$offset.'` given.');
}

public static function dueToInvalidRecordOffset(int $offset, string $method): self
{
return new self($method.'() expects the submitted offset to be a positive integer or 0, '.$offset.' given');
}

public static function dueToInvalidColumnIndex(string|int $index, string $type, string $method): self
{
return new self($method.'() expects the '.$type.' index to be a valid string or integer, `'.$index.'` given');
}

public static function dueToInvalidLimit(int $limit, string $method): self
{
return new self($method.'() expects the limit to be greater or equal to -1, '.$limit.' given.');
}

public static function dueToInvalidOrder(string $order, string $method): self
{
return new self($method.'() expects `ASC` or `DESC` in a case-insensitive way, '.$order.' given.');
}

public static function dueToInvalidOperator(string $operator, string $method): self
{
return new self($method.'() expects valid comparison operator in a case-insensitive way, '.$operator.' given.');
}

public static function dueToInvalidSeekingPosition(int $position, string $method): self
{
return new self($method.'() can\'t seek stream to negative line '.$position);
}

public static function dueToStreamFilterNotFound(string $filtername): self
{
return new self('unable to locate filter `'.$filtername.'`');
}

public static function dueToInvalidThreshold(int $threshold, string $method): self
{
return new self($method.'() expects threshold to be null or a valid integer greater or equal to 1');
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use LogicException;
use RuntimeException;
use TypeError;

use function get_resource_type;
use function gettype;
use function in_array;
use function is_resource;
use function stream_get_filters;

use const STREAM_FILTER_READ;
use const STREAM_FILTER_WRITE;

final class StreamFilter
{





public static function remove($stream_filter): bool
{
if (!is_resource($stream_filter)) {
throw new TypeError('Argument passed must be a stream resource, '.gettype($stream_filter).' given.');
}

if ('stream filter' !== ($type = get_resource_type($stream_filter))) {
throw new TypeError('Argument passed must be a stream filter resource, '.$type.' resource given');
}

return stream_filter_remove($stream_filter);
}









public static function appendOnReadTo(mixed $stream, string $filtername, mixed $params = null): mixed
{
return self::appendFilter(STREAM_FILTER_READ, $stream, $filtername, $params);
}









public static function appendOnWriteTo(mixed $stream, string $filtername, mixed $params = null): mixed
{
return self::appendFilter(STREAM_FILTER_WRITE, $stream, $filtername, $params);
}









public static function prependOnReadTo(mixed $stream, string $filtername, mixed $params = null): mixed
{
return self::prependFilter(STREAM_FILTER_READ, $stream, $filtername, $params);
}









public static function prependOnWriteTo(mixed $stream, string $filtername, mixed $params = null): mixed
{
return self::prependFilter(STREAM_FILTER_WRITE, $stream, $filtername, $params);
}









private static function prependFilter(int $mode, mixed $stream, string $filtername, mixed $params): mixed
{
self::filterFiltername($filtername);
self::filterStream($stream);

if ($stream instanceof AbstractCsv) {
return match ($mode) {
STREAM_FILTER_WRITE => $stream->prependStreamFilterOnWrite($filtername, $params),
default => $stream->prependStreamFilterOnRead($filtername, $params),
};
}


$filter = Warning::cloak(stream_filter_prepend(...), $stream, $filtername, $mode, $params);
if (!is_resource($filter)) {
throw new RuntimeException('Could not append the registered stream filter: '.$filtername);
}

return $filter;
}









private static function appendFilter(int $mode, mixed $stream, string $filtername, mixed $params): mixed
{
self::filterFiltername($filtername);
self::filterStream($stream);

if ($stream instanceof AbstractCsv) {
return match ($mode) {
STREAM_FILTER_WRITE => $stream->appendStreamFilterOnWrite($filtername, $params),
default => $stream->appendStreamFilterOnRead($filtername, $params),
};
}


$filter = Warning::cloak(stream_filter_append(...), $stream, $filtername, $mode, $params);
if (!is_resource($filter)) {
throw new RuntimeException('Could not append the registered stream filter: '.$filtername);
}

return $filter;
}

private static function filterFiltername(string $filtername): void
{
if (!in_array($filtername, stream_get_filters(), true)) {
throw new LogicException('The stream filter "'.$filtername.'" is not registered.');
}
}






private static function filterStream(mixed $stream): void
{
if ($stream instanceof AbstractCsv) {
return;
}

if (!is_resource($stream)) {
throw new TypeError('Argument passed must be a stream resource, '.gettype($stream).' given.');
}

if ('stream' !== ($type = get_resource_type($stream))) {
throw new TypeError('Argument passed must be a stream resource, '.$type.' resource given');
}
}
}
<?php










declare(strict_types=1);

namespace League\Csv;

use Throwable;

interface UnableToProcessCsv extends Throwable
{
}
<?php

require __DIR__ . '/src/functions_include.php';

spl_autoload_register(static function (string $class): void {
if (!str_starts_with($class, 'League\Csv\\')) {
return;
}

$file = __DIR__ . '/src/' . str_replace('\\', '/', substr($class, 11)).'.php';
if (is_readable($file)) {
require $file;
}
});
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\ArrayUtils;

final class MergeReplaceKey implements MergeReplaceKeyInterface
{
public function __construct(protected mixed $data)
{
}




public function getData()
{
return $this->data;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\ArrayUtils;




interface MergeReplaceKeyInterface
{



public function getData();
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\ArrayUtils;

final class MergeRemoveKey
{
}
<?php 


declare(strict_types=1);

namespace Laminas\Stdlib;




interface JsonSerializable extends \JsonSerializable
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use Laminas\Stdlib\Exception;
use Laminas\Stdlib\StringUtils;

use function in_array;
use function strlen;
use function strpos;
use function strtoupper;
use function substr;


class Native extends AbstractStringWrapper
{






protected $encoding = 'ASCII';









public static function isSupported($encoding, $convertEncoding = null)
{
$encodingUpper = strtoupper($encoding);
$supportedEncodings = static::getSupportedEncodings();

if (! in_array($encodingUpper, $supportedEncodings)) {
return false;
}


if ($convertEncoding !== null && $encodingUpper !== strtoupper($convertEncoding)) {
return false;
}

return true;
}






public static function getSupportedEncodings()
{
return StringUtils::getSingleByteEncodings();
}








public function setEncoding($encoding, $convertEncoding = null)
{
$supportedEncodings = static::getSupportedEncodings();

$encodingUpper = strtoupper($encoding);
if (! in_array($encodingUpper, $supportedEncodings)) {
throw new Exception\InvalidArgumentException(
'Wrapper doesn\'t support character encoding "' . $encoding . '"'
);
}

if (null !== $convertEncoding && $encodingUpper !== strtoupper($convertEncoding)) {
$this->convertEncoding = $encodingUpper;
}

if ($convertEncoding !== null) {
if ($encodingUpper !== strtoupper($convertEncoding)) {
throw new Exception\InvalidArgumentException(
'Wrapper doesn\'t support to convert between character encodings'
);
}

$this->convertEncoding = $encodingUpper;
} else {
$this->convertEncoding = null;
}
$this->encoding = $encodingUpper;

return $this;
}







public function strlen($str)
{
return strlen($str);
}









public function substr($str, $offset = 0, $length = null)
{
return substr($str, $offset, $length);
}









public function strpos($haystack, $needle, $offset = 0)
{
return strpos($haystack, $needle, $offset);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use Laminas\Stdlib\Exception;
use Laminas\Stdlib\StringUtils;

use function floor;
use function in_array;
use function sprintf;
use function str_pad;
use function str_repeat;
use function strtoupper;
use function wordwrap;

use const STR_PAD_BOTH;
use const STR_PAD_LEFT;
use const STR_PAD_RIGHT;

abstract class AbstractStringWrapper implements StringWrapperInterface
{





protected $encoding = 'UTF-8';






protected $convertEncoding;









public static function isSupported($encoding, $convertEncoding = null)
{
$supportedEncodings = static::getSupportedEncodings();

if (! in_array(strtoupper($encoding), $supportedEncodings)) {
return false;
}

if ($convertEncoding !== null && ! in_array(strtoupper($convertEncoding), $supportedEncodings)) {
return false;
}

return true;
}








public function setEncoding($encoding, $convertEncoding = null)
{
$supportedEncodings = static::getSupportedEncodings();

$encodingUpper = strtoupper($encoding);
if (! in_array($encodingUpper, $supportedEncodings)) {
throw new Exception\InvalidArgumentException(
'Wrapper doesn\'t support character encoding "' . $encoding . '"'
);
}

if ($convertEncoding !== null) {
$convertEncodingUpper = strtoupper($convertEncoding);
if (! in_array($convertEncodingUpper, $supportedEncodings)) {
throw new Exception\InvalidArgumentException(
'Wrapper doesn\'t support character encoding "' . $convertEncoding . '"'
);
}

$this->convertEncoding = $convertEncodingUpper;
} else {
$this->convertEncoding = null;
}
$this->encoding = $encodingUpper;

return $this;
}







public function getEncoding()
{
return $this->encoding;
}






public function getConvertEncoding()
{
return $this->convertEncoding;
}








public function convert($str, $reverse = false)
{
$encoding = $this->getEncoding();
$convertEncoding = $this->getConvertEncoding();
if ($convertEncoding === null) {
throw new Exception\LogicException(
'No convert encoding defined'
);
}

if ($encoding === $convertEncoding) {
return $str;
}

$from = $reverse ? $convertEncoding : $encoding;
$to = $reverse ? $encoding : $convertEncoding;
throw new Exception\RuntimeException(sprintf(
'Converting from "%s" to "%s" isn\'t supported by this string wrapper',
$from ?? '',
$to ?? ''
));
}










public function wordWrap($string, $width = 75, $break = "\n", $cut = false)
{
$string = (string) $string;
if ($string === '') {
return '';
}

$break = (string) $break;
if ($break === '') {
throw new Exception\InvalidArgumentException('Break string cannot be empty');
}

$width = (int) $width;
if ($width === 0 && $cut) {
throw new Exception\InvalidArgumentException('Cannot force cut when width is zero');
}

if (null === $this->getEncoding() || StringUtils::isSingleByteEncoding($this->getEncoding())) {
return wordwrap($string, $width, $break, $cut);
}

$stringWidth = $this->strlen($string);
$breakWidth = $this->strlen($break);

$result = '';
$lastStart = $lastSpace = 0;

for ($current = 0; $current < $stringWidth; $current++) {
$char = $this->substr($string, $current, 1);

$possibleBreak = $char;
if ($breakWidth !== 1) {
$possibleBreak = $this->substr($string, $current, $breakWidth);
}

if ($possibleBreak === $break) {
$result .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth);
$current += $breakWidth - 1;
$lastStart = $lastSpace = $current + 1;
continue;
}

if ($char === ' ') {
if ($current - $lastStart >= $width) {
$result .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
$lastStart = $current + 1;
}

$lastSpace = $current;
continue;
}

if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) {
$result .= $this->substr($string, $lastStart, $current - $lastStart) . $break;
$lastStart = $lastSpace = $current;
continue;
}

if ($current - $lastStart >= $width && $lastStart < $lastSpace) {
$result .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break;
$lastStart = $lastSpace += 1;
continue;
}
}

if ($lastStart !== $current) {
$result .= $this->substr($string, $lastStart, $current - $lastStart);
}

return $result;
}










public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT)
{
if (null === $this->getEncoding() || StringUtils::isSingleByteEncoding($this->getEncoding())) {
return str_pad($input, $padLength, $padString, $padType);
}

$lengthOfPadding = $padLength - $this->strlen($input);
if ($lengthOfPadding <= 0) {
return $input;
}

$padStringLength = $this->strlen($padString);
if ($padStringLength === 0) {
return $input;
}

$repeatCount = (int) floor($lengthOfPadding / $padStringLength);

if ($padType === STR_PAD_BOTH) {
$repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2;

$lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength;
$lastStringLeftLength = $lastStringRightLength = (int) floor($lastStringLength / 2);
$lastStringRightLength += $lastStringLength % 2;

$lastStringLeft = $this->substr($padString, 0, $lastStringLeftLength);
$lastStringRight = $this->substr($padString, 0, $lastStringRightLength);

return str_repeat($padString, $repeatCountLeft) . $lastStringLeft
. $input
. str_repeat($padString, $repeatCountRight) . $lastStringRight;
}

$lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength);

if ($padType === STR_PAD_LEFT) {
return str_repeat($padString, $repeatCount) . $lastString . $input;
}

return $input . str_repeat($padString, $repeatCount) . $lastString;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use const STR_PAD_RIGHT;

interface StringWrapperInterface
{








public static function isSupported($encoding, $convertEncoding = null);






public static function getSupportedEncodings();








public function setEncoding($encoding, $convertEncoding = null);






public function getEncoding();






public function getConvertEncoding();







public function strlen($str);









public function substr($str, $offset = 0, $length = null);









public function strpos($haystack, $needle, $offset = 0);








public function convert($str, $reverse = false);










public function wordWrap($str, $width = 75, $break = "\n", $cut = false);










public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT);
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use Laminas\Stdlib\Exception;

use function array_map;
use function array_search;
use function extension_loaded;
use function mb_convert_encoding;
use function mb_list_encodings;
use function mb_strlen;
use function mb_strpos;
use function mb_substr;


class MbString extends AbstractStringWrapper
{







protected static $encodings;






public static function getSupportedEncodings()
{
if (static::$encodings === null) {
static::$encodings = array_map('strtoupper', mb_list_encodings());


$indexIso885916 = array_search('ISO-8859-16', static::$encodings, true);
if ($indexIso885916 !== false) {
unset(static::$encodings[$indexIso885916]);
}
}

return static::$encodings;
}






public function __construct()
{
if (! extension_loaded('mbstring')) {
throw new Exception\ExtensionNotLoadedException(
'PHP extension "mbstring" is required for this wrapper'
);
}
}







public function strlen($str)
{
return mb_strlen($str, $this->getEncoding());
}









public function substr($str, $offset = 0, $length = null)
{
return mb_substr($str, $offset, $length, $this->getEncoding());
}









public function strpos($haystack, $needle, $offset = 0)
{
return mb_strpos($haystack, $needle, $offset, $this->getEncoding());
}








public function convert($str, $reverse = false)
{
$encoding = $this->getEncoding();
$convertEncoding = $this->getConvertEncoding();

if ($convertEncoding === null) {
throw new Exception\LogicException(
'No convert encoding defined'
);
}

if ($encoding === $convertEncoding) {
return $str;
}

$fromEncoding = $reverse ? $convertEncoding : $encoding;
$toEncoding = $reverse ? $encoding : $convertEncoding;

return mb_convert_encoding($str, $toEncoding ?? '', $fromEncoding ?? '');
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use Laminas\Stdlib\Exception;

use function extension_loaded;
use function grapheme_strlen;
use function grapheme_strpos;
use function grapheme_substr;


class Intl extends AbstractStringWrapper
{





protected static $encodings = ['UTF-8'];






public static function getSupportedEncodings()
{
return static::$encodings;
}






public function __construct()
{
if (! extension_loaded('intl')) {
throw new Exception\ExtensionNotLoadedException(
'PHP extension "intl" is required for this wrapper'
);
}
}







public function strlen($str)
{
$len = grapheme_strlen($str);
return $len ?? false;
}









public function substr($str, $offset = 0, $length = null)
{

if ($length !== null) {
return grapheme_substr($str, $offset, $length);
}

return grapheme_substr($str, $offset);
}









public function strpos($haystack, $needle, $offset = 0)
{
return grapheme_strpos($haystack, $needle, $offset);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\StringWrapper;

use Laminas\Stdlib\Exception;

use function assert;
use function extension_loaded;
use function iconv;
use function iconv_strlen;
use function iconv_strpos;
use function iconv_substr;


class Iconv extends AbstractStringWrapper
{







protected static $encodings = [

'ASCII',
'ISO-8859-1',
'ISO-8859-2',
'ISO-8859-3',
'ISO-8859-4',
'ISO-8859-5',
'ISO-8859-7',
'ISO-8859-9',
'ISO-8859-10',
'ISO-8859-13',
'ISO-8859-14',
'ISO-8859-15',
'ISO-8859-16',
'KOI8-R',
'KOI8-U',
'KOI8-RU',
'CP1250',
'CP1251',
'CP1252',
'CP1253',
'CP1254',
'CP1257',
'CP850',
'CP866',
'CP1131',
'MACROMAN',
'MACCENTRALEUROPE',
'MACICELAND',
'MACCROATIAN',
'MACROMANIA',
'MACCYRILLIC',
'MACUKRAINE',
'MACGREEK',
'MACTURKISH',
'MACINTOSH',


'ISO-8859-6',
'ISO-8859-8',
'CP1255',
'CP1256',
'CP862',
'MACHEBREW',
'MACARABIC',


'EUC-JP',
'SHIFT_JIS',
'CP932',
'ISO-2022-JP',
'ISO-2022-JP-2',
'ISO-2022-JP-1',


'EUC-CN',
'HZ',
'GBK',
'CP936',
'GB18030',
'EUC-TW',
'BIG5',
'CP950',
'BIG5-HKSCS',
'BIG5-HKSCS:2004',
'BIG5-HKSCS:2001',
'BIG5-HKSCS:1999',
'ISO-2022-CN',
'ISO-2022-CN-EXT',


'EUC-KR',
'CP949',
'ISO-2022-KR',
'JOHAB',


'ARMSCII-8',


'GEORGIAN-ACADEMY',
'GEORGIAN-PS',


'KOI8-T',


'PT154',
'RK1048',


'ISO-8859-11',
'TIS-620',
'CP874',
'MACTHAI',


'MULELAO-1',
'CP1133',


'VISCII',
'TCVN',
'CP1258',


'HP-ROMAN8',
'NEXTSTEP',


'UTF-8',
'UCS-2',
'UCS-2BE',
'UCS-2LE',
'UCS-4',
'UCS-4BE',
'UCS-4LE',
'UTF-16',
'UTF-16BE',
'UTF-16LE',
'UTF-32',
'UTF-32BE',
'UTF-32LE',
'UTF-7',
'C99',
'JAVA',

















'CP437',
'CP737',
'CP775',
'CP852',
'CP853',
'CP855',
'CP857',
'CP858',
'CP860',
'CP861',
'CP863',
'CP865',
'CP869',
'CP1125',


'CP864',


'EUC-JISX0213',
'Shift_JISX0213',
'ISO-2022-JP-3',


'BIG5-2003', 


'TDS565',


'ATARIST',
'RISCOS-LATIN1',
];






public static function getSupportedEncodings()
{
return static::$encodings;
}






public function __construct()
{
if (! extension_loaded('iconv')) {
throw new Exception\ExtensionNotLoadedException(
'PHP extension "iconv" is required for this wrapper'
);
}
}







public function strlen($str)
{
return iconv_strlen($str, $this->getEncoding());
}









public function substr($str, $offset = 0, $length = null)
{
$length ??= $this->strlen($str);
assert($length !== false);

return iconv_substr($str, $offset, $length, $this->getEncoding());
}









public function strpos($haystack, $needle, $offset = 0)
{
$encoding = $this->getEncoding();
assert($encoding !== null);

return iconv_strpos($haystack, $needle, $offset, $encoding);
}








public function convert($str, $reverse = false)
{
$encoding = $this->getEncoding();
$convertEncoding = $this->getConvertEncoding();
if ($convertEncoding === null) {
throw new Exception\LogicException(
'No convert encoding defined'
);
}

if ($encoding === $convertEncoding) {
return $str;
}

$fromEncoding = $reverse ? $convertEncoding : $encoding;
$toEncoding = $reverse ? $encoding : $convertEncoding;

if (null === $toEncoding || null === $fromEncoding) {
return $str;
}



return iconv($fromEncoding, $toEncoding . '//IGNORE', $str);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

interface ResponseInterface extends MessageInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

class Request extends Message implements RequestInterface
{

}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Traversable;

use function array_shift;
use function assert;
use function get_object_vars;
use function is_array;
use function is_callable;
use function is_string;
use function method_exists;
use function preg_replace_callback;
use function sprintf;
use function str_replace;
use function strtolower;
use function ucwords;

/**
@template
@implements
@psalm-no-seal-properties
*/
abstract class AbstractOptions implements ParameterObjectInterface
{








protected $__strictMode__ = true;








public function __construct($options = null)
{
if (null !== $options) {
$this->setFromArray($options);
}
}








public function setFromArray($options)
{
if ($options instanceof self) {
$options = $options->toArray();
}

if (! is_array($options) && ! $options instanceof Traversable) {
throw new Exception\InvalidArgumentException(
sprintf(
'Parameter provided to %s must be an %s, %s or %s',
__METHOD__,
'array',
'Traversable',
self::class
)
);
}

foreach ($options as $key => $value) {
$this->__set($key, $value);
}

return $this;
}






public function toArray()
{
$array = [];

$transform = static function (array $letters): string {

$letter = array_shift($letters);
return '_' . strtolower((string) $letter);
};

/**
@psalm-var */
foreach (get_object_vars($this) as $key => $value) {
if ($key === '__strictMode__') {
continue;
}
$normalizedKey = preg_replace_callback('/([A-Z])/', $transform, $key);
assert(is_string($normalizedKey));
$array[$normalizedKey] = $value;
}

return $array;
}











public function __set($key, $value)
{
$setter = 'set' . str_replace('_', '', $key);

if (is_callable([$this, $setter])) {
$this->{$setter}($value);

return;
}

if ($this->__strictMode__) {
throw new Exception\BadMethodCallException(sprintf(
'The option "%s" does not have a callable "%s" ("%s") setter method which must be defined',
$key,
'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))),
$setter
));
}
}










public function __get($key)
{
$getter = 'get' . str_replace('_', '', $key);

if (is_callable([$this, $getter])) {
return $this->{$getter}();
}

throw new Exception\BadMethodCallException(sprintf(
'The option "%s" does not have a callable "%s" getter method which must be defined',
$key,
'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))
));
}









public function __isset($key)
{
$getter = 'get' . str_replace('_', '', $key);

return method_exists($this, $getter) && null !== $this->__get($key);
}










public function __unset($key)
{
try {
$this->__set($key, null);
} catch (Exception\BadMethodCallException $e) {
throw new Exception\InvalidArgumentException(
'The class property $' . $key . ' cannot be unset as'
. ' NULL is an invalid value for it',
0,
$e
);
}
}
}
<?php 


declare(strict_types=1);

namespace Laminas\Stdlib;

use Laminas\Stdlib\StringWrapper\Iconv;
use Laminas\Stdlib\StringWrapper\Intl;
use Laminas\Stdlib\StringWrapper\MbString;
use Laminas\Stdlib\StringWrapper\Native;
use Laminas\Stdlib\StringWrapper\StringWrapperInterface;

use function array_search;
use function defined;
use function extension_loaded;
use function in_array;
use function is_string;
use function preg_match;
use function strtoupper;







abstract class StringUtils
{





protected static $wrapperRegistry;






protected static $singleByteEncodings = [
'ASCII',
'7BIT',
'8BIT',
'ISO-8859-1',
'ISO-8859-2',
'ISO-8859-3',
'ISO-8859-4',
'ISO-8859-5',
'ISO-8859-6',
'ISO-8859-7',
'ISO-8859-8',
'ISO-8859-9',
'ISO-8859-10',
'ISO-8859-11',
'ISO-8859-13',
'ISO-8859-14',
'ISO-8859-15',
'ISO-8859-16',
'CP-1251',
'CP-1252',

];






protected static $hasPcreUnicodeSupport;

/**
@psalm-return



*/
public static function getRegisteredWrappers()
{
if (static::$wrapperRegistry === null) {
static::$wrapperRegistry = [];

if (extension_loaded('intl')) {
static::$wrapperRegistry[] = Intl::class;
}

if (extension_loaded('mbstring')) {
static::$wrapperRegistry[] = MbString::class;
}

if (extension_loaded('iconv')) {
static::$wrapperRegistry[] = Iconv::class;
}

static::$wrapperRegistry[] = Native::class;
}

return static::$wrapperRegistry;
}







public static function registerWrapper($wrapper)
{
$wrapper = (string) $wrapper;

if (! in_array($wrapper, static::getRegisteredWrappers(), true)) {
static::$wrapperRegistry[] = $wrapper;
}
}







public static function unregisterWrapper($wrapper)
{

$index = array_search((string) $wrapper, static::getRegisteredWrappers(), true);
if ($index !== false) {
unset(static::$wrapperRegistry[$index]);
}
}






public static function resetRegisteredWrappers()
{
static::$wrapperRegistry = null;
}










public static function getWrapper($encoding = 'UTF-8', $convertEncoding = null)
{
foreach (static::getRegisteredWrappers() as $wrapperClass) {
if ($wrapperClass::isSupported($encoding, $convertEncoding)) {
$wrapper = new $wrapperClass($encoding, $convertEncoding);
$wrapper->setEncoding($encoding, $convertEncoding);
return $wrapper;
}
}

throw new Exception\RuntimeException(
'No wrapper found supporting "' . $encoding . '"'
. ($convertEncoding !== null ? ' and "' . $convertEncoding . '"' : '')
);
}






public static function getSingleByteEncodings()
{
return static::$singleByteEncodings;
}







public static function isSingleByteEncoding($encoding)
{
return in_array(strtoupper($encoding), static::$singleByteEncodings);
}







public static function isValidUtf8($str)
{
return is_string($str) && ($str === '' || preg_match('/^./su', $str) === 1);
}






public static function hasPcreUnicodeSupport()
{
if (static::$hasPcreUnicodeSupport === null) {
ErrorHandler::start();
static::$hasPcreUnicodeSupport = defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') === 1;
ErrorHandler::stop();
}
return static::$hasPcreUnicodeSupport;
}
}
<?php 


declare(strict_types=1);

namespace Laminas\Stdlib;

use Iterator;
use Laminas\Stdlib\ArrayUtils\MergeRemoveKey;
use Laminas\Stdlib\ArrayUtils\MergeReplaceKeyInterface;
use Traversable;

use function array_filter;
use function array_key_exists;
use function array_keys;
use function array_values;
use function in_array;
use function is_array;
use function is_callable;
use function is_float;
use function is_int;
use function is_object;
use function is_scalar;
use function is_string;
use function iterator_to_array;
use function method_exists;
use function sprintf;






abstract class ArrayUtils
{





public const ARRAY_FILTER_USE_BOTH = 1;






public const ARRAY_FILTER_USE_KEY = 2;







public static function hasStringKeys(mixed $value, $allowEmpty = false)
{
if (! is_array($value)) {
return false;
}

if (! $value) {
return $allowEmpty;
}

return [] !== array_filter(array_keys($value), 'is_string');
}







public static function hasIntegerKeys(mixed $value, $allowEmpty = false)
{
if (! is_array($value)) {
return false;
}

if (! $value) {
return $allowEmpty;
}

return [] !== array_filter(array_keys($value), 'is_int');
}














public static function hasNumericKeys(mixed $value, $allowEmpty = false)
{
if (! is_array($value)) {
return false;
}

if (! $value) {
return $allowEmpty;
}

return [] !== array_filter(array_keys($value), 'is_numeric');
}




















public static function isList(mixed $value, $allowEmpty = false)
{
if (! is_array($value)) {
return false;
}

if (! $value) {
return $allowEmpty;
}

return array_values($value) === $value;
}





























public static function isHashTable(mixed $value, $allowEmpty = false)
{
if (! is_array($value)) {
return false;
}

if (! $value) {
return $allowEmpty;
}

return array_values($value) !== $value;
}














public static function inArray(mixed $needle, array $haystack, $strict = false)
{
if ((bool) $strict === false) {
if (is_int($needle) || is_float($needle)) {
$needle = (string) $needle;
}
if (is_string($needle)) {
foreach ($haystack as &$h) {
if (is_int($h) || is_float($h)) {
$h = (string) $h;
}
}
}
}

return in_array($needle, $haystack, (bool) $strict);
}

/**
@template
@template







*/
public static function iteratorToArray($iterator, $recursive = true)
{
/**
@psalm-suppress */
if (! is_array($iterator) && ! $iterator instanceof Traversable) {
throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable object');
}

if (! $recursive) {
if (is_array($iterator)) {
return $iterator;
}

return iterator_to_array($iterator);
}

if (
is_object($iterator)
&& ! $iterator instanceof Iterator
&& method_exists($iterator, 'toArray')
) {
/**
@psalm-var */
$array = $iterator->toArray();

return $array;
}

$array = [];
foreach ($iterator as $key => $value) {
if (is_scalar($value)) {
$array[$key] = $value;
continue;
}

if ($value instanceof Traversable) {
$array[$key] = static::iteratorToArray($value, $recursive);
continue;
}

if (is_array($value)) {
$array[$key] = static::iteratorToArray($value, $recursive);
continue;
}

$array[$key] = $value;
}

/**
@psalm-var */

return $array;
}











public static function merge(array $a, array $b, $preserveNumericKeys = false)
{
foreach ($b as $key => $value) {
if ($value instanceof MergeReplaceKeyInterface) {
$a[$key] = $value->getData();
} elseif (isset($a[$key]) || array_key_exists($key, $a)) {
if ($value instanceof MergeRemoveKey) {
unset($a[$key]);
} elseif (! $preserveNumericKeys && is_int($key)) {
$a[] = $value;
} elseif (is_array($value) && is_array($a[$key])) {
$a[$key] = static::merge($a[$key], $value, $preserveNumericKeys);
} else {
$a[$key] = $value;
}
} else {
if (! $value instanceof MergeRemoveKey) {
$a[$key] = $value;
}
}
}

return $a;
}









public static function filter(array $data, $callback, $flag = null)
{
if (! is_callable($callback)) {
throw new Exception\InvalidArgumentException(sprintf(
'Second parameter of %s must be callable',
__METHOD__
));
}

return array_filter($data, $callback, $flag ?? 0);
}
}
<?php 


declare(strict_types=1);

namespace Laminas\Stdlib;

use function array_merge;
use function array_unique;
use function defined;
use function glob;
use function strlen;
use function strpos;
use function substr;

use const GLOB_BRACE;
use const GLOB_ERR;
use const GLOB_MARK;
use const GLOB_NOCHECK;
use const GLOB_NOESCAPE;
use const GLOB_NOSORT;
use const GLOB_ONLYDIR;




abstract class Glob
{



public const GLOB_MARK = 0x01;
public const GLOB_NOSORT = 0x02;
public const GLOB_NOCHECK = 0x04;
public const GLOB_NOESCAPE = 0x08;
public const GLOB_BRACE = 0x10;
public const GLOB_ONLYDIR = 0x20;
public const GLOB_ERR = 0x40;













public static function glob($pattern, $flags = 0, $forceFallback = false)
{
if (! defined('GLOB_BRACE') || $forceFallback) {
return static::fallbackGlob($pattern, $flags);
}

return static::systemGlob($pattern, $flags);
}









protected static function systemGlob($pattern, $flags)
{
if ($flags) {
$flagMap = [
self::GLOB_MARK => GLOB_MARK,
self::GLOB_NOSORT => GLOB_NOSORT,
self::GLOB_NOCHECK => GLOB_NOCHECK,
self::GLOB_NOESCAPE => GLOB_NOESCAPE,
self::GLOB_BRACE => defined('GLOB_BRACE') ? GLOB_BRACE : 0,
self::GLOB_ONLYDIR => GLOB_ONLYDIR,
self::GLOB_ERR => GLOB_ERR,
];

$globFlags = 0;

foreach ($flagMap as $internalFlag => $globFlag) {
if ($flags & $internalFlag) {
$globFlags |= $globFlag;
}
}
} else {
$globFlags = 0;
}

ErrorHandler::start();
$res = glob($pattern, $globFlags);
$err = ErrorHandler::stop();
if ($res === false) {
throw new Exception\RuntimeException("glob('{$pattern}', {$globFlags}) failed", 0, $err);
}
return $res;
}









protected static function fallbackGlob($pattern, $flags)
{
if (! self::flagsIsEqualTo($flags, self::GLOB_BRACE)) {
return static::systemGlob($pattern, $flags);
}

$flags &= ~self::GLOB_BRACE;
$length = strlen($pattern);
$paths = [];

if ($flags & self::GLOB_NOESCAPE) {
$begin = strpos($pattern, '{');
} else {
$begin = 0;

while (true) {
if ($begin === $length) {
$begin = false;
break;
} elseif ($pattern[$begin] === '\\' && ($begin + 1) < $length) {
$begin++;
} elseif ($pattern[$begin] === '{') {
break;
}

$begin++;
}
}

if ($begin === false) {
return static::systemGlob($pattern, $flags);
}

$next = static::nextBraceSub($pattern, $begin + 1, $flags);

if ($next === null) {
return static::systemGlob($pattern, $flags);
}

$rest = $next;

while ($pattern[$rest] !== '}') {
$rest = static::nextBraceSub($pattern, $rest + 1, $flags);

if ($rest === null) {
return static::systemGlob($pattern, $flags);
}
}

$p = $begin + 1;

while (true) {
$subPattern = substr($pattern, 0, $begin)
. substr($pattern, $p, $next - $p)
. substr($pattern, $rest + 1);

$result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE);

if ($result) {
$paths = array_merge($paths, $result);
}

if ($pattern[$next] === '}') {
break;
}

$p = $next + 1;
$next = static::nextBraceSub($pattern, $p, $flags);
}

return array_unique($paths);
}









protected static function nextBraceSub($pattern, $begin, $flags)
{
$length = strlen($pattern);
$depth = 0;
$current = $begin;

while ($current < $length) {
$flagsEqualsNoEscape = self::flagsIsEqualTo($flags, self::GLOB_NOESCAPE);

if ($flagsEqualsNoEscape && $pattern[$current] === '\\') {
if (++$current === $length) {
break;
}

$current++;
} else {
if (
($pattern[$current] === '}' && $depth-- === 0)
|| ($pattern[$current] === ',' && $depth === 0)
) {
break;
} elseif ($pattern[$current++] === '{') {
$depth++;
}
}
}

return $current < $length ? $current : null;
}


public static function flagsIsEqualTo(int $flags, int $otherFlags): bool
{
return (bool) ($flags & $otherFlags);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

/**
@template
@template
*/
interface ParameterObjectInterface
{





public function __set($key, mixed $value);





public function __get($key);





public function __isset($key);





public function __unset($key);
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ReturnTypeWillChange;
use Serializable;
use UnexpectedValueException;

use function is_array;
use function serialize;
use function sprintf;
use function unserialize;

/**
@template
@template
@extends


*/
class SplQueue extends \SplQueue implements Serializable
{





public function toArray()
{
$array = [];
foreach ($this as $item) {
$array[] = $item;
}
return $array;
}






#[ReturnTypeWillChange]
public function serialize()
{
return serialize($this->__serialize());
}






#[ReturnTypeWillChange]
public function __serialize()
{
return $this->toArray();
}







#[ReturnTypeWillChange]
public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

$this->__unserialize($toUnserialize);
}







#[ReturnTypeWillChange]
public function __unserialize($data)
{
foreach ($data as $item) {
$this->push($item);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ArrayObject as PhpArrayObject;
use ReturnTypeWillChange;

use function http_build_query;
use function parse_str;

/**
@template
@template
@template-extends
@template-implements
*/
class Parameters extends PhpArrayObject implements ParametersInterface
{








public function __construct(?array $values = null)
{
if (null === $values) {
$values = [];
}
parent::__construct($values, ArrayObject::ARRAY_AS_PROPS);
}







public function fromArray(array $values)
{
$this->exchangeArray($values);
}







public function fromString($string)
{
$array = [];
parse_str($string, $array);
$this->fromArray($array);
}






public function toArray()
{
return $this->getArrayCopy();
}






public function toString()
{
return http_build_query($this->toArray());
}









#[ReturnTypeWillChange]
public function offsetGet($name)
{
if ($this->offsetExists($name)) {
return parent::offsetGet($name);
}

return null;
}

/**
@template



*/
public function get($name, $default = null)
{
if ($this->offsetExists($name)) {
return parent::offsetGet($name);
}
return $default;
}






public function set($name, $value)
{
$this[$name] = $value;
return $this;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

class Response extends Message implements ResponseInterface
{

}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use AllowDynamicProperties;
use ArrayAccess;
use ArrayIterator;
use Countable;
use Iterator;
use IteratorAggregate;
use ReturnTypeWillChange;
use Serializable;
use UnexpectedValueException;

use function array_key_exists;
use function array_keys;
use function asort;
use function class_exists;
use function count;
use function get_debug_type;
use function get_object_vars;
use function gettype;
use function in_array;
use function is_array;
use function is_callable;
use function is_object;
use function is_string;
use function ksort;
use function natcasesort;
use function natsort;
use function serialize;
use function sprintf;
use function str_starts_with;
use function trigger_error;
use function uasort;
use function uksort;
use function unserialize;

use const E_USER_DEPRECATED;

/**
@template
@template
@template-implements
@template-implements
@psalm-no-seal-properties




*/
#[AllowDynamicProperties]
class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable
{




public const STD_PROP_LIST = 1;




public const ARRAY_AS_PROPS = 2;


protected $storage;


protected $flag;


protected $iteratorClass;


protected $protectedProperties;






public function __construct($input = [], $flags = self::STD_PROP_LIST, $iteratorClass = ArrayIterator::class)
{
$this->setFlags($flags);
$this->storage = $input;
$this->setIteratorClass($iteratorClass);
$this->protectedProperties = array_keys(get_object_vars($this));
}







public function __isset(mixed $key)
{
if ($this->flag === self::ARRAY_AS_PROPS) {
return $this->offsetExists($key);
}

if (in_array($key, $this->protectedProperties)) {
throw new Exception\InvalidArgumentException("$key is a protected property, use a different key");
}

return isset($this->$key);
}








public function __set(mixed $key, mixed $value)
{
if ($this->flag === self::ARRAY_AS_PROPS) {
$this->offsetSet($key, $value);
return;
}

if (in_array($key, $this->protectedProperties)) {
throw new Exception\InvalidArgumentException("$key is a protected property, use a different key");
}

$this->$key = $value;
}







public function __unset(mixed $key)
{
if ($this->flag === self::ARRAY_AS_PROPS) {
$this->offsetUnset($key);
return;
}

if (in_array($key, $this->protectedProperties)) {
throw new Exception\InvalidArgumentException("$key is a protected property, use a different key");
}

unset($this->$key);
}







public function &__get(mixed $key)
{
if ($this->flag === self::ARRAY_AS_PROPS) {
$ret = &$this->offsetGet($key);

return $ret;
}

if (in_array($key, $this->protectedProperties, true)) {
throw new Exception\InvalidArgumentException("$key is a protected property, use a different key");
}

return $this->$key;
}







public function append(mixed $value)
{
$this->storage[] = $value;
}






public function asort()
{
asort($this->storage);
}






#[ReturnTypeWillChange]
public function count()
{
return count($this->storage);
}









public function exchangeArray($data)
{
if (! is_array($data) && ! is_object($data)) {
throw new Exception\InvalidArgumentException(
'Passed variable is not an array or object, using empty array instead'
);
}

if (! is_array($data)) {
trigger_error(
sprintf(
'Passing a non-array value to "%s" is deprecated and will be removed in the next major version',
__METHOD__,
),
E_USER_DEPRECATED,
);
}

if ($data instanceof self || $data instanceof \ArrayObject) {
$data = $data->getArrayCopy();
}
if (! is_array($data)) {
$data = (array) $data;
}

$storage = $this->storage;

$this->storage = $data;

return $storage;
}






public function getArrayCopy()
{
return $this->storage;
}






public function getFlags()
{
return $this->flag;
}






#[ReturnTypeWillChange]
public function getIterator()
{
$class = $this->iteratorClass;

return new $class($this->storage);
}






public function getIteratorClass()
{
return $this->iteratorClass;
}






public function ksort()
{
ksort($this->storage);
}






public function natcasesort()
{
natcasesort($this->storage);
}






public function natsort()
{
natsort($this->storage);
}







#[ReturnTypeWillChange]
public function offsetExists(mixed $key)
{
return isset($this->storage[$key]);
}







#[ReturnTypeWillChange]
public function &offsetGet(mixed $key)
{
$ret = null;
if (! $this->offsetExists($key)) {
return $ret;
}
$ret = &$this->storage[$key];

return $ret;
}








#[ReturnTypeWillChange]
public function offsetSet(mixed $offset, mixed $value)
{
$this->storage[$offset] = $value;
}







#[ReturnTypeWillChange]
public function offsetUnset(mixed $offset)
{
if ($this->offsetExists($offset)) {
unset($this->storage[$offset]);
}
}






public function serialize()
{
return serialize($this->__serialize());
}






public function __serialize()
{
return get_object_vars($this);
}







public function setFlags($flags)
{
$this->flag = $flags;
}







public function setIteratorClass($class)
{
if (class_exists($class)) {
$this->iteratorClass = $class;

return;
}

if (str_starts_with($class, '\\')) {
$class = '\\' . $class;
if (class_exists($class)) {
$this->iteratorClass = $class;

return;
}
}

throw new Exception\InvalidArgumentException('The iterator class does not exist');
}







public function uasort($function)
{
if (is_callable($function)) {
uasort($this->storage, $function);
}
}







public function uksort($function)
{
if (is_callable($function)) {
uksort($this->storage, $function);
}
}







public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

$this->__unserialize($toUnserialize);
}







public function __unserialize($data)
{
$this->protectedProperties = array_keys(get_object_vars($this));


if (array_key_exists('flag', $data)) {
$this->setFlags((int) $data['flag']);
unset($data['flag']);
}

if (array_key_exists('storage', $data)) {
if (! is_array($data['storage']) && ! is_object($data['storage'])) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance: corrupt storage data; expected array or object, received %s',
self::class,
gettype($data['storage'])
));
}
$this->exchangeArray($data['storage']);
unset($data['storage']);
}

if (array_key_exists('iteratorClass', $data)) {
if (! is_string($data['iteratorClass'])) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance: invalid iteratorClass; expected string, received %s',
self::class,
get_debug_type($data['iteratorClass'])
));
}
$this->setIteratorClass($data['iteratorClass']);
unset($data['iteratorClass']);
}

unset($data['protectedProperties']);


foreach ($data as $k => $v) {
$this->__set($k, $v);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

interface ArraySerializableInterface
{





public function exchangeArray(array $array);






public function getArrayCopy();
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ReturnTypeWillChange;
use Serializable;
use UnexpectedValueException;

use function is_array;
use function serialize;
use function sprintf;
use function unserialize;

/**
@template
@extends


*/
class SplStack extends \SplStack implements Serializable
{





public function toArray()
{
$array = [];
foreach ($this as $item) {
$array[] = $item;
}
return $array;
}






#[ReturnTypeWillChange]
public function serialize()
{
return serialize($this->__serialize());
}






#[ReturnTypeWillChange]
public function __serialize()
{
return $this->toArray();
}







#[ReturnTypeWillChange]
public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

$this->__unserialize($toUnserialize);
}







#[ReturnTypeWillChange]
public function __unserialize($data)
{
foreach ($data as $item) {
$this->unshift($item);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Traversable;

use function array_key_exists;
use function get_debug_type;
use function is_array;
use function is_scalar;
use function sprintf;

class Message implements MessageInterface
{

protected $metadata = [];


protected $content = '';












public function setMetadata($spec, $value = null)
{
if (is_scalar($spec)) {
$this->metadata[$spec] = $value;
return $this;
}
if (! is_array($spec) && ! $spec instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'Expected a string, array, or Traversable argument in first position; received "%s"',
get_debug_type($spec)
));
}
foreach ($spec as $key => $value) {
$this->metadata[$key] = $value;
}
return $this;
}









public function getMetadata($key = null, $default = null)
{
if (null === $key) {
return $this->metadata;
}

if (! is_scalar($key)) {
throw new Exception\InvalidArgumentException('Non-scalar argument provided for key');
}

if (array_key_exists($key, $this->metadata)) {
return $this->metadata[$key];
}

return $default;
}







public function setContent($value)
{
$this->content = $value;
return $this;
}






public function getContent()
{
return $this->content;
}




public function toString()
{
$request = '';
foreach ($this->getMetadata() as $key => $value) {
$request .= sprintf(
"%s: %s\r\n",
(string) $key,
(string) $value
);
}
$request .= "\r\n" . $this->getContent();
return $request;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ArrayAccess;
use Countable;
use Serializable;
use Traversable;

/**
@template
@template
@template-extends
@template-extends




*/
interface ParametersInterface extends ArrayAccess, Countable, Serializable, Traversable
{





public function __construct(?array $values = null);









public function fromArray(array $values);









public function fromString($string);








public function toArray();








public function toString();






public function get($name, $default = null);






public function set($name, $value);
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;






class LogicException extends \LogicException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;




interface ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;






class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;






class DomainException extends \DomainException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;






class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;




class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Exception;






class ExtensionNotLoadedException extends RuntimeException
{
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Countable;
use IteratorAggregate;
use ReturnTypeWillChange;
use Serializable;
use UnexpectedValueException;

use function array_map;
use function count;
use function is_array;
use function serialize;
use function sprintf;
use function unserialize;

/**
@template
@template
@implements











*/
class PriorityQueue implements Countable, IteratorAggregate, Serializable
{
public const EXTR_DATA = 0x00000001;
public const EXTR_PRIORITY = 0x00000002;
public const EXTR_BOTH = 0x00000003;






protected $queueClass = SplPriorityQueue::class;







protected $items = [];






protected $queue;










public function insert($data, $priority = 1)
{
/**
@psalm-var */
$priority = (int) $priority;
$this->items[] = [
'data' => $data,
'priority' => $priority,
];
$this->getQueue()->insert($data, $priority);
return $this;
}
















public function remove(mixed $datum)
{
$found = false;
$key = null;
foreach ($this->items as $key => $item) {
if ($item['data'] === $datum) {
$found = true;
break;
}
}
if ($found && $key !== null) {
unset($this->items[$key]);
$this->queue = null;

if (! $this->isEmpty()) {
$queue = $this->getQueue();
foreach ($this->items as $item) {
$queue->insert($item['data'], $item['priority']);
}
}
return true;
}
return false;
}






public function isEmpty()
{
return 0 === $this->count();
}






#[ReturnTypeWillChange]
public function count()
{
return count($this->items);
}






public function top()
{
$queue = clone $this->getQueue();

return $queue->top();
}






public function extract()
{
$value = $this->getQueue()->extract();

$keyToRemove = null;
$highestPriority = null;
foreach ($this->items as $key => $item) {
if ($item['data'] !== $value) {
continue;
}

if (null === $highestPriority) {
$highestPriority = $item['priority'];
$keyToRemove = $key;
continue;
}

if ($highestPriority >= $item['priority']) {
continue;
}

$highestPriority = $item['priority'];
$keyToRemove = $key;
}

if ($keyToRemove !== null) {
unset($this->items[$keyToRemove]);
}

return $value;
}













#[ReturnTypeWillChange]
public function getIterator()
{
$queue = $this->getQueue();
return clone $queue;
}






public function serialize()
{
return serialize($this->__serialize());
}






public function __serialize()
{
return $this->items;
}









public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

/**
@psalm-var */

$this->__unserialize($toUnserialize);
}







public function __unserialize($data)
{
foreach ($data as $item) {
$this->insert($item['data'], $item['priority']);
}
}

/**
@psalm-return($flag is self::EXTR_BOTH? list<array{data: TValue, priority: TPriority}>: $flag is self::EXTR_PRIORITY? list<TPriority>: list<TValue>)












*/
public function toArray($flag = self::EXTR_DATA)
{
return match ($flag) {
self::EXTR_BOTH => $this->items,
self::EXTR_PRIORITY => array_map(static fn($item): int => $item['priority'], $this->items),
default => array_map(static fn($item): mixed => $item['data'], $this->items),
};
}










public function setInternalQueueClass($class)
{
/**
@psalm-suppress */
$this->queueClass = (string) $class;
return $this;
}







public function contains($datum)
{
foreach ($this->items as $item) {
if ($item['data'] === $datum) {
return true;
}
}
return false;
}







public function hasPriority($priority)
{
foreach ($this->items as $item) {
if ($item['priority'] === $priority) {
return true;
}
}
return false;
}

/**
@psalm-assert




*/
protected function getQueue()
{
if (null === $this->queue) {
/**
@psalm-suppress */
$queue = new $this->queueClass();
/**
@psalm-var */
$this->queue = $queue;
/**
@psalm-suppress */
if (! $this->queue instanceof \SplPriorityQueue) {
throw new Exception\DomainException(sprintf(
'PriorityQueue expects an internal queue of type SplPriorityQueue; received "%s"',
$queue::class
));
}
}

return $this->queue;
}






public function __clone()
{
if (null !== $this->queue) {
$this->queue = clone $this->queue;
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ArrayIterator;
use ArrayObject as PhpArrayObject;
use ReturnTypeWillChange;

use function array_reverse;

/**
@template
@template
@template-extends


*/
class ArrayStack extends PhpArrayObject
{








#[ReturnTypeWillChange]
public function getIterator()
{
$array = $this->getArrayCopy();
return new ArrayIterator(array_reverse($array));
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

interface DispatchableInterface
{





public function dispatch(RequestInterface $request, ?ResponseInterface $response = null);
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use function function_exists;
use function fwrite;
use function getenv;
use function posix_isatty;
use function preg_replace;
use function sprintf;
use function str_replace;

use const DIRECTORY_SEPARATOR;
use const PHP_EOL;
use const STDERR;
use const STDOUT;



















class ConsoleHelper
{
public const COLOR_GREEN = "\033[32m";
public const COLOR_RED = "\033[31m";
public const COLOR_RESET = "\033[0m";

public const HIGHLIGHT_INFO = 'info';
public const HIGHLIGHT_ERROR = 'error';

/**
@psalm-var */
private array $highlightMap = [
self::HIGHLIGHT_INFO => self::COLOR_GREEN,
self::HIGHLIGHT_ERROR => self::COLOR_RED,
];


private string $eol = PHP_EOL;


private $stderr = STDERR;

private bool $supportsColor;




public function __construct($resource = STDOUT)
{
$this->supportsColor = $this->detectColorCapabilities($resource);
}











public function colorize($string)
{
$reset = $this->supportsColor ? self::COLOR_RESET : '';
foreach ($this->highlightMap as $key => $color) {
$pattern = sprintf('#<%s>(.*?)</%s>#s', $key, $key);
$color = $this->supportsColor ? $color : '';
$string = (string) preg_replace($pattern, $color . '$1' . $reset, $string);
}
return $string;
}







public function write($string, $colorize = true, $resource = STDOUT)
{
if ($colorize) {
$string = $this->colorize($string);
}

$string = $this->formatNewlines($string);

fwrite($resource, $string);
}







public function writeLine($string, $colorize = true, $resource = STDOUT)
{
$this->write($string . $this->eol, $colorize, $resource);
}











public function writeErrorMessage($message)
{
$this->writeLine(sprintf('<error>%s</error>', $message), true, $this->stderr);
$this->writeLine('', false, $this->stderr);
}





private function detectColorCapabilities($resource = STDOUT)
{
if ('\\' === DIRECTORY_SEPARATOR) {

return false !== getenv('ANSICON')
|| 'ON' === getenv('ConEmuANSI')
|| 'xterm' === getenv('TERM');
}

return function_exists('posix_isatty') && posix_isatty($resource);
}







private function formatNewlines($string)
{
$string = str_replace($this->eol, "\0PHP_EOL\0", $string);
$string = (string) preg_replace("/(\r\n|\n|\r)/", $this->eol, $string);
return str_replace("\0PHP_EOL\0", $this->eol, $string);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use ReturnTypeWillChange;
use Serializable;
use UnexpectedValueException;

use function array_key_exists;
use function get_debug_type;
use function is_array;
use function serialize;
use function sprintf;
use function unserialize;

use const PHP_INT_MAX;

/**
@template
@template
@extends





*/
class SplPriorityQueue extends \SplPriorityQueue implements Serializable
{

protected $serial = PHP_INT_MAX;











#[ReturnTypeWillChange] 
public function insert($value, $priority)
{
if (! is_array($priority)) {
$priority = [$priority, $this->serial--];
}

parent::insert($value, $priority);
}








public function toArray()
{
$array = [];
foreach (clone $this as $item) {
$array[] = $item;
}
return $array;
}






public function serialize()
{
return serialize($this->__serialize());
}






#[ReturnTypeWillChange]
public function __serialize()
{
$clone = clone $this;
$clone->setExtractFlags(self::EXTR_BOTH);

$data = [];
foreach ($clone as $item) {
$data[] = $item;
}
return $data;
}







public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

$this->__unserialize($toUnserialize);
}







#[ReturnTypeWillChange]
public function __unserialize($data)
{
$this->serial = PHP_INT_MAX;

foreach ($data as $item) {
if (! is_array($item)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance: corrupt item; expected array, received %s',
self::class,
get_debug_type($item)
));
}

if (! array_key_exists('data', $item)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance: corrupt item; missing "data" element',
self::class
));
}

$priority = 1;
if (array_key_exists('priority', $item)) {
$priority = (int) $item['priority'];
}

$this->insert($item['data'], $priority);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Traversable;

interface MessageInterface
{







public function setMetadata($spec, $value = null);







public function getMetadata($key = null);







public function setContent($content);






public function getContent();
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;




interface InitializableInterface
{





public function init();
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

interface RequestInterface extends MessageInterface
{
}
<?php 


declare(strict_types=1);

namespace Laminas\Stdlib;

use ErrorException;

use function array_pop;
use function count;
use function restore_error_handler;
use function set_error_handler;

use const E_WARNING;





abstract class ErrorHandler
{





protected static $stack = [];






public static function started()
{
return (bool) static::getNestedLevel();
}






public static function getNestedLevel()
{
return count(static::$stack);
}







public static function start($errorLevel = E_WARNING)
{
if (! static::$stack) {
set_error_handler([static::class, 'addError'], $errorLevel);
}

static::$stack[] = null;
}








public static function stop($throw = false)
{
$errorException = null;

if (static::$stack) {
$errorException = array_pop(static::$stack);

if (! static::$stack) {
restore_error_handler();
}

if ($errorException && $throw) {
throw $errorException;
}
}

return $errorException;
}






public static function clean()
{
if (static::$stack) {
restore_error_handler();
}

static::$stack = [];
}










public static function addError($errno, $errstr = '', $errfile = '', $errline = 0)
{
$stack = &static::$stack[count(static::$stack) - 1];
$stack = new ErrorException($errstr, 0, $errno, $errfile, $errline, $stack);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Countable;
use Exception;
use Iterator;
use ReturnTypeWillChange;

use function array_map;
use function current;
use function key;
use function next;
use function reset;
use function uasort;

/**
@template
@template
@template-implements
*/
class PriorityList implements Iterator, Countable
{
public const EXTR_DATA = 0x00000001;
public const EXTR_PRIORITY = 0x00000002;
public const EXTR_BOTH = 0x00000003;






protected $items = [];






protected $serial = 0;








protected $isLIFO = 1;








protected $count = 0;






protected $sorted = false;









public function insert($name, mixed $value, $priority = 0)
{
if (! isset($this->items[$name])) {
$this->count++;
}

$this->sorted = false;

$this->items[$name] = [
'data' => $value,
'priority' => (int) $priority,
'serial' => $this->serial++,
];
}







public function setPriority($name, $priority)
{
if (! isset($this->items[$name])) {
throw new Exception("item $name not found");
}

$this->items[$name]['priority'] = (int) $priority;
$this->sorted = false;

return $this;
}







public function remove($name)
{
if (isset($this->items[$name])) {
$this->count--;
}

unset($this->items[$name]);
}






public function clear()
{
$this->items = [];
$this->serial = 0;
$this->count = 0;
$this->sorted = false;
}







public function get($name)
{
if (! isset($this->items[$name])) {
return;
}

return $this->items[$name]['data'];
}






protected function sort()
{
if (! $this->sorted) {
uasort($this->items, [$this, 'compare']);
$this->sorted = true;
}
}







protected function compare(array $item1, array $item2)
{
return $item1['priority'] === $item2['priority']
? ($item1['serial'] > $item2['serial'] ? -1 : 1) * $this->isLIFO
: ($item1['priority'] > $item2['priority'] ? -1 : 1);
}







public function isLIFO($flag = null)
{
if ($flag !== null) {
$isLifo = $flag === true ? 1 : -1;

if ($isLifo !== $this->isLIFO) {
$this->isLIFO = $isLifo;
$this->sorted = false;
}
}

return 1 === $this->isLIFO;
}




#[ReturnTypeWillChange]
public function rewind()
{
$this->sort();
reset($this->items);
}




#[ReturnTypeWillChange]
public function current()
{
$this->sorted || $this->sort();
$node = current($this->items);

return $node ? $node['data'] : false;
}




#[ReturnTypeWillChange]
public function key()
{
$this->sorted || $this->sort();
return key($this->items);
}




#[ReturnTypeWillChange]
public function next()
{
$node = next($this->items);

return $node ? $node['data'] : false;
}




#[ReturnTypeWillChange]
public function valid()
{
return current($this->items) !== false;
}




public function getIterator()
{
return clone $this;
}




#[ReturnTypeWillChange]
public function count()
{
return $this->count;
}







public function toArray($flag = self::EXTR_DATA)
{
$this->sort();

if ($flag === self::EXTR_BOTH) {
return $this->items;
}

return array_map(
static fn($item) => $flag === self::EXTR_PRIORITY ? $item['priority'] : $item['data'],
$this->items
);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib;

use Countable;
use Iterator;
use ReturnTypeWillChange;
use Serializable;
use SplPriorityQueue as PhpSplPriorityQueue;
use UnexpectedValueException;

use function current;
use function in_array;
use function is_array;
use function is_int;
use function key;
use function max;
use function next;
use function reset;
use function serialize;
use function sprintf;
use function unserialize;

/**
@template
@template-implements







*/
class FastPriorityQueue implements Iterator, Countable, Serializable
{
public const EXTR_DATA = PhpSplPriorityQueue::EXTR_DATA;
public const EXTR_PRIORITY = PhpSplPriorityQueue::EXTR_PRIORITY;
public const EXTR_BOTH = PhpSplPriorityQueue::EXTR_BOTH;


protected $extractFlag = self::EXTR_DATA;






protected $values = [];






protected $priorities = [];






protected $subPriorities = [];






protected $maxPriority;






protected $count = 0;






protected $index = 0;






protected $subIndex = 0;

public function __serialize(): array
{
$clone = clone $this;
$clone->setExtractFlags(self::EXTR_BOTH);

$data = [];
foreach ($clone as $item) {
$data[] = $item;
}

return $data;
}

public function __unserialize(array $data): void
{
foreach ($data as $item) {
$this->insert($item['data'], $item['priority']);
}
}








public function insert(mixed $value, $priority)
{
if (! is_int($priority)) {
throw new Exception\InvalidArgumentException('The priority must be an integer');
}
$this->values[$priority][] = $value;
if (! isset($this->priorities[$priority])) {
$this->priorities[$priority] = $priority;
$this->maxPriority = $this->maxPriority === null ? $priority : max($priority, $this->maxPriority);
}
++$this->count;
}







public function extract()
{
if (! $this->valid()) {
return false;
}
$value = $this->current();
$this->nextAndRemove();
return $value;
}













public function remove(mixed $datum)
{
$currentIndex = $this->index;
$currentSubIndex = $this->subIndex;
$currentPriority = $this->maxPriority;

$this->rewind();
while ($this->valid()) {
if (current($this->values[$this->maxPriority]) === $datum) {
$index = key($this->values[$this->maxPriority]);
unset($this->values[$this->maxPriority][$index]);



reset($this->values[$this->maxPriority]);

$this->index = $currentIndex;
$this->subIndex = $currentSubIndex;




if (empty($this->values[$this->maxPriority])) {
unset($this->values[$this->maxPriority]);
unset($this->priorities[$this->maxPriority]);
if ($this->maxPriority === $currentPriority) {
$this->subIndex = 0;
}
}

$this->maxPriority = empty($this->priorities) ? null : max($this->priorities);
--$this->count;
return true;
}
$this->next();
}
return false;
}






#[ReturnTypeWillChange]
public function count()
{
return $this->count;
}






#[ReturnTypeWillChange]
public function current()
{
switch ($this->extractFlag) {
case self::EXTR_DATA:
return current($this->values[$this->maxPriority]);
case self::EXTR_PRIORITY:
return $this->maxPriority;
case self::EXTR_BOTH:
return [
'data' => current($this->values[$this->maxPriority]),
'priority' => $this->maxPriority,
];
}
}






#[ReturnTypeWillChange]
public function key()
{
return $this->index;
}







protected function nextAndRemove()
{
$key = key($this->values[$this->maxPriority]);

if (false === next($this->values[$this->maxPriority])) {
unset($this->priorities[$this->maxPriority]);
unset($this->values[$this->maxPriority]);
$this->maxPriority = empty($this->priorities) ? null : max($this->priorities);
$this->subIndex = -1;
} else {
unset($this->values[$this->maxPriority][$key]);
}
++$this->index;
++$this->subIndex;
--$this->count;
}





#[ReturnTypeWillChange]
public function next()
{
if (false === next($this->values[$this->maxPriority])) {
unset($this->subPriorities[$this->maxPriority]);
reset($this->values[$this->maxPriority]);
$this->maxPriority = empty($this->subPriorities) ? null : max($this->subPriorities);
$this->subIndex = -1;
}
++$this->index;
++$this->subIndex;
}






#[ReturnTypeWillChange]
public function valid()
{
return isset($this->values[$this->maxPriority ?? '']);
}




#[ReturnTypeWillChange]
public function rewind()
{
$this->subPriorities = $this->priorities;
$this->maxPriority = empty($this->priorities) ? 0 : max($this->priorities);
$this->index = 0;
$this->subIndex = 0;
}








public function toArray()
{
$array = [];
foreach (clone $this as $item) {
$array[] = $item;
}
return $array;
}






public function serialize()
{
return serialize($this->__serialize());
}







public function unserialize($data)
{
$toUnserialize = unserialize($data);
if (! is_array($toUnserialize)) {
throw new UnexpectedValueException(sprintf(
'Cannot deserialize %s instance; corrupt serialization data',
self::class
));
}

$this->__unserialize($toUnserialize);
}







public function setExtractFlags($flag)
{
$this->extractFlag = match ($flag) {
self::EXTR_DATA, self::EXTR_PRIORITY, self::EXTR_BOTH => $flag,
default => throw new Exception\InvalidArgumentException("The extract flag specified is not valid"),
};
}






public function isEmpty()
{
return empty($this->values);
}






public function contains(mixed $datum)
{
foreach ($this->values as $values) {
if (in_array($datum, $values)) {
return true;
}
}
return false;
}







public function hasPriority($priority)
{
return isset($this->values[$priority]);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Guard;

use Exception;
use Laminas\Stdlib\Exception\InvalidArgumentException;

use function sprintf;




trait EmptyGuardTrait
{









protected function guardAgainstEmpty(
mixed $data,
$dataName = 'Argument',
$exceptionClass = InvalidArgumentException::class
) {
if (empty($data)) {
$message = sprintf('%s cannot be empty', $dataName);
throw new $exceptionClass($message);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Guard;

use Exception;
use Laminas\Stdlib\Exception\InvalidArgumentException;
use Traversable;

use function get_debug_type;
use function is_array;
use function sprintf;




trait ArrayOrTraversableGuardTrait
{









protected function guardForArrayOrTraversable(
mixed $data,
$dataName = 'Argument',
$exceptionClass = InvalidArgumentException::class
) {
if (! is_array($data) && ! $data instanceof Traversable) {
$message = sprintf(
"%s must be an array or Traversable, [%s] given",
$dataName,
get_debug_type($data)
);
throw new $exceptionClass($message);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Guard;




trait AllGuardsTrait
{
use ArrayOrTraversableGuardTrait;
use EmptyGuardTrait;
use NullGuardTrait;
}
<?php

declare(strict_types=1);

namespace Laminas\Stdlib\Guard;

use Exception;
use Laminas\Stdlib\Exception\InvalidArgumentException;

use function sprintf;




trait NullGuardTrait
{









protected function guardAgainstNull(
mixed $data,
$dataName = 'Argument',
$exceptionClass = InvalidArgumentException::class
) {
if (null === $data) {
$message = sprintf('%s cannot be null', $dataName);
throw new $exceptionClass($message);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;




























interface AbstractFactoryInterface extends Factory\AbstractFactoryInterface
{







public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName);








public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;























interface DelegatorFactoryInterface extends Factory\DelegatorFactoryInterface
{









public function createDelegatorWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName, $callback);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use Laminas\ServiceManager\Exception\ContainerModificationsNotAllowedException;
use Laminas\ServiceManager\Exception\InvalidServiceException;
use Psr\Container\ContainerInterface;

use function class_exists;
use function gettype;
use function is_object;
use function method_exists;
use function sprintf;
use function trigger_error;

use const E_USER_DEPRECATED;

/**
@template
@implements
@psalm-import-type
@psalm-suppress













*/
abstract class AbstractPluginManager extends ServiceManager implements PluginManagerInterface
{





protected $autoAddInvokableClass = true;

/**
@psalm-var



*/
protected $instanceOf;

/**
@psalm-param






*/
public function __construct($configInstanceOrParentLocator = null, array $config = [])
{
/**
@psalm-suppress */
if (
null !== $configInstanceOrParentLocator
&& ! $configInstanceOrParentLocator instanceof ConfigInterface
&& ! $configInstanceOrParentLocator instanceof ContainerInterface
) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects a ConfigInterface or ContainerInterface instance as the first argument; received %s',
self::class,
is_object($configInstanceOrParentLocator)
? $configInstanceOrParentLocator::class
: gettype($configInstanceOrParentLocator)
));
}

if ($configInstanceOrParentLocator instanceof ConfigInterface) {
trigger_error(sprintf(
'Usage of %s as a constructor argument for %s is now deprecated',
ConfigInterface::class,
static::class
), E_USER_DEPRECATED);
$config = $configInstanceOrParentLocator->toArray();
}

parent::__construct($config);

if (! $configInstanceOrParentLocator instanceof ContainerInterface) {
trigger_error(sprintf(
'%s now expects a %s instance representing the parent container; please update your code',
__METHOD__,
ContainerInterface::class
), E_USER_DEPRECATED);
}

$this->creationContext = $configInstanceOrParentLocator instanceof ContainerInterface
? $configInstanceOrParentLocator
: $this;
}

/**
@psalm-param








*/
public function configure(array $config)
{
if (isset($config['services'])) {
foreach ($config['services'] as $service) {
$this->validate($service);
}
}

parent::configure($config);

return $this;
}









public function setService($name, $service)
{
$this->validate($service);
parent::setService($name, $service);
}

/**
@psalm-return($name is class-string<InstanceType> ? InstanceType : mixed)








*/
public function get($name, ?array $options = null)
{
if (! $this->has($name)) {
if (! $this->autoAddInvokableClass || ! class_exists($name)) {
throw new Exception\ServiceNotFoundException(sprintf(
'A plugin by the name "%s" was not found in the plugin manager %s',
$name,
static::class
));
}

$this->setFactory($name, Factory\InvokableFactory::class);
}

$instance = ! $options ? parent::get($name) : $this->build($name, $options);
$this->validate($instance);
return $instance;
}

/**
@psalm-assert


*/
public function validate(mixed $instance)
{
if (method_exists($this, 'validatePlugin')) {
trigger_error(sprintf(
'%s::validatePlugin() has been deprecated as of 3.0; please define validate() instead',
static::class
), E_USER_DEPRECATED);
$this->validatePlugin($instance);
return;
}

if (empty($this->instanceOf) || $instance instanceof $this->instanceOf) {
return;
}

throw new InvalidServiceException(sprintf(
'Plugin manager "%s" expected an instance of type "%s", but "%s" was received',
self::class,
$this->instanceOf,
is_object($instance) ? $instance::class : gettype($instance)
));
}











public function setServiceLocator(ContainerInterface $container)
{
trigger_error(sprintf(
'Usage of %s is deprecated since v3.0.0; please pass the container to the constructor instead',
__METHOD__
), E_USER_DEPRECATED);
$this->creationContext = $container;
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Tool;

use Laminas\ServiceManager\Exception;
use Laminas\Stdlib\ConsoleHelper;

use function array_shift;
use function class_exists;
use function dirname;
use function file_exists;
use function file_put_contents;
use function in_array;
use function is_array;
use function is_writable;
use function sprintf;

use const STDERR;
use const STDOUT;

/**
@psalm-type
@psalm-type
@psalm-type











*/
class ConfigDumperCommand
{
public const COMMAND_DUMP = 'dump';
public const COMMAND_ERROR = 'error';
public const COMMAND_HELP = 'help';

public const DEFAULT_SCRIPT_NAME = self::class;

public const HELP_TEMPLATE = <<<EOH
<info>Usage:</info>

  %s [-h|--help|help] [-i|--ignore-unresolved] <configFile> <className>

<info>Arguments:</info>

  <info>-h|--help|help</info>          This usage message
  <info>-i|--ignore-unresolved</info>  Ignore classes with unresolved direct dependencies.
  <info><configFile></info>            Path to a config file for which to generate
                          configuration. If the file does not exist, it will
                          be created. If it does exist, it must return an
                          array, and the file will be updated with new
                          configuration.
  <info><className></info>             Name of the class to reflect and for which to
                          generate dependency configuration.

Reads the provided configuration file (creating it if it does not exist),
and injects it with ConfigAbstractFactory dependency configuration for
the provided class name, writing the changes back to the file.
EOH;

private ConsoleHelper $helper;




public function __construct(private $scriptName = self::DEFAULT_SCRIPT_NAME, ?ConsoleHelper $helper = null)
{
$this->helper = $helper ?: new ConsoleHelper();
}





public function __invoke(array $args)
{
$arguments = $this->parseArgs($args);

switch ($arguments->command) {
case self::COMMAND_HELP:
$this->help();
return 0;
case self::COMMAND_ERROR:
$this->helper->writeErrorMessage($arguments->message);
$this->help(STDERR);
return 1;
case self::COMMAND_DUMP:

default:
break;
}

$dumper = new ConfigDumper();
try {
$config = $dumper->createDependencyConfig(
$arguments->config,
$arguments->class,
$arguments->ignoreUnresolved
);
} catch (Exception\InvalidArgumentException $e) {
$this->helper->writeErrorMessage(sprintf(
'Unable to create config for "%s": %s',
$arguments->class,
$e->getMessage()
));
$this->help(STDERR);
return 1;
}

file_put_contents($arguments->configFile, $dumper->dumpConfigFile($config));

$this->helper->writeLine(sprintf(
'<info>[DONE]</info> Changes written to %s',
$arguments->configFile
));
return 0;
}




private function parseArgs(array $args)
{
if (! $args) {
return $this->createHelpArgument();
}

$arg1 = array_shift($args);

if (in_array($arg1, ['-h', '--help', 'help'], true)) {
return $this->createHelpArgument();
}

$ignoreUnresolved = false;
if (in_array($arg1, ['-i', '--ignore-unresolved'], true)) {
$ignoreUnresolved = true;
$arg1 = array_shift($args);
}

if (! $args) {
return $this->createErrorArgument('Missing class name');
}

$configFile = $arg1;
switch (file_exists($configFile)) {
case true:
$config = require $configFile;

if (! is_array($config)) {
return $this->createErrorArgument(sprintf(
'Configuration at path "%s" does not return an array.',
$configFile
));
}

break;
case false:

default:
if (! is_writable(dirname($configFile))) {
return $this->createErrorArgument(sprintf(
'Cannot create configuration at path "%s"; not writable.',
$configFile
));
}

$config = [];
break;
}

$class = array_shift($args);

if (! class_exists($class)) {
return $this->createErrorArgument(sprintf(
'Class "%s" does not exist or could not be autoloaded.',
$class
));
}

return $this->createArguments(self::COMMAND_DUMP, $configFile, $config, $class, $ignoreUnresolved);
}





private function help($resource = STDOUT)
{
$this->helper->writeLine(sprintf(
self::HELP_TEMPLATE,
$this->scriptName
), true, $resource);
}










private function createArguments($command, $configFile, $config, $class, $ignoreUnresolved)
{
return (object) [
'command' => $command,
'configFile' => $configFile,
'config' => $config,
'class' => $class,
'ignoreUnresolved' => $ignoreUnresolved,
];
}





private function createErrorArgument($message)
{
return (object) [
'command' => self::COMMAND_ERROR,
'message' => $message,
];
}




private function createHelpArgument()
{
return (object) [
'command' => self::COMMAND_HELP,
];
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Tool;

use Laminas\ServiceManager\AbstractFactory\ConfigAbstractFactory;
use Laminas\ServiceManager\Exception\InvalidArgumentException;
use Psr\Container\ContainerInterface;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;
use Traversable;

use function array_filter;
use function array_key_exists;
use function class_exists;
use function date;
use function gettype;
use function implode;
use function interface_exists;
use function is_array;
use function is_int;
use function is_string;
use function sprintf;
use function str_repeat;
use function var_export;

class ConfigDumper
{
public const CONFIG_TEMPLATE = <<<EOC
<?php

/**
 * This file generated by %s.
 * Generated %s
 */

return %s;
EOC;

public function __construct(private ?ContainerInterface $container = null)
{
}







public function createDependencyConfig(array $config, $className, $ignoreUnresolved = false)
{
$this->validateClassName($className);

$reflectionClass = new ReflectionClass($className);


if ($reflectionClass->isInterface()) {
return $config;
}


if (! $reflectionClass->getConstructor()) {
return $this->createInvokable($config, $className);
}

$constructorArguments = $reflectionClass->getConstructor()->getParameters();
$constructorArguments = array_filter(
$constructorArguments,
static fn(ReflectionParameter $argument): bool => ! $argument->isOptional()
);


if (empty($constructorArguments)) {
return $this->createInvokable($config, $className);
}

$classConfig = [];

foreach ($constructorArguments as $constructorArgument) {
$type = $constructorArgument->getType();
$argumentType = $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null;

if ($argumentType === null) {
if ($ignoreUnresolved) {

return $config;
}

if ($this->container && $this->container->has($className)) {
return $config;
}
throw new InvalidArgumentException(sprintf(
'Cannot create config for constructor argument "%s", '
. 'it has no type hint, or non-class/interface type hint',
$constructorArgument->getName()
));
}
$config = $this->createDependencyConfig($config, $argumentType, $ignoreUnresolved);
$classConfig[] = $argumentType;
}

$config[ConfigAbstractFactory::class][$className] = $classConfig;

return $config;
}






private function validateClassName($className)
{
if (! is_string($className)) {
throw new InvalidArgumentException('Class name must be a string, ' . gettype($className) . ' given');
}

if (! class_exists($className) && ! interface_exists($className)) {
throw new InvalidArgumentException('Cannot find class or interface with name ' . $className);
}
}





private function createInvokable(array $config, $className)
{
$config[ConfigAbstractFactory::class][$className] = [];
return $config;
}






public function createFactoryMappingsFromConfig(array $config)
{
if (! array_key_exists(ConfigAbstractFactory::class, $config)) {
return $config;
}

if (! is_array($config[ConfigAbstractFactory::class])) {
throw new InvalidArgumentException(
'Config key for ' . ConfigAbstractFactory::class . ' should be an array, ' . gettype(
$config[ConfigAbstractFactory::class]
) . ' given'
);
}

foreach ($config[ConfigAbstractFactory::class] as $className => $dependency) {
$config = $this->createFactoryMappings($config, $className);
}
return $config;
}





public function createFactoryMappings(array $config, $className)
{
$this->validateClassName($className);

if (
array_key_exists('service_manager', $config)
&& array_key_exists('factories', $config['service_manager'])
&& array_key_exists($className, $config['service_manager']['factories'])
) {
return $config;
}

$config['service_manager']['factories'][$className] = ConfigAbstractFactory::class;
return $config;
}




public function dumpConfigFile(array $config)
{
$prepared = $this->prepareConfig($config);
return sprintf(
self::CONFIG_TEMPLATE,
static::class,
date('Y-m-d H:i:s'),
$prepared
);
}






private function prepareConfig($config, $indentLevel = 1)
{
$indent = str_repeat(' ', $indentLevel * 4);
$entries = [];
foreach ($config as $key => $value) {
$key = $this->createConfigKey($key);
$entries[] = sprintf(
'%s%s%s,',
$indent,
$key ? sprintf('%s => ', $key) : '',
$this->createConfigValue($value, $indentLevel)
);
}

$outerIndent = str_repeat(' ', ($indentLevel - 1) * 4);

return sprintf(
"[\n%s\n%s]",
implode("\n", $entries),
$outerIndent
);
}





private function createConfigKey($key)
{
if (is_string($key) && class_exists($key)) {
return sprintf('\\%s::class', $key);
}

if (is_int($key)) {
return null;
}

return sprintf("'%s'", $key);
}





private function createConfigValue(mixed $value, $indentLevel)
{
if (is_array($value) || $value instanceof Traversable) {
return $this->prepareConfig($value, $indentLevel + 1);
}

if (is_string($value) && class_exists($value)) {
return sprintf('\\%s::class', $value);
}

return var_export($value, true);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Tool;

use Laminas\ServiceManager\Exception\InvalidArgumentException;
use Laminas\ServiceManager\Factory\FactoryInterface;
use Psr\Container\ContainerInterface;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;

use function array_filter;
use function array_map;
use function array_merge;
use function array_shift;
use function count;
use function implode;
use function preg_replace;
use function sort;
use function sprintf;
use function str_repeat;
use function strrpos;
use function substr;

class FactoryCreator
{
public const FACTORY_TEMPLATE = <<<'EOT'
        <?php

        declare(strict_types=1);

        namespace %s;

        %s

        class %sFactory implements FactoryInterface
        {
            /**
             * @param ContainerInterface $container
             * @param string $requestedName
             * @param null|array $options
             * @return %s
             */
            public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
            {
                return new %s(%s);
            }
        }

        EOT;

private const IMPORT_ALWAYS = [
FactoryInterface::class,
ContainerInterface::class,
];





public function createFactory($className)
{
$class = $this->getClassName($className);

return sprintf(
self::FACTORY_TEMPLATE,
preg_replace('/\\\\' . $class . '$/', '', $className),
$this->createImportStatements($className),
$class,
$class,
$class,
$this->createArgumentString($className)
);
}

private function getClassName(string $className): string
{
return substr($className, strrpos($className, '\\') + 1);
}





private function getConstructorParameters($className)
{
$reflectionClass = new ReflectionClass($className);

if (! $reflectionClass->getConstructor()) {
return [];
}

$constructorParameters = $reflectionClass->getConstructor()->getParameters();

if (empty($constructorParameters)) {
return [];
}

$constructorParameters = array_filter(
$constructorParameters,
static function (ReflectionParameter $argument): bool {
if ($argument->isOptional()) {
return false;
}

$type = $argument->getType();
$class = $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null;

if (null === $class) {
throw new InvalidArgumentException(sprintf(
'Cannot identify type for constructor argument "%s"; '
. 'no type hint, or non-class/interface type hint',
$argument->getName()
));
}

return true;
}
);

if (empty($constructorParameters)) {
return [];
}

return array_map(static function (ReflectionParameter $parameter): ?string {
$type = $parameter->getType();
return $type instanceof ReflectionNamedType && ! $type->isBuiltin() ? $type->getName() : null;
}, $constructorParameters);
}





private function createArgumentString($className)
{
$arguments = array_map(static fn(string $dependency): string
=> sprintf('$container->get(\\%s::class)', $dependency), $this->getConstructorParameters($className));

switch (count($arguments)) {
case 0:
return '';
case 1:
return array_shift($arguments);
default:
$argumentPad = str_repeat(' ', 12);
$closePad = str_repeat(' ', 8);
return sprintf(
"\n%s%s\n%s",
$argumentPad,
implode(",\n" . $argumentPad, $arguments),
$closePad
);
}
}

private function createImportStatements(string $className): string
{
$imports = array_merge(self::IMPORT_ALWAYS, [$className]);
sort($imports);
return implode("\n", array_map(static fn(string $import): string => sprintf('use %s;', $import), $imports));
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Tool;

use Laminas\ServiceManager\Exception;
use Laminas\Stdlib\ConsoleHelper;

use function array_shift;
use function assert;
use function class_exists;
use function in_array;
use function is_string;
use function sprintf;

use const STDERR;
use const STDOUT;

/**
@psalm-type
*/
class FactoryCreatorCommand
{
public const COMMAND_DUMP = 'dump';
public const COMMAND_ERROR = 'error';
public const COMMAND_HELP = 'help';

public const DEFAULT_SCRIPT_NAME = self::class;

public const HELP_TEMPLATE = <<<EOH
<info>Usage:</info>

  %s [-h|--help|help] <className>

<info>Arguments:</info>

  <info>-h|--help|help</info>    This usage message
  <info><className></info>       Name of the class to reflect and for which to generate
                    a factory.

Generates to STDOUT a factory for creating the specified class; this may then
be added to your application, and configured as a factory for the class.
EOH;

private ConsoleHelper $helper;




public function __construct(private $scriptName = self::DEFAULT_SCRIPT_NAME, ?ConsoleHelper $helper = null)
{
$this->helper = $helper ?: new ConsoleHelper();
}





public function __invoke(array $args)
{
$arguments = $this->parseArgs($args);

switch ($arguments->command) {
case self::COMMAND_HELP:
$this->help();
return 0;
case self::COMMAND_ERROR:
assert(is_string($arguments->message));
$this->helper->writeErrorMessage($arguments->message);
$this->help(STDERR);
return 1;
case self::COMMAND_DUMP:

default:
break;
}

$generator = new FactoryCreator();
assert(is_string($arguments->class));
try {
$factory = $generator->createFactory($arguments->class);
} catch (Exception\InvalidArgumentException $e) {
$this->helper->writeErrorMessage(sprintf(
'Unable to create factory for "%s": %s',
$arguments->class,
$e->getMessage()
));
$this->help(STDERR);
return 1;
}

$this->helper->write($factory, false);
return 0;
}




private function parseArgs(array $args)
{
if (! $args) {
return $this->createArguments(self::COMMAND_HELP);
}

$arg1 = array_shift($args);

if (in_array($arg1, ['-h', '--help', 'help'], true)) {
return $this->createArguments(self::COMMAND_HELP);
}

$class = $arg1;

if (! class_exists($class)) {
return $this->createArguments(self::COMMAND_ERROR, null, sprintf(
'Class "%s" does not exist or could not be autoloaded.',
$class
));
}

return $this->createArguments(self::COMMAND_DUMP, $class);
}





private function help($resource = STDOUT)
{
$this->helper->writeLine(sprintf(
self::HELP_TEMPLATE,
$this->scriptName
), true, $resource);
}







private function createArguments($command, $class = null, $error = null)
{
return (object) [
'command' => $command,
'class' => $class,
'message' => $error,
];
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\AbstractFactory;

use ArrayObject;
use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\ServiceManager\Factory\AbstractFactoryInterface;
use Psr\Container\ContainerInterface;

use function array_key_exists;
use function array_map;
use function array_values;
use function is_array;
use function json_encode;

final class ConfigAbstractFactory implements AbstractFactoryInterface
{





public function canCreate(ContainerInterface $container, $requestedName)
{
if (! $container->has('config')) {
return false;
}
$config = $container->get('config');
if (! isset($config[self::class])) {
return false;
}
$dependencies = $config[self::class];

return is_array($dependencies) && array_key_exists($requestedName, $dependencies);
}


public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
if (! $container->has('config')) {
throw new ServiceNotCreatedException('Cannot find a config array in the container');
}

$config = $container->get('config');

if (! (is_array($config) || $config instanceof ArrayObject)) {
throw new ServiceNotCreatedException('Config must be an array or an instance of ArrayObject');
}
if (! isset($config[self::class])) {
throw new ServiceNotCreatedException('Cannot find a `' . self::class . '` key in the config array');
}

$dependencies = $config[self::class];

if (
! is_array($dependencies)
|| ! array_key_exists($requestedName, $dependencies)
|| ! is_array($dependencies[$requestedName])
) {
throw new ServiceNotCreatedException('Service dependencies config must exist and be an array');
}

$serviceDependencies = $dependencies[$requestedName];

if ($serviceDependencies !== array_values(array_map('strval', $serviceDependencies))) {
$problem = json_encode(array_map('gettype', $serviceDependencies));
throw new ServiceNotCreatedException(
'Service dependencies config must be an array of strings, ' . $problem . ' given'
);
}

$arguments = array_map([$container, 'get'], $serviceDependencies);

return new $requestedName(...$arguments);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\AbstractFactory;

use Laminas\ServiceManager\Exception\ServiceNotFoundException;
use Laminas\ServiceManager\Factory\AbstractFactoryInterface;
use Psr\Container\ContainerInterface;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;

use function array_map;
use function class_exists;
use function interface_exists;
use function is_string;
use function sprintf;



















































class ReflectionBasedAbstractFactory implements AbstractFactoryInterface
{


















protected $aliases = [];








public function __construct(array $aliases = [])
{
if (! empty($aliases)) {
$this->aliases = $aliases;
}
}






public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
$reflectionClass = new ReflectionClass($requestedName);

if (null === ($constructor = $reflectionClass->getConstructor())) {
return new $requestedName();
}

$reflectionParameters = $constructor->getParameters();

if (empty($reflectionParameters)) {
return new $requestedName();
}

$resolver = $container->has('config')
? $this->resolveParameterWithConfigService($container, $requestedName)
: $this->resolveParameterWithoutConfigService($container, $requestedName);

$parameters = array_map($resolver, $reflectionParameters);

return new $requestedName(...$parameters);
}


public function canCreate(ContainerInterface $container, $requestedName)
{
return class_exists($requestedName) && $this->canCallConstructor($requestedName);
}

private function canCallConstructor(string $requestedName): bool
{
$constructor = (new ReflectionClass($requestedName))->getConstructor();

return $constructor === null || $constructor->isPublic();
}










private function resolveParameterWithoutConfigService(ContainerInterface $container, $requestedName)
{
/**
@psalm-suppress




*/
return fn(ReflectionParameter $parameter) => $this->resolveParameter($parameter, $container, $requestedName);
}










private function resolveParameterWithConfigService(ContainerInterface $container, $requestedName)
{






return function (ReflectionParameter $parameter) use ($container, $requestedName) {
if ($parameter->getName() === 'config') {
$type = $parameter->getType();
if ($type instanceof ReflectionNamedType && $type->getName() === 'array') {
return $container->get('config');
}
}
return $this->resolveParameter($parameter, $container, $requestedName);
};
}









private function resolveParameter(ReflectionParameter $parameter, ContainerInterface $container, $requestedName)
{
$type = $parameter->getType();
$type = $type instanceof ReflectionNamedType ? $type->getName() : null;

if ($type === 'array') {
return [];
}

if ($type === null || (is_string($type) && ! class_exists($type) && ! interface_exists($type))) {
if (! $parameter->isDefaultValueAvailable()) {
throw new ServiceNotFoundException(sprintf(
'Unable to create service "%s"; unable to resolve parameter "%s" '
. 'to a class, interface, or array type',
$requestedName,
$parameter->getName()
));
}

return $parameter->getDefaultValue();
}

$type = $this->aliases[$type] ?? $type;

if ($container->has($type)) {
return $container->get($type);
}

if (! $parameter->isOptional()) {
throw new ServiceNotFoundException(sprintf(
'Unable to create service "%s"; unable to resolve parameter "%s" using type hint "%s"',
$requestedName,
$parameter->getName(),
$type
));
}



return $parameter->getDefaultValue();
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;





















interface InitializerInterface extends Initializer\InitializerInterface
{





public function initialize(mixed $instance, ServiceLocatorInterface $serviceLocator);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Test;

use Laminas\ServiceManager\AbstractPluginManager;
use Laminas\ServiceManager\Exception\InvalidServiceException;
use ReflectionClass;
use ReflectionProperty;
use stdClass;

use function method_exists;








trait CommonPluginManagerTrait
{
public function testInstanceOfMatches()
{
$manager = $this->getPluginManager();
$reflection = new ReflectionProperty($manager, 'instanceOf');
$this->assertEquals($this->getInstanceOf(), $reflection->getValue($manager), 'instanceOf does not match');
}

public function testShareByDefaultAndSharedByDefault()
{
$manager = $this->getPluginManager();
$reflection = new ReflectionClass($manager);
$shareByDefault = $sharedByDefault = true;

foreach ($reflection->getProperties() as $prop) {
if ($prop->getName() === 'shareByDefault') {
$shareByDefault = $prop->getValue($manager);
}
if ($prop->getName() === 'sharedByDefault') {
$sharedByDefault = $prop->getValue($manager);
}
}

$this->assertSame(
$shareByDefault,
$sharedByDefault,
'Values of shareByDefault and sharedByDefault do not match'
);
}

public function testRegisteringInvalidElementRaisesException()
{
$this->expectException($this->getServiceNotFoundException());
$this->getPluginManager()->setService('test', $this);
}

public function testLoadingInvalidElementRaisesException()
{
$manager = $this->getPluginManager();
$manager->setInvokableClass('test', stdClass::class);
$this->expectException($this->getServiceNotFoundException());
$manager->get('test');
}

/**
@dataProvider


*/
public function testPluginAliasesResolve($alias, $expected)
{
$this->assertInstanceOf($expected, $this->getPluginManager()->get($alias), "Alias '$alias' does not resolve'");
}




public static function aliasProvider(): array
{
$manager = self::getPluginManager();
$reflection = new ReflectionProperty($manager, 'aliases');
$data = [];
foreach ($reflection->getValue($manager) as $alias => $expected) {
$data[] = [$alias, $expected];
}
return $data;
}

protected function getServiceNotFoundException(): string
{
$manager = $this->getPluginManager();
if (method_exists($manager, 'configure')) {
return InvalidServiceException::class;
}
return $this->getV2InvalidPluginException();
}






abstract protected static function getPluginManager();






abstract protected function getV2InvalidPluginException();






abstract protected function getInstanceOf();
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Proxy;

use Laminas\ServiceManager\Exception;
use Laminas\ServiceManager\Factory\DelegatorFactoryInterface;
use ProxyManager\Factory\LazyLoadingValueHolderFactory;
use ProxyManager\Proxy\LazyLoadingInterface;
use ProxyManager\Proxy\VirtualProxyInterface;
use Psr\Container\ContainerInterface;

use function sprintf;







final class LazyServiceFactory implements DelegatorFactoryInterface
{




public function __construct(private LazyLoadingValueHolderFactory $proxyFactory, private array $servicesMap)
{
}







public function __invoke(ContainerInterface $container, $name, callable $callback, ?array $options = null)
{
if (isset($this->servicesMap[$name])) {
$initializer = static function (&$wrappedInstance, LazyLoadingInterface $proxy) use ($callback): bool {
$proxy->setProxyInitializer(null);
$wrappedInstance = $callback();

return true;
};

return $this->proxyFactory->createProxy($this->servicesMap[$name], $initializer);
}

throw new Exception\ServiceNotFoundException(
sprintf('The requested service "%s" was not found in the provided services map', $name)
);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use ArrayAccess;
use Psr\Container\ContainerInterface;

/**
@psalm-type
@psalm-type
@psalm-type
@psalm-type
@psalm-type
@psalm-type







































*/
interface ConfigInterface
{









public function configureServiceManager(ServiceManager $serviceManager);

/**
@psalm-return



















*/
public function toArray();
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use RuntimeException as SplRuntimeException;





class InvalidServiceException extends SplRuntimeException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use function array_filter;
use function array_keys;
use function array_map;
use function array_values;
use function implode;
use function reset;
use function serialize;
use function sort;
use function sprintf;

class CyclicAliasException extends InvalidArgumentException
{




public static function fromCyclicAlias(string $alias, array $aliases): self
{
$cycle = $alias;
$cursor = $alias;
while (isset($aliases[$cursor]) && $aliases[$cursor] !== $alias) {
$cursor = $aliases[$cursor];
$cycle .= ' -> ' . $cursor;
}
$cycle .= ' -> ' . $alias . "\n";

return new self(sprintf(
"A cycle was detected within the aliases definitions:\n%s",
$cycle
));
}





public static function fromAliasesMap(array $aliases)
{
$detectedCycles = array_filter(array_map(
static fn($alias): ?array => self::getCycleFor($aliases, $alias),
array_keys($aliases)
));

if (! $detectedCycles) {
return new self(sprintf(
"A cycle was detected within the following aliases map:\n\n%s",
self::printReferencesMap($aliases)
));
}

return new self(sprintf(
"Cycles were detected within the provided aliases:\n\n%s\n\n"
. "The cycle was detected in the following alias map:\n\n%s",
self::printCycles(self::deDuplicateDetectedCycles($detectedCycles)),
self::printReferencesMap($aliases)
));
}








private static function getCycleFor(array $aliases, $alias)
{
$cycleCandidate = [];
$targetName = $alias;

while (isset($aliases[$targetName])) {
if (isset($cycleCandidate[$targetName])) {
return $cycleCandidate;
}

$cycleCandidate[$targetName] = true;
$targetName = $aliases[$targetName];
}

return null;
}





private static function printReferencesMap(array $aliases)
{
$map = [];

foreach ($aliases as $alias => $reference) {
$map[] = '"' . $alias . '" => "' . $reference . '"';
}

return "[\n" . implode("\n", $map) . "\n]";
}





private static function printCycles(array $detectedCycles)
{
return "[\n" . implode("\n", array_map([self::class, 'printCycle'], $detectedCycles)) . "\n]";
}

/**
@phpcsSuppress


*/
private static function printCycle(array $detectedCycle)
{
$fullCycle = array_keys($detectedCycle);
$fullCycle[] = reset($fullCycle);

return implode(
' => ',
array_map(
static fn($cycle): string => '"' . $cycle . '"',
$fullCycle
)
);
}





private static function deDuplicateDetectedCycles(array $detectedCycles)
{
$detectedCyclesByHash = [];

foreach ($detectedCycles as $detectedCycle) {
$cycleAliases = array_keys($detectedCycle);

sort($cycleAliases);

$hash = serialize($cycleAliases);

$detectedCyclesByHash[$hash] ??= $detectedCycle;
}

return array_values($detectedCyclesByHash);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use Psr\Container\ContainerExceptionInterface;




interface ExceptionInterface extends ContainerExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use InvalidArgumentException as SplInvalidArgumentException;
use Laminas\ServiceManager\AbstractFactoryInterface;
use Laminas\ServiceManager\Initializer\InitializerInterface;

use function gettype;
use function is_object;
use function sprintf;




class InvalidArgumentException extends SplInvalidArgumentException implements ExceptionInterface
{
public static function fromInvalidInitializer(mixed $initializer): self
{
return new self(sprintf(
'An invalid initializer was registered. Expected a callable or an'
. ' instance of "%s"; received "%s"',
InitializerInterface::class,
is_object($initializer) ? $initializer::class : gettype($initializer)
));
}

public static function fromInvalidAbstractFactory(mixed $abstractFactory): self
{
return new self(sprintf(
'An invalid abstract factory was registered. Expected an instance of or a valid'
. ' class name resolving to an implementation of "%s", but "%s" was received.',
AbstractFactoryInterface::class,
is_object($abstractFactory) ? $abstractFactory::class : gettype($abstractFactory)
));
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use InvalidArgumentException as SplInvalidArgumentException;
use Psr\Container\NotFoundExceptionInterface;





class ServiceNotFoundException extends SplInvalidArgumentException implements
ExceptionInterface,
NotFoundExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use RuntimeException as SplRuntimeException;





class ServiceNotCreatedException extends SplRuntimeException implements
ExceptionInterface
{
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Exception;

use DomainException;

use function sprintf;

class ContainerModificationsNotAllowedException extends DomainException implements ExceptionInterface
{



public static function fromExistingService(string $service): self
{
return new self(sprintf(
'The container does not allow replacing or updating a service'
. ' with existing instances; the following service'
. ' already exists in the container: %s',
$service
));
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use Exception;
use Laminas\ServiceManager\Exception\ContainerModificationsNotAllowedException;
use Laminas\ServiceManager\Exception\CyclicAliasException;
use Laminas\ServiceManager\Exception\InvalidArgumentException;
use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\ServiceManager\Exception\ServiceNotFoundException;
use Laminas\ServiceManager\Proxy\LazyServiceFactory;
use Laminas\Stdlib\ArrayUtils;
use ProxyManager\Configuration as ProxyConfiguration;
use ProxyManager\Factory\LazyLoadingValueHolderFactory;
use ProxyManager\FileLocator\FileLocator;
use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
use ProxyManager\GeneratorStrategy\FileWriterGeneratorStrategy;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;

use function array_intersect;
use function array_key_exists;
use function array_keys;
use function class_exists;
use function gettype;
use function in_array;
use function is_callable;
use function is_object;
use function is_string;
use function spl_autoload_register;
use function spl_object_hash;
use function sprintf;
use function trigger_error;

use const E_USER_DEPRECATED;

/**
@psalm-type
@psalm-type
@psalm-type
@psalm-type
@psalm-type
@psalm-type



















































*/
class ServiceManager implements ServiceLocatorInterface
{

protected $abstractFactories = [];








protected $aliases = [];






protected $allowOverride = false;


protected $creationContext;

/**
@psalm-var

*/
protected $delegators = [];

/**
@psalm-var



*/
protected $factories = [];

/**
@psalm-var

*/
protected $initializers = [];

/**
@psalm-var

*/
protected $lazyServices = [];

private ?LazyServiceFactory $lazyServicesDelegator = null;






protected $services = [];













protected $shared = [];






protected $sharedByDefault = true;






protected $configured = false;




private array $cachedAbstractFactories = [];

/**
@psalm-param



*/
public function __construct(array $config = [])
{
$this->creationContext = $this;
$this->configure($config);
}











public function getServiceLocator()
{
trigger_error(sprintf(
'Usage of %s is deprecated since v3.0.0; please use the container passed to the factory instead',
__METHOD__
), E_USER_DEPRECATED);
return $this->creationContext;
}


public function get($name)
{


if (isset($this->services[$name])) {
return $this->services[$name];
}


$sharedService = $this->shared[$name] ?? $this->sharedByDefault;



if (! $this->aliases) {
$object = $this->doCreate($name);


if ($sharedService) {
$this->services[$name] = $object;
}
return $object;
}


$resolvedName = $this->aliases[$name] ?? $name;


if ($resolvedName !== $name) {
$sharedService = $this->shared[$resolvedName] ?? $sharedService;
}


$sharedAlias = $sharedService && isset($this->services[$resolvedName]);


if ($sharedAlias) {
$this->services[$name] = $this->services[$resolvedName];
return $this->services[$resolvedName];
}



$object = $this->doCreate($resolvedName);


if ($sharedService) {
$this->services[$resolvedName] = $object;
}



if ($sharedAlias) {
$this->services[$name] = $object;
}

return $object;
}


public function build($name, ?array $options = null)
{

$name = $this->aliases[$name] ?? $name;
return $this->doCreate($name, $options);
}







public function has($name)
{

return $this->staticServiceOrFactoryCanCreate($name) || $this->abstractFactoryCanCreate($name);
}






public function setAllowOverride($flag)
{
$this->allowOverride = (bool) $flag;
}






public function getAllowOverride()
{
return $this->allowOverride;
}

/**
@psalm-param




*/
public function configure(array $config)
{


$this->validateServiceNames($config);

if (isset($config['services'])) {
$this->services = $config['services'] + $this->services;
}

if (isset($config['invokables']) && ! empty($config['invokables'])) {
$newAliases = $this->createAliasesAndFactoriesForInvokables($config['invokables']);


$config['aliases'] = $newAliases + ($config['aliases'] ?? []);
}

if (isset($config['factories'])) {
$this->factories = $config['factories'] + $this->factories;
}

if (isset($config['delegators'])) {
$this->mergeDelegators($config['delegators']);
}

if (isset($config['shared'])) {
$this->shared = $config['shared'] + $this->shared;
}

if (! empty($config['aliases'])) {
$this->aliases = $config['aliases'] + $this->aliases;
$this->mapAliasesToTargets();
} elseif (! $this->configured && ! empty($this->aliases)) {
$this->mapAliasesToTargets();
}

if (isset($config['shared_by_default'])) {
$this->sharedByDefault = $config['shared_by_default'];
}



if (isset($config['lazy_services']) && ! empty($config['lazy_services'])) {
/**
@psalm-suppress */
$this->lazyServices = ArrayUtils::merge($this->lazyServices, $config['lazy_services']);
$this->lazyServicesDelegator = null;
}



if (isset($config['abstract_factories'])) {
$abstractFactories = $config['abstract_factories'];

foreach ($abstractFactories as $key => $abstractFactory) {
$this->resolveAbstractFactoryInstance($abstractFactory);
}
}

if (isset($config['initializers'])) {
$this->resolveInitializers($config['initializers']);
}

$this->configured = true;

return $this;
}









public function setAlias($alias, $target)
{
if (isset($this->services[$alias]) && ! $this->allowOverride) {
throw ContainerModificationsNotAllowedException::fromExistingService($alias);
}

$this->mapAliasToTarget($alias, $target);
}










public function setInvokableClass($name, $class = null)
{
if (isset($this->services[$name]) && ! $this->allowOverride) {
throw ContainerModificationsNotAllowedException::fromExistingService($name);
}

$this->createAliasesAndFactoriesForInvokables([$name => $class ?? $name]);
}

/**
@psalm-param









*/
public function setFactory($name, $factory)
{
if (isset($this->services[$name]) && ! $this->allowOverride) {
throw ContainerModificationsNotAllowedException::fromExistingService($name);
}

$this->factories[$name] = $factory;
}








public function mapLazyService($name, $class = null)
{
$this->configure(['lazy_services' => ['class_map' => [$name => $class ?: $name]]]);
}

/**
@psalm-param




*/
public function addAbstractFactory($factory)
{
$this->resolveAbstractFactoryInstance($factory);
}

/**
@psalm-param






*/
public function addDelegator($name, $factory)
{
$this->configure(['delegators' => [$name => [$factory]]]);
}

/**
@psalm-param





*/
public function addInitializer($initializer)
{
$this->configure(['initializers' => [$initializer]]);
}









public function setService($name, $service)
{
if (isset($this->services[$name]) && ! $this->allowOverride) {
throw ContainerModificationsNotAllowedException::fromExistingService($name);
}
$this->services[$name] = $service;
}









public function setShared($name, $flag)
{
if (isset($this->services[$name]) && ! $this->allowOverride) {
throw ContainerModificationsNotAllowedException::fromExistingService($name);
}

$this->shared[$name] = (bool) $flag;
}

/**
@psalm-param


*/
private function resolveInitializers(array $initializers): void
{
foreach ($initializers as $initializer) {
if (is_string($initializer) && class_exists($initializer)) {
$initializer = new $initializer();
}

if (is_callable($initializer)) {
$this->initializers[] = $initializer;
continue;
}

throw InvalidArgumentException::fromInvalidInitializer($initializer);
}
}

/**
@psalm-return(callable(ContainerInterface,string,array<mixed>|null):object)|Factory\FactoryInterface



*/
private function getFactory(string $name): callable
{
$factory = $this->factories[$name] ?? null;

$lazyLoaded = false;
if (is_string($factory) && class_exists($factory)) {
$factory = new $factory();
$lazyLoaded = true;
}

if (is_callable($factory)) {
if ($lazyLoaded) {
$this->factories[$name] = $factory;
}

return $factory;
}


foreach ($this->abstractFactories as $abstractFactory) {
if ($abstractFactory->canCreate($this->creationContext, $name)) {
return $abstractFactory;
}
}

throw new ServiceNotFoundException(sprintf(
'Unable to resolve service "%s" to a factory; are you certain you provided it during configuration?',
$name
));
}




private function createDelegatorFromName(string $name, ?array $options = null)
{
$creationCallback = function () use ($name, $options) {

$factory = $this->getFactory($name);
return $factory($this->creationContext, $name, $options);
};

$initialCreationContext = $this->creationContext;

foreach ($this->delegators[$name] as $index => $delegatorFactory) {
$delegatorFactory = $this->delegators[$name][$index];

if ($delegatorFactory === LazyServiceFactory::class) {
$delegatorFactory = $this->createLazyServiceDelegatorFactory();
} elseif (is_string($delegatorFactory) && class_exists($delegatorFactory)) {
$delegatorFactory = new $delegatorFactory();
}

$this->assertCallableDelegatorFactory($delegatorFactory);

$this->delegators[$name][$index] = $delegatorFactory;

$creationCallback =

static fn() => $delegatorFactory($initialCreationContext, $name, $creationCallback, $options);
}

return $creationCallback();
}











private function doCreate(string $resolvedName, ?array $options = null)
{
try {
if (! isset($this->delegators[$resolvedName])) {

$factory = $this->getFactory($resolvedName);
$object = $factory($this->creationContext, $resolvedName, $options);
} else {
$object = $this->createDelegatorFromName($resolvedName, $options);
}
} catch (ContainerExceptionInterface $exception) {
throw $exception;
} catch (Exception $exception) {
throw new ServiceNotCreatedException(sprintf(
'Service with name "%s" could not be created. Reason: %s',
$resolvedName,
$exception->getMessage()
), (int) $exception->getCode(), $exception);
}

foreach ($this->initializers as $initializer) {
$initializer($this->creationContext, $object);
}

return $object;
}









private function createLazyServiceDelegatorFactory(): LazyServiceFactory
{
if ($this->lazyServicesDelegator) {
return $this->lazyServicesDelegator;
}

if (! isset($this->lazyServices['class_map'])) {
throw new ServiceNotCreatedException('Missing "class_map" config key in "lazy_services"');
}

$factoryConfig = new ProxyConfiguration();

if (isset($this->lazyServices['proxies_namespace'])) {
$factoryConfig->setProxiesNamespace($this->lazyServices['proxies_namespace']);
}

if (isset($this->lazyServices['proxies_target_dir'])) {
$factoryConfig->setProxiesTargetDir($this->lazyServices['proxies_target_dir']);
}

if (! isset($this->lazyServices['write_proxy_files']) || ! $this->lazyServices['write_proxy_files']) {
$factoryConfig->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
} else {
$factoryConfig->setGeneratorStrategy(new FileWriterGeneratorStrategy(
new FileLocator($factoryConfig->getProxiesTargetDir())
));
}

spl_autoload_register($factoryConfig->getProxyAutoloader());

$this->lazyServicesDelegator = new LazyServiceFactory(
new LazyLoadingValueHolderFactory($factoryConfig),
$this->lazyServices['class_map']
);

return $this->lazyServicesDelegator;
}

/**
@psalm-param
@psalm-return




*/
private function mergeDelegators(array $config): array
{
foreach ($config as $key => $delegators) {
if (! array_key_exists($key, $this->delegators)) {
$this->delegators[$key] = [];
}

foreach ($delegators as $delegator) {
if (! in_array($delegator, $this->delegators[$key], true)) {
$this->delegators[$key][] = $delegator;
}
}
}

return $this->delegators;
}











private function createAliasesAndFactoriesForInvokables(array $invokables): array
{
$newAliases = [];

foreach ($invokables as $name => $class) {
$this->factories[$class] = Factory\InvokableFactory::class;
if ($name !== $class) {
$this->aliases[$name] = $class;
$newAliases[$name] = $class;
}
}

return $newAliases;
}

/**
@psalm-param











*/
private function validateServiceNames(array $config): void
{
if ($this->allowOverride || ! $this->configured) {
return;
}

if (isset($config['services'])) {
foreach (array_keys($config['services']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['aliases'])) {
foreach (array_keys($config['aliases']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['invokables'])) {
foreach (array_keys($config['invokables']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['factories'])) {
foreach (array_keys($config['factories']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['delegators'])) {
foreach (array_keys($config['delegators']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['shared'])) {
foreach (array_keys($config['shared']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}

if (isset($config['lazy_services']['class_map'])) {
foreach (array_keys($config['lazy_services']['class_map']) as $service) {
if (isset($this->services[$service])) {
throw ContainerModificationsNotAllowedException::fromExistingService($service);
}
}
}
}








private function mapAliasToTarget(string $alias, string $target): void
{


$this->aliases[$alias] = $this->aliases[$target] ?? $target;


if ($alias === $this->aliases[$alias]) {
throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases);
}



if (in_array($alias, $this->aliases)) {
$r = array_intersect($this->aliases, [$alias]);

foreach ($r as $name => $service) {
$this->aliases[$name] = $target;
}
}
}

















private function mapAliasesToTargets(): void
{
$tagged = [];
foreach ($this->aliases as $alias => $target) {
if (isset($tagged[$alias])) {
continue;
}

$tCursor = $this->aliases[$alias];
$aCursor = $alias;
if ($aCursor === $tCursor) {
throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases);
}
if (! isset($this->aliases[$tCursor])) {
continue;
}

$stack = [];

while (isset($this->aliases[$tCursor])) {
$stack[] = $aCursor;
if ($aCursor === $this->aliases[$tCursor]) {
throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases);
}
$aCursor = $tCursor;
$tCursor = $this->aliases[$tCursor];
}

$tagged[$aCursor] = true;

foreach ($stack as $alias) {
if ($alias === $tCursor) {
throw CyclicAliasException::fromCyclicAlias($alias, $this->aliases);
}
$this->aliases[$alias] = $tCursor;
$tagged[$alias] = true;
}
}
}

/**
@psalm-param



*/
private function resolveAbstractFactoryInstance($abstractFactory): void
{
if (is_string($abstractFactory) && class_exists($abstractFactory)) {

if (! isset($this->cachedAbstractFactories[$abstractFactory])) {
$this->cachedAbstractFactories[$abstractFactory] = new $abstractFactory();
}

$abstractFactory = $this->cachedAbstractFactories[$abstractFactory];
}

if (! $abstractFactory instanceof Factory\AbstractFactoryInterface) {
throw InvalidArgumentException::fromInvalidAbstractFactory($abstractFactory);
}

$abstractFactoryObjHash = spl_object_hash($abstractFactory);
$this->abstractFactories[$abstractFactoryObjHash] = $abstractFactory;
}




private function staticServiceOrFactoryCanCreate(string $name): bool
{
if (isset($this->services[$name]) || isset($this->factories[$name])) {
return true;
}

$resolvedName = $this->aliases[$name] ?? $name;
if ($resolvedName !== $name) {
return $this->staticServiceOrFactoryCanCreate($resolvedName);
}

return false;
}




private function abstractFactoryCanCreate(string $name): bool
{
foreach ($this->abstractFactories as $abstractFactory) {
if ($abstractFactory->canCreate($this->creationContext, $name)) {
return true;
}
}

$resolvedName = $this->aliases[$name] ?? $name;
if ($resolvedName !== $name) {
return $this->abstractFactoryCanCreate($resolvedName);
}

return false;
}

/**
@psalm-param
@psalm-assert
*/
private function assertCallableDelegatorFactory($delegatorFactory): void
{
if (
$delegatorFactory instanceof Factory\DelegatorFactoryInterface
|| is_callable($delegatorFactory)
) {
return;
}
if (is_string($delegatorFactory)) {
throw new ServiceNotCreatedException(sprintf(
'An invalid delegator factory was registered; resolved to class or function "%s"'
. ' which does not exist; please provide a valid function name or class name resolving'
. ' to an implementation of %s',
$delegatorFactory,
DelegatorFactoryInterface::class
));
}
throw new ServiceNotCreatedException(sprintf(
'A non-callable delegator, "%s", was provided; expected a callable or instance of "%s"',
is_object($delegatorFactory) ? $delegatorFactory::class : gettype($delegatorFactory),
DelegatorFactoryInterface::class
));
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use Laminas\Stdlib\ArrayUtils;

use function array_keys;

/**
@psalm-import-type
















*/
class Config implements ConfigInterface
{

private array $allowedKeys = [
'abstract_factories' => true,
'aliases' => true,
'delegators' => true,
'factories' => true,
'initializers' => true,
'invokables' => true,
'lazy_services' => true,
'services' => true,
'shared' => true,
];

/**
@psalm-var

*/
protected $config = [
'abstract_factories' => [],
'aliases' => [],
'delegators' => [],
'factories' => [],
'initializers' => [],
'invokables' => [],
'lazy_services' => [],
'services' => [],
'shared' => [],
];

/**
@psalm-param
*/
public function __construct(array $config = [])
{

foreach (array_keys($config) as $key) {
if (! isset($this->allowedKeys[$key])) {
unset($config[$key]);
}
}

/**
@psalm-suppress */
$this->config = $this->merge($this->config, $config);
}




public function configureServiceManager(ServiceManager $serviceManager)
{
return $serviceManager->configure($this->config);
}




public function toArray()
{
return $this->config;
}

/**
@psalm-param
@psalm-param
@psalm-return
*/
private function merge(array $a, array $b)
{
return ArrayUtils::merge($a, $b);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use Laminas\ServiceManager\Exception\InvalidServiceException;
use Psr\Container\ContainerExceptionInterface;

/**
@template




*/
interface PluginManagerInterface extends ServiceLocatorInterface
{
/**
@psalm-assert






*/
public function validate(mixed $instance);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Factory;

use Psr\Container\ContainerInterface;











interface AbstractFactoryInterface extends FactoryInterface
{






public function canCreate(ContainerInterface $container, $requestedName);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Factory;

use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\ServiceManager\Exception\ServiceNotFoundException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;









interface DelegatorFactoryInterface
{
/**
@psalm-param








*/
public function __invoke(ContainerInterface $container, $name, callable $callback, ?array $options = null);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Factory;

use Psr\Container\ContainerInterface;












final class InvokableFactory implements FactoryInterface
{

public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
return null === $options ? new $requestedName() : new $requestedName($options);
}
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Factory;

use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\ServiceManager\Exception\ServiceNotFoundException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;









interface FactoryInterface
{










public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;






















interface FactoryInterface extends Factory\FactoryInterface
{





public function createService(ServiceLocatorInterface $serviceLocator);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;




interface ServiceLocatorInterface extends ContainerInterface
{
/**
@template
@psalm-return($name is class-string<T> ? T : mixed)










*/
public function build($name, ?array $options = null);
}
<?php 


declare(strict_types=1);

use Interop\Container\Containerinterface as InteropContainerInterface;
use Interop\Container\Exception\ContainerException as InteropContainerException;
use Interop\Container\Exception\NotFoundException as InteropNotFoundException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;

if (! interface_exists(InteropContainerInterface::class, false)) {
class_alias(ContainerInterface::class, InteropContainerInterface::class);
}
if (! interface_exists(InteropContainerException::class, false)) {
class_alias(ContainerExceptionInterface::class, InteropContainerException::class);
}
if (! interface_exists(InteropNotFoundException::class, false)) {
class_alias(NotFoundExceptionInterface::class, InteropNotFoundException::class);
}
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager\Initializer;

use Psr\Container\ContainerInterface;







interface InitializerInterface
{






public function __invoke(ContainerInterface $container, $instance);
}
#!/usr/bin/env php
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

// Setup/verify autoloading
if (file_exists($a = getcwd() . '/vendor/autoload.php')) {
    require $a;
} elseif (file_exists($a = __DIR__ . '/../../../autoload.php')) {
    require $a;
} elseif (file_exists($a = __DIR__ . '/../vendor/autoload.php')) {
    require $a;
} else {
    fwrite(STDERR, 'Cannot locate autoloader; please run "composer install"' . PHP_EOL);
    exit(1);
}

$command = new Tool\FactoryCreatorCommand($argv[0]);
$status = $command(array_slice($argv, 1));
exit($status);
#!/usr/bin/env php
<?php

declare(strict_types=1);

namespace Laminas\ServiceManager;

// Setup/verify autoloading
if (file_exists($a = getcwd() . '/vendor/autoload.php')) {
    require $a;
} elseif (file_exists($a = __DIR__ . '/../../../autoload.php')) {
    require $a;
} elseif (file_exists($a = __DIR__ . '/../vendor/autoload.php')) {
    require $a;
} else {
    fwrite(STDERR, 'Cannot locate autoloader; please run "composer install"' . PHP_EOL);
    exit(1);
}

$command = new Tool\ConfigDumperCommand($argv[0]);
$status = $command(array_slice($argv, 1));
exit($status);
{"$schema":"https:\/\/docs.renovatebot.com\/renovate-schema.json","extends":["local>laminas\/.github:renovate-config"]}<?php

namespace Laminas\Validator;

use Exception;
use Laminas\Validator\Exception\InvalidArgumentException;

use function array_merge;
use function assert;
use function call_user_func_array;
use function is_bool;
use function is_callable;

/**
@psalm-type
@psalm-type












*/
class Callback extends AbstractValidator
{



public const INVALID_CALLBACK = 'callbackInvalid';




public const INVALID_VALUE = 'callbackValue';






protected $messageTemplates = [
self::INVALID_VALUE => 'The input is not valid',
self::INVALID_CALLBACK => 'An exception has been raised within the callback',
];






protected $options = [
'callback' => null, 
'callbackOptions' => [], 
'throwExceptions' => false, 
'bind' => false, 
];


public function __construct($options = null)
{
if (is_callable($options)) {
$options = ['callback' => $options];
}

$bind = $options['bind'] ?? false;
assert(is_bool($bind));
$closure = $options['callback'] ?? null;
if (is_callable($closure) && $bind === true) {
$options['callback'] = $closure(...)->bindTo($this);
}

parent::__construct($options);
}








public function getCallback()
{
return $this->options['callback'];
}










public function setCallback($callback)
{
if (! is_callable($callback)) {
throw new InvalidArgumentException('Invalid callback given');
}

$this->options['callback'] = $callback;
return $this;
}








public function getCallbackOptions()
{
return $this->options['callbackOptions'];
}









public function setCallbackOptions(mixed $options)
{
$this->options['callbackOptions'] = (array) $options;
return $this;
}










public function isValid($value, $context = null)
{
$this->setValue($value);

$options = $this->getCallbackOptions();
$callback = $this->getCallback();
if (! is_callable($callback)) {
throw new InvalidArgumentException('No callback given');
}

$args = [$value];
if (empty($options) && ! empty($context)) {
$args[] = $context;
}
if (! empty($options) && empty($context)) {
$args = array_merge($args, $options);
}
if (! empty($options) && ! empty($context)) {
$args[] = $context;
$args = array_merge($args, $options);
}

try {
if (! call_user_func_array($callback, $args)) {
$this->error(self::INVALID_VALUE);
return false;
}
} catch (Exception $exception) {



$this->error(self::INVALID_CALLBACK);

if ($this->options['throwExceptions'] === true) {
throw $exception;
}

return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Exception;
use Laminas\Stdlib\ArrayUtils;
use Laminas\Validator\Exception\InvalidArgumentException;
use SensitiveParameter;
use Traversable;

use function array_key_exists;
use function array_keys;
use function array_shift;
use function constant;
use function ctype_digit;
use function defined;
use function floor;
use function func_get_args;
use function in_array;
use function is_array;
use function is_callable;
use function is_string;
use function str_starts_with;
use function strlen;
use function strtoupper;


class CreditCard extends AbstractValidator
{





public const ALL = 'All';
public const AMERICAN_EXPRESS = 'American_Express';
public const UNIONPAY = 'Unionpay';
public const DINERS_CLUB = 'Diners_Club';
public const DINERS_CLUB_US = 'Diners_Club_US';
public const DISCOVER = 'Discover';
public const JCB = 'JCB';
public const LASER = 'Laser';
public const MAESTRO = 'Maestro';
public const MASTERCARD = 'Mastercard';
public const SOLO = 'Solo';
public const VISA = 'Visa';
public const MIR = 'Mir';

public const CHECKSUM = 'creditcardChecksum';
public const CONTENT = 'creditcardContent';
public const INVALID = 'creditcardInvalid';
public const LENGTH = 'creditcardLength';
public const PREFIX = 'creditcardPrefix';
public const SERVICE = 'creditcardService';
public const SERVICEFAILURE = 'creditcardServiceFailure';






protected $messageTemplates = [
self::CHECKSUM => 'The input seems to contain an invalid checksum',
self::CONTENT => 'The input must contain only digits',
self::INVALID => 'Invalid type given. String expected',
self::LENGTH => 'The input contains an invalid amount of digits',
self::PREFIX => 'The input is not from an allowed institute',
self::SERVICE => 'The input seems to be an invalid credit card number',
self::SERVICEFAILURE => 'An exception has been raised while validating the input',
];






protected $cardName = [
0 => self::AMERICAN_EXPRESS,
1 => self::DINERS_CLUB,
2 => self::DINERS_CLUB_US,
3 => self::DISCOVER,
4 => self::JCB,
5 => self::LASER,
6 => self::MAESTRO,
7 => self::MASTERCARD,
8 => self::SOLO,
9 => self::UNIONPAY,
10 => self::VISA,
11 => self::MIR,
];






protected $cardLength = [
self::AMERICAN_EXPRESS => [15],
self::DINERS_CLUB => [14],
self::DINERS_CLUB_US => [16],
self::DISCOVER => [16, 19],
self::JCB => [15, 16],
self::LASER => [16, 17, 18, 19],
self::MAESTRO => [12, 13, 14, 15, 16, 17, 18, 19],
self::MASTERCARD => [16],
self::SOLO => [16, 18, 19],
self::UNIONPAY => [16, 17, 18, 19],
self::VISA => [13, 16, 19],
self::MIR => [13, 16],
];






protected $cardType = [
self::AMERICAN_EXPRESS => ['34', '37'],
self::DINERS_CLUB => ['300', '301', '302', '303', '304', '305', '36'],
self::DINERS_CLUB_US => ['54', '55'],
self::DISCOVER => [
'6011',
'622126',
'622127',
'622128',
'622129',
'62213',
'62214',
'62215',
'62216',
'62217',
'62218',
'62219',
'6222',
'6223',
'6224',
'6225',
'6226',
'6227',
'6228',
'62290',
'62291',
'622920',
'622921',
'622922',
'622923',
'622924',
'622925',
'644',
'645',
'646',
'647',
'648',
'649',
'65',
],
self::JCB => ['1800', '2131', '3528', '3529', '353', '354', '355', '356', '357', '358'],
self::LASER => ['6304', '6706', '6771', '6709'],
self::MAESTRO => [
'5018',
'5020',
'5038',
'6304',
'6759',
'6761',
'6762',
'6763',
'6764',
'6765',
'6766',
'6772',
],
self::MASTERCARD => [
'2221',
'2222',
'2223',
'2224',
'2225',
'2226',
'2227',
'2228',
'2229',
'223',
'224',
'225',
'226',
'227',
'228',
'229',
'23',
'24',
'25',
'26',
'271',
'2720',
'51',
'52',
'53',
'54',
'55',
],
self::SOLO => ['6334', '6767'],
self::UNIONPAY => [
'622126',
'622127',
'622128',
'622129',
'62213',
'62214',
'62215',
'62216',
'62217',
'62218',
'62219',
'6222',
'6223',
'6224',
'6225',
'6226',
'6227',
'6228',
'62290',
'62291',
'622920',
'622921',
'622922',
'622923',
'622924',
'622925',
],
self::VISA => ['4'],
self::MIR => ['2200', '2201', '2202', '2203', '2204'],
];






protected $options = [
'service' => null, 
'type' => [], 
];






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (! is_array($options)) {
$options = func_get_args();
$temp['type'] = array_shift($options);
if (! empty($options)) {
$temp['service'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('type', $options)) {
$options['type'] = self::ALL;
}

$this->setType($options['type']);
unset($options['type']);

if (array_key_exists('service', $options)) {
$this->setService($options['service']);
unset($options['service']);
}

parent::__construct($options);
}








public function getType()
{
return $this->options['type'];
}









public function setType($type)
{
$this->options['type'] = [];
return $this->addType($type);
}









public function addType($type)
{
if (is_string($type)) {
$type = [$type];
}

foreach ($type as $typ) {
if ($typ === self::ALL) {
$this->options['type'] = array_keys($this->cardLength);
continue;
}

if (in_array($typ, $this->options['type'])) {
continue;
}

$constant = 'static::' . strtoupper($typ);
if (! defined($constant) || in_array(constant($constant), $this->options['type'])) {
continue;
}
$this->options['type'][] = constant($constant);
}

return $this;
}








public function getService()
{
return $this->options['service'];
}










public function setService($service)
{
if (! is_callable($service)) {
throw new InvalidArgumentException('Invalid callback given');
}

$this->options['service'] = $service;
return $this;
}










public function isValid(
#[SensitiveParameter]
$value
) {
$this->setValue($value);

if (! is_string($value)) {
$this->error(self::INVALID, $value);
return false;
}

if (! ctype_digit($value)) {
$this->error(self::CONTENT, $value);
return false;
}

$length = strlen($value);
$types = $this->getType();
$foundp = false;
$foundl = false;
foreach ($types as $type) {
foreach ($this->cardType[$type] as $prefix) {
if (str_starts_with($value, (string) $prefix)) {
$foundp = true;
if (in_array($length, $this->cardLength[$type])) {
$foundl = true;
break 2;
}
}
}
}

if ($foundp === false) {
$this->error(self::PREFIX, $value);
return false;
}

if ($foundl === false) {
$this->error(self::LENGTH, $value);
return false;
}

$sum = 0;
$weight = 2;

for ($i = $length - 2; $i >= 0; $i--) {
$digit = $weight * $value[$i];
$sum += floor($digit / 10) + $digit % 10;
$weight = $weight % 2 + 1;
}

$checksum = (10 - $sum % 10) % 10;
if ((string) $checksum !== $value[$length - 1]) {
$this->error(self::CHECKSUM, $value);
return false;
}

$service = $this->getService();
if (! empty($service)) {
try {
$callback = new Callback($service);
$callback->setOptions($this->getType());
if (! $callback->isValid($value)) {
$this->error(self::SERVICE, $value);
return false;
}
} catch (Exception) {
$this->error(self::SERVICEFAILURE, $value);
return false;
}
}

return true;
}


}
<?php 

namespace Laminas\Validator;

use Countable;
use IteratorAggregate;
use Laminas\ServiceManager\ServiceManager;
use Laminas\Stdlib\PriorityQueue;
use ReturnTypeWillChange;
use Traversable;

use function array_replace;
use function assert;
use function count;
use function rsort;

use const SORT_NUMERIC;

/**
@psalm-type
@implements

*/
class ValidatorChain implements Countable, IteratorAggregate, ValidatorInterface
{



public const DEFAULT_PRIORITY = 1;


protected $plugins;






protected $validators;






protected $messages = [];




public function __construct()
{
$this->validators = new PriorityQueue();
}






#[ReturnTypeWillChange]
public function count()
{
return count($this->validators);
}






public function getPluginManager()
{
if (! $this->plugins) {
$this->setPluginManager(new ValidatorPluginManager(new ServiceManager()));
}
return $this->plugins;
}

/**
@psalm-assert




*/
public function setPluginManager(ValidatorPluginManager $plugins)
{
$this->plugins = $plugins;
return $this;
}

/**
@template
@psalm-param
@psalm-return






*/
public function plugin($name, ?array $options = null)
{
$plugins = $this->getPluginManager();
return $plugins->get($name, $options);
}












public function attach(
ValidatorInterface $validator,
$breakChainOnFailure = false,
$priority = self::DEFAULT_PRIORITY
) {
/**
@psalm-suppress */
$this->validators->insert(
[
'instance' => $validator,
'breakChainOnFailure' => (bool) $breakChainOnFailure,
],
$priority
);

return $this;
}










public function addValidator(
ValidatorInterface $validator,
$breakChainOnFailure = false,
$priority = self::DEFAULT_PRIORITY
) {
return $this->attach($validator, $breakChainOnFailure, $priority);
}










public function prependValidator(ValidatorInterface $validator, $breakChainOnFailure = false)
{
$priority = self::DEFAULT_PRIORITY;

if (! $this->validators->isEmpty()) {
$extractedNodes = $this->validators->toArray(PriorityQueue::EXTR_PRIORITY);
rsort($extractedNodes, SORT_NUMERIC);
$priority = $extractedNodes[0] + 1;
}

/**
@psalm-suppress */
$this->validators->insert(
[
'instance' => $validator,
'breakChainOnFailure' => (bool) $breakChainOnFailure,
],
$priority
);
return $this;
}










public function attachByName($name, $options = [], $breakChainOnFailure = false, $priority = self::DEFAULT_PRIORITY)
{
if (isset($options['break_chain_on_failure'])) {
$breakChainOnFailure = (bool) $options['break_chain_on_failure'];
}

if (isset($options['breakchainonfailure'])) {
$breakChainOnFailure = (bool) $options['breakchainonfailure'];
}

$this->attach($this->plugin($name, $options), $breakChainOnFailure, $priority);

return $this;
}











public function addByName($name, $options = [], $breakChainOnFailure = false)
{
return $this->attachByName($name, $options, $breakChainOnFailure);
}









public function prependByName($name, $options = [], $breakChainOnFailure = false)
{
$validator = $this->plugin($name, $options);
$this->prependValidator($validator, $breakChainOnFailure);
return $this;
}










public function isValid($value, $context = null)
{
$this->messages = [];
$result = true;
foreach ($this as $element) {
$validator = $element['instance'];
assert($validator instanceof ValidatorInterface);
if ($validator->isValid($value, $context)) {
continue;
}
$result = false;
$messages = $validator->getMessages();
$this->messages = array_replace($this->messages, $messages);
if ($element['breakChainOnFailure']) {
break;
}
}
return $result;
}






public function merge(ValidatorChain $validatorChain)
{
foreach ($validatorChain->validators->toArray(PriorityQueue::EXTR_BOTH) as $item) {
$this->attach($item['data']['instance'], $item['data']['breakChainOnFailure'], $item['priority']);
}

return $this;
}






public function getMessages()
{
return $this->messages;
}






public function getValidators()
{
return $this->validators->toArray(PriorityQueue::EXTR_DATA);
}






public function __invoke(mixed $value)
{
return $this->isValid($value);
}




public function __clone()
{
$this->validators = clone $this->validators;
}











public function __sleep()
{
return ['validators', 'messages'];
}


public function getIterator(): Traversable
{
return clone $this->validators;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use function explode;
use function filter_var;
use function get_debug_type;
use function gethostbynamel;
use function ip2long;
use function is_array;
use function is_string;
use function pow;

use const FILTER_FLAG_GLOBAL_RANGE;
use const FILTER_FLAG_IPV4;
use const FILTER_FLAG_NO_PRIV_RANGE;
use const FILTER_FLAG_NO_RES_RANGE;
use const FILTER_VALIDATE_IP;

final class HostWithPublicIPv4Address extends AbstractValidator
{






private const RESERVED_CIDR = [
'0.0.0.0/8',
'0.0.0.0/32',
'10.0.0.0/8',
'100.64.0.0/10',
'127.0.0.0/8',
'169.254.0.0/16',
'172.16.0.0/12',
'192.0.0.0/24',
'192.0.0.0/29',
'192.0.0.8/32',
'192.0.0.9/32',
'192.0.0.10/32',
'192.0.0.170/32',
'192.0.0.171/32',
'192.0.2.0/24',
'192.31.196.0/24',
'192.52.193.0/24',
'192.88.99.0/24',
'192.168.0.0/16',
'192.175.48.0/24',
'198.18.0.0/15',
'198.51.100.0/24',
'203.0.113.0/24',
'224.0.0.0/4', 
'233.252.0.0/24', 
'240.0.0.0/4',
'255.255.255.255/32',
];

public const ERROR_NOT_STRING = 'hostnameNotString';
public const ERROR_HOSTNAME_NOT_RESOLVED = 'hostnameNotResolved';
public const ERROR_PRIVATE_IP_FOUND = 'privateIpAddressFound';


protected array $messageTemplates = [
self::ERROR_NOT_STRING => 'Expected a string hostname but received %type%',
self::ERROR_HOSTNAME_NOT_RESOLVED => 'The hostname "%value%" cannot be resolved',
self::ERROR_PRIVATE_IP_FOUND => 'The hostname "%value%" resolves to at least one reserved IPv4 address',
];

protected string $type = 'null';


protected array $messageVariables = [
'type' => 'type',
'value' => 'value',
];

public function isValid(mixed $value): bool
{
$this->type = get_debug_type($value);

if (! is_string($value)) {
$this->error(self::ERROR_NOT_STRING);

return false;
}

$this->value = $value;

if (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) {
$addressList = gethostbynamel($value);
} else {
$addressList = [$value];
}

if (! is_array($addressList)) {
$this->error(self::ERROR_HOSTNAME_NOT_RESOLVED);

return false;
}

$privateAddressWasFound = false;

$filterFlags = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_GLOBAL_RANGE;

foreach ($addressList as $server) {




if (filter_var($server, FILTER_VALIDATE_IP, $filterFlags) === false) {
$privateAddressWasFound = true;

break;
}

if ($this->inReservedCidr($server)) {
$privateAddressWasFound = true;

break;
}
}

if ($privateAddressWasFound) {
$this->error(self::ERROR_PRIVATE_IP_FOUND);

return false;
}

return true;
}

private function inReservedCidr(string $ip): bool
{
foreach (self::RESERVED_CIDR as $cidr) {
$cidr = explode('/', $cidr);
$startIp = ip2long($cidr[0]);
$endIp = ip2long($cidr[0]) + pow(2, 32 - (int) $cidr[1]) - 1;

$int = ip2long($ip);

if ($int >= $startIp && $int <= $endIp) {
return true;
}
}

return false;
}
}
<?php

namespace Laminas\Validator;

interface ValidatorPluginManagerAwareInterface
{



public function setValidatorPluginManager(ValidatorPluginManager $pluginManager);






public function getValidatorPluginManager();
}
<?php

namespace Laminas\Validator;














interface ValidatorProviderInterface
{





public function getValidatorConfig();
}
<?php

namespace Laminas\Validator;


class ConfigProvider
{





public function __invoke()
{
return [
'dependencies' => $this->getDependencyConfig(),
];
}






public function getDependencyConfig()
{
return [
'aliases' => [
Translator\TranslatorInterface::class => Translator\Translator::class,
'ValidatorManager' => ValidatorPluginManager::class,


'Zend\Validator\ValidatorPluginManager' => ValidatorPluginManager::class,
],
'factories' => [
Translator\Translator::class => Translator\TranslatorFactory::class,
ValidatorPluginManager::class => ValidatorPluginManagerFactory::class,
],
];
}
}
<?php

namespace Laminas\Validator;

use Laminas\I18n\Translator\TranslatorInterface;
use Laminas\I18n\Validator as I18nValidator;
use Laminas\ServiceManager\AbstractPluginManager;
use Laminas\ServiceManager\Exception\InvalidServiceException;
use Laminas\ServiceManager\Factory\InvokableFactory;
use Laminas\ServiceManager\ServiceManager;
use Psr\Container\ContainerInterface;

use function get_debug_type;
use function method_exists;
use function sprintf;

/**
@psalm-import-type
@extends

*/
class ValidatorPluginManager extends AbstractPluginManager
{





protected $aliases = [
'alnum' => I18nValidator\Alnum::class,
'Alnum' => I18nValidator\Alnum::class,
'alpha' => I18nValidator\Alpha::class,
'Alpha' => I18nValidator\Alpha::class,
'barcode' => Barcode::class,
'Barcode' => Barcode::class,
'between' => Between::class,
'Between' => Between::class,
'BIC' => BusinessIdentifierCode::class,
'bic' => BusinessIdentifierCode::class,
'bitwise' => Bitwise::class,
'Bitwise' => Bitwise::class,
'BusinessIdentifierCode' => BusinessIdentifierCode::class,
'businessidentifiercode' => BusinessIdentifierCode::class,
'callback' => Callback::class,
'Callback' => Callback::class,
'creditcard' => CreditCard::class,
'creditCard' => CreditCard::class,
'CreditCard' => CreditCard::class,
'csrf' => Csrf::class,
'Csrf' => Csrf::class,
'date' => Date::class,
'Date' => Date::class,
'datestep' => DateStep::class,
'dateStep' => DateStep::class,
'DateStep' => DateStep::class,
'datetime' => I18nValidator\DateTime::class,
'dateTime' => I18nValidator\DateTime::class,
'DateTime' => I18nValidator\DateTime::class,
'dbnorecordexists' => Db\NoRecordExists::class,
'dbNoRecordExists' => Db\NoRecordExists::class,
'DbNoRecordExists' => Db\NoRecordExists::class,
'dbrecordexists' => Db\RecordExists::class,
'dbRecordExists' => Db\RecordExists::class,
'DbRecordExists' => Db\RecordExists::class,
'digits' => Digits::class,
'Digits' => Digits::class,
'emailaddress' => EmailAddress::class,
'emailAddress' => EmailAddress::class,
'EmailAddress' => EmailAddress::class,
'explode' => Explode::class,
'Explode' => Explode::class,
'filecount' => File\Count::class,
'fileCount' => File\Count::class,
'FileCount' => File\Count::class,
'filecrc32' => File\Crc32::class,
'fileCrc32' => File\Crc32::class,
'FileCrc32' => File\Crc32::class,
'fileexcludeextension' => File\ExcludeExtension::class,
'fileExcludeExtension' => File\ExcludeExtension::class,
'FileExcludeExtension' => File\ExcludeExtension::class,
'fileexcludemimetype' => File\ExcludeMimeType::class,
'fileExcludeMimeType' => File\ExcludeMimeType::class,
'FileExcludeMimeType' => File\ExcludeMimeType::class,
'fileexists' => File\Exists::class,
'fileExists' => File\Exists::class,
'FileExists' => File\Exists::class,
'fileextension' => File\Extension::class,
'fileExtension' => File\Extension::class,
'FileExtension' => File\Extension::class,
'filefilessize' => File\FilesSize::class,
'fileFilesSize' => File\FilesSize::class,
'FileFilesSize' => File\FilesSize::class,
'filehash' => File\Hash::class,
'fileHash' => File\Hash::class,
'FileHash' => File\Hash::class,
'fileimagesize' => File\ImageSize::class,
'fileImageSize' => File\ImageSize::class,
'FileImageSize' => File\ImageSize::class,
'fileiscompressed' => File\IsCompressed::class,
'fileIsCompressed' => File\IsCompressed::class,
'FileIsCompressed' => File\IsCompressed::class,
'fileisimage' => File\IsImage::class,
'fileIsImage' => File\IsImage::class,
'FileIsImage' => File\IsImage::class,
'filemd5' => File\Md5::class,
'fileMd5' => File\Md5::class,
'FileMd5' => File\Md5::class,
'filemimetype' => File\MimeType::class,
'fileMimeType' => File\MimeType::class,
'FileMimeType' => File\MimeType::class,
'filenotexists' => File\NotExists::class,
'fileNotExists' => File\NotExists::class,
'FileNotExists' => File\NotExists::class,
'filesha1' => File\Sha1::class,
'fileSha1' => File\Sha1::class,
'FileSha1' => File\Sha1::class,
'filesize' => File\Size::class,
'fileSize' => File\Size::class,
'FileSize' => File\Size::class,
'fileupload' => File\Upload::class,
'fileUpload' => File\Upload::class,
'FileUpload' => File\Upload::class,
'fileuploadfile' => File\UploadFile::class,
'fileUploadFile' => File\UploadFile::class,
'FileUploadFile' => File\UploadFile::class,
'filewordcount' => File\WordCount::class,
'fileWordCount' => File\WordCount::class,
'FileWordCount' => File\WordCount::class,
'float' => I18nValidator\IsFloat::class,
'Float' => I18nValidator\IsFloat::class,
'gpspoint' => GpsPoint::class,
'gpsPoint' => GpsPoint::class,
'GpsPoint' => GpsPoint::class,
'greaterthan' => GreaterThan::class,
'greaterThan' => GreaterThan::class,
'GreaterThan' => GreaterThan::class,
'hex' => Hex::class,
'Hex' => Hex::class,
'hostname' => Hostname::class,
'Hostname' => Hostname::class,
'iban' => Iban::class,
'Iban' => Iban::class,
'identical' => Identical::class,
'Identical' => Identical::class,
'inarray' => InArray::class,
'inArray' => InArray::class,
'InArray' => InArray::class,
'int' => I18nValidator\IsInt::class,
'Int' => I18nValidator\IsInt::class,
'ip' => Ip::class,
'Ip' => Ip::class,
'IsArray' => IsArray::class,
'isbn' => Isbn::class,
'Isbn' => Isbn::class,
'isCountable' => IsCountable::class,
'IsCountable' => IsCountable::class,
'iscountable' => IsCountable::class,
'isfloat' => I18nValidator\IsFloat::class,
'isFloat' => I18nValidator\IsFloat::class,
'IsFloat' => I18nValidator\IsFloat::class,
'isinstanceof' => IsInstanceOf::class,
'isInstanceOf' => IsInstanceOf::class,
'IsInstanceOf' => IsInstanceOf::class,
'isint' => I18nValidator\IsInt::class,
'isInt' => I18nValidator\IsInt::class,
'IsInt' => I18nValidator\IsInt::class,
'lessthan' => LessThan::class,
'lessThan' => LessThan::class,
'LessThan' => LessThan::class,
'notempty' => NotEmpty::class,
'notEmpty' => NotEmpty::class,
'NotEmpty' => NotEmpty::class,
'phonenumber' => I18nValidator\PhoneNumber::class,
'phoneNumber' => I18nValidator\PhoneNumber::class,
'PhoneNumber' => I18nValidator\PhoneNumber::class,
'postcode' => I18nValidator\PostCode::class,
'postCode' => I18nValidator\PostCode::class,
'PostCode' => I18nValidator\PostCode::class,
'regex' => Regex::class,
'Regex' => Regex::class,
'sitemapchangefreq' => Sitemap\Changefreq::class,
'sitemapChangefreq' => Sitemap\Changefreq::class,
'SitemapChangefreq' => Sitemap\Changefreq::class,
'sitemaplastmod' => Sitemap\Lastmod::class,
'sitemapLastmod' => Sitemap\Lastmod::class,
'SitemapLastmod' => Sitemap\Lastmod::class,
'sitemaploc' => Sitemap\Loc::class,
'sitemapLoc' => Sitemap\Loc::class,
'SitemapLoc' => Sitemap\Loc::class,
'sitemappriority' => Sitemap\Priority::class,
'sitemapPriority' => Sitemap\Priority::class,
'SitemapPriority' => Sitemap\Priority::class,
'stringlength' => StringLength::class,
'stringLength' => StringLength::class,
'StringLength' => StringLength::class,
'step' => Step::class,
'Step' => Step::class,
'timezone' => Timezone::class,
'Timezone' => Timezone::class,
'uri' => Uri::class,
'Uri' => Uri::class,
'uuid' => Uuid::class,
'Uuid' => Uuid::class,


'Zend\I18nValidator\Alnum' => I18nValidator\Alnum::class,
'Zend\I18n\Validator\Alpha' => I18nValidator\Alpha::class,
'Zend\Validator\Barcode' => Barcode::class,
'Zend\Validator\Between' => Between::class,
'Zend\Validator\Bitwise' => Bitwise::class,
'Zend\Validator\Callback' => Callback::class,
'Zend\Validator\CreditCard' => CreditCard::class,
'Zend\Validator\Csrf' => Csrf::class,
'Zend\Validator\DateStep' => DateStep::class,
'Zend\Validator\Date' => Date::class,
'Zend\I18n\Validator\DateTime' => I18nValidator\DateTime::class,
'Zend\Validator\Db\NoRecordExists' => Db\NoRecordExists::class,
'Zend\Validator\Db\RecordExists' => Db\RecordExists::class,
'Zend\Validator\Digits' => Digits::class,
'Zend\Validator\EmailAddress' => EmailAddress::class,
'Zend\Validator\Explode' => Explode::class,
'Zend\Validator\File\Count' => File\Count::class,
'Zend\Validator\File\Crc32' => File\Crc32::class,
'Zend\Validator\File\ExcludeExtension' => File\ExcludeExtension::class,
'Zend\Validator\File\ExcludeMimeType' => File\ExcludeMimeType::class,
'Zend\Validator\File\Exists' => File\Exists::class,
'Zend\Validator\File\Extension' => File\Extension::class,
'Zend\Validator\File\FilesSize' => File\FilesSize::class,
'Zend\Validator\File\Hash' => File\Hash::class,
'Zend\Validator\File\ImageSize' => File\ImageSize::class,
'Zend\Validator\File\IsCompressed' => File\IsCompressed::class,
'Zend\Validator\File\IsImage' => File\IsImage::class,
'Zend\Validator\File\Md5' => File\Md5::class,
'Zend\Validator\File\MimeType' => File\MimeType::class,
'Zend\Validator\File\NotExists' => File\NotExists::class,
'Zend\Validator\File\Sha1' => File\Sha1::class,
'Zend\Validator\File\Size' => File\Size::class,
'Zend\Validator\File\Upload' => File\Upload::class,
'Zend\Validator\File\UploadFile' => File\UploadFile::class,
'Zend\Validator\File\WordCount' => File\WordCount::class,
'Zend\I18n\Validator\IsFloatIsFloat' => I18nValidator\IsFloat::class,
'Zend\Validator\GpsPoint' => GpsPoint::class,
'Zend\Validator\GreaterThan' => GreaterThan::class,
'Zend\Validator\Hex' => Hex::class,
'Zend\Validator\Hostname' => Hostname::class,
'Zend\Validator\Iban' => Iban::class,
'Zend\Validator\Identical' => Identical::class,
'Zend\Validator\InArray' => InArray::class,
'Zend\I18n\Validator\IsInt' => I18nValidator\IsInt::class,
'Zend\Validator\Ip' => Ip::class,
'Zend\Validator\Isbn' => Isbn::class,
'Zend\Validator\IsInstanceOf' => IsInstanceOf::class,
'Zend\Validator\LessThan' => LessThan::class,
'Zend\Validator\NotEmpty' => NotEmpty::class,
'Zend\I18n\Validator\PhoneNumber' => I18nValidator\PhoneNumber::class,
'Zend\I18n\Validator\PostCode' => I18nValidator\PostCode::class,
'Zend\Validator\Regex' => Regex::class,
'Zend\Validator\Sitemap\Changefreq' => Sitemap\Changefreq::class,
'Zend\Validator\Sitemap\Lastmod' => Sitemap\Lastmod::class,
'Zend\Validator\Sitemap\Loc' => Sitemap\Loc::class,
'Zend\Validator\Sitemap\Priority' => Sitemap\Priority::class,
'Zend\Validator\StringLength' => StringLength::class,
'Zend\Validator\Step' => Step::class,
'Zend\Validator\Timezone' => Timezone::class,
'Zend\Validator\Uri' => Uri::class,
'Zend\Validator\Uuid' => Uuid::class,


'zendvalidatorbarcode' => Barcode::class,
'zendvalidatorbetween' => Between::class,
'zendvalidatorbitwise' => Bitwise::class,
'zendvalidatorcallback' => Callback::class,
'zendvalidatorcreditcard' => CreditCard::class,
'zendvalidatorcsrf' => Csrf::class,
'zendvalidatordatestep' => DateStep::class,
'zendvalidatordate' => Date::class,
'zendvalidatordbnorecordexists' => Db\NoRecordExists::class,
'zendvalidatordbrecordexists' => Db\RecordExists::class,
'zendvalidatordigits' => Digits::class,
'zendvalidatoremailaddress' => EmailAddress::class,
'zendvalidatorexplode' => Explode::class,
'zendvalidatorfilecount' => File\Count::class,
'zendvalidatorfilecrc32' => File\Crc32::class,
'zendvalidatorfileexcludeextension' => File\ExcludeExtension::class,
'zendvalidatorfileexcludemimetype' => File\ExcludeMimeType::class,
'zendvalidatorfileexists' => File\Exists::class,
'zendvalidatorfileextension' => File\Extension::class,
'zendvalidatorfilefilessize' => File\FilesSize::class,
'zendvalidatorfilehash' => File\Hash::class,
'zendvalidatorfileimagesize' => File\ImageSize::class,
'zendvalidatorfileiscompressed' => File\IsCompressed::class,
'zendvalidatorfileisimage' => File\IsImage::class,
'zendvalidatorfilemd5' => File\Md5::class,
'zendvalidatorfilemimetype' => File\MimeType::class,
'zendvalidatorfilenotexists' => File\NotExists::class,
'zendvalidatorfilesha1' => File\Sha1::class,
'zendvalidatorfilesize' => File\Size::class,
'zendvalidatorfileupload' => File\Upload::class,
'zendvalidatorfileuploadfile' => File\UploadFile::class,
'zendvalidatorfilewordcount' => File\WordCount::class,
'zendvalidatorgpspoint' => GpsPoint::class,
'zendvalidatorgreaterthan' => GreaterThan::class,
'zendvalidatorhex' => Hex::class,
'zendvalidatorhostname' => Hostname::class,
'zendi18nvalidatoralnum' => I18nValidator\Alnum::class,
'zendi18nvalidatoralpha' => I18nValidator\Alpha::class,
'zendi18nvalidatordatetime' => I18nValidator\DateTime::class,
'zendi18nvalidatorisfloat' => I18nValidator\IsFloat::class,
'zendi18nvalidatorisint' => I18nValidator\IsInt::class,
'zendi18nvalidatorphonenumber' => I18nValidator\PhoneNumber::class,
'zendi18nvalidatorpostcode' => I18nValidator\PostCode::class,
'zendvalidatoriban' => Iban::class,
'zendvalidatoridentical' => Identical::class,
'zendvalidatorinarray' => InArray::class,
'zendvalidatorip' => Ip::class,
'zendvalidatorisbn' => Isbn::class,
'zendvalidatorisinstanceof' => IsInstanceOf::class,
'zendvalidatorlessthan' => LessThan::class,
'zendvalidatornotempty' => NotEmpty::class,
'zendvalidatorregex' => Regex::class,
'zendvalidatorsitemapchangefreq' => Sitemap\Changefreq::class,
'zendvalidatorsitemaplastmod' => Sitemap\Lastmod::class,
'zendvalidatorsitemaploc' => Sitemap\Loc::class,
'zendvalidatorsitemappriority' => Sitemap\Priority::class,
'zendvalidatorstringlength' => StringLength::class,
'zendvalidatorstep' => Step::class,
'zendvalidatortimezone' => Timezone::class,
'zendvalidatoruri' => Uri::class,
'zendvalidatoruuid' => Uuid::class,
];






protected $factories = [
I18nValidator\Alnum::class => InvokableFactory::class,
I18nValidator\Alpha::class => InvokableFactory::class,
Barcode::class => InvokableFactory::class,
Between::class => InvokableFactory::class,
Bitwise::class => InvokableFactory::class,
BusinessIdentifierCode::class => InvokableFactory::class,
Callback::class => InvokableFactory::class,
CreditCard::class => InvokableFactory::class,
Csrf::class => InvokableFactory::class,
DateStep::class => InvokableFactory::class,
Date::class => InvokableFactory::class,
DateComparison::class => InvokableFactory::class,
I18nValidator\DateTime::class => InvokableFactory::class,
Db\NoRecordExists::class => InvokableFactory::class,
Db\RecordExists::class => InvokableFactory::class,
Digits::class => InvokableFactory::class,
EmailAddress::class => InvokableFactory::class,
Explode::class => InvokableFactory::class,
File\Count::class => InvokableFactory::class,
File\Crc32::class => InvokableFactory::class,
File\ExcludeExtension::class => InvokableFactory::class,
File\ExcludeMimeType::class => InvokableFactory::class,
File\Exists::class => InvokableFactory::class,
File\Extension::class => InvokableFactory::class,
File\FilesSize::class => InvokableFactory::class,
File\Hash::class => InvokableFactory::class,
File\ImageSize::class => InvokableFactory::class,
File\IsCompressed::class => InvokableFactory::class,
File\IsImage::class => InvokableFactory::class,
File\Md5::class => InvokableFactory::class,
File\MimeType::class => InvokableFactory::class,
File\NotExists::class => InvokableFactory::class,
File\Sha1::class => InvokableFactory::class,
File\Size::class => InvokableFactory::class,
File\Upload::class => InvokableFactory::class,
File\UploadFile::class => InvokableFactory::class,
File\WordCount::class => InvokableFactory::class,
I18nValidator\IsFloat::class => InvokableFactory::class,
GpsPoint::class => InvokableFactory::class,
GreaterThan::class => InvokableFactory::class,
Hex::class => InvokableFactory::class,
Hostname::class => InvokableFactory::class,
HostWithPublicIPv4Address::class => InvokableFactory::class,
Iban::class => InvokableFactory::class,
Identical::class => InvokableFactory::class,
InArray::class => InvokableFactory::class,
I18nValidator\IsInt::class => InvokableFactory::class,
Ip::class => InvokableFactory::class,
IsArray::class => InvokableFactory::class,
Isbn::class => InvokableFactory::class,
IsCountable::class => InvokableFactory::class,
IsInstanceOf::class => InvokableFactory::class,
IsJsonString::class => InvokableFactory::class,
LessThan::class => InvokableFactory::class,
NotEmpty::class => InvokableFactory::class,
NumberComparison::class => InvokableFactory::class,
I18nValidator\PhoneNumber::class => InvokableFactory::class,
I18nValidator\PostCode::class => InvokableFactory::class,
Regex::class => InvokableFactory::class,
Sitemap\Changefreq::class => InvokableFactory::class,
Sitemap\Lastmod::class => InvokableFactory::class,
Sitemap\Loc::class => InvokableFactory::class,
Sitemap\Priority::class => InvokableFactory::class,
StringLength::class => InvokableFactory::class,
Step::class => InvokableFactory::class,
Timezone::class => InvokableFactory::class,
Uri::class => InvokableFactory::class,
Uuid::class => InvokableFactory::class,


'laminasvalidatorbarcodecode25interleaved' => InvokableFactory::class,
'laminasvalidatorbarcodecode25' => InvokableFactory::class,
'laminasvalidatorbarcodecode39ext' => InvokableFactory::class,
'laminasvalidatorbarcodecode39' => InvokableFactory::class,
'laminasvalidatorbarcodecode93ext' => InvokableFactory::class,
'laminasvalidatorbarcodecode93' => InvokableFactory::class,
'laminasvalidatorbarcodeean12' => InvokableFactory::class,
'laminasvalidatorbarcodeean13' => InvokableFactory::class,
'laminasvalidatorbarcodeean14' => InvokableFactory::class,
'laminasvalidatorbarcodeean18' => InvokableFactory::class,
'laminasvalidatorbarcodeean2' => InvokableFactory::class,
'laminasvalidatorbarcodeean5' => InvokableFactory::class,
'laminasvalidatorbarcodeean8' => InvokableFactory::class,
'laminasvalidatorbarcodegtin12' => InvokableFactory::class,
'laminasvalidatorbarcodegtin13' => InvokableFactory::class,
'laminasvalidatorbarcodegtin14' => InvokableFactory::class,
'laminasvalidatorbarcodeidentcode' => InvokableFactory::class,
'laminasvalidatorbarcodeintelligentmail' => InvokableFactory::class,
'laminasvalidatorbarcodeissn' => InvokableFactory::class,
'laminasvalidatorbarcodeitf14' => InvokableFactory::class,
'laminasvalidatorbarcodeleitcode' => InvokableFactory::class,
'laminasvalidatorbarcodeplanet' => InvokableFactory::class,
'laminasvalidatorbarcodepostnet' => InvokableFactory::class,
'laminasvalidatorbarcoderoyalmail' => InvokableFactory::class,
'laminasvalidatorbarcodesscc' => InvokableFactory::class,
'laminasvalidatorbarcodeupca' => InvokableFactory::class,
'laminasvalidatorbarcodeupce' => InvokableFactory::class,
'laminasvalidatorbarcode' => InvokableFactory::class,
'laminasvalidatorbetween' => InvokableFactory::class,
'laminasvalidatorbitwise' => InvokableFactory::class,
'laminasvalidatorcallback' => InvokableFactory::class,
'laminasvalidatorcreditcard' => InvokableFactory::class,
'laminasvalidatorcsrf' => InvokableFactory::class,
'laminasvalidatordatestep' => InvokableFactory::class,
'laminasvalidatordate' => InvokableFactory::class,
'laminasvalidatordbnorecordexists' => InvokableFactory::class,
'laminasvalidatordbrecordexists' => InvokableFactory::class,
'laminasvalidatordigits' => InvokableFactory::class,
'laminasvalidatoremailaddress' => InvokableFactory::class,
'laminasvalidatorexplode' => InvokableFactory::class,
'laminasvalidatorfilecount' => InvokableFactory::class,
'laminasvalidatorfilecrc32' => InvokableFactory::class,
'laminasvalidatorfileexcludeextension' => InvokableFactory::class,
'laminasvalidatorfileexcludemimetype' => InvokableFactory::class,
'laminasvalidatorfileexists' => InvokableFactory::class,
'laminasvalidatorfileextension' => InvokableFactory::class,
'laminasvalidatorfilefilessize' => InvokableFactory::class,
'laminasvalidatorfilehash' => InvokableFactory::class,
'laminasvalidatorfileimagesize' => InvokableFactory::class,
'laminasvalidatorfileiscompressed' => InvokableFactory::class,
'laminasvalidatorfileisimage' => InvokableFactory::class,
'laminasvalidatorfilemd5' => InvokableFactory::class,
'laminasvalidatorfilemimetype' => InvokableFactory::class,
'laminasvalidatorfilenotexists' => InvokableFactory::class,
'laminasvalidatorfilesha1' => InvokableFactory::class,
'laminasvalidatorfilesize' => InvokableFactory::class,
'laminasvalidatorfileupload' => InvokableFactory::class,
'laminasvalidatorfileuploadfile' => InvokableFactory::class,
'laminasvalidatorfilewordcount' => InvokableFactory::class,
'laminasvalidatorgpspoint' => InvokableFactory::class,
'laminasvalidatorgreaterthan' => InvokableFactory::class,
'laminasvalidatorhex' => InvokableFactory::class,
'laminasvalidatorhostname' => InvokableFactory::class,
'laminasi18nvalidatoralnum' => InvokableFactory::class,
'laminasi18nvalidatoralpha' => InvokableFactory::class,
'laminasi18nvalidatordatetime' => InvokableFactory::class,
'laminasi18nvalidatorisfloat' => InvokableFactory::class,
'laminasi18nvalidatorisint' => InvokableFactory::class,
'laminasi18nvalidatorphonenumber' => InvokableFactory::class,
'laminasi18nvalidatorpostcode' => InvokableFactory::class,
'laminasvalidatoriban' => InvokableFactory::class,
'laminasvalidatoridentical' => InvokableFactory::class,
'laminasvalidatorinarray' => InvokableFactory::class,
'laminasvalidatorip' => InvokableFactory::class,
'laminasvalidatorisbn' => InvokableFactory::class,
'laminasvalidatoriscountable' => InvokableFactory::class,
'laminasvalidatorisinstanceof' => InvokableFactory::class,
'laminasvalidatorlessthan' => InvokableFactory::class,
'laminasvalidatornotempty' => InvokableFactory::class,
'laminasvalidatorregex' => InvokableFactory::class,
'laminasvalidatorsitemapchangefreq' => InvokableFactory::class,
'laminasvalidatorsitemaplastmod' => InvokableFactory::class,
'laminasvalidatorsitemaploc' => InvokableFactory::class,
'laminasvalidatorsitemappriority' => InvokableFactory::class,
'laminasvalidatorstringlength' => InvokableFactory::class,
'laminasvalidatorstep' => InvokableFactory::class,
'laminasvalidatortimezone' => InvokableFactory::class,
'laminasvalidatoruri' => InvokableFactory::class,
'laminasvalidatoruuid' => InvokableFactory::class,
];






protected $shareByDefault = false;






protected $sharedByDefault = false;






protected $instanceOf = ValidatorInterface::class;











public function __construct($configOrContainerInstance = null, array $v3config = [])
{
parent::__construct($configOrContainerInstance, $v3config);

$this->addInitializer([$this, 'injectTranslator']);
$this->addInitializer([$this, 'injectValidatorPluginManager']);
}

/**
@psalm-assert

*/
public function validate($instance)
{
if (! $instance instanceof $this->instanceOf) {
throw new InvalidServiceException(sprintf(
'%s expects only to create instances of %s; %s is invalid',
static::class,
(string) $this->instanceOf,
get_debug_type($instance)
));
}
}









public function validatePlugin(mixed $plugin)
{
try {
$this->validate($plugin);
} catch (InvalidServiceException $e) {
throw new Exception\RuntimeException(sprintf(
'Plugin of type %s is invalid; must implement %s',
get_debug_type($plugin),
ValidatorInterface::class
), $e->getCode(), $e);
}
}








public function injectTranslator($first, $second)
{
if ($first instanceof ContainerInterface) {
$container = $first;
$validator = $second;
} else {
$container = $second;
$validator = $first;
}

if (! $validator instanceof Translator\TranslatorAwareInterface) {
return;
}


if ($container === $this && method_exists($container, 'getServiceLocator') && $container->getServiceLocator()) {
$container = $container->getServiceLocator();
}

if (! $container instanceof ContainerInterface) {
return;
}

if ($container->has('MvcTranslator')) {
$validator->setTranslator($container->get('MvcTranslator'));

return;
}

if ($container->has(TranslatorInterface::class)) {
$validator->setTranslator($container->get(Translator\TranslatorInterface::class));
}
}








public function injectValidatorPluginManager($first, $second)
{
if ($first instanceof ContainerInterface) {
$validator = $second;
} else {
$validator = $first;
}
if ($validator instanceof ValidatorPluginManagerAwareInterface) {
$validator->setValidatorPluginManager($this);
}
}
}
<?php

namespace Laminas\Validator\Db;

use Laminas\Db\Adapter\Adapter as DbAdapter;
use Laminas\Db\Adapter\AdapterAwareInterface;
use Laminas\Db\Adapter\AdapterAwareTrait;
use Laminas\Db\Sql\Select;
use Laminas\Db\Sql\Sql;
use Laminas\Db\Sql\TableIdentifier;
use Laminas\Stdlib\ArrayUtils;
use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Laminas\Validator\Exception\InvalidArgumentException;
use Laminas\Validator\Exception\RuntimeException;
use Traversable;

use function array_key_exists;
use function array_shift;
use function func_get_args;
use function func_num_args;
use function is_array;






abstract class AbstractDb extends AbstractValidator implements AdapterAwareInterface
{
use AdapterAwareTrait;




public const ERROR_NO_RECORD_FOUND = 'noRecordFound';
public const ERROR_RECORD_FOUND = 'recordFound';


protected $messageTemplates = [
self::ERROR_NO_RECORD_FOUND => 'No record matching the input was found',
self::ERROR_RECORD_FOUND => 'A record matching the input was found',
];






protected $select;


protected $schema;


protected $table = '';


protected $field = '';


protected $exclude;


















public function __construct($options = null)
{
parent::__construct($options);

if ($options instanceof Select) {
$this->setSelect($options);
return;
}

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (func_num_args() > 1) {
$options = func_get_args();
$firstArgument = array_shift($options);
if (is_array($firstArgument)) {
$temp = ArrayUtils::iteratorToArray($firstArgument);
} else {
$temp['table'] = $firstArgument;
}

$temp['field'] = array_shift($options);

if (! empty($options)) {
$temp['exclude'] = array_shift($options);
}

if (! empty($options)) {
$temp['adapter'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('table', $options) && ! array_key_exists('schema', $options)) {
throw new Exception\InvalidArgumentException('Table or Schema option missing!');
}

if (! array_key_exists('field', $options)) {
throw new Exception\InvalidArgumentException('Field option missing!');
}

if (array_key_exists('adapter', $options)) {
$this->setAdapter($options['adapter']);
}

if (array_key_exists('exclude', $options)) {
$this->setExclude($options['exclude']);
}

$this->setField($options['field']);
if (array_key_exists('table', $options)) {
$this->setTable($options['table']);
}

if (array_key_exists('schema', $options)) {
$this->setSchema($options['schema']);
}
}







public function getAdapter()
{
return $this->adapter;
}






public function setAdapter(DbAdapter $adapter)
{
return $this->setDbAdapter($adapter);
}






public function getExclude()
{
return $this->exclude;
}







public function setExclude($exclude)
{
$this->exclude = $exclude;
$this->select = null;
return $this;
}






public function getField()
{
return $this->field;
}







public function setField($field)
{
$this->field = (string) $field;
$this->select = null;
return $this;
}






public function getTable()
{
return $this->table;
}







public function setTable($table)
{
$this->table = (string) $table;
$this->select = null;
return $this;
}






public function getSchema()
{
return $this->schema;
}







public function setSchema($schema)
{
$this->schema = $schema;
$this->select = null;
return $this;
}






public function setSelect(Select $select)
{
$this->select = $select;
return $this;
}









public function getSelect()
{
if ($this->select instanceof Select) {
return $this->select;
}


$select = new Select();
$tableIdentifier = new TableIdentifier($this->table, $this->schema);
$select->from($tableIdentifier)->columns([$this->field]);
$select->where->equalTo($this->field, null);

if ($this->exclude !== null) {
if (is_array($this->exclude)) {
$select->where->notEqualTo(
$this->exclude['field'],
$this->exclude['value']
);
} else {
$select->where($this->exclude);
}
}

$this->select = $select;

return $this->select;
}







protected function query($value)
{
$sql = new Sql($this->getAdapter());
$select = $this->getSelect();
$statement = $sql->prepareStatementForSqlObject($select);
$parameters = $statement->getParameterContainer();
$parameters['where1'] = $value;
$result = $statement->execute();

return $result->current();
}
}
<?php

namespace Laminas\Validator\Db;

use Laminas\Validator\Exception;






class RecordExists extends AbstractDb
{




public function isValid($value)
{



if (null === $this->adapter) {
throw new Exception\RuntimeException('No database adapter present');
}

$valid = true;
$this->setValue($value);

$result = $this->query($value);
if (! $result) {
$valid = false;
$this->error(self::ERROR_NO_RECORD_FOUND);
}

return $valid;
}
}
<?php

namespace Laminas\Validator\Db;

use Laminas\Validator\Exception;






class NoRecordExists extends AbstractDb
{




public function isValid($value)
{



if (null === $this->adapter) {
throw new Exception\RuntimeException('No database adapter present');
}

$valid = true;
$this->setValue($value);

$result = $this->query($value);
if ($result) {
$valid = false;
$this->error(self::ERROR_RECORD_FOUND);
}

return $valid;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Uri\Exception\ExceptionInterface as UriException;
use Laminas\Uri\Uri as UriHandler;
use Laminas\Validator\Exception\InvalidArgumentException;
use Traversable;

use function array_shift;
use function assert;
use function class_exists;
use function func_get_args;
use function is_a;
use function is_array;
use function is_string;
use function iterator_to_array;
use function sprintf;


class Uri extends AbstractValidator
{
public const INVALID = 'uriInvalid';
public const NOT_URI = 'notUri';


protected $messageTemplates = [
self::INVALID => 'Invalid type given. String expected',
self::NOT_URI => 'The input does not appear to be a valid Uri',
];


protected $uriHandler;


protected $allowRelative = true;


protected $allowAbsolute = true;






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = iterator_to_array($options);
} elseif (! is_array($options)) {
$options = func_get_args();
$temp['uriHandler'] = array_shift($options);
if (! empty($options)) {
$temp['allowRelative'] = array_shift($options);
}
if (! empty($options)) {
$temp['allowAbsolute'] = array_shift($options);
}

$options = $temp;
}

if (isset($options['uriHandler'])) {
$this->setUriHandler($options['uriHandler']);
}
if (isset($options['allowRelative'])) {
$this->setAllowRelative($options['allowRelative']);
}
if (isset($options['allowAbsolute'])) {
$this->setAllowAbsolute($options['allowAbsolute']);
}

parent::__construct($options);
}





public function getUriHandler()
{
if (null === $this->uriHandler) {

$this->uriHandler = new UriHandler();
} elseif (is_string($this->uriHandler) && class_exists($this->uriHandler)) {

$this->uriHandler = new $this->uriHandler();
}
assert($this->uriHandler !== null && ! is_string($this->uriHandler));

return $this->uriHandler;
}






public function setUriHandler($uriHandler)
{
if (! is_a($uriHandler, UriHandler::class, true)) {
throw new InvalidArgumentException(sprintf(
'Expecting a subclass name or instance of %s as $uriHandler',
UriHandler::class
));
}

$this->uriHandler = $uriHandler;
return $this;
}






public function getAllowAbsolute()
{
return $this->allowAbsolute;
}







public function setAllowAbsolute($allowAbsolute)
{
$this->allowAbsolute = (bool) $allowAbsolute;
return $this;
}






public function getAllowRelative()
{
return $this->allowRelative;
}







public function setAllowRelative($allowRelative)
{
$this->allowRelative = (bool) $allowRelative;
return $this;
}







public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$uriHandler = $this->getUriHandler();
try {
$uriHandler->parse($value);
if ($uriHandler->isValid()) {

if (
($this->allowRelative && $this->allowAbsolute)
|| ($this->allowAbsolute && $uriHandler->isAbsolute())
|| ($this->allowRelative && $uriHandler->isValidRelative())
) {
return true;
}
}
} catch (UriException) {

}

$this->error(self::NOT_URI);
return false;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use function get_debug_type;
use function is_array;

final class IsArray extends AbstractValidator
{
public const NOT_ARRAY = 'NotArray';


protected $messageTemplates = [
self::NOT_ARRAY => 'Expected an array value but %type% provided',
];


protected $messageVariables = [
'type' => 'type',
];

protected ?string $type = null;


protected $options = [];

public function isValid(mixed $value): bool
{
if (is_array($value)) {
return true;
}

$this->type = get_debug_type($value);
$this->error(self::NOT_ARRAY);

return false;
}
}
<?php

namespace Laminas\Validator;

/**
@psalm-type





*/
interface ValidatorInterface
{











public function isValid($value);











public function getMessages();
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use DateInterval;
use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use DateTimeZone;
use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_combine;
use function array_count_values;
use function array_map;
use function array_shift;
use function ceil;
use function date_default_timezone_get;
use function explode;
use function floor;
use function func_get_args;
use function in_array;
use function is_array;
use function max;
use function min;
use function preg_match;
use function sprintf;
use function str_starts_with;

use const PHP_INT_MAX;


class DateStep extends Date
{



public const NOT_STEP = 'dateStepNotStep';




public const FORMAT_DEFAULT = DateTime::ISO8601;






protected $messageTemplates = [
self::INVALID => 'Invalid type given. String, integer, array or DateTime expected',
self::INVALID_DATE => 'The input does not appear to be a valid date',
self::FALSEFORMAT => "The input does not fit the date format '%format%'",
self::NOT_STEP => 'The input is not a valid step',
];






protected $baseValue = '1970-01-01T00:00:00Z';







protected $step;









protected $timezone;






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (! is_array($options)) {
$options = func_get_args();
$temp = [];
$temp['baseValue'] = array_shift($options);
if (! empty($options)) {
$temp['step'] = array_shift($options);
}
if (! empty($options)) {
$temp['format'] = array_shift($options);
}
if (! empty($options)) {
$temp['timezone'] = array_shift($options);
}

$options = $temp;
}

if (! isset($options['step'])) {
$options['step'] = new DateInterval('P1D');
}
if (! isset($options['timezone'])) {
$options['timezone'] = new DateTimeZone(date_default_timezone_get());
}

parent::__construct($options);
}









public function setBaseValue($baseValue)
{
$this->baseValue = $baseValue;
return $this;
}








public function getBaseValue()
{
return $this->baseValue;
}








public function setStep(DateInterval $step)
{
$this->step = $step;
return $this;
}








public function getStep()
{
return $this->step;
}








public function getTimezone()
{
return $this->timezone;
}








public function setTimezone(DateTimeZone $timezone)
{
$this->timezone = $timezone;
return $this;
}










protected function convertString($value, $addErrors = true)
{

if (
str_starts_with($this->format, 'Y-\WW')
&& preg_match('/^([0-9]{4})\-W([0-9]{2})/', $value, $matches)
) {
$date = new DateTime();
$date->setISODate((int) $matches[1], (int) $matches[2]);
} else {
$date = DateTime::createFromFormat($this->format, $value, new DateTimeZone('UTC'));
}



$errors = DateTime::getLastErrors();
if (is_array($errors) && $errors['warning_count'] > 0) {
if ($addErrors) {
$this->error(self::FALSEFORMAT);
}
return false;
}

return $date;
}








public function isValid($value)
{
if (! parent::isValid($value)) {
return false;
}

$valueDate = $this->convertToDateTime($value, false); 
$baseDate = $this->convertToDateTime($this->baseValue, false);

if (false === $valueDate || false === $baseDate) {
return false;
}

$step = $this->getStep();



if ($valueDate == $baseDate) {
return true;
}



$intervalParts = explode('|', $step->format('%y|%m|%d|%h|%i|%s'));
$intervalParts = array_map('intval', $intervalParts);
$partCounts = array_count_values($intervalParts);

$unitKeys = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];
$intervalParts = array_combine($unitKeys, $intervalParts);


$absoluteValueDate = new DateTime($valueDate->format('Y-m-d H:i:s'), new DateTimeZone('UTC'));
$absoluteBaseDate = new DateTime($baseDate->format('Y-m-d H:i:s'), new DateTimeZone('UTC'));

$timeDiff = $absoluteValueDate->diff($absoluteBaseDate, true);
$diffParts = array_map('intval', explode('|', $timeDiff->format('%y|%m|%d|%h|%i|%s')));
$diffParts = array_combine($unitKeys, $diffParts);

if (5 === $partCounts[0]) {

$intervalUnit = 'days';
$stepValue = 1;
foreach ($intervalParts as $key => $value) {
if (0 !== $value) {
$intervalUnit = $key;
$stepValue = $value;
break;
}
}


if (in_array($intervalUnit, ['years', 'months', 'days'])) {
switch ($intervalUnit) {
case 'years':
if (
0 === $diffParts['months'] && 0 === $diffParts['days']
&& 0 === $diffParts['hours'] && 0 === $diffParts['minutes']
&& 0 === $diffParts['seconds']
) {
if (($diffParts['years'] % $stepValue) === 0) {
return true;
}
}
break;
case 'months':
if (
0 === $diffParts['days'] && 0 === $diffParts['hours']
&& 0 === $diffParts['minutes'] && 0 === $diffParts['seconds']
) {
$months = ($diffParts['years'] * 12) + $diffParts['months'];
if (($months % $stepValue) === 0) {
return true;
}
}
break;
case 'days':
if (
0 === $diffParts['hours'] && 0 === $diffParts['minutes']
&& 0 === $diffParts['seconds']
) {
$days = (int) $timeDiff->format('%a'); 
if (($days % $stepValue) === 0) {
return true;
}
}
break;
}
$this->error(self::NOT_STEP);
return false;
}


if (in_array($intervalUnit, ['hours', 'minutes', 'seconds'])) {

if (1 === $stepValue) {
if (
'hours' === $intervalUnit
&& 0 === $diffParts['minutes'] && 0 === $diffParts['seconds']
) {
return true;
} elseif ('minutes' === $intervalUnit && 0 === $diffParts['seconds']) {
return true;
} elseif ('seconds' === $intervalUnit) {
return true;
}

$this->error(self::NOT_STEP);

return false;
}


if (
$baseDate->format('Y-m-d') === $valueDate->format('Y-m-d')
&& $baseDate->format('Y-m-d') === '1970-01-01'
) {
switch ($intervalUnit) {
case 'hours':
if (0 === $diffParts['minutes'] && 0 === $diffParts['seconds']) {
if (($diffParts['hours'] % $stepValue) === 0) {
return true;
}
}
break;
case 'minutes':
if (0 === $diffParts['seconds']) {
$minutes = ($diffParts['hours'] * 60) + $diffParts['minutes'];
if (($minutes % $stepValue) === 0) {
return true;
}
}
break;
case 'seconds':
$seconds = ($diffParts['hours'] * 60 * 60)
+ ($diffParts['minutes'] * 60)
+ $diffParts['seconds'];
if (($seconds % $stepValue) === 0) {
return true;
}
break;
}
$this->error(self::NOT_STEP);
return false;
}
}
}

return $this->fallbackIncrementalIterationLogic($baseDate, $valueDate, $intervalParts, $diffParts, $step);
}















private function fallbackIncrementalIterationLogic(
DateTimeInterface $baseDate,
DateTimeInterface $valueDate,
array $intervalParts,
array $diffParts,
DateInterval $step
): bool {
[$minSteps, $requiredIterations] = $this->computeMinStepAndRequiredIterations($intervalParts, $diffParts);
$minimumInterval = $this->computeMinimumInterval($intervalParts, $minSteps);
$isIncrementalStepping = $baseDate < $valueDate;

if (! ($baseDate instanceof DateTime || $baseDate instanceof DateTimeImmutable)) {
throw new Exception\InvalidArgumentException(sprintf(
'Function %s requires the baseDate to be a DateTime or DateTimeImmutable instance.',
__FUNCTION__
));
}

for ($offsetIterations = 0; $offsetIterations < $requiredIterations; $offsetIterations += 1) {
if ($isIncrementalStepping) {
$baseDate = $baseDate->add($minimumInterval);
} else {
$baseDate = $baseDate->sub($minimumInterval);
}
}

while (
($isIncrementalStepping && $baseDate < $valueDate)
|| (! $isIncrementalStepping && $baseDate > $valueDate)
) {
if ($isIncrementalStepping) {
$baseDate = $baseDate->add($step);
} else {
$baseDate = $baseDate->sub($step);
}


if ($baseDate == $valueDate) {
return true;
}
}

$this->error(self::NOT_STEP);

return false;
}







private function computeMinimumInterval(array $intervalParts, $minSteps): DateInterval
{
return new DateInterval(sprintf(
'P%dY%dM%dDT%dH%dM%dS',
$intervalParts['years'] * $minSteps,
$intervalParts['months'] * $minSteps,
$intervalParts['days'] * $minSteps,
$intervalParts['hours'] * $minSteps,
$intervalParts['minutes'] * $minSteps,
$intervalParts['seconds'] * $minSteps
));
}

/**
@psalm-return



*/
private function computeMinStepAndRequiredIterations(array $intervalParts, array $diffParts): array
{
$minSteps = $this->computeMinSteps($intervalParts, $diffParts);



$maxInteger = min(2 ** 31, PHP_INT_MAX);

$maximumInterval = max($intervalParts);
$requiredStepIterations = 1;

if (($minSteps * $maximumInterval) > $maxInteger) {
$requiredStepIterations = ceil(($minSteps * $maximumInterval) / $maxInteger);
$minSteps = floor($minSteps / $requiredStepIterations);
}

return [(int) $minSteps, $minSteps !== 0 ? (int) $requiredStepIterations : 0];
}








private function computeMinSteps(array $intervalParts, array $diffParts)
{
$intervalMaxSeconds = $this->computeIntervalMaxSeconds($intervalParts);

return 0 === $intervalMaxSeconds
? 0
: max(floor($this->computeDiffMinSeconds($diffParts) / $intervalMaxSeconds) - 1, 0);
}







private function computeIntervalMaxSeconds(array $intervalParts): int
{
return ($intervalParts['years'] * 60 * 60 * 24 * 366)
+ ($intervalParts['months'] * 60 * 60 * 24 * 31)
+ ($intervalParts['days'] * 60 * 60 * 24)
+ ($intervalParts['hours'] * 60 * 60)
+ ($intervalParts['minutes'] * 60)
+ $intervalParts['seconds'];
}







private function computeDiffMinSeconds(array $diffParts): int
{
return ($diffParts['years'] * 60 * 60 * 24 * 365)
+ ($diffParts['months'] * 60 * 60 * 24 * 28)
+ ($diffParts['days'] * 60 * 60 * 24)
+ ($diffParts['hours'] * 60 * 60)
+ ($diffParts['minutes'] * 60)
+ $diffParts['seconds'];
}
}
<?php

namespace Laminas\Validator;

use function ctype_xdigit;
use function is_int;
use function is_string;


class Hex extends AbstractValidator
{
public const INVALID = 'hexInvalid';
public const NOT_HEX = 'notHex';






protected $messageTemplates = [
self::INVALID => 'Invalid type given. String expected',
self::NOT_HEX => 'The input contains non-hexadecimal characters',
];







public function isValid($value)
{
if (! is_string($value) && ! is_int($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);
if (! ctype_xdigit((string) $value)) {
$this->error(self::NOT_HEX);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use SensitiveParameter;

use function array_filter;
use function explode;
use function is_string;
use function sha1;
use function strcmp;
use function strtoupper;
use function substr;

final class UndisclosedPassword extends AbstractValidator
{


private const HIBP_API_URI = 'https://api.pwnedpasswords.com';
private const HIBP_API_REQUEST_TIMEOUT = 300;
private const HIBP_CLIENT_USER_AGENT_STRING = 'laminas-validator';
private const HIBP_CLIENT_ACCEPT_HEADER = 'application/vnd.haveibeenpwned.v2+json';
private const HIBP_K_ANONYMITY_HASH_RANGE_LENGTH = 5;
private const HIBP_K_ANONYMITY_HASH_RANGE_BASE = 0;
private const SHA1_STRING_LENGTH = 40;



private const PASSWORD_BREACHED = 'passwordBreached';
private const NOT_A_STRING = 'wrongInput';




protected $messageTemplates = [
self::PASSWORD_BREACHED => 'The provided password was found in previous breaches, please create another password',
self::NOT_A_STRING => 'The provided password is not a string, please provide a correct password',
];


public function __construct(private ClientInterface $httpClient, private RequestFactoryInterface $makeHttpRequest)
{
parent::__construct();
}





public function isValid(
#[SensitiveParameter]
$value
): bool {
if (! is_string($value)) {
$this->error(self::NOT_A_STRING);
return false;
}

if ($this->isPwnedPassword($value)) {
$this->error(self::PASSWORD_BREACHED);
return false;
}

return true;
}



private function isPwnedPassword(
#[SensitiveParameter]
string $password
): bool {
$sha1Hash = $this->hashPassword($password);
$rangeHash = $this->getRangeHash($sha1Hash);
$hashList = $this->retrieveHashList($rangeHash);

return $this->hashInResponse($sha1Hash, $hashList);
}





private function hashPassword(
#[SensitiveParameter]
string $password
): string {
$hashedPassword = sha1($password);

return strtoupper($hashedPassword);
}







private function getRangeHash(
#[SensitiveParameter]
string $passwordHash
): string {
return substr($passwordHash, self::HIBP_K_ANONYMITY_HASH_RANGE_BASE, self::HIBP_K_ANONYMITY_HASH_RANGE_LENGTH);
}








private function retrieveHashList(
#[SensitiveParameter]
string $passwordRange
): string {
$request = $this->makeHttpRequest->createRequest(
'GET',
self::HIBP_API_URI . '/range/' . $passwordRange
);

$response = $this->httpClient->sendRequest($request);
return (string) $response->getBody();
}




private function hashInResponse(
#[SensitiveParameter]
string $sha1Hash,
#[SensitiveParameter]
string $resultStream
): bool {
$data = explode("\r\n", $resultStream);
$hashes = array_filter($data, static function ($value) use ($sha1Hash): bool {
[$hash] = explode(':', $value);

return strcmp($hash, substr($sha1Hash, self::HIBP_K_ANONYMITY_HASH_RANGE_LENGTH)) === 0;
});

return $hashes !== [];
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator\Translator;

use Laminas\I18n\Translator\TranslatorInterface as I18nTranslatorInterface;






final class DummyTranslator implements I18nTranslatorInterface
{

public function translate($message, $textDomain = 'default', $locale = null)
{
return $message;
}


public function translatePlural($singular, $plural, $number, $textDomain = 'default', $locale = null)
{
return (int) $number === 1 ? $singular : $plural;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator\Translator;

use Laminas\I18n\Translator\TranslatorInterface as I18nTranslatorInterface;
use Laminas\Validator\Translator\TranslatorInterface as ValidatorTranslatorInterface;





final class Translator implements
I18nTranslatorInterface,
ValidatorTranslatorInterface
{
public function __construct(private readonly I18nTranslatorInterface $translator)
{
}









public function translate($message, $textDomain = 'default', $locale = null)
{
return $this->translator->translate($message, $textDomain, $locale);
}











public function translatePlural($singular, $plural, $number, $textDomain = 'default', $locale = null)
{
return $this->translator->translatePlural($singular, $plural, $number, $textDomain, $locale);
}
}
<?php

namespace Laminas\Validator\Translator;

interface TranslatorAwareInterface
{









public function setTranslator(?TranslatorInterface $translator = null, $textDomain = null);






public function getTranslator();








public function hasTranslator();











public function setTranslatorEnabled($enabled = true);








public function isTranslatorEnabled();










public function setTranslatorTextDomain($textDomain = 'default');








public function getTranslatorTextDomain();
}
<?php

declare(strict_types=1);

namespace Laminas\Validator\Translator;

use Laminas\I18n\Translator\LoaderPluginManager;
use Laminas\I18n\Translator\Translator as I18nTranslator;
use Laminas\I18n\Translator\TranslatorInterface;
use Laminas\ServiceManager\ServiceManager;
use Psr\Container\ContainerInterface;
use Traversable;

use function array_key_exists;
use function assert;
use function extension_loaded;
use function is_array;








final class TranslatorFactory
{
public function __invoke(ContainerInterface $container): Translator
{


if ($container->has(TranslatorInterface::class)) {
return new Translator($container->get(TranslatorInterface::class));
}

return $this->marshalTranslator($container);
}













private function marshalTranslator(ContainerInterface $container): Translator
{

$translator = $this->marshalTranslatorFromConfig($container);

if ($translator instanceof Translator) {
return $translator;
}


if (! extension_loaded('intl')) {
return new Translator(new DummyTranslator());
}

return new Translator(new I18nTranslator());
}












private function marshalTranslatorFromConfig(ContainerInterface $container): ?Translator
{
if (! $container->has('config')) {
return null;
}

$config = $container->get('config');

if (! is_array($config) || ! array_key_exists('translator', $config)) {
return null;
}


if ($config['translator'] === false) {
return new Translator(new DummyTranslator());
}


if (is_array($config['translator']) && empty($config['translator'])) {
return null;
}


if (! is_array($config['translator']) && ! $config['translator'] instanceof Traversable) {
return null;
}


$i18nTranslator = I18nTranslator::factory($config['translator']);


if ($container->has('TranslatorPluginManager')) {
$loaderManager = $container->get('TranslatorPluginManager');

assert($loaderManager instanceof LoaderPluginManager);

$i18nTranslator->setPluginManager($loaderManager);
}


if ($container instanceof ServiceManager) {
$container->setService(TranslatorInterface::class, $i18nTranslator);
}

return new Translator($i18nTranslator);
}
}
<?php

namespace Laminas\Validator\Translator;





interface TranslatorInterface
{






public function translate($message, $textDomain = 'default', $locale = null);
}
<?php

namespace Laminas\Validator;

use function in_array;
use function is_int;
use function is_string;
use function preg_match;
use function quotemeta;
use function str_replace;
use function strlen;
use function substr;


class Isbn extends AbstractValidator
{
public const AUTO = 'auto';
public const ISBN10 = '10';
public const ISBN13 = '13';
public const INVALID = 'isbnInvalid';
public const NO_ISBN = 'isbnNoIsbn';






protected $messageTemplates = [
self::INVALID => 'Invalid type given. String or integer expected',
self::NO_ISBN => 'The input is not a valid ISBN number',
];


protected $options = [
'type' => self::AUTO, 
'separator' => '', 
];






protected function detectFormat()
{

$sep = quotemeta($this->getSeparator());
$patterns = [];
$lengths = [];
$type = $this->getType();


if ($type === self::ISBN10 || $type === self::AUTO) {
if (empty($sep)) {
$pattern = '/^[0-9]{9}[0-9X]{1}$/';
$length = 10;
} else {
$pattern = "/^[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9]{1,7}[{$sep}]{1}[0-9X]{1}$/";
$length = 13;
}

$patterns[$pattern] = self::ISBN10;
$lengths[$pattern] = $length;
}


if ($type === self::ISBN13 || $type === self::AUTO) {
if (empty($sep)) {
$pattern = '/^[0-9]{13}$/';
$length = 13;
} else {

$pattern = "/^[0-9]{1,9}[{$sep}]{1}[0-9]{1,5}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1,9}[{$sep}]{1}[0-9]{1}$/";

$length = 17;
}

$patterns[$pattern] = self::ISBN13;
$lengths[$pattern] = $length;
}


foreach ($patterns as $pattern => $type) {
if ((strlen($this->getValue()) === $lengths[$pattern]) && preg_match($pattern, $this->getValue())) {
return $type;
}
}

return null;
}







public function isValid($value)
{
if (! is_string($value) && ! is_int($value)) {
$this->error(self::INVALID);
return false;
}

$value = (string) $value;
$originalValue = $value;
$this->setValue($value);

switch ($this->detectFormat()) {
case self::ISBN10:
$isbn = new Isbn\Isbn10();
break;

case self::ISBN13:
$isbn = new Isbn\Isbn13();
break;

default:
$this->error(self::NO_ISBN);
return false;
}

$value = str_replace($this->getSeparator(), '', $value);
$checksum = $isbn->getChecksum($value);


if (substr($originalValue, -1) !== (string) $checksum) {
$this->error(self::NO_ISBN);
return false;
}
return true;
}












public function setSeparator($separator)
{

if (! in_array($separator, ['-', ' ', ''])) {
throw new Exception\InvalidArgumentException('Invalid ISBN separator.');
}

$this->options['separator'] = $separator;
return $this;
}








public function getSeparator()
{
return $this->options['separator'];
}










public function setType($type)
{

if (! in_array($type, [self::AUTO, self::ISBN10, self::ISBN13])) {
throw new Exception\InvalidArgumentException('Invalid ISBN type');
}

$this->options['type'] = $type;
return $this;
}








public function getType()
{
return $this->options['type'];
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Traversable;

use function array_shift;
use function file_get_contents;
use function func_get_args;
use function func_num_args;
use function is_array;
use function is_numeric;
use function is_readable;
use function is_string;
use function str_word_count;






class WordCount extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const TOO_MUCH = 'fileWordCountTooMuch';
public const TOO_LESS = 'fileWordCountTooLess';
public const NOT_FOUND = 'fileWordCountNotFound';


protected $messageTemplates = [
self::TOO_MUCH => "Too many words, maximum '%max%' are allowed but '%count%' were counted",
self::TOO_LESS => "Too few words, minimum '%min%' are expected but '%count%' were counted",
self::NOT_FOUND => 'File is not readable or does not exist',
];


protected $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
'count' => 'count',
];






protected $count;






protected $options = [
'min' => null, 
'max' => null, 
];














public function __construct($options = null)
{
if (1 < func_num_args()) {
$args = func_get_args();
$options = [
'min' => array_shift($args),
'max' => array_shift($args),
];
}

if (is_string($options) || is_numeric($options)) {
$options = ['max' => $options];
}

parent::__construct($options);
}








public function getMin()
{
return $this->options['min'];
}










public function setMin($min)
{
if (is_array($min) && isset($min['min'])) {
$min = $min['min'];
}

if (! is_numeric($min)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$min = (int) $min;
if (($this->getMax() !== null) && ($min > $this->getMax())) {
throw new Exception\InvalidArgumentException(
"The minimum must be less than or equal to the maximum word count, but $min > {$this->getMax()}"
);
}

$this->options['min'] = $min;
return $this;
}








public function getMax()
{
return $this->options['max'];
}










public function setMax($max)
{
if (is_array($max) && isset($max['max'])) {
$max = $max['max'];
}

if (! is_numeric($max)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$max = (int) $max;
if (($this->getMin() !== null) && ($max < $this->getMin())) {
throw new Exception\InvalidArgumentException(
"The maximum must be greater than or equal to the minimum word count, but $max < {$this->getMin()}"
);
}

$this->options['max'] = $max;
return $this;
}









public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}

$content = file_get_contents($fileInfo['file']);
$this->count = str_word_count($content);
if (($this->getMax() !== null) && ($this->count > $this->getMax())) {
$this->error(self::TOO_MUCH);
return false;
}

if (($this->getMin() !== null) && ($this->count < $this->getMin())) {
$this->error(self::TOO_LESS);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\File;

use function file_exists;

use const DIRECTORY_SEPARATOR;






class NotExists extends Exists
{
use FileInformationTrait;

/**
@const
*/
public const DOES_EXIST = 'fileNotExistsDoesExist';


protected $messageTemplates = [
self::DOES_EXIST => 'File exists',
];








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file, false, true);

$this->setValue($fileInfo['filename']);

$check = false;
$directories = $this->getDirectory(true);
if (! isset($directories)) {
$check = true;
if (file_exists($fileInfo['file'])) {
$this->error(self::DOES_EXIST);
return false;
}
} else {
foreach ($directories as $directory) {
if (! isset($directory) || '' === $directory) {
continue;
}

$check = true;
if (file_exists($directory . DIRECTORY_SEPARATOR . $fileInfo['basename'])) {
$this->error(self::DOES_EXIST);
return false;
}
}
}

if (! $check) {
$this->error(self::DOES_EXIST);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ArrayUtils;
use Traversable;






class IsImage extends MimeType
{
/**
@const
*/
public const FALSE_TYPE = 'fileIsImageFalseType';
public const NOT_DETECTED = 'fileIsImageNotDetected';
public const NOT_READABLE = 'fileIsImageNotReadable';


protected $messageTemplates = [
self::FALSE_TYPE => "File is no image, '%type%' detected",
self::NOT_DETECTED => 'The mimetype could not be detected from the file',
self::NOT_READABLE => 'File is not readable or does not exist',
];






public function __construct($options = [])
{

$default = [
'application/cdf',
'application/dicom',
'application/fractals',
'application/postscript',
'application/vnd.hp-hpgl',
'application/vnd.oasis.opendocument.graphics',
'application/x-cdf',
'application/x-cmu-raster',
'application/x-ima',
'application/x-inventor',
'application/x-koan',
'application/x-portable-anymap',
'application/x-world-x-3dmf',
'image/bmp',
'image/c',
'image/cgm',
'image/fif',
'image/gif',
'image/heic',
'image/heif',
'image/jpeg',
'image/jpm',
'image/jpx',
'image/jp2',
'image/naplps',
'image/pjpeg',
'image/png',
'image/svg',
'image/svg+xml',
'image/tiff',
'image/vnd.adobe.photoshop',
'image/vnd.djvu',
'image/vnd.fpx',
'image/vnd.net-fpx',
'image/webp',
'image/x-cmu-raster',
'image/x-cmx',
'image/x-coreldraw',
'image/x-cpi',
'image/x-emf',
'image/x-ico',
'image/x-icon',
'image/x-jg',
'image/x-ms-bmp',
'image/x-niff',
'image/x-pict',
'image/x-pcx',
'image/x-png',
'image/x-portable-anymap',
'image/x-portable-bitmap',
'image/x-portable-greymap',
'image/x-portable-pixmap',
'image/x-quicktime',
'image/x-rgb',
'image/x-tiff',
'image/x-unknown',
'image/x-windows-bmp',
'image/x-xpmi',
];

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if ($options === null) {
$options = [];
}

parent::__construct($options);

if (! $this->getMimeType()) {
$this->setMimeType($default);
}
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Traversable;

use function array_key_exists;
use function array_unique;
use function explode;
use function file_exists;
use function implode;
use function is_array;
use function is_string;
use function trim;

use const DIRECTORY_SEPARATOR;




class Exists extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const DOES_NOT_EXIST = 'fileExistsDoesNotExist';


protected $messageTemplates = [
self::DOES_NOT_EXIST => 'File does not exist',
];






protected $options = [
'directory' => null, 
];


protected $messageVariables = [
'directory' => ['options' => 'directory'],
];






public function __construct($options = null)
{
if (is_string($options)) {
$options = explode(',', $options);
}

if (is_array($options) && ! array_key_exists('directory', $options)) {
$options = ['directory' => $options];
}

parent::__construct($options);
}









public function getDirectory($asArray = false)
{
$asArray = (bool) $asArray;
$directory = $this->options['directory'];
if ($asArray && isset($directory)) {
$directory = explode(',', (string) $directory);
}

return $directory;
}









public function setDirectory($directory)
{
$this->options['directory'] = null;
$this->addDirectory($directory);
return $this;
}










public function addDirectory($directory)
{
$directories = $this->getDirectory(true);
if (! isset($directories)) {
$directories = [];
}

if (is_string($directory)) {
$directory = explode(',', $directory);
} elseif (! is_array($directory)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

foreach ($directory as $content) {
if (empty($content) || ! is_string($content)) {
continue;
}

$directories[] = trim($content);
}
$directories = array_unique($directories);


foreach ($directories as $key => $dir) {
if (empty($dir)) {
unset($directories[$key]);
}
}

$this->options['directory'] = ! empty($directory)
? implode(',', $directories) : null;

return $this;
}








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file, false, true);

$this->setValue($fileInfo['filename']);

$check = false;
$directories = $this->getDirectory(true);
if (! isset($directories)) {
$check = true;
if (! file_exists($fileInfo['file'])) {
$this->error(self::DOES_NOT_EXIST);
return false;
}
} else {
foreach ($directories as $directory) {
if (! isset($directory) || '' === $directory) {
continue;
}

$check = true;
if (! file_exists($directory . DIRECTORY_SEPARATOR . $fileInfo['basename'])) {
$this->error(self::DOES_NOT_EXIST);
return false;
}
}
}

if (! $check) {
$this->error(self::DOES_NOT_EXIST);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\File;

use finfo;
use Laminas\Stdlib\ArrayUtils;
use Laminas\Stdlib\ErrorHandler;
use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Psr\Http\Message\UploadedFileInterface;
use Traversable;

use function array_filter;
use function array_key_exists;
use function array_keys;
use function array_merge;
use function array_unique;
use function class_exists;
use function explode;
use function finfo_file;
use function finfo_open;
use function getenv;
use function implode;
use function in_array;
use function is_array;
use function is_file;
use function is_int;
use function is_readable;
use function is_string;
use function sprintf;
use function trim;

use const E_NOTICE;
use const E_WARNING;
use const FILEINFO_MIME_TYPE;




class MimeType extends AbstractValidator
{
use FileInformationTrait;

/**
@const

*/
public const FALSE_TYPE = 'fileMimeTypeFalse';
public const NOT_DETECTED = 'fileMimeTypeNotDetected';
public const NOT_READABLE = 'fileMimeTypeNotReadable';



protected $messageTemplates = [
self::FALSE_TYPE => "File has an incorrect mimetype of '%type%'",
self::NOT_DETECTED => 'The mimetype could not be detected from the file',
self::NOT_READABLE => 'File is not readable or does not exist',
];


protected $messageVariables = [
'type' => 'type',
];


protected $type;






protected $finfo;






protected $magicFiles = [
'/usr/share/misc/magic',
'/usr/share/misc/magic.mime',
'/usr/share/misc/magic.mgc',
'/usr/share/mime/magic',
'/usr/share/mime/magic.mime',
'/usr/share/mime/magic.mgc',
'/usr/share/file/magic',
'/usr/share/file/magic.mime',
'/usr/share/file/magic.mgc',
];






protected $options = [
'enableHeaderCheck' => false, 
'disableMagicFile' => false, 
'magicFile' => null, 
'mimeType' => null, 
];











public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (is_string($options)) {
$this->setMimeType($options);
$options = [];
} elseif (is_array($options)) {
if (isset($options['magicFile'])) {
$this->setMagicFile($options['magicFile']);
unset($options['magicFile']);
}

if (isset($options['enableHeaderCheck'])) {
$this->enableHeaderCheck((bool) $options['enableHeaderCheck']);
unset($options['enableHeaderCheck']);
}

if (array_key_exists('mimeType', $options)) {
$this->setMimeType($options['mimeType']);
unset($options['mimeType']);
}



foreach (array_keys($options) as $key) {
if (! is_int($key)) {
continue;
}
$this->addMimeType($options[$key]);
unset($options[$key]);
}
}

parent::__construct($options);
}








public function getMagicFile()
{
if (null === $this->options['magicFile']) {
$magic = getenv('magic');
if (is_string($magic) && $magic !== '') {
$this->setMagicFile($magic);
if ($this->options['magicFile'] === null) {
$this->options['magicFile'] = false;
}
return $this->options['magicFile'];
}

foreach ($this->magicFiles as $file) {
try {
$this->setMagicFile($file);
} catch (Exception\ExceptionInterface) {

continue;
}

if (is_string($this->options['magicFile'])) {
return $this->options['magicFile'];
}
}

if ($this->options['magicFile'] === null) {
$this->options['magicFile'] = false;
}
}

return $this->options['magicFile'];
}















public function setMagicFile($file)
{
if ($file === false) {
$this->options['magicFile'] = false;
} elseif (empty($file)) {
$this->options['magicFile'] = null;
} elseif (! class_exists('finfo', false)) {
$this->options['magicFile'] = null;
throw new Exception\RuntimeException('Magicfile can not be set; there is no finfo extension installed');
} elseif (! is_file($file) || ! is_readable($file)) {
throw new Exception\InvalidArgumentException(sprintf(
'The given magicfile ("%s") could not be read',
$file
));
} else {
ErrorHandler::start(E_NOTICE | E_WARNING);
$this->finfo = finfo_open(FILEINFO_MIME_TYPE, $file);
$error = ErrorHandler::stop();
if (empty($this->finfo)) {
$this->finfo = null;
throw new Exception\InvalidMagicMimeFileException(sprintf(
'The given magicfile ("%s") could not be used by ext/finfo',
$file
), 0, $error);
}
$this->options['magicFile'] = $file;
}

return $this;
}









public function disableMagicFile($disable)
{
$this->options['disableMagicFile'] = (bool) $disable;
return $this;
}








public function isMagicFileDisabled()
{
return $this->options['disableMagicFile'];
}








public function getHeaderCheck()
{
return $this->options['enableHeaderCheck'];
}










public function enableHeaderCheck($headerCheck = true)
{
$this->options['enableHeaderCheck'] = (bool) $headerCheck;
return $this;
}

/**
@psalm-return($asArray is true ? list<string> : string)






*/
public function getMimeType($asArray = false)
{
$asArray = (bool) $asArray;
$mimetype = (string) $this->options['mimeType'];
if ($asArray) {
$mimetype = explode(',', $mimetype);
}

return $mimetype;
}









public function setMimeType($mimetype)
{
$this->options['mimeType'] = null;
$this->addMimeType($mimetype);
return $this;
}










public function addMimeType($mimetype)
{
$mimetypes = $this->getMimeType(true);

if (is_string($mimetype)) {
$mimetype = explode(',', $mimetype);
} elseif (! is_array($mimetype)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

if (isset($mimetype['magicFile'])) {
unset($mimetype['magicFile']);
}

foreach ($mimetype as $content) {
if (! is_string($content) || $content === '') {
continue;
}

$mimetypes[] = trim($content);
}
$mimetypes = array_unique(array_filter($mimetypes));

$this->options['mimeType'] = implode(',', $mimetypes);

return $this;
}












public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file, true);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(static::NOT_READABLE);
return false;
}

$mimefile = $this->getMagicFile();
if (class_exists('finfo', false)) {
if (! $this->isMagicFileDisabled() && (is_string($mimefile) && empty($this->finfo))) {
ErrorHandler::start(E_NOTICE | E_WARNING);
$this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile);
ErrorHandler::stop();
}

if (empty($this->finfo)) {
ErrorHandler::start(E_NOTICE | E_WARNING);
$this->finfo = finfo_open(FILEINFO_MIME_TYPE);
ErrorHandler::stop();
}

$this->type = null;
if (! empty($this->finfo)) {
$this->type = finfo_file($this->finfo, $fileInfo['file']);
unset($this->finfo);
}
}

if ($this->type === null && $this->getHeaderCheck()) {
$this->type = $fileInfo['filetype'];
}

if ($this->type === null) {
$this->error(static::NOT_DETECTED);
return false;
}

$mimetype = $this->getMimeType(true);
if (in_array($this->type, $mimetype)) {
return true;
}

$types = explode('/', $this->type);
$types = array_merge($types, explode('-', $this->type));
$types = array_merge($types, explode(';', $this->type));
foreach ($mimetype as $mime) {
if (in_array($mime, $types)) {
return true;
}
}

$this->error(static::FALSE_TYPE);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use function in_array;
use function is_readable;
use function strrpos;
use function strtolower;
use function substr;






class ExcludeExtension extends Extension
{
use FileInformationTrait;

/**
@const
*/
public const FALSE_EXTENSION = 'fileExcludeExtensionFalse';
public const NOT_FOUND = 'fileExcludeExtensionNotFound';


protected $messageTemplates = [
self::FALSE_EXTENSION => 'File has an incorrect extension',
self::NOT_FOUND => 'File is not readable or does not exist',
];









public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);


if (
! $this->getAllowNonExistentFile()
&& (empty($fileInfo['file']) || false === is_readable($fileInfo['file']))
) {
$this->error(self::NOT_FOUND);
return false;
}

$this->setValue($fileInfo['filename']);

$extension = substr($fileInfo['filename'], strrpos($fileInfo['filename'], '.') + 1);
$extensions = $this->getExtension();

if ($this->getCase() && (! in_array($extension, $extensions))) {
return true;
} elseif (! $this->getCase()) {
foreach ($extensions as $ext) {
if (strtolower($ext) === strtolower($extension)) {
$this->error(self::FALSE_EXTENSION);
return false;
}
}

return true;
}

$this->error(self::FALSE_EXTENSION);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\Exception;
use Psr\Http\Message\UploadedFileInterface;

use function basename;
use function is_array;
use function is_string;




trait FileInformationTrait
{









protected function getFileInfo(
$value,
?array $file = null,
$hasType = false,
$hasBasename = false
) {
if (is_string($value) && is_array($file)) {
return $this->getLegacyFileInfo($file, $hasType, $hasBasename);
}

if (is_array($value)) {
return $this->getSapiFileInfo($value, $hasType, $hasBasename);
}

if ($value instanceof UploadedFileInterface) {
return $this->getPsr7FileInfo($value, $hasType, $hasBasename);
}

return $this->getFileBasedFileInfo($value, $hasType, $hasBasename);
}









private function getLegacyFileInfo(
array $file,
$hasType = false,
$hasBasename = false
) {
$fileInfo = [];

$fileInfo['filename'] = $file['name'];
$fileInfo['file'] = $file['tmp_name'];

if ($hasBasename) {
$fileInfo['basename'] = basename($fileInfo['file']);
}

if ($hasType) {
$fileInfo['filetype'] = $file['type'];
}

return $fileInfo;
}









private function getSapiFileInfo(
array $file,
$hasType = false,
$hasBasename = false
) {
if (! isset($file['tmp_name']) || ! isset($file['name'])) {
throw new Exception\InvalidArgumentException(
'Value array must be in $_FILES format'
);
}

$fileInfo = [];

$fileInfo['file'] = $file['tmp_name'];
$fileInfo['filename'] = $file['name'];

if ($hasBasename) {
$fileInfo['basename'] = basename($fileInfo['file']);
}

if ($hasType) {
$fileInfo['filetype'] = $file['type'];
}

return $fileInfo;
}








private function getPsr7FileInfo(
UploadedFileInterface $file,
$hasType = false,
$hasBasename = false
) {
$fileInfo = [];

$fileInfo['file'] = $file->getStream()->getMetadata('uri');
$fileInfo['filename'] = $file->getClientFilename();

if ($hasBasename) {
$fileInfo['basename'] = basename($fileInfo['file']);
}

if ($hasType) {
$fileInfo['filetype'] = $file->getClientMediaType();
}

return $fileInfo;
}









private function getFileBasedFileInfo(
$file,
$hasType = false,
$hasBasename = false
) {
$fileInfo = [];

$fileInfo['file'] = $file;
$fileInfo['filename'] = basename($fileInfo['file']);

if ($hasBasename) {
$fileInfo['basename'] = basename($fileInfo['file']);
}

if ($hasType) {
$fileInfo['filetype'] = null;
}

return $fileInfo;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Psr\Http\Message\UploadedFileInterface;
use Traversable;

use function array_key_exists;
use function array_merge;
use function count;
use function is_array;
use function is_countable;
use function is_string;
use function is_uploaded_file;








class Upload extends AbstractValidator
{
/**
@const
*/
public const INI_SIZE = 'fileUploadErrorIniSize';
public const FORM_SIZE = 'fileUploadErrorFormSize';
public const PARTIAL = 'fileUploadErrorPartial';
public const NO_FILE = 'fileUploadErrorNoFile';
public const NO_TMP_DIR = 'fileUploadErrorNoTmpDir';
public const CANT_WRITE = 'fileUploadErrorCantWrite';
public const EXTENSION = 'fileUploadErrorExtension';
public const ATTACK = 'fileUploadErrorAttack';
public const FILE_NOT_FOUND = 'fileUploadErrorFileNotFound';
public const UNKNOWN = 'fileUploadErrorUnknown';


protected $messageTemplates = [
self::INI_SIZE => "File '%value%' exceeds upload_max_filesize directive in php.ini",
self::FORM_SIZE => "File '%value%' exceeds the MAX_FILE_SIZE directive that was "
. 'specified in the HTML form',
self::PARTIAL => "File '%value%' was only partially uploaded",
self::NO_FILE => "File '%value%' was not uploaded",
self::NO_TMP_DIR => "Missing a temporary folder to store '%value%'",
self::CANT_WRITE => "Failed to write file '%value%' to disk",
self::EXTENSION => "A PHP extension stopped uploading the file '%value%'",
self::ATTACK => "File '%value%' was illegally uploaded. This could be a possible attack",
self::FILE_NOT_FOUND => "File '%value%' was not found",
self::UNKNOWN => "Unknown error while uploading file '%value%'",
];


protected $options = [
'files' => [],
];










public function __construct($options = [])
{
if (is_array($options) && ! array_key_exists('files', $options)) {
$options = ['files' => $options];
}

parent::__construct($options);
}










public function getFiles($file = null)
{
if ($file !== null) {
$return = [];
foreach ($this->options['files'] as $name => $content) {
if ($name === $file) {
$return[$file] = $this->options['files'][$name];
}

if ($content instanceof UploadedFileInterface) {
if ($content->getClientFilename() === $file) {
$return[$name] = $this->options['files'][$name];
}
} elseif ($content['name'] === $file) {
$return[$name] = $this->options['files'][$name];
}
}

if (! $return) {
throw new Exception\InvalidArgumentException("The file '$file' was not found");
}

return $return;
}

return $this->options['files'];
}









public function setFiles($files = [])
{
if (
null === $files
|| ((is_countable($files))
&& count($files) === 0)
) {
$this->options['files'] = $_FILES;
} else {
$this->options['files'] = $files;
}

if ($this->options['files'] === null) {
$this->options['files'] = [];
}

foreach ($this->options['files'] as $file => $content) {
if (
! $content instanceof UploadedFileInterface
&& ! isset($content['error'])
) {
unset($this->options['files'][$file]);
}
}

return $this;
}









public function isValid($value, $file = null)
{
$files = [];
$this->setValue($value);
if (array_key_exists($value, $this->getFiles())) {
$files = array_merge($files, $this->getFiles($value));
} else {
foreach ($this->getFiles() as $file => $content) {
if ($content instanceof UploadedFileInterface) {
if ($content->getClientFilename() === $value) {
$files = array_merge($files, $this->getFiles($file));
}




continue;
}

if (isset($content['name']) && ($content['name'] === $value)) {
$files = array_merge($files, $this->getFiles($file));
}

if (isset($content['tmp_name']) && ($content['tmp_name'] === $value)) {
$files = array_merge($files, $this->getFiles($file));
}
}
}

if (empty($files)) {
return $this->throwError($file, self::FILE_NOT_FOUND);
}

foreach ($files as $file => $content) {
$this->value = $file;
$error = $content instanceof UploadedFileInterface
? $content->getError()
: $content['error'];

switch ($error) {
case 0:
if ($content instanceof UploadedFileInterface) {

break;
}



if (! is_uploaded_file($content['tmp_name'])) {
$this->throwError($content, self::ATTACK);
}
break;

case 1:
$this->throwError($content, self::INI_SIZE);
break;

case 2:
$this->throwError($content, self::FORM_SIZE);
break;

case 3:
$this->throwError($content, self::PARTIAL);
break;

case 4:
$this->throwError($content, self::NO_FILE);
break;

case 6:
$this->throwError($content, self::NO_TMP_DIR);
break;

case 7:
$this->throwError($content, self::CANT_WRITE);
break;

case 8:
$this->throwError($content, self::EXTENSION);
break;

default:
$this->throwError($content, self::UNKNOWN);
break;
}
}

if ($this->getMessages()) {
return false;
}

return true;
}








protected function throwError($file, $errorType)
{
if ($file !== null) {
if (is_array($file)) {
if (array_key_exists('name', $file)) {
$this->value = $file['name'];
}
} elseif (is_string($file)) {
$this->value = $file;
} elseif ($file instanceof UploadedFileInterface) {
$this->value = $file->getClientFilename();
}
}

$this->error($errorType);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Psr\Http\Message\UploadedFileInterface;
use Traversable;

use function array_key_exists;
use function array_shift;
use function count;
use function dirname;
use function func_get_args;
use function func_num_args;
use function is_array;
use function is_numeric;
use function is_string;

use const DIRECTORY_SEPARATOR;






class Count extends AbstractValidator
{
/**
@const

*/
public const TOO_MANY = 'fileCountTooMany';
public const TOO_FEW = 'fileCountTooFew';



protected $messageTemplates = [
self::TOO_MANY => "Too many files, maximum '%max%' are allowed but '%count%' are given",
self::TOO_FEW => "Too few files, minimum '%min%' are expected but '%count%' are given",
];


protected $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
'count' => 'count',
];






protected $count;






protected $files;






protected $options = [
'min' => null, 
'max' => null, 
];














public function __construct($options = null)
{
if (1 < func_num_args()) {
$args = func_get_args();
$options = [
'min' => array_shift($args),
'max' => array_shift($args),
];
}

if (is_string($options) || is_numeric($options)) {
$options = ['max' => $options];
}

parent::__construct($options);
}








public function getMin()
{
return $this->options['min'];
}










public function setMin($min)
{
if (is_array($min) && isset($min['min'])) {
$min = $min['min'];
}

if (! is_numeric($min)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$min = (int) $min;
if (($this->getMax() !== null) && ($min > $this->getMax())) {
throw new Exception\InvalidArgumentException(
"The minimum must be less than or equal to the maximum file count, but {$min} > {$this->getMax()}"
);
}

$this->options['min'] = $min;
return $this;
}








public function getMax()
{
return $this->options['max'];
}










public function setMax($max)
{
if (is_array($max) && isset($max['max'])) {
$max = $max['max'];
}

if (! is_numeric($max)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$max = (int) $max;
if (($this->getMin() !== null) && ($max < $this->getMin())) {
throw new Exception\InvalidArgumentException(
"The maximum must be greater than or equal to the minimum file count, but {$max} < {$this->getMin()}"
);
}

$this->options['max'] = $max;
return $this;
}









public function addFile($file)
{
if (is_string($file)) {
$file = [$file];
}

if (is_array($file)) {
foreach ($file as $name) {
if (! isset($this->files[$name]) && ! empty($name)) {
$this->files[$name] = $name;
}
}
}

if ($file instanceof UploadedFileInterface && is_string($file->getClientFilename())) {
$this->files[(string) $file->getClientFilename()] = $file->getClientFilename();
}

return $this;
}










public function isValid($value, $file = null)
{
if ($this->isUploadedFilterInterface($value)) {
$this->addFile($value);
} elseif ($file !== null) {
if (! array_key_exists('destination', $file)) {
$file['destination'] = dirname($value);
}

if (array_key_exists('tmp_name', $file)) {
$value = $file['destination'] . DIRECTORY_SEPARATOR . $file['name'];
}
}

if (($file === null) || ! empty($file['tmp_name'])) {
$this->addFile($value);
}

$this->count = count($this->files);

if (($this->getMax() !== null) && ($this->count > $this->getMax())) {
return $this->throwError($file, self::TOO_MANY);
}

if (($this->getMin() !== null) && ($this->count < $this->getMin())) {
return $this->throwError($file, self::TOO_FEW);
}

return true;
}








protected function throwError($file, $errorType)
{
if ($file !== null) {
if (is_array($file)) {
if (array_key_exists('name', $file)) {
$this->value = $file['name'];
}
} elseif (is_string($file)) {
$this->value = $file;
}
}

$this->error($errorType);
return false;
}







private function isUploadedFilterInterface($value)
{
if ($value instanceof UploadedFileInterface) {
return true;
}

return false;
}
}
<?php

namespace Laminas\Validator\File;

use function array_keys;
use function array_unique;
use function hash_file;
use function is_readable;








class Md5 extends Hash
{
use FileInformationTrait;

/**
@const
*/
public const DOES_NOT_MATCH = 'fileMd5DoesNotMatch';
public const NOT_DETECTED = 'fileMd5NotDetected';
public const NOT_FOUND = 'fileMd5NotFound';


protected $messageTemplates = [
self::DOES_NOT_MATCH => 'File does not match the given md5 hashes',
self::NOT_DETECTED => 'An md5 hash could not be evaluated for the given file',
self::NOT_FOUND => 'File is not readable or does not exist',
];






protected $options = [
'algorithm' => 'md5',
'hash' => null,
];








public function getMd5()
{
return $this->getHash();
}









public function setMd5($options)
{
$this->setHash($options);
return $this;
}









public function addMd5($options)
{
$this->addHash($options);
return $this;
}








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}

$hashes = array_unique(array_keys($this->getHash()));
$filehash = hash_file('md5', $fileInfo['file']);
if ($filehash === false) {
$this->error(self::NOT_DETECTED);
return false;
}

foreach ($hashes as $hash) {
if ($filehash === $hash) {
return true;
}
}

$this->error(self::DOES_NOT_MATCH);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Psr\Http\Message\UploadedFileInterface;

use function basename;
use function is_array;
use function is_file;
use function is_string;
use function is_uploaded_file;

use const UPLOAD_ERR_CANT_WRITE;
use const UPLOAD_ERR_EXTENSION;
use const UPLOAD_ERR_FORM_SIZE;
use const UPLOAD_ERR_INI_SIZE;
use const UPLOAD_ERR_NO_FILE;
use const UPLOAD_ERR_NO_TMP_DIR;
use const UPLOAD_ERR_OK;
use const UPLOAD_ERR_PARTIAL;






class UploadFile extends AbstractValidator
{
/**
@const
*/
public const INI_SIZE = 'fileUploadFileErrorIniSize';
public const FORM_SIZE = 'fileUploadFileErrorFormSize';
public const PARTIAL = 'fileUploadFileErrorPartial';
public const NO_FILE = 'fileUploadFileErrorNoFile';
public const NO_TMP_DIR = 'fileUploadFileErrorNoTmpDir';
public const CANT_WRITE = 'fileUploadFileErrorCantWrite';
public const EXTENSION = 'fileUploadFileErrorExtension';
public const ATTACK = 'fileUploadFileErrorAttack';
public const FILE_NOT_FOUND = 'fileUploadFileErrorFileNotFound';
public const UNKNOWN = 'fileUploadFileErrorUnknown';


protected $messageTemplates = [
self::INI_SIZE => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
self::FORM_SIZE => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was '
. 'specified in the HTML form',
self::PARTIAL => 'The uploaded file was only partially uploaded',
self::NO_FILE => 'No file was uploaded',
self::NO_TMP_DIR => 'Missing a temporary folder',
self::CANT_WRITE => 'Failed to write file to disk',
self::EXTENSION => 'A PHP extension stopped the file upload',
self::ATTACK => 'File was illegally uploaded. This could be a possible attack',
self::FILE_NOT_FOUND => 'File was not found',
self::UNKNOWN => 'Unknown error while uploading file',
];








public function isValid($value)
{
if (is_array($value)) {
if (! isset($value['tmp_name']) || ! isset($value['name']) || ! isset($value['error'])) {
throw new Exception\InvalidArgumentException(
'Value array must be in $_FILES format'
);
}

return $this->validateUploadedFile(
$value['error'],
$value['name'],
$value['tmp_name']
);
}

if ($value instanceof UploadedFileInterface) {
return $this->validatePsr7UploadedFile($value);
}

if (is_string($value)) {
return $this->validateUploadedFile(0, basename($value), $value);
}

$this->error(self::UNKNOWN);
return false;
}





private function validateFileFromErrorCode($error)
{
switch ($error) {
case UPLOAD_ERR_OK:
return true;

case UPLOAD_ERR_INI_SIZE:
$this->error(self::INI_SIZE);
return false;

case UPLOAD_ERR_FORM_SIZE:
$this->error(self::FORM_SIZE);
return false;

case UPLOAD_ERR_PARTIAL:
$this->error(self::PARTIAL);
return false;

case UPLOAD_ERR_NO_FILE:
$this->error(self::NO_FILE);
return false;

case UPLOAD_ERR_NO_TMP_DIR:
$this->error(self::NO_TMP_DIR);
return false;

case UPLOAD_ERR_CANT_WRITE:
$this->error(self::CANT_WRITE);
return false;

case UPLOAD_ERR_EXTENSION:
$this->error(self::EXTENSION);
return false;

default:
$this->error(self::UNKNOWN);
return false;
}
}







private function validateUploadedFile($error, $filename, $uploadedFile)
{
$this->setValue($filename);


if ($error !== UPLOAD_ERR_OK) {
return $this->validateFileFromErrorCode($error);
}


if (empty($uploadedFile) || false === is_file($uploadedFile)) {
$this->error(self::FILE_NOT_FOUND);
return false;
}


if (! is_uploaded_file($uploadedFile)) {
$this->error(self::ATTACK);
return false;
}

return true;
}




private function validatePsr7UploadedFile(UploadedFileInterface $uploadedFile)
{
$this->setValue($uploadedFile);
return $this->validateFileFromErrorCode($uploadedFile->getError());
}
}
<?php

namespace Laminas\Validator\File;

use function array_keys;
use function array_unique;
use function hash_file;
use function is_readable;








class Sha1 extends Hash
{
use FileInformationTrait;

/**
@const
*/
public const DOES_NOT_MATCH = 'fileSha1DoesNotMatch';
public const NOT_DETECTED = 'fileSha1NotDetected';
public const NOT_FOUND = 'fileSha1NotFound';


protected $messageTemplates = [
self::DOES_NOT_MATCH => 'File does not match the given sha1 hashes',
self::NOT_DETECTED => 'A sha1 hash could not be evaluated for the given file',
self::NOT_FOUND => 'File is not readable or does not exist',
];






protected $options = [
'algorithm' => 'sha1',
'hash' => null,
];








public function getSha1()
{
return $this->getHash();
}









public function setSha1($options)
{
$this->setHash($options);
return $this;
}









public function addSha1($options)
{
$this->addHash($options);
return $this;
}








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}

$hashes = array_unique(array_keys($this->getHash()));
$filehash = hash_file('sha1', $fileInfo['file']);
if ($filehash === false) {
$this->error(self::NOT_DETECTED);
return false;
}

foreach ($hashes as $hash) {
if ($filehash === $hash) {
return true;
}
}

$this->error(self::DOES_NOT_MATCH);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ErrorHandler;
use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Traversable;

use function array_shift;
use function func_get_args;
use function func_num_args;
use function getimagesize;
use function is_array;
use function is_readable;






class ImageSize extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const WIDTH_TOO_BIG = 'fileImageSizeWidthTooBig';
public const WIDTH_TOO_SMALL = 'fileImageSizeWidthTooSmall';
public const HEIGHT_TOO_BIG = 'fileImageSizeHeightTooBig';
public const HEIGHT_TOO_SMALL = 'fileImageSizeHeightTooSmall';
public const NOT_DETECTED = 'fileImageSizeNotDetected';
public const NOT_READABLE = 'fileImageSizeNotReadable';


protected $messageTemplates = [
self::WIDTH_TOO_BIG => "Maximum allowed width for image should be '%maxwidth%' but '%width%' detected",
self::WIDTH_TOO_SMALL => "Minimum expected width for image should be '%minwidth%' but '%width%' detected",
self::HEIGHT_TOO_BIG => "Maximum allowed height for image should be '%maxheight%' but '%height%' detected",
self::HEIGHT_TOO_SMALL => "Minimum expected height for image should be '%minheight%' but '%height%' detected",
self::NOT_DETECTED => 'The size of image could not be detected',
self::NOT_READABLE => 'File is not readable or does not exist',
];


protected $messageVariables = [
'minwidth' => ['options' => 'minWidth'],
'maxwidth' => ['options' => 'maxWidth'],
'minheight' => ['options' => 'minHeight'],
'maxheight' => ['options' => 'maxHeight'],
'width' => 'width',
'height' => 'height',
];






protected $width;






protected $height;






protected $options = [
'minWidth' => null, 
'maxWidth' => null, 
'minHeight' => null, 
'maxHeight' => null, 
];












public function __construct($options = null)
{
if (1 < func_num_args()) {
if (! is_array($options)) {
$options = ['minWidth' => $options];
}

$argv = func_get_args();
array_shift($argv);
$options['minHeight'] = array_shift($argv);
if (! empty($argv)) {
$options['maxWidth'] = array_shift($argv);
if (! empty($argv)) {
$options['maxHeight'] = array_shift($argv);
}
}
}

parent::__construct($options);
}








public function getMinWidth()
{
return $this->options['minWidth'];
}








public function setMinWidth($minWidth)
{
if (($this->getMaxWidth() !== null) && ($minWidth > $this->getMaxWidth())) {
throw new Exception\InvalidArgumentException(
'The minimum image width must be less than or equal to the '
. " maximum image width, but {$minWidth} > {$this->getMaxWidth()}"
);
}

$this->options['minWidth'] = (int) $minWidth;
return $this;
}








public function getMaxWidth()
{
return $this->options['maxWidth'];
}








public function setMaxWidth($maxWidth)
{
if (($this->getMinWidth() !== null) && ($maxWidth < $this->getMinWidth())) {
throw new Exception\InvalidArgumentException(
'The maximum image width must be greater than or equal to the '
. "minimum image width, but {$maxWidth} < {$this->getMinWidth()}"
);
}

$this->options['maxWidth'] = (int) $maxWidth;
return $this;
}








public function getMinHeight()
{
return $this->options['minHeight'];
}










public function setMinHeight($minHeight)
{
if (($this->getMaxHeight() !== null) && ($minHeight > $this->getMaxHeight())) {
throw new Exception\InvalidArgumentException(
'The minimum image height must be less than or equal to the '
. " maximum image height, but {$minHeight} > {$this->getMaxHeight()}"
);
}

$this->options['minHeight'] = (int) $minHeight;
return $this;
}








public function getMaxHeight()
{
return $this->options['maxHeight'];
}










public function setMaxHeight($maxHeight)
{
if (($this->getMinHeight() !== null) && ($maxHeight < $this->getMinHeight())) {
throw new Exception\InvalidArgumentException(
'The maximum image height must be greater than or equal to the '
. "minimum image height, but {$maxHeight} < {$this->getMinHeight()}"
);
}

$this->options['maxHeight'] = (int) $maxHeight;
return $this;
}








public function getImageMin()
{
return ['minWidth' => $this->getMinWidth(), 'minHeight' => $this->getMinHeight()];
}








public function getImageMax()
{
return ['maxWidth' => $this->getMaxWidth(), 'maxHeight' => $this->getMaxHeight()];
}








public function getImageWidth()
{
return ['minWidth' => $this->getMinWidth(), 'maxWidth' => $this->getMaxWidth()];
}








public function getImageHeight()
{
return ['minHeight' => $this->getMinHeight(), 'maxHeight' => $this->getMaxHeight()];
}









public function setImageMin($options)
{
$this->setOptions($options);
return $this;
}









public function setImageMax($options)
{
$this->setOptions($options);
return $this;
}









public function setImageWidth($options)
{
$this->setImageMin($options);
$this->setImageMax($options);

return $this;
}









public function setImageHeight($options)
{
$this->setImageMin($options);
$this->setImageMax($options);

return $this;
}









public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_READABLE);
return false;
}

ErrorHandler::start();
$size = getimagesize($fileInfo['file']);
ErrorHandler::stop();

if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) {
$this->error(self::NOT_DETECTED);
return false;
}

$this->width = $size[0];
$this->height = $size[1];
if ($this->width < $this->getMinWidth()) {
$this->error(self::WIDTH_TOO_SMALL);
}

if (($this->getMaxWidth() !== null) && ($this->getMaxWidth() < $this->width)) {
$this->error(self::WIDTH_TOO_BIG);
}

if ($this->height < $this->getMinHeight()) {
$this->error(self::HEIGHT_TOO_SMALL);
}

if (($this->getMaxHeight() !== null) && ($this->getMaxHeight() < $this->height)) {
$this->error(self::HEIGHT_TOO_BIG);
}

if ($this->getMessages()) {
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ArrayUtils;
use Laminas\Stdlib\ErrorHandler;
use Laminas\Validator\Exception;
use Laminas\Validator\Exception\InvalidArgumentException;
use Traversable;

use function array_key_exists;
use function array_shift;
use function filesize;
use function func_get_args;
use function func_num_args;
use function is_array;
use function is_readable;
use function is_scalar;
use function is_string;






class FilesSize extends Size
{
/**
@const
*/
public const TOO_BIG = 'fileFilesSizeTooBig';
public const TOO_SMALL = 'fileFilesSizeTooSmall';
public const NOT_READABLE = 'fileFilesSizeNotReadable';


protected $messageTemplates = [
self::TOO_BIG => "All files in sum should have a maximum size of '%max%' but '%size%' were detected",
self::TOO_SMALL => "All files in sum should have a minimum size of '%min%' but '%size%' were detected",
self::NOT_READABLE => 'One or more files can not be read',
];






protected $files;










public function __construct($options = null)
{
$this->files = [];
$this->setSize(0);

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
} elseif (is_scalar($options)) {
$options = ['max' => $options];
} elseif (! is_array($options)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

if (1 < func_num_args()) {
$argv = func_get_args();
array_shift($argv);
$options['max'] = array_shift($argv);
if (! empty($argv)) {
$options['useByteString'] = array_shift($argv);
}
}

parent::__construct($options);
}









public function isValid($value, $file = null)
{
if (is_string($value)) {
$value = [$value];
} elseif (is_array($value) && isset($value['tmp_name'])) {
$value = [$value];
}

$min = $this->getMin(true);
$max = $this->getMax(true);
$size = $this->getSize();
foreach ($value as $files) {
if (is_array($files)) {
if (! isset($files['tmp_name']) || ! isset($files['name'])) {
throw new Exception\InvalidArgumentException(
'Value array must be in $_FILES format'
);
}
$file = $files;
$files = $files['tmp_name'];
}


if (empty($files) || false === is_readable($files)) {
$this->throwError($file, self::NOT_READABLE);
continue;
}

if (! isset($this->files[$files])) {
$this->files[$files] = $files;
} else {

continue;
}


ErrorHandler::start();
$size += filesize($files);
ErrorHandler::stop();
$this->size = $size;
if (($max !== null) && ($max < $size)) {
if ($this->getByteString()) {
$this->options['max'] = $this->toByteString($max);
$this->size = $this->toByteString($size);
$this->throwError($file, self::TOO_BIG);
$this->options['max'] = $max;
$this->size = $size;
} else {
$this->throwError($file, self::TOO_BIG);
}
}
}


if (($min !== null) && ($size < $min)) {
if ($this->getByteString()) {
$this->options['min'] = $this->toByteString($min);
$this->size = $this->toByteString($size);
$this->throwError($file, self::TOO_SMALL);
$this->options['min'] = $min;
$this->size = $size;
} else {
$this->throwError($file, self::TOO_SMALL);
}
}

if ($this->getMessages()) {
return false;
}

return true;
}








protected function throwError($file, $errorType)
{
if ($file !== null) {
if (is_array($file)) {
if (array_key_exists('name', $file)) {
$this->value = $file['name'];
}
} elseif (is_string($file)) {
$this->value = $file;
}
}

$this->error($errorType);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ArrayUtils;
use Laminas\Validator\AbstractValidator;
use Traversable;

use function array_key_exists;
use function array_unique;
use function explode;
use function func_get_arg;
use function func_num_args;
use function implode;
use function in_array;
use function is_array;
use function is_readable;
use function is_string;
use function strrpos;
use function strtolower;
use function substr;
use function trim;




class Extension extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const FALSE_EXTENSION = 'fileExtensionFalse';
public const NOT_FOUND = 'fileExtensionNotFound';


protected $messageTemplates = [
self::FALSE_EXTENSION => 'File has an incorrect extension',
self::NOT_FOUND => 'File is not readable or does not exist',
];






protected $options = [
'case' => false, 
'extension' => '', 
'allowNonExistentFile' => false, 
];


protected $messageVariables = [
'extension' => ['options' => 'extension'],
];






public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

$case = null;
if (1 < func_num_args()) {
$case = func_get_arg(1);
}

if (is_array($options)) {
if (isset($options['case'])) {
$case = $options['case'];
unset($options['case']);
}

if (! array_key_exists('extension', $options)) {
$options = ['extension' => $options];
}
} else {
$options = ['extension' => $options];
}

if ($case !== null) {
$options['case'] = $case;
}

parent::__construct($options);
}








public function getCase()
{
return $this->options['case'];
}









public function setCase($case)
{
$this->options['case'] = (bool) $case;
return $this;
}








public function getExtension()
{
if (
! array_key_exists('extension', $this->options)
|| ! is_string($this->options['extension'])
) {
return [];
}

return explode(',', $this->options['extension']);
}









public function setExtension($extension)
{
$this->options['extension'] = null;
$this->addExtension($extension);
return $this;
}









public function addExtension($extension)
{
$extensions = $this->getExtension();
if (is_string($extension)) {
$extension = explode(',', $extension);
}

foreach ($extension as $content) {
if (empty($content) || ! is_string($content)) {
continue;
}

$extensions[] = trim($content);
}

$extensions = array_unique($extensions);


foreach ($extensions as $key => $ext) {
if (empty($ext)) {
unset($extensions[$key]);
}
}

$this->options['extension'] = implode(',', $extensions);
return $this;
}








public function getAllowNonExistentFile()
{
return $this->options['allowNonExistentFile'];
}









public function setAllowNonExistentFile($flag)
{
$this->options['allowNonExistentFile'] = (bool) $flag;
return $this;
}









public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);


if (
! $this->getAllowNonExistentFile()
&& (empty($fileInfo['file']) || false === is_readable($fileInfo['file']))
) {
$this->error(self::NOT_FOUND);
return false;
}

$this->setValue($fileInfo['filename']);

$extension = substr($fileInfo['filename'], strrpos($fileInfo['filename'], '.') + 1);
$extensions = $this->getExtension();

if ($this->getCase() && (in_array($extension, $extensions))) {
return true;
} elseif (! $this->getCase()) {
foreach ($extensions as $ext) {
if (strtolower($ext) === strtolower($extension)) {
return true;
}
}
}

$this->error(self::FALSE_EXTENSION);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Psr\Http\Message\UploadedFileInterface;

use function array_merge;
use function class_exists;
use function explode;
use function finfo_file;
use function finfo_open;
use function in_array;
use function is_readable;
use function is_string;

use const FILEINFO_MIME_TYPE;






class ExcludeMimeType extends MimeType
{
use FileInformationTrait;

public const FALSE_TYPE = 'fileExcludeMimeTypeFalse';
public const NOT_DETECTED = 'fileExcludeMimeTypeNotDetected';
public const NOT_READABLE = 'fileExcludeMimeTypeNotReadable';


protected $messageTemplates = [
self::FALSE_TYPE => "File has an incorrect mimetype of '%type%'",
self::NOT_DETECTED => 'The mimetype could not be detected from the file',
self::NOT_READABLE => 'File is not readable or does not exist',
];










public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file, true);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_READABLE);
return false;
}

$mimefile = $this->getMagicFile();
if (class_exists('finfo', false)) {
if (! $this->isMagicFileDisabled() && (is_string($mimefile) && empty($this->finfo))) {
$this->finfo = finfo_open(FILEINFO_MIME_TYPE, $mimefile);
}

if (empty($this->finfo)) {
$this->finfo = finfo_open(FILEINFO_MIME_TYPE);
}

$this->type = null;
if (! empty($this->finfo)) {
$this->type = finfo_file($this->finfo, $fileInfo['file']);
}
}

if (! is_string($this->type) && $this->getHeaderCheck()) {
$this->type = $fileInfo['filetype'];
}

if (! is_string($this->type)) {
$this->error(self::NOT_DETECTED);
return false;
}

$mimetype = $this->getMimeType(true);
if (in_array($this->type, $mimetype)) {
$this->error(self::FALSE_TYPE);
return false;
}

$types = explode('/', $this->type);
$types = array_merge($types, explode('-', $this->type));
$types = array_merge($types, explode(';', $this->type));
foreach ($mimetype as $mime) {
if (in_array($mime, $types)) {
$this->error(self::FALSE_TYPE);
return false;
}
}

return true;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;

use function array_key_exists;
use function array_unique;
use function array_values;
use function func_get_arg;
use function func_num_args;
use function get_debug_type;
use function hash_algos;
use function hash_file;
use function in_array;
use function is_array;
use function is_readable;
use function is_scalar;
use function is_string;
use function sprintf;




class Hash extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const DOES_NOT_MATCH = 'fileHashDoesNotMatch';
public const NOT_DETECTED = 'fileHashHashNotDetected';
public const NOT_FOUND = 'fileHashNotFound';


protected $messageTemplates = [
self::DOES_NOT_MATCH => 'File does not match the given hashes',
self::NOT_DETECTED => 'A hash could not be evaluated for the given file',
self::NOT_FOUND => 'File is not readable or does not exist',
];






protected $options = [
'algorithm' => 'crc32',
'hash' => null,
];






public function __construct($options = null)
{
if (
is_scalar($options) ||
(is_array($options) && ! array_key_exists('hash', $options))
) {
$options = ['hash' => $options];
}

if (1 < func_num_args()) {
$options['algorithm'] = func_get_arg(1);
}



if (isset($options['algorithm'])) {
$options = ['algorithm' => $options['algorithm']] + $options;
}

parent::__construct($options);
}








public function getHash()
{
return $this->options['hash'];
}









public function setHash($options)
{
$this->options['hash'] = null;
$this->addHash($options);

return $this;
}










public function addHash($options)
{
if (is_string($options)) {
$options = [$options];
} elseif (! is_array($options)) {
throw new Exception\InvalidArgumentException('False parameter given');
}

$known = hash_algos();
if (! isset($options['algorithm'])) {
$algorithm = $this->options['algorithm'];
} else {
$algorithm = $options['algorithm'];
unset($options['algorithm']);
}

if (! in_array($algorithm, $known)) {
throw new Exception\InvalidArgumentException("Unknown algorithm '{$algorithm}'");
}

foreach ($options as $value) {
if (! is_string($value)) {
throw new Exception\InvalidArgumentException(sprintf(
'Hash must be a string, %s received',
get_debug_type($value)
));
}
$this->options['hash'][$value] = $algorithm;
}

return $this;
}








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}

$algos = array_unique(array_values($this->getHash()));
foreach ($algos as $algorithm) {
$filehash = hash_file($algorithm, $fileInfo['file']);

if ($filehash === false) {
$this->error(self::NOT_DETECTED);
return false;
}

if (isset($this->getHash()[$filehash]) && $this->getHash()[$filehash] === $algorithm) {
return true;
}
}

$this->error(self::DOES_NOT_MATCH);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ErrorHandler;
use Laminas\Validator\AbstractValidator;
use Laminas\Validator\Exception;
use Traversable;

use function array_shift;
use function filesize;
use function func_get_args;
use function func_num_args;
use function is_numeric;
use function is_readable;
use function is_string;
use function round;
use function sprintf;
use function strtoupper;
use function substr;
use function trim;




class Size extends AbstractValidator
{
use FileInformationTrait;

/**
@const
*/
public const TOO_BIG = 'fileSizeTooBig';
public const TOO_SMALL = 'fileSizeTooSmall';
public const NOT_FOUND = 'fileSizeNotFound';


protected $messageTemplates = [
self::TOO_BIG => "Maximum allowed size for file is '%max%' but '%size%' detected",
self::TOO_SMALL => "Minimum expected size for file is '%min%' but '%size%' detected",
self::NOT_FOUND => 'File is not readable or does not exist',
];


protected $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
'size' => 'size',
];






protected $size;






protected $options = [
'min' => null, 
'max' => null, 
'useByteString' => true, 
];












public function __construct($options = null)
{
if (is_string($options) || is_numeric($options)) {
$options = ['max' => $options];
}

if (1 < func_num_args()) {
$argv = func_get_args();
array_shift($argv);
$options['max'] = array_shift($argv);
if (! empty($argv)) {
$options['useByteString'] = array_shift($argv);
}
}

parent::__construct($options);
}









public function useByteString($byteString = true)
{
$this->options['useByteString'] = (bool) $byteString;
return $this;
}








public function getByteString()
{
return $this->options['useByteString'];
}









public function getMin($raw = false)
{
$min = $this->options['min'];
if (! $raw && $this->getByteString()) {
$min = $this->toByteString($min);
}

return $min;
}














public function setMin($min)
{
if (! is_string($min) && ! is_numeric($min)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$min = (int) $this->fromByteString($min);
$max = $this->getMax(true);
if (($max !== null) && ($min > $max)) {
throw new Exception\InvalidArgumentException(
"The minimum must be less than or equal to the maximum file size, but $min > $max"
);
}

$this->options['min'] = $min;
return $this;
}









public function getMax($raw = false)
{
$max = $this->options['max'];
if (! $raw && $this->getByteString()) {
$max = $this->toByteString($max);
}

return $max;
}














public function setMax($max)
{
if (! is_string($max) && ! is_numeric($max)) {
throw new Exception\InvalidArgumentException('Invalid options to validator provided');
}

$max = (int) $this->fromByteString($max);
$min = $this->getMin(true);
if (($min !== null) && ($max < $min)) {
throw new Exception\InvalidArgumentException(
"The maximum must be greater than or equal to the minimum file size, but $max < $min"
);
}

$this->options['max'] = $max;
return $this;
}








protected function getSize()
{
return $this->size;
}









protected function setSize($size)
{
$this->size = $size;
return $this;
}









public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}


ErrorHandler::start();
$size = sprintf('%u', filesize($fileInfo['file']));
ErrorHandler::stop();
$this->size = $size;


$min = $this->getMin(true);
$max = $this->getMax(true);
if (($min !== null) && ($size < $min)) {
if ($this->getByteString()) {
$this->options['min'] = $this->toByteString($min);
$this->size = $this->toByteString($size);
$this->error(self::TOO_SMALL);
$this->options['min'] = $min;
$this->size = $size;
} else {
$this->error(self::TOO_SMALL);
}
}


if (($max !== null) && ($max < $size)) {
if ($this->getByteString()) {
$this->options['max'] = $this->toByteString($max);
$this->size = $this->toByteString($size);
$this->error(self::TOO_BIG);
$this->options['max'] = $max;
$this->size = $size;
} else {
$this->error(self::TOO_BIG);
}
}

if ($this->getMessages()) {
return false;
}

return true;
}







protected function toByteString($size)
{
$sizes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
for ($i = 0; $size >= 1024 && $i < 9; $i++) {
$size /= 1024;
}

return round($size, 2) . $sizes[$i];
}







protected function fromByteString($size)
{
if (is_numeric($size)) {
return (int) $size;
}

$type = trim(substr($size, -2, 1));

$value = substr($size, 0, -1);
if (! is_numeric($value)) {
$value = trim(substr($value, 0, -1));
}

switch (strtoupper($type)) {
case 'Y':
$value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024;
break;
case 'Z':
$value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024;
break;
case 'E':
$value *= 1024 * 1024 * 1024 * 1024 * 1024 * 1024;
break;
case 'P':
$value *= 1024 * 1024 * 1024 * 1024 * 1024;
break;
case 'T':
$value *= 1024 * 1024 * 1024 * 1024;
break;
case 'G':
$value *= 1024 * 1024 * 1024;
break;
case 'M':
$value *= 1024 * 1024;
break;
case 'K':
$value *= 1024;
break;
default:
break;
}

return $value;
}
}
<?php

namespace Laminas\Validator\File;

use function array_keys;
use function array_unique;
use function hash_file;
use function is_readable;








class Crc32 extends Hash
{
use FileInformationTrait;

/**
@const
*/
public const DOES_NOT_MATCH = 'fileCrc32DoesNotMatch';
public const NOT_DETECTED = 'fileCrc32NotDetected';
public const NOT_FOUND = 'fileCrc32NotFound';


protected $messageTemplates = [
self::DOES_NOT_MATCH => 'File does not match the given crc32 hashes',
self::NOT_DETECTED => 'A crc32 hash could not be evaluated for the given file',
self::NOT_FOUND => 'File is not readable or does not exist',
];






protected $options = [
'algorithm' => 'crc32',
'hash' => null,
];








public function getCrc32()
{
return $this->getHash();
}









public function setCrc32($options)
{
$this->setHash($options);
return $this;
}









public function addCrc32($options)
{
$this->addHash($options);
return $this;
}








public function isValid($value, $file = null)
{
$fileInfo = $this->getFileInfo($value, $file);

$this->setValue($fileInfo['filename']);


if (empty($fileInfo['file']) || false === is_readable($fileInfo['file'])) {
$this->error(self::NOT_FOUND);
return false;
}

$hashes = array_unique(array_keys($this->getHash()));
$filehash = hash_file('crc32', $fileInfo['file']);
if ($filehash === false) {
$this->error(self::NOT_DETECTED);
return false;
}

foreach ($hashes as $hash) {
if ($filehash === $hash) {
return true;
}
}

$this->error(self::DOES_NOT_MATCH);
return false;
}
}
<?php

namespace Laminas\Validator\File;

use Laminas\Stdlib\ArrayUtils;
use Traversable;






class IsCompressed extends MimeType
{
/**
@const
*/
public const FALSE_TYPE = 'fileIsCompressedFalseType';
public const NOT_DETECTED = 'fileIsCompressedNotDetected';
public const NOT_READABLE = 'fileIsCompressedNotReadable';


protected $messageTemplates = [
self::FALSE_TYPE => "File is not compressed, '%type%' detected",
self::NOT_DETECTED => 'The mimetype could not be detected from the file',
self::NOT_READABLE => 'File is not readable or does not exist',
];






public function __construct($options = [])
{

$default = [
'application/arj',
'application/gnutar',
'application/lha',
'application/lzx',
'application/vnd.ms-cab-compressed',
'application/x-ace-compressed',
'application/x-arc',
'application/x-archive',
'application/x-arj',
'application/x-bzip',
'application/x-bzip2',
'application/x-cab-compressed',
'application/x-compress',
'application/x-compressed',
'application/x-cpio',
'application/x-debian-package',
'application/x-eet',
'application/x-gzip',
'application/x-java-pack200',
'application/x-lha',
'application/x-lharc',
'application/x-lzh',
'application/x-lzma',
'application/x-lzx',
'application/x-rar',
'application/x-sit',
'application/x-stuffit',
'application/x-tar',
'application/zip',
'application/x-zip',
'application/zoo',
'multipart/x-gzip',
];

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if ($options === null) {
$options = [];
}

parent::__construct($options);

if (! $this->getMimeType()) {
$this->setMimeType($default);
}
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use DateTimeImmutable;
use DateTimeInterface;
use DateTimeZone;
use Laminas\Validator\Exception\InvalidArgumentException;

use function assert;
use function get_debug_type;
use function is_string;
use function preg_match;

/**
@psalm-type






*/
final class DateComparison extends AbstractValidator
{
public const ERROR_INVALID_TYPE = 'invalidType';
public const ERROR_INVALID_DATE = 'invalidDate';
public const ERROR_NOT_GREATER_INCLUSIVE = 'notGreaterInclusive';
public const ERROR_NOT_GREATER = 'notGreater';
public const ERROR_NOT_LESS_INCLUSIVE = 'notLessInclusive';
public const ERROR_NOT_LESS = 'notLess';


protected array $messageTemplates = [
self::ERROR_INVALID_TYPE => 'Expected a string or a date time instance but received "%type"',
self::ERROR_INVALID_DATE => 'Invalid date provided',
self::ERROR_NOT_GREATER_INCLUSIVE => 'A date equal to or after %min% is required',
self::ERROR_NOT_GREATER => 'A date after %min% is required',
self::ERROR_NOT_LESS_INCLUSIVE => 'A date equal to or before %max% is required',
self::ERROR_NOT_LESS => 'A date before %max% is required',
];


protected array $messageVariables = [
'type' => 'type',
'min' => 'minString',
'max' => 'maxString',
];

private readonly ?DateTimeInterface $min;
private readonly ?DateTimeInterface $max;
private readonly bool $inclusiveMin;
private readonly bool $inclusiveMax;
private readonly ?string $inputFormat;


protected ?string $type = null;
protected ?string $minString = null;
protected ?string $maxString = null;


public function __construct(array $options = [])
{
parent::__construct($options);

$this->min = $this->dateInstanceBound($options['min'] ?? null);
$this->max = $this->dateInstanceBound($options['max'] ?? null);
$this->inclusiveMin = $options['inclusiveMin'] ?? true;
$this->inclusiveMax = $options['inclusiveMax'] ?? true;
$this->inputFormat = $options['inputFormat'] ?? null;

if ($this->min === null && $this->max === null) {
throw new InvalidArgumentException(
'At least one date boundary must be supplied',
);
}

$outputFormat = $this->inputFormat ?? 'jS F Y H:i:s';

if ($this->min !== null) {
$this->minString = $this->min->format($outputFormat);
}

if ($this->max !== null) {
$this->maxString = $this->max->format($outputFormat);
}
}

public function isValid(mixed $value): bool
{
$this->type = get_debug_type($value);
$this->value = $value;

if (! is_string($value) && ! $value instanceof DateTimeInterface) {
$this->error(self::ERROR_INVALID_TYPE);

return false;
}

$date = $this->valueToDate($value);
if ($date === null) {
$this->error(self::ERROR_INVALID_DATE);

return false;
}

if ($this->min !== null && $this->inclusiveMin && $date < $this->min) {
$this->error(self::ERROR_NOT_GREATER_INCLUSIVE);

return false;
}

if ($this->min !== null && ! $this->inclusiveMin && $date <= $this->min) {
$this->error(self::ERROR_NOT_GREATER);

return false;
}

if ($this->max !== null && $this->inclusiveMax && $date > $this->max) {
$this->error(self::ERROR_NOT_LESS_INCLUSIVE);

return false;
}

if ($this->max !== null && ! $this->inclusiveMax && $date >= $this->max) {
$this->error(self::ERROR_NOT_LESS);

return false;
}

return true;
}

private function valueToDate(string|DateTimeInterface $input): DateTimeInterface|null
{
if ($input instanceof DateTimeInterface) {
return $this->w3cDateFromString($input->format('Y-m-d\TH:i:s'));
}

if ($this->inputFormat !== null) {
$date = DateTimeImmutable::createFromFormat($this->inputFormat, $input, new DateTimeZone('UTC'));

if ($date instanceof DateTimeImmutable) {
return $date;
}
}

$date = $this->isoDateFromString($input);
if ($date !== null) {
return $date;
}

$date = $this->w3cDateFromString($input);
if ($date !== null) {
return $date;
}

return null;
}

private function dateInstanceBound(string|DateTimeInterface|null $dateTime): DateTimeInterface|null
{
if ($dateTime instanceof DateTimeInterface) {
return $this->w3cDateFromString($dateTime->format('Y-m-d\TH:i:s'));
}

if ($dateTime === null) {
return null;
}

$date = $this->isoDateFromString($dateTime);
if ($date !== null) {
return $date;
}

$date = $this->w3cDateFromString($dateTime);
if ($date !== null) {
return $date;
}

throw new InvalidArgumentException(
'Min/max date bounds must be either DateTime instances, or a string in one of the formats: '
. '"Y-m-d" for a date or "Y-m-d\TH:i:s" for date time',
);
}

private function isoDateFromString(string $input): DateTimeImmutable|null
{
if (! preg_match('/^\d{4}-[0-1]\d-[0-3]\d$/', $input)) {
return null;
}

$date = DateTimeImmutable::createFromFormat('!Y-m-d', $input, new DateTimeZone('UTC'));
assert($date !== false);

return $date;
}

private function w3cDateFromString(string $input): DateTimeImmutable|null
{
if (! preg_match('/^\d{4}-[0-1]\d-[0-3]\dT\d{1,2}:[0-5]\d:[0-5]\d$/', $input)) {
return null;
}

$date = DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s', $input, new DateTimeZone('UTC'));
assert($date !== false);

return $date;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function array_shift;
use function func_get_args;
use function is_array;






class GreaterThan extends AbstractValidator
{
public const NOT_GREATER = 'notGreaterThan';
public const NOT_GREATER_INCLUSIVE = 'notGreaterThanInclusive';






protected $messageTemplates = [
self::NOT_GREATER => "The input is not greater than '%min%'",
self::NOT_GREATER_INCLUSIVE => "The input is not greater than or equal to '%min%'",
];


protected $messageVariables = [
'min' => 'min',
];






protected $min;









protected $inclusive;







public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}
if (! is_array($options)) {
$options = func_get_args();
$temp['min'] = array_shift($options);

if (! empty($options)) {
$temp['inclusive'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('min', $options)) {
throw new Exception\InvalidArgumentException("Missing option 'min'");
}

if (! array_key_exists('inclusive', $options)) {
$options['inclusive'] = false;
}

$this->setMin($options['min'])
->setInclusive($options['inclusive']);

parent::__construct($options);
}






public function getMin()
{
return $this->min;
}






public function setMin(mixed $min)
{
$this->min = $min;
return $this;
}






public function getInclusive()
{
return $this->inclusive;
}







public function setInclusive($inclusive)
{
$this->inclusive = $inclusive;
return $this;
}







public function isValid($value)
{
$this->setValue($value);

if ($this->inclusive) {
if ($this->min > $value) {
$this->error(self::NOT_GREATER_INCLUSIVE);
return false;
}
} else {
if ($this->min >= $value) {
$this->error(self::NOT_GREATER);
return false;
}
}

return true;
}
}
<?php

namespace Laminas\Validator\Isbn;






class Isbn13
{




public function getChecksum($value)
{
$sum = $this->sum($value);
return $this->checksum($sum);
}







private function sum($value)
{
$sum = 0;

for ($i = 0; $i < 12; $i++) {
if ($i % 2 === 0) {
$sum += (int) $value[$i];
continue;
}

$sum += 3 * (int) $value[$i];
}

return $sum;
}







private function checksum($sum)
{
$checksum = 10 - ($sum % 10);

if ($checksum === 10) {
return '0';
}

return $checksum;
}
}
<?php

namespace Laminas\Validator\Isbn;






class Isbn10
{




public function getChecksum($value)
{
$sum = $this->sum($value);
return $this->checksum($sum);
}







private function sum($value)
{
$sum = 0;

for ($i = 0; $i < 9; $i++) {
$sum += (10 - $i) * (int) $value[$i];
}

return $sum;
}







private function checksum($sum)
{
$checksum = 11 - ($sum % 11);

if ($checksum === 11) {
return '0';
}

if ($checksum === 10) {
return 'X';
}

return $checksum;
}
}
<?php

namespace Laminas\Validator;

use Traversable;

use function bindec;
use function hexdec;
use function ip2long;
use function is_string;
use function long2ip;
use function preg_match;
use function str_contains;
use function strlen;
use function strpos;
use function strrpos;
use function substr;
use function substr_count;


class Ip extends AbstractValidator
{
public const INVALID = 'ipInvalid';
public const NOT_IP_ADDRESS = 'notIpAddress';


protected $messageTemplates = [
self::INVALID => 'Invalid type given. String expected',
self::NOT_IP_ADDRESS => 'The input does not appear to be a valid IP address',
];






protected $options = [
'allowipv4' => true, 
'allowipv6' => true, 
'allowipvfuture' => false, 
'allowliteral' => true, 
];









public function setOptions($options = [])
{
parent::setOptions($options);

if (! $this->options['allowipv4'] && ! $this->options['allowipv6'] && ! $this->options['allowipvfuture']) {
throw new Exception\InvalidArgumentException('Nothing to validate. Check your options');
}

return $this;
}







public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

if ($this->options['allowipv4'] && $this->validateIPv4($value)) {
return true;
} else {
if ((bool) $this->options['allowliteral']) {
static $regex = '/^\[(.*)\]$/';
if ((bool) preg_match($regex, $value, $matches)) {
$value = $matches[1];
}
}

$isValidV6Address = $this->validateIPv6($value);
$isValidV6Address = $isValidV6Address !== false && $isValidV6Address !== 0;

if (
($this->options['allowipv6'] && $isValidV6Address) ||
($this->options['allowipvfuture'] && $this->validateIPvFuture($value))
) {
return true;
}
}
$this->error(self::NOT_IP_ADDRESS);
return false;
}







protected function validateIPv4($value)
{
if (preg_match('/^([01]{8}\.){3}[01]{8}\z/i', $value)) {

$value = bindec(substr($value, 0, 8)) . '.' . bindec(substr($value, 9, 8)) . '.'
. bindec(substr($value, 18, 8)) . '.' . bindec(substr($value, 27, 8));
} elseif (preg_match('/^([0-9]{3}\.){3}[0-9]{3}\z/i', $value)) {

$value = (int) substr($value, 0, 3) . '.' . (int) substr($value, 4, 3) . '.'
. (int) substr($value, 8, 3) . '.' . (int) substr($value, 12, 3);
} elseif (preg_match('/^([0-9a-f]{2}\.){3}[0-9a-f]{2}\z/i', $value)) {

$value = hexdec(substr($value, 0, 2)) . '.' . hexdec(substr($value, 3, 2)) . '.'
. hexdec(substr($value, 6, 2)) . '.' . hexdec(substr($value, 9, 2));
}

$ip2long = ip2long($value);
if ($ip2long === false) {
return false;
}

return $value === long2ip($ip2long);
}







protected function validateIPv6($value)
{
if (strlen($value) < 3) {
return $value === '::';
}

if (strpos($value, '.') !== false) {
$lastcolon = strrpos($value, ':');
if (! ($lastcolon !== false && $this->validateIPv4(substr($value, $lastcolon + 1)))) {
return false;
}

$value = substr($value, 0, $lastcolon) . ':0:0';
}

if (! str_contains($value, '::')) {
return preg_match('/\A(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}\z/i', $value);
}

$colonCount = substr_count($value, ':');
if ($colonCount < 8) {
return preg_match('/\A(?::|(?:[a-f0-9]{1,4}:)+):(?:(?:[a-f0-9]{1,4}:)*[a-f0-9]{1,4})?\z/i', $value);
}


if ($colonCount === 8) {
return preg_match('/\A(?:::)?(?:[a-f0-9]{1,4}:){6}[a-f0-9]{1,4}(?:::)?\z/i', $value);
}

return false;
}










protected function validateIPvFuture($value)
{







static $regex = '/^v([[:xdigit:]]+)\.[[:alnum:]\-\._~!\$&\'\(\)\*\+,;=:]+$/';

$result = (bool) preg_match($regex, $value, $matches);





return $result && $matches[1] !== '4' && $matches[1] !== '6';
}
}
<?php

namespace Laminas\Validator;

use Countable;
use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_search;
use function array_shift;
use function count;
use function func_get_args;
use function in_array;
use function is_array;
use function is_bool;
use function is_float;
use function is_int;
use function is_object;
use function is_string;
use function method_exists;
use function preg_match;


class NotEmpty extends AbstractValidator
{
public const BOOLEAN = 0b000000000001;
public const INTEGER = 0b000000000010;
public const FLOAT = 0b000000000100;
public const STRING = 0b000000001000;
public const ZERO = 0b000000010000;
public const EMPTY_ARRAY = 0b000000100000;
public const NULL = 0b000001000000;
public const PHP = 0b000001111111;
public const SPACE = 0b000010000000;
public const OBJECT = 0b000100000000;
public const OBJECT_STRING = 0b001000000000;
public const OBJECT_COUNT = 0b010000000000;
public const ALL = 0b011111111111;

public const INVALID = 'notEmptyInvalid';
public const IS_EMPTY = 'isEmpty';


protected $constants = [
self::BOOLEAN => 'boolean',
self::INTEGER => 'integer',
self::FLOAT => 'float',
self::STRING => 'string',
self::ZERO => 'zero',
self::EMPTY_ARRAY => 'array',
self::NULL => 'null',
self::PHP => 'php',
self::SPACE => 'space',
self::OBJECT => 'object',
self::OBJECT_STRING => 'objectstring',
self::OBJECT_COUNT => 'objectcount',
self::ALL => 'all',
];






protected $defaultType = [
self::OBJECT,
self::SPACE,
self::NULL,
self::EMPTY_ARRAY,
self::STRING,
self::BOOLEAN,
];


protected $messageTemplates = [
self::IS_EMPTY => "Value is required and can't be empty",
self::INVALID => 'Invalid type given. String, integer, float, boolean or array expected',
];






protected $options = [];






public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if (! is_array($options)) {
$options = func_get_args();
$temp = [];
if (! empty($options)) {
$temp['type'] = array_shift($options);
}

$options = $temp;
}

if (! isset($options['type'])) {
if (($type = $this->calculateTypeValue($options)) !== 0) {
$options['type'] = $type;
} else {
$options['type'] = $this->defaultType;
}
}

parent::__construct($options);
}








public function getType()
{
return $this->options['type'];
}






public function getDefaultType()
{
return $this->calculateTypeValue($this->defaultType);
}





protected function calculateTypeValue($type)
{
if (is_array($type)) {
$detected = 0;
foreach ($type as $value) {
if (is_int($value)) {
$detected |= $value;
} elseif (in_array($value, $this->constants, true)) {
$detected |= (int) array_search($value, $this->constants, true);
}
}

$type = $detected;
} elseif (is_string($type) && in_array($type, $this->constants, true)) {
$type = array_search($type, $this->constants, true);
}

return $type;
}










public function setType($type = null)
{
$type = $this->calculateTypeValue($type);

if (! is_int($type) || ($type < 0) || ($type > self::ALL)) {
throw new Exception\InvalidArgumentException('Unknown type');
}

$this->options['type'] = $type;

return $this;
}







public function isValid($value)
{
if (
$value !== null
&& ! is_string($value)
&& ! is_int($value)
&& ! is_float($value)
&& ! is_bool($value)
&& ! is_array($value)
&& ! is_object($value)
) {
$this->error(self::INVALID);
return false;
}

$type = $this->getType();
$this->setValue($value);
$object = false;


if ($type & self::OBJECT_COUNT) {
$object = true;

if (is_object($value) && $value instanceof Countable && (count($value) === 0)) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::OBJECT_STRING) {
$object = true;

if (
(is_object($value) && ! method_exists($value, '__toString'))
|| (is_object($value) && method_exists($value, '__toString') && (string) $value === '')
) {
$this->error(self::IS_EMPTY);
return false;
}
}



if ($type & self::OBJECT) {

} elseif ($object === false) {

if (is_object($value)) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::SPACE) {
if (is_string($value) && (preg_match('/^\s+$/s', $value))) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::NULL) {
if ($value === null) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::EMPTY_ARRAY) {
if ($value === []) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::ZERO) {
if ($value === '0') {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::STRING) {
if ($value === '') {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::FLOAT) {
if ($value === 0.0) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::INTEGER) {
if ($value === 0) {
$this->error(self::IS_EMPTY);
return false;
}
}


if ($type & self::BOOLEAN) {
if ($value === false) {
$this->error(self::IS_EMPTY);
return false;
}
}

return true;
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use Traversable;

use function array_shift;
use function func_get_args;
use function gettype;
use function implode;
use function is_array;
use function iterator_to_array;




class Date extends AbstractValidator
{



public const INVALID = 'dateInvalid';
public const INVALID_DATE = 'dateInvalidDate';
public const FALSEFORMAT = 'dateFalseFormat';





public const FORMAT_DEFAULT = 'Y-m-d';






protected $messageTemplates = [
self::INVALID => 'Invalid type given. String, integer, array or DateTime expected',
self::INVALID_DATE => 'The input does not appear to be a valid date',
self::FALSEFORMAT => "The input does not fit the date format '%format%'",
];


protected $messageVariables = [
'format' => 'format',
];


protected $format = self::FORMAT_DEFAULT;


protected $strict = false;






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = iterator_to_array($options);
} elseif (! is_array($options)) {
$options = func_get_args();
$temp['format'] = array_shift($options);
$options = $temp;
}

parent::__construct($options);
}








public function getFormat()
{
return $this->format;
}













public function setFormat($format = self::FORMAT_DEFAULT)
{
$this->format = $format === null || $format === '' ? self::FORMAT_DEFAULT : $format;
return $this;
}




public function setStrict(bool $strict): self
{
$this->strict = $strict;
return $this;
}




public function isStrict(): bool
{
return $this->strict;
}







public function isValid($value)
{
$this->setValue($value);

$date = $this->convertToDateTime($value);
if (! $date) {
$this->error(self::INVALID_DATE);
return false;
}

if ($this->isStrict() && $date->format($this->getFormat()) !== $value) {
$this->error(self::FALSEFORMAT);
return false;
}

return true;
}








protected function convertToDateTime($param, $addErrors = true)
{
if ($param instanceof DateTime) {
return $param;
}

if ($param instanceof DateTimeImmutable) {
return DateTime::createFromImmutable($param);
}

$type = gettype($param);
switch ($type) {
case 'string':
return $this->convertString($param, $addErrors);
case 'integer':
return $this->convertInteger($param);
case 'double':
return $this->convertDouble($param);
case 'array':
return $this->convertArray($param, $addErrors);
}

if ($addErrors) {
$this->error(self::INVALID);
}

return false;
}







protected function convertInteger($value)
{
return DateTime::createFromFormat('U', (string) $value);
}







protected function convertDouble($value)
{
return DateTime::createFromFormat('U', (string) $value);
}








protected function convertString($value, $addErrors = true)
{
$date = DateTime::createFromFormat($this->format, $value);



$errors = DateTime::getLastErrors();
if ($errors === false) {
return $date;
}

if ($errors['warning_count'] > 0) {
if ($addErrors) {
$this->error(self::FALSEFORMAT);
}
return false;
}

return $date;
}








protected function convertArray(array $value, $addErrors = true)
{
return $this->convertString(implode('-', $value), $addErrors);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use JsonException;

use function gettype;
use function is_float;
use function is_int;
use function is_numeric;
use function is_string;
use function json_decode;
use function str_starts_with;

use const JSON_ERROR_DEPTH;
use const JSON_THROW_ON_ERROR;

/**
@psalm-type
@psalm-import-type
@psalm-type



*/
final class IsJsonString extends AbstractValidator
{
public const ERROR_NOT_STRING = 'errorNotString';
public const ERROR_TYPE_NOT_ALLOWED = 'errorTypeNotAllowed';
public const ERROR_MAX_DEPTH_EXCEEDED = 'errorMaxDepthExceeded';
public const ERROR_INVALID_JSON = 'errorInvalidJson';

public const ALLOW_INT = 0b0000001;
public const ALLOW_FLOAT = 0b0000010;
public const ALLOW_BOOL = 0b0000100;
public const ALLOW_ARRAY = 0b0001000;
public const ALLOW_OBJECT = 0b0010000;
public const ALLOW_ALL = 0b0011111;


protected $messageTemplates = [
self::ERROR_NOT_STRING => 'Expected a string but %type% was received',
self::ERROR_TYPE_NOT_ALLOWED => 'Received a JSON %type% but this type is not acceptable',
self::ERROR_MAX_DEPTH_EXCEEDED => 'The decoded JSON payload exceeds the allowed depth of %maxDepth%',
self::ERROR_INVALID_JSON => 'An invalid JSON payload was received',
];


protected $messageVariables = [
'type' => 'type',
'maxDepth' => 'maxDepth',
];

protected ?string $type = null;

protected int $allow = self::ALLOW_ALL;

protected int $maxDepth = 512;






public function setAllow(int $type): void
{
$this->allow = $type;
}






public function setMaxDepth(int $maxDepth): void
{
$this->maxDepth = $maxDepth;
}

public function isValid(mixed $value): bool
{
if (! is_string($value)) {
$this->error(self::ERROR_NOT_STRING);
$this->type = gettype($value);

return false;
}

if (is_numeric($value)) {
/**
@psalm-var */
$value = json_decode($value);

if (is_int($value) && ! $this->isAllowed(self::ALLOW_INT)) {
$this->error(self::ERROR_TYPE_NOT_ALLOWED);
$this->type = 'int';

return false;
}

if (is_float($value) && ! $this->isAllowed(self::ALLOW_FLOAT)) {
$this->error(self::ERROR_TYPE_NOT_ALLOWED);
$this->type = 'float';

return false;
}

return true;
}

if ($value === 'true' || $value === 'false') {
if (! $this->isAllowed(self::ALLOW_BOOL)) {
$this->error(self::ERROR_TYPE_NOT_ALLOWED);
$this->type = 'boolean';

return false;
}

return true;
}

if (str_starts_with($value, '[') && ! $this->isAllowed(self::ALLOW_ARRAY)) {
$this->error(self::ERROR_TYPE_NOT_ALLOWED);
$this->type = 'array';

return false;
}

if (str_starts_with($value, '{') && ! $this->isAllowed(self::ALLOW_OBJECT)) {
$this->error(self::ERROR_TYPE_NOT_ALLOWED);
$this->type = 'object';

return false;
}

try {
/**
@psalm-suppress */
json_decode($value, true, $this->maxDepth, JSON_THROW_ON_ERROR);

return true;
} catch (JsonException $e) {
if ($e->getCode() === JSON_ERROR_DEPTH) {
$this->error(self::ERROR_MAX_DEPTH_EXCEEDED);

return false;
}

$this->error(self::ERROR_INVALID_JSON);

return false;
}
}


private function isAllowed(int $flag): bool
{
return ($this->allow & $flag) === $flag;
}
}
<?php

namespace Laminas\Validator\Barcode;


class Postnet extends AbstractAdapter
{



public function __construct()
{
$this->setLength([6, 7, 10, 12]);
$this->setCharacters('0123456789');
$this->setChecksum('postnet');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean13 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(13);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;

use function str_split;
use function substr;


class Code39 extends AbstractAdapter
{

protected $check = [
'0' => 0,
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
'8' => 8,
'9' => 9,
'A' => 10,
'B' => 11,
'C' => 12,
'D' => 13,
'E' => 14,
'F' => 15,
'G' => 16,
'H' => 17,
'I' => 18,
'J' => 19,
'K' => 20,
'L' => 21,
'M' => 22,
'N' => 23,
'O' => 24,
'P' => 25,
'Q' => 26,
'R' => 27,
'S' => 28,
'T' => 29,
'U' => 30,
'V' => 31,
'W' => 32,
'X' => 33,
'Y' => 34,
'Z' => 35,
'-' => 36,
'.' => 37,
' ' => 38,
'$' => 39,
'/' => 40,
'+' => 41,
'%' => 42,
];




public function __construct()
{
$this->setLength(-1);
$this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%');
$this->setChecksum('code39');
$this->useChecksum(false);
}







protected function code39($value)
{
$checksum = substr($value, -1, 1);
$value = str_split(substr($value, 0, -1));
$count = 0;
foreach ($value as $char) {
$count += $this->check[$char];
}

$mod = $count % 43;
if ($mod === $this->check[$checksum]) {
return true;
}

return false;
}
}
<?php

namespace Laminas\Validator\Barcode;


class Gtin12 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(12);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Planet extends AbstractAdapter
{



public function __construct()
{
$this->setLength([12, 14]);
$this->setCharacters('0123456789');
$this->setChecksum('postnet');
}
}
<?php

namespace Laminas\Validator\Barcode;

use function strpbrk;
use function substr;


class Codabar extends AbstractAdapter
{



public function __construct()
{
$this->setLength(-1);
$this->setCharacters('0123456789-$:/.+ABCDTN*E');
$this->useChecksum(false);
}









public function hasValidCharacters($value)
{
if (strpbrk($value, 'ABCD') !== false) {
$first = $value[0];
if (strpbrk($first, 'ABCD') === false) {

return false;
}

$last = substr($value, -1, 1);
if (strpbrk($last, 'ABCD') === false) {

return false;
}

$value = substr($value, 1, -1);
} elseif (strpbrk($value, 'TN*E') !== false) {
$first = $value[0];
if (strpbrk($first, 'TN*E') === false) {

return false;
}

$last = substr($value, -1, 1);
if (strpbrk($last, 'TN*E') === false) {

return false;
}

$value = substr($value, 1, -1);
}

$chars = $this->getCharacters();
$this->setCharacters('0123456789-$:/.+');
$result = parent::hasValidCharacters($value);
$this->setCharacters($chars);
return $result;
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean14 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(14);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;

use function strlen;


class Ean8 extends AbstractAdapter
{



public function __construct()
{
$this->setLength([7, 8]);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}







public function hasValidLength($value)
{
if (strlen($value) === 7) {
$this->useChecksum(false);
} else {
$this->useChecksum(true);
}

return parent::hasValidLength($value);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Gtin13 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(13);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;

use function strlen;


class Upce extends AbstractAdapter
{



public function __construct()
{
$this->setLength([6, 7, 8]);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}







public function hasValidLength($value)
{
if (strlen($value) !== 8) {
$this->useChecksum(false);
} else {
$this->useChecksum(true);
}

return parent::hasValidLength($value);
}
}
<?php

namespace Laminas\Validator\Barcode;

use function chr;
use function is_array;
use function is_string;
use function method_exists;
use function str_replace;
use function str_split;
use function strlen;
use function substr;


abstract class AbstractAdapter implements AdapterInterface
{










protected $options = [
'length' => null, 
'characters' => null, 
'checksum' => null, 
'useChecksum' => true, 
];







public function hasValidLength($value)
{
if (! is_string($value)) {
return false;
}

$fixum = strlen($value);
$length = $this->getLength();

if (is_array($length)) {
foreach ($length as $value) {
if ($fixum === $value) {
return true;
}

if ($value === -1) {
return true;
}
}

return false;
}

if ($fixum === $length) {
return true;
}

if ($length === -1) {
return true;
}

if ($length === 'even') {
$count = $fixum % 2;
return 0 === $count;
}

if ($length === 'odd') {
$count = $fixum % 2;
return 1 === $count;
}

return false;
}







public function hasValidCharacters($value)
{
if (! is_string($value)) {
return false;
}

$characters = $this->getCharacters();
if ($characters === 128) {
for ($x = 0; $x < 128; ++$x) {
$value = str_replace(chr($x), '', $value);
}
} else {
$chars = str_split($characters);
foreach ($chars as $char) {
$value = str_replace($char, '', $value);
}
}

if (strlen($value) > 0) {
return false;
}

return true;
}







public function hasValidChecksum($value)
{
$checksum = $this->getChecksum();
if ($checksum !== null) {
if (method_exists($this, $checksum)) {
return $this->$checksum($value);
}
}

return false;
}






public function getLength()
{
return $this->options['length'];
}






public function getCharacters()
{
return $this->options['characters'];
}






public function getChecksum()
{
return $this->options['checksum'];
}







protected function setChecksum($checksum)
{
$this->options['checksum'] = $checksum;
return $this;
}






public function useChecksum($check = null)
{
if ($check === null) {
return $this->options['useChecksum'];
}

$this->options['useChecksum'] = (bool) $check;
return $this;
}







protected function setLength($length)
{
$this->options['length'] = $length;
return $this;
}







protected function setCharacters($characters)
{
$this->options['characters'] = $characters;
return $this;
}








protected function gtin($value)
{
$barcode = substr($value, 0, -1);
$sum = 0;
$length = strlen($barcode) - 1;

for ($i = 0; $i <= $length; $i++) {
if (($i % 2) === 0) {
$sum += $barcode[$length - $i] * 3;
} else {
$sum += $barcode[$length - $i];
}
}

$calc = $sum % 10;
$checksum = $calc === 0 ? 0 : 10 - $calc;

return $value[$length + 1] === (string) $checksum;
}








protected function identcode($value)
{
$barcode = substr($value, 0, -1);
$sum = 0;
$length = strlen($value) - 2;

for ($i = 0; $i <= $length; $i++) {
if (($i % 2) === 0) {
$sum += $barcode[$length - $i] * 4;
} else {
$sum += $barcode[$length - $i] * 9;
}
}

$calc = $sum % 10;
$checksum = $calc === 0 ? 0 : 10 - $calc;

return $value[$length + 1] === (string) $checksum;
}








protected function code25($value)
{
$barcode = substr($value, 0, -1);
$sum = 0;
$length = strlen($barcode) - 1;

for ($i = 0; $i <= $length; $i++) {
if (($i % 2) === 0) {
$sum += $barcode[$i] * 3;
} else {
$sum += $barcode[$i];
}
}

$calc = $sum % 10;
$checksum = $calc === 0 ? 0 : 10 - $calc;

return $value[$length + 1] === (string) $checksum;
}








protected function postnet($value)
{
$checksum = substr($value, -1, 1);
$values = str_split(substr($value, 0, -1));

$check = 0;
foreach ($values as $row) {
$check += $row;
}

$check %= 10;
$check = 10 - $check;

return (string) $check === $checksum;
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean2 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(2);
$this->setCharacters('0123456789');
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean12 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(12);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Code25 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(-1);
$this->setCharacters('0123456789');
$this->setChecksum('code25');
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean5 extends AbstractAdapter
{





public function __construct()
{
$this->setLength(5);
$this->setCharacters('0123456789');
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Code93ext extends AbstractAdapter
{



public function __construct()
{
$this->setLength(-1);
$this->setCharacters(128);
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Code25interleaved extends AbstractAdapter
{





public function __construct()
{
$this->setLength('even');
$this->setCharacters('0123456789');
$this->setChecksum('code25');
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;

use Laminas\Stdlib\StringUtils;
use Laminas\Stdlib\StringWrapper\StringWrapperInterface;
use Laminas\Validator\Exception;

use function chr;
use function is_string;
use function ord;


class Code128 extends AbstractAdapter
{





protected $utf8StringWrapper;




public function __construct()
{
$this->setLength(-1);
$this->setCharacters([
'A' => [
0 => ' ',
1 => '!',
2 => '"',
3 => '#',
4 => '$',
5 => '%',
6 => '&',
7 => "'",
8 => '(',
9 => ')',
10 => '*',
11 => '+',
12 => ',',
13 => '-',
14 => '.',
15 => '/',
16 => '0',
17 => '1',
18 => '2',
19 => '3',
20 => '4',
21 => '5',
22 => '6',
23 => '7',
24 => '8',
25 => '9',
26 => ':',
27 => ';',
28 => '<',
29 => '=',
30 => '>',
31 => '?',
32 => '@',
33 => 'A',
34 => 'B',
35 => 'C',
36 => 'D',
37 => 'E',
38 => 'F',
39 => 'G',
40 => 'H',
41 => 'I',
42 => 'J',
43 => 'K',
44 => 'L',
45 => 'M',
46 => 'N',
47 => 'O',
48 => 'P',
49 => 'Q',
50 => 'R',
51 => 'S',
52 => 'T',
53 => 'U',
54 => 'V',
55 => 'W',
56 => 'X',
57 => 'Y',
58 => 'Z',
59 => '[',
60 => '\\',
61 => ']',
62 => '^',
63 => '_',
64 => 0x00,
65 => 0x01,
66 => 0x02,
67 => 0x03,
68 => 0x04,
69 => 0x05,
70 => 0x06,
71 => 0x07,
72 => 0x08,
73 => 0x09,
74 => 0x0A,
75 => 0x0B,
76 => 0x0C,
77 => 0x0D,
78 => 0x0E,
79 => 0x0F,
80 => 0x10,
81 => 0x11,
82 => 0x12,
83 => 0x13,
84 => 0x14,
85 => 0x15,
86 => 0x16,
87 => 0x17,
88 => 0x18,
89 => 0x19,
90 => 0x1A,
91 => 0x1B,
92 => 0x1C,
93 => 0x1D,
94 => 0x1E,
95 => 0x1F,
96 => 'Ç',
97 => 'ü',
98 => 'é',
99 => 'â',
100 => 'ä',
101 => 'à',
102 => 'å',
103 => '‡',
104 => 'ˆ',
105 => '‰',
106 => 'Š',
],
'B' => [
0 => ' ',
1 => '!',
2 => '"',
3 => '#',
4 => '$',
5 => '%',
6 => '&',
7 => "'",
8 => '(',
9 => ')',
10 => '*',
11 => '+',
12 => ',',
13 => '-',
14 => '.',
15 => '/',
16 => '0',
17 => '1',
18 => '2',
19 => '3',
20 => '4',
21 => '5',
22 => '6',
23 => '7',
24 => '8',
25 => '9',
26 => ':',
27 => ';',
28 => '<',
29 => '=',
30 => '>',
31 => '?',
32 => '@',
33 => 'A',
34 => 'B',
35 => 'C',
36 => 'D',
37 => 'E',
38 => 'F',
39 => 'G',
40 => 'H',
41 => 'I',
42 => 'J',
43 => 'K',
44 => 'L',
45 => 'M',
46 => 'N',
47 => 'O',
48 => 'P',
49 => 'Q',
50 => 'R',
51 => 'S',
52 => 'T',
53 => 'U',
54 => 'V',
55 => 'W',
56 => 'X',
57 => 'Y',
58 => 'Z',
59 => '[',
60 => '\\',
61 => ']',
62 => '^',
63 => '_',
64 => '`',
65 => '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',
91 => '{',
92 => '|',
93 => '}',
94 => '~',
95 => 0x7F,
96 => 'Ç',
97 => 'ü',
98 => 'é',
99 => 'â',
100 => 'ä',
101 => 'à',
102 => 'å',
103 => '‡',
104 => 'ˆ',
105 => '‰',
106 => 'Š',
],
'C' => [
0 => '00',
1 => '01',
2 => '02',
3 => '03',
4 => '04',
5 => '05',
6 => '06',
7 => '07',
8 => '08',
9 => '09',
10 => '10',
11 => '11',
12 => '12',
13 => '13',
14 => '14',
15 => '15',
16 => '16',
17 => '17',
18 => '18',
19 => '19',
20 => '20',
21 => '21',
22 => '22',
23 => '23',
24 => '24',
25 => '25',
26 => '26',
27 => '27',
28 => '28',
29 => '29',
30 => '30',
31 => '31',
32 => '32',
33 => '33',
34 => '34',
35 => '35',
36 => '36',
37 => '37',
38 => '38',
39 => '39',
40 => '40',
41 => '41',
42 => '42',
43 => '43',
44 => '44',
45 => '45',
46 => '46',
47 => '47',
48 => '48',
49 => '49',
50 => '50',
51 => '51',
52 => '52',
53 => '53',
54 => '54',
55 => '55',
56 => '56',
57 => '57',
58 => '58',
59 => '59',
60 => '60',
61 => '61',
62 => '62',
63 => '63',
64 => '64',
65 => '65',
66 => '66',
67 => '67',
68 => '68',
69 => '69',
70 => '70',
71 => '71',
72 => '72',
73 => '73',
74 => '74',
75 => '75',
76 => '76',
77 => '77',
78 => '78',
79 => '79',
80 => '80',
81 => '81',
82 => '82',
83 => '83',
84 => '84',
85 => '85',
86 => '86',
87 => '87',
88 => '88',
89 => '89',
90 => '90',
91 => '91',
92 => '92',
93 => '93',
94 => '94',
95 => '95',
96 => '96',
97 => '97',
98 => '98',
99 => '99',
100 => 'ä',
101 => 'à',
102 => 'å',
103 => '‡',
104 => 'ˆ',
105 => '‰',
106 => 'Š',
],
]);
$this->setChecksum('code128');
}






public function setUtf8StringWrapper(StringWrapperInterface $utf8StringWrapper)
{
if (! $utf8StringWrapper->isSupported('UTF-8')) {
throw new Exception\InvalidArgumentException(
'The string wrapper needs to support UTF-8 character encoding'
);
}
$this->utf8StringWrapper = $utf8StringWrapper;
}








public function getUtf8StringWrapper()
{
if (! $this->utf8StringWrapper) {
$this->utf8StringWrapper = StringUtils::getWrapper('UTF-8');
}
return $this->utf8StringWrapper;
}







public function hasValidCharacters($value)
{
if (! is_string($value)) {
return false;
}


$strWrapper = $this->getUtf8StringWrapper();


$set = $this->getCodingSet($value);
$read = $set;
if ($set !== '') {
$value = $strWrapper->substr($value, 1, null);
}


while ($value !== '' && $value !== false) {
$char = $strWrapper->substr($value, 0, 1);

switch ($char) {

case 'Ç':
case 'ü':
case 'å':
break;


case 'é':
if ($set === 'A') {
$read = 'B';
break;
}

if ($set === 'B') {
$read = 'A';
break;
}

break;


case 'â':
$set = 'C';
$read = 'C';
break;


case 'ä':
$set = 'B';
$read = 'B';
break;


case 'à':
$set = 'A';
$read = 'A';
break;


case '‡':
case 'ˆ':
case '‰':
return false;


case 'Š':
break 2;

default:

if ($this->ord128($char, $read) === -1) {
return false;
}

break;
}

$value = $strWrapper->substr($value, 1, null);
$read = $set;
}

if ($value !== '' && is_string($value) && $strWrapper->strlen($value) !== 1) {
return false;
}

return true;
}







protected function code128($value)
{
$sum = 0;
$pos = 1;
$set = $this->getCodingSet($value);
$read = $set;
$usecheck = $this->useChecksum(null);
$strWrapper = $this->getUtf8StringWrapper();
$char = $strWrapper->substr($value, 0, 1);
if ($char === '‡') {
$sum = 103;
} elseif ($char === 'ˆ') {
$sum = 104;
} elseif ($char === '‰') {
$sum = 105;
} elseif ($usecheck === true) {

return false;
}

$value = $strWrapper->substr($value, 1, null);
while ($strWrapper->strpos((string) $value, 'Š') !== false || ((string) $value !== '')) {
$char = $strWrapper->substr($value, 0, 1);
if ($read === 'C') {
$char = $strWrapper->substr($value, 0, 2);
}

switch ($char) {

case 'Ç':
case 'ü':
case 'å':
$sum += $pos * $this->ord128($char, $set);
break;

case 'é':
$sum += $pos * $this->ord128($char, $set);

if ($set === 'A') {
$read = 'B';
break;
}

if ($set === 'B') {
$read = 'A';
break;
}

break;


case 'â':
$sum += $pos * $this->ord128($char, $set);
$set = 'C';
$read = 'C';
break;


case 'ä':
$sum += $pos * $this->ord128($char, $set);
$set = 'B';
$read = 'B';
break;


case 'à':
$sum += $pos * $this->ord128($char, $set);
$set = 'A';
$read = 'A';
break;

case '‡':
case 'ˆ':
case '‰':
return false;

default:

if ($this->ord128($char, $read) === -1) {
return false;
}

$sum += $pos * $this->ord128($char, $set);
break;
}

$value = $strWrapper->substr($value, 1);
++$pos;
if (($strWrapper->strpos($value, 'Š') === 1) && ($strWrapper->strlen($value) === 2)) {

break;
}
$read = $set;
}

if (($strWrapper->strpos($value, 'Š') !== 1) || ($strWrapper->strlen($value) !== 2)) {

return ! $usecheck;
}

$mod = $sum % 103;
if ($strWrapper->substr($value, 0, 1) === $this->chr128($mod, $set)) {
return true;
}

return false;
}







protected function getCodingSet($value)
{
$value = $this->getUtf8StringWrapper()->substr($value, 0, 1);
return match ($value) {
'‡' => 'A',
'ˆ' => 'B',
'‰' => 'C',
default => '',
};
}























protected function ord128($value, $set)
{
$ord = ord($value[0]);
if ($set === 'A') {
if ($ord < 32) {
return $ord + 64;
} elseif ($ord < 96) {
return $ord - 32;
} elseif ($ord > 138) {
return -1;
} else {
return $ord - 32;
}
} elseif ($set === 'B') {
if ($ord < 32) {
return -1;
} elseif ($ord <= 138) {
return $ord - 32;
} else {
return -1;
}
} elseif ($set === 'C') {
$val = (int) $value;
if (($val >= 0) && ($val <= 99)) {
return $val;
} elseif (($ord >= 132) && ($ord <= 138)) {
return $ord - 32;
} else {
return -1;
}
} else {
if ($ord < 32) {
return $ord + 64;
} elseif ($ord <= 138) {
return $ord - 32;
} else {
return -1;
}
}
}























protected function chr128($value, $set)
{
if ($set === 'A') {
if ($value < 64) {
return chr($value + 32);
} elseif ($value < 96) {
return chr($value - 64);
} elseif ($value > 106) {
return -1;
} else {
return chr($value + 32);
}
} elseif ($set === 'B') {
if ($value > 106) {
return -1;
} else {
return chr($value + 32);
}
} elseif ($set === 'C') {
if (($value >= 0) && ($value <= 9)) {
return '0' . (string) $value;
} elseif ($value <= 99) {
return (string) $value;
} elseif ($value <= 106) {
return chr($value + 32);
} else {
return -1;
}
} else {
if ($value <= 106) {
return $value + 32;
} else {
return -1;
}
}
}
}
<?php

namespace Laminas\Validator\Barcode;


class Identcode extends AbstractAdapter
{





protected $length = 12;






protected $characters = '0123456789';






protected $checksum = 'identcode';




public function __construct()
{
$this->setLength(12);
$this->setCharacters('0123456789');
$this->setChecksum('identcode');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Leitcode extends AbstractAdapter
{



public function __construct()
{
$this->setLength(14);
$this->setCharacters('0123456789');
$this->setChecksum('identcode');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Ean18 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(18);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;

interface AdapterInterface
{






public function hasValidLength($value);







public function hasValidCharacters($value);







public function hasValidChecksum($value);






public function getLength();








public function getCharacters();








public function getChecksum();

/**
@psalm-return($check is null ? bool : static)






*/
public function useChecksum($check = null);
}
<?php

namespace Laminas\Validator\Barcode;


class Intelligentmail extends AbstractAdapter
{





public function __construct()
{
$this->setLength([20, 25, 29, 31]);
$this->setCharacters('0123456789');
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;


class Code39ext extends AbstractAdapter
{



public function __construct()
{
$this->setLength(-1);
$this->setCharacters(128);
$this->useChecksum(false);
}
}
<?php

namespace Laminas\Validator\Barcode;

use function str_contains;
use function str_split;
use function strlen;
use function substr;


class Issn extends AbstractAdapter
{



public function __construct()
{
$this->setLength([8, 13]);
$this->setCharacters('0123456789X');
$this->setChecksum('gtin');
}







public function hasValidCharacters($value)
{
if (strlen($value) !== 8) {
if (str_contains($value, 'X')) {
return false;
}
}

return parent::hasValidCharacters($value);
}







public function hasValidChecksum($value)
{
if (strlen($value) === 8) {
$this->setChecksum('issn');
} else {
$this->setChecksum('gtin');
}

return parent::hasValidChecksum($value);
}








protected function issn($value)
{
$checksum = substr($value, -1, 1);
$values = str_split(substr($value, 0, -1));
$check = 0;
$multi = 8;
foreach ($values as $token) {
if ($token === 'X') {
$token = 10;
}

$check += $token * $multi;
--$multi;
}

$check %= 11;
$check = $check === 0 ? 0 : 11 - $check;

if ((string) $check === $checksum) {
return true;
}

if (($check === 10) && ($checksum === 'X')) {
return true;
}

return false;
}
}
<?php

namespace Laminas\Validator\Barcode;

use function array_search;
use function count;
use function str_split;
use function substr;


class Code93 extends AbstractAdapter
{





protected $check = [
'0' => 0,
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
'8' => 8,
'9' => 9,
'A' => 10,
'B' => 11,
'C' => 12,
'D' => 13,
'E' => 14,
'F' => 15,
'G' => 16,
'H' => 17,
'I' => 18,
'J' => 19,
'K' => 20,
'L' => 21,
'M' => 22,
'N' => 23,
'O' => 24,
'P' => 25,
'Q' => 26,
'R' => 27,
'S' => 28,
'T' => 29,
'U' => 30,
'V' => 31,
'W' => 32,
'X' => 33,
'Y' => 34,
'Z' => 35,
'-' => 36,
'.' => 37,
' ' => 38,
'$' => 39,
'/' => 40,
'+' => 41,
'%' => 42,
'!' => 43,
'"' => 44,
'§' => 45,
'&' => 46,
];




public function __construct()
{
$this->setLength(-1);
$this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ -.$/+%');
$this->setChecksum('code93');
$this->useChecksum(false);
}







protected function code93($value)
{
$checksum = substr($value, -2, 2);
$value = str_split(substr($value, 0, -2));
$count = 0;
$length = count($value) % 20;
foreach ($value as $char) {
if ($length === 0) {
$length = 20;
}

$count += $this->check[$char] * $length;
--$length;
}

$check = array_search($count % 47, $this->check);
$value[] = $check;
$count = 0;
$length = count($value) % 15;
foreach ($value as $char) {
if ($length === 0) {
$length = 15;
}

$count += $this->check[$char] * $length;
--$length;
}
$check .= array_search($count % 47, $this->check);

if ($check === $checksum) {
return true;
}

return false;
}
}
<?php

namespace Laminas\Validator\Barcode;


class Sscc extends AbstractAdapter
{



public function __construct()
{
$this->setLength(18);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Gtin14 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(14);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Upca extends AbstractAdapter
{



public function __construct()
{
$this->setLength(12);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;


class Itf14 extends AbstractAdapter
{



public function __construct()
{
$this->setLength(14);
$this->setCharacters('0123456789');
$this->setChecksum('gtin');
}
}
<?php

namespace Laminas\Validator\Barcode;

use function array_intersect;
use function array_keys;
use function current;
use function str_split;
use function strlen;
use function substr;


class Royalmail extends AbstractAdapter
{

protected $rows = [
'0' => 1,
'1' => 1,
'2' => 1,
'3' => 1,
'4' => 1,
'5' => 1,
'6' => 2,
'7' => 2,
'8' => 2,
'9' => 2,
'A' => 2,
'B' => 2,
'C' => 3,
'D' => 3,
'E' => 3,
'F' => 3,
'G' => 3,
'H' => 3,
'I' => 4,
'J' => 4,
'K' => 4,
'L' => 4,
'M' => 4,
'N' => 4,
'O' => 5,
'P' => 5,
'Q' => 5,
'R' => 5,
'S' => 5,
'T' => 5,
'U' => 0,
'V' => 0,
'W' => 0,
'X' => 0,
'Y' => 0,
'Z' => 0,
];


protected $columns = [
'0' => 1,
'1' => 2,
'2' => 3,
'3' => 4,
'4' => 5,
'5' => 0,
'6' => 1,
'7' => 2,
'8' => 3,
'9' => 4,
'A' => 5,
'B' => 0,
'C' => 1,
'D' => 2,
'E' => 3,
'F' => 4,
'G' => 5,
'H' => 0,
'I' => 1,
'J' => 2,
'K' => 3,
'L' => 4,
'M' => 5,
'N' => 0,
'O' => 1,
'P' => 2,
'Q' => 3,
'R' => 4,
'S' => 5,
'T' => 0,
'U' => 1,
'V' => 2,
'W' => 3,
'X' => 4,
'Y' => 5,
'Z' => 0,
];




public function __construct()
{
$this->setLength(-1);
$this->setCharacters('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
$this->setChecksum('royalmail');
}







protected function royalmail($value)
{
$checksum = substr($value, -1, 1);
$values = str_split(substr($value, 0, -1));
$rowvalue = 0;
$colvalue = 0;
foreach ($values as $row) {
$rowvalue += $this->rows[$row];
$colvalue += $this->columns[$row];
}

$rowvalue %= 6;
$colvalue %= 6;

$rowchkvalue = array_keys($this->rows, $rowvalue);
$colchkvalue = array_keys($this->columns, $colvalue);
$intersect = array_intersect($rowchkvalue, $colchkvalue);
$chkvalue = (string) current($intersect);

if ($chkvalue === $checksum) {
return true;
}

return false;
}







public function hasValidCharacters($value)
{
if ($value[0] === '(') {
$value = substr($value, 1);

if ($value[strlen($value) - 1] === ')') {
$value = substr($value, 0, -1);
} else {
return false;
}
}

return parent::hasValidCharacters($value);
}
}
<?php

namespace Laminas\Validator;

use Laminas\Session\Container as SessionContainer;
use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function explode;
use function is_array;
use function is_string;
use function md5;
use function random_bytes;
use function sprintf;
use function str_replace;
use function strtolower;
use function strtr;







class Csrf extends AbstractValidator
{
/**
@const


*/
public const NOT_SAME = 'notSame';






protected $messageTemplates = [
self::NOT_SAME => 'The form submitted did not originate from the expected site',
];






protected $hash;







protected static $hashCache;






protected $name = 'csrf';






protected $salt = 'salt';


protected $session;






protected $timeout = 300;






public function __construct($options = [])
{
parent::__construct($options);

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if (! is_array($options)) {
$options = (array) $options;
}

foreach ($options as $key => $value) {
switch (strtolower($key)) {
case 'name':
$this->setName($value);
break;
case 'salt':
$this->setSalt($value);
break;
case 'session':
$this->setSession($value);
break;
case 'timeout':
$this->setTimeout($value);
break;
default:

break;
}
}
}








public function isValid($value, $context = null)
{
if (! is_string($value)) {
return false;
}

$this->setValue($value);

$tokenId = $this->getTokenIdFromHash($value);
$hash = $this->getValidationToken($tokenId);

$tokenFromValue = $this->getTokenFromHash($value);
$tokenFromHash = $this->getTokenFromHash($hash);

if ($tokenFromValue === null || $tokenFromHash === null || ($tokenFromValue !== $tokenFromHash)) {
$this->error(self::NOT_SAME);
return false;
}

return true;
}







public function setName($name)
{
$this->name = (string) $name;
return $this;
}






public function getName()
{
return $this->name;
}






public function setSession(SessionContainer $session)
{
$this->session = $session;
if ($this->hash) {
$this->initCsrfToken();
}
return $this;
}








public function getSession()
{
if (null === $this->session) {

$this->session = new SessionContainer($this->getSessionName());
}
return $this->session;
}







public function setSalt($salt)
{
$this->salt = (string) $salt;
return $this;
}






public function getSalt()
{
return $this->salt;
}










public function getHash($regenerate = false)
{
if ((null === $this->hash) || $regenerate) {
$this->generateHash();
}
return $this->hash;
}








public function getSessionName()
{
return str_replace('\\', '_', self::class) . '_'
. $this->getSalt() . '_'
. strtr($this->getName(), ['[' => '_', ']' => '']);
}







public function setTimeout($ttl)
{
$this->timeout = $ttl !== null ? (int) $ttl : null;
return $this;
}






public function getTimeout()
{
return $this->timeout;
}






protected function initCsrfToken()
{
$session = $this->getSession();
$timeout = $this->getTimeout();
if (null !== $timeout) {
$session->setExpirationSeconds($timeout);
}

$hash = $this->getHash();
$token = $this->getTokenFromHash($hash);
$tokenId = $this->getTokenIdFromHash($hash);

if (! $session->tokenList) {
$session->tokenList = [];
}
$session->tokenList[$tokenId] = $token;
$session->hash = $hash; 
}









protected function generateHash()
{
$token = md5($this->getSalt() . random_bytes(32) . $this->getName());

$this->hash = $this->formatHash($token, $this->generateTokenId());

$this->setValue($this->hash);
$this->initCsrfToken();
}




protected function generateTokenId()
{
return md5(random_bytes(32));
}









protected function getValidationToken($tokenId = null)
{
$session = $this->getSession();






if ($tokenId === null && isset($session->hash)) {
return $session->hash;
}

if ($tokenId !== null && isset($session->tokenList[$tokenId])) {
return $this->formatHash($session->tokenList[$tokenId], $tokenId);
}

return null;
}




protected function formatHash(string $token, string $tokenId)
{
return sprintf('%s-%s', $token, $tokenId);
}

protected function getTokenFromHash(?string $hash): ?string
{
if (null === $hash) {
return null;
}

$data = explode('-', $hash);
return $data[0] ?: null;
}

protected function getTokenIdFromHash(string $hash): ?string
{
$data = explode('-', $hash);

if (! isset($data[1])) {
return null;
}

return $data[1];
}
}
<?php 

namespace Laminas\Validator;

use Traversable;

use function array_shift;
use function func_get_args;
use function is_array;
use function iterator_to_array;


class Bitwise extends AbstractValidator
{
public const OP_AND = 'and';
public const OP_XOR = 'xor';

public const NOT_AND = 'notAnd';
public const NOT_AND_STRICT = 'notAndStrict';
public const NOT_XOR = 'notXor';
public const NO_OP = 'noOp';


protected $control;






protected $messageTemplates = [
self::NOT_AND => "The input has no common bit set with '%control%'",
self::NOT_AND_STRICT => "The input doesn't have the same bits set as '%control%'",
self::NOT_XOR => "The input has common bit set with '%control%'",
self::NO_OP => "No operator was present to compare '%control%' against",
];






protected $messageVariables = [
'control' => 'control',
];


protected $operator;


protected $strict = false;










public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = iterator_to_array($options);
}

if (! is_array($options)) {
$options = func_get_args();

$temp['control'] = array_shift($options);

if (! empty($options)) {
$temp['operator'] = array_shift($options);
}

if (! empty($options)) {
$temp['strict'] = array_shift($options);
}

$options = $temp;
}

parent::__construct($options);
}








public function getControl()
{
return $this->control;
}








public function getOperator()
{
return $this->operator;
}








public function getStrict()
{
return $this->strict;
}








public function isValid($value)
{
$this->setValue($value);

if (self::OP_AND === $this->operator) {
if ($this->strict) {

$result = ($this->control & $value) === $value;

if (! $result) {
$this->error(self::NOT_AND_STRICT);
}

return $result;
}


$result = (bool) ($this->control & $value);

if (! $result) {
$this->error(self::NOT_AND);
}

return $result;
}

if (self::OP_XOR === $this->operator) {


$result = ($this->control ^ $value) === ($this->control | $value);

if (! $result) {
$this->error(self::NOT_XOR);
}

return $result;
}

$this->error(self::NO_OP);
return false;
}









public function setControl($control)
{
$this->control = (int) $control;

return $this;
}









public function setOperator($operator)
{
$this->operator = $operator;

return $this;
}









public function setStrict($strict)
{
$this->strict = (bool) $strict;

return $this;
}
}
<?php

namespace Laminas\Validator;

use Laminas\ServiceManager\ServiceManager;

use function array_values;
use function method_exists;







class StaticValidator
{

protected static $plugins;






public static function setPluginManager(?ValidatorPluginManager $plugins = null)
{

if ($plugins instanceof ValidatorPluginManager) {

if (method_exists($plugins, 'configure')) {
$plugins->configure(['shared_by_default' => false]);
} else {
$plugins->setShareByDefault(false);
}
}
static::$plugins = $plugins;
}






public static function getPluginManager()
{
if (! static::$plugins instanceof ValidatorPluginManager) {
$plugins = new ValidatorPluginManager(new ServiceManager());
static::setPluginManager($plugins);

return $plugins;
}
return static::$plugins;
}








public static function execute(mixed $value, $classBaseName, array $options = [])
{
if ($options && array_values($options) === $options) {
throw new Exception\InvalidArgumentException(
'Invalid options provided via $options argument; must be an associative array'
);
}

$plugins = static::getPluginManager();
$validator = $plugins->get($classBaseName, $options);

return $validator->isValid($value);
}
}
<?php

namespace Laminas\Validator;

use ArrayAccess;
use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function get_debug_type;
use function is_array;
use function is_int;
use function is_string;
use function key;
use function sprintf;
use function var_export;


class Identical extends AbstractValidator
{
/**
@const


*/
public const NOT_SAME = 'notSame';
public const MISSING_TOKEN = 'missingToken';






protected $messageTemplates = [
self::NOT_SAME => 'The two given tokens do not match',
self::MISSING_TOKEN => 'No token was provided to match against',
];


protected $messageVariables = [
'token' => 'tokenString',
];






protected $tokenString;


protected $token;


protected $strict = true;


protected $literal = false;






public function __construct($token = null)
{
if ($token instanceof Traversable) {
$token = ArrayUtils::iteratorToArray($token);
}

if (is_array($token) && array_key_exists('token', $token)) {
if (array_key_exists('strict', $token)) {
$this->setStrict($token['strict']);
}

if (array_key_exists('literal', $token)) {
$this->setLiteral($token['literal']);
}

$this->setToken($token['token']);
} elseif (null !== $token) {
$this->setToken($token);
}

parent::__construct(is_array($token) ? $token : null);
}








public function getToken()
{
return $this->token;
}








public function setToken(mixed $token)
{
$this->tokenString = is_array($token) ? var_export($token, true) : (string) $token;
$this->token = $token;
return $this;
}








public function getStrict()
{
return $this->strict;
}









public function setStrict($strict)
{
$this->strict = (bool) $strict;
return $this;
}








public function getLiteral()
{
return $this->literal;
}









public function setLiteral($literal)
{
$this->literal = (bool) $literal;
return $this;
}










public function isValid($value, $context = null)
{
$this->setValue($value);

$token = $this->getToken();

if (! $this->getLiteral() && $context !== null) {
if (! is_array($context) && ! $context instanceof ArrayAccess) {
throw new Exception\InvalidArgumentException(sprintf(
'Context passed to %s must be array, ArrayObject or null; received "%s"',
__METHOD__,
get_debug_type($context)
));
}

if (is_array($token)) {
while (is_array($token)) {
$key = key($token);
if (! isset($context[$key])) {
break;
}
$context = $context[$key];
$token = $token[$key];
}
}



if (
is_array($token)
|| (! is_int($token) && ! is_string($token))
|| ! isset($context[$token])
) {
$token = $this->getToken();
} else {
$token = $context[$token];
}
}

if ($token === null) {
$this->error(self::MISSING_TOKEN);
return false;
}

$strict = $this->getStrict();
if (
($strict && ($value !== $token))

|| (! $strict && ($value != $token))
) {
$this->error(self::NOT_SAME);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Traversable;

use function array_shift;
use function floor;
use function func_get_args;
use function is_array;
use function is_numeric;
use function iterator_to_array;
use function round;
use function strlen;
use function strpos;
use function substr;


class Step extends AbstractValidator
{
public const INVALID = 'typeInvalid';
public const NOT_STEP = 'stepInvalid';


protected $messageTemplates = [
self::INVALID => 'Invalid value given. Scalar expected',
self::NOT_STEP => 'The input is not a valid step',
];


protected $baseValue = 0;


protected $step = 1;






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = iterator_to_array($options);
} elseif (! is_array($options)) {
$options = func_get_args();
$temp['baseValue'] = array_shift($options);
if (! empty($options)) {
$temp['step'] = array_shift($options);
}

$options = $temp;
}

if (isset($options['baseValue'])) {
$this->setBaseValue($options['baseValue']);
}
if (isset($options['step'])) {
$this->setStep($options['step']);
}

parent::__construct($options);
}









public function setBaseValue(mixed $baseValue)
{
$this->baseValue = $baseValue;
return $this;
}








public function getBaseValue()
{
return $this->baseValue;
}









public function setStep(mixed $step)
{
$this->step = (float) $step;
return $this;
}








public function getStep()
{
return $this->step;
}







public function isValid($value)
{
if (! is_numeric($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

$substract = $this->sub($value, $this->baseValue);

$fmod = $this->fmod($substract, $this->step);

if ($fmod !== 0.0 && $fmod !== $this->step) {
$this->error(self::NOT_STEP);
return false;
}

return true;
}








protected function fmod($x, $y)
{
if ($y === 0.0 || $y === 0) {
return 1.0;
}


$precision = $this->getPrecision($x) + $this->getPrecision($y);

return round($x - $y * floor($x / $y), $precision);
}








private function sub($x, $y)
{
$precision = $this->getPrecision($x) + $this->getPrecision($y);
return round($x - $y, $precision);
}




private function getPrecision($float): int
{
$position = strpos((string) $float, '.');
$segment = $position === false
? null
: substr((string) $float, $position + 1);

return $segment !== null ? strlen($segment) : 0;
}
}
<?php

namespace Laminas\Validator;

use function is_string;
use function preg_match;




final class Uuid extends AbstractValidator
{



public const REGEX_UUID = '/^[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}$/';

public const INVALID = 'valueNotUuid';
public const NOT_STRING = 'valueNotString';


protected $messageTemplates = [
self::NOT_STRING => 'Invalid type given; string expected',
self::INVALID => 'Invalid UUID format',
];












public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::NOT_STRING);
return false;
}

$this->setValue($value);

if (
empty($value)
|| $value !== '00000000-0000-0000-0000-000000000000'
&& ! preg_match(self::REGEX_UUID, $value)
) {
$this->error(self::INVALID);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Laminas\ModuleManager\ModuleManager;

class Module
{
/**
@psalm-return



*/
public function getConfig()
{
$provider = new ConfigProvider();

return [
'service_manager' => $provider->getDependencyConfig(),
];
}









public function init($moduleManager)
{
$event = $moduleManager->getEvent();
$container = $event->getParam('ServiceManager');
$serviceListener = $container->get('ServiceListener');

$serviceListener->addServiceManager(
'ValidatorManager',
'validators',
ValidatorProviderInterface::class,
'getValidatorConfig'
);
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Laminas\Stdlib\ErrorHandler;
use Traversable;

use function array_key_exists;
use function is_array;
use function is_float;
use function is_int;
use function is_string;
use function preg_match;


class Regex extends AbstractValidator
{
public const INVALID = 'regexInvalid';
public const NOT_MATCH = 'regexNotMatch';



public const ERROROUS = 'regexErrorous';


protected $messageTemplates = [
self::INVALID => 'Invalid type given. String, integer or float expected',
self::NOT_MATCH => "The input does not match against pattern '%pattern%'",
self::ERROROUS => "There was an internal error while using the pattern '%pattern%'",
];


protected $messageVariables = [
'pattern' => 'pattern',
];






protected $pattern;







public function __construct($pattern)
{
if (is_string($pattern)) {
$this->setPattern($pattern);
parent::__construct([]);
return;
}

if ($pattern instanceof Traversable) {
$pattern = ArrayUtils::iteratorToArray($pattern);
}

if (! is_array($pattern)) {
throw new Exception\InvalidArgumentException('Invalid options provided to constructor');
}

if (! array_key_exists('pattern', $pattern) || ! is_string($pattern['pattern']) || $pattern['pattern'] === '') {
throw new Exception\InvalidArgumentException("Missing option 'pattern'");
}

$this->setPattern($pattern['pattern']);
unset($pattern['pattern']);
parent::__construct($pattern);
}








public function getPattern()
{
return $this->pattern;
}










public function setPattern($pattern)
{
ErrorHandler::start();
$this->pattern = (string) $pattern;
$status = preg_match($this->pattern, 'Test');
$error = ErrorHandler::stop();

if (false === $status) {
throw new Exception\InvalidArgumentException(
"Internal error parsing the pattern '{$this->pattern}'",
0,
$error
);
}

return $this;
}







public function isValid($value)
{
if (! is_string($value) && ! is_int($value) && ! is_float($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

ErrorHandler::start();
$status = preg_match($this->pattern, (string) $value);
ErrorHandler::stop();
if (false === $status) {
$this->error(self::ERROROUS);
return false;
}

if (! $status) {
$this->error(self::NOT_MATCH);
return false;
}

return true;
}
}
<?php 

namespace Laminas\Validator;

use Laminas\Stdlib\StringUtils;

use function array_key_exists;
use function array_pop;
use function array_shift;
use function chr;
use function count;
use function end;
use function explode;
use function func_get_args;
use function implode;
use function in_array;
use function intval;
use function is_array;
use function is_string;
use function ord;
use function preg_match;
use function prev;
use function reset;
use function str_contains;
use function str_ends_with;
use function str_starts_with;
use function strlen;
use function strrpos;
use function strtolower;
use function strtoupper;
use function substr;

/**
@psalm-type















*/
class Hostname extends AbstractValidator
{
public const CANNOT_DECODE_PUNYCODE = 'hostnameCannotDecodePunycode';
public const INVALID = 'hostnameInvalid';
public const INVALID_DASH = 'hostnameDashCharacter';
public const INVALID_HOSTNAME = 'hostnameInvalidHostname';
public const INVALID_HOSTNAME_SCHEMA = 'hostnameInvalidHostnameSchema';
public const INVALID_LOCAL_NAME = 'hostnameInvalidLocalName';
public const INVALID_URI = 'hostnameInvalidUri';
public const IP_ADDRESS_NOT_ALLOWED = 'hostnameIpAddressNotAllowed';
public const LOCAL_NAME_NOT_ALLOWED = 'hostnameLocalNameNotAllowed';
public const UNDECIPHERABLE_TLD = 'hostnameUndecipherableTld';
public const UNKNOWN_TLD = 'hostnameUnknownTld';


protected $messageTemplates = [
self::CANNOT_DECODE_PUNYCODE => "The input appears to be a DNS hostname but the given punycode notation cannot be decoded",
self::INVALID => "Invalid type given. String expected",
self::INVALID_DASH => "The input appears to be a DNS hostname but contains a dash in an invalid position",
self::INVALID_HOSTNAME => "The input does not match the expected structure for a DNS hostname",
self::INVALID_HOSTNAME_SCHEMA => "The input appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'",
self::INVALID_LOCAL_NAME => "The input does not appear to be a valid local network name",
self::INVALID_URI => "The input does not appear to be a valid URI hostname",
self::IP_ADDRESS_NOT_ALLOWED => "The input appears to be an IP address, but IP addresses are not allowed",
self::LOCAL_NAME_NOT_ALLOWED => "The input appears to be a local network name but local network names are not allowed",
self::UNDECIPHERABLE_TLD => "The input appears to be a DNS hostname but cannot extract TLD part",
self::UNKNOWN_TLD => "The input appears to be a DNS hostname but cannot match TLD against known list",
];


protected $messageVariables = [
'tld' => 'tld',
];

public const ALLOW_DNS = 1; 
public const ALLOW_IP = 2; 
public const ALLOW_LOCAL = 4; 
public const ALLOW_URI = 8; 
public const ALLOW_ALL = 15; 









protected $validTlds = [
'aaa',
'aarp',
'abb',
'abbott',
'abbvie',
'abc',
'able',
'abogado',
'abudhabi',
'ac',
'academy',
'accenture',
'accountant',
'accountants',
'aco',
'actor',
'ad',
'ads',
'adult',
'ae',
'aeg',
'aero',
'aetna',
'af',
'afl',
'africa',
'ag',
'agakhan',
'agency',
'ai',
'aig',
'airbus',
'airforce',
'airtel',
'akdn',
'al',
'alibaba',
'alipay',
'allfinanz',
'allstate',
'ally',
'alsace',
'alstom',
'am',
'amazon',
'americanexpress',
'americanfamily',
'amex',
'amfam',
'amica',
'amsterdam',
'analytics',
'android',
'anquan',
'anz',
'ao',
'aol',
'apartments',
'app',
'apple',
'aq',
'aquarelle',
'ar',
'arab',
'aramco',
'archi',
'army',
'arpa',
'art',
'arte',
'as',
'asda',
'asia',
'associates',
'at',
'athleta',
'attorney',
'au',
'auction',
'audi',
'audible',
'audio',
'auspost',
'author',
'auto',
'autos',
'aw',
'aws',
'ax',
'axa',
'az',
'azure',
'ba',
'baby',
'baidu',
'banamex',
'band',
'bank',
'bar',
'barcelona',
'barclaycard',
'barclays',
'barefoot',
'bargains',
'baseball',
'basketball',
'bauhaus',
'bayern',
'bb',
'bbc',
'bbt',
'bbva',
'bcg',
'bcn',
'bd',
'be',
'beats',
'beauty',
'beer',
'bentley',
'berlin',
'best',
'bestbuy',
'bet',
'bf',
'bg',
'bh',
'bharti',
'bi',
'bible',
'bid',
'bike',
'bing',
'bingo',
'bio',
'biz',
'bj',
'black',
'blackfriday',
'blockbuster',
'blog',
'bloomberg',
'blue',
'bm',
'bms',
'bmw',
'bn',
'bnpparibas',
'bo',
'boats',
'boehringer',
'bofa',
'bom',
'bond',
'boo',
'book',
'booking',
'bosch',
'bostik',
'boston',
'bot',
'boutique',
'box',
'br',
'bradesco',
'bridgestone',
'broadway',
'broker',
'brother',
'brussels',
'bs',
'bt',
'build',
'builders',
'business',
'buy',
'buzz',
'bv',
'bw',
'by',
'bz',
'bzh',
'ca',
'cab',
'cafe',
'cal',
'call',
'calvinklein',
'cam',
'camera',
'camp',
'canon',
'capetown',
'capital',
'capitalone',
'car',
'caravan',
'cards',
'care',
'career',
'careers',
'cars',
'casa',
'case',
'cash',
'casino',
'cat',
'catering',
'catholic',
'cba',
'cbn',
'cbre',
'cc',
'cd',
'center',
'ceo',
'cern',
'cf',
'cfa',
'cfd',
'cg',
'ch',
'chanel',
'channel',
'charity',
'chase',
'chat',
'cheap',
'chintai',
'christmas',
'chrome',
'church',
'ci',
'cipriani',
'circle',
'cisco',
'citadel',
'citi',
'citic',
'city',
'ck',
'cl',
'claims',
'cleaning',
'click',
'clinic',
'clinique',
'clothing',
'cloud',
'club',
'clubmed',
'cm',
'cn',
'co',
'coach',
'codes',
'coffee',
'college',
'cologne',
'com',
'commbank',
'community',
'company',
'compare',
'computer',
'comsec',
'condos',
'construction',
'consulting',
'contact',
'contractors',
'cooking',
'cool',
'coop',
'corsica',
'country',
'coupon',
'coupons',
'courses',
'cpa',
'cr',
'credit',
'creditcard',
'creditunion',
'cricket',
'crown',
'crs',
'cruise',
'cruises',
'cu',
'cuisinella',
'cv',
'cw',
'cx',
'cy',
'cymru',
'cyou',
'cz',
'dabur',
'dad',
'dance',
'data',
'date',
'dating',
'datsun',
'day',
'dclk',
'dds',
'de',
'deal',
'dealer',
'deals',
'degree',
'delivery',
'dell',
'deloitte',
'delta',
'democrat',
'dental',
'dentist',
'desi',
'design',
'dev',
'dhl',
'diamonds',
'diet',
'digital',
'direct',
'directory',
'discount',
'discover',
'dish',
'diy',
'dj',
'dk',
'dm',
'dnp',
'do',
'docs',
'doctor',
'dog',
'domains',
'dot',
'download',
'drive',
'dtv',
'dubai',
'dunlop',
'dupont',
'durban',
'dvag',
'dvr',
'dz',
'earth',
'eat',
'ec',
'eco',
'edeka',
'edu',
'education',
'ee',
'eg',
'email',
'emerck',
'energy',
'engineer',
'engineering',
'enterprises',
'epson',
'equipment',
'er',
'ericsson',
'erni',
'es',
'esq',
'estate',
'et',
'eu',
'eurovision',
'eus',
'events',
'exchange',
'expert',
'exposed',
'express',
'extraspace',
'fage',
'fail',
'fairwinds',
'faith',
'family',
'fan',
'fans',
'farm',
'farmers',
'fashion',
'fast',
'fedex',
'feedback',
'ferrari',
'ferrero',
'fi',
'fidelity',
'fido',
'film',
'final',
'finance',
'financial',
'fire',
'firestone',
'firmdale',
'fish',
'fishing',
'fit',
'fitness',
'fj',
'fk',
'flickr',
'flights',
'flir',
'florist',
'flowers',
'fly',
'fm',
'fo',
'foo',
'food',
'football',
'ford',
'forex',
'forsale',
'forum',
'foundation',
'fox',
'fr',
'free',
'fresenius',
'frl',
'frogans',
'frontier',
'ftr',
'fujitsu',
'fun',
'fund',
'furniture',
'futbol',
'fyi',
'ga',
'gal',
'gallery',
'gallo',
'gallup',
'game',
'games',
'gap',
'garden',
'gay',
'gb',
'gbiz',
'gd',
'gdn',
'ge',
'gea',
'gent',
'genting',
'george',
'gf',
'gg',
'ggee',
'gh',
'gi',
'gift',
'gifts',
'gives',
'giving',
'gl',
'glass',
'gle',
'global',
'globo',
'gm',
'gmail',
'gmbh',
'gmo',
'gmx',
'gn',
'godaddy',
'gold',
'goldpoint',
'golf',
'goo',
'goodyear',
'goog',
'google',
'gop',
'got',
'gov',
'gp',
'gq',
'gr',
'grainger',
'graphics',
'gratis',
'green',
'gripe',
'grocery',
'group',
'gs',
'gt',
'gu',
'gucci',
'guge',
'guide',
'guitars',
'guru',
'gw',
'gy',
'hair',
'hamburg',
'hangout',
'haus',
'hbo',
'hdfc',
'hdfcbank',
'health',
'healthcare',
'help',
'helsinki',
'here',
'hermes',
'hiphop',
'hisamitsu',
'hitachi',
'hiv',
'hk',
'hkt',
'hm',
'hn',
'hockey',
'holdings',
'holiday',
'homedepot',
'homegoods',
'homes',
'homesense',
'honda',
'horse',
'hospital',
'host',
'hosting',
'hot',
'hotels',
'hotmail',
'house',
'how',
'hr',
'hsbc',
'ht',
'hu',
'hughes',
'hyatt',
'hyundai',
'ibm',
'icbc',
'ice',
'icu',
'id',
'ie',
'ieee',
'ifm',
'ikano',
'il',
'im',
'imamat',
'imdb',
'immo',
'immobilien',
'in',
'inc',
'industries',
'infiniti',
'info',
'ing',
'ink',
'institute',
'insurance',
'insure',
'int',
'international',
'intuit',
'investments',
'io',
'ipiranga',
'iq',
'ir',
'irish',
'is',
'ismaili',
'ist',
'istanbul',
'it',
'itau',
'itv',
'jaguar',
'java',
'jcb',
'je',
'jeep',
'jetzt',
'jewelry',
'jio',
'jll',
'jm',
'jmp',
'jnj',
'jo',
'jobs',
'joburg',
'jot',
'joy',
'jp',
'jpmorgan',
'jprs',
'juegos',
'juniper',
'kaufen',
'kddi',
'ke',
'kerryhotels',
'kerrylogistics',
'kerryproperties',
'kfh',
'kg',
'kh',
'ki',
'kia',
'kids',
'kim',
'kindle',
'kitchen',
'kiwi',
'km',
'kn',
'koeln',
'komatsu',
'kosher',
'kp',
'kpmg',
'kpn',
'kr',
'krd',
'kred',
'kuokgroup',
'kw',
'ky',
'kyoto',
'kz',
'la',
'lacaixa',
'lamborghini',
'lamer',
'lancaster',
'land',
'landrover',
'lanxess',
'lasalle',
'lat',
'latino',
'latrobe',
'law',
'lawyer',
'lb',
'lc',
'lds',
'lease',
'leclerc',
'lefrak',
'legal',
'lego',
'lexus',
'lgbt',
'li',
'lidl',
'life',
'lifeinsurance',
'lifestyle',
'lighting',
'like',
'lilly',
'limited',
'limo',
'lincoln',
'link',
'lipsy',
'live',
'living',
'lk',
'llc',
'llp',
'loan',
'loans',
'locker',
'locus',
'lol',
'london',
'lotte',
'lotto',
'love',
'lpl',
'lplfinancial',
'lr',
'ls',
'lt',
'ltd',
'ltda',
'lu',
'lundbeck',
'luxe',
'luxury',
'lv',
'ly',
'ma',
'madrid',
'maif',
'maison',
'makeup',
'man',
'management',
'mango',
'map',
'market',
'marketing',
'markets',
'marriott',
'marshalls',
'mattel',
'mba',
'mc',
'mckinsey',
'md',
'me',
'med',
'media',
'meet',
'melbourne',
'meme',
'memorial',
'men',
'menu',
'merckmsd',
'mg',
'mh',
'miami',
'microsoft',
'mil',
'mini',
'mint',
'mit',
'mitsubishi',
'mk',
'ml',
'mlb',
'mls',
'mm',
'mma',
'mn',
'mo',
'mobi',
'mobile',
'moda',
'moe',
'moi',
'mom',
'monash',
'money',
'monster',
'mormon',
'mortgage',
'moscow',
'moto',
'motorcycles',
'mov',
'movie',
'mp',
'mq',
'mr',
'ms',
'msd',
'mt',
'mtn',
'mtr',
'mu',
'museum',
'music',
'mv',
'mw',
'mx',
'my',
'mz',
'na',
'nab',
'nagoya',
'name',
'navy',
'nba',
'nc',
'ne',
'nec',
'net',
'netbank',
'netflix',
'network',
'neustar',
'new',
'news',
'next',
'nextdirect',
'nexus',
'nf',
'nfl',
'ng',
'ngo',
'nhk',
'ni',
'nico',
'nike',
'nikon',
'ninja',
'nissan',
'nissay',
'nl',
'no',
'nokia',
'norton',
'now',
'nowruz',
'nowtv',
'np',
'nr',
'nra',
'nrw',
'ntt',
'nu',
'nyc',
'nz',
'obi',
'observer',
'office',
'okinawa',
'olayan',
'olayangroup',
'ollo',
'om',
'omega',
'one',
'ong',
'onl',
'online',
'ooo',
'open',
'oracle',
'orange',
'org',
'organic',
'origins',
'osaka',
'otsuka',
'ott',
'ovh',
'pa',
'page',
'panasonic',
'paris',
'pars',
'partners',
'parts',
'party',
'pay',
'pccw',
'pe',
'pet',
'pf',
'pfizer',
'pg',
'ph',
'pharmacy',
'phd',
'philips',
'phone',
'photo',
'photography',
'photos',
'physio',
'pics',
'pictet',
'pictures',
'pid',
'pin',
'ping',
'pink',
'pioneer',
'pizza',
'pk',
'pl',
'place',
'play',
'playstation',
'plumbing',
'plus',
'pm',
'pn',
'pnc',
'pohl',
'poker',
'politie',
'porn',
'post',
'pr',
'pramerica',
'praxi',
'press',
'prime',
'pro',
'prod',
'productions',
'prof',
'progressive',
'promo',
'properties',
'property',
'protection',
'pru',
'prudential',
'ps',
'pt',
'pub',
'pw',
'pwc',
'py',
'qa',
'qpon',
'quebec',
'quest',
'racing',
'radio',
're',
'read',
'realestate',
'realtor',
'realty',
'recipes',
'red',
'redstone',
'redumbrella',
'rehab',
'reise',
'reisen',
'reit',
'reliance',
'ren',
'rent',
'rentals',
'repair',
'report',
'republican',
'rest',
'restaurant',
'review',
'reviews',
'rexroth',
'rich',
'richardli',
'ricoh',
'ril',
'rio',
'rip',
'ro',
'rocks',
'rodeo',
'rogers',
'room',
'rs',
'rsvp',
'ru',
'rugby',
'ruhr',
'run',
'rw',
'rwe',
'ryukyu',
'sa',
'saarland',
'safe',
'safety',
'sakura',
'sale',
'salon',
'samsclub',
'samsung',
'sandvik',
'sandvikcoromant',
'sanofi',
'sap',
'sarl',
'sas',
'save',
'saxo',
'sb',
'sbi',
'sbs',
'sc',
'scb',
'schaeffler',
'schmidt',
'scholarships',
'school',
'schule',
'schwarz',
'science',
'scot',
'sd',
'se',
'search',
'seat',
'secure',
'security',
'seek',
'select',
'sener',
'services',
'seven',
'sew',
'sex',
'sexy',
'sfr',
'sg',
'sh',
'shangrila',
'sharp',
'shell',
'shia',
'shiksha',
'shoes',
'shop',
'shopping',
'shouji',
'show',
'si',
'silk',
'sina',
'singles',
'site',
'sj',
'sk',
'ski',
'skin',
'sky',
'skype',
'sl',
'sling',
'sm',
'smart',
'smile',
'sn',
'sncf',
'so',
'soccer',
'social',
'softbank',
'software',
'sohu',
'solar',
'solutions',
'song',
'sony',
'soy',
'spa',
'space',
'sport',
'spot',
'sr',
'srl',
'ss',
'st',
'stada',
'staples',
'star',
'statebank',
'statefarm',
'stc',
'stcgroup',
'stockholm',
'storage',
'store',
'stream',
'studio',
'study',
'style',
'su',
'sucks',
'supplies',
'supply',
'support',
'surf',
'surgery',
'suzuki',
'sv',
'swatch',
'swiss',
'sx',
'sy',
'sydney',
'systems',
'sz',
'tab',
'taipei',
'talk',
'taobao',
'target',
'tatamotors',
'tatar',
'tattoo',
'tax',
'taxi',
'tc',
'tci',
'td',
'tdk',
'team',
'tech',
'technology',
'tel',
'temasek',
'tennis',
'teva',
'tf',
'tg',
'th',
'thd',
'theater',
'theatre',
'tiaa',
'tickets',
'tienda',
'tips',
'tires',
'tirol',
'tj',
'tjmaxx',
'tjx',
'tk',
'tkmaxx',
'tl',
'tm',
'tmall',
'tn',
'to',
'today',
'tokyo',
'tools',
'top',
'toray',
'toshiba',
'total',
'tours',
'town',
'toyota',
'toys',
'tr',
'trade',
'trading',
'training',
'travel',
'travelers',
'travelersinsurance',
'trust',
'trv',
'tt',
'tube',
'tui',
'tunes',
'tushu',
'tv',
'tvs',
'tw',
'tz',
'ua',
'ubank',
'ubs',
'ug',
'uk',
'unicom',
'university',
'uno',
'uol',
'ups',
'us',
'uy',
'uz',
'va',
'vacations',
'vana',
'vanguard',
'vc',
've',
'vegas',
'ventures',
'verisign',
'versicherung',
'vet',
'vg',
'vi',
'viajes',
'video',
'vig',
'viking',
'villas',
'vin',
'vip',
'virgin',
'visa',
'vision',
'viva',
'vivo',
'vlaanderen',
'vn',
'vodka',
'volvo',
'vote',
'voting',
'voto',
'voyage',
'vu',
'wales',
'walmart',
'walter',
'wang',
'wanggou',
'watch',
'watches',
'weather',
'weatherchannel',
'webcam',
'weber',
'website',
'wed',
'wedding',
'weibo',
'weir',
'wf',
'whoswho',
'wien',
'wiki',
'williamhill',
'win',
'windows',
'wine',
'winners',
'wme',
'wolterskluwer',
'woodside',
'work',
'works',
'world',
'wow',
'ws',
'wtc',
'wtf',
'xbox',
'xerox',
'xihuan',
'xin',
'कॉम',
'セール',
'佛山',
'ಭಾರತ',
'慈善',
'集团',
'在线',
'한국',
'ଭାରତ',
'点看',
'คอม',
'ভাৰত',
'ভারত',
'八卦',
'ישראל',
'موقع',
'বাংলা',
'公益',
'公司',
'香格里拉',
'网站',
'移动',
'我爱你',
'москва',
'қаз',
'католик',
'онлайн',
'сайт',
'联通',
'срб',
'бг',
'бел',
'קום',
'时尚',
'微博',
'淡马锡',
'ファッション',
'орг',
'नेट',
'ストア',
'アマゾン',
'삼성',
'சிங்கப்பூர்',
'商标',
'商店',
'商城',
'дети',
'мкд',
'ею',
'ポイント',
'新闻',
'家電',
'كوم',
'中文网',
'中信',
'中国',
'中國',
'娱乐',
'谷歌',
'భారత్',
'ලංකා',
'電訊盈科',
'购物',
'クラウド',
'ભારત',
'通販',
'भारतम्',
'भारत',
'भारोत',
'网店',
'संगठन',
'餐厅',
'网络',
'ком',
'укр',
'香港',
'亚马逊',
'食品',
'飞利浦',
'台湾',
'台灣',
'手机',
'мон',
'الجزائر',
'عمان',
'ارامكو',
'ایران',
'العليان',
'امارات',
'بازار',
'موريتانيا',
'پاکستان',
'الاردن',
'بارت',
'بھارت',
'المغرب',
'ابوظبي',
'البحرين',
'السعودية',
'ڀارت',
'كاثوليك',
'سودان',
'همراه',
'عراق',
'مليسيا',
'澳門',
'닷컴',
'政府',
'شبكة',
'بيتك',
'عرب',
'გე',
'机构',
'组织机构',
'健康',
'ไทย',
'سورية',
'招聘',
'рус',
'рф',
'تونس',
'大拿',
'ລາວ',
'みんな',
'グーグル',
'ευ',
'ελ',
'世界',
'書籍',
'ഭാരതം',
'ਭਾਰਤ',
'网址',
'닷넷',
'コム',
'天主教',
'游戏',
'vermögensberater',
'vermögensberatung',
'企业',
'信息',
'嘉里大酒店',
'嘉里',
'مصر',
'قطر',
'广东',
'இலங்கை',
'இந்தியா',
'հայ',
'新加坡',
'فلسطين',
'政务',
'xxx',
'xyz',
'yachts',
'yahoo',
'yamaxun',
'yandex',
'ye',
'yodobashi',
'yoga',
'yokohama',
'you',
'youtube',
'yt',
'yun',
'za',
'zappos',
'zara',
'zero',
'zip',
'zm',
'zone',
'zuerich',
'zw',
];
























































protected $validIdns = [
'AC' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'],
'AR' => [1 => '/^[\x{002d}0-9a-zà-ãç-êìíñ-õü]{1,63}$/iu'],
'AS' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$/iu'],
'AT' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœšž]{1,63}$/iu'],
'BIZ' => 'Hostname/Biz.php',
'BR' => [1 => '/^[\x{002d}0-9a-zà-ãçéíó-õúü]{1,63}$/iu'],
'BV' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'],
'CAT' => [1 => '/^[\x{002d}0-9a-z·àç-éíïòóúü]{1,63}$/iu'],
'CH' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'],
'CL' => [1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'],
'CN' => 'Hostname/Cn.php',
'COM' => 'Hostname/Com.php',
'DE' => [1 => '/^[\x{002d}0-9a-záàăâåäãąāæćĉčċçďđéèĕêěëėęēğĝġģĥħíìĭîïĩįīıĵķĺľļłńňñņŋóòŏôöőõøōœĸŕřŗśŝšşßťţŧúùŭûůüűũųūŵýŷÿźžżðþ]{1,63}$/iu'],
'DK' => [1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu'],
'EE' => [1 => '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu'],
'ES' => [1 => '/^[\x{002d}0-9a-zàáçèéíïñòóúü·]{1,63}$/iu'],
'EU' => [
1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňŉŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu',
4 => '/^[\x{002d}0-9a-zΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ]{1,63}$/iu',
5 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]{1,63}$/iu',
6 => '/^[\x{002d}0-9a-zἀ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ὼώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷῂῃῄῆῇῐ-ῒΐῖῗῠ-ῧῲῳῴῶῷ]{1,63}$/iu',
],
'FI' => [1 => '/^[\x{002d}0-9a-zäåö]{1,63}$/iu'],
'GR' => [1 => '/^[\x{002d}0-9a-zΆΈΉΊΌΎ-ΡΣ-ώἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼῂῃῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲῳῴῶ-ῼ]{1,63}$/iu'],
'HK' => 'Hostname/Cn.php',
'HR' => [1 => '/^[\x{002d}0-9a-zžćčđš]{1,63}$/iu'],
'HU' => [1 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu'],
'IL' => [
1 => '/^[\x{002d}0-9\x{05D0}-\x{05EA}]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-z]{1,63}$/i',
],
'INFO' => [
1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu',
4 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu',
5 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
8 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
],
'IO' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'],
'IS' => [1 => '/^[\x{002d}0-9a-záéýúíóþæöð]{1,63}$/iu'],
'IT' => [1 => '/^[\x{002d}0-9a-zàâäèéêëìîïòôöùûüæœçÿß-]{1,63}$/iu'],
'JP' => 'Hostname/Jp.php',
'KR' => [1 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu'],
'LI' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'],
'LT' => [1 => '/^[\x{002d}0-9ąčęėįšųūž]{1,63}$/iu'],
'MD' => [1 => '/^[\x{002d}0-9ăâîşţ]{1,63}$/iu'],
'MUSEUM' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćċčďđēėęěğġģħīįıķĺļľłńņňŋōőœŕŗřśşšţťŧūůűųŵŷźżžǎǐǒǔ\x{01E5}\x{01E7}\x{01E9}\x{01EF}ə\x{0292}ẁẃẅỳ]{1,63}$/iu'],
'NET' => 'Hostname/Com.php',
'NO' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'],
'NU' => 'Hostname/Com.php',
'ORG' => [
1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu',
4 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu',
5 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
6 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu',
7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
],
'PE' => [1 => '/^[\x{002d}0-9a-zñáéíóúü]{1,63}$/iu'],
'PL' => [
1 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
2 => '/^[\x{002d}а-ик-ш\x{0450}ѓѕјљњќџ]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu',
4 => '/^[\x{002d}0-9а-яё\x{04C2}]{1,63}$/iu',
5 => '/^[\x{002d}0-9a-zàáâèéêìíîòóôùúûċġħż]{1,63}$/iu',
6 => '/^[\x{002d}0-9a-zàäåæéêòóôöøü]{1,63}$/iu',
7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
8 => '/^[\x{002d}0-9a-zàáâãçéêíòóôõúü]{1,63}$/iu',
9 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu',
10 => '/^[\x{002d}0-9a-záäéíóôúýčďĺľňŕšťž]{1,63}$/iu',
11 => '/^[\x{002d}0-9a-zçë]{1,63}$/iu',
12 => '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu',
13 => '/^[\x{002d}0-9a-zćčđšž]{1,63}$/iu',
14 => '/^[\x{002d}0-9a-zâçöûüğış]{1,63}$/iu',
15 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
16 => '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu',
17 => '/^[\x{002d}0-9a-zĉĝĥĵŝŭ]{1,63}$/iu',
18 => '/^[\x{002d}0-9a-zâäéëîô]{1,63}$/iu',
19 => '/^[\x{002d}0-9a-zàáâäåæçèéêëìíîïðñòôöøùúûüýćčłńřśš]{1,63}$/iu',
20 => '/^[\x{002d}0-9a-zäåæõöøüšž]{1,63}$/iu',
21 => '/^[\x{002d}0-9a-zàáçèéìíòóùú]{1,63}$/iu',
22 => '/^[\x{002d}0-9a-zàáéíóöúüőű]{1,63}$/iu',
23 => '/^[\x{002d}0-9ΐά-ώ]{1,63}$/iu',
24 => '/^[\x{002d}0-9a-zàáâåæçèéêëðóôöøüþœ]{1,63}$/iu',
25 => '/^[\x{002d}0-9a-záäéíóöúüýčďěňřšťůž]{1,63}$/iu',
26 => '/^[\x{002d}0-9a-z·àçèéíïòóúü]{1,63}$/iu',
27 => '/^[\x{002d}0-9а-ъьюя\x{0450}\x{045D}]{1,63}$/iu',
28 => '/^[\x{002d}0-9а-яёіў]{1,63}$/iu',
29 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
30 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu',
31 => '/^[\x{002d}0-9a-zàâæçèéêëîïñôùûüÿœ]{1,63}$/iu',
32 => '/^[\x{002d}0-9а-щъыьэюяёєіїґ]{1,63}$/iu',
33 => '/^[\x{002d}0-9א-ת]{1,63}$/iu',
],
'PR' => [1 => '/^[\x{002d}0-9a-záéíóúñäëïüöâêîôûàèùæçœãõ]{1,63}$/iu'],
'PT' => [1 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu'],
'RS' => [1 => '/^[\x{002d}0-9a-zßáâäçéëíîóôöúüýăąćčďđęěĺľłńňőŕřśşšţťůűźżž]{1,63}$/iu'],
'RU' => [1 => '/^[\x{002d}0-9а-яё]{1,63}$/iu'],
'SA' => [1 => '/^[\x{002d}.0-9\x{0621}-\x{063A}\x{0641}-\x{064A}\x{0660}-\x{0669}]{1,63}$/iu'],
'SE' => [1 => '/^[\x{002d}0-9a-zäåéöü]{1,63}$/iu'],
'SH' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'],
'SI' => [
1 => '/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňŉŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-zșț]{1,63}$/iu',
],
'SJ' => [1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'],
'SWISS' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'],
'TH' => [1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'],
'TM' => [1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'],
'TW' => 'Hostname/Cn.php',
'TR' => [1 => '/^[\x{002d}0-9a-zğıüşöç]{1,63}$/iu'],
'UA' => [1 => '/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџґӂʼ]{1,63}$/iu'],
'VE' => [1 => '/^[\x{002d}0-9a-záéíóúüñ]{1,63}$/iu'],
'VN' => [1 => '/^[ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯư\x{1EA0}-\x{1EF9}]{1,63}$/iu'],
'мон' => [1 => '/^[\x{002d}0-9\x{0430}-\x{044F}]{1,63}$/iu'],
'срб' => [1 => '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu'],
'сайт' => [1 => '/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'],
'онлайн' => [1 => '/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'],
'中国' => 'Hostname/Cn.php',
'中國' => 'Hostname/Cn.php',
'ලංකා' => [1 => '/^[\x{0d80}-\x{0dff}]{1,63}$/iu'],
'香港' => 'Hostname/Cn.php',
'台湾' => 'Hostname/Cn.php',
'台灣' => 'Hostname/Cn.php',
'امارات' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'الاردن' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'السعودية' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'ไทย' => [1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'],
'рф' => [1 => '/^[\x{002d}0-9а-яё]{1,63}$/iu'],
'تونس' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'مصر' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'இலங்கை' => [1 => '/^[\x{0b80}-\x{0bff}]{1,63}$/iu'],
'فلسطين' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
'شبكة' => [1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'],
];


protected $idnLength = [
'BIZ' => [5 => 17, 11 => 15, 12 => 20],
'CN' => [1 => 20],
'COM' => [3 => 17, 5 => 20],
'HK' => [1 => 15],
'INFO' => [4 => 17],
'KR' => [1 => 17],
'NET' => [3 => 17, 5 => 20],
'ORG' => [6 => 17],
'TW' => [1 => 20],
'امارات' => [1 => 30],
'الاردن' => [1 => 30],
'السعودية' => [1 => 30],
'تونس' => [1 => 30],
'مصر' => [1 => 30],
'فلسطين' => [1 => 30],
'شبكة' => [1 => 30],
'中国' => [1 => 20],
'中國' => [1 => 20],
'香港' => [1 => 20],
'台湾' => [1 => 20],
'台灣' => [1 => 20],
];


protected $tld;






protected $options = [
'allow' => self::ALLOW_DNS, 
'useIdnCheck' => true, 
'useTldCheck' => true, 
'ipValidator' => null, 
];




















public function __construct($options = [])
{
if (! is_array($options)) {
$options = func_get_args();
$temp['allow'] = array_shift($options);
if (! empty($options)) {
$temp['useIdnCheck'] = array_shift($options);
}

if (! empty($options)) {
$temp['useTldCheck'] = array_shift($options);
}

if (! empty($options)) {
$temp['ipValidator'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('ipValidator', $options)) {
$options['ipValidator'] = null;
}

parent::__construct($options);
}








public function getIpValidator()
{
return $this->options['ipValidator'];
}







public function setIpValidator(?Ip $ipValidator = null)
{
if ($ipValidator === null) {
$ipValidator = new Ip();
}

$this->options['ipValidator'] = $ipValidator;
return $this;
}








public function getAllow()
{
return $this->options['allow'];
}









public function setAllow($allow)
{
$this->options['allow'] = $allow;
return $this;
}








public function getIdnCheck()
{
return $this->options['useIdnCheck'];
}











public function useIdnCheck($useIdnCheck)
{
$this->options['useIdnCheck'] = (bool) $useIdnCheck;
return $this;
}








public function getTldCheck()
{
return $this->options['useTldCheck'];
}











public function useTldCheck($useTldCheck)
{
$this->options['useTldCheck'] = (bool) $useTldCheck;
return $this;
}









public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

if (
((preg_match('/^[0-9.]*$/', $value) && str_contains($value, '.'))
|| (preg_match('/^[0-9a-f:.]*$/i', $value) && str_contains($value, ':')))
&& $this->getIpValidator()->setTranslator($this->getTranslator())->isValid($value)
) {
if (! ($this->getAllow() & self::ALLOW_IP)) {
$this->error(self::IP_ADDRESS_NOT_ALLOWED);
return false;
}

return true;
}


if ($this->getAllow() & self::ALLOW_LOCAL) {
if (str_ends_with($value, '.')) {
$value = substr($value, 0, -1);
if (str_ends_with($value, '.')) {

$this->error(self::INVALID_LOCAL_NAME);
return false;
}
}
}

$domainParts = explode('.', $value);


if (
count($domainParts) === 4 && preg_match('/^[0-9.a-e:.]*$/i', $value)
&& $this->getIpValidator()->setTranslator($this->getTranslator())->isValid($value)
) {
$this->error(self::INVALID_LOCAL_NAME);
}

$utf8StrWrapper = StringUtils::getWrapper('UTF-8');


if (
count($domainParts) > 1
&& $utf8StrWrapper->strlen($value) >= 4
&& $utf8StrWrapper->strlen($value) <= 254
) {
$status = false;

do {

$matches = [];
if (
preg_match('/([^.]{2,63})$/u', end($domainParts), $matches)
|| (array_key_exists(end($domainParts), $this->validIdns))
) {
reset($domainParts);






$this->tld = $matches[1];

if (str_starts_with($this->tld, 'xn--')) {
$this->tld = $this->decodePunycode(substr($this->tld, 4));
if ($this->tld === false) {
return false;
}
} else {
$this->tld = strtoupper($this->tld);
}


$removedTld = false;
if ($this->getTldCheck()) {
if (
! in_array(strtolower($this->tld), $this->validTlds)
&& ! in_array($this->tld, $this->validTlds)
) {
$this->error(self::UNKNOWN_TLD);
$status = false;
break;
}


array_pop($domainParts);
$removedTld = true;
}







$regexChars = [0 => '/^[a-z0-9\x2d]{1,63}$/i'];
if ($this->getIdnCheck() && isset($this->validIdns[$this->tld])) {
if (is_string($this->validIdns[$this->tld])) {
$regexChars += include __DIR__ . '/' . $this->validIdns[$this->tld];
} else {
$regexChars += $this->validIdns[$this->tld];
}
}


$check = 0;
$lastDomainPart = end($domainParts);
if (! $removedTld) {
$lastDomainPart = prev($domainParts);
}
foreach ($domainParts as $domainPart) {

if (str_starts_with($domainPart, 'xn--')) {
$domainPart = $this->decodePunycode(substr($domainPart, 4));
if ($domainPart === false) {
return false;
}
}


if ($domainPart === '') {
$this->error(self::INVALID_HOSTNAME);
$status = false;
break 2;
}


if (
$utf8StrWrapper->strpos($domainPart, '-') === 0
|| ($utf8StrWrapper->strlen($domainPart) > 2
&& $utf8StrWrapper->strpos($domainPart, '-', 2) === 2
&& $utf8StrWrapper->strpos($domainPart, '-', 3) === 3
)
|| $utf8StrWrapper->substr($domainPart, -1) === '-'
) {
$this->error(self::INVALID_DASH);
$status = false;
break 2;
}


$checked = false;
$isSubDomain = $domainPart !== $lastDomainPart;
$partRegexChars = $isSubDomain ? ['/^[a-z0-9_\x2d]{1,63}$/i'] + $regexChars : $regexChars;
foreach ($partRegexChars as $regexKey => $regexChar) {
$status = preg_match($regexChar, $domainPart);
if ($status > 0) {
$length = 63;
if (
array_key_exists($this->tld, $this->idnLength)
&& array_key_exists($regexKey, $this->idnLength[$this->tld])
) {
$length = $this->idnLength[$this->tld];
}

if ($utf8StrWrapper->strlen($domainPart) > $length) {
$this->error(self::INVALID_HOSTNAME);
$status = false;
} else {
$checked = true;
break;
}
}
}

if ($checked) {
++$check;
}
}


if ($check !== count($domainParts)) {
$this->error(self::INVALID_HOSTNAME_SCHEMA);
$status = false;
}
} else {

$this->error(self::UNDECIPHERABLE_TLD);
$status = false;
}
} while (false);



if ($status && ($this->getAllow() & self::ALLOW_DNS)) {
return true;
}
} elseif ($this->getAllow() & self::ALLOW_DNS) {
$this->error(self::INVALID_HOSTNAME);
}


if ($this->getAllow() & self::ALLOW_URI) {
if (preg_match("/^([a-zA-Z0-9-._~!$&\'()*+,;=]|%[[:xdigit:]]{2}){1,254}$/i", $value)) {
return true;
}

$this->error(self::INVALID_URI);
}


$regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}[\x2e]{0,1}){1,254}$/';
$status = preg_match($regexLocal, $value);



$allowLocal = $this->getAllow() & self::ALLOW_LOCAL;
if ($status && $allowLocal) {
return true;
}


if (! $status) {
$this->error(self::INVALID_LOCAL_NAME);
}


if ($status && ! $allowLocal) {
$this->error(self::LOCAL_NAME_NOT_ALLOWED);
}

return false;
}








protected function decodePunycode($encoded)
{
if (! preg_match('/^[a-z0-9-]+$/i', $encoded)) {

$this->error(self::CANNOT_DECODE_PUNYCODE);
return false;
}

$decoded = [];
$separator = strrpos($encoded, '-');
if ($separator > 0) {
for ($x = 0; $x < $separator; ++$x) {

$decoded[] = ord($encoded[$x]);
}
}

$lengthd = count($decoded);
$lengthe = strlen($encoded);


$init = true;
$base = 72;
$index = 0;
$char = 0x80;

for ($indexe = $separator !== false ? $separator + 1 : 0; $indexe < $lengthe; ++$lengthd) {
for ($oldIndex = $index, $pos = 1, $key = 36; 1; $key += 36) {
if (! isset($encoded[$indexe])) {
break 2;
}

$hex = ord($encoded[$indexe++]);
$digit = $hex - 48 < 10 ? $hex - 22
: ($hex - 65 < 26 ? $hex - 65
: ($hex - 97 < 26 ? $hex - 97
: 36));

$index += $digit * $pos;
$tag = $key <= $base ? 1 : ($key >= $base + 26 ? 26 : $key - $base);
if ($digit < $tag) {
break;
}

$pos = (int) ($pos * (36 - $tag));
}

$delta = intval($init ? ($index - $oldIndex) / 700 : ($index - $oldIndex) / 2);
$delta += intval($delta / ($lengthd + 1));
for ($key = 0; $delta > 910 / 2; $key += 36) {
$delta = intval($delta / 35);
}

$base = intval($key + 36 * $delta / ($delta + 38));
$init = false;
$char += (int) ($index / ($lengthd + 1));
$index %= $lengthd + 1;
if ($lengthd > 0) {
for ($i = $lengthd; $i > $index; $i--) {
$decoded[$i] = $decoded[$i - 1];
}
}

$decoded[$index++] = $char;
}


foreach ($decoded as $key => $value) {
if ($value < 128) {
$decoded[$key] = chr($value);
} elseif ($value < 1 << 11) {
$decoded[$key] = chr(192 + ($value >> 6));
$decoded[$key] .= chr(128 + ($value & 63));
} elseif ($value < 1 << 16) {
$decoded[$key] = chr(224 + ($value >> 12));
$decoded[$key] .= chr(128 + (($value >> 6) & 63));
$decoded[$key] .= chr(128 + ($value & 63));
} elseif ($value < 1 << 21) {
$decoded[$key] = chr(240 + ($value >> 18));
$decoded[$key] .= chr(128 + (($value >> 12) & 63));
$decoded[$key] .= chr(128 + (($value >> 6) & 63));
$decoded[$key] .= chr(128 + ($value & 63));
} else {
$this->error(self::CANNOT_DECODE_PUNYCODE);
return false;
}
}

return implode($decoded);
}
}
<?php

declare(strict_types=1);

namespace Laminas\Validator;

use Laminas\Validator\Exception\InvalidArgumentException;

use function is_numeric;

/**
@psalm-type
@psalm-type











*/
final class NumberComparison extends AbstractValidator
{
public const ERROR_NOT_NUMERIC = 'notNumeric';
public const ERROR_NOT_GREATER_INCLUSIVE = 'notGreaterInclusive';
public const ERROR_NOT_GREATER = 'notGreater';
public const ERROR_NOT_LESS_INCLUSIVE = 'notLessInclusive';
public const ERROR_NOT_LESS = 'notLess';


protected array $messageTemplates = [
self::ERROR_NOT_NUMERIC => 'Expected a numeric value',
self::ERROR_NOT_GREATER_INCLUSIVE => 'Values must be greater than or equal to %min%. Received "%value%"',
self::ERROR_NOT_GREATER => 'Values must be greater than %min%. Received "%value%',
self::ERROR_NOT_LESS_INCLUSIVE => 'Values must be less than or equal to %max%. Received "%value%"',
self::ERROR_NOT_LESS => 'Values must be less than %max%. Received "%value%"',
];


protected array $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
];


protected array $options = [
'min' => null,
'max' => null,
'inclusiveMin' => true,
'inclusiveMax' => true,
];


public function __construct(array $options = [])
{
parent::__construct($options);

$min = $options['min'] ?? null;
$max = $options['max'] ?? null;

if (! is_numeric($min) && ! is_numeric($max)) {
throw new InvalidArgumentException(
'A numeric option value for either min, max or both must be provided',
);
}

if ($min !== null && $max !== null && $min > $max) {
throw new InvalidArgumentException(
'The minimum constraint cannot be greater than the maximum constraint',
);
}

$this->options['min'] = $min;
$this->options['max'] = $max;
$this->options['inclusiveMin'] = $options['inclusiveMin'] ?? true;
$this->options['inclusiveMax'] = $options['inclusiveMax'] ?? true;
}

public function isValid(mixed $value): bool
{
if (! is_numeric($value)) {
$this->error(self::ERROR_NOT_NUMERIC);

return false;
}

$this->setValue($value);

$min = $this->options['min'];
$max = $this->options['max'];
$inclusiveMin = $this->options['inclusiveMin'];
$inclusiveMax = $this->options['inclusiveMax'];

if ($min !== null && $inclusiveMin && $value < $min) {
$this->error(self::ERROR_NOT_GREATER_INCLUSIVE);

return false;
}

if ($min !== null && ! $inclusiveMin && $value <= $min) {
$this->error(self::ERROR_NOT_GREATER);

return false;
}

if ($max !== null && $inclusiveMax && $value > $max) {
$this->error(self::ERROR_NOT_LESS_INCLUSIVE);

return false;
}

if ($max !== null && ! $inclusiveMax && $value >= $max) {
$this->error(self::ERROR_NOT_LESS);

return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function count;
use function is_countable;
use function is_numeric;

/**
@psalm-type
@psalm-type

























*/
class IsCountable extends AbstractValidator
{
public const NOT_COUNTABLE = 'notCountable';
public const NOT_EQUALS = 'notEquals';
public const GREATER_THAN = 'greaterThan';
public const LESS_THAN = 'lessThan';






protected $messageTemplates = [
self::NOT_COUNTABLE => 'The input must be an array or an instance of \\Countable',
self::NOT_EQUALS => "The input count must equal '%count%'",
self::GREATER_THAN => "The input count must be less than '%max%', inclusively",
self::LESS_THAN => "The input count must be greater than '%min%', inclusively",
];






protected $messageVariables = [
'count' => ['options' => 'count'],
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
];

/**
@psalm-var */
protected $options = [
'count' => null,
'min' => null,
'max' => null,
];





public function setOptions($options = [])
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

/**
@psalm-var */

if (isset($options['count'])) {
$this->setCount($options['count']);
}

if (isset($options['min'])) {
$this->setMin($options['min']);
}

if (isset($options['max'])) {
$this->setMax($options['max']);
}

unset($options['count'], $options['min'], $options['max']);

parent::setOptions($options);

return $this;
}







public function isValid($value)
{
if (! is_countable($value)) {
$this->error(self::NOT_COUNTABLE);
return false;
}

$count = count($value);

if (is_numeric($this->getCount())) {
if ($count !== $this->getCount()) {
$this->error(self::NOT_EQUALS);
return false;
}

return true;
}

if (is_numeric($this->getMax()) && $count > $this->getMax()) {
$this->error(self::GREATER_THAN);
return false;
}

if (is_numeric($this->getMin()) && $count < $this->getMin()) {
$this->error(self::LESS_THAN);
return false;
}

return true;
}








public function getCount()
{
return $this->options['count'];
}








public function getMin()
{
return $this->options['min'];
}








public function getMax()
{
return $this->options['max'];
}





private function setCount(int $value): void
{
if (isset($this->options['min']) || isset($this->options['max'])) {
throw new Exception\InvalidArgumentException(
'Cannot set count; conflicts with either a min or max option previously set'
);
}
$this->options['count'] = $value;
}





private function setMin(int $value): void
{
if (isset($this->options['count'])) {
throw new Exception\InvalidArgumentException(
'Cannot set count; conflicts with either a count option previously set'
);
}
$this->options['min'] = $value;
}





private function setMax(int $value): void
{
if (isset($this->options['count'])) {
throw new Exception\InvalidArgumentException(
'Cannot set count; conflicts with either a count option previously set'
);
}
$this->options['max'] = $value;
}
}
<?php

namespace Laminas\Validator;

use Laminas\ServiceManager\Config;
use Laminas\ServiceManager\FactoryInterface;
use Laminas\ServiceManager\ServiceLocatorInterface;
use Laminas\ServiceManager\ServiceManager;
use Psr\Container\ContainerInterface;

use function is_array;

/**
@psalm-import-type




*/
class ValidatorPluginManagerFactory implements FactoryInterface
{





protected $creationOptions;

/**
@psalm-suppress





*/
public function __invoke(ContainerInterface $container, $name, ?array $options = null)
{
$pluginManager = new ValidatorPluginManager($container, $options ?? []);



if ($container->has('ServiceListener')) {
return $pluginManager;
}


if (! $container->has('config')) {
return $pluginManager;
}

$config = $container->get('config');


if (! isset($config['validators']) || ! is_array($config['validators'])) {
return $pluginManager;
}


(new Config($config['validators']))->configureServiceManager($pluginManager);

return $pluginManager;
}








public function createService(ServiceLocatorInterface $container, $name = null, $requestedName = null)
{
return $this($container, $requestedName ?? ValidatorPluginManager::class, $this->creationOptions);
}







public function setCreationOptions(array $options)
{
$this->creationOptions = $options;
}
}
<?php

namespace Laminas\Validator;

use Laminas\ServiceManager\ServiceManager;
use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function explode;
use function is_array;
use function is_string;
use function sprintf;

/**
@psalm-import-type

*/
class Explode extends AbstractValidator implements ValidatorPluginManagerAwareInterface
{
public const INVALID = 'explodeInvalid';


protected $pluginManager;


protected $messageTemplates = [
self::INVALID => 'Invalid type given',
];


protected $messageVariables = [];


protected $valueDelimiter = ',';


protected $validator;


protected $breakOnFirstFailure = false;









public function setValueDelimiter($delimiter)
{
$this->valueDelimiter = $delimiter;
return $this;
}








public function getValueDelimiter()
{
return $this->valueDelimiter;
}








public function setValidatorPluginManager(ValidatorPluginManager $pluginManager)
{
$this->pluginManager = $pluginManager;
}








public function getValidatorPluginManager()
{
if (! $this->pluginManager) {
$this->pluginManager = new ValidatorPluginManager(new ServiceManager());
}

return $this->pluginManager;
}










public function setValidator($validator)
{
if (is_array($validator)) {
if (! isset($validator['name'])) {
throw new Exception\RuntimeException(
'Invalid validator specification provided; does not include "name" key'
);
}
$name = $validator['name'];
$options = $validator['options'] ?? [];
/**
@psalm-suppress */
$validator = $this->getValidatorPluginManager()->get($name, $options);
}

if (! $validator instanceof ValidatorInterface) {
throw new Exception\RuntimeException(
'Invalid validator given'
);
}

$this->validator = $validator;
return $this;
}








public function getValidator()
{
return $this->validator;
}









public function setBreakOnFirstFailure($break)
{
$this->breakOnFirstFailure = (bool) $break;
return $this;
}








public function isBreakOnFirstFailure()
{
return $this->breakOnFirstFailure;
}











public function isValid($value, $context = null)
{
$this->setValue($value);

if ($value instanceof Traversable) {
$value = ArrayUtils::iteratorToArray($value);
}

if (is_array($value)) {
$values = $value;
} elseif (is_string($value)) {
$delimiter = $this->getValueDelimiter();




$values = null !== $delimiter
? explode($this->valueDelimiter, $value)
: [$value];
} else {
$values = [$value];
}

$validator = $this->getValidator();

if (! $validator) {
throw new Exception\RuntimeException(sprintf(
'%s expects a validator to be set; none given',
__METHOD__
));
}

foreach ($values as $value) {
if (! $validator->isValid($value, $context)) {
$this->abstractOptions['messages'][] = $validator->getMessages();

if ($this->isBreakOnFirstFailure()) {
return false;
}
}
}

return $this->abstractOptions['messages'] === [];
}
}
<?php

namespace Laminas\Validator;

use Traversable;
use UConverter;

use function array_combine;
use function array_flip;
use function array_keys;
use function array_shift;
use function arsort;
use function checkdnsrr;
use function defined;
use function extension_loaded;
use function func_get_args;
use function function_exists;
use function gethostbynamel;
use function getmxrr;
use function idn_to_ascii;
use function idn_to_utf8;
use function is_array;
use function is_string;
use function preg_match;
use function str_contains;
use function strlen;
use function trim;

use const INTL_IDNA_VARIANT_UTS46;


class EmailAddress extends AbstractValidator
{
public const INVALID = 'emailAddressInvalid';
public const INVALID_FORMAT = 'emailAddressInvalidFormat';
public const INVALID_HOSTNAME = 'emailAddressInvalidHostname';
public const INVALID_MX_RECORD = 'emailAddressInvalidMxRecord';
public const INVALID_SEGMENT = 'emailAddressInvalidSegment';
public const DOT_ATOM = 'emailAddressDotAtom';
public const QUOTED_STRING = 'emailAddressQuotedString';
public const INVALID_LOCAL_PART = 'emailAddressInvalidLocalPart';
public const LENGTH_EXCEEDED = 'emailAddressLengthExceeded';




protected $messageTemplates = [
self::INVALID => "Invalid type given. String expected",
self::INVALID_FORMAT => "The input is not a valid email address. Use the basic format local-part@hostname",
self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for the email address",
self::INVALID_MX_RECORD => "'%hostname%' does not appear to have any valid MX or A records for the email address",
self::INVALID_SEGMENT => "'%hostname%' is not in a routable network segment. The email address should not be resolved from public network",
self::DOT_ATOM => "'%localPart%' can not be matched against dot-atom format",
self::QUOTED_STRING => "'%localPart%' can not be matched against quoted-string format",
self::INVALID_LOCAL_PART => "'%localPart%' is not a valid local part for the email address",
self::LENGTH_EXCEEDED => "The input exceeds the allowed length",
];




protected $messageVariables = [
'hostname' => 'hostname',
'localPart' => 'localPart',
];


protected $hostname;


protected $localPart;






protected $mxRecord = [];






protected $options = [
'useMxCheck' => false,
'useDeepMxCheck' => false,
'useDomainCheck' => true,
'allow' => Hostname::ALLOW_DNS,
'strict' => true,
'hostnameValidator' => null,
];













public function __construct($options = [])
{
if (! is_array($options)) {
$options = func_get_args();
$temp['allow'] = array_shift($options);
if (! empty($options)) {
$temp['useMxCheck'] = array_shift($options);
}

if (! empty($options)) {
$temp['hostnameValidator'] = array_shift($options);
}

$options = $temp;
}

parent::__construct($options);
}









public function setMessage($messageString, $messageKey = null)
{
if ($messageKey === null) {
$this->getHostnameValidator()->setMessage($messageString);
parent::setMessage($messageString);
return $this;
}

if (! isset($this->messageTemplates[$messageKey])) {
$this->getHostnameValidator()->setMessage($messageString, $messageKey);
} else {
parent::setMessage($messageString, $messageKey);
}

return $this;
}










public function getHostnameValidator()
{
if (! isset($this->options['hostnameValidator'])) {
$this->options['hostnameValidator'] = new Hostname($this->getAllow());
}

return $this->options['hostnameValidator'];
}







public function setHostnameValidator(?Hostname $hostnameValidator = null)
{
$this->options['hostnameValidator'] = $hostnameValidator;

return $this;
}








public function getAllow()
{
return $this->options['allow'];
}









public function setAllow($allow)
{
$this->options['allow'] = $allow;
if (isset($this->options['hostnameValidator'])) {
$this->options['hostnameValidator']->setAllow($allow);
}

return $this;
}








public function isMxSupported()
{
return function_exists('getmxrr');
}








public function getMxCheck()
{
return $this->options['useMxCheck'];
}











public function useMxCheck($mx)
{
$this->options['useMxCheck'] = (bool) $mx;
return $this;
}








public function getDeepMxCheck()
{
return $this->options['useDeepMxCheck'];
}









public function useDeepMxCheck($deep)
{
$this->options['useDeepMxCheck'] = (bool) $deep;
return $this;
}








public function getDomainCheck()
{
return $this->options['useDomainCheck'];
}










public function useDomainCheck($domain = true)
{
$this->options['useDomainCheck'] = (bool) $domain;
return $this;
}







protected function isReserved($host)
{
$validator = new HostWithPublicIPv4Address();
return ! $validator->isValid($host);
}






protected function validateLocalPart()
{





$atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e';
if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->localPart)) {
return true;
}

if ($this->validateInternationalizedLocalPart($this->localPart)) {
return true;
}




$qtext = '\x20-\x21\x23-\x5b\x5d-\x7e'; 
$quotedPair = '\x20-\x7e'; 
if (preg_match('/^"([' . $qtext . ']|\x5c[' . $quotedPair . '])*"$/', $this->localPart)) {
return true;
}

$this->error(self::DOT_ATOM);
$this->error(self::QUOTED_STRING);
$this->error(self::INVALID_LOCAL_PART);

return false;
}





protected function validateInternationalizedLocalPart($localPart)
{
if (
extension_loaded('intl')
&& false === UConverter::transcode($localPart, 'UTF-8', 'UTF-8')
) {

return false;
}

$atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e';


$uatext = $atext . '\x{80}-\x{FFFF}';
return (bool) preg_match('/^[' . $uatext . ']+(\x2e+[' . $uatext . ']+)*$/u', $localPart);
}








public function getMXRecord()
{
return $this->mxRecord;
}

/**
@psalm-return



*/
protected function validateMXRecords()
{
$mxHosts = [];
$weight = [];
$result = getmxrr($this->hostname, $mxHosts, $weight);
if (! empty($mxHosts) && ! empty($weight)) {
$this->mxRecord = array_combine($mxHosts, $weight) ?: [];
} else {
$this->mxRecord = [];
}

arsort($this->mxRecord);


if (! $result) {
$result = gethostbynamel($this->hostname);
if (is_array($result)) {
$this->mxRecord = array_flip($result);
}
}

if ($result === false) {
$this->error(self::INVALID_MX_RECORD);
return false;
}

if (! $this->options['useDeepMxCheck']) {
return $result;
}

$validAddress = false;
$reserved = true;
foreach (array_keys($this->mxRecord) as $hostname) {
$res = $this->isReserved($hostname);
if (! $res) {
$reserved = false;
}

if (trim($hostname) === '') {
continue;
}

if (
! $res
&& (checkdnsrr($hostname, 'A')
|| checkdnsrr($hostname, 'AAAA')
|| checkdnsrr($hostname, 'A6'))
) {
$validAddress = true;
break;
}
}

if (! $validAddress) {
$result = false;
$error = $reserved ? self::INVALID_SEGMENT : self::INVALID_MX_RECORD;
$this->error($error);
}

return $result;
}

/**
@psalm-return



*/
protected function validateHostnamePart()
{
$hostname = $this->getHostnameValidator()->setTranslator($this->getTranslator())
->isValid($this->hostname);
if (! $hostname) {
$this->error(self::INVALID_HOSTNAME);

foreach ($this->getHostnameValidator()->getMessages() as $code => $message) {
$this->abstractOptions['messages'][$code] = $message;
}
} elseif ($this->options['useMxCheck']) {

$hostname = $this->validateMXRecords();
}

return $hostname;
}







protected function splitEmailParts($value)
{
$value = is_string($value) ? $value : '';


if (
str_contains($value, '..')
|| ! preg_match('/^(.+)@([^@]+)$/', $value, $matches)
) {
return false;
}

$this->localPart = $matches[1];
$this->hostname = $this->idnToAscii($matches[2]);

return true;
}













public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$length = true;
$this->setValue($value);


if (! $this->splitEmailParts($this->getValue())) {
$this->error(self::INVALID_FORMAT);
return false;
}

if ($this->getOption('strict') && (strlen($this->localPart) > 64) || (strlen($this->hostname) > 255)) {
$length = false;
$this->error(self::LENGTH_EXCEEDED);
}


$hostname = false;
if ($this->options['useDomainCheck']) {
$hostname = $this->validateHostnamePart();
}

$local = $this->validateLocalPart();


return ($local && $length) && (! $this->options['useDomainCheck'] || $hostname !== false);
}







protected function idnToAscii($email)
{
if (extension_loaded('intl')) {
if (defined('INTL_IDNA_VARIANT_UTS46')) {
$value = idn_to_ascii($email, 0, INTL_IDNA_VARIANT_UTS46);

return $value !== false ? $value : $email;
}
$value = idn_to_ascii($email);

return $value !== false ? $value : $email;
}
return $email;
}







protected function idnToUtf8($email)
{
if (strlen($email) === 0) {
return $email;
}

if (extension_loaded('intl')) {






if (defined('INTL_IDNA_VARIANT_UTS46')) {
$value = idn_to_utf8($email, 0, INTL_IDNA_VARIANT_UTS46);

return $value !== false ? $value : $email;
}
$value = idn_to_utf8($email);

return $value !== false ? $value : $email;
}
return $email;
}
}
<?php

namespace Laminas\Validator\Exception;






class InvalidMagicMimeFileException extends InvalidArgumentException
{
}
<?php

namespace Laminas\Validator\Exception;

interface ExceptionInterface
{
}
<?php

namespace Laminas\Validator\Exception;

class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
<?php

namespace Laminas\Validator\Exception;






class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
<?php

namespace Laminas\Validator\Exception;

class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

namespace Laminas\Validator\Exception;






class ExtensionNotLoadedException extends RuntimeException
{
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function array_keys;
use function array_unique;
use function current;
use function implode;
use function is_array;
use function is_object;
use function is_string;
use function key;
use function method_exists;
use function str_repeat;
use function str_replace;
use function strlen;
use function substr;
use function ucfirst;
use function var_export;

use const SORT_REGULAR;

/**
@psalm-type











*/
abstract class AbstractValidator implements
Translator\TranslatorAwareInterface,
ValidatorInterface
{





protected $value;






protected static $defaultTranslator;






protected static $defaultTranslatorTextDomain = 'default';






protected static $messageLength = -1;





protected $abstractOptions = [
'messages' => [], 
'messageTemplates' => [], 
'messageVariables' => [], 
'translator' => null, 
'translatorTextDomain' => null, 
'translatorEnabled' => true, 
'valueObscured' => false, 
];











public function __construct($options = null)
{

if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

/**
@psalm-suppress */
if (isset($this->messageTemplates) && is_array($this->messageTemplates)) {
$this->abstractOptions['messageTemplates'] = $this->messageTemplates;
}

/**
@psalm-suppress */
if (isset($this->messageVariables) && is_array($this->messageVariables)) {
$this->abstractOptions['messageVariables'] = $this->messageVariables;
}

if (is_array($options)) {
$this->setOptions($options);
}
}










public function getOption($option)
{
if (array_key_exists($option, $this->abstractOptions)) {
return $this->abstractOptions[$option];
}

/**
@psalm-suppress */
if (isset($this->options) && array_key_exists($option, $this->options)) {
return $this->options[$option];
}

throw new Exception\InvalidArgumentException("Invalid option '$option'");
}








public function getOptions()
{
$result = $this->abstractOptions;
/**
@psalm-suppress */
if (isset($this->options) && is_array($this->options)) {
$result += $this->options;
}
return $result;
}










public function setOptions($options = [])
{
/**
@psalm-suppress */
if (! is_array($options) && ! $options instanceof Traversable) {
throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable');
}

/**
@psalm-suppress
@psalm-var
*/
foreach ($options as $name => $option) {
$fname = 'set' . ucfirst($name);
$fname2 = 'is' . ucfirst($name);
if (($name !== 'setOptions') && method_exists($this, $name)) {
$this->{$name}($option);
} elseif (($fname !== 'setOptions') && method_exists($this, $fname)) {
$this->{$fname}($option);
} elseif (method_exists($this, $fname2)) {
$this->{$fname2}($option);
} elseif (isset($this->options) && is_array($this->options)) {
$this->options[$name] = $option;
} else {
$this->abstractOptions[$name] = $option;
}
}

return $this;
}






public function getMessages()
{
return array_unique($this->abstractOptions['messages'], SORT_REGULAR);
}






public function __invoke(mixed $value)
{
return $this->isValid($value);
}








public function getMessageVariables()
{
return array_keys($this->abstractOptions['messageVariables']);
}








public function getMessageTemplates()
{
return $this->abstractOptions['messageTemplates'];
}









public function setMessage($messageString, $messageKey = null)
{
if ($messageKey === null) {
$keys = array_keys($this->abstractOptions['messageTemplates']);
foreach ($keys as $key) {
$this->setMessage($messageString, $key);
}
return $this;
}

if (! isset($this->abstractOptions['messageTemplates'][$messageKey])) {
throw new Exception\InvalidArgumentException("No message template exists for key '$messageKey'");
}

$this->abstractOptions['messageTemplates'][$messageKey] = $messageString;
return $this;
}











public function setMessages(array $messages)
{
foreach ($messages as $key => $message) {
$this->setMessage($message, $key);
}
return $this;
}












public function __get($property)
{
if ($property === 'value') {
return $this->value;
}

if (array_key_exists($property, $this->abstractOptions['messageVariables'])) {
/**
@psalm-var */
$result = $this->abstractOptions['messageVariables'][$property];
if (is_array($result)) {
return $this->{key($result)}[current($result)];
}
return $this->{$result};
}

/**
@psalm-suppress */
if (isset($this->messageVariables) && array_key_exists($property, $this->messageVariables)) {
/**
@psalm-var */
$result = $this->{$this->messageVariables[$property]};
if (is_array($result)) {
return $this->{key($result)}[current($result)];
}
return $this->{$result};
}

throw new Exception\InvalidArgumentException("No property exists by the name '$property'");
}













protected function createMessage($messageKey, $value)
{
if (! isset($this->abstractOptions['messageTemplates'][$messageKey])) {
return null;
}

$message = $this->abstractOptions['messageTemplates'][$messageKey];

$message = $this->translateMessage($messageKey, $message);

if (is_object($value)) {
$value = method_exists($value, '__toString')
? (string) $value
: $value::class . ' object';
} elseif (is_array($value)) {
$value = var_export($value, true);
} else {
/**
@psalm-suppress */
$value = (string) $value;
}

if ($this->isValueObscured()) {
$value = str_repeat('*', strlen($value));
}

$message = str_replace('%value%', $value, $message);
foreach ($this->abstractOptions['messageVariables'] as $ident => $property) {
if (is_array($property)) {
$value = $this->{key($property)}[current($property)];
if (is_array($value)) {
$value = '[' . implode(', ', $value) . ']';
}
} else {
$value = $this->$property;
}
$message = str_replace("%$ident%", (string) $value, $message);
}

$length = self::getMessageLength();
if (($length > -1) && (strlen($message) > $length)) {
$message = substr($message, 0, $length - 3) . '...';
}

return $message;
}






protected function error($messageKey, $value = null)
{
if ($messageKey === null) {
$keys = array_keys($this->abstractOptions['messageTemplates']);
$messageKey = current($keys);
}

if ($value === null) {
/**
@psalm-var */
$value = $this->value;
}

$message = $this->createMessage($messageKey, $value);
if (! is_string($message)) {
return;
}

$this->abstractOptions['messages'][$messageKey] = $message;
}






protected function getValue()
{
return $this->value;
}






protected function setValue(mixed $value)
{
$this->value = $value;
$this->abstractOptions['messages'] = [];
}









public function setValueObscured($flag)
{
/**
@psalm-suppress */
$this->abstractOptions['valueObscured'] = (bool) $flag;
return $this;
}









public function isValueObscured()
{
return $this->abstractOptions['valueObscured'];
}








public function setTranslator(?Translator\TranslatorInterface $translator = null, $textDomain = null)
{
$this->abstractOptions['translator'] = $translator;
if (null !== $textDomain) {
$this->setTranslatorTextDomain($textDomain);
}
return $this;
}






public function getTranslator()
{
if (! $this->isTranslatorEnabled()) {
return null;
}

if (null === $this->abstractOptions['translator']) {
$this->abstractOptions['translator'] = self::getDefaultTranslator();
}

return $this->abstractOptions['translator'];
}








public function hasTranslator()
{
return (bool) $this->abstractOptions['translator'];
}










public function setTranslatorTextDomain($textDomain = 'default')
{
$this->abstractOptions['translatorTextDomain'] = $textDomain;
return $this;
}








public function getTranslatorTextDomain()
{
if (null === $this->abstractOptions['translatorTextDomain']) {
$this->abstractOptions['translatorTextDomain'] =
self::getDefaultTranslatorTextDomain();
}
return $this->abstractOptions['translatorTextDomain'];
}








public static function setDefaultTranslator(?Translator\TranslatorInterface $translator = null, $textDomain = null)
{
static::$defaultTranslator = $translator;
if (null !== $textDomain) {
self::setDefaultTranslatorTextDomain($textDomain);
}
}








public static function getDefaultTranslator()
{
return static::$defaultTranslator;
}








public static function hasDefaultTranslator()
{
return (bool) static::$defaultTranslator;
}







public static function setDefaultTranslatorTextDomain($textDomain = 'default')
{
static::$defaultTranslatorTextDomain = $textDomain;
}








public static function getDefaultTranslatorTextDomain()
{
return static::$defaultTranslatorTextDomain;
}









public function setTranslatorEnabled($enabled = true)
{
/**
@psalm-suppress */
$this->abstractOptions['translatorEnabled'] = (bool) $enabled;
return $this;
}








public function isTranslatorEnabled()
{
return $this->abstractOptions['translatorEnabled'];
}








public static function getMessageLength()
{
return static::$messageLength;
}







public static function setMessageLength($length = -1)
{
static::$messageLength = $length;
}








protected function translateMessage($messageKey, $message)
{
$translator = $this->getTranslator();
if (! $translator) {
return $message;
}

return $translator->translate($message, $this->getTranslatorTextDomain());
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Laminas\Validator\Barcode\AdapterInterface;
use Laminas\Validator\Exception\InvalidArgumentException;
use Traversable;

use function assert;
use function class_exists;
use function get_debug_type;
use function is_array;
use function is_string;
use function sprintf;
use function strtolower;
use function substr;
use function ucfirst;


class Barcode extends AbstractValidator
{
public const INVALID = 'barcodeInvalid';
public const FAILED = 'barcodeFailed';
public const INVALID_CHARS = 'barcodeInvalidChars';
public const INVALID_LENGTH = 'barcodeInvalidLength';


protected $messageTemplates = [
self::FAILED => 'The input failed checksum validation',
self::INVALID_CHARS => 'The input contains invalid characters',
self::INVALID_LENGTH => 'The input should have a length of %length% characters',
self::INVALID => 'Invalid type given. String expected',
];






protected $messageVariables = [
'length' => ['options' => 'length'],
];








protected $options = [
'adapter' => null, 
'options' => null, 
'length' => null,
'useChecksum' => null,
];






public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if ($options === null) {
$options = [];
}

if (is_string($options) || $options instanceof AdapterInterface) {
$options = ['adapter' => $options];
}

if (! is_array($options)) {
throw new InvalidArgumentException(sprintf(
'Options should be an array, a string representing the name of an adapter, or an adapter instance. '
. 'Received "%s"',
get_debug_type($options),
));
}

parent::__construct($options);
}








public function getAdapter()
{
if (! $this->options['adapter'] instanceof Barcode\AdapterInterface) {
$this->setAdapter('Ean13');
}

assert($this->options['adapter'] instanceof Barcode\AdapterInterface);

return $this->options['adapter'];
}











public function setAdapter($adapter, $options = null)
{
if (is_string($adapter)) {
$adapter = ucfirst(strtolower($adapter));
$adapter = 'Laminas\\Validator\\Barcode\\' . $adapter;

if (! class_exists($adapter)) {
throw new InvalidArgumentException('Barcode adapter matching "' . $adapter . '" not found');
}

$adapter = new $adapter($options);
}

if (! $adapter instanceof Barcode\AdapterInterface) {
throw new InvalidArgumentException(
sprintf(
'Adapter %s does not implement Laminas\\Validator\\Barcode\\AdapterInterface',
get_debug_type($adapter)
)
);
}

$this->options['adapter'] = $adapter;

return $this;
}








public function getChecksum()
{
return $this->getAdapter()->getChecksum();
}









public function useChecksum($checksum = null)
{
return $this->getAdapter()->useChecksum($checksum);
}









public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);
$adapter = $this->getAdapter();
$this->options['length'] = $adapter->getLength();
$result = $adapter->hasValidLength($value);
if (! $result) {
if (is_array($this->options['length'])) {
$temp = $this->options['length'];
$this->options['length'] = '';
foreach ($temp as $length) {
$this->options['length'] .= '/';
$this->options['length'] .= $length;
}

$this->options['length'] = substr($this->options['length'], 1);
}

$this->error(self::INVALID_LENGTH);
return false;
}

$result = $adapter->hasValidCharacters($value);
if (! $result) {
$this->error(self::INVALID_CHARS);
return false;
}

if ($this->useChecksum(null)) {
$result = $adapter->hasValidChecksum($value);
if (! $result) {
$this->error(self::FAILED);
return false;
}
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function array_shift;
use function func_get_args;
use function is_array;
use function is_numeric;
use function is_string;

use const PHP_INT_MAX;






class Between extends AbstractValidator
{
public const NOT_BETWEEN = 'notBetween';
public const NOT_BETWEEN_STRICT = 'notBetweenStrict';
public const VALUE_NOT_NUMERIC = 'valueNotNumeric';
public const VALUE_NOT_STRING = 'valueNotString';




private ?bool $numeric = null;






protected $messageTemplates = [
self::NOT_BETWEEN => "The input is not between '%min%' and '%max%', inclusively",
self::NOT_BETWEEN_STRICT => "The input is not strictly between '%min%' and '%max%'",
self::VALUE_NOT_NUMERIC => "The min ('%min%') and max ('%max%') values are numeric, but the input is not",
self::VALUE_NOT_STRING => "The min ('%min%') and max ('%max%') values are non-numeric strings, "
. 'but the input is not a string',
];






protected $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
];






protected $options = [
'inclusive' => true, 
'min' => 0,
'max' => PHP_INT_MAX,
];











public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}
if (! is_array($options)) {
$temp = [];
/**
@psalm-var */
$options = func_get_args();
$temp['min'] = array_shift($options);
if (! empty($options)) {
$temp['max'] = array_shift($options);
}

if (! empty($options)) {
$temp['inclusive'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('min', $options) || ! array_key_exists('max', $options)) {
throw new Exception\InvalidArgumentException("Missing option: 'min' and 'max' have to be given");
}

if (
(isset($options['min']) && is_numeric($options['min']))
&& (isset($options['max']) && is_numeric($options['max']))
) {
$this->numeric = true;
} elseif (
(isset($options['min']) && is_string($options['min']))
&& (isset($options['max']) && is_string($options['max']))
) {
$this->numeric = false;
} else {
throw new Exception\InvalidArgumentException(
"Invalid options: 'min' and 'max' should be of the same scalar type"
);
}

parent::__construct($options);
}






public function getMin()
{
return $this->options['min'];
}






public function setMin(mixed $min)
{
$this->options['min'] = $min;
return $this;
}






public function getMax()
{
return $this->options['max'];
}






public function setMax(mixed $max)
{
$this->options['max'] = $max;
return $this;
}






public function getInclusive()
{
return $this->options['inclusive'];
}







public function setInclusive($inclusive)
{
$this->options['inclusive'] = $inclusive;
return $this;
}








public function isValid($value)
{
$this->setValue($value);

if ($this->numeric && ! is_numeric($value)) {
$this->error(self::VALUE_NOT_NUMERIC);
return false;
}
if (! $this->numeric && ! is_string($value)) {
$this->error(self::VALUE_NOT_STRING);
return false;
}

if ($this->getInclusive()) {
if ($this->getMin() > $value || $value > $this->getMax()) {
$this->error(self::NOT_BETWEEN);
return false;
}
} else {
if ($this->getMin() >= $value || $value >= $this->getMax()) {
$this->error(self::NOT_BETWEEN_STRICT);
return false;
}
}

return true;
}
}
<?php 

namespace Laminas\Validator\Hostname;





return [
1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu',
2 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu',
4 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu',
5 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu',
6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
8 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu',
9 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
10 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu',
11 => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}\x{30A1}-\x{30F6}\x{30FC}'
. '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}'
. '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}'
. '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}'
. '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}'
. '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}'
. '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}'
. '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}'
. '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}'
. '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}'
. '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}'
. '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}'
. '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}'
. '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}'
. '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}'
. '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}'
. '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}'
. '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}'
. '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}'
. '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}'
. '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}'
. '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}'
. '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}'
. '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}'
. '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}'
. '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}'
. '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}'
. '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}'
. '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}'
. '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}'
. '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}'
. '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}'
. '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}'
. '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}'
. '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}'
. '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}'
. '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}'
. '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}'
. '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}'
. '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}'
. '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}'
. '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}'
. '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}'
. '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}'
. '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}'
. '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}'
. '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}'
. '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}'
. '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}'
. '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}'
. '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}'
. '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}'
. '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}'
. '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}'
. '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}'
. '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}'
. '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}'
. '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}'
. '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}'
. '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}'
. '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}'
. '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}'
. '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}'
. '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}'
. '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}'
. '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}'
. '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}'
. '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}'
. '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}'
. '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}'
. '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}'
. '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}'
. '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}'
. '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}'
. '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}'
. '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}'
. '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}'
. '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}'
. '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}'
. '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}'
. '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}'
. '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}'
. '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}'
. '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}'
. '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}'
. '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}'
. '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}'
. '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}'
. '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}'
. '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}'
. '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}'
. '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}'
. '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}'
. '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}'
. '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}'
. '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}'
. '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}'
. '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}'
. '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}'
. '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}'
. '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}'
. '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}'
. '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}'
. '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}'
. '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}'
. '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}'
. '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}'
. '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}'
. '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}'
. '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}'
. '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}'
. '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}'
. '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}'
. '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}'
. '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}'
. '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}'
. '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}'
. '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}'
. '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}'
. '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}'
. '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}'
. '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}'
. '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}'
. '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}'
. '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}'
. '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}'
. '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}'
. '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}'
. '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}'
. '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}'
. '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}'
. '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}'
. '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}'
. '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}'
. '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}'
. '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}'
. '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}'
. '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}'
. '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}'
. '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}'
. '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}'
. '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}'
. '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}'
. '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}'
. '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}'
. '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}'
. '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}'
. '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}'
. '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}'
. '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}'
. '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}'
. '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}'
. '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}'
. '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}'
. '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}'
. '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}'
. '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}'
. '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}'
. '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}'
. '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}'
. '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}'
. '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}'
. '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}'
. '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}'
. '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}'
. '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}'
. '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}'
. '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}'
. '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}'
. '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}'
. '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}'
. '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}'
. '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}'
. '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}'
. '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}'
. '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}'
. '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}'
. '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}'
. '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}'
. '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}'
. '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}'
. '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}'
. '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}'
. '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}'
. '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}'
. '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}'
. '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}'
. '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}'
. '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}'
. '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}'
. '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}'
. '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}'
. '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}'
. '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}'
. '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}'
. '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}'
. '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}'
. '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}'
. '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}'
. '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}'
. '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}'
. '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}'
. '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}'
. '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}'
. '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}'
. '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}'
. '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}'
. '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}'
. '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}'
. '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}'
. '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}'
. '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}'
. '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}'
. '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}'
. '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}'
. '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}'
. '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}'
. '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}'
. '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}'
. '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}'
. '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}'
. '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}'
. '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}'
. '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}'
. '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}'
. '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}'
. '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}'
. '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}'
. '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}'
. '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}'
. '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}'
. '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}'
. '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}'
. '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}'
. '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}'
. '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}'
. '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}'
. '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}'
. '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}'
. '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}'
. '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}'
. '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}'
. '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}'
. '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}'
. '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}'
. '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}'
. '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}'
. '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}'
. '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}'
. '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}'
. '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}'
. '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}'
. '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}'
. '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}'
. '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}'
. '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}'
. '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}'
. '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}'
. '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}'
. '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}'
. '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}'
. '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}'
. '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}'
. '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}'
. '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}'
. '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}'
. '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}'
. '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}'
. '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}'
. '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}'
. '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}'
. '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}'
. '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}'
. '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}'
. '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}'
. '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}'
. '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}'
. '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}'
. '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}'
. '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}'
. '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}'
. '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}'
. '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}'
. '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}'
. '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}'
. '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}'
. '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}'
. '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}'
. '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}'
. '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}'
. '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}'
. '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}'
. '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}'
. '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}'
. '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}'
. '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}'
. '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}'
. '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}'
. '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}'
. '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}'
. '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}'
. '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}'
. '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}'
. '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}'
. '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}'
. '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}'
. '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}'
. '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}'
. '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}'
. '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}'
. '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}'
. '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}'
. '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}'
. '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}'
. '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}'
. '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}'
. '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}'
. '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}'
. '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}'
. '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}'
. '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}'
. '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}'
. '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}'
. '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}'
. '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}'
. '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}'
. '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}'
. '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}'
. '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}'
. '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}'
. '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}'
. '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}'
. '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}'
. '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}'
. '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}'
. '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}'
. '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}'
. '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}'
. '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}'
. '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}'
. '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}'
. '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}'
. '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}'
. '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}'
. '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}'
. '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}'
. '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}'
. '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}'
. '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}'
. '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}'
. '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}'
. '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}'
. '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}'
. '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}'
. '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}'
. '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}'
. '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}'
. '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}'
. '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}'
. '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}'
. '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}'
. '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}'
. '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}'
. '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}'
. '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}'
. '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}'
. '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}'
. '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}'
. '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}'
. '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}'
. '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}'
. '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}'
. '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}'
. '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}'
. '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}'
. '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}'
. '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}'
. '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}'
. '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}'
. '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}'
. '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}'
. '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}'
. '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}'
. '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}'
. '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}'
. '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}'
. '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}'
. '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}'
. '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}'
. '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}'
. '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}'
. '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}'
. '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}'
. '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}'
. '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}'
. '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}'
. '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}'
. '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}'
. '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}'
. '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}'
. '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}'
. '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}'
. '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}'
. '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}'
. '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}'
. '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}'
. '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}'
. '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}'
. '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}'
. '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}'
. '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}'
. '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}'
. '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}'
. '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}'
. '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}'
. '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}'
. '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}'
. '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}'
. '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}'
. '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}'
. '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}'
. '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}'
. '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}'
. '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}'
. '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}'
. '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}'
. '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}'
. '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}'
. '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}'
. '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}'
. '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}'
. '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}'
. '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}'
. '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}'
. '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}'
. '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}'
. '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}'
. '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}'
. '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}'
. '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}'
. '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}'
. '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}'
. '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}'
. '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}'
. '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}'
. '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}'
. '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}'
. '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}'
. '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}'
. '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}'
. '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}'
. '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}'
. '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}'
. '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}'
. '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}'
. '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}'
. '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}'
. '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}'
. '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}'
. '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}'
. '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}'
. '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}'
. '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}'
. '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}'
. '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}'
. '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}'
. '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}'
. '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}'
. '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}'
. '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}'
. '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}'
. '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}'
. '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}'
. '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}'
. '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}'
. '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}'
. '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}'
. '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}'
. '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}'
. '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}'
. '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}'
. '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}'
. '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}'
. '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}'
. '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}'
. '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}'
. '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}'
. '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}'
. '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}'
. '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}'
. '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}'
. '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}'
. '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}'
. '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}'
. '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}'
. '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}'
. '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}'
. '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}'
. '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}'
. '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}'
. '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}'
. '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}'
. '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}'
. '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}'
. '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}'
. '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}'
. '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}'
. '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}'
. '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}'
. '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}'
. '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}'
. '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}'
. '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}'
. '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}'
. '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}'
. '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}'
. '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}'
. '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}'
. '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}'
. '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}'
. '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}'
. '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}'
. '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}'
. '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}'
. '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}'
. '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}'
. '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}'
. '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}'
. '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}'
. '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}'
. '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}'
. '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}'
. '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}'
. '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}'
. '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}'
. '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}'
. '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}'
. '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}'
. '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}'
. '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}'
. '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}'
. '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}'
. '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}'
. '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}'
. '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}'
. '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}'
. '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}'
. '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}'
. '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}'
. '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}'
. '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}'
. '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}'
. '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}'
. '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}'
. '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}'
. '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}'
. '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}'
. '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}'
. '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}'
. '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}'
. '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}'
. '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}'
. '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}'
. '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}'
. '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}'
. '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}'
. '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}'
. '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}'
. '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}'
. '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}'
. '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}'
. '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}'
. '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}'
. '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}'
. '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}'
. '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}'
. '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}'
. '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}'
. '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}'
. '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}'
. '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}'
. '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}'
. '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}'
. '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}'
. '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}'
. '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}'
. '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}'
. '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}'
. '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}'
. '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}'
. '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}'
. '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}'
. '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}'
. '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}'
. '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}'
. '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}'
. '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}'
. '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}'
. '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}'
. '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}'
. '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}'
. '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}'
. '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}'
. '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}'
. '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}'
. '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}'
. '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}'
. '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}'
. '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}'
. '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}'
. '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}'
. '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}'
. '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}'
. '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}'
. '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}'
. '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}'
. '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}'
. '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}'
. '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}'
. '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}'
. '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}'
. '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}'
. '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}'
. '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}'
. '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}'
. '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}'
. '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}'
. '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}'
. '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}'
. '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}'
. '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}'
. '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}'
. '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}'
. '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}'
. '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}'
. '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}'
. '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}'
. '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}'
. '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}'
. '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}'
. '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}'
. '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}'
. '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}'
. '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}'
. '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}'
. '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}'
. '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}'
. '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}'
. '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}'
. '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}'
. '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}'
. '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}'
. '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}'
. '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}'
. '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}'
. '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}'
. '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}'
. '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}'
. '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}'
. '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}'
. '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}'
. '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}'
. '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}'
. '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}'
. '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}'
. '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}'
. '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}'
. '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}'
. '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}'
. '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}'
. '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}'
. '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}'
. '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}'
. '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}'
. '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}'
. '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}'
. '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}'
. '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}'
. '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}'
. '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}'
. '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}'
. '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}'
. '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}'
. '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}'
. '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}'
. '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}'
. '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}'
. '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}'
. '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}'
. '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}'
. '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}'
. '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}'
. '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}'
. '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}'
. '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}'
. '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}'
. '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}'
. '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}'
. '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}'
. '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}'
. '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}'
. '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}'
. '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}'
. '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}'
. '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}'
. '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}'
. '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}'
. '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu',
12 => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}'
. '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}'
. '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}'
. '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}'
. '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}-\x{4CA3}\x{4D13}-\x{4D19}\x{4DAE}'
. '\x{4E00}-\x{4E11}\x{4E13}-\x{4E28}\x{4E2A}-\x{4E54}\x{4E56}-\x{4E67}'
. '\x{4E69}-\x{4E78}\x{4E7A}-\x{4E89}\x{4E8B}-\x{4E95}\x{4E97}-\x{4EA2}'
. '\x{4EA4}-\x{4EBB}\x{4EBD}-\x{4ECB}\x{4ECD}-\x{4EE6}\x{4EE8}-\x{4EEC}'
. '\x{4EEF}-\x{4EF7}\x{4EFB}\x{4EFD}\x{4EFF}-\x{4F06}\x{4F08}-\x{4F15}'
. '\x{4F17}-\x{4F27}\x{4F29}-\x{4F30}\x{4F32}-\x{4F34}\x{4F36}\x{4F38}-\x{4F3F}'
. '\x{4F41}-\x{4F43}\x{4F45}-\x{4F70}\x{4F72}-\x{4F8B}\x{4F8D}\x{4F8F}-\x{4FA1}'
. '\x{4FA3}-\x{4FAC}\x{4FAE}-\x{4FBC}\x{4FBE}-\x{4FC5}\x{4FC7}\x{4FC9}-\x{4FCB}'
. '\x{4FCD}-\x{4FE1}\x{4FE3}-\x{4FFB}\x{4FFE}-\x{500F}\x{5011}-\x{5033}'
. '\x{5035}-\x{5037}\x{5039}-\x{503C}\x{503E}-\x{5041}\x{5043}-\x{504F}\x{5051}'
. '\x{5053}-\x{5057}\x{5059}-\x{507B}\x{507D}-\x{5080}\x{5082}-\x{5092}'
. '\x{5094}-\x{5096}\x{5098}-\x{509E}\x{50A2}-\x{50B8}\x{50BA}-\x{50C2}'
. '\x{50C4}-\x{50D7}\x{50D9}-\x{50DE}\x{50E0}\x{50E3}-\x{50EA}\x{50EC}-\x{50F3}'
. '\x{50F5}\x{50F6}\x{50F8}-\x{511A}\x{511C}-\x{5127}\x{5129}\x{512A}'
. '\x{512C}-\x{5141}\x{5143}-\x{5149}\x{514B}-\x{514E}\x{5150}-\x{5152}'
. '\x{5154}-\x{5157}\x{5159}-\x{515F}\x{5161}-\x{5163}\x{5165}-\x{5171}'
. '\x{5173}-\x{517D}\x{517F}-\x{5182}\x{5185}-\x{518D}\x{518F}-\x{51A0}\x{51A2}'
. '\x{51A4}-\x{51A8}\x{51AA}-\x{51AC}\x{51AE}-\x{51B3}\x{51B5}-\x{51B7}\x{51B9}'
. '\x{51BB}-\x{51C1}\x{51C3}-\x{51D1}\x{51D4}-\x{51DE}\x{51E0}-\x{51E5}'
. '\x{51E7}-\x{51EB}\x{51ED}\x{51EF}-\x{51F1}\x{51F3}-\x{5226}\x{5228}-\x{524E}'
. '\x{5250}-\x{5252}\x{5254}-\x{5265}\x{5267}-\x{5270}\x{5272}-\x{5278}'
. '\x{527A}-\x{5284}\x{5286}-\x{528D}\x{528F}-\x{52A3}\x{52A5}-\x{52C3}\x{52C6}'
. '\x{52C7}\x{52C9}-\x{52CB}\x{52CD}\x{52CF}\x{52D0}\x{52D2}\x{52D3}'
. '\x{52D5}-\x{52E0}\x{52E2}-\x{52E4}\x{52E6}-\x{52ED}\x{52EF}-\x{5302}'
. '\x{5305}-\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}-\x{5326}\x{5328}'
. '\x{532A}-\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}-\x{5341}\x{5343}-\x{535A}'
. '\x{535C}\x{535E}-\x{5367}\x{5369}\x{536B}\x{536C}\x{536E}-\x{537F}'
. '\x{5381}-\x{53A0}\x{53A2}-\x{53A9}\x{53AC}-\x{53AE}\x{53B0}-\x{53B9}'
. '\x{53BB}-\x{53C4}\x{53C6}-\x{53CE}\x{53D0}-\x{53D9}\x{53DB}\x{53DC}'
. '\x{53DF}-\x{53E6}\x{53E8}-\x{53FE}\x{5401}-\x{5419}\x{541B}-\x{5421}'
. '\x{5423}-\x{544B}\x{544D}-\x{545C}\x{545E}-\x{5468}\x{546A}-\x{5489}'
. '\x{548B}-\x{54B4}\x{54B6}-\x{54F5}\x{54F7}-\x{5514}\x{5516}\x{5517}'
. '\x{551A}-\x{5546}\x{5548}-\x{555F}\x{5561}-\x{5579}\x{557B}-\x{55DF}'
. '\x{55E1}-\x{55F7}\x{55F9}-\x{5604}\x{5606}-\x{5609}\x{560C}-\x{561F}'
. '\x{5621}-\x{562A}\x{562C}-\x{5636}\x{5638}-\x{563B}\x{563D}-\x{5643}'
. '\x{5645}-\x{564A}\x{564C}-\x{5650}\x{5652}-\x{5655}\x{5657}-\x{565E}\x{5660}'
. '\x{5662}-\x{5674}\x{5676}-\x{567C}\x{567E}-\x{5687}\x{568A}\x{568C}-\x{5695}'
. '\x{5697}-\x{569D}\x{569F}-\x{56A1}\x{56A3}-\x{56B9}\x{56BB}-\x{56CE}'
. '\x{56D0}-\x{56D8}\x{56DA}-\x{56E5}\x{56E7}-\x{56F5}\x{56F7}\x{56F9}\x{56FA}'
. '\x{56FD}-\x{5704}\x{5706}-\x{5710}\x{5712}-\x{5716}\x{5718}-\x{5720}\x{5722}'
. '\x{5723}\x{5725}-\x{573C}\x{573E}-\x{5742}\x{5744}-\x{5747}\x{5749}-\x{5754}'
. '\x{5757}\x{5759}-\x{5762}\x{5764}-\x{576D}\x{576F}-\x{5777}\x{5779}-\x{5780}'
. '\x{5782}-\x{5786}\x{5788}-\x{5795}\x{5797}-\x{57A7}\x{57A9}-\x{57C9}'
. '\x{57CB}-\x{57D0}\x{57D2}-\x{57D6}\x{57D8}-\x{57DA}\x{57DC}\x{57DD}'
. '\x{57DF}-\x{5816}\x{5819}-\x{5840}\x{5842}-\x{584F}\x{5851}-\x{5855}'
. '\x{5857}-\x{585F}\x{5861}-\x{5865}\x{5868}-\x{5876}\x{5878}-\x{5894}'
. '\x{5896}-\x{58A9}\x{58AB}-\x{58B4}\x{58B7}-\x{58BF}\x{58C1}\x{58C2}'
. '\x{58C5}-\x{58CB}\x{58CE}\x{58CF}\x{58D1}-\x{58DB}\x{58DD}-\x{58E0}'
. '\x{58E2}-\x{58E5}\x{58E7}-\x{58F4}\x{58F6}-\x{5900}\x{5902}-\x{5904}\x{5906}'
. '\x{5907}\x{5909}-\x{5910}\x{5912}\x{5914}-\x{5922}\x{5924}-\x{5932}\x{5934}'
. '\x{5935}\x{5937}-\x{5958}\x{595A}\x{595C}-\x{599A}\x{599C}-\x{59B6}'
. '\x{59B8}-\x{59E6}\x{59E8}-\x{5A23}\x{5A25}\x{5A27}-\x{5A2B}\x{5A2D}-\x{5A2F}'
. '\x{5A31}-\x{5A53}\x{5A55}-\x{5A58}\x{5A5A}-\x{5A6E}\x{5A70}\x{5A72}-\x{5A86}'
. '\x{5A88}-\x{5A8C}\x{5A8E}-\x{5AAA}\x{5AAC}-\x{5ACF}\x{5AD1}\x{5AD2}'
. '\x{5AD4}-\x{5AEE}\x{5AF1}-\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}-\x{5B38}'
. '\x{5B3A}-\x{5B45}\x{5B47}-\x{5B4E}\x{5B50}\x{5B51}\x{5B53}-\x{5B5F}'
. '\x{5B62}-\x{5B6E}\x{5B70}-\x{5B78}\x{5B7A}-\x{5B7D}\x{5B7F}-\x{5B85}'
. '\x{5B87}-\x{5B8F}\x{5B91}-\x{5BA8}\x{5BAA}-\x{5BB1}\x{5BB3}-\x{5BB6}'
. '\x{5BB8}-\x{5BBB}\x{5BBD}-\x{5BC7}\x{5BCA}-\x{5BD6}\x{5BD8}\x{5BD9}'
. '\x{5BDB}-\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}-\x{5C1A}\x{5C1C}-\x{5C22}\x{5C24}'
. '\x{5C25}\x{5C27}\x{5C28}\x{5C2A}-\x{5C35}\x{5C37}-\x{5C59}\x{5C5B}-\x{5C84}'
. '\x{5C86}-\x{5CB3}\x{5CB5}-\x{5CB8}\x{5CBA}-\x{5CBF}\x{5CC1}-\x{5CD4}'
. '\x{5CD6}-\x{5CDC}\x{5CDE}-\x{5CF4}\x{5CF6}-\x{5D2A}\x{5D2C}-\x{5D2E}'
. '\x{5D30}-\x{5D3A}\x{5D3C}-\x{5D52}\x{5D54}-\x{5D56}\x{5D58}-\x{5D5B}'
. '\x{5D5D}-\x{5D5F}\x{5D61}-\x{5D82}\x{5D84}-\x{5D95}\x{5D97}-\x{5DA2}'
. '\x{5DA5}-\x{5DAA}\x{5DAC}-\x{5DB2}\x{5DB4}-\x{5DB8}\x{5DBA}-\x{5DC3}'
. '\x{5DC5}-\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}-\x{5DF5}\x{5DF7}-\x{5E11}'
. '\x{5E13}-\x{5E3E}\x{5E40}-\x{5E47}\x{5E49}-\x{5E50}\x{5E52}-\x{5E91}'
. '\x{5E93}-\x{5EB9}\x{5EBB}-\x{5EBF}\x{5EC1}-\x{5EEA}\x{5EEC}-\x{5EF8}'
. '\x{5EFA}-\x{5F08}\x{5F0A}-\x{5F0D}\x{5F0F}\x{5F11}-\x{5F3A}\x{5F3C}'
. '\x{5F3E}-\x{5F8E}\x{5F90}-\x{5F99}\x{5F9B}-\x{5FA2}\x{5FA5}-\x{5FAF}'
. '\x{5FB1}-\x{5FC1}\x{5FC3}-\x{5FCD}\x{5FCF}-\x{5FDA}\x{5FDC}-\x{5FDE}\x{5FE0}'
. '\x{5FE1}\x{5FE3}-\x{5FEB}\x{5FED}-\x{5FFB}\x{5FFD}-\x{6022}\x{6024}-\x{6055}'
. '\x{6057}-\x{605F}\x{6062}-\x{6070}\x{6072}\x{6073}\x{6075}-\x{6090}\x{6092}'
. '\x{6094}-\x{60A4}\x{60A6}-\x{60A8}\x{60AA}-\x{60D1}\x{60D3}-\x{60D5}'
. '\x{60D7}-\x{60DD}\x{60DF}-\x{60E2}\x{60E4}\x{60E6}-\x{60FC}\x{60FE}-\x{6101}'
. '\x{6103}-\x{6106}\x{6108}-\x{6110}\x{6112}-\x{611D}\x{611F}\x{6120}'
. '\x{6122}-\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}-\x{615F}'
. '\x{6161}-\x{616E}\x{6170}-\x{617A}\x{617C}\x{617E}\x{6180}-\x{6185}'
. '\x{6187}-\x{6196}\x{6198}-\x{619B}\x{619D}-\x{61B8}\x{61BA}\x{61BC}-\x{61D2}'
. '\x{61D4}\x{61D6}-\x{61EB}\x{61ED}\x{61EE}\x{61F0}-\x{61F3}\x{61F5}-\x{6204}'
. '\x{6206}-\x{6234}\x{6236}-\x{6238}\x{623A}-\x{6256}\x{6258}-\x{6281}'
. '\x{6283}-\x{628C}\x{628E}-\x{629C}\x{629E}-\x{62A5}\x{62A7}-\x{62DD}'
. '\x{62DF}-\x{62E9}\x{62EB}-\x{6309}\x{630B}-\x{6316}\x{6318}-\x{6330}'
. '\x{6332}-\x{6334}\x{6336}\x{6338}-\x{633E}\x{6340}-\x{635A}\x{635C}-\x{637E}'
. '\x{6380}-\x{638A}\x{638C}-\x{6392}\x{6394}-\x{63BA}\x{63BC}-\x{63D0}'
. '\x{63D2}-\x{6406}\x{6408}-\x{643A}\x{643D}-\x{6441}\x{6443}-\x{6448}'
. '\x{644A}-\x{6459}\x{645B}-\x{647D}\x{647F}-\x{6485}\x{6487}-\x{64A0}'
. '\x{64A2}-\x{64AE}\x{64B0}-\x{64B5}\x{64B7}-\x{64C7}\x{64C9}-\x{64D4}'
. '\x{64D6}-\x{64E0}\x{64E2}-\x{64E4}\x{64E6}-\x{64ED}\x{64EF}-\x{64F4}'
. '\x{64F6}-\x{64F8}\x{64FA}-\x{6501}\x{6503}-\x{6509}\x{650B}-\x{651E}'
. '\x{6520}-\x{6527}\x{6529}-\x{653F}\x{6541}\x{6543}-\x{6559}\x{655B}-\x{655E}'
. '\x{6560}-\x{656C}\x{656E}-\x{657C}\x{657E}-\x{6589}\x{658B}-\x{6599}'
. '\x{659B}-\x{65B4}\x{65B6}-\x{65BD}\x{65BF}-\x{65C7}\x{65CA}-\x{65D0}'
. '\x{65D2}-\x{65D7}\x{65DA}\x{65DB}\x{65DD}-\x{65E3}\x{65E5}-\x{65E9}'
. '\x{65EB}-\x{65F8}\x{65FA}-\x{65FD}\x{6600}-\x{6616}\x{6618}-\x{661D}'
. '\x{661F}-\x{662B}\x{662D}-\x{6636}\x{6639}\x{663A}\x{663C}-\x{663E}'
. '\x{6640}-\x{6647}\x{6649}-\x{664C}\x{664E}-\x{665F}\x{6661}\x{6662}'
. '\x{6664}-\x{6666}\x{6668}-\x{6691}\x{6693}-\x{669B}\x{669D}\x{669F}-\x{66AB}'
. '\x{66AE}-\x{66CF}\x{66D1}\x{66D2}\x{66D4}-\x{66D6}\x{66D8}-\x{66DE}'
. '\x{66E0}-\x{66EE}\x{66F0}-\x{66FC}\x{66FE}-\x{6701}\x{6703}-\x{6706}'
. '\x{6708}-\x{6718}\x{671A}-\x{6723}\x{6725}-\x{6728}\x{672A}-\x{6766}'
. '\x{6768}-\x{6787}\x{6789}-\x{6795}\x{6797}-\x{67A8}\x{67AA}-\x{67BC}\x{67BE}'
. '\x{67C0}-\x{67D4}\x{67D6}\x{67D8}-\x{67F8}\x{67FA}-\x{6800}\x{6802}-\x{6814}'
. '\x{6816}-\x{681D}\x{681F}-\x{6826}\x{6828}-\x{682F}\x{6831}-\x{6857}\x{685B}'
. '\x{685D}\x{6860}-\x{6879}\x{687B}-\x{6894}\x{6896}-\x{6898}\x{689A}-\x{68A4}'
. '\x{68A6}-\x{68B7}\x{68B9}\x{68BB}-\x{68C2}\x{68C4}\x{68C6}-\x{68D8}'
. '\x{68DA}-\x{68E1}\x{68E3}\x{68E4}\x{68E6}-\x{68FF}\x{6901}-\x{6908}'
. '\x{690A}-\x{693D}\x{693F}-\x{694C}\x{694E}-\x{699E}\x{69A0}\x{69A1}'
. '\x{69A3}-\x{69BF}\x{69C1}-\x{69D0}\x{69D3}\x{69D4}\x{69D8}-\x{69F8}'
. '\x{69FA}-\x{6A02}\x{6A04}-\x{6A0B}\x{6A0D}-\x{6A1B}\x{6A1D}-\x{6A23}'
. '\x{6A25}-\x{6A36}\x{6A38}-\x{6A49}\x{6A4B}-\x{6A52}\x{6A54}-\x{6A5B}'
. '\x{6A5D}-\x{6A6D}\x{6A6F}\x{6A71}-\x{6A85}\x{6A87}-\x{6A89}\x{6A8B}-\x{6A8E}'
. '\x{6A90}-\x{6A98}\x{6A9A}-\x{6A9C}\x{6A9E}-\x{6AA9}\x{6AAB}-\x{6AB0}'
. '\x{6AB2}-\x{6ABD}\x{6ABF}\x{6AC1}-\x{6AC3}\x{6AC5}-\x{6AC7}\x{6ACA}-\x{6AD7}'
. '\x{6AD9}-\x{6AE8}\x{6AEA}-\x{6B0D}\x{6B0F}-\x{6B1A}\x{6B1C}-\x{6B2D}'
. '\x{6B2F}-\x{6B34}\x{6B36}-\x{6B3F}\x{6B41}-\x{6B56}\x{6B59}-\x{6B5C}'
. '\x{6B5E}-\x{6B67}\x{6B69}-\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}-\x{6B74}'
. '\x{6B76}-\x{6B7C}\x{6B7E}-\x{6BB0}\x{6BB2}-\x{6BB7}\x{6BB9}-\x{6BE8}'
. '\x{6BEA}-\x{6BF0}\x{6BF2}\x{6BF3}\x{6BF5}-\x{6BF9}\x{6BFB}-\x{6C09}'
. '\x{6C0B}-\x{6C16}\x{6C18}-\x{6C1B}\x{6C1D}-\x{6C2C}\x{6C2E}-\x{6C38}\x{6C3A}'
. '\x{6C3B}\x{6C3D}-\x{6C44}\x{6C46}-\x{6C6B}\x{6C6D}\x{6C6F}-\x{6C9F}'
. '\x{6CA1}-\x{6CD7}\x{6CD9}-\x{6CF3}\x{6CF5}-\x{6D01}\x{6D03}-\x{6D1B}'
. '\x{6D1D}-\x{6D23}\x{6D25}-\x{6D70}\x{6D72}-\x{6D80}\x{6D82}-\x{6D95}'
. '\x{6D97}-\x{6D9B}\x{6D9D}-\x{6DAF}\x{6DB2}-\x{6DB5}\x{6DB7}-\x{6DFD}\x{6E00}'
. '\x{6E03}-\x{6E05}\x{6E07}-\x{6E11}\x{6E14}-\x{6E17}\x{6E19}-\x{6E29}'
. '\x{6E2B}-\x{6E4B}\x{6E4D}-\x{6E6B}\x{6E6D}-\x{6E75}\x{6E77}-\x{6E79}'
. '\x{6E7E}-\x{6E8A}\x{6E8D}-\x{6E94}\x{6E96}-\x{6EDA}\x{6EDC}\x{6EDE}-\x{6EE2}'
. '\x{6EE4}-\x{6F03}\x{6F05}-\x{6F0A}\x{6F0C}-\x{6F41}\x{6F43}-\x{6F47}\x{6F49}'
. '\x{6F4B}-\x{6F78}\x{6F7A}-\x{6F97}\x{6F99}\x{6F9B}-\x{6F9E}\x{6FA0}-\x{6FB6}'
. '\x{6FB8}-\x{6FC4}\x{6FC6}-\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}-\x{6FF4}'
. '\x{6FF6}-\x{6FFC}\x{6FFE}-\x{700F}\x{7011}\x{7012}\x{7014}-\x{701D}'
. '\x{701F}-\x{7046}\x{7048}-\x{704A}\x{704C}\x{704D}\x{704F}-\x{7071}'
. '\x{7074}-\x{707A}\x{707C}-\x{7080}\x{7082}-\x{708C}\x{708E}-\x{7096}'
. '\x{7098}-\x{709A}\x{709C}-\x{70A9}\x{70AB}-\x{70B1}\x{70B3}-\x{70B5}'
. '\x{70B7}-\x{70D4}\x{70D6}-\x{70FD}\x{70FF}-\x{7107}\x{7109}-\x{7113}'
. '\x{7115}-\x{7123}\x{7125}-\x{7132}\x{7135}-\x{713B}\x{713D}-\x{7154}\x{7156}'
. '\x{7158}-\x{716A}\x{716C}\x{716E}-\x{718C}\x{718E}-\x{7195}\x{7197}-\x{71A5}'
. '\x{71A7}-\x{71AA}\x{71AC}-\x{71B5}\x{71B7}-\x{71CB}\x{71CD}-\x{71D2}'
. '\x{71D4}-\x{71F2}\x{71F4}-\x{71F9}\x{71FB}-\x{71FF}\x{7201}-\x{720A}'
. '\x{720C}-\x{7210}\x{7212}-\x{7214}\x{7216}\x{7218}-\x{721F}\x{7221}-\x{7223}'
. '\x{7226}-\x{722E}\x{7230}-\x{7233}\x{7235}-\x{7244}\x{7246}-\x{724D}\x{724F}'
. '\x{7251}-\x{7254}\x{7256}-\x{729F}\x{72A1}-\x{72AA}\x{72AC}-\x{72BD}'
. '\x{72BF}-\x{7301}\x{7303}-\x{730F}\x{7311}-\x{731E}\x{7320}-\x{7327}'
. '\x{7329}-\x{732E}\x{7330}-\x{734E}\x{7350}-\x{7352}\x{7354}-\x{7362}'
. '\x{7364}-\x{739B}\x{739D}-\x{73C0}\x{73C2}-\x{73E0}\x{73E2}\x{73E3}'
. '\x{73E5}-\x{73F2}\x{73F4}-\x{73FA}\x{73FC}-\x{7417}\x{7419}-\x{7438}'
. '\x{743A}-\x{743D}\x{743F}-\x{7446}\x{7448}\x{744A}-\x{7457}\x{7459}-\x{745F}'
. '\x{7461}-\x{747A}\x{747C}-\x{7483}\x{7485}-\x{7495}\x{7497}-\x{749C}'
. '\x{749E}-\x{74A1}\x{74A3}-\x{74C6}\x{74CA}\x{74CB}\x{74CD}-\x{74EA}'
. '\x{74EC}-\x{750D}\x{750F}-\x{751F}\x{7521}-\x{7533}\x{7535}-\x{7540}'
. '\x{7542}-\x{7549}\x{754B}-\x{7551}\x{7553}\x{7554}\x{7556}-\x{755D}\x{755F}'
. '\x{7560}\x{7562}-\x{7570}\x{7572}\x{7574}-\x{7579}\x{757C}-\x{7584}'
. '\x{7586}-\x{758D}\x{758F}-\x{75A8}\x{75AA}-\x{75B6}\x{75B8}-\x{75DB}'
. '\x{75DD}-\x{75E8}\x{75EA}-\x{75ED}\x{75EF}-\x{762B}\x{762D}-\x{7643}'
. '\x{7646}-\x{764D}\x{764F}\x{7650}\x{7652}-\x{7654}\x{7656}-\x{7672}'
. '\x{7674}-\x{7679}\x{767B}-\x{768C}\x{768E}-\x{76A0}\x{76A3}\x{76A4}\x{76A6}'
. '\x{76A7}\x{76A9}-\x{76B2}\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}-\x{76C0}'
. '\x{76C2}-\x{76CA}\x{76CD}-\x{76D8}\x{76DA}-\x{76EA}\x{76EC}-\x{76FF}\x{7701}'
. '\x{7703}-\x{770D}\x{770F}-\x{7720}\x{7722}\x{7723}\x{7725}-\x{772A}'
. '\x{772C}-\x{773E}\x{7740}\x{7741}\x{7743}-\x{7763}\x{7765}-\x{7795}'
. '\x{7797}-\x{77A3}\x{77A5}-\x{77BD}\x{77BF}\x{77C0}\x{77C2}-\x{77D1}'
. '\x{77D3}-\x{77DC}\x{77DE}-\x{77E3}\x{77E5}\x{77E7}-\x{77F3}\x{77F6}-\x{7806}'
. '\x{7808}-\x{7823}\x{7825}-\x{7835}\x{7837}-\x{783E}\x{7840}\x{7841}'
. '\x{7843}-\x{7845}\x{7847}-\x{784A}\x{784C}-\x{784E}\x{7850}-\x{7875}'
. '\x{7877}-\x{7887}\x{7889}-\x{78C1}\x{78C3}-\x{78C6}\x{78C8}-\x{78D1}'
. '\x{78D3}-\x{78EF}\x{78F1}-\x{78F7}\x{78F9}-\x{78FF}\x{7901}-\x{7907}'
. '\x{7909}-\x{790C}\x{790E}-\x{7914}\x{7916}-\x{791E}\x{7921}-\x{7931}'
. '\x{7933}-\x{7935}\x{7937}-\x{7958}\x{795A}-\x{796B}\x{796D}\x{796F}-\x{7974}'
. '\x{7977}-\x{7985}\x{7988}-\x{799C}\x{799F}-\x{79A8}\x{79AA}-\x{79BB}'
. '\x{79BD}-\x{79C3}\x{79C5}\x{79C6}\x{79C8}-\x{79CB}\x{79CD}-\x{79D3}\x{79D5}'
. '\x{79D6}\x{79D8}-\x{7A00}\x{7A02}-\x{7A06}\x{7A08}\x{7A0A}-\x{7A2B}'
. '\x{7A2D}-\x{7A35}\x{7A37}\x{7A39}\x{7A3B}-\x{7A4E}\x{7A50}-\x{7A62}'
. '\x{7A65}-\x{7A69}\x{7A6B}-\x{7A6E}\x{7A70}-\x{7A81}\x{7A83}-\x{7A99}'
. '\x{7A9C}-\x{7AB8}\x{7ABA}\x{7ABE}-\x{7AC1}\x{7AC4}\x{7AC5}\x{7AC7}-\x{7AD6}'
. '\x{7AD8}\x{7AD9}\x{7ADB}-\x{7AE8}\x{7AEA}-\x{7AF4}\x{7AF6}-\x{7AFB}'
. '\x{7AFD}-\x{7B06}\x{7B08}-\x{7B1E}\x{7B20}-\x{7B26}\x{7B28}\x{7B2A}-\x{7B41}'
. '\x{7B43}-\x{7B52}\x{7B54}-\x{7B6E}\x{7B70}-\x{7B79}\x{7B7B}-\x{7B85}'
. '\x{7B87}-\x{7B91}\x{7B93}-\x{7BA2}\x{7BA4}\x{7BA6}-\x{7BAF}\x{7BB1}'
. '\x{7BB3}-\x{7BCE}\x{7BD0}-\x{7BF9}\x{7BFB}-\x{7C13}\x{7C15}-\x{7C1A}'
. '\x{7C1C}-\x{7C2D}\x{7C30}-\x{7C4E}\x{7C50}\x{7C51}\x{7C53}\x{7C54}'
. '\x{7C56}-\x{7C5C}\x{7C5E}-\x{7C75}\x{7C77}-\x{7C82}\x{7C84}-\x{7C86}'
. '\x{7C88}-\x{7C92}\x{7C94}-\x{7C99}\x{7C9B}-\x{7CAA}\x{7CAD}-\x{7CD2}'
. '\x{7CD4}-\x{7CD9}\x{7CDC}-\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}-\x{7CFB}\x{7CFD}'
. '\x{7CFE}\x{7D00}-\x{7D22}\x{7D24}-\x{7D29}\x{7D2B}\x{7D2C}\x{7D2E}-\x{7D47}'
. '\x{7D49}-\x{7D4C}\x{7D4E}-\x{7D59}\x{7D5B}-\x{7D63}\x{7D65}-\x{7D77}'
. '\x{7D79}-\x{7D81}\x{7D83}-\x{7D94}\x{7D96}\x{7D97}\x{7D99}\x{7D9B}-\x{7DA3}'
. '\x{7DA5}-\x{7DA7}\x{7DA9}-\x{7DCC}\x{7DCE}-\x{7DD2}\x{7DD4}-\x{7DDB}'
. '\x{7DDD}-\x{7DE3}\x{7DE6}-\x{7DEA}\x{7DEC}-\x{7DFC}\x{7E00}-\x{7E17}'
. '\x{7E19}-\x{7E49}\x{7E4C}-\x{7E5A}\x{7E5C}-\x{7E63}\x{7E65}-\x{7E9C}'
. '\x{7E9E}-\x{7F3A}\x{7F3D}-\x{7F40}\x{7F42}-\x{7F45}\x{7F47}-\x{7F58}'
. '\x{7F5A}-\x{7F83}\x{7F85}-\x{7F8F}\x{7F91}-\x{7F96}\x{7F98}\x{7F9A}-\x{7FB3}'
. '\x{7FB5}-\x{7FD5}\x{7FD7}-\x{7FDC}\x{7FDE}-\x{7FE3}\x{7FE5}-\x{8009}'
. '\x{800B}-\x{802E}\x{8030}-\x{803B}\x{803D}-\x{803F}\x{8041}-\x{8065}'
. '\x{8067}-\x{8087}\x{8089}-\x{808D}\x{808F}-\x{8093}\x{8095}-\x{80A5}'
. '\x{80A9}-\x{80AB}\x{80AD}-\x{80B2}\x{80B4}-\x{80B8}\x{80BA}-\x{80DE}'
. '\x{80E0}-\x{8102}\x{8105}-\x{8116}\x{8118}-\x{8132}\x{8136}-\x{815E}'
. '\x{8160}-\x{8183}\x{8185}-\x{818F}\x{8191}-\x{8195}\x{8197}-\x{81CA}'
. '\x{81CC}-\x{81D2}\x{81D4}-\x{81E3}\x{81E5}-\x{81EE}\x{81F1}-\x{8212}'
. '\x{8214}-\x{8216}\x{8218}-\x{8223}\x{8225}-\x{822D}\x{822F}-\x{8240}'
. '\x{8242}-\x{8261}\x{8263}\x{8264}\x{8266}-\x{828B}\x{828D}-\x{82B1}'
. '\x{82B3}-\x{82E1}\x{82E3}-\x{82FB}\x{82FD}-\x{8309}\x{830B}-\x{830F}'
. '\x{8311}-\x{832F}\x{8331}-\x{8354}\x{8356}-\x{839E}\x{83A0}-\x{83B4}'
. '\x{83B6}-\x{83BD}\x{83BF}-\x{83E5}\x{83E7}-\x{83EC}\x{83EE}-\x{8413}\x{8415}'
. '\x{8418}-\x{841E}\x{8421}-\x{8457}\x{8459}-\x{8482}\x{8484}-\x{8494}'
. '\x{8496}-\x{84AC}\x{84AE}-\x{84B6}\x{84B8}-\x{84C2}\x{84C4}-\x{84D9}'
. '\x{84DB}-\x{84EC}\x{84EE}-\x{8504}\x{8506}-\x{850F}\x{8511}-\x{8531}'
. '\x{8534}-\x{854B}\x{854D}-\x{854F}\x{8551}-\x{857E}\x{8580}-\x{8592}'
. '\x{8594}-\x{8596}\x{8598}-\x{85B1}\x{85B3}-\x{85BA}\x{85BC}-\x{85CB}'
. '\x{85CD}-\x{85ED}\x{85EF}-\x{85F2}\x{85F4}-\x{85FB}\x{85FD}-\x{8602}'
. '\x{8604}-\x{860C}\x{860F}\x{8611}-\x{8614}\x{8616}-\x{861C}\x{861E}-\x{8636}'
. '\x{8638}-\x{8656}\x{8658}-\x{8674}\x{8676}-\x{8688}\x{868A}-\x{8691}'
. '\x{8693}-\x{869F}\x{86A1}-\x{86A5}\x{86A7}-\x{86CC}\x{86CE}-\x{86D4}'
. '\x{86D6}-\x{86DF}\x{86E1}-\x{86E6}\x{86E8}-\x{86FC}\x{86FE}-\x{871C}'
. '\x{871E}-\x{872E}\x{8730}-\x{873C}\x{873E}-\x{8744}\x{8746}-\x{874A}'
. '\x{874C}-\x{8770}\x{8772}-\x{877E}\x{8780}-\x{878D}\x{878F}-\x{8798}'
. '\x{879A}-\x{87D9}\x{87DB}-\x{87EF}\x{87F1}-\x{8806}\x{8808}-\x{8811}'
. '\x{8813}-\x{882C}\x{882E}-\x{8839}\x{883B}-\x{8846}\x{8848}-\x{8857}'
. '\x{8859}-\x{885B}\x{885D}\x{885E}\x{8860}-\x{8879}\x{887B}-\x{88B4}'
. '\x{88B6}-\x{88E5}\x{88E7}\x{88E8}\x{88EA}-\x{88EC}\x{88EE}-\x{8902}'
. '\x{8904}-\x{890E}\x{8910}-\x{8923}\x{8925}-\x{894C}\x{894E}-\x{8964}'
. '\x{8966}-\x{8974}\x{8976}-\x{897C}\x{897E}-\x{898C}\x{898E}\x{898F}'
. '\x{8991}-\x{8993}\x{8995}-\x{8998}\x{899A}-\x{89A8}\x{89AA}-\x{89AF}'
. '\x{89B1}-\x{89B3}\x{89B5}-\x{89BA}\x{89BD}-\x{89ED}\x{89EF}-\x{89F4}'
. '\x{89F6}-\x{89F8}\x{89FA}-\x{89FC}\x{89FE}-\x{8A04}\x{8A07}-\x{8A13}'
. '\x{8A15}-\x{8A18}\x{8A1A}-\x{8A1F}\x{8A22}-\x{8A2A}\x{8A2C}-\x{8A32}'
. '\x{8A34}-\x{8A3C}\x{8A3E}-\x{8A4A}\x{8A4C}-\x{8A63}\x{8A65}-\x{8A77}'
. '\x{8A79}-\x{8A7C}\x{8A7E}-\x{8A87}\x{8A89}-\x{8A9E}\x{8AA0}-\x{8AAC}\x{8AAE}'
. '\x{8AB0}-\x{8AB6}\x{8AB8}-\x{8ACF}\x{8AD1}-\x{8AEB}\x{8AED}-\x{8B0B}'
. '\x{8B0D}-\x{8B28}\x{8B2A}-\x{8B31}\x{8B33}-\x{8B37}\x{8B39}-\x{8B3E}'
. '\x{8B40}-\x{8B60}\x{8B63}-\x{8B68}\x{8B6A}-\x{8B71}\x{8B73}\x{8B74}'
. '\x{8B76}-\x{8B7B}\x{8B7D}-\x{8B80}\x{8B82}-\x{8B86}\x{8B88}-\x{8B8C}\x{8B8E}'
. '\x{8B90}-\x{8B9A}\x{8B9C}-\x{8C37}\x{8C39}-\x{8C3F}\x{8C41}-\x{8C43}'
. '\x{8C45}-\x{8C50}\x{8C54}-\x{8C57}\x{8C59}-\x{8C73}\x{8C75}-\x{8C7B}\x{8C7D}'
. '\x{8C7E}\x{8C80}-\x{8C82}\x{8C84}-\x{8C86}\x{8C88}-\x{8C8A}\x{8C8C}\x{8C8D}'
. '\x{8C8F}-\x{8C9A}\x{8C9C}-\x{8CA5}\x{8CA7}-\x{8CCA}\x{8CCC}\x{8CCE}-\x{8CD5}'
. '\x{8CD7}\x{8CD9}-\x{8CE8}\x{8CEA}-\x{8CF6}\x{8CF8}-\x{8D00}\x{8D02}-\x{8D10}'
. '\x{8D13}-\x{8D7B}\x{8D7D}-\x{8DA5}\x{8DA7}-\x{8DBF}\x{8DC1}-\x{8DE4}'
. '\x{8DE6}-\x{8E00}\x{8E02}-\x{8E0A}\x{8E0C}-\x{8E31}\x{8E33}-\x{8E45}'
. '\x{8E47}-\x{8E4E}\x{8E50}-\x{8E6D}\x{8E6F}-\x{8E74}\x{8E76}\x{8E78}'
. '\x{8E7A}-\x{8E98}\x{8E9A}\x{8E9C}-\x{8EA1}\x{8EA3}-\x{8EB2}\x{8EB4}\x{8EB5}'
. '\x{8EB8}-\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}-\x{8ED8}\x{8EDA}-\x{8EE1}'
. '\x{8EE4}-\x{8EEF}\x{8EF1}-\x{8F0B}\x{8F0D}\x{8F0E}\x{8F10}-\x{8F18}'
. '\x{8F1A}-\x{8F2C}\x{8F2E}-\x{8F39}\x{8F3B}-\x{8F40}\x{8F42}-\x{8F5B}'
. '\x{8F5D}-\x{8F9C}\x{8F9E}-\x{8FA3}\x{8FA5}-\x{8FB2}\x{8FB4}-\x{8FB9}'
. '\x{8FBB}-\x{8FC2}\x{8FC4}-\x{8FC9}\x{8FCB}-\x{8FE6}\x{8FE8}-\x{900D}'
. '\x{900F}-\x{9029}\x{902B}\x{902D}-\x{9036}\x{9038}\x{903A}-\x{903F}'
. '\x{9041}-\x{9045}\x{9047}-\x{90AA}\x{90AC}-\x{90CB}\x{90CE}-\x{90D1}'
. '\x{90D3}-\x{90F5}\x{90F7}-\x{9109}\x{910B}-\x{913B}\x{913E}-\x{9158}'
. '\x{915A}-\x{917A}\x{917C}-\x{9194}\x{9196}\x{9199}-\x{91A3}\x{91A5}-\x{91A8}'
. '\x{91AA}-\x{91B7}\x{91B9}-\x{91BE}\x{91C0}-\x{91C3}\x{91C5}-\x{91C7}'
. '\x{91C9}-\x{91D5}\x{91D7}-\x{91DF}\x{91E2}-\x{91EE}\x{91F0}-\x{91F5}'
. '\x{91F7}-\x{91FB}\x{91FD}-\x{9212}\x{9214}-\x{921E}\x{9220}\x{9221}'
. '\x{9223}-\x{922B}\x{922D}-\x{9242}\x{9245}-\x{9268}\x{926B}-\x{9270}'
. '\x{9272}-\x{9280}\x{9282}\x{9283}\x{9285}-\x{929D}\x{929F}-\x{92BC}'
. '\x{92BE}-\x{92D3}\x{92D5}-\x{92DA}\x{92DC}-\x{92E1}\x{92E3}-\x{931B}'
. '\x{931D}-\x{932B}\x{932D}-\x{932F}\x{9332}-\x{9361}\x{9363}-\x{9367}\x{9369}'
. '\x{936A}\x{936C}-\x{936E}\x{9370}-\x{9372}\x{9374}-\x{9377}\x{9379}-\x{937E}'
. '\x{9380}\x{9382}-\x{938A}\x{938C}-\x{939B}\x{939D}-\x{939F}\x{93A1}-\x{93AA}'
. '\x{93AC}-\x{93BA}\x{93BC}-\x{93DF}\x{93E1}-\x{93E4}\x{93E6}-\x{93F2}'
. '\x{93F4}-\x{9401}\x{9403}-\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}'
. '\x{9422}\x{9423}\x{9425}-\x{9442}\x{9444}-\x{944D}\x{944F}-\x{9459}'
. '\x{945B}-\x{946B}\x{946D}-\x{947A}\x{947C}-\x{9577}\x{957A}-\x{957D}'
. '\x{957F}-\x{9584}\x{9586}-\x{9596}\x{9598}-\x{959F}\x{95A1}-\x{95B2}'
. '\x{95B5}-\x{95B7}\x{95B9}-\x{95C0}\x{95C2}-\x{95D8}\x{95DA}-\x{95DC}'
. '\x{95DE}-\x{9624}\x{9627}\x{9628}\x{962A}-\x{963D}\x{963F}-\x{9655}'
. '\x{9658}-\x{9664}\x{9666}-\x{9678}\x{967C}-\x{967E}\x{9680}\x{9683}-\x{968B}'
. '\x{968D}-\x{9695}\x{9697}-\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}-\x{96AA}'
. '\x{96AC}-\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}-\x{96E3}\x{96E5}'
. '\x{96E8}-\x{96FB}\x{96FD}-\x{9713}\x{9715}\x{9716}\x{9718}\x{9719}'
. '\x{971C}-\x{9732}\x{9735}\x{9736}\x{9738}-\x{973F}\x{9742}-\x{974C}'
. '\x{974E}-\x{9756}\x{9758}-\x{9762}\x{9765}-\x{9770}\x{9772}-\x{9774}'
. '\x{9776}-\x{9786}\x{9788}\x{978A}-\x{979A}\x{979C}-\x{97A8}\x{97AA}-\x{97AF}'
. '\x{97B2}-\x{97B4}\x{97B6}-\x{97BD}\x{97BF}\x{97C1}-\x{97D1}\x{97D3}-\x{97FB}'
. '\x{97FD}-\x{981E}\x{9820}-\x{9824}\x{9826}-\x{9829}\x{982B}\x{982D}-\x{9832}'
. '\x{9834}-\x{9839}\x{983B}-\x{983D}\x{983F}-\x{9841}\x{9843}-\x{9846}'
. '\x{9848}-\x{984A}\x{984C}-\x{9855}\x{9857}-\x{9865}\x{9867}\x{9869}-\x{98B6}'
. '\x{98B8}-\x{98C6}\x{98C8}\x{98C9}\x{98CB}-\x{98E0}\x{98E2}\x{98E3}'
. '\x{98E5}-\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}-\x{98F7}\x{98F9}\x{98FA}'
. '\x{98FC}-\x{9918}\x{991A}-\x{993A}\x{993C}-\x{9943}\x{9945}-\x{994C}'
. '\x{994E}-\x{9959}\x{995B}\x{995C}\x{995E}-\x{99BE}\x{99C0}-\x{99C4}'
. '\x{99C6}-\x{99DF}\x{99E1}-\x{99E5}\x{99E7}-\x{99EA}\x{99EC}-\x{99F4}'
. '\x{99F6}-\x{9A0F}\x{9A11}\x{9A14}-\x{9A16}\x{9A19}-\x{9A27}\x{9A29}-\x{9A3A}'
. '\x{9A3C}-\x{9A50}\x{9A52}-\x{9A57}\x{9A59}-\x{9A5C}\x{9A5E}-\x{9A62}'
. '\x{9A64}-\x{9AA8}\x{9AAA}-\x{9ABC}\x{9ABE}-\x{9AC7}\x{9AC9}-\x{9AD6}'
. '\x{9AD8}-\x{9ADF}\x{9AE1}-\x{9AE3}\x{9AE5}-\x{9AE7}\x{9AEA}-\x{9AEF}'
. '\x{9AF1}-\x{9AFF}\x{9B01}\x{9B03}-\x{9B08}\x{9B0A}-\x{9B13}\x{9B15}-\x{9B1A}'
. '\x{9B1C}-\x{9B33}\x{9B35}-\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}-\x{9B4F}'
. '\x{9B51}-\x{9B56}\x{9B58}-\x{9B61}\x{9B63}-\x{9B71}\x{9B73}-\x{9B88}\x{9B8A}'
. '\x{9B8B}\x{9B8D}-\x{9B98}\x{9B9A}-\x{9BC1}\x{9BC3}-\x{9BF5}\x{9BF7}-\x{9BFF}'
. '\x{9C02}\x{9C05}-\x{9C2D}\x{9C2F}-\x{9C41}\x{9C43}-\x{9C4E}\x{9C50}'
. '\x{9C52}-\x{9C60}\x{9C62}\x{9C63}\x{9C65}-\x{9C75}\x{9C77}-\x{9C7A}'
. '\x{9C7C}-\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}-\x{9D26}\x{9D28}\x{9D29}\x{9D2B}'
. '\x{9D2D}-\x{9D34}\x{9D36}-\x{9D3B}\x{9D3D}-\x{9D43}\x{9D45}-\x{9D6C}'
. '\x{9D6E}-\x{9D8E}\x{9D90}-\x{9D94}\x{9D96}-\x{9DAD}\x{9DAF}-\x{9DBC}\x{9DBE}'
. '\x{9DBF}\x{9DC1}-\x{9DC5}\x{9DC7}-\x{9DE9}\x{9DEB}-\x{9DFB}\x{9DFD}-\x{9E0D}'
. '\x{9E0F}-\x{9E15}\x{9E17}-\x{9E1B}\x{9E1D}-\x{9E77}\x{9E79}\x{9E7A}'
. '\x{9E7C}-\x{9E8E}\x{9E91}-\x{9E94}\x{9E96}\x{9E97}\x{9E99}-\x{9E9D}'
. '\x{9E9F}-\x{9EA1}\x{9EA3}-\x{9EAA}\x{9EAD}-\x{9EB0}\x{9EB2}-\x{9EB8}'
. '\x{9EBB}-\x{9EEB}\x{9EED}-\x{9EF0}\x{9EF2}-\x{9F02}\x{9F04}-\x{9F10}\x{9F12}'
. '\x{9F13}\x{9F15}-\x{9F20}\x{9F22}-\x{9F25}\x{9F27}-\x{9F44}\x{9F46}-\x{9F52}'
. '\x{9F54}-\x{9F61}\x{9F63}-\x{9F6C}\x{9F6E}-\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu',
];
<?php 

namespace Laminas\Validator\Hostname;





return [
1 => '/^[\x{002d}0-9\x{0400}-\x{052f}]{1,63}$/iu',
2 => '/^[\x{002d}0-9\x{0370}-\x{03ff}]{1,63}$/iu',
3 => '/^[\x{002d}0-9a-z\x{ac00}-\x{d7a3}]{1,17}$/iu',

4 => '/^[\x{002d}0-9a-z·à-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž]{1,63}$/iu',

5 => '/^[\x{002d}0-9A-Za-z\x{3400}-\x{3401}\x{3404}-\x{3406}\x{340C}\x{3416}\x{341C}'
. '\x{3421}\x{3424}\x{3428}-\x{3429}\x{342B}-\x{342E}\x{3430}-\x{3434}\x{3436}'
. '\x{3438}-\x{343C}\x{343E}\x{3441}-\x{3445}\x{3447}\x{3449}-\x{3451}\x{3453}'
. '\x{3457}-\x{345F}\x{3463}-\x{3467}\x{346E}-\x{3471}\x{3473}-\x{3477}\x{3479}-\x{348E}\x{3491}-\x{3497}'
. '\x{3499}-\x{34A1}\x{34A4}-\x{34AD}\x{34AF}-\x{34B0}\x{34B2}-\x{34BF}\x{34C2}-\x{34C5}\x{34C7}-\x{34CC}'
. '\x{34CE}-\x{34D1}\x{34D3}-\x{34D8}\x{34DA}-\x{34E4}\x{34E7}-\x{34E9}\x{34EC}-\x{34EF}\x{34F1}-\x{34FE}'
. '\x{3500}-\x{3507}\x{350A}-\x{3513}\x{3515}\x{3517}-\x{351A}\x{351C}-\x{351E}\x{3520}-\x{352A}'
. '\x{352C}-\x{3552}\x{3554}-\x{355C}\x{355E}-\x{3567}\x{3569}-\x{3573}\x{3575}-\x{357C}\x{3580}-\x{3588}'
. '\x{358F}-\x{3598}\x{359E}-\x{35AB}\x{35B4}-\x{35CD}\x{35D0}\x{35D3}-\x{35DC}\x{35E2}-\x{35ED}'
. '\x{35F0}-\x{35F6}\x{35FB}-\x{3602}\x{3605}-\x{360E}\x{3610}-\x{3611}\x{3613}-\x{3616}\x{3619}-\x{362D}'
. '\x{362F}-\x{3634}\x{3636}-\x{363B}\x{363F}-\x{3645}\x{3647}-\x{364B}\x{364D}-\x{3653}\x{3655}'
. '\x{3659}-\x{365E}\x{3660}-\x{3665}\x{3667}-\x{367C}\x{367E}\x{3680}-\x{3685}\x{3687}'
. '\x{3689}-\x{3690}\x{3692}-\x{3698}\x{369A}\x{369C}-\x{36AE}\x{36B0}-\x{36BF}\x{36C1}-\x{36C5}'
. '\x{36C9}-\x{36CA}\x{36CD}-\x{36DE}\x{36E1}-\x{36E2}\x{36E5}-\x{36FE}\x{3701}-\x{3713}\x{3715}-\x{371E}'
. '\x{3720}-\x{372C}\x{372E}-\x{3745}\x{3747}-\x{3748}\x{374A}\x{374C}-\x{3759}\x{375B}-\x{3760}'
. '\x{3762}-\x{3767}\x{3769}-\x{3772}\x{3774}-\x{378C}\x{378F}-\x{379C}\x{379F}\x{37A1}-\x{37AD}'
. '\x{37AF}-\x{37B7}\x{37B9}-\x{37C1}\x{37C3}-\x{37C5}\x{37C7}-\x{37D4}\x{37D6}-\x{37E0}\x{37E2}'
. '\x{37E5}-\x{37ED}\x{37EF}-\x{37F6}\x{37F8}-\x{3802}\x{3804}-\x{381D}\x{3820}-\x{3822}\x{3825}-\x{382A}'
. '\x{382D}-\x{382F}\x{3831}-\x{3832}\x{3834}-\x{384C}\x{384E}-\x{3860}\x{3862}-\x{3863}\x{3865}-\x{386B}'
. '\x{386D}-\x{3886}\x{3888}-\x{38A1}\x{38A3}\x{38A5}-\x{38AA}\x{38AC}\x{38AE}-\x{38B0}'
. '\x{38B2}-\x{38B6}\x{38B8}\x{38BA}-\x{38BE}\x{38C0}-\x{38C9}\x{38CB}-\x{38D4}\x{38D8}-\x{38E0}'
. '\x{38E2}-\x{38E6}\x{38EB}-\x{38ED}\x{38EF}-\x{38F2}\x{38F5}-\x{38F7}\x{38FA}-\x{38FF}\x{3901}-\x{392A}'
. '\x{392C}\x{392E}-\x{393B}\x{393E}-\x{3956}\x{395A}-\x{3969}\x{396B}-\x{397A}\x{397C}-\x{3987}'
. '\x{3989}-\x{3998}\x{399A}-\x{39B0}\x{39B2}\x{39B4}-\x{39D0}\x{39D2}-\x{39DA}\x{39DE}-\x{39DF}'
. '\x{39E1}-\x{39EF}\x{39F1}-\x{3A17}\x{3A19}-\x{3A2A}\x{3A2D}-\x{3A40}\x{3A43}-\x{3A4E}\x{3A50}'
. '\x{3A52}-\x{3A5E}\x{3A60}-\x{3A6D}\x{3A6F}-\x{3A77}\x{3A79}-\x{3A82}\x{3A84}-\x{3A85}\x{3A87}-\x{3A89}'
. '\x{3A8B}-\x{3A8F}\x{3A91}-\x{3A93}\x{3A95}-\x{3A96}\x{3A9A}\x{3A9C}-\x{3AA6}\x{3AA8}-\x{3AA9}'
. '\x{3AAB}-\x{3AB1}\x{3AB4}-\x{3ABC}\x{3ABE}-\x{3AC5}\x{3ACA}-\x{3ACB}\x{3ACD}-\x{3AD5}\x{3AD7}-\x{3AE1}'
. '\x{3AE4}-\x{3AE7}\x{3AE9}-\x{3AEC}\x{3AEE}-\x{3AFD}\x{3B01}-\x{3B10}\x{3B12}-\x{3B15}\x{3B17}-\x{3B1E}'
. '\x{3B20}-\x{3B23}\x{3B25}-\x{3B27}\x{3B29}-\x{3B36}\x{3B38}-\x{3B39}\x{3B3B}-\x{3B3C}\x{3B3F}'
. '\x{3B41}-\x{3B44}\x{3B47}-\x{3B4C}\x{3B4E}\x{3B51}-\x{3B55}\x{3B58}-\x{3B62}\x{3B68}-\x{3B72}'
. '\x{3B78}-\x{3B88}\x{3B8B}-\x{3B9F}\x{3BA1}\x{3BA3}-\x{3BBA}\x{3BBC}\x{3BBF}-\x{3BD0}'
. '\x{3BD3}-\x{3BE6}\x{3BEA}-\x{3BFB}\x{3BFE}-\x{3C12}\x{3C14}-\x{3C1B}\x{3C1D}-\x{3C37}\x{3C39}-\x{3C4F}'
. '\x{3C52}\x{3C54}-\x{3C5C}\x{3C5E}-\x{3C68}\x{3C6A}-\x{3C76}\x{3C78}-\x{3C8F}\x{3C91}-\x{3CA8}'
. '\x{3CAA}-\x{3CAD}\x{3CAF}-\x{3CBE}\x{3CC0}-\x{3CC8}\x{3CCA}-\x{3CD3}\x{3CD6}-\x{3CE0}\x{3CE4}-\x{3CEE}'
. '\x{3CF3}-\x{3D0A}\x{3D0E}-\x{3D1E}\x{3D20}-\x{3D21}\x{3D25}-\x{3D38}\x{3D3B}-\x{3D46}\x{3D4A}-\x{3D59}'
. '\x{3D5D}-\x{3D7B}\x{3D7D}-\x{3D81}\x{3D84}-\x{3D88}\x{3D8C}-\x{3D8F}\x{3D91}-\x{3D98}\x{3D9A}-\x{3D9C}'
. '\x{3D9E}-\x{3DA1}\x{3DA3}-\x{3DB0}\x{3DB2}-\x{3DB5}\x{3DB9}-\x{3DBC}\x{3DBE}-\x{3DCB}\x{3DCD}-\x{3DDB}'
. '\x{3DDF}-\x{3DE8}\x{3DEB}-\x{3DF0}\x{3DF3}-\x{3DF9}\x{3DFB}-\x{3DFC}\x{3DFE}-\x{3E05}\x{3E08}-\x{3E33}'
. '\x{3E35}-\x{3E3E}\x{3E40}-\x{3E47}\x{3E49}-\x{3E67}\x{3E6B}-\x{3E6F}\x{3E71}-\x{3E85}\x{3E87}-\x{3E8C}'
. '\x{3E8E}-\x{3E98}\x{3E9A}-\x{3EA1}\x{3EA3}-\x{3EAE}\x{3EB0}-\x{3EB5}\x{3EB7}-\x{3EBA}\x{3EBD}'
. '\x{3EBF}-\x{3EC4}\x{3EC7}-\x{3ECE}\x{3ED1}-\x{3ED7}\x{3ED9}-\x{3EDA}\x{3EDD}-\x{3EE3}\x{3EE7}-\x{3EE8}'
. '\x{3EEB}-\x{3EF2}\x{3EF5}-\x{3EFF}\x{3F01}-\x{3F02}\x{3F04}-\x{3F07}\x{3F09}-\x{3F44}\x{3F46}-\x{3F4E}'
. '\x{3F50}-\x{3F53}\x{3F55}-\x{3F72}\x{3F74}-\x{3F75}\x{3F77}-\x{3F7B}\x{3F7D}-\x{3FB0}\x{3FB6}-\x{3FBF}'
. '\x{3FC1}-\x{3FCF}\x{3FD1}-\x{3FD3}\x{3FD5}-\x{3FDF}\x{3FE1}-\x{400B}\x{400D}-\x{401C}\x{401E}-\x{4024}'
. '\x{4027}-\x{403F}\x{4041}-\x{4060}\x{4062}-\x{4069}\x{406B}-\x{408A}\x{408C}-\x{40A7}\x{40A9}-\x{40B4}'
. '\x{40B6}-\x{40C2}\x{40C7}-\x{40CF}\x{40D1}-\x{40DE}\x{40E0}-\x{40E7}\x{40E9}-\x{40EE}\x{40F0}-\x{40FB}'
. '\x{40FD}-\x{4109}\x{410B}-\x{4115}\x{4118}-\x{411D}\x{411F}-\x{4122}\x{4124}-\x{4133}\x{4136}-\x{4138}'
. '\x{413A}-\x{4148}\x{414A}-\x{4169}\x{416C}-\x{4185}\x{4188}-\x{418B}\x{418D}-\x{41AD}\x{41AF}-\x{41B3}'
. '\x{41B5}-\x{41C3}\x{41C5}-\x{41C9}\x{41CB}-\x{41F2}\x{41F5}-\x{41FE}\x{4200}-\x{4227}\x{422A}-\x{4246}'
. '\x{4248}-\x{4263}\x{4265}-\x{428B}\x{428D}-\x{42A1}\x{42A3}-\x{42C4}\x{42C8}-\x{42DC}\x{42DE}-\x{430A}'
. '\x{430C}-\x{4335}\x{4337}\x{4342}-\x{435F}\x{4361}-\x{439A}\x{439C}-\x{439D}\x{439F}-\x{43A4}'
. '\x{43A6}-\x{43EC}\x{43EF}-\x{4405}\x{4407}-\x{4429}\x{442B}-\x{4455}\x{4457}-\x{4468}\x{446A}-\x{446D}'
. '\x{446F}-\x{4476}\x{4479}-\x{447D}\x{447F}-\x{4486}\x{4488}-\x{4490}\x{4492}-\x{4498}\x{449A}-\x{44AD}'
. '\x{44B0}-\x{44BD}\x{44C1}-\x{44D3}\x{44D6}-\x{44E7}\x{44EA}\x{44EC}-\x{44FA}\x{44FC}-\x{4541}'
. '\x{4543}-\x{454F}\x{4551}-\x{4562}\x{4564}-\x{4575}\x{4577}-\x{45AB}\x{45AD}-\x{45BD}\x{45BF}-\x{45D5}'
. '\x{45D7}-\x{45EC}\x{45EE}-\x{45F2}\x{45F4}-\x{45FA}\x{45FC}-\x{461A}\x{461C}-\x{461D}\x{461F}-\x{4631}'
. '\x{4633}-\x{4649}\x{464C}\x{464E}-\x{4652}\x{4654}-\x{466A}\x{466C}-\x{4675}\x{4677}-\x{467A}'
. '\x{467C}-\x{4694}\x{4696}-\x{46A3}\x{46A5}-\x{46AB}\x{46AD}-\x{46D2}\x{46D4}-\x{4723}\x{4729}-\x{4732}'
. '\x{4734}-\x{4758}\x{475A}\x{475C}-\x{478B}\x{478D}\x{4791}-\x{47B1}\x{47B3}-\x{47F1}'
. '\x{47F3}-\x{480B}\x{480D}-\x{4815}\x{4817}-\x{4839}\x{483B}-\x{4870}\x{4872}-\x{487A}\x{487C}-\x{487F}'
. '\x{4883}-\x{488E}\x{4890}-\x{4896}\x{4899}-\x{48A2}\x{48A4}-\x{48B9}\x{48BB}-\x{48C8}\x{48CA}-\x{48D1}'
. '\x{48D3}-\x{48E5}\x{48E7}-\x{48F2}\x{48F4}-\x{48FF}\x{4901}-\x{4922}\x{4924}-\x{4928}\x{492A}-\x{4931}'
. '\x{4933}-\x{495B}\x{495D}-\x{4978}\x{497A}\x{497D}\x{4982}-\x{4983}\x{4985}-\x{49A8}'
. '\x{49AA}-\x{49AF}\x{49B1}-\x{49B7}\x{49B9}-\x{49BD}\x{49C1}-\x{49C7}\x{49C9}-\x{49CE}\x{49D0}-\x{49E8}'
. '\x{49EA}\x{49EC}\x{49EE}-\x{4A19}\x{4A1B}-\x{4A43}\x{4A45}-\x{4A4D}\x{4A4F}-\x{4A9E}'
. '\x{4AA0}-\x{4AA9}\x{4AAB}-\x{4B4E}\x{4B50}-\x{4B5B}\x{4B5D}-\x{4B69}\x{4B6B}-\x{4BC2}\x{4BC6}-\x{4BE8}'
. '\x{4BEA}-\x{4BFA}\x{4BFC}-\x{4C06}\x{4C08}-\x{4C2D}\x{4C2F}-\x{4C32}\x{4C34}-\x{4C35}\x{4C37}-\x{4C69}'
. '\x{4C6B}-\x{4C73}\x{4C75}-\x{4C86}\x{4C88}-\x{4C97}\x{4C99}-\x{4C9C}\x{4C9F}-\x{4CA3}\x{4CA5}-\x{4CB5}'
. '\x{4CB7}-\x{4CF8}\x{4CFA}-\x{4D27}\x{4D29}-\x{4DAC}\x{4DAE}-\x{4DB1}\x{4DB3}-\x{4DB5}\x{4E00}-\x{4E54}'
. '\x{4E56}-\x{4E89}\x{4E8B}-\x{4EEC}\x{4EEE}-\x{4FAC}\x{4FAE}-\x{503C}\x{503E}-\x{51E5}\x{51E7}-\x{5270}'
. '\x{5272}-\x{56A1}\x{56A3}-\x{5840}\x{5842}-\x{58B5}\x{58B7}-\x{58CB}\x{58CD}-\x{5BC8}\x{5BCA}-\x{5C01}'
. '\x{5C03}-\x{5C25}\x{5C27}-\x{5D5B}\x{5D5D}-\x{5F08}\x{5F0A}-\x{61F3}\x{61F5}-\x{63BA}\x{63BC}-\x{6441}'
. '\x{6443}-\x{657C}\x{657E}-\x{663E}\x{6640}-\x{66FC}\x{66FE}-\x{6728}\x{672A}-\x{6766}\x{6768}-\x{67A8}'
. '\x{67AA}-\x{685B}\x{685D}-\x{685E}\x{6860}-\x{68B9}\x{68BB}-\x{6AC8}\x{6ACA}-\x{6BB0}\x{6BB2}-\x{6C16}'
. '\x{6C18}-\x{6D9B}\x{6D9D}-\x{6E12}\x{6E14}-\x{6E8B}\x{6E8D}-\x{704D}\x{704F}-\x{7113}\x{7115}-\x{713B}'
. '\x{713D}-\x{7154}\x{7156}-\x{729F}\x{72A1}-\x{731E}\x{7320}-\x{7362}\x{7364}-\x{7533}\x{7535}-\x{7551}'
. '\x{7553}-\x{7572}\x{7574}-\x{75E8}\x{75EA}-\x{7679}\x{767B}-\x{783E}\x{7840}-\x{7A62}\x{7A64}-\x{7AC2}'
. '\x{7AC4}-\x{7B06}\x{7B08}-\x{7B79}\x{7B7B}-\x{7BCE}\x{7BD0}-\x{7D99}\x{7D9B}-\x{7E49}\x{7E4C}-\x{8132}'
. '\x{8134}\x{8136}-\x{81D2}\x{81D4}-\x{8216}\x{8218}-\x{822D}\x{822F}-\x{83B4}\x{83B6}-\x{841F}'
. '\x{8421}-\x{86CC}\x{86CE}-\x{874A}\x{874C}-\x{877E}\x{8780}-\x{8A32}\x{8A34}-\x{8B71}\x{8B73}-\x{8B8E}'
. '\x{8B90}-\x{8DE4}\x{8DE6}-\x{8E9A}\x{8E9C}-\x{8EE1}\x{8EE4}-\x{8F0B}\x{8F0D}-\x{8FB9}\x{8FBB}-\x{9038}'
. '\x{903A}-\x{9196}\x{9198}-\x{91A3}\x{91A5}-\x{91B7}\x{91B9}-\x{91C7}\x{91C9}-\x{91E0}\x{91E2}-\x{91FB}'
. '\x{91FD}-\x{922B}\x{922D}-\x{9270}\x{9272}-\x{9420}\x{9422}-\x{9664}\x{9666}-\x{9679}\x{967B}-\x{9770}'
. '\x{9772}-\x{982B}\x{982D}-\x{98ED}\x{98EF}-\x{99C4}\x{99C6}-\x{9A11}\x{9A14}-\x{9A27}\x{9A29}-\x{9D0D}'
. '\x{9D0F}-\x{9D2B}\x{9D2D}-\x{9D8E}\x{9D90}-\x{9DC5}\x{9DC7}-\x{9E77}\x{9E79}-\x{9EB8}\x{9EBB}-\x{9F20}'
. '\x{9F22}-\x{9F61}\x{9F63}-\x{9FA5}\x{FA28}]{1,20}$/iu',
6 => '/^[\x{002d}0-9A-Za-z]{1,63}$/iu',
7 => '/^[\x{00A1}-\x{00FF}]{1,63}$/iu',
8 => '/^[\x{0100}-\x{017f}]{1,63}$/iu',
9 => '/^[\x{0180}-\x{024f}]{1,63}$/iu',
10 => '/^[\x{0250}-\x{02af}]{1,63}$/iu',
11 => '/^[\x{02b0}-\x{02ff}]{1,63}$/iu',
12 => '/^[\x{0300}-\x{036f}]{1,63}$/iu',
13 => '/^[\x{0370}-\x{03ff}]{1,63}$/iu',
14 => '/^[\x{0400}-\x{04ff}]{1,63}$/iu',
15 => '/^[\x{0500}-\x{052f}]{1,63}$/iu',
16 => '/^[\x{0530}-\x{058F}]{1,63}$/iu',
17 => '/^[\x{0590}-\x{05FF}]{1,63}$/iu',
18 => '/^[\x{0600}-\x{06FF}]{1,63}$/iu',
19 => '/^[\x{0700}-\x{074F}]{1,63}$/iu',
20 => '/^[\x{0780}-\x{07BF}]{1,63}$/iu',
21 => '/^[\x{0900}-\x{097F}]{1,63}$/iu',
22 => '/^[\x{0980}-\x{09FF}]{1,63}$/iu',
23 => '/^[\x{0A00}-\x{0A7F}]{1,63}$/iu',
24 => '/^[\x{0A80}-\x{0AFF}]{1,63}$/iu',
25 => '/^[\x{0B00}-\x{0B7F}]{1,63}$/iu',
26 => '/^[\x{0B80}-\x{0BFF}]{1,63}$/iu',
27 => '/^[\x{0C00}-\x{0C7F}]{1,63}$/iu',
28 => '/^[\x{0C80}-\x{0CFF}]{1,63}$/iu',
29 => '/^[\x{0D00}-\x{0D7F}]{1,63}$/iu',
30 => '/^[\x{0D80}-\x{0DFF}]{1,63}$/iu',
31 => '/^[\x{0E00}-\x{0E7F}]{1,63}$/iu',
32 => '/^[\x{0E80}-\x{0EFF}]{1,63}$/iu',
33 => '/^[\x{0F00}-\x{0FFF}]{1,63}$/iu',
34 => '/^[\x{1000}-\x{109F}]{1,63}$/iu',
35 => '/^[\x{10A0}-\x{10FF}]{1,63}$/iu',
36 => '/^[\x{1100}-\x{11FF}]{1,63}$/iu',
37 => '/^[\x{1200}-\x{137F}]{1,63}$/iu',
38 => '/^[\x{13A0}-\x{13FF}]{1,63}$/iu',
39 => '/^[\x{1400}-\x{167F}]{1,63}$/iu',
40 => '/^[\x{1680}-\x{169F}]{1,63}$/iu',
41 => '/^[\x{16A0}-\x{16FF}]{1,63}$/iu',
42 => '/^[\x{1700}-\x{171F}]{1,63}$/iu',
43 => '/^[\x{1720}-\x{173F}]{1,63}$/iu',
44 => '/^[\x{1740}-\x{175F}]{1,63}$/iu',
45 => '/^[\x{1760}-\x{177F}]{1,63}$/iu',
46 => '/^[\x{1780}-\x{17FF}]{1,63}$/iu',
47 => '/^[\x{1800}-\x{18AF}]{1,63}$/iu',
48 => '/^[\x{1E00}-\x{1EFF}]{1,63}$/iu',
49 => '/^[\x{1F00}-\x{1FFF}]{1,63}$/iu',
50 => '/^[\x{2070}-\x{209F}]{1,63}$/iu',
51 => '/^[\x{2100}-\x{214F}]{1,63}$/iu',
52 => '/^[\x{2150}-\x{218F}]{1,63}$/iu',
53 => '/^[\x{2460}-\x{24FF}]{1,63}$/iu',
54 => '/^[\x{2E80}-\x{2EFF}]{1,63}$/iu',
55 => '/^[\x{2F00}-\x{2FDF}]{1,63}$/iu',
56 => '/^[\x{2FF0}-\x{2FFF}]{1,63}$/iu',
57 => '/^[\x{3040}-\x{309F}]{1,63}$/iu',
58 => '/^[\x{30A0}-\x{30FF}]{1,63}$/iu',
59 => '/^[\x{3100}-\x{312F}]{1,63}$/iu',
60 => '/^[\x{3130}-\x{318F}]{1,63}$/iu',
61 => '/^[\x{3190}-\x{319F}]{1,63}$/iu',
62 => '/^[\x{31A0}-\x{31BF}]{1,63}$/iu',
63 => '/^[\x{31F0}-\x{31FF}]{1,63}$/iu',
64 => '/^[\x{3200}-\x{32FF}]{1,63}$/iu',
65 => '/^[\x{3300}-\x{33FF}]{1,63}$/iu',
66 => '/^[\x{3400}-\x{4DBF}]{1,63}$/iu',
67 => '/^[\x{4E00}-\x{9FFF}]{1,63}$/iu',
68 => '/^[\x{A000}-\x{A48F}]{1,63}$/iu',
69 => '/^[\x{A490}-\x{A4CF}]{1,63}$/iu',
70 => '/^[\x{AC00}-\x{D7AF}]{1,63}$/iu',
73 => '/^[\x{F900}-\x{FAFF}]{1,63}$/iu',
74 => '/^[\x{FB00}-\x{FB4F}]{1,63}$/iu',
75 => '/^[\x{FB50}-\x{FDFF}]{1,63}$/iu',
76 => '/^[\x{FE20}-\x{FE2F}]{1,63}$/iu',
77 => '/^[\x{FE70}-\x{FEFF}]{1,63}$/iu',
78 => '/^[\x{FF00}-\x{FFEF}]{1,63}$/iu',
79 => '/^[\x{20000}-\x{2A6DF}]{1,63}$/iu',
80 => '/^[\x{2F800}-\x{2FA1F}]{1,63}$/iu',
];
<?php 

namespace Laminas\Validator\Hostname;





return [
1 => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}'
. '\x{30A1}-\x{30F6}\x{30FC}'
. '\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}'
. '\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}'
. '\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}'
. '\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}'
. '\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}'
. '\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}'
. '\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}'
. '\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}'
. '\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}'
. '\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}'
. '\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}'
. '\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}'
. '\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}'
. '\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}'
. '\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}'
. '\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}'
. '\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}'
. '\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}'
. '\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}'
. '\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}'
. '\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}'
. '\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}'
. '\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}'
. '\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}'
. '\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}'
. '\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}'
. '\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}'
. '\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}'
. '\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}'
. '\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}'
. '\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}'
. '\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}'
. '\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}'
. '\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}'
. '\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}'
. '\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}'
. '\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}'
. '\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}'
. '\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}'
. '\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}'
. '\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}'
. '\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}'
. '\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}'
. '\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}'
. '\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}'
. '\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}'
. '\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}'
. '\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}'
. '\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}'
. '\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}'
. '\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}'
. '\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}'
. '\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}'
. '\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}'
. '\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}'
. '\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}'
. '\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}'
. '\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}'
. '\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}'
. '\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}'
. '\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}'
. '\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}'
. '\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}'
. '\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}'
. '\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}'
. '\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}'
. '\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}'
. '\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}'
. '\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}'
. '\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}'
. '\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}'
. '\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}'
. '\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}'
. '\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}'
. '\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}'
. '\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}'
. '\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}'
. '\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}'
. '\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}'
. '\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}'
. '\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}'
. '\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}'
. '\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}'
. '\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}'
. '\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}'
. '\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}'
. '\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}'
. '\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}'
. '\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}'
. '\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}'
. '\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}'
. '\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}'
. '\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}'
. '\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}'
. '\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}'
. '\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}'
. '\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}'
. '\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}'
. '\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}'
. '\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}'
. '\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}'
. '\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}'
. '\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}'
. '\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}'
. '\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}'
. '\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}'
. '\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}'
. '\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}'
. '\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}'
. '\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}'
. '\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}'
. '\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}'
. '\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}'
. '\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}'
. '\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}'
. '\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}'
. '\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}'
. '\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}'
. '\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}'
. '\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}'
. '\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}'
. '\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}'
. '\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}'
. '\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}'
. '\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}'
. '\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}'
. '\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}'
. '\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}'
. '\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}'
. '\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}'
. '\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}'
. '\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}'
. '\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}'
. '\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}'
. '\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}'
. '\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}'
. '\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}'
. '\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}'
. '\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}'
. '\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}'
. '\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}'
. '\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}'
. '\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}'
. '\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}'
. '\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}'
. '\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}'
. '\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}'
. '\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}'
. '\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}'
. '\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}'
. '\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}'
. '\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}'
. '\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}'
. '\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}'
. '\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}'
. '\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}'
. '\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}'
. '\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}'
. '\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}'
. '\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}'
. '\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}'
. '\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}'
. '\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}'
. '\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}'
. '\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}'
. '\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}'
. '\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}'
. '\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}'
. '\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}'
. '\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}'
. '\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}'
. '\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}'
. '\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}'
. '\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}'
. '\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}'
. '\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}'
. '\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}'
. '\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}'
. '\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}'
. '\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}'
. '\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}'
. '\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}'
. '\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}'
. '\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}'
. '\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}'
. '\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}'
. '\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}'
. '\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}'
. '\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}'
. '\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}'
. '\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}'
. '\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}'
. '\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}'
. '\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}'
. '\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}'
. '\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}'
. '\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}'
. '\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}'
. '\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}'
. '\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}'
. '\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}'
. '\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}'
. '\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}'
. '\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}'
. '\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}'
. '\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}'
. '\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}'
. '\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}'
. '\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}'
. '\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}'
. '\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}'
. '\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}'
. '\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}'
. '\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}'
. '\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}'
. '\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}'
. '\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}'
. '\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}'
. '\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}'
. '\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}'
. '\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}'
. '\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}'
. '\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}'
. '\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}'
. '\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}'
. '\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}'
. '\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}'
. '\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}'
. '\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}'
. '\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}'
. '\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}'
. '\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}'
. '\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}'
. '\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}'
. '\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}'
. '\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}'
. '\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}'
. '\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}'
. '\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}'
. '\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}'
. '\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}'
. '\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}'
. '\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}'
. '\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}'
. '\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}'
. '\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}'
. '\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}'
. '\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}'
. '\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}'
. '\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}'
. '\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}'
. '\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}'
. '\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}'
. '\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}'
. '\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}'
. '\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}'
. '\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}'
. '\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}'
. '\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}'
. '\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}'
. '\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}'
. '\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}'
. '\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}'
. '\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}'
. '\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}'
. '\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}'
. '\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}'
. '\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}'
. '\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}'
. '\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}'
. '\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}'
. '\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}'
. '\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}'
. '\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}'
. '\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}'
. '\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}'
. '\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}'
. '\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}'
. '\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}'
. '\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}'
. '\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}'
. '\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}'
. '\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}'
. '\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}'
. '\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}'
. '\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}'
. '\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}'
. '\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}'
. '\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}'
. '\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}'
. '\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}'
. '\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}'
. '\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}'
. '\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}'
. '\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}'
. '\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}'
. '\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}'
. '\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}'
. '\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}'
. '\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}'
. '\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}'
. '\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}'
. '\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}'
. '\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}'
. '\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}'
. '\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}'
. '\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}'
. '\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}'
. '\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}'
. '\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}'
. '\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}'
. '\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}'
. '\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}'
. '\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}'
. '\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}'
. '\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}'
. '\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}'
. '\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}'
. '\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}'
. '\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}'
. '\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}'
. '\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}'
. '\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}'
. '\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}'
. '\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}'
. '\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}'
. '\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}'
. '\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}'
. '\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}'
. '\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}'
. '\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}'
. '\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}'
. '\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}'
. '\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}'
. '\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}'
. '\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}'
. '\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}'
. '\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}'
. '\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}'
. '\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}'
. '\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}'
. '\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}'
. '\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}'
. '\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}'
. '\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}'
. '\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}'
. '\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}'
. '\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}'
. '\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}'
. '\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}'
. '\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}'
. '\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}'
. '\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}'
. '\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}'
. '\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}'
. '\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}'
. '\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}'
. '\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}'
. '\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}'
. '\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}'
. '\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}'
. '\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}'
. '\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}'
. '\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}'
. '\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}'
. '\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}'
. '\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}'
. '\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}'
. '\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}'
. '\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}'
. '\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}'
. '\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}'
. '\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}'
. '\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}'
. '\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}'
. '\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}'
. '\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}'
. '\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}'
. '\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}'
. '\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}'
. '\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}'
. '\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}'
. '\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}'
. '\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}'
. '\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}'
. '\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}'
. '\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}'
. '\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}'
. '\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}'
. '\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}'
. '\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}'
. '\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}'
. '\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}'
. '\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}'
. '\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}'
. '\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}'
. '\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}'
. '\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}'
. '\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}'
. '\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}'
. '\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}'
. '\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}'
. '\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}'
. '\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}'
. '\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}'
. '\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}'
. '\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}'
. '\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}'
. '\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}'
. '\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}'
. '\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}'
. '\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}'
. '\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}'
. '\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}'
. '\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}'
. '\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}'
. '\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}'
. '\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}'
. '\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}'
. '\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}'
. '\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}'
. '\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}'
. '\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}'
. '\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}'
. '\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}'
. '\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}'
. '\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}'
. '\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}'
. '\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}'
. '\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}'
. '\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}'
. '\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}'
. '\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}'
. '\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}'
. '\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}'
. '\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}'
. '\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}'
. '\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}'
. '\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}'
. '\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}'
. '\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}'
. '\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}'
. '\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}'
. '\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}'
. '\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}'
. '\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}'
. '\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}'
. '\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}'
. '\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}'
. '\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}'
. '\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}'
. '\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}'
. '\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}'
. '\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}'
. '\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}'
. '\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}'
. '\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}'
. '\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}'
. '\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}'
. '\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}'
. '\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}'
. '\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}'
. '\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}'
. '\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}'
. '\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}'
. '\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}'
. '\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}'
. '\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}'
. '\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}'
. '\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}'
. '\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}'
. '\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}'
. '\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}'
. '\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}'
. '\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}'
. '\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}'
. '\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}'
. '\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}'
. '\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}'
. '\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}'
. '\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}'
. '\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}'
. '\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}'
. '\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}'
. '\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}'
. '\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}'
. '\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}'
. '\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}'
. '\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}'
. '\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}'
. '\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}'
. '\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}'
. '\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}'
. '\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}'
. '\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}'
. '\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}'
. '\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}'
. '\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}'
. '\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}'
. '\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}'
. '\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}'
. '\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}'
. '\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}'
. '\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}'
. '\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}'
. '\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}'
. '\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}'
. '\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}'
. '\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}'
. '\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}'
. '\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}'
. '\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}'
. '\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}'
. '\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}'
. '\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}'
. '\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}'
. '\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}'
. '\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}'
. '\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}'
. '\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}'
. '\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}'
. '\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}'
. '\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}'
. '\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}'
. '\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}'
. '\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}'
. '\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}'
. '\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}'
. '\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}'
. '\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}'
. '\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}'
. '\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}'
. '\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}'
. '\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}'
. '\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}'
. '\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}'
. '\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}'
. '\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}'
. '\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}'
. '\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}'
. '\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}'
. '\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}'
. '\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}'
. '\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}'
. '\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}'
. '\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}'
. '\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}'
. '\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}'
. '\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}'
. '\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}'
. '\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}'
. '\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}'
. '\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}'
. '\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}'
. '\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}'
. '\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}'
. '\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}'
. '\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}'
. '\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}'
. '\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}'
. '\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}'
. '\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}'
. '\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}'
. '\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}'
. '\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}'
. '\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}'
. '\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}'
. '\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}'
. '\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}'
. '\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}'
. '\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}'
. '\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}'
. '\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}'
. '\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}'
. '\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}'
. '\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}'
. '\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}'
. '\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}'
. '\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}'
. '\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}'
. '\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}'
. '\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}'
. '\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}'
. '\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}'
. '\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}'
. '\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}'
. '\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}'
. '\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}'
. '\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}'
. '\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}'
. '\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}'
. '\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}'
. '\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}'
. '\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}'
. '\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}'
. '\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}'
. '\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}'
. '\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}'
. '\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}'
. '\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}'
. '\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}'
. '\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}'
. '\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}'
. '\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}'
. '\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}'
. '\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}'
. '\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}'
. '\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}'
. '\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}'
. '\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}'
. '\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}'
. '\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}'
. '\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}'
. '\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}'
. '\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}'
. '\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}'
. '\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}'
. '\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}'
. '\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}'
. '\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}'
. '\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}'
. '\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}'
. '\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}'
. '\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}'
. '\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}'
. '\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}'
. '\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}'
. '\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}'
. '\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}'
. '\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}'
. '\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}'
. '\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}'
. '\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}'
. '\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}'
. '\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}'
. '\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}'
. '\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}'
. '\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}'
. '\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}'
. '\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}'
. '\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}'
. '\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}'
. '\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}'
. '\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}'
. '\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}'
. '\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}'
. '\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}'
. '\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}'
. '\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}'
. '\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}'
. '\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}'
. '\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}'
. '\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}'
. '\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}'
. '\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}'
. '\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}'
. '\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}'
. '\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}'
. '\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}'
. '\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}'
. '\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}'
. '\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}'
. '\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}'
. '\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}'
. '\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}'
. '\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}'
. '\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}'
. '\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}'
. '\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}'
. '\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}'
. '\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}'
. '\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}'
. '\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}'
. '\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}'
. '\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}'
. '\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}'
. '\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}'
. '\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}'
. '\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}'
. '\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}'
. '\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}'
. '\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}'
. '\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}'
. '\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}'
. '\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}'
. '\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}'
. '\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}'
. '\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}'
. '\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}'
. '\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}'
. '\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}'
. '\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}'
. '\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}'
. '\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}'
. '\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}'
. '\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}'
. '\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}'
. '\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}'
. '\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}'
. '\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}'
. '\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}'
. '\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}'
. '\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}'
. '\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}'
. '\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}'
. '\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}'
. '\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu',
];
<?php 

namespace Laminas\Validator\Hostname;





return [
1 => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}'
. '\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}'
. '\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}'
. '\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}'
. '\x{49B6}\x{49B7}\x{4C77}\x{4C9F}-\x{4CA3}\x{4D13}-\x{4D19}\x{4DAE}'
. '\x{4E00}-\x{4E11}\x{4E13}-\x{4E28}\x{4E2A}-\x{4E54}\x{4E56}-\x{4E67}'
. '\x{4E69}-\x{4E78}\x{4E7A}-\x{4E89}\x{4E8B}-\x{4E95}\x{4E97}-\x{4EA2}'
. '\x{4EA4}-\x{4EBB}\x{4EBD}-\x{4ECB}\x{4ECD}-\x{4EE6}\x{4EE8}-\x{4EEC}'
. '\x{4EEF}-\x{4EF7}\x{4EFB}\x{4EFD}\x{4EFF}-\x{4F06}\x{4F08}-\x{4F15}'
. '\x{4F17}-\x{4F27}\x{4F29}-\x{4F30}\x{4F32}-\x{4F34}\x{4F36}\x{4F38}-\x{4F3F}'
. '\x{4F41}-\x{4F43}\x{4F45}-\x{4F70}\x{4F72}-\x{4F8B}\x{4F8D}\x{4F8F}-\x{4FA1}'
. '\x{4FA3}-\x{4FAC}\x{4FAE}-\x{4FBC}\x{4FBE}-\x{4FC5}\x{4FC7}\x{4FC9}-\x{4FCB}'
. '\x{4FCD}-\x{4FE1}\x{4FE3}-\x{4FFB}\x{4FFE}-\x{500F}\x{5011}-\x{5033}'
. '\x{5035}-\x{5037}\x{5039}-\x{503C}\x{503E}-\x{5041}\x{5043}-\x{504F}\x{5051}'
. '\x{5053}-\x{5057}\x{5059}-\x{507B}\x{507D}-\x{5080}\x{5082}-\x{5092}'
. '\x{5094}-\x{5096}\x{5098}-\x{509E}\x{50A2}-\x{50B8}\x{50BA}-\x{50C2}'
. '\x{50C4}-\x{50D7}\x{50D9}-\x{50DE}\x{50E0}\x{50E3}-\x{50EA}\x{50EC}-\x{50F3}'
. '\x{50F5}\x{50F6}\x{50F8}-\x{511A}\x{511C}-\x{5127}\x{5129}\x{512A}'
. '\x{512C}-\x{5141}\x{5143}-\x{5149}\x{514B}-\x{514E}\x{5150}-\x{5152}'
. '\x{5154}-\x{5157}\x{5159}-\x{515F}\x{5161}-\x{5163}\x{5165}-\x{5171}'
. '\x{5173}-\x{517D}\x{517F}-\x{5182}\x{5185}-\x{518D}\x{518F}-\x{51A0}\x{51A2}'
. '\x{51A4}-\x{51A8}\x{51AA}-\x{51AC}\x{51AE}-\x{51B3}\x{51B5}-\x{51B7}\x{51B9}'
. '\x{51BB}-\x{51C1}\x{51C3}-\x{51D1}\x{51D4}-\x{51DE}\x{51E0}-\x{51E5}'
. '\x{51E7}-\x{51EB}\x{51ED}\x{51EF}-\x{51F1}\x{51F3}-\x{5226}\x{5228}-\x{524E}'
. '\x{5250}-\x{5252}\x{5254}-\x{5265}\x{5267}-\x{5270}\x{5272}-\x{5278}'
. '\x{527A}-\x{5284}\x{5286}-\x{528D}\x{528F}-\x{52A3}\x{52A5}-\x{52C3}\x{52C6}'
. '\x{52C7}\x{52C9}-\x{52CB}\x{52CD}\x{52CF}\x{52D0}\x{52D2}\x{52D3}'
. '\x{52D5}-\x{52E0}\x{52E2}-\x{52E4}\x{52E6}-\x{52ED}\x{52EF}-\x{5302}'
. '\x{5305}-\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}-\x{5326}\x{5328}'
. '\x{532A}-\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}-\x{5341}\x{5343}-\x{535A}'
. '\x{535C}\x{535E}-\x{5367}\x{5369}\x{536B}\x{536C}\x{536E}-\x{537F}'
. '\x{5381}-\x{53A0}\x{53A2}-\x{53A9}\x{53AC}-\x{53AE}\x{53B0}-\x{53B9}'
. '\x{53BB}-\x{53C4}\x{53C6}-\x{53CE}\x{53D0}-\x{53D9}\x{53DB}\x{53DC}'
. '\x{53DF}-\x{53E6}\x{53E8}-\x{53FE}\x{5401}-\x{5419}\x{541B}-\x{5421}'
. '\x{5423}-\x{544B}\x{544D}-\x{545C}\x{545E}-\x{5468}\x{546A}-\x{5489}'
. '\x{548B}-\x{54B4}\x{54B6}-\x{54F5}\x{54F7}-\x{5514}\x{5516}\x{5517}'
. '\x{551A}-\x{5546}\x{5548}-\x{555F}\x{5561}-\x{5579}\x{557B}-\x{55DF}'
. '\x{55E1}-\x{55F7}\x{55F9}-\x{5604}\x{5606}-\x{5609}\x{560C}-\x{561F}'
. '\x{5621}-\x{562A}\x{562C}-\x{5636}\x{5638}-\x{563B}\x{563D}-\x{5643}'
. '\x{5645}-\x{564A}\x{564C}-\x{5650}\x{5652}-\x{5655}\x{5657}-\x{565E}\x{5660}'
. '\x{5662}-\x{5674}\x{5676}-\x{567C}\x{567E}-\x{5687}\x{568A}\x{568C}-\x{5695}'
. '\x{5697}-\x{569D}\x{569F}-\x{56A1}\x{56A3}-\x{56B9}\x{56BB}-\x{56CE}'
. '\x{56D0}-\x{56D8}\x{56DA}-\x{56E5}\x{56E7}-\x{56F5}\x{56F7}\x{56F9}\x{56FA}'
. '\x{56FD}-\x{5704}\x{5706}-\x{5710}\x{5712}-\x{5716}\x{5718}-\x{5720}\x{5722}'
. '\x{5723}\x{5725}-\x{573C}\x{573E}-\x{5742}\x{5744}-\x{5747}\x{5749}-\x{5754}'
. '\x{5757}\x{5759}-\x{5762}\x{5764}-\x{576D}\x{576F}-\x{5777}\x{5779}-\x{5780}'
. '\x{5782}-\x{5786}\x{5788}-\x{5795}\x{5797}-\x{57A7}\x{57A9}-\x{57C9}'
. '\x{57CB}-\x{57D0}\x{57D2}-\x{57D6}\x{57D8}-\x{57DA}\x{57DC}\x{57DD}'
. '\x{57DF}-\x{5816}\x{5819}-\x{5840}\x{5842}-\x{584F}\x{5851}-\x{5855}'
. '\x{5857}-\x{585F}\x{5861}-\x{5865}\x{5868}-\x{5876}\x{5878}-\x{5894}'
. '\x{5896}-\x{58A9}\x{58AB}-\x{58B4}\x{58B7}-\x{58BF}\x{58C1}\x{58C2}'
. '\x{58C5}-\x{58CB}\x{58CE}\x{58CF}\x{58D1}-\x{58DB}\x{58DD}-\x{58E0}'
. '\x{58E2}-\x{58E5}\x{58E7}-\x{58F4}\x{58F6}-\x{5900}\x{5902}-\x{5904}\x{5906}'
. '\x{5907}\x{5909}-\x{5910}\x{5912}\x{5914}-\x{5922}\x{5924}-\x{5932}\x{5934}'
. '\x{5935}\x{5937}-\x{5958}\x{595A}\x{595C}-\x{599A}\x{599C}-\x{59B6}'
. '\x{59B8}-\x{59E6}\x{59E8}-\x{5A23}\x{5A25}\x{5A27}-\x{5A2B}\x{5A2D}-\x{5A2F}'
. '\x{5A31}-\x{5A53}\x{5A55}-\x{5A58}\x{5A5A}-\x{5A6E}\x{5A70}\x{5A72}-\x{5A86}'
. '\x{5A88}-\x{5A8C}\x{5A8E}-\x{5AAA}\x{5AAC}-\x{5ACF}\x{5AD1}\x{5AD2}'
. '\x{5AD4}-\x{5AEE}\x{5AF1}-\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}-\x{5B38}'
. '\x{5B3A}-\x{5B45}\x{5B47}-\x{5B4E}\x{5B50}\x{5B51}\x{5B53}-\x{5B5F}'
. '\x{5B62}-\x{5B6E}\x{5B70}-\x{5B78}\x{5B7A}-\x{5B7D}\x{5B7F}-\x{5B85}'
. '\x{5B87}-\x{5B8F}\x{5B91}-\x{5BA8}\x{5BAA}-\x{5BB1}\x{5BB3}-\x{5BB6}'
. '\x{5BB8}-\x{5BBB}\x{5BBD}-\x{5BC7}\x{5BCA}-\x{5BD6}\x{5BD8}\x{5BD9}'
. '\x{5BDB}-\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}-\x{5C1A}\x{5C1C}-\x{5C22}\x{5C24}'
. '\x{5C25}\x{5C27}\x{5C28}\x{5C2A}-\x{5C35}\x{5C37}-\x{5C59}\x{5C5B}-\x{5C84}'
. '\x{5C86}-\x{5CB3}\x{5CB5}-\x{5CB8}\x{5CBA}-\x{5CBF}\x{5CC1}-\x{5CD4}'
. '\x{5CD6}-\x{5CDC}\x{5CDE}-\x{5CF4}\x{5CF6}-\x{5D2A}\x{5D2C}-\x{5D2E}'
. '\x{5D30}-\x{5D3A}\x{5D3C}-\x{5D52}\x{5D54}-\x{5D56}\x{5D58}-\x{5D5B}'
. '\x{5D5D}-\x{5D5F}\x{5D61}-\x{5D82}\x{5D84}-\x{5D95}\x{5D97}-\x{5DA2}'
. '\x{5DA5}-\x{5DAA}\x{5DAC}-\x{5DB2}\x{5DB4}-\x{5DB8}\x{5DBA}-\x{5DC3}'
. '\x{5DC5}-\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}-\x{5DF5}\x{5DF7}-\x{5E11}'
. '\x{5E13}-\x{5E3E}\x{5E40}-\x{5E47}\x{5E49}-\x{5E50}\x{5E52}-\x{5E91}'
. '\x{5E93}-\x{5EB9}\x{5EBB}-\x{5EBF}\x{5EC1}-\x{5EEA}\x{5EEC}-\x{5EF8}'
. '\x{5EFA}-\x{5F08}\x{5F0A}-\x{5F0D}\x{5F0F}\x{5F11}-\x{5F3A}\x{5F3C}'
. '\x{5F3E}-\x{5F8E}\x{5F90}-\x{5F99}\x{5F9B}-\x{5FA2}\x{5FA5}-\x{5FAF}'
. '\x{5FB1}-\x{5FC1}\x{5FC3}-\x{5FCD}\x{5FCF}-\x{5FDA}\x{5FDC}-\x{5FDE}\x{5FE0}'
. '\x{5FE1}\x{5FE3}-\x{5FEB}\x{5FED}-\x{5FFB}\x{5FFD}-\x{6022}\x{6024}-\x{6055}'
. '\x{6057}-\x{605F}\x{6062}-\x{6070}\x{6072}\x{6073}\x{6075}-\x{6090}\x{6092}'
. '\x{6094}-\x{60A4}\x{60A6}-\x{60A8}\x{60AA}-\x{60D1}\x{60D3}-\x{60D5}'
. '\x{60D7}-\x{60DD}\x{60DF}-\x{60E2}\x{60E4}\x{60E6}-\x{60FC}\x{60FE}-\x{6101}'
. '\x{6103}-\x{6106}\x{6108}-\x{6110}\x{6112}-\x{611D}\x{611F}\x{6120}'
. '\x{6122}-\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}-\x{615F}'
. '\x{6161}-\x{616E}\x{6170}-\x{617A}\x{617C}\x{617E}\x{6180}-\x{6185}'
. '\x{6187}-\x{6196}\x{6198}-\x{619B}\x{619D}-\x{61B8}\x{61BA}\x{61BC}-\x{61D2}'
. '\x{61D4}\x{61D6}-\x{61EB}\x{61ED}\x{61EE}\x{61F0}-\x{61F3}\x{61F5}-\x{6204}'
. '\x{6206}-\x{6234}\x{6236}-\x{6238}\x{623A}-\x{6256}\x{6258}-\x{6281}'
. '\x{6283}-\x{628C}\x{628E}-\x{629C}\x{629E}-\x{62A5}\x{62A7}-\x{62DD}'
. '\x{62DF}-\x{62E9}\x{62EB}-\x{6309}\x{630B}-\x{6316}\x{6318}-\x{6330}'
. '\x{6332}-\x{6334}\x{6336}\x{6338}-\x{633E}\x{6340}-\x{635A}\x{635C}-\x{637E}'
. '\x{6380}-\x{638A}\x{638C}-\x{6392}\x{6394}-\x{63BA}\x{63BC}-\x{63D0}'
. '\x{63D2}-\x{6406}\x{6408}-\x{643A}\x{643D}-\x{6441}\x{6443}-\x{6448}'
. '\x{644A}-\x{6459}\x{645B}-\x{647D}\x{647F}-\x{6485}\x{6487}-\x{64A0}'
. '\x{64A2}-\x{64AE}\x{64B0}-\x{64B5}\x{64B7}-\x{64C7}\x{64C9}-\x{64D4}'
. '\x{64D6}-\x{64E0}\x{64E2}-\x{64E4}\x{64E6}-\x{64ED}\x{64EF}-\x{64F4}'
. '\x{64F6}-\x{64F8}\x{64FA}-\x{6501}\x{6503}-\x{6509}\x{650B}-\x{651E}'
. '\x{6520}-\x{6527}\x{6529}-\x{653F}\x{6541}\x{6543}-\x{6559}\x{655B}-\x{655E}'
. '\x{6560}-\x{656C}\x{656E}-\x{657C}\x{657E}-\x{6589}\x{658B}-\x{6599}'
. '\x{659B}-\x{65B4}\x{65B6}-\x{65BD}\x{65BF}-\x{65C7}\x{65CA}-\x{65D0}'
. '\x{65D2}-\x{65D7}\x{65DA}\x{65DB}\x{65DD}-\x{65E3}\x{65E5}-\x{65E9}'
. '\x{65EB}-\x{65F8}\x{65FA}-\x{65FD}\x{6600}-\x{6616}\x{6618}-\x{661D}'
. '\x{661F}-\x{662B}\x{662D}-\x{6636}\x{6639}\x{663A}\x{663C}-\x{663E}'
. '\x{6640}-\x{6647}\x{6649}-\x{664C}\x{664E}-\x{665F}\x{6661}\x{6662}'
. '\x{6664}-\x{6666}\x{6668}-\x{6691}\x{6693}-\x{669B}\x{669D}\x{669F}-\x{66AB}'
. '\x{66AE}-\x{66CF}\x{66D1}\x{66D2}\x{66D4}-\x{66D6}\x{66D8}-\x{66DE}'
. '\x{66E0}-\x{66EE}\x{66F0}-\x{66FC}\x{66FE}-\x{6701}\x{6703}-\x{6706}'
. '\x{6708}-\x{6718}\x{671A}-\x{6723}\x{6725}-\x{6728}\x{672A}-\x{6766}'
. '\x{6768}-\x{6787}\x{6789}-\x{6795}\x{6797}-\x{67A8}\x{67AA}-\x{67BC}\x{67BE}'
. '\x{67C0}-\x{67D4}\x{67D6}\x{67D8}-\x{67F8}\x{67FA}-\x{6800}\x{6802}-\x{6814}'
. '\x{6816}-\x{681D}\x{681F}-\x{6826}\x{6828}-\x{682F}\x{6831}-\x{6857}\x{685B}'
. '\x{685D}\x{6860}-\x{6879}\x{687B}-\x{6894}\x{6896}-\x{6898}\x{689A}-\x{68A4}'
. '\x{68A6}-\x{68B7}\x{68B9}\x{68BB}-\x{68C2}\x{68C4}\x{68C6}-\x{68D8}'
. '\x{68DA}-\x{68E1}\x{68E3}\x{68E4}\x{68E6}-\x{68FF}\x{6901}-\x{6908}'
. '\x{690A}-\x{693D}\x{693F}-\x{694C}\x{694E}-\x{699E}\x{69A0}\x{69A1}'
. '\x{69A3}-\x{69BF}\x{69C1}-\x{69D0}\x{69D3}\x{69D4}\x{69D8}-\x{69F8}'
. '\x{69FA}-\x{6A02}\x{6A04}-\x{6A0B}\x{6A0D}-\x{6A1B}\x{6A1D}-\x{6A23}'
. '\x{6A25}-\x{6A36}\x{6A38}-\x{6A49}\x{6A4B}-\x{6A52}\x{6A54}-\x{6A5B}'
. '\x{6A5D}-\x{6A6D}\x{6A6F}\x{6A71}-\x{6A85}\x{6A87}-\x{6A89}\x{6A8B}-\x{6A8E}'
. '\x{6A90}-\x{6A98}\x{6A9A}-\x{6A9C}\x{6A9E}-\x{6AA9}\x{6AAB}-\x{6AB0}'
. '\x{6AB2}-\x{6ABD}\x{6ABF}\x{6AC1}-\x{6AC3}\x{6AC5}-\x{6AC7}\x{6ACA}-\x{6AD7}'
. '\x{6AD9}-\x{6AE8}\x{6AEA}-\x{6B0D}\x{6B0F}-\x{6B1A}\x{6B1C}-\x{6B2D}'
. '\x{6B2F}-\x{6B34}\x{6B36}-\x{6B3F}\x{6B41}-\x{6B56}\x{6B59}-\x{6B5C}'
. '\x{6B5E}-\x{6B67}\x{6B69}-\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}-\x{6B74}'
. '\x{6B76}-\x{6B7C}\x{6B7E}-\x{6BB0}\x{6BB2}-\x{6BB7}\x{6BB9}-\x{6BE8}'
. '\x{6BEA}-\x{6BF0}\x{6BF2}\x{6BF3}\x{6BF5}-\x{6BF9}\x{6BFB}-\x{6C09}'
. '\x{6C0B}-\x{6C16}\x{6C18}-\x{6C1B}\x{6C1D}-\x{6C2C}\x{6C2E}-\x{6C38}\x{6C3A}'
. '\x{6C3B}\x{6C3D}-\x{6C44}\x{6C46}-\x{6C6B}\x{6C6D}\x{6C6F}-\x{6C9F}'
. '\x{6CA1}-\x{6CD7}\x{6CD9}-\x{6CF3}\x{6CF5}-\x{6D01}\x{6D03}-\x{6D1B}'
. '\x{6D1D}-\x{6D23}\x{6D25}-\x{6D70}\x{6D72}-\x{6D80}\x{6D82}-\x{6D95}'
. '\x{6D97}-\x{6D9B}\x{6D9D}-\x{6DAF}\x{6DB2}-\x{6DB5}\x{6DB7}-\x{6DFD}\x{6E00}'
. '\x{6E03}-\x{6E05}\x{6E07}-\x{6E11}\x{6E14}-\x{6E17}\x{6E19}-\x{6E29}'
. '\x{6E2B}-\x{6E4B}\x{6E4D}-\x{6E6B}\x{6E6D}-\x{6E75}\x{6E77}-\x{6E79}'
. '\x{6E7E}-\x{6E8A}\x{6E8D}-\x{6E94}\x{6E96}-\x{6EDA}\x{6EDC}\x{6EDE}-\x{6EE2}'
. '\x{6EE4}-\x{6F03}\x{6F05}-\x{6F0A}\x{6F0C}-\x{6F41}\x{6F43}-\x{6F47}\x{6F49}'
. '\x{6F4B}-\x{6F78}\x{6F7A}-\x{6F97}\x{6F99}\x{6F9B}-\x{6F9E}\x{6FA0}-\x{6FB6}'
. '\x{6FB8}-\x{6FC4}\x{6FC6}-\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}-\x{6FF4}'
. '\x{6FF6}-\x{6FFC}\x{6FFE}-\x{700F}\x{7011}\x{7012}\x{7014}-\x{701D}'
. '\x{701F}-\x{7046}\x{7048}-\x{704A}\x{704C}\x{704D}\x{704F}-\x{7071}'
. '\x{7074}-\x{707A}\x{707C}-\x{7080}\x{7082}-\x{708C}\x{708E}-\x{7096}'
. '\x{7098}-\x{709A}\x{709C}-\x{70A9}\x{70AB}-\x{70B1}\x{70B3}-\x{70B5}'
. '\x{70B7}-\x{70D4}\x{70D6}-\x{70FD}\x{70FF}-\x{7107}\x{7109}-\x{7113}'
. '\x{7115}-\x{7123}\x{7125}-\x{7132}\x{7135}-\x{713B}\x{713D}-\x{7154}\x{7156}'
. '\x{7158}-\x{716A}\x{716C}\x{716E}-\x{718C}\x{718E}-\x{7195}\x{7197}-\x{71A5}'
. '\x{71A7}-\x{71AA}\x{71AC}-\x{71B5}\x{71B7}-\x{71CB}\x{71CD}-\x{71D2}'
. '\x{71D4}-\x{71F2}\x{71F4}-\x{71F9}\x{71FB}-\x{71FF}\x{7201}-\x{720A}'
. '\x{720C}-\x{7210}\x{7212}-\x{7214}\x{7216}\x{7218}-\x{721F}\x{7221}-\x{7223}'
. '\x{7226}-\x{722E}\x{7230}-\x{7233}\x{7235}-\x{7244}\x{7246}-\x{724D}\x{724F}'
. '\x{7251}-\x{7254}\x{7256}-\x{729F}\x{72A1}-\x{72AA}\x{72AC}-\x{72BD}'
. '\x{72BF}-\x{7301}\x{7303}-\x{730F}\x{7311}-\x{731E}\x{7320}-\x{7327}'
. '\x{7329}-\x{732E}\x{7330}-\x{734E}\x{7350}-\x{7352}\x{7354}-\x{7362}'
. '\x{7364}-\x{739B}\x{739D}-\x{73C0}\x{73C2}-\x{73E0}\x{73E2}\x{73E3}'
. '\x{73E5}-\x{73F2}\x{73F4}-\x{73FA}\x{73FC}-\x{7417}\x{7419}-\x{7438}'
. '\x{743A}-\x{743D}\x{743F}-\x{7446}\x{7448}\x{744A}-\x{7457}\x{7459}-\x{745F}'
. '\x{7461}-\x{747A}\x{747C}-\x{7483}\x{7485}-\x{7495}\x{7497}-\x{749C}'
. '\x{749E}-\x{74A1}\x{74A3}-\x{74C6}\x{74CA}\x{74CB}\x{74CD}-\x{74EA}'
. '\x{74EC}-\x{750D}\x{750F}-\x{751F}\x{7521}-\x{7533}\x{7535}-\x{7540}'
. '\x{7542}-\x{7549}\x{754B}-\x{7551}\x{7553}\x{7554}\x{7556}-\x{755D}\x{755F}'
. '\x{7560}\x{7562}-\x{7570}\x{7572}\x{7574}-\x{7579}\x{757C}-\x{7584}'
. '\x{7586}-\x{758D}\x{758F}-\x{75A8}\x{75AA}-\x{75B6}\x{75B8}-\x{75DB}'
. '\x{75DD}-\x{75E8}\x{75EA}-\x{75ED}\x{75EF}-\x{762B}\x{762D}-\x{7643}'
. '\x{7646}-\x{764D}\x{764F}\x{7650}\x{7652}-\x{7654}\x{7656}-\x{7672}'
. '\x{7674}-\x{7679}\x{767B}-\x{768C}\x{768E}-\x{76A0}\x{76A3}\x{76A4}\x{76A6}'
. '\x{76A7}\x{76A9}-\x{76B2}\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}-\x{76C0}'
. '\x{76C2}-\x{76CA}\x{76CD}-\x{76D8}\x{76DA}-\x{76EA}\x{76EC}-\x{76FF}\x{7701}'
. '\x{7703}-\x{770D}\x{770F}-\x{7720}\x{7722}\x{7723}\x{7725}-\x{772A}'
. '\x{772C}-\x{773E}\x{7740}\x{7741}\x{7743}-\x{7763}\x{7765}-\x{7795}'
. '\x{7797}-\x{77A3}\x{77A5}-\x{77BD}\x{77BF}\x{77C0}\x{77C2}-\x{77D1}'
. '\x{77D3}-\x{77DC}\x{77DE}-\x{77E3}\x{77E5}\x{77E7}-\x{77F3}\x{77F6}-\x{7806}'
. '\x{7808}-\x{7823}\x{7825}-\x{7835}\x{7837}-\x{783E}\x{7840}\x{7841}'
. '\x{7843}-\x{7845}\x{7847}-\x{784A}\x{784C}-\x{784E}\x{7850}-\x{7875}'
. '\x{7877}-\x{7887}\x{7889}-\x{78C1}\x{78C3}-\x{78C6}\x{78C8}-\x{78D1}'
. '\x{78D3}-\x{78EF}\x{78F1}-\x{78F7}\x{78F9}-\x{78FF}\x{7901}-\x{7907}'
. '\x{7909}-\x{790C}\x{790E}-\x{7914}\x{7916}-\x{791E}\x{7921}-\x{7931}'
. '\x{7933}-\x{7935}\x{7937}-\x{7958}\x{795A}-\x{796B}\x{796D}\x{796F}-\x{7974}'
. '\x{7977}-\x{7985}\x{7988}-\x{799C}\x{799F}-\x{79A8}\x{79AA}-\x{79BB}'
. '\x{79BD}-\x{79C3}\x{79C5}\x{79C6}\x{79C8}-\x{79CB}\x{79CD}-\x{79D3}\x{79D5}'
. '\x{79D6}\x{79D8}-\x{7A00}\x{7A02}-\x{7A06}\x{7A08}\x{7A0A}-\x{7A2B}'
. '\x{7A2D}-\x{7A35}\x{7A37}\x{7A39}\x{7A3B}-\x{7A4E}\x{7A50}-\x{7A62}'
. '\x{7A65}-\x{7A69}\x{7A6B}-\x{7A6E}\x{7A70}-\x{7A81}\x{7A83}-\x{7A99}'
. '\x{7A9C}-\x{7AB8}\x{7ABA}\x{7ABE}-\x{7AC1}\x{7AC4}\x{7AC5}\x{7AC7}-\x{7AD6}'
. '\x{7AD8}\x{7AD9}\x{7ADB}-\x{7AE8}\x{7AEA}-\x{7AF4}\x{7AF6}-\x{7AFB}'
. '\x{7AFD}-\x{7B06}\x{7B08}-\x{7B1E}\x{7B20}-\x{7B26}\x{7B28}\x{7B2A}-\x{7B41}'
. '\x{7B43}-\x{7B52}\x{7B54}-\x{7B6E}\x{7B70}-\x{7B79}\x{7B7B}-\x{7B85}'
. '\x{7B87}-\x{7B91}\x{7B93}-\x{7BA2}\x{7BA4}\x{7BA6}-\x{7BAF}\x{7BB1}'
. '\x{7BB3}-\x{7BCE}\x{7BD0}-\x{7BF9}\x{7BFB}-\x{7C13}\x{7C15}-\x{7C1A}'
. '\x{7C1C}-\x{7C2D}\x{7C30}-\x{7C4E}\x{7C50}\x{7C51}\x{7C53}\x{7C54}'
. '\x{7C56}-\x{7C5C}\x{7C5E}-\x{7C75}\x{7C77}-\x{7C82}\x{7C84}-\x{7C86}'
. '\x{7C88}-\x{7C92}\x{7C94}-\x{7C99}\x{7C9B}-\x{7CAA}\x{7CAD}-\x{7CD2}'
. '\x{7CD4}-\x{7CD9}\x{7CDC}-\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}-\x{7CFB}\x{7CFD}'
. '\x{7CFE}\x{7D00}-\x{7D22}\x{7D24}-\x{7D29}\x{7D2B}\x{7D2C}\x{7D2E}-\x{7D47}'
. '\x{7D49}-\x{7D4C}\x{7D4E}-\x{7D59}\x{7D5B}-\x{7D63}\x{7D65}-\x{7D77}'
. '\x{7D79}-\x{7D81}\x{7D83}-\x{7D94}\x{7D96}\x{7D97}\x{7D99}\x{7D9B}-\x{7DA3}'
. '\x{7DA5}-\x{7DA7}\x{7DA9}-\x{7DCC}\x{7DCE}-\x{7DD2}\x{7DD4}-\x{7DDB}'
. '\x{7DDD}-\x{7DE3}\x{7DE6}-\x{7DEA}\x{7DEC}-\x{7DFC}\x{7E00}-\x{7E17}'
. '\x{7E19}-\x{7E49}\x{7E4C}-\x{7E5A}\x{7E5C}-\x{7E63}\x{7E65}-\x{7E9C}'
. '\x{7E9E}-\x{7F3A}\x{7F3D}-\x{7F40}\x{7F42}-\x{7F45}\x{7F47}-\x{7F58}'
. '\x{7F5A}-\x{7F83}\x{7F85}-\x{7F8F}\x{7F91}-\x{7F96}\x{7F98}\x{7F9A}-\x{7FB3}'
. '\x{7FB5}-\x{7FD5}\x{7FD7}-\x{7FDC}\x{7FDE}-\x{7FE3}\x{7FE5}-\x{8009}'
. '\x{800B}-\x{802E}\x{8030}-\x{803B}\x{803D}-\x{803F}\x{8041}-\x{8065}'
. '\x{8067}-\x{8087}\x{8089}-\x{808D}\x{808F}-\x{8093}\x{8095}-\x{80A5}'
. '\x{80A9}-\x{80AB}\x{80AD}-\x{80B2}\x{80B4}-\x{80B8}\x{80BA}-\x{80DE}'
. '\x{80E0}-\x{8102}\x{8105}-\x{8116}\x{8118}-\x{8132}\x{8136}-\x{815E}'
. '\x{8160}-\x{8183}\x{8185}-\x{818F}\x{8191}-\x{8195}\x{8197}-\x{81CA}'
. '\x{81CC}-\x{81D2}\x{81D4}-\x{81E3}\x{81E5}-\x{81EE}\x{81F1}-\x{8212}'
. '\x{8214}-\x{8216}\x{8218}-\x{8223}\x{8225}-\x{822D}\x{822F}-\x{8240}'
. '\x{8242}-\x{8261}\x{8263}\x{8264}\x{8266}-\x{828B}\x{828D}-\x{82B1}'
. '\x{82B3}-\x{82E1}\x{82E3}-\x{82FB}\x{82FD}-\x{8309}\x{830B}-\x{830F}'
. '\x{8311}-\x{832F}\x{8331}-\x{8354}\x{8356}-\x{839E}\x{83A0}-\x{83B4}'
. '\x{83B6}-\x{83BD}\x{83BF}-\x{83E5}\x{83E7}-\x{83EC}\x{83EE}-\x{8413}\x{8415}'
. '\x{8418}-\x{841E}\x{8421}-\x{8457}\x{8459}-\x{8482}\x{8484}-\x{8494}'
. '\x{8496}-\x{84AC}\x{84AE}-\x{84B6}\x{84B8}-\x{84C2}\x{84C4}-\x{84D9}'
. '\x{84DB}-\x{84EC}\x{84EE}-\x{8504}\x{8506}-\x{850F}\x{8511}-\x{8531}'
. '\x{8534}-\x{854B}\x{854D}-\x{854F}\x{8551}-\x{857E}\x{8580}-\x{8592}'
. '\x{8594}-\x{8596}\x{8598}-\x{85B1}\x{85B3}-\x{85BA}\x{85BC}-\x{85CB}'
. '\x{85CD}-\x{85ED}\x{85EF}-\x{85F2}\x{85F4}-\x{85FB}\x{85FD}-\x{8602}'
. '\x{8604}-\x{860C}\x{860F}\x{8611}-\x{8614}\x{8616}-\x{861C}\x{861E}-\x{8636}'
. '\x{8638}-\x{8656}\x{8658}-\x{8674}\x{8676}-\x{8688}\x{868A}-\x{8691}'
. '\x{8693}-\x{869F}\x{86A1}-\x{86A5}\x{86A7}-\x{86CC}\x{86CE}-\x{86D4}'
. '\x{86D6}-\x{86DF}\x{86E1}-\x{86E6}\x{86E8}-\x{86FC}\x{86FE}-\x{871C}'
. '\x{871E}-\x{872E}\x{8730}-\x{873C}\x{873E}-\x{8744}\x{8746}-\x{874A}'
. '\x{874C}-\x{8770}\x{8772}-\x{877E}\x{8780}-\x{878D}\x{878F}-\x{8798}'
. '\x{879A}-\x{87D9}\x{87DB}-\x{87EF}\x{87F1}-\x{8806}\x{8808}-\x{8811}'
. '\x{8813}-\x{882C}\x{882E}-\x{8839}\x{883B}-\x{8846}\x{8848}-\x{8857}'
. '\x{8859}-\x{885B}\x{885D}\x{885E}\x{8860}-\x{8879}\x{887B}-\x{88B4}'
. '\x{88B6}-\x{88E5}\x{88E7}\x{88E8}\x{88EA}-\x{88EC}\x{88EE}-\x{8902}'
. '\x{8904}-\x{890E}\x{8910}-\x{8923}\x{8925}-\x{894C}\x{894E}-\x{8964}'
. '\x{8966}-\x{8974}\x{8976}-\x{897C}\x{897E}-\x{898C}\x{898E}\x{898F}'
. '\x{8991}-\x{8993}\x{8995}-\x{8998}\x{899A}-\x{89A8}\x{89AA}-\x{89AF}'
. '\x{89B1}-\x{89B3}\x{89B5}-\x{89BA}\x{89BD}-\x{89ED}\x{89EF}-\x{89F4}'
. '\x{89F6}-\x{89F8}\x{89FA}-\x{89FC}\x{89FE}-\x{8A04}\x{8A07}-\x{8A13}'
. '\x{8A15}-\x{8A18}\x{8A1A}-\x{8A1F}\x{8A22}-\x{8A2A}\x{8A2C}-\x{8A32}'
. '\x{8A34}-\x{8A3C}\x{8A3E}-\x{8A4A}\x{8A4C}-\x{8A63}\x{8A65}-\x{8A77}'
. '\x{8A79}-\x{8A7C}\x{8A7E}-\x{8A87}\x{8A89}-\x{8A9E}\x{8AA0}-\x{8AAC}\x{8AAE}'
. '\x{8AB0}-\x{8AB6}\x{8AB8}-\x{8ACF}\x{8AD1}-\x{8AEB}\x{8AED}-\x{8B0B}'
. '\x{8B0D}-\x{8B28}\x{8B2A}-\x{8B31}\x{8B33}-\x{8B37}\x{8B39}-\x{8B3E}'
. '\x{8B40}-\x{8B60}\x{8B63}-\x{8B68}\x{8B6A}-\x{8B71}\x{8B73}\x{8B74}'
. '\x{8B76}-\x{8B7B}\x{8B7D}-\x{8B80}\x{8B82}-\x{8B86}\x{8B88}-\x{8B8C}\x{8B8E}'
. '\x{8B90}-\x{8B9A}\x{8B9C}-\x{8C37}\x{8C39}-\x{8C3F}\x{8C41}-\x{8C43}'
. '\x{8C45}-\x{8C50}\x{8C54}-\x{8C57}\x{8C59}-\x{8C73}\x{8C75}-\x{8C7B}\x{8C7D}'
. '\x{8C7E}\x{8C80}-\x{8C82}\x{8C84}-\x{8C86}\x{8C88}-\x{8C8A}\x{8C8C}\x{8C8D}'
. '\x{8C8F}-\x{8C9A}\x{8C9C}-\x{8CA5}\x{8CA7}-\x{8CCA}\x{8CCC}\x{8CCE}-\x{8CD5}'
. '\x{8CD7}\x{8CD9}-\x{8CE8}\x{8CEA}-\x{8CF6}\x{8CF8}-\x{8D00}\x{8D02}-\x{8D10}'
. '\x{8D13}-\x{8D7B}\x{8D7D}-\x{8DA5}\x{8DA7}-\x{8DBF}\x{8DC1}-\x{8DE4}'
. '\x{8DE6}-\x{8E00}\x{8E02}-\x{8E0A}\x{8E0C}-\x{8E31}\x{8E33}-\x{8E45}'
. '\x{8E47}-\x{8E4E}\x{8E50}-\x{8E6D}\x{8E6F}-\x{8E74}\x{8E76}\x{8E78}'
. '\x{8E7A}-\x{8E98}\x{8E9A}\x{8E9C}-\x{8EA1}\x{8EA3}-\x{8EB2}\x{8EB4}\x{8EB5}'
. '\x{8EB8}-\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}-\x{8ED8}\x{8EDA}-\x{8EE1}'
. '\x{8EE4}-\x{8EEF}\x{8EF1}-\x{8F0B}\x{8F0D}\x{8F0E}\x{8F10}-\x{8F18}'
. '\x{8F1A}-\x{8F2C}\x{8F2E}-\x{8F39}\x{8F3B}-\x{8F40}\x{8F42}-\x{8F5B}'
. '\x{8F5D}-\x{8F9C}\x{8F9E}-\x{8FA3}\x{8FA5}-\x{8FB2}\x{8FB4}-\x{8FB9}'
. '\x{8FBB}-\x{8FC2}\x{8FC4}-\x{8FC9}\x{8FCB}-\x{8FE6}\x{8FE8}-\x{900D}'
. '\x{900F}-\x{9029}\x{902B}\x{902D}-\x{9036}\x{9038}\x{903A}-\x{903F}'
. '\x{9041}-\x{9045}\x{9047}-\x{90AA}\x{90AC}-\x{90CB}\x{90CE}-\x{90D1}'
. '\x{90D3}-\x{90F5}\x{90F7}-\x{9109}\x{910B}-\x{913B}\x{913E}-\x{9158}'
. '\x{915A}-\x{917A}\x{917C}-\x{9194}\x{9196}\x{9199}-\x{91A3}\x{91A5}-\x{91A8}'
. '\x{91AA}-\x{91B7}\x{91B9}-\x{91BE}\x{91C0}-\x{91C3}\x{91C5}-\x{91C7}'
. '\x{91C9}-\x{91D5}\x{91D7}-\x{91DF}\x{91E2}-\x{91EE}\x{91F0}-\x{91F5}'
. '\x{91F7}-\x{91FB}\x{91FD}-\x{9212}\x{9214}-\x{921E}\x{9220}\x{9221}'
. '\x{9223}-\x{922B}\x{922D}-\x{9242}\x{9245}-\x{9268}\x{926B}-\x{9270}'
. '\x{9272}-\x{9280}\x{9282}\x{9283}\x{9285}-\x{929D}\x{929F}-\x{92BC}'
. '\x{92BE}-\x{92D3}\x{92D5}-\x{92DA}\x{92DC}-\x{92E1}\x{92E3}-\x{931B}'
. '\x{931D}-\x{932B}\x{932D}-\x{932F}\x{9332}-\x{9361}\x{9363}-\x{9367}\x{9369}'
. '\x{936A}\x{936C}-\x{936E}\x{9370}-\x{9372}\x{9374}-\x{9377}\x{9379}-\x{937E}'
. '\x{9380}\x{9382}-\x{938A}\x{938C}-\x{939B}\x{939D}-\x{939F}\x{93A1}-\x{93AA}'
. '\x{93AC}-\x{93BA}\x{93BC}-\x{93DF}\x{93E1}-\x{93E4}\x{93E6}-\x{93F2}'
. '\x{93F4}-\x{9401}\x{9403}-\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}'
. '\x{9422}\x{9423}\x{9425}-\x{9442}\x{9444}-\x{944D}\x{944F}-\x{9459}'
. '\x{945B}-\x{946B}\x{946D}-\x{947A}\x{947C}-\x{9577}\x{957A}-\x{957D}'
. '\x{957F}-\x{9584}\x{9586}-\x{9596}\x{9598}-\x{959F}\x{95A1}-\x{95B2}'
. '\x{95B5}-\x{95B7}\x{95B9}-\x{95C0}\x{95C2}-\x{95D8}\x{95DA}-\x{95DC}'
. '\x{95DE}-\x{9624}\x{9627}\x{9628}\x{962A}-\x{963D}\x{963F}-\x{9655}'
. '\x{9658}-\x{9664}\x{9666}-\x{9678}\x{967C}-\x{967E}\x{9680}\x{9683}-\x{968B}'
. '\x{968D}-\x{9695}\x{9697}-\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}-\x{96AA}'
. '\x{96AC}-\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}-\x{96E3}\x{96E5}'
. '\x{96E8}-\x{96FB}\x{96FD}-\x{9713}\x{9715}\x{9716}\x{9718}\x{9719}'
. '\x{971C}-\x{9732}\x{9735}\x{9736}\x{9738}-\x{973F}\x{9742}-\x{974C}'
. '\x{974E}-\x{9756}\x{9758}-\x{9762}\x{9765}-\x{9770}\x{9772}-\x{9774}'
. '\x{9776}-\x{9786}\x{9788}\x{978A}-\x{979A}\x{979C}-\x{97A8}\x{97AA}-\x{97AF}'
. '\x{97B2}-\x{97B4}\x{97B6}-\x{97BD}\x{97BF}\x{97C1}-\x{97D1}\x{97D3}-\x{97FB}'
. '\x{97FD}-\x{981E}\x{9820}-\x{9824}\x{9826}-\x{9829}\x{982B}\x{982D}-\x{9832}'
. '\x{9834}-\x{9839}\x{983B}-\x{983D}\x{983F}-\x{9841}\x{9843}-\x{9846}'
. '\x{9848}-\x{984A}\x{984C}-\x{9855}\x{9857}-\x{9865}\x{9867}\x{9869}-\x{98B6}'
. '\x{98B8}-\x{98C6}\x{98C8}\x{98C9}\x{98CB}-\x{98E0}\x{98E2}\x{98E3}'
. '\x{98E5}-\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}-\x{98F7}\x{98F9}\x{98FA}'
. '\x{98FC}-\x{9918}\x{991A}-\x{993A}\x{993C}-\x{9943}\x{9945}-\x{994C}'
. '\x{994E}-\x{9959}\x{995B}\x{995C}\x{995E}-\x{99BE}\x{99C0}-\x{99C4}'
. '\x{99C6}-\x{99DF}\x{99E1}-\x{99E5}\x{99E7}-\x{99EA}\x{99EC}-\x{99F4}'
. '\x{99F6}-\x{9A0F}\x{9A11}\x{9A14}-\x{9A16}\x{9A19}-\x{9A27}\x{9A29}-\x{9A3A}'
. '\x{9A3C}-\x{9A50}\x{9A52}-\x{9A57}\x{9A59}-\x{9A5C}\x{9A5E}-\x{9A62}'
. '\x{9A64}-\x{9AA8}\x{9AAA}-\x{9ABC}\x{9ABE}-\x{9AC7}\x{9AC9}-\x{9AD6}'
. '\x{9AD8}-\x{9ADF}\x{9AE1}-\x{9AE3}\x{9AE5}-\x{9AE7}\x{9AEA}-\x{9AEF}'
. '\x{9AF1}-\x{9AFF}\x{9B01}\x{9B03}-\x{9B08}\x{9B0A}-\x{9B13}\x{9B15}-\x{9B1A}'
. '\x{9B1C}-\x{9B33}\x{9B35}-\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}-\x{9B4F}'
. '\x{9B51}-\x{9B56}\x{9B58}-\x{9B61}\x{9B63}-\x{9B71}\x{9B73}-\x{9B88}\x{9B8A}'
. '\x{9B8B}\x{9B8D}-\x{9B98}\x{9B9A}-\x{9BC1}\x{9BC3}-\x{9BF5}\x{9BF7}-\x{9BFF}'
. '\x{9C02}\x{9C05}-\x{9C2D}\x{9C2F}-\x{9C41}\x{9C43}-\x{9C4E}\x{9C50}'
. '\x{9C52}-\x{9C60}\x{9C62}\x{9C63}\x{9C65}-\x{9C75}\x{9C77}-\x{9C7A}'
. '\x{9C7C}-\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}-\x{9D26}\x{9D28}\x{9D29}\x{9D2B}'
. '\x{9D2D}-\x{9D34}\x{9D36}-\x{9D3B}\x{9D3D}-\x{9D43}\x{9D45}-\x{9D6C}'
. '\x{9D6E}-\x{9D8E}\x{9D90}-\x{9D94}\x{9D96}-\x{9DAD}\x{9DAF}-\x{9DBC}\x{9DBE}'
. '\x{9DBF}\x{9DC1}-\x{9DC5}\x{9DC7}-\x{9DE9}\x{9DEB}-\x{9DFB}\x{9DFD}-\x{9E0D}'
. '\x{9E0F}-\x{9E15}\x{9E17}-\x{9E1B}\x{9E1D}-\x{9E77}\x{9E79}\x{9E7A}'
. '\x{9E7C}-\x{9E8E}\x{9E91}-\x{9E94}\x{9E96}\x{9E97}\x{9E99}-\x{9E9D}'
. '\x{9E9F}-\x{9EA1}\x{9EA3}-\x{9EAA}\x{9EAD}-\x{9EB0}\x{9EB2}-\x{9EB8}'
. '\x{9EBB}-\x{9EEB}\x{9EED}-\x{9EF0}\x{9EF2}-\x{9F02}\x{9F04}-\x{9F10}\x{9F12}'
. '\x{9F13}\x{9F15}-\x{9F20}\x{9F22}-\x{9F25}\x{9F27}-\x{9F44}\x{9F46}-\x{9F52}'
. '\x{9F54}-\x{9F61}\x{9F63}-\x{9F6C}\x{9F6E}-\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu',
];
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function in_array;
use function intval;
use function is_string;
use function preg_match;
use function str_replace;
use function strlen;
use function strtoupper;
use function substr;






class Iban extends AbstractValidator
{
public const NOTSUPPORTED = 'ibanNotSupported';
public const SEPANOTSUPPORTED = 'ibanSepaNotSupported';
public const FALSEFORMAT = 'ibanFalseFormat';
public const CHECKFAILED = 'ibanCheckFailed';






protected $messageTemplates = [
self::NOTSUPPORTED => 'Unknown country within the IBAN',
self::SEPANOTSUPPORTED => 'Countries outside the Single Euro Payments Area (SEPA) are not supported',
self::FALSEFORMAT => 'The input has a false IBAN format',
self::CHECKFAILED => 'The input has failed the IBAN check',
];






protected $countryCode;






protected $allowNonSepa = true;






protected static $sepaCountries = [
'AT',
'BE',
'BG',
'CY',
'CZ',
'DK',
'FO',
'GL',
'EE',
'FI',
'FR',
'DE',
'GI',
'GR',
'HU',
'IS',
'IE',
'IT',
'LV',
'LI',
'LT',
'LU',
'MT',
'MC',
'NL',
'NO',
'PL',
'PT',
'RO',
'SK',
'SI',
'ES',
'SE',
'CH',
'GB',
'SM',
'HR',
];






protected static $ibanRegex = [
'AD' => 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}',
'AE' => 'AE[0-9]{2}[0-9]{3}[0-9]{16}',
'AL' => 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}',
'AT' => 'AT[0-9]{2}[0-9]{5}[0-9]{11}',
'AZ' => 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}',
'BA' => 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}',
'BE' => 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}',
'BG' => 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}',
'BH' => 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}',
'BR' => 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]',
'BY' => 'BY[0-9]{2}[A-Z0-9]{4}[0-9]{4}[A-Z0-9]{16}',
'CH' => 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}',
'CR' => 'CR[0-9]{2}[0-9]{3}[0-9]{14}',
'CY' => 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}',
'CZ' => 'CZ[0-9]{2}[0-9]{20}',
'DE' => 'DE[0-9]{2}[0-9]{8}[0-9]{10}',
'DO' => 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}',
'DK' => 'DK[0-9]{2}[0-9]{14}',
'EE' => 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}',
'ES' => 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}',
'FI' => 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}',
'FO' => 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',
'FR' => 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',
'GB' => 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',
'GE' => 'GE[0-9]{2}[A-Z]{2}[0-9]{16}',
'GI' => 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}',
'GL' => 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',
'GR' => 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}',
'GT' => 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}',
'HR' => 'HR[0-9]{2}[0-9]{7}[0-9]{10}',
'HU' => 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}',
'IE' => 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',
'IL' => 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}',
'IS' => 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}',
'IT' => 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',
'KW' => 'KW[0-9]{2}[A-Z]{4}[0-9]{22}',
'KZ' => 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}',
'LB' => 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}',
'LI' => 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}',
'LT' => 'LT[0-9]{2}[0-9]{5}[0-9]{11}',
'LU' => 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}',
'LV' => 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}',
'MC' => 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',
'MD' => 'MD[0-9]{2}[A-Z0-9]{20}',
'ME' => 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',
'MK' => 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}',
'MR' => 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}',
'MT' => 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}',
'MU' => 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}',
'NL' => 'NL[0-9]{2}[A-Z]{4}[0-9]{10}',
'NO' => 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}',
'UA' => 'UA[0-9]{2}[0-9]{6}[0-9]{19}',
'PK' => 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',
'PL' => 'PL[0-9]{2}[0-9]{8}[0-9]{16}',
'PS' => 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}',
'PT' => 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}',
'RO' => 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',
'RS' => 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',
'SA' => 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}',
'SE' => 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}',
'SI' => 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}',
'SK' => 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}',
'SM' => 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',
'TN' => 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',
'TR' => 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}',
'VG' => 'VG[0-9]{2}[A-Z]{4}[0-9]{16}',
];






public function __construct($options = [])
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}

if (array_key_exists('country_code', $options)) {
$this->setCountryCode($options['country_code']);
}

if (array_key_exists('allow_non_sepa', $options)) {
$this->setAllowNonSepa($options['allow_non_sepa']);
}

parent::__construct($options);
}








public function getCountryCode()
{
return $this->countryCode;
}










public function setCountryCode($countryCode = null)
{
if ($countryCode !== null) {
$countryCode = (string) $countryCode;

if (! isset(static::$ibanRegex[$countryCode])) {
throw new Exception\InvalidArgumentException(
"Country code '{$countryCode}' invalid by ISO 3166-1 or not supported"
);
}
}

$this->countryCode = $countryCode;
return $this;
}








public function allowNonSepa()
{
return $this->allowNonSepa;
}









public function setAllowNonSepa($allowNonSepa)
{
$this->allowNonSepa = (bool) $allowNonSepa;
return $this;
}







public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::FALSEFORMAT);
return false;
}

$value = str_replace(' ', '', strtoupper($value));
$this->setValue($value);

$countryCode = $this->getCountryCode();
if ($countryCode === null) {
$countryCode = substr($value, 0, 2);
}

if (! array_key_exists($countryCode, static::$ibanRegex)) {
$this->setValue($countryCode);
$this->error(self::NOTSUPPORTED);
return false;
}

if (! $this->allowNonSepa && ! in_array($countryCode, static::$sepaCountries)) {
$this->setValue($countryCode);
$this->error(self::SEPANOTSUPPORTED);
return false;
}

if (! preg_match('/^' . static::$ibanRegex[$countryCode] . '$/', $value)) {
$this->error(self::FALSEFORMAT);
return false;
}

$format = substr($value, 4) . substr($value, 0, 4);
$format = str_replace(
[
'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',
],
[
'10',
'11',
'12',
'13',
'14',
'15',
'16',
'17',
'18',
'19',
'20',
'21',
'22',
'23',
'24',
'25',
'26',
'27',
'28',
'29',
'30',
'31',
'32',
'33',
'34',
'35',
],
$format
);

$temp = intval(substr($format, 0, 1));
$len = strlen($format);
for ($x = 1; $x < $len; ++$x) {
$temp *= 10;
$temp += intval(substr($format, $x, 1));
$temp %= 97;
}

if ($temp !== 1) {
$this->error(self::CHECKFAILED);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use function in_array;
use function is_string;
use function preg_match;
use function strtoupper;


class BusinessIdentifierCode extends AbstractValidator
{
public const INVALID = 'valueNotBic';
public const NOT_STRING = 'valueNotString';
public const NOT_VALID_COUNTRY = 'valueNotCountry';


protected $messageTemplates = [
self::NOT_STRING => 'Invalid type given; string expected',
self::INVALID => 'Invalid BIC format',
self::NOT_VALID_COUNTRY => 'Invalid country code',
];




private const REGEX_BIC = '/^[a-z]{4}(?<country>[a-z]{2})[a-z2-9][a-np-z0-9]([0-9a-z]{3})?$/i';








private const ISO_COUNTRIES = [
'AD',
'AE',
'AF',
'AG',
'AI',
'AL',
'AM',
'AO',
'AQ',
'AR',
'AS',
'AT',
'AU',
'AW',
'AX',
'AZ',
'BA',
'BB',
'BD',
'BE',
'BF',
'BG',
'BH',
'BI',
'BJ',
'BL',
'BM',
'BN',
'BO',
'BQ',
'BQ',
'BR',
'BS',
'BT',
'BV',
'BW',
'BY',
'BZ',
'CA',
'CC',
'CD',
'CF',
'CG',
'CH',
'CI',
'CK',
'CL',
'CM',
'CN',
'CO',
'CR',
'CU',
'CV',
'CW',
'CX',
'CY',
'CZ',
'DE',
'DJ',
'DK',
'DM',
'DO',
'DZ',
'EC',
'EE',
'EG',
'EH',
'ER',
'ES',
'ET',
'FI',
'FJ',
'FK',
'FM',
'FO',
'FR',
'GA',
'GB',
'GD',
'GE',
'GF',
'GG',
'GH',
'GI',
'GL',
'GM',
'GN',
'GP',
'GQ',
'GR',
'GS',
'GT',
'GU',
'GW',
'GY',
'HK',
'HM',
'HN',
'HR',
'HT',
'HU',
'ID',
'IE',
'IL',
'IM',
'IN',
'IO',
'IQ',
'IR',
'IS',
'IT',
'JE',
'JM',
'JO',
'JP',
'KE',
'KG',
'KH',
'KI',
'KM',
'KN',
'KP',
'KR',
'KW',
'KY',
'KZ',
'LA',
'LB',
'LC',
'LI',
'LK',
'LR',
'LS',
'LT',
'LU',
'LV',
'LY',
'MA',
'MC',
'MD',
'ME',
'MF',
'MG',
'MH',
'MK',
'ML',
'MM',
'MN',
'MO',
'MP',
'MQ',
'MR',
'MS',
'MT',
'MU',
'MV',
'MW',
'MX',
'MY',
'MZ',
'NA',
'NC',
'NE',
'NF',
'NG',
'NI',
'NL',
'NO',
'NP',
'NR',
'NU',
'NZ',
'OM',
'PA',
'PE',
'PF',
'PG',
'PH',
'PK',
'PL',
'PM',
'PN',
'PR',
'PS',
'PT',
'PW',
'PY',
'QA',
'RE',
'RO',
'RS',
'RU',
'RW',
'SA',
'SB',
'SC',
'SD',
'SE',
'SG',
'SH',
'SI',
'SJ',
'SK',
'SL',
'SM',
'SN',
'SO',
'SR',
'SS',
'ST',
'SV',
'SX',
'SY',
'SZ',
'TC',
'TD',
'TF',
'TG',
'TH',
'TJ',
'TK',
'TL',
'TM',
'TN',
'TO',
'TR',
'TT',
'TV',
'TW',
'TZ',
'UA',
'UG',
'UM',
'US',
'UY',
'UZ',
'VA',
'VC',
'VE',
'VG',
'VI',
'VN',
'VU',
'WF',
'WS',
'YE',
'YT',
'ZA',
'ZM',
'ZW',
];








private const KOSOVO_EXCEPTION = 'XK';


public function isValid($value): bool
{
if (! is_string($value)) {
$this->error(self::NOT_STRING);
return false;
}

if (
empty($value)
|| ! preg_match(self::REGEX_BIC, $value, $matches)
) {
$this->error(self::INVALID);
return false;
}

if (! $this->isSwiftValidCountry($matches['country'])) {
$this->error(self::NOT_VALID_COUNTRY);
return false;
}

return true;
}

private function isSwiftValidCountry(string $countryCode): bool
{
$countryCode = strtoupper($countryCode);
return in_array($countryCode, self::ISO_COUNTRIES, true)
|| $countryCode === self::KOSOVO_EXCEPTION;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\ArrayUtils;
use Traversable;

use function array_key_exists;
use function array_shift;
use function func_get_args;
use function is_array;






class LessThan extends AbstractValidator
{
public const NOT_LESS = 'notLessThan';
public const NOT_LESS_INCLUSIVE = 'notLessThanInclusive';






protected $messageTemplates = [
self::NOT_LESS => "The input is not less than '%max%'",
self::NOT_LESS_INCLUSIVE => "The input is not less or equal than '%max%'",
];






protected $messageVariables = [
'max' => 'max',
];






protected $max;









protected $inclusive;







public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = ArrayUtils::iteratorToArray($options);
}
if (! is_array($options)) {
$options = func_get_args();
$temp['max'] = array_shift($options);

if (! empty($options)) {
$temp['inclusive'] = array_shift($options);
}

$options = $temp;
}

if (! array_key_exists('max', $options)) {
throw new Exception\InvalidArgumentException("Missing option 'max'");
}

if (! array_key_exists('inclusive', $options)) {
$options['inclusive'] = false;
}

$this->setMax($options['max'])
->setInclusive($options['inclusive']);

parent::__construct($options);
}






public function getMax()
{
return $this->max;
}






public function setMax(mixed $max)
{
$this->max = $max;
return $this;
}






public function getInclusive()
{
return $this->inclusive;
}







public function setInclusive($inclusive)
{
$this->inclusive = $inclusive;
return $this;
}








public function isValid($value)
{
$this->setValue($value);

if ($this->inclusive) {
if ($value > $this->max) {
$this->error(self::NOT_LESS_INCLUSIVE);
return false;
}
} else {
if ($value >= $this->max) {
$this->error(self::NOT_LESS);
return false;
}
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Filter\Digits as DigitsFilter;

use function is_float;
use function is_int;
use function is_string;


class Digits extends AbstractValidator
{
public const NOT_DIGITS = 'notDigits';
public const STRING_EMPTY = 'digitsStringEmpty';
public const INVALID = 'digitsInvalid';






protected static $filter;






protected $messageTemplates = [
self::NOT_DIGITS => 'The input must contain only digits',
self::STRING_EMPTY => 'The input is an empty string',
self::INVALID => 'Invalid type given. String, integer or float expected',
];







public function isValid($value)
{
if (! is_string($value) && ! is_int($value) && ! is_float($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue((string) $value);

if ('' === $this->getValue()) {
$this->error(self::STRING_EMPTY);
return false;
}

if (null === static::$filter) {
static::$filter = new DigitsFilter();
}

if ($this->getValue() !== static::$filter->filter($this->getValue())) {
$this->error(self::NOT_DIGITS);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use Laminas\Stdlib\StringUtils;
use Laminas\Stdlib\StringWrapper\StringWrapperInterface as StringWrapper;
use Laminas\Stdlib\StringWrapper\StringWrapperInterface;
use Traversable;

use function array_shift;
use function func_get_args;
use function is_array;
use function is_string;
use function max;


class StringLength extends AbstractValidator
{
public const INVALID = 'stringLengthInvalid';
public const TOO_SHORT = 'stringLengthTooShort';
public const TOO_LONG = 'stringLengthTooLong';


protected $messageTemplates = [
self::INVALID => 'Invalid type given. String expected',
self::TOO_SHORT => 'The input is less than %min% characters long',
self::TOO_LONG => 'The input is more than %max% characters long',
];


protected $messageVariables = [
'min' => ['options' => 'min'],
'max' => ['options' => 'max'],
'length' => ['options' => 'length'],
];


protected $options = [
'min' => 0, 
'max' => null, 
'encoding' => 'UTF-8', 
'length' => 0, 
];


protected $stringWrapper;






public function __construct($options = [])
{
if (! is_array($options)) {
$options = func_get_args();
$temp['min'] = array_shift($options);
if (! empty($options)) {
$temp['max'] = array_shift($options);
}

if (! empty($options)) {
$temp['encoding'] = array_shift($options);
}

$options = $temp;
}

parent::__construct($options);
}








public function getMin()
{
return $this->options['min'];
}










public function setMin($min)
{
if (null !== $this->getMax() && $min > $this->getMax()) {
throw new Exception\InvalidArgumentException(
"The minimum must be less than or equal to the maximum length, but {$min} > {$this->getMax()}"
);
}

$this->options['min'] = max(0, (int) $min);
return $this;
}








public function getMax()
{
return $this->options['max'];
}










public function setMax($max)
{
if (null === $max) {
$this->options['max'] = null;
} elseif ($max < $this->getMin()) {
throw new Exception\InvalidArgumentException(
"The maximum must be greater than or equal to the minimum length, but {$max} < {$this->getMin()}"
);
} else {
$this->options['max'] = (int) $max;
}

return $this;
}








public function getStringWrapper()
{
if (! $this->stringWrapper) {
$this->stringWrapper = StringUtils::getWrapper($this->getEncoding());
}
return $this->stringWrapper;
}








public function setStringWrapper(StringWrapper $stringWrapper)
{
$stringWrapper->setEncoding($this->getEncoding());
$this->stringWrapper = $stringWrapper;
}








public function getEncoding()
{
return $this->options['encoding'];
}










public function setEncoding($encoding)
{
$this->stringWrapper = StringUtils::getWrapper($encoding);
$this->options['encoding'] = $encoding;
return $this;
}








private function getLength()
{
return $this->options['length'];
}









private function setLength($length)
{
$this->options['length'] = (int) $length;
return $this;
}








public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

$this->setLength($this->getStringWrapper()->strlen($value));
if ($this->getLength() < $this->getMin()) {
$this->error(self::TOO_SHORT);
}

if (null !== $this->getMax() && $this->getMax() < $this->getLength()) {
$this->error(self::TOO_LONG);
}

if ($this->getMessages()) {
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use DateTimeZone;

use function array_key_exists;
use function array_search;
use function gettype;
use function in_array;
use function is_array;
use function is_int;
use function is_string;
use function sprintf;


class Timezone extends AbstractValidator
{
public const INVALID = 'invalidTimezone';
public const INVALID_TIMEZONE_LOCATION = 'invalidTimezoneLocation';
public const INVALID_TIMEZONE_ABBREVIATION = 'invalidTimezoneAbbreviation';

public const LOCATION = 0b01;
public const ABBREVIATION = 0b10;
public const ALL = 0b11;


protected $constants = [
self::LOCATION => 'location',
self::ABBREVIATION => 'abbreviation',
];






protected $defaultType = [
self::LOCATION,
self::ABBREVIATION,
];


protected $messageTemplates = [
self::INVALID => 'Invalid timezone given.',
self::INVALID_TIMEZONE_LOCATION => 'Invalid timezone location given.',
self::INVALID_TIMEZONE_ABBREVIATION => 'Invalid timezone abbreviation given.',
];






protected $options = [];






public function __construct($options = [])
{
$opts['type'] = $this->defaultType;

if (is_array($options)) {
if (array_key_exists('type', $options)) {
$opts['type'] = $options['type'];
}
} elseif (! empty($options)) {
$opts['type'] = $options;
}


parent::__construct($opts);
}










public function setType($type = null)
{
$type = $this->calculateTypeValue($type);

if (! is_int($type) || ($type < 1) || ($type > self::ALL)) {
throw new Exception\InvalidArgumentException(sprintf(
'Unknown type "%s" provided',
is_string($type) || is_int($type)
? $type : gettype($type)
));
}

$this->options['type'] = $type;
}







public function isValid($value)
{
if ($value !== null && ! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$type = $this->options['type'];
$this->setValue($value);

switch (true) {

case ($type & self::LOCATION) && ($type & self::ABBREVIATION):
$abbrs = DateTimeZone::listAbbreviations();
$locations = DateTimeZone::listIdentifiers();

if (! array_key_exists($value, $abbrs) && ! in_array($value, $locations)) {
$this->error(self::INVALID);
return false;
}
break;


case $type & self::LOCATION:
$locations = DateTimeZone::listIdentifiers();

if (! in_array($value, $locations)) {
$this->error(self::INVALID_TIMEZONE_LOCATION);
return false;
}
break;


case $type & self::ABBREVIATION:
$abbrs = DateTimeZone::listAbbreviations();

if (! array_key_exists($value, $abbrs)) {
$this->error(self::INVALID_TIMEZONE_ABBREVIATION);
return false;
}
break;
}

return true;
}







protected function calculateTypeValue($type)
{
$types = (array) $type;
$detected = 0;

foreach ($types as $value) {
if (is_int($value)) {
$detected |= $value;
} elseif (false !== array_search($value, $this->constants)) {
$detected |= array_search($value, $this->constants);
}
}

return $detected;
}
}
<?php

namespace Laminas\Validator\Sitemap;

use Laminas\Validator\AbstractValidator;

use function is_numeric;








class Priority extends AbstractValidator
{



public const NOT_VALID = 'sitemapPriorityNotValid';
public const INVALID = 'sitemapPriorityInvalid';






protected $messageTemplates = [
self::NOT_VALID => 'The input is not a valid sitemap priority',
self::INVALID => 'Invalid type given. Numeric string, integer or float expected',
];









public function isValid($value)
{
if (! is_numeric($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);
$value = (float) $value;
if ($value < 0 || $value > 1) {
$this->error(self::NOT_VALID);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\Sitemap;

use Laminas\Validator\AbstractValidator;

use function in_array;
use function is_string;








class Changefreq extends AbstractValidator
{



public const NOT_VALID = 'sitemapChangefreqNotValid';
public const INVALID = 'sitemapChangefreqInvalid';






protected $messageTemplates = [
self::NOT_VALID => 'The input is not a valid sitemap changefreq',
self::INVALID => 'Invalid type given. String expected',
];






protected $changeFreqs = [
'always',
'hourly',
'daily',
'weekly',
'monthly',
'yearly',
'never',
];









public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);

if (! in_array($value, $this->changeFreqs, true)) {
$this->error(self::NOT_VALID);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\Sitemap;

use Laminas\Stdlib\ErrorHandler;
use Laminas\Validator\AbstractValidator;

use function is_string;
use function preg_match;








class Lastmod extends AbstractValidator
{





public const LASTMOD_REGEX = '/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9])(:[0-5][0-9])?(\\+|-)([0-1][0-9]|2[0-3]):[0-5][0-9])?$/';






public const NOT_VALID = 'sitemapLastmodNotValid';
public const INVALID = 'sitemapLastmodInvalid';






protected $messageTemplates = [
self::NOT_VALID => 'The input is not a valid sitemap lastmod',
self::INVALID => 'Invalid type given. String expected',
];









public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);
ErrorHandler::start();
$result = preg_match(self::LASTMOD_REGEX, $value);
ErrorHandler::stop();
if ($result !== 1) {
$this->error(self::NOT_VALID);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator\Sitemap;

use Laminas\Uri;
use Laminas\Validator\AbstractValidator;

use function is_string;









class Loc extends AbstractValidator
{



public const NOT_VALID = 'sitemapLocNotValid';
public const INVALID = 'sitemapLocInvalid';






protected $messageTemplates = [
self::NOT_VALID => 'The input is not a valid sitemap location',
self::INVALID => 'Invalid type given. String expected',
];









public function isValid($value)
{
if (! is_string($value)) {
$this->error(self::INVALID);
return false;
}

$this->setValue($value);
$uri = Uri\UriFactory::factory($value);
if (! $uri->isValid()) {
$this->error(self::NOT_VALID);
return false;
}

return true;
}
}
<?php

namespace Laminas\Validator;

use function explode;
use function is_numeric;
use function preg_match;
use function preg_match_all;
use function preg_replace;
use function str_contains;
use function str_replace;

final class GpsPoint extends AbstractValidator
{
public const OUT_OF_BOUNDS = 'gpsPointOutOfBounds';
public const CONVERT_ERROR = 'gpsPointConvertError';
public const INCOMPLETE_COORDINATE = 'gpsPointIncompleteCoordinate';

protected array $messageTemplates = [
self::OUT_OF_BOUNDS => '%value% is out of Bounds.',
self::CONVERT_ERROR => '%value% can not converted into a Decimal Degree Value.',
self::INCOMPLETE_COORDINATE => '%value% did not provided a complete Coordinate',
];










public function isValid(mixed $value): bool
{
if (! str_contains($value, ',')) {
$this->error(self::INCOMPLETE_COORDINATE, $value);
return false;
}

[$lat, $long] = explode(',', $value);

return $this->isValidCoordinate($lat, 90.0000) && $this->isValidCoordinate($long, 180.000);
}

private function isValidCoordinate(string $value, float $maxBoundary): bool
{
$this->value = $value;

$value = $this->removeWhiteSpace($value);
if ($this->isDMSValue($value)) {
$value = $this->convertValue($value);
} else {
$value = $this->removeDegreeSign($value);
}

if ($value === false) {
$this->error(self::CONVERT_ERROR);
return false;
}

$castedValue = (float) $value;
if (! is_numeric($value) && $castedValue === 0.0) {
$this->error(self::CONVERT_ERROR);
return false;
}

if (! $this->isValueInbound($castedValue, $maxBoundary)) {
$this->error(self::OUT_OF_BOUNDS);
return false;
}

return true;
}




private function isDMSValue(string $value): bool
{
return preg_match('/([°\'"]+[NESW])/', $value) > 0;
}

private function convertValue(string $value): false|float
{
$matches = [];
$result = preg_match_all('/(\d{1,3})°(\d{1,2})\'(\d{1,2}[\.\d]{0,6})"[NESW]/i', $value, $matches);

if ($result === false || $result === 0) {
return false;
}

return $matches[1][0] + $matches[2][0] / 60 + ((float) $matches[3][0]) / 3600;
}

private function removeWhiteSpace(string $value): string
{
return preg_replace('/\s/', '', $value);
}

private function removeDegreeSign(string $value): string
{
return str_replace('°', '', $value);
}

private function isValueInbound(float $value, float $boundary): bool
{
$max = $boundary;
$min = -1 * $boundary;
return $min <= $value && $value <= $max;
}
}
<?php

namespace Laminas\Validator;

use Traversable;

use function array_key_exists;
use function array_shift;
use function func_get_args;
use function is_array;
use function iterator_to_array;


class IsInstanceOf extends AbstractValidator
{
public const NOT_INSTANCE_OF = 'notInstanceOf';






protected $messageTemplates = [
self::NOT_INSTANCE_OF => "The input is not an instance of '%className%'",
];






protected $messageVariables = [
'className' => 'className',
];


protected $className;







public function __construct($options = null)
{
if ($options instanceof Traversable) {
$options = iterator_to_array($options);
}


if (! is_array($options)) {
$options = func_get_args();

$tmpOptions = [];
$tmpOptions['className'] = array_shift($options);

$options = $tmpOptions;
}

if (! array_key_exists('className', $options)) {
throw new Exception\InvalidArgumentException('Missing option "className"');
}

parent::__construct($options);
}








public function getClassName()
{
return $this->className;
}









public function setClassName($className)
{
$this->className = $className;
return $this;
}







public function isValid($value)
{
if ($value instanceof $this->className) {
return true;
}
$this->error(self::NOT_INSTANCE_OF);
return false;
}
}
<?php

namespace Laminas\Validator;

use RecursiveArrayIterator;
use RecursiveIteratorIterator;

use function in_array;
use function is_bool;
use function is_float;
use function is_int;
use function is_string;


class InArray extends AbstractValidator
{
public const NOT_IN_ARRAY = 'notInArray';





public const COMPARE_STRICT = 1;






public const COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY = 0;





public const COMPARE_NOT_STRICT = -1;


protected $messageTemplates = [
self::NOT_IN_ARRAY => 'The input was not found in the haystack',
];






protected $haystack;









protected $strict = self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY;






protected $recursive = false;









public function getHaystack()
{
if ($this->haystack === null) {
throw new Exception\RuntimeException('haystack option is mandatory');
}
return $this->haystack;
}









public function setHaystack(array $haystack)
{
$this->haystack = $haystack;
return $this;
}








public function getStrict()
{

if (
$this->strict === self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY
|| $this->strict === self::COMPARE_STRICT
) {
return (bool) $this->strict;
}
return $this->strict;
}













public function setStrict($strict)
{
if (is_bool($strict)) {
$strict = $strict ? self::COMPARE_STRICT : self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY;
}

$checkTypes = [
self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY, 
self::COMPARE_STRICT, 
self::COMPARE_NOT_STRICT, 
];


if (! in_array($strict, $checkTypes)) {
throw new Exception\InvalidArgumentException('Strict option must be one of the COMPARE_ constants');
}

$this->strict = $strict;
return $this;
}








public function getRecursive()
{
return $this->recursive;
}









public function setRecursive($recursive)
{
$this->recursive = (bool) $recursive;
return $this;
}









public function isValid($value)
{

$haystack = $this->getHaystack();



if (
self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict
&& (is_int($value) || is_float($value))
) {
$value = (string) $value;
}

$this->setValue($value);

if ($this->getRecursive()) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack));
foreach ($iterator as $element) {
if (self::COMPARE_STRICT === $this->strict) {
if ($element === $value) {
return true;
}

continue;
}


$el = $element;
if (
self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict
&& is_string($value) && (is_int($el) || is_float($el))
) {
$el = (string) $el;
}


if ($el == $value) {
return true;
}
}

$this->error(self::NOT_IN_ARRAY);
return false;
}









if (
self::COMPARE_NOT_STRICT_AND_PREVENT_STR_TO_INT_VULNERABILITY === $this->strict
&& is_string($value)
) {
foreach ($haystack as &$h) {
if (is_int($h) || is_float($h)) {
$h = (string) $h;
}
}

if (in_array($value, $haystack, (bool) $this->strict)) {
return true;
}

$this->error(self::NOT_IN_ARRAY);
return false;
}

if (in_array($value, $haystack, self::COMPARE_STRICT === $this->strict)) {
return true;
}

if (self::COMPARE_NOT_STRICT === $this->strict) {
return true;
}

$this->error(self::NOT_IN_ARRAY);
return false;
}
}
<?php

declare(strict_types=1);

use Laminas\Validator\Hostname;

require __DIR__ . '/../vendor/autoload.php';

const IANA_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt';
const LAMINAS_HOSTNAME_VALIDATOR_FILE = __DIR__ . '/../src/Hostname.php';

if (! file_exists(LAMINAS_HOSTNAME_VALIDATOR_FILE) || ! is_readable(LAMINAS_HOSTNAME_VALIDATOR_FILE)) {
printf("Error: cannot read file '%s'%s", LAMINAS_HOSTNAME_VALIDATOR_FILE, PHP_EOL);
exit(1);
}

if (! is_writable(LAMINAS_HOSTNAME_VALIDATOR_FILE)) {
printf("Error: cannot update file '%s'%s", LAMINAS_HOSTNAME_VALIDATOR_FILE, PHP_EOL);
exit(1);
}

/**
@psalm-var */
$newFileContent = []; 
$insertDone = false; 
$insertFinish = false; 
$checkOnly = isset($argv[1]) ? $argv[1] === '--check-only' : false;
$response = getOfficialTLDs();

$currentFileContent = file(LAMINAS_HOSTNAME_VALIDATOR_FILE);

foreach ($currentFileContent as $line) {
if ($insertDone === $insertFinish) {

$newFileContent[] = $line;
}

if ($insertFinish) {
continue;
}

if ($insertDone) {

if (preg_match('/^\s+\];\s*$/', $line)) {
$newFileContent[] = $line;
$insertFinish = true;
}

continue;
}


if (preg_match('/^\s+protected\s+\$validTlds\s+=\s+\[\s*$/', $line)) {
$newFileContent = array_merge($newFileContent, getNewValidTlds($response));
$insertDone = true;
}
}

if (! $insertDone) {
printf('Error: cannot find line with "protected $validTlds"%s', PHP_EOL);
exit(1);
}

if (! $insertFinish) {
printf('Error: cannot find end of $validTlds declaration%s', PHP_EOL);
exit(1);
}

if ($currentFileContent === $newFileContent) {
printf('Nothing to do. Validator has no TLD changes.%s', PHP_EOL);
exit(0);
}

if ($checkOnly) {
printf(
'TLDs must be updated, please run `php bin/update_hostname_validator.php` and push your changes%s',
PHP_EOL
);
exit(1);
}

if (false === @file_put_contents(LAMINAS_HOSTNAME_VALIDATOR_FILE, $newFileContent)) {
printf('Error: cannot write info file "%s"%s', LAMINAS_HOSTNAME_VALIDATOR_FILE, PHP_EOL);
exit(1);
}

printf('Validator TLD file updated.%s', PHP_EOL);
exit(0);




function getOfficialTLDs(): string
{
try {
return file_get_contents(IANA_URL);
} catch (Throwable $e) {
printf(
'Downloading the IANA TLD list failed: %s',
$e->getMessage(),
);

exit(1);
}
}






function getNewValidTlds(string $string): array
{
$decodePunycode = getPunycodeDecoder();


$newValidTlds = [];
foreach (preg_grep('/^[^#]/', preg_split("#\r?\n#", $string)) as $line) {
$newValidTlds [] = sprintf(
"%s'%s',\n",
str_repeat(' ', 8),
$decodePunycode(strtolower($line))
);
}

return $newValidTlds;
}













function getPunycodeDecoder()
{
if (function_exists('idn_to_utf8')) {
return function ($domain) {
return idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46);
};
}

$hostnameValidator = new Hostname();
$reflection = new ReflectionClass($hostnameValidator::class);
$decodePunyCode = $reflection->getMethod('decodePunycode');

return function ($encode) use ($hostnameValidator, $decodePunyCode) {
if (strpos($encode, 'xn--') === 0) {
return $decodePunyCode->invokeArgs($hostnameValidator, [substr($encode, 4)]);
}
return $encode;
};
}
<?php

if (\PHP_VERSION_ID < 80000) {
interface Stringable
{



public function __toString();
}
}
<?php

declare(strict_types=1);

namespace MabeEnum;

use ArrayAccess;
use Countable;
use InvalidArgumentException;
use Iterator;
use IteratorAggregate;
use UnexpectedValueException;

/**
@template
@implements
@implements






*/
class EnumMap implements ArrayAccess, Countable, IteratorAggregate
{




private $enumeration;





private $map = [];







public function __construct(string $enumeration, ?iterable $map = null)
{
if (!\is_subclass_of($enumeration, Enum::class)) {
throw new InvalidArgumentException(\sprintf(
'%s can handle subclasses of %s only',
__CLASS__,
Enum::class
));
}
$this->enumeration = $enumeration;

if ($map) {
$this->addIterable($map);
}
}









public function __debugInfo(): array {
$dbg = (array)$this;
$dbg["\0" . self::class . "\0__pairs"] = array_map(function ($k, $v) {
return [$k, $v];
}, $this->getKeys(), $this->getValues());
return $dbg;
}










public function add($enumerator, $value): void
{
$ord = ($this->enumeration)::get($enumerator)->getOrdinal();
$this->map[$ord] = $value;
}






public function addIterable(iterable $map): void
{
$innerMap = $this->map;
foreach ($map as $enumerator => $value) {
$ord = ($this->enumeration)::get($enumerator)->getOrdinal();
$innerMap[$ord] = $value;
}
$this->map = $innerMap;
}







public function remove($enumerator): void
{
$ord = ($this->enumeration)::get($enumerator)->getOrdinal();
unset($this->map[$ord]);
}






public function removeIterable(iterable $enumerators): void
{
$map = $this->map;
foreach ($enumerators as $enumerator) {
$ord = ($this->enumeration)::get($enumerator)->getOrdinal();
unset($map[$ord]);
}

$this->map = $map;
}










public function with($enumerator, $value): self
{
$clone = clone $this;
$clone->add($enumerator, $value);
return $clone;
}







public function withIterable(iterable $map): self
{
$clone = clone $this;
$clone->addIterable($map);
return $clone;
}







public function without($enumerator): self
{
$clone = clone $this;
$clone->remove($enumerator);
return $clone;
}







public function withoutIterable(iterable $enumerators): self
{
$clone = clone $this;
$clone->removeIterable($enumerators);
return $clone;
}







public function getEnumeration(): string
{
return $this->enumeration;
}









public function get($enumerator)
{
$enumerator = ($this->enumeration)::get($enumerator);
$ord = $enumerator->getOrdinal();
if (!\array_key_exists($ord, $this->map)) {
throw new UnexpectedValueException(sprintf(
'Enumerator %s could not be found',
\var_export($enumerator->getValue(), true)
));
}

return $this->map[$ord];
}

/**
@phpstan-return
@psalm-return



*/
public function getKeys(): array
{

$byOrdinalFn = [$this->enumeration, 'byOrdinal'];

return \array_map($byOrdinalFn, \array_keys($this->map));
}

/**
@phpstan-return
@psalm-return



*/
public function getValues(): array
{
return \array_values($this->map);
}







public function search($value, bool $strict = false)
{

$ord = \array_search($value, $this->map, $strict);
if ($ord !== false) {
return ($this->enumeration)::byOrdinal($ord);
}

return null;
}







public function has($enumerator): bool
{
try {
$ord = ($this->enumeration)::get($enumerator)->getOrdinal();
return \array_key_exists($ord, $this->map);
} catch (InvalidArgumentException $e) {

return false;
}
}









public function contains($enumerator): bool
{
return $this->has($enumerator);
}









public function offsetExists($enumerator): bool
{
try {
return isset($this->map[($this->enumeration)::get($enumerator)->getOrdinal()]);
} catch (InvalidArgumentException $e) {

return false;
}
}








#[\ReturnTypeWillChange]
public function offsetGet($enumerator)
{
try {
return $this->get($enumerator);
} catch (UnexpectedValueException $e) {
return null;
}
}









public function offsetSet($enumerator, $value = null): void
{
$this->add($enumerator, $value);
}








public function offsetUnset($enumerator): void
{
$this->remove($enumerator);
}








public function getIterator(): Iterator
{
$map = $this->map;
foreach ($map as $ordinal => $value) {
yield ($this->enumeration)::byOrdinal($ordinal) => $value;
}
}








public function count(): int
{
return \count($this->map);
}






public function isEmpty(): bool
{
return empty($this->map);
}
}
<?php

declare(strict_types=1);

namespace MabeEnum;

use ReflectionClass;
use InvalidArgumentException;
use LogicException;

/**
@psalm-immutable






*/
abstract class Enum implements \Stringable
{





private $value;






private $ordinal;






private static $constants = [];






private static $names = [];






private static $instances = [];







final private function __construct($value, $ordinal = null)
{
$this->value = $value;
$this->ordinal = $ordinal;
}







public function __toString(): string
{
return $this->getName();
}





final public function __clone()
{
throw new LogicException('Enums are not cloneable');
}

/**
@psalm-return


*/
final public function __sleep()
{
throw new LogicException('Serialization is not supported by default in this pseudo-enum implementation');
}






public function __serialize(): array
{
throw new LogicException('Serialization is not supported by default in this pseudo-enum implementation');
}

/**
@psalm-return


*/
final public function __wakeup()
{
throw new LogicException('Serialization is not supported by default in this pseudo-enum implementation');
}






public function __unserialize(array $data): void
{
throw new LogicException('Serialization is not supported by default in this pseudo-enum implementation');
}






final public function getValue()
{
return $this->value;
}

/**
@phpstan-return
@psalm-return




*/
final public function getName()
{
return self::$names[static::class][$this->ordinal ?? $this->getOrdinal()];
}






final public function getOrdinal()
{
if ($this->ordinal === null) {
$ordinal = 0;
$value = $this->value;
$constants = self::$constants[static::class] ?? static::getConstants();
foreach ($constants as $constValue) {
if ($value === $constValue) {
break;
}
++$ordinal;
}

$this->ordinal = $ordinal;
}

return $this->ordinal;
}







final public function is($enumerator)
{
return $this === $enumerator || $this->value === $enumerator


|| ($enumerator instanceof static
&& \get_class($enumerator) === static::class
&& $enumerator->value === $this->value
);
}

/**
@psalm-pure







*/
final public static function get($enumerator)
{
if ($enumerator instanceof static) {
if (\get_class($enumerator) !== static::class) {
throw new InvalidArgumentException(sprintf(
'Invalid value of type %s for enumeration %s',
\get_class($enumerator),
static::class
));
}

return $enumerator;
}

return static::byValue($enumerator);
}

/**
@psalm-pure







*/
final public static function byValue($value)
{


$constants = self::$constants[static::class] ?? static::getConstants();

$name = \array_search($value, $constants, true);
if ($name === false) {
throw new InvalidArgumentException(sprintf(
'Unknown value %s for enumeration %s',
\is_scalar($value)
? \var_export($value, true)
: 'of type ' . (\is_object($value) ? \get_class($value) : \gettype($value)),
static::class
));
}


$instance = self::$instances[static::class][$name]
?? self::$instances[static::class][$name] = new static($constants[$name]);

return $instance;
}

/**
@psalm-pure







*/
final public static function byName(string $name)
{
if (isset(self::$instances[static::class][$name])) {

$instance = self::$instances[static::class][$name];
return $instance;
}

$const = static::class . "::{$name}";
if (!\defined($const)) {
throw new InvalidArgumentException("{$const} not defined");
}

assert(
self::noAmbiguousValues(static::getConstants()),
'Ambiguous enumerator values detected for ' . static::class
);


$value = \constant($const);
return self::$instances[static::class][$name] = new static($value);
}

/**
@psalm-pure







*/
final public static function byOrdinal(int $ordinal)
{
$constants = self::$constants[static::class] ?? static::getConstants();

if (!isset(self::$names[static::class][$ordinal])) {
throw new InvalidArgumentException(\sprintf(
'Invalid ordinal number %s, must between 0 and %s',
$ordinal,
\count(self::$names[static::class]) - 1
));
}

$name = self::$names[static::class][$ordinal];


$instance = self::$instances[static::class][$name]
?? self::$instances[static::class][$name] = new static($constants[$name], $ordinal);

return $instance;
}

/**
@phpstan-return
@psalm-return
@psalm-pure




*/
final public static function getEnumerators()
{
if (!isset(self::$names[static::class])) {
static::getConstants();
}


$byNameFn = [static::class, 'byName'];
return \array_map($byNameFn, self::$names[static::class]);
}

/**
@phpstan-return
@psalm-return
@psalm-pure




*/
final public static function getValues()
{
return \array_values(self::$constants[static::class] ?? static::getConstants());
}

/**
@phpstan-return
@psalm-return
@psalm-pure




*/
final public static function getNames()
{
if (!isset(self::$names[static::class])) {
static::getConstants();
}
return self::$names[static::class];
}

/**
@phpstan-return
@psalm-return
@psalm-pure




*/
final public static function getOrdinals()
{
$count = \count(self::$constants[static::class] ?? static::getConstants());
return $count ? \range(0, $count - 1) : [];
}

/**
@phpstan-return
@psalm-return
@psalm-pure





*/
final public static function getConstants()
{
if (isset(self::$constants[static::class])) {
return self::$constants[static::class];
}

$reflection = new ReflectionClass(static::class);
$constants = [];

do {
$scopeConstants = [];

foreach ($reflection->getReflectionConstants() as $reflConstant) {
if ($reflConstant->isPublic()) {
$scopeConstants[ $reflConstant->getName() ] = $reflConstant->getValue();
}
}

$constants = $scopeConstants + $constants;
} while (($reflection = $reflection->getParentClass()) && $reflection->name !== __CLASS__);



assert(
self::noAmbiguousValues($constants),
'Ambiguous enumerator values detected for ' . static::class
);

self::$names[static::class] = \array_keys($constants);
return self::$constants[static::class] = $constants;
}






private static function noAmbiguousValues($constants)
{
foreach ($constants as $value) {
$names = \array_keys($constants, $value, true);
if (\count($names) > 1) {
return false;
}
}

return true;
}

/**
@psalm-pure





*/
final public static function has($enumerator)
{
if ($enumerator instanceof static) {
return \get_class($enumerator) === static::class;
}

return static::hasValue($enumerator);
}

/**
@psalm-pure





*/
final public static function hasValue($value)
{
return \in_array($value, self::$constants[static::class] ?? static::getConstants(), true);
}

/**
@psalm-pure





*/
final public static function hasName(string $name)
{
return \defined("static::{$name}");
}

/**
@psalm-pure











*/
final public static function __callStatic(string $method, array $args)
{
return static::byName($method);
}
}
<?php

declare(strict_types=1);

namespace MabeEnum;

use Countable;
use InvalidArgumentException;
use Iterator;
use IteratorAggregate;

/**
@template
@implements







*/
class EnumSet implements IteratorAggregate, Countable
{




private $enumeration;





private $enumerationCount;





private $bitset = 0;






private $emptyBitset = 0;









private $fnDoGetIterator = 'doGetIteratorInt';


private $fnDoCount = 'doCountInt';


private $fnDoGetOrdinals = 'doGetOrdinalsInt';


private $fnDoGetBit = 'doGetBitInt';


private $fnDoSetBit = 'doSetBitInt';


private $fnDoUnsetBit = 'doUnsetBitInt';


private $fnDoGetBinaryBitsetLe = 'doGetBinaryBitsetLeInt';


private $fnDoSetBinaryBitsetLe = 'doSetBinaryBitsetLeInt';









public function __construct(string $enumeration, ?iterable $enumerators = null)
{
if (!\is_subclass_of($enumeration, Enum::class)) {
throw new InvalidArgumentException(\sprintf(
'%s can handle subclasses of %s only',
__METHOD__,
Enum::class
));
}

$this->enumeration = $enumeration;
$this->enumerationCount = \count($enumeration::getConstants());




if ($this->enumerationCount > \PHP_INT_SIZE * 8) {

$this->bitset = $this->emptyBitset = \str_repeat("\0", (int)\ceil($this->enumerationCount / 8));


$this->fnDoGetIterator = 'doGetIteratorBin';
$this->fnDoCount = 'doCountBin';
$this->fnDoGetOrdinals = 'doGetOrdinalsBin';
$this->fnDoGetBit = 'doGetBitBin';
$this->fnDoSetBit = 'doSetBitBin';
$this->fnDoUnsetBit = 'doUnsetBitBin';
$this->fnDoGetBinaryBitsetLe = 'doGetBinaryBitsetLeBin';
$this->fnDoSetBinaryBitsetLe = 'doSetBinaryBitsetLeBin';
}

if ($enumerators !== null) {
foreach ($enumerators as $enumerator) {
$this->{$this->fnDoSetBit}($enumeration::get($enumerator)->getOrdinal());
}
}
}










public function __debugInfo() {
$dbg = (array)$this;
$dbg["\0" . self::class . "\0__enumerators"] = $this->getValues();
return $dbg;
}





public function getEnumeration(): string
{
return $this->enumeration;
}









public function add($enumerator): void
{
$this->{$this->fnDoSetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}







public function addIterable(iterable $enumerators): void
{
$bitset = $this->bitset;

try {
foreach ($enumerators as $enumerator) {
$this->{$this->fnDoSetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}
} catch (\Throwable $e) {

$this->bitset = $bitset;
throw $e;
}
}







public function remove($enumerator): void
{
$this->{$this->fnDoUnsetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}










public function attach($enumerator): void
{
$this->add($enumerator);
}










public function detach($enumerator): void
{
$this->remove($enumerator);
}







public function removeIterable(iterable $enumerators): void
{
$bitset = $this->bitset;

try {
foreach ($enumerators as $enumerator) {
$this->{$this->fnDoUnsetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}
} catch (\Throwable $e) {

$this->bitset = $bitset;
throw $e;
}
}








public function setUnion(EnumSet $other): void
{
if ($this->enumeration !== $other->enumeration) {
throw new InvalidArgumentException(\sprintf(
'Other should be of the same enumeration as this %s',
$this->enumeration
));
}

$this->bitset = $this->bitset | $other->bitset;
}








public function setIntersect(EnumSet $other): void
{
if ($this->enumeration !== $other->enumeration) {
throw new InvalidArgumentException(\sprintf(
'Other should be of the same enumeration as this %s',
$this->enumeration
));
}

$this->bitset = $this->bitset & $other->bitset;
}








public function setDiff(EnumSet $other): void
{
if ($this->enumeration !== $other->enumeration) {
throw new InvalidArgumentException(\sprintf(
'Other should be of the same enumeration as this %s',
$this->enumeration
));
}

$this->bitset = $this->bitset & ~$other->bitset;
}








public function setSymDiff(EnumSet $other): void
{
if ($this->enumeration !== $other->enumeration) {
throw new InvalidArgumentException(\sprintf(
'Other should be of the same enumeration as this %s',
$this->enumeration
));
}

$this->bitset = $this->bitset ^ $other->bitset;
}










public function setBinaryBitsetLe(string $bitset): void
{
$this->{$this->fnDoSetBinaryBitsetLe}($bitset);
}










private function doSetBinaryBitsetLeBin($bitset): void
{

$thisBitset = $this->bitset;

$size = \strlen($thisBitset);
$sizeIn = \strlen($bitset);

if ($sizeIn < $size) {

$bitset .= \str_repeat("\0", $size - $sizeIn);
} elseif ($sizeIn > $size) {
if (\ltrim(\substr($bitset, $size), "\0") !== '') {
throw new InvalidArgumentException('out-of-range bits detected');
}
$bitset = \substr($bitset, 0, $size);
}


$lastByteMaxOrd = $this->enumerationCount % 8;
if ($lastByteMaxOrd !== 0) {
$lastByte = $bitset[-1];
$lastByteExpected = \chr((1 << $lastByteMaxOrd) - 1) & $lastByte;
if ($lastByte !== $lastByteExpected) {
throw new InvalidArgumentException('out-of-range bits detected');
}

$this->bitset = \substr($bitset, 0, -1) . $lastByteExpected;
}

$this->bitset = $bitset;
}










private function doSetBinaryBitsetLeInt($bitset): void
{
$len = \strlen($bitset);
$int = 0;
for ($i = 0; $i < $len; ++$i) {
$ord = \ord($bitset[$i]);

if ($ord && $i > \PHP_INT_SIZE - 1) {
throw new InvalidArgumentException('out-of-range bits detected');
}

$int |= $ord << (8 * $i);
}

if ($int & (~0 << $this->enumerationCount)) {
throw new InvalidArgumentException('out-of-range bits detected');
}

$this->bitset = $int;
}








public function setBinaryBitsetBe(string $bitset): void
{
$this->{$this->fnDoSetBinaryBitsetLe}(\strrev($bitset));
}













public function setBit(int $ordinal, bool $bit): void
{
if ($ordinal < 0 || $ordinal > $this->enumerationCount) {
throw new InvalidArgumentException("Ordinal number must be between 0 and {$this->enumerationCount}");
}

if ($bit) {
$this->{$this->fnDoSetBit}($ordinal);
} else {
$this->{$this->fnDoUnsetBit}($ordinal);
}
}











private function doSetBitBin($ordinal): void
{

$thisBitset = $this->bitset;

$byte = (int) ($ordinal / 8);
$thisBitset[$byte] = $thisBitset[$byte] | \chr(1 << ($ordinal % 8));

$this->bitset = $thisBitset;
}











private function doSetBitInt($ordinal): void
{

$thisBitset = $this->bitset;

$this->bitset = $thisBitset | (1 << $ordinal);
}











private function doUnsetBitBin($ordinal): void
{

$thisBitset = $this->bitset;

$byte = (int) ($ordinal / 8);
$thisBitset[$byte] = $thisBitset[$byte] & \chr(~(1 << ($ordinal % 8)));

$this->bitset = $thisBitset;
}











private function doUnsetBitInt($ordinal): void
{

$thisBitset = $this->bitset;

$this->bitset = $thisBitset & ~(1 << $ordinal);
}









public function with($enumerator): self
{
$clone = clone $this;
$clone->{$this->fnDoSetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
return $clone;
}







public function withIterable(iterable $enumerators): self
{
$clone = clone $this;
foreach ($enumerators as $enumerator) {
$clone->{$this->fnDoSetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}
return $clone;
}







public function without($enumerator): self
{
$clone = clone $this;
$clone->{$this->fnDoUnsetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
return $clone;
}







public function withoutIterable(iterable $enumerators): self
{
$clone = clone $this;
foreach ($enumerators as $enumerator) {
$clone->{$this->fnDoUnsetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}
return $clone;
}








public function withUnion(EnumSet $other): self
{
$clone = clone $this;
$clone->setUnion($other);
return $clone;
}











public function union(EnumSet $other): self
{
return $this->withUnion($other);
}








public function withIntersect(EnumSet $other): self
{
$clone = clone $this;
$clone->setIntersect($other);
return $clone;
}











public function intersect(EnumSet $other): self
{
return $this->withIntersect($other);
}








public function withDiff(EnumSet $other): self
{
$clone = clone $this;
$clone->setDiff($other);
return $clone;
}











public function diff(EnumSet $other): self
{
return $this->withDiff($other);
}








public function withSymDiff(EnumSet $other): self
{
$clone = clone $this;
$clone->setSymDiff($other);
return $clone;
}











public function symDiff(EnumSet $other): self
{
return $this->withSymDiff($other);
}










public function withBinaryBitsetLe(string $bitset): self
{
$clone = clone $this;
$clone->{$this->fnDoSetBinaryBitsetLe}($bitset);
return $clone;
}








public function withBinaryBitsetBe(string $bitset): self
{
$clone = $this;
$clone->{$this->fnDoSetBinaryBitsetLe}(\strrev($bitset));
return $clone;
}













public function withBit(int $ordinal, bool $bit): self
{
$clone = clone $this;
$clone->setBit($ordinal, $bit);
return $clone;
}








public function has($enumerator): bool
{
return $this->{$this->fnDoGetBit}(($this->enumeration)::get($enumerator)->getOrdinal());
}








public function contains($enumerator): bool
{
return $this->has($enumerator);
}









public function getIterator(): Iterator
{
return $this->{$this->fnDoGetIterator}();
}










private function doGetIteratorBin()
{

$bitset = $this->bitset;
$byteLen = \strlen($bitset);
for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
if ($bitset[$bytePos] === "\0") {

continue;
}

$ord = \ord($bitset[$bytePos]);
for ($bitPos = 0; $bitPos < 8; ++$bitPos) {
if ($ord & (1 << $bitPos)) {
$ordinal = $bytePos * 8 + $bitPos;
yield $ordinal => ($this->enumeration)::byOrdinal($ordinal);
}
}
}
}










private function doGetIteratorInt()
{

$bitset = $this->bitset;
$count = $this->enumerationCount;
for ($ordinal = 0; $ordinal < $count; ++$ordinal) {
if ($bitset & (1 << $ordinal)) {
yield $ordinal => ($this->enumeration)::byOrdinal($ordinal);
}
}
}










public function count(): int
{
return $this->{$this->fnDoCount}();
}










private function doCountBin()
{

$bitset = $this->bitset;
$count = 0;
$byteLen = \strlen($bitset);
for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
if ($bitset[$bytePos] === "\0") {

continue;
}

$ord = \ord($bitset[$bytePos]);
if ($ord & 0b00000001) ++$count;
if ($ord & 0b00000010) ++$count;
if ($ord & 0b00000100) ++$count;
if ($ord & 0b00001000) ++$count;
if ($ord & 0b00010000) ++$count;
if ($ord & 0b00100000) ++$count;
if ($ord & 0b01000000) ++$count;
if ($ord & 0b10000000) ++$count;
}
return $count;
}










private function doCountInt()
{

$bitset = $this->bitset;
$count = 0;


if ($bitset < 0) {
$count = 1;
$bitset = $bitset & \PHP_INT_MAX;
}


$phpIntBitSize = \PHP_INT_SIZE * 8;
for ($bitPos = 0; $bitPos < $phpIntBitSize; $bitPos += 8) {
$bitChk = 0xff << $bitPos;
$byte = $bitset & $bitChk;
if ($byte) {
$byte = $byte >> $bitPos;
if ($byte & 0b00000001) ++$count;
if ($byte & 0b00000010) ++$count;
if ($byte & 0b00000100) ++$count;
if ($byte & 0b00001000) ++$count;
if ($byte & 0b00010000) ++$count;
if ($byte & 0b00100000) ++$count;
if ($byte & 0b01000000) ++$count;
if ($byte & 0b10000000) ++$count;
}

if ($bitset <= $bitChk) {
break;
}
}

return $count;
}






public function isEqual(EnumSet $other): bool
{
return $this->enumeration === $other->enumeration
&& $this->bitset === $other->bitset;
}






public function isSubset(EnumSet $other): bool
{
return $this->enumeration === $other->enumeration
&& ($this->bitset & $other->bitset) === $this->bitset;
}






public function isSuperset(EnumSet $other): bool
{
return $this->enumeration === $other->enumeration
&& ($this->bitset | $other->bitset) === $this->bitset;
}






public function isEmpty(): bool
{
return $this->bitset === $this->emptyBitset;
}







public function getOrdinals(): array
{
return $this->{$this->fnDoGetOrdinals}();
}










private function doGetOrdinalsBin()
{

$bitset = $this->bitset;
$ordinals = [];
$byteLen = \strlen($bitset);
for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
if ($bitset[$bytePos] === "\0") {

continue;
}

$ord = \ord($bitset[$bytePos]);
for ($bitPos = 0; $bitPos < 8; ++$bitPos) {
if ($ord & (1 << $bitPos)) {
$ordinals[] = $bytePos * 8 + $bitPos;
}
}
}
return $ordinals;
}










private function doGetOrdinalsInt()
{

$bitset = $this->bitset;
$ordinals = [];
$count = $this->enumerationCount;
for ($ordinal = 0; $ordinal < $count; ++$ordinal) {
if ($bitset & (1 << $ordinal)) {
$ordinals[] = $ordinal;
}
}
return $ordinals;
}

/**
@phpstan-return
@psalm-return



*/
public function getValues(): array
{
$enumeration = $this->enumeration;
$values = [];
foreach ($this->getOrdinals() as $ord) {
$values[] = $enumeration::byOrdinal($ord)->getValue();
}
return $values;
}

/**
@phpstan-return
@psalm-return



*/
public function getNames(): array
{
$enumeration = $this->enumeration;
$names = [];
foreach ($this->getOrdinals() as $ord) {
$names[] = $enumeration::byOrdinal($ord)->getName();
}
return $names;
}

/**
@phpstan-return
@psalm-return



*/
public function getEnumerators(): array
{
$enumeration = $this->enumeration;
$enumerators = [];
foreach ($this->getOrdinals() as $ord) {
$enumerators[] = $enumeration::byOrdinal($ord);
}
return $enumerators;
}








public function getBinaryBitsetLe(): string
{
return $this->{$this->fnDoGetBinaryBitsetLe}();
}










private function doGetBinaryBitsetLeBin()
{

$bitset = $this->bitset;

return $bitset;
}










private function doGetBinaryBitsetLeInt()
{
$bin = \pack(\PHP_INT_SIZE === 8 ? 'P' : 'V', $this->bitset);
return \substr($bin, 0, (int)\ceil($this->enumerationCount / 8));
}






public function getBinaryBitsetBe(): string
{
return \strrev($this->getBinaryBitsetLe());
}










public function getBit(int $ordinal): bool
{
if ($ordinal < 0 || $ordinal > $this->enumerationCount) {
throw new InvalidArgumentException("Ordinal number must be between 0 and {$this->enumerationCount}");
}

return $this->{$this->fnDoGetBit}($ordinal);
}











private function doGetBitBin($ordinal)
{

$bitset = $this->bitset;

return (\ord($bitset[(int) ($ordinal / 8)]) & 1 << ($ordinal % 8)) !== 0;
}











private function doGetBitInt($ordinal)
{

$bitset = $this->bitset;

return (bool)($bitset & (1 << $ordinal));
}
}
<?php

declare(strict_types=1);

namespace MabeEnum;

use RuntimeException;
use LogicException;














trait EnumSerializableTrait
{




abstract public function getValue();







public function __serialize(): array
{
return ['value' => $this->getValue()];
}











public function __unserialize(array $data): void
{
if (!\array_key_exists('value', $data)) {
throw new RuntimeException('Missing array key "value"');
}


$value = $data['value'];
$constants = self::getConstants();
$name = \array_search($value, $constants, true);
if ($name === false) {
$message = \is_scalar($value)
? 'Unknown value ' . \var_export($value, true)
: 'Invalid value of type ' . (\is_object($value) ? \get_class($value) : \gettype($value));
throw new RuntimeException($message);
}

$class = static::class;
$enumerator = $this;
$closure = function () use ($class, $name, $value, $enumerator) {
if ($value !== null && $this->value !== null) {
throw new LogicException('Do not call this directly - please use unserialize($enum) instead');
}

$this->value = $value;

if (!isset(self::$instances[$class][$name])) {
self::$instances[$class][$name] = $enumerator;
}
};
$closure->bindTo($this, Enum::class)();
}








public function serialize(): string
{
return \serialize($this->getValue());
}










public function unserialize($serialized): void
{
$this->__unserialize(['value' => \unserialize($serialized)]);
}
}
Copyright (c) 2020, Marc Bennewitz
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    
    * Neither the name of the organisation nor the names of its contributors
      may be used to endorse or promote products derived from this software
      without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.<?php

















namespace PhpOption;

use EmptyIterator;

/**
@extends
*/
final class None extends Option
{

private static $instance;




public static function create(): self
{
if (null === self::$instance) {
self::$instance = new self();
}

return self::$instance;
}

public function get()
{
throw new \RuntimeException('None has no value.');
}

public function getOrCall($callable)
{
return $callable();
}

public function getOrElse($default)
{
return $default;
}

public function getOrThrow(\Exception $ex)
{
throw $ex;
}

public function isEmpty(): bool
{
return true;
}

public function isDefined(): bool
{
return false;
}

public function orElse(Option $else)
{
return $else;
}

public function ifDefined($callable)
{

}

public function forAll($callable)
{
return $this;
}

public function map($callable)
{
return $this;
}

public function flatMap($callable)
{
return $this;
}

public function filter($callable)
{
return $this;
}

public function filterNot($callable)
{
return $this;
}

public function select($value)
{
return $this;
}

public function reject($value)
{
return $this;
}

public function getIterator(): EmptyIterator
{
return new EmptyIterator();
}

public function foldLeft($initialValue, $callable)
{
return $initialValue;
}

public function foldRight($initialValue, $callable)
{
return $initialValue;
}

private function __construct()
{
}
}
<?php

















namespace PhpOption;

use ArrayIterator;

/**
@template
@extends

*/
final class Some extends Option
{

private $value;




public function __construct($value)
{
$this->value = $value;
}

/**
@template




*/
public static function create($value): self
{
return new self($value);
}

public function isDefined(): bool
{
return true;
}

public function isEmpty(): bool
{
return false;
}

public function get()
{
return $this->value;
}

public function getOrElse($default)
{
return $this->value;
}

public function getOrCall($callable)
{
return $this->value;
}

public function getOrThrow(\Exception $ex)
{
return $this->value;
}

public function orElse(Option $else)
{
return $this;
}

public function ifDefined($callable)
{
$this->forAll($callable);
}

public function forAll($callable)
{
$callable($this->value);

return $this;
}

public function map($callable)
{
return new self($callable($this->value));
}

public function flatMap($callable)
{

$rs = $callable($this->value);
if (!$rs instanceof Option) {
throw new \RuntimeException('Callables passed to flatMap() must return an Option. Maybe you should use map() instead?');
}

return $rs;
}

public function filter($callable)
{
if (true === $callable($this->value)) {
return $this;
}

return None::create();
}

public function filterNot($callable)
{
if (false === $callable($this->value)) {
return $this;
}

return None::create();
}

public function select($value)
{
if ($this->value === $value) {
return $this;
}

return None::create();
}

public function reject($value)
{
if ($this->value === $value) {
return None::create();
}

return $this;
}




public function getIterator(): ArrayIterator
{
return new ArrayIterator([$this->value]);
}

public function foldLeft($initialValue, $callable)
{
return $callable($initialValue, $this->value);
}

public function foldRight($initialValue, $callable)
{
return $callable($this->value, $initialValue);
}
}
<?php

















namespace PhpOption;

use ArrayAccess;
use IteratorAggregate;

/**
@template
@implements

*/
abstract class Option implements IteratorAggregate
{
/**
@template












*/
public static function fromValue($value, $noneValue = null)
{
if ($value === $noneValue) {
return None::create();
}

return new Some($value);
}

/**
@template











*/
public static function fromArraysValue($array, $key)
{
if ($key === null || !(is_array($array) || $array instanceof ArrayAccess) || !isset($array[$key])) {
return None::create();
}

return new Some($array[$key]);
}

/**
@template













*/
public static function fromReturn($callback, array $arguments = [], $noneValue = null)
{
return new LazyOption(static function () use ($callback, $arguments, $noneValue) {

$return = call_user_func_array($callback, $arguments);

if ($return === $noneValue) {
return None::create();
}

return new Some($return);
});
}

/**
@template













*/
public static function ensure($value, $noneValue = null)
{
if ($value instanceof self) {
return $value;
} elseif (is_callable($value)) {
return new LazyOption(static function () use ($value, $noneValue) {

$return = $value();

if ($return instanceof self) {
return $return;
} else {
return self::fromValue($return, $noneValue);
}
});
} else {
return self::fromValue($value, $noneValue);
}
}

/**
@template













*/
public static function lift($callback, $noneValue = null)
{
return static function () use ($callback, $noneValue) {

$args = func_get_args();

$reduced_args = array_reduce(
$args,

static function ($status, self $o) {
return $o->isEmpty() ? true : $status;
},
false
);

if ($reduced_args) {
return None::create();
}

$args = array_map(

static function (self $o) {



return $o->get();
},
$args
);

return self::ensure(call_user_func_array($callback, $args), $noneValue);
};
}








abstract public function get();

/**
@template






*/
abstract public function getOrElse($default);

/**
@template









*/
abstract public function getOrCall($callable);








abstract public function getOrThrow(\Exception $ex);






abstract public function isEmpty();






abstract public function isDefined();

















abstract public function orElse(self $else);























abstract public function ifDefined($callable);












abstract public function forAll($callable);

/**
@template













*/
abstract public function map($callable);

/**
@template










*/
abstract public function flatMap($callable);











abstract public function filter($callable);











abstract public function filterNot($callable);














abstract public function select($value);














abstract public function reject($value);

/**
@template

























*/
abstract public function foldLeft($initialValue, $callable);

/**
@template







*/
abstract public function foldRight($initialValue, $callable);
}
<?php

















namespace PhpOption;

use Traversable;

/**
@template
@extends

*/
final class LazyOption extends Option
{

private $callback;


private $arguments;


private $option;

/**
@template




*/
public static function create($callback, array $arguments = []): self
{
return new self($callback, $arguments);
}





public function __construct($callback, array $arguments = [])
{
if (!is_callable($callback)) {
throw new \InvalidArgumentException('Invalid callback given');
}

$this->callback = $callback;
$this->arguments = $arguments;
}

public function isDefined(): bool
{
return $this->option()->isDefined();
}

public function isEmpty(): bool
{
return $this->option()->isEmpty();
}

public function get()
{
return $this->option()->get();
}

public function getOrElse($default)
{
return $this->option()->getOrElse($default);
}

public function getOrCall($callable)
{
return $this->option()->getOrCall($callable);
}

public function getOrThrow(\Exception $ex)
{
return $this->option()->getOrThrow($ex);
}

public function orElse(Option $else)
{
return $this->option()->orElse($else);
}

public function ifDefined($callable)
{
$this->option()->forAll($callable);
}

public function forAll($callable)
{
return $this->option()->forAll($callable);
}

public function map($callable)
{
return $this->option()->map($callable);
}

public function flatMap($callable)
{
return $this->option()->flatMap($callable);
}

public function filter($callable)
{
return $this->option()->filter($callable);
}

public function filterNot($callable)
{
return $this->option()->filterNot($callable);
}

public function select($value)
{
return $this->option()->select($value);
}

public function reject($value)
{
return $this->option()->reject($value);
}




public function getIterator(): Traversable
{
return $this->option()->getIterator();
}

public function foldLeft($initialValue, $callable)
{
return $this->option()->foldLeft($initialValue, $callable);
}

public function foldRight($initialValue, $callable)
{
return $this->option()->foldRight($initialValue, $callable);
}




private function option(): Option
{
if (null === $this->option) {

$option = call_user_func_array($this->callback, $this->arguments);
if ($option instanceof Option) {
$this->option = $option;
} else {
throw new \RuntimeException(sprintf('Expected instance of %s', Option::class));
}
}

return $this->option;
}
}
The MIT License (MIT)

Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler

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.
<?php

namespace React\Socket;


















class FixedUriConnector implements ConnectorInterface
{
private $uri;
private $connector;





public function __construct($uri, ConnectorInterface $connector)
{
$this->uri = $uri;
$this->connector = $connector;
}

public function connect($_)
{
return $this->connector->connect($this->uri);
}
}
<?php

namespace React\Socket;

use React\Dns\Resolver\ResolverInterface;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise;

final class HappyEyeBallsConnector implements ConnectorInterface
{
private $loop;
private $connector;
private $resolver;






public function __construct($loop = null, $connector = null, $resolver = null)
{





if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #1 ($loop) expected null|React\EventLoop\LoopInterface');
}
if (!$connector instanceof ConnectorInterface) { 
throw new \InvalidArgumentException('Argument #2 ($connector) expected React\Socket\ConnectorInterface');
}
if (!$resolver instanceof ResolverInterface) { 
throw new \InvalidArgumentException('Argument #3 ($resolver) expected React\Dns\Resolver\ResolverInterface');
}

$this->loop = $loop ?: Loop::get();
$this->connector = $connector;
$this->resolver = $resolver;
}

public function connect($uri)
{
$original = $uri;
if (\strpos($uri, '://') === false) {
$uri = 'tcp://' . $uri;
$parts = \parse_url($uri);
if (isset($parts['scheme'])) {
unset($parts['scheme']);
}
} else {
$parts = \parse_url($uri);
}

if (!$parts || !isset($parts['host'])) {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $original . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

$host = \trim($parts['host'], '[]');


if (@\inet_pton($host) !== false) {
return $this->connector->connect($original);
}

$builder = new HappyEyeBallsConnectionBuilder(
$this->loop,
$this->connector,
$this->resolver,
$uri,
$host,
$parts
);
return $builder->connect();
}
}
<?php

namespace React\Socket;


















interface ConnectorInterface
{


































public function connect($uri);
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use InvalidArgumentException;
use RuntimeException;














final class UnixServer extends EventEmitter implements ServerInterface
{
private $master;
private $loop;
private $listening = false;
























public function __construct($path, $loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->loop = $loop ?: Loop::get();

if (\strpos($path, '://') === false) {
$path = 'unix://' . $path;
} elseif (\substr($path, 0, 7) !== 'unix://') {
throw new \InvalidArgumentException(
'Given URI "' . $path . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
);
}

$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {



if (\preg_match('/\(([^\)]+)\)|\[(\d+)\]: (.*)/', $error, $match)) {
$errstr = isset($match[3]) ? $match['3'] : $match[1];
$errno = isset($match[2]) ? (int)$match[2] : 0;
}
});

$this->master = \stream_socket_server(
$path,
$errno,
$errstr,
\STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN,
\stream_context_create(array('socket' => $context))
);

\restore_error_handler();

if (false === $this->master) {
throw new \RuntimeException(
'Failed to listen on Unix domain socket "' . $path . '": ' . $errstr . SocketServer::errconst($errno),
$errno
);
}
\stream_set_blocking($this->master, 0);

$this->resume();
}

public function getAddress()
{
if (!\is_resource($this->master)) {
return null;
}

return 'unix://' . \stream_socket_get_name($this->master, false);
}

public function pause()
{
if (!$this->listening) {
return;
}

$this->loop->removeReadStream($this->master);
$this->listening = false;
}

public function resume()
{
if ($this->listening || !is_resource($this->master)) {
return;
}

$that = $this;
$this->loop->addReadStream($this->master, function ($master) use ($that) {
try {
$newSocket = SocketServer::accept($master);
} catch (\RuntimeException $e) {
$that->emit('error', array($e));
return;
}
$that->handleConnection($newSocket);
});
$this->listening = true;
}

public function close()
{
if (!\is_resource($this->master)) {
return;
}

$this->pause();
\fclose($this->master);
$this->removeAllListeners();
}


public function handleConnection($socket)
{
$connection = new Connection($socket, $this->loop);
$connection->unix = true;

$this->emit('connection', array(
$connection
));
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\LoopInterface;

final class SocketServer extends EventEmitter implements ServerInterface
{
private $server;























public function __construct($uri, array $context = array(), $loop = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #3 ($loop) expected null|React\EventLoop\LoopInterface');
}


$context += array(
'tcp' => array(),
'tls' => array(),
'unix' => array()
);

$scheme = 'tcp';
$pos = \strpos($uri, '://');
if ($pos !== false) {
$scheme = \substr($uri, 0, $pos);
}

if ($scheme === 'unix') {
$server = new UnixServer($uri, $loop, $context['unix']);
} elseif ($scheme === 'php') {
$server = new FdServer($uri, $loop);
} else {
if (preg_match('#^(?:\w+://)?\d+$#', $uri)) {
throw new \InvalidArgumentException(
'Invalid URI given (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
);
}

$server = new TcpServer(str_replace('tls://', '', $uri), $loop, $context['tcp']);

if ($scheme === 'tls') {
$server = new SecureServer($server, $loop, $context['tls']);
}
}

$this->server = $server;

$that = $this;
$server->on('connection', function (ConnectionInterface $conn) use ($that) {
$that->emit('connection', array($conn));
});
$server->on('error', function (\Exception $error) use ($that) {
$that->emit('error', array($error));
});
}

public function getAddress()
{
return $this->server->getAddress();
}

public function pause()
{
$this->server->pause();
}

public function resume()
{
$this->server->resume();
}

public function close()
{
$this->server->close();
}









public static function accept($socket)
{
$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {


$errstr = \preg_replace('#.*: #', '', $error);
$errno = SocketServer::errno($errstr);
});

$newSocket = \stream_socket_accept($socket, 0);

\restore_error_handler();

if (false === $newSocket) {
throw new \RuntimeException(
'Unable to accept new connection: ' . $errstr . self::errconst($errno),
$errno
);
}

return $newSocket;
}

















public static function errno($errstr)
{

$strerror = \function_exists('socket_strerror') ? 'socket_strerror' : (\function_exists('posix_strerror') ? 'posix_strerror' : (\function_exists('pcntl_strerror') ? 'pcntl_strerror' : null));
if ($strerror !== null) {
assert(\is_string($strerror) && \is_callable($strerror));




foreach (\get_defined_constants(false) as $name => $value) {
if (\is_int($value) && (\strpos($name, 'SOCKET_E') === 0 || \strpos($name, 'PCNTL_E') === 0) && $strerror($value) === $errstr) {
return $value;
}
}



for ($errno = 1, $max = \defined('MAX_ERRNO') ? \MAX_ERRNO : 4095; $errno <= $max; ++$errno) {
if ($strerror($errno) === $errstr) {
return $errno;
}
}
}


return 0;
}





















public static function errconst($errno)
{



foreach (\get_defined_constants(false) as $name => $value) {
if ($value === $errno && (\strpos($name, 'SOCKET_E') === 0 || \strpos($name, 'PCNTL_E') === 0)) {
return ' (' . \substr($name, \strpos($name, '_') + 1) . ')';
}
}


return '';
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;


























final class FdServer extends EventEmitter implements ServerInterface
{
private $master;
private $loop;
private $unix = false;
private $listening = false;






































public function __construct($fd, $loop = null)
{
if (\preg_match('#^php://fd/(\d+)$#', $fd, $m)) {
$fd = (int) $m[1];
}
if (!\is_int($fd) || $fd < 0 || $fd >= \PHP_INT_MAX) {
throw new \InvalidArgumentException(
'Invalid FD number given (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
);
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->loop = $loop ?: Loop::get();

$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {


\preg_match('/\[(\d+)\]: (.*)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error;
});

$this->master = \fopen('php://fd/' . $fd, 'r+');

\restore_error_handler();

if (false === $this->master) {
throw new \RuntimeException(
'Failed to listen on FD ' . $fd . ': ' . $errstr . SocketServer::errconst($errno),
$errno
);
}

$meta = \stream_get_meta_data($this->master);
if (!isset($meta['stream_type']) || $meta['stream_type'] !== 'tcp_socket') {
\fclose($this->master);

$errno = \defined('SOCKET_ENOTSOCK') ? \SOCKET_ENOTSOCK : 88;
$errstr = \function_exists('socket_strerror') ? \socket_strerror($errno) : 'Not a socket';

throw new \RuntimeException(
'Failed to listen on FD ' . $fd . ': ' . $errstr . ' (ENOTSOCK)',
$errno
);
}



if (\stream_socket_get_name($this->master, true) !== false) {
\fclose($this->master);

$errno = \defined('SOCKET_EISCONN') ? \SOCKET_EISCONN : 106;
$errstr = \function_exists('socket_strerror') ? \socket_strerror($errno) : 'Socket is connected';

throw new \RuntimeException(
'Failed to listen on FD ' . $fd . ': ' . $errstr . ' (EISCONN)',
$errno
);
}



$this->unix = \parse_url($this->getAddress(), \PHP_URL_PORT) === false;

\stream_set_blocking($this->master, false);

$this->resume();
}

public function getAddress()
{
if (!\is_resource($this->master)) {
return null;
}

$address = \stream_socket_get_name($this->master, false);

if ($this->unix === true) {
return 'unix://' . $address;
}


$pos = \strrpos($address, ':');
if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') {
$address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); 
}

return 'tcp://' . $address;
}

public function pause()
{
if (!$this->listening) {
return;
}

$this->loop->removeReadStream($this->master);
$this->listening = false;
}

public function resume()
{
if ($this->listening || !\is_resource($this->master)) {
return;
}

$that = $this;
$this->loop->addReadStream($this->master, function ($master) use ($that) {
try {
$newSocket = SocketServer::accept($master);
} catch (\RuntimeException $e) {
$that->emit('error', array($e));
return;
}
$that->handleConnection($newSocket);
});
$this->listening = true;
}

public function close()
{
if (!\is_resource($this->master)) {
return;
}

$this->pause();
\fclose($this->master);
$this->removeAllListeners();
}


public function handleConnection($socket)
{
$connection = new Connection($socket, $this->loop);
$connection->unix = $this->unix;

$this->emit('connection', array($connection));
}
}
<?php

namespace React\Socket;

use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise;
use InvalidArgumentException;
use RuntimeException;

final class TcpConnector implements ConnectorInterface
{
private $loop;
private $context;





public function __construct($loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #1 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->loop = $loop ?: Loop::get();
$this->context = $context;
}

public function connect($uri)
{
if (\strpos($uri, '://') === false) {
$uri = 'tcp://' . $uri;
}

$parts = \parse_url($uri);
if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $uri . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

$ip = \trim($parts['host'], '[]');
if (@\inet_pton($ip) === false) {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $uri . '" does not contain a valid host IP (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}


$context = array(
'socket' => $this->context
);


$args = array();
if (isset($parts['query'])) {
\parse_str($parts['query'], $args);
}






if (isset($args['hostname'])) {
$context['ssl'] = array(
'SNI_enabled' => true,
'peer_name' => $args['hostname']
);





if (\PHP_VERSION_ID < 50600) {
$context['ssl'] += array(
'SNI_server_name' => $args['hostname'],
'CN_match' => $args['hostname']
);
}

}



$remote = 'tcp://' . $parts['host'] . ':' . $parts['port'];

$stream = @\stream_socket_client(
$remote,
$errno,
$errstr,
0,
\STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT,
\stream_context_create($context)
);

if (false === $stream) {
return Promise\reject(new \RuntimeException(
'Connection to ' . $uri . ' failed: ' . $errstr . SocketServer::errconst($errno),
$errno
));
}


$loop = $this->loop;
return new Promise\Promise(function ($resolve, $reject) use ($loop, $stream, $uri) {
$loop->addWriteStream($stream, function ($stream) use ($loop, $resolve, $reject, $uri) {
$loop->removeWriteStream($stream);



if (false === \stream_socket_get_name($stream, true)) {


if (\function_exists('socket_import_stream')) {

$socket = \socket_import_stream($stream);
$errno = \socket_get_option($socket, \SOL_SOCKET, \SO_ERROR);
$errstr = \socket_strerror($errno);
} elseif (\PHP_OS === 'Linux') {



$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {


\preg_match('/errno=(\d+) (.+)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error;
});

\fwrite($stream, \PHP_EOL);

\restore_error_handler();
} else {

$errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111;
$errstr = 'Connection refused?';
}


\fclose($stream);
$reject(new \RuntimeException(
'Connection to ' . $uri . ' failed: ' . $errstr . SocketServer::errconst($errno),
$errno
));
} else {
$resolve(new Connection($stream, $loop));
}
});
}, function () use ($loop, $stream, $uri) {
$loop->removeWriteStream($stream);
\fclose($stream);



if (\PHP_VERSION_ID < 50400 && \is_resource($stream)) {
\fclose($stream);
}


throw new \RuntimeException(
'Connection to ' . $uri . ' cancelled during TCP/IP handshake (ECONNABORTED)',
\defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103
);
});
}
}
<?php

namespace React\Socket;

use React\Dns\Resolver\ResolverInterface;
use React\Promise;
use React\Promise\PromiseInterface;

final class DnsConnector implements ConnectorInterface
{
private $connector;
private $resolver;

public function __construct(ConnectorInterface $connector, ResolverInterface $resolver)
{
$this->connector = $connector;
$this->resolver = $resolver;
}

public function connect($uri)
{
$original = $uri;
if (\strpos($uri, '://') === false) {
$uri = 'tcp://' . $uri;
$parts = \parse_url($uri);
if (isset($parts['scheme'])) {
unset($parts['scheme']);
}
} else {
$parts = \parse_url($uri);
}

if (!$parts || !isset($parts['host'])) {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $original . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

$host = \trim($parts['host'], '[]');
$connector = $this->connector;


if (@\inet_pton($host) !== false) {
return $connector->connect($original);
}

$promise = $this->resolver->resolve($host);
$resolved = null;

return new Promise\Promise(
function ($resolve, $reject) use (&$promise, &$resolved, $uri, $connector, $host, $parts) {

$promise->then(function ($ip) use (&$promise, &$resolved, $uri, $connector, $host, $parts) {
$resolved = $ip;

return $promise = $connector->connect(
Connector::uri($parts, $host, $ip)
)->then(null, function (\Exception $e) use ($uri) {
if ($e instanceof \RuntimeException) {
$message = \preg_replace('/^(Connection to [^ ]+)[&?]hostname=[^ &]+/', '$1', $e->getMessage());
$e = new \RuntimeException(
'Connection to ' . $uri . ' failed: ' . $message,
$e->getCode(),
$e
);



$r = new \ReflectionProperty('Exception', 'trace');
$r->setAccessible(true);
$trace = $r->getValue($e);



foreach ($trace as $ti => $one) {
if (isset($one['args'])) {
foreach ($one['args'] as $ai => $arg) {
if ($arg instanceof \Closure) {
$trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')';
}
}
}
}

$r->setValue($e, $trace);
}

throw $e;
});
}, function ($e) use ($uri, $reject) {
$reject(new \RuntimeException('Connection to ' . $uri .' failed during DNS lookup: ' . $e->getMessage(), 0, $e));
})->then($resolve, $reject);
},
function ($_, $reject) use (&$promise, &$resolved, $uri) {


if ($resolved === null) {
$reject(new \RuntimeException(
'Connection to ' . $uri . ' cancelled during DNS lookup (ECONNABORTED)',
\defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103
));
}


if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) {


$_ = $reject = null;

$promise->cancel();
$promise = null;
}
}
);
}
}
<?php

namespace React\Socket;

use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise;
use BadMethodCallException;
use InvalidArgumentException;
use UnexpectedValueException;

final class SecureConnector implements ConnectorInterface
{
private $connector;
private $streamEncryption;
private $context;






public function __construct(ConnectorInterface $connector, $loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->connector = $connector;
$this->streamEncryption = new StreamEncryption($loop ?: Loop::get(), false);
$this->context = $context;
}

public function connect($uri)
{
if (!\function_exists('stream_socket_enable_crypto')) {
return Promise\reject(new \BadMethodCallException('Encryption not supported on your platform (HHVM < 3.8?)')); 
}

if (\strpos($uri, '://') === false) {
$uri = 'tls://' . $uri;
}

$parts = \parse_url($uri);
if (!$parts || !isset($parts['scheme']) || $parts['scheme'] !== 'tls') {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $uri . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

$context = $this->context;
$encryption = $this->streamEncryption;
$connected = false;

$promise = $this->connector->connect(
\str_replace('tls://', '', $uri)
)->then(function (ConnectionInterface $connection) use ($context, $encryption, $uri, &$promise, &$connected) {

$connected = true;

if (!$connection instanceof Connection) {
$connection->close();
throw new \UnexpectedValueException('Base connector does not use internal Connection class exposing stream resource');
}


foreach ($context as $name => $value) {
\stream_context_set_option($connection->stream, 'ssl', $name, $value);
}


return $promise = $encryption->enable($connection)->then(null, function ($error) use ($connection, $uri) {

$connection->close();

throw new \RuntimeException(
'Connection to ' . $uri . ' failed during TLS handshake: ' . $error->getMessage(),
$error->getCode()
);
});
}, function (\Exception $e) use ($uri) {
if ($e instanceof \RuntimeException) {
$message = \preg_replace('/^Connection to [^ ]+/', '', $e->getMessage());
$e = new \RuntimeException(
'Connection to ' . $uri . $message,
$e->getCode(),
$e
);



$r = new \ReflectionProperty('Exception', 'trace');
$r->setAccessible(true);
$trace = $r->getValue($e);



foreach ($trace as $ti => $one) {
if (isset($one['args'])) {
foreach ($one['args'] as $ai => $arg) {
if ($arg instanceof \Closure) {
$trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')';
}
}
}
}

$r->setValue($e, $trace);
}

throw $e;
});

return new \React\Promise\Promise(
function ($resolve, $reject) use ($promise) {
$promise->then($resolve, $reject);
},
function ($_, $reject) use (&$promise, $uri, &$connected) {
if ($connected) {
$reject(new \RuntimeException(
'Connection to ' . $uri . ' cancelled during TLS handshake (ECONNABORTED)',
\defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103
));
}

$promise->cancel();
$promise = null;
}
);
}
}
<?php

namespace React\Socket;

use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise;
use InvalidArgumentException;
use RuntimeException;







final class UnixConnector implements ConnectorInterface
{
private $loop;




public function __construct($loop = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #1 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->loop = $loop ?: Loop::get();
}

public function connect($path)
{
if (\strpos($path, '://') === false) {
$path = 'unix://' . $path;
} elseif (\substr($path, 0, 7) !== 'unix://') {
return Promise\reject(new \InvalidArgumentException(
'Given URI "' . $path . '" is invalid (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

$resource = @\stream_socket_client($path, $errno, $errstr, 1.0);

if (!$resource) {
return Promise\reject(new \RuntimeException(
'Unable to connect to unix domain socket "' . $path . '": ' . $errstr . SocketServer::errconst($errno),
$errno
));
}

$connection = new Connection($resource, $this->loop);
$connection->unix = true;

return Promise\resolve($connection);
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use Exception;
use OverflowException;




























class LimitingServer extends EventEmitter implements ServerInterface
{
private $connections = array();
private $server;
private $limit;

private $pauseOnLimit = false;
private $autoPaused = false;
private $manuPaused = false;


















































public function __construct(ServerInterface $server, $connectionLimit, $pauseOnLimit = false)
{
$this->server = $server;
$this->limit = $connectionLimit;
if ($connectionLimit !== null) {
$this->pauseOnLimit = $pauseOnLimit;
}

$this->server->on('connection', array($this, 'handleConnection'));
$this->server->on('error', array($this, 'handleError'));
}












public function getConnections()
{
return $this->connections;
}

public function getAddress()
{
return $this->server->getAddress();
}

public function pause()
{
if (!$this->manuPaused) {
$this->manuPaused = true;

if (!$this->autoPaused) {
$this->server->pause();
}
}
}

public function resume()
{
if ($this->manuPaused) {
$this->manuPaused = false;

if (!$this->autoPaused) {
$this->server->resume();
}
}
}

public function close()
{
$this->server->close();
}


public function handleConnection(ConnectionInterface $connection)
{

if ($this->limit !== null && \count($this->connections) >= $this->limit) {
$this->handleError(new \OverflowException('Connection closed because server reached connection limit'));
$connection->close();
return;
}

$this->connections[] = $connection;
$that = $this;
$connection->on('close', function () use ($that, $connection) {
$that->handleDisconnection($connection);
});


if ($this->pauseOnLimit && !$this->autoPaused && \count($this->connections) >= $this->limit) {
$this->autoPaused = true;

if (!$this->manuPaused) {
$this->server->pause();
}
}

$this->emit('connection', array($connection));
}


public function handleDisconnection(ConnectionInterface $connection)
{
unset($this->connections[\array_search($connection, $this->connections)]);


if ($this->autoPaused && \count($this->connections) < $this->limit) {
$this->autoPaused = false;

if (!$this->manuPaused) {
$this->server->resume();
}
}
}


public function handleError(\Exception $error)
{
$this->emit('error', array($error));
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\LoopInterface;
use React\Stream\DuplexResourceStream;
use React\Stream\Util;
use React\Stream\WritableResourceStream;
use React\Stream\WritableStreamInterface;









class Connection extends EventEmitter implements ConnectionInterface
{





public $unix = false;









public $encryptionEnabled = false;


public $stream;

private $input;

public function __construct($resource, LoopInterface $loop)
{









$clearCompleteBuffer = \PHP_VERSION_ID < 70215 || (\PHP_VERSION_ID >= 70300 && \PHP_VERSION_ID < 70303);









$limitWriteChunks = (\PHP_VERSION_ID < 70018 || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70104));

$this->input = new DuplexResourceStream(
$resource,
$loop,
$clearCompleteBuffer ? -1 : null,
new WritableResourceStream($resource, $loop, null, $limitWriteChunks ? 8192 : null)
);

$this->stream = $resource;

Util::forwardEvents($this->input, $this, array('data', 'end', 'error', 'close', 'pipe', 'drain'));

$this->input->on('close', array($this, 'close'));
}

public function isReadable()
{
return $this->input->isReadable();
}

public function isWritable()
{
return $this->input->isWritable();
}

public function pause()
{
$this->input->pause();
}

public function resume()
{
$this->input->resume();
}

public function pipe(WritableStreamInterface $dest, array $options = array())
{
return $this->input->pipe($dest, $options);
}

public function write($data)
{
return $this->input->write($data);
}

public function end($data = null)
{
$this->input->end($data);
}

public function close()
{
$this->input->close();
$this->handleClose();
$this->removeAllListeners();
}

public function handleClose()
{
if (!\is_resource($this->stream)) {
return;
}




@\stream_socket_shutdown($this->stream, \STREAM_SHUT_RDWR);
}

public function getRemoteAddress()
{
if (!\is_resource($this->stream)) {
return null;
}

return $this->parseAddress(\stream_socket_get_name($this->stream, true));
}

public function getLocalAddress()
{
if (!\is_resource($this->stream)) {
return null;
}

return $this->parseAddress(\stream_socket_get_name($this->stream, false));
}

private function parseAddress($address)
{
if ($address === false) {
return null;
}

if ($this->unix) {


if (\substr($address, -1) === ':' && \defined('HHVM_VERSION_ID') && \HHVM_VERSION_ID < 31900) {
$address = (string)\substr($address, 0, -1); 
}



if ($address === '' || $address[0] === "\x00" ) {
return null; 
}

return 'unix://' . $address;
}


$pos = \strrpos($address, ':');
if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') {
$address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); 
}

return ($this->encryptionEnabled ? 'tls' : 'tcp') . '://' . $address;
}
}
<?php

namespace React\Socket;

use React\Stream\DuplexStreamInterface;

















































interface ConnectionInterface extends DuplexStreamInterface
{




























public function getRemoteAddress();
































public function getLocalAddress();
}
<?php

namespace React\Socket;

use React\EventLoop\LoopInterface;
use React\Promise\Deferred;
use RuntimeException;
use UnexpectedValueException;







class StreamEncryption
{
private $loop;
private $method;
private $server;

public function __construct(LoopInterface $loop, $server = true)
{
$this->loop = $loop;
$this->server = $server;






if ($server) {
$this->method = \STREAM_CRYPTO_METHOD_TLS_SERVER;

if (\PHP_VERSION_ID < 70200 && \PHP_VERSION_ID >= 50600) {
$this->method |= \STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | \STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | \STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; 
}
} else {
$this->method = \STREAM_CRYPTO_METHOD_TLS_CLIENT;

if (\PHP_VERSION_ID < 70200 && \PHP_VERSION_ID >= 50600) {
$this->method |= \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; 
}
}
}





public function enable(Connection $stream)
{
return $this->toggle($stream, true);
}






public function toggle(Connection $stream, $toggle)
{

$stream->pause();




$deferred = new Deferred(function () {
throw new \RuntimeException();
});


$socket = $stream->stream;


$method = $this->method;
$context = \stream_context_get_options($socket);
if (isset($context['ssl']['crypto_method'])) {
$method = $context['ssl']['crypto_method'];
}

$that = $this;
$toggleCrypto = function () use ($socket, $deferred, $toggle, $method, $that) {
$that->toggleCrypto($socket, $deferred, $toggle, $method);
};

$this->loop->addReadStream($socket, $toggleCrypto);

if (!$this->server) {
$toggleCrypto();
}

$loop = $this->loop;

return $deferred->promise()->then(function () use ($stream, $socket, $loop, $toggle) {
$loop->removeReadStream($socket);

$stream->encryptionEnabled = $toggle;
$stream->resume();

return $stream;
}, function($error) use ($stream, $socket, $loop) {
$loop->removeReadStream($socket);
$stream->resume();
throw $error;
});
}









public function toggleCrypto($socket, Deferred $deferred, $toggle, $method)
{
$error = null;
\set_error_handler(function ($_, $errstr) use (&$error) {
$error = \str_replace(array("\r", "\n"), ' ', $errstr);


if (($pos = \strpos($error, "): ")) !== false) {
$error = \substr($error, $pos + 3);
}
});

$result = \stream_socket_enable_crypto($socket, $toggle, $method);

\restore_error_handler();

if (true === $result) {
$deferred->resolve(null);
} else if (false === $result) {


$d = $deferred;
$deferred = null;

if (\feof($socket) || $error === null) {

$d->reject(new \UnexpectedValueException(
'Connection lost during TLS handshake (ECONNRESET)',
\defined('SOCKET_ECONNRESET') ? \SOCKET_ECONNRESET : 104
));
} else {

$d->reject(new \UnexpectedValueException(
$error
));
}
} else {

}
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitterInterface;











































interface ServerInterface extends EventEmitterInterface
{



























public function getAddress();






































public function pause();





















public function resume();










public function close();
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use Exception;





final class Server extends EventEmitter implements ServerInterface
{
private $server;



































public function __construct($uri, $loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$loop = $loop ?: Loop::get();


if ($context && (!isset($context['tcp']) && !isset($context['tls']) && !isset($context['unix']))) {
$context = array('tcp' => $context);
}


$context += array(
'tcp' => array(),
'tls' => array(),
'unix' => array()
);

$scheme = 'tcp';
$pos = \strpos($uri, '://');
if ($pos !== false) {
$scheme = \substr($uri, 0, $pos);
}

if ($scheme === 'unix') {
$server = new UnixServer($uri, $loop, $context['unix']);
} else {
$server = new TcpServer(str_replace('tls://', '', $uri), $loop, $context['tcp']);

if ($scheme === 'tls') {
$server = new SecureServer($server, $loop, $context['tls']);
}
}

$this->server = $server;

$that = $this;
$server->on('connection', function (ConnectionInterface $conn) use ($that) {
$that->emit('connection', array($conn));
});
$server->on('error', function (Exception $error) use ($that) {
$that->emit('error', array($error));
});
}

public function getAddress()
{
return $this->server->getAddress();
}

public function pause()
{
$this->server->pause();
}

public function resume()
{
$this->server->resume();
}

public function close()
{
$this->server->close();
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use BadMethodCallException;
use UnexpectedValueException;













































final class SecureServer extends EventEmitter implements ServerInterface
{
private $tcp;
private $encryption;
private $context;

































































public function __construct(ServerInterface $tcp, $loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

if (!\function_exists('stream_socket_enable_crypto')) {
throw new \BadMethodCallException('Encryption not supported on your platform (HHVM < 3.8?)'); 
}


$context += array(
'passphrase' => ''
);

$this->tcp = $tcp;
$this->encryption = new StreamEncryption($loop ?: Loop::get());
$this->context = $context;

$that = $this;
$this->tcp->on('connection', function ($connection) use ($that) {
$that->handleConnection($connection);
});
$this->tcp->on('error', function ($error) use ($that) {
$that->emit('error', array($error));
});
}

public function getAddress()
{
$address = $this->tcp->getAddress();
if ($address === null) {
return null;
}

return \str_replace('tcp://' , 'tls://', $address);
}

public function pause()
{
$this->tcp->pause();
}

public function resume()
{
$this->tcp->resume();
}

public function close()
{
return $this->tcp->close();
}


public function handleConnection(ConnectionInterface $connection)
{
if (!$connection instanceof Connection) {
$this->emit('error', array(new \UnexpectedValueException('Base server does not use internal Connection class exposing stream resource')));
$connection->close();
return;
}

foreach ($this->context as $name => $value) {
\stream_context_set_option($connection->stream, 'ssl', $name, $value);
}


$remote = $connection->getRemoteAddress();
$that = $this;

$this->encryption->enable($connection)->then(
function ($conn) use ($that) {
$that->emit('connection', array($conn));
},
function ($error) use ($that, $connection, $remote) {
$error = new \RuntimeException(
'Connection from ' . $remote . ' failed during TLS handshake: ' . $error->getMessage(),
$error->getCode()
);

$that->emit('error', array($error));
$connection->close();
}
);
}
}
<?php

namespace React\Socket;

use React\Dns\Config\Config as DnsConfig;
use React\Dns\Resolver\Factory as DnsFactory;
use React\Dns\Resolver\ResolverInterface;
use React\EventLoop\LoopInterface;
















final class Connector implements ConnectorInterface
{
private $connectors = array();




























public function __construct($context = array(), $loop = null)
{

if (($context instanceof LoopInterface || $context === null) && (\func_num_args() <= 1 || \is_array($loop))) {
$swap = $loop === null ? array(): $loop;
$loop = $context;
$context = $swap;
}

if (!\is_array($context) || ($loop !== null && !$loop instanceof LoopInterface)) {
throw new \InvalidArgumentException('Expected "array $context" and "?LoopInterface $loop" arguments');
}


$context += array(
'tcp' => true,
'tls' => true,
'unix' => true,

'dns' => true,
'timeout' => true,
'happy_eyeballs' => true,
);

if ($context['timeout'] === true) {
$context['timeout'] = (float)\ini_get("default_socket_timeout");
}

if ($context['tcp'] instanceof ConnectorInterface) {
$tcp = $context['tcp'];
} else {
$tcp = new TcpConnector(
$loop,
\is_array($context['tcp']) ? $context['tcp'] : array()
);
}

if ($context['dns'] !== false) {
if ($context['dns'] instanceof ResolverInterface) {
$resolver = $context['dns'];
} else {
if ($context['dns'] !== true) {
$config = $context['dns'];
} else {

$config = DnsConfig::loadSystemConfigBlocking();
if (!$config->nameservers) {
$config->nameservers[] = '8.8.8.8'; 
}
}

$factory = new DnsFactory();
$resolver = $factory->createCached(
$config,
$loop
);
}

if ($context['happy_eyeballs'] === true) {
$tcp = new HappyEyeBallsConnector($loop, $tcp, $resolver);
} else {
$tcp = new DnsConnector($tcp, $resolver);
}
}

if ($context['tcp'] !== false) {
$context['tcp'] = $tcp;

if ($context['timeout'] !== false) {
$context['tcp'] = new TimeoutConnector(
$context['tcp'],
$context['timeout'],
$loop
);
}

$this->connectors['tcp'] = $context['tcp'];
}

if ($context['tls'] !== false) {
if (!$context['tls'] instanceof ConnectorInterface) {
$context['tls'] = new SecureConnector(
$tcp,
$loop,
\is_array($context['tls']) ? $context['tls'] : array()
);
}

if ($context['timeout'] !== false) {
$context['tls'] = new TimeoutConnector(
$context['tls'],
$context['timeout'],
$loop
);
}

$this->connectors['tls'] = $context['tls'];
}

if ($context['unix'] !== false) {
if (!$context['unix'] instanceof ConnectorInterface) {
$context['unix'] = new UnixConnector($loop);
}
$this->connectors['unix'] = $context['unix'];
}
}

public function connect($uri)
{
$scheme = 'tcp';
if (\strpos($uri, '://') !== false) {
$scheme = (string)\substr($uri, 0, \strpos($uri, '://'));
}

if (!isset($this->connectors[$scheme])) {
return \React\Promise\reject(new \RuntimeException(
'No connector available for URI scheme "' . $scheme . '" (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
));
}

return $this->connectors[$scheme]->connect($uri);
}











public static function uri(array $parts, $host, $ip)
{
$uri = '';


if (isset($parts['scheme'])) {
$uri .= $parts['scheme'] . '://';
}

if (\strpos($ip, ':') !== false) {

$uri .= '[' . $ip . ']';
} else {
$uri .= $ip;
}


if (isset($parts['port'])) {
$uri .= ':' . $parts['port'];
}


if (isset($parts['path'])) {
$uri .= $parts['path'];
}


if (isset($parts['query'])) {
$uri .= '?' . $parts['query'];
}



$args = array();
\parse_str(isset($parts['query']) ? $parts['query'] : '', $args);
if ($host !== $ip && !isset($args['hostname'])) {
$uri .= (isset($parts['query']) ? '&' : '?') . 'hostname=' . \rawurlencode($host);
}


if (isset($parts['fragment'])) {
$uri .= '#' . $parts['fragment'];
}

return $uri;
}
}
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use InvalidArgumentException;
use RuntimeException;

























final class TcpServer extends EventEmitter implements ServerInterface
{
private $master;
private $loop;
private $listening = false;



























































































public function __construct($uri, $loop = null, array $context = array())
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->loop = $loop ?: Loop::get();


if ((string)(int)$uri === (string)$uri) {
$uri = '127.0.0.1:' . $uri;
}


if (\strpos($uri, '://') === false) {
$uri = 'tcp://' . $uri;
}


if (\substr($uri, -2) === ':0') {
$parts = \parse_url(\substr($uri, 0, -2));
if ($parts) {
$parts['port'] = 0;
}
} else {
$parts = \parse_url($uri);
}


if (!$parts || !isset($parts['scheme'], $parts['host'], $parts['port']) || $parts['scheme'] !== 'tcp') {
throw new \InvalidArgumentException(
'Invalid URI "' . $uri . '" given (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
);
}

if (@\inet_pton(\trim($parts['host'], '[]')) === false) {
throw new \InvalidArgumentException(
'Given URI "' . $uri . '" does not contain a valid host IP (EINVAL)',
\defined('SOCKET_EINVAL') ? \SOCKET_EINVAL : (\defined('PCNTL_EINVAL') ? \PCNTL_EINVAL : 22)
);
}

$this->master = @\stream_socket_server(
$uri,
$errno,
$errstr,
\STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN,
\stream_context_create(array('socket' => $context + array('backlog' => 511)))
);
if (false === $this->master) {
if ($errno === 0) {


$errno = SocketServer::errno($errstr);
}

throw new \RuntimeException(
'Failed to listen on "' . $uri . '": ' . $errstr . SocketServer::errconst($errno),
$errno
);
}
\stream_set_blocking($this->master, false);

$this->resume();
}

public function getAddress()
{
if (!\is_resource($this->master)) {
return null;
}

$address = \stream_socket_get_name($this->master, false);


$pos = \strrpos($address, ':');
if ($pos !== false && \strpos($address, ':') < $pos && \substr($address, 0, 1) !== '[') {
$address = '[' . \substr($address, 0, $pos) . ']:' . \substr($address, $pos + 1); 
}

return 'tcp://' . $address;
}

public function pause()
{
if (!$this->listening) {
return;
}

$this->loop->removeReadStream($this->master);
$this->listening = false;
}

public function resume()
{
if ($this->listening || !\is_resource($this->master)) {
return;
}

$that = $this;
$this->loop->addReadStream($this->master, function ($master) use ($that) {
try {
$newSocket = SocketServer::accept($master);
} catch (\RuntimeException $e) {
$that->emit('error', array($e));
return;
}
$that->handleConnection($newSocket);
});
$this->listening = true;
}

public function close()
{
if (!\is_resource($this->master)) {
return;
}

$this->pause();
\fclose($this->master);
$this->removeAllListeners();
}


public function handleConnection($socket)
{
$this->emit('connection', array(
new Connection($socket, $this->loop)
));
}
}
<?php

namespace React\Socket;

use React\Dns\Model\Message;
use React\Dns\Resolver\ResolverInterface;
use React\EventLoop\LoopInterface;
use React\EventLoop\TimerInterface;
use React\Promise;
use React\Promise\PromiseInterface;




final class HappyEyeBallsConnectionBuilder
{






const CONNECTION_ATTEMPT_DELAY = 0.1;







const RESOLUTION_DELAY = 0.05;

public $loop;
public $connector;
public $resolver;
public $uri;
public $host;
public $resolved = array(
Message::TYPE_A => false,
Message::TYPE_AAAA => false,
);
public $resolverPromises = array();
public $connectionPromises = array();
public $connectQueue = array();
public $nextAttemptTimer;
public $parts;
public $ipsCount = 0;
public $failureCount = 0;
public $resolve;
public $reject;

public $lastErrorFamily;
public $lastError6;
public $lastError4;

public function __construct(LoopInterface $loop, ConnectorInterface $connector, ResolverInterface $resolver, $uri, $host, $parts)
{
$this->loop = $loop;
$this->connector = $connector;
$this->resolver = $resolver;
$this->uri = $uri;
$this->host = $host;
$this->parts = $parts;
}

public function connect()
{
$that = $this;
return new Promise\Promise(function ($resolve, $reject) use ($that) {
$lookupResolve = function ($type) use ($that, $resolve, $reject) {
return function (array $ips) use ($that, $type, $resolve, $reject) {
unset($that->resolverPromises[$type]);
$that->resolved[$type] = true;

$that->mixIpsIntoConnectQueue($ips);


if ($that->nextAttemptTimer === null && $that->connectQueue) {
$that->check($resolve, $reject);
}
};
};

$that->resolverPromises[Message::TYPE_AAAA] = $that->resolve(Message::TYPE_AAAA, $reject)->then($lookupResolve(Message::TYPE_AAAA));
$that->resolverPromises[Message::TYPE_A] = $that->resolve(Message::TYPE_A, $reject)->then(function (array $ips) use ($that) {

if ($that->resolved[Message::TYPE_AAAA] === true || !$ips) {
return $ips;
}


$deferred = new Promise\Deferred(function () use (&$ips) {

$ips = array();
});
$timer = $that->loop->addTimer($that::RESOLUTION_DELAY, function () use ($deferred, $ips) {
$deferred->resolve($ips);
});

$that->resolverPromises[Message::TYPE_AAAA]->then(function () use ($that, $timer, $deferred, &$ips) {
$that->loop->cancelTimer($timer);
$deferred->resolve($ips);
});

return $deferred->promise();
})->then($lookupResolve(Message::TYPE_A));
}, function ($_, $reject) use ($that) {
$reject(new \RuntimeException(
'Connection to ' . $that->uri . ' cancelled' . (!$that->connectionPromises ? ' during DNS lookup' : '') . ' (ECONNABORTED)',
\defined('SOCKET_ECONNABORTED') ? \SOCKET_ECONNABORTED : 103
));
$_ = $reject = null;

$that->cleanUp();
});
}









public function resolve($type, $reject)
{
$that = $this;
return $that->resolver->resolveAll($that->host, $type)->then(null, function (\Exception $e) use ($type, $reject, $that) {
unset($that->resolverPromises[$type]);
$that->resolved[$type] = true;

if ($type === Message::TYPE_A) {
$that->lastError4 = $e->getMessage();
$that->lastErrorFamily = 4;
} else {
$that->lastError6 = $e->getMessage();
$that->lastErrorFamily = 6;
}


if ($that->nextAttemptTimer !== null && !$that->connectQueue) {
$that->loop->cancelTimer($that->nextAttemptTimer);
$that->nextAttemptTimer = null;
}

if ($that->hasBeenResolved() && $that->ipsCount === 0) {
$reject(new \RuntimeException(
$that->error(),
0,
$e
));
}


return array();
});
}




public function check($resolve, $reject)
{
$ip = \array_shift($this->connectQueue);


$this->connectionPromises[] = $this->attemptConnection($ip);
\end($this->connectionPromises);
$index = \key($this->connectionPromises);

$that = $this;
$that->connectionPromises[$index]->then(function ($connection) use ($that, $index, $resolve) {
unset($that->connectionPromises[$index]);

$that->cleanUp();

$resolve($connection);
}, function (\Exception $e) use ($that, $index, $ip, $resolve, $reject) {
unset($that->connectionPromises[$index]);

$that->failureCount++;

$message = \preg_replace('/^(Connection to [^ ]+)[&?]hostname=[^ &]+/', '$1', $e->getMessage());
if (\strpos($ip, ':') === false) {
$that->lastError4 = $message;
$that->lastErrorFamily = 4;
} else {
$that->lastError6 = $message;
$that->lastErrorFamily = 6;
}


if ($that->connectQueue) {
if ($that->nextAttemptTimer !== null) {
$that->loop->cancelTimer($that->nextAttemptTimer);
$that->nextAttemptTimer = null;
}

$that->check($resolve, $reject);
}

if ($that->hasBeenResolved() === false) {
return;
}

if ($that->ipsCount === $that->failureCount) {
$that->cleanUp();

$reject(new \RuntimeException(
$that->error(),
$e->getCode(),
$e
));
}
});



if ($this->nextAttemptTimer === null && (\count($this->connectQueue) > 0 || $this->resolved[Message::TYPE_A] === false || $this->resolved[Message::TYPE_AAAA] === false)) {
$this->nextAttemptTimer = $this->loop->addTimer(self::CONNECTION_ATTEMPT_DELAY, function () use ($that, $resolve, $reject) {
$that->nextAttemptTimer = null;

if ($that->connectQueue) {
$that->check($resolve, $reject);
}
});
}
}




public function attemptConnection($ip)
{
$uri = Connector::uri($this->parts, $this->host, $ip);

return $this->connector->connect($uri);
}




public function cleanUp()
{

$this->connectQueue = array();


foreach ($this->connectionPromises as $connectionPromise) {
if ($connectionPromise instanceof PromiseInterface && \method_exists($connectionPromise, 'cancel')) {
$connectionPromise->cancel();
}
}


foreach (\array_reverse($this->resolverPromises) as $resolverPromise) {
if ($resolverPromise instanceof PromiseInterface && \method_exists($resolverPromise, 'cancel')) {
$resolverPromise->cancel();
}
}

if ($this->nextAttemptTimer instanceof TimerInterface) {
$this->loop->cancelTimer($this->nextAttemptTimer);
$this->nextAttemptTimer = null;
}
}




public function hasBeenResolved()
{
foreach ($this->resolved as $typeHasBeenResolved) {
if ($typeHasBeenResolved === false) {
return false;
}
}

return true;
}










public function mixIpsIntoConnectQueue(array $ips)
{
\shuffle($ips);
$this->ipsCount += \count($ips);
$connectQueueStash = $this->connectQueue;
$this->connectQueue = array();
while (\count($connectQueueStash) > 0 || \count($ips) > 0) {
if (\count($ips) > 0) {
$this->connectQueue[] = \array_shift($ips);
}
if (\count($connectQueueStash) > 0) {
$this->connectQueue[] = \array_shift($connectQueueStash);
}
}
}





public function error()
{
if ($this->lastError4 === $this->lastError6) {
$message = $this->lastError6;
} elseif ($this->lastErrorFamily === 6) {
$message = 'Last error for IPv6: ' . $this->lastError6 . '. Previous error for IPv4: ' . $this->lastError4;
} else {
$message = 'Last error for IPv4: ' . $this->lastError4 . '. Previous error for IPv6: ' . $this->lastError6;
}

if ($this->hasBeenResolved() && $this->ipsCount === 0) {
if ($this->lastError6 === $this->lastError4) {
$message = ' during DNS lookup: ' . $this->lastError6;
} else {
$message = ' during DNS lookup. ' . $message;
}
} else {
$message = ': ' . $message;
}

return 'Connection to ' . $this->uri . ' failed' . $message;
}
}
<?php

namespace React\Socket;

use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise\Promise;

final class TimeoutConnector implements ConnectorInterface
{
private $connector;
private $timeout;
private $loop;






public function __construct(ConnectorInterface $connector, $timeout, $loop = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #3 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->connector = $connector;
$this->timeout = $timeout;
$this->loop = $loop ?: Loop::get();
}

public function connect($uri)
{
$promise = $this->connector->connect($uri);

$loop = $this->loop;
$time = $this->timeout;
return new Promise(function ($resolve, $reject) use ($loop, $time, $promise, $uri) {
$timer = null;
$promise = $promise->then(function ($v) use (&$timer, $loop, $resolve) {
if ($timer) {
$loop->cancelTimer($timer);
}
$timer = false;
$resolve($v);
}, function ($v) use (&$timer, $loop, $reject) {
if ($timer) {
$loop->cancelTimer($timer);
}
$timer = false;
$reject($v);
});


if ($timer === false) {
return;
}


$timer = $loop->addTimer($time, function () use ($time, &$promise, $reject, $uri) {
$reject(new \RuntimeException(
'Connection to ' . $uri . ' timed out after ' . $time . ' seconds (ETIMEDOUT)',
\defined('SOCKET_ETIMEDOUT') ? \SOCKET_ETIMEDOUT : 110
));



assert(\method_exists($promise, 'cancel'));
$promise->cancel();
$promise = null;
});
}, function () use (&$promise) {


assert(\method_exists($promise, 'cancel'));
$promise->cancel();
$promise = null;
});
}
}
The MIT License (MIT)

Copyright (c) 2012 Jan Sorgalla, Christian Lück, Cees-Jan Kiewiet, Chris Boden

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.
<?php

namespace React\Promise;

use React\Promise\Internal\RejectedPromise;

/**
@template
@template-implements
*/
final class Promise implements PromiseInterface
{

private $canceller;


private $result;


private $handlers = [];


private $requiredCancelRequests = 0;


private $cancelled = false;





public function __construct(callable $resolver, ?callable $canceller = null)
{
$this->canceller = $canceller;




$cb = $resolver;
$resolver = $canceller = null;
$this->call($cb);
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface
{
if (null !== $this->result) {
return $this->result->then($onFulfilled, $onRejected);
}

if (null === $this->canceller) {
return new static($this->resolver($onFulfilled, $onRejected));
}






$parent = $this;
++$parent->requiredCancelRequests;

return new static(
$this->resolver($onFulfilled, $onRejected),
static function () use (&$parent): void {
assert($parent instanceof self);
--$parent->requiredCancelRequests;

if ($parent->requiredCancelRequests <= 0) {
$parent->cancel();
}

$parent = null;
}
);
}

/**
@template
@template


*/
public function catch(callable $onRejected): PromiseInterface
{
return $this->then(null, static function (\Throwable $reason) use ($onRejected) {
if (!_checkTypehint($onRejected, $reason)) {
return new RejectedPromise($reason);
}




return $onRejected($reason);
});
}

public function finally(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->then(static function ($value) use ($onFulfilledOrRejected): PromiseInterface {

return resolve($onFulfilledOrRejected())->then(function () use ($value) {
return $value;
});
}, static function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface {
return resolve($onFulfilledOrRejected())->then(function () use ($reason): RejectedPromise {
return new RejectedPromise($reason);
});
});
}

public function cancel(): void
{
$this->cancelled = true;
$canceller = $this->canceller;
$this->canceller = null;

$parentCanceller = null;

if (null !== $this->result) {

if ($this->result instanceof RejectedPromise) {
$this->result->cancel();
}



$root = $this->unwrap($this->result);



if (!$root instanceof self || null !== $root->result) {
return;
}

$root->requiredCancelRequests--;

if ($root->requiredCancelRequests <= 0) {
$parentCanceller = [$root, 'cancel'];
}
}

if (null !== $canceller) {
$this->call($canceller);
}


if ($parentCanceller) {
$parentCanceller();
}
}





public function otherwise(callable $onRejected): PromiseInterface
{
return $this->catch($onRejected);
}





public function always(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->finally($onFulfilledOrRejected);
}

private function resolver(?callable $onFulfilled = null, ?callable $onRejected = null): callable
{
return function (callable $resolve, callable $reject) use ($onFulfilled, $onRejected): void {
$this->handlers[] = static function (PromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject): void {
$promise = $promise->then($onFulfilled, $onRejected);

if ($promise instanceof self && $promise->result === null) {
$promise->handlers[] = static function (PromiseInterface $promise) use ($resolve, $reject): void {
$promise->then($resolve, $reject);
};
} else {
$promise->then($resolve, $reject);
}
};
};
}

private function reject(\Throwable $reason): void
{
if (null !== $this->result) {
return;
}

$this->settle(reject($reason));
}




private function settle(PromiseInterface $result): void
{
$result = $this->unwrap($result);

if ($result === $this) {
$result = new RejectedPromise(
new \LogicException('Cannot resolve a promise with itself.')
);
}

if ($result instanceof self) {
$result->requiredCancelRequests++;
} else {

$this->canceller = null;
}

$handlers = $this->handlers;

$this->handlers = [];
$this->result = $result;

foreach ($handlers as $handler) {
$handler($result);
}


if ($this->cancelled && $result instanceof RejectedPromise) {
$result->cancel();
}
}





private function unwrap(PromiseInterface $promise): PromiseInterface
{
while ($promise instanceof self && null !== $promise->result) {

$promise = $promise->result;
}

return $promise;
}




private function call(callable $cb): void
{


$callback = $cb;
$cb = null;






if (\is_array($callback)) {
$ref = new \ReflectionMethod($callback[0], $callback[1]);
} elseif (\is_object($callback) && !$callback instanceof \Closure) {
$ref = new \ReflectionMethod($callback, '__invoke');
} else {
assert($callback instanceof \Closure || \is_string($callback));
$ref = new \ReflectionFunction($callback);
}
$args = $ref->getNumberOfParameters();

try {
if ($args === 0) {
$callback();
} else {








$target =& $this;

$callback(
static function ($value) use (&$target): void {
if ($target !== null) {
$target->settle(resolve($value));
$target = null;
}
},
static function (\Throwable $reason) use (&$target): void {
if ($target !== null) {
$target->reject($reason);
$target = null;
}
}
);
}
} catch (\Throwable $e) {
$target = null;
$this->reject($e);
}
}
}
<?php

if (!\function_exists('React\Promise\resolve')) {
require __DIR__.'/functions.php';
}
<?php

namespace React\Promise\Internal;

use React\Promise\PromiseInterface;
use function React\Promise\resolve;

/**
@template
@template-implements


*/
final class FulfilledPromise implements PromiseInterface
{

private $value;





public function __construct($value = null)
{
if ($value instanceof PromiseInterface) {
throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.');
}

$this->value = $value;
}

/**
@template


*/
public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface
{
if (null === $onFulfilled) {
return $this;
}

try {



$result = $onFulfilled($this->value);
return resolve($result);
} catch (\Throwable $exception) {
return new RejectedPromise($exception);
}
}

public function catch(callable $onRejected): PromiseInterface
{
return $this;
}

public function finally(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->then(function ($value) use ($onFulfilledOrRejected): PromiseInterface {

return resolve($onFulfilledOrRejected())->then(function () use ($value) {
return $value;
});
});
}

public function cancel(): void
{
}





public function otherwise(callable $onRejected): PromiseInterface
{
return $this->catch($onRejected);
}





public function always(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->finally($onFulfilledOrRejected);
}
}
<?php

namespace React\Promise\Internal;

use React\Promise\PromiseInterface;
use function React\Promise\_checkTypehint;
use function React\Promise\resolve;
use function React\Promise\set_rejection_handler;

/**
@template-implements


*/
final class RejectedPromise implements PromiseInterface
{

private $reason;


private $handled = false;




public function __construct(\Throwable $reason)
{
$this->reason = $reason;
}


public function __destruct()
{
if ($this->handled) {
return;
}

$handler = set_rejection_handler(null);
if ($handler === null) {
$message = 'Unhandled promise rejection with ' . $this->reason;

\error_log($message);
return;
}

try {
$handler($this->reason);
} catch (\Throwable $e) {
\preg_match('/^([^:\s]++)(.*+)$/sm', (string) $e, $match);
\assert(isset($match[1], $match[2]));
$message = 'Fatal error: Uncaught ' . $match[1] . ' from unhandled promise rejection handler' . $match[2];

\error_log($message);
exit(255);
}
}

/**
@template



*/
public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface
{
if (null === $onRejected) {
return $this;
}

$this->handled = true;

try {
return resolve($onRejected($this->reason));
} catch (\Throwable $exception) {
return new RejectedPromise($exception);
}
}

/**
@template
@template


*/
public function catch(callable $onRejected): PromiseInterface
{
if (!_checkTypehint($onRejected, $this->reason)) {
return $this;
}




return $this->then(null, $onRejected);
}

public function finally(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->then(null, function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface {
return resolve($onFulfilledOrRejected())->then(function () use ($reason): PromiseInterface {
return new RejectedPromise($reason);
});
});
}

public function cancel(): void
{
$this->handled = true;
}





public function otherwise(callable $onRejected): PromiseInterface
{
return $this->catch($onRejected);
}





public function always(callable $onFulfilledOrRejected): PromiseInterface
{
return $this->finally($onFulfilledOrRejected);
}
}
<?php

namespace React\Promise\Internal;




final class CancellationQueue
{

private $started = false;


private $queue = [];

public function __invoke(): void
{
if ($this->started) {
return;
}

$this->started = true;
$this->drain();
}




public function enqueue($cancellable): void
{
if (!\is_object($cancellable) || !\method_exists($cancellable, 'then') || !\method_exists($cancellable, 'cancel')) {
return;
}

$length = \array_push($this->queue, $cancellable);

if ($this->started && 1 === $length) {
$this->drain();
}
}

private function drain(): void
{
for ($i = \key($this->queue); isset($this->queue[$i]); $i++) {
$cancellable = $this->queue[$i];
assert(\method_exists($cancellable, 'cancel'));

$exception = null;

try {
$cancellable->cancel();
} catch (\Throwable $exception) {
}

unset($this->queue[$i]);

if ($exception) {
throw $exception;
}
}

$this->queue = [];
}
}
<?php

namespace React\Promise;

use React\Promise\Exception\CompositeException;
use React\Promise\Internal\FulfilledPromise;
use React\Promise\Internal\RejectedPromise;

/**
@template












*/
function resolve($promiseOrValue): PromiseInterface
{
if ($promiseOrValue instanceof PromiseInterface) {
return $promiseOrValue;
}

if (\is_object($promiseOrValue) && \method_exists($promiseOrValue, 'then')) {
$canceller = null;

if (\method_exists($promiseOrValue, 'cancel')) {
$canceller = [$promiseOrValue, 'cancel'];
assert(\is_callable($canceller));
}


return new Promise(function (callable $resolve, callable $reject) use ($promiseOrValue): void {
$promiseOrValue->then($resolve, $reject);
}, $canceller);
}

return new FulfilledPromise($promiseOrValue);
}
















function reject(\Throwable $reason): PromiseInterface
{
return new RejectedPromise($reason);
}

/**
@template







*/
function all(iterable $promisesOrValues): PromiseInterface
{
$cancellationQueue = new Internal\CancellationQueue();


return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {
$toResolve = 0;

$continue = true;
$values = [];

foreach ($promisesOrValues as $i => $promiseOrValue) {
$cancellationQueue->enqueue($promiseOrValue);
$values[$i] = null;
++$toResolve;

resolve($promiseOrValue)->then(
function ($value) use ($i, &$values, &$toResolve, &$continue, $resolve): void {
$values[$i] = $value;

if (0 === --$toResolve && !$continue) {
$resolve($values);
}
},
function (\Throwable $reason) use (&$continue, $reject): void {
$continue = false;
$reject($reason);
}
);

if (!$continue && !\is_array($promisesOrValues)) {
break;
}
}

$continue = false;
if ($toResolve === 0) {
$resolve($values);
}
}, $cancellationQueue);
}

/**
@template








*/
function race(iterable $promisesOrValues): PromiseInterface
{
$cancellationQueue = new Internal\CancellationQueue();


return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {
$continue = true;

foreach ($promisesOrValues as $promiseOrValue) {
$cancellationQueue->enqueue($promiseOrValue);

resolve($promiseOrValue)->then($resolve, $reject)->finally(function () use (&$continue): void {
$continue = false;
});

if (!$continue && !\is_array($promisesOrValues)) {
break;
}
}
}, $cancellationQueue);
}

/**
@template












*/
function any(iterable $promisesOrValues): PromiseInterface
{
$cancellationQueue = new Internal\CancellationQueue();


return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void {
$toReject = 0;
$continue = true;
$reasons = [];

foreach ($promisesOrValues as $i => $promiseOrValue) {
$cancellationQueue->enqueue($promiseOrValue);
++$toReject;

resolve($promiseOrValue)->then(
function ($value) use ($resolve, &$continue): void {
$continue = false;
$resolve($value);
},
function (\Throwable $reason) use ($i, &$reasons, &$toReject, $reject, &$continue): void {
$reasons[$i] = $reason;

if (0 === --$toReject && !$continue) {
$reject(new CompositeException(
$reasons,
'All promises rejected.'
));
}
}
);

if (!$continue && !\is_array($promisesOrValues)) {
break;
}
}

$continue = false;
if ($toReject === 0 && !$reasons) {
$reject(new Exception\LengthException(
'Must contain at least 1 item but contains only 0 items.'
));
} elseif ($toReject === 0) {
$reject(new CompositeException(
$reasons,
'All promises rejected.'
));
}
}, $cancellationQueue);
}







































function set_rejection_handler(?callable $callback): ?callable
{
static $current = null;
$previous = $current;
$current = $callback;

return $previous;
}




function _checkTypehint(callable $callback, \Throwable $reason): bool
{
if (\is_array($callback)) {
$callbackReflection = new \ReflectionMethod($callback[0], $callback[1]);
} elseif (\is_object($callback) && !$callback instanceof \Closure) {
$callbackReflection = new \ReflectionMethod($callback, '__invoke');
} else {
assert($callback instanceof \Closure || \is_string($callback));
$callbackReflection = new \ReflectionFunction($callback);
}

$parameters = $callbackReflection->getParameters();

if (!isset($parameters[0])) {
return true;
}

$expectedException = $parameters[0];


$type = $expectedException->getType();

$isTypeUnion = true;
$types = [];

switch (true) {
case $type === null:
break;
case $type instanceof \ReflectionNamedType:
$types = [$type];
break;
case $type instanceof \ReflectionIntersectionType:
$isTypeUnion = false;
case $type instanceof \ReflectionUnionType:
$types = $type->getTypes();
break;
default:
throw new \LogicException('Unexpected return value of ReflectionParameter::getType');
}


if (empty($types)) {
return true;
}

foreach ($types as $type) {

if ($type instanceof \ReflectionIntersectionType) {
foreach ($type->getTypes() as $typeToMatch) {
assert($typeToMatch instanceof \ReflectionNamedType);
$name = $typeToMatch->getName();
if (!($matches = (!$typeToMatch->isBuiltin() && $reason instanceof $name))) {
break;
}
}
assert(isset($matches));
} else {
assert($type instanceof \ReflectionNamedType);
$name = $type->getName();
$matches = !$type->isBuiltin() && $reason instanceof $name;
}



if ($matches) {
if ($isTypeUnion) {
return true;
}
} else {
if (!$isTypeUnion) {
return false;
}
}
}



return $isTypeUnion ? false : true;
}
<?php

namespace React\Promise;

/**
@template
*/
final class Deferred
{



private $promise;


private $resolveCallback;


private $rejectCallback;




public function __construct(?callable $canceller = null)
{
$this->promise = new Promise(function ($resolve, $reject): void {
$this->resolveCallback = $resolve;
$this->rejectCallback = $reject;
}, $canceller);
}




public function promise(): PromiseInterface
{
return $this->promise;
}




public function resolve($value): void
{
($this->resolveCallback)($value);
}

public function reject(\Throwable $reason): void
{
($this->rejectCallback)($reason);
}
}
<?php

namespace React\Promise\Exception;

class LengthException extends \LengthException
{
}
<?php

namespace React\Promise\Exception;








class CompositeException extends \Exception
{

private $throwables;


public function __construct(array $throwables, string $message = '', int $code = 0, ?\Throwable $previous = null)
{
parent::__construct($message, $code, $previous);

$this->throwables = $throwables;
}




public function getThrowables(): array
{
return $this->throwables;
}
}
<?php

namespace React\Promise;

/**
@template-covariant
*/
interface PromiseInterface
{
/**
@template
@template


























*/
public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface;

/**
@template
@template











*/
public function catch(callable $onRejected): PromiseInterface;














































public function finally(callable $onFulfilledOrRejected): PromiseInterface;










public function cancel(): void;

/**
@template
@template













*/
public function otherwise(callable $onRejected): PromiseInterface;
















public function always(callable $onFulfilledOrRejected): PromiseInterface;
}
The MIT License (MIT)

Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler

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.
<?php

namespace React\Cache;

use React\Promise\PromiseInterface;

interface CacheInterface
{






















public function get($key, $default = null);













































public function set($key, $value, $ttl = null);




















public function delete($key);


























public function getMultiple(array $keys, $default = null);

























public function setMultiple(array $values, $ttl = null);







public function deleteMultiple(array $keys);






public function clear();


























public function has($key);
}
<?php

namespace React\Cache;

use React\Promise;
use React\Promise\PromiseInterface;

class ArrayCache implements CacheInterface
{
private $limit;
private $data = array();
private $expires = array();
private $supportsHighResolution;






































public function __construct($limit = null)
{
$this->limit = $limit;


$this->supportsHighResolution = \function_exists('hrtime');
}

public function get($key, $default = null)
{

if (isset($this->expires[$key]) && $this->now() - $this->expires[$key] > 0) {
unset($this->data[$key], $this->expires[$key]);
}

if (!\array_key_exists($key, $this->data)) {
return Promise\resolve($default);
}


$value = $this->data[$key];
unset($this->data[$key]);
$this->data[$key] = $value;

return Promise\resolve($value);
}

public function set($key, $value, $ttl = null)
{

unset($this->data[$key]);
$this->data[$key] = $value;


unset($this->expires[$key]);
if ($ttl !== null) {
$this->expires[$key] = $this->now() + $ttl;
\asort($this->expires);
}


if ($this->limit !== null && \count($this->data) > $this->limit) {


\reset($this->expires);
$key = \key($this->expires);



if ($key === null || $this->now() - $this->expires[$key] < 0) {
\reset($this->data);
$key = \key($this->data);
}
unset($this->data[$key], $this->expires[$key]);
}

return Promise\resolve(true);
}

public function delete($key)
{
unset($this->data[$key], $this->expires[$key]);

return Promise\resolve(true);
}

public function getMultiple(array $keys, $default = null)
{
$values = array();

foreach ($keys as $key) {
$values[$key] = $this->get($key, $default);
}

return Promise\all($values);
}

public function setMultiple(array $values, $ttl = null)
{
foreach ($values as $key => $value) {
$this->set($key, $value, $ttl);
}

return Promise\resolve(true);
}

public function deleteMultiple(array $keys)
{
foreach ($keys as $key) {
unset($this->data[$key], $this->expires[$key]);
}

return Promise\resolve(true);
}

public function clear()
{
$this->data = array();
$this->expires = array();

return Promise\resolve(true);
}

public function has($key)
{

if (isset($this->expires[$key]) && $this->now() - $this->expires[$key] > 0) {
unset($this->data[$key], $this->expires[$key]);
}

if (!\array_key_exists($key, $this->data)) {
return Promise\resolve(false);
}


$value = $this->data[$key];
unset($this->data[$key]);
$this->data[$key] = $value;

return Promise\resolve(true);
}




private function now()
{
return $this->supportsHighResolution ? \hrtime(true) * 1e-9 : \microtime(true);
}
}
The MIT License (MIT)

Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler

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.
<?php

namespace React\Stream;

use Evenement\EventEmitterInterface;








































































































































interface WritableStreamInterface extends EventEmitterInterface
{





























public function isWritable();
















































public function write($data);








































































public function end($data = null);


















































public function close();
}
<?php

namespace React\Stream;

use Evenement\EventEmitterInterface;































































































































































interface ReadableStreamInterface extends EventEmitterInterface
{






























public function isReadable();































public function pause();




















public function resume();










































































public function pipe(WritableStreamInterface $dest, array $options = array());



































public function close();
}
<?php

namespace React\Stream;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;

final class WritableResourceStream extends EventEmitter implements WritableStreamInterface
{
private $stream;


private $loop;




private $softLimit;




private $writeChunkSize;

private $listening = false;
private $writable = true;
private $closed = false;
private $data = '';







public function __construct($stream, $loop = null, $writeBufferSoftLimit = null, $writeChunkSize = null)
{
if (!\is_resource($stream) || \get_resource_type($stream) !== "stream") {
throw new \InvalidArgumentException('First parameter must be a valid stream resource');
}


$meta = \stream_get_meta_data($stream);
if (isset($meta['mode']) && $meta['mode'] !== '' && \strtr($meta['mode'], 'waxc+', '.....') === $meta['mode']) {
throw new \InvalidArgumentException('Given stream resource is not opened in write mode');
}



if (\stream_set_blocking($stream, false) !== true) {
throw new \RuntimeException('Unable to set stream resource to non-blocking mode');
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->stream = $stream;
$this->loop = $loop ?: Loop::get();
$this->softLimit = ($writeBufferSoftLimit === null) ? 65536 : (int)$writeBufferSoftLimit;
$this->writeChunkSize = ($writeChunkSize === null) ? -1 : (int)$writeChunkSize;
}

public function isWritable()
{
return $this->writable;
}

public function write($data)
{
if (!$this->writable) {
return false;
}

$this->data .= $data;

if (!$this->listening && $this->data !== '') {
$this->listening = true;

$this->loop->addWriteStream($this->stream, array($this, 'handleWrite'));
}

return !isset($this->data[$this->softLimit - 1]);
}

public function end($data = null)
{
if (null !== $data) {
$this->write($data);
}

$this->writable = false;



if ($this->data === '') {
$this->close();
}
}

public function close()
{
if ($this->closed) {
return;
}

if ($this->listening) {
$this->listening = false;
$this->loop->removeWriteStream($this->stream);
}

$this->closed = true;
$this->writable = false;
$this->data = '';

$this->emit('close');
$this->removeAllListeners();

if (\is_resource($this->stream)) {
\fclose($this->stream);
}
}


public function handleWrite()
{
$error = null;
\set_error_handler(function ($_, $errstr) use (&$error) {
$error = $errstr;
});

if ($this->writeChunkSize === -1) {
$sent = \fwrite($this->stream, $this->data);
} else {
$sent = \fwrite($this->stream, $this->data, $this->writeChunkSize);
}

\restore_error_handler();









if (($sent === 0 || $sent === false) && $error !== null) {
$this->emit('error', array(new \RuntimeException('Unable to write to stream: ' . $error)));
$this->close();

return;
}

$exceeded = isset($this->data[$this->softLimit - 1]);
$this->data = (string) \substr($this->data, $sent);


if ($exceeded && !isset($this->data[$this->softLimit - 1])) {
$this->emit('drain');
}


if ($this->data === '') {

if ($this->listening) {
$this->loop->removeWriteStream($this->stream);
$this->listening = false;
}


if (!$this->writable) {
$this->close();
}
}
}
}
<?php

namespace React\Stream;

use Evenement\EventEmitter;
use InvalidArgumentException;





































































final class ThroughStream extends EventEmitter implements DuplexStreamInterface
{
private $readable = true;
private $writable = true;
private $closed = false;
private $paused = false;
private $drain = false;
private $callback;

public function __construct($callback = null)
{
if ($callback !== null && !\is_callable($callback)) {
throw new InvalidArgumentException('Invalid transformation callback given');
}

$this->callback = $callback;
}

public function pause()
{

$this->paused = $this->readable;
}

public function resume()
{
$this->paused = false;


if ($this->drain) {
$this->drain = false;
$this->emit('drain');
}
}

public function pipe(WritableStreamInterface $dest, array $options = array())
{
return Util::pipe($this, $dest, $options);
}

public function isReadable()
{
return $this->readable;
}

public function isWritable()
{
return $this->writable;
}

public function write($data)
{
if (!$this->writable) {
return false;
}

if ($this->callback !== null) {
try {
$data = \call_user_func($this->callback, $data);
} catch (\Exception $e) {
$this->emit('error', array($e));
$this->close();

return false;
}
}

$this->emit('data', array($data));


if ($this->paused) {
$this->drain = true;
}


return $this->writable && !$this->paused;
}

public function end($data = null)
{
if (!$this->writable) {
return;
}

if (null !== $data) {
$this->write($data);


if (!$this->writable) {
return;
}
}

$this->readable = false;
$this->writable = false;
$this->paused = false;
$this->drain = false;

$this->emit('end');
$this->close();
}

public function close()
{
if ($this->closed) {
return;
}

$this->readable = false;
$this->writable = false;
$this->paused = false;
$this->drain = false;

$this->closed = true;
$this->callback = null;

$this->emit('close');
$this->removeAllListeners();
}
}
<?php

namespace React\Stream;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use InvalidArgumentException;

final class ReadableResourceStream extends EventEmitter implements ReadableStreamInterface
{



private $stream;


private $loop;



















private $bufferSize;

private $closed = false;
private $listening = false;






public function __construct($stream, $loop = null, $readChunkSize = null)
{
if (!\is_resource($stream) || \get_resource_type($stream) !== "stream") {
throw new InvalidArgumentException('First parameter must be a valid stream resource');
}


$meta = \stream_get_meta_data($stream);
if (isset($meta['mode']) && $meta['mode'] !== '' && \strpos($meta['mode'], 'r') === \strpos($meta['mode'], '+')) {
throw new InvalidArgumentException('Given stream resource is not opened in read mode');
}



if (\stream_set_blocking($stream, false) !== true) {
throw new \RuntimeException('Unable to set stream resource to non-blocking mode');
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}









if (\function_exists('stream_set_read_buffer') && !$this->isLegacyPipe($stream)) {
\stream_set_read_buffer($stream, 0);
}

$this->stream = $stream;
$this->loop = $loop ?: Loop::get();
$this->bufferSize = ($readChunkSize === null) ? 65536 : (int)$readChunkSize;

$this->resume();
}

public function isReadable()
{
return !$this->closed;
}

public function pause()
{
if ($this->listening) {
$this->loop->removeReadStream($this->stream);
$this->listening = false;
}
}

public function resume()
{
if (!$this->listening && !$this->closed) {
$this->loop->addReadStream($this->stream, array($this, 'handleData'));
$this->listening = true;
}
}

public function pipe(WritableStreamInterface $dest, array $options = array())
{
return Util::pipe($this, $dest, $options);
}

public function close()
{
if ($this->closed) {
return;
}

$this->closed = true;

$this->emit('close');
$this->pause();
$this->removeAllListeners();

if (\is_resource($this->stream)) {
\fclose($this->stream);
}
}


public function handleData()
{
$error = null;
\set_error_handler(function ($errno, $errstr, $errfile, $errline) use (&$error) {
$error = new \ErrorException(
$errstr,
0,
$errno,
$errfile,
$errline
);
});

$data = \stream_get_contents($this->stream, $this->bufferSize);

\restore_error_handler();

if ($error !== null) {
$this->emit('error', array(new \RuntimeException('Unable to read from stream: ' . $error->getMessage(), 0, $error)));
$this->close();
return;
}

if ($data !== '') {
$this->emit('data', array($data));
} elseif (\feof($this->stream)) {

$this->emit('end');
$this->close();
}
}













private function isLegacyPipe($resource)
{
if (\PHP_VERSION_ID < 50428 || (\PHP_VERSION_ID >= 50500 && \PHP_VERSION_ID < 50512)) {
$meta = \stream_get_meta_data($resource);

if (isset($meta['stream_type']) && $meta['stream_type'] === 'STDIO') {
return true;
}
}
return false;
}
}
<?php

namespace React\Stream;

use Evenement\EventEmitter;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use InvalidArgumentException;

final class DuplexResourceStream extends EventEmitter implements DuplexStreamInterface
{
private $stream;


private $loop;

















private $bufferSize;
private $buffer;

private $readable = true;
private $writable = true;
private $closing = false;
private $listening = false;







public function __construct($stream, $loop = null, $readChunkSize = null, $buffer = null)
{
if (!\is_resource($stream) || \get_resource_type($stream) !== "stream") {
throw new InvalidArgumentException('First parameter must be a valid stream resource');
}


$meta = \stream_get_meta_data($stream);
if (isset($meta['mode']) && $meta['mode'] !== '' && \strpos($meta['mode'], '+') === false) {
throw new InvalidArgumentException('Given stream resource is not opened in read and write mode');
}



if ($buffer !== null && !$buffer instanceof WritableResourceStream && \stream_set_blocking($stream, false) !== true) {
throw new \RuntimeException('Unable to set stream resource to non-blocking mode');
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}
if ($buffer !== null && !$buffer instanceof WritableStreamInterface) { 
throw new \InvalidArgumentException('Argument #4 ($buffer) expected null|React\Stream\WritableStreamInterface');
}









if (\function_exists('stream_set_read_buffer') && !$this->isLegacyPipe($stream)) {
\stream_set_read_buffer($stream, 0);
}

if ($buffer === null) {
$buffer = new WritableResourceStream($stream, $loop);
}

$this->stream = $stream;
$this->loop = $loop ?: Loop::get();
$this->bufferSize = ($readChunkSize === null) ? 65536 : (int)$readChunkSize;
$this->buffer = $buffer;

$that = $this;

$this->buffer->on('error', function ($error) use ($that) {
$that->emit('error', array($error));
});

$this->buffer->on('close', array($this, 'close'));

$this->buffer->on('drain', function () use ($that) {
$that->emit('drain');
});

$this->resume();
}

public function isReadable()
{
return $this->readable;
}

public function isWritable()
{
return $this->writable;
}

public function pause()
{
if ($this->listening) {
$this->loop->removeReadStream($this->stream);
$this->listening = false;
}
}

public function resume()
{
if (!$this->listening && $this->readable) {
$this->loop->addReadStream($this->stream, array($this, 'handleData'));
$this->listening = true;
}
}

public function write($data)
{
if (!$this->writable) {
return false;
}

return $this->buffer->write($data);
}

public function close()
{
if (!$this->writable && !$this->closing) {
return;
}

$this->closing = false;

$this->readable = false;
$this->writable = false;

$this->emit('close');
$this->pause();
$this->buffer->close();
$this->removeAllListeners();

if (\is_resource($this->stream)) {
\fclose($this->stream);
}
}

public function end($data = null)
{
if (!$this->writable) {
return;
}

$this->closing = true;

$this->readable = false;
$this->writable = false;
$this->pause();

$this->buffer->end($data);
}

public function pipe(WritableStreamInterface $dest, array $options = array())
{
return Util::pipe($this, $dest, $options);
}


public function handleData($stream)
{
$error = null;
\set_error_handler(function ($errno, $errstr, $errfile, $errline) use (&$error) {
$error = new \ErrorException(
$errstr,
0,
$errno,
$errfile,
$errline
);
});

$data = \stream_get_contents($stream, $this->bufferSize);

\restore_error_handler();

if ($error !== null) {
$this->emit('error', array(new \RuntimeException('Unable to read from stream: ' . $error->getMessage(), 0, $error)));
$this->close();
return;
}

if ($data !== '') {
$this->emit('data', array($data));
} elseif (\feof($this->stream)) {

$this->emit('end');
$this->close();
}
}













private function isLegacyPipe($resource)
{
if (\PHP_VERSION_ID < 50428 || (\PHP_VERSION_ID >= 50500 && \PHP_VERSION_ID < 50512)) {
$meta = \stream_get_meta_data($resource);

if (isset($meta['stream_type']) && $meta['stream_type'] === 'STDIO') {
return true;
}
}
return false;
}
}
<?php

namespace React\Stream;

































interface DuplexStreamInterface extends ReadableStreamInterface, WritableStreamInterface
{
}
<?php

namespace React\Stream;

use Evenement\EventEmitter;

final class CompositeStream extends EventEmitter implements DuplexStreamInterface
{
private $readable;
private $writable;
private $closed = false;

public function __construct(ReadableStreamInterface $readable, WritableStreamInterface $writable)
{
$this->readable = $readable;
$this->writable = $writable;

if (!$readable->isReadable() || !$writable->isWritable()) {
$this->close();
return;
}

Util::forwardEvents($this->readable, $this, array('data', 'end', 'error'));
Util::forwardEvents($this->writable, $this, array('drain', 'error', 'pipe'));

$this->readable->on('close', array($this, 'close'));
$this->writable->on('close', array($this, 'close'));
}

public function isReadable()
{
return $this->readable->isReadable();
}

public function pause()
{
$this->readable->pause();
}

public function resume()
{
if (!$this->writable->isWritable()) {
return;
}

$this->readable->resume();
}

public function pipe(WritableStreamInterface $dest, array $options = array())
{
return Util::pipe($this, $dest, $options);
}

public function isWritable()
{
return $this->writable->isWritable();
}

public function write($data)
{
return $this->writable->write($data);
}

public function end($data = null)
{
$this->readable->pause();
$this->writable->end($data);
}

public function close()
{
if ($this->closed) {
return;
}

$this->closed = true;
$this->readable->close();
$this->writable->close();

$this->emit('close');
$this->removeAllListeners();
}
}
<?php

namespace React\Stream;

final class Util
{









public static function pipe(ReadableStreamInterface $source, WritableStreamInterface $dest, array $options = array())
{

if (!$source->isReadable()) {
return $dest;
}


if (!$dest->isWritable()) {
$source->pause();

return $dest;
}

$dest->emit('pipe', array($source));


$source->on('data', $dataer = function ($data) use ($source, $dest) {
$feedMore = $dest->write($data);

if (false === $feedMore) {
$source->pause();
}
});
$dest->on('close', function () use ($source, $dataer) {
$source->removeListener('data', $dataer);
$source->pause();
});


$dest->on('drain', $drainer = function () use ($source) {
$source->resume();
});
$source->on('close', function () use ($dest, $drainer) {
$dest->removeListener('drain', $drainer);
});


$end = isset($options['end']) ? $options['end'] : true;
if ($end) {
$source->on('end', $ender = function () use ($dest) {
$dest->end();
});
$dest->on('close', function () use ($source, $ender) {
$source->removeListener('end', $ender);
});
}

return $dest;
}

public static function forwardEvents($source, $target, array $events)
{
foreach ($events as $event) {
$source->on($event, function () use ($event, $target) {
$target->emit($event, \func_get_args());
});
}
}
}
The MIT License (MIT)

Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler

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.
<?php

namespace React\Dns\Query;

use React\Dns\Model\Message;
use React\Dns\Protocol\BinaryDumper;
use React\Dns\Protocol\Parser;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise\Deferred;








































































final class UdpTransportExecutor implements ExecutorInterface
{
private $nameserver;
private $loop;
private $parser;
private $dumper;






private $maxPacketSize = 512;





public function __construct($nameserver, $loop = null)
{
if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) {

$nameserver = '[' . $nameserver . ']';
}

$parts = \parse_url((\strpos($nameserver, '://') === false ? 'udp://' : '') . $nameserver);
if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'udp' || @\inet_pton(\trim($parts['host'], '[]')) === false) {
throw new \InvalidArgumentException('Invalid nameserver address given');
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->nameserver = 'udp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53);
$this->loop = $loop ?: Loop::get();
$this->parser = new Parser();
$this->dumper = new BinaryDumper();
}

public function query(Query $query)
{
$request = Message::createRequestForQuery($query);

$queryData = $this->dumper->toBinary($request);
if (isset($queryData[$this->maxPacketSize])) {
return \React\Promise\reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport',
\defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90
));
}


$errno = 0;
$errstr = '';
$socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0);
if ($socket === false) {
return \React\Promise\reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')',
$errno
));
}


\stream_set_blocking($socket, false);

\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {




\preg_match('/errno=(\d+) (.+)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error;
});

$written = \fwrite($socket, $queryData);

\restore_error_handler();

if ($written !== \strlen($queryData)) {
return \React\Promise\reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')',
$errno
));
}

$loop = $this->loop;
$deferred = new Deferred(function () use ($loop, $socket, $query) {

$loop->removeReadStream($socket);
\fclose($socket);

throw new CancellationException('DNS query for ' . $query->describe() . ' has been cancelled');
});

$max = $this->maxPacketSize;
$parser = $this->parser;
$nameserver = $this->nameserver;
$loop->addReadStream($socket, function ($socket) use ($loop, $deferred, $query, $parser, $request, $max, $nameserver) {


$data = @\fread($socket, $max);
if ($data === false) {
return;
}

try {
$response = $parser->parseMessage($data);
} catch (\Exception $e) {


return;
}



if ($response->id !== $request->id) {
return;
}


$loop->removeReadStream($socket);
\fclose($socket);

if ($response->tc) {
$deferred->reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: The DNS server ' . $nameserver . ' returned a truncated result for a UDP query',
\defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90
));
return;
}

$deferred->resolve($response);
});

return $deferred->promise();
}
}
<?php

namespace React\Dns\Query;

use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise\Promise;

final class TimeoutExecutor implements ExecutorInterface
{
private $executor;
private $loop;
private $timeout;






public function __construct(ExecutorInterface $executor, $timeout, $loop = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #3 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->executor = $executor;
$this->loop = $loop ?: Loop::get();
$this->timeout = $timeout;
}

public function query(Query $query)
{
$promise = $this->executor->query($query);

$loop = $this->loop;
$time = $this->timeout;
return new Promise(function ($resolve, $reject) use ($loop, $time, $promise, $query) {
$timer = null;
$promise = $promise->then(function ($v) use (&$timer, $loop, $resolve) {
if ($timer) {
$loop->cancelTimer($timer);
}
$timer = false;
$resolve($v);
}, function ($v) use (&$timer, $loop, $reject) {
if ($timer) {
$loop->cancelTimer($timer);
}
$timer = false;
$reject($v);
});


if ($timer === false) {
return;
}


$timer = $loop->addTimer($time, function () use ($time, &$promise, $reject, $query) {
$reject(new TimeoutException(
'DNS query for ' . $query->describe() . ' timed out'
));



assert(\method_exists($promise, 'cancel'));
$promise->cancel();
$promise = null;
});
}, function () use (&$promise) {


assert(\method_exists($promise, 'cancel'));
$promise->cancel();
$promise = null;
});
}
}
<?php

namespace React\Dns\Query;

use React\Cache\CacheInterface;
use React\Dns\Model\Message;
use React\Promise\Promise;

final class CachingExecutor implements ExecutorInterface
{





const TTL = 60;

private $executor;
private $cache;

public function __construct(ExecutorInterface $executor, CacheInterface $cache)
{
$this->executor = $executor;
$this->cache = $cache;
}

public function query(Query $query)
{
$id = $query->name . ':' . $query->type . ':' . $query->class;
$cache = $this->cache;
$that = $this;
$executor = $this->executor;

$pending = $cache->get($id);
return new Promise(function ($resolve, $reject) use ($query, $id, $cache, $executor, &$pending, $that) {
$pending->then(
function ($message) use ($query, $id, $cache, $executor, &$pending, $that) {

if ($message !== null) {
return $message;
}


return $pending = $executor->query($query)->then(
function (Message $message) use ($cache, $id, $that) {

if (!$message->tc) {
$cache->set($id, $message, $that->ttl($message));
}

return $message;
}
);
}
)->then($resolve, function ($e) use ($reject, &$pending) {
$reject($e);
$pending = null;
});
}, function ($_, $reject) use (&$pending, $query) {
$reject(new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled'));
$pending->cancel();
$pending = null;
});
}






public function ttl(Message $message)
{


$ttl = null;
foreach ($message->answers as $answer) {
if ($ttl === null || $answer->ttl < $ttl) {
$ttl = $answer->ttl;
}
}

if ($ttl === null) {
$ttl = self::TTL;
}

return $ttl;
}
}
<?php

namespace React\Dns\Query;

final class TimeoutException extends \Exception
{
}
<?php

namespace React\Dns\Query;

use React\Dns\Config\HostsFile;
use React\Dns\Model\Message;
use React\Dns\Model\Record;
use React\Promise;








final class HostsFileExecutor implements ExecutorInterface
{
private $hosts;
private $fallback;

public function __construct(HostsFile $hosts, ExecutorInterface $fallback)
{
$this->hosts = $hosts;
$this->fallback = $fallback;
}

public function query(Query $query)
{
if ($query->class === Message::CLASS_IN && ($query->type === Message::TYPE_A || $query->type === Message::TYPE_AAAA)) {

$records = array();
$expectsColon = $query->type === Message::TYPE_AAAA;
foreach ($this->hosts->getIpsForHost($query->name) as $ip) {

if ((strpos($ip, ':') !== false) === $expectsColon) {
$records[] = new Record($query->name, $query->type, $query->class, 0, $ip);
}
}

if ($records) {
return Promise\resolve(
Message::createResponseWithAnswersForQuery($query, $records)
);
}
} elseif ($query->class === Message::CLASS_IN && $query->type === Message::TYPE_PTR) {

$ip = $this->getIpFromHost($query->name);

if ($ip !== null) {
$records = array();
foreach ($this->hosts->getHostsForIp($ip) as $host) {
$records[] = new Record($query->name, $query->type, $query->class, 0, $host);
}

if ($records) {
return Promise\resolve(
Message::createResponseWithAnswersForQuery($query, $records)
);
}
}
}

return $this->fallback->query($query);
}

private function getIpFromHost($host)
{
if (substr($host, -13) === '.in-addr.arpa') {

$ip = @inet_pton(substr($host, 0, -13));
if ($ip === false || isset($ip[4])) {
return null;
}

return inet_ntop(strrev($ip));
} elseif (substr($host, -9) === '.ip6.arpa') {

$ip = @inet_ntop(pack('H*', strrev(str_replace('.', '', substr($host, 0, -9)))));
if ($ip === false) {
return null;
}

return $ip;
} else {
return null;
}
}
}
<?php

namespace React\Dns\Query;

use React\Promise\Promise;















































class SelectiveTransportExecutor implements ExecutorInterface
{
private $datagramExecutor;
private $streamExecutor;

public function __construct(ExecutorInterface $datagramExecutor, ExecutorInterface $streamExecutor)
{
$this->datagramExecutor = $datagramExecutor;
$this->streamExecutor = $streamExecutor;
}

public function query(Query $query)
{
$stream = $this->streamExecutor;
$pending = $this->datagramExecutor->query($query);

return new Promise(function ($resolve, $reject) use (&$pending, $stream, $query) {
$pending->then(
$resolve,
function ($e) use (&$pending, $stream, $query, $resolve, $reject) {
if ($e->getCode() === (\defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)) {
$pending = $stream->query($query)->then($resolve, $reject);
} else {
$reject($e);
}
}
);
}, function () use (&$pending) {
$pending->cancel();
$pending = null;
});
}
}
<?php

namespace React\Dns\Query;

final class CancellationException extends \RuntimeException
{
}
<?php

namespace React\Dns\Query;

use React\Dns\Model\Message;










final class Query
{



public $name;




public $type;




public $class;






public function __construct($name, $type, $class)
{
$this->name = $name;
$this->type = $type;
$this->class = $class;
}










public function describe()
{
$class = $this->class !== Message::CLASS_IN ? 'CLASS' . $this->class . ' ' : '';

$type = 'TYPE' . $this->type;
$ref = new \ReflectionClass('React\Dns\Model\Message');
foreach ($ref->getConstants() as $name => $value) {
if ($value === $this->type && \strpos($name, 'TYPE_') === 0) {
$type = \substr($name, 5);
break;
}
}

return $this->name . ' (' . $class . $type . ')';
}
}
<?php

namespace React\Dns\Query;

interface ExecutorInterface
{



































public function query(Query $query);
}
<?php

namespace React\Dns\Query;

use React\Dns\Model\Message;
use React\Dns\Protocol\BinaryDumper;
use React\Dns\Protocol\Parser;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Promise\Deferred;



































































class TcpTransportExecutor implements ExecutorInterface
{
private $nameserver;
private $loop;
private $parser;
private $dumper;




private $socket;




private $pending = array();




private $names = array();


















private $idlePeriod = 0.001;




private $idleTimer;

private $writeBuffer = '';
private $writePending = false;

private $readBuffer = '';
private $readPending = false;


private $readChunk = 0xffff;





public function __construct($nameserver, $loop = null)
{
if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) {

$nameserver = '[' . $nameserver . ']';
}

$parts = \parse_url((\strpos($nameserver, '://') === false ? 'tcp://' : '') . $nameserver);
if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'tcp' || @\inet_pton(\trim($parts['host'], '[]')) === false) {
throw new \InvalidArgumentException('Invalid nameserver address given');
}

if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$this->nameserver = 'tcp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53);
$this->loop = $loop ?: Loop::get();
$this->parser = new Parser();
$this->dumper = new BinaryDumper();
}

public function query(Query $query)
{
$request = Message::createRequestForQuery($query);


while (isset($this->pending[$request->id])) {
$request->id = \mt_rand(0, 0xffff); 
}

$queryData = $this->dumper->toBinary($request);
$length = \strlen($queryData);
if ($length > 0xffff) {
return \React\Promise\reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport'
));
}

$queryData = \pack('n', $length) . $queryData;

if ($this->socket === null) {

$socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT);
if ($socket === false) {
return \React\Promise\reject(new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')',
$errno
));
}


\stream_set_blocking($socket, false);
if (\function_exists('stream_set_chunk_size')) {
\stream_set_chunk_size($socket, $this->readChunk); 
}
$this->socket = $socket;
}

if ($this->idleTimer !== null) {
$this->loop->cancelTimer($this->idleTimer);
$this->idleTimer = null;
}


$this->writeBuffer .= $queryData;
if (!$this->writePending) {
$this->writePending = true;
$this->loop->addWriteStream($this->socket, array($this, 'handleWritable'));
}

$names =& $this->names;
$that = $this;
$deferred = new Deferred(function () use ($that, &$names, $request) {

$name = $names[$request->id];
unset($names[$request->id]);
$that->checkIdle();

throw new CancellationException('DNS query for ' . $name . ' has been cancelled');
});

$this->pending[$request->id] = $deferred;
$this->names[$request->id] = $query->describe();

return $deferred->promise();
}




public function handleWritable()
{
if ($this->readPending === false) {
$name = @\stream_socket_get_name($this->socket, true);
if ($name === false) {


if (\function_exists('socket_import_stream')) {
$socket = \socket_import_stream($this->socket);
$errno = \socket_get_option($socket, \SOL_SOCKET, \SO_ERROR);
$errstr = \socket_strerror($errno);
} else {
$errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111;
$errstr = 'Connection refused';
}


$this->closeError('Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno);
return;
}

$this->readPending = true;
$this->loop->addReadStream($this->socket, array($this, 'handleRead'));
}

$errno = 0;
$errstr = '';
\set_error_handler(function ($_, $error) use (&$errno, &$errstr) {


\preg_match('/errno=(\d+) (.+)/', $error, $m);
$errno = isset($m[1]) ? (int) $m[1] : 0;
$errstr = isset($m[2]) ? $m[2] : $error;
});

$written = \fwrite($this->socket, $this->writeBuffer);

\restore_error_handler();

if ($written === false || $written === 0) {
$this->closeError(
'Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')',
$errno
);
return;
}

if (isset($this->writeBuffer[$written])) {
$this->writeBuffer = \substr($this->writeBuffer, $written);
} else {
$this->loop->removeWriteStream($this->socket);
$this->writePending = false;
$this->writeBuffer = '';
}
}




public function handleRead()
{


$chunk = @\fread($this->socket, $this->readChunk);
if ($chunk === false || $chunk === '') {
$this->closeError('Connection to DNS server ' . $this->nameserver . ' lost');
return;
}


$this->readBuffer .= $chunk;


while (isset($this->readBuffer[11])) {

list(, $length) = \unpack('n', $this->readBuffer);
if (!isset($this->readBuffer[$length + 1])) {
return;
}

$data = \substr($this->readBuffer, 2, $length);
$this->readBuffer = (string)substr($this->readBuffer, $length + 2);

try {
$response = $this->parser->parseMessage($data);
} catch (\Exception $e) {

$this->closeError('Invalid message received from DNS server ' . $this->nameserver);
return;
}


if (!isset($this->pending[$response->id]) || $response->tc) {
$this->closeError('Invalid response message received from DNS server ' . $this->nameserver);
return;
}

$deferred = $this->pending[$response->id];
unset($this->pending[$response->id], $this->names[$response->id]);

$deferred->resolve($response);

$this->checkIdle();
}
}






public function closeError($reason, $code = 0)
{
$this->readBuffer = '';
if ($this->readPending) {
$this->loop->removeReadStream($this->socket);
$this->readPending = false;
}

$this->writeBuffer = '';
if ($this->writePending) {
$this->loop->removeWriteStream($this->socket);
$this->writePending = false;
}

if ($this->idleTimer !== null) {
$this->loop->cancelTimer($this->idleTimer);
$this->idleTimer = null;
}

@\fclose($this->socket);
$this->socket = null;

foreach ($this->names as $id => $name) {
$this->pending[$id]->reject(new \RuntimeException(
'DNS query for ' . $name . ' failed: ' . $reason,
$code
));
}
$this->pending = $this->names = array();
}




public function checkIdle()
{
if ($this->idleTimer === null && !$this->names) {
$that = $this;
$this->idleTimer = $this->loop->addTimer($this->idlePeriod, function () use ($that) {
$that->closeError('Idle timeout');
});
}
}
}
<?php

namespace React\Dns\Query;

use React\Promise\Promise;































final class CoopExecutor implements ExecutorInterface
{
private $executor;
private $pending = array();
private $counts = array();

public function __construct(ExecutorInterface $base)
{
$this->executor = $base;
}

public function query(Query $query)
{
$key = $this->serializeQueryToIdentity($query);
if (isset($this->pending[$key])) {

$promise = $this->pending[$key];
++$this->counts[$key];
} else {

$promise = $this->executor->query($query);
$this->pending[$key] = $promise;
$this->counts[$key] = 1;

$pending =& $this->pending;
$counts =& $this->counts;
$promise->then(function () use ($key, &$pending, &$counts) {
unset($pending[$key], $counts[$key]);
}, function () use ($key, &$pending, &$counts) {
unset($pending[$key], $counts[$key]);
});
}




$pending =& $this->pending;
$counts =& $this->counts;
return new Promise(function ($resolve, $reject) use ($promise) {
$promise->then($resolve, $reject);
}, function () use (&$promise, $key, $query, &$pending, &$counts) {
if (--$counts[$key] < 1) {
unset($pending[$key], $counts[$key]);
$promise->cancel();
$promise = null;
}
throw new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled');
});
}

private function serializeQueryToIdentity(Query $query)
{
return sprintf('%s:%s:%s', $query->name, $query->type, $query->class);
}
}
<?php

namespace React\Dns\Query;

use React\Promise\Deferred;
use React\Promise\PromiseInterface;

final class RetryExecutor implements ExecutorInterface
{
private $executor;
private $retries;

public function __construct(ExecutorInterface $executor, $retries = 2)
{
$this->executor = $executor;
$this->retries = $retries;
}

public function query(Query $query)
{
return $this->tryQuery($query, $this->retries);
}

public function tryQuery(Query $query, $retries)
{
$deferred = new Deferred(function () use (&$promise) {
if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) {
$promise->cancel();
}
});

$success = function ($value) use ($deferred, &$errorback) {
$errorback = null;
$deferred->resolve($value);
};

$executor = $this->executor;
$errorback = function ($e) use ($deferred, &$promise, $query, $success, &$errorback, &$retries, $executor) {
if (!$e instanceof TimeoutException) {
$errorback = null;
$deferred->reject($e);
} elseif ($retries <= 0) {
$errorback = null;
$deferred->reject($e = new \RuntimeException(
'DNS query for ' . $query->describe() . ' failed: too many retries',
0,
$e
));



$r = new \ReflectionProperty('Exception', 'trace');
$r->setAccessible(true);
$trace = $r->getValue($e);



foreach ($trace as $ti => $one) {
if (isset($one['args'])) {
foreach ($one['args'] as $ai => $arg) {
if ($arg instanceof \Closure) {
$trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')';
}
}
}
}

$r->setValue($e, $trace);
} else {
--$retries;
$promise = $executor->query($query)->then(
$success,
$errorback
);
}
};

$promise = $this->executor->query($query)->then(
$success,
$errorback
);

return $deferred->promise();
}
}
<?php

namespace React\Dns\Query;

use React\Promise\Promise;

final class FallbackExecutor implements ExecutorInterface
{
private $executor;
private $fallback;

public function __construct(ExecutorInterface $executor, ExecutorInterface $fallback)
{
$this->executor = $executor;
$this->fallback = $fallback;
}

public function query(Query $query)
{
$cancelled = false;
$fallback = $this->fallback;
$promise = $this->executor->query($query);

return new Promise(function ($resolve, $reject) use (&$promise, $fallback, $query, &$cancelled) {
$promise->then($resolve, function (\Exception $e1) use ($fallback, $query, $resolve, $reject, &$cancelled, &$promise) {

if ($cancelled) {
$reject($e1);
return;
}


$promise = $fallback->query($query)->then($resolve, function (\Exception $e2) use ($e1, $reject) {
$append = $e2->getMessage();
if (($pos = strpos($append, ':')) !== false) {
$append = substr($append, $pos + 2);
}


$reject(new \RuntimeException($e1->getMessage() . '. ' . $append));
});
});
}, function () use (&$promise, &$cancelled) {

$cancelled = true;
$promise->cancel();
});
}
}
<?php

namespace React\Dns\Resolver;

use React\Dns\Model\Message;
use React\Dns\Query\ExecutorInterface;
use React\Dns\Query\Query;
use React\Dns\RecordNotFoundException;




final class Resolver implements ResolverInterface
{
private $executor;

public function __construct(ExecutorInterface $executor)
{
$this->executor = $executor;
}

public function resolve($domain)
{
return $this->resolveAll($domain, Message::TYPE_A)->then(function (array $ips) {
return $ips[array_rand($ips)];
});
}

public function resolveAll($domain, $type)
{
$query = new Query($domain, $type, Message::CLASS_IN);
$that = $this;

return $this->executor->query(
$query
)->then(function (Message $response) use ($query, $that) {
return $that->extractValues($query, $response);
});
}










public function extractValues(Query $query, Message $response)
{

$code = $response->rcode;
if ($code !== Message::RCODE_OK) {
switch ($code) {
case Message::RCODE_FORMAT_ERROR:
$message = 'Format Error';
break;
case Message::RCODE_SERVER_FAILURE:
$message = 'Server Failure';
break;
case Message::RCODE_NAME_ERROR:
$message = 'Non-Existent Domain / NXDOMAIN';
break;
case Message::RCODE_NOT_IMPLEMENTED:
$message = 'Not Implemented';
break;
case Message::RCODE_REFUSED:
$message = 'Refused';
break;
default:
$message = 'Unknown error response code ' . $code;
}
throw new RecordNotFoundException(
'DNS query for ' . $query->describe() . ' returned an error response (' . $message . ')',
$code
);
}

$answers = $response->answers;
$addresses = $this->valuesByNameAndType($answers, $query->name, $query->type);


if (0 === count($addresses)) {
throw new RecordNotFoundException(
'DNS query for ' . $query->describe() . ' did not return a valid answer (NOERROR / NODATA)'
);
}

return array_values($addresses);
}







private function valuesByNameAndType(array $answers, $name, $type)
{

$named = $this->filterByName($answers, $name);
$records = $this->filterByType($named, $type);
if ($records) {
return $this->mapRecordData($records);
}


$cnameRecords = $this->filterByType($named, Message::TYPE_CNAME);
if ($cnameRecords) {
$cnames = $this->mapRecordData($cnameRecords);
foreach ($cnames as $cname) {
$records = array_merge(
$records,
$this->valuesByNameAndType($answers, $cname, $type)
);
}
}

return $records;
}

private function filterByName(array $answers, $name)
{
return $this->filterByField($answers, 'name', $name);
}

private function filterByType(array $answers, $type)
{
return $this->filterByField($answers, 'type', $type);
}

private function filterByField(array $answers, $field, $value)
{
$value = strtolower($value);
return array_filter($answers, function ($answer) use ($field, $value) {
return $value === strtolower($answer->$field);
});
}

private function mapRecordData(array $records)
{
return array_map(function ($record) {
return $record->data;
}, $records);
}
}
<?php

namespace React\Dns\Resolver;

use React\Cache\ArrayCache;
use React\Cache\CacheInterface;
use React\Dns\Config\Config;
use React\Dns\Config\HostsFile;
use React\Dns\Query\CachingExecutor;
use React\Dns\Query\CoopExecutor;
use React\Dns\Query\ExecutorInterface;
use React\Dns\Query\FallbackExecutor;
use React\Dns\Query\HostsFileExecutor;
use React\Dns\Query\RetryExecutor;
use React\Dns\Query\SelectiveTransportExecutor;
use React\Dns\Query\TcpTransportExecutor;
use React\Dns\Query\TimeoutExecutor;
use React\Dns\Query\UdpTransportExecutor;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;

final class Factory
{















public function create($config, $loop = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

$executor = $this->decorateHostsFileExecutor($this->createExecutor($config, $loop ?: Loop::get()));

return new Resolver($executor);
}

















public function createCached($config, $loop = null, $cache = null)
{
if ($loop !== null && !$loop instanceof LoopInterface) { 
throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface');
}

if ($cache !== null && !$cache instanceof CacheInterface) { 
throw new \InvalidArgumentException('Argument #3 ($cache) expected null|React\Cache\CacheInterface');
}


if (!($cache instanceof CacheInterface)) {
$cache = new ArrayCache(256);
}

$executor = $this->createExecutor($config, $loop ?: Loop::get());
$executor = new CachingExecutor($executor, $cache);
$executor = $this->decorateHostsFileExecutor($executor);

return new Resolver($executor);
}








private function decorateHostsFileExecutor(ExecutorInterface $executor)
{
try {
$executor = new HostsFileExecutor(
HostsFile::loadFromPathBlocking(),
$executor
);
} catch (\RuntimeException $e) {

}



if (DIRECTORY_SEPARATOR === '\\') {
$executor = new HostsFileExecutor(
new HostsFile("127.0.0.1 localhost\n::1 localhost"),
$executor
);
}

return $executor;
}








private function createExecutor($nameserver, LoopInterface $loop)
{
if ($nameserver instanceof Config) {
if (!$nameserver->nameservers) {
throw new \UnderflowException('Empty config with no DNS servers');
}



$primary = reset($nameserver->nameservers);
$secondary = next($nameserver->nameservers);
$tertiary = next($nameserver->nameservers);

if ($tertiary !== false) {

return new CoopExecutor(
new RetryExecutor(
new FallbackExecutor(
$this->createSingleExecutor($primary, $loop),
new FallbackExecutor(
$this->createSingleExecutor($secondary, $loop),
$this->createSingleExecutor($tertiary, $loop)
)
)
)
);
} elseif ($secondary !== false) {

return new CoopExecutor(
new RetryExecutor(
new FallbackExecutor(
$this->createSingleExecutor($primary, $loop),
$this->createSingleExecutor($secondary, $loop)
)
)
);
} else {

$nameserver = $primary;
}
}

return new CoopExecutor(new RetryExecutor($this->createSingleExecutor($nameserver, $loop)));
}







private function createSingleExecutor($nameserver, LoopInterface $loop)
{
$parts = \parse_url($nameserver);

if (isset($parts['scheme']) && $parts['scheme'] === 'tcp') {
$executor = $this->createTcpExecutor($nameserver, $loop);
} elseif (isset($parts['scheme']) && $parts['scheme'] === 'udp') {
$executor = $this->createUdpExecutor($nameserver, $loop);
} else {
$executor = new SelectiveTransportExecutor(
$this->createUdpExecutor($nameserver, $loop),
$this->createTcpExecutor($nameserver, $loop)
);
}

return $executor;
}







private function createTcpExecutor($nameserver, LoopInterface $loop)
{
return new TimeoutExecutor(
new TcpTransportExecutor($nameserver, $loop),
5.0,
$loop
);
}







private function createUdpExecutor($nameserver, LoopInterface $loop)
{
return new TimeoutExecutor(
new UdpTransportExecutor(
$nameserver,
$loop
),
5.0,
$loop
);
}
}
<?php

namespace React\Dns\Resolver;

interface ResolverInterface
{






































public function resolve($domain);















































public function resolveAll($domain, $type);
}
<?php

namespace React\Dns;

final class BadServerException extends \Exception
{
}
<?php

namespace React\Dns\Config;

use RuntimeException;
















class HostsFile
{






public static function getDefaultPath()
{

if (DIRECTORY_SEPARATOR !== '\\') {
return '/etc/hosts';
}



$path = '%SystemRoot%\\system32\drivers\etc\hosts';

$base = getenv('SystemRoot');
if ($base === false) {
$base = 'C:\\Windows';
}

return str_replace('%SystemRoot%', $base, $path);
}














public static function loadFromPathBlocking($path = null)
{
if ($path === null) {
$path = self::getDefaultPath();
}

$contents = @file_get_contents($path);
if ($contents === false) {
throw new RuntimeException('Unable to load hosts file "' . $path . '"');
}

return new self($contents);
}

private $contents;






public function __construct($contents)
{

$contents = preg_replace('/[ \t]*#.*/', '', strtolower($contents));

$this->contents = $contents;
}







public function getIpsForHost($name)
{
$name = strtolower($name);

$ips = array();
foreach (preg_split('/\r?\n/', $this->contents) as $line) {
$parts = preg_split('/\s+/', $line);
$ip = array_shift($parts);
if ($parts && array_search($name, $parts) !== false) {

if (strpos($ip, ':') !== false && ($pos = strpos($ip, '%')) !== false) {
$ip = substr($ip, 0, $pos);
}

if (@inet_pton($ip) !== false) {
$ips[] = $ip;
}
}
}

return $ips;
}







public function getHostsForIp($ip)
{

$ip = @inet_pton($ip);
if ($ip === false) {
return array();
}

$names = array();
foreach (preg_split('/\r?\n/', $this->contents) as $line) {
$parts = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);
$addr = (string) array_shift($parts);


if (strpos($addr, ':') !== false && ($pos = strpos($addr, '%')) !== false) {
$addr = substr($addr, 0, $pos);
}

if (@inet_pton($addr) === $ip) {
foreach ($parts as $part) {
$names[] = $part;
}
}
}

return $names;
}
}
<?php

namespace React\Dns\Config;

use RuntimeException;

final class Config
{




















public static function loadSystemConfigBlocking()
{

if (DIRECTORY_SEPARATOR === '\\') {
return self::loadWmicBlocking();
}


try {
return self::loadResolvConfBlocking();
} catch (RuntimeException $ignored) {

return new self();
}
}






























public static function loadResolvConfBlocking($path = null)
{
if ($path === null) {
$path = '/etc/resolv.conf';
}

$contents = @file_get_contents($path);
if ($contents === false) {
throw new RuntimeException('Unable to load resolv.conf file "' . $path . '"');
}

$matches = array();
preg_match_all('/^nameserver\s+(\S+)\s*$/m', $contents, $matches);

$config = new self();
foreach ($matches[1] as $ip) {

if (strpos($ip, ':') !== false && ($pos = strpos($ip, '%')) !== false) {
$ip = substr($ip, 0, $pos);
}

if (@inet_pton($ip) !== false) {
$config->nameservers[] = $ip;
}
}

return $config;
}























public static function loadWmicBlocking($command = null)
{
$contents = shell_exec($command === null ? 'wmic NICCONFIG get "DNSServerSearchOrder" /format:CSV' : $command);
preg_match_all('/(?<=[{;,"])([\da-f.:]{4,})(?=[};,"])/i', $contents, $matches);

$config = new self();
$config->nameservers = $matches[1];

return $config;
}

public $nameservers = array();
}
<?php

namespace React\Dns\Protocol;

use React\Dns\Model\Message;
use React\Dns\Model\Record;
use React\Dns\Query\Query;
use InvalidArgumentException;






final class Parser
{







public function parseMessage($data)
{
$message = $this->parse($data, 0);
if ($message === null) {
throw new InvalidArgumentException('Unable to parse binary message');
}

return $message;
}






private function parse($data, $consumed)
{
if (!isset($data[12 - 1])) {
return null;
}

list($id, $fields, $qdCount, $anCount, $nsCount, $arCount) = array_values(unpack('n*', substr($data, 0, 12)));

$message = new Message();
$message->id = $id;
$message->rcode = $fields & 0xf;
$message->ra = (($fields >> 7) & 1) === 1;
$message->rd = (($fields >> 8) & 1) === 1;
$message->tc = (($fields >> 9) & 1) === 1;
$message->aa = (($fields >> 10) & 1) === 1;
$message->opcode = ($fields >> 11) & 0xf;
$message->qr = (($fields >> 15) & 1) === 1;
$consumed += 12;


for ($i = $qdCount; $i > 0; --$i) {
list($question, $consumed) = $this->parseQuestion($data, $consumed);
if ($question === null) {
return null;
} else {
$message->questions[] = $question;
}
}


for ($i = $anCount; $i > 0; --$i) {
list($record, $consumed) = $this->parseRecord($data, $consumed);
if ($record === null) {
return null;
} else {
$message->answers[] = $record;
}
}


for ($i = $nsCount; $i > 0; --$i) {
list($record, $consumed) = $this->parseRecord($data, $consumed);
if ($record === null) {
return null;
} else {
$message->authority[] = $record;
}
}


for ($i = $arCount; $i > 0; --$i) {
list($record, $consumed) = $this->parseRecord($data, $consumed);
if ($record === null) {
return null;
} else {
$message->additional[] = $record;
}
}

return $message;
}






private function parseQuestion($data, $consumed)
{
list($labels, $consumed) = $this->readLabels($data, $consumed);

if ($labels === null || !isset($data[$consumed + 4 - 1])) {
return array(null, null);
}

list($type, $class) = array_values(unpack('n*', substr($data, $consumed, 4)));
$consumed += 4;

return array(
new Query(
implode('.', $labels),
$type,
$class
),
$consumed
);
}






private function parseRecord($data, $consumed)
{
list($name, $consumed) = $this->readDomain($data, $consumed);

if ($name === null || !isset($data[$consumed + 10 - 1])) {
return array(null, null);
}

list($type, $class) = array_values(unpack('n*', substr($data, $consumed, 4)));
$consumed += 4;

list($ttl) = array_values(unpack('N', substr($data, $consumed, 4)));
$consumed += 4;


if ($ttl < 0 || $ttl >= 1 << 31) {
$ttl = 0;
}

list($rdLength) = array_values(unpack('n', substr($data, $consumed, 2)));
$consumed += 2;

if (!isset($data[$consumed + $rdLength - 1])) {
return array(null, null);
}

$rdata = null;
$expected = $consumed + $rdLength;

if (Message::TYPE_A === $type) {
if ($rdLength === 4) {
$rdata = inet_ntop(substr($data, $consumed, $rdLength));
$consumed += $rdLength;
}
} elseif (Message::TYPE_AAAA === $type) {
if ($rdLength === 16) {
$rdata = inet_ntop(substr($data, $consumed, $rdLength));
$consumed += $rdLength;
}
} elseif (Message::TYPE_CNAME === $type || Message::TYPE_PTR === $type || Message::TYPE_NS === $type) {
list($rdata, $consumed) = $this->readDomain($data, $consumed);
} elseif (Message::TYPE_TXT === $type || Message::TYPE_SPF === $type) {
$rdata = array();
while ($consumed < $expected) {
$len = ord($data[$consumed]);
$rdata[] = (string)substr($data, $consumed + 1, $len);
$consumed += $len + 1;
}
} elseif (Message::TYPE_MX === $type) {
if ($rdLength > 2) {
list($priority) = array_values(unpack('n', substr($data, $consumed, 2)));
list($target, $consumed) = $this->readDomain($data, $consumed + 2);

$rdata = array(
'priority' => $priority,
'target' => $target
);
}
} elseif (Message::TYPE_SRV === $type) {
if ($rdLength > 6) {
list($priority, $weight, $port) = array_values(unpack('n*', substr($data, $consumed, 6)));
list($target, $consumed) = $this->readDomain($data, $consumed + 6);

$rdata = array(
'priority' => $priority,
'weight' => $weight,
'port' => $port,
'target' => $target
);
}
} elseif (Message::TYPE_SSHFP === $type) {
if ($rdLength > 2) {
list($algorithm, $hash) = \array_values(\unpack('C*', \substr($data, $consumed, 2)));
$fingerprint = \bin2hex(\substr($data, $consumed + 2, $rdLength - 2));
$consumed += $rdLength;

$rdata = array(
'algorithm' => $algorithm,
'type' => $hash,
'fingerprint' => $fingerprint
);
}
} elseif (Message::TYPE_SOA === $type) {
list($mname, $consumed) = $this->readDomain($data, $consumed);
list($rname, $consumed) = $this->readDomain($data, $consumed);

if ($mname !== null && $rname !== null && isset($data[$consumed + 20 - 1])) {
list($serial, $refresh, $retry, $expire, $minimum) = array_values(unpack('N*', substr($data, $consumed, 20)));
$consumed += 20;

$rdata = array(
'mname' => $mname,
'rname' => $rname,
'serial' => $serial,
'refresh' => $refresh,
'retry' => $retry,
'expire' => $expire,
'minimum' => $minimum
);
}
} elseif (Message::TYPE_OPT === $type) {
$rdata = array();
while (isset($data[$consumed + 4 - 1])) {
list($code, $length) = array_values(unpack('n*', substr($data, $consumed, 4)));
$value = (string) substr($data, $consumed + 4, $length);
if ($code === Message::OPT_TCP_KEEPALIVE && $value === '') {
$value = null;
} elseif ($code === Message::OPT_TCP_KEEPALIVE && $length === 2) {
list($value) = array_values(unpack('n', $value));
$value = round($value * 0.1, 1);
} elseif ($code === Message::OPT_TCP_KEEPALIVE) {
break;
}
$rdata[$code] = $value;
$consumed += 4 + $length;
}
} elseif (Message::TYPE_CAA === $type) {
if ($rdLength > 3) {
list($flag, $tagLength) = array_values(unpack('C*', substr($data, $consumed, 2)));

if ($tagLength > 0 && $rdLength - 2 - $tagLength > 0) {
$tag = substr($data, $consumed + 2, $tagLength);
$value = substr($data, $consumed + 2 + $tagLength, $rdLength - 2 - $tagLength);
$consumed += $rdLength;

$rdata = array(
'flag' => $flag,
'tag' => $tag,
'value' => $value
);
}
}
} else {

$rdata = substr($data, $consumed, $rdLength);
$consumed += $rdLength;
}


if ($consumed !== $expected || $rdata === null) {
return array(null, null);
}

return array(
new Record($name, $type, $class, $ttl, $rdata),
$consumed
);
}

private function readDomain($data, $consumed)
{
list ($labels, $consumed) = $this->readLabels($data, $consumed);

if ($labels === null) {
return array(null, null);
}


return array(
\implode(
'.',
\array_map(
function ($label) {
return \addcslashes($label, "\0..\40.\177");
},
$labels
)
),
$consumed
);
}







private function readLabels($data, $consumed, $compressionDepth = 127)
{
$labels = array();

while (true) {
if (!isset($data[$consumed])) {
return array(null, null);
}

$length = \ord($data[$consumed]);


if ($length === 0) {
$consumed += 1;
break;
}


if (($length & 0xc0) === 0xc0 && isset($data[$consumed + 1]) && $compressionDepth) {
$offset = ($length & ~0xc0) << 8 | \ord($data[$consumed + 1]);
if ($offset >= $consumed) {
return array(null, null);
}

$consumed += 2;
list($newLabels) = $this->readLabels($data, $offset, $compressionDepth - 1);

if ($newLabels === null) {
return array(null, null);
}

$labels = array_merge($labels, $newLabels);
break;
}


if ($length & 0xc0 || !isset($data[$consumed + $length - 1])) {
return array(null, null);
}

$labels[] = substr($data, $consumed + 1, $length);
$consumed += $length + 1;
}

return array($labels, $consumed);
}
}
<?php

namespace React\Dns\Protocol;

use React\Dns\Model\Message;
use React\Dns\Model\Record;
use React\Dns\Query\Query;

final class BinaryDumper
{




public function toBinary(Message $message)
{
$data = '';

$data .= $this->headerToBinary($message);
$data .= $this->questionToBinary($message->questions);
$data .= $this->recordsToBinary($message->answers);
$data .= $this->recordsToBinary($message->authority);
$data .= $this->recordsToBinary($message->additional);

return $data;
}





private function headerToBinary(Message $message)
{
$data = '';

$data .= pack('n', $message->id);

$flags = 0x00;
$flags = ($flags << 1) | ($message->qr ? 1 : 0);
$flags = ($flags << 4) | $message->opcode;
$flags = ($flags << 1) | ($message->aa ? 1 : 0);
$flags = ($flags << 1) | ($message->tc ? 1 : 0);
$flags = ($flags << 1) | ($message->rd ? 1 : 0);
$flags = ($flags << 1) | ($message->ra ? 1 : 0);
$flags = ($flags << 3) | 0; 
$flags = ($flags << 4) | $message->rcode;

$data .= pack('n', $flags);

$data .= pack('n', count($message->questions));
$data .= pack('n', count($message->answers));
$data .= pack('n', count($message->authority));
$data .= pack('n', count($message->additional));

return $data;
}





private function questionToBinary(array $questions)
{
$data = '';

foreach ($questions as $question) {
$data .= $this->domainNameToBinary($question->name);
$data .= pack('n*', $question->type, $question->class);
}

return $data;
}





private function recordsToBinary(array $records)
{
$data = '';

foreach ($records as $record) {

switch ($record->type) {
case Message::TYPE_A:
case Message::TYPE_AAAA:
$binary = \inet_pton($record->data);
break;
case Message::TYPE_CNAME:
case Message::TYPE_NS:
case Message::TYPE_PTR:
$binary = $this->domainNameToBinary($record->data);
break;
case Message::TYPE_TXT:
case Message::TYPE_SPF:
$binary = $this->textsToBinary($record->data);
break;
case Message::TYPE_MX:
$binary = \pack(
'n',
$record->data['priority']
);
$binary .= $this->domainNameToBinary($record->data['target']);
break;
case Message::TYPE_SRV:
$binary = \pack(
'n*',
$record->data['priority'],
$record->data['weight'],
$record->data['port']
);
$binary .= $this->domainNameToBinary($record->data['target']);
break;
case Message::TYPE_SOA:
$binary = $this->domainNameToBinary($record->data['mname']);
$binary .= $this->domainNameToBinary($record->data['rname']);
$binary .= \pack(
'N*',
$record->data['serial'],
$record->data['refresh'],
$record->data['retry'],
$record->data['expire'],
$record->data['minimum']
);
break;
case Message::TYPE_CAA:
$binary = \pack(
'C*',
$record->data['flag'],
\strlen($record->data['tag'])
);
$binary .= $record->data['tag'];
$binary .= $record->data['value'];
break;
case Message::TYPE_SSHFP:
$binary = \pack(
'CCH*',
$record->data['algorithm'],
$record->data['type'],
$record->data['fingerprint']
);
break;
case Message::TYPE_OPT:
$binary = '';
foreach ($record->data as $opt => $value) {
if ($opt === Message::OPT_TCP_KEEPALIVE && $value !== null) {
$value = \pack('n', round($value * 10));
}
$binary .= \pack('n*', $opt, \strlen((string) $value)) . $value;
}
break;
default:

$binary = $record->data;
}

$data .= $this->domainNameToBinary($record->name);
$data .= \pack('nnNn', $record->type, $record->class, $record->ttl, \strlen($binary));
$data .= $binary;
}

return $data;
}





private function textsToBinary(array $texts)
{
$data = '';
foreach ($texts as $text) {
$data .= \chr(\strlen($text)) . $text;
}
return $data;
}





private function domainNameToBinary($host)
{
if ($host === '') {
return "\0";
}


return $this->textsToBinary(
\array_map(
'stripcslashes',
\preg_split(
'/(?<!\\\\)\./',
$host . '.'
)
)
);
}
}
<?php

namespace React\Dns;

final class RecordNotFoundException extends \Exception
{
}
<?php

namespace React\Dns\Model;










final class Record
{



public $name;




public $type;









public $class;










public $ttl;


























































































public $data;








public function __construct($name, $type, $class, $ttl, $data)
{
$this->name = $name;
$this->type = $type;
$this->class = $class;
$this->ttl = $ttl;
$this->data = $data;
}
}
<?php

namespace React\Dns\Model;

use React\Dns\Query\Query;






final class Message
{
const TYPE_A = 1;
const TYPE_NS = 2;
const TYPE_CNAME = 5;
const TYPE_SOA = 6;
const TYPE_PTR = 12;
const TYPE_MX = 15;
const TYPE_TXT = 16;
const TYPE_AAAA = 28;
const TYPE_SRV = 33;
const TYPE_SSHFP = 44;












const TYPE_OPT = 41;








const TYPE_SPF = 99;

const TYPE_ANY = 255;
const TYPE_CAA = 257;

const CLASS_IN = 1;

const OPCODE_QUERY = 0;
const OPCODE_IQUERY = 1; 
const OPCODE_STATUS = 2;

const RCODE_OK = 0;
const RCODE_FORMAT_ERROR = 1;
const RCODE_SERVER_FAILURE = 2;
const RCODE_NAME_ERROR = 3;
const RCODE_NOT_IMPLEMENTED = 4;
const RCODE_REFUSED = 5;









const OPT_TCP_KEEPALIVE = 11;









const OPT_PADDING = 12;







public static function createRequestForQuery(Query $query)
{
$request = new Message();
$request->id = self::generateId();
$request->rd = true;
$request->questions[] = $query;

return $request;
}








public static function createResponseWithAnswersForQuery(Query $query, array $answers)
{
$response = new Message();
$response->id = self::generateId();
$response->qr = true;
$response->rd = true;

$response->questions[] = $query;

foreach ($answers as $record) {
$response->answers[] = $record;
}

return $response;
}



















private static function generateId()
{
if (function_exists('random_int')) {
return random_int(0, 0xffff);
}
return mt_rand(0, 0xffff);
}












public $id = 0;




public $qr = false;





public $opcode = self::OPCODE_QUERY;





public $aa = false;




public $tc = false;




public $rd = false;




public $ra = false;





public $rcode = Message::RCODE_OK;
















public $questions = array();




public $answers = array();




public $authority = array();




public $additional = array();
}
The MIT License (MIT)

Copyright (c) 2012 Christian Lück, Cees-Jan Kiewiet, Jan Sorgalla, Chris Boden, Igor Wiedler

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.
<?php

namespace React\EventLoop;

use BadMethodCallException;
use Event;
use EventBase;
use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use SplObjectStorage;












final class ExtEventLoop implements LoopInterface
{
private $eventBase;
private $futureTickQueue;
private $timerCallback;
private $timerEvents;
private $streamCallback;
private $readEvents = array();
private $writeEvents = array();
private $readListeners = array();
private $writeListeners = array();
private $readRefs = array();
private $writeRefs = array();
private $running;
private $signals;
private $signalEvents = array();

public function __construct()
{
if (!\class_exists('EventBase', false)) {
throw new BadMethodCallException('Cannot create ExtEventLoop, ext-event extension missing');
}




$config = new \EventConfig();
if (\DIRECTORY_SEPARATOR !== '\\') {
$config->requireFeatures(\EventConfig::FEATURE_FDS);
}

$this->eventBase = new EventBase($config);
$this->futureTickQueue = new FutureTickQueue();
$this->timerEvents = new SplObjectStorage();
$this->signals = new SignalsHandler();

$this->createTimerCallback();
$this->createStreamCallback();
}

public function __destruct()
{

foreach ($this->timerEvents as $timer) {
$this->timerEvents->offsetUnset($timer);
}

$this->readEvents = array();
$this->writeEvents = array();
}

public function addReadStream($stream, $listener)
{
$key = (int) $stream;
if (isset($this->readListeners[$key])) {
return;
}

$event = new Event($this->eventBase, $stream, Event::PERSIST | Event::READ, $this->streamCallback);
$event->add();
$this->readEvents[$key] = $event;
$this->readListeners[$key] = $listener;



if (\PHP_VERSION_ID >= 70000) {
$this->readRefs[$key] = $stream;
}
}

public function addWriteStream($stream, $listener)
{
$key = (int) $stream;
if (isset($this->writeListeners[$key])) {
return;
}

$event = new Event($this->eventBase, $stream, Event::PERSIST | Event::WRITE, $this->streamCallback);
$event->add();
$this->writeEvents[$key] = $event;
$this->writeListeners[$key] = $listener;



if (\PHP_VERSION_ID >= 70000) {
$this->writeRefs[$key] = $stream;
}
}

public function removeReadStream($stream)
{
$key = (int) $stream;

if (isset($this->readEvents[$key])) {
$this->readEvents[$key]->free();
unset(
$this->readEvents[$key],
$this->readListeners[$key],
$this->readRefs[$key]
);
}
}

public function removeWriteStream($stream)
{
$key = (int) $stream;

if (isset($this->writeEvents[$key])) {
$this->writeEvents[$key]->free();
unset(
$this->writeEvents[$key],
$this->writeListeners[$key],
$this->writeRefs[$key]
);
}
}

public function addTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, false);

$this->scheduleTimer($timer);

return $timer;
}

public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$this->scheduleTimer($timer);

return $timer;
}

public function cancelTimer(TimerInterface $timer)
{
if ($this->timerEvents->offsetExists($timer)) {
$this->timerEvents[$timer]->free();
$this->timerEvents->offsetUnset($timer);
}
}

public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function addSignal($signal, $listener)
{
$this->signals->add($signal, $listener);

if (!isset($this->signalEvents[$signal])) {
$this->signalEvents[$signal] = Event::signal($this->eventBase, $signal, array($this->signals, 'call'));
$this->signalEvents[$signal]->add();
}
}

public function removeSignal($signal, $listener)
{
$this->signals->remove($signal, $listener);

if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) {
$this->signalEvents[$signal]->free();
unset($this->signalEvents[$signal]);
}
}

public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$flags = EventBase::LOOP_ONCE;
if (!$this->running || !$this->futureTickQueue->isEmpty()) {
$flags |= EventBase::LOOP_NONBLOCK;
} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
break;
}

$this->eventBase->loop($flags);
}
}

public function stop()
{
$this->running = false;
}






private function scheduleTimer(TimerInterface $timer)
{
$flags = Event::TIMEOUT;

if ($timer->isPeriodic()) {
$flags |= Event::PERSIST;
}

$event = new Event($this->eventBase, -1, $flags, $this->timerCallback, $timer);
$this->timerEvents[$timer] = $event;

$event->add($timer->getInterval());
}








private function createTimerCallback()
{
$timers = $this->timerEvents;
$this->timerCallback = function ($_, $__, $timer) use ($timers) {
\call_user_func($timer->getCallback(), $timer);

if (!$timer->isPeriodic() && $timers->offsetExists($timer)) {
$this->cancelTimer($timer);
}
};
}








private function createStreamCallback()
{
$read =& $this->readListeners;
$write =& $this->writeListeners;
$this->streamCallback = function ($stream, $flags) use (&$read, &$write) {
$key = (int) $stream;

if (Event::READ === (Event::READ & $flags) && isset($read[$key])) {
\call_user_func($read[$key], $stream);
}

if (Event::WRITE === (Event::WRITE & $flags) && isset($write[$key])) {
\call_user_func($write[$key], $stream);
}
};
}
}
<?php

namespace React\EventLoop;

use BadMethodCallException;
use libev\EventLoop;
use libev\IOEvent;
use libev\SignalEvent;
use libev\TimerEvent;
use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use SplObjectStorage;
















final class ExtLibevLoop implements LoopInterface
{
private $loop;
private $futureTickQueue;
private $timerEvents;
private $readEvents = array();
private $writeEvents = array();
private $running;
private $signals;
private $signalEvents = array();

public function __construct()
{
if (!\class_exists('libev\EventLoop', false)) {
throw new BadMethodCallException('Cannot create ExtLibevLoop, ext-libev extension missing');
}

$this->loop = new EventLoop();
$this->futureTickQueue = new FutureTickQueue();
$this->timerEvents = new SplObjectStorage();
$this->signals = new SignalsHandler();
}

public function addReadStream($stream, $listener)
{
if (isset($this->readEvents[(int) $stream])) {
return;
}

$callback = function () use ($stream, $listener) {
\call_user_func($listener, $stream);
};

$event = new IOEvent($callback, $stream, IOEvent::READ);
$this->loop->add($event);

$this->readEvents[(int) $stream] = $event;
}

public function addWriteStream($stream, $listener)
{
if (isset($this->writeEvents[(int) $stream])) {
return;
}

$callback = function () use ($stream, $listener) {
\call_user_func($listener, $stream);
};

$event = new IOEvent($callback, $stream, IOEvent::WRITE);
$this->loop->add($event);

$this->writeEvents[(int) $stream] = $event;
}

public function removeReadStream($stream)
{
$key = (int) $stream;

if (isset($this->readEvents[$key])) {
$this->readEvents[$key]->stop();
$this->loop->remove($this->readEvents[$key]);
unset($this->readEvents[$key]);
}
}

public function removeWriteStream($stream)
{
$key = (int) $stream;

if (isset($this->writeEvents[$key])) {
$this->writeEvents[$key]->stop();
$this->loop->remove($this->writeEvents[$key]);
unset($this->writeEvents[$key]);
}
}

public function addTimer($interval, $callback)
{
$timer = new Timer( $interval, $callback, false);

$that = $this;
$timers = $this->timerEvents;
$callback = function () use ($timer, $timers, $that) {
\call_user_func($timer->getCallback(), $timer);

if ($timers->contains($timer)) {
$that->cancelTimer($timer);
}
};

$event = new TimerEvent($callback, $timer->getInterval());
$this->timerEvents->attach($timer, $event);
$this->loop->add($event);

return $timer;
}

public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$callback = function () use ($timer) {
\call_user_func($timer->getCallback(), $timer);
};

$event = new TimerEvent($callback, $timer->getInterval(), $timer->getInterval());
$this->timerEvents->attach($timer, $event);
$this->loop->add($event);

return $timer;
}

public function cancelTimer(TimerInterface $timer)
{
if (isset($this->timerEvents[$timer])) {
$this->loop->remove($this->timerEvents[$timer]);
$this->timerEvents->detach($timer);
}
}

public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function addSignal($signal, $listener)
{
$this->signals->add($signal, $listener);

if (!isset($this->signalEvents[$signal])) {
$signals = $this->signals;
$this->signalEvents[$signal] = new SignalEvent(function () use ($signals, $signal) {
$signals->call($signal);
}, $signal);
$this->loop->add($this->signalEvents[$signal]);
}
}

public function removeSignal($signal, $listener)
{
$this->signals->remove($signal, $listener);

if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) {
$this->signalEvents[$signal]->stop();
$this->loop->remove($this->signalEvents[$signal]);
unset($this->signalEvents[$signal]);
}
}

public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$flags = EventLoop::RUN_ONCE;
if (!$this->running || !$this->futureTickQueue->isEmpty()) {
$flags |= EventLoop::RUN_NOWAIT;
} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
break;
}

$this->loop->run($flags);
}
}

public function stop()
{
$this->running = false;
}
}
<?php

namespace React\EventLoop;

use Ev;
use EvIo;
use EvLoop;
use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use SplObjectStorage;













class ExtEvLoop implements LoopInterface
{



private $loop;




private $futureTickQueue;




private $timers;




private $readStreams = array();




private $writeStreams = array();




private $running;




private $signals;




private $signalEvents = array();

public function __construct()
{
$this->loop = new EvLoop();
$this->futureTickQueue = new FutureTickQueue();
$this->timers = new SplObjectStorage();
$this->signals = new SignalsHandler();
}

public function addReadStream($stream, $listener)
{
$key = (int)$stream;

if (isset($this->readStreams[$key])) {
return;
}

$callback = $this->getStreamListenerClosure($stream, $listener);
$event = $this->loop->io($stream, Ev::READ, $callback);
$this->readStreams[$key] = $event;
}







private function getStreamListenerClosure($stream, $listener)
{
return function () use ($stream, $listener) {
\call_user_func($listener, $stream);
};
}

public function addWriteStream($stream, $listener)
{
$key = (int)$stream;

if (isset($this->writeStreams[$key])) {
return;
}

$callback = $this->getStreamListenerClosure($stream, $listener);
$event = $this->loop->io($stream, Ev::WRITE, $callback);
$this->writeStreams[$key] = $event;
}

public function removeReadStream($stream)
{
$key = (int)$stream;

if (!isset($this->readStreams[$key])) {
return;
}

$this->readStreams[$key]->stop();
unset($this->readStreams[$key]);
}

public function removeWriteStream($stream)
{
$key = (int)$stream;

if (!isset($this->writeStreams[$key])) {
return;
}

$this->writeStreams[$key]->stop();
unset($this->writeStreams[$key]);
}

public function addTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, false);

$that = $this;
$timers = $this->timers;
$callback = function () use ($timer, $timers, $that) {
\call_user_func($timer->getCallback(), $timer);

if ($timers->offsetExists($timer)) {
$that->cancelTimer($timer);
}
};

$event = $this->loop->timer($timer->getInterval(), 0.0, $callback);
$this->timers->offsetSet($timer, $event);

return $timer;
}

public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$callback = function () use ($timer) {
\call_user_func($timer->getCallback(), $timer);
};

$event = $this->loop->timer($timer->getInterval(), $timer->getInterval(), $callback);
$this->timers->offsetSet($timer, $event);

return $timer;
}

public function cancelTimer(TimerInterface $timer)
{
if (!isset($this->timers[$timer])) {
return;
}

$event = $this->timers[$timer];
$event->stop();
$this->timers->offsetUnset($timer);
}

public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$hasPendingCallbacks = !$this->futureTickQueue->isEmpty();
$wasJustStopped = !$this->running;
$nothingLeftToDo = !$this->readStreams
&& !$this->writeStreams
&& !$this->timers->count()
&& $this->signals->isEmpty();

$flags = Ev::RUN_ONCE;
if ($wasJustStopped || $hasPendingCallbacks) {
$flags |= Ev::RUN_NOWAIT;
} elseif ($nothingLeftToDo) {
break;
}

$this->loop->run($flags);
}
}

public function stop()
{
$this->running = false;
}

public function __destruct()
{

foreach ($this->timers as $timer) {
$this->cancelTimer($timer);
}

foreach ($this->readStreams as $key => $stream) {
$this->removeReadStream($key);
}

foreach ($this->writeStreams as $key => $stream) {
$this->removeWriteStream($key);
}
}

public function addSignal($signal, $listener)
{
$this->signals->add($signal, $listener);

if (!isset($this->signalEvents[$signal])) {
$this->signalEvents[$signal] = $this->loop->signal($signal, function() use ($signal) {
$this->signals->call($signal);
});
}
}

public function removeSignal($signal, $listener)
{
$this->signals->remove($signal, $listener);

if (isset($this->signalEvents[$signal])) {
$this->signalEvents[$signal]->stop();
unset($this->signalEvents[$signal]);
}
}
}
<?php

namespace React\EventLoop\Tick;

use SplQueue;









final class FutureTickQueue
{
private $queue;

public function __construct()
{
$this->queue = new SplQueue();
}








public function add($listener)
{
$this->queue->enqueue($listener);
}




public function tick()
{

$count = $this->queue->count();

while ($count--) {
\call_user_func(
$this->queue->dequeue()
);
}
}






public function isEmpty()
{
return $this->queue->isEmpty();
}
}
<?php

namespace React\EventLoop;

interface TimerInterface
{





public function getInterval();






public function getCallback();






public function isPeriodic();
}
<?php

namespace React\EventLoop;




final class Loop
{



private static $instance;


private static $stopped = false;













public static function get()
{
if (self::$instance instanceof LoopInterface) {
return self::$instance;
}

self::$instance = $loop = Factory::create();




$hasRun = false;
$loop->futureTick(function () use (&$hasRun) {
$hasRun = true;
});

$stopped =& self::$stopped;
register_shutdown_function(function () use ($loop, &$hasRun, &$stopped) {

$error = error_get_last();
if ((isset($error['type']) ? $error['type'] : 0) & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR)) {
return;
}

if (!$hasRun && !$stopped) {
$loop->run();
}
});


return self::$instance;
}








public static function set(LoopInterface $loop)
{
self::$instance = $loop;
}










public static function addReadStream($stream, $listener)
{

if (self::$instance === null) {
self::get();
}
self::$instance->addReadStream($stream, $listener);
}










public static function addWriteStream($stream, $listener)
{

if (self::$instance === null) {
self::get();
}
self::$instance->addWriteStream($stream, $listener);
}








public static function removeReadStream($stream)
{
if (self::$instance !== null) {
self::$instance->removeReadStream($stream);
}
}








public static function removeWriteStream($stream)
{
if (self::$instance !== null) {
self::$instance->removeWriteStream($stream);
}
}









public static function addTimer($interval, $callback)
{

if (self::$instance === null) {
self::get();
}
return self::$instance->addTimer($interval, $callback);
}









public static function addPeriodicTimer($interval, $callback)
{

if (self::$instance === null) {
self::get();
}
return self::$instance->addPeriodicTimer($interval, $callback);
}








public static function cancelTimer(TimerInterface $timer)
{
if (self::$instance !== null) {
self::$instance->cancelTimer($timer);
}
}








public static function futureTick($listener)
{

if (self::$instance === null) {
self::get();
}

self::$instance->futureTick($listener);
}









public static function addSignal($signal, $listener)
{

if (self::$instance === null) {
self::get();
}

self::$instance->addSignal($signal, $listener);
}









public static function removeSignal($signal, $listener)
{
if (self::$instance !== null) {
self::$instance->removeSignal($signal, $listener);
}
}







public static function run()
{

if (self::$instance === null) {
self::get();
}

self::$instance->run();
}







public static function stop()
{
self::$stopped = true;
if (self::$instance !== null) {
self::$instance->stop();
}
}
}
<?php

namespace React\EventLoop;







final class Factory
{





















public static function create()
{
$loop = self::construct();

Loop::set($loop);

return $loop;
}





private static function construct()
{

if (\function_exists('uv_loop_new')) {

return new ExtUvLoop();
}

if (\class_exists('libev\EventLoop', false)) {
return new ExtLibevLoop();
}

if (\class_exists('EvLoop', false)) {
return new ExtEvLoop();
}

if (\class_exists('EventBase', false)) {
return new ExtEventLoop();
}

if (\function_exists('event_base_new') && \PHP_MAJOR_VERSION === 5) {

return new ExtLibeventLoop();
}

return new StreamSelectLoop();

}
}
<?php

namespace React\EventLoop;

use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use React\EventLoop\Timer\Timers;













































final class StreamSelectLoop implements LoopInterface
{

const MICROSECONDS_PER_SECOND = 1000000;

private $futureTickQueue;
private $timers;
private $readStreams = array();
private $readListeners = array();
private $writeStreams = array();
private $writeListeners = array();
private $running;
private $pcntl = false;
private $pcntlPoll = false;
private $signals;

public function __construct()
{
$this->futureTickQueue = new FutureTickQueue();
$this->timers = new Timers();
$this->pcntl = \function_exists('pcntl_signal') && \function_exists('pcntl_signal_dispatch');
$this->pcntlPoll = $this->pcntl && !\function_exists('pcntl_async_signals');
$this->signals = new SignalsHandler();


if ($this->pcntl && !$this->pcntlPoll) {
\pcntl_async_signals(true);
}
}

public function addReadStream($stream, $listener)
{
$key = (int) $stream;

if (!isset($this->readStreams[$key])) {
$this->readStreams[$key] = $stream;
$this->readListeners[$key] = $listener;
}
}

public function addWriteStream($stream, $listener)
{
$key = (int) $stream;

if (!isset($this->writeStreams[$key])) {
$this->writeStreams[$key] = $stream;
$this->writeListeners[$key] = $listener;
}
}

public function removeReadStream($stream)
{
$key = (int) $stream;

unset(
$this->readStreams[$key],
$this->readListeners[$key]
);
}

public function removeWriteStream($stream)
{
$key = (int) $stream;

unset(
$this->writeStreams[$key],
$this->writeListeners[$key]
);
}

public function addTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, false);

$this->timers->add($timer);

return $timer;
}

public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$this->timers->add($timer);

return $timer;
}

public function cancelTimer(TimerInterface $timer)
{
$this->timers->cancel($timer);
}

public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function addSignal($signal, $listener)
{
if ($this->pcntl === false) {
throw new \BadMethodCallException('Event loop feature "signals" isn\'t supported by the "StreamSelectLoop"');
}

$first = $this->signals->count($signal) === 0;
$this->signals->add($signal, $listener);

if ($first) {
\pcntl_signal($signal, array($this->signals, 'call'));
}
}

public function removeSignal($signal, $listener)
{
if (!$this->signals->count($signal)) {
return;
}

$this->signals->remove($signal, $listener);

if ($this->signals->count($signal) === 0) {
\pcntl_signal($signal, \SIG_DFL);
}
}

public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$this->timers->tick();


if (!$this->running || !$this->futureTickQueue->isEmpty()) {
$timeout = 0;


} elseif ($scheduledAt = $this->timers->getFirst()) {
$timeout = $scheduledAt - $this->timers->getTime();
if ($timeout < 0) {
$timeout = 0;
} else {



$timeout *= self::MICROSECONDS_PER_SECOND;
$timeout = $timeout > \PHP_INT_MAX ? \PHP_INT_MAX : (int)$timeout;
}


} elseif ($this->readStreams || $this->writeStreams || !$this->signals->isEmpty()) {
$timeout = null;


} else {
break;
}

$this->waitForStreamActivity($timeout);
}
}

public function stop()
{
$this->running = false;
}






private function waitForStreamActivity($timeout)
{
$read = $this->readStreams;
$write = $this->writeStreams;

$available = $this->streamSelect($read, $write, $timeout);
if ($this->pcntlPoll) {
\pcntl_signal_dispatch();
}
if (false === $available) {


return;
}

foreach ($read as $stream) {
$key = (int) $stream;

if (isset($this->readListeners[$key])) {
\call_user_func($this->readListeners[$key], $stream);
}
}

foreach ($write as $stream) {
$key = (int) $stream;

if (isset($this->writeListeners[$key])) {
\call_user_func($this->writeListeners[$key], $stream);
}
}
}












private function streamSelect(array &$read, array &$write, $timeout)
{
if ($read || $write) {







$except = null;
if (\DIRECTORY_SEPARATOR === '\\') {
$except = array();
foreach ($write as $key => $socket) {
if (!isset($read[$key]) && @\ftell($socket) === 0) {
$except[$key] = $socket;
}
}
}


$previous = \set_error_handler(function ($errno, $errstr) use (&$previous) {


$eintr = \defined('SOCKET_EINTR') ? \SOCKET_EINTR : (\defined('PCNTL_EINTR') ? \PCNTL_EINTR : 4);
if ($errno === \E_WARNING && \strpos($errstr, '[' . $eintr .']: ') !== false) {
return;
}


return ($previous !== null) ? \call_user_func_array($previous, \func_get_args()) : false;
});

try {
$ret = \stream_select($read, $write, $except, $timeout === null ? null : 0, $timeout);
\restore_error_handler();
} catch (\Throwable $e) { 
\restore_error_handler();
throw $e;
} catch (\Exception $e) {
\restore_error_handler();
throw $e;
} 

if ($except) {
$write = \array_merge($write, $except);
}
return $ret;
}

if ($timeout > 0) {
\usleep($timeout);
} elseif ($timeout === null) {


\sleep(PHP_INT_MAX);
}

return 0;
}
}
<?php

namespace React\EventLoop;

use BadMethodCallException;
use Event;
use EventBase;
use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use SplObjectStorage;



























final class ExtLibeventLoop implements LoopInterface
{

const MICROSECONDS_PER_SECOND = 1000000;

private $eventBase;
private $futureTickQueue;
private $timerCallback;
private $timerEvents;
private $streamCallback;
private $readEvents = array();
private $writeEvents = array();
private $readListeners = array();
private $writeListeners = array();
private $running;
private $signals;
private $signalEvents = array();

public function __construct()
{
if (!\function_exists('event_base_new')) {
throw new BadMethodCallException('Cannot create ExtLibeventLoop, ext-libevent extension missing');
}

$this->eventBase = \event_base_new();
$this->futureTickQueue = new FutureTickQueue();
$this->timerEvents = new SplObjectStorage();
$this->signals = new SignalsHandler();

$this->createTimerCallback();
$this->createStreamCallback();
}

public function addReadStream($stream, $listener)
{
$key = (int) $stream;
if (isset($this->readListeners[$key])) {
return;
}

$event = \event_new();
\event_set($event, $stream, \EV_PERSIST | \EV_READ, $this->streamCallback);
\event_base_set($event, $this->eventBase);
\event_add($event);

$this->readEvents[$key] = $event;
$this->readListeners[$key] = $listener;
}

public function addWriteStream($stream, $listener)
{
$key = (int) $stream;
if (isset($this->writeListeners[$key])) {
return;
}

$event = \event_new();
\event_set($event, $stream, \EV_PERSIST | \EV_WRITE, $this->streamCallback);
\event_base_set($event, $this->eventBase);
\event_add($event);

$this->writeEvents[$key] = $event;
$this->writeListeners[$key] = $listener;
}

public function removeReadStream($stream)
{
$key = (int) $stream;

if (isset($this->readListeners[$key])) {
$event = $this->readEvents[$key];
\event_del($event);
\event_free($event);

unset(
$this->readEvents[$key],
$this->readListeners[$key]
);
}
}

public function removeWriteStream($stream)
{
$key = (int) $stream;

if (isset($this->writeListeners[$key])) {
$event = $this->writeEvents[$key];
\event_del($event);
\event_free($event);

unset(
$this->writeEvents[$key],
$this->writeListeners[$key]
);
}
}

public function addTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, false);

$this->scheduleTimer($timer);

return $timer;
}

public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$this->scheduleTimer($timer);

return $timer;
}

public function cancelTimer(TimerInterface $timer)
{
if ($this->timerEvents->contains($timer)) {
$event = $this->timerEvents[$timer];
\event_del($event);
\event_free($event);

$this->timerEvents->detach($timer);
}
}

public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function addSignal($signal, $listener)
{
$this->signals->add($signal, $listener);

if (!isset($this->signalEvents[$signal])) {
$this->signalEvents[$signal] = \event_new();
\event_set($this->signalEvents[$signal], $signal, \EV_PERSIST | \EV_SIGNAL, array($this->signals, 'call'));
\event_base_set($this->signalEvents[$signal], $this->eventBase);
\event_add($this->signalEvents[$signal]);
}
}

public function removeSignal($signal, $listener)
{
$this->signals->remove($signal, $listener);

if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) {
\event_del($this->signalEvents[$signal]);
\event_free($this->signalEvents[$signal]);
unset($this->signalEvents[$signal]);
}
}

public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$flags = \EVLOOP_ONCE;
if (!$this->running || !$this->futureTickQueue->isEmpty()) {
$flags |= \EVLOOP_NONBLOCK;
} elseif (!$this->readEvents && !$this->writeEvents && !$this->timerEvents->count() && $this->signals->isEmpty()) {
break;
}

\event_base_loop($this->eventBase, $flags);
}
}

public function stop()
{
$this->running = false;
}






private function scheduleTimer(TimerInterface $timer)
{
$this->timerEvents[$timer] = $event = \event_timer_new();

\event_timer_set($event, $this->timerCallback, $timer);
\event_base_set($event, $this->eventBase);
\event_add($event, $timer->getInterval() * self::MICROSECONDS_PER_SECOND);
}








private function createTimerCallback()
{
$that = $this;
$timers = $this->timerEvents;
$this->timerCallback = function ($_, $__, $timer) use ($timers, $that) {
\call_user_func($timer->getCallback(), $timer);


if (!$timers->contains($timer)) {
return;
}


if ($timer->isPeriodic()) {
\event_add(
$timers[$timer],
$timer->getInterval() * ExtLibeventLoop::MICROSECONDS_PER_SECOND
);


} else {
$that->cancelTimer($timer);
}
};
}








private function createStreamCallback()
{
$read =& $this->readListeners;
$write =& $this->writeListeners;
$this->streamCallback = function ($stream, $flags) use (&$read, &$write) {
$key = (int) $stream;

if (\EV_READ === (\EV_READ & $flags) && isset($read[$key])) {
\call_user_func($read[$key], $stream);
}

if (\EV_WRITE === (\EV_WRITE & $flags) && isset($write[$key])) {
\call_user_func($write[$key], $stream);
}
};
}
}
<?php

namespace React\EventLoop;




final class SignalsHandler
{
private $signals = array();

public function add($signal, $listener)
{
if (!isset($this->signals[$signal])) {
$this->signals[$signal] = array();
}

if (\in_array($listener, $this->signals[$signal])) {
return;
}

$this->signals[$signal][] = $listener;
}

public function remove($signal, $listener)
{
if (!isset($this->signals[$signal])) {
return;
}

$index = \array_search($listener, $this->signals[$signal], true);
unset($this->signals[$signal][$index]);

if (isset($this->signals[$signal]) && \count($this->signals[$signal]) === 0) {
unset($this->signals[$signal]);
}
}

public function call($signal)
{
if (!isset($this->signals[$signal])) {
return;
}

foreach ($this->signals[$signal] as $listener) {
\call_user_func($listener, $signal);
}
}

public function count($signal)
{
if (!isset($this->signals[$signal])) {
return 0;
}

return \count($this->signals[$signal]);
}

public function isEmpty()
{
return !$this->signals;
}
}
<?php

namespace React\EventLoop;

interface LoopInterface
{
















































public function addReadStream($stream, $listener);

























































public function addWriteStream($stream, $listener);









public function removeReadStream($stream);









public function removeWriteStream($stream);









































































public function addTimer($interval, $callback);





















































































public function addPeriodicTimer($interval, $callback);













public function cancelTimer(TimerInterface $timer);



















































public function futureTick($listener);










































public function addSignal($signal, $listener);















public function removeSignal($signal, $listener);






























public function run();





















public function stop();
}
<?php

namespace React\EventLoop;

use React\EventLoop\Tick\FutureTickQueue;
use React\EventLoop\Timer\Timer;
use SplObjectStorage;












final class ExtUvLoop implements LoopInterface
{
private $uv;
private $futureTickQueue;
private $timers;
private $streamEvents = array();
private $readStreams = array();
private $writeStreams = array();
private $running;
private $signals;
private $signalEvents = array();
private $streamListener;

public function __construct()
{
if (!\function_exists('uv_loop_new')) {
throw new \BadMethodCallException('Cannot create LibUvLoop, ext-uv extension missing');
}

$this->uv = \uv_loop_new();
$this->futureTickQueue = new FutureTickQueue();
$this->timers = new SplObjectStorage();
$this->streamListener = $this->createStreamListener();
$this->signals = new SignalsHandler();
}








public function getUvLoop()
{
return $this->uv;
}




public function addReadStream($stream, $listener)
{
if (isset($this->readStreams[(int) $stream])) {
return;
}

$this->readStreams[(int) $stream] = $listener;
$this->addStream($stream);
}




public function addWriteStream($stream, $listener)
{
if (isset($this->writeStreams[(int) $stream])) {
return;
}

$this->writeStreams[(int) $stream] = $listener;
$this->addStream($stream);
}




public function removeReadStream($stream)
{
if (!isset($this->streamEvents[(int) $stream])) {
return;
}

unset($this->readStreams[(int) $stream]);
$this->removeStream($stream);
}




public function removeWriteStream($stream)
{
if (!isset($this->streamEvents[(int) $stream])) {
return;
}

unset($this->writeStreams[(int) $stream]);
$this->removeStream($stream);
}




public function addTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, false);

$that = $this;
$timers = $this->timers;
$callback = function () use ($timer, $timers, $that) {
\call_user_func($timer->getCallback(), $timer);

if ($timers->offsetExists($timer)) {
$that->cancelTimer($timer);
}
};

$event = \uv_timer_init($this->uv);
$this->timers->offsetSet($timer, $event);
\uv_timer_start(
$event,
$this->convertFloatSecondsToMilliseconds($interval),
0,
$callback
);

return $timer;
}




public function addPeriodicTimer($interval, $callback)
{
$timer = new Timer($interval, $callback, true);

$callback = function () use ($timer) {
\call_user_func($timer->getCallback(), $timer);
};

$interval = $this->convertFloatSecondsToMilliseconds($interval);
$event = \uv_timer_init($this->uv);
$this->timers->offsetSet($timer, $event);
\uv_timer_start(
$event,
$interval,
(int) $interval === 0 ? 1 : $interval,
$callback
);

return $timer;
}




public function cancelTimer(TimerInterface $timer)
{
if (isset($this->timers[$timer])) {
@\uv_timer_stop($this->timers[$timer]);
$this->timers->offsetUnset($timer);
}
}




public function futureTick($listener)
{
$this->futureTickQueue->add($listener);
}

public function addSignal($signal, $listener)
{
$this->signals->add($signal, $listener);

if (!isset($this->signalEvents[$signal])) {
$signals = $this->signals;
$this->signalEvents[$signal] = \uv_signal_init($this->uv);
\uv_signal_start($this->signalEvents[$signal], function () use ($signals, $signal) {
$signals->call($signal);
}, $signal);
}
}

public function removeSignal($signal, $listener)
{
$this->signals->remove($signal, $listener);

if (isset($this->signalEvents[$signal]) && $this->signals->count($signal) === 0) {
\uv_signal_stop($this->signalEvents[$signal]);
unset($this->signalEvents[$signal]);
}
}




public function run()
{
$this->running = true;

while ($this->running) {
$this->futureTickQueue->tick();

$hasPendingCallbacks = !$this->futureTickQueue->isEmpty();
$wasJustStopped = !$this->running;
$nothingLeftToDo = !$this->readStreams
&& !$this->writeStreams
&& !$this->timers->count()
&& $this->signals->isEmpty();




$flags = \UV::RUN_ONCE;
if ($wasJustStopped || $hasPendingCallbacks) {
$flags = \UV::RUN_NOWAIT;
} elseif ($nothingLeftToDo) {
break;
}

\uv_run($this->uv, $flags);
}
}




public function stop()
{
$this->running = false;
}

private function addStream($stream)
{
if (!isset($this->streamEvents[(int) $stream])) {
$this->streamEvents[(int)$stream] = \uv_poll_init_socket($this->uv, $stream);
}

if ($this->streamEvents[(int) $stream] !== false) {
$this->pollStream($stream);
}
}

private function removeStream($stream)
{
if (!isset($this->streamEvents[(int) $stream])) {
return;
}

if (!isset($this->readStreams[(int) $stream])
&& !isset($this->writeStreams[(int) $stream])) {
\uv_poll_stop($this->streamEvents[(int) $stream]);
\uv_close($this->streamEvents[(int) $stream]);
unset($this->streamEvents[(int) $stream]);
return;
}

$this->pollStream($stream);
}

private function pollStream($stream)
{
if (!isset($this->streamEvents[(int) $stream])) {
return;
}

$flags = 0;
if (isset($this->readStreams[(int) $stream])) {
$flags |= \UV::READABLE;
}

if (isset($this->writeStreams[(int) $stream])) {
$flags |= \UV::WRITABLE;
}

\uv_poll_start($this->streamEvents[(int) $stream], $flags, $this->streamListener);
}






private function createStreamListener()
{
$callback = function ($event, $status, $events, $stream) {

if ($status !== 0) {
$this->pollStream($stream);



if ($events === 0) {
$events = \UV::READABLE | \UV::WRITABLE;
}
}

if (isset($this->readStreams[(int) $stream]) && ($events & \UV::READABLE)) {
\call_user_func($this->readStreams[(int) $stream], $stream);
}

if (isset($this->writeStreams[(int) $stream]) && ($events & \UV::WRITABLE)) {
\call_user_func($this->writeStreams[(int) $stream], $stream);
}
};

return $callback;
}





private function convertFloatSecondsToMilliseconds($interval)
{
if ($interval < 0) {
return 0;
}

$maxValue = (int) (\PHP_INT_MAX / 1000);
$intervalOverflow = false;
if (PHP_VERSION_ID > 80499 && $interval >= \PHP_INT_MAX + 1) {
$intervalOverflow = true;
} else {
$intInterval = (int) $interval;
if (($intInterval <= 0 && $interval > 1) || $intInterval >= $maxValue) {
$intervalOverflow = true;
}
}

if ($intervalOverflow) {
throw new \InvalidArgumentException(
"Interval overflow, value must be lower than '{$maxValue}', but '{$interval}' passed."
);
}

return (int) \floor($interval * 1000);
}
}
<?php

namespace React\EventLoop\Timer;

use React\EventLoop\TimerInterface;









final class Timer implements TimerInterface
{
const MIN_INTERVAL = 0.000001;

private $interval;
private $callback;
private $periodic;








public function __construct($interval, $callback, $periodic = false)
{
if ($interval < self::MIN_INTERVAL) {
$interval = self::MIN_INTERVAL;
}

$this->interval = (float) $interval;
$this->callback = $callback;
$this->periodic = (bool) $periodic;
}

public function getInterval()
{
return $this->interval;
}

public function getCallback()
{
return $this->callback;
}

public function isPeriodic()
{
return $this->periodic;
}
}
<?php

namespace React\EventLoop\Timer;

use React\EventLoop\TimerInterface;









final class Timers
{
private $time;
private $timers = array();
private $schedule = array();
private $sorted = true;
private $useHighResolution;

public function __construct()
{

$this->useHighResolution = \function_exists('hrtime');
}

public function updateTime()
{
return $this->time = $this->useHighResolution ? \hrtime(true) * 1e-9 : \microtime(true);
}

public function getTime()
{
return $this->time ?: $this->updateTime();
}

public function add(TimerInterface $timer)
{
$id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer);
$this->timers[$id] = $timer;
$this->schedule[$id] = $timer->getInterval() + $this->updateTime();
$this->sorted = false;
}

public function contains(TimerInterface $timer)
{
$id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer);
return isset($this->timers[$id]);
}

public function cancel(TimerInterface $timer)
{
$id = \PHP_VERSION_ID < 70200 ? \spl_object_hash($timer) : \spl_object_id($timer);
unset($this->timers[$id], $this->schedule[$id]);
}

public function getFirst()
{

if (!$this->sorted) {
$this->sorted = true;
\asort($this->schedule);
}

return \reset($this->schedule);
}

public function isEmpty()
{
return \count($this->timers) === 0;
}

public function tick()
{

if (!$this->schedule) {
return;
}


if (!$this->sorted) {
$this->sorted = true;
\asort($this->schedule);
}

$time = $this->updateTime();

foreach ($this->schedule as $id => $scheduled) {

if ($scheduled >= $time) {
break;
}


if (!isset($this->schedule[$id]) || $this->schedule[$id] !== $scheduled) {
continue;
}

$timer = $this->timers[$id];
\call_user_func($timer->getCallback(), $timer);


if ($timer->isPeriodic() && isset($this->timers[$id])) {
$this->schedule[$id] = $timer->getInterval() + $time;
$this->sorted = false;
} else {
unset($this->timers[$id], $this->schedule[$id]);
}
}
}
}
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.
<?php

if (!function_exists('getallheaders')) {






function getallheaders()
{
$headers = array();

$copy_server = array(
'CONTENT_TYPE' => '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;
}

}
The MIT License (MIT)

Copyright (c) 2016 LTD BeGet

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.
<?xml version="1.0" encoding="utf-8" ?>
<phpdox xmlns="http://xml.phpdox.net/config" silent="false">
    <bootstrap />
    <project name="phpdox" source="${basedir}/src" workdir="${basedir}/documentation/xml">
        <collector publiconly="false" backend="parser" encoding="auto">
            <include mask="*.php" />
            <exclude mask="" />
            <inheritance resolve="true"/>
        </collector>
        <generator output="${basedir}/documentation">
            <enrich base="${basedir}/documentation"/>
            <build engine="html" enabled="true" output="html">
                <template dir="${phpDox.home}/templates/html" />
                <file extension="html" />
            </build>
        </generator>
    </project>
</phpdox><?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator;

use LTDBeget\dns\configurator\deserializer\ArrayDeserializer;
use LTDBeget\dns\configurator\deserializer\PlainDeserializer;
use LTDBeget\dns\configurator\errors\ErrorsStore;
use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\traits\RecordsIterateTrait;
use LTDBeget\dns\configurator\validators\HostnameValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class Zone
{
use RecordsIterateTrait;




private $origin;



private $nodes = [];



private $errorsStore;




public function __construct(string $origin)
{
$this->origin = mb_strtolower(trim($origin));
$this->errorsStore = new ErrorsStore();
}






public static function fromString(string $origin, string $plainData) : Zone
{
return PlainDeserializer::deserialize(new static($origin), $plainData);
}






public static function fromArray(string $origin, array $arrayData) : Zone
{
return ArrayDeserializer::deserialize(new static($origin), $arrayData);
}




public function __toString() : string
{
$this->sort();
$records = [];
foreach ($this->iterateRecords() as $record) {
$records[] = (string) $record;
}

return (string) implode("\n", $records);
}




public function sort()
{
$nodes = $this->nodes;

$_nodes = [];
foreach (['@', 'www', '*'] as $node_name) {
if (isset($nodes[$node_name])) {
$_nodes[$node_name] = $nodes[$node_name];
unset($nodes[$node_name]);
}
}

ksort($nodes, SORT_STRING);
foreach ($nodes as $name => $node) {
$_nodes[$name] = $node;
}
$this->nodes = $_nodes;

foreach ($this->iterateNodes() as $node) {
$node->sort();
}
}




public function iterateNodes() : \Generator
{
foreach ($this->nodes as $node) {
yield $node;
}
}





public function iterateRecords(?eRecordType $type = NULL) : \Generator
{
foreach ($this->iterateNodes() as $node) {
foreach ($node->iterateRecords($type) as $record) {
yield $record;
}
}
}




public function toArray() : array
{
$this->sort();
$records = [];
foreach ($this->iterateRecords() as $record) {
$records[] = $record->toArray();
}

return $records;
}




public function getNodeNames() : array
{
return array_map('strval', array_keys($this->nodes));
}





public function getNode(string $name) : Node
{
$name = mb_strtolower(trim($name));

if (!$this->isNodeExist($name)) {
$this->nodes[$name] = new Node($this, $name);
}

return $this->nodes[$name];
}







public function isNodeExist($name) : bool
{
return array_key_exists(mb_strtolower(trim($name)), $this->nodes);
}




public function removeRecords(?eRecordType $type = NULL)
{
foreach ($this->iterateNodes() as $node) {
foreach ($node->iterateRecords($type) as $record) {
$record->remove();
}
}
}




public function isEmptyZone() : bool
{
$result = true;
foreach ($this->iterateNodes() as $node) {
if(! $node->isEmptyNode()) {
$result = false;
}
}
return $result;
}






public function validate() : bool
{
$errorsStore = $this->getErrorsStore();
$errorsStore->clear();

foreach ($this->iterateNodes() as $node) {
/**
@noinspection */
$node->validate();
}

if (!HostnameValidator::validate($this->getOrigin())) {
$errorsStore->add(ValidationError::makeZoneError($this, eErrorCode::WRONG_ORIGIN()));
}

return !$errorsStore->isHasErrors();
}




public function getErrorsStore()
{
return $this->errorsStore;
}




public function getOrigin() : string
{
return $this->origin;
}




public function clear() : Zone
{
$this
->dropNodes()
->getErrorsStore()
->clear();

return $this;
}




private function dropNodes() : Zone
{
$this->nodes = [];

return $this;
}
}
<?php

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\validators\Int16Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class NaptrRecord extends Record
{



protected $order;



protected $preference;



protected $flags;



protected $services;




protected $regexp;




protected $replacement;













public function __construct(Node $node, int $ttl,
int $order, int $preference, string $flags, string $services,
string $regexp, string $replacement)
{
$this->order = $order;
$this->preference = $preference;
$this->flags = $flags;
$this->services = $services;
$this->regexp = $regexp;
$this->replacement = $replacement;
parent::__construct($node, eRecordType::NAPTR(), $ttl);
}




public function __toString(): string
{
return $this->getMainRecordPart() . ' ' .
implode(' ', [
$this->getOrder(),
$this->getPreference(),
$this->getFlags(),
$this->getServices(),
$this->getRegexp(),
$this->getReplacement()
]);
}




public function getOrder()
{
return $this->order;
}






public function setOrder(Int $order)
{
return $this->setAttribute('order', $order);
}




public function getPreference()
{
return $this->preference;
}






public function setPreference(Int $preference)
{
return $this->setAttribute('preference', $preference);
}




public function getFlags()
{
return $this->flags;
}






public function setFlags(string $flags)
{
return $this->setAttribute('flags', $flags);
}




public function getServices()
{
return $this->services;
}






public function setServices(string $services)
{
return $this->setAttribute('services', $services);
}




public function getRegexp()
{
return $this->regexp;
}






public function setRegexp(string $regexp)
{
return $this->setAttribute('regexp', $regexp);
}




public function getReplacement()
{
return $this->replacement;
}






public function setReplacement(string $replacement)
{
return $this->setAttribute('replacement', $replacement);
}




public function validate(): bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!DnsZoneDomainNameValidator::validate($this->getReplacement())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'replacement'));
}

$integerAttributes = [
'order' => $this->getOrder(),
'preference' => $this->getPreference(),
];

foreach ($integerAttributes as $atr => $value) {
if (!Int16Validator::validate($value)) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_INT16(), $atr));
}
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray(): array
{
return [
'ORDER' => $this->getOrder(),
'PREFERENCE' => $this->getPreference(),
'FLAGS' => $this->getFlags(),
'SERVICES' => $this->getServices(),
'REGEXP' => $this->getRegexp(),
'REPLACEMENT' => $this->getReplacement(),
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\validators\Int16Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class MxRecord extends Record
{



protected $preference;



protected $exchange;









public function __construct(Node $node, $ttl, int $preference, string $exchange)
{
$this->preference = $preference;
$this->exchange = $exchange;
parent::__construct($node, eRecordType::MX(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . " {$this->getPreference()} {$this->getExchange()}";
}




public function getPreference() : int
{
return $this->preference;
}





public function setPreference(int $preference) : MxRecord
{
return $this->setAttribute('preference', $preference);
}




public function getExchange() : string
{
return $this->exchange;
}





public function setExchange(string $exchange) : MxRecord
{
return $this->setAttribute('exchange', $exchange);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!Int16Validator::validate($this->getPreference())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_INT16(), 'preference'));
}

if (!DnsZoneDomainNameValidator::validate($this->getExchange())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'exchange'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'EXCHANGE' => $this->getExchange(),
'PREFERENCE' => $this->getPreference()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\validators\PtrValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class PtrRecord extends Record
{



protected $ptrDName;








public function __construct(Node $node, int $ttl, string $ptrDName)
{
$this->ptrDName = $ptrDName;
parent::__construct($node, eRecordType::PTR(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . " {$this->getPtrDName()}";
}




public function getPtrDName()
{
return $this->ptrDName;
}




public function setPtrDName(string $ptrDName)
{
$this->setAttribute('ptrDName', $ptrDName);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!PtrValidator::validate($this->getPtrValue())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_PTR_NAME(), 'ptrName'));
}

if (!DnsZoneDomainNameValidator::validate($this->getPtrDName())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'ptrDName'));
}

/**
@noinspection */
return parent::validate();
}




private function getPtrValue() : string
{
return "{$this->getNode()->getName()}.{$this->getNode()->getZone()->getOrigin()}.";
}




protected function recordDataToArray() : array
{
return [
'PTRDNAME' => $this->getPtrDName()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class NsRecord extends Record
{



protected $nsdName;








public function __construct(Node $node, $ttl, string $nsdName)
{
$this->nsdName = $nsdName;
parent::__construct($node, eRecordType::NS(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . " {$this->getNsdName()}";
}




public function getNsdName() : string
{
return $this->nsdName;
}




public function setNsdName(string $nsdName)
{
$this->setAttribute('nsdName', $nsdName);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!DnsZoneDomainNameValidator::validate($this->getNsdName())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'nsdName'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'NSDNAME' => $this->getNsdName()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\Ip6Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class AaaaRecord extends Record
{



protected $address;








public function __construct(Node $node, $ttl, string $address)
{
$this->address = $address;
parent::__construct($node, eRecordType::AAAA(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . ' ' . $this->getAddress();
}




public function getAddress() : string
{
return $this->address;
}





public function setAddress(string $address) : AaaaRecord
{
return $this->setAttribute('address', $address);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!Ip6Validator::validate($this->getAddress())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_IP_V6(), 'address'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'ADDRESS' => $this->getAddress()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class CnameRecord extends Record
{



protected $cname;








public function __construct(Node $node, $ttl, string $cname)
{
$this->cname = $cname;
parent::__construct($node, eRecordType::CNAME(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . ' ' . $this->getCname();
}




public function getCname() : string
{
return $this->cname;
}





public function setCname($cname) : CnameRecord
{
return $this->setAttribute('cname', $cname);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!DnsZoneDomainNameValidator::validate($this->getCname())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'cname'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'CNAME' => $this->getCname()
];
}
}<?php

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\Int16Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class CaaRecord extends Record
{

const TAG_ISSUE = 'issue';

const TAG_ISSUEWILD = 'issuewild';

const TAG_IODEF = 'iodef';

const PATTERN_FQDN = '/^([a-z0-9\-]([a-z0-9\-]{0,61}[a-z0-9])?\.)*([a-z0-9]([a-z0-9\-]{0,61}[a-z0-9])?\.)+[a-z0-9-]{2,30}$/i';




protected $flags;



protected $tag;



protected $value;










public function __construct(Node $node, $ttl, int $flags, string $tag, string $value)
{
$this->flags = $flags;
$this->tag = $tag;
$this->value = $this->getFromQuotes($value);
parent::__construct($node, eRecordType::CAA(), $ttl);
}






private function getFromQuotes(string $value)
{
return str_replace(["\n", '"'], "", $value);
}




public function __toString(): string
{
return $this->getMainRecordPart() . " {$this->getFlags()} {$this->getTag()} \"{$this->getValue()}\"";
}




public function getFlags(): Int
{
return $this->flags;
}






public function setFlags(Int $flags): CaaRecord
{
return $this->setAttribute('flags', $flags);
}




public function getTag(): String
{
return $this->tag;
}






public function setTag(String $tag): CaaRecord
{
return $this->setAttribute('tag', $tag);
}




public function getValue(): String
{
return $this->value;
}






public function setValue(String $value): CaaRecord
{
return $this->setAttribute('value', $value);
}





public function validate(): bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!in_array($this->tag, [self::TAG_ISSUE, self::TAG_ISSUEWILD, self::TAG_IODEF])) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_CAA_TAG(), 'tag'));
}

if ($this->flags < 0 || $this->flags > 255) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_CAA_FLAGS(), 'flag'));
}

if (!Int16Validator::validate($this->getFlags())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_INT16(), 'flags'));
}

if (in_array($this->getTag(), [self::TAG_ISSUEWILD, self::TAG_ISSUE]) &&
$this->getValue() !== ';'
) {
$parts = explode(";", $this->getValue());

if (!preg_match(self::PATTERN_FQDN, $parts[0])) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_CAA_VALUE(), 'value'));
}
}

if ($this->getTag() == self::TAG_IODEF) {
if (!filter_var($this->getValue(), FILTER_VALIDATE_EMAIL) && !filter_var($this->getValue(), FILTER_VALIDATE_URL)) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_CAA_VALUE(), 'value'));
}
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray(): array
{
return [
'FLAGS' => $this->getFlags(),
'TAG' => $this->getTag(),
'VALUE' => $this->getValue()
];
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\Int32Validator;
use LTDBeget\dns\configurator\validators\SoaNotInRootValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class SoaRecord extends Record
{



protected $mName;



protected $rName;



protected $serial;



protected $refresh;



protected $retry;



protected $expire;



protected $minimum;














public function __construct
(
Node $node,
int $ttl,
string $mName,
string $rName,
int $serial,
int $refresh,
int $retry,
int $expire,
int $minimum
)
{
$this->mName = $mName;
$this->rName = $rName;
$this->serial = $serial;
$this->refresh = $refresh;
$this->retry = $retry;
$this->expire = $expire;
$this->minimum = $minimum;
parent::__construct($node, eRecordType::SOA(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . ' ' . implode(' ', [
$this->getMName(),
$this->getRName(),
$this->getSerial(),
$this->getRefresh(),
$this->getRetry(),
$this->getExpire(),
$this->getMinimum()
]);
}




public function getMName() : string
{
return $this->mName;
}





public function setMName(string $mName) : SoaRecord
{
return $this->setAttribute('mName', $mName);
}




public function getRName() : string
{
return $this->rName;
}





public function setRName(string $rName) : SoaRecord
{
return $this->setAttribute('rName', $rName);
}




public function getSerial() : int
{
return $this->serial;
}





public function setSerial(int $serial) : SoaRecord
{
return $this->setAttribute('serial', $serial);
}




public function getRefresh() : int
{
return $this->refresh;
}





public function setRefresh(int $refresh) : SoaRecord
{
return $this->setAttribute('refresh', $refresh);
}




public function getRetry() : int
{
return $this->retry;
}





public function setRetry(int $retry) : SoaRecord
{
return $this->setAttribute('retry', $retry);
}




public function getExpire() : int
{
return $this->expire;
}





public function setExpire(int $expire) : SoaRecord
{
return $this->setAttribute('expire', $expire);
}




public function getMinimum() : int
{
return $this->minimum;
}





public function setMinimum(int $minimum) : SoaRecord
{
return $this->setAttribute('minimum', $minimum);
}




public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!SoaNotInRootValidator::validate($this)) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::SOA_RECORD_NOT_IN_ROOT(), 'name'));
}

$attributes = [
'serial' => $this->getSerial(),
'refresh' => $this->getRefresh(),
'retry' => $this->getRetry(),
'expire' => $this->getExpire(),
'minimum' => $this->getMinimum()
];

foreach ($attributes as $atr => $value) {
if (!Int32Validator::validate($value)) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_INT32(), $atr));
}
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'MNAME' => $this->getMName(),
'RNAME' => $this->getRName(),
'SERIAL' => $this->getSerial(),
'REFRESH' => $this->getRefresh(),
'RETRY' => $this->getRetry(),
'EXPIRE' => $this->getExpire(),
'MINIMUM' => $this->getMinimum()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\validators\Int16Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class SrvRecord extends Record
{



protected $priority;



protected $weight;



protected $port;



protected $target;











public function __construct(Node $node, int $ttl, int $priority, int $weight, int $port, string $target)
{
$this->priority = $priority;
$this->weight = $weight;
$this->port = $port;
$this->target = $target;
parent::__construct($node, eRecordType::SRV(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . ' ' .
implode(' ', [
$this->getPriority(),
$this->getWeight(),
$this->getPort(),
$this->getTarget()
]);
}




public function getPriority() : int
{
return $this->priority;
}





public function setPriority(int $priority) : SrvRecord
{
return $this->setAttribute('priority', $priority);
}




public function getWeight() : int
{
return $this->weight;
}





public function setWeight(int $weight) : SrvRecord
{
return $this->setAttribute('weight', $weight);
}




public function getPort() : int
{
return $this->port;
}





public function setPort(int $port) : SrvRecord
{
return $this->setAttribute('port', $port);
}




public function getTarget() : string
{
return $this->target;
}





public function setTarget(string $target) : SrvRecord
{
return $this->setAttribute('target', $target);
}




public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!DnsZoneDomainNameValidator::validate($this->getTarget())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_DOMAIN_NAME(), 'name'));
}

$attributes = [
'priority' => $this->getPriority(),
'weight' => $this->getWeight(),
'port' => $this->getPort()
];

foreach ($attributes as $atr => $value) {
if (!Int16Validator::validate($value)) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_INT16(), $atr));
}
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'PRIORITY' => $this->getPriority(),
'WEIGHT' => $this->getWeight(),
'PORT' => $this->getPort(),
'TARGET' => $this->getTarget()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class TxtRecord extends Record
{



protected $txtData;








public function __construct(Node $node, int $ttl, string $txtData)
{
$this->txtData = $this->sanitizeTxtData($txtData);
parent::__construct($node, eRecordType::TXT(), $ttl);
}





private function sanitizeTxtData(string $txtData) : string
{
$txtDataArray = explode('\"', $txtData);
$txtDataArray = array_map(function ($value) {
return str_replace('"', '\"', $value);
}, $txtDataArray);

return implode('\"', $txtDataArray);
}




public function __toString() : string
{
$splitted_string = $this->splitTxtData();
$spited_with_quotes = array_map(function ($value) {
return "\"$value\"";
}, $splitted_string);

$char_sets = implode("\n", $spited_with_quotes);

if (count($spited_with_quotes) > 1) {
$rdataString = " ( \n" . $char_sets . "\n ) \n";
} else {
$rdataString = ' ' . $char_sets;
}

return $this->getMainRecordPart() . $rdataString;
}





private function splitTxtData(int $length = 255) : array
{
$splitted_string = str_split($this->getTxtData(), $length);

if(count(array_filter($splitted_string, function (string $value) { return $value === '"';}))) {
$splitted_string = $this->splitTxtData(--$length);
}

return $splitted_string;
}




public function getTxtData() : string
{
return $this->txtData;
}





public function setTxtData(string $txtData) : TxtRecord
{
return $this->setAttribute('txtData', $this->sanitizeTxtData($txtData));
}




public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (strlen($this->getTxtData()) === 0) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::EMPTY_TXT(), 'txtData'));
}

if (!ctype_print($this->getTxtData())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::CONTAINS_CONTROL_SYMBOLS(), 'txtData'));
}


if (preg_match('/(?<!\\\\)(?:\\\\\\\\)*\\\\$/', $this->getTxtData()) === 1) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::INCORRECT_ESCAPING(), 'txtData'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'TXTDATA' => $this->getTxtData()
];
}
}<?php

namespace LTDBeget\dns\configurator\zoneEntities\record;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\Ip4Validator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordType;






class ARecord extends Record
{



protected $address;








public function __construct(Node $node, $ttl, string $address)
{
$this->address = $address;
parent::__construct($node, eRecordType::A(), $ttl);
}




public function __toString() : string
{
return $this->getMainRecordPart() . ' ' . $this->getAddress();
}




public function getAddress() : string
{
return $this->address;
}





public function setAddress($address)
{
return $this->setAttribute('address', $address);
}





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!Ip4Validator::validate($this->getAddress())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_IP_V4(), 'address'));
}

/**
@noinspection */
return parent::validate();
}




protected function recordDataToArray() : array
{
return [
'ADDRESS' => $this->getAddress()
];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities\record\base;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\validators\TtlValidator;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordNotification;
use LTDBeget\dns\enums\eRecordType;






abstract class Record
{



private $node;



private $type;



private $ttl;



private $isRemoved = false;



private $hash;








public function __construct(Node $node, eRecordType $type, int $ttl)
{
$this->node = $node;
$this->type = $type;
$this->ttl = $ttl;

$this->refreshHash();
/**
@noinspection */
$this->getNode()->notify($this, eRecordNotification::ADD());
}




protected function refreshHash()
{
$this->hash = md5(((string) $this) . $this->getNode()->getZone()->getOrigin());
}




public function getNode()
{
return $this->node;
}




public function remove()
{
$this->isRemoved = true;
/**
@noinspection */
$this->getNode()->notify($this, eRecordNotification::REMOVE());
}




public function isRemoved()
{
return $this->isRemoved;
}





public function isEqual(Record $record) : bool
{
return $record->getHash() === $this->getHash();
}






public function getHash()
{
return $this->hash;
}




public function toArray() : array
{
return [
'NAME' => $this->getNode()->getName(),
'TTL' => $this->getTtl(),
'TYPE' => (string) $this->getType(),
'RDATA' => $this->recordDataToArray()
];
}




public function getTtl()
{
return $this->ttl;
}




public function setTtl(int $value)
{
$this->setAttribute('ttl', $value);
}




public function getType()
{
return $this->type;
}




abstract protected function recordDataToArray() : array;






protected function setAttribute($name, $value) : self
{
$this->{$name} = $value;
$this->refreshHash();

return $this;
}




abstract public function __toString() : string;





public function validate() : bool
{
$errorStorage = $this->getNode()->getZone()->getErrorsStore();

if (!TtlValidator::validate($this->getTtl())) {
$errorStorage->add(ValidationError::makeRecordError($this, eErrorCode::WRONG_TTL(), 'ttl'));
}

return !$errorStorage->isHasErrors();
}




protected function getMainRecordPart() : string
{
return "{$this->getNode()->getName()} {$this->getTtl()} IN {$this->getType()}";
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities;

use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eRecordType;






class RecordsStore
{



protected $records = [];





public function remove(Record $record) : RecordsStore
{
foreach ($this->records as $key => $recordStored) {
if ($recordStored === $record) {
unset($this->records[$key]);
break;
}
}

return $this;
}





public function append(Record $record) : RecordsStore
{
$this->records[] = $record;

return $this;
}




public function count() : int
{
return count($this->records);
}





public function iterate(?eRecordType $type = NULL) : \Generator
{
foreach ($this->records as $record) {
if (NULL === $type) {
yield $record;
} elseif ($record->getType()->is($type)) {
yield $record;
}
}
}

public function sort()
{
usort($this->records, function (Record $a, Record $b) {
if ($a->getType()->is(eRecordType::SOA)) {
return -1;
} elseif ($b->getType()->is(eRecordType::SOA)) {
return 1;
}

return strcmp($a->getType(), $b->getType());
});
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities;

use LTDBeget\dns\configurator\zoneEntities\record\AaaaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\ARecord;
use LTDBeget\dns\configurator\zoneEntities\record\CaaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\CnameRecord;
use LTDBeget\dns\configurator\zoneEntities\record\MxRecord;
use LTDBeget\dns\configurator\zoneEntities\record\NaptrRecord;
use LTDBeget\dns\configurator\zoneEntities\record\NsRecord;
use LTDBeget\dns\configurator\zoneEntities\record\PtrRecord;
use LTDBeget\dns\configurator\zoneEntities\record\SoaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\SrvRecord;
use LTDBeget\dns\configurator\zoneEntities\record\TxtRecord;






class RecordAppender
{



protected $node;







protected $defaultTtl = 600;




public function __construct(Node $node)
{
$this->node = $node;
}






public function appendARecord(string $address, ?int $ttl = NULL) : ARecord
{
return new ARecord($this->node, $ttl ?? $this->defaultTtl, $address);
}






public function appendAaaaRecord(string $address, ?int $ttl = NULL) : AaaaRecord
{
return new AaaaRecord($this->node, $ttl ?? $this->defaultTtl, $address);
}






public function appendCNameRecord(string $cname, ?int $ttl = NULL) : CnameRecord
{
return new CnameRecord($this->node, $ttl ?? $this->defaultTtl, $cname);
}







public function appendMxRecord(int $preference, string $exchange, ?int $ttl = NULL) : MxRecord
{
return new MxRecord($this->node, $ttl ?? $this->defaultTtl, $preference, $exchange);
}






public function appendNsRecord(string $nsdName, ?int $ttl = NULL) : NsRecord
{
return new NsRecord($this->node, $ttl ?? $this->defaultTtl, $nsdName);
}






public function appendPtrRecord(string $ptrDName, ?int $ttl = NULL) : PtrRecord
{
return new PtrRecord($this->node, $ttl ?? $this->defaultTtl, $ptrDName);
}












public function appendSoaRecord
(
string $mName,
string $rName,
int $serial,
int $refresh,
int $retry,
int $expire,
int $minimum,
?int $ttl = NULL
) : SoaRecord
{
return new SoaRecord(
$this->node,
$ttl ?? $this->defaultTtl,
$mName,
$rName,
$serial,
$refresh,
$retry,
$expire,
$minimum
);
}









public function appendSrvRecord
(
int $priority,
int $weight,
int $port,
string $target,
?int $ttl = NULL
) : SrvRecord
{
return new SrvRecord($this->node, $ttl ?? $this->defaultTtl, $priority, $weight, $port, $target);
}






public function appendTxtRecord(string $txtData, ?int $ttl = NULL) : TxtRecord
{
return new TxtRecord($this->node, $ttl ?? $this->defaultTtl, $txtData);
}









public function appendCaaRecord(int $flags, string $tag, string $value, ?int $ttl = NULL) : CaaRecord
{
return new CaaRecord($this->node, $ttl ?? $this->defaultTtl, $flags, $tag, $value);
}












public function appendNaptrRecord(int $order, int $preference, string $flags, string $services,
string $regexp, string $replacement, ?int $ttl = NULL) : NaptrRecord
{
return new NaptrRecord($this->node, $ttl ?? $this->defaultTtl,
$order, $preference, $flags, $services, $regexp, $replacement);
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\zoneEntities;

use LTDBeget\dns\configurator\errors\ValidationError;
use LTDBeget\dns\configurator\traits\RecordsIterateTrait;
use LTDBeget\dns\configurator\validators\CnameNumberCheck;
use LTDBeget\dns\configurator\validators\ConflictTypesValidator;
use LTDBeget\dns\configurator\validators\DnsZoneDomainNameValidator;
use LTDBeget\dns\configurator\validators\OutOfZoneDataValidator;
use LTDBeget\dns\configurator\validators\SoaNumberCheck;
use LTDBeget\dns\configurator\Zone;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;
use LTDBeget\dns\enums\eRecordNotification;
use LTDBeget\dns\enums\eRecordType;






class Node
{
use RecordsIterateTrait;




private $zone;



private $name;



private $recordAppender;



private $recordsStore;



private $removedRecordsStore;





public function __construct(Zone $zone, string $name)
{
$this->zone = $zone;
$this->name = mb_strtolower(trim($name));
$this->recordAppender = new RecordAppender($this);
$this->recordsStore = new RecordsStore();
$this->removedRecordsStore = new RecordsStore();
}




public function getRecordAppender() : RecordAppender
{
return $this->recordAppender;
}




public function iterateRemoved() : \Generator
{
foreach ($this->getRemovedRecordsStore()->iterate() as $record) {
yield $record;
}
}




protected function getRemovedRecordsStore()
{
return $this->removedRecordsStore;
}




public function removeRecords(?eRecordType $type = NULL)
{
foreach ($this->iterateRecords($type) as $record) {
$record->remove();
}
}





public function iterateRecords(?eRecordType $type = NULL) : \Generator
{
foreach ($this->getRecordsStore()->iterate($type) as $record) {
yield $record;
}
}




protected function getRecordsStore() : RecordsStore
{
return $this->recordsStore;
}




public function isEmptyNode() : bool
{
return $this->getRecordsStore()->count() === 0;
}







public function notify(Record $record, eRecordNotification $notification) : Node
{
switch ($notification) {
case eRecordNotification::ADD:
$this->recordsStore->append($record);
break;
case eRecordNotification::REMOVE:
$this->recordsStore->remove($record);
$this->removedRecordsStore->append($record);
break;
}

return $this;
}

public function sort()
{
$this->getRecordsStore()->sort();
}






public function validate() : bool
{
$errorsStore = $this->getZone()->getErrorsStore();

if (!ConflictTypesValidator::validate($this)) {
$errorsStore->add(ValidationError::makeNodeError($this, eErrorCode::CONFLICT_RECORD_TYPES_ERROR()));
}

if (!CnameNumberCheck::validate($this)) {
$errorsStore->add(ValidationError::makeNodeError($this, eErrorCode::MULTIPLE_CNAME_ERROR()));
}

if ($this->getName() === '@' && !SoaNumberCheck::validate($this)) {
$errorsStore->add(ValidationError::makeNodeError($this, eErrorCode::SOA_ERROR()));
}

if (!OutOfZoneDataValidator::validate($this)) {
$errorsStore->add(ValidationError::makeNodeError($this, eErrorCode::OUT_OF_ZONE_DATE()));
}

$isValidNodeName = DnsZoneDomainNameValidator::validate($this->getName());
foreach ($this->iterateRecords() as $record) {
if(!$isValidNodeName) {
$errorsStore->add(ValidationError::makeRecordError($record, eErrorCode::WRONG_NODE_NAME(), 'name'));
}
/**
@noinspection */
$record->validate();
}

return !$errorsStore->isHasErrors();
}




public function getZone() : Zone
{
return $this->zone;
}




public function getName() : string
{
return $this->name;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;

use LTDBeget\dns\configurator\zoneEntities\Node;






class SoaNumberCheck
{




public static function validate(Node $node) : bool 
{
$records = [];
foreach ($node->iterateSoa() as $record) {
$records[] = $record;
}

return count($records) === 1;
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;






class DnsZoneDomainNameValidator
{




public static function validate(string $hostname) : bool 
{
if (in_array($hostname, ['@', '*'])) {
return true;
}

if (strpos($hostname, '@') !== false && strlen($hostname) > 1) {
return false;
}

$hostname = preg_replace('/^\*\./', '', $hostname); 

$hostnameValidation = HostnameValidator::validate($hostname);

if ($hostnameValidation) {
return true;
}

$ipValidation = Ip4Validator::validate($hostname);

if ($ipValidation) {
return true;
}

return false;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;

use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\enums\eRecordType;






class ConflictTypesValidator
{




public static function validate(Node $node) : bool 
{
$conflictRecordsTypes = [];
$allRecords = [];
foreach ($node->iterateRecords() as $record) {
if (in_array((string) $record->getType(), [
eRecordType::CNAME,
eRecordType::A,
eRecordType::NS
])) {
$conflictRecordsTypes[] = (string) $record->getType();
}
$allRecords[] = (string) $record->getType();

}
$conflictRecordsTypes = array_unique($conflictRecordsTypes);
$conflictRecordsAmount = count($conflictRecordsTypes);

if (count($allRecords) > 1 && in_array(eRecordType::CNAME, $allRecords)) {
return false;
}

return $node->getName() === '@' ? $conflictRecordsAmount <= 2 : $conflictRecordsAmount <= 1;
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;






class PtrValidator
{
const IP4_HOST_RE = '/\.in-addr\.arpa\.$/';
const IP6_FULL_RE = '/^([0-9a-f]\.){32}ip6\.arpa\.$/';





public static function validate(string $value) : bool 
{
if (preg_match(self::IP4_HOST_RE, $value)) {
$flip_ip = preg_replace(self::IP4_HOST_RE, '', $value);
$ip4 = implode('.', array_reverse(explode('.', $flip_ip)));
if (filter_var($ip4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return true;
}
} elseif (preg_match(self::IP6_FULL_RE, $value)) {
return true;
}

return false;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;

use LTDBeget\dns\configurator\zoneEntities\Node;






class OutOfZoneDataValidator
{




public static function validate(Node $node) : bool
{
$origin = $node->getZone()->getOrigin();
$nodeName = $node->getName();

if (substr($nodeName, -1) !== '.') {
return true;
}
$pattern = "/{$origin}\.$/";
if (preg_match($pattern, $nodeName)) {
return true;
}

return false;
}

}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;


use Laminas\Validator\Hostname;






class HostnameValidator
{



static private $instance;




private $validator;




private function __construct() {
$this->validator = new Hostname([
'allow' => Hostname::ALLOW_DNS | Hostname::ALLOW_LOCAL,
'useIdnCheck' => false,
'useTldCheck' => false
]);
}





public static function validate(string $hostname) : bool
{

$hostname = preg_replace('/^_/', '', $hostname);
$hostname = preg_replace('/\._/', '.', $hostname);



$hostname = str_replace('_', '-', $hostname);

foreach (explode('.', $hostname) as $hostPiece) {




if (strlen($hostPiece) > 63)
{
return false;
}
}

return self::getInstance()->validator->isValid($hostname);
}




static private function getInstance()
{
return self::$instance ?? self::$instance = new static();
}
}
<?php
/**
@author:
@date
*/

namespace LTDBeget\dns\configurator\validators;






class Int32Validator
{




public static function validate(int $value) : bool 
{
return $value >= 0 && $value <= 4294967295;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;






class TtlValidator
{




public static function validate(int $value) : bool 
{
return $value >= 0 && $value <= 2147483647;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;

use LTDBeget\dns\configurator\zoneEntities\Node;






class CnameNumberCheck
{




public static function validate(Node $node) : bool 
{
$records = [];
foreach ($node->iterateCname() as $record) {
$records[] = $record;
}

return count($records) <= 1;
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;

use LTDBeget\dns\configurator\zoneEntities\record\SoaRecord;






class SoaNotInRootValidator
{




public static function validate(SoaRecord $record) : bool 
{
return $record->getNode()->getName() === '@';
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;






class Ip6Validator
{




public static function validate(string $value) : bool 
{
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
}
}
<?php
/**
@author:
@date
*/

namespace LTDBeget\dns\configurator\validators;






class Int16Validator
{




public static function validate(int $value) : bool 
{
return $value >= 0 && $value <= 65535;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\validators;






class Ip4Validator
{




public static function validate(string $value) : bool 
{
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\traits;

use BadMethodCallException;
use InvalidArgumentException;
use LTDBeget\dns\configurator\zoneEntities\record\AaaaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\ARecord;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\configurator\zoneEntities\record\CnameRecord;
use LTDBeget\dns\configurator\zoneEntities\record\CaaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\MxRecord;
use LTDBeget\dns\configurator\zoneEntities\record\NsRecord;
use LTDBeget\dns\configurator\zoneEntities\record\PtrRecord;
use LTDBeget\dns\configurator\zoneEntities\record\SoaRecord;
use LTDBeget\dns\configurator\zoneEntities\record\SrvRecord;
use LTDBeget\dns\configurator\zoneEntities\record\TxtRecord;
use LTDBeget\dns\enums\eRecordType;
















trait RecordsIterateTrait
{






public function __call($name, $arguments)
{
try {
$type = eRecordType::get(mb_strtoupper(str_replace('iterate', '', $name)));

return $this->iterateRecords($type);
} catch (InvalidArgumentException $e) {
throw new BadMethodCallException("Method {$name} not found");
}
}





abstract public function iterateRecords(eRecordType $type);
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\errors;

use LTDBeget\dns\configurator\Zone;
use LTDBeget\dns\configurator\zoneEntities\Node;
use LTDBeget\dns\configurator\zoneEntities\record\base\Record;
use LTDBeget\dns\enums\eErrorCode;






class ValidationError
{



private $zone;



private $node;



private $record;



private $errorCode;



private $checkedAttribute;




private function __construct()
{
}






public static function makeZoneError(Zone $zone, eErrorCode $errorCode) : ValidationError
{
$error = new self;
$error->zone = $zone;
$error->errorCode = $errorCode;

return $error;
}






public static function makeNodeError(Node $node, eErrorCode $errorCode) : ValidationError
{
$error = new self;
$error->zone = $node->getZone();
$error->node = $node;
$error->errorCode = $errorCode;

return $error;
}







public static function makeRecordError(Record $record, eErrorCode $errorCode, $checked_atribute) : ValidationError
{
$error = new self;
$error->zone = $record->getNode()->getZone();
$error->node = $record->getNode();
$error->record = $record;
$error->errorCode = $errorCode;
$error->checkedAttribute = $checked_atribute;

return $error;
}




public function toArray() : array
{
$errorArray = [];
$errorArray['code'] = $this->errorCode->getValue();
$errorArray['errorText'] = $this->errorCode->getText();
$errorArray['origin'] = $this->zone->getOrigin();

if (NULL !== $this->node) {
$errorArray['node'] = $this->node->getName();
}

if (NULL !== $this->record) {
$errorArray['recordData'] = $this->record->toArray();
$errorArray['checkedAttribute'] = $this->checkedAttribute;
}

return $errorArray;
}




public function getZone()
{
return $this->zone;
}




public function getNode() : Node
{
if(! $this->isHasNode()) {
throw new \RuntimeException('ValidationError has no Node');
}
return $this->node;
}




public function isHasNode() : bool
{
return NULL !== $this->node;
}




public function getRecord() : Record
{
if(! $this->isHasRecord()) {
throw new \RuntimeException('ValidationError has no Record');
}
return $this->record;
}




public function isHasRecord() : bool
{
return NULL !== $this->record;
}




public function getErrorCode(): eErrorCode
{
return $this->errorCode;
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\errors;






class ErrorsStore
{



private $errors = [];




public function clear() : ErrorsStore
{
$this->errors = [];

return $this;
}




public function add(ValidationError $error)
{
$this->errors[] = $error;
}




public function isHasErrors() : bool
{
return count($this->errors) > 0;
}




public function iterate() : \Generator
{
foreach ($this->errors as $error) {
yield $error;
}
}




public function toArray() : array
{
$errorsAsArray = [];
foreach ($this->errors as $error) {
$errorsAsArray[] = $error->toArray();
}

return $errorsAsArray;
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\deserializer;

use LTDBeget\dns\configurator\Zone;
use LTDBeget\dns\Tokenizer;






class PlainDeserializer
{





public static function deserialize(Zone $zone, string $data) : Zone
{
return ArrayDeserializer::deserialize($zone, Tokenizer::tokenize($data));
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\configurator\deserializer;

use LTDBeget\dns\configurator\Zone;
use LTDBeget\dns\enums\eRecordType;






class ArrayDeserializer
{





public static function deserialize(Zone $zone, array $records) : Zone
{
foreach ($records as $record) {
self::appendRecord($zone, $record);
}

return $zone;
}







protected static function appendRecord(Zone $zone, $record)
{
$node_mame = $record['NAME'];
$record_type = eRecordType::get($record['TYPE']);
$record_ttl = $record['TTL'];
$record_data = $record['RDATA'];
$node = $zone->getNode($node_mame);
$recordAppender = $node->getRecordAppender();

switch ($record_type) {
case eRecordType::A:
$recordAppender->appendARecord(
(string) $record_data['ADDRESS'],
(int) $record_ttl);
break;
case eRecordType::AAAA:
$recordAppender->appendAaaaRecord(
(string) $record_data['ADDRESS'],
(int) $record_ttl);
break;
case eRecordType::CNAME:
$recordAppender->appendCNameRecord(
(string) $record_data['CNAME'],
(int) $record_ttl);
break;
case eRecordType::MX:
$recordAppender->appendMxRecord(
(int) $record_data['PREFERENCE'],
(string) $record_data['EXCHANGE'],
(int) $record_ttl);
break;
case eRecordType::NS:
$recordAppender->appendNsRecord(
(string) $record_data['NSDNAME'],
(int) $record_ttl);
break;
case eRecordType::PTR:
$recordAppender->appendPtrRecord(
(string) $record_data['PTRDNAME'],
(int) $record_ttl);
break;
case eRecordType::SOA:
$recordAppender->appendSoaRecord(
(string) $record_data['MNAME'],
(string) $record_data['RNAME'],
(int) $record_data['SERIAL'],
(int) $record_data['REFRESH'],
(int) $record_data['RETRY'],
(int) $record_data['EXPIRE'],
(int) $record_data['MINIMUM'],
(int) $record_ttl
);
break;
case eRecordType::SRV:
$recordAppender->appendSrvRecord(
(int) $record_data['PRIORITY'],
(int) $record_data['WEIGHT'],
(int) $record_data['PORT'],
(string) $record_data['TARGET'],
(int) $record_ttl
);
break;
case eRecordType::TXT:
$recordAppender->appendTxtRecord(
(string) $record_data['TXTDATA'],
(int) $record_ttl
);
break;
case eRecordType::CAA:
$recordAppender->appendCaaRecord(
(int) $record_data['FLAGS'],
(string) $record_data['TAG'],
(string) $record_data['VALUE'],
(int) $record_ttl
);
break;
case eRecordType::NAPTR:
$recordAppender->appendNaptrRecord(
(int) $record_data['ORDER'],
(int) $record_data['PREFERENCE'],
(string) $record_data['FLAGS'],
(string) $record_data['SERVICES'],
(string) $record_data['REGEXP'],
(string) $record_data['REPLACEMENT'],
(int) $record_ttl
);
break;
}
}

}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\enums;

use MabeEnum\Enum;

/**
@psalm-immutable






*/
class eRecordNotification extends Enum
{
const ADD = 'ADD';
const REMOVE = 'REMOVE';
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\enums;

use MabeEnum\Enum;

/**
@psalm-immutable


























*/
class eErrorCode extends Enum
{





const WRONG_ORIGIN = 1;
const WRONG_NODE_NAME = 2;
const CONFLICT_RECORD_TYPES_ERROR = 3;
const SOA_ERROR = 4;
const WRONG_NS_IN_ROOT = 5;
const SOA_RECORD_NOT_IN_ROOT = 6;
const MULTIPLE_CNAME_ERROR = 7;
const NO_NS_IN_ROOT = 8;
const WRONG_TTL = 9;
const WRONG_IP_V4 = 10;
const WRONG_IP_V6 = 11;
const WRONG_DOMAIN_NAME = 12;
const WRONG_INT16 = 13;
const WRONG_PTR_NAME = 14;
const EMPTY_TXT = 15;
const WRONG_INT32 = 16;
const CONTAINS_CONTROL_SYMBOLS = 17;
const OUT_OF_ZONE_DATE = 18;
const INCORRECT_ESCAPING = 19;
const WRONG_CAA_VALUE = 20;
const WRONG_CAA_FLAGS = 21;
const WRONG_CAA_TAG = 22;






protected static $textForCode = [
self::WRONG_ORIGIN => 'Wrong origin value.',
self::WRONG_NODE_NAME => 'Wrong node name value',
self::CONFLICT_RECORD_TYPES_ERROR => 'Conflict types records in node (A,NS,CNAME)',
self::SOA_ERROR => 'Multiple SOA or no SOA',
self::WRONG_NS_IN_ROOT => 'Wrong ns records in root',
self::SOA_RECORD_NOT_IN_ROOT => 'SOA record not in root',
self::MULTIPLE_CNAME_ERROR => 'Multiple cname record',
self::NO_NS_IN_ROOT => 'No NS records in root',
self::WRONG_TTL => 'Wrong value for TTL',
self::WRONG_IP_V4 => 'Value must be IP v4',
self::WRONG_IP_V6 => 'Value must be IP v6',
self::WRONG_DOMAIN_NAME => 'Value must be correct domain name',
self::WRONG_INT16 => 'Value must be int 16 bit',
self::WRONG_PTR_NAME => 'Wrong PTR record name',
self::EMPTY_TXT => 'Empty txt record',
self::WRONG_INT32 => 'Value must be int 32 bit',
self::CONTAINS_CONTROL_SYMBOLS => 'Value must contain only printable characters, not control',
self::OUT_OF_ZONE_DATE => 'Out of zone data',
self::INCORRECT_ESCAPING => 'Incorrect escaping at the end of line',
self::WRONG_CAA_VALUE => 'Invalid value, check tag and RFC6844',
self::WRONG_CAA_FLAGS => 'Flags must be greater than 0 and less than 255',
self::WRONG_CAA_TAG => 'Invalid tag',
];




public function getText(): string
{
return self::$textForCode[(int)$this->getValue()];
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\enums;

use MabeEnum\Enum;

/**
@psalm-immutable















*/
class eRecordType extends Enum
{
const SOA = 'SOA';
const A = 'A';
const AAAA = 'AAAA';
const CNAME = 'CNAME';
const MX = 'MX';
const NS = 'NS';
const PTR = 'PTR';
const TXT = 'TXT';
const SRV = 'SRV';
const CAA = 'CAA';
const NAPTR = 'NAPTR';
}@ 300 IN SOA (
ns1.beget.ru. hostmaster.beget.ru. 2015060403
 300 600 86400 300
)
@ 600 IN A 5.101.153.38
@ 600 IN AAAA ::ffff:a.b.c.d
@ 300 IN NS ns1.beget.ru.
_xmpp-server._tcp.icq.beget.ru 600 IN SRV 10 0 5247 jabber
autoconfig 600 IN CNAME cf-ssl00000-protected.example.com.
arhangelsk 600 IN MX 10 mx2.beget.ru.
@ 600 IN TXT "Some text" " another Some text"
test 600 IN TXT (;11111
"Some text" ; or like this
" another Some text"
)
testtxt 600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZKI3U+9acu3NfEy0NJHIPydxnPLPpnAJ7k2JdrsLqAK1uouMudHI20pgE8RMldB/TeWKXYoRidcGCZWXleUzldDTwZAMDQNpdH1uuxym0VhoZpPbI1RXwpgHRTbCk49VqlC"
testmx 600    IN MX 20 @;345345
testmx2 600 IN MX 20 .;23''33'123;;123;
_domainkeytxt 600 IN TXT "t=y;o=~;\0";312
www 600 IN TXT "@ A 79.125.10.157 "
txt3 600 IN TXT    "www CNAME ;;;;'werwerwer'\0010"
nstest 300 IN NS ns1
nstest2   300 IN NS 85.249.229.194;111
xn----7sbfndkfpirgcajeli2a4pnc.xn----7sbbfcqfo2cfcagacemif0ap5q 300 IN NS 1.1.1.1
casino 600 IN NS @;234
bonus 600 IN CNAME @;111
;234234;234;234234234234
* 600 IN CNAME s;111
@ 600 IN SRV 10 0 5269 @ ;wer;wer;wer;wer;;
xmpp 600 IN SRV 10 0 5222 81.211.107.230. ;;;werwerwer
www222  0      IN   CNAME   lifun.ru.
46.20.191.35 3600 IN PTR office;1231
;qqq 300 IN OLE "omg"
@ 300 IN CAA 0 issue ";"www 300 IN TXT "hi there"
@ 600 IN A 5.101.153.38
null 600 IN CNAME dev.null
* 600 IN TXT "wild"
46.20.191.35 3600 IN PTR office
;qqq 300 IN OLE "omg"
123 300 IN TXT "foo bar"
5 300 IN TXT "foo bar"
10 300 IN TXT "foo bar"
2 300 IN TXT "foo bar"
The MIT License (MIT)

Copyright (c) 2016 LTD BeGet

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.
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\stringstream;

use LTDBeget\ascii\AsciiChar;







class StringStream
{
private array $stream;
private int $position;
private int $length;




public function __construct(string $string)
{
$this->stream = $this->splitString($string);
$this->length = count($this->stream);
$this->position = 0;
}




public function current(): string
{
return $this->stream[$this->position] ?? '';
}




public function ord(): int
{
$current = $this->current();

return $current === '' ? 0 : ord($current);
}







public function currentAscii(): AsciiChar
{
return AsciiChar::get($this->ord());
}




public function position(): int
{
return $this->position;
}




public function next(): void
{
$this->position = min($this->length, $this->position + 1);
}




public function previous(): void
{
$this->position = max(0, $this->position - 1);
}




public function start(): void
{
$this->position = 0;
}




public function isStart(): bool
{
return $this->position === 0;
}




public function last(): void
{
$this->position = max(0, $this->length - 1);
}




public function end(): void
{
$this->position = $this->length;
}




public function isEnd(): bool
{
return $this->position === $this->length;
}







public function ignoreWhitespace(): void
{
while (!$this->isEnd() && $this->currentAscii()->isWhiteSpace()) {
$this->next();
}
}







public function ignoreHorizontalSpace(): void
{
while (!$this->isEnd() && $this->currentAscii()->isHorizontalSpace()) {
$this->next();
}
}







public function ignoreVerticalSpace(): void
{
while (!$this->isEnd() && $this->currentAscii()->isVerticalSpace()) {
$this->next();
}
}

private function splitString(string $string): array
{
if ($string === '') {
return [];
}

return (array)(preg_split('#(?<!^)(?!$)#u', $string));
}
}
The MIT License (MIT)

Copyright (c) 2016 LTD BeGet

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.
<?php
/**
@author:
@date:
@time:
*/

namespace LTDBeget\ascii;


use MabeEnum\Enum;






































































































































































































































































class AsciiChar extends Enum
{
const NULL = 0;
const HEADING_START = 1;
const TEXT_START = 2;
const TEXT_END = 3;
const TRANSMISSION_END = 4;
const ENQUIRY = 5;
const ACKNOWLEDGMENT = 6;
const BELL = 7;
const BACKSPACE = 8;
const HORIZONTAL_TAB = 9;
const LINE_FEED = 10;
const VERTICAL_TAB = 11;
const FORM_FEED = 12;
const CARRIAGE_RETURN = 13;
const SHIFT_OUT = 14;
const SHIFT_IN = 15;
const DATA_LINE_ESCAPE = 16;
const DEVICE_CONTROL_1 = 17;
const DEVICE_CONTROL_2 = 18;
const DEVICE_CONTROL_3 = 19;
const DEVICE_CONTROL_4 = 20;
const NEGATIVE_ACKNOWLEDGEMENT = 21;
const SYNCHRONOUS_IDLE = 22;
const TRANSMIT_BLOCK_END = 23;
const CANCEL = 24;
const MEDIUM_END = 25;
const SUBSTITUTE = 26;
const ESCAPE = 27;
const FILE_SEPARATOR = 28;
const GROUP_SEPARATOR = 29;
const RECORD_SEPARATOR = 30;
const UNIT_SEPARATOR = 31;
const SPACE = 32;
const EXCLAMATION_MARK = 33;
const DOUBLE_QUOTES = 34;
const HASHTAG = 35;
const DOLLAR = 36;
const PROCENTTECKEN = 37;
const AMPERSAND = 38;
const SINGLE_QUOTE = 39;
const OPEN_BRACKET = 40;
const CLOSE_BRACKET = 41;
const ASTERISK = 42;
const PLUS = 43;
const COMMA = 44;
const HYPHEN = 45;
const DOT = 46;
const SLASH = 47;
const ZERO = 48;
const ONE = 49;
const TWO = 50;
const THREE = 51;
const FOUR = 52;
const FIVE = 53;
const SIX = 54;
const SEVEN = 55;
const EIGHT = 56;
const NINE = 57;
const COLON = 58;
const SEMICOLON = 59;
const LESS_THAN = 60;
const EQUALS = 61;
const GREATER_THAN = 62;
const QUESTION_MARK = 63;
const AT_SYMBOL = 64;
const A_UPPERCASE = 65;
const B_UPPERCASE = 66;
const C_UPPERCASE = 67;
const D_UPPERCASE = 68;
const E_UPPERCASE = 69;
const F_UPPERCASE = 70;
const G_UPPERCASE = 71;
const H_UPPERCASE = 72;
const I_UPPERCASE = 73;
const J_UPPERCASE = 74;
const K_UPPERCASE = 75;
const L_UPPERCASE = 76;
const M_UPPERCASE = 77;
const N_UPPERCASE = 78;
const O_UPPERCASE = 79;
const P_UPPERCASE = 80;
const Q_UPPERCASE = 81;
const R_UPPERCASE = 82;
const S_UPPERCASE = 83;
const T_UPPERCASE = 84;
const U_UPPERCASE = 85;
const V_UPPERCASE = 86;
const W_UPPERCASE = 87;
const X_UPPERCASE = 88;
const Y_UPPERCASE = 89;
const Z_UPPERCASE = 90;
const OPENING_BRACKET = 91;
const BACKSLASH = 92;
const CLOSING_BRACKET = 93;
const CARET = 94;
const UNDERSCORE = 95;
const GRAVE_ACCENT = 96;
const A_LOWERCASE = 97;
const B_LOWERCASE = 98;
const C_LOWERCASE = 99;
const D_LOWERCASE = 100;
const E_LOWERCASE = 101;
const F_LOWERCASE = 102;
const G_LOWERCASE = 103;
const H_LOWERCASE = 104;
const I_LOWERCASE = 105;
const J_LOWERCASE = 106;
const K_LOWERCASE = 107;
const L_LOWERCASE = 108;
const M_LOWERCASE = 109;
const N_LOWERCASE = 110;
const O_LOWERCASE = 111;
const P_LOWERCASE = 112;
const Q_LOWERCASE = 113;
const R_LOWERCASE = 114;
const S_LOWERCASE = 115;
const T_LOWERCASE = 116;
const U_LOWERCASE = 117;
const V_LOWERCASE = 118;
const W_LOWERCASE = 119;
const X_LOWERCASE = 120;
const Y_LOWERCASE = 121;
const Z_LOWERCASE = 122;
const OPENING_BRACE = 123;
const VERTICAL_BAR = 124;
const CLOSING_BRACE = 125;
const TILDE = 126;
const DELETE = 127;
const CODE_128 = 128;
const CODE_129 = 129;
const CODE_130 = 130;
const CODE_131 = 131;
const CODE_132 = 132;
const CODE_133 = 133;
const CODE_134 = 134;
const CODE_135 = 135;
const CODE_136 = 136;
const CODE_137 = 137;
const CODE_138 = 138;
const CODE_139 = 139;
const CODE_140 = 140;
const CODE_141 = 141;
const CODE_142 = 142;
const CODE_143 = 143;
const CODE_144 = 144;
const CODE_145 = 145;
const CODE_146 = 146;
const CODE_147 = 147;
const CODE_148 = 148;
const CODE_149 = 149;
const CODE_150 = 150;
const CODE_151 = 151;
const CODE_152 = 152;
const CODE_153 = 153;
const CODE_154 = 154;
const CODE_155 = 155;
const CODE_156 = 156;
const CODE_157 = 157;
const CODE_158 = 158;
const CODE_159 = 159;
const CODE_160 = 160;
const CODE_161 = 161;
const CODE_162 = 162;
const CODE_163 = 163;
const CODE_164 = 164;
const CODE_165 = 165;
const CODE_166 = 166;
const CODE_167 = 167;
const CODE_168 = 168;
const CODE_169 = 169;
const CODE_170 = 170;
const CODE_171 = 171;
const CODE_172 = 172;
const CODE_173 = 173;
const CODE_174 = 174;
const CODE_175 = 175;
const CODE_176 = 176;
const CODE_177 = 177;
const CODE_178 = 178;
const CODE_179 = 179;
const CODE_180 = 180;
const CODE_181 = 181;
const CODE_182 = 182;
const CODE_183 = 183;
const CODE_184 = 184;
const CODE_185 = 185;
const CODE_186 = 186;
const CODE_187 = 187;
const CODE_188 = 188;
const CODE_189 = 189;
const CODE_190 = 190;
const CODE_191 = 191;
const CODE_192 = 192;
const CODE_193 = 193;
const CODE_194 = 194;
const CODE_195 = 195;
const CODE_196 = 196;
const CODE_197 = 197;
const CODE_198 = 198;
const CODE_199 = 199;
const CODE_200 = 200;
const CODE_201 = 201;
const CODE_202 = 202;
const CODE_203 = 203;
const CODE_204 = 204;
const CODE_205 = 205;
const CODE_206 = 206;
const CODE_207 = 207;
const CODE_208 = 208;
const CODE_209 = 209;
const CODE_210 = 210;
const CODE_211 = 211;
const CODE_212 = 212;
const CODE_213 = 213;
const CODE_214 = 214;
const CODE_215 = 215;
const CODE_216 = 216;
const CODE_217 = 217;
const CODE_218 = 218;
const CODE_219 = 219;
const CODE_220 = 220;
const CODE_221 = 221;
const CODE_222 = 222;
const CODE_223 = 223;
const CODE_224 = 224;
const CODE_225 = 225;
const CODE_226 = 226;
const CODE_227 = 227;
const CODE_228 = 228;
const CODE_229 = 229;
const CODE_230 = 230;
const CODE_231 = 231;
const CODE_232 = 232;
const CODE_233 = 233;
const CODE_234 = 234;
const CODE_235 = 235;
const CODE_236 = 236;
const CODE_237 = 237;
const CODE_238 = 238;
const CODE_239 = 239;
const CODE_240 = 240;
const CODE_241 = 241;
const CODE_242 = 242;
const CODE_243 = 243;
const CODE_244 = 244;
const CODE_245 = 245;
const CODE_246 = 246;
const CODE_247 = 247;
const CODE_248 = 248;
const CODE_249 = 249;
const CODE_250 = 250;
const CODE_251 = 251;
const CODE_252 = 252;
const CODE_253 = 253;
const CODE_254 = 254;
const CODE_255 = 255;




public function isControlChar() : bool
{
return $this->isControlChar ?? $this->isControlChar =
((($dec = $this->getValue()) >= AsciiChar::NULL && $dec <= AsciiChar::UNIT_SEPARATOR) || $dec === AsciiChar::DELETE);
}




public function isPrintableChar() : bool
{
return $this->isPrintableChar ?? $this->isPrintableChar =
((($dec = $this->getValue()) >= AsciiChar::SPACE && $dec <= AsciiChar::TILDE) || $dec >= AsciiChar::CODE_128);
}




public function isWhiteSpace() : bool
{
return $this->isWhiteSpace ?? $this->isWhiteSpace =
($this->isVerticalSpace() || $this->isHorizontalSpace());
}




public function isHorizontalSpace() : bool
{
return $this->isHorizontalSpace ?? $this->isHorizontalSpace =
($dec = $this->getValue()) === AsciiChar::SPACE || $dec === AsciiChar::HORIZONTAL_TAB;
}




public function isVerticalSpace() : bool
{
return $this->isVerticalSpace ?? $this->isVerticalSpace =
($dec = $this->getValue()) === AsciiChar::LINE_FEED || $dec === AsciiChar::VERTICAL_TAB;
}




public function isLetter() : bool
{
return $this->isLetter ?? $this->isLetter =
((($dec = $this->getValue()) >= AsciiChar::A_UPPERCASE && $dec <= AsciiChar::Z_UPPERCASE) ||
($dec >= AsciiChar::A_LOWERCASE && $dec <= AsciiChar::Z_LOWERCASE));
}




public function isDigit() : bool
{
return $this->isDigit ?? $this->isDigit =
($dec = $this->getValue()) >= AsciiChar::ZERO && $dec <= AsciiChar::NINE;
}




public function isExtended() : bool
{
return $this->isExtended ?? $this->isExtended =
$this->getValue() >= AsciiChar::CODE_128;
}




private $isControlChar;




private $isPrintableChar;




private $isWhiteSpace;




private $isHorizontalSpace;




private $isVerticalSpace;




private $isLetter;




private $isDigit;




private $isExtended;
}The MIT License (MIT)

Copyright (c) 2015 LTD BeGet

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.

<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\record;

use LTDBeget\ascii\AsciiChar;
use LTDBeget\dns\SyntaxErrorException;
use LTDBeget\stringstream\StringStream;






class Record
{



private $stream;



private $globalOrigin;



private $globalTtl;




private $tokens = [];



private $isFirst;



private $previousName;










public function __construct
(
StringStream $stream,
?string $globalOrigin = NULL,
?string $globalTtl = NULL,
bool $isFirst = false,
?string $previousName = NULL
)
{
$this->stream = $stream;
$this->globalOrigin = $globalOrigin;
$this->globalTtl = $globalTtl;
$this->isFirst = $isFirst;
$this->previousName = $previousName;
}




public function tokenize() : array
{
if ($this->isRecordClass()) {
if (!empty($this->previousName)) {
$this->tokens['NAME'] = $this->previousName;
} else {
throw new SyntaxErrorException($this->stream);
}

if (!empty($this->globalTtl)) {
$this->tokens['TTL'] = $this->globalTtl;
} else {
throw new SyntaxErrorException($this->stream);
}
goto in;
}

$this->defaultExtractor('NAME');
$this->stream->ignoreHorizontalSpace();

if ($this->isRecordClass()) {
if (!empty($this->globalTtl)) {
$this->tokens['TTL'] = $this->globalTtl;
} elseif (!empty($this->previousName)) {
$this->tokens['TTL'] = $this->tokens['NAME'];
$this->tokens['NAME'] = $this->previousName;
} else {
throw new SyntaxErrorException($this->stream);
}
goto in;
}

$this->defaultExtractor('TTL');
$this->stream->ignoreHorizontalSpace();
in:
$this->extractClass();

$this->stream->ignoreHorizontalSpace();
$this->extractRData();

if($this->globalOrigin && substr($this->tokens['NAME'], -1) !== '.' && $this->tokens['NAME'] !== '@') {
if($this->globalOrigin === '.') {
$this->tokens['NAME'] .= $this->globalOrigin;
} else {
$this->tokens['NAME'] .= '.'.$this->globalOrigin;
}
}

return $this->tokens;
}




private function isRecordClass() : bool
{
if ($this->stream->currentAscii()->is(AsciiChar::I_UPPERCASE())) {
$this->stream->next();
if ($this->stream->currentAscii()->is(AsciiChar::N_UPPERCASE())) {
$this->stream->next();
if ($this->stream->currentAscii()->isHorizontalSpace()) {
$this->stream->previous();
$this->stream->previous();

return true;
}
} else {
$this->stream->previous();
}
}

return false;
}




private function defaultExtractor(string $tokenName)
{
if (!array_key_exists($tokenName, $this->tokens)) {
$this->tokens[$tokenName] = '';
}

start:
$char = $this->stream->currentAscii();
if ($char->isPrintableChar() && !$char->isWhiteSpace()) {
$this->tokens[$tokenName] .= $this->stream->current();
$this->stream->next();
goto start;
}
}

private function extractClass()
{
if ($this->stream->currentAscii()->is(AsciiChar::I_UPPERCASE)) {
$this->stream->next();
if ($this->stream->currentAscii()->is(AsciiChar::N_UPPERCASE)) {
$this->stream->next();

$this->stream->ignoreHorizontalSpace();
$this->defaultExtractor('TYPE');
$this->stream->ignoreHorizontalSpace();

} else {
throw new SyntaxErrorException($this->stream);
}
} else {
if($this->isFirst) {
throw new SyntaxErrorException($this->stream);
} else {
if(RData::isKnownType($this->tokens['NAME']) && ! RData::isKnownType($this->tokens['TTL'])) {

last_chance:
if($this->previousName && $this->globalTtl) {
$this->tokens['TYPE'] = $this->tokens['NAME'];
$this->tokens['NAME'] = $this->previousName;
$this->tokens['TTL'] = $this->globalTtl;
} else {
throw new SyntaxErrorException($this->stream);
}
} elseif(!RData::isKnownType($this->tokens['NAME']) && RData::isKnownType($this->tokens['TTL'])) {
$this->tokens['TYPE'] = $this->tokens['TTL'];
if($this->previousName && ! $this->globalTtl) {
$this->tokens['TTL'] = $this->tokens['NAME'];
$this->tokens['NAME'] = $this->previousName;
} elseif(! $this->previousName && $this->globalTtl) {
$this->tokens['TTL'] = $this->globalTtl;
} elseif($this->previousName && $this->globalTtl) {
$this->tokens['TTL'] = $this->globalTtl;
} else {
throw new SyntaxErrorException($this->stream);
}

} elseif(RData::isKnownType($this->tokens['NAME']) && RData::isKnownType($this->tokens['TTL'])) {
goto last_chance;
} else {
throw new SyntaxErrorException($this->stream);
}

do {
$char = $this->stream->currentAscii();
$this->stream->previous();
} while($char->isWhiteSpace());

do {
$char = $this->stream->currentAscii();
$this->stream->previous();
} while($char->isPrintableChar() && ! $char->isHorizontalSpace());
}
}
}

private function extractRData()
{
$this->tokens['RDATA'] = (new RData($this->stream, $this->tokens['TYPE']))->tokenize();
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns\record;

use LTDBeget\ascii\AsciiChar;
use LTDBeget\dns\SyntaxErrorException;
use LTDBeget\stringstream\StringStream;






class RData
{



private static $rdataFormats = [
'SOA' => [
'MNAME' => 'defaultExtractor',
'RNAME' => 'defaultExtractor',
'SERIAL' => 'defaultExtractor',
'REFRESH' => 'defaultExtractor',
'RETRY' => 'defaultExtractor',
'EXPIRE' => 'defaultExtractor',
'MINIMUM' => 'defaultExtractor',
],
'A' => [
'ADDRESS' => 'defaultExtractor'
],
'AAAA' => [
'ADDRESS' => 'defaultExtractor'
],
'CNAME' => [
'CNAME' => 'defaultExtractor'
],
'MX' => [
'PREFERENCE' => 'defaultExtractor',
'EXCHANGE' => 'defaultExtractor'
],
'NS' => [
'NSDNAME' => 'defaultExtractor'
],
'PTR' => [
'PTRDNAME' => 'defaultExtractor'
],
'SRV' => [
'PRIORITY' => 'defaultExtractor',
'WEIGHT' => 'defaultExtractor',
'PORT' => 'defaultExtractor',
'TARGET' => 'defaultExtractor'
],
'TXT' => [
'TXTDATA' => 'txtExtractor'
],
'CAA' => [
'FLAGS' => 'defaultExtractor',
'TAG' => 'defaultExtractor',
'VALUE' => 'defaultExtractor'
],
'NAPTR' => [
'ORDER' => 'defaultExtractor',
'PREFERENCE' => 'defaultExtractor',
'FLAGS' => 'defaultExtractor',
'SERVICES' => 'defaultExtractor',
'REGEXP' => 'defaultExtractor',
'REPLACEMENT' => 'defaultExtractor'
]
];



private $type;



private $tokens = [];




private $commentOpen = false;




private $multiLineOpened = false;




private $stream;







public function __construct(StringStream $stream, string $type)
{
if (! self::isKnownType($type)) {
throw new SyntaxErrorException($stream);
}

$this->stream = $stream;
$this->type = $type;
}





public static function isKnownType(string $type) : bool
{
return array_key_exists($type, self::$rdataFormats);
}




public function tokenize() : array
{
foreach (self::$rdataFormats[$this->type] as $tokenName => $extractor) {
$this->$extractor($tokenName);
}

$this->endRecord();

return $this->tokens;
}




protected function defaultExtractor(string $tokenName)
{
if($this->multiLineOpened) {
$this->stream->ignoreWhitespace();
} else {
$this->stream->ignoreHorizontalSpace();
}

$this->commentOpen = false;

if (!array_key_exists($tokenName, $this->tokens)) {
$this->tokens[$tokenName] = '';
}

start:

if ($this->stream->isEnd()){
return;
}
$ord = $this->stream->ord();

if($ord === AsciiChar::OPEN_BRACKET && !$this->commentOpen) {
$this->multiLineOpened = true;
$this->stream->next();
goto start;
} elseif($this->multiLineOpened && !$this->commentOpen && $ord === AsciiChar::CLOSE_BRACKET) {
$this->multiLineOpened = false;
$this->stream->next();
goto start;
} elseif($this->multiLineOpened && !$this->commentOpen && $ord === AsciiChar::LINE_FEED) {
$this->stream->next();
goto start;
} elseif($ord === AsciiChar::LINE_FEED && !$this->commentOpen) {
return;
} else {
if($ord === AsciiChar::SEMICOLON) {
$this->stream->previous();
if($this->stream->currentAscii()->isHorizontalSpace()) {

$this->commentOpen = true;
$this->stream->next();
$this->stream->next();
} else {
$this->stream->next();
$this->tokens[$tokenName] .= $this->stream->current();
$this->stream->next();
}
goto start;
} elseif(($this->stream->currentAscii()->isVerticalSpace() || $ord === AsciiChar::NULL) && $this->commentOpen) {
$this->stream->next();
$this->stream->ignoreHorizontalSpace();
$this->commentOpen = false;
goto start;
} elseif($this->commentOpen) {
$this->commentOpen = true;
$this->ignoreComment();
goto start;
} elseif(!$this->commentOpen) {
if($ord === AsciiChar::SPACE && $this->tokens[$tokenName] === '') {
$this->stream->next();
goto start;
} elseif($this->stream->currentAscii()->isWhiteSpace()) {
return;
} else {
$this->tokens[$tokenName] .= $this->stream->current();
$this->stream->next();
if($this->stream->isEnd()) {
$this->tokens[$tokenName] = trim($this->tokens[$tokenName]);
}
goto start;
}
}
}
}

private function ignoreComment()
{
start:
if (!$this->stream->currentAscii()->isVerticalSpace() && !$this->stream->isEnd()) {
$this->stream->next();
goto start;
}
}

protected function endRecord()
{
start:
if ($this->stream->isEnd()) {
return;
}
$ord = $this->stream->ord();
if($ord === AsciiChar::SEMICOLON) {
$this->stream->next();
$this->commentOpen = true;
goto start;
} elseif($this->commentOpen) {
if($ord === AsciiChar::NULL() || $ord === AsciiChar::LINE_FEED) {
$this->commentOpen = false;
goto start;
} else {
$this->stream->next();
$this->commentOpen = true;
goto start;
}
} elseif(!$this->commentOpen) {
if($this->multiLineOpened) {
if($ord === AsciiChar::CLOSE_BRACKET) {
$this->multiLineOpened = false;
}
$this->stream->next();
goto start;
} elseif($ord === AsciiChar::NULL() || $ord === AsciiChar::LINE_FEED) {
return;
}
}
}




private function txtExtractor(string $tokenName)
{
if (!array_key_exists($tokenName, $this->tokens)) {
$this->tokens[$tokenName] = '';
}

start:
if ($this->stream->isEnd()) {
return;
}
$ord = $this->stream->ord();
$this->stream->next();


if($ord === 59) {
$this->commentOpen = true;
goto start;
} elseif($this->commentOpen === true && $ord !== 10) {
$this->commentOpen = true;
goto start;
} elseif($this->commentOpen === true && ($ord === 10 || $ord === 0)) {
$this->stream->previous();
$this->commentOpen = false;
goto start;
} else {

if($ord === 32) {
goto start;
}


if($ord === 34 && !$this->commentOpen) { 
$this->extractCharSet($tokenName);
}


if($ord === 40 && !$this->commentOpen) {
$this->multiLineOpened = true;
goto start;
}


if($this->multiLineOpened && !$this->commentOpen && $ord === 41) {
$this->multiLineOpened = false;
goto start;
}


if($ord === 10 && $this->commentOpen && $this->multiLineOpened) {
goto start;
}


if(!$this->multiLineOpened && ($ord === 10 || $ord === 0)) {
return;
} elseif($this->multiLineOpened && $ord === 10) {
goto start;
}
}
}




private function extractCharSet(string $tokenName)
{
$escaping_open = false;
start:
if ($this->stream->isEnd()) {
throw new SyntaxErrorException($this->stream);
}
$ord = $this->stream->ord();
$this->stream->next();

if(!$escaping_open && $ord === 34) {
$this->txtExtractor($tokenName);
} else {
if($ord === AsciiChar::LINE_FEED || $ord === AsciiChar::VERTICAL_TAB || $ord === AsciiChar::NULL) {
$this->stream->previous();
throw new SyntaxErrorException($this->stream);
}
$this->tokens[$tokenName] .= chr($ord);
$escaping_open = ($ord === 92 && !$escaping_open);
goto start;
}
}
}<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns;

use Exception;
use LTDBeget\stringstream\StringStream;






class SyntaxErrorException extends \RuntimeException
{



private $error_line;



private $unexpected_char;



private $messageTemplate = "Parse error: syntax error, unexpected '%s' on line %d.";








public function __construct(StringStream $stream, int $code = 0, ?Exception $previous = NULL)
{
if ($stream->isEnd()) {
$stream->end();
}

$this->unexpected_char = $stream->current();
$this->error_line = $this->getParseErrorLineNumber($stream);
$message = sprintf($this->messageTemplate, $this->unexpected_char, $this->error_line);
parent::__construct($message, $code, $previous);
}






private function getParseErrorLineNumber(StringStream $stream) : int
{
$parse_error_char_position = $stream->position();
$plain_data = $this->getFullString($stream);
$exploded_by_lines = explode("\n", $plain_data);
foreach ($exploded_by_lines as $key => $line) {
$line_length = strlen($line) + 1;
$parse_error_char_position -= $line_length;
if ($parse_error_char_position < 0) {
return $key + 1;
}
}

return 1;
}





private function getFullString(StringStream $stream) : string
{
$stream->start();
$string = '';
do {
$string .= $stream->current();
$stream->next();
} while (!$stream->isEnd());

return $string;
}




public function getErrorLine()
{
return $this->error_line;
}




public function getUnexpectedChar()
{
return $this->unexpected_char;
}
}
<?php
/**
@author:
@date
@time
*/

namespace LTDBeget\dns;

use LTDBeget\ascii\AsciiChar;
use LTDBeget\dns\record\Record;
use LTDBeget\stringstream\StringStream;






final class Tokenizer
{



private $stream;





private $tokens = [];



private $ttl;



private $origin;



private $allowedGlobalVariables = [
'origin' => true,
'ttl' => true
];




private $recordsAmmount = 0;






private function __construct(string $string)
{
$this->stream = new StringStream($string);
}





public static function tokenize(string $plainData) : array
{
return (new self($plainData))->tokenizeInternal()->tokens;
}




private function tokenizeInternal() : Tokenizer
{
do {
$this->stream->ignoreWhitespace();
if ($this->stream->currentAscii()->is(AsciiChar::DOLLAR)) {
$this->stream->next();
$this->extractGlobalVariable();
} elseif ($this->stream->currentAscii()->is(AsciiChar::SEMICOLON)) {
$this->ignoreComment();
} else {
$this->extractRecord();
$this->stream->ignoreWhitespace();
}
} while (!$this->stream->isEnd());

return $this;
}

private function extractGlobalVariable()
{
$variableName = '';
start:
if ($this->stream->currentAscii()->isLetter()) {
$variableName .= $this->stream->current();
$this->stream->next();
goto start;
} elseif ($this->stream->currentAscii()->isHorizontalSpace()) {
$variableName = mb_strtolower($variableName);
if (!array_key_exists($variableName, $this->allowedGlobalVariables)) {
throw new SyntaxErrorException($this->stream);
}
$this->stream->ignoreHorizontalSpace();
$this->extractGlobalVariableValue($variableName);
} else {
throw new SyntaxErrorException($this->stream);
}
}




private function extractGlobalVariableValue(string $variableName)
{
$this->{$variableName} = '';
start:
$char = $this->stream->currentAscii();
$this->{$variableName} .= '';
if ($char->isLetter() ||
$char->isDigit() ||
$char->is(AsciiChar::UNDERSCORE) ||
$char->is(AsciiChar::DOT) ||
$char->is(AsciiChar::HYPHEN) ||
$char->is(AsciiChar::AT_SYMBOL) ||
$char->is(AsciiChar::ASTERISK)
) {
$this->{$variableName} .= $this->stream->current();
$this->stream->next();
goto start;
} elseif ($char->isWhiteSpace()) {
return;
} else {
throw new SyntaxErrorException($this->stream);
}
}

private function ignoreComment()
{
start:
if (!$this->stream->currentAscii()->isVerticalSpace() && !$this->stream->isEnd()) {
$this->stream->next();
goto start;
}
}

private function extractRecord()
{
$isFirst = $this->recordsAmmount === 0;
if(! $isFirst ) {
$lastParsedRecord = end($this->tokens);
$previousName = $lastParsedRecord['NAME'];
} else {
$previousName = NULL;
}
$this->tokens[] = (new Record($this->stream, $this->origin, $this->ttl, $isFirst, $previousName))->tokenize();
$this->recordsAmmount++;
}
}$ORIGIN example.com.     ; designates the start of this zone file in the namespace
$TTL 1h                  ; default expiration time of all resource records without their own TTL value
example.com.  IN  SOA   ns.example.com. username.example.com. ( 2007120710 1d 2h 4w 1h )
example.com.  IN  NS    ns                    ; ns.example.com is a nameserver for example.com
example.com.  IN  NS    ns.somewhere.example. ; ns.somewhere.example is a backup nameserver for example.com
example.com.  IN  MX    10 mail.example.com.  ; mail.example.com is the mailserver for example.com
@             IN  MX    20 mail2.example.com. ; equivalent to above line, "@" represents zone origin
@             IN  MX    50 mail3              ; equivalent to above line, but using a relative host name
example.com.  IN  A     192.0.2.1             ; IPv4 address for example.com
              IN  AAAA  2001:db8:10::1        ; IPv6 address for example.com
ns            IN  A     192.0.2.2             ; IPv4 address for ns.example.com
              IN  AAAA  2001:db8:10::2        ; IPv6 address for ns.example.com
www           IN  CNAME example.com.          ; www.example.com is an alias for example.com
wwwtest       IN  CNAME www                   ; wwwtest.example.com is another alias for www.example.com
mail          IN  A     192.0.2.3             ; IPv4 address for mail.example.com
mail2         IN  A     192.0.2.4             ; IPv4 address for mail2.example.com
mail3         IN  A     192.0.2.5             ; IPv4 address for mail3.example.comwww 600 IN A 5.101.153.40
$ORIGIN .
$TTL 14400  ; 4 hours
lifun.ru        IN SOA  ns1.lifun.ru. dns-admin.lifun.ru. (
                2009082401 ; serial
                14400      ; refresh (4 hours)
                3600       ; retry (1 hour)
                2592000    ; expire (4 weeks 2 days)
                600        ; minimum (10 minutes)
                )
            NS  ns1.lifun.ru.
            NS  ns1.beget.ru.
            A   81.222.198.165
            MX  10 mail.lifun.ru.
$ORIGIN lifun.ru.
*           A   81.222.198.165
localhost       A   127.0.0.1
ns1         A   81.222.198.162
ns2         A   81.222.131.99
www         CNAME   lifun.ru.
@	3600 IN	SOA     ns1.beget.ru. hostmaster.beget.ru. (
                     2013041517         ; Serial
			   3600		; Refresh
			    600         ; Retry
                          86400         ; Expire
			   3600 )	; Negative Cache TTL
;
@	3600 IN	NS	ns1.beget.ru.
@	3600 IN	NS	ns2.beget.ru.@ 300 IN SOA (
ns1.beget.ru. hostmaster.beget.ru. 2015060403
 300 600 86400 300
)
@ 600 IN A 5.101.153.38
@ 600 IN AAAA ::ffff:a.b.c.d
@ 300 IN NS ns1.beget.ru.
_xmpp-server._tcp.icq.beget.ru 600 IN SRV 10 0 5247 jabber
autoconfig 600 IN CNAME cf-ssl00000-protected.example.com.
arhangelsk 600 IN MX 10 mx2.beget.ru.
@ 600 IN TXT "Some text" " another Some text"
test 600 IN TXT (;11111
"Some text" ; or like this
" another Some text"
)
testtxt 600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZKI3U+9acu3NfEy0NJHIPydxnPLPpnAJ7k2JdrsLqAK1uouMudHI20pgE8RMldB/TeWKXYoRidcGCZWXleUzldDTwZAMDQNpdH1uuxym0VhoZpPbI1RXwpgHRTbCk49VqlC"
testmx 600    IN MX 20 @;345345
testmx2 600 IN MX 20 .;23''33'123;;123;
_domainkeytxt 600 IN TXT "t=y;o=~;\0";312
www 600 IN TXT "@ A 79.125.10.157 "
txt3 600 IN TXT    "www CNAME ;;;;'werwerwer'\0010"
nstest 300 IN NS ns1
nstest2   300 IN NS 85.249.229.194;111
xn----7sbfndkfpirgcajeli2a4pnc.xn----7sbbfcqfo2cfcagacemif0ap5q 300 IN NS 1.1.1.1
casino 600 IN NS @;234
bonus 600 IN CNAME @;111
;234234;234;234234234234
* 600 IN CNAME s;111
@ 600 IN SRV 10 0 5269 @ ;wer;wer;wer;wer;;
xmpp 600 IN SRV 10 0 5222 81.211.107.230. ;;;werwerwer
www222  0      IN   CNAME   lifun.ru.
46.20.191.35 3600 IN PTR office;1231
;qqq 300 IN OLE "omg";
; BIND reverse data file for BEGET-NEW-NET1 5.101.159.0/24 zone
;
$TTL 3600
@   IN  SOA ns1.beget.ru.   hostmaster.beget.ru. (
    2014070701  ; Serial
    3600        ; Refresh
    600         ; Retry
    86400       ; Expire
    3600        ; Negative Cache TTL
)

;; NS
@   IN  NS      ns1.beget.ru.
@   IN  NS      ns2.beget.ru.

;; SYSTEM
1   IN  PTR     rt01.beget.ru.
3   IN  PTR     ns3.beget.ru.
5   IN  PTR     ns5.beget.ru.
11  IN  PTR     ns1.beget.ru.
12  IN  PTR     ns2.beget.com.ua.WTF
@ 600 IN MX 10 mx1.beget.ru.Copyright (c) 2012-2025 Ben Ramsey <ben@benramsey.com>

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.
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Dce;

use Ramsey\Uuid\Exception\DceSecurityException;
use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
use Ramsey\Uuid\Type\Integer as IntegerObject;

use function escapeshellarg;
use function preg_split;
use function str_getcsv;
use function strrpos;
use function strtolower;
use function strtoupper;
use function substr;
use function trim;

use const PREG_SPLIT_NO_EMPTY;




class SystemDceSecurityProvider implements DceSecurityProviderInterface
{





public function getUid(): IntegerObject
{

static $uid = null;

if ($uid instanceof IntegerObject) {
return $uid;
}

if ($uid === null) {
$uid = $this->getSystemUid();
}

if ($uid === '') {
throw new DceSecurityException(
'Unable to get a user identifier using the system DCE Security provider; please provide a custom '
. 'identifier or use a different provider',
);
}

$uid = new IntegerObject($uid);

return $uid;
}






public function getGid(): IntegerObject
{

static $gid = null;

if ($gid instanceof IntegerObject) {
return $gid;
}

if ($gid === null) {
$gid = $this->getSystemGid();
}

if ($gid === '') {
throw new DceSecurityException(
'Unable to get a group identifier using the system DCE Security provider; please provide a custom '
. 'identifier or use a different provider',
);
}

$gid = new IntegerObject($gid);

return $gid;
}




private function getSystemUid(): string
{
if (!$this->hasShellExec()) {
return '';
}

return match ($this->getOs()) {
'WIN' => $this->getWindowsUid(),
default => trim((string) shell_exec('id -u')),
};
}




private function getSystemGid(): string
{
if (!$this->hasShellExec()) {
return '';
}

return match ($this->getOs()) {
'WIN' => $this->getWindowsGid(),
default => trim((string) shell_exec('id -g')),
};
}




private function hasShellExec(): bool
{
return !str_contains(strtolower((string) ini_get('disable_functions')), 'shell_exec');
}




private function getOs(): string
{

$phpOs = constant('PHP_OS');

return strtoupper(substr($phpOs, 0, 3));
}














private function getWindowsUid(): string
{
$response = shell_exec('whoami /user /fo csv /nh');

if ($response === null) {
return '';
}

$sid = str_getcsv(trim((string) $response), escape: '\\')[1] ?? '';

if (($lastHyphen = strrpos($sid, '-')) === false) {
return '';
}

return trim(substr($sid, $lastHyphen + 1));
}











private function getWindowsGid(): string
{
$response = shell_exec('net user %username% | findstr /b /i "Local Group Memberships"');

if ($response === null) {
return '';
}

$userGroups = preg_split('/\s{2,}/', (string) $response, -1, PREG_SPLIT_NO_EMPTY);
$firstGroup = trim($userGroups[1] ?? '', "* \t\n\r\0\x0B");

if ($firstGroup === '') {
return '';
}

$response = shell_exec('wmic group get name,sid | findstr /b /i ' . escapeshellarg($firstGroup));

if ($response === null) {
return '';
}

$userGroup = preg_split('/\s{2,}/', (string) $response, -1, PREG_SPLIT_NO_EMPTY);
$sid = $userGroup[1] ?? '';

if (($lastHyphen = strrpos($sid, '-')) === false) {
return '';
}

return trim(substr($sid, $lastHyphen + 1));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Node;

use Ramsey\Uuid\Exception\NodeException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;

use function array_filter;
use function array_map;
use function array_walk;
use function count;
use function ob_get_clean;
use function ob_start;
use function preg_match;
use function preg_match_all;
use function reset;
use function str_contains;
use function str_replace;
use function strtolower;
use function strtoupper;
use function substr;

use const GLOB_NOSORT;
use const PREG_PATTERN_ORDER;






class SystemNodeProvider implements NodeProviderInterface
{



private const IFCONFIG_PATTERN = '/[^:]([0-9a-f]{2}([:-])[0-9a-f]{2}(\2[0-9a-f]{2}){4})[^:]/i';




private const SYSFS_PATTERN = '/^([0-9a-f]{2}:){5}[0-9a-f]{2}$/i';

public function getNode(): Hexadecimal
{
$node = $this->getNodeFromSystem();

if ($node === '') {
throw new NodeException('Unable to fetch a node for this system');
}

return new Hexadecimal($node);
}




protected function getNodeFromSystem(): string
{

static $node = null;

if ($node !== null) {
return $node;
}


$node = $this->getSysfs();

if ($node === '') {

$node = $this->getIfconfig();
}

$node = str_replace([':', '-'], '', $node);

return $node;
}






protected function getIfconfig(): string
{
if (str_contains(strtolower((string) ini_get('disable_functions')), 'passthru')) {
return '';
}


$phpOs = constant('PHP_OS');

ob_start();
switch (strtoupper(substr($phpOs, 0, 3))) {
case 'WIN':
passthru('ipconfig /all 2>&1');

break;
case 'DAR':
passthru('ifconfig 2>&1');

break;
case 'FRE':
passthru('netstat -i -f link 2>&1');

break;
case 'LIN':
default:
passthru('netstat -ie 2>&1');

break;
}

$ifconfig = (string) ob_get_clean();

if (preg_match_all(self::IFCONFIG_PATTERN, $ifconfig, $matches, PREG_PATTERN_ORDER)) {
foreach ($matches[1] as $iface) {
if ($iface !== '00:00:00:00:00:00' && $iface !== '00-00-00-00-00-00') {
return $iface;
}
}
}

return '';
}




protected function getSysfs(): string
{

$phpOs = constant('PHP_OS');

if (strtoupper($phpOs) !== 'LINUX') {
return '';
}

$addressPaths = glob('/sys/class/net/*/address', GLOB_NOSORT);

if ($addressPaths === false || count($addressPaths) === 0) {
return '';
}


$macs = [];

array_walk($addressPaths, function (string $addressPath) use (&$macs): void {
if (is_readable($addressPath)) {
$macs[] = file_get_contents($addressPath);
}
});


$trim = 'trim';

$macs = array_map($trim, $macs);


$macs = array_filter($macs, function (mixed $address): bool {
assert(is_string($address));

return $address !== '00:00:00:00:00:00' && preg_match(self::SYSFS_PATTERN, $address);
});


$mac = reset($macs);

return (string) $mac;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Node;

use Ramsey\Uuid\Exception\RandomSourceException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Throwable;

use function bin2hex;
use function dechex;
use function hex2bin;
use function hexdec;
use function str_pad;
use function substr;

use const STR_PAD_LEFT;






class RandomNodeProvider implements NodeProviderInterface
{
public function getNode(): Hexadecimal
{
try {
$nodeBytes = random_bytes(6);
} catch (Throwable $exception) {
throw new RandomSourceException($exception->getMessage(), (int) $exception->getCode(), $exception);
}


$nodeMsb = substr($nodeBytes, 0, 3);
$nodeLsb = substr($nodeBytes, 3);


$nodeMsb = hex2bin(str_pad(dechex(hexdec(bin2hex($nodeMsb)) | 0x010000), 6, '0', STR_PAD_LEFT));

return new Hexadecimal(str_pad(bin2hex($nodeMsb . $nodeLsb), 12, '0', STR_PAD_LEFT));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Node;

use Ramsey\Collection\AbstractCollection;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;

/**
@extends







*/
class NodeProviderCollection extends AbstractCollection
{
public function getType(): string
{
return NodeProviderInterface::class;
}






public function unserialize($serialized): void
{

$data = unserialize($serialized, [
'allowed_classes' => [
Hexadecimal::class,
RandomNodeProvider::class,
StaticNodeProvider::class,
SystemNodeProvider::class,
],
]);

/**
@phpstan-ignore-next-line */
$this->data = array_filter($data, fn ($unserialized): bool => $unserialized instanceof NodeProviderInterface);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Node;

use Ramsey\Uuid\Exception\NodeException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;




class FallbackNodeProvider implements NodeProviderInterface
{



public function __construct(private iterable $providers)
{
}

public function getNode(): Hexadecimal
{
$lastProviderException = null;

foreach ($this->providers as $provider) {
try {
return $provider->getNode();
} catch (NodeException $exception) {
$lastProviderException = $exception;

continue;
}
}

throw new NodeException(message: 'Unable to find a suitable node provider', previous: $lastProviderException);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Node;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;

use function dechex;
use function hexdec;
use function str_pad;
use function substr;

use const STR_PAD_LEFT;






class StaticNodeProvider implements NodeProviderInterface
{
private Hexadecimal $node;




public function __construct(Hexadecimal $node)
{
if (strlen($node->toString()) > 12) {
throw new InvalidArgumentException('Static node value cannot be greater than 12 hexadecimal characters');
}

$this->node = $this->setMulticastBit($node);
}

public function getNode(): Hexadecimal
{
return $this->node;
}




private function setMulticastBit(Hexadecimal $node): Hexadecimal
{
$nodeHex = str_pad($node->toString(), 12, '0', STR_PAD_LEFT);
$firstOctet = substr($nodeHex, 0, 2);
$firstOctet = str_pad(dechex(hexdec($firstOctet) | 0x01), 2, '0', STR_PAD_LEFT);

return new Hexadecimal($firstOctet . substr($nodeHex, 2));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider;

use Ramsey\Uuid\Type\Hexadecimal;




interface NodeProviderInterface
{





public function getNode(): Hexadecimal;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Time;

use Ramsey\Uuid\Provider\TimeProviderInterface;
use Ramsey\Uuid\Type\Time;

use function gettimeofday;




class SystemTimeProvider implements TimeProviderInterface
{
public function getTime(): Time
{
$time = gettimeofday();

return new Time($time['sec'], $time['usec']);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider\Time;

use Ramsey\Uuid\Provider\TimeProviderInterface;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\Time;






class FixedTimeProvider implements TimeProviderInterface
{
public function __construct(private Time $time)
{
}






public function setUsec($value): void
{
$this->time = new Time($this->time->getSeconds(), $value);
}






public function setSec($value): void
{
$this->time = new Time($value, $this->time->getMicroseconds());
}

public function getTime(): Time
{
return $this->time;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider;

use Ramsey\Uuid\Rfc4122\UuidV2;
use Ramsey\Uuid\Type\Integer as IntegerObject;






interface DceSecurityProviderInterface
{





public function getUid(): IntegerObject;






public function getGid(): IntegerObject;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Provider;

use Ramsey\Uuid\Type\Time;




interface TimeProviderInterface
{



public function getTime(): Time;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

/**
@immutable



*/
class DegradedUuid extends Uuid
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Builder;

use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;

/**
@immutable


*/
class DefaultUuidBuilder extends Rfc4122UuidBuilder
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Builder;

use Ramsey\Collection\AbstractCollection;
use Ramsey\Uuid\Converter\Number\GenericNumberConverter;
use Ramsey\Uuid\Converter\Time\GenericTimeConverter;
use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
use Ramsey\Uuid\Guid\GuidBuilder;
use Ramsey\Uuid\Math\BrickMathCalculator;
use Ramsey\Uuid\Nonstandard\UuidBuilder as NonstandardUuidBuilder;
use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;
use Traversable;

/**
@extends







*/
class BuilderCollection extends AbstractCollection
{
public function getType(): string
{
return UuidBuilderInterface::class;
}

public function getIterator(): Traversable
{
return parent::getIterator();
}






public function unserialize($serialized): void
{

$data = unserialize($serialized, [
'allowed_classes' => [
BrickMathCalculator::class,
GenericNumberConverter::class,
GenericTimeConverter::class,
GuidBuilder::class,
NonstandardUuidBuilder::class,
PhpTimeConverter::class,
Rfc4122UuidBuilder::class,
],
]);

$this->data = array_filter(
$data,
function ($unserialized): bool {
/**
@phpstan-ignore */
return $unserialized instanceof UuidBuilderInterface;
},
);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Builder;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\Time\DegradedTimeConverter;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\DegradedUuid;
use Ramsey\Uuid\Rfc4122\Fields as Rfc4122Fields;
use Ramsey\Uuid\UuidInterface;

/**
@immutable


*/
class DegradedUuidBuilder implements UuidBuilderInterface
{
private TimeConverterInterface $timeConverter;






public function __construct(
private NumberConverterInterface $numberConverter,
?TimeConverterInterface $timeConverter = null
) {
$this->timeConverter = $timeConverter ?: new DegradedTimeConverter();
}

/**
@phpstan-impure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface
{
return new DegradedUuid(new Rfc4122Fields($bytes), $this->numberConverter, $codec, $this->timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Builder;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\UuidInterface;

/**
@immutable


*/
interface UuidBuilderInterface
{
/**
@pure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Builder;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Exception\BuilderNotFoundException;
use Ramsey\Uuid\Exception\UnableToBuildUuidException;
use Ramsey\Uuid\UuidInterface;

/**
@immutable


*/
class FallbackBuilder implements UuidBuilderInterface
{



public function __construct(private iterable $builders)
{
}

/**
@pure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface
{
$lastBuilderException = null;

foreach ($this->builders as $builder) {
try {
return $builder->build($codec, $bytes);
} catch (UnableToBuildUuidException $exception) {
$lastBuilderException = $exception;

continue;
}
}

throw new BuilderNotFoundException(
'Could not find a suitable builder for the provided codec and fields',
0,
$lastBuilderException,
);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Validator;

use Ramsey\Uuid\Uuid;

use function preg_match;
use function str_replace;

/**
@immutable


*/
final class GenericValidator implements ValidatorInterface
{



private const VALID_PATTERN = '\A[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}\z';




public function getPattern(): string
{
return self::VALID_PATTERN;
}

public function validate(string $uuid): bool
{
/**
@phpstan-ignore */
$uuid = str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}'], '', $uuid);

/**
@phpstan-ignore */
return $uuid === Uuid::NIL || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Validator;

/**
@immutable


*/
interface ValidatorInterface
{





public function getPattern(): string;

/**
@pure






*/
public function validate(string $uuid): bool;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter;

/**
@immutable


*/
interface NumberConverterInterface
{
/**
@pure









*/
public function fromHex(string $hex): string;

/**
@pure







*/
public function toHex(string $number): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Time;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Math\BrickMathCalculator;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Time;

/**
@immutable





*/
class BigNumberTimeConverter implements TimeConverterInterface
{
private TimeConverterInterface $converter;

public function __construct()
{
$this->converter = new GenericTimeConverter(new BrickMathCalculator());
}

public function calculateTime(string $seconds, string $microseconds): Hexadecimal
{
return $this->converter->calculateTime($seconds, $microseconds);
}

public function convertTime(Hexadecimal $uuidTimestamp): Time
{
return $this->converter->convertTime($uuidTimestamp);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Time;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Math\BrickMathCalculator;
use Ramsey\Uuid\Math\CalculatorInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\Time;

use function count;
use function dechex;
use function explode;
use function is_float;
use function is_int;
use function str_pad;
use function strlen;
use function substr;

use const STR_PAD_LEFT;
use const STR_PAD_RIGHT;

/**
@immutable



*/
class PhpTimeConverter implements TimeConverterInterface
{



private const GREGORIAN_TO_UNIX_INTERVALS = 0x01b21dd213814000;




private const SECOND_INTERVALS = 10_000_000;




private const MICROSECOND_INTERVALS = 10;

private int $phpPrecision;
private CalculatorInterface $calculator;
private TimeConverterInterface $fallbackConverter;

public function __construct(
?CalculatorInterface $calculator = null,
?TimeConverterInterface $fallbackConverter = null,
) {
if ($calculator === null) {
$calculator = new BrickMathCalculator();
}

if ($fallbackConverter === null) {
$fallbackConverter = new GenericTimeConverter($calculator);
}

$this->calculator = $calculator;
$this->fallbackConverter = $fallbackConverter;
$this->phpPrecision = (int) ini_get('precision');
}

public function calculateTime(string $seconds, string $microseconds): Hexadecimal
{
$seconds = new IntegerObject($seconds); /**
@phpstan-ignore */
$microseconds = new IntegerObject($microseconds); /**
@phpstan-ignore */



$uuidTime = ((int) $seconds->toString() * self::SECOND_INTERVALS)
+ ((int) $microseconds->toString() * self::MICROSECOND_INTERVALS)
+ self::GREGORIAN_TO_UNIX_INTERVALS;




if (!is_int($uuidTime)) {
return $this->fallbackConverter->calculateTime(
$seconds->toString(),
$microseconds->toString(),
);
}

/**
@phpstan-ignore */
return new Hexadecimal(
str_pad(dechex($uuidTime), 16, '0', STR_PAD_LEFT)
);
}

public function convertTime(Hexadecimal $uuidTimestamp): Time
{
$timestamp = $this->calculator->toInteger($uuidTimestamp);


$splitTime = $this->splitTime(
((int) $timestamp->toString() - self::GREGORIAN_TO_UNIX_INTERVALS) / self::SECOND_INTERVALS,
);

if (count($splitTime) === 0) {
return $this->fallbackConverter->convertTime($uuidTimestamp);
}

/**
@phpstan-ignore */
return new Time($splitTime['sec'], $splitTime['usec']);
}

/**
@pure




*/
private function splitTime(float | int $time): array
{
$split = explode('.', (string) $time, 2);



if (is_float($time) && count($split) === 1) {
return [];
}

if (count($split) === 1) {
return ['sec' => $split[0], 'usec' => '0'];
}




if (strlen($split[1]) < 6 && strlen((string) $time) >= $this->phpPrecision) {
return [];
}

$microseconds = $split[1];



if (strlen($microseconds) > 6) {
$roundingDigit = (int) substr($microseconds, 6, 1);
$microseconds = (int) substr($microseconds, 0, 6);

if ($roundingDigit >= 5) {
$microseconds++;
}
}

return [
'sec' => $split[0],
'usec' => str_pad((string) $microseconds, 6, '0', STR_PAD_RIGHT),
];
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Time;

/**
@immutable



*/
class DegradedTimeConverter extends BigNumberTimeConverter
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Time;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Math\CalculatorInterface;
use Ramsey\Uuid\Math\RoundingMode;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\Time;

use function explode;
use function str_pad;

use const STR_PAD_LEFT;

/**
@immutable



*/
class UnixTimeConverter implements TimeConverterInterface
{
private const MILLISECONDS = 1000;

public function __construct(private CalculatorInterface $calculator)
{
}

public function calculateTime(string $seconds, string $microseconds): Hexadecimal
{
/**
@phpstan-ignore */
$timestamp = new Time($seconds, $microseconds);


$sec = $this->calculator->multiply(
$timestamp->getSeconds(),
new IntegerObject(self::MILLISECONDS) /**
@phpstan-ignore */
);


$usec = $this->calculator->divide(
RoundingMode::DOWN, 
0,
$timestamp->getMicroseconds(),
new IntegerObject(self::MILLISECONDS), /**
@phpstan-ignore */
);


$unixTime = $this->calculator->add($sec, $usec);

/**
@phpstan-ignore */
return new Hexadecimal(
str_pad(
$this->calculator->toHexadecimal($unixTime)->toString(),
12,
'0',
STR_PAD_LEFT
),
);
}

public function convertTime(Hexadecimal $uuidTimestamp): Time
{
$milliseconds = $this->calculator->toInteger($uuidTimestamp);

$unixTimestamp = $this->calculator->divide(
RoundingMode::HALF_UP,
6,
$milliseconds,
new IntegerObject(self::MILLISECONDS), /**
@phpstan-ignore */
);

$split = explode('.', (string) $unixTimestamp, 2);

/**
@phpstan-ignore */
return new Time($split[0], $split[1] ?? '0');
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Time;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Math\CalculatorInterface;
use Ramsey\Uuid\Math\RoundingMode;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\Time;

use function explode;
use function str_pad;

use const STR_PAD_LEFT;

/**
@immutable


*/
class GenericTimeConverter implements TimeConverterInterface
{



private const GREGORIAN_TO_UNIX_INTERVALS = '122192928000000000';




private const SECOND_INTERVALS = '10000000';




private const MICROSECOND_INTERVALS = '10';

public function __construct(private CalculatorInterface $calculator)
{
}

public function calculateTime(string $seconds, string $microseconds): Hexadecimal
{
/**
@phpstan-ignore */
$timestamp = new Time($seconds, $microseconds);


$sec = $this->calculator->multiply(
$timestamp->getSeconds(),
new IntegerObject(self::SECOND_INTERVALS), /**
@phpstan-ignore */
);


$usec = $this->calculator->multiply(
$timestamp->getMicroseconds(),
new IntegerObject(self::MICROSECOND_INTERVALS), /**
@phpstan-ignore */
);

/**
@phpstan-ignore





*/
$uuidTime = $this->calculator->add($sec, $usec, new IntegerObject(self::GREGORIAN_TO_UNIX_INTERVALS));

/**
@phpstan-ignore


*/
return new Hexadecimal(str_pad($this->calculator->toHexadecimal($uuidTime)->toString(), 16, '0', STR_PAD_LEFT));
}

public function convertTime(Hexadecimal $uuidTimestamp): Time
{


$epochNanoseconds = $this->calculator->subtract(
$this->calculator->toInteger($uuidTimestamp),
new IntegerObject(self::GREGORIAN_TO_UNIX_INTERVALS), /**
@phpstan-ignore */
);


$unixTimestamp = $this->calculator->divide(
RoundingMode::HALF_UP,
6,
$epochNanoseconds,
new IntegerObject(self::SECOND_INTERVALS), /**
@phpstan-ignore */
);

$split = explode('.', (string) $unixTimestamp, 2);

/**
@phpstan-ignore */
return new Time($split[0], $split[1] ?? 0);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter;

use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Time;

/**
@immutable


*/
interface TimeConverterInterface
{
/**
@pure










*/
public function calculateTime(string $seconds, string $microseconds): Hexadecimal;

/**
@pure







*/
public function convertTime(Hexadecimal $uuidTimestamp): Time;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Number;

use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Math\CalculatorInterface;
use Ramsey\Uuid\Type\Integer as IntegerObject;

/**
@immutable


*/
class GenericNumberConverter implements NumberConverterInterface
{
public function __construct(private CalculatorInterface $calculator)
{
}

/**
@pure
*/
public function fromHex(string $hex): string
{
return $this->calculator->fromBase($hex, 16)->toString();
}

/**
@pure
*/
public function toHex(string $number): string
{
/**
@phpstan-ignore */
return $this->calculator->toBase(new IntegerObject($number), 16);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Number;

use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Math\BrickMathCalculator;

/**
@immutable





*/
class BigNumberConverter implements NumberConverterInterface
{
private NumberConverterInterface $converter;

public function __construct()
{
$this->converter = new GenericNumberConverter(new BrickMathCalculator());
}

/**
@pure
*/
public function fromHex(string $hex): string
{
return $this->converter->fromHex($hex);
}

/**
@pure
*/
public function toHex(string $number): string
{
return $this->converter->toHex($number);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Converter\Number;

/**
@immutable



*/
class DegradedNumberConverter extends BigNumberConverter
{
}
<?php












declare(strict_types=1);

namespace Ramsey\Uuid;

use DateTimeInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;











function v1($node = null, ?int $clockSeq = null): string
{
return Uuid::uuid1($node, $clockSeq)->toString();
}














function v2(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null,
): string {
return Uuid::uuid2($localDomain, $localIdentifier, $node, $clockSeq)->toString();
}

/**
@pure






*/
function v3($ns, string $name): string
{
return Uuid::uuid3($ns, $name)->toString();
}






function v4(): string
{
return Uuid::uuid4()->toString();
}

/**
@pure






*/
function v5($ns, string $name): string
{
return Uuid::uuid5($ns, $name)->toString();
}










function v6(?Hexadecimal $node = null, ?int $clockSeq = null): string
{
return Uuid::uuid6($node, $clockSeq)->toString();
}









function v7(?DateTimeInterface $dateTime = null): string
{
return Uuid::uuid7($dateTime)->toString();
}

/**
@pure











*/
function v8(string $bytes): string
{
return Uuid::uuid8($bytes)->toString();
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use DateTimeInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Validator\ValidatorInterface;




interface UuidFactoryInterface
{
/**
@pure






*/
public function fromBytes(string $bytes): UuidInterface;











public function fromDateTime(
DateTimeInterface $dateTime,
?Hexadecimal $node = null,
?int $clockSeq = null,
): UuidInterface;

/**
@pure






*/
public function fromInteger(string $integer): UuidInterface;

/**
@pure






*/
public function fromString(string $uuid): UuidInterface;




public function getValidator(): ValidatorInterface;











public function uuid1($node = null, ?int $clockSeq = null): UuidInterface;















public function uuid2(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null,
): UuidInterface;

/**
@pure







*/
public function uuid3($ns, string $name): UuidInterface;






public function uuid4(): UuidInterface;

/**
@pure







*/
public function uuid5($ns, string $name): UuidInterface;










public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use DateTimeInterface;
use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Generator\DceSecurityGeneratorInterface;
use Ramsey\Uuid\Generator\DefaultTimeGenerator;
use Ramsey\Uuid\Generator\NameGeneratorInterface;
use Ramsey\Uuid\Generator\RandomGeneratorInterface;
use Ramsey\Uuid\Generator\TimeGeneratorInterface;
use Ramsey\Uuid\Generator\UnixTimeGenerator;
use Ramsey\Uuid\Lazy\LazyUuidFromString;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Provider\Time\FixedTimeProvider;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\Time;
use Ramsey\Uuid\Validator\ValidatorInterface;

use function bin2hex;
use function hex2bin;
use function pack;
use function str_pad;
use function strtolower;
use function substr;
use function substr_replace;
use function unpack;

use const STR_PAD_LEFT;

class UuidFactory implements UuidFactoryInterface
{
private CodecInterface $codec;
private DceSecurityGeneratorInterface $dceSecurityGenerator;
private NameGeneratorInterface $nameGenerator;
private NodeProviderInterface $nodeProvider;
private NumberConverterInterface $numberConverter;
private RandomGeneratorInterface $randomGenerator;
private TimeConverterInterface $timeConverter;
private TimeGeneratorInterface $timeGenerator;
private TimeGeneratorInterface $unixTimeGenerator;
private UuidBuilderInterface $uuidBuilder;
private ValidatorInterface $validator;




private bool $isDefaultFeatureSet;




public function __construct(?FeatureSet $features = null)
{
$this->isDefaultFeatureSet = $features === null;

$features = $features ?: new FeatureSet();

$this->codec = $features->getCodec();
$this->dceSecurityGenerator = $features->getDceSecurityGenerator();
$this->nameGenerator = $features->getNameGenerator();
$this->nodeProvider = $features->getNodeProvider();
$this->numberConverter = $features->getNumberConverter();
$this->randomGenerator = $features->getRandomGenerator();
$this->timeConverter = $features->getTimeConverter();
$this->timeGenerator = $features->getTimeGenerator();
$this->uuidBuilder = $features->getBuilder();
$this->validator = $features->getValidator();
$this->unixTimeGenerator = $features->getUnixTimeGenerator();
}




public function getCodec(): CodecInterface
{
return $this->codec;
}






public function setCodec(CodecInterface $codec): void
{
$this->isDefaultFeatureSet = false;

$this->codec = $codec;
}




public function getNameGenerator(): NameGeneratorInterface
{
return $this->nameGenerator;
}






public function setNameGenerator(NameGeneratorInterface $nameGenerator): void
{
$this->isDefaultFeatureSet = false;

$this->nameGenerator = $nameGenerator;
}




public function getNodeProvider(): NodeProviderInterface
{
return $this->nodeProvider;
}




public function getRandomGenerator(): RandomGeneratorInterface
{
return $this->randomGenerator;
}




public function getTimeGenerator(): TimeGeneratorInterface
{
return $this->timeGenerator;
}






public function setTimeGenerator(TimeGeneratorInterface $generator): void
{
$this->isDefaultFeatureSet = false;

$this->timeGenerator = $generator;
}




public function getDceSecurityGenerator(): DceSecurityGeneratorInterface
{
return $this->dceSecurityGenerator;
}







public function setDceSecurityGenerator(DceSecurityGeneratorInterface $generator): void
{
$this->isDefaultFeatureSet = false;

$this->dceSecurityGenerator = $generator;
}




public function getNumberConverter(): NumberConverterInterface
{
return $this->numberConverter;
}






public function setRandomGenerator(RandomGeneratorInterface $generator): void
{
$this->isDefaultFeatureSet = false;

$this->randomGenerator = $generator;
}







public function setNumberConverter(NumberConverterInterface $converter): void
{
$this->isDefaultFeatureSet = false;

$this->numberConverter = $converter;
}




public function getUuidBuilder(): UuidBuilderInterface
{
return $this->uuidBuilder;
}






public function setUuidBuilder(UuidBuilderInterface $builder): void
{
$this->isDefaultFeatureSet = false;

$this->uuidBuilder = $builder;
}

public function getValidator(): ValidatorInterface
{
return $this->validator;
}






public function setValidator(ValidatorInterface $validator): void
{
$this->isDefaultFeatureSet = false;

$this->validator = $validator;
}

/**
@pure
*/
public function fromBytes(string $bytes): UuidInterface
{
return $this->codec->decodeBytes($bytes);
}

/**
@pure
*/
public function fromString(string $uuid): UuidInterface
{
$uuid = strtolower($uuid);

return $this->codec->decode($uuid);
}

/**
@pure
*/
public function fromInteger(string $integer): UuidInterface
{
$hex = $this->numberConverter->toHex($integer);
$hex = str_pad($hex, 32, '0', STR_PAD_LEFT);

return $this->fromString($hex);
}

public function fromDateTime(
DateTimeInterface $dateTime,
?Hexadecimal $node = null,
?int $clockSeq = null,
): UuidInterface {
$timeProvider = new FixedTimeProvider(new Time($dateTime->format('U'), $dateTime->format('u')));
$timeGenerator = new DefaultTimeGenerator($this->nodeProvider, $this->timeConverter, $timeProvider);
$bytes = $timeGenerator->generate($node?->toString(), $clockSeq);

return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_TIME);
}

/**
@pure
*/
public function fromHexadecimal(Hexadecimal $hex): UuidInterface
{
return $this->codec->decode($hex->__toString());
}




public function uuid1($node = null, ?int $clockSeq = null): UuidInterface
{
$bytes = $this->timeGenerator->generate($node, $clockSeq);

return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_TIME);
}

public function uuid2(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null,
): UuidInterface {
$bytes = $this->dceSecurityGenerator->generate($localDomain, $localIdentifier, $node, $clockSeq);

return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_DCE_SECURITY);
}

/**
@pure

*/
public function uuid3($ns, string $name): UuidInterface
{
return $this->uuidFromNsAndName($ns, $name, Uuid::UUID_TYPE_HASH_MD5, 'md5');
}

public function uuid4(): UuidInterface
{
$bytes = $this->randomGenerator->generate(16);

return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_RANDOM);
}

/**
@pure

*/
public function uuid5($ns, string $name): UuidInterface
{
return $this->uuidFromNsAndName($ns, $name, Uuid::UUID_TYPE_HASH_SHA1, 'sha1');
}

public function uuid6(?Hexadecimal $node = null, ?int $clockSeq = null): UuidInterface
{
$bytes = $this->timeGenerator->generate($node?->toString(), $clockSeq);


$v6 = $bytes[6] . $bytes[7] . $bytes[4] . $bytes[5]
. $bytes[0] . $bytes[1] . $bytes[2] . $bytes[3];
$v6 = bin2hex($v6);



$v6Bytes = hex2bin(substr($v6, 1, 12) . '0' . substr($v6, -3));
$v6Bytes .= substr($bytes, 8);

return $this->uuidFromBytesAndVersion($v6Bytes, Uuid::UUID_TYPE_REORDERED_TIME);
}









public function uuid7(?DateTimeInterface $dateTime = null): UuidInterface
{
assert($this->unixTimeGenerator instanceof UnixTimeGenerator);
$bytes = $this->unixTimeGenerator->generate(null, null, $dateTime);

return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_UNIX_TIME);
}

/**
@pure











*/
public function uuid8(string $bytes): UuidInterface
{
/**
@phpstan-ignore */
return $this->uuidFromBytesAndVersion($bytes, Uuid::UUID_TYPE_CUSTOM);
}

/**
@pure








*/
public function uuid(string $bytes): UuidInterface
{
return $this->uuidBuilder->build($this->codec, $bytes);
}

/**
@pure









*/
private function uuidFromNsAndName(
UuidInterface | string $ns,
string $name,
int $version,
string $hashAlgorithm,
): UuidInterface {
if (!($ns instanceof UuidInterface)) {
$ns = $this->fromString($ns);
}

$bytes = $this->nameGenerator->generate($ns, $name, $hashAlgorithm);

/**
@phpstan-ignore */
return $this->uuidFromBytesAndVersion(substr($bytes, 0, 16), $version);
}









private function uuidFromBytesAndVersion(string $bytes, int $version): UuidInterface
{

$unpackedTime = unpack('n*', substr($bytes, 6, 2));
$timeHi = $unpackedTime[1];
$timeHiAndVersion = pack('n*', BinaryUtils::applyVersion($timeHi, $version));


$unpackedClockSeq = unpack('n*', substr($bytes, 8, 2));
$clockSeqHi = $unpackedClockSeq[1];
$clockSeqHiAndReserved = pack('n*', BinaryUtils::applyVariant($clockSeqHi));

$bytes = substr_replace($bytes, $timeHiAndVersion, 6, 2);
$bytes = substr_replace($bytes, $clockSeqHiAndReserved, 8, 2);

if ($this->isDefaultFeatureSet) {
return LazyUuidFromString::fromBytes($bytes);
}

return $this->uuid($bytes);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;




class BinaryUtils
{
/**
@pure








*/
public static function applyVariant(int $clockSeq): int
{
return ($clockSeq & 0x3fff) | 0x8000;
}

/**
@pure









*/
public static function applyVersion(int $timeHi, int $version): int
{
return ($timeHi & 0x0fff) | ($version << 12);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Lazy;

use DateTimeInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Fields\FieldsInterface;
use Ramsey\Uuid\Rfc4122\UuidV1;
use Ramsey\Uuid\Rfc4122\UuidV6;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\UuidFactory;
use Ramsey\Uuid\UuidInterface;
use ValueError;

use function assert;
use function bin2hex;
use function hex2bin;
use function sprintf;
use function str_replace;
use function substr;
















final class LazyUuidFromString implements UuidInterface
{
public const VALID_REGEX = '/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/ms';

private ?UuidInterface $unwrapped = null;




public function __construct(private string $uuid)
{
}

public static function fromBytes(string $bytes): self
{
$base16Uuid = bin2hex($bytes);

return new self(
substr($base16Uuid, 0, 8)
. '-'
. substr($base16Uuid, 8, 4)
. '-'
. substr($base16Uuid, 12, 4)
. '-'
. substr($base16Uuid, 16, 4)
. '-'
. substr($base16Uuid, 20, 12)
);
}

public function serialize(): string
{
return $this->uuid;
}




public function __serialize(): array
{
return ['string' => $this->uuid];
}






public function unserialize(string $data): void
{
$this->uuid = $data;
}




public function __unserialize(array $data): void
{

if (!isset($data['string'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['string']);
}

public function getNumberConverter(): NumberConverterInterface
{
return ($this->unwrapped ?? $this->unwrap())->getNumberConverter();
}




public function getFieldsHex(): array
{
return ($this->unwrapped ?? $this->unwrap())->getFieldsHex();
}

public function getClockSeqHiAndReservedHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSeqHiAndReservedHex();
}

public function getClockSeqLowHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSeqLowHex();
}

public function getClockSequenceHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSequenceHex();
}

public function getDateTime(): DateTimeInterface
{
return ($this->unwrapped ?? $this->unwrap())->getDateTime();
}

public function getLeastSignificantBitsHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getLeastSignificantBitsHex();
}

public function getMostSignificantBitsHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getMostSignificantBitsHex();
}

public function getNodeHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getNodeHex();
}

public function getTimeHiAndVersionHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeHiAndVersionHex();
}

public function getTimeLowHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeLowHex();
}

public function getTimeMidHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeMidHex();
}

public function getTimestampHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimestampHex();
}

public function getUrn(): string
{
return ($this->unwrapped ?? $this->unwrap())->getUrn();
}

public function getVariant(): ?int
{
return ($this->unwrapped ?? $this->unwrap())->getVariant();
}

public function getVersion(): ?int
{
return ($this->unwrapped ?? $this->unwrap())->getVersion();
}

public function compareTo(UuidInterface $other): int
{
return ($this->unwrapped ?? $this->unwrap())->compareTo($other);
}

public function equals(?object $other): bool
{
if (!$other instanceof UuidInterface) {
return false;
}

return $this->uuid === $other->toString();
}

public function getBytes(): string
{
/**
@phpstan-ignore

*/
return (string) hex2bin(str_replace('-', '', $this->uuid));
}

public function getFields(): FieldsInterface
{
return ($this->unwrapped ?? $this->unwrap())->getFields();
}

public function getHex(): Hexadecimal
{
return ($this->unwrapped ?? $this->unwrap())->getHex();
}

public function getInteger(): IntegerObject
{
return ($this->unwrapped ?? $this->unwrap())->getInteger();
}

public function toString(): string
{
return $this->uuid;
}

public function __toString(): string
{
return $this->uuid;
}

public function jsonSerialize(): string
{
return $this->uuid;
}






public function getClockSeqHiAndReserved(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getClockSeqHiAndReserved()->toString());
}






public function getClockSeqLow(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getClockSeqLow()->toString());
}






public function getClockSequence(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getClockSeq()->toString());
}





public function getLeastSignificantBits(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

return $instance->getNumberConverter()->fromHex(substr($instance->getHex()->toString(), 16));
}





public function getMostSignificantBits(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

return $instance->getNumberConverter()->fromHex(substr($instance->getHex()->toString(), 0, 16));
}






public function getNode(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getNode()->toString());
}






public function getTimeHiAndVersion(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getTimeHiAndVersion()->toString());
}






public function getTimeLow(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getTimeLow()->toString());
}






public function getTimeMid(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

return $instance->getNumberConverter()->fromHex($fields->getTimeMid()->toString());
}






public function getTimestamp(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());

$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);

if ($fields->getVersion() !== 1) {
throw new UnsupportedOperationException('Not a time-based UUID');
}

return $instance->getNumberConverter()->fromHex($fields->getTimestamp()->toString());
}

public function toUuidV1(): UuidV1
{
$instance = ($this->unwrapped ?? $this->unwrap());

if ($instance instanceof UuidV1) {
return $instance;
}

assert($instance instanceof UuidV6);

return $instance->toUuidV1();
}

public function toUuidV6(): UuidV6
{
$instance = ($this->unwrapped ?? $this->unwrap());

assert($instance instanceof UuidV6);

return $instance;
}

private function unwrap(): UuidInterface
{
return $this->unwrapped = (new UuidFactory())->fromString($this->uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

/**
@immutable


*/
trait MaxTrait
{
/**
@pure


*/
abstract public function getBytes(): string;

/**
@pure


*/
public function isMax(): bool
{
return $this->getBytes() === "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Exception\InvalidBytesException;
use Ramsey\Uuid\Uuid;

use function decbin;
use function str_pad;
use function str_starts_with;
use function strlen;
use function substr;
use function unpack;

use const STR_PAD_LEFT;

/**
@immutable


*/
trait VariantTrait
{



abstract public function getBytes(): string;















public function getVariant(): int
{
if (strlen($this->getBytes()) !== 16) {
throw new InvalidBytesException('Invalid number of bytes');
}




if ($this->isMax()) {
return Uuid::RESERVED_FUTURE;
}




if ($this->isNil()) {
return Uuid::RESERVED_NCS;
}


$parts = unpack('n*', $this->getBytes());




$msb = substr(str_pad(decbin($parts[5]), 16, '0', STR_PAD_LEFT), 0, 3);

if ($msb === '111') {
return Uuid::RESERVED_FUTURE;
} elseif ($msb === '110') {
return Uuid::RESERVED_MICROSOFT;
} elseif (str_starts_with($msb, '10')) {
return Uuid::RFC_4122;
}

return Uuid::RESERVED_NCS;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Uuid;

/**
@immutable


*/
trait VersionTrait
{
/**
@pure


















*/
abstract public function getVersion(): ?int;




abstract public function isMax(): bool;




abstract public function isNil(): bool;






private function isCorrectVersion(): bool
{
if ($this->isNil() || $this->isMax()) {
return true;
}

return match ($this->getVersion()) {
Uuid::UUID_TYPE_TIME, Uuid::UUID_TYPE_DCE_SECURITY,
Uuid::UUID_TYPE_HASH_MD5, Uuid::UUID_TYPE_RANDOM,
Uuid::UUID_TYPE_HASH_SHA1, Uuid::UUID_TYPE_REORDERED_TIME,
Uuid::UUID_TYPE_UNIX_TIME, Uuid::UUID_TYPE_CUSTOM => true,
default => false,
};
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable





*/
final class UuidV3 extends Uuid implements UuidInterface
{









public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_HASH_MD5) {
throw new InvalidArgumentException(
'Fields used to create a UuidV3 must represent a version 3 (name-based, MD5-hashed) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Nonstandard\UuidV6 as NonstandardUuidV6;

/**
@immutable





*/
final class UuidV6 extends NonstandardUuidV6 implements UuidInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Fields\FieldsInterface as BaseFieldsInterface;
use Ramsey\Uuid\Type\Hexadecimal;

/**
@immutable


















*/
interface FieldsInterface extends BaseFieldsInterface
{



public function getClockSeq(): Hexadecimal;




public function getClockSeqHiAndReserved(): Hexadecimal;




public function getClockSeqLow(): Hexadecimal;




public function getNode(): Hexadecimal;




public function getTimeHiAndVersion(): Hexadecimal;




public function getTimeLow(): Hexadecimal;




public function getTimeMid(): Hexadecimal;




public function getTimestamp(): Hexadecimal;















public function getVariant(): int;

/**
@pure


















*/
public function getVersion(): ?int;

/**
@pure




*/
public function isNil(): bool;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable




*/
final class UuidV7 extends Uuid implements UuidInterface
{
use TimeTrait;










public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_UNIX_TIME) {
throw new InvalidArgumentException(
'Fields used to create a UuidV7 must represent a version 7 (Unix Epoch time) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable




*/
final class UuidV1 extends Uuid implements UuidInterface
{
use TimeTrait;










public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_TIME) {
throw new InvalidArgumentException(
'Fields used to create a UuidV1 must represent a version 1 (time-based) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Fields\SerializableFieldsTrait;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Uuid;

use function bin2hex;
use function dechex;
use function hexdec;
use function sprintf;
use function str_pad;
use function strlen;
use function substr;
use function unpack;

use const STR_PAD_LEFT;

/**
@immutable




*/
final class Fields implements FieldsInterface
{
use MaxTrait;
use NilTrait;
use SerializableFieldsTrait;
use VariantTrait;
use VersionTrait;








public function __construct(private string $bytes)
{
if (strlen($this->bytes) !== 16) {
throw new InvalidArgumentException(
'The byte string must be 16 bytes long; ' . 'received ' . strlen($this->bytes) . ' bytes',
);
}

if (!$this->isCorrectVariant()) {
throw new InvalidArgumentException(
'The byte string received does not conform to the RFC 9562 (formerly RFC 4122) variant',
);
}

if (!$this->isCorrectVersion()) {
throw new InvalidArgumentException(
'The byte string received does not contain a valid RFC 9562 (formerly RFC 4122) version',
);
}
}

/**
@pure
*/
public function getBytes(): string
{
return $this->bytes;
}

public function getClockSeq(): Hexadecimal
{
if ($this->isMax()) {
$clockSeq = 0xffff;
} elseif ($this->isNil()) {
$clockSeq = 0x0000;
} else {
$clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
}

return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
}

public function getClockSeqHiAndReserved(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
}

public function getClockSeqLow(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
}

public function getNode(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
}

public function getTimeHiAndVersion(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 6, 2)));
}

public function getTimeLow(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 0, 4)));
}

public function getTimeMid(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 4, 2)));
}













public function getTimestamp(): Hexadecimal
{
return new Hexadecimal(match ($this->getVersion()) {
Uuid::UUID_TYPE_DCE_SECURITY => sprintf(
'%03x%04s%08s',
hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
$this->getTimeMid()->toString(),
''
),
Uuid::UUID_TYPE_REORDERED_TIME => sprintf(
'%08s%04s%03x',
$this->getTimeLow()->toString(),
$this->getTimeMid()->toString(),
hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff
),


Uuid::UUID_TYPE_UNIX_TIME => sprintf(
'%011s%04s',
$this->getTimeLow()->toString(),
$this->getTimeMid()->toString(),
),
default => sprintf(
'%03x%04s%08s',
hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
$this->getTimeMid()->toString(),
$this->getTimeLow()->toString()
),
});
}

public function getVersion(): ?int
{
if ($this->isNil() || $this->isMax()) {
return null;
}


$parts = unpack('n*', $this->bytes);

return $parts[4] >> 12;
}

private function isCorrectVariant(): bool
{
if ($this->isNil() || $this->isMax()) {
return true;
}

return $this->getVariant() === Uuid::RFC_4122;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\Validator\ValidatorInterface;

use function preg_match;
use function str_replace;

/**
@immutable


*/
final class Validator implements ValidatorInterface
{
private const VALID_PATTERN = '\A[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-'
. '[1-8][0-9A-Fa-f]{3}-[ABab89][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}\z';




public function getPattern(): string
{
return self::VALID_PATTERN;
}

public function validate(string $uuid): bool
{
/**
@phpstan-ignore */
$uuid = strtolower(str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}'], '', $uuid));

/**
@phpstan-ignore */
return $uuid === Uuid::NIL || $uuid === Uuid::MAX || preg_match('/' . self::VALID_PATTERN . '/Dms', $uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Uuid;

/**
@immutable




*/
final class NilUuid extends Uuid implements UuidInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Uuid;

use function hexdec;

/**
@immutable




















*/
final class UuidV2 extends Uuid implements UuidInterface
{
use TimeTrait;










public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_DCE_SECURITY) {
throw new InvalidArgumentException(
'Fields used to create a UuidV2 must represent a version 2 (DCE Security) UUID'
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}




public function getLocalDomain(): int
{

$fields = $this->getFields();

return (int) hexdec($fields->getClockSeqLow()->toString());
}




public function getLocalDomainName(): string
{
return Uuid::DCE_DOMAIN_NAMES[$this->getLocalDomain()];
}




public function getLocalIdentifier(): IntegerObject
{

$fields = $this->getFields();

return new IntegerObject($this->numberConverter->fromHex($fields->getTimeLow()->toString()));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable








*/
final class UuidV8 extends Uuid implements UuidInterface
{









public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_CUSTOM) {
throw new InvalidArgumentException(
'Fields used to create a UuidV8 must represent a version 8 (custom format) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable




*/
final class UuidV4 extends Uuid implements UuidInterface
{









public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_RANDOM) {
throw new InvalidArgumentException(
'Fields used to create a UuidV4 must represent a version 4 (random) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use DateTimeImmutable;
use DateTimeInterface;
use Ramsey\Uuid\Exception\DateTimeException;
use Throwable;

use function str_pad;

use const STR_PAD_LEFT;

/**
@immutable


*/
trait TimeTrait
{





public function getDateTime(): DateTimeInterface
{
$time = $this->timeConverter->convertTime($this->fields->getTimestamp());

try {
return new DateTimeImmutable(
'@'
. $time->getSeconds()->toString()
. '.'
. str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
);
} catch (Throwable $e) {
throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
}
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

/**
@immutable


*/
trait NilTrait
{
/**
@pure


*/
abstract public function getBytes(): string;




public function isNil(): bool
{
return $this->getBytes() === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\UuidInterface as BaseUuidInterface;

/**
@immutable




*/
interface UuidInterface extends BaseUuidInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Uuid;

/**
@immutable




*/
final class MaxUuid extends Uuid implements UuidInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable





*/
final class UuidV5 extends Uuid implements UuidInterface
{









public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== Uuid::UUID_TYPE_HASH_SHA1) {
throw new InvalidArgumentException(
'Fields used to create a UuidV5 must represent a version 5 (named-based, SHA1-hashed) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Rfc4122;

use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\Time\UnixTimeConverter;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\UnableToBuildUuidException;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Math\BrickMathCalculator;
use Ramsey\Uuid\Rfc4122\UuidInterface as Rfc4122UuidInterface;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\UuidInterface;
use Throwable;

/**
@immutable


*/
class UuidBuilder implements UuidBuilderInterface
{
private TimeConverterInterface $unixTimeConverter;










public function __construct(
private NumberConverterInterface $numberConverter,
private TimeConverterInterface $timeConverter,
?TimeConverterInterface $unixTimeConverter = null,
) {
$this->unixTimeConverter = $unixTimeConverter ?? new UnixTimeConverter(new BrickMathCalculator());
}

/**
@pure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface
{
try {

$fields = $this->buildFields($bytes);

if ($fields->isNil()) {
/**
@phpstan-ignore */
return new NilUuid($fields, $this->numberConverter, $codec, $this->timeConverter);
}

if ($fields->isMax()) {
/**
@phpstan-ignore */
return new MaxUuid($fields, $this->numberConverter, $codec, $this->timeConverter);
}

return match ($fields->getVersion()) {
/**
@phpstan-ignore */
Uuid::UUID_TYPE_TIME => new UuidV1($fields, $this->numberConverter, $codec, $this->timeConverter),
Uuid::UUID_TYPE_DCE_SECURITY
/**
@phpstan-ignore */
=> new UuidV2($fields, $this->numberConverter, $codec, $this->timeConverter),
/**
@phpstan-ignore */
Uuid::UUID_TYPE_HASH_MD5 => new UuidV3($fields, $this->numberConverter, $codec, $this->timeConverter),
/**
@phpstan-ignore */
Uuid::UUID_TYPE_RANDOM => new UuidV4($fields, $this->numberConverter, $codec, $this->timeConverter),
/**
@phpstan-ignore */
Uuid::UUID_TYPE_HASH_SHA1 => new UuidV5($fields, $this->numberConverter, $codec, $this->timeConverter),
Uuid::UUID_TYPE_REORDERED_TIME
/**
@phpstan-ignore */
=> new UuidV6($fields, $this->numberConverter, $codec, $this->timeConverter),
Uuid::UUID_TYPE_UNIX_TIME
/**
@phpstan-ignore */
=> new UuidV7($fields, $this->numberConverter, $codec, $this->unixTimeConverter),
/**
@phpstan-ignore */
Uuid::UUID_TYPE_CUSTOM => new UuidV8($fields, $this->numberConverter, $codec, $this->timeConverter),
default => throw new UnsupportedOperationException(
'The UUID version in the given fields is not supported by this UUID builder',
),
};
} catch (Throwable $e) {
/**
@phpstan-ignore */
throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
}
}

/**
@pure


*/
protected function buildFields(string $bytes): FieldsInterface
{
/**
@phpstan-ignore */
return new Fields($bytes);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Fields;

use Serializable;

/**
@immutable



*/
interface FieldsInterface extends Serializable
{
/**
@pure


*/
public function getBytes(): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Fields;

use ValueError;

use function base64_decode;
use function sprintf;
use function strlen;

/**
@immutable


*/
trait SerializableFieldsTrait
{



abstract public function __construct(string $bytes);




abstract public function getBytes(): string;




public function serialize(): string
{
return $this->getBytes();
}




public function __serialize(): array
{
return ['bytes' => $this->getBytes()];
}






public function unserialize(string $data): void
{
if (strlen($data) === 16) {
$this->__construct($data);
} else {
$this->__construct(base64_decode($data));
}
}




public function __unserialize(array $data): void
{

if (!isset($data['bytes'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['bytes']);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Rfc4122\UuidV2;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;







interface DceSecurityGeneratorInterface
{













public function generate(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null,
): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use function uuid_create;
use function uuid_parse;

use const UUID_TYPE_RANDOM;






class PeclUuidRandomGenerator implements RandomGeneratorInterface
{
public function generate(int $length): string
{
$uuid = uuid_create(UUID_TYPE_RANDOM);

return (string) uuid_parse($uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;




interface RandomGeneratorInterface
{







public function generate(int $length): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Brick\Math\BigInteger;
use DateTimeInterface;
use Ramsey\Uuid\Type\Hexadecimal;

use function assert;
use function hash;
use function pack;
use function str_pad;
use function strlen;
use function substr;
use function substr_replace;
use function unpack;

use const PHP_INT_SIZE;
use const STR_PAD_LEFT;













class UnixTimeGenerator implements TimeGeneratorInterface
{
private static string $time = '';
private static ?string $seed = null;
private static int $seedIndex = 0;


private static array $rand = [];


private static array $seedParts;

public function __construct(
private RandomGeneratorInterface $randomGenerator,
private int $intSize = PHP_INT_SIZE,
) {
}






public function generate($node = null, ?int $clockSeq = null, ?DateTimeInterface $dateTime = null): string
{
if ($dateTime === null) {
$time = microtime(false);
$time = substr($time, 11) . substr($time, 2, 3);
} else {
$time = $dateTime->format('Uv');
}

if ($time > self::$time || ($dateTime !== null && $time !== self::$time)) {
$this->randomize($time);
} else {
$time = $this->increment();
}

if ($this->intSize >= 8) {
$time = substr(pack('J', (int) $time), -6);
} else {
$time = str_pad(BigInteger::of($time)->toBytes(false), 6, "\x00", STR_PAD_LEFT);
}

assert(strlen($time) === 6);

return $time . pack('n*', self::$rand[1], self::$rand[2], self::$rand[3], self::$rand[4], self::$rand[5]);
}

private function randomize(string $time): void
{
if (self::$seed === null) {
$seed = $this->randomGenerator->generate(16);
self::$seed = $seed;
} else {
$seed = $this->randomGenerator->generate(10);
}


$rand = unpack('n*', $seed);
$rand[1] &= 0x03ff;

self::$rand = $rand;
self::$time = $time;
}














private function increment(): string
{
if (self::$seedIndex === 0 && self::$seed !== null) {
self::$seed = hash('sha512', self::$seed, true);


$s = unpack('l*', self::$seed);
$s[] = ($s[1] >> 8 & 0xff0000) | ($s[2] >> 16 & 0xff00) | ($s[3] >> 24 & 0xff);
$s[] = ($s[4] >> 8 & 0xff0000) | ($s[5] >> 16 & 0xff00) | ($s[6] >> 24 & 0xff);
$s[] = ($s[7] >> 8 & 0xff0000) | ($s[8] >> 16 & 0xff00) | ($s[9] >> 24 & 0xff);
$s[] = ($s[10] >> 8 & 0xff0000) | ($s[11] >> 16 & 0xff00) | ($s[12] >> 24 & 0xff);
$s[] = ($s[13] >> 8 & 0xff0000) | ($s[14] >> 16 & 0xff00) | ($s[15] >> 24 & 0xff);

self::$seedParts = $s;
self::$seedIndex = 21;
}

self::$rand[5] = 0xffff & $carry = self::$rand[5] + 1 + (self::$seedParts[self::$seedIndex--] & 0xffffff);
self::$rand[4] = 0xffff & $carry = self::$rand[4] + ($carry >> 16);
self::$rand[3] = 0xffff & $carry = self::$rand[3] + ($carry >> 16);
self::$rand[2] = 0xffff & $carry = self::$rand[2] + ($carry >> 16);
self::$rand[1] += $carry >> 16;

if (0xfc00 & self::$rand[1]) {
$time = self::$time;
$mtime = (int) substr($time, -9);

if ($this->intSize >= 8 || strlen($time) < 10) {
$time = (string) ((int) $time + 1);
} elseif ($mtime === 999999999) {
$time = (1 + (int) substr($time, 0, -9)) . '000000000';
} else {
$mtime++;
$time = substr_replace($time, str_pad((string) $mtime, 9, '0', STR_PAD_LEFT), -9);
}

$this->randomize($time);
}

return self::$time;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Exception\DceSecurityException;
use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Uuid;

use function hex2bin;
use function in_array;
use function pack;
use function str_pad;
use function strlen;
use function substr_replace;

use const STR_PAD_LEFT;





class DceSecurityGenerator implements DceSecurityGeneratorInterface
{
private const DOMAINS = [
Uuid::DCE_DOMAIN_PERSON,
Uuid::DCE_DOMAIN_GROUP,
Uuid::DCE_DOMAIN_ORG,
];




private const CLOCK_SEQ_HIGH = 63;




private const CLOCK_SEQ_LOW = 0;

public function __construct(
private NumberConverterInterface $numberConverter,
private TimeGeneratorInterface $timeGenerator,
private DceSecurityProviderInterface $dceSecurityProvider,
) {
}

public function generate(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null,
): string {
if (!in_array($localDomain, self::DOMAINS)) {
throw new DceSecurityException('Local domain must be a valid DCE Security domain');
}

if ($localIdentifier && $localIdentifier->isNegative()) {
throw new DceSecurityException(
'Local identifier out of bounds; it must be a value between 0 and 4294967295',
);
}

if ($clockSeq > self::CLOCK_SEQ_HIGH || $clockSeq < self::CLOCK_SEQ_LOW) {
throw new DceSecurityException('Clock sequence out of bounds; it must be a value between 0 and 63');
}

switch ($localDomain) {
case Uuid::DCE_DOMAIN_ORG:
if ($localIdentifier === null) {
throw new DceSecurityException('A local identifier must be provided for the org domain');
}

break;
case Uuid::DCE_DOMAIN_PERSON:
if ($localIdentifier === null) {
$localIdentifier = $this->dceSecurityProvider->getUid();
}

break;
case Uuid::DCE_DOMAIN_GROUP:
default:
if ($localIdentifier === null) {
$localIdentifier = $this->dceSecurityProvider->getGid();
}

break;
}

$identifierHex = $this->numberConverter->toHex($localIdentifier->toString());



if (strlen($identifierHex) > 8) {
throw new DceSecurityException(
'Local identifier out of bounds; it must be a value between 0 and 4294967295',
);
}

$domainByte = pack('n', $localDomain)[1];
$identifierBytes = (string) hex2bin(str_pad($identifierHex, 8, '0', STR_PAD_LEFT));

if ($node instanceof Hexadecimal) {
$node = $node->toString();
}


if ($clockSeq !== null) {
$clockSeq = $clockSeq << 8;
}

$bytes = $this->timeGenerator->generate($node, $clockSeq);


$bytes = substr_replace($bytes, $identifierBytes, 0, 4);

return substr_replace($bytes, $domainByte, 9, 1);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Exception\RandomSourceException;
use Throwable;






class RandomBytesGenerator implements RandomGeneratorInterface
{





public function generate(int $length): string
{
try {
return random_bytes($length);
} catch (Throwable $exception) {
throw new RandomSourceException($exception->getMessage(), (int) $exception->getCode(), $exception);
}
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Exception\RandomSourceException;
use Ramsey\Uuid\Exception\TimeSourceException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Provider\TimeProviderInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Throwable;

use function dechex;
use function hex2bin;
use function is_int;
use function pack;
use function preg_match;
use function sprintf;
use function str_pad;
use function strlen;

use const STR_PAD_LEFT;




class DefaultTimeGenerator implements TimeGeneratorInterface
{
public function __construct(
private NodeProviderInterface $nodeProvider,
private TimeConverterInterface $timeConverter,
private TimeProviderInterface $timeProvider,
) {
}







public function generate($node = null, ?int $clockSeq = null): string
{
if ($node instanceof Hexadecimal) {
$node = $node->toString();
}

$node = $this->getValidNode($node);

if ($clockSeq === null) {
try {

$clockSeq = random_int(0, 0x3fff);
} catch (Throwable $exception) {
throw new RandomSourceException($exception->getMessage(), (int) $exception->getCode(), $exception);
}
}

$time = $this->timeProvider->getTime();

$uuidTime = $this->timeConverter->calculateTime(
$time->getSeconds()->toString(),
$time->getMicroseconds()->toString()
);

$timeHex = str_pad($uuidTime->toString(), 16, '0', STR_PAD_LEFT);

if (strlen($timeHex) !== 16) {
throw new TimeSourceException(sprintf('The generated time of \'%s\' is larger than expected', $timeHex));
}

$timeBytes = (string) hex2bin($timeHex);

return $timeBytes[4] . $timeBytes[5] . $timeBytes[6] . $timeBytes[7]
. $timeBytes[2] . $timeBytes[3] . $timeBytes[0] . $timeBytes[1]
. pack('n*', $clockSeq) . $node;
}










private function getValidNode(int | string | null $node): string
{
if ($node === null) {
$node = $this->nodeProvider->getNode();
}


if (is_int($node)) {
$node = dechex($node);
}

if (!preg_match('/^[A-Fa-f0-9]+$/', (string) $node) || strlen((string) $node) > 12) {
throw new InvalidArgumentException('Invalid node value');
}

return (string) hex2bin(str_pad((string) $node, 12, '0', STR_PAD_LEFT));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;




class NameGeneratorFactory
{



public function getGenerator(): NameGeneratorInterface
{
return new DefaultNameGenerator();
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Provider\TimeProviderInterface;




class TimeGeneratorFactory
{
public function __construct(
private NodeProviderInterface $nodeProvider,
private TimeConverterInterface $timeConverter,
private TimeProviderInterface $timeProvider,
) {
}




public function getGenerator(): TimeGeneratorInterface
{
return new DefaultTimeGenerator($this->nodeProvider, $this->timeConverter, $this->timeProvider);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Exception\NameException;
use Ramsey\Uuid\UuidInterface;

use function sprintf;
use function uuid_generate_md5;
use function uuid_generate_sha1;
use function uuid_parse;






class PeclUuidNameGenerator implements NameGeneratorInterface
{
/**
@pure
*/
public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string
{
$uuid = match ($hashAlgorithm) {
'md5' => uuid_generate_md5($ns->toString(), $name), /**
@phpstan-ignore */
'sha1' => uuid_generate_sha1($ns->toString(), $name), /**
@phpstan-ignore */
default => throw new NameException(
sprintf('Unable to hash namespace and name with algorithm \'%s\'', $hashAlgorithm),
),
};

/**
@phpstan-ignore */
return (string) uuid_parse($uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;

use function bin2hex;
use function explode;
use function hex2bin;
use function microtime;
use function str_pad;
use function substr;

use const STR_PAD_LEFT;































class CombGenerator implements RandomGeneratorInterface
{
public const TIMESTAMP_BYTES = 6;

public function __construct(
private RandomGeneratorInterface $generator,
private NumberConverterInterface $numberConverter
) {
}






public function generate(int $length): string
{
if ($length < self::TIMESTAMP_BYTES) {
throw new InvalidArgumentException(
'Length must be a positive integer greater than or equal to ' . self::TIMESTAMP_BYTES
);
}

if ($length % 2 !== 0) {
throw new InvalidArgumentException('Length must be an even number');
}

$hash = '';

/**
@phpstan-ignore */
if (self::TIMESTAMP_BYTES > 0 && $length > self::TIMESTAMP_BYTES) {
$hash = $this->generator->generate($length - self::TIMESTAMP_BYTES);
}

$lsbTime = str_pad(
$this->numberConverter->toHex($this->timestamp()),
self::TIMESTAMP_BYTES * 2,
'0',
STR_PAD_LEFT,
);

return (string) hex2bin(str_pad(bin2hex($hash), $length - self::TIMESTAMP_BYTES, '0') . $lsbTime);
}




private function timestamp(): string
{
$time = explode(' ', microtime(false));

return $time[1] . substr($time[0], 2, 5);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Exception\NameException;
use Ramsey\Uuid\UuidInterface;
use ValueError;

use function hash;




class DefaultNameGenerator implements NameGeneratorInterface
{
/**
@pure
*/
public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string
{
try {
return hash($hashAlgorithm, $ns->getBytes() . $name, true);
} catch (ValueError $e) {
throw new NameException(
message: sprintf('Unable to hash namespace and name with algorithm \'%s\'', $hashAlgorithm),
previous: $e,
);
}
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use function uuid_create;
use function uuid_parse;

use const UUID_TYPE_TIME;






class PeclUuidTimeGenerator implements TimeGeneratorInterface
{



public function generate($node = null, ?int $clockSeq = null): string
{
$uuid = uuid_create(UUID_TYPE_TIME);

return (string) uuid_parse($uuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use RandomLib\Factory;
use RandomLib\Generator;









class RandomLibAdapter implements RandomGeneratorInterface
{
private Generator $generator;









public function __construct(?Generator $generator = null)
{
if ($generator === null) {
$factory = new Factory();
$generator = $factory->getHighStrengthGenerator();
}

$this->generator = $generator;
}

public function generate(int $length): string
{
return $this->generator->generate($length);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;




class RandomGeneratorFactory
{



public function getGenerator(): RandomGeneratorInterface
{
return new RandomBytesGenerator();
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\Type\Hexadecimal;




interface TimeGeneratorInterface
{










public function generate($node = null, ?int $clockSeq = null): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Generator;

use Ramsey\Uuid\UuidInterface;





interface NameGeneratorInterface
{
/**
@pure








*/
public function generate(UuidInterface $ns, string $name, string $hashAlgorithm): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use DateTimeInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;

/**
@immutable


*/
interface DeprecatedUuidInterface
{



public function getNumberConverter(): NumberConverterInterface;






public function getFieldsHex(): array;






public function getClockSeqHiAndReservedHex(): string;






public function getClockSeqLowHex(): string;






public function getClockSequenceHex(): string;





public function getDateTime(): DateTimeInterface;





public function getLeastSignificantBitsHex(): string;





public function getMostSignificantBitsHex(): string;






public function getNodeHex(): string;






public function getTimeHiAndVersionHex(): string;






public function getTimeLowHex(): string;






public function getTimeMidHex(): string;






public function getTimestampHex(): string;






public function getVariant(): ?int;






public function getVersion(): ?int;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use BadMethodCallException;
use DateTimeInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Fields\FieldsInterface;
use Ramsey\Uuid\Lazy\LazyUuidFromString;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use ValueError;

use function assert;
use function bin2hex;
use function method_exists;
use function preg_match;
use function sprintf;
use function str_replace;
use function strcmp;
use function strlen;
use function strtolower;
use function substr;

/**
@immutable


*/
class Uuid implements UuidInterface
{
use DeprecatedUuidMethodsTrait;






public const NAMESPACE_DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';






public const NAMESPACE_URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';






public const NAMESPACE_OID = '6ba7b812-9dad-11d1-80b4-00c04fd430c8';






public const NAMESPACE_X500 = '6ba7b814-9dad-11d1-80b4-00c04fd430c8';






public const NIL = '00000000-0000-0000-0000-000000000000';






public const MAX = 'ffffffff-ffff-ffff-ffff-ffffffffffff';






public const RESERVED_NCS = 0;







public const RFC_4122 = 2;






public const RFC_9562 = 2;






public const RESERVED_MICROSOFT = 6;






public const RESERVED_FUTURE = 7;




public const VALID_PATTERN = '^[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}$';






public const UUID_TYPE_TIME = 1;






public const UUID_TYPE_DCE_SECURITY = 2;




public const UUID_TYPE_IDENTIFIER = 2;






public const UUID_TYPE_HASH_MD5 = 3;






public const UUID_TYPE_RANDOM = 4;






public const UUID_TYPE_HASH_SHA1 = 5;




public const UUID_TYPE_PEABODY = 6;






public const UUID_TYPE_REORDERED_TIME = 6;






public const UUID_TYPE_UNIX_TIME = 7;






public const UUID_TYPE_CUSTOM = 8;






public const DCE_DOMAIN_PERSON = 0;






public const DCE_DOMAIN_GROUP = 1;






public const DCE_DOMAIN_ORG = 2;






public const DCE_DOMAIN_NAMES = [
self::DCE_DOMAIN_PERSON => 'person',
self::DCE_DOMAIN_GROUP => 'group',
self::DCE_DOMAIN_ORG => 'org',
];

/**
@phpstan-ignore
*/
private static ?UuidFactoryInterface $factory = null;

/**
@phpstan-ignore


*/
private static bool $factoryReplaced = false;

protected CodecInterface $codec;
protected NumberConverterInterface $numberConverter;
protected Rfc4122FieldsInterface $fields;
protected TimeConverterInterface $timeConverter;






















public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
$this->fields = $fields;
$this->codec = $codec;
$this->numberConverter = $numberConverter;
$this->timeConverter = $timeConverter;
}




public function __toString(): string
{
return $this->toString();
}




public function jsonSerialize(): string
{
return $this->toString();
}




public function serialize(): string
{
return $this->codec->encode($this);
}




public function __serialize(): array
{
return ['bytes' => $this->serialize()];
}






public function unserialize(string $data): void
{
if (strlen($data) === 16) {

$uuid = self::getFactory()->fromBytes($data);
} else {

$uuid = self::getFactory()->fromString($data);
}

/**
@phpstan-ignore */
$this->codec = $uuid->codec;

/**
@phpstan-ignore */
$this->numberConverter = $uuid->numberConverter;

/**
@phpstan-ignore */
$this->fields = $uuid->fields;

/**
@phpstan-ignore */
$this->timeConverter = $uuid->timeConverter;
}




public function __unserialize(array $data): void
{

if (!isset($data['bytes'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['bytes']);
}

public function compareTo(UuidInterface $other): int
{
$compare = strcmp($this->toString(), $other->toString());

if ($compare < 0) {
return -1;
}

if ($compare > 0) {
return 1;
}

return 0;
}

public function equals(?object $other): bool
{
if (!$other instanceof UuidInterface) {
return false;
}

return $this->compareTo($other) === 0;
}




public function getBytes(): string
{
return $this->codec->encodeBinary($this);
}

public function getFields(): FieldsInterface
{
return $this->fields;
}

public function getHex(): Hexadecimal
{
return new Hexadecimal(str_replace('-', '', $this->toString()));
}

public function getInteger(): IntegerObject
{
return new IntegerObject($this->numberConverter->fromHex($this->getHex()->toString()));
}

public function getUrn(): string
{
return 'urn:uuid:' . $this->toString();
}




public function toString(): string
{
return $this->codec->encode($this);
}




public static function getFactory(): UuidFactoryInterface
{
if (self::$factory === null) {
self::$factory = new UuidFactory();
}

return self::$factory;
}






public static function setFactory(UuidFactoryInterface $factory): void
{



self::$factoryReplaced = ($factory != new UuidFactory());

self::$factory = $factory;
}

/**
@pure








*/
public static function fromBytes(string $bytes): UuidInterface
{
/**
@phpstan-ignore */
if (!self::$factoryReplaced && strlen($bytes) === 16) {
$base16Uuid = bin2hex($bytes);


return self::fromString(
substr($base16Uuid, 0, 8)
. '-'
. substr($base16Uuid, 8, 4)
. '-'
. substr($base16Uuid, 12, 4)
. '-'
. substr($base16Uuid, 16, 4)
. '-'
. substr($base16Uuid, 20, 12),
);
}

/**
@phpstan-ignore */
return self::getFactory()->fromBytes($bytes);
}

/**
@pure








*/
public static function fromString(string $uuid): UuidInterface
{
$uuid = strtolower($uuid);
/**
@phpstan-ignore */
if (!self::$factoryReplaced && preg_match(LazyUuidFromString::VALID_REGEX, $uuid) === 1) {
/**
@phpstan-ignore */
assert($uuid !== '');

/**
@phpstan-ignore */
return new LazyUuidFromString($uuid);
}

/**
@phpstan-ignore */
return self::getFactory()->fromString($uuid);
}











public static function fromDateTime(
DateTimeInterface $dateTime,
?Hexadecimal $node = null,
?int $clockSeq = null
): UuidInterface {
return self::getFactory()->fromDateTime($dateTime, $node, $clockSeq);
}

/**
@pure








*/
public static function fromHexadecimal(Hexadecimal $hex): UuidInterface
{
/**
@phpstan-ignore */
$factory = self::getFactory();

if (method_exists($factory, 'fromHexadecimal')) {
/**
@phpstan-ignore */
$uuid = $factory->fromHexadecimal($hex);
/**
@phpstan-ignore */
assert($uuid instanceof UuidInterface);

return $uuid;
}

throw new BadMethodCallException('The method fromHexadecimal() does not exist on the provided factory');
}

/**
@pure








*/
public static function fromInteger(string $integer): UuidInterface
{
/**
@phpstan-ignore */
return self::getFactory()->fromInteger($integer);
}

/**
@phpstan-assert-if-true
@pure







*/
public static function isValid(string $uuid): bool
{
/**
@phpstan-ignore */
return self::getFactory()->getValidator()->validate($uuid);
}











public static function uuid1($node = null, ?int $clockSeq = null): UuidInterface
{
return self::getFactory()->uuid1($node, $clockSeq);
}















public static function uuid2(
int $localDomain,
?IntegerObject $localIdentifier = null,
?Hexadecimal $node = null,
?int $clockSeq = null
): UuidInterface {
return self::getFactory()->uuid2($localDomain, $localIdentifier, $node, $clockSeq);
}

/**
@pure







*/
public static function uuid3($ns, string $name): UuidInterface
{
/**
@phpstan-ignore */
return self::getFactory()->uuid3($ns, $name);
}






public static function uuid4(): UuidInterface
{
return self::getFactory()->uuid4();
}

/**
@pure







*/
public static function uuid5($ns, string $name): UuidInterface
{
/**
@phpstan-ignore */
return self::getFactory()->uuid5($ns, $name);
}










public static function uuid6(
?Hexadecimal $node = null,
?int $clockSeq = null
): UuidInterface {
return self::getFactory()->uuid6($node, $clockSeq);
}









public static function uuid7(?DateTimeInterface $dateTime = null): UuidInterface
{
$factory = self::getFactory();

if (method_exists($factory, 'uuid7')) {

return $factory->uuid7($dateTime);
}

throw new UnsupportedOperationException('The provided factory does not support the uuid7() method');
}

/**
@pure











*/
public static function uuid8(string $bytes): UuidInterface
{
/**
@phpstan-ignore */
$factory = self::getFactory();

if (method_exists($factory, 'uuid8')) {
/**
@phpstan-ignore

*/
return $factory->uuid8($bytes);
}

throw new UnsupportedOperationException('The provided factory does not support the uuid8() method');
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Nonstandard;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Lazy\LazyUuidFromString;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Rfc4122\TimeTrait;
use Ramsey\Uuid\Rfc4122\UuidInterface;
use Ramsey\Uuid\Rfc4122\UuidV1;
use Ramsey\Uuid\Uuid as BaseUuid;

/**
@immutable









*/
class UuidV6 extends BaseUuid implements UuidInterface
{
use TimeTrait;










public function __construct(
Rfc4122FieldsInterface $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
if ($fields->getVersion() !== BaseUuid::UUID_TYPE_REORDERED_TIME) {
throw new InvalidArgumentException(
'Fields used to create a UuidV6 must represent a version 6 (reordered time) UUID',
);
}

parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}




public function toUuidV1(): UuidV1
{
$hex = $this->getHex()->toString();
$hex = substr($hex, 7, 5)
. substr($hex, 13, 3)
. substr($hex, 3, 4)
. '1' . substr($hex, 0, 3)
. substr($hex, 16);


$uuid = BaseUuid::fromBytes((string) hex2bin($hex));

return $uuid->toUuidV1();
}




public static function fromUuidV1(UuidV1 $uuidV1): \Ramsey\Uuid\Rfc4122\UuidV6
{
$hex = $uuidV1->getHex()->toString();
$hex = substr($hex, 13, 3)
. substr($hex, 8, 4)
. substr($hex, 0, 5)
. '6' . substr($hex, 5, 3)
. substr($hex, 16);


$uuid = BaseUuid::fromBytes((string) hex2bin($hex));

return $uuid->toUuidV6();
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Nonstandard;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Uuid as BaseUuid;

/**
@immutable
@pure


*/
final class Uuid extends BaseUuid
{
public function __construct(
Fields $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Nonstandard;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Fields\SerializableFieldsTrait;
use Ramsey\Uuid\Rfc4122\FieldsInterface;
use Ramsey\Uuid\Rfc4122\VariantTrait;
use Ramsey\Uuid\Type\Hexadecimal;

use function bin2hex;
use function dechex;
use function hexdec;
use function sprintf;
use function str_pad;
use function strlen;
use function substr;

use const STR_PAD_LEFT;

/**
@immutable







*/
final class Fields implements FieldsInterface
{
use SerializableFieldsTrait;
use VariantTrait;






public function __construct(private string $bytes)
{
if (strlen($this->bytes) !== 16) {
throw new InvalidArgumentException(
'The byte string must be 16 bytes long; received ' . strlen($this->bytes) . ' bytes',
);
}
}

public function getBytes(): string
{
return $this->bytes;
}

public function getClockSeq(): Hexadecimal
{
$clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;

return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
}

public function getClockSeqHiAndReserved(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
}

public function getClockSeqLow(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
}

public function getNode(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
}

public function getTimeHiAndVersion(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 6, 2)));
}

public function getTimeLow(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 0, 4)));
}

public function getTimeMid(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 4, 2)));
}

public function getTimestamp(): Hexadecimal
{
return new Hexadecimal(sprintf(
'%03x%04s%08s',
hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
$this->getTimeMid()->toString(),
$this->getTimeLow()->toString()
));
}

public function getVersion(): ?int
{
return null;
}

public function isNil(): bool
{
return false;
}

public function isMax(): bool
{
return false;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Nonstandard;

use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\UnableToBuildUuidException;
use Ramsey\Uuid\UuidInterface;
use Throwable;

/**
@immutable


*/
class UuidBuilder implements UuidBuilderInterface
{





public function __construct(
private NumberConverterInterface $numberConverter,
private TimeConverterInterface $timeConverter,
) {
}

/**
@pure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface
{
try {
/**
@phpstan-ignore */
return new Uuid($this->buildFields($bytes), $this->numberConverter, $codec, $this->timeConverter);
} catch (Throwable $e) {
/**
@phpstan-ignore */
throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
}
}

/**
@pure


*/
protected function buildFields(string $bytes): Fields
{
/**
@phpstan-ignore */
return new Fields($bytes);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;







class InvalidUuidStringException extends InvalidArgumentException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class UnableToBuildUuidException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use LogicException as PhpLogicException;




class UnsupportedOperationException extends PhpLogicException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class TimeSourceException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class DceSecurityException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class BuilderNotFoundException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use InvalidArgumentException as PhpInvalidArgumentException;




class InvalidArgumentException extends PhpInvalidArgumentException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class DateTimeException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class NodeException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;







class RandomSourceException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class NameException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use Throwable;

interface UuidExceptionInterface extends Throwable
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Exception;

use RuntimeException as PhpRuntimeException;




class InvalidBytesException extends PhpRuntimeException implements UuidExceptionInterface
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

/**
@immutable


*/
interface NumberInterface extends TypeInterface
{



public function isNegative(): bool;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use ValueError;

use function is_numeric;
use function sprintf;
use function str_starts_with;

/**
@immutable







*/
final class Decimal implements NumberInterface
{
private string $value;
private bool $isNegative;

public function __construct(float | int | string | self $value)
{
$value = (string) $value;

if (!is_numeric($value)) {
throw new InvalidArgumentException(
'Value must be a signed decimal or a string containing only '
. 'digits 0-9 and, optionally, a decimal point or sign (+ or -)'
);
}


if (str_starts_with($value, '+')) {
$value = substr($value, 1);
}


if (abs((float) $value) === 0.0) {
$value = '0';
}

if (str_starts_with($value, '-')) {
$this->isNegative = true;
} else {
$this->isNegative = false;
}

$this->value = $value;
}

public function isNegative(): bool
{
return $this->isNegative;
}

public function toString(): string
{
return $this->value;
}

public function __toString(): string
{
return $this->toString();
}

public function jsonSerialize(): string
{
return $this->toString();
}

public function serialize(): string
{
return $this->toString();
}




public function __serialize(): array
{
return ['string' => $this->toString()];
}






public function unserialize(string $data): void
{
$this->__construct($data);
}




public function __unserialize(array $data): void
{

if (!isset($data['string'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['string']);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use ValueError;

use function assert;
use function is_numeric;
use function preg_match;
use function sprintf;
use function substr;

/**
@immutable








*/
final class Integer implements NumberInterface
{



private string $value;

/**
@phpstan-ignore
*/
private bool $isNegative = false;

public function __construct(self | float | int | string $value)
{
$this->value = $value instanceof self ? (string) $value : $this->prepareValue($value);
}

public function isNegative(): bool
{
return $this->isNegative;
}

/**
@pure


*/
public function toString(): string
{
return $this->value;
}




public function __toString(): string
{
return $this->toString();
}

public function jsonSerialize(): string
{
return $this->toString();
}

public function serialize(): string
{
return $this->toString();
}




public function __serialize(): array
{
return ['string' => $this->toString()];
}






public function unserialize(string $data): void
{
$this->__construct($data);
}




public function __unserialize(array $data): void
{

if (!isset($data['string'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['string']);
}




private function prepareValue(float | int | string $value): string
{
$value = (string) $value;
$sign = '+';


if (str_starts_with($value, '-') || str_starts_with($value, '+')) {
$sign = substr($value, 0, 1);
$value = substr($value, 1);
}

if (!preg_match('/^\d+$/', $value)) {
throw new InvalidArgumentException(
'Value must be a signed integer or a string containing only '
. 'digits 0-9 and, optionally, a sign (+ or -)'
);
}


$value = ltrim($value, '0');


if ($value === '') {
$value = '0';
}


if ($sign === '-' && $value !== '0') {
$value = $sign . $value;

/**
@phpstan-ignore */
$this->isNegative = true;
}

assert(is_numeric($value));

return $value;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use ValueError;

use function preg_match;
use function sprintf;
use function substr;

/**
@immutable





*/
final class Hexadecimal implements TypeInterface
{



private string $value;




public function __construct(self | string $value)
{
$this->value = $value instanceof self ? (string) $value : $this->prepareValue($value);
}

/**
@pure


*/
public function toString(): string
{
return $this->value;
}




public function __toString(): string
{
return $this->toString();
}




public function jsonSerialize(): string
{
return $this->toString();
}




public function serialize(): string
{
return $this->toString();
}




public function __serialize(): array
{
return ['string' => $this->toString()];
}






public function unserialize(string $data): void
{
$this->__construct($data);
}




public function __unserialize(array $data): void
{

if (!isset($data['string'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->unserialize($data['string']);
}




private function prepareValue(string $value): string
{
$value = strtolower($value);

if (str_starts_with($value, '0x')) {
$value = substr($value, 2);
}

if (!preg_match('/^[A-Fa-f0-9]+$/', $value)) {
throw new InvalidArgumentException('Value must be a hexadecimal number');
}


return $value;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

use JsonSerializable;
use Serializable;

/**
@immutable


*/
interface TypeInterface extends JsonSerializable, Serializable
{
/**
@pure
*/
public function toString(): string;

/**
@pure
*/
public function __toString(): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Type;

use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use ValueError;

use function json_decode;
use function json_encode;
use function sprintf;

/**
@immutable





*/
final class Time implements TypeInterface
{
private IntegerObject $seconds;
private IntegerObject $microseconds;

public function __construct(
IntegerObject | float | int | string $seconds,
IntegerObject | float | int | string $microseconds = 0,
) {
$this->seconds = new IntegerObject($seconds);
$this->microseconds = new IntegerObject($microseconds);
}

/**
@pure
*/
public function getSeconds(): IntegerObject
{
return $this->seconds;
}

/**
@pure
*/
public function getMicroseconds(): IntegerObject
{
return $this->microseconds;
}

public function toString(): string
{
return $this->seconds->toString() . '.' . sprintf('%06s', $this->microseconds->toString());
}

public function __toString(): string
{
return $this->toString();
}




public function jsonSerialize(): array
{
return [
'seconds' => $this->getSeconds()->toString(),
'microseconds' => $this->getMicroseconds()->toString(),
];
}

public function serialize(): string
{
return (string) json_encode($this);
}




public function __serialize(): array
{
return [
'seconds' => $this->getSeconds()->toString(),
'microseconds' => $this->getMicroseconds()->toString(),
];
}






public function unserialize(string $data): void
{

$time = json_decode($data, true);

if (!isset($time['seconds']) || !isset($time['microseconds'])) {
throw new UnsupportedOperationException('Attempted to unserialize an invalid value');
}

$this->__construct($time['seconds'], $time['microseconds']);
}




public function __unserialize(array $data): void
{

if (!isset($data['seconds']) || !isset($data['microseconds'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}


$this->__construct($data['seconds'], $data['microseconds']);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use Ramsey\Uuid\Builder\FallbackBuilder;
use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Codec\GuidStringCodec;
use Ramsey\Uuid\Codec\StringCodec;
use Ramsey\Uuid\Converter\Number\GenericNumberConverter;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\Time\GenericTimeConverter;
use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Generator\DceSecurityGenerator;
use Ramsey\Uuid\Generator\DceSecurityGeneratorInterface;
use Ramsey\Uuid\Generator\NameGeneratorFactory;
use Ramsey\Uuid\Generator\NameGeneratorInterface;
use Ramsey\Uuid\Generator\PeclUuidNameGenerator;
use Ramsey\Uuid\Generator\PeclUuidRandomGenerator;
use Ramsey\Uuid\Generator\PeclUuidTimeGenerator;
use Ramsey\Uuid\Generator\RandomGeneratorFactory;
use Ramsey\Uuid\Generator\RandomGeneratorInterface;
use Ramsey\Uuid\Generator\TimeGeneratorFactory;
use Ramsey\Uuid\Generator\TimeGeneratorInterface;
use Ramsey\Uuid\Generator\UnixTimeGenerator;
use Ramsey\Uuid\Guid\GuidBuilder;
use Ramsey\Uuid\Math\BrickMathCalculator;
use Ramsey\Uuid\Math\CalculatorInterface;
use Ramsey\Uuid\Nonstandard\UuidBuilder as NonstandardUuidBuilder;
use Ramsey\Uuid\Provider\Dce\SystemDceSecurityProvider;
use Ramsey\Uuid\Provider\DceSecurityProviderInterface;
use Ramsey\Uuid\Provider\Node\FallbackNodeProvider;
use Ramsey\Uuid\Provider\Node\RandomNodeProvider;
use Ramsey\Uuid\Provider\Node\SystemNodeProvider;
use Ramsey\Uuid\Provider\NodeProviderInterface;
use Ramsey\Uuid\Provider\Time\SystemTimeProvider;
use Ramsey\Uuid\Provider\TimeProviderInterface;
use Ramsey\Uuid\Rfc4122\UuidBuilder as Rfc4122UuidBuilder;
use Ramsey\Uuid\Validator\GenericValidator;
use Ramsey\Uuid\Validator\ValidatorInterface;

use const PHP_INT_SIZE;






class FeatureSet
{
private ?TimeProviderInterface $timeProvider = null;
private CalculatorInterface $calculator;
private CodecInterface $codec;
private DceSecurityGeneratorInterface $dceSecurityGenerator;
private NameGeneratorInterface $nameGenerator;
private NodeProviderInterface $nodeProvider;
private NumberConverterInterface $numberConverter;
private RandomGeneratorInterface $randomGenerator;
private TimeConverterInterface $timeConverter;
private TimeGeneratorInterface $timeGenerator;
private TimeGeneratorInterface $unixTimeGenerator;
private UuidBuilderInterface $builder;
private ValidatorInterface $validator;

/**
@phpstan-ignore






*/
public function __construct(
bool $useGuids = false,
private bool $force32Bit = false,
bool $forceNoBigNumber = false,
private bool $ignoreSystemNode = false,
private bool $enablePecl = false,
) {
$this->randomGenerator = $this->buildRandomGenerator();
$this->setCalculator(new BrickMathCalculator());
$this->builder = $this->buildUuidBuilder($useGuids);
$this->codec = $this->buildCodec($useGuids);
$this->nodeProvider = $this->buildNodeProvider();
$this->nameGenerator = $this->buildNameGenerator();
$this->setTimeProvider(new SystemTimeProvider());
$this->setDceSecurityProvider(new SystemDceSecurityProvider());
$this->validator = new GenericValidator();

assert($this->timeProvider !== null);
$this->unixTimeGenerator = $this->buildUnixTimeGenerator();
}




public function getBuilder(): UuidBuilderInterface
{
return $this->builder;
}




public function getCalculator(): CalculatorInterface
{
return $this->calculator;
}




public function getCodec(): CodecInterface
{
return $this->codec;
}




public function getDceSecurityGenerator(): DceSecurityGeneratorInterface
{
return $this->dceSecurityGenerator;
}




public function getNameGenerator(): NameGeneratorInterface
{
return $this->nameGenerator;
}




public function getNodeProvider(): NodeProviderInterface
{
return $this->nodeProvider;
}




public function getNumberConverter(): NumberConverterInterface
{
return $this->numberConverter;
}




public function getRandomGenerator(): RandomGeneratorInterface
{
return $this->randomGenerator;
}




public function getTimeConverter(): TimeConverterInterface
{
return $this->timeConverter;
}




public function getTimeGenerator(): TimeGeneratorInterface
{
return $this->timeGenerator;
}




public function getUnixTimeGenerator(): TimeGeneratorInterface
{
return $this->unixTimeGenerator;
}




public function getValidator(): ValidatorInterface
{
return $this->validator;
}




public function setCalculator(CalculatorInterface $calculator): void
{
$this->calculator = $calculator;
$this->numberConverter = $this->buildNumberConverter($calculator);
$this->timeConverter = $this->buildTimeConverter($calculator);

if (isset($this->timeProvider)) {
$this->timeGenerator = $this->buildTimeGenerator($this->timeProvider);
}
}




public function setDceSecurityProvider(DceSecurityProviderInterface $dceSecurityProvider): void
{
$this->dceSecurityGenerator = $this->buildDceSecurityGenerator($dceSecurityProvider);
}




public function setNodeProvider(NodeProviderInterface $nodeProvider): void
{
$this->nodeProvider = $nodeProvider;

if (isset($this->timeProvider)) {
$this->timeGenerator = $this->buildTimeGenerator($this->timeProvider);
}
}




public function setTimeProvider(TimeProviderInterface $timeProvider): void
{
$this->timeProvider = $timeProvider;
$this->timeGenerator = $this->buildTimeGenerator($timeProvider);
}




public function setValidator(ValidatorInterface $validator): void
{
$this->validator = $validator;
}






private function buildCodec(bool $useGuids = false): CodecInterface
{
if ($useGuids) {
return new GuidStringCodec($this->builder);
}

return new StringCodec($this->builder);
}




private function buildDceSecurityGenerator(
DceSecurityProviderInterface $dceSecurityProvider,
): DceSecurityGeneratorInterface {
return new DceSecurityGenerator($this->numberConverter, $this->timeGenerator, $dceSecurityProvider);
}




private function buildNodeProvider(): NodeProviderInterface
{
if ($this->ignoreSystemNode) {
return new RandomNodeProvider();
}

return new FallbackNodeProvider([new SystemNodeProvider(), new RandomNodeProvider()]);
}




private function buildNumberConverter(CalculatorInterface $calculator): NumberConverterInterface
{
return new GenericNumberConverter($calculator);
}




private function buildRandomGenerator(): RandomGeneratorInterface
{
if ($this->enablePecl) {
return new PeclUuidRandomGenerator();
}

return (new RandomGeneratorFactory())->getGenerator();
}







private function buildTimeGenerator(TimeProviderInterface $timeProvider): TimeGeneratorInterface
{
if ($this->enablePecl) {
return new PeclUuidTimeGenerator();
}

return (new TimeGeneratorFactory($this->nodeProvider, $this->timeConverter, $timeProvider))->getGenerator();
}




private function buildUnixTimeGenerator(): TimeGeneratorInterface
{
return new UnixTimeGenerator($this->randomGenerator);
}




private function buildNameGenerator(): NameGeneratorInterface
{
if ($this->enablePecl) {
return new PeclUuidNameGenerator();
}

return (new NameGeneratorFactory())->getGenerator();
}




private function buildTimeConverter(CalculatorInterface $calculator): TimeConverterInterface
{
$genericConverter = new GenericTimeConverter($calculator);

if ($this->is64BitSystem()) {
return new PhpTimeConverter($calculator, $genericConverter);
}

return $genericConverter;
}






private function buildUuidBuilder(bool $useGuids = false): UuidBuilderInterface
{
if ($useGuids) {
return new GuidBuilder($this->numberConverter, $this->timeConverter);
}

return new FallbackBuilder([
new Rfc4122UuidBuilder($this->numberConverter, $this->timeConverter),
new NonstandardUuidBuilder($this->numberConverter, $this->timeConverter),
]);
}




private function is64BitSystem(): bool
{
return PHP_INT_SIZE === 8 && !$this->force32Bit;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Guid;

use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Uuid;

/**
@immutable






















*/
final class Guid extends Uuid
{
public function __construct(
Fields $fields,
NumberConverterInterface $numberConverter,
CodecInterface $codec,
TimeConverterInterface $timeConverter,
) {
parent::__construct($fields, $numberConverter, $codec, $timeConverter);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Guid;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Fields\SerializableFieldsTrait;
use Ramsey\Uuid\Rfc4122\FieldsInterface;
use Ramsey\Uuid\Rfc4122\MaxTrait;
use Ramsey\Uuid\Rfc4122\NilTrait;
use Ramsey\Uuid\Rfc4122\VariantTrait;
use Ramsey\Uuid\Rfc4122\VersionTrait;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Uuid;

use function bin2hex;
use function dechex;
use function hexdec;
use function pack;
use function sprintf;
use function str_pad;
use function strlen;
use function substr;
use function unpack;

use const STR_PAD_LEFT;

/**
@immutable




*/
final class Fields implements FieldsInterface
{
use MaxTrait;
use NilTrait;
use SerializableFieldsTrait;
use VariantTrait;
use VersionTrait;








public function __construct(private string $bytes)
{
if (strlen($this->bytes) !== 16) {
throw new InvalidArgumentException(
'The byte string must be 16 bytes long; received ' . strlen($this->bytes) . ' bytes',
);
}

if (!$this->isCorrectVariant()) {
throw new InvalidArgumentException(
'The byte string received does not conform to the RFC 9562 (formerly RFC 4122) '
. 'or Microsoft Corporation variants',
);
}

if (!$this->isCorrectVersion()) {
throw new InvalidArgumentException('The byte string received does not contain a valid version');
}
}

public function getBytes(): string
{
return $this->bytes;
}

public function getTimeLow(): Hexadecimal
{


$hex = unpack(
'H*',
pack(
'v*',
hexdec(bin2hex(substr($this->bytes, 2, 2))),
hexdec(bin2hex(substr($this->bytes, 0, 2))),
),
);

return new Hexadecimal($hex[1] ?? '');
}

public function getTimeMid(): Hexadecimal
{


$hex = unpack('H*', pack('v', hexdec(bin2hex(substr($this->bytes, 4, 2)))));

return new Hexadecimal($hex[1] ?? '');
}

public function getTimeHiAndVersion(): Hexadecimal
{


$hex = unpack('H*', pack('v', hexdec(bin2hex(substr($this->bytes, 6, 2)))));

return new Hexadecimal($hex[1] ?? '');
}

public function getTimestamp(): Hexadecimal
{
return new Hexadecimal(sprintf(
'%03x%04s%08s',
hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
$this->getTimeMid()->toString(),
$this->getTimeLow()->toString()
));
}

public function getClockSeq(): Hexadecimal
{
if ($this->isMax()) {
$clockSeq = 0xffff;
} elseif ($this->isNil()) {
$clockSeq = 0x0000;
} else {
$clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
}

return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
}

public function getClockSeqHiAndReserved(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
}

public function getClockSeqLow(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
}

public function getNode(): Hexadecimal
{
return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
}

public function getVersion(): ?int
{
if ($this->isNil() || $this->isMax()) {
return null;
}


$parts = unpack('n*', $this->bytes);

return ($parts[4] >> 4) & 0x00f;
}

private function isCorrectVariant(): bool
{
if ($this->isNil() || $this->isMax()) {
return true;
}

$variant = $this->getVariant();

return $variant === Uuid::RFC_4122 || $variant === Uuid::RESERVED_MICROSOFT;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Guid;

use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Codec\CodecInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Converter\TimeConverterInterface;
use Ramsey\Uuid\Exception\UnableToBuildUuidException;
use Ramsey\Uuid\UuidInterface;
use Throwable;

/**
@immutable




*/
class GuidBuilder implements UuidBuilderInterface
{





public function __construct(
private NumberConverterInterface $numberConverter,
private TimeConverterInterface $timeConverter,
) {
}

/**
@pure







*/
public function build(CodecInterface $codec, string $bytes): UuidInterface
{
try {
/**
@phpstan-ignore */
return new Guid($this->buildFields($bytes), $this->numberConverter, $codec, $this->timeConverter);
} catch (Throwable $e) {
/**
@phpstan-ignore */
throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
}
}

/**
@pure


*/
protected function buildFields(string $bytes): Fields
{
/**
@phpstan-ignore */
return new Fields($bytes);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use DateTimeImmutable;
use DateTimeInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Exception\DateTimeException;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Throwable;

use function str_pad;
use function substr;

use const STR_PAD_LEFT;

/**
@immutable




*/
trait DeprecatedUuidMethodsTrait
{






public function getClockSeqHiAndReserved(): string
{
return $this->numberConverter->fromHex($this->fields->getClockSeqHiAndReserved()->toString());
}






public function getClockSeqHiAndReservedHex(): string
{
return $this->fields->getClockSeqHiAndReserved()->toString();
}







public function getClockSeqLow(): string
{
return $this->numberConverter->fromHex($this->fields->getClockSeqLow()->toString());
}






public function getClockSeqLowHex(): string
{
return $this->fields->getClockSeqLow()->toString();
}







public function getClockSequence(): string
{
return $this->numberConverter->fromHex($this->fields->getClockSeq()->toString());
}






public function getClockSequenceHex(): string
{
return $this->fields->getClockSeq()->toString();
}




public function getNumberConverter(): NumberConverterInterface
{
return $this->numberConverter;
}









public function getDateTime(): DateTimeInterface
{
if ($this->fields->getVersion() !== 1) {
throw new UnsupportedOperationException('Not a time-based UUID');
}

$time = $this->timeConverter->convertTime($this->fields->getTimestamp());

try {
return new DateTimeImmutable(
'@'
. $time->getSeconds()->toString()
. '.'
. str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
);
} catch (Throwable $e) {
throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
}
}






public function getFieldsHex(): array
{
return [
'time_low' => $this->fields->getTimeLow()->toString(),
'time_mid' => $this->fields->getTimeMid()->toString(),
'time_hi_and_version' => $this->fields->getTimeHiAndVersion()->toString(),
'clock_seq_hi_and_reserved' => $this->fields->getClockSeqHiAndReserved()->toString(),
'clock_seq_low' => $this->fields->getClockSeqLow()->toString(),
'node' => $this->fields->getNode()->toString(),
];
}





public function getLeastSignificantBits(): string
{
$leastSignificantHex = substr($this->getHex()->toString(), 16);

return $this->numberConverter->fromHex($leastSignificantHex);
}





public function getLeastSignificantBitsHex(): string
{
return substr($this->getHex()->toString(), 16);
}





public function getMostSignificantBits(): string
{
$mostSignificantHex = substr($this->getHex()->toString(), 0, 16);

return $this->numberConverter->fromHex($mostSignificantHex);
}





public function getMostSignificantBitsHex(): string
{
return substr($this->getHex()->toString(), 0, 16);
}







public function getNode(): string
{
return $this->numberConverter->fromHex($this->fields->getNode()->toString());
}






public function getNodeHex(): string
{
return $this->fields->getNode()->toString();
}







public function getTimeHiAndVersion(): string
{
return $this->numberConverter->fromHex($this->fields->getTimeHiAndVersion()->toString());
}






public function getTimeHiAndVersionHex(): string
{
return $this->fields->getTimeHiAndVersion()->toString();
}







public function getTimeLow(): string
{
return $this->numberConverter->fromHex($this->fields->getTimeLow()->toString());
}






public function getTimeLowHex(): string
{
return $this->fields->getTimeLow()->toString();
}







public function getTimeMid(): string
{
return $this->numberConverter->fromHex($this->fields->getTimeMid()->toString());
}






public function getTimeMidHex(): string
{
return $this->fields->getTimeMid()->toString();
}







public function getTimestamp(): string
{
if ($this->fields->getVersion() !== 1) {
throw new UnsupportedOperationException('Not a time-based UUID');
}

return $this->numberConverter->fromHex($this->fields->getTimestamp()->toString());
}






public function getTimestampHex(): string
{
if ($this->fields->getVersion() !== 1) {
throw new UnsupportedOperationException('Not a time-based UUID');
}

return $this->fields->getTimestamp()->toString();
}






public function getVariant(): ?int
{
return $this->fields->getVariant();
}






public function getVersion(): ?int
{
return $this->fields->getVersion();
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid;

use JsonSerializable;
use Ramsey\Uuid\Fields\FieldsInterface;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Serializable;
use Stringable;

/**
@immutable


*/
interface UuidInterface extends
DeprecatedUuidInterface,
JsonSerializable,
Serializable,
Stringable
{










public function compareTo(UuidInterface $other): int;











public function equals(?object $other): bool;

/**
@pure




*/
public function getBytes(): string;




public function getFields(): FieldsInterface;




public function getHex(): Hexadecimal;




public function getInteger(): IntegerObject;









public function getUrn(): string;

/**
@pure




*/
public function toString(): string;

/**
@pure




*/
public function __toString(): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

use Ramsey\Uuid\UuidInterface;

/**
@immutable


*/
interface CodecInterface
{
/**
@pure






*/
public function encode(UuidInterface $uuid): string;

/**
@pure






*/
public function encodeBinary(UuidInterface $uuid): string;

/**
@pure






*/
public function decode(string $encodedUuid): UuidInterface;

/**
@pure






*/
public function decodeBytes(string $bytes): UuidInterface;
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

/**
@immutable


























*/
class TimestampLastCombCodec extends StringCodec
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

use Ramsey\Uuid\Guid\Guid;
use Ramsey\Uuid\UuidInterface;

use function bin2hex;
use function sprintf;
use function substr;

/**
@immutable




*/
class GuidStringCodec extends StringCodec
{
public function encode(UuidInterface $uuid): string
{
/**
@phpstan-ignore */
$hex = bin2hex($uuid->getFields()->getBytes());


return sprintf(
'%02s%02s%02s%02s-%02s%02s-%02s%02s-%04s-%012s',
substr($hex, 6, 2),
substr($hex, 4, 2),
substr($hex, 2, 2),
substr($hex, 0, 2),
substr($hex, 10, 2),
substr($hex, 8, 2),
substr($hex, 14, 2),
substr($hex, 12, 2),
substr($hex, 16, 4),
substr($hex, 20),
);
}

public function decode(string $encodedUuid): UuidInterface
{
/**
@phpstan-ignore */
$bytes = $this->getBytes($encodedUuid);

/**
@phpstan-ignore */
return $this->getBuilder()->build($this, $this->swapBytes($bytes));
}

public function decodeBytes(string $bytes): UuidInterface
{

return parent::decode(bin2hex($bytes));
}




private function swapBytes(string $bytes): string
{
return $bytes[3] . $bytes[2] . $bytes[1] . $bytes[0]
. $bytes[5] . $bytes[4] . $bytes[7] . $bytes[6]
. substr($bytes, 8);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

use Ramsey\Uuid\Builder\UuidBuilderInterface;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Exception\InvalidUuidStringException;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\UuidInterface;

use function bin2hex;
use function hex2bin;
use function implode;
use function sprintf;
use function str_replace;
use function strlen;
use function substr;

/**
@immutable


*/
class StringCodec implements CodecInterface
{





public function __construct(private UuidBuilderInterface $builder)
{
}

public function encode(UuidInterface $uuid): string
{
/**
@phpstan-ignore */
$hex = bin2hex($uuid->getFields()->getBytes());


return sprintf(
'%08s-%04s-%04s-%04s-%012s',
substr($hex, 0, 8),
substr($hex, 8, 4),
substr($hex, 12, 4),
substr($hex, 16, 4),
substr($hex, 20),
);
}




public function encodeBinary(UuidInterface $uuid): string
{
/**
@phpstan-ignore-next-line */
return $uuid->getFields()->getBytes();
}






public function decode(string $encodedUuid): UuidInterface
{
/**
@phpstan-ignore */
return $this->builder->build($this, $this->getBytes($encodedUuid));
}

public function decodeBytes(string $bytes): UuidInterface
{
if (strlen($bytes) !== 16) {
throw new InvalidArgumentException('$bytes string should contain 16 characters.');
}

return $this->builder->build($this, $bytes);
}




protected function getBuilder(): UuidBuilderInterface
{
return $this->builder;
}




protected function getBytes(string $encodedUuid): string
{
$parsedUuid = str_replace(['urn:', 'uuid:', 'URN:', 'UUID:', '{', '}', '-'], '', $encodedUuid);

$components = [
substr($parsedUuid, 0, 8),
substr($parsedUuid, 8, 4),
substr($parsedUuid, 12, 4),
substr($parsedUuid, 16, 4),
substr($parsedUuid, 20),
];

if (!Uuid::isValid(implode('-', $components))) {
throw new InvalidUuidStringException('Invalid UUID string: ' . $encodedUuid);
}

return (string) hex2bin($parsedUuid);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\UuidInterface;

use function strlen;
use function substr;

/**
@immutable















*/
class OrderedTimeCodec extends StringCodec
{





public function encodeBinary(UuidInterface $uuid): string
{
if (
/**
@phpstan-ignore */
!($uuid->getFields() instanceof Rfc4122FieldsInterface)
/**
@phpstan-ignore */
|| $uuid->getFields()->getVersion() !== Uuid::UUID_TYPE_TIME
) {
throw new InvalidArgumentException('Expected version 1 (time-based) UUID');
}

/**
@phpstan-ignore */
$bytes = $uuid->getFields()->getBytes();

return $bytes[6] . $bytes[7] . $bytes[4] . $bytes[5]
. $bytes[0] . $bytes[1] . $bytes[2] . $bytes[3]
. substr($bytes, 8);
}








public function decodeBytes(string $bytes): UuidInterface
{
if (strlen($bytes) !== 16) {
throw new InvalidArgumentException('$bytes string should contain 16 characters.');
}


$rearrangedBytes = $bytes[4] . $bytes[5] . $bytes[6] . $bytes[7]
. $bytes[2] . $bytes[3] . $bytes[0] . $bytes[1]
. substr($bytes, 8);

$uuid = parent::decodeBytes($rearrangedBytes);

/**
@phpstan-ignore */
$fields = $uuid->getFields();

if (!$fields instanceof Rfc4122FieldsInterface || $fields->getVersion() !== Uuid::UUID_TYPE_TIME) {
throw new UnsupportedOperationException(
'Attempting to decode a non-time-based UUID using OrderedTimeCodec',
);
}

return $uuid;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Codec;

use Ramsey\Uuid\Exception\InvalidUuidStringException;
use Ramsey\Uuid\UuidInterface;

use function bin2hex;
use function sprintf;
use function substr;
use function substr_replace;

/**
@immutable























*/
class TimestampFirstCombCodec extends StringCodec
{



public function encode(UuidInterface $uuid): string
{
/**
@phpstan-ignore */
$bytes = $this->swapBytes($uuid->getFields()->getBytes());

return sprintf(
'%08s-%04s-%04s-%04s-%012s',
bin2hex(substr($bytes, 0, 4)),
bin2hex(substr($bytes, 4, 2)),
bin2hex(substr($bytes, 6, 2)),
bin2hex(substr($bytes, 8, 2)),
bin2hex(substr($bytes, 10))
);
}




public function encodeBinary(UuidInterface $uuid): string
{
/**
@phpstan-ignore-next-line */
return $this->swapBytes($uuid->getFields()->getBytes());
}






public function decode(string $encodedUuid): UuidInterface
{
/**
@phpstan-ignore */
$bytes = $this->getBytes($encodedUuid);

/**
@phpstan-ignore */
return $this->getBuilder()->build($this, $this->swapBytes($bytes));
}

public function decodeBytes(string $bytes): UuidInterface
{
/**
@phpstan-ignore */
return $this->getBuilder()->build($this, $this->swapBytes($bytes));
}

/**
@pure


*/
private function swapBytes(string $bytes): string
{
$first48Bits = substr($bytes, 0, 6);
$last48Bits = substr($bytes, -6);

return substr_replace(substr_replace($bytes, $last48Bits, 0, 6), $first48Bits, -6);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Math;

use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\NumberInterface;

/**
@immutable


*/
interface CalculatorInterface
{
/**
@pure







*/
public function add(NumberInterface $augend, NumberInterface ...$addends): NumberInterface;

/**
@pure







*/
public function subtract(NumberInterface $minuend, NumberInterface ...$subtrahends): NumberInterface;

/**
@pure







*/
public function multiply(NumberInterface $multiplicand, NumberInterface ...$multipliers): NumberInterface;

/**
@pure










*/
public function divide(
int $roundingMode,
int $scale,
NumberInterface $dividend,
NumberInterface ...$divisors,
): NumberInterface;

/**
@pure







*/
public function fromBase(string $value, int $base): IntegerObject;

/**
@pure







*/
public function toBase(IntegerObject $value, int $base): string;

/**
@pure


*/
public function toHexadecimal(IntegerObject $value): Hexadecimal;

/**
@pure


*/
public function toInteger(Hexadecimal $value): IntegerObject;
}
<?php



























declare(strict_types=1);

namespace Ramsey\Uuid\Math;









final class RoundingMode
{



public const UNNECESSARY = 0;







public const UP = 1;







public const DOWN = 2;







public const CEILING = 3;







public const FLOOR = 4;







public const HALF_UP = 5;






public const HALF_DOWN = 6;






public const HALF_CEILING = 7;






public const HALF_FLOOR = 8;









public const HALF_EVEN = 9;






private function __construct()
{
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Uuid\Math;

use Brick\Math\BigDecimal;
use Brick\Math\BigInteger;
use Brick\Math\Exception\MathException;
use Brick\Math\RoundingMode as BrickMathRounding;
use Ramsey\Uuid\Exception\InvalidArgumentException;
use Ramsey\Uuid\Type\Decimal;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\Type\NumberInterface;

/**
@immutable


*/
final class BrickMathCalculator implements CalculatorInterface
{
private const ROUNDING_MODE_MAP = [
RoundingMode::UNNECESSARY => BrickMathRounding::UNNECESSARY,
RoundingMode::UP => BrickMathRounding::UP,
RoundingMode::DOWN => BrickMathRounding::DOWN,
RoundingMode::CEILING => BrickMathRounding::CEILING,
RoundingMode::FLOOR => BrickMathRounding::FLOOR,
RoundingMode::HALF_UP => BrickMathRounding::HALF_UP,
RoundingMode::HALF_DOWN => BrickMathRounding::HALF_DOWN,
RoundingMode::HALF_CEILING => BrickMathRounding::HALF_CEILING,
RoundingMode::HALF_FLOOR => BrickMathRounding::HALF_FLOOR,
RoundingMode::HALF_EVEN => BrickMathRounding::HALF_EVEN,
];

public function add(NumberInterface $augend, NumberInterface ...$addends): NumberInterface
{
$sum = BigInteger::of($augend->toString());

foreach ($addends as $addend) {
$sum = $sum->plus($addend->toString());
}

/**
@phpstan-ignore */
return new IntegerObject((string) $sum);
}

public function subtract(NumberInterface $minuend, NumberInterface ...$subtrahends): NumberInterface
{
$difference = BigInteger::of($minuend->toString());

foreach ($subtrahends as $subtrahend) {
$difference = $difference->minus($subtrahend->toString());
}

/**
@phpstan-ignore */
return new IntegerObject((string) $difference);
}

public function multiply(NumberInterface $multiplicand, NumberInterface ...$multipliers): NumberInterface
{
$product = BigInteger::of($multiplicand->toString());

foreach ($multipliers as $multiplier) {
$product = $product->multipliedBy($multiplier->toString());
}

/**
@phpstan-ignore */
return new IntegerObject((string) $product);
}

public function divide(
int $roundingMode,
int $scale,
NumberInterface $dividend,
NumberInterface ...$divisors,
): NumberInterface {
/**
@phpstan-ignore */
$brickRounding = $this->getBrickRoundingMode($roundingMode);

$quotient = BigDecimal::of($dividend->toString());

foreach ($divisors as $divisor) {
$quotient = $quotient->dividedBy($divisor->toString(), $scale, $brickRounding);
}

if ($scale === 0) {
/**
@phpstan-ignore */
return new IntegerObject((string) $quotient->toBigInteger());
}

/**
@phpstan-ignore */
return new Decimal((string) $quotient);
}

public function fromBase(string $value, int $base): IntegerObject
{
try {
/**
@phpstan-ignore */
return new IntegerObject((string) BigInteger::fromBase($value, $base));
} catch (MathException | \InvalidArgumentException $exception) {
throw new InvalidArgumentException(
$exception->getMessage(),
(int) $exception->getCode(),
$exception
);
}
}

public function toBase(IntegerObject $value, int $base): string
{
try {
return BigInteger::of($value->toString())->toBase($base);
} catch (MathException | \InvalidArgumentException $exception) {
throw new InvalidArgumentException(
$exception->getMessage(),
(int) $exception->getCode(),
$exception
);
}
}

public function toHexadecimal(IntegerObject $value): Hexadecimal
{
/**
@phpstan-ignore */
return new Hexadecimal($this->toBase($value, 16));
}

public function toInteger(Hexadecimal $value): IntegerObject
{
return $this->fromBase($value->toString(), 16);
}






private function getBrickRoundingMode(int $roundingMode)
{
return self::ROUNDING_MODE_MAP[$roundingMode] ?? BrickMathRounding::UNNECESSARY;
}
}
Copyright (c) 2015-2022 Ben Ramsey <ben@benramsey.com>

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.
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Tool\TypeTrait;
use Ramsey\Collection\Tool\ValueToStringTrait;

/**
@template
@template
@extends
@implements



*/
abstract class AbstractTypedMap extends AbstractMap implements TypedMapInterface
{
use TypeTrait;
use ValueToStringTrait;







public function offsetSet(mixed $offset, mixed $value): void
{
if ($this->checkType($this->getKeyType(), $offset) === false) {
throw new InvalidArgumentException(
'Key must be of type ' . $this->getKeyType() . '; key is '
. $this->toolValueToString($offset),
);
}

if ($this->checkType($this->getValueType(), $value) === false) {
throw new InvalidArgumentException(
'Value must be of type ' . $this->getValueType() . '; value is '
. $this->toolValueToString($value),
);
}

parent::offsetSet($offset, $value);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

/**
@template
@template
@extends































































*/
class TypedMap extends AbstractTypedMap
{








public function __construct(
private readonly string $keyType,
private readonly string $valueType,
array $data = [],
) {
parent::__construct($data);
}

public function getKeyType(): string
{
return $this->keyType;
}

public function getValueType(): string
{
return $this->valueType;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

use Ramsey\Collection\AbstractArray;
use Ramsey\Collection\Exception\InvalidArgumentException;
use Traversable;

use function array_key_exists;
use function array_keys;
use function in_array;
use function var_export;

/**
@template
@template
@extends
@implements



*/
abstract class AbstractMap extends AbstractArray implements MapInterface
{



public function __construct(array $data = [])
{
parent::__construct($data);
}




public function getIterator(): Traversable
{
return parent::getIterator();
}







public function offsetSet(mixed $offset, mixed $value): void
{
if ($offset === null) {
throw new InvalidArgumentException(
'Map elements are key/value pairs; a key must be provided for '
. 'value ' . var_export($value, true),
);
}

$this->data[$offset] = $value;
}

public function containsKey(int | string $key): bool
{
return array_key_exists($key, $this->data);
}

public function containsValue(mixed $value): bool
{
return in_array($value, $this->data, true);
}




public function keys(): array
{

return array_keys($this->data);
}







public function get(int | string $key, mixed $defaultValue = null): mixed
{
return $this[$key] ?? $defaultValue;
}








public function put(int | string $key, mixed $value): mixed
{
$previousValue = $this->get($key);
$this[$key] = $value;

return $previousValue;
}








public function putIfAbsent(int | string $key, mixed $value): mixed
{
$currentValue = $this->get($key);

if ($currentValue === null) {
$this[$key] = $value;
}

return $currentValue;
}







public function remove(int | string $key): mixed
{
$previousValue = $this->get($key);
unset($this[$key]);

return $previousValue;
}

public function removeIf(int | string $key, mixed $value): bool
{
if ($this->get($key) === $value) {
unset($this[$key]);

return true;
}

return false;
}








public function replace(int | string $key, mixed $value): mixed
{
$currentValue = $this->get($key);

if ($this->containsKey($key)) {
$this[$key] = $value;
}

return $currentValue;
}

public function replaceIf(int | string $key, mixed $oldValue, mixed $newValue): bool
{
if ($this->get($key) === $oldValue) {
$this[$key] = $newValue;

return true;
}

return false;
}




public function __serialize(): array
{

return parent::__serialize();
}




public function toArray(): array
{

return parent::toArray();
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Tool\TypeTrait;
use Ramsey\Collection\Tool\ValueToStringTrait;

use function array_combine;
use function array_key_exists;
use function is_int;

/**
@extends



*/
class NamedParameterMap extends AbstractMap
{
use TypeTrait;
use ValueToStringTrait;






private readonly array $namedParameters;







public function __construct(array $namedParameters, array $data = [])
{
$this->namedParameters = $this->filterNamedParameters($namedParameters);
parent::__construct($data);
}






public function getNamedParameters(): array
{
return $this->namedParameters;
}

public function offsetSet(mixed $offset, mixed $value): void
{
if (!array_key_exists($offset, $this->namedParameters)) {
throw new InvalidArgumentException(
'Attempting to set value for unconfigured parameter \''
. $this->toolValueToString($offset) . '\'',
);
}

if ($this->checkType($this->namedParameters[$offset], $value) === false) {
throw new InvalidArgumentException(
'Value for \'' . $offset . '\' must be of type '
. $this->namedParameters[$offset] . '; value is '
. $this->toolValueToString($value),
);
}

$this->data[$offset] = $value;
}









protected function filterNamedParameters(array $namedParameters): array
{
$names = [];
$types = [];

foreach ($namedParameters as $key => $value) {
if (is_int($key)) {
$names[] = $value;
$types[] = 'mixed';
} else {
$names[] = $key;
$types[] = $value;
}
}

return array_combine($names, $types) ?: [];
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

/**
@template
@template
@extends



*/
interface TypedMapInterface extends MapInterface
{



public function getKeyType(): string;




public function getValueType(): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

use Ramsey\Collection\ArrayInterface;

/**
@template
@template
@extends




*/
interface MapInterface extends ArrayInterface
{





public function containsKey(int | string $key): bool;








public function containsValue(mixed $value): bool;






public function keys(): array;











public function get(int | string $key, mixed $defaultValue = null): mixed;













public function put(int | string $key, mixed $value): mixed;














public function putIfAbsent(int | string $key, mixed $value): mixed;









public function remove(int | string $key): mixed;












public function removeIf(int | string $key, mixed $value): bool;











public function replace(int | string $key, mixed $value): mixed;













public function replaceIf(int | string $key, mixed $oldValue, mixed $newValue): bool;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Map;

/**
@extends


*/
class AssociativeArrayMap extends AbstractMap
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Exception\NoSuchElementException;
use Ramsey\Collection\Tool\TypeTrait;
use Ramsey\Collection\Tool\ValueToStringTrait;

use function array_key_first;

/**
@template
@extends
@implements



*/
class Queue extends AbstractArray implements QueueInterface
{
use TypeTrait;
use ValueToStringTrait;








public function __construct(private readonly string $queueType, array $data = [])
{
parent::__construct($data);
}










public function offsetSet(mixed $offset, mixed $value): void
{
if ($this->checkType($this->getType(), $value) === false) {
throw new InvalidArgumentException(
'Value must be of type ' . $this->getType() . '; value is '
. $this->toolValueToString($value),
);
}

$this->data[] = $value;
}




public function add(mixed $element): bool
{
$this[] = $element;

return true;
}






public function element(): mixed
{
return $this->peek() ?? throw new NoSuchElementException(
'Can\'t return element from Queue. Queue is empty.',
);
}

public function offer(mixed $element): bool
{
try {
return $this->add($element);
} catch (InvalidArgumentException) {
return false;
}
}




public function peek(): mixed
{
$index = array_key_first($this->data);

if ($index === null) {
return null;
}

return $this[$index];
}




public function poll(): mixed
{
$index = array_key_first($this->data);

if ($index === null) {
return null;
}

$head = $this[$index];
unset($this[$index]);

return $head;
}






public function remove(): mixed
{
return $this->poll() ?? throw new NoSuchElementException(
'Can\'t return element from Queue. Queue is empty.',
);
}

public function getType(): string
{
return $this->queueType;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Closure;
use Ramsey\Collection\Exception\CollectionMismatchException;
use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Exception\InvalidPropertyOrMethod;
use Ramsey\Collection\Exception\NoSuchElementException;
use Ramsey\Collection\Exception\UnsupportedOperationException;
use Ramsey\Collection\Tool\TypeTrait;
use Ramsey\Collection\Tool\ValueExtractorTrait;
use Ramsey\Collection\Tool\ValueToStringTrait;

use function array_filter;
use function array_key_first;
use function array_key_last;
use function array_map;
use function array_merge;
use function array_reduce;
use function array_search;
use function array_udiff;
use function array_uintersect;
use function in_array;
use function is_int;
use function is_object;
use function spl_object_id;
use function sprintf;
use function usort;

/**
@template
@extends
@implements



*/
abstract class AbstractCollection extends AbstractArray implements CollectionInterface
{
use TypeTrait;
use ValueToStringTrait;
use ValueExtractorTrait;




public function add(mixed $element): bool
{
$this[] = $element;

return true;
}

public function contains(mixed $element, bool $strict = true): bool
{
return in_array($element, $this->data, $strict);
}




public function offsetSet(mixed $offset, mixed $value): void
{
if ($this->checkType($this->getType(), $value) === false) {
throw new InvalidArgumentException(
'Value must be of type ' . $this->getType() . '; value is '
. $this->toolValueToString($value),
);
}

if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}

public function remove(mixed $element): bool
{
if (($position = array_search($element, $this->data, true)) !== false) {
unset($this[$position]);

return true;
}

return false;
}









public function column(string $propertyOrMethod): array
{
$temp = [];

foreach ($this->data as $item) {
$temp[] = $this->extractValue($item, $propertyOrMethod);
}

return $temp;
}






public function first(): mixed
{
$firstIndex = array_key_first($this->data);

if ($firstIndex === null) {
throw new NoSuchElementException('Can\'t determine first item. Collection is empty');
}

return $this->data[$firstIndex];
}






public function last(): mixed
{
$lastIndex = array_key_last($this->data);

if ($lastIndex === null) {
throw new NoSuchElementException('Can\'t determine last item. Collection is empty');
}

return $this->data[$lastIndex];
}









public function sort(?string $propertyOrMethod = null, Sort $order = Sort::Ascending): CollectionInterface
{
$collection = clone $this;

usort(
$collection->data,
function (mixed $a, mixed $b) use ($propertyOrMethod, $order): int {
$aValue = $this->extractValue($a, $propertyOrMethod);
$bValue = $this->extractValue($b, $propertyOrMethod);

return ($aValue <=> $bValue) * ($order === Sort::Descending ? -1 : 1);
},
);

return $collection;
}






public function filter(callable $callback): CollectionInterface
{
$collection = clone $this;
$collection->data = array_merge([], array_filter($collection->data, $callback));

return $collection;
}









public function where(?string $propertyOrMethod, mixed $value): CollectionInterface
{
return $this->filter(
fn (mixed $item): bool => $this->extractValue($item, $propertyOrMethod) === $value,
);
}

/**
@template





*/
public function map(callable $callback): CollectionInterface
{
return new Collection('mixed', array_map($callback, $this->data));
}

/**
@template






*/
public function reduce(callable $callback, mixed $initial): mixed
{
return array_reduce($this->data, $callback, $initial);
}










public function diff(CollectionInterface $other): CollectionInterface
{
$this->compareCollectionTypes($other);

$diffAtoB = array_udiff($this->data, $other->toArray(), $this->getComparator());
$diffBtoA = array_udiff($other->toArray(), $this->data, $this->getComparator());

$collection = clone $this;
$collection->data = array_merge($diffAtoB, $diffBtoA);

return $collection;
}










public function intersect(CollectionInterface $other): CollectionInterface
{
$this->compareCollectionTypes($other);

$collection = clone $this;
$collection->data = array_uintersect($this->data, $other->toArray(), $this->getComparator());

return $collection;
}










public function merge(CollectionInterface ...$collections): CollectionInterface
{
$mergedCollection = clone $this;

foreach ($collections as $index => $collection) {
if (!$collection instanceof static) {
throw new CollectionMismatchException(
sprintf('Collection with index %d must be of type %s', $index, static::class),
);
}



if ($this->getUniformType($collection) !== $this->getUniformType($this)) {
throw new CollectionMismatchException(
sprintf(
'Collection items in collection with index %d must be of type %s',
$index,
$this->getType(),
),
);
}

foreach ($collection as $key => $value) {
if (is_int($key)) {
$mergedCollection[] = $value;
} else {
$mergedCollection[$key] = $value;
}
}
}

return $mergedCollection;
}






private function compareCollectionTypes(CollectionInterface $other): void
{
if (!$other instanceof static) {
throw new CollectionMismatchException('Collection must be of type ' . static::class);
}



if ($this->getUniformType($other) !== $this->getUniformType($this)) {
throw new CollectionMismatchException('Collection items must be of type ' . $this->getType());
}
}

private function getComparator(): Closure
{
return function (mixed $a, mixed $b): int {





if (is_object($a) && is_object($b)) {
$a = spl_object_id($a);
$b = spl_object_id($b);
}

return $a === $b ? 0 : ($a < $b ? 1 : -1);
};
}




private function getUniformType(CollectionInterface $collection): string
{
return match ($collection->getType()) {
'integer' => 'int',
'boolean' => 'bool',
'double' => 'float',
default => $collection->getType(),
};
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;




enum Sort: string
{



case Ascending = 'asc';




case Descending = 'desc';
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

/**
@template
@extends




















*/
class Set extends AbstractSet
{







public function __construct(private readonly string $setType, array $data = [])
{
parent::__construct($data);
}

public function getType(): string
{
return $this->setType;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Tool;

use Ramsey\Collection\Exception\InvalidPropertyOrMethod;
use Ramsey\Collection\Exception\UnsupportedOperationException;
use ReflectionProperty;

use function is_array;
use function is_object;
use function method_exists;
use function property_exists;
use function sprintf;




trait ValueExtractorTrait
{



abstract public function getType(): string;

















protected function extractValue(mixed $element, ?string $propertyOrMethod): mixed
{
if ($propertyOrMethod === null) {
return $element;
}

if (!is_object($element) && !is_array($element)) {
throw new UnsupportedOperationException(sprintf(
'The collection type "%s" does not support the $propertyOrMethod parameter',
$this->getType(),
));
}

if (is_array($element)) {
return $element[$propertyOrMethod] ?? throw new InvalidPropertyOrMethod(sprintf(
'Key or index "%s" not found in collection elements',
$propertyOrMethod,
));
}

if (property_exists($element, $propertyOrMethod) && method_exists($element, $propertyOrMethod)) {
$reflectionProperty = new ReflectionProperty($element, $propertyOrMethod);
if ($reflectionProperty->isPublic()) {
return $element->$propertyOrMethod;
}

return $element->{$propertyOrMethod}();
}

if (property_exists($element, $propertyOrMethod)) {
return $element->$propertyOrMethod;
}

if (method_exists($element, $propertyOrMethod)) {
return $element->{$propertyOrMethod}();
}

if (isset($element->$propertyOrMethod)) {
return $element->$propertyOrMethod;
}

throw new InvalidPropertyOrMethod(sprintf(
'Method or property "%s" not defined in %s',
$propertyOrMethod,
$element::class,
));
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Tool;

use function is_array;
use function is_bool;
use function is_callable;
use function is_float;
use function is_int;
use function is_numeric;
use function is_object;
use function is_resource;
use function is_scalar;
use function is_string;




trait TypeTrait
{






protected function checkType(string $type, mixed $value): bool
{
return match ($type) {
'array' => is_array($value),
'bool', 'boolean' => is_bool($value),
'callable' => is_callable($value),
'float', 'double' => is_float($value),
'int', 'integer' => is_int($value),
'null' => $value === null,
'numeric' => is_numeric($value),
'object' => is_object($value),
'resource' => is_resource($value),
'scalar' => is_scalar($value),
'string' => is_string($value),
'mixed' => true,
default => $value instanceof $type,
};
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Tool;

use DateTimeInterface;

use function assert;
use function get_resource_type;
use function is_array;
use function is_bool;
use function is_callable;
use function is_object;
use function is_resource;
use function is_scalar;




trait ValueToStringTrait
{















protected function toolValueToString(mixed $value): string
{

if ($value === null) {
return 'NULL';
}


if (is_bool($value)) {
return $value ? 'TRUE' : 'FALSE';
}


if (is_array($value)) {
return 'Array';
}


if (is_scalar($value)) {
return (string) $value;
}


if (is_resource($value)) {
return '(' . get_resource_type($value) . ' resource #' . (int) $value . ')';
}


assert(is_object($value));


if (is_callable([$value, '__toString'])) {

return $value->__toString();
}


if ($value instanceof DateTimeInterface) {
return $value->format('c');
}


return '(' . $value::class . ' Object)';
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Ramsey\Collection\Exception\NoSuchElementException;
use RuntimeException;

/**
@template
@extends












































































*/
interface QueueInterface extends ArrayInterface
{






























public function add(mixed $element): bool;













public function element(): mixed;















public function offer(mixed $element): bool;









public function peek(): mixed;









public function poll(): mixed;













public function remove(): mixed;




public function getType(): string;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Ramsey\Collection\Exception\CollectionMismatchException;
use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Exception\InvalidPropertyOrMethod;
use Ramsey\Collection\Exception\NoSuchElementException;
use Ramsey\Collection\Exception\UnsupportedOperationException;

/**
@template
@extends





*/
interface CollectionInterface extends ArrayInterface
{



























public function add(mixed $element): bool;







public function contains(mixed $element, bool $strict = true): bool;




public function getType(): string;









public function remove(mixed $element): bool;














public function column(string $propertyOrMethod): array;








public function first(): mixed;








public function last(): mixed;





















public function sort(?string $propertyOrMethod = null, Sort $order = Sort::Ascending): self;















public function filter(callable $callback): self;



















public function where(?string $propertyOrMethod, mixed $value): self;

/**
@template














*/
public function map(callable $callback): self;

/**
@template












*/
public function reduce(callable $callback, mixed $initial): mixed;













public function diff(CollectionInterface $other): self;













public function intersect(CollectionInterface $other): self;












public function merge(CollectionInterface ...$collections): self;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

/**
@template
@extends























































*/
class Collection extends AbstractCollection
{








public function __construct(private readonly string $collectionType, array $data = [])
{
parent::__construct($data);
}

public function getType(): string
{
return $this->collectionType;
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

/**
@extends


*/
class GenericArray extends AbstractArray
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Ramsey\Collection\Exception\NoSuchElementException;
use RuntimeException;

/**
@template
@extends














































































































































*/
interface DoubleEndedQueueInterface extends QueueInterface
{
















public function addFirst(mixed $element): bool;



















public function addLast(mixed $element): bool;













public function offerFirst(mixed $element): bool;













public function offerLast(mixed $element): bool;











public function removeFirst(): mixed;











public function removeLast(): mixed;







public function pollFirst(): mixed;







public function pollLast(): mixed;











public function firstElement(): mixed;











public function lastElement(): mixed;







public function peekFirst(): mixed;







public function peekLast(): mixed;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use RuntimeException;






class InvalidPropertyOrMethod extends RuntimeException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use RuntimeException;




class NoSuchElementException extends RuntimeException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use RuntimeException;




class UnsupportedOperationException extends RuntimeException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use Throwable;

interface CollectionException extends Throwable
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use InvalidArgumentException as PhpInvalidArgumentException;




class InvalidArgumentException extends PhpInvalidArgumentException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use RuntimeException;




class CollectionMismatchException extends RuntimeException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection\Exception;

use OutOfBoundsException as PhpOutOfBoundsException;




class OutOfBoundsException extends PhpOutOfBoundsException implements CollectionException
{
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

/**
@template
@extends




*/
abstract class AbstractSet extends AbstractCollection
{
public function add(mixed $element): bool
{
if ($this->contains($element)) {
return false;
}






parent::offsetSet(null, $element);

return true;
}

public function offsetSet(mixed $offset, mixed $value): void
{
if ($this->contains($value)) {
return;
}

parent::offsetSet($offset, $value);
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use Ramsey\Collection\Exception\InvalidArgumentException;
use Ramsey\Collection\Exception\NoSuchElementException;

use function array_key_last;
use function array_pop;
use function array_unshift;

/**
@template
@extends
@implements



*/
class DoubleEndedQueue extends Queue implements DoubleEndedQueueInterface
{







public function __construct(private readonly string $queueType, array $data = [])
{
parent::__construct($this->queueType, $data);
}




public function addFirst(mixed $element): bool
{
if ($this->checkType($this->getType(), $element) === false) {
throw new InvalidArgumentException(
'Value must be of type ' . $this->getType() . '; value is '
. $this->toolValueToString($element),
);
}

array_unshift($this->data, $element);

return true;
}




public function addLast(mixed $element): bool
{
return $this->add($element);
}

public function offerFirst(mixed $element): bool
{
try {
return $this->addFirst($element);
} catch (InvalidArgumentException) {
return false;
}
}

public function offerLast(mixed $element): bool
{
return $this->offer($element);
}






public function removeFirst(): mixed
{
return $this->remove();
}






public function removeLast(): mixed
{
return $this->pollLast() ?? throw new NoSuchElementException(
'Can\'t return element from Queue. Queue is empty.',
);
}




public function pollFirst(): mixed
{
return $this->poll();
}




public function pollLast(): mixed
{
return array_pop($this->data);
}






public function firstElement(): mixed
{
return $this->element();
}






public function lastElement(): mixed
{
return $this->peekLast() ?? throw new NoSuchElementException(
'Can\'t return element from Queue. Queue is empty.',
);
}




public function peekFirst(): mixed
{
return $this->peek();
}




public function peekLast(): mixed
{
$lastIndex = array_key_last($this->data);

if ($lastIndex === null) {
return null;
}

return $this->data[$lastIndex];
}
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use ArrayAccess;
use Countable;
use IteratorAggregate;

/**
@template
@extends
@extends


*/
interface ArrayInterface extends
ArrayAccess,
Countable,
IteratorAggregate
{



public function clear(): void;






public function toArray(): array;




public function isEmpty(): bool;
}
<?php











declare(strict_types=1);

namespace Ramsey\Collection;

use ArrayIterator;
use Traversable;

use function count;

/**
@template
@implements



*/
abstract class AbstractArray implements ArrayInterface
{





protected array $data = [];






public function __construct(array $data = [])
{


foreach ($data as $key => $value) {
$this[$key] = $value;
}
}








public function getIterator(): Traversable
{
return new ArrayIterator($this->data);
}








public function offsetExists(mixed $offset): bool
{
return isset($this->data[$offset]);
}











public function offsetGet(mixed $offset): mixed
{
return $this->data[$offset];
}










public function offsetSet(mixed $offset, mixed $value): void
{
if ($offset === null) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}








public function offsetUnset(mixed $offset): void
{
unset($this->data[$offset]);
}









public function __serialize(): array
{
return $this->data;
}






public function __unserialize(array $data): void
{
$this->data = $data;
}






public function count(): int
{
return count($this->data);
}

public function clear(): void
{
$this->data = [];
}




public function toArray(): array
{
return $this->data;
}

public function isEmpty(): bool
{
return $this->data === [];
}
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/openssl.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/openssl.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/openssl.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/openssl.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/openssl.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/exec.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/exec.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/exec.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/exec.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/exec.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/libxml.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/libxml.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/libxml.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/libxml.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/libxml.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/classobj.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/classobj.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/classobj.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/classobj.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/classobj.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ssdeep.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ssdeep.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ssdeep.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ssdeep.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ssdeep.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ps.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ps.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ps.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ps.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ps.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/yaz.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/yaz.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/yaz.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/yaz.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/yaz.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/curl.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/curl.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/curl.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/curl.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/curl.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/session.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/session.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/session.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/session.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/session.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/funchand.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/funchand.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/funchand.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/funchand.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/funchand.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/zlib.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/zlib.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/zlib.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/zlib.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/zlib.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/misc.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/misc.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/misc.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/misc.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/misc.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/cubrid.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/cubrid.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/cubrid.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/cubrid.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/cubrid.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/mailparse.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/mailparse.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/mailparse.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/mailparse.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/mailparse.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ldap.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ldap.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ldap.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ldap.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ldap.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/xmlrpc.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/xmlrpc.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/xmlrpc.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/xmlrpc.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/xmlrpc.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/sqlsrv.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/sqlsrv.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/sqlsrv.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/sqlsrv.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/sqlsrv.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/shmop.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/shmop.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/shmop.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/shmop.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/shmop.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/dir.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/dir.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/dir.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/dir.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/dir.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/gettext.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/gettext.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/gettext.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/gettext.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/gettext.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/stream.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/stream.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/stream.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/stream.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/stream.php';
}
<?php

namespace Safe;

use Safe\Exceptions\OpensslException;









function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_iv_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_cipher_key_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_key_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
} elseif ($private_key !== null) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_cms_read(string $input_filename, array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_cms_read($input_filename, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates = null, array $ca_info = [], ?string $untrusted_certificates_filename = null, ?string $content = null, ?string $pk7 = null, ?string $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
} elseif ($sigfile !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
} elseif ($pk7 !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
} elseif ($content !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
} elseif ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
} elseif ($ca_info !== []) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
} elseif ($certificates !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates);
} else {
$safeResult = \openssl_cms_verify($input_filename, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export($csr, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}












function openssl_csr_get_public_key($csr, bool $short_names = true): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_csr_get_public_key($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
$safeResult = \openssl_csr_get_subject($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}























































































































function openssl_csr_new(array $distinguished_names, ?\OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null)
{
error_clear_last();
if ($extra_attributes !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
} elseif ($options !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
$safeResult = \openssl_csr_new($distinguished_names, $private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






























function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, ?array $options = null, int $serial = 0, ?string $serial_hex = null): \OpenSSLCertificate
{
error_clear_last();
if ($serial_hex !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial, $serial_hex);
} elseif ($serial !== 0) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
} elseif ($options !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
























function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, string $aad = ""): string
{
error_clear_last();
if ($aad !== "") {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
} elseif ($tag !== null) {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag);
} else {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}













function openssl_dh_compute_key(string $public_key, \OpenSSLAsymmetricKey $private_key): string
{
error_clear_last();
$safeResult = \openssl_dh_compute_key($public_key, $private_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_digest($data, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















































function openssl_get_curve_names(): array
{
error_clear_last();
$safeResult = \openssl_get_curve_names();
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





























function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, ?string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
$safeResult = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




































function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




































function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}













function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
if ($private_key !== null) {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_read($data, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


























function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
{
error_clear_last();
$safeResult = \openssl_pkey_derive($public_key, $private_key, $key_length);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


















function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase);
} else {
$safeResult = \openssl_pkey_export($key, $output);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

























function openssl_pkey_get_details(\OpenSSLAsymmetricKey $key): array
{
error_clear_last();
$safeResult = \openssl_pkey_get_details($key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_private($private_key, ?string $passphrase = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \openssl_pkey_get_private($private_key, $passphrase);
} else {
$safeResult = \openssl_pkey_get_private($private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_public($public_key): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_pkey_get_public($public_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






























































































































































































































































































































































function openssl_pkey_new(?array $options = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_new($options);
} else {
$safeResult = \openssl_pkey_new();
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






















function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null)
{
error_clear_last();
$safeResult = \openssl_random_pseudo_bytes($length, $strong_result);
return $safeResult;
}


































function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
$safeResult = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
{
error_clear_last();
$safeResult = \openssl_sign($data, $signature, $private_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_spki_export_challenge(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export_challenge($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_spki_export(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_spki_new(\OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
{
error_clear_last();
$safeResult = \openssl_spki_new($private_key, $challenge, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}









function openssl_spki_verify(string $spki): void
{
error_clear_last();
$safeResult = \openssl_spki_verify($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
$safeResult = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}































































function openssl_x509_checkpurpose($certificate, int $purpose, array $ca_info = [], ?string $untrusted_certificates_file = null)
{
error_clear_last();
if ($untrusted_certificates_file !== null) {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info, $untrusted_certificates_file);
} else {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info);
}
if ($safeResult === -1) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

















function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export($certificate, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}












function openssl_x509_read($certificate): \OpenSSLCertificate
{
error_clear_last();
$safeResult = \openssl_x509_read($certificate);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ExecException;





























function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \exec($command, $output, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}





















function passthru(string $command, ?int &$result_code = null): void
{
error_clear_last();
$safeResult = \passthru($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}


















function proc_close($process): int
{
error_clear_last();
$safeResult = \proc_close($process);
if ($safeResult === -1) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}






















function proc_nice(int $priority): void
{
error_clear_last();
$safeResult = \proc_nice($priority);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}

















































































function proc_open(string $command, array $descriptor_spec, ?array &$pipes, ?string $cwd = null, ?array $env_vars = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars, $options);
} elseif ($env_vars !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars);
} elseif ($cwd !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd);
} else {
$safeResult = \proc_open($command, $descriptor_spec, $pipes);
}
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}










function shell_exec(string $command): ?string
{
error_clear_last();
$safeResult = \shell_exec($command);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}























function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \system($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LibxmlException;














































function libxml_set_external_entity_loader(callable $resolver_function): void
{
error_clear_last();
$safeResult = \libxml_set_external_entity_loader($resolver_function);
if ($safeResult === false) {
throw LibxmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ClassobjException;













function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
$safeResult = \class_alias($class, $alias, $autoload);
if ($safeResult === false) {
throw ClassobjException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SsdeepException;













function ssdeep_fuzzy_compare(string $signature1, string $signature2): int
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_compare($signature1, $signature2);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}













function ssdeep_fuzzy_hash_filename(string $file_name): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash_filename($file_name);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}












function ssdeep_fuzzy_hash(string $to_hash): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash($to_hash);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PsException;






















function ps_add_launchlink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename): void
{
error_clear_last();
$safeResult = \ps_add_launchlink($psdoc, $llx, $lly, $urx, $ury, $filename);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}






























function ps_add_locallink($psdoc, float $llx, float $lly, float $urx, float $ury, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_locallink($psdoc, $llx, $lly, $urx, $ury, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}































function ps_add_note($psdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
{
error_clear_last();
$safeResult = \ps_add_note($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































function ps_add_pdflink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_pdflink($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

























function ps_add_weblink($psdoc, float $llx, float $lly, float $urx, float $ury, string $url): void
{
error_clear_last();
$safeResult = \ps_add_weblink($psdoc, $llx, $lly, $urx, $ury, $url);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arc($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arc($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arcn($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arcn($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











































function ps_begin_page($psdoc, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_begin_page($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_begin_pattern($psdoc, float $width, float $height, float $xstep, float $ystep, int $painttype): int
{
error_clear_last();
$safeResult = \ps_begin_pattern($psdoc, $width, $height, $xstep, $ystep, $painttype);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}


















function ps_begin_template($psdoc, float $width, float $height): int
{
error_clear_last();
$safeResult = \ps_begin_template($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




















function ps_circle($psdoc, float $x, float $y, float $radius): void
{
error_clear_last();
$safeResult = \ps_circle($psdoc, $x, $y, $radius);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_clip($psdoc): void
{
error_clear_last();
$safeResult = \ps_clip($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_close_image($psdoc, int $imageid): void
{
error_clear_last();
$safeResult = \ps_close_image($psdoc, $imageid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_close($psdoc): void
{
error_clear_last();
$safeResult = \ps_close($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_continue_text($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_continue_text($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_curveto($psdoc, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
{
error_clear_last();
$safeResult = \ps_curveto($psdoc, $x1, $y1, $x2, $y2, $x3, $y3);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_delete($psdoc): void
{
error_clear_last();
$safeResult = \ps_delete($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_end_page($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_page($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_end_pattern($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_pattern($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_end_template($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_template($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































































































































function ps_get_parameter($psdoc, string $name, ?float $modifier = null): string
{
error_clear_last();
if ($modifier !== null) {
$safeResult = \ps_get_parameter($psdoc, $name, $modifier);
} else {
$safeResult = \ps_get_parameter($psdoc, $name);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}























function ps_hyphenate($psdoc, string $text): array
{
error_clear_last();
$safeResult = \ps_hyphenate($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}













function ps_include_file($psdoc, string $file): void
{
error_clear_last();
$safeResult = \ps_include_file($psdoc, $file);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_lineto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_lineto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_moveto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_moveto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_new()
{
error_clear_last();
$safeResult = \ps_new();
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}














function ps_open_file($psdoc, ?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \ps_open_file($psdoc, $filename);
} else {
$safeResult = \ps_open_file($psdoc);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}




















function ps_place_image($psdoc, int $imageid, float $x, float $y, float $scale): void
{
error_clear_last();
$safeResult = \ps_place_image($psdoc, $imageid, $x, $y, $scale);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_rect($psdoc, float $x, float $y, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_rect($psdoc, $x, $y, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_restore($psdoc): void
{
error_clear_last();
$safeResult = \ps_restore($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_rotate($psdoc, float $rot): void
{
error_clear_last();
$safeResult = \ps_rotate($psdoc, $rot);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_save($psdoc): void
{
error_clear_last();
$safeResult = \ps_save($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_scale($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_scale($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_color($psdoc, float $red, float $green, float $blue): void
{
error_clear_last();
$safeResult = \ps_set_border_color($psdoc, $red, $green, $blue);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_dash($psdoc, float $black, float $white): void
{
error_clear_last();
$safeResult = \ps_set_border_dash($psdoc, $black, $white);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_style($psdoc, string $style, float $width): void
{
error_clear_last();
$safeResult = \ps_set_border_style($psdoc, $style, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}







































function ps_set_info($p, string $key, string $val): void
{
error_clear_last();
$safeResult = \ps_set_info($p, $key, $val);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_set_parameter($psdoc, string $name, string $value): void
{
error_clear_last();
$safeResult = \ps_set_parameter($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_set_text_pos($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_set_text_pos($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

































































function ps_set_value($psdoc, string $name, float $value): void
{
error_clear_last();
$safeResult = \ps_set_value($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



























function ps_setcolor($psdoc, string $type, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
{
error_clear_last();
$safeResult = \ps_setcolor($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_setdash($psdoc, float $on, float $off): void
{
error_clear_last();
$safeResult = \ps_setdash($psdoc, $on, $off);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setflat($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setflat($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setfont($psdoc, int $fontid, float $size): void
{
error_clear_last();
$safeResult = \ps_setfont($psdoc, $fontid, $size);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setgray($psdoc, float $gray): void
{
error_clear_last();
$safeResult = \ps_setgray($psdoc, $gray);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinecap($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinecap($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinejoin($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinejoin($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setlinewidth($psdoc, float $width): void
{
error_clear_last();
$safeResult = \ps_setlinewidth($psdoc, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_setmiterlimit($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setmiterlimit($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setoverprintmode($psdoc, int $mode): void
{
error_clear_last();
$safeResult = \ps_setoverprintmode($psdoc, $mode);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setpolydash($psdoc, float $arr): void
{
error_clear_last();
$safeResult = \ps_setpolydash($psdoc, $arr);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_shading_pattern($psdoc, int $shadingid, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading_pattern($psdoc, $shadingid, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




































function ps_shading($psdoc, string $type, float $x0, float $y0, float $x1, float $y1, float $c1, float $c2, float $c3, float $c4, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}















function ps_shfill($psdoc, int $shadingid): void
{
error_clear_last();
$safeResult = \ps_shfill($psdoc, $shadingid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_show_xy($psdoc, string $text, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_show_xy($psdoc, $text, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_show_xy2($psdoc, string $text, int $len, float $xcoor, float $ycoor): void
{
error_clear_last();
$safeResult = \ps_show_xy2($psdoc, $text, $len, $xcoor, $ycoor);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_show($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_show($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_show2($psdoc, string $text, int $len): void
{
error_clear_last();
$safeResult = \ps_show2($psdoc, $text, $len);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_symbol($psdoc, int $ord): void
{
error_clear_last();
$safeResult = \ps_symbol($psdoc, $ord);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_translate($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_translate($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\YazException;












































function yaz_ccl_parse($id, string $query, ?array &$result): void
{
error_clear_last();
$safeResult = \yaz_ccl_parse($id, $query, $result);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}









function yaz_close($id): void
{
error_clear_last();
$safeResult = \yaz_close($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}

































































































































































































function yaz_connect(string $zurl, $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \yaz_connect($zurl, $options);
} else {
$safeResult = \yaz_connect($zurl);
}
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}














function yaz_database($id, string $databases): void
{
error_clear_last();
$safeResult = \yaz_database($id, $databases);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}















function yaz_element($id, string $elementset): void
{
error_clear_last();
$safeResult = \yaz_element($id, $elementset);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












function yaz_present($id): void
{
error_clear_last();
$safeResult = \yaz_present($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}
































function yaz_search($id, string $type, string $query): void
{
error_clear_last();
$safeResult = \yaz_search($id, $type, $query);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












































function yaz_wait(?array &$options = null)
{
error_clear_last();
$safeResult = \yaz_wait($options);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CurlException;










function curl_copy_handle(\CurlHandle $handle): \CurlHandle
{
error_clear_last();
$safeResult = \curl_copy_handle($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}












function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_escape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_exec(\CurlHandle $handle)
{
error_clear_last();
$safeResult = \curl_exec($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}






























































































































































function curl_getinfo(\CurlHandle $handle, ?int $option = null)
{
error_clear_last();
if ($option !== null) {
$safeResult = \curl_getinfo($handle, $option);
} else {
$safeResult = \curl_getinfo($handle);
}
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}















function curl_init(?string $url = null): \CurlHandle
{
error_clear_last();
if ($url !== null) {
$safeResult = \curl_init($url);
} else {
$safeResult = \curl_init();
}
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}















































function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
$safeResult = \curl_multi_info_read($multi_handle, $queued_messages);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
return $safeResult;
}








function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$safeResult = \curl_multi_init();
return $safeResult;
}















function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_multi_setopt($multi_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
}















function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_setopt($handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}










function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
$safeResult = \curl_share_errno($share_handle);
return $safeResult;
}












function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_share_setopt($share_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
}












function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_unescape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_upkeep(\CurlHandle $handle): void
{
error_clear_last();
$safeResult = \curl_upkeep($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}
<?php

namespace Safe;

use Safe\Exceptions\SessionException;








function session_abort(): void
{
error_clear_last();
$safeResult = \session_abort();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


























function session_create_id(string $prefix = ""): string
{
error_clear_last();
$safeResult = \session_create_id($prefix);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}














function session_decode(string $data): void
{
error_clear_last();
$safeResult = \session_decode($data);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


















function session_destroy(): void
{
error_clear_last();
$safeResult = \session_destroy();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}













function session_encode(): string
{
error_clear_last();
$safeResult = \session_encode();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
























function session_id(?string $id = null): string
{
error_clear_last();
if ($id !== null) {
$safeResult = \session_id($id);
} else {
$safeResult = \session_id();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
















function session_module_name(?string $module = null): string
{
error_clear_last();
if ($module !== null) {
$safeResult = \session_module_name($module);
} else {
$safeResult = \session_module_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}












































function session_name(?string $name = null): string
{
error_clear_last();
if ($name !== null) {
$safeResult = \session_name($name);
} else {
$safeResult = \session_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}

















function session_regenerate_id(bool $delete_old_session = false): void
{
error_clear_last();
$safeResult = \session_regenerate_id($delete_old_session);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}










function session_reset(): void
{
error_clear_last();
$safeResult = \session_reset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}























function session_save_path(?string $path = null): string
{
error_clear_last();
if ($path !== null) {
$safeResult = \session_save_path($path);
} else {
$safeResult = \session_save_path();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}









function session_unset(): void
{
error_clear_last();
$safeResult = \session_unset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
















function session_write_close(): void
{
error_clear_last();
$safeResult = \session_write_close();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FunchandException;









function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \register_tick_function($callback, ...$args);
} else {
$safeResult = \register_tick_function($callback);
}
if ($safeResult === false) {
throw FunchandException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZlibException;



















function deflate_add(\DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \deflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























































































function deflate_init(int $encoding, array $options = []): \DeflateContext
{
error_clear_last();
$safeResult = \deflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function gzclose($stream): void
{
error_clear_last();
$safeResult = \gzclose($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}




















function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string
{
error_clear_last();
$safeResult = \gzcompress($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzdecode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}



















function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string
{
error_clear_last();
$safeResult = \gzdeflate($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

























function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
$safeResult = \gzencode($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzfile(string $filename, int $use_include_path = 0): array
{
error_clear_last();
$safeResult = \gzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}














function gzgets($stream, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzgets($stream, $length);
} else {
$safeResult = \gzgets($stream);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzinflate($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























function gzopen(string $filename, string $mode, int $use_include_path = 0)
{
error_clear_last();
$safeResult = \gzopen($filename, $mode, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzpassthru($stream)
{
error_clear_last();
$safeResult = \gzpassthru($stream);
return $safeResult;
}















function gzread($stream, int $length): string
{
error_clear_last();
$safeResult = \gzread($stream, $length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function gzrewind($stream): void
{
error_clear_last();
$safeResult = \gzrewind($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}












function gztell($stream): int
{
error_clear_last();
$safeResult = \gztell($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzuncompress(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzuncompress($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}


















function gzwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzwrite($stream, $data, $length);
} else {
$safeResult = \gzwrite($stream, $data);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_read_len(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_read_len($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









function inflate_get_status(\InflateContext $context)
{
error_clear_last();
$safeResult = \inflate_get_status($context);
return $safeResult;
}























function inflate_add(\InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \inflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









































































function inflate_init(int $encoding, array $options = []): \InflateContext
{
error_clear_last();
$safeResult = \inflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

















function readgzfile(string $filename, int $use_include_path = 0): int
{
error_clear_last();
$safeResult = \readgzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \zlib_decode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MiscException;

























function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
$safeResult = \define($constant_name, $value, $case_insensitive);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}






















function highlight_file(string $filename, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_file($filename, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}













function highlight_string(string $string, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_string($string, $return);
return $safeResult;
}















function hrtime(bool $as_number = false)
{
error_clear_last();
$safeResult = \hrtime($as_number);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}


/**
 * Pack given arguments into a binary string according to
 * format.
 *
 * The idea for this function was taken from Perl and all formatting codes
 * work the same as in Perl. However, there are some formatting codes that are
 * missing such as Perl's "u" format code.
 *
 * Note that the distinction between signed and unsigned values only
 * affects the function unpack, where as
 * function pack gives the same result for
 * signed and unsigned format codes.
 *
 * @param string $format The format string consists of format codes
 * followed by an optional repeater argument. The repeater argument can
 * be either an integer value or * for repeating to
 * the end of the input data. For a, A, h, H the repeat count specifies
 * how many characters of one data argument are taken, for @ it is the
 * absolute position where to put the next data, for everything else the
 * repeat count specifies how many data arguments are consumed and packed
 * into the resulting binary string.
 *
 * Currently implemented formats are:
 *
 * pack format characters
 *
 *
 *
 * Code
 * Description
 *
 *
 *
 *
 * a
 * NUL-padded string
 *
 *
 * A
 * SPACE-padded string
 *
 * h
 * Hex string, low nibble first
 *
 * H
 * Hex string, high nibble first
 * csigned char
 *
 * C
 * unsigned char
 *
 * s
 * signed short (always 16 bit, machine byte order)
 *
 *
 * S
 * unsigned short (always 16 bit, machine byte order)
 *
 *
 * n
 * unsigned short (always 16 bit, big endian byte order)
 *
 *
 * v
 * unsigned short (always 16 bit, little endian byte order)
 *
 *
 * i
 * signed integer (machine dependent size and byte order)
 *
 *
 * I
 * unsigned integer (machine dependent size and byte order)
 *
 *
 * l
 * signed long (always 32 bit, machine byte order)
 *
 *
 * L
 * unsigned long (always 32 bit, machine byte order)
 *
 *
 * N
 * unsigned long (always 32 bit, big endian byte order)
 *
 *
 * V
 * unsigned long (always 32 bit, little endian byte order)
 *
 *
 * q
 * signed long long (always 64 bit, machine byte order)
 *
 *
 * Q
 * unsigned long long (always 64 bit, machine byte order)
 *
 *
 * J
 * unsigned long long (always 64 bit, big endian byte order)
 *
 *
 * P
 * unsigned long long (always 64 bit, little endian byte order)
 *
 *
 * f
 * float (machine dependent size and representation)
 *
 *
 * g
 * float (machine dependent size, little endian byte order)
 *
 *
 * G
 * float (machine dependent size, big endian byte order)
 *
 *
 * d
 * double (machine dependent size and representation)
 *
 *
 * e
 * double (machine dependent size, little endian byte order)
 *
 *
 * E
 * double (machine dependent size, big endian byte order)
 *
 *
 * x
 * NUL byte
 *
 *
 * X
 * Back up one byte
 *
 *
 * Z
 * NUL-padded string
 *
 *
 * @
 * NUL-fill to absolute position
 *
 *
 *
 *
 * @param mixed $values
 * @return string Returns a binary string containing data.
 *
 */
function pack(string $format, ...$values): string
{
error_clear_last();
if ($values !== []) {
$safeResult = \pack($format, ...$values);
} else {
$safeResult = \pack($format);
}
return $safeResult;
}















function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): string
{
error_clear_last();
$safeResult = \sapi_windows_cp_conv($in_codepage, $out_codepage, $subject);
if ($safeResult === null) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}









function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
$safeResult = \sapi_windows_cp_set($codepage);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}













function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
{
error_clear_last();
$safeResult = \sapi_windows_generate_ctrl_event($event, $pid);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}




















































function sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): void
{
error_clear_last();
$safeResult = \sapi_windows_set_ctrl_handler($handler, $add);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}


















function sapi_windows_vt100_support($stream, ?bool $enable = null): void
{
error_clear_last();
if ($enable !== null) {
$safeResult = \sapi_windows_vt100_support($stream, $enable);
} else {
$safeResult = \sapi_windows_vt100_support($stream);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}
















function sleep(int $seconds)
{
error_clear_last();
$safeResult = \sleep($seconds);
return $safeResult;
}





























function time_nanosleep(int $seconds, int $nanoseconds)
{
error_clear_last();
$safeResult = \time_nanosleep($seconds, $nanoseconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}










function time_sleep_until(float $timestamp): void
{
error_clear_last();
$safeResult = \time_sleep_until($timestamp);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}



































function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
$safeResult = \unpack($format, $string, $offset);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CubridException;

























































































































function cubrid_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
{
error_clear_last();
$safeResult = \cubrid_col_size($conn_identifier, $oid, $attr_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_names($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_names($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_types($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_types($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}


















function cubrid_commit($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_commit($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














































































function cubrid_connect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_connect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



























function cubrid_connect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_connect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_current_oid($req_identifier): string
{
error_clear_last();
$safeResult = \cubrid_current_oid($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_disconnect($conn_identifier = null): void
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_disconnect($conn_identifier);
} else {
$safeResult = \cubrid_disconnect();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_drop($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_drop($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_free_result($req_identifier): void
{
error_clear_last();
$safeResult = \cubrid_free_result($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_get_charset($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_charset($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_get_class_name($conn_identifier, string $oid): string
{
error_clear_last();
$safeResult = \cubrid_get_class_name($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}









function cubrid_get_client_info(): string
{
error_clear_last();
$safeResult = \cubrid_get_client_info();
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















































































































function cubrid_get_db_parameter($conn_identifier): array
{
error_clear_last();
$safeResult = \cubrid_get_db_parameter($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_get_query_timeout($req_identifier): int
{
error_clear_last();
$safeResult = \cubrid_get_query_timeout($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_get_server_info($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_server_info($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















function cubrid_insert_id($conn_identifier = null): string
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_insert_id($conn_identifier);
} else {
$safeResult = \cubrid_insert_id();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob_close(array $lob_identifier_array): void
{
error_clear_last();
$safeResult = \cubrid_lob_close($lob_identifier_array);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
{
error_clear_last();
$safeResult = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob_get($conn_identifier, string $sql): array
{
error_clear_last();
$safeResult = \cubrid_lob_get($conn_identifier, $sql);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_lob_send($conn_identifier, $lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob_send($conn_identifier, $lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob_size($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}

















function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_close($lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob2_close($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_export($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_export($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_import($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_import($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
{
error_clear_last();
if ($type !== "BLOB") {
$safeResult = \cubrid_lob2_new($conn_identifier, $type);
} elseif ($conn_identifier !== null) {
$safeResult = \cubrid_lob2_new($conn_identifier);
} else {
$safeResult = \cubrid_lob2_new();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_read($lob_identifier, int $len): string
{
error_clear_last();
$safeResult = \cubrid_lob2_read($lob_identifier, $len);
if ($safeResult === null) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}































function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_size($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_size64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_size64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob2_tell($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_tell($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_tell64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_tell64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_write($lob_identifier, string $buf): void
{
error_clear_last();
$safeResult = \cubrid_lob2_write($lob_identifier, $buf);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_read($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_read($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_write($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_write($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}


























function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
{
error_clear_last();
$safeResult = \cubrid_move_cursor($req_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_next_result($result): void
{
error_clear_last();
$safeResult = \cubrid_next_result($result);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
















































































function cubrid_pconnect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_pconnect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_pconnect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_pconnect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
{
error_clear_last();
$safeResult = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_put($conn_identifier, string $oid, ?string $attr = null, $value = null): void
{
error_clear_last();
if ($value !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr, $value);
} elseif ($attr !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr);
} else {
$safeResult = \cubrid_put($conn_identifier, $oid);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_rollback($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_rollback($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}







































































































































































































































































































































































































function cubrid_schema($conn_identifier, int $schema_type, ?string $class_name = null, ?string $attr_name = null): array
{
error_clear_last();
if ($attr_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
} elseif ($class_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name);
} else {
$safeResult = \cubrid_schema($conn_identifier, $schema_type);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
{
error_clear_last();
$safeResult = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}




















function cubrid_set_autocommit($conn_identifier, bool $mode): void
{
error_clear_last();
$safeResult = \cubrid_set_autocommit($conn_identifier, $mode);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}



















function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_value): void
{
error_clear_last();
$safeResult = \cubrid_set_db_parameter($conn_identifier, $param_type, $param_value);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_set_query_timeout($req_identifier, int $timeout): void
{
error_clear_last();
$safeResult = \cubrid_set_query_timeout($req_identifier, $timeout);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MailparseException;























function mailparse_msg_extract_part_file($mimemail, $filename, ?callable $callbackfunc = null): string
{
error_clear_last();
if ($callbackfunc !== null) {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc);
} else {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename);
}
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}











function mailparse_msg_free($mimemail): void
{
error_clear_last();
$safeResult = \mailparse_msg_free($mimemail);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}















function mailparse_msg_parse_file(string $filename)
{
error_clear_last();
$safeResult = \mailparse_msg_parse_file($filename);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}














function mailparse_msg_parse($mimemail, string $data): void
{
error_clear_last();
$safeResult = \mailparse_msg_parse($mimemail, $data);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}













function mailparse_stream_encode($sourcefp, $destfp, string $encoding): void
{
error_clear_last();
$safeResult = \mailparse_stream_encode($sourcefp, $destfp, $encoding);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\LdapException;














function ldap_8859_to_t61(string $value): string
{
error_clear_last();
$safeResult = \ldap_8859_to_t61($value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}





















function ldap_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
if ($password !== null) {
$safeResult = \ldap_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_bind($ldap, $dn);
} else {
$safeResult = \ldap_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_compare(\LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value, $controls);
} else {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value);
}
if ($safeResult === -1) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_control_paged_result_response($link, $result, ?string &$cookie = null, ?int &$estimated = null): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result_response($link, $result, $cookie, $estimated);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_control_paged_result($link, int $pagesize, bool $iscritical = false, string $cookie = ""): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result($link, $pagesize, $iscritical, $cookie);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}












function ldap_count_entries(\LDAP\Connection $ldap, \LDAP\Result $result): int
{
error_clear_last();
$safeResult = \ldap_count_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_delete(\LDAP\Connection $ldap, string $dn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_delete($ldap, $dn, $controls);
} else {
$safeResult = \ldap_delete($ldap, $dn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_dn2ufn(string $dn): string
{
error_clear_last();
$safeResult = \ldap_dn2ufn($dn);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_exop_passwd(\LDAP\Connection $ldap, string $user = "", string $old_password = "", string $new_password = "", ?array &$controls = null)
{
error_clear_last();
$safeResult = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}










function ldap_exop_whoami(\LDAP\Connection $ldap)
{
error_clear_last();
$safeResult = \ldap_exop_whoami($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}




















function ldap_exop(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, ?string &$response_data = null, ?string &$response_oid = null)
{
error_clear_last();
if ($response_oid !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid);
} elseif ($response_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data);
} elseif ($controls !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls);
} elseif ($request_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data);
} else {
$safeResult = \ldap_exop($ldap, $request_oid);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



















function ldap_explode_dn(string $dn, int $with_attrib): array
{
error_clear_last();
$safeResult = \ldap_explode_dn($dn, $with_attrib);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
















function ldap_first_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_first_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_first_entry(\LDAP\Connection $ldap, \LDAP\Result $result): \LDAP\ResultEntry
{
error_clear_last();
$safeResult = \ldap_first_entry($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}















function ldap_free_result(\LDAP\Result $result): void
{
error_clear_last();
$safeResult = \ldap_free_result($result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}






















function ldap_get_attributes(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): array
{
error_clear_last();
$safeResult = \ldap_get_attributes($ldap, $entry);
return $safeResult;
}











function ldap_get_dn(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_get_dn($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}























function ldap_get_entries(\LDAP\Connection $ldap, \LDAP\Result $result): array
{
error_clear_last();
$safeResult = \ldap_get_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































function ldap_get_option(\LDAP\Connection $ldap, int $option, &$value = null): void
{
error_clear_last();
$safeResult = \ldap_get_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















function ldap_get_values_len(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values_len($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



































function ldap_get_values(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}













function ldap_mod_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}














function ldap_mod_del(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_del($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_del($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}













function ldap_mod_replace(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}























































































function ldap_modify_batch(\LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
} else {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_next_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_next_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_parse_exop(\LDAP\Connection $ldap, \LDAP\Result $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
$safeResult = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















function ldap_parse_result(\LDAP\Connection $ldap, \LDAP\Result $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
$safeResult = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_rename(\LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
} else {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_sasl_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): void
{
error_clear_last();
if ($props !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
} elseif ($authz_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
} elseif ($authc_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
} elseif ($realm !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
} elseif ($mech !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech);
} elseif ($password !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn);
} else {
$safeResult = \ldap_sasl_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















































































































































































function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
$safeResult = \ldap_set_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}









function ldap_unbind(\LDAP\Connection $ldap): void
{
error_clear_last();
$safeResult = \ldap_unbind($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlrpcException;









function xmlrpc_set_type(&$value, string $type): void
{
error_clear_last();
$safeResult = \xmlrpc_set_type($value, $type);
if ($safeResult === false) {
throw XmlrpcException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SqlsrvException;















function sqlsrv_begin_transaction($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_begin_transaction($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}














function sqlsrv_cancel($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_cancel($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}







































function sqlsrv_client_info($conn): array
{
error_clear_last();
$safeResult = \sqlsrv_client_info($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}









function sqlsrv_close($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_close($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
















function sqlsrv_commit($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_commit($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}












































function sqlsrv_configure(string $setting, $value): void
{
error_clear_last();
$safeResult = \sqlsrv_configure($setting, $value);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}











function sqlsrv_execute($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_execute($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}





























function sqlsrv_fetch_array($stmt, ?int $fetchType = null, ?int $row = null, ?int $offset = null): ?array
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row);
} elseif ($fetchType !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType);
} else {
$safeResult = \sqlsrv_fetch_array($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}


































function sqlsrv_fetch_object($stmt, ?string $className = null, ?array $ctorParams = null, ?int $row = null, ?int $offset = null): ?object
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row);
} elseif ($ctorParams !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams);
} elseif ($className !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className);
} else {
$safeResult = \sqlsrv_fetch_object($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}




























function sqlsrv_fetch($stmt, ?int $row = null, ?int $offset = null): ?bool
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row);
} else {
$safeResult = \sqlsrv_fetch($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}















function sqlsrv_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_free_stmt($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}




















function sqlsrv_get_field($stmt, int $fieldIndex, ?int $getAsType = null)
{
error_clear_last();
if ($getAsType !== null) {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex, $getAsType);
} else {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_next_result($stmt): ?bool
{
error_clear_last();
$safeResult = \sqlsrv_next_result($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_num_fields($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_fields($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}



















function sqlsrv_num_rows($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_rows($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}























function sqlsrv_prepare($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_prepare($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}






















function sqlsrv_query($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_query($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}










function sqlsrv_rollback($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_rollback($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ShmopException;









function shmop_delete(\Shmop $shmop): void
{
error_clear_last();
$safeResult = \shmop_delete($shmop);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
}
















function shmop_read(\Shmop $shmop, int $offset, int $size): string
{
error_clear_last();
$safeResult = \shmop_read($shmop, $offset, $size);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DirException;









function chdir(string $directory): void
{
error_clear_last();
$safeResult = \chdir($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}


















function chroot(string $directory): void
{
error_clear_last();
$safeResult = \chroot($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}













function dir(string $directory, $context = null): \Directory
{
error_clear_last();
if ($context !== null) {
$safeResult = \dir($directory, $context);
} else {
$safeResult = \dir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function getcwd(): string
{
error_clear_last();
$safeResult = \getcwd();
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \opendir($directory, $context);
} else {
$safeResult = \opendir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}





















function scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \scandir($directory, $sorting_order, $context);
} else {
$safeResult = \scandir($directory, $sorting_order);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GettextException;













function bindtextdomain(string $domain, ?string $directory = null): string
{
error_clear_last();
if ($directory !== null) {
$safeResult = \bindtextdomain($domain, $directory);
} else {
$safeResult = \bindtextdomain($domain);
}
if ($safeResult === false) {
throw GettextException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StreamException;

















function stream_context_set_options($context, array $options): void
{
error_clear_last();
$safeResult = \stream_context_set_options($context, $options);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}











function stream_context_set_params($context, array $params): void
{
error_clear_last();
$safeResult = \stream_context_set_params($context, $params);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int
{
error_clear_last();
if ($offset !== 0) {
$safeResult = \stream_copy_to_stream($from, $to, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_copy_to_stream($from, $to, $length);
} else {
$safeResult = \stream_copy_to_stream($from, $to);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

































function stream_filter_append($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_append($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}


































function stream_filter_prepend($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_prepend($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
$safeResult = \stream_filter_register($filter_name, $class);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}













function stream_filter_remove($stream_filter): void
{
error_clear_last();
$safeResult = \stream_filter_remove($stream_filter);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_get_contents($stream, ?int $length = null, int $offset = -1): string
{
error_clear_last();
if ($offset !== -1) {
$safeResult = \stream_get_contents($stream, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_get_contents($stream, $length);
} else {
$safeResult = \stream_get_contents($stream);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_get_line($stream, int $length, string $ending = ""): string
{
error_clear_last();
$safeResult = \stream_get_line($stream, $length, $ending);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}










function stream_isatty($stream): void
{
error_clear_last();
$safeResult = \stream_isatty($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_resolve_include_path(string $filename): string
{
error_clear_last();
$safeResult = \stream_resolve_include_path($filename);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
$safeResult = \stream_set_blocking($stream, $enable);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}

















function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
{
error_clear_last();
$safeResult = \stream_set_timeout($stream, $seconds, $microseconds);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}



















function stream_socket_accept($socket, ?float $timeout = null, ?string &$peer_name = null)
{
error_clear_last();
if ($peer_name !== null) {
$safeResult = \stream_socket_accept($socket, $timeout, $peer_name);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_accept($socket, $timeout);
} else {
$safeResult = \stream_socket_accept($socket);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















































function stream_socket_client(string $address, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout);
} else {
$safeResult = \stream_socket_client($address, $error_code, $error_message);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












function stream_socket_get_name($socket, bool $remote): string
{
error_clear_last();
$safeResult = \stream_socket_get_name($socket, $remote);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_socket_pair(int $domain, int $type, int $protocol): array
{
error_clear_last();
$safeResult = \stream_socket_pair($domain, $type, $protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}






































function stream_socket_recvfrom($socket, int $length, int $flags = 0, ?string &$address = null): string
{
error_clear_last();
$safeResult = \stream_socket_recvfrom($socket, $length, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}































function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int
{
error_clear_last();
$safeResult = \stream_socket_sendto($socket, $data, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












































function stream_socket_server(string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags, $context);
} else {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}















function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
$safeResult = \stream_socket_shutdown($stream, $mode);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_supports_lock($stream): void
{
error_clear_last();
$safeResult = \stream_supports_lock($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
















function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
$safeResult = \stream_wrapper_register($protocol, $class, $flags);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_wrapper_restore(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_restore($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}












function stream_wrapper_unregister(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_unregister($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ComException;











function com_create_guid(): string
{
error_clear_last();
$safeResult = \com_create_guid();
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
























function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
if ($sink_interface !== null) {
$safeResult = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
$safeResult = \com_event_sink($variant, $sink_object);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}






















































function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
$safeResult = \com_load_typelib($typelib, $case_insensitive);
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}

















function com_print_typeinfo(object $variant, ?string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
if ($display_sink !== false) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
} elseif ($dispatch_interface !== null) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface);
} else {
$safeResult = \com_print_typeinfo($variant);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}












function variant_date_to_timestamp(object $variant): int
{
error_clear_last();
$safeResult = \variant_date_to_timestamp($variant);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}












function variant_round($value, int $decimals)
{
error_clear_last();
$safeResult = \variant_round($value, $decimals);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FtpException;












function ftp_alloc(\FTP\Connection $ftp, int $size, ?string &$response = null): void
{
error_clear_last();
$safeResult = \ftp_alloc($ftp, $size, $response);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_append(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
$safeResult = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}









function ftp_cdup(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_cdup($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_chdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_chdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}













function ftp_chmod(\FTP\Connection $ftp, int $permissions, string $filename): int
{
error_clear_last();
$safeResult = \ftp_chmod($ftp, $permissions, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_close(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_close($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}


















function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_delete(\FTP\Connection $ftp, string $filename): void
{
error_clear_last();
$safeResult = \ftp_delete($ftp, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fget(\FTP\Connection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fput(\FTP\Connection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_login(\FTP\Connection $ftp, string $username, string $password): void
{
error_clear_last();
$safeResult = \ftp_login($ftp, $username, $password);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_mkdir(\FTP\Connection $ftp, string $directory): string
{
error_clear_last();
$safeResult = \ftp_mkdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_mlsd(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_mlsd($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}





















function ftp_nb_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}




















function ftp_nb_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}














function ftp_nlist(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_nlist($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
















function ftp_pasv(\FTP\Connection $ftp, bool $enable): void
{
error_clear_last();
$safeResult = \ftp_pasv($ftp, $enable);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}














function ftp_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_pwd(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_pwd($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}













function ftp_raw(\FTP\Connection $ftp, string $command): array
{
error_clear_last();
$safeResult = \ftp_raw($ftp, $command);
if ($safeResult === null) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}












function ftp_rename(\FTP\Connection $ftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ftp_rename($ftp, $from, $to);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_rmdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_rmdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}
















function ftp_site(\FTP\Connection $ftp, string $command): void
{
error_clear_last();
$safeResult = \ftp_site($ftp, $command);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_size(\FTP\Connection $ftp, string $filename): int
{
error_clear_last();
$safeResult = \ftp_size($ftp, $filename);
if ($safeResult === -1) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}























function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_ssl_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_systype(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_systype($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;


return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
RenameFunctionRector::class,
[ 'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
'apcu_cas' => 'Safe\apcu_cas',
'apcu_dec' => 'Safe\apcu_dec',
'apcu_fetch' => 'Safe\apcu_fetch',
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'base64_decode' => 'Safe\base64_decode',
'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzopen' => 'Safe\bzopen',
'bzread' => 'Safe\bzread',
'bzwrite' => 'Safe\bzwrite',
'chdir' => 'Safe\chdir',
'chgrp' => 'Safe\chgrp',
'chmod' => 'Safe\chmod',
'chown' => 'Safe\chown',
'chroot' => 'Safe\chroot',
'class_alias' => 'Safe\class_alias',
'class_implements' => 'Safe\class_implements',
'class_parents' => 'Safe\class_parents',
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
'copy' => 'Safe\copy',
'cubrid_bind' => 'Safe\cubrid_bind',
'cubrid_column_names' => 'Safe\cubrid_column_names',
'cubrid_column_types' => 'Safe\cubrid_column_types',
'cubrid_col_size' => 'Safe\cubrid_col_size',
'cubrid_commit' => 'Safe\cubrid_commit',
'cubrid_connect' => 'Safe\cubrid_connect',
'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
'cubrid_current_oid' => 'Safe\cubrid_current_oid',
'cubrid_disconnect' => 'Safe\cubrid_disconnect',
'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
'cubrid_lob_close' => 'Safe\cubrid_lob_close',
'cubrid_lob_export' => 'Safe\cubrid_lob_export',
'cubrid_lob_get' => 'Safe\cubrid_lob_get',
'cubrid_lob_send' => 'Safe\cubrid_lob_send',
'cubrid_lob_size' => 'Safe\cubrid_lob_size',
'cubrid_lock_read' => 'Safe\cubrid_lock_read',
'cubrid_lock_write' => 'Safe\cubrid_lock_write',
'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
'cubrid_next_result' => 'Safe\cubrid_next_result',
'cubrid_pconnect' => 'Safe\cubrid_pconnect',
'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
'cubrid_prepare' => 'Safe\cubrid_prepare',
'cubrid_put' => 'Safe\cubrid_put',
'cubrid_rollback' => 'Safe\cubrid_rollback',
'cubrid_schema' => 'Safe\cubrid_schema',
'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
'cubrid_seq_put' => 'Safe\cubrid_seq_put',
'cubrid_set_add' => 'Safe\cubrid_set_add',
'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
'cubrid_set_drop' => 'Safe\cubrid_set_drop',
'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_setopt' => 'Safe\curl_share_setopt',
'curl_unescape' => 'Safe\curl_unescape',
'curl_upkeep' => 'Safe\curl_upkeep',
'date_create' => 'Safe\date_create',
'date_create_immutable' => 'Safe\date_create_immutable',
'date_parse_from_format' => 'Safe\date_parse_from_format',
'date_sunrise' => 'Safe\date_sunrise',
'date_sunset' => 'Safe\date_sunset',
'db2_autocommit' => 'Safe\db2_autocommit',
'db2_bind_param' => 'Safe\db2_bind_param',
'db2_client_info' => 'Safe\db2_client_info',
'db2_close' => 'Safe\db2_close',
'db2_commit' => 'Safe\db2_commit',
'db2_execute' => 'Safe\db2_execute',
'db2_free_result' => 'Safe\db2_free_result',
'db2_free_stmt' => 'Safe\db2_free_stmt',
'db2_get_option' => 'Safe\db2_get_option',
'db2_num_rows' => 'Safe\db2_num_rows',
'db2_pclose' => 'Safe\db2_pclose',
'db2_rollback' => 'Safe\db2_rollback',
'db2_server_info' => 'Safe\db2_server_info',
'db2_set_option' => 'Safe\db2_set_option',
'define' => 'Safe\define',
'deflate_add' => 'Safe\deflate_add',
'deflate_init' => 'Safe\deflate_init',
'dir' => 'Safe\dir',
'disk_free_space' => 'Safe\disk_free_space',
'disk_total_space' => 'Safe\disk_total_space',
'dl' => 'Safe\dl',
'dns_get_record' => 'Safe\dns_get_record',
'eio_busy' => 'Safe\eio_busy',
'eio_chmod' => 'Safe\eio_chmod',
'eio_chown' => 'Safe\eio_chown',
'eio_close' => 'Safe\eio_close',
'eio_custom' => 'Safe\eio_custom',
'eio_dup2' => 'Safe\eio_dup2',
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
'eio_fsync' => 'Safe\eio_fsync',
'eio_ftruncate' => 'Safe\eio_ftruncate',
'eio_futime' => 'Safe\eio_futime',
'eio_grp' => 'Safe\eio_grp',
'eio_lstat' => 'Safe\eio_lstat',
'eio_mkdir' => 'Safe\eio_mkdir',
'eio_mknod' => 'Safe\eio_mknod',
'eio_nop' => 'Safe\eio_nop',
'eio_readahead' => 'Safe\eio_readahead',
'eio_readdir' => 'Safe\eio_readdir',
'eio_readlink' => 'Safe\eio_readlink',
'eio_rename' => 'Safe\eio_rename',
'eio_rmdir' => 'Safe\eio_rmdir',
'eio_seek' => 'Safe\eio_seek',
'eio_sendfile' => 'Safe\eio_sendfile',
'eio_stat' => 'Safe\eio_stat',
'eio_statvfs' => 'Safe\eio_statvfs',
'eio_symlink' => 'Safe\eio_symlink',
'eio_sync' => 'Safe\eio_sync',
'eio_syncfs' => 'Safe\eio_syncfs',
'eio_sync_file_range' => 'Safe\eio_sync_file_range',
'eio_truncate' => 'Safe\eio_truncate',
'eio_unlink' => 'Safe\eio_unlink',
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'filetype' => 'Safe\filetype',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
'filter_input_array' => 'Safe\filter_input_array',
'filter_var_array' => 'Safe\filter_var_array',
'finfo_close' => 'Safe\finfo_close',
'finfo_open' => 'Safe\finfo_open',
'flock' => 'Safe\flock',
'fopen' => 'Safe\fopen',
'fpm_get_status' => 'Safe\fpm_get_status',
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
'fstat' => 'Safe\fstat',
'fsync' => 'Safe\fsync',
'ftell' => 'Safe\ftell',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
'ftp_chdir' => 'Safe\ftp_chdir',
'ftp_chmod' => 'Safe\ftp_chmod',
'ftp_close' => 'Safe\ftp_close',
'ftp_connect' => 'Safe\ftp_connect',
'ftp_delete' => 'Safe\ftp_delete',
'ftp_fget' => 'Safe\ftp_fget',
'ftp_fput' => 'Safe\ftp_fput',
'ftp_get' => 'Safe\ftp_get',
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
'ftp_nb_get' => 'Safe\ftp_nb_get',
'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
'ftp_raw' => 'Safe\ftp_raw',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
'ftp_size' => 'Safe\ftp_size',
'ftp_ssl_connect' => 'Safe\ftp_ssl_connect',
'ftp_systype' => 'Safe\ftp_systype',
'ftruncate' => 'Safe\ftruncate',
'fwrite' => 'Safe\fwrite',
'getcwd' => 'Safe\getcwd',
'gethostname' => 'Safe\gethostname',
'getimagesize' => 'Safe\getimagesize',
'getlastmod' => 'Safe\getlastmod',
'getmygid' => 'Safe\getmygid',
'getmyinode' => 'Safe\getmyinode',
'getmypid' => 'Safe\getmypid',
'getmyuid' => 'Safe\getmyuid',
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
'getrusage' => 'Safe\getrusage',
'getservbyport' => 'Safe\getservbyport',
'get_cfg_var' => 'Safe\get_cfg_var',
'get_headers' => 'Safe\get_headers',
'get_include_path' => 'Safe\get_include_path',
'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
'gnupg_deletekey' => 'Safe\gnupg_deletekey',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
'gzcompress' => 'Safe\gzcompress',
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzinflate' => 'Safe\gzinflate',
'gzopen' => 'Safe\gzopen',
'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gztell' => 'Safe\gztell',
'gzuncompress' => 'Safe\gzuncompress',
'gzwrite' => 'Safe\gzwrite',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
'ibase_blob_create' => 'Safe\ibase_blob_create',
'ibase_blob_get' => 'Safe\ibase_blob_get',
'ibase_close' => 'Safe\ibase_close',
'ibase_commit' => 'Safe\ibase_commit',
'ibase_commit_ret' => 'Safe\ibase_commit_ret',
'ibase_connect' => 'Safe\ibase_connect',
'ibase_delete_user' => 'Safe\ibase_delete_user',
'ibase_drop_db' => 'Safe\ibase_drop_db',
'ibase_free_event_handler' => 'Safe\ibase_free_event_handler',
'ibase_free_query' => 'Safe\ibase_free_query',
'ibase_free_result' => 'Safe\ibase_free_result',
'ibase_maintain_db' => 'Safe\ibase_maintain_db',
'ibase_modify_user' => 'Safe\ibase_modify_user',
'ibase_name_result' => 'Safe\ibase_name_result',
'ibase_pconnect' => 'Safe\ibase_pconnect',
'ibase_restore' => 'Safe\ibase_restore',
'ibase_rollback' => 'Safe\ibase_rollback',
'ibase_rollback_ret' => 'Safe\ibase_rollback_ret',
'ibase_service_attach' => 'Safe\ibase_service_attach',
'ibase_service_detach' => 'Safe\ibase_service_detach',
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_mime_decode' => 'Safe\iconv_mime_decode',
'iconv_mime_encode' => 'Safe\iconv_mime_encode',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
'iconv_strlen' => 'Safe\iconv_strlen',
'idate' => 'Safe\idate',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
'imageaffinematrixget' => 'Safe\imageaffinematrixget',
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
'imagecolorset' => 'Safe\imagecolorset',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
'imagecopymergegray' => 'Safe\imagecopymergegray',
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
'imagecreatefromgd2part' => 'Safe\imagecreatefromgd2part',
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
'imagecreatefromstring' => 'Safe\imagecreatefromstring',
'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
'imagecreatefromxpm' => 'Safe\imagecreatefromxpm',
'imagecreatetruecolor' => 'Safe\imagecreatetruecolor',
'imagecrop' => 'Safe\imagecrop',
'imagecropauto' => 'Safe\imagecropauto',
'imagedashedline' => 'Safe\imagedashedline',
'imagedestroy' => 'Safe\imagedestroy',
'imageellipse' => 'Safe\imageellipse',
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
'imageftbbox' => 'Safe\imageftbbox',
'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
'imagegif' => 'Safe\imagegif',
'imagegrabscreen' => 'Safe\imagegrabscreen',
'imagegrabwindow' => 'Safe\imagegrabwindow',
'imagejpeg' => 'Safe\imagejpeg',
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
'imagepng' => 'Safe\imagepng',
'imagerectangle' => 'Safe\imagerectangle',
'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
'imagesetbrush' => 'Safe\imagesetbrush',
'imagesetclip' => 'Safe\imagesetclip',
'imagesetinterpolation' => 'Safe\imagesetinterpolation',
'imagesetpixel' => 'Safe\imagesetpixel',
'imagesetstyle' => 'Safe\imagesetstyle',
'imagesetthickness' => 'Safe\imagesetthickness',
'imagesettile' => 'Safe\imagesettile',
'imagestring' => 'Safe\imagestring',
'imagestringup' => 'Safe\imagestringup',
'imagetruecolortopalette' => 'Safe\imagetruecolortopalette',
'imagettfbbox' => 'Safe\imagettfbbox',
'imagettftext' => 'Safe\imagettftext',
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
'image_type_to_extension' => 'Safe\image_type_to_extension',
'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
'imap_base64' => 'Safe\imap_base64',
'imap_binary' => 'Safe\imap_binary',
'imap_body' => 'Safe\imap_body',
'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
'imap_fetchbody' => 'Safe\imap_fetchbody',
'imap_fetchheader' => 'Safe\imap_fetchheader',
'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_getacl' => 'Safe\imap_getacl',
'imap_getmailboxes' => 'Safe\imap_getmailboxes',
'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
'imap_headers' => 'Safe\imap_headers',
'imap_listscan' => 'Safe\imap_listscan',
'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
'imap_unsubscribe' => 'Safe\imap_unsubscribe',
'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7',
'inet_ntop' => 'Safe\inet_ntop',
'inet_pton' => 'Safe\inet_pton',
'inflate_add' => 'Safe\inflate_add',
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_init' => 'Safe\inflate_init',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_add_watch' => 'Safe\inotify_add_watch',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
'ldap_bind' => 'Safe\ldap_bind',
'ldap_compare' => 'Safe\ldap_compare',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
'ldap_explode_dn' => 'Safe\ldap_explode_dn',
'ldap_first_attribute' => 'Safe\ldap_first_attribute',
'ldap_first_entry' => 'Safe\ldap_first_entry',
'ldap_free_result' => 'Safe\ldap_free_result',
'ldap_get_dn' => 'Safe\ldap_get_dn',
'ldap_get_entries' => 'Safe\ldap_get_entries',
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
'ldap_mod_del' => 'Safe\ldap_mod_del',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
'ldap_rename' => 'Safe\ldap_rename',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
'mailparse_msg_free' => 'Safe\mailparse_msg_free',
'mailparse_msg_parse' => 'Safe\mailparse_msg_parse',
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
'mb_ereg_replace' => 'Safe\mb_ereg_replace',
'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback',
'mb_ereg_search_getregs' => 'Safe\mb_ereg_search_getregs',
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
'mb_parse_str' => 'Safe\mb_parse_str',
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
'md5_file' => 'Safe\md5_file',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
'mysql_data_seek' => 'Safe\mysql_data_seek',
'mysql_db_name' => 'Safe\mysql_db_name',
'mysql_db_query' => 'Safe\mysql_db_query',
'mysql_drop_db' => 'Safe\mysql_drop_db',
'mysql_fetch_lengths' => 'Safe\mysql_fetch_lengths',
'mysql_field_flags' => 'Safe\mysql_field_flags',
'mysql_field_len' => 'Safe\mysql_field_len',
'mysql_field_name' => 'Safe\mysql_field_name',
'mysql_field_seek' => 'Safe\mysql_field_seek',
'mysql_free_result' => 'Safe\mysql_free_result',
'mysql_get_host_info' => 'Safe\mysql_get_host_info',
'mysql_get_proto_info' => 'Safe\mysql_get_proto_info',
'mysql_get_server_info' => 'Safe\mysql_get_server_info',
'mysql_info' => 'Safe\mysql_info',
'mysql_list_dbs' => 'Safe\mysql_list_dbs',
'mysql_list_fields' => 'Safe\mysql_list_fields',
'mysql_list_processes' => 'Safe\mysql_list_processes',
'mysql_list_tables' => 'Safe\mysql_list_tables',
'mysql_num_fields' => 'Safe\mysql_num_fields',
'mysql_num_rows' => 'Safe\mysql_num_rows',
'mysql_query' => 'Safe\mysql_query',
'mysql_real_escape_string' => 'Safe\mysql_real_escape_string',
'mysql_result' => 'Safe\mysql_result',
'mysql_select_db' => 'Safe\mysql_select_db',
'mysql_set_charset' => 'Safe\mysql_set_charset',
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
'net_get_interfaces' => 'Safe\net_get_interfaces',
'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
'ob_flush' => 'Safe\ob_flush',
'ob_get_clean' => 'Safe\ob_get_clean',
'ob_get_flush' => 'Safe\ob_get_flush',
'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
'oci_field_size' => 'Safe\oci_field_size',
'oci_field_type' => 'Safe\oci_field_type',
'oci_field_type_raw' => 'Safe\oci_field_type_raw',
'oci_free_descriptor' => 'Safe\oci_free_descriptor',
'oci_free_statement' => 'Safe\oci_free_statement',
'oci_new_collection' => 'Safe\oci_new_collection',
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
'oci_set_action' => 'Safe\oci_set_action',
'oci_set_call_timeout' => 'Safe\oci_set_call_timeout',
'oci_set_client_identifier' => 'Safe\oci_set_client_identifier',
'oci_set_client_info' => 'Safe\oci_set_client_info',
'oci_set_db_operation' => 'Safe\oci_set_db_operation',
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
'oci_set_prefetch_lob' => 'Safe\oci_set_prefetch_lob',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
'odbc_commit' => 'Safe\odbc_commit',
'odbc_connect' => 'Safe\odbc_connect',
'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
'odbc_fetch_into' => 'Safe\odbc_fetch_into',
'odbc_field_len' => 'Safe\odbc_field_len',
'odbc_field_name' => 'Safe\odbc_field_name',
'odbc_field_num' => 'Safe\odbc_field_num',
'odbc_field_scale' => 'Safe\odbc_field_scale',
'odbc_field_type' => 'Safe\odbc_field_type',
'odbc_num_fields' => 'Safe\odbc_num_fields',
'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
'odbc_setoption' => 'Safe\odbc_setoption',
'odbc_tables' => 'Safe\odbc_tables',
'opcache_compile_file' => 'Safe\opcache_compile_file',
'opcache_get_status' => 'Safe\opcache_get_status',
'opendir' => 'Safe\opendir',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
'openssl_cipher_key_length' => 'Safe\openssl_cipher_key_length',
'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
'openssl_cms_read' => 'Safe\openssl_cms_read',
'openssl_cms_sign' => 'Safe\openssl_cms_sign',
'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
'openssl_decrypt' => 'Safe\openssl_decrypt',
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt' => 'Safe\openssl_pkcs7_encrypt',
'openssl_pkcs7_read' => 'Safe\openssl_pkcs7_read',
'openssl_pkcs7_sign' => 'Safe\openssl_pkcs7_sign',
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_details' => 'Safe\openssl_pkey_get_details',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
'openssl_pkey_get_public' => 'Safe\openssl_pkey_get_public',
'openssl_pkey_new' => 'Safe\openssl_pkey_new',
'openssl_private_decrypt' => 'Safe\openssl_private_decrypt',
'openssl_private_encrypt' => 'Safe\openssl_private_encrypt',
'openssl_public_decrypt' => 'Safe\openssl_public_decrypt',
'openssl_public_encrypt' => 'Safe\openssl_public_encrypt',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
'openssl_spki_export' => 'Safe\openssl_spki_export',
'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
'openssl_spki_new' => 'Safe\openssl_spki_new',
'openssl_spki_verify' => 'Safe\openssl_spki_verify',
'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_checkpurpose' => 'Safe\openssl_x509_checkpurpose',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
'openssl_x509_read' => 'Safe\openssl_x509_read',
'output_add_rewrite_var' => 'Safe\output_add_rewrite_var',
'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars',
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
'passthru' => 'Safe\passthru',
'pclose' => 'Safe\pclose',
'pcntl_getcpuaffinity' => 'Safe\pcntl_getcpuaffinity',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setcpuaffinity' => 'Safe\pcntl_setcpuaffinity',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
'pg_field_num' => 'Safe\pg_field_num',
'pg_field_table' => 'Safe\pg_field_table',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
'pg_query_params' => 'Safe\pg_query_params',
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
'pg_set_chunked_rows_size' => 'Safe\pg_set_chunked_rows_size',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
'pg_update' => 'Safe\pg_update',
'php_sapi_name' => 'Safe\php_sapi_name',
'popen' => 'Safe\popen',
'posix_access' => 'Safe\posix_access',
'posix_eaccess' => 'Safe\posix_eaccess',
'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
'posix_getgroups' => 'Safe\posix_getgroups',
'posix_getlogin' => 'Safe\posix_getlogin',
'posix_getpgid' => 'Safe\posix_getpgid',
'posix_getpwuid' => 'Safe\posix_getpwuid',
'posix_getrlimit' => 'Safe\posix_getrlimit',
'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
'posix_mknod' => 'Safe\posix_mknod',
'posix_setegid' => 'Safe\posix_setegid',
'posix_seteuid' => 'Safe\posix_seteuid',
'posix_setgid' => 'Safe\posix_setgid',
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setsid' => 'Safe\posix_setsid',
'posix_setuid' => 'Safe\posix_setuid',
'posix_times' => 'Safe\posix_times',
'posix_uname' => 'Safe\posix_uname',
'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_replace_callback' => 'Safe\preg_replace_callback',
'preg_replace_callback_array' => 'Safe\preg_replace_callback_array',
'preg_split' => 'Safe\preg_split',
'proc_close' => 'Safe\proc_close',
'proc_nice' => 'Safe\proc_nice',
'proc_open' => 'Safe\proc_open',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
'pspell_clear_session' => 'Safe\pspell_clear_session',
'pspell_config_data_dir' => 'Safe\pspell_config_data_dir',
'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir',
'pspell_config_ignore' => 'Safe\pspell_config_ignore',
'pspell_config_mode' => 'Safe\pspell_config_mode',
'pspell_config_personal' => 'Safe\pspell_config_personal',
'pspell_config_repl' => 'Safe\pspell_config_repl',
'pspell_config_runtogether' => 'Safe\pspell_config_runtogether',
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
'ps_add_locallink' => 'Safe\ps_add_locallink',
'ps_add_note' => 'Safe\ps_add_note',
'ps_add_pdflink' => 'Safe\ps_add_pdflink',
'ps_add_weblink' => 'Safe\ps_add_weblink',
'ps_arc' => 'Safe\ps_arc',
'ps_arcn' => 'Safe\ps_arcn',
'ps_begin_page' => 'Safe\ps_begin_page',
'ps_begin_pattern' => 'Safe\ps_begin_pattern',
'ps_begin_template' => 'Safe\ps_begin_template',
'ps_circle' => 'Safe\ps_circle',
'ps_clip' => 'Safe\ps_clip',
'ps_close' => 'Safe\ps_close',
'ps_closepath' => 'Safe\ps_closepath',
'ps_closepath_stroke' => 'Safe\ps_closepath_stroke',
'ps_close_image' => 'Safe\ps_close_image',
'ps_continue_text' => 'Safe\ps_continue_text',
'ps_curveto' => 'Safe\ps_curveto',
'ps_delete' => 'Safe\ps_delete',
'ps_end_page' => 'Safe\ps_end_page',
'ps_end_pattern' => 'Safe\ps_end_pattern',
'ps_end_template' => 'Safe\ps_end_template',
'ps_fill' => 'Safe\ps_fill',
'ps_fill_stroke' => 'Safe\ps_fill_stroke',
'ps_get_parameter' => 'Safe\ps_get_parameter',
'ps_hyphenate' => 'Safe\ps_hyphenate',
'ps_include_file' => 'Safe\ps_include_file',
'ps_lineto' => 'Safe\ps_lineto',
'ps_moveto' => 'Safe\ps_moveto',
'ps_new' => 'Safe\ps_new',
'ps_open_file' => 'Safe\ps_open_file',
'ps_place_image' => 'Safe\ps_place_image',
'ps_rect' => 'Safe\ps_rect',
'ps_restore' => 'Safe\ps_restore',
'ps_rotate' => 'Safe\ps_rotate',
'ps_save' => 'Safe\ps_save',
'ps_scale' => 'Safe\ps_scale',
'ps_setcolor' => 'Safe\ps_setcolor',
'ps_setdash' => 'Safe\ps_setdash',
'ps_setflat' => 'Safe\ps_setflat',
'ps_setfont' => 'Safe\ps_setfont',
'ps_setgray' => 'Safe\ps_setgray',
'ps_setlinecap' => 'Safe\ps_setlinecap',
'ps_setlinejoin' => 'Safe\ps_setlinejoin',
'ps_setlinewidth' => 'Safe\ps_setlinewidth',
'ps_setmiterlimit' => 'Safe\ps_setmiterlimit',
'ps_setoverprintmode' => 'Safe\ps_setoverprintmode',
'ps_setpolydash' => 'Safe\ps_setpolydash',
'ps_set_border_color' => 'Safe\ps_set_border_color',
'ps_set_border_dash' => 'Safe\ps_set_border_dash',
'ps_set_border_style' => 'Safe\ps_set_border_style',
'ps_set_info' => 'Safe\ps_set_info',
'ps_set_parameter' => 'Safe\ps_set_parameter',
'ps_set_text_pos' => 'Safe\ps_set_text_pos',
'ps_set_value' => 'Safe\ps_set_value',
'ps_shading' => 'Safe\ps_shading',
'ps_shading_pattern' => 'Safe\ps_shading_pattern',
'ps_shfill' => 'Safe\ps_shfill',
'ps_show' => 'Safe\ps_show',
'ps_show2' => 'Safe\ps_show2',
'ps_show_xy' => 'Safe\ps_show_xy',
'ps_show_xy2' => 'Safe\ps_show_xy2',
'ps_stroke' => 'Safe\ps_stroke',
'ps_symbol' => 'Safe\ps_symbol',
'ps_translate' => 'Safe\ps_translate',
'putenv' => 'Safe\putenv',
'readfile' => 'Safe\readfile',
'readgzfile' => 'Safe\readgzfile',
'readline_completion_function' => 'Safe\readline_completion_function',
'readline_read_history' => 'Safe\readline_read_history',
'readline_write_history' => 'Safe\readline_write_history',
'readlink' => 'Safe\readlink',
'realpath' => 'Safe\realpath',
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
'rmdir' => 'Safe\rmdir',
'rnp_decrypt' => 'Safe\rnp_decrypt',
'rnp_dump_packets' => 'Safe\rnp_dump_packets',
'rnp_dump_packets_to_json' => 'Safe\rnp_dump_packets_to_json',
'rnp_ffi_create' => 'Safe\rnp_ffi_create',
'rnp_ffi_set_pass_provider' => 'Safe\rnp_ffi_set_pass_provider',
'rnp_import_keys' => 'Safe\rnp_import_keys',
'rnp_import_signatures' => 'Safe\rnp_import_signatures',
'rnp_key_export' => 'Safe\rnp_key_export',
'rnp_key_export_autocrypt' => 'Safe\rnp_key_export_autocrypt',
'rnp_key_export_revocation' => 'Safe\rnp_key_export_revocation',
'rnp_key_get_info' => 'Safe\rnp_key_get_info',
'rnp_key_remove' => 'Safe\rnp_key_remove',
'rnp_key_revoke' => 'Safe\rnp_key_revoke',
'rnp_list_keys' => 'Safe\rnp_list_keys',
'rnp_load_keys' => 'Safe\rnp_load_keys',
'rnp_load_keys_from_path' => 'Safe\rnp_load_keys_from_path',
'rnp_locate_key' => 'Safe\rnp_locate_key',
'rnp_op_encrypt' => 'Safe\rnp_op_encrypt',
'rnp_op_generate_key' => 'Safe\rnp_op_generate_key',
'rnp_op_sign' => 'Safe\rnp_op_sign',
'rnp_op_sign_cleartext' => 'Safe\rnp_op_sign_cleartext',
'rnp_op_sign_detached' => 'Safe\rnp_op_sign_detached',
'rnp_op_verify' => 'Safe\rnp_op_verify',
'rnp_op_verify_detached' => 'Safe\rnp_op_verify_detached',
'rnp_save_keys' => 'Safe\rnp_save_keys',
'rnp_save_keys_to_path' => 'Safe\rnp_save_keys_to_path',
'rnp_supported_features' => 'Safe\rnp_supported_features',
'rpmaddtag' => 'Safe\rpmaddtag',
'rpmdefine' => 'Safe\rpmdefine',
'rrd_create' => 'Safe\rrd_create',
'rrd_first' => 'Safe\rrd_first',
'rrd_graph' => 'Safe\rrd_graph',
'rrd_info' => 'Safe\rrd_info',
'rrd_lastupdate' => 'Safe\rrd_lastupdate',
'rrd_restore' => 'Safe\rrd_restore',
'rrd_tune' => 'Safe\rrd_tune',
'rrd_update' => 'Safe\rrd_update',
'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
'sem_get' => 'Safe\sem_get',
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
'session_encode' => 'Safe\session_encode',
'session_id' => 'Safe\session_id',
'session_module_name' => 'Safe\session_module_name',
'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shm_attach' => 'Safe\shm_attach',
'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
'simplexml_import_dom' => 'Safe\simplexml_import_dom',
'simplexml_load_file' => 'Safe\simplexml_load_file',
'simplexml_load_string' => 'Safe\simplexml_load_string',
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_atmark' => 'Safe\socket_atmark',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
'socket_create_listen' => 'Safe\socket_create_listen',
'socket_create_pair' => 'Safe\socket_create_pair',
'socket_export_stream' => 'Safe\socket_export_stream',
'socket_getpeername' => 'Safe\socket_getpeername',
'socket_getsockname' => 'Safe\socket_getsockname',
'socket_get_option' => 'Safe\socket_get_option',
'socket_import_stream' => 'Safe\socket_import_stream',
'socket_listen' => 'Safe\socket_listen',
'socket_read' => 'Safe\socket_read',
'socket_send' => 'Safe\socket_send',
'socket_sendmsg' => 'Safe\socket_sendmsg',
'socket_sendto' => 'Safe\socket_sendto',
'socket_set_block' => 'Safe\socket_set_block',
'socket_set_nonblock' => 'Safe\socket_set_nonblock',
'socket_set_option' => 'Safe\socket_set_option',
'socket_shutdown' => 'Safe\socket_shutdown',
'socket_write' => 'Safe\socket_write',
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
'sodium_crypto_aead_aegis128l_decrypt' => 'Safe\sodium_crypto_aead_aegis128l_decrypt',
'sodium_crypto_aead_aegis256_decrypt' => 'Safe\sodium_crypto_aead_aegis256_decrypt',
'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic' => 'Safe\sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version' => 'Safe\solr_get_version',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
'sqlsrv_close' => 'Safe\sqlsrv_close',
'sqlsrv_commit' => 'Safe\sqlsrv_commit',
'sqlsrv_configure' => 'Safe\sqlsrv_configure',
'sqlsrv_execute' => 'Safe\sqlsrv_execute',
'sqlsrv_fetch' => 'Safe\sqlsrv_fetch',
'sqlsrv_fetch_array' => 'Safe\sqlsrv_fetch_array',
'sqlsrv_fetch_object' => 'Safe\sqlsrv_fetch_object',
'sqlsrv_free_stmt' => 'Safe\sqlsrv_free_stmt',
'sqlsrv_get_field' => 'Safe\sqlsrv_get_field',
'sqlsrv_next_result' => 'Safe\sqlsrv_next_result',
'sqlsrv_num_fields' => 'Safe\sqlsrv_num_fields',
'sqlsrv_num_rows' => 'Safe\sqlsrv_num_rows',
'sqlsrv_prepare' => 'Safe\sqlsrv_prepare',
'sqlsrv_query' => 'Safe\sqlsrv_query',
'sqlsrv_rollback' => 'Safe\sqlsrv_rollback',
'ssdeep_fuzzy_compare' => 'Safe\ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash' => 'Safe\ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename' => 'Safe\ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent' => 'Safe\ssh2_auth_agent',
'ssh2_auth_hostbased_file' => 'Safe\ssh2_auth_hostbased_file',
'ssh2_auth_password' => 'Safe\ssh2_auth_password',
'ssh2_auth_pubkey_file' => 'Safe\ssh2_auth_pubkey_file',
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
'ssh2_sftp_rename' => 'Safe\ssh2_sftp_rename',
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_options' => 'Safe\stream_context_set_options',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
'stream_filter_prepend' => 'Safe\stream_filter_prepend',
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
'stream_socket_get_name' => 'Safe\stream_socket_get_name',
'stream_socket_pair' => 'Safe\stream_socket_pair',
'stream_socket_recvfrom' => 'Safe\stream_socket_recvfrom',
'stream_socket_sendto' => 'Safe\stream_socket_sendto',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
'swoole_event_del' => 'Safe\swoole_event_del',
'swoole_event_write' => 'Safe\swoole_event_write',
'symlink' => 'Safe\symlink',
'system' => 'Safe\system',
'sys_getloadavg' => 'Safe\sys_getloadavg',
'tempnam' => 'Safe\tempnam',
'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr',
'time_nanosleep' => 'Safe\time_nanosleep',
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
'xdiff_file_diff_binary' => 'Safe\xdiff_file_diff_binary',
'xdiff_file_patch_binary' => 'Safe\xdiff_file_patch_binary',
'xdiff_file_rabdiff' => 'Safe\xdiff_file_rabdiff',
'xdiff_string_bpatch' => 'Safe\xdiff_string_bpatch',
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
'xml_parser_free' => 'Safe\xml_parser_free',
'xml_parser_set_option' => 'Safe\xml_parser_set_option',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
'yaz_ccl_parse' => 'Safe\yaz_ccl_parse',
'yaz_close' => 'Safe\yaz_close',
'yaz_connect' => 'Safe\yaz_connect',
'yaz_database' => 'Safe\yaz_database',
'yaz_element' => 'Safe\yaz_element',
'yaz_present' => 'Safe\yaz_present',
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
'zip_entry_filesize' => 'Safe\zip_entry_filesize',
'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
]
);
};
<?php

namespace Safe;

use Safe\Exceptions\JsonException;












































function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
$safeResult = \json_encode($value, $flags, $depth);
if ($safeResult === false) {
throw JsonException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApacheException;








function apache_get_version(): string
{
error_clear_last();
$safeResult = \apache_get_version();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}












function apache_getenv(string $variable, bool $walk_to_top = false): string
{
error_clear_last();
$safeResult = \apache_getenv($variable, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}







































function apache_lookup_uri(string $filename): object
{
error_clear_last();
$safeResult = \apache_lookup_uri($filename);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}









function apache_request_headers()
{
error_clear_last();
$safeResult = \apache_request_headers();
return $safeResult;
}









function apache_response_headers()
{
error_clear_last();
$safeResult = \apache_response_headers();
return $safeResult;
}













function apache_setenv(string $variable, string $value, bool $walk_to_top = false): void
{
error_clear_last();
$safeResult = \apache_setenv($variable, $value, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}












function getallheaders(): array
{
error_clear_last();
$safeResult = \getallheaders();
return $safeResult;
}



















function virtual(string $uri): void
{
error_clear_last();
$safeResult = \virtual($uri);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\HashException;



























function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = "")
{
error_clear_last();
$safeResult = \hash_hkdf($algo, $key, $length, $info, $salt);
return $safeResult;
}











function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
if ($stream_context !== null) {
$safeResult = \hash_update_file($context, $filename, $stream_context);
} else {
$safeResult = \hash_update_file($context, $filename);
}
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SwooleException;











function swoole_async_dns_lookup(string $hostname, callable $callback): void
{
error_clear_last();
$safeResult = \swoole_async_dns_lookup($hostname, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_readfile(string $filename, string $callback): void
{
error_clear_last();
$safeResult = \swoole_async_readfile($filename, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_write(string $filename, string $content, ?int $offset = null, ?callable $callback = null): void
{
error_clear_last();
if ($callback !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset, $callback);
} elseif ($offset !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset);
} else {
$safeResult = \swoole_async_write($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_writefile(string $filename, string $content, ?callable $callback = null, int $flags = 0): void
{
error_clear_last();
if ($flags !== 0) {
$safeResult = \swoole_async_writefile($filename, $content, $callback, $flags);
} elseif ($callback !== null) {
$safeResult = \swoole_async_writefile($filename, $content, $callback);
} else {
$safeResult = \swoole_async_writefile($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_defer(callable $callback): void
{
error_clear_last();
$safeResult = \swoole_event_defer($callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_del(int $fd): void
{
error_clear_last();
$safeResult = \swoole_event_del($fd);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}










function swoole_event_write(int $fd, string $data): void
{
error_clear_last();
$safeResult = \swoole_event_write($fd, $data);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SodiumException;












function sodium_crypto_aead_aegis128l_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}













function sodium_crypto_aead_aegis256_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}














function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}


















function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
{
error_clear_last();
$safeResult = \sodium_crypto_auth_verify($mac, $message, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}










function sodium_crypto_generichash_update(string &$state, string $message): bool
{
error_clear_last();
$safeResult = \sodium_crypto_generichash_update($state, $message);
return $safeResult;
}














function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_open(string $signed_message, string $public_key): string
{
error_clear_last();
$safeResult = \sodium_crypto_sign_open($signed_message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
{
error_clear_last();
$safeResult = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}















function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PspellException;









function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_personal($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_session($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}









function pspell_clear_session(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_clear_session($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


































function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = "")
{
error_clear_last();
$safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding);
return $safeResult;
}












function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_data_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}












function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_dict_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
$safeResult = \pspell_config_ignore($config, $min_length);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}






























function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
$safeResult = \pspell_config_mode($config, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}

















function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_personal($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_repl($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


















function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
$safeResult = \pspell_config_runtogether($config, $allow);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
$safeResult = \pspell_config_save_repl($config, $save);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_new_config(int $config): int
{
error_clear_last();
$safeResult = \pspell_new_config($config);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}





























































function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}
































































function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}









function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_save_wordlist($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
$safeResult = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MysqliException;







function mysqli_get_client_stats()
{
error_clear_last();
$safeResult = \mysqli_get_client_stats();
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\OutcontrolException;

















function ob_clean(): void
{
error_clear_last();
$safeResult = \ob_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}






















function ob_end_clean(): void
{
error_clear_last();
$safeResult = \ob_end_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}





















function ob_end_flush(): void
{
error_clear_last();
$safeResult = \ob_end_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}


















function ob_flush(): void
{
error_clear_last();
$safeResult = \ob_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}























function ob_get_clean(): string
{
error_clear_last();
$safeResult = \ob_get_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}






















function ob_get_flush(): string
{
error_clear_last();
$safeResult = \ob_get_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}







































































function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
{
error_clear_last();
if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
$safeResult = \ob_start($callback, $chunk_size, $flags);
} elseif ($chunk_size !== 0) {
$safeResult = \ob_start($callback, $chunk_size);
} elseif ($callback !== null) {
$safeResult = \ob_start($callback);
} else {
$safeResult = \ob_start();
}
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}































function output_add_rewrite_var(string $name, string $value): void
{
error_clear_last();
$safeResult = \output_add_rewrite_var($name, $value);
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}









function output_reset_rewrite_vars(): void
{
error_clear_last();
$safeResult = \output_reset_rewrite_vars();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\OpcacheException;










function opcache_compile_file(string $filename): void
{
error_clear_last();
$safeResult = \opcache_compile_file($filename);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
}











function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
$safeResult = \opcache_get_status($include_scripts);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MysqlException;























function mysql_close($link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_close($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}







































function mysql_connect(?string $server = null, ?string $username = null, ?string $password = null, bool $new_link = false, int $client_flags = 0)
{
error_clear_last();
if ($client_flags !== 0) {
$safeResult = \mysql_connect($server, $username, $password, $new_link, $client_flags);
} elseif ($new_link !== false) {
$safeResult = \mysql_connect($server, $username, $password, $new_link);
} elseif ($password !== null) {
$safeResult = \mysql_connect($server, $username, $password);
} elseif ($username !== null) {
$safeResult = \mysql_connect($server, $username);
} elseif ($server !== null) {
$safeResult = \mysql_connect($server);
} else {
$safeResult = \mysql_connect();
}
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_create_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_create_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}























function mysql_data_seek($result, int $row_number): void
{
error_clear_last();
$safeResult = \mysql_data_seek($result, $row_number);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_db_name($result, int $row, $field = null): string
{
error_clear_last();
$safeResult = \mysql_db_name($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}






















function mysql_db_query(string $database, string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_db_query($database, $query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



















function mysql_drop_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_drop_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}





















function mysql_fetch_lengths($result): array
{
error_clear_last();
$safeResult = \mysql_fetch_lengths($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



























function mysql_field_flags($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_flags($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_len($result, int $field_offset): int
{
error_clear_last();
$safeResult = \mysql_field_len($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_name($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_name($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_field_seek($result, int $field_offset): void
{
error_clear_last();
$safeResult = \mysql_field_seek($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_free_result($result): void
{
error_clear_last();
$safeResult = \mysql_free_result($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_get_host_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_host_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_proto_info($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_get_proto_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_server_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_server_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_list_dbs($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_dbs($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


























function mysql_list_fields(string $database_name, string $table_name, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_fields($database_name, $table_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_list_processes($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_processes($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
























function mysql_list_tables(string $database, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_tables($database, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}













function mysql_num_fields($result): int
{
error_clear_last();
$safeResult = \mysql_num_fields($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_num_rows($result): int
{
error_clear_last();
$safeResult = \mysql_num_rows($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}









































function mysql_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_real_escape_string(string $unescaped_string, $link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_real_escape_string($unescaped_string, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_result($result, int $row, $field = 0): string
{
error_clear_last();
$safeResult = \mysql_result($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_select_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_select_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_set_charset(string $charset, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_set_charset($charset, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}




















function mysql_tablename($result, int $i): string
{
error_clear_last();
$safeResult = \mysql_tablename($result, $i);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_thread_id($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_thread_id($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


































function mysql_unbuffered_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_unbuffered_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RrdException;










function rrd_create(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_create($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}











function rrd_first(string $file, int $raaindex = 0): int
{
error_clear_last();
$safeResult = \rrd_first($file, $raaindex);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}















function rrd_graph(string $filename, array $options): array
{
error_clear_last();
$safeResult = \rrd_graph($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}










function rrd_info(string $filename): array
{
error_clear_last();
$safeResult = \rrd_info($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_lastupdate(string $filename): array
{
error_clear_last();
$safeResult = \rrd_lastupdate($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_restore(string $xml_file, string $rrd_file, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rrd_restore($xml_file, $rrd_file, $options);
} else {
$safeResult = \rrd_restore($xml_file, $rrd_file);
}
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_tune(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_tune($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_update(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_update($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_xport(array $options): array
{
error_clear_last();
$safeResult = \rrd_xport($options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ErrorfuncException;































































function error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): void
{
error_clear_last();
if ($additional_headers !== null) {
$safeResult = \error_log($message, $message_type, $destination, $additional_headers);
} elseif ($destination !== null) {
$safeResult = \error_log($message, $message_type, $destination);
} else {
$safeResult = \error_log($message, $message_type);
}
if ($safeResult === false) {
throw ErrorfuncException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbaseException;









function fbird_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \fbird_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_add_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_add_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}





























function ibase_backup($service_handle, string $source_db, string $dest_file, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_backup($service_handle, $source_db, $dest_file, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \ibase_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_blob_create($link_identifier = null)
{
error_clear_last();
if ($link_identifier !== null) {
$safeResult = \ibase_blob_create($link_identifier);
} else {
$safeResult = \ibase_blob_create();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}












function ibase_blob_get($blob_handle, int $len): string
{
error_clear_last();
$safeResult = \ibase_blob_get($blob_handle, $len);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}














function ibase_close($connection_id = null): void
{
error_clear_last();
if ($connection_id !== null) {
$safeResult = \ibase_close($connection_id);
} else {
$safeResult = \ibase_close();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}















function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}



































function ibase_connect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_connect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_connect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_connect($database);
} else {
$safeResult = \ibase_connect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_delete_user($service_handle, string $user_name): void
{
error_clear_last();
$safeResult = \ibase_delete_user($service_handle, $user_name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_drop_db($connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \ibase_drop_db($connection);
} else {
$safeResult = \ibase_drop_db();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_free_event_handler($event): void
{
error_clear_last();
$safeResult = \ibase_free_event_handler($event);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}









function ibase_free_query($query): void
{
error_clear_last();
$safeResult = \ibase_free_query($query);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










function ibase_free_result($result_identifier): void
{
error_clear_last();
$safeResult = \ibase_free_result($result_identifier);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_maintain_db($service_handle, string $db, int $action, int $argument = 0): void
{
error_clear_last();
$safeResult = \ibase_maintain_db($service_handle, $db, $action, $argument);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_modify_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_name_result($result, string $name): void
{
error_clear_last();
$safeResult = \ibase_name_result($result, $name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










































function ibase_pconnect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_pconnect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_pconnect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_pconnect($database);
} else {
$safeResult = \ibase_pconnect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}
































function ibase_restore($service_handle, string $source_file, string $dest_db, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_restore($service_handle, $source_file, $dest_db, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}















function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_service_attach(string $host, string $dba_username, string $dba_password)
{
error_clear_last();
$safeResult = \ibase_service_attach($host, $dba_username, $dba_password);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}









function ibase_service_detach($service_handle): void
{
error_clear_last();
$safeResult = \ibase_service_detach($service_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UopzException;









function uopz_extend(string $class, string $parent): void
{
error_clear_last();
$safeResult = \uopz_extend($class, $parent);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}










function uopz_implement(string $class, string $interface): void
{
error_clear_last();
$safeResult = \uopz_implement($class, $interface);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MbstringException;
















function mb_chr(int $codepoint, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_chr($codepoint, $encoding);
} else {
$safeResult = \mb_chr($codepoint);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


























function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
{
error_clear_last();
if ($from_encoding !== null) {
$safeResult = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
$safeResult = \mb_convert_encoding($string, $to_encoding);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}































function mb_detect_order($encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_detect_order($encoding);
} else {
$safeResult = \mb_detect_order();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_encoding_aliases(string $encoding)
{
error_clear_last();
$safeResult = \mb_encoding_aliases($encoding);
return $safeResult;
}




































function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
} else {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}

















function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_getregs(): array
{
error_clear_last();
$safeResult = \mb_ereg_search_getregs();
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
















function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern);
} else {
$safeResult = \mb_ereg_search_init($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}











function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_regs($pattern);
} else {
$safeResult = \mb_ereg_search_regs();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
$safeResult = \mb_ereg_search_setpos($offset);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}















function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}





























function mb_get_info(string $type = "all")
{
error_clear_last();
$safeResult = \mb_get_info($type);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




















function mb_http_output(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_http_output($encoding);
} else {
$safeResult = \mb_http_output();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


















function mb_internal_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_internal_encoding($encoding);
} else {
$safeResult = \mb_internal_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_ord(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_ord($string, $encoding);
} else {
$safeResult = \mb_ord($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
$safeResult = \mb_parse_str($string, $result);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_regex_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_regex_encoding($encoding);
} else {
$safeResult = \mb_regex_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}



























































function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], ?string $additional_params = null): void
{
error_clear_last();
if ($additional_params !== null) {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
} else {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_split(string $pattern, string $string, int $limit = -1): array
{
error_clear_last();
$safeResult = \mb_split($pattern, $string, $limit);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GnupgException;











function gnupg_adddecryptkey($identifier, string $fingerprint, string $passphrase): void
{
error_clear_last();
$safeResult = \gnupg_adddecryptkey($identifier, $fingerprint, $passphrase);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}











function gnupg_addencryptkey($identifier, string $fingerprint): void
{
error_clear_last();
$safeResult = \gnupg_addencryptkey($identifier, $fingerprint);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_addsignkey($identifier, string $fingerprint, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint, $passphrase);
} else {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint);
}
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_cleardecryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_cleardecryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearencryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearencryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearsignkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearsignkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_deletekey($identifier, string $key, bool $allow_secret): void
{
error_clear_last();
$safeResult = \gnupg_deletekey($identifier, $key, $allow_secret);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}













function gnupg_setarmor($identifier, int $armor): void
{
error_clear_last();
$safeResult = \gnupg_setarmor($identifier, $armor);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}


















function gnupg_setsignmode($identifier, int $signmode): void
{
error_clear_last();
$safeResult = \gnupg_setsignmode($identifier, $signmode);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlException;








function xml_parser_free(\XMLParser $parser): void
{
error_clear_last();
$safeResult = \xml_parser_free($parser);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}







































































function xml_parser_set_option(\XMLParser $parser, int $option, $value): void
{
error_clear_last();
$safeResult = \xml_parser_set_option($parser, $option, $value);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}





























































function xml_set_character_data_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_character_data_handler($parser, $handler);
return $safeResult;
}





























































function xml_set_default_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_default_handler($parser, $handler);
return $safeResult;
}



















































































function xml_set_element_handler(\XMLParser $parser, callable $start_handler, callable $end_handler): bool
{
error_clear_last();
$safeResult = \xml_set_element_handler($parser, $start_handler, $end_handler);
return $safeResult;
}




























































function xml_set_end_namespace_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_end_namespace_decl_handler($parser, $handler);
return $safeResult;
}
































































































function xml_set_external_entity_ref_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_external_entity_ref_handler($parser, $handler);
return $safeResult;
}




































































































function xml_set_notation_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_notation_decl_handler($parser, $handler);
return $safeResult;
}













function xml_set_object(\XMLParser $parser, object $object): bool
{
error_clear_last();
$safeResult = \xml_set_object($parser, $object);
return $safeResult;
}








































































function xml_set_processing_instruction_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_processing_instruction_handler($parser, $handler);
return $safeResult;
}





































































function xml_set_start_namespace_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_start_namespace_decl_handler($parser, $handler);
return $safeResult;
}












































































































function xml_set_unparsed_entity_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SemException;


















function msg_get_queue(int $key, int $permissions = 0666): \SysvMessageQueue
{
error_clear_last();
$safeResult = \msg_get_queue($key, $permissions);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}









function msg_queue_exists(int $key): void
{
error_clear_last();
$safeResult = \msg_queue_exists($key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}









































































function msg_receive(\SysvMessageQueue $queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function msg_remove_queue(\SysvMessageQueue $queue): void
{
error_clear_last();
$safeResult = \msg_remove_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



































function msg_send(\SysvMessageQueue $queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



















function msg_set_queue(\SysvMessageQueue $queue, array $data): void
{
error_clear_last();
$safeResult = \msg_set_queue($queue, $data);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















































































function msg_stat_queue(\SysvMessageQueue $queue): array
{
error_clear_last();
$safeResult = \msg_stat_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}





















function sem_acquire(\SysvSemaphore $semaphore, bool $non_blocking = false): void
{
error_clear_last();
$safeResult = \sem_acquire($semaphore, $non_blocking);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}

























function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): \SysvSemaphore
{
error_clear_last();
$safeResult = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}















function sem_release(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_release($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function sem_remove(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_remove($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
























function shm_attach(int $key, ?int $size = null, int $permissions = 0666): \SysvSharedMemory
{
error_clear_last();
if ($permissions !== 0666) {
$safeResult = \shm_attach($key, $size, $permissions);
} elseif ($size !== null) {
$safeResult = \shm_attach($key, $size);
} else {
$safeResult = \shm_attach($key);
}
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}












function shm_detach(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_detach($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















function shm_put_var(\SysvSharedMemory $shm, int $key, $value): void
{
error_clear_last();
$safeResult = \shm_put_var($shm, $key, $value);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}











function shm_remove_var(\SysvSharedMemory $shm, int $key): void
{
error_clear_last();
$safeResult = \shm_remove_var($shm, $key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}










function shm_remove(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_remove($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SplException;












function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_implements($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}













function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_parents($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}














function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_uses($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}






































function spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
$safeResult = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
$safeResult = \spl_autoload_register($callback, $throw);
} elseif ($callback !== null) {
$safeResult = \spl_autoload_register($callback);
} else {
$safeResult = \spl_autoload_register();
}
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}














function spl_autoload_unregister($callback): void
{
error_clear_last();
$safeResult = \spl_autoload_unregister($callback);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XdiffException;













function xdiff_file_bdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}














function xdiff_file_bpatch(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bpatch($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_diff_binary($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}




















function xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): void
{
error_clear_last();
$safeResult = \xdiff_file_diff($old_file, $new_file, $dest, $context, $minimal);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_patch_binary(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_patch_binary($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}



















function xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_rabdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}













function xdiff_string_bpatch(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_bpatch($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}















function xdiff_string_patch_binary(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_patch_binary($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
























function xdiff_string_patch(string $str, string $patch, ?int $flags = null, ?string &$error = null): string
{
error_clear_last();
if ($error !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags, $error);
} elseif ($flags !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags);
} else {
$safeResult = \xdiff_string_patch($str, $patch);
}
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\YamlException;




















function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
























function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_url($url, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}





















function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse($input, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SolrException;








function solr_get_version(): string
{
error_clear_last();
$safeResult = \solr_get_version();
if ($safeResult === false) {
throw SolrException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;















function date_create_immutable(string $datetime = "now", ?\DateTimeZone $timezone = null): \DateTimeImmutable
{
error_clear_last();
if ($timezone !== null) {
$safeResult = \date_create_immutable($datetime, $timezone);
} else {
$safeResult = \date_create_immutable($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function date_create(?string $datetime = "now", ?\DateTimeZone $timezone = null): \DateTime
{
error_clear_last();
if ($timezone !== null) {
$safeResult = \date_create($datetime, $timezone);
} else {
$safeResult = \date_create($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}












































function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse_from_format($format, $datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}





























































function date_parse(string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse($datetime);
return $safeResult;
}

































































































function date_sun_info(int $timestamp, float $latitude, float $longitude)
{
error_clear_last();
$safeResult = \date_sun_info($timestamp, $latitude, $longitude);
return $safeResult;
}




















































































function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunrise($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunset($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function date(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \date($format, $timestamp);
} else {
$safeResult = \date($format);
}
return $safeResult;
}


































function gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \gmmktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \gmmktime($hour, $minute);
} else {
$safeResult = \gmmktime($hour);
}
return $safeResult;
}























function gmstrftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \gmstrftime($format, $timestamp);
} else {
$safeResult = \gmstrftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}






















































































































function idate(string $format, ?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \idate($format, $timestamp);
} else {
$safeResult = \idate($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}







































function mktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \mktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \mktime($hour, $minute);
} else {
$safeResult = \mktime($hour);
}
return $safeResult;
}

















































































































































































































































































































function strftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \strftime($format, $timestamp);
} else {
$safeResult = \strftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}










































































function strptime(string $timestamp, string $format): array
{
error_clear_last();
$safeResult = \strptime($timestamp, $format);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function strtotime(string $datetime, ?int $baseTimestamp = null): int
{
error_clear_last();
if ($baseTimestamp !== null) {
$safeResult = \strtotime($datetime, $baseTimestamp);
} else {
$safeResult = \strtotime($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string
{
error_clear_last();
$safeResult = \timezone_name_from_abbr($abbr, $utcOffset, $isDST);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImapException;










function imap_8bit(string $string): string
{
error_clear_last();
$safeResult = \imap_8bit($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



















function imap_append(\IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): void
{
error_clear_last();
if ($internal_date !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options, $internal_date);
} elseif ($options !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options);
} else {
$safeResult = \imap_append($imap, $folder, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_base64(string $string): string
{
error_clear_last();
$safeResult = \imap_base64($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_binary(string $string): string
{
error_clear_last();
$safeResult = \imap_binary($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}







































function imap_body(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_body($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_bodystruct(\IMAP\Connection $imap, int $message_num, string $section): \stdClass
{
error_clear_last();
$safeResult = \imap_bodystruct($imap, $message_num, $section);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}








































function imap_check(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_check($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_clearflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): bool
{
error_clear_last();
$safeResult = \imap_clearflag_full($imap, $sequence, $flag, $options);
return $safeResult;
}













function imap_close(\IMAP\Connection $imap, int $flags = 0): bool
{
error_clear_last();
$safeResult = \imap_close($imap, $flags);
return $safeResult;
}












function imap_createmailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_createmailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_deletemailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_deletemailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












































































































function imap_fetch_overview(\IMAP\Connection $imap, string $sequence, int $flags = 0): array
{
error_clear_last();
$safeResult = \imap_fetch_overview($imap, $sequence, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



































function imap_fetchbody(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchbody($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




































function imap_fetchheader(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchheader($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_fetchmime(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchmime($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










































































































































function imap_fetchstructure(\IMAP\Connection $imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_fetchstructure($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_gc(\IMAP\Connection $imap, int $flags): bool
{
error_clear_last();
$safeResult = \imap_gc($imap, $flags);
return $safeResult;
}












function imap_getacl(\IMAP\Connection $imap, string $mailbox): array
{
error_clear_last();
$safeResult = \imap_getacl($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getmailboxes(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getmailboxes($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getsubscribed(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getsubscribed($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































































function imap_headerinfo(\IMAP\Connection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_headers(\IMAP\Connection $imap): array
{
error_clear_last();
$safeResult = \imap_headers($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

































function imap_listscan(\IMAP\Connection $imap, string $reference, string $pattern, string $content): array
{
error_clear_last();
$safeResult = \imap_listscan($imap, $reference, $pattern, $content);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_lsub(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_lsub($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































































function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
$safeResult = \imap_mail_compose($envelope, $bodies);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}





























function imap_mail_copy(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}

























function imap_mail_move(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): void
{
error_clear_last();
if ($return_path !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
} elseif ($bcc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
} elseif ($cc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc);
} elseif ($additional_headers !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers);
} else {
$safeResult = \imap_mail($to, $subject, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



















































function imap_mailboxmsginfo(\IMAP\Connection $imap)
{
error_clear_last();
$safeResult = \imap_mailboxmsginfo($imap);
return $safeResult;
}


















function imap_mime_header_decode(string $string): array
{
error_clear_last();
$safeResult = \imap_mime_header_decode($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
$safeResult = \imap_mutf7_to_utf8($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_num_msg(\IMAP\Connection $imap): int
{
error_clear_last();
$safeResult = \imap_num_msg($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














































































































































































































function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): \IMAP\Connection
{
error_clear_last();
$safeResult = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_qprint(string $string): string
{
error_clear_last();
$safeResult = \imap_qprint($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_renamemailbox(\IMAP\Connection $imap, string $from, string $to): void
{
error_clear_last();
$safeResult = \imap_renamemailbox($imap, $from, $to);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
$safeResult = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_savebody(\IMAP\Connection $imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_set_quota(\IMAP\Connection $imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
$safeResult = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}














function imap_setacl(\IMAP\Connection $imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
$safeResult = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



























function imap_setflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): bool
{
error_clear_last();
$safeResult = \imap_setflag_full($imap, $sequence, $flag, $options);
return $safeResult;
}



































































function imap_sort(\IMAP\Connection $imap, int $criteria, int $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array
{
error_clear_last();
if ($charset !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
} elseif ($search_criteria !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
} else {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

























































function imap_status(\IMAP\Connection $imap, string $mailbox, int $flags): \stdClass
{
error_clear_last();
$safeResult = \imap_status($imap, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}











function imap_subscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_subscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}


























function imap_thread(\IMAP\Connection $imap, int $flags = SE_FREE): array
{
error_clear_last();
$safeResult = \imap_thread($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




















function imap_timeout(int $timeout_type, int $timeout = -1)
{
error_clear_last();
$safeResult = \imap_timeout($timeout_type, $timeout);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_undelete(\IMAP\Connection $imap, string $message_nums, int $flags = 0): bool
{
error_clear_last();
$safeResult = \imap_undelete($imap, $message_nums, $flags);
return $safeResult;
}











function imap_unsubscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_unsubscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
$safeResult = \imap_utf8_to_mutf7($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\NetworkException;








function closelog(): bool
{
error_clear_last();
$safeResult = \closelog();
return $safeResult;
}




















































































































































































































function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
$safeResult = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}



















































function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function gethostname(): string
{
error_clear_last();
$safeResult = \gethostname();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobyname(string $protocol): int
{
error_clear_last();
$safeResult = \getprotobyname($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobynumber(int $protocol): string
{
error_clear_last();
$safeResult = \getprotobynumber($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function getservbyport(int $port, string $protocol): string
{
error_clear_last();
$safeResult = \getservbyport($port, $protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function header_register_callback(callable $callback): void
{
error_clear_last();
$safeResult = \header_register_callback($callback);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}










function inet_ntop(string $ip): string
{
error_clear_last();
$safeResult = \inet_ntop($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}















function inet_pton(string $ip): string
{
error_clear_last();
$safeResult = \inet_pton($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function long2ip(int $ip)
{
error_clear_last();
$safeResult = \long2ip($ip);
return $safeResult;
}
































































































function net_get_interfaces(): array
{
error_clear_last();
$safeResult = \net_get_interfaces();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











































function openlog(string $prefix, int $flags, int $facility): bool
{
error_clear_last();
$safeResult = \openlog($prefix, $flags, $facility);
return $safeResult;
}




















function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}





























function syslog(int $priority, string $message): bool
{
error_clear_last();
$safeResult = \syslog($priority, $message);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UrlException;














function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
$safeResult = \base64_decode($string, $strict);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}

















function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \get_headers($url, $associative, $context);
} else {
$safeResult = \get_headers($url, $associative);
}
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}






































function get_meta_tags(string $filename, bool $use_include_path = false): array
{
error_clear_last();
$safeResult = \get_meta_tags($filename, $use_include_path);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}


























































































function parse_url(string $url, int $component = -1)
{
error_clear_last();
$safeResult = \parse_url($url, $component);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PosixException;

















function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_access($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}


















function posix_eaccess(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_eaccess($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























































function posix_getgrgid(int $group_id): array
{
error_clear_last();
$safeResult = \posix_getgrgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}























































function posix_getgrnam(string $name): array
{
error_clear_last();
$safeResult = \posix_getgrnam($name);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_getgroups(): array
{
error_clear_last();
$safeResult = \posix_getgroups();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









function posix_getlogin(): string
{
error_clear_last();
$safeResult = \posix_getlogin();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}



















































































function posix_getpwuid(int $user_id): array
{
error_clear_last();
$safeResult = \posix_getpwuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}







































































































function posix_getrlimit(?int $resource = null): array
{
error_clear_last();
if ($resource !== null) {
$safeResult = \posix_getrlimit($resource);
} else {
$safeResult = \posix_getrlimit();
}
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}














function posix_getsid(int $process_id): int
{
error_clear_last();
$safeResult = \posix_getsid($process_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
$safeResult = \posix_initgroups($username, $group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
$safeResult = \posix_kill($process_id, $signal);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}
















function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \posix_mkfifo($filename, $permissions);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}

















function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
$safeResult = \posix_mknod($filename, $flags, $major, $minor);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setegid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setegid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_seteuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_seteuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}














function posix_setgid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
$safeResult = \posix_setpgid($process_id, $process_group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
$safeResult = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}









function posix_setsid(): int
{
error_clear_last();
$safeResult = \posix_setsid();
if ($safeResult === -1) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}











function posix_setuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_setuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}







































function posix_times(): array
{
error_clear_last();
$safeResult = \posix_times();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









































function posix_uname(): array
{
error_clear_last();
$safeResult = \posix_uname();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UodbcException;























function odbc_autocommit(\Odbc\Connection $odbc, ?bool $enable = null)
{
error_clear_last();
if ($enable !== null) {
$safeResult = \odbc_autocommit($odbc, $enable);
} else {
$safeResult = \odbc_autocommit($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































































































function odbc_binmode(int $statement, int $mode): bool
{
error_clear_last();
$safeResult = \odbc_binmode($statement, $mode);
return $safeResult;
}






































function odbc_columnprivileges(\Odbc\Connection $odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
$safeResult = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
return $safeResult;
}














































function odbc_columns(\Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table, $column);
} elseif ($table !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_columns($odbc, $catalog);
} else {
$safeResult = \odbc_columns($odbc);
}
return $safeResult;
}










function odbc_commit(\Odbc\Connection $odbc): void
{
error_clear_last();
$safeResult = \odbc_commit($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}








































function odbc_connect(string $dsn, ?string $user = null, ?string $password = null, int $cursor_option = SQL_CUR_USE_DRIVER): \Odbc\Connection
{
error_clear_last();
if ($cursor_option !== SQL_CUR_USE_DRIVER) {
$safeResult = \odbc_connect($dsn, $user, $password, $cursor_option);
} elseif ($password !== null) {
$safeResult = \odbc_connect($dsn, $user, $password);
} elseif ($user !== null) {
$safeResult = \odbc_connect($dsn, $user);
} else {
$safeResult = \odbc_connect($dsn);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_cursor(\Odbc\Result $statement): string
{
error_clear_last();
$safeResult = \odbc_cursor($statement);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

















function odbc_data_source(\Odbc\Connection $odbc, int $fetch_type): array
{
error_clear_last();
$safeResult = \odbc_data_source($odbc, $fetch_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_exec(\Odbc\Connection $odbc, string $query): \Odbc\Result
{
error_clear_last();
$safeResult = \odbc_exec($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















function odbc_execute(\Odbc\Result $statement, array $params = []): void
{
error_clear_last();
$safeResult = \odbc_execute($statement, $params);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
















function odbc_fetch_into(\Odbc\Result $statement, ?array &$array, ?int $row = null): int
{
error_clear_last();
if ($row !== null) {
$safeResult = \odbc_fetch_into($statement, $array, $row);
} else {
$safeResult = \odbc_fetch_into($statement, $array);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_len(\Odbc\Result $statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_len($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_name(\Odbc\Result $statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_name($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_field_num(\Odbc\Result $statement, string $field): int
{
error_clear_last();
$safeResult = \odbc_field_num($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_scale(\Odbc\Result $statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_scale($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_type(\Odbc\Result $statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_type($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































function odbc_foreignkeys(\Odbc\Connection $odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
$safeResult = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
return $safeResult;
}

































function odbc_gettypeinfo(\Odbc\Connection $odbc, int $data_type = 0)
{
error_clear_last();
$safeResult = \odbc_gettypeinfo($odbc, $data_type);
return $safeResult;
}














function odbc_longreadlen(\Odbc\Result $statement, int $length): bool
{
error_clear_last();
$safeResult = \odbc_longreadlen($statement, $length);
return $safeResult;
}










function odbc_num_fields(\Odbc\Result $statement): int
{
error_clear_last();
$safeResult = \odbc_num_fields($statement);
if ($safeResult === -1) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}






















function odbc_pconnect(string $dsn, ?string $user = null, ?string $password = null, int $cursor_option = SQL_CUR_USE_DRIVER): \Odbc\Connection
{
error_clear_last();
if ($cursor_option !== SQL_CUR_USE_DRIVER) {
$safeResult = \odbc_pconnect($dsn, $user, $password, $cursor_option);
} elseif ($password !== null) {
$safeResult = \odbc_pconnect($dsn, $user, $password);
} elseif ($user !== null) {
$safeResult = \odbc_pconnect($dsn, $user);
} else {
$safeResult = \odbc_pconnect($dsn);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}



















function odbc_prepare(\Odbc\Connection $odbc, string $query): \Odbc\Result
{
error_clear_last();
$safeResult = \odbc_prepare($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

























function odbc_primarykeys(\Odbc\Connection $odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_primarykeys($odbc, $catalog, $schema, $table);
return $safeResult;
}

















































function odbc_procedurecolumns($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
} elseif ($procedure !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog);
} else {
$safeResult = \odbc_procedurecolumns($odbc);
}
return $safeResult;
}

































function odbc_procedures($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null): \Odbc\Result
{
error_clear_last();
if ($procedure !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedures($odbc, $catalog);
} else {
$safeResult = \odbc_procedures($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
















function odbc_result_all(\Odbc\Result $statement, string $format = ""): int
{
error_clear_last();
$safeResult = \odbc_result_all($statement, $format);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_result(\Odbc\Result $statement, $field)
{
error_clear_last();
$safeResult = \odbc_result($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_rollback(\Odbc\Connection $odbc): void
{
error_clear_last();
$safeResult = \odbc_rollback($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
































function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
$safeResult = \odbc_setoption($odbc, $which, $option, $value);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_specialcolumns(\Odbc\Connection $odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
$safeResult = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
return $safeResult;
}




































function odbc_statistics(\Odbc\Connection $odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
$safeResult = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
return $safeResult;
}
































function odbc_tableprivileges(\Odbc\Connection $odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
return $safeResult;
}











































































function odbc_tables(\Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $types = null): \Odbc\Result
{
error_clear_last();
if ($types !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table, $types);
} elseif ($table !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_tables($odbc, $catalog);
} else {
$safeResult = \odbc_tables($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LzfException;










function lzf_compress(string $data): string
{
error_clear_last();
$safeResult = \lzf_compress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}











function lzf_decompress(string $data): string
{
error_clear_last();
$safeResult = \lzf_decompress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImageException;































































function getimagesize(string $filename, ?array &$image_info = null): ?array
{
error_clear_last();
$safeResult = \getimagesize($filename, $image_info);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function image_type_to_extension(int $image_type, bool $include_dot = true): string
{
error_clear_last();
$safeResult = \image_type_to_extension($image_type, $include_dot);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imageaffine(\GdImage $image, array $affine, ?array $clip = null): \GdImage
{
error_clear_last();
if ($clip !== null) {
$safeResult = \imageaffine($image, $affine, $clip);
} else {
$safeResult = \imageaffine($image, $affine);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
$safeResult = \imageaffinematrixconcat($matrix1, $matrix2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
$safeResult = \imageaffinematrixget($type, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagealphablending(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagealphablending($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imageantialias(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imageantialias($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagearc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
$safeResult = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
{
error_clear_last();
if ($speed !== -1) {
$safeResult = \imageavif($image, $file, $quality, $speed);
} elseif ($quality !== -1) {
$safeResult = \imageavif($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imageavif($image, $file);
} else {
$safeResult = \imageavif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagebmp(\GdImage $image, $file = null, bool $compressed = true): void
{
error_clear_last();
if ($compressed !== true) {
$safeResult = \imagebmp($image, $file, $compressed);
} elseif ($file !== null) {
$safeResult = \imagebmp($image, $file);
} else {
$safeResult = \imagebmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





















function imagechar(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagechar($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecharup(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagecharup($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagecolorat(\GdImage $image, int $x, int $y): int
{
error_clear_last();
$safeResult = \imagecolorat($image, $x, $y);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagecolordeallocate(\GdImage $image, int $color): void
{
error_clear_last();
$safeResult = \imagecolordeallocate($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagecolormatch(\GdImage $image1, \GdImage $image2): void
{
error_clear_last();
$safeResult = \imagecolormatch($image1, $image2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecolorset(\GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
{
error_clear_last();
$safeResult = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}












function imagecolorsforindex(\GdImage $image, int $color): array
{
error_clear_last();
$safeResult = \imagecolorsforindex($image, $color);
return $safeResult;
}














function imageconvolution(\GdImage $image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
$safeResult = \imageconvolution($image, $matrix, $divisor, $offset);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagecopy(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




























function imagecopymerge(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
































function imagecopymergegray(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresampled(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresized(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagecreate(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreate($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromavif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromavif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrombmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrombmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd2(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromgif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromjpeg(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromjpeg($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrompng(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrompng($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecreatefromstring(string $data): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromstring($data);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromtga(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromtga($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwbmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwbmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatefromwebp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwebp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxbm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxbm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxpm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxpm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatetruecolor(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatetruecolor($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecrop(\GdImage $image, array $rectangle): \GdImage
{
error_clear_last();
$safeResult = \imagecrop($image, $rectangle);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagecropauto(\GdImage $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1): \GdImage
{
error_clear_last();
$safeResult = \imagecropauto($image, $mode, $threshold, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}

















function imagedashedline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagedashedline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagedestroy(\GdImage $image): void
{
error_clear_last();
$safeResult = \imagedestroy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagefill(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagefill($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




































function imagefilledarc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
$safeResult = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
















function imagefilledellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagefilledrectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagefilltoborder(\GdImage $image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
$safeResult = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










































































































































function imagefilter(\GdImage $image, int $filter, int ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \imagefilter($image, $filter, ...$args);
} else {
$safeResult = \imagefilter($image, $filter);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











































function imageflip(\GdImage $image, int $mode): void
{
error_clear_last();
$safeResult = \imageflip($image, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















































































function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































































function imagefttext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagegammacorrect(\GdImage $image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
$safeResult = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagegd(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegd($image, $file);
} else {
$safeResult = \imagegd($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagegd2(\GdImage $image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
if ($mode !== IMG_GD2_RAW) {
$safeResult = \imagegd2($image, $file, $chunk_size, $mode);
} elseif ($chunk_size !== 128) {
$safeResult = \imagegd2($image, $file, $chunk_size);
} elseif ($file !== null) {
$safeResult = \imagegd2($image, $file);
} else {
$safeResult = \imagegd2($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagegif(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegif($image, $file);
} else {
$safeResult = \imagegif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}









function imagegrabscreen(): \GdImage
{
error_clear_last();
$safeResult = \imagegrabscreen();
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
$safeResult = \imagegrabwindow($handle, $client_area);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagejpeg(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagejpeg($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagejpeg($image, $file);
} else {
$safeResult = \imagejpeg($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























































function imagelayereffect(\GdImage $image, int $effect): void
{
error_clear_last();
$safeResult = \imagelayereffect($image, $effect);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imageline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


























































function imageloadfont(string $filename): int
{
error_clear_last();
$safeResult = \imageloadfont($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
























function imagepng(\GdImage $image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
if ($filters !== -1) {
$safeResult = \imagepng($image, $file, $quality, $filters);
} elseif ($quality !== -1) {
$safeResult = \imagepng($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagepng($image, $file);
} else {
$safeResult = \imagepng($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagerectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



























function imageresolution(\GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null)
{
error_clear_last();
if ($resolution_y !== null) {
$safeResult = \imageresolution($image, $resolution_x, $resolution_y);
} elseif ($resolution_x !== null) {
$safeResult = \imageresolution($image, $resolution_x);
} else {
$safeResult = \imageresolution($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}


















function imagerotate(\GdImage $image, float $angle, int $background_color): \GdImage
{
error_clear_last();
$safeResult = \imagerotate($image, $angle, $background_color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




























function imagesavealpha(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagesavealpha($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























function imagescale(\GdImage $image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED): \GdImage
{
error_clear_last();
$safeResult = \imagescale($image, $width, $height, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagesetbrush(\GdImage $image, \GdImage $brush): void
{
error_clear_last();
$safeResult = \imagesetbrush($image, $brush);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagesetclip(\GdImage $image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
$safeResult = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































































function imagesetinterpolation(\GdImage $image, int $method = IMG_BILINEAR_FIXED): void
{
error_clear_last();
$safeResult = \imagesetinterpolation($image, $method);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}














function imagesetpixel(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagesetpixel($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagesetstyle(\GdImage $image, array $style): void
{
error_clear_last();
$safeResult = \imagesetstyle($image, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagesetthickness(\GdImage $image, int $thickness): void
{
error_clear_last();
$safeResult = \imagesetthickness($image, $thickness);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagesettile(\GdImage $image, \GdImage $tile): void
{
error_clear_last();
$safeResult = \imagesettile($image, $tile);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagestring(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestring($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagestringup(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestringup($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










function imagesx(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesx($image);
return $safeResult;
}










function imagesy(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesy($image);
return $safeResult;
}





















function imagetruecolortopalette(\GdImage $image, bool $dither, int $num_colors): void
{
error_clear_last();
$safeResult = \imagetruecolortopalette($image, $dither, $num_colors);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































function imagettftext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagewbmp(\GdImage $image, $file = null, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagewbmp($image, $file, $foreground_color);
} elseif ($file !== null) {
$safeResult = \imagewbmp($image, $file);
} else {
$safeResult = \imagewbmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagewebp(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagewebp($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagewebp($image, $file);
} else {
$safeResult = \imagewebp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagexbm(\GdImage $image, $filename, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagexbm($image, $filename, $foreground_color);
} else {
$safeResult = \imagexbm($image, $filename);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
$safeResult = \iptcembed($iptc_data, $filename, $spool);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function iptcparse(string $iptc_block): array
{
error_clear_last();
$safeResult = \iptcparse($iptc_block);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ReadlineException;








function readline_add_history(string $prompt): bool
{
error_clear_last();
$safeResult = \readline_add_history($prompt);
return $safeResult;
}



















function readline_callback_handler_install(string $prompt, callable $callback): bool
{
error_clear_last();
$safeResult = \readline_callback_handler_install($prompt, $callback);
return $safeResult;
}








function readline_clear_history(): bool
{
error_clear_last();
$safeResult = \readline_clear_history();
return $safeResult;
}











function readline_completion_function(callable $callback): void
{
error_clear_last();
$safeResult = \readline_completion_function($callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_read_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_read_history($filename);
} else {
$safeResult = \readline_read_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_write_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_write_history($filename);
} else {
$safeResult = \readline_write_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ArrayException;

















function array_all(array $array, callable $callback): void
{
error_clear_last();
$safeResult = \array_all($array, $callback);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}













function array_combine(array $keys, array $values)
{
error_clear_last();
$safeResult = \array_combine($keys, $values);
return $safeResult;
}




















function array_flip(array $array): array
{
error_clear_last();
$safeResult = \array_flip($array);
return $safeResult;
}


























function array_replace_recursive(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace_recursive($array, ...$replacements);
} else {
$safeResult = \array_replace_recursive($array);
}
return $safeResult;
}
















function array_replace(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace($array, ...$replacements);
} else {
$safeResult = \array_replace($array);
}
return $safeResult;
}
























function array_walk_recursive(&$array, callable $callback, $arg = null): bool
{
error_clear_last();
if ($arg !== null) {
$safeResult = \array_walk_recursive($array, $callback, $arg);
} else {
$safeResult = \array_walk_recursive($array, $callback);
}
return $safeResult;
}









function shuffle(array &$array): bool
{
error_clear_last();
$safeResult = \shuffle($array);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FilesystemException;













function chgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \chgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


































function chmod(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \chmod($filename, $permissions);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function chown(string $filename, $user): void
{
error_clear_last();
$safeResult = \chown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}



















function copy(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \copy($from, $to, $context);
} else {
$safeResult = \copy($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function disk_free_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_free_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function disk_total_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_total_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fclose($stream): void
{
error_clear_last();
$safeResult = \fclose($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fdatasync($stream): void
{
error_clear_last();
$safeResult = \fdatasync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function fflush($stream): void
{
error_clear_last();
$safeResult = \fflush($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}




































function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context);
} else {
$safeResult = \file_get_contents($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































































function file_put_contents(string $filename, $data, int $flags = 0, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \file_put_contents($filename, $data, $flags, $context);
} else {
$safeResult = \file_put_contents($filename, $data, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}

























































function file(string $filename, int $flags = 0, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \file($filename, $flags, $context);
} else {
$safeResult = \file($filename, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function fileatime(string $filename): int
{
error_clear_last();
$safeResult = \fileatime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filectime(string $filename): int
{
error_clear_last();
$safeResult = \filectime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fileinode(string $filename): int
{
error_clear_last();
$safeResult = \fileinode($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function filemtime(string $filename): int
{
error_clear_last();
$safeResult = \filemtime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












function fileowner(string $filename): int
{
error_clear_last();
$safeResult = \fileowner($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
























function fileperms(string $filename): int
{
error_clear_last();
$safeResult = \fileperms($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filesize(string $filename): int
{
error_clear_last();
$safeResult = \filesize($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function filetype(string $filename): string
{
error_clear_last();
$safeResult = \filetype($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
$safeResult = \flock($stream, $operation, $would_block);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}









































































































































































































function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \fopen($filename, $mode, $use_include_path, $context);
} else {
$safeResult = \fopen($filename, $mode, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}









































function fread($stream, int $length): string
{
error_clear_last();
$safeResult = \fread($stream, $length);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function fstat($stream): array
{
error_clear_last();
$safeResult = \fstat($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function fsync($stream): void
{
error_clear_last();
$safeResult = \fsync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function ftell($stream): int
{
error_clear_last();
$safeResult = \ftell($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



















function ftruncate($stream, int $size): void
{
error_clear_last();
$safeResult = \ftruncate($stream, $size);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \fwrite($stream, $data, $length);
} else {
$safeResult = \fwrite($stream, $data);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function glob(string $pattern, int $flags = 0): array
{
error_clear_last();
$safeResult = \glob($pattern, $flags);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function lchgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \lchgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function lchown(string $filename, $user): void
{
error_clear_last();
$safeResult = \lchown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}










function link(string $target, string $link): void
{
error_clear_last();
$safeResult = \link($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


















function lstat(string $filename): array
{
error_clear_last();
$safeResult = \lstat($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}






























function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \mkdir($directory, $permissions, $recursive, $context);
} else {
$safeResult = \mkdir($directory, $permissions, $recursive);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}































function parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_file($filename, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function pclose($handle): int
{
error_clear_last();
$safeResult = \pclose($handle);
if ($safeResult === -1) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function popen(string $command, string $mode)
{
error_clear_last();
$safeResult = \popen($command, $mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}














function readfile(string $filename, bool $use_include_path = false, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \readfile($filename, $use_include_path, $context);
} else {
$safeResult = \readfile($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function readlink(string $path): string
{
error_clear_last();
$safeResult = \readlink($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function realpath(string $path): string
{
error_clear_last();
$safeResult = \realpath($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function rename(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rename($from, $to, $context);
} else {
$safeResult = \rename($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}











function rewind($stream): void
{
error_clear_last();
$safeResult = \rewind($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rmdir($directory, $context);
} else {
$safeResult = \rmdir($directory);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function symlink(string $target, string $link): void
{
error_clear_last();
$safeResult = \symlink($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}














function tempnam(string $directory, string $prefix): string
{
error_clear_last();
$safeResult = \tempnam($directory, $prefix);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function tmpfile()
{
error_clear_last();
$safeResult = \tmpfile();
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}





















function touch(string $filename, ?int $mtime = null, ?int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
$safeResult = \touch($filename, $mtime, $atime);
} elseif ($mtime !== null) {
$safeResult = \touch($filename, $mtime);
} else {
$safeResult = \touch($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function unlink(string $filename, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \unlink($filename, $context);
} else {
$safeResult = \unlink($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilterException;












function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_input_array($type, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}













function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_var_array($array, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\Oci8Exception;


































































































function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
$safeResult = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






































































































































































































function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_cancel($statement): void
{
error_clear_last();
$safeResult = \oci_cancel($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























function oci_commit($connection): void
{
error_clear_last();
$safeResult = \oci_commit($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































































































function oci_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}




























function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_define_by_name($statement, $column, $var, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}












































































function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
{
error_clear_last();
$safeResult = \oci_execute($statement, $mode);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_field_name($statement, $column): string
{
error_clear_last();
$safeResult = \oci_field_name($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_precision($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_precision($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_scale($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_scale($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_size($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_size($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}













function oci_field_type_raw($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_type_raw($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_type($statement, $column)
{
error_clear_last();
$safeResult = \oci_field_type($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}









function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
$safeResult = \oci_free_descriptor($lob);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_free_statement($statement): void
{
error_clear_last();
$safeResult = \oci_free_statement($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}














function oci_new_collection($connection, string $type_name, ?string $schema = null)
{
error_clear_last();
if ($schema !== null) {
$safeResult = \oci_new_collection($connection, $type_name, $schema);
} else {
$safeResult = \oci_new_collection($connection, $type_name);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}


























































































function oci_new_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_new_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_new_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_new_cursor($connection)
{
error_clear_last();
$safeResult = \oci_new_cursor($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}














function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$safeResult = \oci_new_descriptor($connection, $type);
if ($safeResult === null) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}










function oci_num_rows($statement): int
{
error_clear_last();
$safeResult = \oci_num_rows($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}
























function oci_parse($connection, string $sql)
{
error_clear_last();
$safeResult = \oci_parse($connection, $sql);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}



























































































function oci_pconnect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_pconnect($username, $password, $connection_string);
} else {
$safeResult = \oci_pconnect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}






























function oci_register_taf_callback($connection, callable $callback): void
{
error_clear_last();
$safeResult = \oci_register_taf_callback($connection, $callback);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




















function oci_result($statement, $column): string
{
error_clear_last();
$safeResult = \oci_result($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}

























function oci_rollback($connection): void
{
error_clear_last();
$safeResult = \oci_rollback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_server_version($connection): string
{
error_clear_last();
$safeResult = \oci_server_version($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}























function oci_set_action($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_action($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
$safeResult = \oci_set_call_timeout($connection, $timeout);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}



























function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
$safeResult = \oci_set_client_identifier($connection, $client_id);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





















function oci_set_client_info($connection, string $client_info): void
{
error_clear_last();
$safeResult = \oci_set_client_info($connection, $client_info);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






















function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_db_operation($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


























function oci_set_edition(string $edition): void
{
error_clear_last();
$safeResult = \oci_set_edition($edition);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}























function oci_set_module_name($connection, string $name): void
{
error_clear_last();
$safeResult = \oci_set_module_name($connection, $name);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




























function oci_set_prefetch_lob($statement, int $prefetch_lob_size): void
{
error_clear_last();
$safeResult = \oci_set_prefetch_lob($statement, $prefetch_lob_size);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























































function oci_set_prefetch($statement, int $rows): void
{
error_clear_last();
$safeResult = \oci_set_prefetch($statement, $rows);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
































































function oci_statement_type($statement): string
{
error_clear_last();
$safeResult = \oci_statement_type($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}












function oci_unregister_taf_callback($connection): void
{
error_clear_last();
$safeResult = \oci_unregister_taf_callback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PgsqlException;











function pg_cancel_query(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_cancel_query($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















































function pg_connect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_connect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_connection_reset(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_connection_reset($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






















function pg_convert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
$safeResult = \pg_convert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}




















function pg_copy_from(\PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
$safeResult = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_copy_to(\PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
$safeResult = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





































function pg_delete(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_delete($connection, $table_name, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


















function pg_end_copy(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_end_copy($connection);
} else {
$safeResult = \pg_end_copy();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





































function pg_execute(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_execute($connection, $stmtname, $params);
} elseif ($stmtname !== null) {
$safeResult = \pg_execute($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_execute($connection);
} else {
$safeResult = \pg_execute();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_num(\PgSql\Result $result, string $field): int
{
error_clear_last();
$safeResult = \pg_field_num($result, $field);
if ($safeResult === -1) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_table(\PgSql\Result $result, int $field, bool $oid_only = false)
{
error_clear_last();
$safeResult = \pg_field_table($result, $field, $oid_only);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_flush(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_flush($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}















function pg_free_result(\PgSql\Result $result): void
{
error_clear_last();
$safeResult = \pg_free_result($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_host(?\PgSql\Connection $connection = null): string
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_host($connection);
} else {
$safeResult = \pg_host();
}
if ($safeResult === '') {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}







































function pg_insert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_insert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}






























function pg_last_oid(\PgSql\Result $result): string
{
error_clear_last();
$safeResult = \pg_last_oid($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}












function pg_lo_close(\PgSql\Lob $lob): void
{
error_clear_last();
$safeResult = \pg_lo_close($lob);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















function pg_lo_export(?\PgSql\Connection $connection = null, ?int $oid = null, ?string $pathname = null): void
{
error_clear_last();
if ($pathname !== null) {
$safeResult = \pg_lo_export($connection, $oid, $pathname);
} elseif ($oid !== null) {
$safeResult = \pg_lo_export($connection, $oid);
} elseif ($connection !== null) {
$safeResult = \pg_lo_export($connection);
} else {
$safeResult = \pg_lo_export();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


























function pg_lo_import(?\PgSql\Connection $connection = null, ?string $pathname = null, $object_id = null): int
{
error_clear_last();
if ($object_id !== null) {
$safeResult = \pg_lo_import($connection, $pathname, $object_id);
} elseif ($pathname !== null) {
$safeResult = \pg_lo_import($connection, $pathname);
} elseif ($connection !== null) {
$safeResult = \pg_lo_import($connection);
} else {
$safeResult = \pg_lo_import();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





















function pg_lo_open(\PgSql\Connection $connection, int $oid, string $mode): \PgSql\Lob
{
error_clear_last();
$safeResult = \pg_lo_open($connection, $oid, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















function pg_lo_read(\PgSql\Lob $lob, int $length = 8192): string
{
error_clear_last();
$safeResult = \pg_lo_read($lob, $length);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_lo_seek(\PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
$safeResult = \pg_lo_seek($lob, $offset, $whence);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}













function pg_lo_truncate(\PgSql\Lob $lob, int $size): void
{
error_clear_last();
$safeResult = \pg_lo_truncate($lob, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


















function pg_lo_unlink(\PgSql\Connection $connection, int $oid): void
{
error_clear_last();
$safeResult = \pg_lo_unlink($connection, $oid);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}




















function pg_lo_write(\PgSql\Lob $lob, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \pg_lo_write($lob, $data, $length);
} else {
$safeResult = \pg_lo_write($lob, $data);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_meta_data(\PgSql\Connection $connection, string $table_name, bool $extended = false): array
{
error_clear_last();
$safeResult = \pg_meta_data($connection, $table_name, $extended);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}









































function pg_parameter_status(?\PgSql\Connection $connection = null, ?string $param_name = null): string
{
error_clear_last();
if ($param_name !== null) {
$safeResult = \pg_parameter_status($connection, $param_name);
} elseif ($connection !== null) {
$safeResult = \pg_parameter_status($connection);
} else {
$safeResult = \pg_parameter_status();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















































function pg_pconnect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_pconnect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_ping(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_ping($connection);
} else {
$safeResult = \pg_ping();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_prepare(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_prepare($connection, $stmtname, $query);
} elseif ($stmtname !== null) {
$safeResult = \pg_prepare($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_prepare($connection);
} else {
$safeResult = \pg_prepare();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

























function pg_put_line(?\PgSql\Connection $connection = null, ?string $data = null): void
{
error_clear_last();
if ($data !== null) {
$safeResult = \pg_put_line($connection, $data);
} elseif ($connection !== null) {
$safeResult = \pg_put_line($connection);
} else {
$safeResult = \pg_put_line();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















































function pg_query_params(?\PgSql\Connection $connection = null, ?string $query = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_query_params($connection, $query, $params);
} elseif ($query !== null) {
$safeResult = \pg_query_params($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query_params($connection);
} else {
$safeResult = \pg_query_params();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










































function pg_query(?\PgSql\Connection $connection = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_query($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query($connection);
} else {
$safeResult = \pg_query();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}































function pg_result_error_field(\PgSql\Result $result, int $field_code): ?string
{
error_clear_last();
$safeResult = \pg_result_error_field($result, $field_code);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_result_seek(\PgSql\Result $result, int $row): void
{
error_clear_last();
$safeResult = \pg_result_seek($result, $row);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}























































function pg_select(\PgSql\Connection $connection, string $table_name, array $conditions = [], int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
$safeResult = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_set_chunked_rows_size(\PgSql\Connection $connection, int $size): void
{
error_clear_last();
$safeResult = \pg_set_chunked_rows_size($connection, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}











function pg_socket(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_socket($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





























function pg_trace(string $filename, string $mode = "w", ?\PgSql\Connection $connection = null, int $trace_mode = 0): void
{
error_clear_last();
if ($trace_mode !== 0) {
$safeResult = \pg_trace($filename, $mode, $connection, $trace_mode);
} elseif ($connection !== null) {
$safeResult = \pg_trace($filename, $mode, $connection);
} else {
$safeResult = \pg_trace($filename, $mode);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_update(\PgSql\Connection $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\EioException;
















function eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_busy($delay, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chmod(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chmod($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chown(string $path, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chown($path, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_close($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_close($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_custom(callable $execute, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_custom($execute, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_dup2($fd, $fd2, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_dup2($fd, $fd2, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








function eio_event_loop(): void
{
error_clear_last();
$safeResult = \eio_event_loop();
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
}















































function eio_fallocate($fd, int $mode, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fallocate($fd, $mode, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchmod($fd, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fdatasync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fdatasync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstat($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstat($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstat($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstatvfs($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstatvfs($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstatvfs($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fsync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fsync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_ftruncate($fd, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_ftruncate($fd, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_futime($fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_futime($fd, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}



































function eio_grp(callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_grp($callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_lstat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_lstat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mkdir($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
























































function eio_mknod(string $path, int $mode, int $dev, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mknod($path, $mode, $dev, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_nop(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_nop($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_readahead($fd, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































































































































































































































































































function eio_readdir(string $path, int $flags, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readdir($path, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_readlink(string $path, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_rename(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rename($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_rmdir(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rmdir($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}

















































function eio_seek($fd, int $offset, int $whence, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_seek($fd, $offset, $whence, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_sendfile($out_fd, $in_fd, int $offset, int $length, ?int $pri = null, ?callable $callback = null, ?string $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback, $data);
} elseif ($callback !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback);
} elseif ($pri !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri);
} else {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_stat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_stat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_statvfs(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_statvfs($path, $pri, $callback, $data);
} else {
$safeResult = \eio_statvfs($path, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_symlink(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_symlink($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_sync_file_range($fd, int $offset, int $nbytes, int $flags, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync_file_range($fd, $offset, $nbytes, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












function eio_sync(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_syncfs($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_syncfs($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_truncate(string $path, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_truncate($path, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_unlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_utime(string $path, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_utime($path, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












































function eio_write($fd, string $str, int $length = 0, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_write($fd, $str, $length, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;































function socket_accept(\Socket $socket): \Socket
{
error_clear_last();
$safeResult = \socket_accept($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_bind(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_bind($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_connect(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_connect($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

















function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): array
{
error_clear_last();
if ($hints !== []) {
$safeResult = \socket_addrinfo_lookup($host, $service, $hints);
} elseif ($service !== null) {
$safeResult = \socket_addrinfo_lookup($host, $service);
} else {
$safeResult = \socket_addrinfo_lookup($host);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}









function socket_atmark(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_atmark($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_bind(\Socket $socket, string $address, int $port = 0): void
{
error_clear_last();
$safeResult = \socket_bind($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}























function socket_connect(\Socket $socket, string $address, ?int $port = null): void
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_connect($socket, $address, $port);
} else {
$safeResult = \socket_connect($socket, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_create_listen(int $port, int $backlog = SOMAXCONN): \Socket
{
error_clear_last();
$safeResult = \socket_create_listen($port, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}



























function socket_create_pair(int $domain, int $type, int $protocol, ?array &$pair): void
{
error_clear_last();
$safeResult = \socket_create_pair($domain, $type, $protocol, $pair);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

























function socket_create(int $domain, int $type, int $protocol): \Socket
{
error_clear_last();
$safeResult = \socket_create($domain, $type, $protocol);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_export_stream(\Socket $socket)
{
error_clear_last();
$safeResult = \socket_export_stream($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






































function socket_get_option(\Socket $socket, int $level, int $option)
{
error_clear_last();
$safeResult = \socket_get_option($socket, $level, $option);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

























function socket_getpeername(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getpeername($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_getsockname(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getsockname($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}










function socket_import_stream($stream): \Socket
{
error_clear_last();
$safeResult = \socket_import_stream($stream);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






























function socket_listen(\Socket $socket, int $backlog = 0): void
{
error_clear_last();
$safeResult = \socket_listen($socket, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






































function socket_read(\Socket $socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
$safeResult = \socket_read($socket, $length, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}




















































function socket_send(\Socket $socket, string $data, int $length, int $flags): int
{
error_clear_last();
$safeResult = \socket_send($socket, $data, $length, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}












function socket_sendmsg(\Socket $socket, array $message, int $flags = 0): int
{
error_clear_last();
$safeResult = \socket_sendmsg($socket, $message, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
























































function socket_sendto(\Socket $socket, string $data, int $length, int $flags, string $address, ?int $port = null): int
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address, $port);
} else {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_set_block(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_block($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

















function socket_set_nonblock(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_nonblock($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_set_option(\Socket $socket, int $level, int $option, $value): void
{
error_clear_last();
$safeResult = \socket_set_option($socket, $level, $option, $value);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}





































function socket_shutdown(\Socket $socket, int $mode = 2): void
{
error_clear_last();
$safeResult = \socket_shutdown($socket, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}













function socket_wsaprotocol_info_export(\Socket $socket, int $process_id): string
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_export($socket, $process_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_wsaprotocol_info_import(string $info_id): \Socket
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_import($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_wsaprotocol_info_release(string $info_id): void
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_release($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Bzip2Exception;









function bzclose($bz): void
{
error_clear_last();
$safeResult = \bzclose($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}












function bzflush($bz): void
{
error_clear_last();
$safeResult = \bzflush($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}














function bzopen($file, string $mode)
{
error_clear_last();
$safeResult = \bzopen($file, $mode);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}

















function bzread($bz, int $length = 1024): string
{
error_clear_last();
$safeResult = \bzread($bz, $length);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
















function bzwrite($bz, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \bzwrite($bz, $data, $length);
} else {
$safeResult = \bzwrite($bz, $data);
}
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApcuException;











function apcu_cache_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_cache_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}













function apcu_cas(string $key, int $old, int $new): void
{
error_clear_last();
$safeResult = \apcu_cas($key, $old, $new);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
}














function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_dec($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}














function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_inc($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}











function apcu_sma_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_sma_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcreException;
















function preg_grep(string $pattern, array $array, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_grep($pattern, $array, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































































































































































































































































































































function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




































































































































































































































function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




























function preg_replace_callback_array(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































function preg_replace_callback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback($pattern, $callback, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}























































function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_split($pattern, $subject, $limit, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GmpException;















function gmp_random_seed($seed): void
{
error_clear_last();
$safeResult = \gmp_random_seed($seed);
}
<?php

namespace Safe;

use Safe\Exceptions\VarException;















































function settype(&$var, string $type): void
{
error_clear_last();
$safeResult = \settype($var, $type);
if ($safeResult === false) {
throw VarException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Ssh2Exception;










function ssh2_auth_agent($session, string $username): void
{
error_clear_last();
$safeResult = \ssh2_auth_agent($session, $username);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_auth_hostbased_file($session, string $username, string $hostname, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null, ?string $local_username = null): void
{
error_clear_last();
if ($local_username !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase, $local_username);
} elseif ($passphrase !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_auth_password($session, string $username, string $password): void
{
error_clear_last();
$safeResult = \ssh2_auth_password($session, $username, $password);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_auth_pubkey_file($session, string $username, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}









































































































































































































function ssh2_connect(string $host, int $port = 22, ?array $methods = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \ssh2_connect($host, $port, $methods, $callbacks);
} elseif ($methods !== null) {
$safeResult = \ssh2_connect($host, $port, $methods);
} else {
$safeResult = \ssh2_connect($host, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_disconnect($session): void
{
error_clear_last();
$safeResult = \ssh2_disconnect($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}




















function ssh2_exec($session, string $command, ?string $pty = null, ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_exec($session, $command, $pty, $env);
} elseif ($pty !== null) {
$safeResult = \ssh2_exec($session, $command, $pty);
} else {
$safeResult = \ssh2_exec($session, $command);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_forward_accept($listener)
{
error_clear_last();
$safeResult = \ssh2_forward_accept($listener);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}













function ssh2_forward_listen($session, int $port, ?string $host = null, int $max_connections = 16)
{
error_clear_last();
if ($max_connections !== 16) {
$safeResult = \ssh2_forward_listen($session, $port, $host, $max_connections);
} elseif ($host !== null) {
$safeResult = \ssh2_forward_listen($session, $port, $host);
} else {
$safeResult = \ssh2_forward_listen($session, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}

















function ssh2_publickey_add($pkey, string $algoname, string $blob, bool $overwrite = false, ?array $attributes = null): void
{
error_clear_last();
if ($attributes !== null) {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite, $attributes);
} else {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_publickey_init($session)
{
error_clear_last();
$safeResult = \ssh2_publickey_init($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}











function ssh2_publickey_remove($pkey, string $algoname, string $blob): void
{
error_clear_last();
$safeResult = \ssh2_publickey_remove($pkey, $algoname, $blob);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_scp_recv($session, string $remote_file, string $local_file): void
{
error_clear_last();
$safeResult = \ssh2_scp_recv($session, $remote_file, $local_file);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}














function ssh2_scp_send($session, string $local_file, string $remote_file, int $create_mode = 0644): void
{
error_clear_last();
$safeResult = \ssh2_scp_send($session, $local_file, $remote_file, $create_mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_send_eof($channel): void
{
error_clear_last();
$safeResult = \ssh2_send_eof($channel);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
{
error_clear_last();
$safeResult = \ssh2_sftp_chmod($sftp, $filename, $mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool $recursive = false): void
{
error_clear_last();
$safeResult = \ssh2_sftp_mkdir($sftp, $dirname, $mode, $recursive);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}











function ssh2_sftp_rename($sftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rename($sftp, $from, $to);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp_rmdir($sftp, string $dirname): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rmdir($sftp, $dirname);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_symlink($sftp, string $target, string $link): void
{
error_clear_last();
$safeResult = \ssh2_sftp_symlink($sftp, $target, $link);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}










function ssh2_sftp_unlink($sftp, string $filename): void
{
error_clear_last();
$safeResult = \ssh2_sftp_unlink($sftp, $filename);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp($session)
{
error_clear_last();
$safeResult = \ssh2_sftp($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}




















function ssh2_shell($session, string $termtype = "vanilla", ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_shell($session, $termtype, $env);
} else {
$safeResult = \ssh2_shell($session, $termtype);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RnpException;












function rnp_decrypt(\RnpFFI $ffi, string $input): string
{
error_clear_last();
$safeResult = \rnp_decrypt($ffi, $input);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets_to_json(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets_to_json($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_ffi_create(string $pub_format, string $sec_format): \RnpFFI
{
error_clear_last();
$safeResult = \rnp_ffi_create($pub_format, $sec_format);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

























function rnp_ffi_set_pass_provider(\RnpFFI $ffi, callable $password_callback): void
{
error_clear_last();
$safeResult = \rnp_ffi_set_pass_provider($ffi, $password_callback);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_import_keys(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_keys($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_import_signatures(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_signatures($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

















function rnp_key_export_autocrypt(\RnpFFI $ffi, string $key_fp, string $subkey_fp, string $uid, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export_autocrypt($ffi, $key_fp, $subkey_fp, $uid, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_key_export_revocation(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_key_export(\RnpFFI $ffi, string $key_fp, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_key_get_info(\RnpFFI $ffi, string $key_fp): array
{
error_clear_last();
$safeResult = \rnp_key_get_info($ffi, $key_fp);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_key_remove(\RnpFFI $ffi, string $key_fp, int $flags): void
{
error_clear_last();
$safeResult = \rnp_key_remove($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_key_revoke(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}











function rnp_list_keys(\RnpFFI $ffi, string $identifier_type): array
{
error_clear_last();
$safeResult = \rnp_list_keys($ffi, $identifier_type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_load_keys_from_path(\RnpFFI $ffi, string $format, string $input_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys_from_path($ffi, $format, $input_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_load_keys(\RnpFFI $ffi, string $format, string $input, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys($ffi, $format, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}













function rnp_locate_key(\RnpFFI $ffi, string $identifier_type, string $identifier): string
{
error_clear_last();
$safeResult = \rnp_locate_key($ffi, $identifier_type, $identifier);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_encrypt(\RnpFFI $ffi, string $message, array $recipient_keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp, $options);
} else {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}


















function rnp_op_generate_key(\RnpFFI $ffi, string $userid, string $key_alg, ?string $sub_alg = null, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg, $options);
} elseif ($sub_alg !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg);
} else {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}















function rnp_op_sign_cleartext(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign_detached(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_verify_detached(\RnpFFI $ffi, string $data, string $signature): array
{
error_clear_last();
$safeResult = \rnp_op_verify_detached($ffi, $data, $signature);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_verify(\RnpFFI $ffi, string $data): array
{
error_clear_last();
$safeResult = \rnp_op_verify($ffi, $data);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_save_keys_to_path(\RnpFFI $ffi, string $format, string $output_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys_to_path($ffi, $format, $output_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_save_keys(\RnpFFI $ffi, string $format, string &$output, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys($ffi, $format, $output, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}










function rnp_supported_features(string $type): string
{
error_clear_last();
$safeResult = \rnp_supported_features($type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RpminfoException;








function rpmaddtag(int $tag): void
{
error_clear_last();
$safeResult = \rpmaddtag($tag);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}












function rpmdefine(string $text): void
{
error_clear_last();
$safeResult = \rpmdefine($text);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FpmException;









function fastcgi_finish_request(): void
{
error_clear_last();
$safeResult = \fastcgi_finish_request();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
}














function fpm_get_status(): array
{
error_clear_last();
$safeResult = \fpm_get_status();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InotifyException;


















function inotify_add_watch($inotify_instance, string $pathname, int $mask): int
{
error_clear_last();
$safeResult = \inotify_add_watch($inotify_instance, $pathname, $mask);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}










function inotify_init()
{
error_clear_last();
$safeResult = \inotify_init();
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}













function inotify_rm_watch($inotify_instance, int $watch_descriptor): void
{
error_clear_last();
$safeResult = \inotify_rm_watch($inotify_instance, $watch_descriptor);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZipException;








function zip_entry_close($zip_entry): void
{
error_clear_last();
$safeResult = \zip_entry_close($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}










function zip_entry_compressedsize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_compressedsize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}











function zip_entry_compressionmethod($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_compressionmethod($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_filesize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_filesize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_name($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_name($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
















function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
$safeResult = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}













function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
$safeResult = \zip_entry_read($zip_entry, $len);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StringsException;









function convert_uudecode(string $string): string
{
error_clear_last();
$safeResult = \convert_uudecode($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}










function hex2bin(string $string): string
{
error_clear_last();
$safeResult = \hex2bin($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
















function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \md5_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}












function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \sha1_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CalendarException;












function unixtojd(?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \unixtojd($timestamp);
} else {
$safeResult = \unixtojd();
}
if ($safeResult === false) {
throw CalendarException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcntlException;









function pcntl_getcpuaffinity(?int $pid = null)
{
error_clear_last();
if ($pid !== null) {
$safeResult = \pcntl_getcpuaffinity($pid);
} else {
$safeResult = \pcntl_getcpuaffinity();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}

















function pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_getpriority($process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_getpriority($process_id);
} else {
$safeResult = \pcntl_getpriority();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}










function pcntl_setcpuaffinity(?int $pid = null, ?array $hmask = null): void
{
error_clear_last();
if ($hmask !== null) {
$safeResult = \pcntl_setcpuaffinity($pid, $hmask);
} elseif ($pid !== null) {
$safeResult = \pcntl_setcpuaffinity($pid);
} else {
$safeResult = \pcntl_setcpuaffinity();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_setpriority($priority, $process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_setpriority($priority, $process_id);
} else {
$safeResult = \pcntl_setpriority($priority);
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}










function pcntl_signal_dispatch(): void
{
error_clear_last();
$safeResult = \pcntl_signal_dispatch();
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}















































function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
{
error_clear_last();
$safeResult = \pcntl_signal($signal, $handler, $restart_syscalls);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}






















function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
$safeResult = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
{
error_clear_last();
$safeResult = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}














































function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
$safeResult = \pcntl_sigwaitinfo($signals, $info);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\IconvException;




















function iconv_get_encoding(string $type = "all")
{
error_clear_last();
$safeResult = \iconv_get_encoding($type);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





















































function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_mime_decode($string, $mode, $encoding);
} else {
$safeResult = \iconv_mime_decode($string, $mode);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}












































































































function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string
{
error_clear_last();
$safeResult = \iconv_mime_encode($field_name, $field_value, $options);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
















function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
$safeResult = \iconv_set_encoding($type, $encoding);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
}


















function iconv_strlen(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_strlen($string, $encoding);
} else {
$safeResult = \iconv_strlen($string);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}




























function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
$safeResult = \iconv($from_encoding, $to_encoding, $string);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InfoException;















































































































function assert_options(int $option, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \assert_options($option, $value);
} else {
$safeResult = \assert_options($option);
}
return $safeResult;
}











function cli_set_process_title(string $title): void
{
error_clear_last();
$safeResult = \cli_set_process_title($title);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
























































function dl(string $extension_filename): void
{
error_clear_last();
$safeResult = \dl($extension_filename);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}


















function get_cfg_var(string $option)
{
error_clear_last();
$safeResult = \get_cfg_var($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function get_include_path(): string
{
error_clear_last();
$safeResult = \get_include_path();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getlastmod(): int
{
error_clear_last();
$safeResult = \getlastmod();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmygid(): int
{
error_clear_last();
$safeResult = \getmygid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyinode(): int
{
error_clear_last();
$safeResult = \getmyinode();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmypid(): int
{
error_clear_last();
$safeResult = \getmypid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyuid(): int
{
error_clear_last();
$safeResult = \getmyuid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
$safeResult = \getopt($short_options, $long_options, $rest_index);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getrusage(int $mode = 0): array
{
error_clear_last();
$safeResult = \getrusage($mode);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function ini_get(string $option): string
{
error_clear_last();
$safeResult = \ini_get($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}















function ini_set(string $option, string $value): string
{
error_clear_last();
$safeResult = \ini_set($option, $value);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}


















function php_sapi_name(): string
{
error_clear_last();
$safeResult = \php_sapi_name();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}







































































function phpcredits(int $flags = CREDITS_ALL): bool
{
error_clear_last();
$safeResult = \phpcredits($flags);
return $safeResult;
}






































































































function phpinfo(int $flags = INFO_ALL): bool
{
error_clear_last();
$safeResult = \phpinfo($flags);
return $safeResult;
}












function putenv(string $assignment): void
{
error_clear_last();
$safeResult = \putenv($assignment);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function set_include_path(string $include_path): string
{
error_clear_last();
$safeResult = \set_include_path($include_path);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}



















function set_time_limit(int $seconds): void
{
error_clear_last();
$safeResult = \set_time_limit($seconds);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbmDb2Exception;












































function db2_autocommit($connection, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \db2_autocommit($connection, $value);
} else {
$safeResult = \db2_autocommit($connection);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}





































function db2_bind_param($stmt, int $parameter_number, string $variable_name, int $parameter_type = DB2_PARAM_IN, int $data_type = 0, int $precision = -1, int $scale = 0): void
{
error_clear_last();
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision, $scale);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}















































































































function db2_client_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_client_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}















function db2_close($connection): void
{
error_clear_last();
$safeResult = \db2_close($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_commit($connection): void
{
error_clear_last();
$safeResult = \db2_commit($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}


























function db2_execute($stmt, array $parameters = []): void
{
error_clear_last();
$safeResult = \db2_execute($stmt, $parameters);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_result($stmt): void
{
error_clear_last();
$safeResult = \db2_free_result($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \db2_free_stmt($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
























































































































































function db2_get_option($resource, string $option): string
{
error_clear_last();
$safeResult = \db2_get_option($resource, $option);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}























function db2_num_rows($stmt): int
{
error_clear_last();
$safeResult = \db2_num_rows($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}
























function db2_pclose($connection): void
{
error_clear_last();
$safeResult = \db2_pclose($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_rollback($connection): void
{
error_clear_last();
$safeResult = \db2_rollback($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}





























































































































































































































































function db2_server_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_server_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}



























































































































































































































































































































































































function db2_set_option($resource, array $options, int $type): void
{
error_clear_last();
$safeResult = \db2_set_option($resource, $options, $type);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
<?php

return [
'apache_getenv',
'apache_get_version',
'apache_lookup_uri',
'apache_setenv',
'apcu_cache_info',
'apcu_cas',
'apcu_dec',
'apcu_fetch',
'apcu_inc',
'apcu_sma_info',
'base64_decode',
'bindtextdomain',
'bzclose',
'bzflush',
'bzopen',
'bzread',
'bzwrite',
'chdir',
'chgrp',
'chmod',
'chown',
'chroot',
'class_alias',
'class_implements',
'class_parents',
'class_uses',
'cli_set_process_title',
'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
'copy',
'cubrid_bind',
'cubrid_column_names',
'cubrid_column_types',
'cubrid_col_size',
'cubrid_commit',
'cubrid_connect',
'cubrid_connect_with_url',
'cubrid_current_oid',
'cubrid_disconnect',
'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
'cubrid_lob2_bind',
'cubrid_lob2_close',
'cubrid_lob2_export',
'cubrid_lob2_import',
'cubrid_lob2_new',
'cubrid_lob2_read',
'cubrid_lob2_seek',
'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
'cubrid_lob2_write',
'cubrid_lob_close',
'cubrid_lob_export',
'cubrid_lob_get',
'cubrid_lob_send',
'cubrid_lob_size',
'cubrid_lock_read',
'cubrid_lock_write',
'cubrid_move_cursor',
'cubrid_next_result',
'cubrid_pconnect',
'cubrid_pconnect_with_url',
'cubrid_prepare',
'cubrid_put',
'cubrid_rollback',
'cubrid_schema',
'cubrid_seq_drop',
'cubrid_seq_insert',
'cubrid_seq_put',
'cubrid_set_add',
'cubrid_set_autocommit',
'cubrid_set_db_parameter',
'cubrid_set_drop',
'cubrid_set_query_timeout',
'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
'curl_multi_info_read',
'curl_multi_setopt',
'curl_setopt',
'curl_share_setopt',
'curl_unescape',
'curl_upkeep',
'date_create',
'date_create_immutable',
'date_parse_from_format',
'date_sunrise',
'date_sunset',
'db2_autocommit',
'db2_bind_param',
'db2_client_info',
'db2_close',
'db2_commit',
'db2_execute',
'db2_free_result',
'db2_free_stmt',
'db2_get_option',
'db2_num_rows',
'db2_pclose',
'db2_rollback',
'db2_server_info',
'db2_set_option',
'define',
'deflate_add',
'deflate_init',
'dir',
'disk_free_space',
'disk_total_space',
'dl',
'dns_get_record',
'eio_busy',
'eio_chmod',
'eio_chown',
'eio_close',
'eio_custom',
'eio_dup2',
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
'eio_fsync',
'eio_ftruncate',
'eio_futime',
'eio_grp',
'eio_lstat',
'eio_mkdir',
'eio_mknod',
'eio_nop',
'eio_readahead',
'eio_readdir',
'eio_readlink',
'eio_rename',
'eio_rmdir',
'eio_seek',
'eio_sendfile',
'eio_stat',
'eio_statvfs',
'eio_symlink',
'eio_sync',
'eio_syncfs',
'eio_sync_file_range',
'eio_truncate',
'eio_unlink',
'eio_utime',
'eio_write',
'error_log',
'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
'fdatasync',
'fflush',
'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
'fileperms',
'filesize',
'filetype',
'file_get_contents',
'file_put_contents',
'filter_input_array',
'filter_var_array',
'finfo_close',
'finfo_open',
'flock',
'fopen',
'fpm_get_status',
'fputcsv',
'fread',
'fsockopen',
'fstat',
'fsync',
'ftell',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
'ftp_chdir',
'ftp_chmod',
'ftp_close',
'ftp_connect',
'ftp_delete',
'ftp_fget',
'ftp_fput',
'ftp_get',
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
'ftp_nb_get',
'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
'ftp_raw',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
'ftp_size',
'ftp_ssl_connect',
'ftp_systype',
'ftruncate',
'fwrite',
'getcwd',
'gethostname',
'getimagesize',
'getlastmod',
'getmygid',
'getmyinode',
'getmypid',
'getmyuid',
'getopt',
'getprotobyname',
'getprotobynumber',
'getrusage',
'getservbyport',
'get_cfg_var',
'get_headers',
'get_include_path',
'get_meta_tags',
'glob',
'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
'gnupg_deletekey',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
'gzcompress',
'gzdecode',
'gzdeflate',
'gzencode',
'gzfile',
'gzgets',
'gzinflate',
'gzopen',
'gzread',
'gzrewind',
'gztell',
'gzuncompress',
'gzwrite',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
'ibase_blob_create',
'ibase_blob_get',
'ibase_close',
'ibase_commit',
'ibase_commit_ret',
'ibase_connect',
'ibase_delete_user',
'ibase_drop_db',
'ibase_free_event_handler',
'ibase_free_query',
'ibase_free_result',
'ibase_maintain_db',
'ibase_modify_user',
'ibase_name_result',
'ibase_pconnect',
'ibase_restore',
'ibase_rollback',
'ibase_rollback_ret',
'ibase_service_attach',
'ibase_service_detach',
'iconv',
'iconv_get_encoding',
'iconv_mime_decode',
'iconv_mime_encode',
'iconv_set_encoding',
'iconv_strlen',
'idate',
'imageaffine',
'imageaffinematrixconcat',
'imageaffinematrixget',
'imagealphablending',
'imageantialias',
'imagearc',
'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
'imagecolorset',
'imageconvolution',
'imagecopy',
'imagecopymerge',
'imagecopymergegray',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
'imagecreatefromgd2part',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatefromstring',
'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
'imagecreatefromxpm',
'imagecreatetruecolor',
'imagecrop',
'imagecropauto',
'imagedashedline',
'imagedestroy',
'imageellipse',
'imagefill',
'imagefilledarc',
'imagefilledellipse',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
'imageftbbox',
'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
'imagegif',
'imagegrabscreen',
'imagegrabwindow',
'imagejpeg',
'imagelayereffect',
'imageline',
'imageloadfont',
'imagepng',
'imagerectangle',
'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
'imagesetbrush',
'imagesetclip',
'imagesetinterpolation',
'imagesetpixel',
'imagesetstyle',
'imagesetthickness',
'imagesettile',
'imagestring',
'imagestringup',
'imagetruecolortopalette',
'imagettfbbox',
'imagettftext',
'imagewbmp',
'imagewebp',
'imagexbm',
'image_type_to_extension',
'imap_8bit',
'imap_append',
'imap_base64',
'imap_binary',
'imap_body',
'imap_bodystruct',
'imap_check',
'imap_createmailbox',
'imap_deletemailbox',
'imap_fetchbody',
'imap_fetchheader',
'imap_fetchmime',
'imap_fetchstructure',
'imap_fetch_overview',
'imap_getacl',
'imap_getmailboxes',
'imap_getsubscribed',
'imap_headerinfo',
'imap_headers',
'imap_listscan',
'imap_lsub',
'imap_mail',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
'imap_qprint',
'imap_renamemailbox',
'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_set_quota',
'imap_sort',
'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
'imap_unsubscribe',
'imap_utf8_to_mutf7',
'inet_ntop',
'inet_pton',
'inflate_add',
'inflate_get_read_len',
'inflate_init',
'ini_get',
'ini_set',
'inotify_add_watch',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
'json_decode',
'json_encode',
'lchgrp',
'lchown',
'ldap_8859_to_t61',
'ldap_add',
'ldap_bind',
'ldap_compare',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
'ldap_explode_dn',
'ldap_first_attribute',
'ldap_first_entry',
'ldap_free_result',
'ldap_get_dn',
'ldap_get_entries',
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
'ldap_modify_batch',
'ldap_mod_add',
'ldap_mod_del',
'ldap_mod_replace',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
'ldap_rename',
'ldap_sasl_bind',
'ldap_set_option',
'ldap_unbind',
'libxml_set_external_entity_loader',
'link',
'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
'mailparse_msg_free',
'mailparse_msg_parse',
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
'mb_convert_encoding',
'mb_detect_order',
'mb_eregi_replace',
'mb_ereg_replace',
'mb_ereg_replace_callback',
'mb_ereg_search_getregs',
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
'mb_parse_str',
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
'md5_file',
'mime_content_type',
'mkdir',
'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
'msg_stat_queue',
'mysql_close',
'mysql_connect',
'mysql_create_db',
'mysql_data_seek',
'mysql_db_name',
'mysql_db_query',
'mysql_drop_db',
'mysql_fetch_lengths',
'mysql_field_flags',
'mysql_field_len',
'mysql_field_name',
'mysql_field_seek',
'mysql_free_result',
'mysql_get_host_info',
'mysql_get_proto_info',
'mysql_get_server_info',
'mysql_info',
'mysql_list_dbs',
'mysql_list_fields',
'mysql_list_processes',
'mysql_list_tables',
'mysql_num_fields',
'mysql_num_rows',
'mysql_query',
'mysql_real_escape_string',
'mysql_result',
'mysql_select_db',
'mysql_set_charset',
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
'net_get_interfaces',
'ob_clean',
'ob_end_clean',
'ob_end_flush',
'ob_flush',
'ob_get_clean',
'ob_get_flush',
'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
'oci_field_size',
'oci_field_type',
'oci_field_type_raw',
'oci_free_descriptor',
'oci_free_statement',
'oci_new_collection',
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
'oci_set_action',
'oci_set_call_timeout',
'oci_set_client_identifier',
'oci_set_client_info',
'oci_set_db_operation',
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
'oci_set_prefetch_lob',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
'odbc_commit',
'odbc_connect',
'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
'odbc_fetch_into',
'odbc_field_len',
'odbc_field_name',
'odbc_field_num',
'odbc_field_scale',
'odbc_field_type',
'odbc_num_fields',
'odbc_pconnect',
'odbc_prepare',
'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
'odbc_setoption',
'odbc_tables',
'opcache_compile_file',
'opcache_get_status',
'opendir',
'openssl_cipher_iv_length',
'openssl_cipher_key_length',
'openssl_cms_decrypt',
'openssl_cms_encrypt',
'openssl_cms_read',
'openssl_cms_sign',
'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
'openssl_decrypt',
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt',
'openssl_pkcs7_read',
'openssl_pkcs7_sign',
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_details',
'openssl_pkey_get_private',
'openssl_pkey_get_public',
'openssl_pkey_new',
'openssl_private_decrypt',
'openssl_private_encrypt',
'openssl_public_decrypt',
'openssl_public_encrypt',
'openssl_seal',
'openssl_sign',
'openssl_spki_export',
'openssl_spki_export_challenge',
'openssl_spki_new',
'openssl_spki_verify',
'openssl_verify',
'openssl_x509_checkpurpose',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
'openssl_x509_read',
'output_add_rewrite_var',
'output_reset_rewrite_vars',
'parse_ini_file',
'parse_ini_string',
'parse_url',
'passthru',
'pclose',
'pcntl_getcpuaffinity',
'pcntl_getpriority',
'pcntl_setcpuaffinity',
'pcntl_setpriority',
'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
'pcntl_sigtimedwait',
'pcntl_sigwaitinfo',
'pfsockopen',
'pg_cancel_query',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
'pg_delete',
'pg_end_copy',
'pg_execute',
'pg_field_num',
'pg_field_table',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
'pg_prepare',
'pg_put_line',
'pg_query',
'pg_query_params',
'pg_result_error_field',
'pg_result_seek',
'pg_select',
'pg_set_chunked_rows_size',
'pg_socket',
'pg_trace',
'pg_update',
'php_sapi_name',
'popen',
'posix_access',
'posix_eaccess',
'posix_getgrgid',
'posix_getgrnam',
'posix_getgroups',
'posix_getlogin',
'posix_getpgid',
'posix_getpwuid',
'posix_getrlimit',
'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
'posix_mknod',
'posix_setegid',
'posix_seteuid',
'posix_setgid',
'posix_setpgid',
'posix_setrlimit',
'posix_setsid',
'posix_setuid',
'posix_times',
'posix_uname',
'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_replace_callback',
'preg_replace_callback_array',
'preg_split',
'proc_close',
'proc_nice',
'proc_open',
'pspell_add_to_personal',
'pspell_add_to_session',
'pspell_clear_session',
'pspell_config_data_dir',
'pspell_config_dict_dir',
'pspell_config_ignore',
'pspell_config_mode',
'pspell_config_personal',
'pspell_config_repl',
'pspell_config_runtogether',
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
'ps_add_locallink',
'ps_add_note',
'ps_add_pdflink',
'ps_add_weblink',
'ps_arc',
'ps_arcn',
'ps_begin_page',
'ps_begin_pattern',
'ps_begin_template',
'ps_circle',
'ps_clip',
'ps_close',
'ps_closepath',
'ps_closepath_stroke',
'ps_close_image',
'ps_continue_text',
'ps_curveto',
'ps_delete',
'ps_end_page',
'ps_end_pattern',
'ps_end_template',
'ps_fill',
'ps_fill_stroke',
'ps_get_parameter',
'ps_hyphenate',
'ps_include_file',
'ps_lineto',
'ps_moveto',
'ps_new',
'ps_open_file',
'ps_place_image',
'ps_rect',
'ps_restore',
'ps_rotate',
'ps_save',
'ps_scale',
'ps_setcolor',
'ps_setdash',
'ps_setflat',
'ps_setfont',
'ps_setgray',
'ps_setlinecap',
'ps_setlinejoin',
'ps_setlinewidth',
'ps_setmiterlimit',
'ps_setoverprintmode',
'ps_setpolydash',
'ps_set_border_color',
'ps_set_border_dash',
'ps_set_border_style',
'ps_set_info',
'ps_set_parameter',
'ps_set_text_pos',
'ps_set_value',
'ps_shading',
'ps_shading_pattern',
'ps_shfill',
'ps_show',
'ps_show2',
'ps_show_xy',
'ps_show_xy2',
'ps_stroke',
'ps_symbol',
'ps_translate',
'putenv',
'readfile',
'readgzfile',
'readline_completion_function',
'readline_read_history',
'readline_write_history',
'readlink',
'realpath',
'register_tick_function',
'rename',
'rewind',
'rmdir',
'rnp_decrypt',
'rnp_dump_packets',
'rnp_dump_packets_to_json',
'rnp_ffi_create',
'rnp_ffi_set_pass_provider',
'rnp_import_keys',
'rnp_import_signatures',
'rnp_key_export',
'rnp_key_export_autocrypt',
'rnp_key_export_revocation',
'rnp_key_get_info',
'rnp_key_remove',
'rnp_key_revoke',
'rnp_list_keys',
'rnp_load_keys',
'rnp_load_keys_from_path',
'rnp_locate_key',
'rnp_op_encrypt',
'rnp_op_generate_key',
'rnp_op_sign',
'rnp_op_sign_cleartext',
'rnp_op_sign_detached',
'rnp_op_verify',
'rnp_op_verify_detached',
'rnp_save_keys',
'rnp_save_keys_to_path',
'rnp_supported_features',
'rpmaddtag',
'rpmdefine',
'rrd_create',
'rrd_first',
'rrd_graph',
'rrd_info',
'rrd_lastupdate',
'rrd_restore',
'rrd_tune',
'rrd_update',
'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
'sem_get',
'sem_release',
'sem_remove',
'session_abort',
'session_create_id',
'session_decode',
'session_destroy',
'session_encode',
'session_id',
'session_module_name',
'session_name',
'session_regenerate_id',
'session_reset',
'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
'shell_exec',
'shmop_delete',
'shm_attach',
'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
'simplexml_import_dom',
'simplexml_load_file',
'simplexml_load_string',
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
'socket_addrinfo_lookup',
'socket_atmark',
'socket_bind',
'socket_connect',
'socket_create',
'socket_create_listen',
'socket_create_pair',
'socket_export_stream',
'socket_getpeername',
'socket_getsockname',
'socket_get_option',
'socket_import_stream',
'socket_listen',
'socket_read',
'socket_send',
'socket_sendmsg',
'socket_sendto',
'socket_set_block',
'socket_set_nonblock',
'socket_set_option',
'socket_shutdown',
'socket_write',
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
'sodium_crypto_aead_aegis128l_decrypt',
'sodium_crypto_aead_aegis256_decrypt',
'sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify',
'sodium_crypto_box_open',
'sodium_crypto_box_seal_open',
'sodium_crypto_secretbox_open',
'sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version',
'spl_autoload_register',
'spl_autoload_unregister',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
'sqlsrv_close',
'sqlsrv_commit',
'sqlsrv_configure',
'sqlsrv_execute',
'sqlsrv_fetch',
'sqlsrv_fetch_array',
'sqlsrv_fetch_object',
'sqlsrv_free_stmt',
'sqlsrv_get_field',
'sqlsrv_next_result',
'sqlsrv_num_fields',
'sqlsrv_num_rows',
'sqlsrv_prepare',
'sqlsrv_query',
'sqlsrv_rollback',
'ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent',
'ssh2_auth_hostbased_file',
'ssh2_auth_password',
'ssh2_auth_pubkey_file',
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
'ssh2_forward_accept',
'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
'ssh2_sftp_rename',
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
'ssh2_shell',
'stream_context_set_options',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
'stream_filter_prepend',
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
'stream_socket_get_name',
'stream_socket_pair',
'stream_socket_recvfrom',
'stream_socket_sendto',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
'strftime',
'strptime',
'strtotime',
'swoole_async_dns_lookup',
'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
'swoole_event_del',
'swoole_event_write',
'symlink',
'system',
'sys_getloadavg',
'tempnam',
'timezone_name_from_abbr',
'time_nanosleep',
'time_sleep_until',
'tmpfile',
'touch',
'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
'variant_date_to_timestamp',
'variant_round',
'virtual',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
'xdiff_file_diff_binary',
'xdiff_file_patch_binary',
'xdiff_file_rabdiff',
'xdiff_string_bpatch',
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
'xml_parser_free',
'xml_parser_set_option',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
'yaz_ccl_parse',
'yaz_close',
'yaz_connect',
'yaz_database',
'yaz_element',
'yaz_present',
'yaz_search',
'yaz_wait',
'zip_entry_close',
'zip_entry_compressedsize',
'zip_entry_compressionmethod',
'zip_entry_filesize',
'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
];
<?php

namespace Safe;

use Safe\Exceptions\FileinfoException;








function finfo_close(\finfo $finfo): void
{
error_clear_last();
$safeResult = \finfo_close($finfo);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
}
























function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): \finfo
{
error_clear_last();
if ($magic_database !== null) {
$safeResult = \finfo_open($flags, $magic_database);
} else {
$safeResult = \finfo_open($flags);
}
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}












function mime_content_type($filename): string
{
error_clear_last();
$safeResult = \mime_content_type($filename);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/com.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/com.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/com.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/com.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/com.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ftp.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ftp.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ftp.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ftp.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ftp.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/json.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/json.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/json.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/json.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/json.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/apache.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/apache.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/apache.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/apache.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/apache.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/hash.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/hash.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/hash.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/hash.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/hash.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/swoole.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/swoole.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/swoole.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/swoole.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/swoole.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/sodium.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/sodium.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/sodium.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/sodium.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/sodium.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/pspell.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/pspell.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/pspell.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/pspell.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/pspell.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/mysqli.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/mysqli.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/mysqli.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/mysqli.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/mysqli.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/outcontrol.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/outcontrol.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/outcontrol.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/outcontrol.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/outcontrol.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/opcache.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/opcache.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/opcache.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/opcache.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/opcache.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/mysql.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/mysql.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/mysql.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/mysql.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/mysql.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/rrd.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/rrd.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/rrd.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/rrd.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/rrd.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/errorfunc.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/errorfunc.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/errorfunc.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/errorfunc.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/errorfunc.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ibase.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ibase.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ibase.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ibase.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ibase.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/uopz.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/uopz.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/uopz.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/uopz.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/uopz.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/mbstring.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/mbstring.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/mbstring.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/mbstring.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/mbstring.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/gnupg.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/gnupg.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/gnupg.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/gnupg.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/gnupg.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/xml.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/xml.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/xml.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/xml.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/xml.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/sem.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/sem.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/sem.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/sem.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/sem.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/spl.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/spl.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/spl.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/spl.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/spl.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/xdiff.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/xdiff.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/xdiff.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/xdiff.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/xdiff.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/yaml.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/yaml.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/yaml.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/yaml.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/yaml.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/solr.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/solr.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/solr.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/solr.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/solr.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/datetime.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/datetime.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/datetime.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/datetime.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/datetime.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/imap.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/imap.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/imap.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/imap.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/imap.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/network.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/network.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/network.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/network.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/network.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/url.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/url.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/url.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/url.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/url.php';
}
<?php

namespace Safe;

use Safe\Exceptions\OpensslException;









function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_iv_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_cipher_key_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_key_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
} elseif ($private_key !== null) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_cms_read(string $input_filename, array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_cms_read($input_filename, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates = null, array $ca_info = [], ?string $untrusted_certificates_filename = null, ?string $content = null, ?string $pk7 = null, ?string $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
} elseif ($sigfile !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
} elseif ($pk7 !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
} elseif ($content !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
} elseif ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
} elseif ($ca_info !== []) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
} elseif ($certificates !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates);
} else {
$safeResult = \openssl_cms_verify($input_filename, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export($csr, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}












function openssl_csr_get_public_key($csr, bool $short_names = true): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_csr_get_public_key($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
$safeResult = \openssl_csr_get_subject($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}



















































































































function openssl_csr_new(array $distinguished_names, ?\OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null)
{
error_clear_last();
if ($extra_attributes !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
} elseif ($options !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
$safeResult = \openssl_csr_new($distinguished_names, $private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


























function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, ?array $options = null, int $serial = 0, ?string $serial_hex = null): \OpenSSLCertificate
{
error_clear_last();
if ($serial_hex !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial, $serial_hex);
} elseif ($serial !== 0) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
} elseif ($options !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
























function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, string $aad = ""): string
{
error_clear_last();
if ($aad !== "") {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
} elseif ($tag !== null) {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag);
} else {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}













function openssl_dh_compute_key(string $public_key, \OpenSSLAsymmetricKey $private_key): string
{
error_clear_last();
$safeResult = \openssl_dh_compute_key($public_key, $private_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_digest($data, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















































function openssl_get_curve_names(): array
{
error_clear_last();
$safeResult = \openssl_get_curve_names();
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





























function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, ?string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
$safeResult = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




































function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




































function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}













function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
if ($private_key !== null) {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_read($data, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


























function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
{
error_clear_last();
$safeResult = \openssl_pkey_derive($public_key, $private_key, $key_length);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


















function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase);
} else {
$safeResult = \openssl_pkey_export($key, $output);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




















function openssl_pkey_get_details(\OpenSSLAsymmetricKey $key): array
{
error_clear_last();
$safeResult = \openssl_pkey_get_details($key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_private($private_key, ?string $passphrase = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \openssl_pkey_get_private($private_key, $passphrase);
} else {
$safeResult = \openssl_pkey_get_private($private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_public($public_key): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_pkey_get_public($public_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_pkey_new(?array $options = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_new($options);
} else {
$safeResult = \openssl_pkey_new();
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






















function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null)
{
error_clear_last();
$safeResult = \openssl_random_pseudo_bytes($length, $strong_result);
return $safeResult;
}


































function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
$safeResult = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
{
error_clear_last();
$safeResult = \openssl_sign($data, $signature, $private_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_spki_export_challenge(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export_challenge($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_spki_export(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_spki_new(\OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
{
error_clear_last();
$safeResult = \openssl_spki_new($private_key, $challenge, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}









function openssl_spki_verify(string $spki): void
{
error_clear_last();
$safeResult = \openssl_spki_verify($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
$safeResult = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}































































function openssl_x509_checkpurpose($certificate, int $purpose, array $ca_info = [], ?string $untrusted_certificates_file = null)
{
error_clear_last();
if ($untrusted_certificates_file !== null) {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info, $untrusted_certificates_file);
} else {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info);
}
if ($safeResult === -1) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

















function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export($certificate, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}












function openssl_x509_read($certificate): \OpenSSLCertificate
{
error_clear_last();
$safeResult = \openssl_x509_read($certificate);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ExecException;





























function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \exec($command, $output, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}





















function passthru(string $command, ?int &$result_code = null): void
{
error_clear_last();
$safeResult = \passthru($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}


















function proc_close($process): int
{
error_clear_last();
$safeResult = \proc_close($process);
if ($safeResult === -1) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}






















function proc_nice(int $priority): void
{
error_clear_last();
$safeResult = \proc_nice($priority);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}

















































































function proc_open(string $command, array $descriptor_spec, ?array &$pipes, ?string $cwd = null, ?array $env_vars = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars, $options);
} elseif ($env_vars !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars);
} elseif ($cwd !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd);
} else {
$safeResult = \proc_open($command, $descriptor_spec, $pipes);
}
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}










function shell_exec(string $command): ?string
{
error_clear_last();
$safeResult = \shell_exec($command);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}























function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \system($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LibxmlException;














































function libxml_set_external_entity_loader(callable $resolver_function): void
{
error_clear_last();
$safeResult = \libxml_set_external_entity_loader($resolver_function);
if ($safeResult === false) {
throw LibxmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ClassobjException;













function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
$safeResult = \class_alias($class, $alias, $autoload);
if ($safeResult === false) {
throw ClassobjException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SsdeepException;













function ssdeep_fuzzy_compare(string $signature1, string $signature2): int
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_compare($signature1, $signature2);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}













function ssdeep_fuzzy_hash_filename(string $file_name): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash_filename($file_name);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}












function ssdeep_fuzzy_hash(string $to_hash): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash($to_hash);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PsException;






















function ps_add_launchlink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename): void
{
error_clear_last();
$safeResult = \ps_add_launchlink($psdoc, $llx, $lly, $urx, $ury, $filename);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}






























function ps_add_locallink($psdoc, float $llx, float $lly, float $urx, float $ury, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_locallink($psdoc, $llx, $lly, $urx, $ury, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}































function ps_add_note($psdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
{
error_clear_last();
$safeResult = \ps_add_note($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































function ps_add_pdflink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_pdflink($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

























function ps_add_weblink($psdoc, float $llx, float $lly, float $urx, float $ury, string $url): void
{
error_clear_last();
$safeResult = \ps_add_weblink($psdoc, $llx, $lly, $urx, $ury, $url);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arc($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arc($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arcn($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arcn($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











































function ps_begin_page($psdoc, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_begin_page($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_begin_pattern($psdoc, float $width, float $height, float $xstep, float $ystep, int $painttype): int
{
error_clear_last();
$safeResult = \ps_begin_pattern($psdoc, $width, $height, $xstep, $ystep, $painttype);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}


















function ps_begin_template($psdoc, float $width, float $height): int
{
error_clear_last();
$safeResult = \ps_begin_template($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




















function ps_circle($psdoc, float $x, float $y, float $radius): void
{
error_clear_last();
$safeResult = \ps_circle($psdoc, $x, $y, $radius);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_clip($psdoc): void
{
error_clear_last();
$safeResult = \ps_clip($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_close_image($psdoc, int $imageid): void
{
error_clear_last();
$safeResult = \ps_close_image($psdoc, $imageid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_close($psdoc): void
{
error_clear_last();
$safeResult = \ps_close($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_continue_text($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_continue_text($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_curveto($psdoc, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
{
error_clear_last();
$safeResult = \ps_curveto($psdoc, $x1, $y1, $x2, $y2, $x3, $y3);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_delete($psdoc): void
{
error_clear_last();
$safeResult = \ps_delete($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_end_page($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_page($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_end_pattern($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_pattern($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_end_template($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_template($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































































































































function ps_get_parameter($psdoc, string $name, ?float $modifier = null): string
{
error_clear_last();
if ($modifier !== null) {
$safeResult = \ps_get_parameter($psdoc, $name, $modifier);
} else {
$safeResult = \ps_get_parameter($psdoc, $name);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}























function ps_hyphenate($psdoc, string $text): array
{
error_clear_last();
$safeResult = \ps_hyphenate($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}













function ps_include_file($psdoc, string $file): void
{
error_clear_last();
$safeResult = \ps_include_file($psdoc, $file);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_lineto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_lineto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_moveto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_moveto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_new()
{
error_clear_last();
$safeResult = \ps_new();
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}














function ps_open_file($psdoc, ?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \ps_open_file($psdoc, $filename);
} else {
$safeResult = \ps_open_file($psdoc);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}




















function ps_place_image($psdoc, int $imageid, float $x, float $y, float $scale): void
{
error_clear_last();
$safeResult = \ps_place_image($psdoc, $imageid, $x, $y, $scale);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_rect($psdoc, float $x, float $y, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_rect($psdoc, $x, $y, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_restore($psdoc): void
{
error_clear_last();
$safeResult = \ps_restore($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_rotate($psdoc, float $rot): void
{
error_clear_last();
$safeResult = \ps_rotate($psdoc, $rot);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_save($psdoc): void
{
error_clear_last();
$safeResult = \ps_save($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_scale($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_scale($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_color($psdoc, float $red, float $green, float $blue): void
{
error_clear_last();
$safeResult = \ps_set_border_color($psdoc, $red, $green, $blue);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_dash($psdoc, float $black, float $white): void
{
error_clear_last();
$safeResult = \ps_set_border_dash($psdoc, $black, $white);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_style($psdoc, string $style, float $width): void
{
error_clear_last();
$safeResult = \ps_set_border_style($psdoc, $style, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}







































function ps_set_info($p, string $key, string $val): void
{
error_clear_last();
$safeResult = \ps_set_info($p, $key, $val);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_set_parameter($psdoc, string $name, string $value): void
{
error_clear_last();
$safeResult = \ps_set_parameter($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_set_text_pos($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_set_text_pos($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

































































function ps_set_value($psdoc, string $name, float $value): void
{
error_clear_last();
$safeResult = \ps_set_value($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



























function ps_setcolor($psdoc, string $type, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
{
error_clear_last();
$safeResult = \ps_setcolor($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_setdash($psdoc, float $on, float $off): void
{
error_clear_last();
$safeResult = \ps_setdash($psdoc, $on, $off);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setflat($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setflat($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setfont($psdoc, int $fontid, float $size): void
{
error_clear_last();
$safeResult = \ps_setfont($psdoc, $fontid, $size);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setgray($psdoc, float $gray): void
{
error_clear_last();
$safeResult = \ps_setgray($psdoc, $gray);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinecap($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinecap($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinejoin($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinejoin($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setlinewidth($psdoc, float $width): void
{
error_clear_last();
$safeResult = \ps_setlinewidth($psdoc, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_setmiterlimit($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setmiterlimit($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setoverprintmode($psdoc, int $mode): void
{
error_clear_last();
$safeResult = \ps_setoverprintmode($psdoc, $mode);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setpolydash($psdoc, float $arr): void
{
error_clear_last();
$safeResult = \ps_setpolydash($psdoc, $arr);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_shading_pattern($psdoc, int $shadingid, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading_pattern($psdoc, $shadingid, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




































function ps_shading($psdoc, string $type, float $x0, float $y0, float $x1, float $y1, float $c1, float $c2, float $c3, float $c4, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}















function ps_shfill($psdoc, int $shadingid): void
{
error_clear_last();
$safeResult = \ps_shfill($psdoc, $shadingid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_show_xy($psdoc, string $text, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_show_xy($psdoc, $text, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_show_xy2($psdoc, string $text, int $len, float $xcoor, float $ycoor): void
{
error_clear_last();
$safeResult = \ps_show_xy2($psdoc, $text, $len, $xcoor, $ycoor);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_show($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_show($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_show2($psdoc, string $text, int $len): void
{
error_clear_last();
$safeResult = \ps_show2($psdoc, $text, $len);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_symbol($psdoc, int $ord): void
{
error_clear_last();
$safeResult = \ps_symbol($psdoc, $ord);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_translate($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_translate($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\YazException;












































function yaz_ccl_parse($id, string $query, ?array &$result): void
{
error_clear_last();
$safeResult = \yaz_ccl_parse($id, $query, $result);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}









function yaz_close($id): void
{
error_clear_last();
$safeResult = \yaz_close($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}

































































































































































































function yaz_connect(string $zurl, $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \yaz_connect($zurl, $options);
} else {
$safeResult = \yaz_connect($zurl);
}
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}














function yaz_database($id, string $databases): void
{
error_clear_last();
$safeResult = \yaz_database($id, $databases);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}















function yaz_element($id, string $elementset): void
{
error_clear_last();
$safeResult = \yaz_element($id, $elementset);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












function yaz_present($id): void
{
error_clear_last();
$safeResult = \yaz_present($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}
































function yaz_search($id, string $type, string $query): void
{
error_clear_last();
$safeResult = \yaz_search($id, $type, $query);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












































function yaz_wait(?array &$options = null)
{
error_clear_last();
$safeResult = \yaz_wait($options);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CurlException;










function curl_copy_handle(\CurlHandle $handle): \CurlHandle
{
error_clear_last();
$safeResult = \curl_copy_handle($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}












function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_escape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_exec(\CurlHandle $handle)
{
error_clear_last();
$safeResult = \curl_exec($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}






























































































































































function curl_getinfo(\CurlHandle $handle, ?int $option = null)
{
error_clear_last();
if ($option !== null) {
$safeResult = \curl_getinfo($handle, $option);
} else {
$safeResult = \curl_getinfo($handle);
}
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}















function curl_init(?string $url = null): \CurlHandle
{
error_clear_last();
if ($url !== null) {
$safeResult = \curl_init($url);
} else {
$safeResult = \curl_init();
}
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}















































function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
$safeResult = \curl_multi_info_read($multi_handle, $queued_messages);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
return $safeResult;
}








function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$safeResult = \curl_multi_init();
return $safeResult;
}















function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_multi_setopt($multi_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
}















function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_setopt($handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}










function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
$safeResult = \curl_share_errno($share_handle);
return $safeResult;
}












function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_share_setopt($share_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
}












function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_unescape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_upkeep(\CurlHandle $handle): void
{
error_clear_last();
$safeResult = \curl_upkeep($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}
<?php

namespace Safe;

use Safe\Exceptions\SessionException;








function session_abort(): void
{
error_clear_last();
$safeResult = \session_abort();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


























function session_create_id(string $prefix = ""): string
{
error_clear_last();
$safeResult = \session_create_id($prefix);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}














function session_decode(string $data): void
{
error_clear_last();
$safeResult = \session_decode($data);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


















function session_destroy(): void
{
error_clear_last();
$safeResult = \session_destroy();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}













function session_encode(): string
{
error_clear_last();
$safeResult = \session_encode();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
























function session_id(?string $id = null): string
{
error_clear_last();
if ($id !== null) {
$safeResult = \session_id($id);
} else {
$safeResult = \session_id();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
















function session_module_name(?string $module = null): string
{
error_clear_last();
if ($module !== null) {
$safeResult = \session_module_name($module);
} else {
$safeResult = \session_module_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}












































function session_name(?string $name = null): string
{
error_clear_last();
if ($name !== null) {
$safeResult = \session_name($name);
} else {
$safeResult = \session_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}

















function session_regenerate_id(bool $delete_old_session = false): void
{
error_clear_last();
$safeResult = \session_regenerate_id($delete_old_session);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}










function session_reset(): void
{
error_clear_last();
$safeResult = \session_reset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}























function session_save_path(?string $path = null): string
{
error_clear_last();
if ($path !== null) {
$safeResult = \session_save_path($path);
} else {
$safeResult = \session_save_path();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}









function session_unset(): void
{
error_clear_last();
$safeResult = \session_unset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
















function session_write_close(): void
{
error_clear_last();
$safeResult = \session_write_close();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FunchandException;









function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \register_tick_function($callback, ...$args);
} else {
$safeResult = \register_tick_function($callback);
}
if ($safeResult === false) {
throw FunchandException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZlibException;



















function deflate_add(\DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \deflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























































































function deflate_init(int $encoding, array $options = []): \DeflateContext
{
error_clear_last();
$safeResult = \deflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function gzclose($stream): void
{
error_clear_last();
$safeResult = \gzclose($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}




















function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string
{
error_clear_last();
$safeResult = \gzcompress($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzdecode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}



















function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string
{
error_clear_last();
$safeResult = \gzdeflate($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

























function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
$safeResult = \gzencode($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzfile(string $filename, int $use_include_path = 0): array
{
error_clear_last();
$safeResult = \gzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}














function gzgets($stream, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzgets($stream, $length);
} else {
$safeResult = \gzgets($stream);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzinflate($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























function gzopen(string $filename, string $mode, int $use_include_path = 0)
{
error_clear_last();
$safeResult = \gzopen($filename, $mode, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzpassthru($stream)
{
error_clear_last();
$safeResult = \gzpassthru($stream);
return $safeResult;
}















function gzread($stream, int $length): string
{
error_clear_last();
$safeResult = \gzread($stream, $length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function gzrewind($stream): void
{
error_clear_last();
$safeResult = \gzrewind($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}












function gztell($stream): int
{
error_clear_last();
$safeResult = \gztell($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzuncompress(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzuncompress($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}


















function gzwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzwrite($stream, $data, $length);
} else {
$safeResult = \gzwrite($stream, $data);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_read_len(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_read_len($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









function inflate_get_status(\InflateContext $context)
{
error_clear_last();
$safeResult = \inflate_get_status($context);
return $safeResult;
}























function inflate_add(\InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \inflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









































































function inflate_init(int $encoding, array $options = []): \InflateContext
{
error_clear_last();
$safeResult = \inflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

















function readgzfile(string $filename, int $use_include_path = 0): int
{
error_clear_last();
$safeResult = \readgzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \zlib_decode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MiscException;

























function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
$safeResult = \define($constant_name, $value, $case_insensitive);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}






















function highlight_file(string $filename, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_file($filename, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}













function highlight_string(string $string, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_string($string, $return);
return $safeResult;
}















function hrtime(bool $as_number = false)
{
error_clear_last();
$safeResult = \hrtime($as_number);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}


/**
 * Pack given arguments into a binary string according to
 * format.
 *
 * The idea for this function was taken from Perl and all formatting codes
 * work the same as in Perl. However, there are some formatting codes that are
 * missing such as Perl's "u" format code.
 *
 * Note that the distinction between signed and unsigned values only
 * affects the function unpack, where as
 * function pack gives the same result for
 * signed and unsigned format codes.
 *
 * @param string $format The format string consists of format codes
 * followed by an optional repeater argument. The repeater argument can
 * be either an integer value or * for repeating to
 * the end of the input data. For a, A, h, H the repeat count specifies
 * how many characters of one data argument are taken, for @ it is the
 * absolute position where to put the next data, for everything else the
 * repeat count specifies how many data arguments are consumed and packed
 * into the resulting binary string.
 *
 * Currently implemented formats are:
 *
 * pack format characters
 *
 *
 *
 * Code
 * Description
 *
 *
 *
 *
 * a
 * NUL-padded string
 *
 *
 * A
 * SPACE-padded string
 *
 * h
 * Hex string, low nibble first
 *
 * H
 * Hex string, high nibble first
 * csigned char
 *
 * C
 * unsigned char
 *
 * s
 * signed short (always 16 bit, machine byte order)
 *
 *
 * S
 * unsigned short (always 16 bit, machine byte order)
 *
 *
 * n
 * unsigned short (always 16 bit, big endian byte order)
 *
 *
 * v
 * unsigned short (always 16 bit, little endian byte order)
 *
 *
 * i
 * signed integer (machine dependent size and byte order)
 *
 *
 * I
 * unsigned integer (machine dependent size and byte order)
 *
 *
 * l
 * signed long (always 32 bit, machine byte order)
 *
 *
 * L
 * unsigned long (always 32 bit, machine byte order)
 *
 *
 * N
 * unsigned long (always 32 bit, big endian byte order)
 *
 *
 * V
 * unsigned long (always 32 bit, little endian byte order)
 *
 *
 * q
 * signed long long (always 64 bit, machine byte order)
 *
 *
 * Q
 * unsigned long long (always 64 bit, machine byte order)
 *
 *
 * J
 * unsigned long long (always 64 bit, big endian byte order)
 *
 *
 * P
 * unsigned long long (always 64 bit, little endian byte order)
 *
 *
 * f
 * float (machine dependent size and representation)
 *
 *
 * g
 * float (machine dependent size, little endian byte order)
 *
 *
 * G
 * float (machine dependent size, big endian byte order)
 *
 *
 * d
 * double (machine dependent size and representation)
 *
 *
 * e
 * double (machine dependent size, little endian byte order)
 *
 *
 * E
 * double (machine dependent size, big endian byte order)
 *
 *
 * x
 * NUL byte
 *
 *
 * X
 * Back up one byte
 *
 *
 * Z
 * NUL-padded string
 *
 *
 * @
 * NUL-fill to absolute position
 *
 *
 *
 *
 * @param mixed $values
 * @return string Returns a binary string containing data.
 *
 */
function pack(string $format, ...$values): string
{
error_clear_last();
if ($values !== []) {
$safeResult = \pack($format, ...$values);
} else {
$safeResult = \pack($format);
}
return $safeResult;
}















function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): string
{
error_clear_last();
$safeResult = \sapi_windows_cp_conv($in_codepage, $out_codepage, $subject);
if ($safeResult === null) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}









function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
$safeResult = \sapi_windows_cp_set($codepage);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}













function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
{
error_clear_last();
$safeResult = \sapi_windows_generate_ctrl_event($event, $pid);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}




















































function sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): void
{
error_clear_last();
$safeResult = \sapi_windows_set_ctrl_handler($handler, $add);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}


















function sapi_windows_vt100_support($stream, ?bool $enable = null): void
{
error_clear_last();
if ($enable !== null) {
$safeResult = \sapi_windows_vt100_support($stream, $enable);
} else {
$safeResult = \sapi_windows_vt100_support($stream);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}
















function sleep(int $seconds)
{
error_clear_last();
$safeResult = \sleep($seconds);
return $safeResult;
}





























function time_nanosleep(int $seconds, int $nanoseconds)
{
error_clear_last();
$safeResult = \time_nanosleep($seconds, $nanoseconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}










function time_sleep_until(float $timestamp): void
{
error_clear_last();
$safeResult = \time_sleep_until($timestamp);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}



































function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
$safeResult = \unpack($format, $string, $offset);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CubridException;

























































































































function cubrid_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
{
error_clear_last();
$safeResult = \cubrid_col_size($conn_identifier, $oid, $attr_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_names($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_names($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_types($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_types($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}


















function cubrid_commit($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_commit($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














































































function cubrid_connect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_connect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



























function cubrid_connect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_connect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_current_oid($req_identifier): string
{
error_clear_last();
$safeResult = \cubrid_current_oid($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_disconnect($conn_identifier = null): void
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_disconnect($conn_identifier);
} else {
$safeResult = \cubrid_disconnect();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_drop($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_drop($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_free_result($req_identifier): void
{
error_clear_last();
$safeResult = \cubrid_free_result($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_get_charset($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_charset($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_get_class_name($conn_identifier, string $oid): string
{
error_clear_last();
$safeResult = \cubrid_get_class_name($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}









function cubrid_get_client_info(): string
{
error_clear_last();
$safeResult = \cubrid_get_client_info();
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















































































































function cubrid_get_db_parameter($conn_identifier): array
{
error_clear_last();
$safeResult = \cubrid_get_db_parameter($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_get_query_timeout($req_identifier): int
{
error_clear_last();
$safeResult = \cubrid_get_query_timeout($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_get_server_info($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_server_info($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















function cubrid_insert_id($conn_identifier = null): string
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_insert_id($conn_identifier);
} else {
$safeResult = \cubrid_insert_id();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob_close(array $lob_identifier_array): void
{
error_clear_last();
$safeResult = \cubrid_lob_close($lob_identifier_array);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
{
error_clear_last();
$safeResult = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob_get($conn_identifier, string $sql): array
{
error_clear_last();
$safeResult = \cubrid_lob_get($conn_identifier, $sql);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_lob_send($conn_identifier, $lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob_send($conn_identifier, $lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob_size($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}

















function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_close($lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob2_close($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_export($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_export($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_import($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_import($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
{
error_clear_last();
if ($type !== "BLOB") {
$safeResult = \cubrid_lob2_new($conn_identifier, $type);
} elseif ($conn_identifier !== null) {
$safeResult = \cubrid_lob2_new($conn_identifier);
} else {
$safeResult = \cubrid_lob2_new();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_read($lob_identifier, int $len): string
{
error_clear_last();
$safeResult = \cubrid_lob2_read($lob_identifier, $len);
if ($safeResult === null) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}































function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_size($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_size64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_size64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob2_tell($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_tell($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_tell64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_tell64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_write($lob_identifier, string $buf): void
{
error_clear_last();
$safeResult = \cubrid_lob2_write($lob_identifier, $buf);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_read($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_read($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_write($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_write($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}


























function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
{
error_clear_last();
$safeResult = \cubrid_move_cursor($req_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_next_result($result): void
{
error_clear_last();
$safeResult = \cubrid_next_result($result);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
















































































function cubrid_pconnect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_pconnect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_pconnect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_pconnect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
{
error_clear_last();
$safeResult = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_put($conn_identifier, string $oid, ?string $attr = null, $value = null): void
{
error_clear_last();
if ($value !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr, $value);
} elseif ($attr !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr);
} else {
$safeResult = \cubrid_put($conn_identifier, $oid);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_rollback($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_rollback($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}







































































































































































































































































































































































































function cubrid_schema($conn_identifier, int $schema_type, ?string $class_name = null, ?string $attr_name = null): array
{
error_clear_last();
if ($attr_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
} elseif ($class_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name);
} else {
$safeResult = \cubrid_schema($conn_identifier, $schema_type);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
{
error_clear_last();
$safeResult = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}




















function cubrid_set_autocommit($conn_identifier, bool $mode): void
{
error_clear_last();
$safeResult = \cubrid_set_autocommit($conn_identifier, $mode);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}



















function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_value): void
{
error_clear_last();
$safeResult = \cubrid_set_db_parameter($conn_identifier, $param_type, $param_value);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_set_query_timeout($req_identifier, int $timeout): void
{
error_clear_last();
$safeResult = \cubrid_set_query_timeout($req_identifier, $timeout);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MailparseException;























function mailparse_msg_extract_part_file($mimemail, $filename, ?callable $callbackfunc = null): string
{
error_clear_last();
if ($callbackfunc !== null) {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc);
} else {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename);
}
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}











function mailparse_msg_free($mimemail): void
{
error_clear_last();
$safeResult = \mailparse_msg_free($mimemail);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}















function mailparse_msg_parse_file(string $filename)
{
error_clear_last();
$safeResult = \mailparse_msg_parse_file($filename);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}














function mailparse_msg_parse($mimemail, string $data): void
{
error_clear_last();
$safeResult = \mailparse_msg_parse($mimemail, $data);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}













function mailparse_stream_encode($sourcefp, $destfp, string $encoding): void
{
error_clear_last();
$safeResult = \mailparse_stream_encode($sourcefp, $destfp, $encoding);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\LdapException;














function ldap_8859_to_t61(string $value): string
{
error_clear_last();
$safeResult = \ldap_8859_to_t61($value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}





















function ldap_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
if ($password !== null) {
$safeResult = \ldap_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_bind($ldap, $dn);
} else {
$safeResult = \ldap_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_compare(\LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value, $controls);
} else {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value);
}
if ($safeResult === -1) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_control_paged_result_response($link, $result, ?string &$cookie = null, ?int &$estimated = null): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result_response($link, $result, $cookie, $estimated);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_control_paged_result($link, int $pagesize, bool $iscritical = false, string $cookie = ""): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result($link, $pagesize, $iscritical, $cookie);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}












function ldap_count_entries(\LDAP\Connection $ldap, \LDAP\Result $result): int
{
error_clear_last();
$safeResult = \ldap_count_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_delete(\LDAP\Connection $ldap, string $dn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_delete($ldap, $dn, $controls);
} else {
$safeResult = \ldap_delete($ldap, $dn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_dn2ufn(string $dn): string
{
error_clear_last();
$safeResult = \ldap_dn2ufn($dn);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_exop_passwd(\LDAP\Connection $ldap, string $user = "", string $old_password = "", string $new_password = "", ?array &$controls = null)
{
error_clear_last();
$safeResult = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}










function ldap_exop_whoami(\LDAP\Connection $ldap)
{
error_clear_last();
$safeResult = \ldap_exop_whoami($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}




















function ldap_exop(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, ?string &$response_data = null, ?string &$response_oid = null)
{
error_clear_last();
if ($response_oid !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid);
} elseif ($response_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data);
} elseif ($controls !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls);
} elseif ($request_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data);
} else {
$safeResult = \ldap_exop($ldap, $request_oid);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



















function ldap_explode_dn(string $dn, int $with_attrib): array
{
error_clear_last();
$safeResult = \ldap_explode_dn($dn, $with_attrib);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
















function ldap_first_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_first_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_first_entry(\LDAP\Connection $ldap, \LDAP\Result $result): \LDAP\ResultEntry
{
error_clear_last();
$safeResult = \ldap_first_entry($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}















function ldap_free_result(\LDAP\Result $result): void
{
error_clear_last();
$safeResult = \ldap_free_result($result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}






















function ldap_get_attributes(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): array
{
error_clear_last();
$safeResult = \ldap_get_attributes($ldap, $entry);
return $safeResult;
}











function ldap_get_dn(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_get_dn($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}























function ldap_get_entries(\LDAP\Connection $ldap, \LDAP\Result $result): array
{
error_clear_last();
$safeResult = \ldap_get_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































function ldap_get_option(\LDAP\Connection $ldap, int $option, &$value = null): void
{
error_clear_last();
$safeResult = \ldap_get_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















function ldap_get_values_len(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values_len($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



































function ldap_get_values(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}













function ldap_mod_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}














function ldap_mod_del(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_del($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_del($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}













function ldap_mod_replace(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}























































































function ldap_modify_batch(\LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
} else {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_next_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_next_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_parse_exop(\LDAP\Connection $ldap, \LDAP\Result $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
$safeResult = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















function ldap_parse_result(\LDAP\Connection $ldap, \LDAP\Result $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
$safeResult = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_rename(\LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
} else {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_sasl_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): void
{
error_clear_last();
if ($props !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
} elseif ($authz_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
} elseif ($authc_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
} elseif ($realm !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
} elseif ($mech !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech);
} elseif ($password !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn);
} else {
$safeResult = \ldap_sasl_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















































































































































































function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
$safeResult = \ldap_set_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}









function ldap_unbind(\LDAP\Connection $ldap): void
{
error_clear_last();
$safeResult = \ldap_unbind($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlrpcException;









function xmlrpc_set_type(&$value, string $type): void
{
error_clear_last();
$safeResult = \xmlrpc_set_type($value, $type);
if ($safeResult === false) {
throw XmlrpcException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SqlsrvException;















function sqlsrv_begin_transaction($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_begin_transaction($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}














function sqlsrv_cancel($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_cancel($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}







































function sqlsrv_client_info($conn): array
{
error_clear_last();
$safeResult = \sqlsrv_client_info($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}









function sqlsrv_close($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_close($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
















function sqlsrv_commit($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_commit($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}












































function sqlsrv_configure(string $setting, $value): void
{
error_clear_last();
$safeResult = \sqlsrv_configure($setting, $value);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}











function sqlsrv_execute($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_execute($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}





























function sqlsrv_fetch_array($stmt, ?int $fetchType = null, ?int $row = null, ?int $offset = null): ?array
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row);
} elseif ($fetchType !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType);
} else {
$safeResult = \sqlsrv_fetch_array($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}


































function sqlsrv_fetch_object($stmt, ?string $className = null, ?array $ctorParams = null, ?int $row = null, ?int $offset = null): ?object
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row);
} elseif ($ctorParams !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams);
} elseif ($className !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className);
} else {
$safeResult = \sqlsrv_fetch_object($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}




























function sqlsrv_fetch($stmt, ?int $row = null, ?int $offset = null): ?bool
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row);
} else {
$safeResult = \sqlsrv_fetch($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}















function sqlsrv_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_free_stmt($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}




















function sqlsrv_get_field($stmt, int $fieldIndex, ?int $getAsType = null)
{
error_clear_last();
if ($getAsType !== null) {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex, $getAsType);
} else {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_next_result($stmt): ?bool
{
error_clear_last();
$safeResult = \sqlsrv_next_result($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_num_fields($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_fields($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}



















function sqlsrv_num_rows($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_rows($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}























function sqlsrv_prepare($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_prepare($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}






















function sqlsrv_query($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_query($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}










function sqlsrv_rollback($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_rollback($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ShmopException;









function shmop_delete(\Shmop $shmop): void
{
error_clear_last();
$safeResult = \shmop_delete($shmop);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
}

















function shmop_read(\Shmop $shmop, int $offset, int $size): string
{
error_clear_last();
$safeResult = \shmop_read($shmop, $offset, $size);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DirException;









function chdir(string $directory): void
{
error_clear_last();
$safeResult = \chdir($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}


















function chroot(string $directory): void
{
error_clear_last();
$safeResult = \chroot($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}













function dir(string $directory, $context = null): \Directory
{
error_clear_last();
if ($context !== null) {
$safeResult = \dir($directory, $context);
} else {
$safeResult = \dir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function getcwd(): string
{
error_clear_last();
$safeResult = \getcwd();
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \opendir($directory, $context);
} else {
$safeResult = \opendir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}





















function scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \scandir($directory, $sorting_order, $context);
} else {
$safeResult = \scandir($directory, $sorting_order);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GettextException;













function bindtextdomain(string $domain, ?string $directory = null): string
{
error_clear_last();
if ($directory !== null) {
$safeResult = \bindtextdomain($domain, $directory);
} else {
$safeResult = \bindtextdomain($domain);
}
if ($safeResult === false) {
throw GettextException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StreamException;

















function stream_context_set_options($context, array $options): void
{
error_clear_last();
$safeResult = \stream_context_set_options($context, $options);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}











function stream_context_set_params($context, array $params): void
{
error_clear_last();
$safeResult = \stream_context_set_params($context, $params);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int
{
error_clear_last();
if ($offset !== 0) {
$safeResult = \stream_copy_to_stream($from, $to, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_copy_to_stream($from, $to, $length);
} else {
$safeResult = \stream_copy_to_stream($from, $to);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

































function stream_filter_append($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_append($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}


































function stream_filter_prepend($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_prepend($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
$safeResult = \stream_filter_register($filter_name, $class);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}













function stream_filter_remove($stream_filter): void
{
error_clear_last();
$safeResult = \stream_filter_remove($stream_filter);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_get_contents($stream, ?int $length = null, int $offset = -1): string
{
error_clear_last();
if ($offset !== -1) {
$safeResult = \stream_get_contents($stream, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_get_contents($stream, $length);
} else {
$safeResult = \stream_get_contents($stream);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_get_line($stream, int $length, string $ending = ""): string
{
error_clear_last();
$safeResult = \stream_get_line($stream, $length, $ending);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}










function stream_isatty($stream): void
{
error_clear_last();
$safeResult = \stream_isatty($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_resolve_include_path(string $filename): string
{
error_clear_last();
$safeResult = \stream_resolve_include_path($filename);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
$safeResult = \stream_set_blocking($stream, $enable);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}

















function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
{
error_clear_last();
$safeResult = \stream_set_timeout($stream, $seconds, $microseconds);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}



















function stream_socket_accept($socket, ?float $timeout = null, ?string &$peer_name = null)
{
error_clear_last();
if ($peer_name !== null) {
$safeResult = \stream_socket_accept($socket, $timeout, $peer_name);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_accept($socket, $timeout);
} else {
$safeResult = \stream_socket_accept($socket);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















































function stream_socket_client(string $address, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout);
} else {
$safeResult = \stream_socket_client($address, $error_code, $error_message);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












function stream_socket_get_name($socket, bool $remote): string
{
error_clear_last();
$safeResult = \stream_socket_get_name($socket, $remote);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_socket_pair(int $domain, int $type, int $protocol): array
{
error_clear_last();
$safeResult = \stream_socket_pair($domain, $type, $protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}






































function stream_socket_recvfrom($socket, int $length, int $flags = 0, ?string &$address = null): string
{
error_clear_last();
$safeResult = \stream_socket_recvfrom($socket, $length, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}































function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int
{
error_clear_last();
$safeResult = \stream_socket_sendto($socket, $data, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












































function stream_socket_server(string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags, $context);
} else {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}















function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
$safeResult = \stream_socket_shutdown($stream, $mode);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_supports_lock($stream): void
{
error_clear_last();
$safeResult = \stream_supports_lock($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
















function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
$safeResult = \stream_wrapper_register($protocol, $class, $flags);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_wrapper_restore(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_restore($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}












function stream_wrapper_unregister(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_unregister($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ComException;











function com_create_guid(): string
{
error_clear_last();
$safeResult = \com_create_guid();
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
























function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
if ($sink_interface !== null) {
$safeResult = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
$safeResult = \com_event_sink($variant, $sink_object);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}






















































function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
$safeResult = \com_load_typelib($typelib, $case_insensitive);
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}

















function com_print_typeinfo(object $variant, ?string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
if ($display_sink !== false) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
} elseif ($dispatch_interface !== null) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface);
} else {
$safeResult = \com_print_typeinfo($variant);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}












function variant_date_to_timestamp(object $variant): int
{
error_clear_last();
$safeResult = \variant_date_to_timestamp($variant);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}












function variant_round($value, int $decimals)
{
error_clear_last();
$safeResult = \variant_round($value, $decimals);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FtpException;












function ftp_alloc(\FTP\Connection $ftp, int $size, ?string &$response = null): void
{
error_clear_last();
$safeResult = \ftp_alloc($ftp, $size, $response);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_append(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
$safeResult = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}









function ftp_cdup(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_cdup($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_chdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_chdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}













function ftp_chmod(\FTP\Connection $ftp, int $permissions, string $filename): int
{
error_clear_last();
$safeResult = \ftp_chmod($ftp, $permissions, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_close(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_close($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}


















function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_delete(\FTP\Connection $ftp, string $filename): void
{
error_clear_last();
$safeResult = \ftp_delete($ftp, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fget(\FTP\Connection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fput(\FTP\Connection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_login(\FTP\Connection $ftp, string $username, string $password): void
{
error_clear_last();
$safeResult = \ftp_login($ftp, $username, $password);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_mkdir(\FTP\Connection $ftp, string $directory): string
{
error_clear_last();
$safeResult = \ftp_mkdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_mlsd(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_mlsd($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}





















function ftp_nb_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}




















function ftp_nb_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}














function ftp_nlist(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_nlist($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
















function ftp_pasv(\FTP\Connection $ftp, bool $enable): void
{
error_clear_last();
$safeResult = \ftp_pasv($ftp, $enable);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}














function ftp_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_pwd(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_pwd($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}













function ftp_raw(\FTP\Connection $ftp, string $command): array
{
error_clear_last();
$safeResult = \ftp_raw($ftp, $command);
if ($safeResult === null) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}












function ftp_rename(\FTP\Connection $ftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ftp_rename($ftp, $from, $to);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_rmdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_rmdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}
















function ftp_site(\FTP\Connection $ftp, string $command): void
{
error_clear_last();
$safeResult = \ftp_site($ftp, $command);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_size(\FTP\Connection $ftp, string $filename): int
{
error_clear_last();
$safeResult = \ftp_size($ftp, $filename);
if ($safeResult === -1) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}























function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_ssl_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_systype(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_systype($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;


return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
RenameFunctionRector::class,
[ 'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
'apcu_cas' => 'Safe\apcu_cas',
'apcu_dec' => 'Safe\apcu_dec',
'apcu_fetch' => 'Safe\apcu_fetch',
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'base64_decode' => 'Safe\base64_decode',
'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzopen' => 'Safe\bzopen',
'bzread' => 'Safe\bzread',
'bzwrite' => 'Safe\bzwrite',
'chdir' => 'Safe\chdir',
'chgrp' => 'Safe\chgrp',
'chmod' => 'Safe\chmod',
'chown' => 'Safe\chown',
'chroot' => 'Safe\chroot',
'class_alias' => 'Safe\class_alias',
'class_implements' => 'Safe\class_implements',
'class_parents' => 'Safe\class_parents',
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
'copy' => 'Safe\copy',
'cubrid_bind' => 'Safe\cubrid_bind',
'cubrid_column_names' => 'Safe\cubrid_column_names',
'cubrid_column_types' => 'Safe\cubrid_column_types',
'cubrid_col_size' => 'Safe\cubrid_col_size',
'cubrid_commit' => 'Safe\cubrid_commit',
'cubrid_connect' => 'Safe\cubrid_connect',
'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
'cubrid_current_oid' => 'Safe\cubrid_current_oid',
'cubrid_disconnect' => 'Safe\cubrid_disconnect',
'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
'cubrid_lob_close' => 'Safe\cubrid_lob_close',
'cubrid_lob_export' => 'Safe\cubrid_lob_export',
'cubrid_lob_get' => 'Safe\cubrid_lob_get',
'cubrid_lob_send' => 'Safe\cubrid_lob_send',
'cubrid_lob_size' => 'Safe\cubrid_lob_size',
'cubrid_lock_read' => 'Safe\cubrid_lock_read',
'cubrid_lock_write' => 'Safe\cubrid_lock_write',
'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
'cubrid_next_result' => 'Safe\cubrid_next_result',
'cubrid_pconnect' => 'Safe\cubrid_pconnect',
'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
'cubrid_prepare' => 'Safe\cubrid_prepare',
'cubrid_put' => 'Safe\cubrid_put',
'cubrid_rollback' => 'Safe\cubrid_rollback',
'cubrid_schema' => 'Safe\cubrid_schema',
'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
'cubrid_seq_put' => 'Safe\cubrid_seq_put',
'cubrid_set_add' => 'Safe\cubrid_set_add',
'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
'cubrid_set_drop' => 'Safe\cubrid_set_drop',
'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_setopt' => 'Safe\curl_share_setopt',
'curl_unescape' => 'Safe\curl_unescape',
'curl_upkeep' => 'Safe\curl_upkeep',
'date_create' => 'Safe\date_create',
'date_create_immutable' => 'Safe\date_create_immutable',
'date_parse_from_format' => 'Safe\date_parse_from_format',
'date_sunrise' => 'Safe\date_sunrise',
'date_sunset' => 'Safe\date_sunset',
'db2_autocommit' => 'Safe\db2_autocommit',
'db2_bind_param' => 'Safe\db2_bind_param',
'db2_client_info' => 'Safe\db2_client_info',
'db2_close' => 'Safe\db2_close',
'db2_commit' => 'Safe\db2_commit',
'db2_execute' => 'Safe\db2_execute',
'db2_free_result' => 'Safe\db2_free_result',
'db2_free_stmt' => 'Safe\db2_free_stmt',
'db2_get_option' => 'Safe\db2_get_option',
'db2_num_rows' => 'Safe\db2_num_rows',
'db2_pclose' => 'Safe\db2_pclose',
'db2_rollback' => 'Safe\db2_rollback',
'db2_server_info' => 'Safe\db2_server_info',
'db2_set_option' => 'Safe\db2_set_option',
'define' => 'Safe\define',
'deflate_add' => 'Safe\deflate_add',
'deflate_init' => 'Safe\deflate_init',
'dir' => 'Safe\dir',
'disk_free_space' => 'Safe\disk_free_space',
'disk_total_space' => 'Safe\disk_total_space',
'dl' => 'Safe\dl',
'dns_get_record' => 'Safe\dns_get_record',
'eio_busy' => 'Safe\eio_busy',
'eio_chmod' => 'Safe\eio_chmod',
'eio_chown' => 'Safe\eio_chown',
'eio_close' => 'Safe\eio_close',
'eio_custom' => 'Safe\eio_custom',
'eio_dup2' => 'Safe\eio_dup2',
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
'eio_fsync' => 'Safe\eio_fsync',
'eio_ftruncate' => 'Safe\eio_ftruncate',
'eio_futime' => 'Safe\eio_futime',
'eio_grp' => 'Safe\eio_grp',
'eio_lstat' => 'Safe\eio_lstat',
'eio_mkdir' => 'Safe\eio_mkdir',
'eio_mknod' => 'Safe\eio_mknod',
'eio_nop' => 'Safe\eio_nop',
'eio_readahead' => 'Safe\eio_readahead',
'eio_readdir' => 'Safe\eio_readdir',
'eio_readlink' => 'Safe\eio_readlink',
'eio_rename' => 'Safe\eio_rename',
'eio_rmdir' => 'Safe\eio_rmdir',
'eio_seek' => 'Safe\eio_seek',
'eio_sendfile' => 'Safe\eio_sendfile',
'eio_stat' => 'Safe\eio_stat',
'eio_statvfs' => 'Safe\eio_statvfs',
'eio_symlink' => 'Safe\eio_symlink',
'eio_sync' => 'Safe\eio_sync',
'eio_syncfs' => 'Safe\eio_syncfs',
'eio_sync_file_range' => 'Safe\eio_sync_file_range',
'eio_truncate' => 'Safe\eio_truncate',
'eio_unlink' => 'Safe\eio_unlink',
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'filetype' => 'Safe\filetype',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
'filter_input_array' => 'Safe\filter_input_array',
'filter_var_array' => 'Safe\filter_var_array',
'finfo_close' => 'Safe\finfo_close',
'finfo_open' => 'Safe\finfo_open',
'flock' => 'Safe\flock',
'fopen' => 'Safe\fopen',
'fpm_get_status' => 'Safe\fpm_get_status',
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
'fstat' => 'Safe\fstat',
'fsync' => 'Safe\fsync',
'ftell' => 'Safe\ftell',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
'ftp_chdir' => 'Safe\ftp_chdir',
'ftp_chmod' => 'Safe\ftp_chmod',
'ftp_close' => 'Safe\ftp_close',
'ftp_connect' => 'Safe\ftp_connect',
'ftp_delete' => 'Safe\ftp_delete',
'ftp_fget' => 'Safe\ftp_fget',
'ftp_fput' => 'Safe\ftp_fput',
'ftp_get' => 'Safe\ftp_get',
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
'ftp_nb_get' => 'Safe\ftp_nb_get',
'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
'ftp_raw' => 'Safe\ftp_raw',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
'ftp_size' => 'Safe\ftp_size',
'ftp_ssl_connect' => 'Safe\ftp_ssl_connect',
'ftp_systype' => 'Safe\ftp_systype',
'ftruncate' => 'Safe\ftruncate',
'fwrite' => 'Safe\fwrite',
'getcwd' => 'Safe\getcwd',
'gethostname' => 'Safe\gethostname',
'getimagesize' => 'Safe\getimagesize',
'getlastmod' => 'Safe\getlastmod',
'getmygid' => 'Safe\getmygid',
'getmyinode' => 'Safe\getmyinode',
'getmypid' => 'Safe\getmypid',
'getmyuid' => 'Safe\getmyuid',
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
'getrusage' => 'Safe\getrusage',
'getservbyport' => 'Safe\getservbyport',
'get_cfg_var' => 'Safe\get_cfg_var',
'get_headers' => 'Safe\get_headers',
'get_include_path' => 'Safe\get_include_path',
'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
'gnupg_deletekey' => 'Safe\gnupg_deletekey',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
'gzcompress' => 'Safe\gzcompress',
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzinflate' => 'Safe\gzinflate',
'gzopen' => 'Safe\gzopen',
'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gztell' => 'Safe\gztell',
'gzuncompress' => 'Safe\gzuncompress',
'gzwrite' => 'Safe\gzwrite',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
'ibase_blob_create' => 'Safe\ibase_blob_create',
'ibase_blob_get' => 'Safe\ibase_blob_get',
'ibase_close' => 'Safe\ibase_close',
'ibase_commit' => 'Safe\ibase_commit',
'ibase_commit_ret' => 'Safe\ibase_commit_ret',
'ibase_connect' => 'Safe\ibase_connect',
'ibase_delete_user' => 'Safe\ibase_delete_user',
'ibase_drop_db' => 'Safe\ibase_drop_db',
'ibase_free_event_handler' => 'Safe\ibase_free_event_handler',
'ibase_free_query' => 'Safe\ibase_free_query',
'ibase_free_result' => 'Safe\ibase_free_result',
'ibase_maintain_db' => 'Safe\ibase_maintain_db',
'ibase_modify_user' => 'Safe\ibase_modify_user',
'ibase_name_result' => 'Safe\ibase_name_result',
'ibase_pconnect' => 'Safe\ibase_pconnect',
'ibase_restore' => 'Safe\ibase_restore',
'ibase_rollback' => 'Safe\ibase_rollback',
'ibase_rollback_ret' => 'Safe\ibase_rollback_ret',
'ibase_service_attach' => 'Safe\ibase_service_attach',
'ibase_service_detach' => 'Safe\ibase_service_detach',
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_mime_decode' => 'Safe\iconv_mime_decode',
'iconv_mime_encode' => 'Safe\iconv_mime_encode',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
'iconv_strlen' => 'Safe\iconv_strlen',
'idate' => 'Safe\idate',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
'imageaffinematrixget' => 'Safe\imageaffinematrixget',
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
'imagecolorset' => 'Safe\imagecolorset',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
'imagecopymergegray' => 'Safe\imagecopymergegray',
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
'imagecreatefromgd2part' => 'Safe\imagecreatefromgd2part',
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
'imagecreatefromstring' => 'Safe\imagecreatefromstring',
'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
'imagecreatefromxpm' => 'Safe\imagecreatefromxpm',
'imagecreatetruecolor' => 'Safe\imagecreatetruecolor',
'imagecrop' => 'Safe\imagecrop',
'imagecropauto' => 'Safe\imagecropauto',
'imagedashedline' => 'Safe\imagedashedline',
'imagedestroy' => 'Safe\imagedestroy',
'imageellipse' => 'Safe\imageellipse',
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
'imageftbbox' => 'Safe\imageftbbox',
'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
'imagegif' => 'Safe\imagegif',
'imagegrabscreen' => 'Safe\imagegrabscreen',
'imagegrabwindow' => 'Safe\imagegrabwindow',
'imagejpeg' => 'Safe\imagejpeg',
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
'imagepng' => 'Safe\imagepng',
'imagerectangle' => 'Safe\imagerectangle',
'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
'imagesetbrush' => 'Safe\imagesetbrush',
'imagesetclip' => 'Safe\imagesetclip',
'imagesetinterpolation' => 'Safe\imagesetinterpolation',
'imagesetpixel' => 'Safe\imagesetpixel',
'imagesetstyle' => 'Safe\imagesetstyle',
'imagesetthickness' => 'Safe\imagesetthickness',
'imagesettile' => 'Safe\imagesettile',
'imagestring' => 'Safe\imagestring',
'imagestringup' => 'Safe\imagestringup',
'imagetruecolortopalette' => 'Safe\imagetruecolortopalette',
'imagettfbbox' => 'Safe\imagettfbbox',
'imagettftext' => 'Safe\imagettftext',
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
'image_type_to_extension' => 'Safe\image_type_to_extension',
'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
'imap_base64' => 'Safe\imap_base64',
'imap_binary' => 'Safe\imap_binary',
'imap_body' => 'Safe\imap_body',
'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
'imap_fetchbody' => 'Safe\imap_fetchbody',
'imap_fetchheader' => 'Safe\imap_fetchheader',
'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_getacl' => 'Safe\imap_getacl',
'imap_getmailboxes' => 'Safe\imap_getmailboxes',
'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
'imap_headers' => 'Safe\imap_headers',
'imap_listscan' => 'Safe\imap_listscan',
'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
'imap_unsubscribe' => 'Safe\imap_unsubscribe',
'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7',
'inet_ntop' => 'Safe\inet_ntop',
'inet_pton' => 'Safe\inet_pton',
'inflate_add' => 'Safe\inflate_add',
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_init' => 'Safe\inflate_init',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_add_watch' => 'Safe\inotify_add_watch',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
'ldap_bind' => 'Safe\ldap_bind',
'ldap_compare' => 'Safe\ldap_compare',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
'ldap_explode_dn' => 'Safe\ldap_explode_dn',
'ldap_first_attribute' => 'Safe\ldap_first_attribute',
'ldap_first_entry' => 'Safe\ldap_first_entry',
'ldap_free_result' => 'Safe\ldap_free_result',
'ldap_get_dn' => 'Safe\ldap_get_dn',
'ldap_get_entries' => 'Safe\ldap_get_entries',
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
'ldap_mod_del' => 'Safe\ldap_mod_del',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
'ldap_rename' => 'Safe\ldap_rename',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
'mailparse_msg_free' => 'Safe\mailparse_msg_free',
'mailparse_msg_parse' => 'Safe\mailparse_msg_parse',
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
'mb_ereg_replace' => 'Safe\mb_ereg_replace',
'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback',
'mb_ereg_search_getregs' => 'Safe\mb_ereg_search_getregs',
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
'mb_parse_str' => 'Safe\mb_parse_str',
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
'md5_file' => 'Safe\md5_file',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
'mysql_data_seek' => 'Safe\mysql_data_seek',
'mysql_db_name' => 'Safe\mysql_db_name',
'mysql_db_query' => 'Safe\mysql_db_query',
'mysql_drop_db' => 'Safe\mysql_drop_db',
'mysql_fetch_lengths' => 'Safe\mysql_fetch_lengths',
'mysql_field_flags' => 'Safe\mysql_field_flags',
'mysql_field_len' => 'Safe\mysql_field_len',
'mysql_field_name' => 'Safe\mysql_field_name',
'mysql_field_seek' => 'Safe\mysql_field_seek',
'mysql_free_result' => 'Safe\mysql_free_result',
'mysql_get_host_info' => 'Safe\mysql_get_host_info',
'mysql_get_proto_info' => 'Safe\mysql_get_proto_info',
'mysql_get_server_info' => 'Safe\mysql_get_server_info',
'mysql_info' => 'Safe\mysql_info',
'mysql_list_dbs' => 'Safe\mysql_list_dbs',
'mysql_list_fields' => 'Safe\mysql_list_fields',
'mysql_list_processes' => 'Safe\mysql_list_processes',
'mysql_list_tables' => 'Safe\mysql_list_tables',
'mysql_num_fields' => 'Safe\mysql_num_fields',
'mysql_num_rows' => 'Safe\mysql_num_rows',
'mysql_query' => 'Safe\mysql_query',
'mysql_real_escape_string' => 'Safe\mysql_real_escape_string',
'mysql_result' => 'Safe\mysql_result',
'mysql_select_db' => 'Safe\mysql_select_db',
'mysql_set_charset' => 'Safe\mysql_set_charset',
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
'net_get_interfaces' => 'Safe\net_get_interfaces',
'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
'ob_flush' => 'Safe\ob_flush',
'ob_get_clean' => 'Safe\ob_get_clean',
'ob_get_flush' => 'Safe\ob_get_flush',
'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
'oci_field_size' => 'Safe\oci_field_size',
'oci_field_type' => 'Safe\oci_field_type',
'oci_field_type_raw' => 'Safe\oci_field_type_raw',
'oci_free_descriptor' => 'Safe\oci_free_descriptor',
'oci_free_statement' => 'Safe\oci_free_statement',
'oci_new_collection' => 'Safe\oci_new_collection',
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
'oci_set_action' => 'Safe\oci_set_action',
'oci_set_call_timeout' => 'Safe\oci_set_call_timeout',
'oci_set_client_identifier' => 'Safe\oci_set_client_identifier',
'oci_set_client_info' => 'Safe\oci_set_client_info',
'oci_set_db_operation' => 'Safe\oci_set_db_operation',
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
'oci_set_prefetch_lob' => 'Safe\oci_set_prefetch_lob',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
'odbc_commit' => 'Safe\odbc_commit',
'odbc_connect' => 'Safe\odbc_connect',
'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
'odbc_fetch_into' => 'Safe\odbc_fetch_into',
'odbc_field_len' => 'Safe\odbc_field_len',
'odbc_field_name' => 'Safe\odbc_field_name',
'odbc_field_num' => 'Safe\odbc_field_num',
'odbc_field_scale' => 'Safe\odbc_field_scale',
'odbc_field_type' => 'Safe\odbc_field_type',
'odbc_num_fields' => 'Safe\odbc_num_fields',
'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
'odbc_setoption' => 'Safe\odbc_setoption',
'odbc_tables' => 'Safe\odbc_tables',
'opcache_compile_file' => 'Safe\opcache_compile_file',
'opcache_get_status' => 'Safe\opcache_get_status',
'opendir' => 'Safe\opendir',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
'openssl_cipher_key_length' => 'Safe\openssl_cipher_key_length',
'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
'openssl_cms_read' => 'Safe\openssl_cms_read',
'openssl_cms_sign' => 'Safe\openssl_cms_sign',
'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
'openssl_decrypt' => 'Safe\openssl_decrypt',
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt' => 'Safe\openssl_pkcs7_encrypt',
'openssl_pkcs7_read' => 'Safe\openssl_pkcs7_read',
'openssl_pkcs7_sign' => 'Safe\openssl_pkcs7_sign',
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_details' => 'Safe\openssl_pkey_get_details',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
'openssl_pkey_get_public' => 'Safe\openssl_pkey_get_public',
'openssl_pkey_new' => 'Safe\openssl_pkey_new',
'openssl_private_decrypt' => 'Safe\openssl_private_decrypt',
'openssl_private_encrypt' => 'Safe\openssl_private_encrypt',
'openssl_public_decrypt' => 'Safe\openssl_public_decrypt',
'openssl_public_encrypt' => 'Safe\openssl_public_encrypt',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
'openssl_spki_export' => 'Safe\openssl_spki_export',
'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
'openssl_spki_new' => 'Safe\openssl_spki_new',
'openssl_spki_verify' => 'Safe\openssl_spki_verify',
'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_checkpurpose' => 'Safe\openssl_x509_checkpurpose',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
'openssl_x509_read' => 'Safe\openssl_x509_read',
'output_add_rewrite_var' => 'Safe\output_add_rewrite_var',
'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars',
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
'passthru' => 'Safe\passthru',
'pclose' => 'Safe\pclose',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
'pg_field_num' => 'Safe\pg_field_num',
'pg_field_table' => 'Safe\pg_field_table',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
'pg_query_params' => 'Safe\pg_query_params',
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
'pg_set_chunked_rows_size' => 'Safe\pg_set_chunked_rows_size',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
'pg_update' => 'Safe\pg_update',
'php_sapi_name' => 'Safe\php_sapi_name',
'popen' => 'Safe\popen',
'posix_access' => 'Safe\posix_access',
'posix_eaccess' => 'Safe\posix_eaccess',
'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
'posix_getgroups' => 'Safe\posix_getgroups',
'posix_getlogin' => 'Safe\posix_getlogin',
'posix_getpgid' => 'Safe\posix_getpgid',
'posix_getpwuid' => 'Safe\posix_getpwuid',
'posix_getrlimit' => 'Safe\posix_getrlimit',
'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
'posix_mknod' => 'Safe\posix_mknod',
'posix_setegid' => 'Safe\posix_setegid',
'posix_seteuid' => 'Safe\posix_seteuid',
'posix_setgid' => 'Safe\posix_setgid',
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setsid' => 'Safe\posix_setsid',
'posix_setuid' => 'Safe\posix_setuid',
'posix_times' => 'Safe\posix_times',
'posix_uname' => 'Safe\posix_uname',
'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_replace_callback' => 'Safe\preg_replace_callback',
'preg_replace_callback_array' => 'Safe\preg_replace_callback_array',
'preg_split' => 'Safe\preg_split',
'proc_close' => 'Safe\proc_close',
'proc_nice' => 'Safe\proc_nice',
'proc_open' => 'Safe\proc_open',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
'pspell_clear_session' => 'Safe\pspell_clear_session',
'pspell_config_data_dir' => 'Safe\pspell_config_data_dir',
'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir',
'pspell_config_ignore' => 'Safe\pspell_config_ignore',
'pspell_config_mode' => 'Safe\pspell_config_mode',
'pspell_config_personal' => 'Safe\pspell_config_personal',
'pspell_config_repl' => 'Safe\pspell_config_repl',
'pspell_config_runtogether' => 'Safe\pspell_config_runtogether',
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
'ps_add_locallink' => 'Safe\ps_add_locallink',
'ps_add_note' => 'Safe\ps_add_note',
'ps_add_pdflink' => 'Safe\ps_add_pdflink',
'ps_add_weblink' => 'Safe\ps_add_weblink',
'ps_arc' => 'Safe\ps_arc',
'ps_arcn' => 'Safe\ps_arcn',
'ps_begin_page' => 'Safe\ps_begin_page',
'ps_begin_pattern' => 'Safe\ps_begin_pattern',
'ps_begin_template' => 'Safe\ps_begin_template',
'ps_circle' => 'Safe\ps_circle',
'ps_clip' => 'Safe\ps_clip',
'ps_close' => 'Safe\ps_close',
'ps_closepath' => 'Safe\ps_closepath',
'ps_closepath_stroke' => 'Safe\ps_closepath_stroke',
'ps_close_image' => 'Safe\ps_close_image',
'ps_continue_text' => 'Safe\ps_continue_text',
'ps_curveto' => 'Safe\ps_curveto',
'ps_delete' => 'Safe\ps_delete',
'ps_end_page' => 'Safe\ps_end_page',
'ps_end_pattern' => 'Safe\ps_end_pattern',
'ps_end_template' => 'Safe\ps_end_template',
'ps_fill' => 'Safe\ps_fill',
'ps_fill_stroke' => 'Safe\ps_fill_stroke',
'ps_get_parameter' => 'Safe\ps_get_parameter',
'ps_hyphenate' => 'Safe\ps_hyphenate',
'ps_include_file' => 'Safe\ps_include_file',
'ps_lineto' => 'Safe\ps_lineto',
'ps_moveto' => 'Safe\ps_moveto',
'ps_new' => 'Safe\ps_new',
'ps_open_file' => 'Safe\ps_open_file',
'ps_place_image' => 'Safe\ps_place_image',
'ps_rect' => 'Safe\ps_rect',
'ps_restore' => 'Safe\ps_restore',
'ps_rotate' => 'Safe\ps_rotate',
'ps_save' => 'Safe\ps_save',
'ps_scale' => 'Safe\ps_scale',
'ps_setcolor' => 'Safe\ps_setcolor',
'ps_setdash' => 'Safe\ps_setdash',
'ps_setflat' => 'Safe\ps_setflat',
'ps_setfont' => 'Safe\ps_setfont',
'ps_setgray' => 'Safe\ps_setgray',
'ps_setlinecap' => 'Safe\ps_setlinecap',
'ps_setlinejoin' => 'Safe\ps_setlinejoin',
'ps_setlinewidth' => 'Safe\ps_setlinewidth',
'ps_setmiterlimit' => 'Safe\ps_setmiterlimit',
'ps_setoverprintmode' => 'Safe\ps_setoverprintmode',
'ps_setpolydash' => 'Safe\ps_setpolydash',
'ps_set_border_color' => 'Safe\ps_set_border_color',
'ps_set_border_dash' => 'Safe\ps_set_border_dash',
'ps_set_border_style' => 'Safe\ps_set_border_style',
'ps_set_info' => 'Safe\ps_set_info',
'ps_set_parameter' => 'Safe\ps_set_parameter',
'ps_set_text_pos' => 'Safe\ps_set_text_pos',
'ps_set_value' => 'Safe\ps_set_value',
'ps_shading' => 'Safe\ps_shading',
'ps_shading_pattern' => 'Safe\ps_shading_pattern',
'ps_shfill' => 'Safe\ps_shfill',
'ps_show' => 'Safe\ps_show',
'ps_show2' => 'Safe\ps_show2',
'ps_show_xy' => 'Safe\ps_show_xy',
'ps_show_xy2' => 'Safe\ps_show_xy2',
'ps_stroke' => 'Safe\ps_stroke',
'ps_symbol' => 'Safe\ps_symbol',
'ps_translate' => 'Safe\ps_translate',
'putenv' => 'Safe\putenv',
'readfile' => 'Safe\readfile',
'readgzfile' => 'Safe\readgzfile',
'readline_completion_function' => 'Safe\readline_completion_function',
'readline_read_history' => 'Safe\readline_read_history',
'readline_write_history' => 'Safe\readline_write_history',
'readlink' => 'Safe\readlink',
'realpath' => 'Safe\realpath',
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
'rmdir' => 'Safe\rmdir',
'rnp_decrypt' => 'Safe\rnp_decrypt',
'rnp_dump_packets' => 'Safe\rnp_dump_packets',
'rnp_dump_packets_to_json' => 'Safe\rnp_dump_packets_to_json',
'rnp_ffi_create' => 'Safe\rnp_ffi_create',
'rnp_ffi_set_pass_provider' => 'Safe\rnp_ffi_set_pass_provider',
'rnp_import_keys' => 'Safe\rnp_import_keys',
'rnp_import_signatures' => 'Safe\rnp_import_signatures',
'rnp_key_export' => 'Safe\rnp_key_export',
'rnp_key_export_autocrypt' => 'Safe\rnp_key_export_autocrypt',
'rnp_key_export_revocation' => 'Safe\rnp_key_export_revocation',
'rnp_key_get_info' => 'Safe\rnp_key_get_info',
'rnp_key_remove' => 'Safe\rnp_key_remove',
'rnp_key_revoke' => 'Safe\rnp_key_revoke',
'rnp_list_keys' => 'Safe\rnp_list_keys',
'rnp_load_keys' => 'Safe\rnp_load_keys',
'rnp_load_keys_from_path' => 'Safe\rnp_load_keys_from_path',
'rnp_locate_key' => 'Safe\rnp_locate_key',
'rnp_op_encrypt' => 'Safe\rnp_op_encrypt',
'rnp_op_generate_key' => 'Safe\rnp_op_generate_key',
'rnp_op_sign' => 'Safe\rnp_op_sign',
'rnp_op_sign_cleartext' => 'Safe\rnp_op_sign_cleartext',
'rnp_op_sign_detached' => 'Safe\rnp_op_sign_detached',
'rnp_op_verify' => 'Safe\rnp_op_verify',
'rnp_op_verify_detached' => 'Safe\rnp_op_verify_detached',
'rnp_save_keys' => 'Safe\rnp_save_keys',
'rnp_save_keys_to_path' => 'Safe\rnp_save_keys_to_path',
'rnp_supported_features' => 'Safe\rnp_supported_features',
'rpmaddtag' => 'Safe\rpmaddtag',
'rrd_create' => 'Safe\rrd_create',
'rrd_first' => 'Safe\rrd_first',
'rrd_graph' => 'Safe\rrd_graph',
'rrd_info' => 'Safe\rrd_info',
'rrd_lastupdate' => 'Safe\rrd_lastupdate',
'rrd_restore' => 'Safe\rrd_restore',
'rrd_tune' => 'Safe\rrd_tune',
'rrd_update' => 'Safe\rrd_update',
'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
'sem_get' => 'Safe\sem_get',
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
'session_encode' => 'Safe\session_encode',
'session_id' => 'Safe\session_id',
'session_module_name' => 'Safe\session_module_name',
'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shmop_read' => 'Safe\shmop_read',
'shm_attach' => 'Safe\shm_attach',
'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
'simplexml_import_dom' => 'Safe\simplexml_import_dom',
'simplexml_load_file' => 'Safe\simplexml_load_file',
'simplexml_load_string' => 'Safe\simplexml_load_string',
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_atmark' => 'Safe\socket_atmark',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
'socket_create_listen' => 'Safe\socket_create_listen',
'socket_create_pair' => 'Safe\socket_create_pair',
'socket_export_stream' => 'Safe\socket_export_stream',
'socket_getpeername' => 'Safe\socket_getpeername',
'socket_getsockname' => 'Safe\socket_getsockname',
'socket_get_option' => 'Safe\socket_get_option',
'socket_import_stream' => 'Safe\socket_import_stream',
'socket_listen' => 'Safe\socket_listen',
'socket_read' => 'Safe\socket_read',
'socket_send' => 'Safe\socket_send',
'socket_sendmsg' => 'Safe\socket_sendmsg',
'socket_sendto' => 'Safe\socket_sendto',
'socket_set_block' => 'Safe\socket_set_block',
'socket_set_nonblock' => 'Safe\socket_set_nonblock',
'socket_set_option' => 'Safe\socket_set_option',
'socket_shutdown' => 'Safe\socket_shutdown',
'socket_write' => 'Safe\socket_write',
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
'sodium_crypto_aead_aegis128l_decrypt' => 'Safe\sodium_crypto_aead_aegis128l_decrypt',
'sodium_crypto_aead_aegis256_decrypt' => 'Safe\sodium_crypto_aead_aegis256_decrypt',
'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic' => 'Safe\sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version' => 'Safe\solr_get_version',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
'sqlsrv_close' => 'Safe\sqlsrv_close',
'sqlsrv_commit' => 'Safe\sqlsrv_commit',
'sqlsrv_configure' => 'Safe\sqlsrv_configure',
'sqlsrv_execute' => 'Safe\sqlsrv_execute',
'sqlsrv_fetch' => 'Safe\sqlsrv_fetch',
'sqlsrv_fetch_array' => 'Safe\sqlsrv_fetch_array',
'sqlsrv_fetch_object' => 'Safe\sqlsrv_fetch_object',
'sqlsrv_free_stmt' => 'Safe\sqlsrv_free_stmt',
'sqlsrv_get_field' => 'Safe\sqlsrv_get_field',
'sqlsrv_next_result' => 'Safe\sqlsrv_next_result',
'sqlsrv_num_fields' => 'Safe\sqlsrv_num_fields',
'sqlsrv_num_rows' => 'Safe\sqlsrv_num_rows',
'sqlsrv_prepare' => 'Safe\sqlsrv_prepare',
'sqlsrv_query' => 'Safe\sqlsrv_query',
'sqlsrv_rollback' => 'Safe\sqlsrv_rollback',
'ssdeep_fuzzy_compare' => 'Safe\ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash' => 'Safe\ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename' => 'Safe\ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent' => 'Safe\ssh2_auth_agent',
'ssh2_auth_hostbased_file' => 'Safe\ssh2_auth_hostbased_file',
'ssh2_auth_password' => 'Safe\ssh2_auth_password',
'ssh2_auth_pubkey_file' => 'Safe\ssh2_auth_pubkey_file',
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
'ssh2_sftp_rename' => 'Safe\ssh2_sftp_rename',
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_options' => 'Safe\stream_context_set_options',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
'stream_filter_prepend' => 'Safe\stream_filter_prepend',
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
'stream_socket_get_name' => 'Safe\stream_socket_get_name',
'stream_socket_pair' => 'Safe\stream_socket_pair',
'stream_socket_recvfrom' => 'Safe\stream_socket_recvfrom',
'stream_socket_sendto' => 'Safe\stream_socket_sendto',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
'swoole_event_del' => 'Safe\swoole_event_del',
'swoole_event_write' => 'Safe\swoole_event_write',
'symlink' => 'Safe\symlink',
'system' => 'Safe\system',
'sys_getloadavg' => 'Safe\sys_getloadavg',
'tempnam' => 'Safe\tempnam',
'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr',
'time_nanosleep' => 'Safe\time_nanosleep',
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
'xdiff_file_diff_binary' => 'Safe\xdiff_file_diff_binary',
'xdiff_file_patch_binary' => 'Safe\xdiff_file_patch_binary',
'xdiff_file_rabdiff' => 'Safe\xdiff_file_rabdiff',
'xdiff_string_bpatch' => 'Safe\xdiff_string_bpatch',
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
'xml_parser_free' => 'Safe\xml_parser_free',
'xml_parser_set_option' => 'Safe\xml_parser_set_option',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
'yaz_ccl_parse' => 'Safe\yaz_ccl_parse',
'yaz_close' => 'Safe\yaz_close',
'yaz_connect' => 'Safe\yaz_connect',
'yaz_database' => 'Safe\yaz_database',
'yaz_element' => 'Safe\yaz_element',
'yaz_present' => 'Safe\yaz_present',
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
'zip_entry_filesize' => 'Safe\zip_entry_filesize',
'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
]
);
};
<?php

namespace Safe;

use Safe\Exceptions\JsonException;












































function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
$safeResult = \json_encode($value, $flags, $depth);
if ($safeResult === false) {
throw JsonException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApacheException;








function apache_get_version(): string
{
error_clear_last();
$safeResult = \apache_get_version();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}












function apache_getenv(string $variable, bool $walk_to_top = false): string
{
error_clear_last();
$safeResult = \apache_getenv($variable, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}







































function apache_lookup_uri(string $filename): object
{
error_clear_last();
$safeResult = \apache_lookup_uri($filename);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}









function apache_request_headers()
{
error_clear_last();
$safeResult = \apache_request_headers();
return $safeResult;
}









function apache_response_headers()
{
error_clear_last();
$safeResult = \apache_response_headers();
return $safeResult;
}













function apache_setenv(string $variable, string $value, bool $walk_to_top = false): void
{
error_clear_last();
$safeResult = \apache_setenv($variable, $value, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}












function getallheaders(): array
{
error_clear_last();
$safeResult = \getallheaders();
return $safeResult;
}



















function virtual(string $uri): void
{
error_clear_last();
$safeResult = \virtual($uri);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\HashException;



























function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = "")
{
error_clear_last();
$safeResult = \hash_hkdf($algo, $key, $length, $info, $salt);
return $safeResult;
}











function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
if ($stream_context !== null) {
$safeResult = \hash_update_file($context, $filename, $stream_context);
} else {
$safeResult = \hash_update_file($context, $filename);
}
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SwooleException;











function swoole_async_dns_lookup(string $hostname, callable $callback): void
{
error_clear_last();
$safeResult = \swoole_async_dns_lookup($hostname, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_readfile(string $filename, string $callback): void
{
error_clear_last();
$safeResult = \swoole_async_readfile($filename, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_write(string $filename, string $content, ?int $offset = null, ?callable $callback = null): void
{
error_clear_last();
if ($callback !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset, $callback);
} elseif ($offset !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset);
} else {
$safeResult = \swoole_async_write($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_writefile(string $filename, string $content, ?callable $callback = null, int $flags = 0): void
{
error_clear_last();
if ($flags !== 0) {
$safeResult = \swoole_async_writefile($filename, $content, $callback, $flags);
} elseif ($callback !== null) {
$safeResult = \swoole_async_writefile($filename, $content, $callback);
} else {
$safeResult = \swoole_async_writefile($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_defer(callable $callback): void
{
error_clear_last();
$safeResult = \swoole_event_defer($callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_del(int $fd): void
{
error_clear_last();
$safeResult = \swoole_event_del($fd);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}










function swoole_event_write(int $fd, string $data): void
{
error_clear_last();
$safeResult = \swoole_event_write($fd, $data);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SodiumException;












function sodium_crypto_aead_aegis128l_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}













function sodium_crypto_aead_aegis256_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}














function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}


















function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
{
error_clear_last();
$safeResult = \sodium_crypto_auth_verify($mac, $message, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}










function sodium_crypto_generichash_update(string &$state, string $message): bool
{
error_clear_last();
$safeResult = \sodium_crypto_generichash_update($state, $message);
return $safeResult;
}














function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_open(string $signed_message, string $public_key): string
{
error_clear_last();
$safeResult = \sodium_crypto_sign_open($signed_message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
{
error_clear_last();
$safeResult = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}















function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PspellException;









function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_personal($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_session($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}









function pspell_clear_session(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_clear_session($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


































function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = "")
{
error_clear_last();
$safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding);
return $safeResult;
}












function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_data_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}












function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_dict_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
$safeResult = \pspell_config_ignore($config, $min_length);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}






























function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
$safeResult = \pspell_config_mode($config, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}

















function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_personal($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_repl($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


















function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
$safeResult = \pspell_config_runtogether($config, $allow);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
$safeResult = \pspell_config_save_repl($config, $save);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_new_config(int $config): int
{
error_clear_last();
$safeResult = \pspell_new_config($config);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}





























































function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}
































































function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}









function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_save_wordlist($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
$safeResult = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MysqliException;







function mysqli_get_client_stats()
{
error_clear_last();
$safeResult = \mysqli_get_client_stats();
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\OutcontrolException;

















function ob_clean(): void
{
error_clear_last();
$safeResult = \ob_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}






















function ob_end_clean(): void
{
error_clear_last();
$safeResult = \ob_end_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}





















function ob_end_flush(): void
{
error_clear_last();
$safeResult = \ob_end_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}


















function ob_flush(): void
{
error_clear_last();
$safeResult = \ob_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}























function ob_get_clean(): string
{
error_clear_last();
$safeResult = \ob_get_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}






















function ob_get_flush(): string
{
error_clear_last();
$safeResult = \ob_get_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}







































































function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
{
error_clear_last();
if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
$safeResult = \ob_start($callback, $chunk_size, $flags);
} elseif ($chunk_size !== 0) {
$safeResult = \ob_start($callback, $chunk_size);
} elseif ($callback !== null) {
$safeResult = \ob_start($callback);
} else {
$safeResult = \ob_start();
}
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}































function output_add_rewrite_var(string $name, string $value): void
{
error_clear_last();
$safeResult = \output_add_rewrite_var($name, $value);
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}









function output_reset_rewrite_vars(): void
{
error_clear_last();
$safeResult = \output_reset_rewrite_vars();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\OpcacheException;










function opcache_compile_file(string $filename): void
{
error_clear_last();
$safeResult = \opcache_compile_file($filename);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
}











function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
$safeResult = \opcache_get_status($include_scripts);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MysqlException;























function mysql_close($link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_close($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}







































function mysql_connect(?string $server = null, ?string $username = null, ?string $password = null, bool $new_link = false, int $client_flags = 0)
{
error_clear_last();
if ($client_flags !== 0) {
$safeResult = \mysql_connect($server, $username, $password, $new_link, $client_flags);
} elseif ($new_link !== false) {
$safeResult = \mysql_connect($server, $username, $password, $new_link);
} elseif ($password !== null) {
$safeResult = \mysql_connect($server, $username, $password);
} elseif ($username !== null) {
$safeResult = \mysql_connect($server, $username);
} elseif ($server !== null) {
$safeResult = \mysql_connect($server);
} else {
$safeResult = \mysql_connect();
}
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_create_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_create_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}























function mysql_data_seek($result, int $row_number): void
{
error_clear_last();
$safeResult = \mysql_data_seek($result, $row_number);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_db_name($result, int $row, $field = null): string
{
error_clear_last();
$safeResult = \mysql_db_name($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}






















function mysql_db_query(string $database, string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_db_query($database, $query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



















function mysql_drop_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_drop_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}





















function mysql_fetch_lengths($result): array
{
error_clear_last();
$safeResult = \mysql_fetch_lengths($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



























function mysql_field_flags($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_flags($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_len($result, int $field_offset): int
{
error_clear_last();
$safeResult = \mysql_field_len($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_name($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_name($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_field_seek($result, int $field_offset): void
{
error_clear_last();
$safeResult = \mysql_field_seek($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_free_result($result): void
{
error_clear_last();
$safeResult = \mysql_free_result($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_get_host_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_host_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_proto_info($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_get_proto_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_server_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_server_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_list_dbs($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_dbs($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


























function mysql_list_fields(string $database_name, string $table_name, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_fields($database_name, $table_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_list_processes($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_processes($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
























function mysql_list_tables(string $database, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_tables($database, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}













function mysql_num_fields($result): int
{
error_clear_last();
$safeResult = \mysql_num_fields($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_num_rows($result): int
{
error_clear_last();
$safeResult = \mysql_num_rows($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}









































function mysql_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_real_escape_string(string $unescaped_string, $link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_real_escape_string($unescaped_string, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_result($result, int $row, $field = 0): string
{
error_clear_last();
$safeResult = \mysql_result($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_select_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_select_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_set_charset(string $charset, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_set_charset($charset, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}




















function mysql_tablename($result, int $i): string
{
error_clear_last();
$safeResult = \mysql_tablename($result, $i);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_thread_id($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_thread_id($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


































function mysql_unbuffered_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_unbuffered_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RrdException;










function rrd_create(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_create($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}











function rrd_first(string $file, int $raaindex = 0): int
{
error_clear_last();
$safeResult = \rrd_first($file, $raaindex);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}















function rrd_graph(string $filename, array $options): array
{
error_clear_last();
$safeResult = \rrd_graph($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}










function rrd_info(string $filename): array
{
error_clear_last();
$safeResult = \rrd_info($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_lastupdate(string $filename): array
{
error_clear_last();
$safeResult = \rrd_lastupdate($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_restore(string $xml_file, string $rrd_file, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rrd_restore($xml_file, $rrd_file, $options);
} else {
$safeResult = \rrd_restore($xml_file, $rrd_file);
}
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_tune(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_tune($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_update(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_update($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_xport(array $options): array
{
error_clear_last();
$safeResult = \rrd_xport($options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ErrorfuncException;































































function error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): void
{
error_clear_last();
if ($additional_headers !== null) {
$safeResult = \error_log($message, $message_type, $destination, $additional_headers);
} elseif ($destination !== null) {
$safeResult = \error_log($message, $message_type, $destination);
} else {
$safeResult = \error_log($message, $message_type);
}
if ($safeResult === false) {
throw ErrorfuncException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbaseException;









function fbird_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \fbird_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_add_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_add_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}





























function ibase_backup($service_handle, string $source_db, string $dest_file, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_backup($service_handle, $source_db, $dest_file, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \ibase_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_blob_create($link_identifier = null)
{
error_clear_last();
if ($link_identifier !== null) {
$safeResult = \ibase_blob_create($link_identifier);
} else {
$safeResult = \ibase_blob_create();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}












function ibase_blob_get($blob_handle, int $len): string
{
error_clear_last();
$safeResult = \ibase_blob_get($blob_handle, $len);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}














function ibase_close($connection_id = null): void
{
error_clear_last();
if ($connection_id !== null) {
$safeResult = \ibase_close($connection_id);
} else {
$safeResult = \ibase_close();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}















function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}



































function ibase_connect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_connect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_connect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_connect($database);
} else {
$safeResult = \ibase_connect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_delete_user($service_handle, string $user_name): void
{
error_clear_last();
$safeResult = \ibase_delete_user($service_handle, $user_name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_drop_db($connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \ibase_drop_db($connection);
} else {
$safeResult = \ibase_drop_db();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_free_event_handler($event): void
{
error_clear_last();
$safeResult = \ibase_free_event_handler($event);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}









function ibase_free_query($query): void
{
error_clear_last();
$safeResult = \ibase_free_query($query);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










function ibase_free_result($result_identifier): void
{
error_clear_last();
$safeResult = \ibase_free_result($result_identifier);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_maintain_db($service_handle, string $db, int $action, int $argument = 0): void
{
error_clear_last();
$safeResult = \ibase_maintain_db($service_handle, $db, $action, $argument);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_modify_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_name_result($result, string $name): void
{
error_clear_last();
$safeResult = \ibase_name_result($result, $name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










































function ibase_pconnect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_pconnect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_pconnect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_pconnect($database);
} else {
$safeResult = \ibase_pconnect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}
































function ibase_restore($service_handle, string $source_file, string $dest_db, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_restore($service_handle, $source_file, $dest_db, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}















function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_service_attach(string $host, string $dba_username, string $dba_password)
{
error_clear_last();
$safeResult = \ibase_service_attach($host, $dba_username, $dba_password);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}









function ibase_service_detach($service_handle): void
{
error_clear_last();
$safeResult = \ibase_service_detach($service_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UopzException;









function uopz_extend(string $class, string $parent): void
{
error_clear_last();
$safeResult = \uopz_extend($class, $parent);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}










function uopz_implement(string $class, string $interface): void
{
error_clear_last();
$safeResult = \uopz_implement($class, $interface);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MbstringException;
















function mb_chr(int $codepoint, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_chr($codepoint, $encoding);
} else {
$safeResult = \mb_chr($codepoint);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


























function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
{
error_clear_last();
if ($from_encoding !== null) {
$safeResult = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
$safeResult = \mb_convert_encoding($string, $to_encoding);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}































function mb_detect_order($encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_detect_order($encoding);
} else {
$safeResult = \mb_detect_order();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_encoding_aliases(string $encoding)
{
error_clear_last();
$safeResult = \mb_encoding_aliases($encoding);
return $safeResult;
}




































function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
} else {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}

















function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_getregs(): array
{
error_clear_last();
$safeResult = \mb_ereg_search_getregs();
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
















function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern);
} else {
$safeResult = \mb_ereg_search_init($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}











function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_regs($pattern);
} else {
$safeResult = \mb_ereg_search_regs();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
$safeResult = \mb_ereg_search_setpos($offset);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}















function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}





























function mb_get_info(string $type = "all")
{
error_clear_last();
$safeResult = \mb_get_info($type);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




















function mb_http_output(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_http_output($encoding);
} else {
$safeResult = \mb_http_output();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


















function mb_internal_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_internal_encoding($encoding);
} else {
$safeResult = \mb_internal_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_ord(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_ord($string, $encoding);
} else {
$safeResult = \mb_ord($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
$safeResult = \mb_parse_str($string, $result);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_regex_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_regex_encoding($encoding);
} else {
$safeResult = \mb_regex_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}



























































function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], ?string $additional_params = null): void
{
error_clear_last();
if ($additional_params !== null) {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
} else {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_split(string $pattern, string $string, int $limit = -1): array
{
error_clear_last();
$safeResult = \mb_split($pattern, $string, $limit);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GnupgException;











function gnupg_adddecryptkey($identifier, string $fingerprint, string $passphrase): void
{
error_clear_last();
$safeResult = \gnupg_adddecryptkey($identifier, $fingerprint, $passphrase);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}











function gnupg_addencryptkey($identifier, string $fingerprint): void
{
error_clear_last();
$safeResult = \gnupg_addencryptkey($identifier, $fingerprint);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_addsignkey($identifier, string $fingerprint, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint, $passphrase);
} else {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint);
}
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_cleardecryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_cleardecryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearencryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearencryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearsignkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearsignkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_deletekey($identifier, string $key, bool $allow_secret): void
{
error_clear_last();
$safeResult = \gnupg_deletekey($identifier, $key, $allow_secret);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}













function gnupg_setarmor($identifier, int $armor): void
{
error_clear_last();
$safeResult = \gnupg_setarmor($identifier, $armor);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}


















function gnupg_setsignmode($identifier, int $signmode): void
{
error_clear_last();
$safeResult = \gnupg_setsignmode($identifier, $signmode);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlException;








function xml_parser_free(\XMLParser $parser): void
{
error_clear_last();
$safeResult = \xml_parser_free($parser);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}







































































function xml_parser_set_option(\XMLParser $parser, int $option, $value): void
{
error_clear_last();
$safeResult = \xml_parser_set_option($parser, $option, $value);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}





























































function xml_set_character_data_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_character_data_handler($parser, $handler);
return $safeResult;
}





























































function xml_set_default_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_default_handler($parser, $handler);
return $safeResult;
}



















































































function xml_set_element_handler(\XMLParser $parser, callable $start_handler, callable $end_handler): bool
{
error_clear_last();
$safeResult = \xml_set_element_handler($parser, $start_handler, $end_handler);
return $safeResult;
}




























































function xml_set_end_namespace_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_end_namespace_decl_handler($parser, $handler);
return $safeResult;
}
































































































function xml_set_external_entity_ref_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_external_entity_ref_handler($parser, $handler);
return $safeResult;
}




































































































function xml_set_notation_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_notation_decl_handler($parser, $handler);
return $safeResult;
}













function xml_set_object(\XMLParser $parser, object $object): bool
{
error_clear_last();
$safeResult = \xml_set_object($parser, $object);
return $safeResult;
}








































































function xml_set_processing_instruction_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_processing_instruction_handler($parser, $handler);
return $safeResult;
}





































































function xml_set_start_namespace_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_start_namespace_decl_handler($parser, $handler);
return $safeResult;
}












































































































function xml_set_unparsed_entity_decl_handler(\XMLParser $parser, callable $handler): bool
{
error_clear_last();
$safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SemException;


















function msg_get_queue(int $key, int $permissions = 0666): \SysvMessageQueue
{
error_clear_last();
$safeResult = \msg_get_queue($key, $permissions);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}









function msg_queue_exists(int $key): void
{
error_clear_last();
$safeResult = \msg_queue_exists($key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}









































































function msg_receive(\SysvMessageQueue $queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function msg_remove_queue(\SysvMessageQueue $queue): void
{
error_clear_last();
$safeResult = \msg_remove_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



































function msg_send(\SysvMessageQueue $queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



















function msg_set_queue(\SysvMessageQueue $queue, array $data): void
{
error_clear_last();
$safeResult = \msg_set_queue($queue, $data);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















































































function msg_stat_queue(\SysvMessageQueue $queue): array
{
error_clear_last();
$safeResult = \msg_stat_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}





















function sem_acquire(\SysvSemaphore $semaphore, bool $non_blocking = false): void
{
error_clear_last();
$safeResult = \sem_acquire($semaphore, $non_blocking);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}

























function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): \SysvSemaphore
{
error_clear_last();
$safeResult = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}















function sem_release(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_release($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function sem_remove(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_remove($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
























function shm_attach(int $key, ?int $size = null, int $permissions = 0666): \SysvSharedMemory
{
error_clear_last();
if ($permissions !== 0666) {
$safeResult = \shm_attach($key, $size, $permissions);
} elseif ($size !== null) {
$safeResult = \shm_attach($key, $size);
} else {
$safeResult = \shm_attach($key);
}
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}












function shm_detach(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_detach($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















function shm_put_var(\SysvSharedMemory $shm, int $key, $value): void
{
error_clear_last();
$safeResult = \shm_put_var($shm, $key, $value);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}











function shm_remove_var(\SysvSharedMemory $shm, int $key): void
{
error_clear_last();
$safeResult = \shm_remove_var($shm, $key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}










function shm_remove(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_remove($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SplException;












function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_implements($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}













function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_parents($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}














function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_uses($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}






































function spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
$safeResult = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
$safeResult = \spl_autoload_register($callback, $throw);
} elseif ($callback !== null) {
$safeResult = \spl_autoload_register($callback);
} else {
$safeResult = \spl_autoload_register();
}
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}














function spl_autoload_unregister($callback): void
{
error_clear_last();
$safeResult = \spl_autoload_unregister($callback);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XdiffException;













function xdiff_file_bdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}














function xdiff_file_bpatch(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bpatch($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_diff_binary($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}




















function xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): void
{
error_clear_last();
$safeResult = \xdiff_file_diff($old_file, $new_file, $dest, $context, $minimal);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_patch_binary(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_patch_binary($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}



















function xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_rabdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}













function xdiff_string_bpatch(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_bpatch($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}















function xdiff_string_patch_binary(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_patch_binary($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
























function xdiff_string_patch(string $str, string $patch, ?int $flags = null, ?string &$error = null): string
{
error_clear_last();
if ($error !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags, $error);
} elseif ($flags !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags);
} else {
$safeResult = \xdiff_string_patch($str, $patch);
}
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\YamlException;




















function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
























function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_url($url, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}





















function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse($input, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SolrException;








function solr_get_version(): string
{
error_clear_last();
$safeResult = \solr_get_version();
if ($safeResult === false) {
throw SolrException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;















function date_create_immutable(string $datetime = "now", ?\DateTimeZone $timezone = null): \DateTimeImmutable
{
error_clear_last();
if ($timezone !== null) {
$safeResult = \date_create_immutable($datetime, $timezone);
} else {
$safeResult = \date_create_immutable($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function date_create(?string $datetime = "now", ?\DateTimeZone $timezone = null): \DateTime
{
error_clear_last();
if ($timezone !== null) {
$safeResult = \date_create($datetime, $timezone);
} else {
$safeResult = \date_create($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}












































function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse_from_format($format, $datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}





























































function date_parse(string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse($datetime);
return $safeResult;
}

































































































function date_sun_info(int $timestamp, float $latitude, float $longitude)
{
error_clear_last();
$safeResult = \date_sun_info($timestamp, $latitude, $longitude);
return $safeResult;
}




















































































function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunrise($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunset($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function date(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \date($format, $timestamp);
} else {
$safeResult = \date($format);
}
return $safeResult;
}


































function gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \gmmktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \gmmktime($hour, $minute);
} else {
$safeResult = \gmmktime($hour);
}
return $safeResult;
}























function gmstrftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \gmstrftime($format, $timestamp);
} else {
$safeResult = \gmstrftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}






















































































































function idate(string $format, ?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \idate($format, $timestamp);
} else {
$safeResult = \idate($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}







































function mktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \mktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \mktime($hour, $minute);
} else {
$safeResult = \mktime($hour);
}
return $safeResult;
}

















































































































































































































































































































function strftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \strftime($format, $timestamp);
} else {
$safeResult = \strftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}










































































function strptime(string $timestamp, string $format): array
{
error_clear_last();
$safeResult = \strptime($timestamp, $format);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function strtotime(string $datetime, ?int $baseTimestamp = null): int
{
error_clear_last();
if ($baseTimestamp !== null) {
$safeResult = \strtotime($datetime, $baseTimestamp);
} else {
$safeResult = \strtotime($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string
{
error_clear_last();
$safeResult = \timezone_name_from_abbr($abbr, $utcOffset, $isDST);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImapException;










function imap_8bit(string $string): string
{
error_clear_last();
$safeResult = \imap_8bit($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



















function imap_append(\IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): void
{
error_clear_last();
if ($internal_date !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options, $internal_date);
} elseif ($options !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options);
} else {
$safeResult = \imap_append($imap, $folder, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_base64(string $string): string
{
error_clear_last();
$safeResult = \imap_base64($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_binary(string $string): string
{
error_clear_last();
$safeResult = \imap_binary($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}







































function imap_body(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_body($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_bodystruct(\IMAP\Connection $imap, int $message_num, string $section): \stdClass
{
error_clear_last();
$safeResult = \imap_bodystruct($imap, $message_num, $section);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}








































function imap_check(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_check($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_clearflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): bool
{
error_clear_last();
$safeResult = \imap_clearflag_full($imap, $sequence, $flag, $options);
return $safeResult;
}













function imap_close(\IMAP\Connection $imap, int $flags = 0): bool
{
error_clear_last();
$safeResult = \imap_close($imap, $flags);
return $safeResult;
}












function imap_createmailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_createmailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_deletemailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_deletemailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












































































































function imap_fetch_overview(\IMAP\Connection $imap, string $sequence, int $flags = 0): array
{
error_clear_last();
$safeResult = \imap_fetch_overview($imap, $sequence, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



































function imap_fetchbody(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchbody($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




































function imap_fetchheader(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchheader($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_fetchmime(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchmime($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










































































































































function imap_fetchstructure(\IMAP\Connection $imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_fetchstructure($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_gc(\IMAP\Connection $imap, int $flags): bool
{
error_clear_last();
$safeResult = \imap_gc($imap, $flags);
return $safeResult;
}












function imap_getacl(\IMAP\Connection $imap, string $mailbox): array
{
error_clear_last();
$safeResult = \imap_getacl($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getmailboxes(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getmailboxes($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getsubscribed(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getsubscribed($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































































function imap_headerinfo(\IMAP\Connection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_headers(\IMAP\Connection $imap): array
{
error_clear_last();
$safeResult = \imap_headers($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

































function imap_listscan(\IMAP\Connection $imap, string $reference, string $pattern, string $content): array
{
error_clear_last();
$safeResult = \imap_listscan($imap, $reference, $pattern, $content);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_lsub(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_lsub($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































































function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
$safeResult = \imap_mail_compose($envelope, $bodies);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}





























function imap_mail_copy(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}

























function imap_mail_move(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): void
{
error_clear_last();
if ($return_path !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
} elseif ($bcc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
} elseif ($cc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc);
} elseif ($additional_headers !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers);
} else {
$safeResult = \imap_mail($to, $subject, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



















































function imap_mailboxmsginfo(\IMAP\Connection $imap)
{
error_clear_last();
$safeResult = \imap_mailboxmsginfo($imap);
return $safeResult;
}


















function imap_mime_header_decode(string $string): array
{
error_clear_last();
$safeResult = \imap_mime_header_decode($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
$safeResult = \imap_mutf7_to_utf8($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_num_msg(\IMAP\Connection $imap): int
{
error_clear_last();
$safeResult = \imap_num_msg($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














































































































































































































function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): \IMAP\Connection
{
error_clear_last();
$safeResult = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_qprint(string $string): string
{
error_clear_last();
$safeResult = \imap_qprint($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_renamemailbox(\IMAP\Connection $imap, string $from, string $to): void
{
error_clear_last();
$safeResult = \imap_renamemailbox($imap, $from, $to);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
$safeResult = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_savebody(\IMAP\Connection $imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_set_quota(\IMAP\Connection $imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
$safeResult = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}














function imap_setacl(\IMAP\Connection $imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
$safeResult = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



























function imap_setflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): bool
{
error_clear_last();
$safeResult = \imap_setflag_full($imap, $sequence, $flag, $options);
return $safeResult;
}



































































function imap_sort(\IMAP\Connection $imap, int $criteria, int $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array
{
error_clear_last();
if ($charset !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
} elseif ($search_criteria !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
} else {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

























































function imap_status(\IMAP\Connection $imap, string $mailbox, int $flags): \stdClass
{
error_clear_last();
$safeResult = \imap_status($imap, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}











function imap_subscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_subscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}


























function imap_thread(\IMAP\Connection $imap, int $flags = SE_FREE): array
{
error_clear_last();
$safeResult = \imap_thread($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




















function imap_timeout(int $timeout_type, int $timeout = -1)
{
error_clear_last();
$safeResult = \imap_timeout($timeout_type, $timeout);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_undelete(\IMAP\Connection $imap, string $message_nums, int $flags = 0): bool
{
error_clear_last();
$safeResult = \imap_undelete($imap, $message_nums, $flags);
return $safeResult;
}











function imap_unsubscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_unsubscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
$safeResult = \imap_utf8_to_mutf7($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\NetworkException;








function closelog(): bool
{
error_clear_last();
$safeResult = \closelog();
return $safeResult;
}




















































































































































































































function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
$safeResult = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}



















































function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function gethostname(): string
{
error_clear_last();
$safeResult = \gethostname();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobyname(string $protocol): int
{
error_clear_last();
$safeResult = \getprotobyname($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobynumber(int $protocol): string
{
error_clear_last();
$safeResult = \getprotobynumber($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function getservbyport(int $port, string $protocol): string
{
error_clear_last();
$safeResult = \getservbyport($port, $protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function header_register_callback(callable $callback): void
{
error_clear_last();
$safeResult = \header_register_callback($callback);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}










function inet_ntop(string $ip): string
{
error_clear_last();
$safeResult = \inet_ntop($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}















function inet_pton(string $ip): string
{
error_clear_last();
$safeResult = \inet_pton($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function long2ip(int $ip)
{
error_clear_last();
$safeResult = \long2ip($ip);
return $safeResult;
}
































































































function net_get_interfaces(): array
{
error_clear_last();
$safeResult = \net_get_interfaces();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











































function openlog(string $prefix, int $flags, int $facility): bool
{
error_clear_last();
$safeResult = \openlog($prefix, $flags, $facility);
return $safeResult;
}




















function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}





























function syslog(int $priority, string $message): bool
{
error_clear_last();
$safeResult = \syslog($priority, $message);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UrlException;














function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
$safeResult = \base64_decode($string, $strict);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}

















function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \get_headers($url, $associative, $context);
} else {
$safeResult = \get_headers($url, $associative);
}
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}






































function get_meta_tags(string $filename, bool $use_include_path = false): array
{
error_clear_last();
$safeResult = \get_meta_tags($filename, $use_include_path);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}


























































































function parse_url(string $url, int $component = -1)
{
error_clear_last();
$safeResult = \parse_url($url, $component);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PosixException;

















function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_access($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}


















function posix_eaccess(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_eaccess($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























































function posix_getgrgid(int $group_id): array
{
error_clear_last();
$safeResult = \posix_getgrgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}























































function posix_getgrnam(string $name): array
{
error_clear_last();
$safeResult = \posix_getgrnam($name);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_getgroups(): array
{
error_clear_last();
$safeResult = \posix_getgroups();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









function posix_getlogin(): string
{
error_clear_last();
$safeResult = \posix_getlogin();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}



















































































function posix_getpwuid(int $user_id): array
{
error_clear_last();
$safeResult = \posix_getpwuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}







































































































function posix_getrlimit(?int $resource = null): array
{
error_clear_last();
if ($resource !== null) {
$safeResult = \posix_getrlimit($resource);
} else {
$safeResult = \posix_getrlimit();
}
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}














function posix_getsid(int $process_id): int
{
error_clear_last();
$safeResult = \posix_getsid($process_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
$safeResult = \posix_initgroups($username, $group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
$safeResult = \posix_kill($process_id, $signal);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}
















function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \posix_mkfifo($filename, $permissions);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}

















function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
$safeResult = \posix_mknod($filename, $flags, $major, $minor);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setegid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setegid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_seteuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_seteuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}














function posix_setgid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
$safeResult = \posix_setpgid($process_id, $process_group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
$safeResult = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}









function posix_setsid(): int
{
error_clear_last();
$safeResult = \posix_setsid();
if ($safeResult === -1) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}











function posix_setuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_setuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}







































function posix_times(): array
{
error_clear_last();
$safeResult = \posix_times();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









































function posix_uname(): array
{
error_clear_last();
$safeResult = \posix_uname();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UodbcException;























function odbc_autocommit(\Odbc\Connection $odbc, ?bool $enable = null)
{
error_clear_last();
if ($enable !== null) {
$safeResult = \odbc_autocommit($odbc, $enable);
} else {
$safeResult = \odbc_autocommit($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































































































function odbc_binmode(int $statement, int $mode): bool
{
error_clear_last();
$safeResult = \odbc_binmode($statement, $mode);
return $safeResult;
}






































function odbc_columnprivileges(\Odbc\Connection $odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
$safeResult = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
return $safeResult;
}














































function odbc_columns(\Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table, $column);
} elseif ($table !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_columns($odbc, $catalog);
} else {
$safeResult = \odbc_columns($odbc);
}
return $safeResult;
}










function odbc_commit(\Odbc\Connection $odbc): void
{
error_clear_last();
$safeResult = \odbc_commit($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_connect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER): \Odbc\Connection
{
error_clear_last();
$safeResult = \odbc_connect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_cursor(\Odbc\Result $statement): string
{
error_clear_last();
$safeResult = \odbc_cursor($statement);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

















function odbc_data_source(\Odbc\Connection $odbc, int $fetch_type): array
{
error_clear_last();
$safeResult = \odbc_data_source($odbc, $fetch_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_exec(\Odbc\Connection $odbc, string $query): \Odbc\Result
{
error_clear_last();
$safeResult = \odbc_exec($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















function odbc_execute(\Odbc\Result $statement, array $params = []): void
{
error_clear_last();
$safeResult = \odbc_execute($statement, $params);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
















function odbc_fetch_into(\Odbc\Result $statement, ?array &$array, ?int $row = null): int
{
error_clear_last();
if ($row !== null) {
$safeResult = \odbc_fetch_into($statement, $array, $row);
} else {
$safeResult = \odbc_fetch_into($statement, $array);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_len(\Odbc\Result $statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_len($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_name(\Odbc\Result $statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_name($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_field_num(\Odbc\Result $statement, string $field): int
{
error_clear_last();
$safeResult = \odbc_field_num($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_scale(\Odbc\Result $statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_scale($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_type(\Odbc\Result $statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_type($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































function odbc_foreignkeys(\Odbc\Connection $odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
$safeResult = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
return $safeResult;
}

































function odbc_gettypeinfo(\Odbc\Connection $odbc, int $data_type = 0)
{
error_clear_last();
$safeResult = \odbc_gettypeinfo($odbc, $data_type);
return $safeResult;
}














function odbc_longreadlen(\Odbc\Result $statement, int $length): bool
{
error_clear_last();
$safeResult = \odbc_longreadlen($statement, $length);
return $safeResult;
}










function odbc_num_fields(\Odbc\Result $statement): int
{
error_clear_last();
$safeResult = \odbc_num_fields($statement);
if ($safeResult === -1) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}






















function odbc_pconnect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER): \Odbc\Connection
{
error_clear_last();
$safeResult = \odbc_pconnect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}



















function odbc_prepare(\Odbc\Connection $odbc, string $query): \Odbc\Result
{
error_clear_last();
$safeResult = \odbc_prepare($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

























function odbc_primarykeys(\Odbc\Connection $odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_primarykeys($odbc, $catalog, $schema, $table);
return $safeResult;
}

















































function odbc_procedurecolumns($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
} elseif ($procedure !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog);
} else {
$safeResult = \odbc_procedurecolumns($odbc);
}
return $safeResult;
}

































function odbc_procedures($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null): \Odbc\Result
{
error_clear_last();
if ($procedure !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedures($odbc, $catalog);
} else {
$safeResult = \odbc_procedures($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
















function odbc_result_all(\Odbc\Result $statement, string $format = ""): int
{
error_clear_last();
$safeResult = \odbc_result_all($statement, $format);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_result(\Odbc\Result $statement, $field)
{
error_clear_last();
$safeResult = \odbc_result($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_rollback(\Odbc\Connection $odbc): void
{
error_clear_last();
$safeResult = \odbc_rollback($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
































function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
$safeResult = \odbc_setoption($odbc, $which, $option, $value);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_specialcolumns(\Odbc\Connection $odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
$safeResult = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
return $safeResult;
}




































function odbc_statistics(\Odbc\Connection $odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
$safeResult = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
return $safeResult;
}
































function odbc_tableprivileges(\Odbc\Connection $odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
return $safeResult;
}











































































function odbc_tables(\Odbc\Connection $odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $types = null): \Odbc\Result
{
error_clear_last();
if ($types !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table, $types);
} elseif ($table !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_tables($odbc, $catalog);
} else {
$safeResult = \odbc_tables($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LzfException;










function lzf_compress(string $data): string
{
error_clear_last();
$safeResult = \lzf_compress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}











function lzf_decompress(string $data): string
{
error_clear_last();
$safeResult = \lzf_decompress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImageException;































































function getimagesize(string $filename, ?array &$image_info = null): ?array
{
error_clear_last();
$safeResult = \getimagesize($filename, $image_info);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function image_type_to_extension(int $image_type, bool $include_dot = true): string
{
error_clear_last();
$safeResult = \image_type_to_extension($image_type, $include_dot);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imageaffine(\GdImage $image, array $affine, ?array $clip = null): \GdImage
{
error_clear_last();
if ($clip !== null) {
$safeResult = \imageaffine($image, $affine, $clip);
} else {
$safeResult = \imageaffine($image, $affine);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
$safeResult = \imageaffinematrixconcat($matrix1, $matrix2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
$safeResult = \imageaffinematrixget($type, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagealphablending(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagealphablending($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imageantialias(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imageantialias($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagearc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
$safeResult = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
{
error_clear_last();
if ($speed !== -1) {
$safeResult = \imageavif($image, $file, $quality, $speed);
} elseif ($quality !== -1) {
$safeResult = \imageavif($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imageavif($image, $file);
} else {
$safeResult = \imageavif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagebmp(\GdImage $image, $file = null, bool $compressed = true): void
{
error_clear_last();
if ($compressed !== true) {
$safeResult = \imagebmp($image, $file, $compressed);
} elseif ($file !== null) {
$safeResult = \imagebmp($image, $file);
} else {
$safeResult = \imagebmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





















function imagechar(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagechar($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecharup(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagecharup($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagecolorat(\GdImage $image, int $x, int $y): int
{
error_clear_last();
$safeResult = \imagecolorat($image, $x, $y);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagecolordeallocate(\GdImage $image, int $color): void
{
error_clear_last();
$safeResult = \imagecolordeallocate($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagecolormatch(\GdImage $image1, \GdImage $image2): void
{
error_clear_last();
$safeResult = \imagecolormatch($image1, $image2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecolorset(\GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
{
error_clear_last();
$safeResult = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}












function imagecolorsforindex(\GdImage $image, int $color): array
{
error_clear_last();
$safeResult = \imagecolorsforindex($image, $color);
return $safeResult;
}














function imageconvolution(\GdImage $image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
$safeResult = \imageconvolution($image, $matrix, $divisor, $offset);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagecopy(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




























function imagecopymerge(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
































function imagecopymergegray(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresampled(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresized(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagecreate(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreate($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromavif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromavif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrombmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrombmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd2(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromgif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromjpeg(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromjpeg($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrompng(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrompng($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecreatefromstring(string $data): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromstring($data);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromtga(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromtga($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwbmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwbmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatefromwebp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwebp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxbm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxbm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxpm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxpm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatetruecolor(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatetruecolor($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecrop(\GdImage $image, array $rectangle): \GdImage
{
error_clear_last();
$safeResult = \imagecrop($image, $rectangle);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagecropauto(\GdImage $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1): \GdImage
{
error_clear_last();
$safeResult = \imagecropauto($image, $mode, $threshold, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}

















function imagedashedline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagedashedline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagedestroy(\GdImage $image): void
{
error_clear_last();
$safeResult = \imagedestroy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagefill(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagefill($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




































function imagefilledarc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
$safeResult = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
















function imagefilledellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagefilledrectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagefilltoborder(\GdImage $image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
$safeResult = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










































































































































function imagefilter(\GdImage $image, int $filter, int ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \imagefilter($image, $filter, ...$args);
} else {
$safeResult = \imagefilter($image, $filter);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











































function imageflip(\GdImage $image, int $mode): void
{
error_clear_last();
$safeResult = \imageflip($image, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















































































function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































































function imagefttext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagegammacorrect(\GdImage $image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
$safeResult = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagegd(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegd($image, $file);
} else {
$safeResult = \imagegd($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagegd2(\GdImage $image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
if ($mode !== IMG_GD2_RAW) {
$safeResult = \imagegd2($image, $file, $chunk_size, $mode);
} elseif ($chunk_size !== 128) {
$safeResult = \imagegd2($image, $file, $chunk_size);
} elseif ($file !== null) {
$safeResult = \imagegd2($image, $file);
} else {
$safeResult = \imagegd2($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagegif(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegif($image, $file);
} else {
$safeResult = \imagegif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}









function imagegrabscreen(): \GdImage
{
error_clear_last();
$safeResult = \imagegrabscreen();
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
$safeResult = \imagegrabwindow($handle, $client_area);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagejpeg(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagejpeg($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagejpeg($image, $file);
} else {
$safeResult = \imagejpeg($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























































function imagelayereffect(\GdImage $image, int $effect): void
{
error_clear_last();
$safeResult = \imagelayereffect($image, $effect);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imageline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


























































function imageloadfont(string $filename): int
{
error_clear_last();
$safeResult = \imageloadfont($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
























function imagepng(\GdImage $image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
if ($filters !== -1) {
$safeResult = \imagepng($image, $file, $quality, $filters);
} elseif ($quality !== -1) {
$safeResult = \imagepng($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagepng($image, $file);
} else {
$safeResult = \imagepng($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagerectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



























function imageresolution(\GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null)
{
error_clear_last();
if ($resolution_y !== null) {
$safeResult = \imageresolution($image, $resolution_x, $resolution_y);
} elseif ($resolution_x !== null) {
$safeResult = \imageresolution($image, $resolution_x);
} else {
$safeResult = \imageresolution($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}


















function imagerotate(\GdImage $image, float $angle, int $background_color): \GdImage
{
error_clear_last();
$safeResult = \imagerotate($image, $angle, $background_color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




























function imagesavealpha(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagesavealpha($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























function imagescale(\GdImage $image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED): \GdImage
{
error_clear_last();
$safeResult = \imagescale($image, $width, $height, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagesetbrush(\GdImage $image, \GdImage $brush): void
{
error_clear_last();
$safeResult = \imagesetbrush($image, $brush);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagesetclip(\GdImage $image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
$safeResult = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































































function imagesetinterpolation(\GdImage $image, int $method = IMG_BILINEAR_FIXED): void
{
error_clear_last();
$safeResult = \imagesetinterpolation($image, $method);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}














function imagesetpixel(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagesetpixel($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagesetstyle(\GdImage $image, array $style): void
{
error_clear_last();
$safeResult = \imagesetstyle($image, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagesetthickness(\GdImage $image, int $thickness): void
{
error_clear_last();
$safeResult = \imagesetthickness($image, $thickness);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagesettile(\GdImage $image, \GdImage $tile): void
{
error_clear_last();
$safeResult = \imagesettile($image, $tile);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagestring(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestring($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagestringup(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestringup($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










function imagesx(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesx($image);
return $safeResult;
}










function imagesy(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesy($image);
return $safeResult;
}





















function imagetruecolortopalette(\GdImage $image, bool $dither, int $num_colors): void
{
error_clear_last();
$safeResult = \imagetruecolortopalette($image, $dither, $num_colors);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































function imagettftext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagewbmp(\GdImage $image, $file = null, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagewbmp($image, $file, $foreground_color);
} elseif ($file !== null) {
$safeResult = \imagewbmp($image, $file);
} else {
$safeResult = \imagewbmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagewebp(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagewebp($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagewebp($image, $file);
} else {
$safeResult = \imagewebp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagexbm(\GdImage $image, $filename, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagexbm($image, $filename, $foreground_color);
} else {
$safeResult = \imagexbm($image, $filename);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
$safeResult = \iptcembed($iptc_data, $filename, $spool);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function iptcparse(string $iptc_block): array
{
error_clear_last();
$safeResult = \iptcparse($iptc_block);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ReadlineException;








function readline_add_history(string $prompt): bool
{
error_clear_last();
$safeResult = \readline_add_history($prompt);
return $safeResult;
}



















function readline_callback_handler_install(string $prompt, callable $callback): bool
{
error_clear_last();
$safeResult = \readline_callback_handler_install($prompt, $callback);
return $safeResult;
}








function readline_clear_history(): bool
{
error_clear_last();
$safeResult = \readline_clear_history();
return $safeResult;
}











function readline_completion_function(callable $callback): void
{
error_clear_last();
$safeResult = \readline_completion_function($callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_read_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_read_history($filename);
} else {
$safeResult = \readline_read_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_write_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_write_history($filename);
} else {
$safeResult = \readline_write_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ArrayException;

















function array_all(array $array, callable $callback): void
{
error_clear_last();
$safeResult = \array_all($array, $callback);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}













function array_combine(array $keys, array $values)
{
error_clear_last();
$safeResult = \array_combine($keys, $values);
return $safeResult;
}




















function array_flip(array $array): array
{
error_clear_last();
$safeResult = \array_flip($array);
return $safeResult;
}


























function array_replace_recursive(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace_recursive($array, ...$replacements);
} else {
$safeResult = \array_replace_recursive($array);
}
return $safeResult;
}
















function array_replace(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace($array, ...$replacements);
} else {
$safeResult = \array_replace($array);
}
return $safeResult;
}
























function array_walk_recursive(&$array, callable $callback, $arg = null): bool
{
error_clear_last();
if ($arg !== null) {
$safeResult = \array_walk_recursive($array, $callback, $arg);
} else {
$safeResult = \array_walk_recursive($array, $callback);
}
return $safeResult;
}









function shuffle(array &$array): bool
{
error_clear_last();
$safeResult = \shuffle($array);
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FilesystemException;













function chgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \chgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


































function chmod(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \chmod($filename, $permissions);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function chown(string $filename, $user): void
{
error_clear_last();
$safeResult = \chown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}



















function copy(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \copy($from, $to, $context);
} else {
$safeResult = \copy($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function disk_free_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_free_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function disk_total_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_total_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fclose($stream): void
{
error_clear_last();
$safeResult = \fclose($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fdatasync($stream): void
{
error_clear_last();
$safeResult = \fdatasync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function fflush($stream): void
{
error_clear_last();
$safeResult = \fflush($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}




































function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context);
} else {
$safeResult = \file_get_contents($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































































function file_put_contents(string $filename, $data, int $flags = 0, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \file_put_contents($filename, $data, $flags, $context);
} else {
$safeResult = \file_put_contents($filename, $data, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}

























































function file(string $filename, int $flags = 0, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \file($filename, $flags, $context);
} else {
$safeResult = \file($filename, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function fileatime(string $filename): int
{
error_clear_last();
$safeResult = \fileatime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filectime(string $filename): int
{
error_clear_last();
$safeResult = \filectime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fileinode(string $filename): int
{
error_clear_last();
$safeResult = \fileinode($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function filemtime(string $filename): int
{
error_clear_last();
$safeResult = \filemtime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












function fileowner(string $filename): int
{
error_clear_last();
$safeResult = \fileowner($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
























function fileperms(string $filename): int
{
error_clear_last();
$safeResult = \fileperms($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filesize(string $filename): int
{
error_clear_last();
$safeResult = \filesize($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function filetype(string $filename): string
{
error_clear_last();
$safeResult = \filetype($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
$safeResult = \flock($stream, $operation, $would_block);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}









































































































































































































function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \fopen($filename, $mode, $use_include_path, $context);
} else {
$safeResult = \fopen($filename, $mode, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}









































function fread($stream, int $length): string
{
error_clear_last();
$safeResult = \fread($stream, $length);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function fstat($stream): array
{
error_clear_last();
$safeResult = \fstat($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function fsync($stream): void
{
error_clear_last();
$safeResult = \fsync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function ftell($stream): int
{
error_clear_last();
$safeResult = \ftell($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



















function ftruncate($stream, int $size): void
{
error_clear_last();
$safeResult = \ftruncate($stream, $size);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \fwrite($stream, $data, $length);
} else {
$safeResult = \fwrite($stream, $data);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function glob(string $pattern, int $flags = 0): array
{
error_clear_last();
$safeResult = \glob($pattern, $flags);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function lchgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \lchgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function lchown(string $filename, $user): void
{
error_clear_last();
$safeResult = \lchown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}










function link(string $target, string $link): void
{
error_clear_last();
$safeResult = \link($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


















function lstat(string $filename): array
{
error_clear_last();
$safeResult = \lstat($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}






























function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \mkdir($directory, $permissions, $recursive, $context);
} else {
$safeResult = \mkdir($directory, $permissions, $recursive);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}































function parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_file($filename, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function pclose($handle): int
{
error_clear_last();
$safeResult = \pclose($handle);
if ($safeResult === -1) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function popen(string $command, string $mode)
{
error_clear_last();
$safeResult = \popen($command, $mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}














function readfile(string $filename, bool $use_include_path = false, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \readfile($filename, $use_include_path, $context);
} else {
$safeResult = \readfile($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function readlink(string $path): string
{
error_clear_last();
$safeResult = \readlink($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function realpath(string $path): string
{
error_clear_last();
$safeResult = \realpath($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function rename(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rename($from, $to, $context);
} else {
$safeResult = \rename($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}











function rewind($stream): void
{
error_clear_last();
$safeResult = \rewind($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rmdir($directory, $context);
} else {
$safeResult = \rmdir($directory);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function symlink(string $target, string $link): void
{
error_clear_last();
$safeResult = \symlink($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}














function tempnam(string $directory, string $prefix): string
{
error_clear_last();
$safeResult = \tempnam($directory, $prefix);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function tmpfile()
{
error_clear_last();
$safeResult = \tmpfile();
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}





















function touch(string $filename, ?int $mtime = null, ?int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
$safeResult = \touch($filename, $mtime, $atime);
} elseif ($mtime !== null) {
$safeResult = \touch($filename, $mtime);
} else {
$safeResult = \touch($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function unlink(string $filename, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \unlink($filename, $context);
} else {
$safeResult = \unlink($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilterException;












function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_input_array($type, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}













function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_var_array($array, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\Oci8Exception;


































































































function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
$safeResult = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






































































































































































































function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_cancel($statement): void
{
error_clear_last();
$safeResult = \oci_cancel($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























function oci_commit($connection): void
{
error_clear_last();
$safeResult = \oci_commit($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































































































function oci_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}




























function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_define_by_name($statement, $column, $var, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}












































































function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
{
error_clear_last();
$safeResult = \oci_execute($statement, $mode);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_field_name($statement, $column): string
{
error_clear_last();
$safeResult = \oci_field_name($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_precision($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_precision($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_scale($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_scale($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_size($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_size($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}













function oci_field_type_raw($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_type_raw($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_type($statement, $column)
{
error_clear_last();
$safeResult = \oci_field_type($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}









function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
$safeResult = \oci_free_descriptor($lob);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_free_statement($statement): void
{
error_clear_last();
$safeResult = \oci_free_statement($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}














function oci_new_collection($connection, string $type_name, ?string $schema = null)
{
error_clear_last();
if ($schema !== null) {
$safeResult = \oci_new_collection($connection, $type_name, $schema);
} else {
$safeResult = \oci_new_collection($connection, $type_name);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}


























































































function oci_new_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_new_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_new_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_new_cursor($connection)
{
error_clear_last();
$safeResult = \oci_new_cursor($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}














function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$safeResult = \oci_new_descriptor($connection, $type);
if ($safeResult === null) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}










function oci_num_rows($statement): int
{
error_clear_last();
$safeResult = \oci_num_rows($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}
























function oci_parse($connection, string $sql)
{
error_clear_last();
$safeResult = \oci_parse($connection, $sql);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}



























































































function oci_pconnect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_pconnect($username, $password, $connection_string);
} else {
$safeResult = \oci_pconnect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}






























function oci_register_taf_callback($connection, callable $callback): void
{
error_clear_last();
$safeResult = \oci_register_taf_callback($connection, $callback);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




















function oci_result($statement, $column): string
{
error_clear_last();
$safeResult = \oci_result($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}

























function oci_rollback($connection): void
{
error_clear_last();
$safeResult = \oci_rollback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_server_version($connection): string
{
error_clear_last();
$safeResult = \oci_server_version($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}























function oci_set_action($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_action($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
$safeResult = \oci_set_call_timeout($connection, $timeout);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}



























function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
$safeResult = \oci_set_client_identifier($connection, $client_id);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





















function oci_set_client_info($connection, string $client_info): void
{
error_clear_last();
$safeResult = \oci_set_client_info($connection, $client_info);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






















function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_db_operation($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


























function oci_set_edition(string $edition): void
{
error_clear_last();
$safeResult = \oci_set_edition($edition);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}























function oci_set_module_name($connection, string $name): void
{
error_clear_last();
$safeResult = \oci_set_module_name($connection, $name);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




























function oci_set_prefetch_lob($statement, int $prefetch_lob_size): void
{
error_clear_last();
$safeResult = \oci_set_prefetch_lob($statement, $prefetch_lob_size);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























































function oci_set_prefetch($statement, int $rows): void
{
error_clear_last();
$safeResult = \oci_set_prefetch($statement, $rows);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
































































function oci_statement_type($statement): string
{
error_clear_last();
$safeResult = \oci_statement_type($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}












function oci_unregister_taf_callback($connection): void
{
error_clear_last();
$safeResult = \oci_unregister_taf_callback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PgsqlException;











function pg_cancel_query(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_cancel_query($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















































function pg_connect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_connect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_connection_reset(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_connection_reset($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






















function pg_convert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
$safeResult = \pg_convert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}




















function pg_copy_from(\PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
$safeResult = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_copy_to(\PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
$safeResult = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





































function pg_delete(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_delete($connection, $table_name, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


















function pg_end_copy(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_end_copy($connection);
} else {
$safeResult = \pg_end_copy();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





































function pg_execute(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_execute($connection, $stmtname, $params);
} elseif ($stmtname !== null) {
$safeResult = \pg_execute($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_execute($connection);
} else {
$safeResult = \pg_execute();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_num(\PgSql\Result $result, string $field): int
{
error_clear_last();
$safeResult = \pg_field_num($result, $field);
if ($safeResult === -1) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_table(\PgSql\Result $result, int $field, bool $oid_only = false)
{
error_clear_last();
$safeResult = \pg_field_table($result, $field, $oid_only);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_flush(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_flush($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}















function pg_free_result(\PgSql\Result $result): void
{
error_clear_last();
$safeResult = \pg_free_result($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_host(?\PgSql\Connection $connection = null): string
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_host($connection);
} else {
$safeResult = \pg_host();
}
if ($safeResult === '') {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}







































function pg_insert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_insert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}






























function pg_last_oid(\PgSql\Result $result): string
{
error_clear_last();
$safeResult = \pg_last_oid($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}












function pg_lo_close(\PgSql\Lob $lob): void
{
error_clear_last();
$safeResult = \pg_lo_close($lob);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















function pg_lo_export(?\PgSql\Connection $connection = null, ?int $oid = null, ?string $pathname = null): void
{
error_clear_last();
if ($pathname !== null) {
$safeResult = \pg_lo_export($connection, $oid, $pathname);
} elseif ($oid !== null) {
$safeResult = \pg_lo_export($connection, $oid);
} elseif ($connection !== null) {
$safeResult = \pg_lo_export($connection);
} else {
$safeResult = \pg_lo_export();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


























function pg_lo_import(?\PgSql\Connection $connection = null, ?string $pathname = null, $object_id = null): int
{
error_clear_last();
if ($object_id !== null) {
$safeResult = \pg_lo_import($connection, $pathname, $object_id);
} elseif ($pathname !== null) {
$safeResult = \pg_lo_import($connection, $pathname);
} elseif ($connection !== null) {
$safeResult = \pg_lo_import($connection);
} else {
$safeResult = \pg_lo_import();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





















function pg_lo_open(\PgSql\Connection $connection, int $oid, string $mode): \PgSql\Lob
{
error_clear_last();
$safeResult = \pg_lo_open($connection, $oid, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















function pg_lo_read(\PgSql\Lob $lob, int $length = 8192): string
{
error_clear_last();
$safeResult = \pg_lo_read($lob, $length);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_lo_seek(\PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
$safeResult = \pg_lo_seek($lob, $offset, $whence);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}













function pg_lo_truncate(\PgSql\Lob $lob, int $size): void
{
error_clear_last();
$safeResult = \pg_lo_truncate($lob, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


















function pg_lo_unlink(\PgSql\Connection $connection, int $oid): void
{
error_clear_last();
$safeResult = \pg_lo_unlink($connection, $oid);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}




















function pg_lo_write(\PgSql\Lob $lob, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \pg_lo_write($lob, $data, $length);
} else {
$safeResult = \pg_lo_write($lob, $data);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_meta_data(\PgSql\Connection $connection, string $table_name, bool $extended = false): array
{
error_clear_last();
$safeResult = \pg_meta_data($connection, $table_name, $extended);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}









































function pg_parameter_status(?\PgSql\Connection $connection = null, ?string $param_name = null): string
{
error_clear_last();
if ($param_name !== null) {
$safeResult = \pg_parameter_status($connection, $param_name);
} elseif ($connection !== null) {
$safeResult = \pg_parameter_status($connection);
} else {
$safeResult = \pg_parameter_status();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














































function pg_pconnect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_pconnect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_ping(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_ping($connection);
} else {
$safeResult = \pg_ping();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_prepare(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_prepare($connection, $stmtname, $query);
} elseif ($stmtname !== null) {
$safeResult = \pg_prepare($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_prepare($connection);
} else {
$safeResult = \pg_prepare();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

























function pg_put_line(?\PgSql\Connection $connection = null, ?string $data = null): void
{
error_clear_last();
if ($data !== null) {
$safeResult = \pg_put_line($connection, $data);
} elseif ($connection !== null) {
$safeResult = \pg_put_line($connection);
} else {
$safeResult = \pg_put_line();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















































function pg_query_params(?\PgSql\Connection $connection = null, ?string $query = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_query_params($connection, $query, $params);
} elseif ($query !== null) {
$safeResult = \pg_query_params($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query_params($connection);
} else {
$safeResult = \pg_query_params();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










































function pg_query(?\PgSql\Connection $connection = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_query($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query($connection);
} else {
$safeResult = \pg_query();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}































function pg_result_error_field(\PgSql\Result $result, int $field_code): ?string
{
error_clear_last();
$safeResult = \pg_result_error_field($result, $field_code);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_result_seek(\PgSql\Result $result, int $row): void
{
error_clear_last();
$safeResult = \pg_result_seek($result, $row);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}























































function pg_select(\PgSql\Connection $connection, string $table_name, array $conditions = [], int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
$safeResult = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_set_chunked_rows_size(\PgSql\Connection $connection, int $size): void
{
error_clear_last();
$safeResult = \pg_set_chunked_rows_size($connection, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}











function pg_socket(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_socket($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





























function pg_trace(string $filename, string $mode = "w", ?\PgSql\Connection $connection = null, int $trace_mode = 0): void
{
error_clear_last();
if ($trace_mode !== 0) {
$safeResult = \pg_trace($filename, $mode, $connection, $trace_mode);
} elseif ($connection !== null) {
$safeResult = \pg_trace($filename, $mode, $connection);
} else {
$safeResult = \pg_trace($filename, $mode);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_update(\PgSql\Connection $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\EioException;
















function eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_busy($delay, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chmod(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chmod($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chown(string $path, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chown($path, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_close($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_close($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_custom(callable $execute, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_custom($execute, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_dup2($fd, $fd2, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_dup2($fd, $fd2, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








function eio_event_loop(): void
{
error_clear_last();
$safeResult = \eio_event_loop();
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
}















































function eio_fallocate($fd, int $mode, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fallocate($fd, $mode, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchmod($fd, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fdatasync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fdatasync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstat($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstat($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstat($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstatvfs($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstatvfs($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstatvfs($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fsync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fsync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_ftruncate($fd, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_ftruncate($fd, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_futime($fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_futime($fd, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}



































function eio_grp(callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_grp($callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_lstat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_lstat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mkdir($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
























































function eio_mknod(string $path, int $mode, int $dev, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mknod($path, $mode, $dev, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_nop(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_nop($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_readahead($fd, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































































































































































































































































































function eio_readdir(string $path, int $flags, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readdir($path, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_readlink(string $path, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_rename(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rename($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_rmdir(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rmdir($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}

















































function eio_seek($fd, int $offset, int $whence, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_seek($fd, $offset, $whence, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_sendfile($out_fd, $in_fd, int $offset, int $length, ?int $pri = null, ?callable $callback = null, ?string $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback, $data);
} elseif ($callback !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback);
} elseif ($pri !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri);
} else {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_stat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_stat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_statvfs(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_statvfs($path, $pri, $callback, $data);
} else {
$safeResult = \eio_statvfs($path, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_symlink(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_symlink($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_sync_file_range($fd, int $offset, int $nbytes, int $flags, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync_file_range($fd, $offset, $nbytes, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












function eio_sync(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_syncfs($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_syncfs($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_truncate(string $path, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_truncate($path, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_unlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_utime(string $path, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_utime($path, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












































function eio_write($fd, string $str, int $length = 0, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_write($fd, $str, $length, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;































function socket_accept(\Socket $socket): \Socket
{
error_clear_last();
$safeResult = \socket_accept($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_bind(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_bind($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_connect(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_connect($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

















function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): array
{
error_clear_last();
if ($hints !== []) {
$safeResult = \socket_addrinfo_lookup($host, $service, $hints);
} elseif ($service !== null) {
$safeResult = \socket_addrinfo_lookup($host, $service);
} else {
$safeResult = \socket_addrinfo_lookup($host);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}









function socket_atmark(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_atmark($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_bind(\Socket $socket, string $address, int $port = 0): void
{
error_clear_last();
$safeResult = \socket_bind($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}























function socket_connect(\Socket $socket, string $address, ?int $port = null): void
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_connect($socket, $address, $port);
} else {
$safeResult = \socket_connect($socket, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_create_listen(int $port, int $backlog = SOMAXCONN): \Socket
{
error_clear_last();
$safeResult = \socket_create_listen($port, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}



























function socket_create_pair(int $domain, int $type, int $protocol, ?array &$pair): void
{
error_clear_last();
$safeResult = \socket_create_pair($domain, $type, $protocol, $pair);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

























function socket_create(int $domain, int $type, int $protocol): \Socket
{
error_clear_last();
$safeResult = \socket_create($domain, $type, $protocol);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_export_stream(\Socket $socket)
{
error_clear_last();
$safeResult = \socket_export_stream($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






































function socket_get_option(\Socket $socket, int $level, int $option)
{
error_clear_last();
$safeResult = \socket_get_option($socket, $level, $option);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

























function socket_getpeername(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getpeername($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_getsockname(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getsockname($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}










function socket_import_stream($stream): \Socket
{
error_clear_last();
$safeResult = \socket_import_stream($stream);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






























function socket_listen(\Socket $socket, int $backlog = 0): void
{
error_clear_last();
$safeResult = \socket_listen($socket, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






































function socket_read(\Socket $socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
$safeResult = \socket_read($socket, $length, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}




















































function socket_send(\Socket $socket, string $data, int $length, int $flags): int
{
error_clear_last();
$safeResult = \socket_send($socket, $data, $length, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}












function socket_sendmsg(\Socket $socket, array $message, int $flags = 0): int
{
error_clear_last();
$safeResult = \socket_sendmsg($socket, $message, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
























































function socket_sendto(\Socket $socket, string $data, int $length, int $flags, string $address, ?int $port = null): int
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address, $port);
} else {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_set_block(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_block($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

















function socket_set_nonblock(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_nonblock($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_set_option(\Socket $socket, int $level, int $option, $value): void
{
error_clear_last();
$safeResult = \socket_set_option($socket, $level, $option, $value);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}





































function socket_shutdown(\Socket $socket, int $mode = 2): void
{
error_clear_last();
$safeResult = \socket_shutdown($socket, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}













function socket_wsaprotocol_info_export(\Socket $socket, int $process_id): string
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_export($socket, $process_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_wsaprotocol_info_import(string $info_id): \Socket
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_import($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_wsaprotocol_info_release(string $info_id): void
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_release($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Bzip2Exception;









function bzclose($bz): void
{
error_clear_last();
$safeResult = \bzclose($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}












function bzflush($bz): void
{
error_clear_last();
$safeResult = \bzflush($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}














function bzopen($file, string $mode)
{
error_clear_last();
$safeResult = \bzopen($file, $mode);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}

















function bzread($bz, int $length = 1024): string
{
error_clear_last();
$safeResult = \bzread($bz, $length);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
















function bzwrite($bz, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \bzwrite($bz, $data, $length);
} else {
$safeResult = \bzwrite($bz, $data);
}
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApcuException;











function apcu_cache_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_cache_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}













function apcu_cas(string $key, int $old, int $new): void
{
error_clear_last();
$safeResult = \apcu_cas($key, $old, $new);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
}














function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_dec($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}














function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_inc($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}











function apcu_sma_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_sma_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcreException;
















function preg_grep(string $pattern, array $array, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_grep($pattern, $array, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































































































































































































































































































































function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




































































































































































































































function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




























function preg_replace_callback_array(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































function preg_replace_callback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback($pattern, $callback, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}























































function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_split($pattern, $subject, $limit, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GmpException;















function gmp_random_seed($seed): void
{
error_clear_last();
$safeResult = \gmp_random_seed($seed);
}
<?php

namespace Safe;

use Safe\Exceptions\VarException;















































function settype(&$var, string $type): void
{
error_clear_last();
$safeResult = \settype($var, $type);
if ($safeResult === false) {
throw VarException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Ssh2Exception;










function ssh2_auth_agent($session, string $username): void
{
error_clear_last();
$safeResult = \ssh2_auth_agent($session, $username);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_auth_hostbased_file($session, string $username, string $hostname, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null, ?string $local_username = null): void
{
error_clear_last();
if ($local_username !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase, $local_username);
} elseif ($passphrase !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_auth_password($session, string $username, string $password): void
{
error_clear_last();
$safeResult = \ssh2_auth_password($session, $username, $password);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_auth_pubkey_file($session, string $username, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}









































































































































































































function ssh2_connect(string $host, int $port = 22, ?array $methods = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \ssh2_connect($host, $port, $methods, $callbacks);
} elseif ($methods !== null) {
$safeResult = \ssh2_connect($host, $port, $methods);
} else {
$safeResult = \ssh2_connect($host, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_disconnect($session): void
{
error_clear_last();
$safeResult = \ssh2_disconnect($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}




















function ssh2_exec($session, string $command, ?string $pty = null, ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_exec($session, $command, $pty, $env);
} elseif ($pty !== null) {
$safeResult = \ssh2_exec($session, $command, $pty);
} else {
$safeResult = \ssh2_exec($session, $command);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_forward_accept($listener)
{
error_clear_last();
$safeResult = \ssh2_forward_accept($listener);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}













function ssh2_forward_listen($session, int $port, ?string $host = null, int $max_connections = 16)
{
error_clear_last();
if ($max_connections !== 16) {
$safeResult = \ssh2_forward_listen($session, $port, $host, $max_connections);
} elseif ($host !== null) {
$safeResult = \ssh2_forward_listen($session, $port, $host);
} else {
$safeResult = \ssh2_forward_listen($session, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}

















function ssh2_publickey_add($pkey, string $algoname, string $blob, bool $overwrite = false, ?array $attributes = null): void
{
error_clear_last();
if ($attributes !== null) {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite, $attributes);
} else {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_publickey_init($session)
{
error_clear_last();
$safeResult = \ssh2_publickey_init($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}











function ssh2_publickey_remove($pkey, string $algoname, string $blob): void
{
error_clear_last();
$safeResult = \ssh2_publickey_remove($pkey, $algoname, $blob);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_scp_recv($session, string $remote_file, string $local_file): void
{
error_clear_last();
$safeResult = \ssh2_scp_recv($session, $remote_file, $local_file);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}














function ssh2_scp_send($session, string $local_file, string $remote_file, int $create_mode = 0644): void
{
error_clear_last();
$safeResult = \ssh2_scp_send($session, $local_file, $remote_file, $create_mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_send_eof($channel): void
{
error_clear_last();
$safeResult = \ssh2_send_eof($channel);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
{
error_clear_last();
$safeResult = \ssh2_sftp_chmod($sftp, $filename, $mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool $recursive = false): void
{
error_clear_last();
$safeResult = \ssh2_sftp_mkdir($sftp, $dirname, $mode, $recursive);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}











function ssh2_sftp_rename($sftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rename($sftp, $from, $to);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp_rmdir($sftp, string $dirname): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rmdir($sftp, $dirname);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_symlink($sftp, string $target, string $link): void
{
error_clear_last();
$safeResult = \ssh2_sftp_symlink($sftp, $target, $link);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}










function ssh2_sftp_unlink($sftp, string $filename): void
{
error_clear_last();
$safeResult = \ssh2_sftp_unlink($sftp, $filename);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp($session)
{
error_clear_last();
$safeResult = \ssh2_sftp($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}




















function ssh2_shell($session, string $termtype = "vanilla", ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_shell($session, $termtype, $env);
} else {
$safeResult = \ssh2_shell($session, $termtype);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RnpException;












function rnp_decrypt(\RnpFFI $ffi, string $input): string
{
error_clear_last();
$safeResult = \rnp_decrypt($ffi, $input);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets_to_json(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets_to_json($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_ffi_create(string $pub_format, string $sec_format): \RnpFFI
{
error_clear_last();
$safeResult = \rnp_ffi_create($pub_format, $sec_format);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

























function rnp_ffi_set_pass_provider(\RnpFFI $ffi, callable $password_callback): void
{
error_clear_last();
$safeResult = \rnp_ffi_set_pass_provider($ffi, $password_callback);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_import_keys(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_keys($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_import_signatures(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_signatures($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

















function rnp_key_export_autocrypt(\RnpFFI $ffi, string $key_fp, string $subkey_fp, string $uid, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export_autocrypt($ffi, $key_fp, $subkey_fp, $uid, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_key_export_revocation(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_key_export(\RnpFFI $ffi, string $key_fp, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_key_get_info(\RnpFFI $ffi, string $key_fp): array
{
error_clear_last();
$safeResult = \rnp_key_get_info($ffi, $key_fp);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_key_remove(\RnpFFI $ffi, string $key_fp, int $flags): void
{
error_clear_last();
$safeResult = \rnp_key_remove($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_key_revoke(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}











function rnp_list_keys(\RnpFFI $ffi, string $identifier_type): array
{
error_clear_last();
$safeResult = \rnp_list_keys($ffi, $identifier_type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_load_keys_from_path(\RnpFFI $ffi, string $format, string $input_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys_from_path($ffi, $format, $input_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_load_keys(\RnpFFI $ffi, string $format, string $input, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys($ffi, $format, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}













function rnp_locate_key(\RnpFFI $ffi, string $identifier_type, string $identifier): string
{
error_clear_last();
$safeResult = \rnp_locate_key($ffi, $identifier_type, $identifier);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_encrypt(\RnpFFI $ffi, string $message, array $recipient_keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp, $options);
} else {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}


















function rnp_op_generate_key(\RnpFFI $ffi, string $userid, string $key_alg, ?string $sub_alg = null, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg, $options);
} elseif ($sub_alg !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg);
} else {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}















function rnp_op_sign_cleartext(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign_detached(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_verify_detached(\RnpFFI $ffi, string $data, string $signature): array
{
error_clear_last();
$safeResult = \rnp_op_verify_detached($ffi, $data, $signature);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_verify(\RnpFFI $ffi, string $data): array
{
error_clear_last();
$safeResult = \rnp_op_verify($ffi, $data);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_save_keys_to_path(\RnpFFI $ffi, string $format, string $output_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys_to_path($ffi, $format, $output_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_save_keys(\RnpFFI $ffi, string $format, string &$output, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys($ffi, $format, $output, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}










function rnp_supported_features(string $type): string
{
error_clear_last();
$safeResult = \rnp_supported_features($type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RpminfoException;








function rpmaddtag(int $tag): void
{
error_clear_last();
$safeResult = \rpmaddtag($tag);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FpmException;









function fastcgi_finish_request(): void
{
error_clear_last();
$safeResult = \fastcgi_finish_request();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
}














function fpm_get_status(): array
{
error_clear_last();
$safeResult = \fpm_get_status();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InotifyException;


















function inotify_add_watch($inotify_instance, string $pathname, int $mask): int
{
error_clear_last();
$safeResult = \inotify_add_watch($inotify_instance, $pathname, $mask);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}










function inotify_init()
{
error_clear_last();
$safeResult = \inotify_init();
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}













function inotify_rm_watch($inotify_instance, int $watch_descriptor): void
{
error_clear_last();
$safeResult = \inotify_rm_watch($inotify_instance, $watch_descriptor);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZipException;








function zip_entry_close($zip_entry): void
{
error_clear_last();
$safeResult = \zip_entry_close($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}










function zip_entry_compressedsize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_compressedsize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}











function zip_entry_compressionmethod($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_compressionmethod($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_filesize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_filesize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_name($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_name($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
















function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
$safeResult = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}













function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
$safeResult = \zip_entry_read($zip_entry, $len);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StringsException;









function convert_uudecode(string $string): string
{
error_clear_last();
$safeResult = \convert_uudecode($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}










function hex2bin(string $string): string
{
error_clear_last();
$safeResult = \hex2bin($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
















function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \md5_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}












function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \sha1_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CalendarException;












function unixtojd(?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \unixtojd($timestamp);
} else {
$safeResult = \unixtojd();
}
if ($safeResult === false) {
throw CalendarException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcntlException;
















function pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_getpriority($process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_getpriority($process_id);
} else {
$safeResult = \pcntl_getpriority();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}



















function pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_setpriority($priority, $process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_setpriority($priority, $process_id);
} else {
$safeResult = \pcntl_setpriority($priority);
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}










function pcntl_signal_dispatch(): void
{
error_clear_last();
$safeResult = \pcntl_signal_dispatch();
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}















































function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
{
error_clear_last();
$safeResult = \pcntl_signal($signal, $handler, $restart_syscalls);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}






















function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
$safeResult = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
{
error_clear_last();
$safeResult = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}














































function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
$safeResult = \pcntl_sigwaitinfo($signals, $info);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\IconvException;




















function iconv_get_encoding(string $type = "all")
{
error_clear_last();
$safeResult = \iconv_get_encoding($type);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





















































function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_mime_decode($string, $mode, $encoding);
} else {
$safeResult = \iconv_mime_decode($string, $mode);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}












































































































function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string
{
error_clear_last();
$safeResult = \iconv_mime_encode($field_name, $field_value, $options);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
















function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
$safeResult = \iconv_set_encoding($type, $encoding);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
}


















function iconv_strlen(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_strlen($string, $encoding);
} else {
$safeResult = \iconv_strlen($string);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}




























function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
$safeResult = \iconv($from_encoding, $to_encoding, $string);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InfoException;















































































































function assert_options(int $option, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \assert_options($option, $value);
} else {
$safeResult = \assert_options($option);
}
return $safeResult;
}











function cli_set_process_title(string $title): void
{
error_clear_last();
$safeResult = \cli_set_process_title($title);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
























































function dl(string $extension_filename): void
{
error_clear_last();
$safeResult = \dl($extension_filename);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}


















function get_cfg_var(string $option)
{
error_clear_last();
$safeResult = \get_cfg_var($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function get_include_path(): string
{
error_clear_last();
$safeResult = \get_include_path();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getlastmod(): int
{
error_clear_last();
$safeResult = \getlastmod();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmygid(): int
{
error_clear_last();
$safeResult = \getmygid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyinode(): int
{
error_clear_last();
$safeResult = \getmyinode();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmypid(): int
{
error_clear_last();
$safeResult = \getmypid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyuid(): int
{
error_clear_last();
$safeResult = \getmyuid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
$safeResult = \getopt($short_options, $long_options, $rest_index);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getrusage(int $mode = 0): array
{
error_clear_last();
$safeResult = \getrusage($mode);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function ini_get(string $option): string
{
error_clear_last();
$safeResult = \ini_get($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}















function ini_set(string $option, string $value): string
{
error_clear_last();
$safeResult = \ini_set($option, $value);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}


















function php_sapi_name(): string
{
error_clear_last();
$safeResult = \php_sapi_name();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}







































































function phpcredits(int $flags = CREDITS_ALL): bool
{
error_clear_last();
$safeResult = \phpcredits($flags);
return $safeResult;
}






































































































function phpinfo(int $flags = INFO_ALL): bool
{
error_clear_last();
$safeResult = \phpinfo($flags);
return $safeResult;
}












function putenv(string $assignment): void
{
error_clear_last();
$safeResult = \putenv($assignment);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function set_include_path(string $include_path): string
{
error_clear_last();
$safeResult = \set_include_path($include_path);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}



















function set_time_limit(int $seconds): void
{
error_clear_last();
$safeResult = \set_time_limit($seconds);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbmDb2Exception;












































function db2_autocommit($connection, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \db2_autocommit($connection, $value);
} else {
$safeResult = \db2_autocommit($connection);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}





































function db2_bind_param($stmt, int $parameter_number, string $variable_name, int $parameter_type = DB2_PARAM_IN, int $data_type = 0, int $precision = -1, int $scale = 0): void
{
error_clear_last();
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision, $scale);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}















































































































function db2_client_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_client_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}















function db2_close($connection): void
{
error_clear_last();
$safeResult = \db2_close($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_commit($connection): void
{
error_clear_last();
$safeResult = \db2_commit($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}


























function db2_execute($stmt, array $parameters = []): void
{
error_clear_last();
$safeResult = \db2_execute($stmt, $parameters);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_result($stmt): void
{
error_clear_last();
$safeResult = \db2_free_result($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \db2_free_stmt($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
























































































































































function db2_get_option($resource, string $option): string
{
error_clear_last();
$safeResult = \db2_get_option($resource, $option);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}























function db2_num_rows($stmt): int
{
error_clear_last();
$safeResult = \db2_num_rows($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}
























function db2_pclose($connection): void
{
error_clear_last();
$safeResult = \db2_pclose($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_rollback($connection): void
{
error_clear_last();
$safeResult = \db2_rollback($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}





























































































































































































































































function db2_server_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_server_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}



























































































































































































































































































































































































function db2_set_option($resource, array $options, int $type): void
{
error_clear_last();
$safeResult = \db2_set_option($resource, $options, $type);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
<?php

return [
'apache_getenv',
'apache_get_version',
'apache_lookup_uri',
'apache_setenv',
'apcu_cache_info',
'apcu_cas',
'apcu_dec',
'apcu_fetch',
'apcu_inc',
'apcu_sma_info',
'base64_decode',
'bindtextdomain',
'bzclose',
'bzflush',
'bzopen',
'bzread',
'bzwrite',
'chdir',
'chgrp',
'chmod',
'chown',
'chroot',
'class_alias',
'class_implements',
'class_parents',
'class_uses',
'cli_set_process_title',
'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
'copy',
'cubrid_bind',
'cubrid_column_names',
'cubrid_column_types',
'cubrid_col_size',
'cubrid_commit',
'cubrid_connect',
'cubrid_connect_with_url',
'cubrid_current_oid',
'cubrid_disconnect',
'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
'cubrid_lob2_bind',
'cubrid_lob2_close',
'cubrid_lob2_export',
'cubrid_lob2_import',
'cubrid_lob2_new',
'cubrid_lob2_read',
'cubrid_lob2_seek',
'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
'cubrid_lob2_write',
'cubrid_lob_close',
'cubrid_lob_export',
'cubrid_lob_get',
'cubrid_lob_send',
'cubrid_lob_size',
'cubrid_lock_read',
'cubrid_lock_write',
'cubrid_move_cursor',
'cubrid_next_result',
'cubrid_pconnect',
'cubrid_pconnect_with_url',
'cubrid_prepare',
'cubrid_put',
'cubrid_rollback',
'cubrid_schema',
'cubrid_seq_drop',
'cubrid_seq_insert',
'cubrid_seq_put',
'cubrid_set_add',
'cubrid_set_autocommit',
'cubrid_set_db_parameter',
'cubrid_set_drop',
'cubrid_set_query_timeout',
'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
'curl_multi_info_read',
'curl_multi_setopt',
'curl_setopt',
'curl_share_setopt',
'curl_unescape',
'curl_upkeep',
'date_create',
'date_create_immutable',
'date_parse_from_format',
'date_sunrise',
'date_sunset',
'db2_autocommit',
'db2_bind_param',
'db2_client_info',
'db2_close',
'db2_commit',
'db2_execute',
'db2_free_result',
'db2_free_stmt',
'db2_get_option',
'db2_num_rows',
'db2_pclose',
'db2_rollback',
'db2_server_info',
'db2_set_option',
'define',
'deflate_add',
'deflate_init',
'dir',
'disk_free_space',
'disk_total_space',
'dl',
'dns_get_record',
'eio_busy',
'eio_chmod',
'eio_chown',
'eio_close',
'eio_custom',
'eio_dup2',
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
'eio_fsync',
'eio_ftruncate',
'eio_futime',
'eio_grp',
'eio_lstat',
'eio_mkdir',
'eio_mknod',
'eio_nop',
'eio_readahead',
'eio_readdir',
'eio_readlink',
'eio_rename',
'eio_rmdir',
'eio_seek',
'eio_sendfile',
'eio_stat',
'eio_statvfs',
'eio_symlink',
'eio_sync',
'eio_syncfs',
'eio_sync_file_range',
'eio_truncate',
'eio_unlink',
'eio_utime',
'eio_write',
'error_log',
'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
'fdatasync',
'fflush',
'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
'fileperms',
'filesize',
'filetype',
'file_get_contents',
'file_put_contents',
'filter_input_array',
'filter_var_array',
'finfo_close',
'finfo_open',
'flock',
'fopen',
'fpm_get_status',
'fputcsv',
'fread',
'fsockopen',
'fstat',
'fsync',
'ftell',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
'ftp_chdir',
'ftp_chmod',
'ftp_close',
'ftp_connect',
'ftp_delete',
'ftp_fget',
'ftp_fput',
'ftp_get',
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
'ftp_nb_get',
'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
'ftp_raw',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
'ftp_size',
'ftp_ssl_connect',
'ftp_systype',
'ftruncate',
'fwrite',
'getcwd',
'gethostname',
'getimagesize',
'getlastmod',
'getmygid',
'getmyinode',
'getmypid',
'getmyuid',
'getopt',
'getprotobyname',
'getprotobynumber',
'getrusage',
'getservbyport',
'get_cfg_var',
'get_headers',
'get_include_path',
'get_meta_tags',
'glob',
'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
'gnupg_deletekey',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
'gzcompress',
'gzdecode',
'gzdeflate',
'gzencode',
'gzfile',
'gzgets',
'gzinflate',
'gzopen',
'gzread',
'gzrewind',
'gztell',
'gzuncompress',
'gzwrite',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
'ibase_blob_create',
'ibase_blob_get',
'ibase_close',
'ibase_commit',
'ibase_commit_ret',
'ibase_connect',
'ibase_delete_user',
'ibase_drop_db',
'ibase_free_event_handler',
'ibase_free_query',
'ibase_free_result',
'ibase_maintain_db',
'ibase_modify_user',
'ibase_name_result',
'ibase_pconnect',
'ibase_restore',
'ibase_rollback',
'ibase_rollback_ret',
'ibase_service_attach',
'ibase_service_detach',
'iconv',
'iconv_get_encoding',
'iconv_mime_decode',
'iconv_mime_encode',
'iconv_set_encoding',
'iconv_strlen',
'idate',
'imageaffine',
'imageaffinematrixconcat',
'imageaffinematrixget',
'imagealphablending',
'imageantialias',
'imagearc',
'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
'imagecolorset',
'imageconvolution',
'imagecopy',
'imagecopymerge',
'imagecopymergegray',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
'imagecreatefromgd2part',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatefromstring',
'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
'imagecreatefromxpm',
'imagecreatetruecolor',
'imagecrop',
'imagecropauto',
'imagedashedline',
'imagedestroy',
'imageellipse',
'imagefill',
'imagefilledarc',
'imagefilledellipse',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
'imageftbbox',
'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
'imagegif',
'imagegrabscreen',
'imagegrabwindow',
'imagejpeg',
'imagelayereffect',
'imageline',
'imageloadfont',
'imagepng',
'imagerectangle',
'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
'imagesetbrush',
'imagesetclip',
'imagesetinterpolation',
'imagesetpixel',
'imagesetstyle',
'imagesetthickness',
'imagesettile',
'imagestring',
'imagestringup',
'imagetruecolortopalette',
'imagettfbbox',
'imagettftext',
'imagewbmp',
'imagewebp',
'imagexbm',
'image_type_to_extension',
'imap_8bit',
'imap_append',
'imap_base64',
'imap_binary',
'imap_body',
'imap_bodystruct',
'imap_check',
'imap_createmailbox',
'imap_deletemailbox',
'imap_fetchbody',
'imap_fetchheader',
'imap_fetchmime',
'imap_fetchstructure',
'imap_fetch_overview',
'imap_getacl',
'imap_getmailboxes',
'imap_getsubscribed',
'imap_headerinfo',
'imap_headers',
'imap_listscan',
'imap_lsub',
'imap_mail',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
'imap_qprint',
'imap_renamemailbox',
'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_set_quota',
'imap_sort',
'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
'imap_unsubscribe',
'imap_utf8_to_mutf7',
'inet_ntop',
'inet_pton',
'inflate_add',
'inflate_get_read_len',
'inflate_init',
'ini_get',
'ini_set',
'inotify_add_watch',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
'json_decode',
'json_encode',
'lchgrp',
'lchown',
'ldap_8859_to_t61',
'ldap_add',
'ldap_bind',
'ldap_compare',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
'ldap_explode_dn',
'ldap_first_attribute',
'ldap_first_entry',
'ldap_free_result',
'ldap_get_dn',
'ldap_get_entries',
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
'ldap_modify_batch',
'ldap_mod_add',
'ldap_mod_del',
'ldap_mod_replace',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
'ldap_rename',
'ldap_sasl_bind',
'ldap_set_option',
'ldap_unbind',
'libxml_set_external_entity_loader',
'link',
'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
'mailparse_msg_free',
'mailparse_msg_parse',
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
'mb_convert_encoding',
'mb_detect_order',
'mb_eregi_replace',
'mb_ereg_replace',
'mb_ereg_replace_callback',
'mb_ereg_search_getregs',
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
'mb_parse_str',
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
'md5_file',
'mime_content_type',
'mkdir',
'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
'msg_stat_queue',
'mysql_close',
'mysql_connect',
'mysql_create_db',
'mysql_data_seek',
'mysql_db_name',
'mysql_db_query',
'mysql_drop_db',
'mysql_fetch_lengths',
'mysql_field_flags',
'mysql_field_len',
'mysql_field_name',
'mysql_field_seek',
'mysql_free_result',
'mysql_get_host_info',
'mysql_get_proto_info',
'mysql_get_server_info',
'mysql_info',
'mysql_list_dbs',
'mysql_list_fields',
'mysql_list_processes',
'mysql_list_tables',
'mysql_num_fields',
'mysql_num_rows',
'mysql_query',
'mysql_real_escape_string',
'mysql_result',
'mysql_select_db',
'mysql_set_charset',
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
'net_get_interfaces',
'ob_clean',
'ob_end_clean',
'ob_end_flush',
'ob_flush',
'ob_get_clean',
'ob_get_flush',
'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
'oci_field_size',
'oci_field_type',
'oci_field_type_raw',
'oci_free_descriptor',
'oci_free_statement',
'oci_new_collection',
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
'oci_set_action',
'oci_set_call_timeout',
'oci_set_client_identifier',
'oci_set_client_info',
'oci_set_db_operation',
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
'oci_set_prefetch_lob',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
'odbc_commit',
'odbc_connect',
'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
'odbc_fetch_into',
'odbc_field_len',
'odbc_field_name',
'odbc_field_num',
'odbc_field_scale',
'odbc_field_type',
'odbc_num_fields',
'odbc_pconnect',
'odbc_prepare',
'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
'odbc_setoption',
'odbc_tables',
'opcache_compile_file',
'opcache_get_status',
'opendir',
'openssl_cipher_iv_length',
'openssl_cipher_key_length',
'openssl_cms_decrypt',
'openssl_cms_encrypt',
'openssl_cms_read',
'openssl_cms_sign',
'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
'openssl_decrypt',
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt',
'openssl_pkcs7_read',
'openssl_pkcs7_sign',
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_details',
'openssl_pkey_get_private',
'openssl_pkey_get_public',
'openssl_pkey_new',
'openssl_private_decrypt',
'openssl_private_encrypt',
'openssl_public_decrypt',
'openssl_public_encrypt',
'openssl_seal',
'openssl_sign',
'openssl_spki_export',
'openssl_spki_export_challenge',
'openssl_spki_new',
'openssl_spki_verify',
'openssl_verify',
'openssl_x509_checkpurpose',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
'openssl_x509_read',
'output_add_rewrite_var',
'output_reset_rewrite_vars',
'parse_ini_file',
'parse_ini_string',
'parse_url',
'passthru',
'pclose',
'pcntl_getpriority',
'pcntl_setpriority',
'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
'pcntl_sigtimedwait',
'pcntl_sigwaitinfo',
'pfsockopen',
'pg_cancel_query',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
'pg_delete',
'pg_end_copy',
'pg_execute',
'pg_field_num',
'pg_field_table',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
'pg_prepare',
'pg_put_line',
'pg_query',
'pg_query_params',
'pg_result_error_field',
'pg_result_seek',
'pg_select',
'pg_set_chunked_rows_size',
'pg_socket',
'pg_trace',
'pg_update',
'php_sapi_name',
'popen',
'posix_access',
'posix_eaccess',
'posix_getgrgid',
'posix_getgrnam',
'posix_getgroups',
'posix_getlogin',
'posix_getpgid',
'posix_getpwuid',
'posix_getrlimit',
'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
'posix_mknod',
'posix_setegid',
'posix_seteuid',
'posix_setgid',
'posix_setpgid',
'posix_setrlimit',
'posix_setsid',
'posix_setuid',
'posix_times',
'posix_uname',
'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_replace_callback',
'preg_replace_callback_array',
'preg_split',
'proc_close',
'proc_nice',
'proc_open',
'pspell_add_to_personal',
'pspell_add_to_session',
'pspell_clear_session',
'pspell_config_data_dir',
'pspell_config_dict_dir',
'pspell_config_ignore',
'pspell_config_mode',
'pspell_config_personal',
'pspell_config_repl',
'pspell_config_runtogether',
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
'ps_add_locallink',
'ps_add_note',
'ps_add_pdflink',
'ps_add_weblink',
'ps_arc',
'ps_arcn',
'ps_begin_page',
'ps_begin_pattern',
'ps_begin_template',
'ps_circle',
'ps_clip',
'ps_close',
'ps_closepath',
'ps_closepath_stroke',
'ps_close_image',
'ps_continue_text',
'ps_curveto',
'ps_delete',
'ps_end_page',
'ps_end_pattern',
'ps_end_template',
'ps_fill',
'ps_fill_stroke',
'ps_get_parameter',
'ps_hyphenate',
'ps_include_file',
'ps_lineto',
'ps_moveto',
'ps_new',
'ps_open_file',
'ps_place_image',
'ps_rect',
'ps_restore',
'ps_rotate',
'ps_save',
'ps_scale',
'ps_setcolor',
'ps_setdash',
'ps_setflat',
'ps_setfont',
'ps_setgray',
'ps_setlinecap',
'ps_setlinejoin',
'ps_setlinewidth',
'ps_setmiterlimit',
'ps_setoverprintmode',
'ps_setpolydash',
'ps_set_border_color',
'ps_set_border_dash',
'ps_set_border_style',
'ps_set_info',
'ps_set_parameter',
'ps_set_text_pos',
'ps_set_value',
'ps_shading',
'ps_shading_pattern',
'ps_shfill',
'ps_show',
'ps_show2',
'ps_show_xy',
'ps_show_xy2',
'ps_stroke',
'ps_symbol',
'ps_translate',
'putenv',
'readfile',
'readgzfile',
'readline_completion_function',
'readline_read_history',
'readline_write_history',
'readlink',
'realpath',
'register_tick_function',
'rename',
'rewind',
'rmdir',
'rnp_decrypt',
'rnp_dump_packets',
'rnp_dump_packets_to_json',
'rnp_ffi_create',
'rnp_ffi_set_pass_provider',
'rnp_import_keys',
'rnp_import_signatures',
'rnp_key_export',
'rnp_key_export_autocrypt',
'rnp_key_export_revocation',
'rnp_key_get_info',
'rnp_key_remove',
'rnp_key_revoke',
'rnp_list_keys',
'rnp_load_keys',
'rnp_load_keys_from_path',
'rnp_locate_key',
'rnp_op_encrypt',
'rnp_op_generate_key',
'rnp_op_sign',
'rnp_op_sign_cleartext',
'rnp_op_sign_detached',
'rnp_op_verify',
'rnp_op_verify_detached',
'rnp_save_keys',
'rnp_save_keys_to_path',
'rnp_supported_features',
'rpmaddtag',
'rrd_create',
'rrd_first',
'rrd_graph',
'rrd_info',
'rrd_lastupdate',
'rrd_restore',
'rrd_tune',
'rrd_update',
'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
'sem_get',
'sem_release',
'sem_remove',
'session_abort',
'session_create_id',
'session_decode',
'session_destroy',
'session_encode',
'session_id',
'session_module_name',
'session_name',
'session_regenerate_id',
'session_reset',
'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
'shell_exec',
'shmop_delete',
'shmop_read',
'shm_attach',
'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
'simplexml_import_dom',
'simplexml_load_file',
'simplexml_load_string',
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
'socket_addrinfo_lookup',
'socket_atmark',
'socket_bind',
'socket_connect',
'socket_create',
'socket_create_listen',
'socket_create_pair',
'socket_export_stream',
'socket_getpeername',
'socket_getsockname',
'socket_get_option',
'socket_import_stream',
'socket_listen',
'socket_read',
'socket_send',
'socket_sendmsg',
'socket_sendto',
'socket_set_block',
'socket_set_nonblock',
'socket_set_option',
'socket_shutdown',
'socket_write',
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
'sodium_crypto_aead_aegis128l_decrypt',
'sodium_crypto_aead_aegis256_decrypt',
'sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify',
'sodium_crypto_box_open',
'sodium_crypto_box_seal_open',
'sodium_crypto_secretbox_open',
'sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version',
'spl_autoload_register',
'spl_autoload_unregister',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
'sqlsrv_close',
'sqlsrv_commit',
'sqlsrv_configure',
'sqlsrv_execute',
'sqlsrv_fetch',
'sqlsrv_fetch_array',
'sqlsrv_fetch_object',
'sqlsrv_free_stmt',
'sqlsrv_get_field',
'sqlsrv_next_result',
'sqlsrv_num_fields',
'sqlsrv_num_rows',
'sqlsrv_prepare',
'sqlsrv_query',
'sqlsrv_rollback',
'ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent',
'ssh2_auth_hostbased_file',
'ssh2_auth_password',
'ssh2_auth_pubkey_file',
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
'ssh2_forward_accept',
'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
'ssh2_sftp_rename',
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
'ssh2_shell',
'stream_context_set_options',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
'stream_filter_prepend',
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
'stream_socket_get_name',
'stream_socket_pair',
'stream_socket_recvfrom',
'stream_socket_sendto',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
'strftime',
'strptime',
'strtotime',
'swoole_async_dns_lookup',
'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
'swoole_event_del',
'swoole_event_write',
'symlink',
'system',
'sys_getloadavg',
'tempnam',
'timezone_name_from_abbr',
'time_nanosleep',
'time_sleep_until',
'tmpfile',
'touch',
'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
'variant_date_to_timestamp',
'variant_round',
'virtual',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
'xdiff_file_diff_binary',
'xdiff_file_patch_binary',
'xdiff_file_rabdiff',
'xdiff_string_bpatch',
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
'xml_parser_free',
'xml_parser_set_option',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
'yaz_ccl_parse',
'yaz_close',
'yaz_connect',
'yaz_database',
'yaz_element',
'yaz_present',
'yaz_search',
'yaz_wait',
'zip_entry_close',
'zip_entry_compressedsize',
'zip_entry_compressionmethod',
'zip_entry_filesize',
'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
];
<?php

namespace Safe;

use Safe\Exceptions\FileinfoException;








function finfo_close(\finfo $finfo): void
{
error_clear_last();
$safeResult = \finfo_close($finfo);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
}
























function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): \finfo
{
error_clear_last();
if ($magic_database !== null) {
$safeResult = \finfo_open($flags, $magic_database);
} else {
$safeResult = \finfo_open($flags);
}
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}












function mime_content_type($filename): string
{
error_clear_last();
$safeResult = \mime_content_type($filename);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/posix.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/posix.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/posix.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/posix.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/posix.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/uodbc.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/uodbc.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/uodbc.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/uodbc.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/uodbc.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/lzf.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/lzf.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/lzf.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/lzf.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/lzf.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/image.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/image.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/image.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/image.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/image.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/readline.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/readline.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/readline.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/readline.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/readline.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/array.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/array.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/array.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/array.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/array.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/filesystem.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/filesystem.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/filesystem.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/filesystem.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/filesystem.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/filter.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/filter.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/filter.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/filter.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/filter.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/oci8.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/oci8.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/oci8.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/oci8.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/oci8.php';
}
<?php
namespace Safe\Exceptions;

class FpmException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ShmopException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class RpminfoException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ImageException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class FtpException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class GnupgException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ZlibException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class Ssh2Exception extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ExecException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SsdeepException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class Oci8Exception extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class XmlrpcException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class LibxmlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class NetworkException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ReadlineException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SocketsException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class RrdException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class MbstringException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class InfoException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class PspellException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class RnpException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class UodbcException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class MysqliException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class StringsException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ErrorfuncException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SplException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class FilterException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SodiumException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class LdapException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class FunchandException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class FilesystemException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ArrayException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class CubridException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ApacheException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class InotifyException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SolrException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class DatetimeException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class OpcacheException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class IbmDb2Exception extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class YazException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class YamlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SwooleException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ImapException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class PcntlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class UrlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class HashException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class Bzip2Exception extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class IconvException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class MiscException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class EioException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class IbaseException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class OutcontrolException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class MysqlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class GettextException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class PosixException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class DirException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class XdiffException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SqlsrvException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class MailparseException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ApcuException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class FileinfoException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SessionException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class VarException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class LzfException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class StreamException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class PgsqlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class UopzException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class PsException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class XmlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ZipException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ClassobjException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class ComException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class CalendarException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class SemException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php
namespace Safe\Exceptions;

class GmpException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/pgsql.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/pgsql.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/pgsql.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/pgsql.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/pgsql.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/eio.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/eio.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/eio.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/eio.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/eio.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/sockets.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/sockets.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/sockets.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/sockets.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/sockets.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/bzip2.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/bzip2.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/bzip2.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/bzip2.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/bzip2.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/apcu.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/apcu.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/apcu.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/apcu.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/apcu.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/pcre.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/pcre.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/pcre.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/pcre.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/pcre.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/gmp.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/gmp.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/gmp.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/gmp.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/gmp.php';
}
<?php

namespace Safe;

use Safe\Exceptions\OpensslException;









function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_iv_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_cipher_key_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_key_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
} elseif ($private_key !== null) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_cms_read(string $input_filename, array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_cms_read($input_filename, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates = null, array $ca_info = [], ?string $untrusted_certificates_filename = null, ?string $content = null, ?string $pk7 = null, ?string $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
} elseif ($sigfile !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
} elseif ($pk7 !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
} elseif ($content !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
} elseif ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
} elseif ($ca_info !== []) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
} elseif ($certificates !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates);
} else {
$safeResult = \openssl_cms_verify($input_filename, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export($csr, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}












function openssl_csr_get_public_key($csr, bool $short_names = true): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_csr_get_public_key($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
$safeResult = \openssl_csr_get_subject($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















































































































function openssl_csr_new(array $distinguished_names, \OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null): \OpenSSLCertificateSigningRequest
{
error_clear_last();
if ($extra_attributes !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
} elseif ($options !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
$safeResult = \openssl_csr_new($distinguished_names, $private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

























function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, ?array $options = null, int $serial = 0): \OpenSSLCertificate
{
error_clear_last();
if ($serial !== 0) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
} elseif ($options !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}



















function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, string $aad = ""): string
{
error_clear_last();
if ($aad !== "") {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
} elseif ($tag !== null) {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag);
} else {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}













function openssl_dh_compute_key(string $public_key, \OpenSSLAsymmetricKey $private_key): string
{
error_clear_last();
$safeResult = \openssl_dh_compute_key($public_key, $private_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_digest($data, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















































function openssl_get_curve_names(): array
{
error_clear_last();
$safeResult = \openssl_get_curve_names();
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




























function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, ?string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
$safeResult = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




































function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




































function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}













function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
if ($private_key !== null) {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_read($data, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


























function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
{
error_clear_last();
$safeResult = \openssl_pkey_derive($public_key, $private_key, $key_length);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


















function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase);
} else {
$safeResult = \openssl_pkey_export($key, $output);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_pkey_get_private($private_key, ?string $passphrase = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \openssl_pkey_get_private($private_key, $passphrase);
} else {
$safeResult = \openssl_pkey_get_private($private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_public($public_key): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_pkey_get_public($public_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}















function openssl_pkey_new(?array $options = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_new($options);
} else {
$safeResult = \openssl_pkey_new();
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






















function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




















function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null)
{
error_clear_last();
$safeResult = \openssl_random_pseudo_bytes($length, $strong_result);
return $safeResult;
}
































function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
$safeResult = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
{
error_clear_last();
$safeResult = \openssl_sign($data, $signature, $private_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_spki_export_challenge(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export_challenge($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_spki_export(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_spki_new(\OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
{
error_clear_last();
$safeResult = \openssl_spki_new($private_key, $challenge, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}









function openssl_spki_verify(string $spki): void
{
error_clear_last();
$safeResult = \openssl_spki_verify($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
$safeResult = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}































































function openssl_x509_checkpurpose($certificate, int $purpose, array $ca_info = [], ?string $untrusted_certificates_file = null)
{
error_clear_last();
if ($untrusted_certificates_file !== null) {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info, $untrusted_certificates_file);
} else {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info);
}
if ($safeResult === -1) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

















function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export($certificate, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}












function openssl_x509_read($certificate): \OpenSSLCertificate
{
error_clear_last();
$safeResult = \openssl_x509_read($certificate);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ExecException;





























function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \exec($command, $output, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}





















function passthru(string $command, ?int &$result_code = null): void
{
error_clear_last();
$safeResult = \passthru($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}


















function proc_close($process): int
{
error_clear_last();
$safeResult = \proc_close($process);
if ($safeResult === -1) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}






















function proc_nice(int $priority): void
{
error_clear_last();
$safeResult = \proc_nice($priority);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}

















































































function proc_open(string $command, array $descriptor_spec, ?array &$pipes, ?string $cwd = null, ?array $env_vars = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars, $options);
} elseif ($env_vars !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars);
} elseif ($cwd !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd);
} else {
$safeResult = \proc_open($command, $descriptor_spec, $pipes);
}
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}










function shell_exec(string $command): ?string
{
error_clear_last();
$safeResult = \shell_exec($command);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}























function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \system($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LibxmlException;














































function libxml_set_external_entity_loader(callable $resolver_function): void
{
error_clear_last();
$safeResult = \libxml_set_external_entity_loader($resolver_function);
if ($safeResult === false) {
throw LibxmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ClassobjException;












function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
$safeResult = \class_alias($class, $alias, $autoload);
if ($safeResult === false) {
throw ClassobjException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SsdeepException;













function ssdeep_fuzzy_compare(string $signature1, string $signature2): int
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_compare($signature1, $signature2);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}













function ssdeep_fuzzy_hash_filename(string $file_name): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash_filename($file_name);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}












function ssdeep_fuzzy_hash(string $to_hash): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash($to_hash);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PsException;






















function ps_add_launchlink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename): void
{
error_clear_last();
$safeResult = \ps_add_launchlink($psdoc, $llx, $lly, $urx, $ury, $filename);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}






























function ps_add_locallink($psdoc, float $llx, float $lly, float $urx, float $ury, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_locallink($psdoc, $llx, $lly, $urx, $ury, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}































function ps_add_note($psdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
{
error_clear_last();
$safeResult = \ps_add_note($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































function ps_add_pdflink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_pdflink($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

























function ps_add_weblink($psdoc, float $llx, float $lly, float $urx, float $ury, string $url): void
{
error_clear_last();
$safeResult = \ps_add_weblink($psdoc, $llx, $lly, $urx, $ury, $url);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arc($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arc($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arcn($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arcn($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











































function ps_begin_page($psdoc, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_begin_page($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_begin_pattern($psdoc, float $width, float $height, float $xstep, float $ystep, int $painttype): int
{
error_clear_last();
$safeResult = \ps_begin_pattern($psdoc, $width, $height, $xstep, $ystep, $painttype);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}


















function ps_begin_template($psdoc, float $width, float $height): int
{
error_clear_last();
$safeResult = \ps_begin_template($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




















function ps_circle($psdoc, float $x, float $y, float $radius): void
{
error_clear_last();
$safeResult = \ps_circle($psdoc, $x, $y, $radius);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_clip($psdoc): void
{
error_clear_last();
$safeResult = \ps_clip($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_close_image($psdoc, int $imageid): void
{
error_clear_last();
$safeResult = \ps_close_image($psdoc, $imageid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_close($psdoc): void
{
error_clear_last();
$safeResult = \ps_close($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_continue_text($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_continue_text($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_curveto($psdoc, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
{
error_clear_last();
$safeResult = \ps_curveto($psdoc, $x1, $y1, $x2, $y2, $x3, $y3);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_delete($psdoc): void
{
error_clear_last();
$safeResult = \ps_delete($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_end_page($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_page($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_end_pattern($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_pattern($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_end_template($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_template($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































































































































function ps_get_parameter($psdoc, string $name, ?float $modifier = null): string
{
error_clear_last();
if ($modifier !== null) {
$safeResult = \ps_get_parameter($psdoc, $name, $modifier);
} else {
$safeResult = \ps_get_parameter($psdoc, $name);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}























function ps_hyphenate($psdoc, string $text): array
{
error_clear_last();
$safeResult = \ps_hyphenate($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}













function ps_include_file($psdoc, string $file): void
{
error_clear_last();
$safeResult = \ps_include_file($psdoc, $file);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_lineto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_lineto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_moveto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_moveto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_new()
{
error_clear_last();
$safeResult = \ps_new();
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}














function ps_open_file($psdoc, ?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \ps_open_file($psdoc, $filename);
} else {
$safeResult = \ps_open_file($psdoc);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}




















function ps_place_image($psdoc, int $imageid, float $x, float $y, float $scale): void
{
error_clear_last();
$safeResult = \ps_place_image($psdoc, $imageid, $x, $y, $scale);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_rect($psdoc, float $x, float $y, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_rect($psdoc, $x, $y, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_restore($psdoc): void
{
error_clear_last();
$safeResult = \ps_restore($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_rotate($psdoc, float $rot): void
{
error_clear_last();
$safeResult = \ps_rotate($psdoc, $rot);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_save($psdoc): void
{
error_clear_last();
$safeResult = \ps_save($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_scale($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_scale($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_color($psdoc, float $red, float $green, float $blue): void
{
error_clear_last();
$safeResult = \ps_set_border_color($psdoc, $red, $green, $blue);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_dash($psdoc, float $black, float $white): void
{
error_clear_last();
$safeResult = \ps_set_border_dash($psdoc, $black, $white);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_style($psdoc, string $style, float $width): void
{
error_clear_last();
$safeResult = \ps_set_border_style($psdoc, $style, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}







































function ps_set_info($p, string $key, string $val): void
{
error_clear_last();
$safeResult = \ps_set_info($p, $key, $val);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_set_parameter($psdoc, string $name, string $value): void
{
error_clear_last();
$safeResult = \ps_set_parameter($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_set_text_pos($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_set_text_pos($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

































































function ps_set_value($psdoc, string $name, float $value): void
{
error_clear_last();
$safeResult = \ps_set_value($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



























function ps_setcolor($psdoc, string $type, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
{
error_clear_last();
$safeResult = \ps_setcolor($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_setdash($psdoc, float $on, float $off): void
{
error_clear_last();
$safeResult = \ps_setdash($psdoc, $on, $off);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setflat($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setflat($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setfont($psdoc, int $fontid, float $size): void
{
error_clear_last();
$safeResult = \ps_setfont($psdoc, $fontid, $size);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setgray($psdoc, float $gray): void
{
error_clear_last();
$safeResult = \ps_setgray($psdoc, $gray);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinecap($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinecap($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinejoin($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinejoin($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setlinewidth($psdoc, float $width): void
{
error_clear_last();
$safeResult = \ps_setlinewidth($psdoc, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_setmiterlimit($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setmiterlimit($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setoverprintmode($psdoc, int $mode): void
{
error_clear_last();
$safeResult = \ps_setoverprintmode($psdoc, $mode);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setpolydash($psdoc, float $arr): void
{
error_clear_last();
$safeResult = \ps_setpolydash($psdoc, $arr);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_shading_pattern($psdoc, int $shadingid, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading_pattern($psdoc, $shadingid, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




































function ps_shading($psdoc, string $type, float $x0, float $y0, float $x1, float $y1, float $c1, float $c2, float $c3, float $c4, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}















function ps_shfill($psdoc, int $shadingid): void
{
error_clear_last();
$safeResult = \ps_shfill($psdoc, $shadingid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_show_xy($psdoc, string $text, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_show_xy($psdoc, $text, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_show_xy2($psdoc, string $text, int $len, float $xcoor, float $ycoor): void
{
error_clear_last();
$safeResult = \ps_show_xy2($psdoc, $text, $len, $xcoor, $ycoor);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_show($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_show($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_show2($psdoc, string $text, int $len): void
{
error_clear_last();
$safeResult = \ps_show2($psdoc, $text, $len);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_symbol($psdoc, int $ord): void
{
error_clear_last();
$safeResult = \ps_symbol($psdoc, $ord);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_translate($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_translate($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\YazException;












































function yaz_ccl_parse($id, string $query, ?array &$result): void
{
error_clear_last();
$safeResult = \yaz_ccl_parse($id, $query, $result);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}









function yaz_close($id): void
{
error_clear_last();
$safeResult = \yaz_close($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}

































































































































































































function yaz_connect(string $zurl, $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \yaz_connect($zurl, $options);
} else {
$safeResult = \yaz_connect($zurl);
}
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}














function yaz_database($id, string $databases): void
{
error_clear_last();
$safeResult = \yaz_database($id, $databases);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}















function yaz_element($id, string $elementset): void
{
error_clear_last();
$safeResult = \yaz_element($id, $elementset);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












function yaz_present($id): void
{
error_clear_last();
$safeResult = \yaz_present($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}
































function yaz_search($id, string $type, string $query): void
{
error_clear_last();
$safeResult = \yaz_search($id, $type, $query);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












































function yaz_wait(?array &$options = null)
{
error_clear_last();
$safeResult = \yaz_wait($options);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CurlException;










function curl_copy_handle(\CurlHandle $handle): \CurlHandle
{
error_clear_last();
$safeResult = \curl_copy_handle($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}












function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_escape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















function curl_exec(\CurlHandle $handle)
{
error_clear_last();
$safeResult = \curl_exec($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















































































































































































































































































































































































































































































function curl_getinfo(\CurlHandle $handle, ?int $option = null)
{
error_clear_last();
if ($option !== null) {
$safeResult = \curl_getinfo($handle, $option);
} else {
$safeResult = \curl_getinfo($handle);
}
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}

















function curl_init(?string $url = null): \CurlHandle
{
error_clear_last();
if ($url !== null) {
$safeResult = \curl_init($url);
} else {
$safeResult = \curl_init();
}
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}















































function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
$safeResult = \curl_multi_info_read($multi_handle, $queued_messages);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
return $safeResult;
}









function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$safeResult = \curl_multi_init();
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}









































































































































function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_multi_setopt($multi_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
}




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_setopt($handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}











function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
$safeResult = \curl_share_errno($share_handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
return $safeResult;
}




































































function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_share_setopt($share_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
}












function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_unescape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_upkeep(\CurlHandle $handle): void
{
error_clear_last();
$safeResult = \curl_upkeep($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}
<?php

namespace Safe;

use Safe\Exceptions\SessionException;








function session_abort(): void
{
error_clear_last();
$safeResult = \session_abort();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}



























function session_create_id(string $prefix = ""): string
{
error_clear_last();
$safeResult = \session_create_id($prefix);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}














function session_decode(string $data): void
{
error_clear_last();
$safeResult = \session_decode($data);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


















function session_destroy(): void
{
error_clear_last();
$safeResult = \session_destroy();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}













function session_encode(): string
{
error_clear_last();
$safeResult = \session_encode();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
























function session_id(?string $id = null): string
{
error_clear_last();
if ($id !== null) {
$safeResult = \session_id($id);
} else {
$safeResult = \session_id();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
















function session_module_name(?string $module = null): string
{
error_clear_last();
if ($module !== null) {
$safeResult = \session_module_name($module);
} else {
$safeResult = \session_module_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}












































function session_name(?string $name = null): string
{
error_clear_last();
if ($name !== null) {
$safeResult = \session_name($name);
} else {
$safeResult = \session_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}

















function session_regenerate_id(bool $delete_old_session = false): void
{
error_clear_last();
$safeResult = \session_regenerate_id($delete_old_session);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}










function session_reset(): void
{
error_clear_last();
$safeResult = \session_reset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}

























function session_save_path(?string $path = null): string
{
error_clear_last();
if ($path !== null) {
$safeResult = \session_save_path($path);
} else {
$safeResult = \session_save_path();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}









function session_unset(): void
{
error_clear_last();
$safeResult = \session_unset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
















function session_write_close(): void
{
error_clear_last();
$safeResult = \session_write_close();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FunchandException;









function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \register_tick_function($callback, ...$args);
} else {
$safeResult = \register_tick_function($callback);
}
if ($safeResult === false) {
throw FunchandException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZlibException;



















function deflate_add(\DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \deflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























































































function deflate_init(int $encoding, array $options = []): \DeflateContext
{
error_clear_last();
$safeResult = \deflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function gzclose($stream): void
{
error_clear_last();
$safeResult = \gzclose($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}




















function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string
{
error_clear_last();
$safeResult = \gzcompress($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzdecode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}



















function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string
{
error_clear_last();
$safeResult = \gzdeflate($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

























function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
$safeResult = \gzencode($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzfile(string $filename, int $use_include_path = 0): array
{
error_clear_last();
$safeResult = \gzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}














function gzgets($stream, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzgets($stream, $length);
} else {
$safeResult = \gzgets($stream);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzinflate($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























function gzopen(string $filename, string $mode, int $use_include_path = 0)
{
error_clear_last();
$safeResult = \gzopen($filename, $mode, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzpassthru($stream): int
{
error_clear_last();
$safeResult = \gzpassthru($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzread($stream, int $length): string
{
error_clear_last();
$safeResult = \gzread($stream, $length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function gzrewind($stream): void
{
error_clear_last();
$safeResult = \gzrewind($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}












function gztell($stream): int
{
error_clear_last();
$safeResult = \gztell($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzuncompress(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzuncompress($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}


















function gzwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzwrite($stream, $data, $length);
} else {
$safeResult = \gzwrite($stream, $data);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_read_len(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_read_len($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_status(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_status($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}























function inflate_add(\InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \inflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









































































function inflate_init(int $encoding, array $options = []): \InflateContext
{
error_clear_last();
$safeResult = \inflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

















function readgzfile(string $filename, int $use_include_path = 0): int
{
error_clear_last();
$safeResult = \readgzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \zlib_decode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MiscException;

























function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
$safeResult = \define($constant_name, $value, $case_insensitive);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}






















function highlight_file(string $filename, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_file($filename, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}














function highlight_string(string $string, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_string($string, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function hrtime(bool $as_number = false)
{
error_clear_last();
$safeResult = \hrtime($as_number);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}


/**
 * Pack given arguments into a binary string according to
 * format.
 *
 * The idea for this function was taken from Perl and all formatting codes
 * work the same as in Perl. However, there are some formatting codes that are
 * missing such as Perl's "u" format code.
 *
 * Note that the distinction between signed and unsigned values only
 * affects the function unpack, where as
 * function pack gives the same result for
 * signed and unsigned format codes.
 *
 * @param string $format The format string consists of format codes
 * followed by an optional repeater argument. The repeater argument can
 * be either an integer value or * for repeating to
 * the end of the input data. For a, A, h, H the repeat count specifies
 * how many characters of one data argument are taken, for @ it is the
 * absolute position where to put the next data, for everything else the
 * repeat count specifies how many data arguments are consumed and packed
 * into the resulting binary string.
 *
 * Currently implemented formats are:
 *
 * pack format characters
 *
 *
 *
 * Code
 * Description
 *
 *
 *
 *
 * a
 * NUL-padded string
 *
 *
 * A
 * SPACE-padded string
 *
 * h
 * Hex string, low nibble first
 *
 * H
 * Hex string, high nibble first
 * csigned char
 *
 * C
 * unsigned char
 *
 * s
 * signed short (always 16 bit, machine byte order)
 *
 *
 * S
 * unsigned short (always 16 bit, machine byte order)
 *
 *
 * n
 * unsigned short (always 16 bit, big endian byte order)
 *
 *
 * v
 * unsigned short (always 16 bit, little endian byte order)
 *
 *
 * i
 * signed integer (machine dependent size and byte order)
 *
 *
 * I
 * unsigned integer (machine dependent size and byte order)
 *
 *
 * l
 * signed long (always 32 bit, machine byte order)
 *
 *
 * L
 * unsigned long (always 32 bit, machine byte order)
 *
 *
 * N
 * unsigned long (always 32 bit, big endian byte order)
 *
 *
 * V
 * unsigned long (always 32 bit, little endian byte order)
 *
 *
 * q
 * signed long long (always 64 bit, machine byte order)
 *
 *
 * Q
 * unsigned long long (always 64 bit, machine byte order)
 *
 *
 * J
 * unsigned long long (always 64 bit, big endian byte order)
 *
 *
 * P
 * unsigned long long (always 64 bit, little endian byte order)
 *
 *
 * f
 * float (machine dependent size and representation)
 *
 *
 * g
 * float (machine dependent size, little endian byte order)
 *
 *
 * G
 * float (machine dependent size, big endian byte order)
 *
 *
 * d
 * double (machine dependent size and representation)
 *
 *
 * e
 * double (machine dependent size, little endian byte order)
 *
 *
 * E
 * double (machine dependent size, big endian byte order)
 *
 *
 * x
 * NUL byte
 *
 *
 * X
 * Back up one byte
 *
 *
 * Z
 * NUL-padded string
 *
 *
 * @
 * NUL-fill to absolute position
 *
 *
 *
 *
 * @param mixed $values
 * @return string Returns a binary string containing data.
 * @throws MiscException
 *
 */
function pack(string $format, ...$values): string
{
error_clear_last();
if ($values !== []) {
$safeResult = \pack($format, ...$values);
} else {
$safeResult = \pack($format);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): string
{
error_clear_last();
$safeResult = \sapi_windows_cp_conv($in_codepage, $out_codepage, $subject);
if ($safeResult === null) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}









function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
$safeResult = \sapi_windows_cp_set($codepage);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}













function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
{
error_clear_last();
$safeResult = \sapi_windows_generate_ctrl_event($event, $pid);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}

































function sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): void
{
error_clear_last();
$safeResult = \sapi_windows_set_ctrl_handler($handler, $add);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}


















function sapi_windows_vt100_support($stream, ?bool $enable = null): void
{
error_clear_last();
if ($enable !== null) {
$safeResult = \sapi_windows_vt100_support($stream, $enable);
} else {
$safeResult = \sapi_windows_vt100_support($stream);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}
















function sleep(int $seconds)
{
error_clear_last();
$safeResult = \sleep($seconds);
return $safeResult;
}





























function time_nanosleep(int $seconds, int $nanoseconds)
{
error_clear_last();
$safeResult = \time_nanosleep($seconds, $nanoseconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}










function time_sleep_until(float $timestamp): void
{
error_clear_last();
$safeResult = \time_sleep_until($timestamp);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}



































function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
$safeResult = \unpack($format, $string, $offset);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CubridException;

























































































































function cubrid_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
{
error_clear_last();
$safeResult = \cubrid_col_size($conn_identifier, $oid, $attr_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_names($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_names($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_types($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_types($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}


















function cubrid_commit($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_commit($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














































































function cubrid_connect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_connect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



























function cubrid_connect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_connect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_current_oid($req_identifier): string
{
error_clear_last();
$safeResult = \cubrid_current_oid($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_disconnect($conn_identifier = null): void
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_disconnect($conn_identifier);
} else {
$safeResult = \cubrid_disconnect();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_drop($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_drop($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_free_result($req_identifier): void
{
error_clear_last();
$safeResult = \cubrid_free_result($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_get_charset($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_charset($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_get_class_name($conn_identifier, string $oid): string
{
error_clear_last();
$safeResult = \cubrid_get_class_name($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}









function cubrid_get_client_info(): string
{
error_clear_last();
$safeResult = \cubrid_get_client_info();
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















































































































function cubrid_get_db_parameter($conn_identifier): array
{
error_clear_last();
$safeResult = \cubrid_get_db_parameter($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_get_query_timeout($req_identifier): int
{
error_clear_last();
$safeResult = \cubrid_get_query_timeout($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_get_server_info($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_server_info($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















function cubrid_insert_id($conn_identifier = null): string
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_insert_id($conn_identifier);
} else {
$safeResult = \cubrid_insert_id();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob_close(array $lob_identifier_array): void
{
error_clear_last();
$safeResult = \cubrid_lob_close($lob_identifier_array);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
{
error_clear_last();
$safeResult = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob_get($conn_identifier, string $sql): array
{
error_clear_last();
$safeResult = \cubrid_lob_get($conn_identifier, $sql);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_lob_send($conn_identifier, $lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob_send($conn_identifier, $lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob_size($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}

















function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_close($lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob2_close($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_export($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_export($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_import($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_import($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
{
error_clear_last();
if ($type !== "BLOB") {
$safeResult = \cubrid_lob2_new($conn_identifier, $type);
} elseif ($conn_identifier !== null) {
$safeResult = \cubrid_lob2_new($conn_identifier);
} else {
$safeResult = \cubrid_lob2_new();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_read($lob_identifier, int $len): string
{
error_clear_last();
$safeResult = \cubrid_lob2_read($lob_identifier, $len);
if ($safeResult === null) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}































function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_size($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_size64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_size64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob2_tell($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_tell($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_tell64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_tell64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_write($lob_identifier, string $buf): void
{
error_clear_last();
$safeResult = \cubrid_lob2_write($lob_identifier, $buf);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_read($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_read($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_write($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_write($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}


























function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
{
error_clear_last();
$safeResult = \cubrid_move_cursor($req_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_next_result($result): void
{
error_clear_last();
$safeResult = \cubrid_next_result($result);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
















































































function cubrid_pconnect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_pconnect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_pconnect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_pconnect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
{
error_clear_last();
$safeResult = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_put($conn_identifier, string $oid, ?string $attr = null, $value = null): void
{
error_clear_last();
if ($value !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr, $value);
} elseif ($attr !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr);
} else {
$safeResult = \cubrid_put($conn_identifier, $oid);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_rollback($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_rollback($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}







































































































































































































































































































































































































function cubrid_schema($conn_identifier, int $schema_type, ?string $class_name = null, ?string $attr_name = null): array
{
error_clear_last();
if ($attr_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
} elseif ($class_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name);
} else {
$safeResult = \cubrid_schema($conn_identifier, $schema_type);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
{
error_clear_last();
$safeResult = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}




















function cubrid_set_autocommit($conn_identifier, bool $mode): void
{
error_clear_last();
$safeResult = \cubrid_set_autocommit($conn_identifier, $mode);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}



















function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_value): void
{
error_clear_last();
$safeResult = \cubrid_set_db_parameter($conn_identifier, $param_type, $param_value);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_set_query_timeout($req_identifier, int $timeout): void
{
error_clear_last();
$safeResult = \cubrid_set_query_timeout($req_identifier, $timeout);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MailparseException;























function mailparse_msg_extract_part_file($mimemail, $filename, ?callable $callbackfunc = null): string
{
error_clear_last();
if ($callbackfunc !== null) {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc);
} else {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename);
}
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}











function mailparse_msg_free($mimemail): void
{
error_clear_last();
$safeResult = \mailparse_msg_free($mimemail);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}















function mailparse_msg_parse_file(string $filename)
{
error_clear_last();
$safeResult = \mailparse_msg_parse_file($filename);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}














function mailparse_msg_parse($mimemail, string $data): void
{
error_clear_last();
$safeResult = \mailparse_msg_parse($mimemail, $data);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}













function mailparse_stream_encode($sourcefp, $destfp, string $encoding): void
{
error_clear_last();
$safeResult = \mailparse_stream_encode($sourcefp, $destfp, $encoding);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\LdapException;














function ldap_8859_to_t61(string $value): string
{
error_clear_last();
$safeResult = \ldap_8859_to_t61($value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}





















function ldap_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
if ($password !== null) {
$safeResult = \ldap_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_bind($ldap, $dn);
} else {
$safeResult = \ldap_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_compare(\LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value, $controls);
} else {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value);
}
if ($safeResult === -1) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_control_paged_result_response($link, $result, ?string &$cookie = null, ?int &$estimated = null): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result_response($link, $result, $cookie, $estimated);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_control_paged_result($link, int $pagesize, bool $iscritical = false, string $cookie = ""): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result($link, $pagesize, $iscritical, $cookie);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}












function ldap_count_entries(\LDAP\Connection $ldap, \LDAP\Result $result): int
{
error_clear_last();
$safeResult = \ldap_count_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_delete(\LDAP\Connection $ldap, string $dn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_delete($ldap, $dn, $controls);
} else {
$safeResult = \ldap_delete($ldap, $dn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_dn2ufn(string $dn): string
{
error_clear_last();
$safeResult = \ldap_dn2ufn($dn);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_exop_passwd(\LDAP\Connection $ldap, string $user = "", string $old_password = "", string $new_password = "", ?array &$controls = null)
{
error_clear_last();
$safeResult = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}










function ldap_exop_whoami(\LDAP\Connection $ldap)
{
error_clear_last();
$safeResult = \ldap_exop_whoami($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}




















function ldap_exop(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, ?string &$response_data = null, ?string &$response_oid = null)
{
error_clear_last();
if ($response_oid !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid);
} elseif ($response_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data);
} elseif ($controls !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls);
} elseif ($request_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data);
} else {
$safeResult = \ldap_exop($ldap, $request_oid);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



















function ldap_explode_dn(string $dn, int $with_attrib): array
{
error_clear_last();
$safeResult = \ldap_explode_dn($dn, $with_attrib);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
















function ldap_first_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_first_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_first_entry(\LDAP\Connection $ldap, \LDAP\Result $result): \LDAP\ResultEntry
{
error_clear_last();
$safeResult = \ldap_first_entry($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}















function ldap_free_result(\LDAP\Result $result): void
{
error_clear_last();
$safeResult = \ldap_free_result($result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
























function ldap_get_attributes(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): array
{
error_clear_last();
$safeResult = \ldap_get_attributes($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_get_dn(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_get_dn($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}























function ldap_get_entries(\LDAP\Connection $ldap, \LDAP\Result $result): array
{
error_clear_last();
$safeResult = \ldap_get_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































function ldap_get_option(\LDAP\Connection $ldap, int $option, &$value = null): void
{
error_clear_last();
$safeResult = \ldap_get_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















function ldap_get_values_len(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values_len($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



































function ldap_get_values(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}













function ldap_mod_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}














function ldap_mod_del(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_del($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_del($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}













function ldap_mod_replace(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}























































































function ldap_modify_batch(\LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
} else {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_next_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_next_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_parse_exop(\LDAP\Connection $ldap, \LDAP\Result $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
$safeResult = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















function ldap_parse_result(\LDAP\Connection $ldap, \LDAP\Result $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
$safeResult = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_rename(\LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
} else {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_sasl_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): void
{
error_clear_last();
if ($props !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
} elseif ($authz_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
} elseif ($authc_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
} elseif ($realm !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
} elseif ($mech !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech);
} elseif ($password !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn);
} else {
$safeResult = \ldap_sasl_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















































































































































































function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
$safeResult = \ldap_set_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}









function ldap_unbind(\LDAP\Connection $ldap): void
{
error_clear_last();
$safeResult = \ldap_unbind($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlrpcException;









function xmlrpc_set_type(&$value, string $type): void
{
error_clear_last();
$safeResult = \xmlrpc_set_type($value, $type);
if ($safeResult === false) {
throw XmlrpcException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SqlsrvException;















function sqlsrv_begin_transaction($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_begin_transaction($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}














function sqlsrv_cancel($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_cancel($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}







































function sqlsrv_client_info($conn): array
{
error_clear_last();
$safeResult = \sqlsrv_client_info($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}









function sqlsrv_close($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_close($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
















function sqlsrv_commit($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_commit($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}












































function sqlsrv_configure(string $setting, $value): void
{
error_clear_last();
$safeResult = \sqlsrv_configure($setting, $value);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}











function sqlsrv_execute($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_execute($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}





























function sqlsrv_fetch_array($stmt, ?int $fetchType = null, ?int $row = null, ?int $offset = null): ?array
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row);
} elseif ($fetchType !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType);
} else {
$safeResult = \sqlsrv_fetch_array($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}


































function sqlsrv_fetch_object($stmt, ?string $className = null, ?array $ctorParams = null, ?int $row = null, ?int $offset = null): ?object
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row);
} elseif ($ctorParams !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams);
} elseif ($className !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className);
} else {
$safeResult = \sqlsrv_fetch_object($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}




























function sqlsrv_fetch($stmt, ?int $row = null, ?int $offset = null): ?bool
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row);
} else {
$safeResult = \sqlsrv_fetch($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}















function sqlsrv_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_free_stmt($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}




















function sqlsrv_get_field($stmt, int $fieldIndex, ?int $getAsType = null)
{
error_clear_last();
if ($getAsType !== null) {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex, $getAsType);
} else {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_next_result($stmt): ?bool
{
error_clear_last();
$safeResult = \sqlsrv_next_result($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_num_fields($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_fields($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}



















function sqlsrv_num_rows($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_rows($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}























function sqlsrv_prepare($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_prepare($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}






















function sqlsrv_query($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_query($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}










function sqlsrv_rollback($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_rollback($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ShmopException;









function shmop_delete(\Shmop $shmop): void
{
error_clear_last();
$safeResult = \shmop_delete($shmop);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
}














function shmop_read(\Shmop $shmop, int $offset, int $size): string
{
error_clear_last();
$safeResult = \shmop_read($shmop, $offset, $size);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DirException;









function chdir(string $directory): void
{
error_clear_last();
$safeResult = \chdir($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}


















function chroot(string $directory): void
{
error_clear_last();
$safeResult = \chroot($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}













function dir(string $directory, $context = null): \Directory
{
error_clear_last();
if ($context !== null) {
$safeResult = \dir($directory, $context);
} else {
$safeResult = \dir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function getcwd(): string
{
error_clear_last();
$safeResult = \getcwd();
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \opendir($directory, $context);
} else {
$safeResult = \opendir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}





















function scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \scandir($directory, $sorting_order, $context);
} else {
$safeResult = \scandir($directory, $sorting_order);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GettextException;













function bindtextdomain(string $domain, string $directory): string
{
error_clear_last();
$safeResult = \bindtextdomain($domain, $directory);
if ($safeResult === false) {
throw GettextException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StreamException;










function stream_context_set_params($context, array $params): void
{
error_clear_last();
$safeResult = \stream_context_set_params($context, $params);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int
{
error_clear_last();
if ($offset !== 0) {
$safeResult = \stream_copy_to_stream($from, $to, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_copy_to_stream($from, $to, $length);
} else {
$safeResult = \stream_copy_to_stream($from, $to);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

































function stream_filter_append($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_append($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}


































function stream_filter_prepend($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_prepend($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
$safeResult = \stream_filter_register($filter_name, $class);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}













function stream_filter_remove($stream_filter): void
{
error_clear_last();
$safeResult = \stream_filter_remove($stream_filter);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_get_contents($stream, ?int $length = null, int $offset = -1): string
{
error_clear_last();
if ($offset !== -1) {
$safeResult = \stream_get_contents($stream, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_get_contents($stream, $length);
} else {
$safeResult = \stream_get_contents($stream);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_get_line($stream, int $length, string $ending = ""): string
{
error_clear_last();
$safeResult = \stream_get_line($stream, $length, $ending);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}










function stream_isatty($stream): void
{
error_clear_last();
$safeResult = \stream_isatty($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_resolve_include_path(string $filename): string
{
error_clear_last();
$safeResult = \stream_resolve_include_path($filename);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
$safeResult = \stream_set_blocking($stream, $enable);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}

















function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
{
error_clear_last();
$safeResult = \stream_set_timeout($stream, $seconds, $microseconds);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}



















function stream_socket_accept($socket, ?float $timeout = null, ?string &$peer_name = null)
{
error_clear_last();
if ($peer_name !== null) {
$safeResult = \stream_socket_accept($socket, $timeout, $peer_name);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_accept($socket, $timeout);
} else {
$safeResult = \stream_socket_accept($socket);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















































function stream_socket_client(string $address, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout);
} else {
$safeResult = \stream_socket_client($address, $error_code, $error_message);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












function stream_socket_get_name($socket, bool $remote): string
{
error_clear_last();
$safeResult = \stream_socket_get_name($socket, $remote);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_socket_pair(int $domain, int $type, int $protocol): array
{
error_clear_last();
$safeResult = \stream_socket_pair($domain, $type, $protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}






































function stream_socket_recvfrom($socket, int $length, int $flags = 0, ?string &$address = null): string
{
error_clear_last();
$safeResult = \stream_socket_recvfrom($socket, $length, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}































function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int
{
error_clear_last();
$safeResult = \stream_socket_sendto($socket, $data, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












































function stream_socket_server(string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags, $context);
} else {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}















function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
$safeResult = \stream_socket_shutdown($stream, $mode);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_supports_lock($stream): void
{
error_clear_last();
$safeResult = \stream_supports_lock($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
















function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
$safeResult = \stream_wrapper_register($protocol, $class, $flags);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_wrapper_restore(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_restore($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}












function stream_wrapper_unregister(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_unregister($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ComException;











function com_create_guid(): string
{
error_clear_last();
$safeResult = \com_create_guid();
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
























function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
if ($sink_interface !== null) {
$safeResult = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
$safeResult = \com_event_sink($variant, $sink_object);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}






















































function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
$safeResult = \com_load_typelib($typelib, $case_insensitive);
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}

















function com_print_typeinfo(object $variant, ?string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
if ($display_sink !== false) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
} elseif ($dispatch_interface !== null) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface);
} else {
$safeResult = \com_print_typeinfo($variant);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}












function variant_date_to_timestamp(object $variant): int
{
error_clear_last();
$safeResult = \variant_date_to_timestamp($variant);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}












function variant_round($value, int $decimals)
{
error_clear_last();
$safeResult = \variant_round($value, $decimals);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FtpException;












function ftp_alloc(\FTP\Connection $ftp, int $size, ?string &$response = null): void
{
error_clear_last();
$safeResult = \ftp_alloc($ftp, $size, $response);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_append(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
$safeResult = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}









function ftp_cdup(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_cdup($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_chdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_chdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}













function ftp_chmod(\FTP\Connection $ftp, int $permissions, string $filename): int
{
error_clear_last();
$safeResult = \ftp_chmod($ftp, $permissions, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_close(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_close($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}


















function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_delete(\FTP\Connection $ftp, string $filename): void
{
error_clear_last();
$safeResult = \ftp_delete($ftp, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fget(\FTP\Connection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fput(\FTP\Connection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_login(\FTP\Connection $ftp, string $username, string $password): void
{
error_clear_last();
$safeResult = \ftp_login($ftp, $username, $password);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_mkdir(\FTP\Connection $ftp, string $directory): string
{
error_clear_last();
$safeResult = \ftp_mkdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_mlsd(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_mlsd($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}




















function ftp_nb_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}














function ftp_nlist(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_nlist($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
















function ftp_pasv(\FTP\Connection $ftp, bool $enable): void
{
error_clear_last();
$safeResult = \ftp_pasv($ftp, $enable);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}














function ftp_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_pwd(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_pwd($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}













function ftp_raw(\FTP\Connection $ftp, string $command): array
{
error_clear_last();
$safeResult = \ftp_raw($ftp, $command);
if ($safeResult === null) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}












function ftp_rename(\FTP\Connection $ftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ftp_rename($ftp, $from, $to);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_rmdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_rmdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}
















function ftp_site(\FTP\Connection $ftp, string $command): void
{
error_clear_last();
$safeResult = \ftp_site($ftp, $command);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_size(\FTP\Connection $ftp, string $filename): int
{
error_clear_last();
$safeResult = \ftp_size($ftp, $filename);
if ($safeResult === -1) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}























function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_ssl_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_systype(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_systype($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;


return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
RenameFunctionRector::class,
[ 'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_request_headers' => 'Safe\apache_request_headers',
'apache_response_headers' => 'Safe\apache_response_headers',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
'apcu_cas' => 'Safe\apcu_cas',
'apcu_dec' => 'Safe\apcu_dec',
'apcu_fetch' => 'Safe\apcu_fetch',
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'array_walk_recursive' => 'Safe\array_walk_recursive',
'assert_options' => 'Safe\assert_options',
'base64_decode' => 'Safe\base64_decode',
'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzopen' => 'Safe\bzopen',
'bzread' => 'Safe\bzread',
'bzwrite' => 'Safe\bzwrite',
'chdir' => 'Safe\chdir',
'chgrp' => 'Safe\chgrp',
'chmod' => 'Safe\chmod',
'chown' => 'Safe\chown',
'chroot' => 'Safe\chroot',
'class_alias' => 'Safe\class_alias',
'class_implements' => 'Safe\class_implements',
'class_parents' => 'Safe\class_parents',
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'closelog' => 'Safe\closelog',
'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
'copy' => 'Safe\copy',
'cubrid_bind' => 'Safe\cubrid_bind',
'cubrid_column_names' => 'Safe\cubrid_column_names',
'cubrid_column_types' => 'Safe\cubrid_column_types',
'cubrid_col_size' => 'Safe\cubrid_col_size',
'cubrid_commit' => 'Safe\cubrid_commit',
'cubrid_connect' => 'Safe\cubrid_connect',
'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
'cubrid_current_oid' => 'Safe\cubrid_current_oid',
'cubrid_disconnect' => 'Safe\cubrid_disconnect',
'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
'cubrid_lob_close' => 'Safe\cubrid_lob_close',
'cubrid_lob_export' => 'Safe\cubrid_lob_export',
'cubrid_lob_get' => 'Safe\cubrid_lob_get',
'cubrid_lob_send' => 'Safe\cubrid_lob_send',
'cubrid_lob_size' => 'Safe\cubrid_lob_size',
'cubrid_lock_read' => 'Safe\cubrid_lock_read',
'cubrid_lock_write' => 'Safe\cubrid_lock_write',
'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
'cubrid_next_result' => 'Safe\cubrid_next_result',
'cubrid_pconnect' => 'Safe\cubrid_pconnect',
'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
'cubrid_prepare' => 'Safe\cubrid_prepare',
'cubrid_put' => 'Safe\cubrid_put',
'cubrid_rollback' => 'Safe\cubrid_rollback',
'cubrid_schema' => 'Safe\cubrid_schema',
'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
'cubrid_seq_put' => 'Safe\cubrid_seq_put',
'cubrid_set_add' => 'Safe\cubrid_set_add',
'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
'cubrid_set_drop' => 'Safe\cubrid_set_drop',
'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_init' => 'Safe\curl_multi_init',
'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_errno' => 'Safe\curl_share_errno',
'curl_share_setopt' => 'Safe\curl_share_setopt',
'curl_unescape' => 'Safe\curl_unescape',
'curl_upkeep' => 'Safe\curl_upkeep',
'date' => 'Safe\date',
'date_parse' => 'Safe\date_parse',
'date_parse_from_format' => 'Safe\date_parse_from_format',
'date_sunrise' => 'Safe\date_sunrise',
'date_sunset' => 'Safe\date_sunset',
'date_sun_info' => 'Safe\date_sun_info',
'db2_autocommit' => 'Safe\db2_autocommit',
'db2_bind_param' => 'Safe\db2_bind_param',
'db2_client_info' => 'Safe\db2_client_info',
'db2_close' => 'Safe\db2_close',
'db2_commit' => 'Safe\db2_commit',
'db2_execute' => 'Safe\db2_execute',
'db2_free_result' => 'Safe\db2_free_result',
'db2_free_stmt' => 'Safe\db2_free_stmt',
'db2_get_option' => 'Safe\db2_get_option',
'db2_pclose' => 'Safe\db2_pclose',
'db2_rollback' => 'Safe\db2_rollback',
'db2_server_info' => 'Safe\db2_server_info',
'db2_set_option' => 'Safe\db2_set_option',
'define' => 'Safe\define',
'deflate_add' => 'Safe\deflate_add',
'deflate_init' => 'Safe\deflate_init',
'dir' => 'Safe\dir',
'disk_free_space' => 'Safe\disk_free_space',
'disk_total_space' => 'Safe\disk_total_space',
'dl' => 'Safe\dl',
'dns_get_record' => 'Safe\dns_get_record',
'eio_busy' => 'Safe\eio_busy',
'eio_chmod' => 'Safe\eio_chmod',
'eio_chown' => 'Safe\eio_chown',
'eio_close' => 'Safe\eio_close',
'eio_custom' => 'Safe\eio_custom',
'eio_dup2' => 'Safe\eio_dup2',
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
'eio_fsync' => 'Safe\eio_fsync',
'eio_ftruncate' => 'Safe\eio_ftruncate',
'eio_futime' => 'Safe\eio_futime',
'eio_grp' => 'Safe\eio_grp',
'eio_lstat' => 'Safe\eio_lstat',
'eio_mkdir' => 'Safe\eio_mkdir',
'eio_mknod' => 'Safe\eio_mknod',
'eio_nop' => 'Safe\eio_nop',
'eio_readahead' => 'Safe\eio_readahead',
'eio_readdir' => 'Safe\eio_readdir',
'eio_readlink' => 'Safe\eio_readlink',
'eio_rename' => 'Safe\eio_rename',
'eio_rmdir' => 'Safe\eio_rmdir',
'eio_seek' => 'Safe\eio_seek',
'eio_sendfile' => 'Safe\eio_sendfile',
'eio_stat' => 'Safe\eio_stat',
'eio_statvfs' => 'Safe\eio_statvfs',
'eio_symlink' => 'Safe\eio_symlink',
'eio_sync' => 'Safe\eio_sync',
'eio_syncfs' => 'Safe\eio_syncfs',
'eio_sync_file_range' => 'Safe\eio_sync_file_range',
'eio_truncate' => 'Safe\eio_truncate',
'eio_unlink' => 'Safe\eio_unlink',
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'filetype' => 'Safe\filetype',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
'filter_input_array' => 'Safe\filter_input_array',
'filter_var_array' => 'Safe\filter_var_array',
'finfo_close' => 'Safe\finfo_close',
'finfo_open' => 'Safe\finfo_open',
'flock' => 'Safe\flock',
'fopen' => 'Safe\fopen',
'fpm_get_status' => 'Safe\fpm_get_status',
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
'fstat' => 'Safe\fstat',
'fsync' => 'Safe\fsync',
'ftell' => 'Safe\ftell',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
'ftp_chdir' => 'Safe\ftp_chdir',
'ftp_chmod' => 'Safe\ftp_chmod',
'ftp_close' => 'Safe\ftp_close',
'ftp_connect' => 'Safe\ftp_connect',
'ftp_delete' => 'Safe\ftp_delete',
'ftp_fget' => 'Safe\ftp_fget',
'ftp_fput' => 'Safe\ftp_fput',
'ftp_get' => 'Safe\ftp_get',
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
'ftp_raw' => 'Safe\ftp_raw',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
'ftp_size' => 'Safe\ftp_size',
'ftp_ssl_connect' => 'Safe\ftp_ssl_connect',
'ftp_systype' => 'Safe\ftp_systype',
'ftruncate' => 'Safe\ftruncate',
'fwrite' => 'Safe\fwrite',
'getallheaders' => 'Safe\getallheaders',
'getcwd' => 'Safe\getcwd',
'gethostname' => 'Safe\gethostname',
'getimagesize' => 'Safe\getimagesize',
'getlastmod' => 'Safe\getlastmod',
'getmygid' => 'Safe\getmygid',
'getmyinode' => 'Safe\getmyinode',
'getmypid' => 'Safe\getmypid',
'getmyuid' => 'Safe\getmyuid',
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
'getrusage' => 'Safe\getrusage',
'getservbyport' => 'Safe\getservbyport',
'get_cfg_var' => 'Safe\get_cfg_var',
'get_headers' => 'Safe\get_headers',
'get_include_path' => 'Safe\get_include_path',
'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
'gmmktime' => 'Safe\gmmktime',
'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
'gnupg_deletekey' => 'Safe\gnupg_deletekey',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
'gzcompress' => 'Safe\gzcompress',
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzinflate' => 'Safe\gzinflate',
'gzopen' => 'Safe\gzopen',
'gzpassthru' => 'Safe\gzpassthru',
'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gztell' => 'Safe\gztell',
'gzuncompress' => 'Safe\gzuncompress',
'gzwrite' => 'Safe\gzwrite',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'highlight_string' => 'Safe\highlight_string',
'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
'ibase_blob_create' => 'Safe\ibase_blob_create',
'ibase_blob_get' => 'Safe\ibase_blob_get',
'ibase_close' => 'Safe\ibase_close',
'ibase_commit' => 'Safe\ibase_commit',
'ibase_commit_ret' => 'Safe\ibase_commit_ret',
'ibase_connect' => 'Safe\ibase_connect',
'ibase_delete_user' => 'Safe\ibase_delete_user',
'ibase_drop_db' => 'Safe\ibase_drop_db',
'ibase_free_event_handler' => 'Safe\ibase_free_event_handler',
'ibase_free_query' => 'Safe\ibase_free_query',
'ibase_free_result' => 'Safe\ibase_free_result',
'ibase_maintain_db' => 'Safe\ibase_maintain_db',
'ibase_modify_user' => 'Safe\ibase_modify_user',
'ibase_name_result' => 'Safe\ibase_name_result',
'ibase_pconnect' => 'Safe\ibase_pconnect',
'ibase_restore' => 'Safe\ibase_restore',
'ibase_rollback' => 'Safe\ibase_rollback',
'ibase_rollback_ret' => 'Safe\ibase_rollback_ret',
'ibase_service_attach' => 'Safe\ibase_service_attach',
'ibase_service_detach' => 'Safe\ibase_service_detach',
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_mime_decode' => 'Safe\iconv_mime_decode',
'iconv_mime_encode' => 'Safe\iconv_mime_encode',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
'iconv_strlen' => 'Safe\iconv_strlen',
'idate' => 'Safe\idate',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
'imageaffinematrixget' => 'Safe\imageaffinematrixget',
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
'imagecolorset' => 'Safe\imagecolorset',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
'imagecopymergegray' => 'Safe\imagecopymergegray',
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
'imagecreatefromgd2part' => 'Safe\imagecreatefromgd2part',
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
'imagecreatefromstring' => 'Safe\imagecreatefromstring',
'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
'imagecreatefromxpm' => 'Safe\imagecreatefromxpm',
'imagecreatetruecolor' => 'Safe\imagecreatetruecolor',
'imagecrop' => 'Safe\imagecrop',
'imagecropauto' => 'Safe\imagecropauto',
'imagedashedline' => 'Safe\imagedashedline',
'imagedestroy' => 'Safe\imagedestroy',
'imageellipse' => 'Safe\imageellipse',
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
'imageftbbox' => 'Safe\imageftbbox',
'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
'imagegif' => 'Safe\imagegif',
'imagegrabscreen' => 'Safe\imagegrabscreen',
'imagegrabwindow' => 'Safe\imagegrabwindow',
'imagejpeg' => 'Safe\imagejpeg',
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
'imagepng' => 'Safe\imagepng',
'imagerectangle' => 'Safe\imagerectangle',
'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
'imagesetbrush' => 'Safe\imagesetbrush',
'imagesetclip' => 'Safe\imagesetclip',
'imagesetinterpolation' => 'Safe\imagesetinterpolation',
'imagesetpixel' => 'Safe\imagesetpixel',
'imagesetstyle' => 'Safe\imagesetstyle',
'imagesetthickness' => 'Safe\imagesetthickness',
'imagesettile' => 'Safe\imagesettile',
'imagestring' => 'Safe\imagestring',
'imagestringup' => 'Safe\imagestringup',
'imagesx' => 'Safe\imagesx',
'imagesy' => 'Safe\imagesy',
'imagetruecolortopalette' => 'Safe\imagetruecolortopalette',
'imagettfbbox' => 'Safe\imagettfbbox',
'imagettftext' => 'Safe\imagettftext',
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
'image_type_to_extension' => 'Safe\image_type_to_extension',
'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
'imap_base64' => 'Safe\imap_base64',
'imap_binary' => 'Safe\imap_binary',
'imap_body' => 'Safe\imap_body',
'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_clearflag_full' => 'Safe\imap_clearflag_full',
'imap_close' => 'Safe\imap_close',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
'imap_fetchbody' => 'Safe\imap_fetchbody',
'imap_fetchheader' => 'Safe\imap_fetchheader',
'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_gc' => 'Safe\imap_gc',
'imap_getacl' => 'Safe\imap_getacl',
'imap_getmailboxes' => 'Safe\imap_getmailboxes',
'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
'imap_headers' => 'Safe\imap_headers',
'imap_listscan' => 'Safe\imap_listscan',
'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mailboxmsginfo' => 'Safe\imap_mailboxmsginfo',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_setflag_full' => 'Safe\imap_setflag_full',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
'imap_undelete' => 'Safe\imap_undelete',
'imap_unsubscribe' => 'Safe\imap_unsubscribe',
'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7',
'inet_ntop' => 'Safe\inet_ntop',
'inet_pton' => 'Safe\inet_pton',
'inflate_add' => 'Safe\inflate_add',
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_get_status' => 'Safe\inflate_get_status',
'inflate_init' => 'Safe\inflate_init',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
'ldap_bind' => 'Safe\ldap_bind',
'ldap_compare' => 'Safe\ldap_compare',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
'ldap_explode_dn' => 'Safe\ldap_explode_dn',
'ldap_first_attribute' => 'Safe\ldap_first_attribute',
'ldap_first_entry' => 'Safe\ldap_first_entry',
'ldap_free_result' => 'Safe\ldap_free_result',
'ldap_get_attributes' => 'Safe\ldap_get_attributes',
'ldap_get_dn' => 'Safe\ldap_get_dn',
'ldap_get_entries' => 'Safe\ldap_get_entries',
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
'ldap_mod_del' => 'Safe\ldap_mod_del',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
'ldap_rename' => 'Safe\ldap_rename',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
'long2ip' => 'Safe\long2ip',
'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
'mailparse_msg_free' => 'Safe\mailparse_msg_free',
'mailparse_msg_parse' => 'Safe\mailparse_msg_parse',
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_encoding_aliases' => 'Safe\mb_encoding_aliases',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
'mb_ereg_replace' => 'Safe\mb_ereg_replace',
'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback',
'mb_ereg_search_getregs' => 'Safe\mb_ereg_search_getregs',
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
'mb_parse_str' => 'Safe\mb_parse_str',
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
'md5_file' => 'Safe\md5_file',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
'mysql_data_seek' => 'Safe\mysql_data_seek',
'mysql_db_name' => 'Safe\mysql_db_name',
'mysql_db_query' => 'Safe\mysql_db_query',
'mysql_drop_db' => 'Safe\mysql_drop_db',
'mysql_fetch_lengths' => 'Safe\mysql_fetch_lengths',
'mysql_field_flags' => 'Safe\mysql_field_flags',
'mysql_field_len' => 'Safe\mysql_field_len',
'mysql_field_name' => 'Safe\mysql_field_name',
'mysql_field_seek' => 'Safe\mysql_field_seek',
'mysql_free_result' => 'Safe\mysql_free_result',
'mysql_get_host_info' => 'Safe\mysql_get_host_info',
'mysql_get_proto_info' => 'Safe\mysql_get_proto_info',
'mysql_get_server_info' => 'Safe\mysql_get_server_info',
'mysql_info' => 'Safe\mysql_info',
'mysql_list_dbs' => 'Safe\mysql_list_dbs',
'mysql_list_fields' => 'Safe\mysql_list_fields',
'mysql_list_processes' => 'Safe\mysql_list_processes',
'mysql_list_tables' => 'Safe\mysql_list_tables',
'mysql_num_fields' => 'Safe\mysql_num_fields',
'mysql_num_rows' => 'Safe\mysql_num_rows',
'mysql_query' => 'Safe\mysql_query',
'mysql_real_escape_string' => 'Safe\mysql_real_escape_string',
'mysql_result' => 'Safe\mysql_result',
'mysql_select_db' => 'Safe\mysql_select_db',
'mysql_set_charset' => 'Safe\mysql_set_charset',
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
'net_get_interfaces' => 'Safe\net_get_interfaces',
'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
'ob_flush' => 'Safe\ob_flush',
'ob_get_clean' => 'Safe\ob_get_clean',
'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
'oci_field_size' => 'Safe\oci_field_size',
'oci_field_type' => 'Safe\oci_field_type',
'oci_field_type_raw' => 'Safe\oci_field_type_raw',
'oci_free_descriptor' => 'Safe\oci_free_descriptor',
'oci_free_statement' => 'Safe\oci_free_statement',
'oci_new_collection' => 'Safe\oci_new_collection',
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
'oci_set_action' => 'Safe\oci_set_action',
'oci_set_call_timeout' => 'Safe\oci_set_call_timeout',
'oci_set_client_identifier' => 'Safe\oci_set_client_identifier',
'oci_set_client_info' => 'Safe\oci_set_client_info',
'oci_set_db_operation' => 'Safe\oci_set_db_operation',
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
'oci_set_prefetch_lob' => 'Safe\oci_set_prefetch_lob',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
'odbc_binmode' => 'Safe\odbc_binmode',
'odbc_columnprivileges' => 'Safe\odbc_columnprivileges',
'odbc_columns' => 'Safe\odbc_columns',
'odbc_commit' => 'Safe\odbc_commit',
'odbc_connect' => 'Safe\odbc_connect',
'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
'odbc_fetch_into' => 'Safe\odbc_fetch_into',
'odbc_field_len' => 'Safe\odbc_field_len',
'odbc_field_name' => 'Safe\odbc_field_name',
'odbc_field_num' => 'Safe\odbc_field_num',
'odbc_field_scale' => 'Safe\odbc_field_scale',
'odbc_field_type' => 'Safe\odbc_field_type',
'odbc_foreignkeys' => 'Safe\odbc_foreignkeys',
'odbc_gettypeinfo' => 'Safe\odbc_gettypeinfo',
'odbc_longreadlen' => 'Safe\odbc_longreadlen',
'odbc_num_fields' => 'Safe\odbc_num_fields',
'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_primarykeys' => 'Safe\odbc_primarykeys',
'odbc_procedurecolumns' => 'Safe\odbc_procedurecolumns',
'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
'odbc_setoption' => 'Safe\odbc_setoption',
'odbc_specialcolumns' => 'Safe\odbc_specialcolumns',
'odbc_statistics' => 'Safe\odbc_statistics',
'odbc_tableprivileges' => 'Safe\odbc_tableprivileges',
'odbc_tables' => 'Safe\odbc_tables',
'opcache_compile_file' => 'Safe\opcache_compile_file',
'opcache_get_status' => 'Safe\opcache_get_status',
'opendir' => 'Safe\opendir',
'openlog' => 'Safe\openlog',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
'openssl_cipher_key_length' => 'Safe\openssl_cipher_key_length',
'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
'openssl_cms_read' => 'Safe\openssl_cms_read',
'openssl_cms_sign' => 'Safe\openssl_cms_sign',
'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
'openssl_decrypt' => 'Safe\openssl_decrypt',
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt' => 'Safe\openssl_pkcs7_encrypt',
'openssl_pkcs7_read' => 'Safe\openssl_pkcs7_read',
'openssl_pkcs7_sign' => 'Safe\openssl_pkcs7_sign',
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
'openssl_pkey_get_public' => 'Safe\openssl_pkey_get_public',
'openssl_pkey_new' => 'Safe\openssl_pkey_new',
'openssl_private_decrypt' => 'Safe\openssl_private_decrypt',
'openssl_private_encrypt' => 'Safe\openssl_private_encrypt',
'openssl_public_decrypt' => 'Safe\openssl_public_decrypt',
'openssl_public_encrypt' => 'Safe\openssl_public_encrypt',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
'openssl_spki_export' => 'Safe\openssl_spki_export',
'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
'openssl_spki_new' => 'Safe\openssl_spki_new',
'openssl_spki_verify' => 'Safe\openssl_spki_verify',
'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_checkpurpose' => 'Safe\openssl_x509_checkpurpose',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
'openssl_x509_read' => 'Safe\openssl_x509_read',
'output_add_rewrite_var' => 'Safe\output_add_rewrite_var',
'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars',
'pack' => 'Safe\pack',
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
'passthru' => 'Safe\passthru',
'pclose' => 'Safe\pclose',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
'pg_field_num' => 'Safe\pg_field_num',
'pg_field_table' => 'Safe\pg_field_table',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
'pg_query_params' => 'Safe\pg_query_params',
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
'pg_update' => 'Safe\pg_update',
'phpcredits' => 'Safe\phpcredits',
'phpinfo' => 'Safe\phpinfo',
'php_sapi_name' => 'Safe\php_sapi_name',
'popen' => 'Safe\popen',
'posix_access' => 'Safe\posix_access',
'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
'posix_getgroups' => 'Safe\posix_getgroups',
'posix_getlogin' => 'Safe\posix_getlogin',
'posix_getpgid' => 'Safe\posix_getpgid',
'posix_getpwuid' => 'Safe\posix_getpwuid',
'posix_getrlimit' => 'Safe\posix_getrlimit',
'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
'posix_mknod' => 'Safe\posix_mknod',
'posix_setegid' => 'Safe\posix_setegid',
'posix_seteuid' => 'Safe\posix_seteuid',
'posix_setgid' => 'Safe\posix_setgid',
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setsid' => 'Safe\posix_setsid',
'posix_setuid' => 'Safe\posix_setuid',
'posix_times' => 'Safe\posix_times',
'posix_uname' => 'Safe\posix_uname',
'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_replace_callback' => 'Safe\preg_replace_callback',
'preg_replace_callback_array' => 'Safe\preg_replace_callback_array',
'preg_split' => 'Safe\preg_split',
'proc_close' => 'Safe\proc_close',
'proc_nice' => 'Safe\proc_nice',
'proc_open' => 'Safe\proc_open',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
'pspell_clear_session' => 'Safe\pspell_clear_session',
'pspell_config_create' => 'Safe\pspell_config_create',
'pspell_config_data_dir' => 'Safe\pspell_config_data_dir',
'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir',
'pspell_config_ignore' => 'Safe\pspell_config_ignore',
'pspell_config_mode' => 'Safe\pspell_config_mode',
'pspell_config_personal' => 'Safe\pspell_config_personal',
'pspell_config_repl' => 'Safe\pspell_config_repl',
'pspell_config_runtogether' => 'Safe\pspell_config_runtogether',
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
'ps_add_locallink' => 'Safe\ps_add_locallink',
'ps_add_note' => 'Safe\ps_add_note',
'ps_add_pdflink' => 'Safe\ps_add_pdflink',
'ps_add_weblink' => 'Safe\ps_add_weblink',
'ps_arc' => 'Safe\ps_arc',
'ps_arcn' => 'Safe\ps_arcn',
'ps_begin_page' => 'Safe\ps_begin_page',
'ps_begin_pattern' => 'Safe\ps_begin_pattern',
'ps_begin_template' => 'Safe\ps_begin_template',
'ps_circle' => 'Safe\ps_circle',
'ps_clip' => 'Safe\ps_clip',
'ps_close' => 'Safe\ps_close',
'ps_closepath' => 'Safe\ps_closepath',
'ps_closepath_stroke' => 'Safe\ps_closepath_stroke',
'ps_close_image' => 'Safe\ps_close_image',
'ps_continue_text' => 'Safe\ps_continue_text',
'ps_curveto' => 'Safe\ps_curveto',
'ps_delete' => 'Safe\ps_delete',
'ps_end_page' => 'Safe\ps_end_page',
'ps_end_pattern' => 'Safe\ps_end_pattern',
'ps_end_template' => 'Safe\ps_end_template',
'ps_fill' => 'Safe\ps_fill',
'ps_fill_stroke' => 'Safe\ps_fill_stroke',
'ps_get_parameter' => 'Safe\ps_get_parameter',
'ps_hyphenate' => 'Safe\ps_hyphenate',
'ps_include_file' => 'Safe\ps_include_file',
'ps_lineto' => 'Safe\ps_lineto',
'ps_moveto' => 'Safe\ps_moveto',
'ps_new' => 'Safe\ps_new',
'ps_open_file' => 'Safe\ps_open_file',
'ps_place_image' => 'Safe\ps_place_image',
'ps_rect' => 'Safe\ps_rect',
'ps_restore' => 'Safe\ps_restore',
'ps_rotate' => 'Safe\ps_rotate',
'ps_save' => 'Safe\ps_save',
'ps_scale' => 'Safe\ps_scale',
'ps_setcolor' => 'Safe\ps_setcolor',
'ps_setdash' => 'Safe\ps_setdash',
'ps_setflat' => 'Safe\ps_setflat',
'ps_setfont' => 'Safe\ps_setfont',
'ps_setgray' => 'Safe\ps_setgray',
'ps_setlinecap' => 'Safe\ps_setlinecap',
'ps_setlinejoin' => 'Safe\ps_setlinejoin',
'ps_setlinewidth' => 'Safe\ps_setlinewidth',
'ps_setmiterlimit' => 'Safe\ps_setmiterlimit',
'ps_setoverprintmode' => 'Safe\ps_setoverprintmode',
'ps_setpolydash' => 'Safe\ps_setpolydash',
'ps_set_border_color' => 'Safe\ps_set_border_color',
'ps_set_border_dash' => 'Safe\ps_set_border_dash',
'ps_set_border_style' => 'Safe\ps_set_border_style',
'ps_set_info' => 'Safe\ps_set_info',
'ps_set_parameter' => 'Safe\ps_set_parameter',
'ps_set_text_pos' => 'Safe\ps_set_text_pos',
'ps_set_value' => 'Safe\ps_set_value',
'ps_shading' => 'Safe\ps_shading',
'ps_shading_pattern' => 'Safe\ps_shading_pattern',
'ps_shfill' => 'Safe\ps_shfill',
'ps_show' => 'Safe\ps_show',
'ps_show2' => 'Safe\ps_show2',
'ps_show_xy' => 'Safe\ps_show_xy',
'ps_show_xy2' => 'Safe\ps_show_xy2',
'ps_stroke' => 'Safe\ps_stroke',
'ps_symbol' => 'Safe\ps_symbol',
'ps_translate' => 'Safe\ps_translate',
'putenv' => 'Safe\putenv',
'readfile' => 'Safe\readfile',
'readgzfile' => 'Safe\readgzfile',
'readline_add_history' => 'Safe\readline_add_history',
'readline_callback_handler_install' => 'Safe\readline_callback_handler_install',
'readline_clear_history' => 'Safe\readline_clear_history',
'readline_completion_function' => 'Safe\readline_completion_function',
'readline_read_history' => 'Safe\readline_read_history',
'readline_write_history' => 'Safe\readline_write_history',
'readlink' => 'Safe\readlink',
'realpath' => 'Safe\realpath',
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
'rmdir' => 'Safe\rmdir',
'rnp_decrypt' => 'Safe\rnp_decrypt',
'rnp_dump_packets' => 'Safe\rnp_dump_packets',
'rnp_dump_packets_to_json' => 'Safe\rnp_dump_packets_to_json',
'rnp_ffi_create' => 'Safe\rnp_ffi_create',
'rnp_ffi_set_pass_provider' => 'Safe\rnp_ffi_set_pass_provider',
'rnp_import_keys' => 'Safe\rnp_import_keys',
'rnp_import_signatures' => 'Safe\rnp_import_signatures',
'rnp_key_export' => 'Safe\rnp_key_export',
'rnp_key_export_autocrypt' => 'Safe\rnp_key_export_autocrypt',
'rnp_key_export_revocation' => 'Safe\rnp_key_export_revocation',
'rnp_key_get_info' => 'Safe\rnp_key_get_info',
'rnp_key_remove' => 'Safe\rnp_key_remove',
'rnp_key_revoke' => 'Safe\rnp_key_revoke',
'rnp_list_keys' => 'Safe\rnp_list_keys',
'rnp_load_keys' => 'Safe\rnp_load_keys',
'rnp_load_keys_from_path' => 'Safe\rnp_load_keys_from_path',
'rnp_locate_key' => 'Safe\rnp_locate_key',
'rnp_op_encrypt' => 'Safe\rnp_op_encrypt',
'rnp_op_generate_key' => 'Safe\rnp_op_generate_key',
'rnp_op_sign' => 'Safe\rnp_op_sign',
'rnp_op_sign_cleartext' => 'Safe\rnp_op_sign_cleartext',
'rnp_op_sign_detached' => 'Safe\rnp_op_sign_detached',
'rnp_op_verify' => 'Safe\rnp_op_verify',
'rnp_op_verify_detached' => 'Safe\rnp_op_verify_detached',
'rnp_save_keys' => 'Safe\rnp_save_keys',
'rnp_save_keys_to_path' => 'Safe\rnp_save_keys_to_path',
'rnp_supported_features' => 'Safe\rnp_supported_features',
'rpmaddtag' => 'Safe\rpmaddtag',
'rrd_create' => 'Safe\rrd_create',
'rrd_first' => 'Safe\rrd_first',
'rrd_graph' => 'Safe\rrd_graph',
'rrd_info' => 'Safe\rrd_info',
'rrd_lastupdate' => 'Safe\rrd_lastupdate',
'rrd_restore' => 'Safe\rrd_restore',
'rrd_tune' => 'Safe\rrd_tune',
'rrd_update' => 'Safe\rrd_update',
'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
'sem_get' => 'Safe\sem_get',
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
'session_encode' => 'Safe\session_encode',
'session_id' => 'Safe\session_id',
'session_module_name' => 'Safe\session_module_name',
'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shmop_read' => 'Safe\shmop_read',
'shm_attach' => 'Safe\shm_attach',
'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
'shuffle' => 'Safe\shuffle',
'simplexml_import_dom' => 'Safe\simplexml_import_dom',
'simplexml_load_file' => 'Safe\simplexml_load_file',
'simplexml_load_string' => 'Safe\simplexml_load_string',
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
'socket_create_listen' => 'Safe\socket_create_listen',
'socket_create_pair' => 'Safe\socket_create_pair',
'socket_export_stream' => 'Safe\socket_export_stream',
'socket_getpeername' => 'Safe\socket_getpeername',
'socket_getsockname' => 'Safe\socket_getsockname',
'socket_get_option' => 'Safe\socket_get_option',
'socket_import_stream' => 'Safe\socket_import_stream',
'socket_listen' => 'Safe\socket_listen',
'socket_read' => 'Safe\socket_read',
'socket_send' => 'Safe\socket_send',
'socket_sendmsg' => 'Safe\socket_sendmsg',
'socket_sendto' => 'Safe\socket_sendto',
'socket_set_block' => 'Safe\socket_set_block',
'socket_set_nonblock' => 'Safe\socket_set_nonblock',
'socket_set_option' => 'Safe\socket_set_option',
'socket_shutdown' => 'Safe\socket_shutdown',
'socket_write' => 'Safe\socket_write',
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update' => 'Safe\sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic' => 'Safe\sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version' => 'Safe\solr_get_version',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
'sqlsrv_close' => 'Safe\sqlsrv_close',
'sqlsrv_commit' => 'Safe\sqlsrv_commit',
'sqlsrv_configure' => 'Safe\sqlsrv_configure',
'sqlsrv_execute' => 'Safe\sqlsrv_execute',
'sqlsrv_fetch' => 'Safe\sqlsrv_fetch',
'sqlsrv_fetch_array' => 'Safe\sqlsrv_fetch_array',
'sqlsrv_fetch_object' => 'Safe\sqlsrv_fetch_object',
'sqlsrv_free_stmt' => 'Safe\sqlsrv_free_stmt',
'sqlsrv_get_field' => 'Safe\sqlsrv_get_field',
'sqlsrv_next_result' => 'Safe\sqlsrv_next_result',
'sqlsrv_num_fields' => 'Safe\sqlsrv_num_fields',
'sqlsrv_num_rows' => 'Safe\sqlsrv_num_rows',
'sqlsrv_prepare' => 'Safe\sqlsrv_prepare',
'sqlsrv_query' => 'Safe\sqlsrv_query',
'sqlsrv_rollback' => 'Safe\sqlsrv_rollback',
'ssdeep_fuzzy_compare' => 'Safe\ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash' => 'Safe\ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename' => 'Safe\ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent' => 'Safe\ssh2_auth_agent',
'ssh2_auth_hostbased_file' => 'Safe\ssh2_auth_hostbased_file',
'ssh2_auth_password' => 'Safe\ssh2_auth_password',
'ssh2_auth_pubkey_file' => 'Safe\ssh2_auth_pubkey_file',
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
'ssh2_sftp_rename' => 'Safe\ssh2_sftp_rename',
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
'stream_filter_prepend' => 'Safe\stream_filter_prepend',
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
'stream_socket_get_name' => 'Safe\stream_socket_get_name',
'stream_socket_pair' => 'Safe\stream_socket_pair',
'stream_socket_recvfrom' => 'Safe\stream_socket_recvfrom',
'stream_socket_sendto' => 'Safe\stream_socket_sendto',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
'swoole_event_del' => 'Safe\swoole_event_del',
'swoole_event_write' => 'Safe\swoole_event_write',
'symlink' => 'Safe\symlink',
'syslog' => 'Safe\syslog',
'system' => 'Safe\system',
'sys_getloadavg' => 'Safe\sys_getloadavg',
'tempnam' => 'Safe\tempnam',
'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr',
'time_nanosleep' => 'Safe\time_nanosleep',
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
'xdiff_file_diff_binary' => 'Safe\xdiff_file_diff_binary',
'xdiff_file_patch_binary' => 'Safe\xdiff_file_patch_binary',
'xdiff_file_rabdiff' => 'Safe\xdiff_file_rabdiff',
'xdiff_string_bpatch' => 'Safe\xdiff_string_bpatch',
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
'xml_parser_free' => 'Safe\xml_parser_free',
'xml_set_character_data_handler' => 'Safe\xml_set_character_data_handler',
'xml_set_default_handler' => 'Safe\xml_set_default_handler',
'xml_set_element_handler' => 'Safe\xml_set_element_handler',
'xml_set_end_namespace_decl_handler' => 'Safe\xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler' => 'Safe\xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler' => 'Safe\xml_set_notation_decl_handler',
'xml_set_object' => 'Safe\xml_set_object',
'xml_set_processing_instruction_handler' => 'Safe\xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler' => 'Safe\xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler' => 'Safe\xml_set_unparsed_entity_decl_handler',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
'yaz_ccl_parse' => 'Safe\yaz_ccl_parse',
'yaz_close' => 'Safe\yaz_close',
'yaz_connect' => 'Safe\yaz_connect',
'yaz_database' => 'Safe\yaz_database',
'yaz_element' => 'Safe\yaz_element',
'yaz_present' => 'Safe\yaz_present',
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
'zip_entry_filesize' => 'Safe\zip_entry_filesize',
'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
]
);
};
<?php

namespace Safe;

use Safe\Exceptions\JsonException;












































function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
$safeResult = \json_encode($value, $flags, $depth);
if ($safeResult === false) {
throw JsonException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApacheException;








function apache_get_version(): string
{
error_clear_last();
$safeResult = \apache_get_version();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}












function apache_getenv(string $variable, bool $walk_to_top = false): string
{
error_clear_last();
$safeResult = \apache_getenv($variable, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}







































function apache_lookup_uri(string $filename): object
{
error_clear_last();
$safeResult = \apache_lookup_uri($filename);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_request_headers(): array
{
error_clear_last();
$safeResult = \apache_request_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_response_headers(): array
{
error_clear_last();
$safeResult = \apache_response_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}













function apache_setenv(string $variable, string $value, bool $walk_to_top = false): void
{
error_clear_last();
$safeResult = \apache_setenv($variable, $value, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}













function getallheaders(): array
{
error_clear_last();
$safeResult = \getallheaders();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}



















function virtual(string $uri): void
{
error_clear_last();
$safeResult = \virtual($uri);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\HashException;



























function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = "")
{
error_clear_last();
$safeResult = \hash_hkdf($algo, $key, $length, $info, $salt);
return $safeResult;
}











function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
if ($stream_context !== null) {
$safeResult = \hash_update_file($context, $filename, $stream_context);
} else {
$safeResult = \hash_update_file($context, $filename);
}
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SwooleException;











function swoole_async_dns_lookup(string $hostname, callable $callback): void
{
error_clear_last();
$safeResult = \swoole_async_dns_lookup($hostname, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_readfile(string $filename, string $callback): void
{
error_clear_last();
$safeResult = \swoole_async_readfile($filename, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_write(string $filename, string $content, ?int $offset = null, ?callable $callback = null): void
{
error_clear_last();
if ($callback !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset, $callback);
} elseif ($offset !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset);
} else {
$safeResult = \swoole_async_write($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_writefile(string $filename, string $content, ?callable $callback = null, int $flags = 0): void
{
error_clear_last();
if ($flags !== 0) {
$safeResult = \swoole_async_writefile($filename, $content, $callback, $flags);
} elseif ($callback !== null) {
$safeResult = \swoole_async_writefile($filename, $content, $callback);
} else {
$safeResult = \swoole_async_writefile($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_defer(callable $callback): void
{
error_clear_last();
$safeResult = \swoole_event_defer($callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_del(int $fd): void
{
error_clear_last();
$safeResult = \swoole_event_del($fd);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}










function swoole_event_write(int $fd, string $data): void
{
error_clear_last();
$safeResult = \swoole_event_write($fd, $data);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SodiumException;















function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}














function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}


















function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
{
error_clear_last();
$safeResult = \sodium_crypto_auth_verify($mac, $message, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}










function sodium_crypto_generichash_update(string &$state, string $message): void
{
error_clear_last();
$safeResult = \sodium_crypto_generichash_update($state, $message);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_open(string $signed_message, string $public_key): string
{
error_clear_last();
$safeResult = \sodium_crypto_sign_open($signed_message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
{
error_clear_last();
$safeResult = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}















function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PspellException;









function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_personal($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_session($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}









function pspell_clear_session(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_clear_session($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



































function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int
{
error_clear_last();
$safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}












function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_data_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}












function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_dict_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
$safeResult = \pspell_config_ignore($config, $min_length);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}






























function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
$safeResult = \pspell_config_mode($config, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}

















function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_personal($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_repl($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


















function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
$safeResult = \pspell_config_runtogether($config, $allow);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
$safeResult = \pspell_config_save_repl($config, $save);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_new_config(int $config): int
{
error_clear_last();
$safeResult = \pspell_new_config($config);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}





























































function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}
































































function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}









function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_save_wordlist($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
$safeResult = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MysqliException;







function mysqli_get_client_stats()
{
error_clear_last();
$safeResult = \mysqli_get_client_stats();
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\OutcontrolException;














function ob_clean(): void
{
error_clear_last();
$safeResult = \ob_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}

















function ob_end_clean(): void
{
error_clear_last();
$safeResult = \ob_end_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}


















function ob_end_flush(): void
{
error_clear_last();
$safeResult = \ob_end_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}















function ob_flush(): void
{
error_clear_last();
$safeResult = \ob_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function ob_get_clean(): string
{
error_clear_last();
$safeResult = \ob_get_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}

























































































function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
{
error_clear_last();
if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
$safeResult = \ob_start($callback, $chunk_size, $flags);
} elseif ($chunk_size !== 0) {
$safeResult = \ob_start($callback, $chunk_size);
} elseif ($callback !== null) {
$safeResult = \ob_start($callback);
} else {
$safeResult = \ob_start();
}
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function output_add_rewrite_var(string $name, string $value): void
{
error_clear_last();
$safeResult = \output_add_rewrite_var($name, $value);
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}










function output_reset_rewrite_vars(): void
{
error_clear_last();
$safeResult = \output_reset_rewrite_vars();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\OpcacheException;










function opcache_compile_file(string $filename): void
{
error_clear_last();
$safeResult = \opcache_compile_file($filename);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
}











function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
$safeResult = \opcache_get_status($include_scripts);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MysqlException;























function mysql_close($link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_close($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}







































function mysql_connect(?string $server = null, ?string $username = null, ?string $password = null, bool $new_link = false, int $client_flags = 0)
{
error_clear_last();
if ($client_flags !== 0) {
$safeResult = \mysql_connect($server, $username, $password, $new_link, $client_flags);
} elseif ($new_link !== false) {
$safeResult = \mysql_connect($server, $username, $password, $new_link);
} elseif ($password !== null) {
$safeResult = \mysql_connect($server, $username, $password);
} elseif ($username !== null) {
$safeResult = \mysql_connect($server, $username);
} elseif ($server !== null) {
$safeResult = \mysql_connect($server);
} else {
$safeResult = \mysql_connect();
}
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_create_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_create_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}























function mysql_data_seek($result, int $row_number): void
{
error_clear_last();
$safeResult = \mysql_data_seek($result, $row_number);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_db_name($result, int $row, $field = null): string
{
error_clear_last();
$safeResult = \mysql_db_name($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}






















function mysql_db_query(string $database, string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_db_query($database, $query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



















function mysql_drop_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_drop_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}





















function mysql_fetch_lengths($result): array
{
error_clear_last();
$safeResult = \mysql_fetch_lengths($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



























function mysql_field_flags($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_flags($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_len($result, int $field_offset): int
{
error_clear_last();
$safeResult = \mysql_field_len($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_name($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_name($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_field_seek($result, int $field_offset): void
{
error_clear_last();
$safeResult = \mysql_field_seek($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_free_result($result): void
{
error_clear_last();
$safeResult = \mysql_free_result($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_get_host_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_host_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_proto_info($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_get_proto_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_server_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_server_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_list_dbs($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_dbs($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


























function mysql_list_fields(string $database_name, string $table_name, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_fields($database_name, $table_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_list_processes($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_processes($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
























function mysql_list_tables(string $database, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_tables($database, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}













function mysql_num_fields($result): int
{
error_clear_last();
$safeResult = \mysql_num_fields($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_num_rows($result): int
{
error_clear_last();
$safeResult = \mysql_num_rows($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}









































function mysql_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_real_escape_string(string $unescaped_string, $link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_real_escape_string($unescaped_string, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_result($result, int $row, $field = 0): string
{
error_clear_last();
$safeResult = \mysql_result($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_select_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_select_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_set_charset(string $charset, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_set_charset($charset, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}




















function mysql_tablename($result, int $i): string
{
error_clear_last();
$safeResult = \mysql_tablename($result, $i);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_thread_id($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_thread_id($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


































function mysql_unbuffered_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_unbuffered_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RrdException;










function rrd_create(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_create($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}











function rrd_first(string $file, int $raaindex = 0): int
{
error_clear_last();
$safeResult = \rrd_first($file, $raaindex);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}















function rrd_graph(string $filename, array $options): array
{
error_clear_last();
$safeResult = \rrd_graph($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}










function rrd_info(string $filename): array
{
error_clear_last();
$safeResult = \rrd_info($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_lastupdate(string $filename): array
{
error_clear_last();
$safeResult = \rrd_lastupdate($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_restore(string $xml_file, string $rrd_file, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rrd_restore($xml_file, $rrd_file, $options);
} else {
$safeResult = \rrd_restore($xml_file, $rrd_file);
}
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_tune(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_tune($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_update(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_update($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_xport(array $options): array
{
error_clear_last();
$safeResult = \rrd_xport($options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ErrorfuncException;































































function error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): void
{
error_clear_last();
if ($additional_headers !== null) {
$safeResult = \error_log($message, $message_type, $destination, $additional_headers);
} elseif ($destination !== null) {
$safeResult = \error_log($message, $message_type, $destination);
} else {
$safeResult = \error_log($message, $message_type);
}
if ($safeResult === false) {
throw ErrorfuncException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbaseException;









function fbird_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \fbird_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_add_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_add_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}





























function ibase_backup($service_handle, string $source_db, string $dest_file, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_backup($service_handle, $source_db, $dest_file, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \ibase_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_blob_create($link_identifier = null)
{
error_clear_last();
if ($link_identifier !== null) {
$safeResult = \ibase_blob_create($link_identifier);
} else {
$safeResult = \ibase_blob_create();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}












function ibase_blob_get($blob_handle, int $len): string
{
error_clear_last();
$safeResult = \ibase_blob_get($blob_handle, $len);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}














function ibase_close($connection_id = null): void
{
error_clear_last();
if ($connection_id !== null) {
$safeResult = \ibase_close($connection_id);
} else {
$safeResult = \ibase_close();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}















function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}



































function ibase_connect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_connect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_connect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_connect($database);
} else {
$safeResult = \ibase_connect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_delete_user($service_handle, string $user_name): void
{
error_clear_last();
$safeResult = \ibase_delete_user($service_handle, $user_name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_drop_db($connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \ibase_drop_db($connection);
} else {
$safeResult = \ibase_drop_db();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_free_event_handler($event): void
{
error_clear_last();
$safeResult = \ibase_free_event_handler($event);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}









function ibase_free_query($query): void
{
error_clear_last();
$safeResult = \ibase_free_query($query);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










function ibase_free_result($result_identifier): void
{
error_clear_last();
$safeResult = \ibase_free_result($result_identifier);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_maintain_db($service_handle, string $db, int $action, int $argument = 0): void
{
error_clear_last();
$safeResult = \ibase_maintain_db($service_handle, $db, $action, $argument);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_modify_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_name_result($result, string $name): void
{
error_clear_last();
$safeResult = \ibase_name_result($result, $name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










































function ibase_pconnect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_pconnect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_pconnect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_pconnect($database);
} else {
$safeResult = \ibase_pconnect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}
































function ibase_restore($service_handle, string $source_file, string $dest_db, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_restore($service_handle, $source_file, $dest_db, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}















function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_service_attach(string $host, string $dba_username, string $dba_password)
{
error_clear_last();
$safeResult = \ibase_service_attach($host, $dba_username, $dba_password);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}









function ibase_service_detach($service_handle): void
{
error_clear_last();
$safeResult = \ibase_service_detach($service_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UopzException;









function uopz_extend(string $class, string $parent): void
{
error_clear_last();
$safeResult = \uopz_extend($class, $parent);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}










function uopz_implement(string $class, string $interface): void
{
error_clear_last();
$safeResult = \uopz_implement($class, $interface);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MbstringException;
















function mb_chr(int $codepoint, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_chr($codepoint, $encoding);
} else {
$safeResult = \mb_chr($codepoint);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


























function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
{
error_clear_last();
if ($from_encoding !== null) {
$safeResult = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
$safeResult = \mb_convert_encoding($string, $to_encoding);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}































function mb_detect_order($encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_detect_order($encoding);
} else {
$safeResult = \mb_detect_order();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}










function mb_encoding_aliases(string $encoding): array
{
error_clear_last();
$safeResult = \mb_encoding_aliases($encoding);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




































function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
} else {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}

















function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_getregs(): array
{
error_clear_last();
$safeResult = \mb_ereg_search_getregs();
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
















function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern);
} else {
$safeResult = \mb_ereg_search_init($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}











function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_regs($pattern);
} else {
$safeResult = \mb_ereg_search_regs();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
$safeResult = \mb_ereg_search_setpos($offset);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}















function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}





























function mb_get_info(string $type = "all")
{
error_clear_last();
$safeResult = \mb_get_info($type);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




















function mb_http_output(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_http_output($encoding);
} else {
$safeResult = \mb_http_output();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


















function mb_internal_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_internal_encoding($encoding);
} else {
$safeResult = \mb_internal_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_ord(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_ord($string, $encoding);
} else {
$safeResult = \mb_ord($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
$safeResult = \mb_parse_str($string, $result);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_regex_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_regex_encoding($encoding);
} else {
$safeResult = \mb_regex_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}



























































function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], ?string $additional_params = null): void
{
error_clear_last();
if ($additional_params !== null) {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
} else {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_split(string $pattern, string $string, int $limit = -1): array
{
error_clear_last();
$safeResult = \mb_split($pattern, $string, $limit);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GnupgException;











function gnupg_adddecryptkey($identifier, string $fingerprint, string $passphrase): void
{
error_clear_last();
$safeResult = \gnupg_adddecryptkey($identifier, $fingerprint, $passphrase);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}











function gnupg_addencryptkey($identifier, string $fingerprint): void
{
error_clear_last();
$safeResult = \gnupg_addencryptkey($identifier, $fingerprint);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_addsignkey($identifier, string $fingerprint, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint, $passphrase);
} else {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint);
}
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_cleardecryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_cleardecryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearencryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearencryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearsignkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearsignkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_deletekey($identifier, string $key, bool $allow_secret): void
{
error_clear_last();
$safeResult = \gnupg_deletekey($identifier, $key, $allow_secret);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}













function gnupg_setarmor($identifier, int $armor): void
{
error_clear_last();
$safeResult = \gnupg_setarmor($identifier, $armor);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}


















function gnupg_setsignmode($identifier, int $signmode): void
{
error_clear_last();
$safeResult = \gnupg_setsignmode($identifier, $signmode);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlException;








function xml_parser_free(\XMLParser $parser): void
{
error_clear_last();
$safeResult = \xml_parser_free($parser);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
















































function xml_set_character_data_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_character_data_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


















































function xml_set_default_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_default_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}






























































function xml_set_element_handler(\XMLParser $parser, callable $start_handler, callable $end_handler): void
{
error_clear_last();
$safeResult = \xml_set_element_handler($parser, $start_handler, $end_handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

















































function xml_set_end_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_end_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}




















































































function xml_set_external_entity_ref_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_external_entity_ref_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

























































































function xml_set_notation_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_notation_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}













function xml_set_object(\XMLParser $parser, object $object): void
{
error_clear_last();
$safeResult = \xml_set_object($parser, $object);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


































































function xml_set_processing_instruction_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_processing_instruction_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


























































function xml_set_start_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_start_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
































































































function xml_set_unparsed_entity_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SemException;


















function msg_get_queue(int $key, int $permissions = 0666): \SysvMessageQueue
{
error_clear_last();
$safeResult = \msg_get_queue($key, $permissions);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}









function msg_queue_exists(int $key): void
{
error_clear_last();
$safeResult = \msg_queue_exists($key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}









































































function msg_receive(\SysvMessageQueue $queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function msg_remove_queue(\SysvMessageQueue $queue): void
{
error_clear_last();
$safeResult = \msg_remove_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



































function msg_send(\SysvMessageQueue $queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



















function msg_set_queue(\SysvMessageQueue $queue, array $data): void
{
error_clear_last();
$safeResult = \msg_set_queue($queue, $data);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















































































function msg_stat_queue(\SysvMessageQueue $queue): array
{
error_clear_last();
$safeResult = \msg_stat_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}





















function sem_acquire(\SysvSemaphore $semaphore, bool $non_blocking = false): void
{
error_clear_last();
$safeResult = \sem_acquire($semaphore, $non_blocking);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}

























function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): \SysvSemaphore
{
error_clear_last();
$safeResult = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}















function sem_release(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_release($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function sem_remove(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_remove($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
























function shm_attach(int $key, ?int $size = null, int $permissions = 0666): \SysvSharedMemory
{
error_clear_last();
if ($permissions !== 0666) {
$safeResult = \shm_attach($key, $size, $permissions);
} elseif ($size !== null) {
$safeResult = \shm_attach($key, $size);
} else {
$safeResult = \shm_attach($key);
}
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}












function shm_detach(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_detach($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















function shm_put_var(\SysvSharedMemory $shm, int $key, $value): void
{
error_clear_last();
$safeResult = \shm_put_var($shm, $key, $value);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}











function shm_remove_var(\SysvSharedMemory $shm, int $key): void
{
error_clear_last();
$safeResult = \shm_remove_var($shm, $key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}










function shm_remove(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_remove($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SplException;











function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_implements($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}












function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_parents($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}













function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_uses($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}






























function spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
$safeResult = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
$safeResult = \spl_autoload_register($callback, $throw);
} elseif ($callback !== null) {
$safeResult = \spl_autoload_register($callback);
} else {
$safeResult = \spl_autoload_register();
}
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}














function spl_autoload_unregister($callback): void
{
error_clear_last();
$safeResult = \spl_autoload_unregister($callback);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XdiffException;













function xdiff_file_bdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}














function xdiff_file_bpatch(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bpatch($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_diff_binary($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}




















function xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): void
{
error_clear_last();
$safeResult = \xdiff_file_diff($old_file, $new_file, $dest, $context, $minimal);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_patch_binary(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_patch_binary($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}



















function xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_rabdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}













function xdiff_string_bpatch(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_bpatch($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}















function xdiff_string_patch_binary(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_patch_binary($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
























function xdiff_string_patch(string $str, string $patch, ?int $flags = null, ?string &$error = null): string
{
error_clear_last();
if ($error !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags, $error);
} elseif ($flags !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags);
} else {
$safeResult = \xdiff_string_patch($str, $patch);
}
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\YamlException;




















function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
























function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_url($url, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}





















function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse($input, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SolrException;








function solr_get_version(): string
{
error_clear_last();
$safeResult = \solr_get_version();
if ($safeResult === false) {
throw SolrException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;











































function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse_from_format($format, $datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}































































function date_parse(string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse($datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}



































































































function date_sun_info(int $timestamp, float $latitude, float $longitude): array
{
error_clear_last();
$safeResult = \date_sun_info($timestamp, $latitude, $longitude);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunrise($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunset($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}



















function date(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \date($format, $timestamp);
} else {
$safeResult = \date($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}


































function gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null): int
{
error_clear_last();
if ($year !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \gmmktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \gmmktime($hour, $minute);
} else {
$safeResult = \gmmktime($hour);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function gmstrftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \gmstrftime($format, $timestamp);
} else {
$safeResult = \gmstrftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}






















































































































function idate(string $format, ?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \idate($format, $timestamp);
} else {
$safeResult = \idate($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}







































function mktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \mktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \mktime($hour, $minute);
} else {
$safeResult = \mktime($hour);
}
return $safeResult;
}

















































































































































































































































































































function strftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \strftime($format, $timestamp);
} else {
$safeResult = \strftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}










































































function strptime(string $timestamp, string $format): array
{
error_clear_last();
$safeResult = \strptime($timestamp, $format);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function strtotime(string $datetime, ?int $baseTimestamp = null): int
{
error_clear_last();
if ($baseTimestamp !== null) {
$safeResult = \strtotime($datetime, $baseTimestamp);
} else {
$safeResult = \strtotime($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string
{
error_clear_last();
$safeResult = \timezone_name_from_abbr($abbr, $utcOffset, $isDST);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImapException;










function imap_8bit(string $string): string
{
error_clear_last();
$safeResult = \imap_8bit($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



















function imap_append(\IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): void
{
error_clear_last();
if ($internal_date !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options, $internal_date);
} elseif ($options !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options);
} else {
$safeResult = \imap_append($imap, $folder, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_base64(string $string): string
{
error_clear_last();
$safeResult = \imap_base64($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_binary(string $string): string
{
error_clear_last();
$safeResult = \imap_binary($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}







































function imap_body(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_body($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_bodystruct(\IMAP\Connection $imap, int $message_num, string $section): \stdClass
{
error_clear_last();
$safeResult = \imap_bodystruct($imap, $message_num, $section);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}








































function imap_check(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_check($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_clearflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_clearflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_close(\IMAP\Connection $imap, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_close($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_createmailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_createmailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_deletemailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_deletemailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












































































































function imap_fetch_overview(\IMAP\Connection $imap, string $sequence, int $flags = 0): array
{
error_clear_last();
$safeResult = \imap_fetch_overview($imap, $sequence, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



































function imap_fetchbody(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchbody($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




































function imap_fetchheader(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchheader($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_fetchmime(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchmime($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










































































































































function imap_fetchstructure(\IMAP\Connection $imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_fetchstructure($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_gc(\IMAP\Connection $imap, int $flags): void
{
error_clear_last();
$safeResult = \imap_gc($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_getacl(\IMAP\Connection $imap, string $mailbox): array
{
error_clear_last();
$safeResult = \imap_getacl($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getmailboxes(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getmailboxes($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getsubscribed(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getsubscribed($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































































function imap_headerinfo(\IMAP\Connection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_headers(\IMAP\Connection $imap): array
{
error_clear_last();
$safeResult = \imap_headers($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

































function imap_listscan(\IMAP\Connection $imap, string $reference, string $pattern, string $content): array
{
error_clear_last();
$safeResult = \imap_listscan($imap, $reference, $pattern, $content);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_lsub(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_lsub($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































































function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
$safeResult = \imap_mail_compose($envelope, $bodies);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}





























function imap_mail_copy(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}

























function imap_mail_move(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): void
{
error_clear_last();
if ($return_path !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
} elseif ($bcc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
} elseif ($cc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc);
} elseif ($additional_headers !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers);
} else {
$safeResult = \imap_mail($to, $subject, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















































function imap_mailboxmsginfo(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_mailboxmsginfo($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


















function imap_mime_header_decode(string $string): array
{
error_clear_last();
$safeResult = \imap_mime_header_decode($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
$safeResult = \imap_mutf7_to_utf8($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_num_msg(\IMAP\Connection $imap): int
{
error_clear_last();
$safeResult = \imap_num_msg($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














































































































































































































function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): \IMAP\Connection
{
error_clear_last();
$safeResult = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_qprint(string $string): string
{
error_clear_last();
$safeResult = \imap_qprint($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_renamemailbox(\IMAP\Connection $imap, string $from, string $to): void
{
error_clear_last();
$safeResult = \imap_renamemailbox($imap, $from, $to);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
$safeResult = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_savebody(\IMAP\Connection $imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_set_quota(\IMAP\Connection $imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
$safeResult = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}














function imap_setacl(\IMAP\Connection $imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
$safeResult = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



























function imap_setflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_setflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



































































function imap_sort(\IMAP\Connection $imap, int $criteria, int $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array
{
error_clear_last();
if ($charset !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
} elseif ($search_criteria !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
} else {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

























































function imap_status(\IMAP\Connection $imap, string $mailbox, int $flags): \stdClass
{
error_clear_last();
$safeResult = \imap_status($imap, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}











function imap_subscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_subscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}


























function imap_thread(\IMAP\Connection $imap, int $flags = SE_FREE): array
{
error_clear_last();
$safeResult = \imap_thread($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




















function imap_timeout(int $timeout_type, int $timeout = -1)
{
error_clear_last();
$safeResult = \imap_timeout($timeout_type, $timeout);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_undelete(\IMAP\Connection $imap, string $message_nums, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_undelete($imap, $message_nums, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_unsubscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_unsubscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
$safeResult = \imap_utf8_to_mutf7($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\NetworkException;








function closelog(): void
{
error_clear_last();
$safeResult = \closelog();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}



































































































































































































































function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
$safeResult = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}



















































function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function gethostname(): string
{
error_clear_last();
$safeResult = \gethostname();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobyname(string $protocol): int
{
error_clear_last();
$safeResult = \getprotobyname($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobynumber(int $protocol): string
{
error_clear_last();
$safeResult = \getprotobynumber($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function getservbyport(int $port, string $protocol): string
{
error_clear_last();
$safeResult = \getservbyport($port, $protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function header_register_callback(callable $callback): void
{
error_clear_last();
$safeResult = \header_register_callback($callback);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}










function inet_ntop(string $ip): string
{
error_clear_last();
$safeResult = \inet_ntop($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}















function inet_pton(string $ip): string
{
error_clear_last();
$safeResult = \inet_pton($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function long2ip(int $ip): string
{
error_clear_last();
$safeResult = \long2ip($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}
































































































function net_get_interfaces(): array
{
error_clear_last();
$safeResult = \net_get_interfaces();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}






































































































































function openlog(string $prefix, int $flags, int $facility): void
{
error_clear_last();
$safeResult = \openlog($prefix, $flags, $facility);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}




















function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}
































































function syslog(int $priority, string $message): void
{
error_clear_last();
$safeResult = \syslog($priority, $message);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UrlException;














function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
$safeResult = \base64_decode($string, $strict);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}

















function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \get_headers($url, $associative, $context);
} else {
$safeResult = \get_headers($url, $associative);
}
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}






































function get_meta_tags(string $filename, bool $use_include_path = false): array
{
error_clear_last();
$safeResult = \get_meta_tags($filename, $use_include_path);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}


























































































function parse_url(string $url, int $component = -1)
{
error_clear_last();
$safeResult = \parse_url($url, $component);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PosixException;

















function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_access($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























































function posix_getgrgid(int $group_id): array
{
error_clear_last();
$safeResult = \posix_getgrgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}























































function posix_getgrnam(string $name): array
{
error_clear_last();
$safeResult = \posix_getgrnam($name);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_getgroups(): array
{
error_clear_last();
$safeResult = \posix_getgroups();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









function posix_getlogin(): string
{
error_clear_last();
$safeResult = \posix_getlogin();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}



















































































function posix_getpwuid(int $user_id): array
{
error_clear_last();
$safeResult = \posix_getpwuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}





































































































function posix_getrlimit(): array
{
error_clear_last();
$safeResult = \posix_getrlimit();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}














function posix_getsid(int $process_id): int
{
error_clear_last();
$safeResult = \posix_getsid($process_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
$safeResult = \posix_initgroups($username, $group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
$safeResult = \posix_kill($process_id, $signal);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}
















function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \posix_mkfifo($filename, $permissions);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}

















function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
$safeResult = \posix_mknod($filename, $flags, $major, $minor);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setegid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setegid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_seteuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_seteuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}














function posix_setgid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
$safeResult = \posix_setpgid($process_id, $process_group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
$safeResult = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}









function posix_setsid(): int
{
error_clear_last();
$safeResult = \posix_setsid();
if ($safeResult === -1) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}











function posix_setuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_setuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}







































function posix_times(): array
{
error_clear_last();
$safeResult = \posix_times();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









































function posix_uname(): array
{
error_clear_last();
$safeResult = \posix_uname();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UodbcException;





















function odbc_autocommit($odbc, bool $enable = false)
{
error_clear_last();
$safeResult = \odbc_autocommit($odbc, $enable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































































































function odbc_binmode(int $statement, int $mode): void
{
error_clear_last();
$safeResult = \odbc_binmode($statement, $mode);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}







































function odbc_columnprivileges($odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
$safeResult = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}















































function odbc_columns($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table, $column);
} elseif ($table !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_columns($odbc, $catalog);
} else {
$safeResult = \odbc_columns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_commit($odbc): void
{
error_clear_last();
$safeResult = \odbc_commit($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_connect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_connect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_cursor($statement): string
{
error_clear_last();
$safeResult = \odbc_cursor($statement);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

















function odbc_data_source($odbc, int $fetch_type): array
{
error_clear_last();
$safeResult = \odbc_data_source($odbc, $fetch_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_exec($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_exec($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















function odbc_execute($statement, array $params = []): void
{
error_clear_last();
$safeResult = \odbc_execute($statement, $params);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
















function odbc_fetch_into($statement, ?array &$array, int $row = 0): int
{
error_clear_last();
$safeResult = \odbc_fetch_into($statement, $array, $row);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_len($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_len($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_name($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_name($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_field_num($statement, string $field): int
{
error_clear_last();
$safeResult = \odbc_field_num($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_scale($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_scale($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_type($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_type($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}






































function odbc_foreignkeys($odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
$safeResult = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_gettypeinfo($odbc, int $data_type = 0)
{
error_clear_last();
$safeResult = \odbc_gettypeinfo($odbc, $data_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_longreadlen($statement, int $length): void
{
error_clear_last();
$safeResult = \odbc_longreadlen($statement, $length);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}










function odbc_num_fields($statement): int
{
error_clear_last();
$safeResult = \odbc_num_fields($statement);
if ($safeResult === -1) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}























function odbc_pconnect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_pconnect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}



















function odbc_prepare($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_prepare($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


























function odbc_primarykeys($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_primarykeys($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















































function odbc_procedurecolumns($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
} elseif ($procedure !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog);
} else {
$safeResult = \odbc_procedurecolumns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_procedures($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null)
{
error_clear_last();
if ($procedure !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedures($odbc, $catalog);
} else {
$safeResult = \odbc_procedures($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
















function odbc_result_all($statement, string $format = ""): int
{
error_clear_last();
$safeResult = \odbc_result_all($statement, $format);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_result($statement, $field)
{
error_clear_last();
$safeResult = \odbc_result($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_rollback($odbc): void
{
error_clear_last();
$safeResult = \odbc_rollback($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
































function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
$safeResult = \odbc_setoption($odbc, $which, $option, $value);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}



































function odbc_specialcolumns($odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
$safeResult = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































function odbc_statistics($odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
$safeResult = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

































function odbc_tableprivileges($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}











































































function odbc_tables($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $types = null)
{
error_clear_last();
if ($types !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table, $types);
} elseif ($table !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_tables($odbc, $catalog);
} else {
$safeResult = \odbc_tables($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LzfException;










function lzf_compress(string $data): string
{
error_clear_last();
$safeResult = \lzf_compress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}











function lzf_decompress(string $data): string
{
error_clear_last();
$safeResult = \lzf_decompress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImageException;































































function getimagesize(string $filename, ?array &$image_info = null): ?array
{
error_clear_last();
$safeResult = \getimagesize($filename, $image_info);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function image_type_to_extension(int $image_type, bool $include_dot = true): string
{
error_clear_last();
$safeResult = \image_type_to_extension($image_type, $include_dot);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imageaffine(\GdImage $image, array $affine, ?array $clip = null): \GdImage
{
error_clear_last();
if ($clip !== null) {
$safeResult = \imageaffine($image, $affine, $clip);
} else {
$safeResult = \imageaffine($image, $affine);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
$safeResult = \imageaffinematrixconcat($matrix1, $matrix2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
$safeResult = \imageaffinematrixget($type, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagealphablending(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagealphablending($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imageantialias(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imageantialias($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagearc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
$safeResult = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
{
error_clear_last();
if ($speed !== -1) {
$safeResult = \imageavif($image, $file, $quality, $speed);
} elseif ($quality !== -1) {
$safeResult = \imageavif($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imageavif($image, $file);
} else {
$safeResult = \imageavif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagebmp(\GdImage $image, $file = null, bool $compressed = true): void
{
error_clear_last();
if ($compressed !== true) {
$safeResult = \imagebmp($image, $file, $compressed);
} elseif ($file !== null) {
$safeResult = \imagebmp($image, $file);
} else {
$safeResult = \imagebmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





















function imagechar(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagechar($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecharup(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagecharup($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagecolorat(\GdImage $image, int $x, int $y): int
{
error_clear_last();
$safeResult = \imagecolorat($image, $x, $y);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagecolordeallocate(\GdImage $image, int $color): void
{
error_clear_last();
$safeResult = \imagecolordeallocate($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagecolormatch(\GdImage $image1, \GdImage $image2): void
{
error_clear_last();
$safeResult = \imagecolormatch($image1, $image2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecolorset(\GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
{
error_clear_last();
$safeResult = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}












function imagecolorsforindex(\GdImage $image, int $color): array
{
error_clear_last();
$safeResult = \imagecolorsforindex($image, $color);
return $safeResult;
}














function imageconvolution(\GdImage $image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
$safeResult = \imageconvolution($image, $matrix, $divisor, $offset);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagecopy(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




























function imagecopymerge(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
































function imagecopymergegray(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresampled(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresized(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagecreate(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreate($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromavif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromavif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrombmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrombmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd2(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromgif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromjpeg(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromjpeg($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrompng(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrompng($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecreatefromstring(string $data): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromstring($data);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromtga(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromtga($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwbmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwbmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatefromwebp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwebp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxbm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxbm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxpm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxpm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatetruecolor(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatetruecolor($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecrop(\GdImage $image, array $rectangle): \GdImage
{
error_clear_last();
$safeResult = \imagecrop($image, $rectangle);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagecropauto(\GdImage $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1): \GdImage
{
error_clear_last();
$safeResult = \imagecropauto($image, $mode, $threshold, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}

















function imagedashedline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagedashedline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagedestroy(\GdImage $image): void
{
error_clear_last();
$safeResult = \imagedestroy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagefill(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagefill($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




































function imagefilledarc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
$safeResult = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
















function imagefilledellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagefilledrectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagefilltoborder(\GdImage $image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
$safeResult = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










































































































































function imagefilter(\GdImage $image, int $filter, int ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \imagefilter($image, $filter, ...$args);
} else {
$safeResult = \imagefilter($image, $filter);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











































function imageflip(\GdImage $image, int $mode): void
{
error_clear_last();
$safeResult = \imageflip($image, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















































































function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































































function imagefttext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagegammacorrect(\GdImage $image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
$safeResult = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagegd(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegd($image, $file);
} else {
$safeResult = \imagegd($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagegd2(\GdImage $image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
if ($mode !== IMG_GD2_RAW) {
$safeResult = \imagegd2($image, $file, $chunk_size, $mode);
} elseif ($chunk_size !== 128) {
$safeResult = \imagegd2($image, $file, $chunk_size);
} elseif ($file !== null) {
$safeResult = \imagegd2($image, $file);
} else {
$safeResult = \imagegd2($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagegif(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegif($image, $file);
} else {
$safeResult = \imagegif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}









function imagegrabscreen(): \GdImage
{
error_clear_last();
$safeResult = \imagegrabscreen();
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
$safeResult = \imagegrabwindow($handle, $client_area);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagejpeg(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagejpeg($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagejpeg($image, $file);
} else {
$safeResult = \imagejpeg($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























































function imagelayereffect(\GdImage $image, int $effect): void
{
error_clear_last();
$safeResult = \imagelayereffect($image, $effect);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imageline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


























































function imageloadfont(string $filename): int
{
error_clear_last();
$safeResult = \imageloadfont($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
























function imagepng(\GdImage $image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
if ($filters !== -1) {
$safeResult = \imagepng($image, $file, $quality, $filters);
} elseif ($quality !== -1) {
$safeResult = \imagepng($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagepng($image, $file);
} else {
$safeResult = \imagepng($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagerectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



























function imageresolution(\GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null)
{
error_clear_last();
if ($resolution_y !== null) {
$safeResult = \imageresolution($image, $resolution_x, $resolution_y);
} elseif ($resolution_x !== null) {
$safeResult = \imageresolution($image, $resolution_x);
} else {
$safeResult = \imageresolution($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imagerotate(\GdImage $image, float $angle, int $background_color, bool $ignore_transparent = false): \GdImage
{
error_clear_last();
$safeResult = \imagerotate($image, $angle, $background_color, $ignore_transparent);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




























function imagesavealpha(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagesavealpha($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























function imagescale(\GdImage $image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED): \GdImage
{
error_clear_last();
$safeResult = \imagescale($image, $width, $height, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagesetbrush(\GdImage $image, \GdImage $brush): void
{
error_clear_last();
$safeResult = \imagesetbrush($image, $brush);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagesetclip(\GdImage $image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
$safeResult = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































































function imagesetinterpolation(\GdImage $image, int $method = IMG_BILINEAR_FIXED): void
{
error_clear_last();
$safeResult = \imagesetinterpolation($image, $method);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}














function imagesetpixel(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagesetpixel($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagesetstyle(\GdImage $image, array $style): void
{
error_clear_last();
$safeResult = \imagesetstyle($image, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagesetthickness(\GdImage $image, int $thickness): void
{
error_clear_last();
$safeResult = \imagesetthickness($image, $thickness);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagesettile(\GdImage $image, \GdImage $tile): void
{
error_clear_last();
$safeResult = \imagesettile($image, $tile);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagestring(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestring($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagestringup(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestringup($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagesx(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesx($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagesy(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagetruecolortopalette(\GdImage $image, bool $dither, int $num_colors): void
{
error_clear_last();
$safeResult = \imagetruecolortopalette($image, $dither, $num_colors);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































function imagettftext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagewbmp(\GdImage $image, $file = null, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagewbmp($image, $file, $foreground_color);
} elseif ($file !== null) {
$safeResult = \imagewbmp($image, $file);
} else {
$safeResult = \imagewbmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagewebp(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagewebp($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagewebp($image, $file);
} else {
$safeResult = \imagewebp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagexbm(\GdImage $image, $filename, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagexbm($image, $filename, $foreground_color);
} else {
$safeResult = \imagexbm($image, $filename);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
$safeResult = \iptcembed($iptc_data, $filename, $spool);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function iptcparse(string $iptc_block): array
{
error_clear_last();
$safeResult = \iptcparse($iptc_block);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ReadlineException;








function readline_add_history(string $prompt): void
{
error_clear_last();
$safeResult = \readline_add_history($prompt);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}



















function readline_callback_handler_install(string $prompt, callable $callback): void
{
error_clear_last();
$safeResult = \readline_callback_handler_install($prompt, $callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}








function readline_clear_history(): void
{
error_clear_last();
$safeResult = \readline_clear_history();
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}











function readline_completion_function(callable $callback): void
{
error_clear_last();
$safeResult = \readline_completion_function($callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_read_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_read_history($filename);
} else {
$safeResult = \readline_read_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_write_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_write_history($filename);
} else {
$safeResult = \readline_write_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ArrayException;












function array_combine(array $keys, array $values)
{
error_clear_last();
$safeResult = \array_combine($keys, $values);
return $safeResult;
}




















function array_flip(array $array): array
{
error_clear_last();
$safeResult = \array_flip($array);
return $safeResult;
}


























function array_replace_recursive(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace_recursive($array, ...$replacements);
} else {
$safeResult = \array_replace_recursive($array);
}
return $safeResult;
}





















function array_replace(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace($array, ...$replacements);
} else {
$safeResult = \array_replace($array);
}
return $safeResult;
}
























function array_walk_recursive(&$array, callable $callback, $arg = null): void
{
error_clear_last();
if ($arg !== null) {
$safeResult = \array_walk_recursive($array, $callback, $arg);
} else {
$safeResult = \array_walk_recursive($array, $callback);
}
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}









function shuffle(array &$array): void
{
error_clear_last();
$safeResult = \shuffle($array);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilesystemException;













function chgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \chgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


































function chmod(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \chmod($filename, $permissions);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function chown(string $filename, $user): void
{
error_clear_last();
$safeResult = \chown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}



















function copy(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \copy($from, $to, $context);
} else {
$safeResult = \copy($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function disk_free_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_free_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function disk_total_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_total_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fclose($stream): void
{
error_clear_last();
$safeResult = \fclose($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fdatasync($stream): void
{
error_clear_last();
$safeResult = \fdatasync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function fflush($stream): void
{
error_clear_last();
$safeResult = \fflush($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}




































function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context);
} else {
$safeResult = \file_get_contents($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































































function file_put_contents(string $filename, $data, int $flags = 0, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \file_put_contents($filename, $data, $flags, $context);
} else {
$safeResult = \file_put_contents($filename, $data, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















































function file(string $filename, int $flags = 0, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \file($filename, $flags, $context);
} else {
$safeResult = \file($filename, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function fileatime(string $filename): int
{
error_clear_last();
$safeResult = \fileatime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filectime(string $filename): int
{
error_clear_last();
$safeResult = \filectime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fileinode(string $filename): int
{
error_clear_last();
$safeResult = \fileinode($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function filemtime(string $filename): int
{
error_clear_last();
$safeResult = \filemtime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












function fileowner(string $filename): int
{
error_clear_last();
$safeResult = \fileowner($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
























function fileperms(string $filename): int
{
error_clear_last();
$safeResult = \fileperms($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filesize(string $filename): int
{
error_clear_last();
$safeResult = \filesize($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function filetype(string $filename): string
{
error_clear_last();
$safeResult = \filetype($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
$safeResult = \flock($stream, $operation, $would_block);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}









































































































































































































function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \fopen($filename, $mode, $use_include_path, $context);
} else {
$safeResult = \fopen($filename, $mode, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}









































function fread($stream, int $length): string
{
error_clear_last();
$safeResult = \fread($stream, $length);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function fstat($stream): array
{
error_clear_last();
$safeResult = \fstat($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function fsync($stream): void
{
error_clear_last();
$safeResult = \fsync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function ftell($stream): int
{
error_clear_last();
$safeResult = \ftell($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



















function ftruncate($stream, int $size): void
{
error_clear_last();
$safeResult = \ftruncate($stream, $size);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \fwrite($stream, $data, $length);
} else {
$safeResult = \fwrite($stream, $data);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























































































function glob(string $pattern, int $flags = 0): array
{
error_clear_last();
$safeResult = \glob($pattern, $flags);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function lchgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \lchgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function lchown(string $filename, $user): void
{
error_clear_last();
$safeResult = \lchown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}










function link(string $target, string $link): void
{
error_clear_last();
$safeResult = \link($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


















function lstat(string $filename): array
{
error_clear_last();
$safeResult = \lstat($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}






























function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \mkdir($directory, $permissions, $recursive, $context);
} else {
$safeResult = \mkdir($directory, $permissions, $recursive);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}































function parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_file($filename, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function pclose($handle): int
{
error_clear_last();
$safeResult = \pclose($handle);
if ($safeResult === -1) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function popen(string $command, string $mode)
{
error_clear_last();
$safeResult = \popen($command, $mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}














function readfile(string $filename, bool $use_include_path = false, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \readfile($filename, $use_include_path, $context);
} else {
$safeResult = \readfile($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function readlink(string $path): string
{
error_clear_last();
$safeResult = \readlink($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function realpath(string $path): string
{
error_clear_last();
$safeResult = \realpath($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function rename(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rename($from, $to, $context);
} else {
$safeResult = \rename($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}











function rewind($stream): void
{
error_clear_last();
$safeResult = \rewind($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rmdir($directory, $context);
} else {
$safeResult = \rmdir($directory);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function symlink(string $target, string $link): void
{
error_clear_last();
$safeResult = \symlink($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}














function tempnam(string $directory, string $prefix): string
{
error_clear_last();
$safeResult = \tempnam($directory, $prefix);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function tmpfile()
{
error_clear_last();
$safeResult = \tmpfile();
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}





















function touch(string $filename, ?int $mtime = null, ?int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
$safeResult = \touch($filename, $mtime, $atime);
} elseif ($mtime !== null) {
$safeResult = \touch($filename, $mtime);
} else {
$safeResult = \touch($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function unlink(string $filename, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \unlink($filename, $context);
} else {
$safeResult = \unlink($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilterException;

































function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_input_array($type, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}

























function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_var_array($array, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\Oci8Exception;


































































































function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
$safeResult = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






































































































































































































function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_cancel($statement): void
{
error_clear_last();
$safeResult = \oci_cancel($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























function oci_commit($connection): void
{
error_clear_last();
$safeResult = \oci_commit($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





































































































function oci_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}




























function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_define_by_name($statement, $column, $var, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}















































































function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
{
error_clear_last();
$safeResult = \oci_execute($statement, $mode);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_field_name($statement, $column): string
{
error_clear_last();
$safeResult = \oci_field_name($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_precision($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_precision($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_scale($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_scale($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_size($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_size($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}













function oci_field_type_raw($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_type_raw($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_type($statement, $column)
{
error_clear_last();
$safeResult = \oci_field_type($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}









function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
$safeResult = \oci_free_descriptor($lob);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_free_statement($statement): void
{
error_clear_last();
$safeResult = \oci_free_statement($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}














function oci_new_collection($connection, string $type_name, ?string $schema = null)
{
error_clear_last();
if ($schema !== null) {
$safeResult = \oci_new_collection($connection, $type_name, $schema);
} else {
$safeResult = \oci_new_collection($connection, $type_name);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}


























































































function oci_new_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_new_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_new_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_new_cursor($connection)
{
error_clear_last();
$safeResult = \oci_new_cursor($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}














function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$safeResult = \oci_new_descriptor($connection, $type);
if ($safeResult === null) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}










function oci_num_rows($statement): int
{
error_clear_last();
$safeResult = \oci_num_rows($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}
























function oci_parse($connection, string $sql)
{
error_clear_last();
$safeResult = \oci_parse($connection, $sql);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}



























































































function oci_pconnect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_pconnect($username, $password, $connection_string);
} else {
$safeResult = \oci_pconnect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}






























function oci_register_taf_callback($connection, callable $callback): void
{
error_clear_last();
$safeResult = \oci_register_taf_callback($connection, $callback);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




















function oci_result($statement, $column): string
{
error_clear_last();
$safeResult = \oci_result($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}

























function oci_rollback($connection): void
{
error_clear_last();
$safeResult = \oci_rollback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_server_version($connection): string
{
error_clear_last();
$safeResult = \oci_server_version($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}























function oci_set_action($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_action($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
$safeResult = \oci_set_call_timeout($connection, $timeout);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}



























function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
$safeResult = \oci_set_client_identifier($connection, $client_id);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





















function oci_set_client_info($connection, string $client_info): void
{
error_clear_last();
$safeResult = \oci_set_client_info($connection, $client_info);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






















function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_db_operation($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


























function oci_set_edition(string $edition): void
{
error_clear_last();
$safeResult = \oci_set_edition($edition);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}























function oci_set_module_name($connection, string $name): void
{
error_clear_last();
$safeResult = \oci_set_module_name($connection, $name);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




























function oci_set_prefetch_lob($statement, int $prefetch_lob_size): void
{
error_clear_last();
$safeResult = \oci_set_prefetch_lob($statement, $prefetch_lob_size);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























































function oci_set_prefetch($statement, int $rows): void
{
error_clear_last();
$safeResult = \oci_set_prefetch($statement, $rows);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
































































function oci_statement_type($statement): string
{
error_clear_last();
$safeResult = \oci_statement_type($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}












function oci_unregister_taf_callback($connection): void
{
error_clear_last();
$safeResult = \oci_unregister_taf_callback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PgsqlException;











function pg_cancel_query(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_cancel_query($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















































function pg_connect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_connect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_connection_reset(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_connection_reset($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






















function pg_convert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
$safeResult = \pg_convert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}




















function pg_copy_from(\PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
$safeResult = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_copy_to(\PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
$safeResult = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





































function pg_delete(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_delete($connection, $table_name, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


















function pg_end_copy(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_end_copy($connection);
} else {
$safeResult = \pg_end_copy();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





































function pg_execute(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_execute($connection, $stmtname, $params);
} elseif ($stmtname !== null) {
$safeResult = \pg_execute($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_execute($connection);
} else {
$safeResult = \pg_execute();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_num(\PgSql\Result $result, string $field): int
{
error_clear_last();
$safeResult = \pg_field_num($result, $field);
if ($safeResult === -1) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_table(\PgSql\Result $result, int $field, bool $oid_only = false)
{
error_clear_last();
$safeResult = \pg_field_table($result, $field, $oid_only);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_flush(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_flush($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}















function pg_free_result(\PgSql\Result $result): void
{
error_clear_last();
$safeResult = \pg_free_result($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_host(?\PgSql\Connection $connection = null): string
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_host($connection);
} else {
$safeResult = \pg_host();
}
if ($safeResult === '') {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}







































function pg_insert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_insert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}






























function pg_last_oid(\PgSql\Result $result): string
{
error_clear_last();
$safeResult = \pg_last_oid($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}












function pg_lo_close(\PgSql\Lob $lob): void
{
error_clear_last();
$safeResult = \pg_lo_close($lob);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















function pg_lo_export(?\PgSql\Connection $connection = null, ?int $oid = null, ?string $pathname = null): void
{
error_clear_last();
if ($pathname !== null) {
$safeResult = \pg_lo_export($connection, $oid, $pathname);
} elseif ($oid !== null) {
$safeResult = \pg_lo_export($connection, $oid);
} elseif ($connection !== null) {
$safeResult = \pg_lo_export($connection);
} else {
$safeResult = \pg_lo_export();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


























function pg_lo_import(?\PgSql\Connection $connection = null, ?string $pathname = null, $object_id = null): int
{
error_clear_last();
if ($object_id !== null) {
$safeResult = \pg_lo_import($connection, $pathname, $object_id);
} elseif ($pathname !== null) {
$safeResult = \pg_lo_import($connection, $pathname);
} elseif ($connection !== null) {
$safeResult = \pg_lo_import($connection);
} else {
$safeResult = \pg_lo_import();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





















function pg_lo_open(\PgSql\Connection $connection, int $oid, string $mode): \PgSql\Lob
{
error_clear_last();
$safeResult = \pg_lo_open($connection, $oid, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















function pg_lo_read(\PgSql\Lob $lob, int $length = 8192): string
{
error_clear_last();
$safeResult = \pg_lo_read($lob, $length);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_lo_seek(\PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
$safeResult = \pg_lo_seek($lob, $offset, $whence);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}













function pg_lo_truncate(\PgSql\Lob $lob, int $size): void
{
error_clear_last();
$safeResult = \pg_lo_truncate($lob, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


















function pg_lo_unlink(\PgSql\Connection $connection, int $oid): void
{
error_clear_last();
$safeResult = \pg_lo_unlink($connection, $oid);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}




















function pg_lo_write(\PgSql\Lob $lob, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \pg_lo_write($lob, $data, $length);
} else {
$safeResult = \pg_lo_write($lob, $data);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_meta_data(\PgSql\Connection $connection, string $table_name, bool $extended = false): array
{
error_clear_last();
$safeResult = \pg_meta_data($connection, $table_name, $extended);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}









































function pg_parameter_status(?\PgSql\Connection $connection = null, ?string $param_name = null): string
{
error_clear_last();
if ($param_name !== null) {
$safeResult = \pg_parameter_status($connection, $param_name);
} elseif ($connection !== null) {
$safeResult = \pg_parameter_status($connection);
} else {
$safeResult = \pg_parameter_status();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














































function pg_pconnect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_pconnect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_ping(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_ping($connection);
} else {
$safeResult = \pg_ping();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






































function pg_prepare(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_prepare($connection, $stmtname, $query);
} elseif ($stmtname !== null) {
$safeResult = \pg_prepare($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_prepare($connection);
} else {
$safeResult = \pg_prepare();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

























function pg_put_line(?\PgSql\Connection $connection = null, ?string $data = null): void
{
error_clear_last();
if ($data !== null) {
$safeResult = \pg_put_line($connection, $data);
} elseif ($connection !== null) {
$safeResult = \pg_put_line($connection);
} else {
$safeResult = \pg_put_line();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















































function pg_query_params(?\PgSql\Connection $connection = null, ?string $query = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_query_params($connection, $query, $params);
} elseif ($query !== null) {
$safeResult = \pg_query_params($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query_params($connection);
} else {
$safeResult = \pg_query_params();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










































function pg_query(?\PgSql\Connection $connection = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_query($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query($connection);
} else {
$safeResult = \pg_query();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}































function pg_result_error_field(\PgSql\Result $result, int $field_code): ?string
{
error_clear_last();
$safeResult = \pg_result_error_field($result, $field_code);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_result_seek(\PgSql\Result $result, int $row): void
{
error_clear_last();
$safeResult = \pg_result_seek($result, $row);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}









































function pg_select(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
$safeResult = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}











function pg_socket(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_socket($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


























function pg_trace(string $filename, string $mode = "w", ?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_trace($filename, $mode, $connection);
} else {
$safeResult = \pg_trace($filename, $mode);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_update(\PgSql\Connection $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\EioException;
















function eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_busy($delay, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chmod(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chmod($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chown(string $path, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chown($path, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_close($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_close($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_custom(callable $execute, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_custom($execute, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_dup2($fd, $fd2, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_dup2($fd, $fd2, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








function eio_event_loop(): void
{
error_clear_last();
$safeResult = \eio_event_loop();
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
}















































function eio_fallocate($fd, int $mode, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fallocate($fd, $mode, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchmod($fd, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fdatasync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fdatasync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstat($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstat($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstat($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstatvfs($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstatvfs($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstatvfs($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fsync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fsync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_ftruncate($fd, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_ftruncate($fd, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_futime($fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_futime($fd, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}



































function eio_grp(callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_grp($callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_lstat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_lstat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mkdir($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
























































function eio_mknod(string $path, int $mode, int $dev, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mknod($path, $mode, $dev, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_nop(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_nop($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_readahead($fd, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































































































































































































































































































function eio_readdir(string $path, int $flags, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readdir($path, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_readlink(string $path, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_rename(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rename($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_rmdir(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rmdir($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}















































function eio_seek($fd, int $offset, int $whence, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_seek($fd, $offset, $whence, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_sendfile($out_fd, $in_fd, int $offset, int $length, ?int $pri = null, ?callable $callback = null, ?string $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback, $data);
} elseif ($callback !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback);
} elseif ($pri !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri);
} else {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_stat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_stat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_statvfs(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_statvfs($path, $pri, $callback, $data);
} else {
$safeResult = \eio_statvfs($path, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_symlink(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_symlink($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_sync_file_range($fd, int $offset, int $nbytes, int $flags, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync_file_range($fd, $offset, $nbytes, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












function eio_sync(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_syncfs($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_syncfs($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_truncate(string $path, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_truncate($path, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_unlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_utime(string $path, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_utime($path, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












































function eio_write($fd, string $str, int $length = 0, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_write($fd, $str, $length, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;































function socket_accept(\Socket $socket): \Socket
{
error_clear_last();
$safeResult = \socket_accept($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_bind(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_bind($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_connect(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_connect($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): array
{
error_clear_last();
if ($hints !== []) {
$safeResult = \socket_addrinfo_lookup($host, $service, $hints);
} elseif ($service !== null) {
$safeResult = \socket_addrinfo_lookup($host, $service);
} else {
$safeResult = \socket_addrinfo_lookup($host);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






















function socket_bind(\Socket $socket, string $address, int $port = 0): void
{
error_clear_last();
$safeResult = \socket_bind($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}























function socket_connect(\Socket $socket, string $address, ?int $port = null): void
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_connect($socket, $address, $port);
} else {
$safeResult = \socket_connect($socket, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_create_listen(int $port, int $backlog = 128): \Socket
{
error_clear_last();
$safeResult = \socket_create_listen($port, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}



























function socket_create_pair(int $domain, int $type, int $protocol, ?array &$pair): void
{
error_clear_last();
$safeResult = \socket_create_pair($domain, $type, $protocol, $pair);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

























function socket_create(int $domain, int $type, int $protocol): \Socket
{
error_clear_last();
$safeResult = \socket_create($domain, $type, $protocol);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_export_stream(\Socket $socket)
{
error_clear_last();
$safeResult = \socket_export_stream($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






































function socket_get_option(\Socket $socket, int $level, int $option)
{
error_clear_last();
$safeResult = \socket_get_option($socket, $level, $option);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

























function socket_getpeername(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getpeername($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_getsockname(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getsockname($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}










function socket_import_stream($stream): \Socket
{
error_clear_last();
$safeResult = \socket_import_stream($stream);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






























function socket_listen(\Socket $socket, int $backlog = 0): void
{
error_clear_last();
$safeResult = \socket_listen($socket, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






































function socket_read(\Socket $socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
$safeResult = \socket_read($socket, $length, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}




















































function socket_send(\Socket $socket, string $data, int $length, int $flags): int
{
error_clear_last();
$safeResult = \socket_send($socket, $data, $length, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}












function socket_sendmsg(\Socket $socket, array $message, int $flags = 0): int
{
error_clear_last();
$safeResult = \socket_sendmsg($socket, $message, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
























































function socket_sendto(\Socket $socket, string $data, int $length, int $flags, string $address, ?int $port = null): int
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address, $port);
} else {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_set_block(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_block($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

















function socket_set_nonblock(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_nonblock($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_set_option(\Socket $socket, int $level, int $option, $value): void
{
error_clear_last();
$safeResult = \socket_set_option($socket, $level, $option, $value);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}





































function socket_shutdown(\Socket $socket, int $mode = 2): void
{
error_clear_last();
$safeResult = \socket_shutdown($socket, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}













function socket_wsaprotocol_info_export(\Socket $socket, int $process_id): string
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_export($socket, $process_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_wsaprotocol_info_import(string $info_id): \Socket
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_import($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_wsaprotocol_info_release(string $info_id): void
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_release($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Bzip2Exception;









function bzclose($bz): void
{
error_clear_last();
$safeResult = \bzclose($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}












function bzflush($bz): void
{
error_clear_last();
$safeResult = \bzflush($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}














function bzopen($file, string $mode)
{
error_clear_last();
$safeResult = \bzopen($file, $mode);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}

















function bzread($bz, int $length = 1024): string
{
error_clear_last();
$safeResult = \bzread($bz, $length);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
















function bzwrite($bz, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \bzwrite($bz, $data, $length);
} else {
$safeResult = \bzwrite($bz, $data);
}
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApcuException;











function apcu_cache_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_cache_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}













function apcu_cas(string $key, int $old, int $new): void
{
error_clear_last();
$safeResult = \apcu_cas($key, $old, $new);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
}














function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_dec($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}














function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_inc($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}











function apcu_sma_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_sma_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcreException;
















function preg_grep(string $pattern, array $array, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_grep($pattern, $array, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































































































































































































































































































































function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




































































































































































































































function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




























function preg_replace_callback_array(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































function preg_replace_callback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback($pattern, $callback, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}























































function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_split($pattern, $subject, $limit, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GmpException;















function gmp_random_seed($seed): void
{
error_clear_last();
$safeResult = \gmp_random_seed($seed);
}
<?php

namespace Safe;

use Safe\Exceptions\VarException;















































function settype(&$var, string $type): void
{
error_clear_last();
$safeResult = \settype($var, $type);
if ($safeResult === false) {
throw VarException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Ssh2Exception;










function ssh2_auth_agent($session, string $username): void
{
error_clear_last();
$safeResult = \ssh2_auth_agent($session, $username);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_auth_hostbased_file($session, string $username, string $hostname, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null, ?string $local_username = null): void
{
error_clear_last();
if ($local_username !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase, $local_username);
} elseif ($passphrase !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_auth_password($session, string $username, string $password): void
{
error_clear_last();
$safeResult = \ssh2_auth_password($session, $username, $password);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_auth_pubkey_file($session, string $username, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}









































































































































































































function ssh2_connect(string $host, int $port = 22, ?array $methods = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \ssh2_connect($host, $port, $methods, $callbacks);
} elseif ($methods !== null) {
$safeResult = \ssh2_connect($host, $port, $methods);
} else {
$safeResult = \ssh2_connect($host, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_disconnect($session): void
{
error_clear_last();
$safeResult = \ssh2_disconnect($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}




















function ssh2_exec($session, string $command, ?string $pty = null, ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_exec($session, $command, $pty, $env);
} elseif ($pty !== null) {
$safeResult = \ssh2_exec($session, $command, $pty);
} else {
$safeResult = \ssh2_exec($session, $command);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_forward_accept($listener)
{
error_clear_last();
$safeResult = \ssh2_forward_accept($listener);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}













function ssh2_forward_listen($session, int $port, ?string $host = null, int $max_connections = 16)
{
error_clear_last();
if ($max_connections !== 16) {
$safeResult = \ssh2_forward_listen($session, $port, $host, $max_connections);
} elseif ($host !== null) {
$safeResult = \ssh2_forward_listen($session, $port, $host);
} else {
$safeResult = \ssh2_forward_listen($session, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}

















function ssh2_publickey_add($pkey, string $algoname, string $blob, bool $overwrite = false, ?array $attributes = null): void
{
error_clear_last();
if ($attributes !== null) {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite, $attributes);
} else {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_publickey_init($session)
{
error_clear_last();
$safeResult = \ssh2_publickey_init($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}











function ssh2_publickey_remove($pkey, string $algoname, string $blob): void
{
error_clear_last();
$safeResult = \ssh2_publickey_remove($pkey, $algoname, $blob);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_scp_recv($session, string $remote_file, string $local_file): void
{
error_clear_last();
$safeResult = \ssh2_scp_recv($session, $remote_file, $local_file);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}














function ssh2_scp_send($session, string $local_file, string $remote_file, int $create_mode = 0644): void
{
error_clear_last();
$safeResult = \ssh2_scp_send($session, $local_file, $remote_file, $create_mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_send_eof($channel): void
{
error_clear_last();
$safeResult = \ssh2_send_eof($channel);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
{
error_clear_last();
$safeResult = \ssh2_sftp_chmod($sftp, $filename, $mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool $recursive = false): void
{
error_clear_last();
$safeResult = \ssh2_sftp_mkdir($sftp, $dirname, $mode, $recursive);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}











function ssh2_sftp_rename($sftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rename($sftp, $from, $to);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp_rmdir($sftp, string $dirname): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rmdir($sftp, $dirname);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_symlink($sftp, string $target, string $link): void
{
error_clear_last();
$safeResult = \ssh2_sftp_symlink($sftp, $target, $link);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}










function ssh2_sftp_unlink($sftp, string $filename): void
{
error_clear_last();
$safeResult = \ssh2_sftp_unlink($sftp, $filename);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp($session)
{
error_clear_last();
$safeResult = \ssh2_sftp($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}




















function ssh2_shell($session, string $termtype = "vanilla", ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_shell($session, $termtype, $env);
} else {
$safeResult = \ssh2_shell($session, $termtype);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RnpException;












function rnp_decrypt(\RnpFFI $ffi, string $input): string
{
error_clear_last();
$safeResult = \rnp_decrypt($ffi, $input);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets_to_json(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets_to_json($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_ffi_create(string $pub_format, string $sec_format): \RnpFFI
{
error_clear_last();
$safeResult = \rnp_ffi_create($pub_format, $sec_format);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

























function rnp_ffi_set_pass_provider(\RnpFFI $ffi, callable $password_callback): void
{
error_clear_last();
$safeResult = \rnp_ffi_set_pass_provider($ffi, $password_callback);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_import_keys(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_keys($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_import_signatures(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_signatures($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

















function rnp_key_export_autocrypt(\RnpFFI $ffi, string $key_fp, string $subkey_fp, string $uid, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export_autocrypt($ffi, $key_fp, $subkey_fp, $uid, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_key_export_revocation(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_key_export(\RnpFFI $ffi, string $key_fp, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_key_get_info(\RnpFFI $ffi, string $key_fp): array
{
error_clear_last();
$safeResult = \rnp_key_get_info($ffi, $key_fp);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_key_remove(\RnpFFI $ffi, string $key_fp, int $flags): void
{
error_clear_last();
$safeResult = \rnp_key_remove($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_key_revoke(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}











function rnp_list_keys(\RnpFFI $ffi, string $identifier_type): array
{
error_clear_last();
$safeResult = \rnp_list_keys($ffi, $identifier_type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_load_keys_from_path(\RnpFFI $ffi, string $format, string $input_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys_from_path($ffi, $format, $input_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_load_keys(\RnpFFI $ffi, string $format, string $input, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys($ffi, $format, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}













function rnp_locate_key(\RnpFFI $ffi, string $identifier_type, string $identifier): string
{
error_clear_last();
$safeResult = \rnp_locate_key($ffi, $identifier_type, $identifier);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_encrypt(\RnpFFI $ffi, string $message, array $recipient_keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp, $options);
} else {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}


















function rnp_op_generate_key(\RnpFFI $ffi, string $userid, string $key_alg, ?string $sub_alg = null, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg, $options);
} elseif ($sub_alg !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg);
} else {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}















function rnp_op_sign_cleartext(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign_detached(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_verify_detached(\RnpFFI $ffi, string $data, string $signature): array
{
error_clear_last();
$safeResult = \rnp_op_verify_detached($ffi, $data, $signature);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_verify(\RnpFFI $ffi, string $data): array
{
error_clear_last();
$safeResult = \rnp_op_verify($ffi, $data);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_save_keys_to_path(\RnpFFI $ffi, string $format, string $output_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys_to_path($ffi, $format, $output_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_save_keys(\RnpFFI $ffi, string $format, string &$output, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys($ffi, $format, $output, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}










function rnp_supported_features(string $type): string
{
error_clear_last();
$safeResult = \rnp_supported_features($type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RpminfoException;








function rpmaddtag(int $tag): void
{
error_clear_last();
$safeResult = \rpmaddtag($tag);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FpmException;









function fastcgi_finish_request(): void
{
error_clear_last();
$safeResult = \fastcgi_finish_request();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
}














function fpm_get_status(): array
{
error_clear_last();
$safeResult = \fpm_get_status();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InotifyException;









function inotify_init()
{
error_clear_last();
$safeResult = \inotify_init();
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}













function inotify_rm_watch($inotify_instance, int $watch_descriptor): void
{
error_clear_last();
$safeResult = \inotify_rm_watch($inotify_instance, $watch_descriptor);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZipException;








function zip_entry_close($zip_entry): void
{
error_clear_last();
$safeResult = \zip_entry_close($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}










function zip_entry_compressedsize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_compressedsize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}











function zip_entry_compressionmethod($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_compressionmethod($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_filesize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_filesize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_name($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_name($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
















function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
$safeResult = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}













function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
$safeResult = \zip_entry_read($zip_entry, $len);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StringsException;









function convert_uudecode(string $string): string
{
error_clear_last();
$safeResult = \convert_uudecode($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}










function hex2bin(string $string): string
{
error_clear_last();
$safeResult = \hex2bin($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
















function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \md5_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}












function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \sha1_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CalendarException;












function unixtojd(?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \unixtojd($timestamp);
} else {
$safeResult = \unixtojd();
}
if ($safeResult === false) {
throw CalendarException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcntlException;
















function pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_getpriority($process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_getpriority($process_id);
} else {
$safeResult = \pcntl_getpriority();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}



















function pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_setpriority($priority, $process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_setpriority($priority, $process_id);
} else {
$safeResult = \pcntl_setpriority($priority);
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}










function pcntl_signal_dispatch(): void
{
error_clear_last();
$safeResult = \pcntl_signal_dispatch();
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}















































function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
{
error_clear_last();
$safeResult = \pcntl_signal($signal, $handler, $restart_syscalls);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}






















function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
$safeResult = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
{
error_clear_last();
$safeResult = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}














































function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
$safeResult = \pcntl_sigwaitinfo($signals, $info);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\IconvException;




















function iconv_get_encoding(string $type = "all")
{
error_clear_last();
$safeResult = \iconv_get_encoding($type);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





















































function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_mime_decode($string, $mode, $encoding);
} else {
$safeResult = \iconv_mime_decode($string, $mode);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}












































































































function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string
{
error_clear_last();
$safeResult = \iconv_mime_encode($field_name, $field_value, $options);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
















function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
$safeResult = \iconv_set_encoding($type, $encoding);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
}


















function iconv_strlen(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_strlen($string, $encoding);
} else {
$safeResult = \iconv_strlen($string);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}




























function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
$safeResult = \iconv($from_encoding, $to_encoding, $string);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InfoException;







































































































function assert_options(int $what, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \assert_options($what, $value);
} else {
$safeResult = \assert_options($what);
}
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}











function cli_set_process_title(string $title): void
{
error_clear_last();
$safeResult = \cli_set_process_title($title);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
























































function dl(string $extension_filename): void
{
error_clear_last();
$safeResult = \dl($extension_filename);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}


















function get_cfg_var(string $option)
{
error_clear_last();
$safeResult = \get_cfg_var($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function get_include_path(): string
{
error_clear_last();
$safeResult = \get_include_path();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getlastmod(): int
{
error_clear_last();
$safeResult = \getlastmod();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmygid(): int
{
error_clear_last();
$safeResult = \getmygid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyinode(): int
{
error_clear_last();
$safeResult = \getmyinode();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmypid(): int
{
error_clear_last();
$safeResult = \getmypid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyuid(): int
{
error_clear_last();
$safeResult = \getmyuid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
$safeResult = \getopt($short_options, $long_options, $rest_index);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getrusage(int $mode = 0): array
{
error_clear_last();
$safeResult = \getrusage($mode);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function ini_get(string $option): string
{
error_clear_last();
$safeResult = \ini_get($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}















function ini_set(string $option, string $value): string
{
error_clear_last();
$safeResult = \ini_set($option, $value);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}


















function php_sapi_name(): string
{
error_clear_last();
$safeResult = \php_sapi_name();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}







































































function phpcredits(int $flags = CREDITS_ALL): void
{
error_clear_last();
$safeResult = \phpcredits($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}






































































































function phpinfo(int $flags = INFO_ALL): void
{
error_clear_last();
$safeResult = \phpinfo($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function putenv(string $assignment): void
{
error_clear_last();
$safeResult = \putenv($assignment);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function set_include_path(string $include_path): string
{
error_clear_last();
$safeResult = \set_include_path($include_path);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}



















function set_time_limit(int $seconds): void
{
error_clear_last();
$safeResult = \set_time_limit($seconds);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbmDb2Exception;











































function db2_autocommit($connection, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \db2_autocommit($connection, $value);
} else {
$safeResult = \db2_autocommit($connection);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}





































function db2_bind_param($stmt, int $parameter_number, string $variable_name, ?int $parameter_type = null, int $data_type = 0, int $precision = -1, int $scale = 0): void
{
error_clear_last();
if ($scale !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision, $scale);
} elseif ($precision !== -1) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision);
} elseif ($data_type !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type);
} elseif ($parameter_type !== null) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type);
} else {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}















































































































function db2_client_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_client_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}















function db2_close($connection): void
{
error_clear_last();
$safeResult = \db2_close($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_commit($connection): void
{
error_clear_last();
$safeResult = \db2_commit($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}


























function db2_execute($stmt, ?array $parameters = null): void
{
error_clear_last();
if ($parameters !== null) {
$safeResult = \db2_execute($stmt, $parameters);
} else {
$safeResult = \db2_execute($stmt);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_result($stmt): void
{
error_clear_last();
$safeResult = \db2_free_result($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \db2_free_stmt($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
























































































































































function db2_get_option($resource, string $option): string
{
error_clear_last();
$safeResult = \db2_get_option($resource, $option);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}
























function db2_pclose($resource): void
{
error_clear_last();
$safeResult = \db2_pclose($resource);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_rollback($connection): void
{
error_clear_last();
$safeResult = \db2_rollback($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}





























































































































































































































































function db2_server_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_server_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}



























































































































































































































































































































































































function db2_set_option($resource, array $options, int $type): void
{
error_clear_last();
$safeResult = \db2_set_option($resource, $options, $type);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
<?php

return [
'apache_getenv',
'apache_get_version',
'apache_lookup_uri',
'apache_request_headers',
'apache_response_headers',
'apache_setenv',
'apcu_cache_info',
'apcu_cas',
'apcu_dec',
'apcu_fetch',
'apcu_inc',
'apcu_sma_info',
'array_walk_recursive',
'assert_options',
'base64_decode',
'bindtextdomain',
'bzclose',
'bzflush',
'bzopen',
'bzread',
'bzwrite',
'chdir',
'chgrp',
'chmod',
'chown',
'chroot',
'class_alias',
'class_implements',
'class_parents',
'class_uses',
'cli_set_process_title',
'closelog',
'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
'copy',
'cubrid_bind',
'cubrid_column_names',
'cubrid_column_types',
'cubrid_col_size',
'cubrid_commit',
'cubrid_connect',
'cubrid_connect_with_url',
'cubrid_current_oid',
'cubrid_disconnect',
'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
'cubrid_lob2_bind',
'cubrid_lob2_close',
'cubrid_lob2_export',
'cubrid_lob2_import',
'cubrid_lob2_new',
'cubrid_lob2_read',
'cubrid_lob2_seek',
'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
'cubrid_lob2_write',
'cubrid_lob_close',
'cubrid_lob_export',
'cubrid_lob_get',
'cubrid_lob_send',
'cubrid_lob_size',
'cubrid_lock_read',
'cubrid_lock_write',
'cubrid_move_cursor',
'cubrid_next_result',
'cubrid_pconnect',
'cubrid_pconnect_with_url',
'cubrid_prepare',
'cubrid_put',
'cubrid_rollback',
'cubrid_schema',
'cubrid_seq_drop',
'cubrid_seq_insert',
'cubrid_seq_put',
'cubrid_set_add',
'cubrid_set_autocommit',
'cubrid_set_db_parameter',
'cubrid_set_drop',
'cubrid_set_query_timeout',
'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
'curl_multi_info_read',
'curl_multi_init',
'curl_multi_setopt',
'curl_setopt',
'curl_share_errno',
'curl_share_setopt',
'curl_unescape',
'curl_upkeep',
'date',
'date_parse',
'date_parse_from_format',
'date_sunrise',
'date_sunset',
'date_sun_info',
'db2_autocommit',
'db2_bind_param',
'db2_client_info',
'db2_close',
'db2_commit',
'db2_execute',
'db2_free_result',
'db2_free_stmt',
'db2_get_option',
'db2_pclose',
'db2_rollback',
'db2_server_info',
'db2_set_option',
'define',
'deflate_add',
'deflate_init',
'dir',
'disk_free_space',
'disk_total_space',
'dl',
'dns_get_record',
'eio_busy',
'eio_chmod',
'eio_chown',
'eio_close',
'eio_custom',
'eio_dup2',
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
'eio_fsync',
'eio_ftruncate',
'eio_futime',
'eio_grp',
'eio_lstat',
'eio_mkdir',
'eio_mknod',
'eio_nop',
'eio_readahead',
'eio_readdir',
'eio_readlink',
'eio_rename',
'eio_rmdir',
'eio_seek',
'eio_sendfile',
'eio_stat',
'eio_statvfs',
'eio_symlink',
'eio_sync',
'eio_syncfs',
'eio_sync_file_range',
'eio_truncate',
'eio_unlink',
'eio_utime',
'eio_write',
'error_log',
'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
'fdatasync',
'fflush',
'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
'fileperms',
'filesize',
'filetype',
'file_get_contents',
'file_put_contents',
'filter_input_array',
'filter_var_array',
'finfo_close',
'finfo_open',
'flock',
'fopen',
'fpm_get_status',
'fputcsv',
'fread',
'fsockopen',
'fstat',
'fsync',
'ftell',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
'ftp_chdir',
'ftp_chmod',
'ftp_close',
'ftp_connect',
'ftp_delete',
'ftp_fget',
'ftp_fput',
'ftp_get',
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
'ftp_raw',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
'ftp_size',
'ftp_ssl_connect',
'ftp_systype',
'ftruncate',
'fwrite',
'getallheaders',
'getcwd',
'gethostname',
'getimagesize',
'getlastmod',
'getmygid',
'getmyinode',
'getmypid',
'getmyuid',
'getopt',
'getprotobyname',
'getprotobynumber',
'getrusage',
'getservbyport',
'get_cfg_var',
'get_headers',
'get_include_path',
'get_meta_tags',
'glob',
'gmmktime',
'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
'gnupg_deletekey',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
'gzcompress',
'gzdecode',
'gzdeflate',
'gzencode',
'gzfile',
'gzgets',
'gzinflate',
'gzopen',
'gzpassthru',
'gzread',
'gzrewind',
'gztell',
'gzuncompress',
'gzwrite',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'highlight_string',
'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
'ibase_blob_create',
'ibase_blob_get',
'ibase_close',
'ibase_commit',
'ibase_commit_ret',
'ibase_connect',
'ibase_delete_user',
'ibase_drop_db',
'ibase_free_event_handler',
'ibase_free_query',
'ibase_free_result',
'ibase_maintain_db',
'ibase_modify_user',
'ibase_name_result',
'ibase_pconnect',
'ibase_restore',
'ibase_rollback',
'ibase_rollback_ret',
'ibase_service_attach',
'ibase_service_detach',
'iconv',
'iconv_get_encoding',
'iconv_mime_decode',
'iconv_mime_encode',
'iconv_set_encoding',
'iconv_strlen',
'idate',
'imageaffine',
'imageaffinematrixconcat',
'imageaffinematrixget',
'imagealphablending',
'imageantialias',
'imagearc',
'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
'imagecolorset',
'imageconvolution',
'imagecopy',
'imagecopymerge',
'imagecopymergegray',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
'imagecreatefromgd2part',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatefromstring',
'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
'imagecreatefromxpm',
'imagecreatetruecolor',
'imagecrop',
'imagecropauto',
'imagedashedline',
'imagedestroy',
'imageellipse',
'imagefill',
'imagefilledarc',
'imagefilledellipse',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
'imageftbbox',
'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
'imagegif',
'imagegrabscreen',
'imagegrabwindow',
'imagejpeg',
'imagelayereffect',
'imageline',
'imageloadfont',
'imagepng',
'imagerectangle',
'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
'imagesetbrush',
'imagesetclip',
'imagesetinterpolation',
'imagesetpixel',
'imagesetstyle',
'imagesetthickness',
'imagesettile',
'imagestring',
'imagestringup',
'imagesx',
'imagesy',
'imagetruecolortopalette',
'imagettfbbox',
'imagettftext',
'imagewbmp',
'imagewebp',
'imagexbm',
'image_type_to_extension',
'imap_8bit',
'imap_append',
'imap_base64',
'imap_binary',
'imap_body',
'imap_bodystruct',
'imap_check',
'imap_clearflag_full',
'imap_close',
'imap_createmailbox',
'imap_deletemailbox',
'imap_fetchbody',
'imap_fetchheader',
'imap_fetchmime',
'imap_fetchstructure',
'imap_fetch_overview',
'imap_gc',
'imap_getacl',
'imap_getmailboxes',
'imap_getsubscribed',
'imap_headerinfo',
'imap_headers',
'imap_listscan',
'imap_lsub',
'imap_mail',
'imap_mailboxmsginfo',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
'imap_qprint',
'imap_renamemailbox',
'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_setflag_full',
'imap_set_quota',
'imap_sort',
'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
'imap_undelete',
'imap_unsubscribe',
'imap_utf8_to_mutf7',
'inet_ntop',
'inet_pton',
'inflate_add',
'inflate_get_read_len',
'inflate_get_status',
'inflate_init',
'ini_get',
'ini_set',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
'json_decode',
'json_encode',
'lchgrp',
'lchown',
'ldap_8859_to_t61',
'ldap_add',
'ldap_bind',
'ldap_compare',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
'ldap_explode_dn',
'ldap_first_attribute',
'ldap_first_entry',
'ldap_free_result',
'ldap_get_attributes',
'ldap_get_dn',
'ldap_get_entries',
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
'ldap_modify_batch',
'ldap_mod_add',
'ldap_mod_del',
'ldap_mod_replace',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
'ldap_rename',
'ldap_sasl_bind',
'ldap_set_option',
'ldap_unbind',
'libxml_set_external_entity_loader',
'link',
'long2ip',
'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
'mailparse_msg_free',
'mailparse_msg_parse',
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
'mb_convert_encoding',
'mb_detect_order',
'mb_encoding_aliases',
'mb_eregi_replace',
'mb_ereg_replace',
'mb_ereg_replace_callback',
'mb_ereg_search_getregs',
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
'mb_parse_str',
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
'md5_file',
'mime_content_type',
'mkdir',
'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
'msg_stat_queue',
'mysql_close',
'mysql_connect',
'mysql_create_db',
'mysql_data_seek',
'mysql_db_name',
'mysql_db_query',
'mysql_drop_db',
'mysql_fetch_lengths',
'mysql_field_flags',
'mysql_field_len',
'mysql_field_name',
'mysql_field_seek',
'mysql_free_result',
'mysql_get_host_info',
'mysql_get_proto_info',
'mysql_get_server_info',
'mysql_info',
'mysql_list_dbs',
'mysql_list_fields',
'mysql_list_processes',
'mysql_list_tables',
'mysql_num_fields',
'mysql_num_rows',
'mysql_query',
'mysql_real_escape_string',
'mysql_result',
'mysql_select_db',
'mysql_set_charset',
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
'net_get_interfaces',
'ob_clean',
'ob_end_clean',
'ob_end_flush',
'ob_flush',
'ob_get_clean',
'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
'oci_field_size',
'oci_field_type',
'oci_field_type_raw',
'oci_free_descriptor',
'oci_free_statement',
'oci_new_collection',
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
'oci_set_action',
'oci_set_call_timeout',
'oci_set_client_identifier',
'oci_set_client_info',
'oci_set_db_operation',
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
'oci_set_prefetch_lob',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
'odbc_binmode',
'odbc_columnprivileges',
'odbc_columns',
'odbc_commit',
'odbc_connect',
'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
'odbc_fetch_into',
'odbc_field_len',
'odbc_field_name',
'odbc_field_num',
'odbc_field_scale',
'odbc_field_type',
'odbc_foreignkeys',
'odbc_gettypeinfo',
'odbc_longreadlen',
'odbc_num_fields',
'odbc_pconnect',
'odbc_prepare',
'odbc_primarykeys',
'odbc_procedurecolumns',
'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
'odbc_setoption',
'odbc_specialcolumns',
'odbc_statistics',
'odbc_tableprivileges',
'odbc_tables',
'opcache_compile_file',
'opcache_get_status',
'opendir',
'openlog',
'openssl_cipher_iv_length',
'openssl_cipher_key_length',
'openssl_cms_decrypt',
'openssl_cms_encrypt',
'openssl_cms_read',
'openssl_cms_sign',
'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
'openssl_decrypt',
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt',
'openssl_pkcs7_read',
'openssl_pkcs7_sign',
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_private',
'openssl_pkey_get_public',
'openssl_pkey_new',
'openssl_private_decrypt',
'openssl_private_encrypt',
'openssl_public_decrypt',
'openssl_public_encrypt',
'openssl_seal',
'openssl_sign',
'openssl_spki_export',
'openssl_spki_export_challenge',
'openssl_spki_new',
'openssl_spki_verify',
'openssl_verify',
'openssl_x509_checkpurpose',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
'openssl_x509_read',
'output_add_rewrite_var',
'output_reset_rewrite_vars',
'pack',
'parse_ini_file',
'parse_ini_string',
'parse_url',
'passthru',
'pclose',
'pcntl_getpriority',
'pcntl_setpriority',
'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
'pcntl_sigtimedwait',
'pcntl_sigwaitinfo',
'pfsockopen',
'pg_cancel_query',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
'pg_delete',
'pg_end_copy',
'pg_execute',
'pg_field_num',
'pg_field_table',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
'pg_prepare',
'pg_put_line',
'pg_query',
'pg_query_params',
'pg_result_error_field',
'pg_result_seek',
'pg_select',
'pg_socket',
'pg_trace',
'pg_update',
'phpcredits',
'phpinfo',
'php_sapi_name',
'popen',
'posix_access',
'posix_getgrgid',
'posix_getgrnam',
'posix_getgroups',
'posix_getlogin',
'posix_getpgid',
'posix_getpwuid',
'posix_getrlimit',
'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
'posix_mknod',
'posix_setegid',
'posix_seteuid',
'posix_setgid',
'posix_setpgid',
'posix_setrlimit',
'posix_setsid',
'posix_setuid',
'posix_times',
'posix_uname',
'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_replace_callback',
'preg_replace_callback_array',
'preg_split',
'proc_close',
'proc_nice',
'proc_open',
'pspell_add_to_personal',
'pspell_add_to_session',
'pspell_clear_session',
'pspell_config_create',
'pspell_config_data_dir',
'pspell_config_dict_dir',
'pspell_config_ignore',
'pspell_config_mode',
'pspell_config_personal',
'pspell_config_repl',
'pspell_config_runtogether',
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
'ps_add_locallink',
'ps_add_note',
'ps_add_pdflink',
'ps_add_weblink',
'ps_arc',
'ps_arcn',
'ps_begin_page',
'ps_begin_pattern',
'ps_begin_template',
'ps_circle',
'ps_clip',
'ps_close',
'ps_closepath',
'ps_closepath_stroke',
'ps_close_image',
'ps_continue_text',
'ps_curveto',
'ps_delete',
'ps_end_page',
'ps_end_pattern',
'ps_end_template',
'ps_fill',
'ps_fill_stroke',
'ps_get_parameter',
'ps_hyphenate',
'ps_include_file',
'ps_lineto',
'ps_moveto',
'ps_new',
'ps_open_file',
'ps_place_image',
'ps_rect',
'ps_restore',
'ps_rotate',
'ps_save',
'ps_scale',
'ps_setcolor',
'ps_setdash',
'ps_setflat',
'ps_setfont',
'ps_setgray',
'ps_setlinecap',
'ps_setlinejoin',
'ps_setlinewidth',
'ps_setmiterlimit',
'ps_setoverprintmode',
'ps_setpolydash',
'ps_set_border_color',
'ps_set_border_dash',
'ps_set_border_style',
'ps_set_info',
'ps_set_parameter',
'ps_set_text_pos',
'ps_set_value',
'ps_shading',
'ps_shading_pattern',
'ps_shfill',
'ps_show',
'ps_show2',
'ps_show_xy',
'ps_show_xy2',
'ps_stroke',
'ps_symbol',
'ps_translate',
'putenv',
'readfile',
'readgzfile',
'readline_add_history',
'readline_callback_handler_install',
'readline_clear_history',
'readline_completion_function',
'readline_read_history',
'readline_write_history',
'readlink',
'realpath',
'register_tick_function',
'rename',
'rewind',
'rmdir',
'rnp_decrypt',
'rnp_dump_packets',
'rnp_dump_packets_to_json',
'rnp_ffi_create',
'rnp_ffi_set_pass_provider',
'rnp_import_keys',
'rnp_import_signatures',
'rnp_key_export',
'rnp_key_export_autocrypt',
'rnp_key_export_revocation',
'rnp_key_get_info',
'rnp_key_remove',
'rnp_key_revoke',
'rnp_list_keys',
'rnp_load_keys',
'rnp_load_keys_from_path',
'rnp_locate_key',
'rnp_op_encrypt',
'rnp_op_generate_key',
'rnp_op_sign',
'rnp_op_sign_cleartext',
'rnp_op_sign_detached',
'rnp_op_verify',
'rnp_op_verify_detached',
'rnp_save_keys',
'rnp_save_keys_to_path',
'rnp_supported_features',
'rpmaddtag',
'rrd_create',
'rrd_first',
'rrd_graph',
'rrd_info',
'rrd_lastupdate',
'rrd_restore',
'rrd_tune',
'rrd_update',
'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
'sem_get',
'sem_release',
'sem_remove',
'session_abort',
'session_create_id',
'session_decode',
'session_destroy',
'session_encode',
'session_id',
'session_module_name',
'session_name',
'session_regenerate_id',
'session_reset',
'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
'shell_exec',
'shmop_delete',
'shmop_read',
'shm_attach',
'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
'shuffle',
'simplexml_import_dom',
'simplexml_load_file',
'simplexml_load_string',
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
'socket_addrinfo_lookup',
'socket_bind',
'socket_connect',
'socket_create',
'socket_create_listen',
'socket_create_pair',
'socket_export_stream',
'socket_getpeername',
'socket_getsockname',
'socket_get_option',
'socket_import_stream',
'socket_listen',
'socket_read',
'socket_send',
'socket_sendmsg',
'socket_sendto',
'socket_set_block',
'socket_set_nonblock',
'socket_set_option',
'socket_shutdown',
'socket_write',
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify',
'sodium_crypto_box_open',
'sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open',
'sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version',
'spl_autoload_register',
'spl_autoload_unregister',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
'sqlsrv_close',
'sqlsrv_commit',
'sqlsrv_configure',
'sqlsrv_execute',
'sqlsrv_fetch',
'sqlsrv_fetch_array',
'sqlsrv_fetch_object',
'sqlsrv_free_stmt',
'sqlsrv_get_field',
'sqlsrv_next_result',
'sqlsrv_num_fields',
'sqlsrv_num_rows',
'sqlsrv_prepare',
'sqlsrv_query',
'sqlsrv_rollback',
'ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent',
'ssh2_auth_hostbased_file',
'ssh2_auth_password',
'ssh2_auth_pubkey_file',
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
'ssh2_forward_accept',
'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
'ssh2_sftp_rename',
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
'ssh2_shell',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
'stream_filter_prepend',
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
'stream_socket_get_name',
'stream_socket_pair',
'stream_socket_recvfrom',
'stream_socket_sendto',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
'strftime',
'strptime',
'strtotime',
'swoole_async_dns_lookup',
'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
'swoole_event_del',
'swoole_event_write',
'symlink',
'syslog',
'system',
'sys_getloadavg',
'tempnam',
'timezone_name_from_abbr',
'time_nanosleep',
'time_sleep_until',
'tmpfile',
'touch',
'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
'variant_date_to_timestamp',
'variant_round',
'virtual',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
'xdiff_file_diff_binary',
'xdiff_file_patch_binary',
'xdiff_file_rabdiff',
'xdiff_string_bpatch',
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
'xml_parser_free',
'xml_set_character_data_handler',
'xml_set_default_handler',
'xml_set_element_handler',
'xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler',
'xml_set_object',
'xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
'yaz_ccl_parse',
'yaz_close',
'yaz_connect',
'yaz_database',
'yaz_element',
'yaz_present',
'yaz_search',
'yaz_wait',
'zip_entry_close',
'zip_entry_compressedsize',
'zip_entry_compressionmethod',
'zip_entry_filesize',
'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
];
<?php

namespace Safe;

use Safe\Exceptions\FileinfoException;








function finfo_close(\finfo $finfo): void
{
error_clear_last();
$safeResult = \finfo_close($finfo);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
}
























function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): \finfo
{
error_clear_last();
if ($magic_database !== null) {
$safeResult = \finfo_open($flags, $magic_database);
} else {
$safeResult = \finfo_open($flags);
}
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}












function mime_content_type($filename): string
{
error_clear_last();
$safeResult = \mime_content_type($filename);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/var.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/var.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/var.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/var.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/var.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ssh2.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ssh2.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ssh2.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ssh2.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ssh2.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/rnp.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/rnp.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/rnp.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/rnp.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/rpminfo.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/rpminfo.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/rpminfo.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/rpminfo.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/rpminfo.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/fpm.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/fpm.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/fpm.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/fpm.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/fpm.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/inotify.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/inotify.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/inotify.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/inotify.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/inotify.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/zip.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/zip.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/zip.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/zip.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/zip.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/strings.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/strings.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/strings.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/strings.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/strings.php';
}
<?php

namespace Safe;

use Safe\Exceptions\OpensslException;









function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_iv_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
} elseif ($private_key !== null) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_RC2_40): void
{
error_clear_last();
$safeResult = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_cms_read(string $input_filename, array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_cms_read($input_filename, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates = null, array $ca_info = [], ?string $untrusted_certificates_filename = null, ?string $content = null, ?string $pk7 = null, ?string $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
} elseif ($sigfile !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
} elseif ($pk7 !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
} elseif ($content !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
} elseif ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
} elseif ($ca_info !== []) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
} elseif ($certificates !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates);
} else {
$safeResult = \openssl_cms_verify($input_filename, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export($csr, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}












function openssl_csr_get_public_key($csr, bool $short_names = true): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_csr_get_public_key($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
$safeResult = \openssl_csr_get_subject($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















































































































function openssl_csr_new(array $distinguished_names, \OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null): \OpenSSLCertificateSigningRequest
{
error_clear_last();
if ($extra_attributes !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
} elseif ($options !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
$safeResult = \openssl_csr_new($distinguished_names, $private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

























function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, ?array $options = null, int $serial = 0): \OpenSSLCertificate
{
error_clear_last();
if ($serial !== 0) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
} elseif ($options !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}



















function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string $tag = "", string $aad = ""): string
{
error_clear_last();
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}













function openssl_dh_compute_key(string $public_key, \OpenSSLAsymmetricKey $private_key): string
{
error_clear_last();
$safeResult = \openssl_dh_compute_key($public_key, $private_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_digest($data, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















































function openssl_get_curve_names(): array
{
error_clear_last();
$safeResult = \openssl_get_curve_names();
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




























function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, ?string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
$safeResult = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




































function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




































function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}













function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
if ($private_key !== null) {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_RC2_40): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_read($data, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


























function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
{
error_clear_last();
$safeResult = \openssl_pkey_derive($public_key, $private_key, $key_length);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


















function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase);
} else {
$safeResult = \openssl_pkey_export($key, $output);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_pkey_get_private($private_key, ?string $passphrase = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \openssl_pkey_get_private($private_key, $passphrase);
} else {
$safeResult = \openssl_pkey_get_private($private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_public($public_key): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_pkey_get_public($public_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}















function openssl_pkey_new(?array $options = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_new($options);
} else {
$safeResult = \openssl_pkey_new();
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






















function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




















function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null): string
{
error_clear_last();
$safeResult = \openssl_random_pseudo_bytes($length, $strong_result);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
































function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
$safeResult = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
{
error_clear_last();
$safeResult = \openssl_sign($data, $signature, $private_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_spki_export_challenge(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export_challenge($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_spki_export(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_spki_new(\OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
{
error_clear_last();
$safeResult = \openssl_spki_new($private_key, $challenge, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}









function openssl_spki_verify(string $spki): void
{
error_clear_last();
$safeResult = \openssl_spki_verify($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
$safeResult = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}































































function openssl_x509_checkpurpose($certificate, int $purpose, array $ca_info = [], ?string $untrusted_certificates_file = null)
{
error_clear_last();
if ($untrusted_certificates_file !== null) {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info, $untrusted_certificates_file);
} else {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info);
}
if ($safeResult === -1) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

















function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export($certificate, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}












function openssl_x509_read($certificate): \OpenSSLCertificate
{
error_clear_last();
$safeResult = \openssl_x509_read($certificate);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ExecException;





























function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \exec($command, $output, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}


















function proc_close($process): int
{
error_clear_last();
$safeResult = \proc_close($process);
if ($safeResult === -1) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}






















function proc_nice(int $priority): void
{
error_clear_last();
$safeResult = \proc_nice($priority);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}
















































































function proc_open(string $cmd, array $descriptorspec, ?array &$pipes, ?string $cwd = null, ?array $env = null, ?array $other_options = null)
{
error_clear_last();
if ($other_options !== null) {
$safeResult = \proc_open($cmd, $descriptorspec, $pipes, $cwd, $env, $other_options);
} elseif ($env !== null) {
$safeResult = \proc_open($cmd, $descriptorspec, $pipes, $cwd, $env);
} elseif ($cwd !== null) {
$safeResult = \proc_open($cmd, $descriptorspec, $pipes, $cwd);
} else {
$safeResult = \proc_open($cmd, $descriptorspec, $pipes);
}
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}










function shell_exec(string $command): ?string
{
error_clear_last();
$safeResult = \shell_exec($command);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}























function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \system($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LibxmlException;














































function libxml_set_external_entity_loader(callable $resolver_function): void
{
error_clear_last();
$safeResult = \libxml_set_external_entity_loader($resolver_function);
if ($safeResult === false) {
throw LibxmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ClassobjException;












function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
$safeResult = \class_alias($class, $alias, $autoload);
if ($safeResult === false) {
throw ClassobjException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SsdeepException;













function ssdeep_fuzzy_compare(string $signature1, string $signature2): int
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_compare($signature1, $signature2);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}













function ssdeep_fuzzy_hash_filename(string $file_name): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash_filename($file_name);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}












function ssdeep_fuzzy_hash(string $to_hash): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash($to_hash);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PsException;






















function ps_add_launchlink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename): void
{
error_clear_last();
$safeResult = \ps_add_launchlink($psdoc, $llx, $lly, $urx, $ury, $filename);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}






























function ps_add_locallink($psdoc, float $llx, float $lly, float $urx, float $ury, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_locallink($psdoc, $llx, $lly, $urx, $ury, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}































function ps_add_note($psdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
{
error_clear_last();
$safeResult = \ps_add_note($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































function ps_add_pdflink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_pdflink($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

























function ps_add_weblink($psdoc, float $llx, float $lly, float $urx, float $ury, string $url): void
{
error_clear_last();
$safeResult = \ps_add_weblink($psdoc, $llx, $lly, $urx, $ury, $url);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arc($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arc($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arcn($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arcn($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











































function ps_begin_page($psdoc, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_begin_page($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_begin_pattern($psdoc, float $width, float $height, float $xstep, float $ystep, int $painttype): int
{
error_clear_last();
$safeResult = \ps_begin_pattern($psdoc, $width, $height, $xstep, $ystep, $painttype);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}


















function ps_begin_template($psdoc, float $width, float $height): int
{
error_clear_last();
$safeResult = \ps_begin_template($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




















function ps_circle($psdoc, float $x, float $y, float $radius): void
{
error_clear_last();
$safeResult = \ps_circle($psdoc, $x, $y, $radius);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_clip($psdoc): void
{
error_clear_last();
$safeResult = \ps_clip($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_close_image($psdoc, int $imageid): void
{
error_clear_last();
$safeResult = \ps_close_image($psdoc, $imageid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_close($psdoc): void
{
error_clear_last();
$safeResult = \ps_close($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_continue_text($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_continue_text($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_curveto($psdoc, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
{
error_clear_last();
$safeResult = \ps_curveto($psdoc, $x1, $y1, $x2, $y2, $x3, $y3);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_delete($psdoc): void
{
error_clear_last();
$safeResult = \ps_delete($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_end_page($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_page($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_end_pattern($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_pattern($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_end_template($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_template($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































































































































function ps_get_parameter($psdoc, string $name, ?float $modifier = null): string
{
error_clear_last();
if ($modifier !== null) {
$safeResult = \ps_get_parameter($psdoc, $name, $modifier);
} else {
$safeResult = \ps_get_parameter($psdoc, $name);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}























function ps_hyphenate($psdoc, string $text): array
{
error_clear_last();
$safeResult = \ps_hyphenate($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}













function ps_include_file($psdoc, string $file): void
{
error_clear_last();
$safeResult = \ps_include_file($psdoc, $file);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_lineto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_lineto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_moveto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_moveto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_new()
{
error_clear_last();
$safeResult = \ps_new();
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}














function ps_open_file($psdoc, ?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \ps_open_file($psdoc, $filename);
} else {
$safeResult = \ps_open_file($psdoc);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}




















function ps_place_image($psdoc, int $imageid, float $x, float $y, float $scale): void
{
error_clear_last();
$safeResult = \ps_place_image($psdoc, $imageid, $x, $y, $scale);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_rect($psdoc, float $x, float $y, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_rect($psdoc, $x, $y, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_restore($psdoc): void
{
error_clear_last();
$safeResult = \ps_restore($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_rotate($psdoc, float $rot): void
{
error_clear_last();
$safeResult = \ps_rotate($psdoc, $rot);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_save($psdoc): void
{
error_clear_last();
$safeResult = \ps_save($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_scale($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_scale($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_color($psdoc, float $red, float $green, float $blue): void
{
error_clear_last();
$safeResult = \ps_set_border_color($psdoc, $red, $green, $blue);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_dash($psdoc, float $black, float $white): void
{
error_clear_last();
$safeResult = \ps_set_border_dash($psdoc, $black, $white);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_style($psdoc, string $style, float $width): void
{
error_clear_last();
$safeResult = \ps_set_border_style($psdoc, $style, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}







































function ps_set_info($p, string $key, string $val): void
{
error_clear_last();
$safeResult = \ps_set_info($p, $key, $val);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_set_parameter($psdoc, string $name, string $value): void
{
error_clear_last();
$safeResult = \ps_set_parameter($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_set_text_pos($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_set_text_pos($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

































































function ps_set_value($psdoc, string $name, float $value): void
{
error_clear_last();
$safeResult = \ps_set_value($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



























function ps_setcolor($psdoc, string $type, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
{
error_clear_last();
$safeResult = \ps_setcolor($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_setdash($psdoc, float $on, float $off): void
{
error_clear_last();
$safeResult = \ps_setdash($psdoc, $on, $off);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setflat($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setflat($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setfont($psdoc, int $fontid, float $size): void
{
error_clear_last();
$safeResult = \ps_setfont($psdoc, $fontid, $size);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setgray($psdoc, float $gray): void
{
error_clear_last();
$safeResult = \ps_setgray($psdoc, $gray);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinecap($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinecap($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinejoin($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinejoin($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setlinewidth($psdoc, float $width): void
{
error_clear_last();
$safeResult = \ps_setlinewidth($psdoc, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_setmiterlimit($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setmiterlimit($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setoverprintmode($psdoc, int $mode): void
{
error_clear_last();
$safeResult = \ps_setoverprintmode($psdoc, $mode);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setpolydash($psdoc, float $arr): void
{
error_clear_last();
$safeResult = \ps_setpolydash($psdoc, $arr);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_shading_pattern($psdoc, int $shadingid, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading_pattern($psdoc, $shadingid, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




































function ps_shading($psdoc, string $type, float $x0, float $y0, float $x1, float $y1, float $c1, float $c2, float $c3, float $c4, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}















function ps_shfill($psdoc, int $shadingid): void
{
error_clear_last();
$safeResult = \ps_shfill($psdoc, $shadingid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_show_xy($psdoc, string $text, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_show_xy($psdoc, $text, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_show_xy2($psdoc, string $text, int $len, float $xcoor, float $ycoor): void
{
error_clear_last();
$safeResult = \ps_show_xy2($psdoc, $text, $len, $xcoor, $ycoor);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_show($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_show($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_show2($psdoc, string $text, int $len): void
{
error_clear_last();
$safeResult = \ps_show2($psdoc, $text, $len);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_symbol($psdoc, int $ord): void
{
error_clear_last();
$safeResult = \ps_symbol($psdoc, $ord);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_translate($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_translate($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\YazException;












































function yaz_ccl_parse($id, string $query, ?array &$result): void
{
error_clear_last();
$safeResult = \yaz_ccl_parse($id, $query, $result);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}









function yaz_close($id): void
{
error_clear_last();
$safeResult = \yaz_close($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}

































































































































































































function yaz_connect(string $zurl, $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \yaz_connect($zurl, $options);
} else {
$safeResult = \yaz_connect($zurl);
}
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}














function yaz_database($id, string $databases): void
{
error_clear_last();
$safeResult = \yaz_database($id, $databases);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}















function yaz_element($id, string $elementset): void
{
error_clear_last();
$safeResult = \yaz_element($id, $elementset);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












function yaz_present($id): void
{
error_clear_last();
$safeResult = \yaz_present($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}
































function yaz_search($id, string $type, string $query): void
{
error_clear_last();
$safeResult = \yaz_search($id, $type, $query);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












































function yaz_wait(?array &$options = null)
{
error_clear_last();
$safeResult = \yaz_wait($options);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CurlException;










function curl_copy_handle(\CurlHandle $handle): \CurlHandle
{
error_clear_last();
$safeResult = \curl_copy_handle($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}












function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_escape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















function curl_exec(\CurlHandle $handle)
{
error_clear_last();
$safeResult = \curl_exec($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















































































































































































































































































































































































































































































function curl_getinfo(\CurlHandle $handle, ?int $option = null)
{
error_clear_last();
if ($option !== null) {
$safeResult = \curl_getinfo($handle, $option);
} else {
$safeResult = \curl_getinfo($handle);
}
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}

















function curl_init(?string $url = null): \CurlHandle
{
error_clear_last();
if ($url !== null) {
$safeResult = \curl_init($url);
} else {
$safeResult = \curl_init();
}
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}















































function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
$safeResult = \curl_multi_info_read($multi_handle, $queued_messages);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
return $safeResult;
}









function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$safeResult = \curl_multi_init();
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}









































































































































function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_multi_setopt($multi_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
}







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_setopt($handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}











function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
$safeResult = \curl_share_errno($share_handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
return $safeResult;
}




































































function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_share_setopt($share_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
}












function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_unescape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SessionException;








function session_abort(): void
{
error_clear_last();
$safeResult = \session_abort();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}



























function session_create_id(string $prefix = ""): string
{
error_clear_last();
$safeResult = \session_create_id($prefix);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}














function session_decode(string $data): void
{
error_clear_last();
$safeResult = \session_decode($data);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


















function session_destroy(): void
{
error_clear_last();
$safeResult = \session_destroy();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}













function session_encode(): string
{
error_clear_last();
$safeResult = \session_encode();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
























function session_id(?string $id = null): string
{
error_clear_last();
if ($id !== null) {
$safeResult = \session_id($id);
} else {
$safeResult = \session_id();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
















function session_module_name(?string $module = null): string
{
error_clear_last();
if ($module !== null) {
$safeResult = \session_module_name($module);
} else {
$safeResult = \session_module_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}












































function session_name(?string $name = null): string
{
error_clear_last();
if ($name !== null) {
$safeResult = \session_name($name);
} else {
$safeResult = \session_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}

















function session_regenerate_id(bool $delete_old_session = false): void
{
error_clear_last();
$safeResult = \session_regenerate_id($delete_old_session);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}










function session_reset(): void
{
error_clear_last();
$safeResult = \session_reset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}

























function session_save_path(?string $path = null): string
{
error_clear_last();
if ($path !== null) {
$safeResult = \session_save_path($path);
} else {
$safeResult = \session_save_path();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}









function session_unset(): void
{
error_clear_last();
$safeResult = \session_unset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
















function session_write_close(): void
{
error_clear_last();
$safeResult = \session_write_close();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FunchandException;









function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \register_tick_function($callback, ...$args);
} else {
$safeResult = \register_tick_function($callback);
}
if ($safeResult === false) {
throw FunchandException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZlibException;



















function deflate_add(\DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \deflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























































































function deflate_init(int $encoding, array $options = []): \DeflateContext
{
error_clear_last();
$safeResult = \deflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function gzclose($stream): void
{
error_clear_last();
$safeResult = \gzclose($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}




















function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string
{
error_clear_last();
$safeResult = \gzcompress($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzdecode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}



















function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string
{
error_clear_last();
$safeResult = \gzdeflate($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

























function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
$safeResult = \gzencode($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzfile(string $filename, int $use_include_path = 0): array
{
error_clear_last();
$safeResult = \gzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}














function gzgets($stream, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzgets($stream, $length);
} else {
$safeResult = \gzgets($stream);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzinflate($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























function gzopen(string $filename, string $mode, int $use_include_path = 0)
{
error_clear_last();
$safeResult = \gzopen($filename, $mode, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzpassthru($stream): int
{
error_clear_last();
$safeResult = \gzpassthru($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzread($stream, int $length): string
{
error_clear_last();
$safeResult = \gzread($stream, $length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function gzrewind($stream): void
{
error_clear_last();
$safeResult = \gzrewind($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}












function gztell($stream): int
{
error_clear_last();
$safeResult = \gztell($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzuncompress(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzuncompress($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}


















function gzwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzwrite($stream, $data, $length);
} else {
$safeResult = \gzwrite($stream, $data);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_read_len(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_read_len($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_status(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_status($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}























function inflate_add(\InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \inflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









































































function inflate_init(int $encoding, array $options = []): \InflateContext
{
error_clear_last();
$safeResult = \inflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

















function readgzfile(string $filename, int $use_include_path = 0): int
{
error_clear_last();
$safeResult = \readgzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \zlib_decode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MiscException;

























function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
$safeResult = \define($constant_name, $value, $case_insensitive);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}






















function highlight_file(string $filename, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_file($filename, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}














function highlight_string(string $string, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_string($string, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function hrtime(bool $as_number = false)
{
error_clear_last();
$safeResult = \hrtime($as_number);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}


/**
 * Pack given arguments into a binary string according to
 * format.
 *
 * The idea for this function was taken from Perl and all formatting codes
 * work the same as in Perl. However, there are some formatting codes that are
 * missing such as Perl's "u" format code.
 *
 * Note that the distinction between signed and unsigned values only
 * affects the function unpack, where as
 * function pack gives the same result for
 * signed and unsigned format codes.
 *
 * @param string $format The format string consists of format codes
 * followed by an optional repeater argument. The repeater argument can
 * be either an integer value or * for repeating to
 * the end of the input data. For a, A, h, H the repeat count specifies
 * how many characters of one data argument are taken, for @ it is the
 * absolute position where to put the next data, for everything else the
 * repeat count specifies how many data arguments are consumed and packed
 * into the resulting binary string.
 *
 * Currently implemented formats are:
 *
 * pack format characters
 *
 *
 *
 * Code
 * Description
 *
 *
 *
 *
 * a
 * NUL-padded string
 *
 *
 * A
 * SPACE-padded string
 *
 * h
 * Hex string, low nibble first
 *
 * H
 * Hex string, high nibble first
 * csigned char
 *
 * C
 * unsigned char
 *
 * s
 * signed short (always 16 bit, machine byte order)
 *
 *
 * S
 * unsigned short (always 16 bit, machine byte order)
 *
 *
 * n
 * unsigned short (always 16 bit, big endian byte order)
 *
 *
 * v
 * unsigned short (always 16 bit, little endian byte order)
 *
 *
 * i
 * signed integer (machine dependent size and byte order)
 *
 *
 * I
 * unsigned integer (machine dependent size and byte order)
 *
 *
 * l
 * signed long (always 32 bit, machine byte order)
 *
 *
 * L
 * unsigned long (always 32 bit, machine byte order)
 *
 *
 * N
 * unsigned long (always 32 bit, big endian byte order)
 *
 *
 * V
 * unsigned long (always 32 bit, little endian byte order)
 *
 *
 * q
 * signed long long (always 64 bit, machine byte order)
 *
 *
 * Q
 * unsigned long long (always 64 bit, machine byte order)
 *
 *
 * J
 * unsigned long long (always 64 bit, big endian byte order)
 *
 *
 * P
 * unsigned long long (always 64 bit, little endian byte order)
 *
 *
 * f
 * float (machine dependent size and representation)
 *
 *
 * g
 * float (machine dependent size, little endian byte order)
 *
 *
 * G
 * float (machine dependent size, big endian byte order)
 *
 *
 * d
 * double (machine dependent size and representation)
 *
 *
 * e
 * double (machine dependent size, little endian byte order)
 *
 *
 * E
 * double (machine dependent size, big endian byte order)
 *
 *
 * x
 * NUL byte
 *
 *
 * X
 * Back up one byte
 *
 *
 * Z
 * NUL-padded string
 *
 *
 * @
 * NUL-fill to absolute position
 *
 *
 *
 *
 * @param mixed $values
 * @return string Returns a binary string containing data.
 * @throws MiscException
 *
 */
function pack(string $format, ...$values): string
{
error_clear_last();
if ($values !== []) {
$safeResult = \pack($format, ...$values);
} else {
$safeResult = \pack($format);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): string
{
error_clear_last();
$safeResult = \sapi_windows_cp_conv($in_codepage, $out_codepage, $subject);
if ($safeResult === null) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}









function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
$safeResult = \sapi_windows_cp_set($codepage);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}













function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
{
error_clear_last();
$safeResult = \sapi_windows_generate_ctrl_event($event, $pid);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}

































function sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): void
{
error_clear_last();
$safeResult = \sapi_windows_set_ctrl_handler($handler, $add);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}


















function sapi_windows_vt100_support($stream, ?bool $enable = null): void
{
error_clear_last();
if ($enable !== null) {
$safeResult = \sapi_windows_vt100_support($stream, $enable);
} else {
$safeResult = \sapi_windows_vt100_support($stream);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}

















function sleep(int $seconds): int
{
error_clear_last();
$safeResult = \sleep($seconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}





























function time_nanosleep(int $seconds, int $nanoseconds)
{
error_clear_last();
$safeResult = \time_nanosleep($seconds, $nanoseconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}










function time_sleep_until(float $timestamp): void
{
error_clear_last();
$safeResult = \time_sleep_until($timestamp);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}



































function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
$safeResult = \unpack($format, $string, $offset);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CubridException;

























































































































function cubrid_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
{
error_clear_last();
$safeResult = \cubrid_col_size($conn_identifier, $oid, $attr_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_names($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_names($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_types($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_types($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}


















function cubrid_commit($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_commit($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














































































function cubrid_connect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_connect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



























function cubrid_connect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_connect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_current_oid($req_identifier): string
{
error_clear_last();
$safeResult = \cubrid_current_oid($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_disconnect($conn_identifier = null): void
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_disconnect($conn_identifier);
} else {
$safeResult = \cubrid_disconnect();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_drop($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_drop($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_free_result($req_identifier): void
{
error_clear_last();
$safeResult = \cubrid_free_result($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_get_charset($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_charset($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_get_class_name($conn_identifier, string $oid): string
{
error_clear_last();
$safeResult = \cubrid_get_class_name($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}









function cubrid_get_client_info(): string
{
error_clear_last();
$safeResult = \cubrid_get_client_info();
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















































































































function cubrid_get_db_parameter($conn_identifier): array
{
error_clear_last();
$safeResult = \cubrid_get_db_parameter($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_get_query_timeout($req_identifier): int
{
error_clear_last();
$safeResult = \cubrid_get_query_timeout($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_get_server_info($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_server_info($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















function cubrid_insert_id($conn_identifier = null): string
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_insert_id($conn_identifier);
} else {
$safeResult = \cubrid_insert_id();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob_close(array $lob_identifier_array): void
{
error_clear_last();
$safeResult = \cubrid_lob_close($lob_identifier_array);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
{
error_clear_last();
$safeResult = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob_get($conn_identifier, string $sql): array
{
error_clear_last();
$safeResult = \cubrid_lob_get($conn_identifier, $sql);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_lob_send($conn_identifier, $lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob_send($conn_identifier, $lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob_size($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}

















function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_close($lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob2_close($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_export($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_export($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_import($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_import($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
{
error_clear_last();
if ($type !== "BLOB") {
$safeResult = \cubrid_lob2_new($conn_identifier, $type);
} elseif ($conn_identifier !== null) {
$safeResult = \cubrid_lob2_new($conn_identifier);
} else {
$safeResult = \cubrid_lob2_new();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_read($lob_identifier, int $len): string
{
error_clear_last();
$safeResult = \cubrid_lob2_read($lob_identifier, $len);
if ($safeResult === null) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}































function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_size($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_size64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_size64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob2_tell($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_tell($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_tell64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_tell64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_write($lob_identifier, string $buf): void
{
error_clear_last();
$safeResult = \cubrid_lob2_write($lob_identifier, $buf);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_read($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_read($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_write($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_write($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}


























function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
{
error_clear_last();
$safeResult = \cubrid_move_cursor($req_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_next_result($result): void
{
error_clear_last();
$safeResult = \cubrid_next_result($result);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
















































































function cubrid_pconnect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_pconnect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_pconnect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_pconnect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
{
error_clear_last();
$safeResult = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_put($conn_identifier, string $oid, ?string $attr = null, $value = null): void
{
error_clear_last();
if ($value !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr, $value);
} elseif ($attr !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr);
} else {
$safeResult = \cubrid_put($conn_identifier, $oid);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_rollback($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_rollback($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}







































































































































































































































































































































































































function cubrid_schema($conn_identifier, int $schema_type, ?string $class_name = null, ?string $attr_name = null): array
{
error_clear_last();
if ($attr_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
} elseif ($class_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name);
} else {
$safeResult = \cubrid_schema($conn_identifier, $schema_type);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
{
error_clear_last();
$safeResult = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}




















function cubrid_set_autocommit($conn_identifier, bool $mode): void
{
error_clear_last();
$safeResult = \cubrid_set_autocommit($conn_identifier, $mode);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}



















function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_value): void
{
error_clear_last();
$safeResult = \cubrid_set_db_parameter($conn_identifier, $param_type, $param_value);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_set_query_timeout($req_identifier, int $timeout): void
{
error_clear_last();
$safeResult = \cubrid_set_query_timeout($req_identifier, $timeout);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MailparseException;























function mailparse_msg_extract_part_file($mimemail, $filename, ?callable $callbackfunc = null): string
{
error_clear_last();
if ($callbackfunc !== null) {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc);
} else {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename);
}
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}











function mailparse_msg_free($mimemail): void
{
error_clear_last();
$safeResult = \mailparse_msg_free($mimemail);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}















function mailparse_msg_parse_file(string $filename)
{
error_clear_last();
$safeResult = \mailparse_msg_parse_file($filename);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}














function mailparse_msg_parse($mimemail, string $data): void
{
error_clear_last();
$safeResult = \mailparse_msg_parse($mimemail, $data);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}













function mailparse_stream_encode($sourcefp, $destfp, string $encoding): void
{
error_clear_last();
$safeResult = \mailparse_stream_encode($sourcefp, $destfp, $encoding);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\LdapException;














function ldap_8859_to_t61(string $value): string
{
error_clear_last();
$safeResult = \ldap_8859_to_t61($value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}





















function ldap_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
if ($password !== null) {
$safeResult = \ldap_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_bind($ldap, $dn);
} else {
$safeResult = \ldap_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_compare(\LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value, $controls);
} else {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value);
}
if ($safeResult === -1) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_control_paged_result_response($link, $result, ?string &$cookie = null, ?int &$estimated = null): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result_response($link, $result, $cookie, $estimated);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_control_paged_result($link, int $pagesize, bool $iscritical = false, string $cookie = ""): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result($link, $pagesize, $iscritical, $cookie);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}












function ldap_count_entries(\LDAP\Connection $ldap, \LDAP\Result $result): int
{
error_clear_last();
$safeResult = \ldap_count_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_delete(\LDAP\Connection $ldap, string $dn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_delete($ldap, $dn, $controls);
} else {
$safeResult = \ldap_delete($ldap, $dn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_dn2ufn(string $dn): string
{
error_clear_last();
$safeResult = \ldap_dn2ufn($dn);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_exop_passwd(\LDAP\Connection $ldap, string $user = "", string $old_password = "", string $new_password = "", ?array &$controls = null)
{
error_clear_last();
$safeResult = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}










function ldap_exop_whoami(\LDAP\Connection $ldap)
{
error_clear_last();
$safeResult = \ldap_exop_whoami($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}




















function ldap_exop(\LDAP\Connection $ldap, string $reqoid, ?string $reqdata = null, ?array $serverctrls = null, ?string &$retdata = null, ?string &$retoid = null)
{
error_clear_last();
if ($retoid !== null) {
$safeResult = \ldap_exop($ldap, $reqoid, $reqdata, $serverctrls, $retdata, $retoid);
} elseif ($retdata !== null) {
$safeResult = \ldap_exop($ldap, $reqoid, $reqdata, $serverctrls, $retdata);
} elseif ($serverctrls !== null) {
$safeResult = \ldap_exop($ldap, $reqoid, $reqdata, $serverctrls);
} elseif ($reqdata !== null) {
$safeResult = \ldap_exop($ldap, $reqoid, $reqdata);
} else {
$safeResult = \ldap_exop($ldap, $reqoid);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



















function ldap_explode_dn(string $dn, int $with_attrib): array
{
error_clear_last();
$safeResult = \ldap_explode_dn($dn, $with_attrib);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
















function ldap_first_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_first_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_first_entry(\LDAP\Connection $ldap, \LDAP\Result $result): \LDAP\ResultEntry
{
error_clear_last();
$safeResult = \ldap_first_entry($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}















function ldap_free_result(\LDAP\Result $result): void
{
error_clear_last();
$safeResult = \ldap_free_result($result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
























function ldap_get_attributes(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): array
{
error_clear_last();
$safeResult = \ldap_get_attributes($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_get_dn(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_get_dn($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}























function ldap_get_entries(\LDAP\Connection $ldap, \LDAP\Result $result): array
{
error_clear_last();
$safeResult = \ldap_get_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































function ldap_get_option(\LDAP\Connection $ldap, int $option, &$value = null): void
{
error_clear_last();
$safeResult = \ldap_get_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















function ldap_get_values_len(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values_len($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



































function ldap_get_values(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}













function ldap_mod_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}














function ldap_mod_del(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_del($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_del($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}













function ldap_mod_replace(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}























































































function ldap_modify_batch(\LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
} else {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_next_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_next_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_parse_exop(\LDAP\Connection $ldap, \LDAP\Result $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
$safeResult = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















function ldap_parse_result(\LDAP\Connection $ldap, \LDAP\Result $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
$safeResult = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_rename(\LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
} else {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_sasl_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): void
{
error_clear_last();
if ($props !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
} elseif ($authz_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
} elseif ($authc_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
} elseif ($realm !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
} elseif ($mech !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech);
} elseif ($password !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn);
} else {
$safeResult = \ldap_sasl_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















































































































































































function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
$safeResult = \ldap_set_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}









function ldap_unbind(\LDAP\Connection $ldap): void
{
error_clear_last();
$safeResult = \ldap_unbind($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlrpcException;









function xmlrpc_set_type(&$value, string $type): void
{
error_clear_last();
$safeResult = \xmlrpc_set_type($value, $type);
if ($safeResult === false) {
throw XmlrpcException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SqlsrvException;















function sqlsrv_begin_transaction($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_begin_transaction($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}














function sqlsrv_cancel($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_cancel($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}







































function sqlsrv_client_info($conn): array
{
error_clear_last();
$safeResult = \sqlsrv_client_info($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}









function sqlsrv_close($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_close($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
















function sqlsrv_commit($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_commit($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}












































function sqlsrv_configure(string $setting, $value): void
{
error_clear_last();
$safeResult = \sqlsrv_configure($setting, $value);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}











function sqlsrv_execute($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_execute($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}





























function sqlsrv_fetch_array($stmt, ?int $fetchType = null, ?int $row = null, ?int $offset = null): ?array
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row);
} elseif ($fetchType !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType);
} else {
$safeResult = \sqlsrv_fetch_array($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}


































function sqlsrv_fetch_object($stmt, ?string $className = null, ?array $ctorParams = null, ?int $row = null, ?int $offset = null): ?object
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row);
} elseif ($ctorParams !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams);
} elseif ($className !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className);
} else {
$safeResult = \sqlsrv_fetch_object($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}




























function sqlsrv_fetch($stmt, ?int $row = null, ?int $offset = null): ?bool
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row);
} else {
$safeResult = \sqlsrv_fetch($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}















function sqlsrv_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_free_stmt($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}




















function sqlsrv_get_field($stmt, int $fieldIndex, ?int $getAsType = null)
{
error_clear_last();
if ($getAsType !== null) {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex, $getAsType);
} else {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_next_result($stmt): ?bool
{
error_clear_last();
$safeResult = \sqlsrv_next_result($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_num_fields($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_fields($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}



















function sqlsrv_num_rows($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_rows($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}























function sqlsrv_prepare($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_prepare($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}






















function sqlsrv_query($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_query($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}










function sqlsrv_rollback($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_rollback($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ShmopException;









function shmop_delete(\Shmop $shmop): void
{
error_clear_last();
$safeResult = \shmop_delete($shmop);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
}














function shmop_read(\Shmop $shmop, int $offset, int $size): string
{
error_clear_last();
$safeResult = \shmop_read($shmop, $offset, $size);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DirException;









function chdir(string $directory): void
{
error_clear_last();
$safeResult = \chdir($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}


















function chroot(string $directory): void
{
error_clear_last();
$safeResult = \chroot($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}













function dir(string $directory, $context = null): \Directory
{
error_clear_last();
if ($context !== null) {
$safeResult = \dir($directory, $context);
} else {
$safeResult = \dir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function getcwd(): string
{
error_clear_last();
$safeResult = \getcwd();
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \opendir($directory, $context);
} else {
$safeResult = \opendir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}





















function scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \scandir($directory, $sorting_order, $context);
} else {
$safeResult = \scandir($directory, $sorting_order);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GettextException;













function bindtextdomain(string $domain, string $directory): string
{
error_clear_last();
$safeResult = \bindtextdomain($domain, $directory);
if ($safeResult === false) {
throw GettextException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StreamException;










function stream_context_set_params($context, array $params): void
{
error_clear_last();
$safeResult = \stream_context_set_params($context, $params);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int
{
error_clear_last();
if ($offset !== 0) {
$safeResult = \stream_copy_to_stream($from, $to, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_copy_to_stream($from, $to, $length);
} else {
$safeResult = \stream_copy_to_stream($from, $to);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

































function stream_filter_append($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_append($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}


































function stream_filter_prepend($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_prepend($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
$safeResult = \stream_filter_register($filter_name, $class);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}













function stream_filter_remove($stream_filter): void
{
error_clear_last();
$safeResult = \stream_filter_remove($stream_filter);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_get_contents($handle, int $maxlength = -1, int $offset = -1): string
{
error_clear_last();
$safeResult = \stream_get_contents($handle, $maxlength, $offset);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}



























function stream_get_line($handle, int $length, string $ending = ""): string
{
error_clear_last();
$safeResult = \stream_get_line($handle, $length, $ending);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}










function stream_isatty($stream): void
{
error_clear_last();
$safeResult = \stream_isatty($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_resolve_include_path(string $filename): string
{
error_clear_last();
$safeResult = \stream_resolve_include_path($filename);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
$safeResult = \stream_set_blocking($stream, $enable);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}

















function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
{
error_clear_last();
$safeResult = \stream_set_timeout($stream, $seconds, $microseconds);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_socket_accept($server_socket, ?float $timeout = null, ?string &$peername = null)
{
error_clear_last();
if ($peername !== null) {
$safeResult = \stream_socket_accept($server_socket, $timeout, $peername);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_accept($server_socket, $timeout);
} else {
$safeResult = \stream_socket_accept($server_socket);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}



















































function stream_socket_client(string $remote_socket, ?int &$errno = null, ?string &$errstr = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_client($remote_socket, $errno, $errstr, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
$safeResult = \stream_socket_client($remote_socket, $errno, $errstr, $timeout, $flags);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_client($remote_socket, $errno, $errstr, $timeout);
} else {
$safeResult = \stream_socket_client($remote_socket, $errno, $errstr);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_socket_pair(int $domain, int $type, int $protocol): array
{
error_clear_last();
$safeResult = \stream_socket_pair($domain, $type, $protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












































function stream_socket_server(string $local_socket, ?int &$errno = null, ?string &$errstr = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_server($local_socket, $errno, $errstr, $flags, $context);
} else {
$safeResult = \stream_socket_server($local_socket, $errno, $errstr, $flags);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}















function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
$safeResult = \stream_socket_shutdown($stream, $mode);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_supports_lock($stream): void
{
error_clear_last();
$safeResult = \stream_supports_lock($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
















function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
$safeResult = \stream_wrapper_register($protocol, $class, $flags);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_wrapper_restore(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_restore($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}












function stream_wrapper_unregister(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_unregister($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ComException;











function com_create_guid(): string
{
error_clear_last();
$safeResult = \com_create_guid();
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
























function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
if ($sink_interface !== null) {
$safeResult = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
$safeResult = \com_event_sink($variant, $sink_object);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}






















































function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
$safeResult = \com_load_typelib($typelib, $case_insensitive);
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}

















function com_print_typeinfo(object $variant, ?string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
if ($display_sink !== false) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
} elseif ($dispatch_interface !== null) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface);
} else {
$safeResult = \com_print_typeinfo($variant);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}












function variant_date_to_timestamp(object $variant): int
{
error_clear_last();
$safeResult = \variant_date_to_timestamp($variant);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}












function variant_round($value, int $decimals)
{
error_clear_last();
$safeResult = \variant_round($value, $decimals);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FtpException;












function ftp_alloc(\FTP\Connection $ftp, int $size, ?string &$response = null): void
{
error_clear_last();
$safeResult = \ftp_alloc($ftp, $size, $response);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_append(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
$safeResult = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}









function ftp_cdup(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_cdup($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_chdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_chdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}













function ftp_chmod(\FTP\Connection $ftp, int $permissions, string $filename): int
{
error_clear_last();
$safeResult = \ftp_chmod($ftp, $permissions, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_close(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_close($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}


















function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_delete(\FTP\Connection $ftp, string $filename): void
{
error_clear_last();
$safeResult = \ftp_delete($ftp, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fget(\FTP\Connection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fput(\FTP\Connection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_login(\FTP\Connection $ftp, string $username, string $password): void
{
error_clear_last();
$safeResult = \ftp_login($ftp, $username, $password);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_mkdir(\FTP\Connection $ftp, string $directory): string
{
error_clear_last();
$safeResult = \ftp_mkdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_mlsd(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_mlsd($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}




















function ftp_nb_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}














function ftp_nlist(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_nlist($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
















function ftp_pasv(\FTP\Connection $ftp, bool $enable): void
{
error_clear_last();
$safeResult = \ftp_pasv($ftp, $enable);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}














function ftp_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_pwd(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_pwd($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}












function ftp_rename(\FTP\Connection $ftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ftp_rename($ftp, $from, $to);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_rmdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_rmdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}
















function ftp_site(\FTP\Connection $ftp, string $command): void
{
error_clear_last();
$safeResult = \ftp_site($ftp, $command);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_size(\FTP\Connection $ftp, string $filename): int
{
error_clear_last();
$safeResult = \ftp_size($ftp, $filename);
if ($safeResult === -1) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}























function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_ssl_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_systype(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_systype($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;


return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
RenameFunctionRector::class,
[ 'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_request_headers' => 'Safe\apache_request_headers',
'apache_response_headers' => 'Safe\apache_response_headers',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
'apcu_cas' => 'Safe\apcu_cas',
'apcu_dec' => 'Safe\apcu_dec',
'apcu_fetch' => 'Safe\apcu_fetch',
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'array_combine' => 'Safe\array_combine',
'array_flip' => 'Safe\array_flip',
'array_replace' => 'Safe\array_replace',
'array_replace_recursive' => 'Safe\array_replace_recursive',
'array_walk_recursive' => 'Safe\array_walk_recursive',
'assert_options' => 'Safe\assert_options',
'base64_decode' => 'Safe\base64_decode',
'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzopen' => 'Safe\bzopen',
'bzread' => 'Safe\bzread',
'bzwrite' => 'Safe\bzwrite',
'chdir' => 'Safe\chdir',
'chgrp' => 'Safe\chgrp',
'chmod' => 'Safe\chmod',
'chown' => 'Safe\chown',
'chroot' => 'Safe\chroot',
'class_alias' => 'Safe\class_alias',
'class_implements' => 'Safe\class_implements',
'class_parents' => 'Safe\class_parents',
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'closelog' => 'Safe\closelog',
'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
'copy' => 'Safe\copy',
'cubrid_bind' => 'Safe\cubrid_bind',
'cubrid_column_names' => 'Safe\cubrid_column_names',
'cubrid_column_types' => 'Safe\cubrid_column_types',
'cubrid_col_size' => 'Safe\cubrid_col_size',
'cubrid_commit' => 'Safe\cubrid_commit',
'cubrid_connect' => 'Safe\cubrid_connect',
'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
'cubrid_current_oid' => 'Safe\cubrid_current_oid',
'cubrid_disconnect' => 'Safe\cubrid_disconnect',
'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
'cubrid_lob_close' => 'Safe\cubrid_lob_close',
'cubrid_lob_export' => 'Safe\cubrid_lob_export',
'cubrid_lob_get' => 'Safe\cubrid_lob_get',
'cubrid_lob_send' => 'Safe\cubrid_lob_send',
'cubrid_lob_size' => 'Safe\cubrid_lob_size',
'cubrid_lock_read' => 'Safe\cubrid_lock_read',
'cubrid_lock_write' => 'Safe\cubrid_lock_write',
'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
'cubrid_next_result' => 'Safe\cubrid_next_result',
'cubrid_pconnect' => 'Safe\cubrid_pconnect',
'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
'cubrid_prepare' => 'Safe\cubrid_prepare',
'cubrid_put' => 'Safe\cubrid_put',
'cubrid_rollback' => 'Safe\cubrid_rollback',
'cubrid_schema' => 'Safe\cubrid_schema',
'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
'cubrid_seq_put' => 'Safe\cubrid_seq_put',
'cubrid_set_add' => 'Safe\cubrid_set_add',
'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
'cubrid_set_drop' => 'Safe\cubrid_set_drop',
'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_init' => 'Safe\curl_multi_init',
'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_errno' => 'Safe\curl_share_errno',
'curl_share_setopt' => 'Safe\curl_share_setopt',
'curl_unescape' => 'Safe\curl_unescape',
'date' => 'Safe\date',
'date_parse' => 'Safe\date_parse',
'date_parse_from_format' => 'Safe\date_parse_from_format',
'date_sunrise' => 'Safe\date_sunrise',
'date_sunset' => 'Safe\date_sunset',
'date_sun_info' => 'Safe\date_sun_info',
'db2_autocommit' => 'Safe\db2_autocommit',
'db2_bind_param' => 'Safe\db2_bind_param',
'db2_client_info' => 'Safe\db2_client_info',
'db2_close' => 'Safe\db2_close',
'db2_commit' => 'Safe\db2_commit',
'db2_execute' => 'Safe\db2_execute',
'db2_free_result' => 'Safe\db2_free_result',
'db2_free_stmt' => 'Safe\db2_free_stmt',
'db2_get_option' => 'Safe\db2_get_option',
'db2_pclose' => 'Safe\db2_pclose',
'db2_rollback' => 'Safe\db2_rollback',
'db2_server_info' => 'Safe\db2_server_info',
'db2_set_option' => 'Safe\db2_set_option',
'define' => 'Safe\define',
'deflate_add' => 'Safe\deflate_add',
'deflate_init' => 'Safe\deflate_init',
'dir' => 'Safe\dir',
'disk_free_space' => 'Safe\disk_free_space',
'disk_total_space' => 'Safe\disk_total_space',
'dl' => 'Safe\dl',
'dns_get_record' => 'Safe\dns_get_record',
'eio_busy' => 'Safe\eio_busy',
'eio_chmod' => 'Safe\eio_chmod',
'eio_chown' => 'Safe\eio_chown',
'eio_close' => 'Safe\eio_close',
'eio_custom' => 'Safe\eio_custom',
'eio_dup2' => 'Safe\eio_dup2',
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
'eio_fsync' => 'Safe\eio_fsync',
'eio_ftruncate' => 'Safe\eio_ftruncate',
'eio_futime' => 'Safe\eio_futime',
'eio_grp' => 'Safe\eio_grp',
'eio_lstat' => 'Safe\eio_lstat',
'eio_mkdir' => 'Safe\eio_mkdir',
'eio_mknod' => 'Safe\eio_mknod',
'eio_nop' => 'Safe\eio_nop',
'eio_readahead' => 'Safe\eio_readahead',
'eio_readdir' => 'Safe\eio_readdir',
'eio_readlink' => 'Safe\eio_readlink',
'eio_rename' => 'Safe\eio_rename',
'eio_rmdir' => 'Safe\eio_rmdir',
'eio_seek' => 'Safe\eio_seek',
'eio_sendfile' => 'Safe\eio_sendfile',
'eio_stat' => 'Safe\eio_stat',
'eio_statvfs' => 'Safe\eio_statvfs',
'eio_symlink' => 'Safe\eio_symlink',
'eio_sync' => 'Safe\eio_sync',
'eio_syncfs' => 'Safe\eio_syncfs',
'eio_sync_file_range' => 'Safe\eio_sync_file_range',
'eio_truncate' => 'Safe\eio_truncate',
'eio_unlink' => 'Safe\eio_unlink',
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'filetype' => 'Safe\filetype',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
'filter_input_array' => 'Safe\filter_input_array',
'filter_var_array' => 'Safe\filter_var_array',
'finfo_close' => 'Safe\finfo_close',
'finfo_open' => 'Safe\finfo_open',
'flock' => 'Safe\flock',
'fopen' => 'Safe\fopen',
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
'fstat' => 'Safe\fstat',
'fsync' => 'Safe\fsync',
'ftell' => 'Safe\ftell',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
'ftp_chdir' => 'Safe\ftp_chdir',
'ftp_chmod' => 'Safe\ftp_chmod',
'ftp_close' => 'Safe\ftp_close',
'ftp_connect' => 'Safe\ftp_connect',
'ftp_delete' => 'Safe\ftp_delete',
'ftp_fget' => 'Safe\ftp_fget',
'ftp_fput' => 'Safe\ftp_fput',
'ftp_get' => 'Safe\ftp_get',
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
'ftp_size' => 'Safe\ftp_size',
'ftp_ssl_connect' => 'Safe\ftp_ssl_connect',
'ftp_systype' => 'Safe\ftp_systype',
'ftruncate' => 'Safe\ftruncate',
'fwrite' => 'Safe\fwrite',
'getallheaders' => 'Safe\getallheaders',
'getcwd' => 'Safe\getcwd',
'gethostname' => 'Safe\gethostname',
'getimagesize' => 'Safe\getimagesize',
'getlastmod' => 'Safe\getlastmod',
'getmygid' => 'Safe\getmygid',
'getmyinode' => 'Safe\getmyinode',
'getmypid' => 'Safe\getmypid',
'getmyuid' => 'Safe\getmyuid',
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
'getrusage' => 'Safe\getrusage',
'getservbyport' => 'Safe\getservbyport',
'get_cfg_var' => 'Safe\get_cfg_var',
'get_headers' => 'Safe\get_headers',
'get_include_path' => 'Safe\get_include_path',
'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
'gmmktime' => 'Safe\gmmktime',
'gmp_random_seed' => 'Safe\gmp_random_seed',
'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
'gzcompress' => 'Safe\gzcompress',
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzinflate' => 'Safe\gzinflate',
'gzopen' => 'Safe\gzopen',
'gzpassthru' => 'Safe\gzpassthru',
'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gztell' => 'Safe\gztell',
'gzuncompress' => 'Safe\gzuncompress',
'gzwrite' => 'Safe\gzwrite',
'hash_hkdf' => 'Safe\hash_hkdf',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'highlight_string' => 'Safe\highlight_string',
'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
'ibase_blob_create' => 'Safe\ibase_blob_create',
'ibase_blob_get' => 'Safe\ibase_blob_get',
'ibase_close' => 'Safe\ibase_close',
'ibase_commit' => 'Safe\ibase_commit',
'ibase_commit_ret' => 'Safe\ibase_commit_ret',
'ibase_connect' => 'Safe\ibase_connect',
'ibase_delete_user' => 'Safe\ibase_delete_user',
'ibase_drop_db' => 'Safe\ibase_drop_db',
'ibase_free_event_handler' => 'Safe\ibase_free_event_handler',
'ibase_free_query' => 'Safe\ibase_free_query',
'ibase_free_result' => 'Safe\ibase_free_result',
'ibase_maintain_db' => 'Safe\ibase_maintain_db',
'ibase_modify_user' => 'Safe\ibase_modify_user',
'ibase_name_result' => 'Safe\ibase_name_result',
'ibase_pconnect' => 'Safe\ibase_pconnect',
'ibase_restore' => 'Safe\ibase_restore',
'ibase_rollback' => 'Safe\ibase_rollback',
'ibase_rollback_ret' => 'Safe\ibase_rollback_ret',
'ibase_service_attach' => 'Safe\ibase_service_attach',
'ibase_service_detach' => 'Safe\ibase_service_detach',
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_mime_decode' => 'Safe\iconv_mime_decode',
'iconv_mime_encode' => 'Safe\iconv_mime_encode',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
'iconv_strlen' => 'Safe\iconv_strlen',
'idate' => 'Safe\idate',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
'imageaffinematrixget' => 'Safe\imageaffinematrixget',
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
'imagecolorset' => 'Safe\imagecolorset',
'imagecolorsforindex' => 'Safe\imagecolorsforindex',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
'imagecopymergegray' => 'Safe\imagecopymergegray',
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
'imagecreatefromgd2part' => 'Safe\imagecreatefromgd2part',
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
'imagecreatefromstring' => 'Safe\imagecreatefromstring',
'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
'imagecreatefromxpm' => 'Safe\imagecreatefromxpm',
'imagecreatetruecolor' => 'Safe\imagecreatetruecolor',
'imagecrop' => 'Safe\imagecrop',
'imagecropauto' => 'Safe\imagecropauto',
'imagedashedline' => 'Safe\imagedashedline',
'imagedestroy' => 'Safe\imagedestroy',
'imageellipse' => 'Safe\imageellipse',
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
'imageftbbox' => 'Safe\imageftbbox',
'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
'imagegif' => 'Safe\imagegif',
'imagegrabscreen' => 'Safe\imagegrabscreen',
'imagegrabwindow' => 'Safe\imagegrabwindow',
'imagejpeg' => 'Safe\imagejpeg',
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
'imagepng' => 'Safe\imagepng',
'imagerectangle' => 'Safe\imagerectangle',
'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
'imagesetbrush' => 'Safe\imagesetbrush',
'imagesetclip' => 'Safe\imagesetclip',
'imagesetinterpolation' => 'Safe\imagesetinterpolation',
'imagesetpixel' => 'Safe\imagesetpixel',
'imagesetstyle' => 'Safe\imagesetstyle',
'imagesetthickness' => 'Safe\imagesetthickness',
'imagesettile' => 'Safe\imagesettile',
'imagestring' => 'Safe\imagestring',
'imagestringup' => 'Safe\imagestringup',
'imagesx' => 'Safe\imagesx',
'imagesy' => 'Safe\imagesy',
'imagetruecolortopalette' => 'Safe\imagetruecolortopalette',
'imagettfbbox' => 'Safe\imagettfbbox',
'imagettftext' => 'Safe\imagettftext',
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
'image_type_to_extension' => 'Safe\image_type_to_extension',
'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
'imap_base64' => 'Safe\imap_base64',
'imap_binary' => 'Safe\imap_binary',
'imap_body' => 'Safe\imap_body',
'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_clearflag_full' => 'Safe\imap_clearflag_full',
'imap_close' => 'Safe\imap_close',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
'imap_fetchbody' => 'Safe\imap_fetchbody',
'imap_fetchheader' => 'Safe\imap_fetchheader',
'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_gc' => 'Safe\imap_gc',
'imap_getacl' => 'Safe\imap_getacl',
'imap_getmailboxes' => 'Safe\imap_getmailboxes',
'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
'imap_headers' => 'Safe\imap_headers',
'imap_listscan' => 'Safe\imap_listscan',
'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mailboxmsginfo' => 'Safe\imap_mailboxmsginfo',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_setflag_full' => 'Safe\imap_setflag_full',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
'imap_undelete' => 'Safe\imap_undelete',
'imap_unsubscribe' => 'Safe\imap_unsubscribe',
'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7',
'inet_ntop' => 'Safe\inet_ntop',
'inet_pton' => 'Safe\inet_pton',
'inflate_add' => 'Safe\inflate_add',
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_get_status' => 'Safe\inflate_get_status',
'inflate_init' => 'Safe\inflate_init',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
'ldap_bind' => 'Safe\ldap_bind',
'ldap_compare' => 'Safe\ldap_compare',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
'ldap_explode_dn' => 'Safe\ldap_explode_dn',
'ldap_first_attribute' => 'Safe\ldap_first_attribute',
'ldap_first_entry' => 'Safe\ldap_first_entry',
'ldap_free_result' => 'Safe\ldap_free_result',
'ldap_get_attributes' => 'Safe\ldap_get_attributes',
'ldap_get_dn' => 'Safe\ldap_get_dn',
'ldap_get_entries' => 'Safe\ldap_get_entries',
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
'ldap_mod_del' => 'Safe\ldap_mod_del',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
'ldap_rename' => 'Safe\ldap_rename',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
'long2ip' => 'Safe\long2ip',
'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
'mailparse_msg_free' => 'Safe\mailparse_msg_free',
'mailparse_msg_parse' => 'Safe\mailparse_msg_parse',
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_encoding_aliases' => 'Safe\mb_encoding_aliases',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
'mb_ereg_replace' => 'Safe\mb_ereg_replace',
'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback',
'mb_ereg_search_getregs' => 'Safe\mb_ereg_search_getregs',
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
'mb_parse_str' => 'Safe\mb_parse_str',
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
'md5_file' => 'Safe\md5_file',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'mktime' => 'Safe\mktime',
'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysqli_get_client_stats' => 'Safe\mysqli_get_client_stats',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
'mysql_data_seek' => 'Safe\mysql_data_seek',
'mysql_db_name' => 'Safe\mysql_db_name',
'mysql_db_query' => 'Safe\mysql_db_query',
'mysql_drop_db' => 'Safe\mysql_drop_db',
'mysql_fetch_lengths' => 'Safe\mysql_fetch_lengths',
'mysql_field_flags' => 'Safe\mysql_field_flags',
'mysql_field_len' => 'Safe\mysql_field_len',
'mysql_field_name' => 'Safe\mysql_field_name',
'mysql_field_seek' => 'Safe\mysql_field_seek',
'mysql_free_result' => 'Safe\mysql_free_result',
'mysql_get_host_info' => 'Safe\mysql_get_host_info',
'mysql_get_proto_info' => 'Safe\mysql_get_proto_info',
'mysql_get_server_info' => 'Safe\mysql_get_server_info',
'mysql_info' => 'Safe\mysql_info',
'mysql_list_dbs' => 'Safe\mysql_list_dbs',
'mysql_list_fields' => 'Safe\mysql_list_fields',
'mysql_list_processes' => 'Safe\mysql_list_processes',
'mysql_list_tables' => 'Safe\mysql_list_tables',
'mysql_num_fields' => 'Safe\mysql_num_fields',
'mysql_num_rows' => 'Safe\mysql_num_rows',
'mysql_query' => 'Safe\mysql_query',
'mysql_real_escape_string' => 'Safe\mysql_real_escape_string',
'mysql_result' => 'Safe\mysql_result',
'mysql_select_db' => 'Safe\mysql_select_db',
'mysql_set_charset' => 'Safe\mysql_set_charset',
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
'ob_flush' => 'Safe\ob_flush',
'ob_get_clean' => 'Safe\ob_get_clean',
'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
'oci_field_size' => 'Safe\oci_field_size',
'oci_field_type' => 'Safe\oci_field_type',
'oci_field_type_raw' => 'Safe\oci_field_type_raw',
'oci_free_descriptor' => 'Safe\oci_free_descriptor',
'oci_free_statement' => 'Safe\oci_free_statement',
'oci_new_collection' => 'Safe\oci_new_collection',
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
'oci_set_action' => 'Safe\oci_set_action',
'oci_set_call_timeout' => 'Safe\oci_set_call_timeout',
'oci_set_client_identifier' => 'Safe\oci_set_client_identifier',
'oci_set_client_info' => 'Safe\oci_set_client_info',
'oci_set_db_operation' => 'Safe\oci_set_db_operation',
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
'odbc_binmode' => 'Safe\odbc_binmode',
'odbc_columnprivileges' => 'Safe\odbc_columnprivileges',
'odbc_columns' => 'Safe\odbc_columns',
'odbc_commit' => 'Safe\odbc_commit',
'odbc_connect' => 'Safe\odbc_connect',
'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
'odbc_fetch_into' => 'Safe\odbc_fetch_into',
'odbc_field_len' => 'Safe\odbc_field_len',
'odbc_field_name' => 'Safe\odbc_field_name',
'odbc_field_num' => 'Safe\odbc_field_num',
'odbc_field_scale' => 'Safe\odbc_field_scale',
'odbc_field_type' => 'Safe\odbc_field_type',
'odbc_foreignkeys' => 'Safe\odbc_foreignkeys',
'odbc_gettypeinfo' => 'Safe\odbc_gettypeinfo',
'odbc_longreadlen' => 'Safe\odbc_longreadlen',
'odbc_num_fields' => 'Safe\odbc_num_fields',
'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_primarykeys' => 'Safe\odbc_primarykeys',
'odbc_procedurecolumns' => 'Safe\odbc_procedurecolumns',
'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
'odbc_setoption' => 'Safe\odbc_setoption',
'odbc_specialcolumns' => 'Safe\odbc_specialcolumns',
'odbc_statistics' => 'Safe\odbc_statistics',
'odbc_tableprivileges' => 'Safe\odbc_tableprivileges',
'odbc_tables' => 'Safe\odbc_tables',
'opcache_compile_file' => 'Safe\opcache_compile_file',
'opcache_get_status' => 'Safe\opcache_get_status',
'opendir' => 'Safe\opendir',
'openlog' => 'Safe\openlog',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
'openssl_cms_read' => 'Safe\openssl_cms_read',
'openssl_cms_sign' => 'Safe\openssl_cms_sign',
'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
'openssl_decrypt' => 'Safe\openssl_decrypt',
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt' => 'Safe\openssl_pkcs7_encrypt',
'openssl_pkcs7_read' => 'Safe\openssl_pkcs7_read',
'openssl_pkcs7_sign' => 'Safe\openssl_pkcs7_sign',
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
'openssl_pkey_get_public' => 'Safe\openssl_pkey_get_public',
'openssl_pkey_new' => 'Safe\openssl_pkey_new',
'openssl_private_decrypt' => 'Safe\openssl_private_decrypt',
'openssl_private_encrypt' => 'Safe\openssl_private_encrypt',
'openssl_public_decrypt' => 'Safe\openssl_public_decrypt',
'openssl_public_encrypt' => 'Safe\openssl_public_encrypt',
'openssl_random_pseudo_bytes' => 'Safe\openssl_random_pseudo_bytes',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
'openssl_spki_export' => 'Safe\openssl_spki_export',
'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
'openssl_spki_new' => 'Safe\openssl_spki_new',
'openssl_spki_verify' => 'Safe\openssl_spki_verify',
'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_checkpurpose' => 'Safe\openssl_x509_checkpurpose',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
'openssl_x509_read' => 'Safe\openssl_x509_read',
'output_add_rewrite_var' => 'Safe\output_add_rewrite_var',
'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars',
'pack' => 'Safe\pack',
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
'pclose' => 'Safe\pclose',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
'pg_field_num' => 'Safe\pg_field_num',
'pg_field_table' => 'Safe\pg_field_table',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
'pg_query_params' => 'Safe\pg_query_params',
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
'pg_update' => 'Safe\pg_update',
'phpcredits' => 'Safe\phpcredits',
'phpinfo' => 'Safe\phpinfo',
'php_sapi_name' => 'Safe\php_sapi_name',
'popen' => 'Safe\popen',
'posix_access' => 'Safe\posix_access',
'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
'posix_getgroups' => 'Safe\posix_getgroups',
'posix_getlogin' => 'Safe\posix_getlogin',
'posix_getpgid' => 'Safe\posix_getpgid',
'posix_getpwuid' => 'Safe\posix_getpwuid',
'posix_getrlimit' => 'Safe\posix_getrlimit',
'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
'posix_mknod' => 'Safe\posix_mknod',
'posix_setegid' => 'Safe\posix_setegid',
'posix_seteuid' => 'Safe\posix_seteuid',
'posix_setgid' => 'Safe\posix_setgid',
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setsid' => 'Safe\posix_setsid',
'posix_setuid' => 'Safe\posix_setuid',
'posix_times' => 'Safe\posix_times',
'posix_uname' => 'Safe\posix_uname',
'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_replace_callback' => 'Safe\preg_replace_callback',
'preg_replace_callback_array' => 'Safe\preg_replace_callback_array',
'preg_split' => 'Safe\preg_split',
'proc_close' => 'Safe\proc_close',
'proc_nice' => 'Safe\proc_nice',
'proc_open' => 'Safe\proc_open',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
'pspell_clear_session' => 'Safe\pspell_clear_session',
'pspell_config_create' => 'Safe\pspell_config_create',
'pspell_config_data_dir' => 'Safe\pspell_config_data_dir',
'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir',
'pspell_config_ignore' => 'Safe\pspell_config_ignore',
'pspell_config_mode' => 'Safe\pspell_config_mode',
'pspell_config_personal' => 'Safe\pspell_config_personal',
'pspell_config_repl' => 'Safe\pspell_config_repl',
'pspell_config_runtogether' => 'Safe\pspell_config_runtogether',
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
'ps_add_locallink' => 'Safe\ps_add_locallink',
'ps_add_note' => 'Safe\ps_add_note',
'ps_add_pdflink' => 'Safe\ps_add_pdflink',
'ps_add_weblink' => 'Safe\ps_add_weblink',
'ps_arc' => 'Safe\ps_arc',
'ps_arcn' => 'Safe\ps_arcn',
'ps_begin_page' => 'Safe\ps_begin_page',
'ps_begin_pattern' => 'Safe\ps_begin_pattern',
'ps_begin_template' => 'Safe\ps_begin_template',
'ps_circle' => 'Safe\ps_circle',
'ps_clip' => 'Safe\ps_clip',
'ps_close' => 'Safe\ps_close',
'ps_closepath' => 'Safe\ps_closepath',
'ps_closepath_stroke' => 'Safe\ps_closepath_stroke',
'ps_close_image' => 'Safe\ps_close_image',
'ps_continue_text' => 'Safe\ps_continue_text',
'ps_curveto' => 'Safe\ps_curveto',
'ps_delete' => 'Safe\ps_delete',
'ps_end_page' => 'Safe\ps_end_page',
'ps_end_pattern' => 'Safe\ps_end_pattern',
'ps_end_template' => 'Safe\ps_end_template',
'ps_fill' => 'Safe\ps_fill',
'ps_fill_stroke' => 'Safe\ps_fill_stroke',
'ps_get_parameter' => 'Safe\ps_get_parameter',
'ps_hyphenate' => 'Safe\ps_hyphenate',
'ps_include_file' => 'Safe\ps_include_file',
'ps_lineto' => 'Safe\ps_lineto',
'ps_moveto' => 'Safe\ps_moveto',
'ps_new' => 'Safe\ps_new',
'ps_open_file' => 'Safe\ps_open_file',
'ps_place_image' => 'Safe\ps_place_image',
'ps_rect' => 'Safe\ps_rect',
'ps_restore' => 'Safe\ps_restore',
'ps_rotate' => 'Safe\ps_rotate',
'ps_save' => 'Safe\ps_save',
'ps_scale' => 'Safe\ps_scale',
'ps_setcolor' => 'Safe\ps_setcolor',
'ps_setdash' => 'Safe\ps_setdash',
'ps_setflat' => 'Safe\ps_setflat',
'ps_setfont' => 'Safe\ps_setfont',
'ps_setgray' => 'Safe\ps_setgray',
'ps_setlinecap' => 'Safe\ps_setlinecap',
'ps_setlinejoin' => 'Safe\ps_setlinejoin',
'ps_setlinewidth' => 'Safe\ps_setlinewidth',
'ps_setmiterlimit' => 'Safe\ps_setmiterlimit',
'ps_setoverprintmode' => 'Safe\ps_setoverprintmode',
'ps_setpolydash' => 'Safe\ps_setpolydash',
'ps_set_border_color' => 'Safe\ps_set_border_color',
'ps_set_border_dash' => 'Safe\ps_set_border_dash',
'ps_set_border_style' => 'Safe\ps_set_border_style',
'ps_set_info' => 'Safe\ps_set_info',
'ps_set_parameter' => 'Safe\ps_set_parameter',
'ps_set_text_pos' => 'Safe\ps_set_text_pos',
'ps_set_value' => 'Safe\ps_set_value',
'ps_shading' => 'Safe\ps_shading',
'ps_shading_pattern' => 'Safe\ps_shading_pattern',
'ps_shfill' => 'Safe\ps_shfill',
'ps_show' => 'Safe\ps_show',
'ps_show2' => 'Safe\ps_show2',
'ps_show_xy' => 'Safe\ps_show_xy',
'ps_show_xy2' => 'Safe\ps_show_xy2',
'ps_stroke' => 'Safe\ps_stroke',
'ps_symbol' => 'Safe\ps_symbol',
'ps_translate' => 'Safe\ps_translate',
'putenv' => 'Safe\putenv',
'readfile' => 'Safe\readfile',
'readgzfile' => 'Safe\readgzfile',
'readline_add_history' => 'Safe\readline_add_history',
'readline_callback_handler_install' => 'Safe\readline_callback_handler_install',
'readline_clear_history' => 'Safe\readline_clear_history',
'readline_completion_function' => 'Safe\readline_completion_function',
'readline_read_history' => 'Safe\readline_read_history',
'readline_write_history' => 'Safe\readline_write_history',
'readlink' => 'Safe\readlink',
'realpath' => 'Safe\realpath',
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
'rmdir' => 'Safe\rmdir',
'rpmaddtag' => 'Safe\rpmaddtag',
'rrd_create' => 'Safe\rrd_create',
'rrd_first' => 'Safe\rrd_first',
'rrd_graph' => 'Safe\rrd_graph',
'rrd_info' => 'Safe\rrd_info',
'rrd_lastupdate' => 'Safe\rrd_lastupdate',
'rrd_restore' => 'Safe\rrd_restore',
'rrd_tune' => 'Safe\rrd_tune',
'rrd_update' => 'Safe\rrd_update',
'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
'sem_get' => 'Safe\sem_get',
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
'session_encode' => 'Safe\session_encode',
'session_id' => 'Safe\session_id',
'session_module_name' => 'Safe\session_module_name',
'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shmop_read' => 'Safe\shmop_read',
'shm_attach' => 'Safe\shm_attach',
'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
'shuffle' => 'Safe\shuffle',
'simplexml_import_dom' => 'Safe\simplexml_import_dom',
'simplexml_load_file' => 'Safe\simplexml_load_file',
'simplexml_load_string' => 'Safe\simplexml_load_string',
'sleep' => 'Safe\sleep',
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
'socket_create_listen' => 'Safe\socket_create_listen',
'socket_create_pair' => 'Safe\socket_create_pair',
'socket_export_stream' => 'Safe\socket_export_stream',
'socket_getpeername' => 'Safe\socket_getpeername',
'socket_getsockname' => 'Safe\socket_getsockname',
'socket_get_option' => 'Safe\socket_get_option',
'socket_import_stream' => 'Safe\socket_import_stream',
'socket_listen' => 'Safe\socket_listen',
'socket_read' => 'Safe\socket_read',
'socket_send' => 'Safe\socket_send',
'socket_sendmsg' => 'Safe\socket_sendmsg',
'socket_sendto' => 'Safe\socket_sendto',
'socket_set_block' => 'Safe\socket_set_block',
'socket_set_nonblock' => 'Safe\socket_set_nonblock',
'socket_set_option' => 'Safe\socket_set_option',
'socket_shutdown' => 'Safe\socket_shutdown',
'socket_write' => 'Safe\socket_write',
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update' => 'Safe\sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'solr_get_version' => 'Safe\solr_get_version',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
'sqlsrv_close' => 'Safe\sqlsrv_close',
'sqlsrv_commit' => 'Safe\sqlsrv_commit',
'sqlsrv_configure' => 'Safe\sqlsrv_configure',
'sqlsrv_execute' => 'Safe\sqlsrv_execute',
'sqlsrv_fetch' => 'Safe\sqlsrv_fetch',
'sqlsrv_fetch_array' => 'Safe\sqlsrv_fetch_array',
'sqlsrv_fetch_object' => 'Safe\sqlsrv_fetch_object',
'sqlsrv_free_stmt' => 'Safe\sqlsrv_free_stmt',
'sqlsrv_get_field' => 'Safe\sqlsrv_get_field',
'sqlsrv_next_result' => 'Safe\sqlsrv_next_result',
'sqlsrv_num_fields' => 'Safe\sqlsrv_num_fields',
'sqlsrv_num_rows' => 'Safe\sqlsrv_num_rows',
'sqlsrv_prepare' => 'Safe\sqlsrv_prepare',
'sqlsrv_query' => 'Safe\sqlsrv_query',
'sqlsrv_rollback' => 'Safe\sqlsrv_rollback',
'ssdeep_fuzzy_compare' => 'Safe\ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash' => 'Safe\ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename' => 'Safe\ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent' => 'Safe\ssh2_auth_agent',
'ssh2_auth_hostbased_file' => 'Safe\ssh2_auth_hostbased_file',
'ssh2_auth_password' => 'Safe\ssh2_auth_password',
'ssh2_auth_pubkey_file' => 'Safe\ssh2_auth_pubkey_file',
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
'ssh2_sftp_rename' => 'Safe\ssh2_sftp_rename',
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
'stream_filter_prepend' => 'Safe\stream_filter_prepend',
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
'stream_socket_pair' => 'Safe\stream_socket_pair',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
'swoole_event_del' => 'Safe\swoole_event_del',
'swoole_event_write' => 'Safe\swoole_event_write',
'symlink' => 'Safe\symlink',
'syslog' => 'Safe\syslog',
'system' => 'Safe\system',
'sys_getloadavg' => 'Safe\sys_getloadavg',
'tempnam' => 'Safe\tempnam',
'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr',
'time_nanosleep' => 'Safe\time_nanosleep',
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
'xdiff_file_diff_binary' => 'Safe\xdiff_file_diff_binary',
'xdiff_file_patch_binary' => 'Safe\xdiff_file_patch_binary',
'xdiff_file_rabdiff' => 'Safe\xdiff_file_rabdiff',
'xdiff_string_bpatch' => 'Safe\xdiff_string_bpatch',
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
'xml_parser_free' => 'Safe\xml_parser_free',
'xml_set_character_data_handler' => 'Safe\xml_set_character_data_handler',
'xml_set_default_handler' => 'Safe\xml_set_default_handler',
'xml_set_element_handler' => 'Safe\xml_set_element_handler',
'xml_set_end_namespace_decl_handler' => 'Safe\xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler' => 'Safe\xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler' => 'Safe\xml_set_notation_decl_handler',
'xml_set_object' => 'Safe\xml_set_object',
'xml_set_processing_instruction_handler' => 'Safe\xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler' => 'Safe\xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler' => 'Safe\xml_set_unparsed_entity_decl_handler',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
'yaz_ccl_parse' => 'Safe\yaz_ccl_parse',
'yaz_close' => 'Safe\yaz_close',
'yaz_connect' => 'Safe\yaz_connect',
'yaz_database' => 'Safe\yaz_database',
'yaz_element' => 'Safe\yaz_element',
'yaz_present' => 'Safe\yaz_present',
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
'zip_entry_filesize' => 'Safe\zip_entry_filesize',
'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
]
);
};
<?php

namespace Safe;

use Safe\Exceptions\JsonException;







































function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
$safeResult = \json_encode($value, $flags, $depth);
if ($safeResult === false) {
throw JsonException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApacheException;








function apache_get_version(): string
{
error_clear_last();
$safeResult = \apache_get_version();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}












function apache_getenv(string $variable, bool $walk_to_top = false): string
{
error_clear_last();
$safeResult = \apache_getenv($variable, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}







































function apache_lookup_uri(string $filename): object
{
error_clear_last();
$safeResult = \apache_lookup_uri($filename);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_request_headers(): array
{
error_clear_last();
$safeResult = \apache_request_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_response_headers(): array
{
error_clear_last();
$safeResult = \apache_response_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}













function apache_setenv(string $variable, string $value, bool $walk_to_top = false): void
{
error_clear_last();
$safeResult = \apache_setenv($variable, $value, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}













function getallheaders(): array
{
error_clear_last();
$safeResult = \getallheaders();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}



















function virtual(string $uri): void
{
error_clear_last();
$safeResult = \virtual($uri);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\HashException;




























function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = ""): string
{
error_clear_last();
$safeResult = \hash_hkdf($algo, $key, $length, $info, $salt);
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
return $safeResult;
}











function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
if ($stream_context !== null) {
$safeResult = \hash_update_file($context, $filename, $stream_context);
} else {
$safeResult = \hash_update_file($context, $filename);
}
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SwooleException;











function swoole_async_dns_lookup(string $hostname, callable $callback): void
{
error_clear_last();
$safeResult = \swoole_async_dns_lookup($hostname, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_readfile(string $filename, string $callback): void
{
error_clear_last();
$safeResult = \swoole_async_readfile($filename, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_write(string $filename, string $content, ?int $offset = null, ?callable $callback = null): void
{
error_clear_last();
if ($callback !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset, $callback);
} elseif ($offset !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset);
} else {
$safeResult = \swoole_async_write($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_writefile(string $filename, string $content, ?callable $callback = null, int $flags = 0): void
{
error_clear_last();
if ($flags !== 0) {
$safeResult = \swoole_async_writefile($filename, $content, $callback, $flags);
} elseif ($callback !== null) {
$safeResult = \swoole_async_writefile($filename, $content, $callback);
} else {
$safeResult = \swoole_async_writefile($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_defer(callable $callback): void
{
error_clear_last();
$safeResult = \swoole_event_defer($callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_del(int $fd): void
{
error_clear_last();
$safeResult = \swoole_event_del($fd);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}










function swoole_event_write(int $fd, string $data): void
{
error_clear_last();
$safeResult = \swoole_event_write($fd, $data);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SodiumException;















function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}














function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}


















function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
{
error_clear_last();
$safeResult = \sodium_crypto_auth_verify($mac, $message, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}










function sodium_crypto_generichash_update(string &$state, string $message): void
{
error_clear_last();
$safeResult = \sodium_crypto_generichash_update($state, $message);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_open(string $signed_message, string $public_key): string
{
error_clear_last();
$safeResult = \sodium_crypto_sign_open($signed_message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
{
error_clear_last();
$safeResult = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PspellException;









function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_personal($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_session($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}









function pspell_clear_session(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_clear_session($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



































function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int
{
error_clear_last();
$safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}












function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_data_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}












function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_dict_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
$safeResult = \pspell_config_ignore($config, $min_length);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}






























function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
$safeResult = \pspell_config_mode($config, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}

















function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_personal($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_repl($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


















function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
$safeResult = \pspell_config_runtogether($config, $allow);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
$safeResult = \pspell_config_save_repl($config, $save);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_new_config(int $config): int
{
error_clear_last();
$safeResult = \pspell_new_config($config);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}





























































function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}
































































function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}









function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_save_wordlist($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
$safeResult = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MysqliException;








function mysqli_get_client_stats(): array
{
error_clear_last();
$safeResult = \mysqli_get_client_stats();
if ($safeResult === false) {
throw MysqliException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\OutcontrolException;














function ob_clean(): void
{
error_clear_last();
$safeResult = \ob_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}

















function ob_end_clean(): void
{
error_clear_last();
$safeResult = \ob_end_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}


















function ob_end_flush(): void
{
error_clear_last();
$safeResult = \ob_end_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}















function ob_flush(): void
{
error_clear_last();
$safeResult = \ob_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function ob_get_clean(): string
{
error_clear_last();
$safeResult = \ob_get_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}

























































































function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
{
error_clear_last();
if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
$safeResult = \ob_start($callback, $chunk_size, $flags);
} elseif ($chunk_size !== 0) {
$safeResult = \ob_start($callback, $chunk_size);
} elseif ($callback !== null) {
$safeResult = \ob_start($callback);
} else {
$safeResult = \ob_start();
}
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function output_add_rewrite_var(string $name, string $value): void
{
error_clear_last();
$safeResult = \output_add_rewrite_var($name, $value);
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}










function output_reset_rewrite_vars(): void
{
error_clear_last();
$safeResult = \output_reset_rewrite_vars();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\OpcacheException;










function opcache_compile_file(string $filename): void
{
error_clear_last();
$safeResult = \opcache_compile_file($filename);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
}











function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
$safeResult = \opcache_get_status($include_scripts);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MysqlException;























function mysql_close($link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_close($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}







































function mysql_connect(?string $server = null, ?string $username = null, ?string $password = null, bool $new_link = false, int $client_flags = 0)
{
error_clear_last();
if ($client_flags !== 0) {
$safeResult = \mysql_connect($server, $username, $password, $new_link, $client_flags);
} elseif ($new_link !== false) {
$safeResult = \mysql_connect($server, $username, $password, $new_link);
} elseif ($password !== null) {
$safeResult = \mysql_connect($server, $username, $password);
} elseif ($username !== null) {
$safeResult = \mysql_connect($server, $username);
} elseif ($server !== null) {
$safeResult = \mysql_connect($server);
} else {
$safeResult = \mysql_connect();
}
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_create_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_create_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}























function mysql_data_seek($result, int $row_number): void
{
error_clear_last();
$safeResult = \mysql_data_seek($result, $row_number);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_db_name($result, int $row, $field = null): string
{
error_clear_last();
$safeResult = \mysql_db_name($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}






















function mysql_db_query(string $database, string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_db_query($database, $query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



















function mysql_drop_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_drop_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}





















function mysql_fetch_lengths($result): array
{
error_clear_last();
$safeResult = \mysql_fetch_lengths($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



























function mysql_field_flags($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_flags($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_len($result, int $field_offset): int
{
error_clear_last();
$safeResult = \mysql_field_len($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_name($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_name($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_field_seek($result, int $field_offset): void
{
error_clear_last();
$safeResult = \mysql_field_seek($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_free_result($result): void
{
error_clear_last();
$safeResult = \mysql_free_result($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_get_host_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_host_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_proto_info($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_get_proto_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_server_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_server_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_list_dbs($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_dbs($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


























function mysql_list_fields(string $database_name, string $table_name, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_fields($database_name, $table_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_list_processes($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_processes($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
























function mysql_list_tables(string $database, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_tables($database, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}













function mysql_num_fields($result): int
{
error_clear_last();
$safeResult = \mysql_num_fields($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_num_rows($result): int
{
error_clear_last();
$safeResult = \mysql_num_rows($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}









































function mysql_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_real_escape_string(string $unescaped_string, $link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_real_escape_string($unescaped_string, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_result($result, int $row, $field = 0): string
{
error_clear_last();
$safeResult = \mysql_result($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_select_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_select_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_set_charset(string $charset, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_set_charset($charset, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}




















function mysql_tablename($result, int $i): string
{
error_clear_last();
$safeResult = \mysql_tablename($result, $i);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_thread_id($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_thread_id($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


































function mysql_unbuffered_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_unbuffered_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RrdException;










function rrd_create(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_create($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}











function rrd_first(string $file, int $raaindex = 0): int
{
error_clear_last();
$safeResult = \rrd_first($file, $raaindex);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}















function rrd_graph(string $filename, array $options): array
{
error_clear_last();
$safeResult = \rrd_graph($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}










function rrd_info(string $filename): array
{
error_clear_last();
$safeResult = \rrd_info($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_lastupdate(string $filename): array
{
error_clear_last();
$safeResult = \rrd_lastupdate($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_restore(string $xml_file, string $rrd_file, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rrd_restore($xml_file, $rrd_file, $options);
} else {
$safeResult = \rrd_restore($xml_file, $rrd_file);
}
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_tune(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_tune($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_update(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_update($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_xport(array $options): array
{
error_clear_last();
$safeResult = \rrd_xport($options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ErrorfuncException;































































function error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $extra_headers = null): void
{
error_clear_last();
if ($extra_headers !== null) {
$safeResult = \error_log($message, $message_type, $destination, $extra_headers);
} elseif ($destination !== null) {
$safeResult = \error_log($message, $message_type, $destination);
} else {
$safeResult = \error_log($message, $message_type);
}
if ($safeResult === false) {
throw ErrorfuncException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbaseException;









function fbird_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \fbird_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_add_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_add_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}





























function ibase_backup($service_handle, string $source_db, string $dest_file, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_backup($service_handle, $source_db, $dest_file, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \ibase_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_blob_create($link_identifier = null)
{
error_clear_last();
if ($link_identifier !== null) {
$safeResult = \ibase_blob_create($link_identifier);
} else {
$safeResult = \ibase_blob_create();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}












function ibase_blob_get($blob_handle, int $len): string
{
error_clear_last();
$safeResult = \ibase_blob_get($blob_handle, $len);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}














function ibase_close($connection_id = null): void
{
error_clear_last();
if ($connection_id !== null) {
$safeResult = \ibase_close($connection_id);
} else {
$safeResult = \ibase_close();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}















function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}



































function ibase_connect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_connect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_connect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_connect($database);
} else {
$safeResult = \ibase_connect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_delete_user($service_handle, string $user_name): void
{
error_clear_last();
$safeResult = \ibase_delete_user($service_handle, $user_name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_drop_db($connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \ibase_drop_db($connection);
} else {
$safeResult = \ibase_drop_db();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_free_event_handler($event): void
{
error_clear_last();
$safeResult = \ibase_free_event_handler($event);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}









function ibase_free_query($query): void
{
error_clear_last();
$safeResult = \ibase_free_query($query);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










function ibase_free_result($result_identifier): void
{
error_clear_last();
$safeResult = \ibase_free_result($result_identifier);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_maintain_db($service_handle, string $db, int $action, int $argument = 0): void
{
error_clear_last();
$safeResult = \ibase_maintain_db($service_handle, $db, $action, $argument);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_modify_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_name_result($result, string $name): void
{
error_clear_last();
$safeResult = \ibase_name_result($result, $name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










































function ibase_pconnect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_pconnect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_pconnect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_pconnect($database);
} else {
$safeResult = \ibase_pconnect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}
































function ibase_restore($service_handle, string $source_file, string $dest_db, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_restore($service_handle, $source_file, $dest_db, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}















function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_service_attach(string $host, string $dba_username, string $dba_password)
{
error_clear_last();
$safeResult = \ibase_service_attach($host, $dba_username, $dba_password);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}









function ibase_service_detach($service_handle): void
{
error_clear_last();
$safeResult = \ibase_service_detach($service_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UopzException;









function uopz_extend(string $class, string $parent): void
{
error_clear_last();
$safeResult = \uopz_extend($class, $parent);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}










function uopz_implement(string $class, string $interface): void
{
error_clear_last();
$safeResult = \uopz_implement($class, $interface);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MbstringException;
















function mb_chr(int $codepoint, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_chr($codepoint, $encoding);
} else {
$safeResult = \mb_chr($codepoint);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}























function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
{
error_clear_last();
if ($from_encoding !== null) {
$safeResult = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
$safeResult = \mb_convert_encoding($string, $to_encoding);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}































function mb_detect_order($encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_detect_order($encoding);
} else {
$safeResult = \mb_detect_order();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}










function mb_encoding_aliases(string $encoding): array
{
error_clear_last();
$safeResult = \mb_encoding_aliases($encoding);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




































function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
} else {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}

















function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_getregs(): array
{
error_clear_last();
$safeResult = \mb_ereg_search_getregs();
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
















function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern);
} else {
$safeResult = \mb_ereg_search_init($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}











function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_regs($pattern);
} else {
$safeResult = \mb_ereg_search_regs();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
$safeResult = \mb_ereg_search_setpos($offset);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}















function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}





























function mb_get_info(string $type = "all")
{
error_clear_last();
$safeResult = \mb_get_info($type);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




















function mb_http_output(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_http_output($encoding);
} else {
$safeResult = \mb_http_output();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


















function mb_internal_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_internal_encoding($encoding);
} else {
$safeResult = \mb_internal_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_ord(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_ord($string, $encoding);
} else {
$safeResult = \mb_ord($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
$safeResult = \mb_parse_str($string, $result);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_regex_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_regex_encoding($encoding);
} else {
$safeResult = \mb_regex_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}



























































function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], ?string $additional_params = null): void
{
error_clear_last();
if ($additional_params !== null) {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
} else {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_split(string $pattern, string $string, int $limit = -1): array
{
error_clear_last();
$safeResult = \mb_split($pattern, $string, $limit);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GnupgException;











function gnupg_adddecryptkey($identifier, string $fingerprint, string $passphrase): void
{
error_clear_last();
$safeResult = \gnupg_adddecryptkey($identifier, $fingerprint, $passphrase);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}











function gnupg_addencryptkey($identifier, string $fingerprint): void
{
error_clear_last();
$safeResult = \gnupg_addencryptkey($identifier, $fingerprint);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_addsignkey($identifier, string $fingerprint, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint, $passphrase);
} else {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint);
}
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_cleardecryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_cleardecryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearencryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearencryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearsignkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearsignkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}













function gnupg_setarmor($identifier, int $armor): void
{
error_clear_last();
$safeResult = \gnupg_setarmor($identifier, $armor);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}


















function gnupg_setsignmode($identifier, int $signmode): void
{
error_clear_last();
$safeResult = \gnupg_setsignmode($identifier, $signmode);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlException;








function xml_parser_free(\XMLParser $parser): void
{
error_clear_last();
$safeResult = \xml_parser_free($parser);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
















































function xml_set_character_data_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_character_data_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


















































function xml_set_default_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_default_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}






























































function xml_set_element_handler(\XMLParser $parser, callable $start_handler, callable $end_handler): void
{
error_clear_last();
$safeResult = \xml_set_element_handler($parser, $start_handler, $end_handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

















































function xml_set_end_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_end_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}




















































































function xml_set_external_entity_ref_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_external_entity_ref_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

























































































function xml_set_notation_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_notation_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}













function xml_set_object(\XMLParser $parser, object $object): void
{
error_clear_last();
$safeResult = \xml_set_object($parser, $object);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


































































function xml_set_processing_instruction_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_processing_instruction_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


























































function xml_set_start_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_start_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
































































































function xml_set_unparsed_entity_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SemException;


















function msg_get_queue(int $key, int $permissions = 0666): \SysvMessageQueue
{
error_clear_last();
$safeResult = \msg_get_queue($key, $permissions);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}









function msg_queue_exists(int $key): void
{
error_clear_last();
$safeResult = \msg_queue_exists($key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}









































































function msg_receive(\SysvMessageQueue $queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function msg_remove_queue(\SysvMessageQueue $queue): void
{
error_clear_last();
$safeResult = \msg_remove_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



































function msg_send(\SysvMessageQueue $queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



















function msg_set_queue(\SysvMessageQueue $queue, array $data): void
{
error_clear_last();
$safeResult = \msg_set_queue($queue, $data);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















































































function msg_stat_queue(\SysvMessageQueue $queue): array
{
error_clear_last();
$safeResult = \msg_stat_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}





















function sem_acquire(\SysvSemaphore $semaphore, bool $non_blocking = false): void
{
error_clear_last();
$safeResult = \sem_acquire($semaphore, $non_blocking);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}

























function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): \SysvSemaphore
{
error_clear_last();
$safeResult = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}















function sem_release(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_release($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function sem_remove(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_remove($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
























function shm_attach(int $key, ?int $size = null, int $permissions = 0666): \SysvSharedMemory
{
error_clear_last();
if ($permissions !== 0666) {
$safeResult = \shm_attach($key, $size, $permissions);
} elseif ($size !== null) {
$safeResult = \shm_attach($key, $size);
} else {
$safeResult = \shm_attach($key);
}
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}












function shm_detach(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_detach($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















function shm_put_var(\SysvSharedMemory $shm, int $key, $value): void
{
error_clear_last();
$safeResult = \shm_put_var($shm, $key, $value);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}











function shm_remove_var(\SysvSharedMemory $shm, int $key): void
{
error_clear_last();
$safeResult = \shm_remove_var($shm, $key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}










function shm_remove(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_remove($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SplException;











function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_implements($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}












function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_parents($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}













function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_uses($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}






























function spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
$safeResult = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
$safeResult = \spl_autoload_register($callback, $throw);
} elseif ($callback !== null) {
$safeResult = \spl_autoload_register($callback);
} else {
$safeResult = \spl_autoload_register();
}
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}














function spl_autoload_unregister($callback): void
{
error_clear_last();
$safeResult = \spl_autoload_unregister($callback);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XdiffException;













function xdiff_file_bdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}














function xdiff_file_bpatch(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bpatch($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_diff_binary($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}




















function xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): void
{
error_clear_last();
$safeResult = \xdiff_file_diff($old_file, $new_file, $dest, $context, $minimal);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_patch_binary(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_patch_binary($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}



















function xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_rabdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}













function xdiff_string_bpatch(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_bpatch($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}















function xdiff_string_patch_binary(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_patch_binary($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
























function xdiff_string_patch(string $str, string $patch, ?int $flags = null, ?string &$error = null): string
{
error_clear_last();
if ($error !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags, $error);
} elseif ($flags !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags);
} else {
$safeResult = \xdiff_string_patch($str, $patch);
}
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\YamlException;




















function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
























function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_url($url, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}





















function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse($input, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SolrException;








function solr_get_version(): string
{
error_clear_last();
$safeResult = \solr_get_version();
if ($safeResult === false) {
throw SolrException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;










function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse_from_format($format, $datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}












function date_parse(string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse($datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}

































































































function date_sun_info(int $timestamp, float $latitude, float $longitude): array
{
error_clear_last();
$safeResult = \date_sun_info($timestamp, $latitude, $longitude);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunrise($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunset($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}



















function date(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \date($format, $timestamp);
} else {
$safeResult = \date($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}


































function gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null): int
{
error_clear_last();
if ($year !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \gmmktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \gmmktime($hour, $minute);
} else {
$safeResult = \gmmktime($hour);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function gmstrftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \gmstrftime($format, $timestamp);
} else {
$safeResult = \gmstrftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}













































































































function idate(string $format, ?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \idate($format, $timestamp);
} else {
$safeResult = \idate($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}









































function mktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null): int
{
error_clear_last();
if ($year !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \mktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \mktime($hour, $minute);
} else {
$safeResult = \mktime($hour);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}






















































































































































































































































































































function strftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \strftime($format, $timestamp);
} else {
$safeResult = \strftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}










































































function strptime(string $timestamp, string $format): array
{
error_clear_last();
$safeResult = \strptime($timestamp, $format);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function strtotime(string $datetime, ?int $baseTimestamp = null): int
{
error_clear_last();
if ($baseTimestamp !== null) {
$safeResult = \strtotime($datetime, $baseTimestamp);
} else {
$safeResult = \strtotime($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string
{
error_clear_last();
$safeResult = \timezone_name_from_abbr($abbr, $utcOffset, $isDST);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImapException;










function imap_8bit(string $string): string
{
error_clear_last();
$safeResult = \imap_8bit($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



















function imap_append(\IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): void
{
error_clear_last();
if ($internal_date !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options, $internal_date);
} elseif ($options !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options);
} else {
$safeResult = \imap_append($imap, $folder, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_base64(string $string): string
{
error_clear_last();
$safeResult = \imap_base64($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_binary(string $string): string
{
error_clear_last();
$safeResult = \imap_binary($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}







































function imap_body(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_body($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_bodystruct(\IMAP\Connection $imap, int $message_num, string $section): \stdClass
{
error_clear_last();
$safeResult = \imap_bodystruct($imap, $message_num, $section);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}








































function imap_check(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_check($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_clearflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_clearflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_close(\IMAP\Connection $imap, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_close($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_createmailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_createmailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_deletemailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_deletemailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












































































































function imap_fetch_overview(\IMAP\Connection $imap, string $sequence, int $flags = 0): array
{
error_clear_last();
$safeResult = \imap_fetch_overview($imap, $sequence, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



































function imap_fetchbody(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchbody($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




































function imap_fetchheader(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchheader($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_fetchmime(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchmime($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










































































































































function imap_fetchstructure(\IMAP\Connection $imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_fetchstructure($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_gc(\IMAP\Connection $imap, int $flags): void
{
error_clear_last();
$safeResult = \imap_gc($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_getacl(\IMAP\Connection $imap, string $mailbox): array
{
error_clear_last();
$safeResult = \imap_getacl($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getmailboxes(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getmailboxes($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getsubscribed(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getsubscribed($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































































function imap_headerinfo(\IMAP\Connection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_headers(\IMAP\Connection $imap): array
{
error_clear_last();
$safeResult = \imap_headers($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

































function imap_listscan(\IMAP\Connection $imap, string $reference, string $pattern, string $content): array
{
error_clear_last();
$safeResult = \imap_listscan($imap, $reference, $pattern, $content);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_lsub(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_lsub($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































































function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
$safeResult = \imap_mail_compose($envelope, $bodies);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




























function imap_mail_copy(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail_move(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): void
{
error_clear_last();
if ($return_path !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
} elseif ($bcc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
} elseif ($cc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc);
} elseif ($additional_headers !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers);
} else {
$safeResult = \imap_mail($to, $subject, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















































function imap_mailboxmsginfo(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_mailboxmsginfo($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


















function imap_mime_header_decode(string $string): array
{
error_clear_last();
$safeResult = \imap_mime_header_decode($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
$safeResult = \imap_mutf7_to_utf8($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_num_msg(\IMAP\Connection $imap): int
{
error_clear_last();
$safeResult = \imap_num_msg($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














































































































































































































function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): \IMAP\Connection
{
error_clear_last();
$safeResult = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_qprint(string $string): string
{
error_clear_last();
$safeResult = \imap_qprint($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_renamemailbox(\IMAP\Connection $imap, string $from, string $to): void
{
error_clear_last();
$safeResult = \imap_renamemailbox($imap, $from, $to);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
$safeResult = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_savebody(\IMAP\Connection $imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_set_quota(\IMAP\Connection $imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
$safeResult = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}














function imap_setacl(\IMAP\Connection $imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
$safeResult = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



























function imap_setflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_setflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



































































function imap_sort(\IMAP\Connection $imap, int $criteria, int $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array
{
error_clear_last();
if ($charset !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
} elseif ($search_criteria !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
} else {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

























































function imap_status(\IMAP\Connection $imap, string $mailbox, int $flags): \stdClass
{
error_clear_last();
$safeResult = \imap_status($imap, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}











function imap_subscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_subscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}


























function imap_thread(\IMAP\Connection $imap, int $flags = SE_FREE): array
{
error_clear_last();
$safeResult = \imap_thread($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




















function imap_timeout(int $timeout_type, int $timeout = -1)
{
error_clear_last();
$safeResult = \imap_timeout($timeout_type, $timeout);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_undelete(\IMAP\Connection $imap, string $message_num, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_undelete($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_unsubscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_unsubscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
$safeResult = \imap_utf8_to_mutf7($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\NetworkException;








function closelog(): void
{
error_clear_last();
$safeResult = \closelog();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}



































































































































































































































function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
$safeResult = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}



















































function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function gethostname(): string
{
error_clear_last();
$safeResult = \gethostname();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobyname(string $protocol): int
{
error_clear_last();
$safeResult = \getprotobyname($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobynumber(int $protocol): string
{
error_clear_last();
$safeResult = \getprotobynumber($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function getservbyport(int $port, string $protocol): string
{
error_clear_last();
$safeResult = \getservbyport($port, $protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function header_register_callback(callable $callback): void
{
error_clear_last();
$safeResult = \header_register_callback($callback);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}










function inet_ntop(string $ip): string
{
error_clear_last();
$safeResult = \inet_ntop($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}















function inet_pton(string $ip): string
{
error_clear_last();
$safeResult = \inet_pton($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function long2ip(int $ip): string
{
error_clear_last();
$safeResult = \long2ip($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}






































































































































function openlog(string $prefix, int $flags, int $facility): void
{
error_clear_last();
$safeResult = \openlog($prefix, $flags, $facility);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}




















function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}
































































function syslog(int $priority, string $message): void
{
error_clear_last();
$safeResult = \syslog($priority, $message);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UrlException;














function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
$safeResult = \base64_decode($string, $strict);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
















function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \get_headers($url, $associative, $context);
} else {
$safeResult = \get_headers($url, $associative);
}
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}








































function get_meta_tags(string $filename, bool $use_include_path = false): array
{
error_clear_last();
$safeResult = \get_meta_tags($filename, $use_include_path);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}


























































































function parse_url(string $url, int $component = -1)
{
error_clear_last();
$safeResult = \parse_url($url, $component);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PosixException;

















function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_access($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























































function posix_getgrgid(int $group_id): array
{
error_clear_last();
$safeResult = \posix_getgrgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}























































function posix_getgrnam(string $name): array
{
error_clear_last();
$safeResult = \posix_getgrnam($name);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_getgroups(): array
{
error_clear_last();
$safeResult = \posix_getgroups();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









function posix_getlogin(): string
{
error_clear_last();
$safeResult = \posix_getlogin();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}



















































































function posix_getpwuid(int $user_id): array
{
error_clear_last();
$safeResult = \posix_getpwuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}





































































































function posix_getrlimit(): array
{
error_clear_last();
$safeResult = \posix_getrlimit();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}














function posix_getsid(int $process_id): int
{
error_clear_last();
$safeResult = \posix_getsid($process_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
$safeResult = \posix_initgroups($username, $group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
$safeResult = \posix_kill($process_id, $signal);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}
















function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \posix_mkfifo($filename, $permissions);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}

















function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
$safeResult = \posix_mknod($filename, $flags, $major, $minor);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setegid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setegid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_seteuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_seteuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}














function posix_setgid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
$safeResult = \posix_setpgid($process_id, $process_group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
$safeResult = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}









function posix_setsid(): int
{
error_clear_last();
$safeResult = \posix_setsid();
if ($safeResult === -1) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}











function posix_setuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_setuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}







































function posix_times(): array
{
error_clear_last();
$safeResult = \posix_times();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









































function posix_uname(): array
{
error_clear_last();
$safeResult = \posix_uname();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UodbcException;





















function odbc_autocommit($odbc, bool $enable = false)
{
error_clear_last();
$safeResult = \odbc_autocommit($odbc, $enable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































































































function odbc_binmode(int $statement, int $mode): void
{
error_clear_last();
$safeResult = \odbc_binmode($statement, $mode);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}







































function odbc_columnprivileges($odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
$safeResult = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}















































function odbc_columns($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table, $column);
} elseif ($table !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_columns($odbc, $catalog);
} else {
$safeResult = \odbc_columns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_commit($odbc): void
{
error_clear_last();
$safeResult = \odbc_commit($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_connect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_connect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_cursor($statement): string
{
error_clear_last();
$safeResult = \odbc_cursor($statement);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

















function odbc_data_source($odbc, int $fetch_type): array
{
error_clear_last();
$safeResult = \odbc_data_source($odbc, $fetch_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_exec($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_exec($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















function odbc_execute($statement, array $params = []): void
{
error_clear_last();
$safeResult = \odbc_execute($statement, $params);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
















function odbc_fetch_into($statement, ?array &$array, int $row = 0): int
{
error_clear_last();
$safeResult = \odbc_fetch_into($statement, $array, $row);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_len($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_len($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_name($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_name($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_field_num($statement, string $field): int
{
error_clear_last();
$safeResult = \odbc_field_num($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_scale($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_scale($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_type($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_type($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}






































function odbc_foreignkeys($odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
$safeResult = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_gettypeinfo($odbc, int $data_type = 0)
{
error_clear_last();
$safeResult = \odbc_gettypeinfo($odbc, $data_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_longreadlen($statement, int $length): void
{
error_clear_last();
$safeResult = \odbc_longreadlen($statement, $length);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}










function odbc_num_fields($statement): int
{
error_clear_last();
$safeResult = \odbc_num_fields($statement);
if ($safeResult === -1) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}























function odbc_pconnect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_pconnect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}



















function odbc_prepare($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_prepare($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


























function odbc_primarykeys($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_primarykeys($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















































function odbc_procedurecolumns($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
} elseif ($procedure !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog);
} else {
$safeResult = \odbc_procedurecolumns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_procedures($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null)
{
error_clear_last();
if ($procedure !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedures($odbc, $catalog);
} else {
$safeResult = \odbc_procedures($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
















function odbc_result_all($statement, string $format = ""): int
{
error_clear_last();
$safeResult = \odbc_result_all($statement, $format);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_result($statement, $field)
{
error_clear_last();
$safeResult = \odbc_result($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_rollback($odbc): void
{
error_clear_last();
$safeResult = \odbc_rollback($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
































function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
$safeResult = \odbc_setoption($odbc, $which, $option, $value);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}



































function odbc_specialcolumns($odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
$safeResult = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































function odbc_statistics($odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
$safeResult = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

































function odbc_tableprivileges($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}











































































function odbc_tables($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $types = null)
{
error_clear_last();
if ($types !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table, $types);
} elseif ($table !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_tables($odbc, $catalog);
} else {
$safeResult = \odbc_tables($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LzfException;










function lzf_compress(string $data): string
{
error_clear_last();
$safeResult = \lzf_compress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}











function lzf_decompress(string $data): string
{
error_clear_last();
$safeResult = \lzf_decompress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImageException;































































function getimagesize(string $filename, ?array &$image_info = null): ?array
{
error_clear_last();
$safeResult = \getimagesize($filename, $image_info);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function image_type_to_extension(int $image_type, bool $include_dot = true): string
{
error_clear_last();
$safeResult = \image_type_to_extension($image_type, $include_dot);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imageaffine(\GdImage $image, array $affine, ?array $clip = null): \GdImage
{
error_clear_last();
if ($clip !== null) {
$safeResult = \imageaffine($image, $affine, $clip);
} else {
$safeResult = \imageaffine($image, $affine);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
$safeResult = \imageaffinematrixconcat($matrix1, $matrix2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
$safeResult = \imageaffinematrixget($type, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagealphablending(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagealphablending($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imageantialias(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imageantialias($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagearc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
$safeResult = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
{
error_clear_last();
if ($speed !== -1) {
$safeResult = \imageavif($image, $file, $quality, $speed);
} elseif ($quality !== -1) {
$safeResult = \imageavif($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imageavif($image, $file);
} else {
$safeResult = \imageavif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagebmp(\GdImage $image, $file = null, bool $compressed = true): void
{
error_clear_last();
if ($compressed !== true) {
$safeResult = \imagebmp($image, $file, $compressed);
} elseif ($file !== null) {
$safeResult = \imagebmp($image, $file);
} else {
$safeResult = \imagebmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





















function imagechar(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagechar($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecharup(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagecharup($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagecolorat(\GdImage $image, int $x, int $y): int
{
error_clear_last();
$safeResult = \imagecolorat($image, $x, $y);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagecolordeallocate(\GdImage $image, int $color): void
{
error_clear_last();
$safeResult = \imagecolordeallocate($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagecolormatch(\GdImage $image1, \GdImage $image2): void
{
error_clear_last();
$safeResult = \imagecolormatch($image1, $image2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecolorset(\GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
{
error_clear_last();
$safeResult = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagecolorsforindex(\GdImage $image, int $color): array
{
error_clear_last();
$safeResult = \imagecolorsforindex($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imageconvolution(\GdImage $image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
$safeResult = \imageconvolution($image, $matrix, $divisor, $offset);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagecopy(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




























function imagecopymerge(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
































function imagecopymergegray(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresampled(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresized(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagecreate(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreate($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromavif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromavif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrombmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrombmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd2(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromgif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromjpeg(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromjpeg($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrompng(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrompng($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecreatefromstring(string $data): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromstring($data);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromtga(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromtga($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwbmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwbmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwebp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwebp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxbm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxbm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxpm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxpm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatetruecolor(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatetruecolor($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecrop(\GdImage $image, array $rectangle): \GdImage
{
error_clear_last();
$safeResult = \imagecrop($image, $rectangle);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagecropauto(\GdImage $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1): \GdImage
{
error_clear_last();
$safeResult = \imagecropauto($image, $mode, $threshold, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}

















function imagedashedline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagedashedline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagedestroy(\GdImage $image): void
{
error_clear_last();
$safeResult = \imagedestroy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagefill(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagefill($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




































function imagefilledarc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
$safeResult = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
















function imagefilledellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagefilledrectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagefilltoborder(\GdImage $image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
$safeResult = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










































































































































function imagefilter(\GdImage $image, int $filter, int ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \imagefilter($image, $filter, ...$args);
} else {
$safeResult = \imagefilter($image, $filter);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











































function imageflip(\GdImage $image, int $mode): void
{
error_clear_last();
$safeResult = \imageflip($image, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















































































function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










































































































function imagefttext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagegammacorrect(\GdImage $image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
$safeResult = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagegd(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegd($image, $file);
} else {
$safeResult = \imagegd($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagegd2(\GdImage $image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
if ($mode !== IMG_GD2_RAW) {
$safeResult = \imagegd2($image, $file, $chunk_size, $mode);
} elseif ($chunk_size !== 128) {
$safeResult = \imagegd2($image, $file, $chunk_size);
} elseif ($file !== null) {
$safeResult = \imagegd2($image, $file);
} else {
$safeResult = \imagegd2($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagegif(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegif($image, $file);
} else {
$safeResult = \imagegif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}









function imagegrabscreen(): \GdImage
{
error_clear_last();
$safeResult = \imagegrabscreen();
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
$safeResult = \imagegrabwindow($handle, $client_area);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagejpeg(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagejpeg($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagejpeg($image, $file);
} else {
$safeResult = \imagejpeg($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























































function imagelayereffect(\GdImage $image, int $effect): void
{
error_clear_last();
$safeResult = \imagelayereffect($image, $effect);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imageline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


























































function imageloadfont(string $filename): int
{
error_clear_last();
$safeResult = \imageloadfont($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
























function imagepng(\GdImage $image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
if ($filters !== -1) {
$safeResult = \imagepng($image, $file, $quality, $filters);
} elseif ($quality !== -1) {
$safeResult = \imagepng($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagepng($image, $file);
} else {
$safeResult = \imagepng($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagerectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



























function imageresolution(\GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null)
{
error_clear_last();
if ($resolution_y !== null) {
$safeResult = \imageresolution($image, $resolution_x, $resolution_y);
} elseif ($resolution_x !== null) {
$safeResult = \imageresolution($image, $resolution_x);
} else {
$safeResult = \imageresolution($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imagerotate(\GdImage $image, float $angle, int $background_color, bool $ignore_transparent = false): \GdImage
{
error_clear_last();
$safeResult = \imagerotate($image, $angle, $background_color, $ignore_transparent);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagesavealpha(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagesavealpha($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























function imagescale(\GdImage $image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED): \GdImage
{
error_clear_last();
$safeResult = \imagescale($image, $width, $height, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagesetbrush(\GdImage $image, \GdImage $brush): void
{
error_clear_last();
$safeResult = \imagesetbrush($image, $brush);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagesetclip(\GdImage $image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
$safeResult = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































































function imagesetinterpolation(\GdImage $image, int $method = IMG_BILINEAR_FIXED): void
{
error_clear_last();
$safeResult = \imagesetinterpolation($image, $method);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}














function imagesetpixel(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagesetpixel($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagesetstyle(\GdImage $image, array $style): void
{
error_clear_last();
$safeResult = \imagesetstyle($image, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagesetthickness(\GdImage $image, int $thickness): void
{
error_clear_last();
$safeResult = \imagesetthickness($image, $thickness);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagesettile(\GdImage $image, \GdImage $tile): void
{
error_clear_last();
$safeResult = \imagesettile($image, $tile);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagestring(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestring($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagestringup(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestringup($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagesx(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesx($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagesy(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagetruecolortopalette(\GdImage $image, bool $dither, int $num_colors): void
{
error_clear_last();
$safeResult = \imagetruecolortopalette($image, $dither, $num_colors);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































function imagettftext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagewbmp(\GdImage $image, $file = null, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagewbmp($image, $file, $foreground_color);
} elseif ($file !== null) {
$safeResult = \imagewbmp($image, $file);
} else {
$safeResult = \imagewbmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagewebp(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagewebp($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagewebp($image, $file);
} else {
$safeResult = \imagewebp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagexbm(\GdImage $image, $filename, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagexbm($image, $filename, $foreground_color);
} else {
$safeResult = \imagexbm($image, $filename);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
$safeResult = \iptcembed($iptc_data, $filename, $spool);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function iptcparse(string $iptc_block): array
{
error_clear_last();
$safeResult = \iptcparse($iptc_block);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ReadlineException;








function readline_add_history(string $prompt): void
{
error_clear_last();
$safeResult = \readline_add_history($prompt);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}



















function readline_callback_handler_install(string $prompt, callable $callback): void
{
error_clear_last();
$safeResult = \readline_callback_handler_install($prompt, $callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}








function readline_clear_history(): void
{
error_clear_last();
$safeResult = \readline_clear_history();
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}











function readline_completion_function(callable $callback): void
{
error_clear_last();
$safeResult = \readline_completion_function($callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_read_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_read_history($filename);
} else {
$safeResult = \readline_read_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_write_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_write_history($filename);
} else {
$safeResult = \readline_write_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ArrayException;














function array_combine(array $keys, array $values): array
{
error_clear_last();
$safeResult = \array_combine($keys, $values);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
return $safeResult;
}





















function array_flip(array $array): array
{
error_clear_last();
$safeResult = \array_flip($array);
if ($safeResult === null) {
throw ArrayException::createFromPhpError();
}
return $safeResult;
}



























function array_replace_recursive(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace_recursive($array, ...$replacements);
} else {
$safeResult = \array_replace_recursive($array);
}
if ($safeResult === null) {
throw ArrayException::createFromPhpError();
}
return $safeResult;
}






















function array_replace(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace($array, ...$replacements);
} else {
$safeResult = \array_replace($array);
}
if ($safeResult === null) {
throw ArrayException::createFromPhpError();
}
return $safeResult;
}
























function array_walk_recursive(&$array, callable $callback, $arg = null): void
{
error_clear_last();
if ($arg !== null) {
$safeResult = \array_walk_recursive($array, $callback, $arg);
} else {
$safeResult = \array_walk_recursive($array, $callback);
}
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}











function shuffle(array &$array): void
{
error_clear_last();
$safeResult = \shuffle($array);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilesystemException;













function chgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \chgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


































function chmod(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \chmod($filename, $permissions);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function chown(string $filename, $user): void
{
error_clear_last();
$safeResult = \chown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}



















function copy(string $source, string $dest, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \copy($source, $dest, $context);
} else {
$safeResult = \copy($source, $dest);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function disk_free_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_free_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function disk_total_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_total_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fclose($stream): void
{
error_clear_last();
$safeResult = \fclose($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fdatasync($stream): void
{
error_clear_last();
$safeResult = \fdatasync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function fflush($stream): void
{
error_clear_last();
$safeResult = \fflush($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}




































function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context);
} else {
$safeResult = \file_get_contents($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































































function file_put_contents(string $filename, $data, int $flags = 0, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \file_put_contents($filename, $data, $flags, $context);
} else {
$safeResult = \file_put_contents($filename, $data, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















































function file(string $filename, int $flags = 0, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \file($filename, $flags, $context);
} else {
$safeResult = \file($filename, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function fileatime(string $filename): int
{
error_clear_last();
$safeResult = \fileatime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filectime(string $filename): int
{
error_clear_last();
$safeResult = \filectime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fileinode(string $filename): int
{
error_clear_last();
$safeResult = \fileinode($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function filemtime(string $filename): int
{
error_clear_last();
$safeResult = \filemtime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












function fileowner(string $filename): int
{
error_clear_last();
$safeResult = \fileowner($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
























function fileperms(string $filename): int
{
error_clear_last();
$safeResult = \fileperms($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filesize(string $filename): int
{
error_clear_last();
$safeResult = \filesize($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function filetype(string $filename): string
{
error_clear_last();
$safeResult = \filetype($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
$safeResult = \flock($stream, $operation, $would_block);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}









































































































































































































function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \fopen($filename, $mode, $use_include_path, $context);
} else {
$safeResult = \fopen($filename, $mode, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}









































function fread($stream, int $length): string
{
error_clear_last();
$safeResult = \fread($stream, $length);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function fstat($stream): array
{
error_clear_last();
$safeResult = \fstat($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function fsync($stream): void
{
error_clear_last();
$safeResult = \fsync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function ftell($stream): int
{
error_clear_last();
$safeResult = \ftell($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



















function ftruncate($stream, int $size): void
{
error_clear_last();
$safeResult = \ftruncate($stream, $size);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function fwrite($handle, string $string, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \fwrite($handle, $string, $length);
} else {
$safeResult = \fwrite($handle, $string);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























































































function glob(string $pattern, int $flags = 0): array
{
error_clear_last();
$safeResult = \glob($pattern, $flags);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function lchgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \lchgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function lchown(string $filename, $user): void
{
error_clear_last();
$safeResult = \lchown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}










function link(string $target, string $link): void
{
error_clear_last();
$safeResult = \link($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


















function lstat(string $filename): array
{
error_clear_last();
$safeResult = \lstat($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}























function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \mkdir($directory, $permissions, $recursive, $context);
} else {
$safeResult = \mkdir($directory, $permissions, $recursive);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}































function parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_file($filename, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function pclose($handle): int
{
error_clear_last();
$safeResult = \pclose($handle);
if ($safeResult === -1) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function popen(string $command, string $mode)
{
error_clear_last();
$safeResult = \popen($command, $mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}














function readfile(string $filename, bool $use_include_path = false, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \readfile($filename, $use_include_path, $context);
} else {
$safeResult = \readfile($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function readlink(string $path): string
{
error_clear_last();
$safeResult = \readlink($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function realpath(string $path): string
{
error_clear_last();
$safeResult = \realpath($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function rename(string $oldname, string $newname, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rename($oldname, $newname, $context);
} else {
$safeResult = \rename($oldname, $newname);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}











function rewind($stream): void
{
error_clear_last();
$safeResult = \rewind($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rmdir($directory, $context);
} else {
$safeResult = \rmdir($directory);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function symlink(string $target, string $link): void
{
error_clear_last();
$safeResult = \symlink($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}














function tempnam(string $directory, string $prefix): string
{
error_clear_last();
$safeResult = \tempnam($directory, $prefix);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function tmpfile()
{
error_clear_last();
$safeResult = \tmpfile();
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}





















function touch(string $filename, ?int $time = null, ?int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
$safeResult = \touch($filename, $time, $atime);
} elseif ($time !== null) {
$safeResult = \touch($filename, $time);
} else {
$safeResult = \touch($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function unlink(string $filename, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \unlink($filename, $context);
} else {
$safeResult = \unlink($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilterException;

































function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_input_array($type, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}

























function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_var_array($array, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\Oci8Exception;


































































































function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
$safeResult = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






































































































































































































function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_cancel($statement): void
{
error_clear_last();
$safeResult = \oci_cancel($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























function oci_commit($connection): void
{
error_clear_last();
$safeResult = \oci_commit($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





































































































function oci_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}




























function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_define_by_name($statement, $column, $var, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}















































































function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
{
error_clear_last();
$safeResult = \oci_execute($statement, $mode);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_field_name($statement, $column): string
{
error_clear_last();
$safeResult = \oci_field_name($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_precision($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_precision($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_scale($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_scale($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_size($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_size($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}













function oci_field_type_raw($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_type_raw($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_type($statement, $column)
{
error_clear_last();
$safeResult = \oci_field_type($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}









function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
$safeResult = \oci_free_descriptor($lob);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_free_statement($statement): void
{
error_clear_last();
$safeResult = \oci_free_statement($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}














function oci_new_collection($connection, string $type_name, ?string $schema = null)
{
error_clear_last();
if ($schema !== null) {
$safeResult = \oci_new_collection($connection, $type_name, $schema);
} else {
$safeResult = \oci_new_collection($connection, $type_name);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}


























































































function oci_new_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_new_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_new_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_new_cursor($connection)
{
error_clear_last();
$safeResult = \oci_new_cursor($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}














function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$safeResult = \oci_new_descriptor($connection, $type);
if ($safeResult === null) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}










function oci_num_rows($statement): int
{
error_clear_last();
$safeResult = \oci_num_rows($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}
























function oci_parse($connection, string $sql)
{
error_clear_last();
$safeResult = \oci_parse($connection, $sql);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}



























































































function oci_pconnect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_pconnect($username, $password, $connection_string);
} else {
$safeResult = \oci_pconnect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}






























function oci_register_taf_callback($connection, callable $callback): void
{
error_clear_last();
$safeResult = \oci_register_taf_callback($connection, $callback);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




















function oci_result($statement, $column): string
{
error_clear_last();
$safeResult = \oci_result($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}

























function oci_rollback($connection): void
{
error_clear_last();
$safeResult = \oci_rollback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_server_version($connection): string
{
error_clear_last();
$safeResult = \oci_server_version($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}























function oci_set_action($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_action($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
$safeResult = \oci_set_call_timeout($connection, $timeout);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}



























function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
$safeResult = \oci_set_client_identifier($connection, $client_id);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





















function oci_set_client_info($connection, string $client_info): void
{
error_clear_last();
$safeResult = \oci_set_client_info($connection, $client_info);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






















function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_db_operation($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


























function oci_set_edition(string $edition): void
{
error_clear_last();
$safeResult = \oci_set_edition($edition);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}























function oci_set_module_name($connection, string $name): void
{
error_clear_last();
$safeResult = \oci_set_module_name($connection, $name);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























































function oci_set_prefetch($statement, int $rows): void
{
error_clear_last();
$safeResult = \oci_set_prefetch($statement, $rows);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
































































function oci_statement_type($statement): string
{
error_clear_last();
$safeResult = \oci_statement_type($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}












function oci_unregister_taf_callback($connection): void
{
error_clear_last();
$safeResult = \oci_unregister_taf_callback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PgsqlException;











function pg_cancel_query(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_cancel_query($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















































function pg_connect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_connect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_connection_reset(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_connection_reset($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






















function pg_convert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
$safeResult = \pg_convert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}




















function pg_copy_from(\PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
$safeResult = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_copy_to(\PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
$safeResult = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





































function pg_delete(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_delete($connection, $table_name, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


















function pg_end_copy(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_end_copy($connection);
} else {
$safeResult = \pg_end_copy();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





































function pg_execute(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_execute($connection, $stmtname, $params);
} elseif ($stmtname !== null) {
$safeResult = \pg_execute($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_execute($connection);
} else {
$safeResult = \pg_execute();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_field_num(\PgSql\Result $result, string $field): int
{
error_clear_last();
$safeResult = \pg_field_num($result, $field);
if ($safeResult === -1) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_table(\PgSql\Result $result, int $field, bool $oid_only = false)
{
error_clear_last();
$safeResult = \pg_field_table($result, $field, $oid_only);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_flush(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_flush($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}















function pg_free_result(\PgSql\Result $result): void
{
error_clear_last();
$safeResult = \pg_free_result($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_host(?\PgSql\Connection $connection = null): string
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_host($connection);
} else {
$safeResult = \pg_host();
}
if ($safeResult === '') {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}







































function pg_insert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_insert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}






























function pg_last_oid(\PgSql\Result $result): string
{
error_clear_last();
$safeResult = \pg_last_oid($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}












function pg_lo_close(\PgSql\Lob $lob): void
{
error_clear_last();
$safeResult = \pg_lo_close($lob);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















function pg_lo_export(?\PgSql\Connection $connection = null, ?int $oid = null, ?string $pathname = null): void
{
error_clear_last();
if ($pathname !== null) {
$safeResult = \pg_lo_export($connection, $oid, $pathname);
} elseif ($oid !== null) {
$safeResult = \pg_lo_export($connection, $oid);
} elseif ($connection !== null) {
$safeResult = \pg_lo_export($connection);
} else {
$safeResult = \pg_lo_export();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


























function pg_lo_import(?\PgSql\Connection $connection = null, ?string $pathname = null, $object_id = null): int
{
error_clear_last();
if ($object_id !== null) {
$safeResult = \pg_lo_import($connection, $pathname, $object_id);
} elseif ($pathname !== null) {
$safeResult = \pg_lo_import($connection, $pathname);
} elseif ($connection !== null) {
$safeResult = \pg_lo_import($connection);
} else {
$safeResult = \pg_lo_import();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





















function pg_lo_open(\PgSql\Connection $connection, int $oid, string $mode): \PgSql\Lob
{
error_clear_last();
$safeResult = \pg_lo_open($connection, $oid, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















function pg_lo_read(\PgSql\Lob $lob, int $length = 8192): string
{
error_clear_last();
$safeResult = \pg_lo_read($lob, $length);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_lo_seek(\PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
$safeResult = \pg_lo_seek($lob, $offset, $whence);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}













function pg_lo_truncate(\PgSql\Lob $lob, int $size): void
{
error_clear_last();
$safeResult = \pg_lo_truncate($lob, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


















function pg_lo_unlink(\PgSql\Connection $connection, int $oid): void
{
error_clear_last();
$safeResult = \pg_lo_unlink($connection, $oid);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}




















function pg_lo_write(\PgSql\Lob $lob, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \pg_lo_write($lob, $data, $length);
} else {
$safeResult = \pg_lo_write($lob, $data);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_meta_data(\PgSql\Connection $connection, string $table_name, bool $extended = false): array
{
error_clear_last();
$safeResult = \pg_meta_data($connection, $table_name, $extended);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}









































function pg_parameter_status(?\PgSql\Connection $connection = null, ?string $param_name = null): string
{
error_clear_last();
if ($param_name !== null) {
$safeResult = \pg_parameter_status($connection, $param_name);
} elseif ($connection !== null) {
$safeResult = \pg_parameter_status($connection);
} else {
$safeResult = \pg_parameter_status();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














































function pg_pconnect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_pconnect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_ping(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_ping($connection);
} else {
$safeResult = \pg_ping();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






































function pg_prepare(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_prepare($connection, $stmtname, $query);
} elseif ($stmtname !== null) {
$safeResult = \pg_prepare($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_prepare($connection);
} else {
$safeResult = \pg_prepare();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

























function pg_put_line(?\PgSql\Connection $connection = null, ?string $data = null): void
{
error_clear_last();
if ($data !== null) {
$safeResult = \pg_put_line($connection, $data);
} elseif ($connection !== null) {
$safeResult = \pg_put_line($connection);
} else {
$safeResult = \pg_put_line();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















































function pg_query_params(?\PgSql\Connection $connection = null, ?string $query = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_query_params($connection, $query, $params);
} elseif ($query !== null) {
$safeResult = \pg_query_params($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query_params($connection);
} else {
$safeResult = \pg_query_params();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










































function pg_query(?\PgSql\Connection $connection = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_query($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query($connection);
} else {
$safeResult = \pg_query();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}































function pg_result_error_field(\PgSql\Result $result, int $field_code): ?string
{
error_clear_last();
$safeResult = \pg_result_error_field($result, $field_code);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_result_seek(\PgSql\Result $result, int $row): void
{
error_clear_last();
$safeResult = \pg_result_seek($result, $row);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}









































function pg_select(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
$safeResult = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}











function pg_socket(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_socket($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


























function pg_trace(string $filename, string $mode = "w", ?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_trace($filename, $mode, $connection);
} else {
$safeResult = \pg_trace($filename, $mode);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_update(\PgSql\Connection $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\EioException;
















function eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_busy($delay, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chmod(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chmod($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chown(string $path, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chown($path, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_close($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_close($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_custom(callable $execute, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_custom($execute, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_dup2($fd, $fd2, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_dup2($fd, $fd2, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








function eio_event_loop(): void
{
error_clear_last();
$safeResult = \eio_event_loop();
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
}















































function eio_fallocate($fd, int $mode, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fallocate($fd, $mode, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchmod($fd, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fdatasync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fdatasync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstat($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstat($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstat($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstatvfs($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstatvfs($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstatvfs($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fsync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fsync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_ftruncate($fd, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_ftruncate($fd, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_futime($fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_futime($fd, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}



































function eio_grp(callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_grp($callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_lstat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_lstat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mkdir($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
























































function eio_mknod(string $path, int $mode, int $dev, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mknod($path, $mode, $dev, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_nop(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_nop($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_readahead($fd, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































































































































































































































































































function eio_readdir(string $path, int $flags, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readdir($path, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_readlink(string $path, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_rename(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rename($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_rmdir(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rmdir($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}















































function eio_seek($fd, int $offset, int $whence, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_seek($fd, $offset, $whence, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_sendfile($out_fd, $in_fd, int $offset, int $length, ?int $pri = null, ?callable $callback = null, ?string $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback, $data);
} elseif ($callback !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback);
} elseif ($pri !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri);
} else {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_stat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_stat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_statvfs(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_statvfs($path, $pri, $callback, $data);
} else {
$safeResult = \eio_statvfs($path, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_symlink(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_symlink($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_sync_file_range($fd, int $offset, int $nbytes, int $flags, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync_file_range($fd, $offset, $nbytes, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












function eio_sync(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_syncfs($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_syncfs($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_truncate(string $path, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_truncate($path, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_unlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_utime(string $path, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_utime($path, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












































function eio_write($fd, string $str, int $length = 0, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_write($fd, $str, $length, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;































function socket_accept(\Socket $socket): \Socket
{
error_clear_last();
$safeResult = \socket_accept($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_bind(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_bind($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_connect(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_connect($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): array
{
error_clear_last();
if ($hints !== []) {
$safeResult = \socket_addrinfo_lookup($host, $service, $hints);
} elseif ($service !== null) {
$safeResult = \socket_addrinfo_lookup($host, $service);
} else {
$safeResult = \socket_addrinfo_lookup($host);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






















function socket_bind(\Socket $socket, string $address, int $port = 0): void
{
error_clear_last();
$safeResult = \socket_bind($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}























function socket_connect(\Socket $socket, string $address, ?int $port = null): void
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_connect($socket, $address, $port);
} else {
$safeResult = \socket_connect($socket, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_create_listen(int $port, int $backlog = 128): \Socket
{
error_clear_last();
$safeResult = \socket_create_listen($port, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}



























function socket_create_pair(int $domain, int $type, int $protocol, ?array &$pair): void
{
error_clear_last();
$safeResult = \socket_create_pair($domain, $type, $protocol, $pair);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

























function socket_create(int $domain, int $type, int $protocol): \Socket
{
error_clear_last();
$safeResult = \socket_create($domain, $type, $protocol);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_export_stream(\Socket $socket)
{
error_clear_last();
$safeResult = \socket_export_stream($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






































function socket_get_option(\Socket $socket, int $level, int $option)
{
error_clear_last();
$safeResult = \socket_get_option($socket, $level, $option);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

























function socket_getpeername(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getpeername($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_getsockname(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getsockname($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}










function socket_import_stream($stream): \Socket
{
error_clear_last();
$safeResult = \socket_import_stream($stream);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






























function socket_listen(\Socket $socket, int $backlog = 0): void
{
error_clear_last();
$safeResult = \socket_listen($socket, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






































function socket_read(\Socket $socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
$safeResult = \socket_read($socket, $length, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}




















































function socket_send(\Socket $socket, string $data, int $length, int $flags): int
{
error_clear_last();
$safeResult = \socket_send($socket, $data, $length, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}












function socket_sendmsg(\Socket $socket, array $message, int $flags = 0): int
{
error_clear_last();
$safeResult = \socket_sendmsg($socket, $message, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
























































function socket_sendto(\Socket $socket, string $data, int $length, int $flags, string $address, ?int $port = null): int
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address, $port);
} else {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_set_block(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_block($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

















function socket_set_nonblock(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_nonblock($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_set_option(\Socket $socket, int $level, int $option, $value): void
{
error_clear_last();
$safeResult = \socket_set_option($socket, $level, $option, $value);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}





































function socket_shutdown(\Socket $socket, int $mode = 2): void
{
error_clear_last();
$safeResult = \socket_shutdown($socket, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}













function socket_wsaprotocol_info_export(\Socket $socket, int $process_id): string
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_export($socket, $process_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_wsaprotocol_info_import(string $info_id): \Socket
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_import($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_wsaprotocol_info_release(string $info_id): void
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_release($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Bzip2Exception;









function bzclose($bz): void
{
error_clear_last();
$safeResult = \bzclose($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}












function bzflush($bz): void
{
error_clear_last();
$safeResult = \bzflush($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}














function bzopen($file, string $mode)
{
error_clear_last();
$safeResult = \bzopen($file, $mode);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}

















function bzread($bz, int $length = 1024): string
{
error_clear_last();
$safeResult = \bzread($bz, $length);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
















function bzwrite($bz, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \bzwrite($bz, $data, $length);
} else {
$safeResult = \bzwrite($bz, $data);
}
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApcuException;











function apcu_cache_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_cache_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}













function apcu_cas(string $key, int $old, int $new): void
{
error_clear_last();
$safeResult = \apcu_cas($key, $old, $new);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
}














function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_dec($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}














function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_inc($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}











function apcu_sma_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_sma_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcreException;
















function preg_grep(string $pattern, array $array, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_grep($pattern, $array, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































































































































































































































































































































function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




































































































































































































































function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




























function preg_replace_callback_array(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































function preg_replace_callback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback($pattern, $callback, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}























































function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_split($pattern, $subject, $limit, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GmpException;
















function gmp_random_seed($seed): void
{
error_clear_last();
$safeResult = \gmp_random_seed($seed);
if ($safeResult === false) {
throw GmpException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\VarException;















































function settype(&$var, string $type): void
{
error_clear_last();
$safeResult = \settype($var, $type);
if ($safeResult === false) {
throw VarException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Ssh2Exception;










function ssh2_auth_agent($session, string $username): void
{
error_clear_last();
$safeResult = \ssh2_auth_agent($session, $username);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_auth_hostbased_file($session, string $username, string $hostname, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null, ?string $local_username = null): void
{
error_clear_last();
if ($local_username !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase, $local_username);
} elseif ($passphrase !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_auth_password($session, string $username, string $password): void
{
error_clear_last();
$safeResult = \ssh2_auth_password($session, $username, $password);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_auth_pubkey_file($session, string $username, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}









































































































































































































function ssh2_connect(string $host, int $port = 22, ?array $methods = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \ssh2_connect($host, $port, $methods, $callbacks);
} elseif ($methods !== null) {
$safeResult = \ssh2_connect($host, $port, $methods);
} else {
$safeResult = \ssh2_connect($host, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_disconnect($session): void
{
error_clear_last();
$safeResult = \ssh2_disconnect($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}




















function ssh2_exec($session, string $command, ?string $pty = null, ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_exec($session, $command, $pty, $env);
} elseif ($pty !== null) {
$safeResult = \ssh2_exec($session, $command, $pty);
} else {
$safeResult = \ssh2_exec($session, $command);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_forward_accept($listener)
{
error_clear_last();
$safeResult = \ssh2_forward_accept($listener);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}













function ssh2_forward_listen($session, int $port, ?string $host = null, int $max_connections = 16)
{
error_clear_last();
if ($max_connections !== 16) {
$safeResult = \ssh2_forward_listen($session, $port, $host, $max_connections);
} elseif ($host !== null) {
$safeResult = \ssh2_forward_listen($session, $port, $host);
} else {
$safeResult = \ssh2_forward_listen($session, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}

















function ssh2_publickey_add($pkey, string $algoname, string $blob, bool $overwrite = false, ?array $attributes = null): void
{
error_clear_last();
if ($attributes !== null) {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite, $attributes);
} else {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_publickey_init($session)
{
error_clear_last();
$safeResult = \ssh2_publickey_init($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}











function ssh2_publickey_remove($pkey, string $algoname, string $blob): void
{
error_clear_last();
$safeResult = \ssh2_publickey_remove($pkey, $algoname, $blob);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_scp_recv($session, string $remote_file, string $local_file): void
{
error_clear_last();
$safeResult = \ssh2_scp_recv($session, $remote_file, $local_file);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}














function ssh2_scp_send($session, string $local_file, string $remote_file, int $create_mode = 0644): void
{
error_clear_last();
$safeResult = \ssh2_scp_send($session, $local_file, $remote_file, $create_mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_send_eof($channel): void
{
error_clear_last();
$safeResult = \ssh2_send_eof($channel);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
{
error_clear_last();
$safeResult = \ssh2_sftp_chmod($sftp, $filename, $mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool $recursive = false): void
{
error_clear_last();
$safeResult = \ssh2_sftp_mkdir($sftp, $dirname, $mode, $recursive);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}











function ssh2_sftp_rename($sftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rename($sftp, $from, $to);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp_rmdir($sftp, string $dirname): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rmdir($sftp, $dirname);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_symlink($sftp, string $target, string $link): void
{
error_clear_last();
$safeResult = \ssh2_sftp_symlink($sftp, $target, $link);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}










function ssh2_sftp_unlink($sftp, string $filename): void
{
error_clear_last();
$safeResult = \ssh2_sftp_unlink($sftp, $filename);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp($session)
{
error_clear_last();
$safeResult = \ssh2_sftp($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}




















function ssh2_shell($session, string $term_type = "vanilla", ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_shell($session, $term_type, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_shell($session, $term_type, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_shell($session, $term_type, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_shell($session, $term_type, $env);
} else {
$safeResult = \ssh2_shell($session, $term_type);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RpminfoException;








function rpmaddtag(int $tag): void
{
error_clear_last();
$safeResult = \rpmaddtag($tag);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FpmException;









function fastcgi_finish_request(): void
{
error_clear_last();
$safeResult = \fastcgi_finish_request();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\InotifyException;









function inotify_init()
{
error_clear_last();
$safeResult = \inotify_init();
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}













function inotify_rm_watch($inotify_instance, int $watch_descriptor): void
{
error_clear_last();
$safeResult = \inotify_rm_watch($inotify_instance, $watch_descriptor);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZipException;








function zip_entry_close($zip_entry): void
{
error_clear_last();
$safeResult = \zip_entry_close($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}










function zip_entry_compressedsize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_compressedsize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}











function zip_entry_compressionmethod($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_compressionmethod($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_filesize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_filesize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_name($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_name($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
















function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
$safeResult = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}













function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
$safeResult = \zip_entry_read($zip_entry, $len);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StringsException;









function convert_uudecode(string $string): string
{
error_clear_last();
$safeResult = \convert_uudecode($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}










function hex2bin(string $string): string
{
error_clear_last();
$safeResult = \hex2bin($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
















function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \md5_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}












function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \sha1_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CalendarException;












function unixtojd(?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \unixtojd($timestamp);
} else {
$safeResult = \unixtojd();
}
if ($safeResult === false) {
throw CalendarException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcntlException;















function pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_getpriority($process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_getpriority($process_id);
} else {
$safeResult = \pcntl_getpriority();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}


















function pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_setpriority($priority, $process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_setpriority($priority, $process_id);
} else {
$safeResult = \pcntl_setpriority($priority);
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}










function pcntl_signal_dispatch(): void
{
error_clear_last();
$safeResult = \pcntl_signal_dispatch();
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}















































function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
{
error_clear_last();
$safeResult = \pcntl_signal($signal, $handler, $restart_syscalls);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}






















function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
$safeResult = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
{
error_clear_last();
$safeResult = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}














































function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
$safeResult = \pcntl_sigwaitinfo($signals, $info);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\IconvException;




















function iconv_get_encoding(string $type = "all")
{
error_clear_last();
$safeResult = \iconv_get_encoding($type);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





















































function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_mime_decode($string, $mode, $encoding);
} else {
$safeResult = \iconv_mime_decode($string, $mode);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}












































































































function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string
{
error_clear_last();
$safeResult = \iconv_mime_encode($field_name, $field_value, $options);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
















function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
$safeResult = \iconv_set_encoding($type, $encoding);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
}


















function iconv_strlen(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_strlen($string, $encoding);
} else {
$safeResult = \iconv_strlen($string);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





























function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
$safeResult = \iconv($from_encoding, $to_encoding, $string);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InfoException;







































































































function assert_options(int $what, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \assert_options($what, $value);
} else {
$safeResult = \assert_options($what);
}
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}











function cli_set_process_title(string $title): void
{
error_clear_last();
$safeResult = \cli_set_process_title($title);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
























































function dl(string $extension_filename): void
{
error_clear_last();
$safeResult = \dl($extension_filename);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}


















function get_cfg_var(string $option)
{
error_clear_last();
$safeResult = \get_cfg_var($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function get_include_path(): string
{
error_clear_last();
$safeResult = \get_include_path();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getlastmod(): int
{
error_clear_last();
$safeResult = \getlastmod();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmygid(): int
{
error_clear_last();
$safeResult = \getmygid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyinode(): int
{
error_clear_last();
$safeResult = \getmyinode();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmypid(): int
{
error_clear_last();
$safeResult = \getmypid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyuid(): int
{
error_clear_last();
$safeResult = \getmyuid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
$safeResult = \getopt($short_options, $long_options, $rest_index);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getrusage(int $mode = 0): array
{
error_clear_last();
$safeResult = \getrusage($mode);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function ini_get(string $option): string
{
error_clear_last();
$safeResult = \ini_get($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}















function ini_set(string $option, string $value): string
{
error_clear_last();
$safeResult = \ini_set($option, $value);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}


















function php_sapi_name(): string
{
error_clear_last();
$safeResult = \php_sapi_name();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}







































































function phpcredits(int $flags = CREDITS_ALL): void
{
error_clear_last();
$safeResult = \phpcredits($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}






































































































function phpinfo(int $flags = INFO_ALL): void
{
error_clear_last();
$safeResult = \phpinfo($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function putenv(string $assignment): void
{
error_clear_last();
$safeResult = \putenv($assignment);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function set_include_path(string $include_path): string
{
error_clear_last();
$safeResult = \set_include_path($include_path);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}



















function set_time_limit(int $seconds): void
{
error_clear_last();
$safeResult = \set_time_limit($seconds);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbmDb2Exception;











































function db2_autocommit($connection, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \db2_autocommit($connection, $value);
} else {
$safeResult = \db2_autocommit($connection);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}





































function db2_bind_param($stmt, int $parameter_number, string $variable_name, ?int $parameter_type = null, int $data_type = 0, int $precision = -1, int $scale = 0): void
{
error_clear_last();
if ($scale !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision, $scale);
} elseif ($precision !== -1) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision);
} elseif ($data_type !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type);
} elseif ($parameter_type !== null) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type);
} else {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}















































































































function db2_client_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_client_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}















function db2_close($connection): void
{
error_clear_last();
$safeResult = \db2_close($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_commit($connection): void
{
error_clear_last();
$safeResult = \db2_commit($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}


























function db2_execute($stmt, ?array $parameters = null): void
{
error_clear_last();
if ($parameters !== null) {
$safeResult = \db2_execute($stmt, $parameters);
} else {
$safeResult = \db2_execute($stmt);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_result($stmt): void
{
error_clear_last();
$safeResult = \db2_free_result($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \db2_free_stmt($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
























































































































































function db2_get_option($resource, string $option): string
{
error_clear_last();
$safeResult = \db2_get_option($resource, $option);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}
























function db2_pclose($resource): void
{
error_clear_last();
$safeResult = \db2_pclose($resource);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_rollback($connection): void
{
error_clear_last();
$safeResult = \db2_rollback($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}





























































































































































































































































function db2_server_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_server_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}



























































































































































































































































































































































































function db2_set_option($resource, array $options, int $type): void
{
error_clear_last();
$safeResult = \db2_set_option($resource, $options, $type);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
<?php

return [
'apache_getenv',
'apache_get_version',
'apache_lookup_uri',
'apache_request_headers',
'apache_response_headers',
'apache_setenv',
'apcu_cache_info',
'apcu_cas',
'apcu_dec',
'apcu_fetch',
'apcu_inc',
'apcu_sma_info',
'array_combine',
'array_flip',
'array_replace',
'array_replace_recursive',
'array_walk_recursive',
'assert_options',
'base64_decode',
'bindtextdomain',
'bzclose',
'bzflush',
'bzopen',
'bzread',
'bzwrite',
'chdir',
'chgrp',
'chmod',
'chown',
'chroot',
'class_alias',
'class_implements',
'class_parents',
'class_uses',
'cli_set_process_title',
'closelog',
'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
'copy',
'cubrid_bind',
'cubrid_column_names',
'cubrid_column_types',
'cubrid_col_size',
'cubrid_commit',
'cubrid_connect',
'cubrid_connect_with_url',
'cubrid_current_oid',
'cubrid_disconnect',
'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
'cubrid_lob2_bind',
'cubrid_lob2_close',
'cubrid_lob2_export',
'cubrid_lob2_import',
'cubrid_lob2_new',
'cubrid_lob2_read',
'cubrid_lob2_seek',
'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
'cubrid_lob2_write',
'cubrid_lob_close',
'cubrid_lob_export',
'cubrid_lob_get',
'cubrid_lob_send',
'cubrid_lob_size',
'cubrid_lock_read',
'cubrid_lock_write',
'cubrid_move_cursor',
'cubrid_next_result',
'cubrid_pconnect',
'cubrid_pconnect_with_url',
'cubrid_prepare',
'cubrid_put',
'cubrid_rollback',
'cubrid_schema',
'cubrid_seq_drop',
'cubrid_seq_insert',
'cubrid_seq_put',
'cubrid_set_add',
'cubrid_set_autocommit',
'cubrid_set_db_parameter',
'cubrid_set_drop',
'cubrid_set_query_timeout',
'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
'curl_multi_info_read',
'curl_multi_init',
'curl_multi_setopt',
'curl_setopt',
'curl_share_errno',
'curl_share_setopt',
'curl_unescape',
'date',
'date_parse',
'date_parse_from_format',
'date_sunrise',
'date_sunset',
'date_sun_info',
'db2_autocommit',
'db2_bind_param',
'db2_client_info',
'db2_close',
'db2_commit',
'db2_execute',
'db2_free_result',
'db2_free_stmt',
'db2_get_option',
'db2_pclose',
'db2_rollback',
'db2_server_info',
'db2_set_option',
'define',
'deflate_add',
'deflate_init',
'dir',
'disk_free_space',
'disk_total_space',
'dl',
'dns_get_record',
'eio_busy',
'eio_chmod',
'eio_chown',
'eio_close',
'eio_custom',
'eio_dup2',
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
'eio_fsync',
'eio_ftruncate',
'eio_futime',
'eio_grp',
'eio_lstat',
'eio_mkdir',
'eio_mknod',
'eio_nop',
'eio_readahead',
'eio_readdir',
'eio_readlink',
'eio_rename',
'eio_rmdir',
'eio_seek',
'eio_sendfile',
'eio_stat',
'eio_statvfs',
'eio_symlink',
'eio_sync',
'eio_syncfs',
'eio_sync_file_range',
'eio_truncate',
'eio_unlink',
'eio_utime',
'eio_write',
'error_log',
'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
'fdatasync',
'fflush',
'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
'fileperms',
'filesize',
'filetype',
'file_get_contents',
'file_put_contents',
'filter_input_array',
'filter_var_array',
'finfo_close',
'finfo_open',
'flock',
'fopen',
'fputcsv',
'fread',
'fsockopen',
'fstat',
'fsync',
'ftell',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
'ftp_chdir',
'ftp_chmod',
'ftp_close',
'ftp_connect',
'ftp_delete',
'ftp_fget',
'ftp_fput',
'ftp_get',
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
'ftp_size',
'ftp_ssl_connect',
'ftp_systype',
'ftruncate',
'fwrite',
'getallheaders',
'getcwd',
'gethostname',
'getimagesize',
'getlastmod',
'getmygid',
'getmyinode',
'getmypid',
'getmyuid',
'getopt',
'getprotobyname',
'getprotobynumber',
'getrusage',
'getservbyport',
'get_cfg_var',
'get_headers',
'get_include_path',
'get_meta_tags',
'glob',
'gmmktime',
'gmp_random_seed',
'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
'gzcompress',
'gzdecode',
'gzdeflate',
'gzencode',
'gzfile',
'gzgets',
'gzinflate',
'gzopen',
'gzpassthru',
'gzread',
'gzrewind',
'gztell',
'gzuncompress',
'gzwrite',
'hash_hkdf',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'highlight_string',
'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
'ibase_blob_create',
'ibase_blob_get',
'ibase_close',
'ibase_commit',
'ibase_commit_ret',
'ibase_connect',
'ibase_delete_user',
'ibase_drop_db',
'ibase_free_event_handler',
'ibase_free_query',
'ibase_free_result',
'ibase_maintain_db',
'ibase_modify_user',
'ibase_name_result',
'ibase_pconnect',
'ibase_restore',
'ibase_rollback',
'ibase_rollback_ret',
'ibase_service_attach',
'ibase_service_detach',
'iconv',
'iconv_get_encoding',
'iconv_mime_decode',
'iconv_mime_encode',
'iconv_set_encoding',
'iconv_strlen',
'idate',
'imageaffine',
'imageaffinematrixconcat',
'imageaffinematrixget',
'imagealphablending',
'imageantialias',
'imagearc',
'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
'imagecolorset',
'imagecolorsforindex',
'imageconvolution',
'imagecopy',
'imagecopymerge',
'imagecopymergegray',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
'imagecreatefromgd2part',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatefromstring',
'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
'imagecreatefromxpm',
'imagecreatetruecolor',
'imagecrop',
'imagecropauto',
'imagedashedline',
'imagedestroy',
'imageellipse',
'imagefill',
'imagefilledarc',
'imagefilledellipse',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
'imageftbbox',
'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
'imagegif',
'imagegrabscreen',
'imagegrabwindow',
'imagejpeg',
'imagelayereffect',
'imageline',
'imageloadfont',
'imagepng',
'imagerectangle',
'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
'imagesetbrush',
'imagesetclip',
'imagesetinterpolation',
'imagesetpixel',
'imagesetstyle',
'imagesetthickness',
'imagesettile',
'imagestring',
'imagestringup',
'imagesx',
'imagesy',
'imagetruecolortopalette',
'imagettfbbox',
'imagettftext',
'imagewbmp',
'imagewebp',
'imagexbm',
'image_type_to_extension',
'imap_8bit',
'imap_append',
'imap_base64',
'imap_binary',
'imap_body',
'imap_bodystruct',
'imap_check',
'imap_clearflag_full',
'imap_close',
'imap_createmailbox',
'imap_deletemailbox',
'imap_fetchbody',
'imap_fetchheader',
'imap_fetchmime',
'imap_fetchstructure',
'imap_fetch_overview',
'imap_gc',
'imap_getacl',
'imap_getmailboxes',
'imap_getsubscribed',
'imap_headerinfo',
'imap_headers',
'imap_listscan',
'imap_lsub',
'imap_mail',
'imap_mailboxmsginfo',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
'imap_qprint',
'imap_renamemailbox',
'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_setflag_full',
'imap_set_quota',
'imap_sort',
'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
'imap_undelete',
'imap_unsubscribe',
'imap_utf8_to_mutf7',
'inet_ntop',
'inet_pton',
'inflate_add',
'inflate_get_read_len',
'inflate_get_status',
'inflate_init',
'ini_get',
'ini_set',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
'json_decode',
'json_encode',
'lchgrp',
'lchown',
'ldap_8859_to_t61',
'ldap_add',
'ldap_bind',
'ldap_compare',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
'ldap_explode_dn',
'ldap_first_attribute',
'ldap_first_entry',
'ldap_free_result',
'ldap_get_attributes',
'ldap_get_dn',
'ldap_get_entries',
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
'ldap_modify_batch',
'ldap_mod_add',
'ldap_mod_del',
'ldap_mod_replace',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
'ldap_rename',
'ldap_sasl_bind',
'ldap_set_option',
'ldap_unbind',
'libxml_set_external_entity_loader',
'link',
'long2ip',
'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
'mailparse_msg_free',
'mailparse_msg_parse',
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
'mb_convert_encoding',
'mb_detect_order',
'mb_encoding_aliases',
'mb_eregi_replace',
'mb_ereg_replace',
'mb_ereg_replace_callback',
'mb_ereg_search_getregs',
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
'mb_parse_str',
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
'md5_file',
'mime_content_type',
'mkdir',
'mktime',
'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
'msg_stat_queue',
'mysqli_get_client_stats',
'mysql_close',
'mysql_connect',
'mysql_create_db',
'mysql_data_seek',
'mysql_db_name',
'mysql_db_query',
'mysql_drop_db',
'mysql_fetch_lengths',
'mysql_field_flags',
'mysql_field_len',
'mysql_field_name',
'mysql_field_seek',
'mysql_free_result',
'mysql_get_host_info',
'mysql_get_proto_info',
'mysql_get_server_info',
'mysql_info',
'mysql_list_dbs',
'mysql_list_fields',
'mysql_list_processes',
'mysql_list_tables',
'mysql_num_fields',
'mysql_num_rows',
'mysql_query',
'mysql_real_escape_string',
'mysql_result',
'mysql_select_db',
'mysql_set_charset',
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
'ob_clean',
'ob_end_clean',
'ob_end_flush',
'ob_flush',
'ob_get_clean',
'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
'oci_field_size',
'oci_field_type',
'oci_field_type_raw',
'oci_free_descriptor',
'oci_free_statement',
'oci_new_collection',
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
'oci_set_action',
'oci_set_call_timeout',
'oci_set_client_identifier',
'oci_set_client_info',
'oci_set_db_operation',
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
'odbc_binmode',
'odbc_columnprivileges',
'odbc_columns',
'odbc_commit',
'odbc_connect',
'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
'odbc_fetch_into',
'odbc_field_len',
'odbc_field_name',
'odbc_field_num',
'odbc_field_scale',
'odbc_field_type',
'odbc_foreignkeys',
'odbc_gettypeinfo',
'odbc_longreadlen',
'odbc_num_fields',
'odbc_pconnect',
'odbc_prepare',
'odbc_primarykeys',
'odbc_procedurecolumns',
'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
'odbc_setoption',
'odbc_specialcolumns',
'odbc_statistics',
'odbc_tableprivileges',
'odbc_tables',
'opcache_compile_file',
'opcache_get_status',
'opendir',
'openlog',
'openssl_cipher_iv_length',
'openssl_cms_decrypt',
'openssl_cms_encrypt',
'openssl_cms_read',
'openssl_cms_sign',
'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
'openssl_decrypt',
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt',
'openssl_pkcs7_read',
'openssl_pkcs7_sign',
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_private',
'openssl_pkey_get_public',
'openssl_pkey_new',
'openssl_private_decrypt',
'openssl_private_encrypt',
'openssl_public_decrypt',
'openssl_public_encrypt',
'openssl_random_pseudo_bytes',
'openssl_seal',
'openssl_sign',
'openssl_spki_export',
'openssl_spki_export_challenge',
'openssl_spki_new',
'openssl_spki_verify',
'openssl_verify',
'openssl_x509_checkpurpose',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
'openssl_x509_read',
'output_add_rewrite_var',
'output_reset_rewrite_vars',
'pack',
'parse_ini_file',
'parse_ini_string',
'parse_url',
'pclose',
'pcntl_getpriority',
'pcntl_setpriority',
'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
'pcntl_sigtimedwait',
'pcntl_sigwaitinfo',
'pfsockopen',
'pg_cancel_query',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
'pg_delete',
'pg_end_copy',
'pg_execute',
'pg_field_num',
'pg_field_table',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
'pg_prepare',
'pg_put_line',
'pg_query',
'pg_query_params',
'pg_result_error_field',
'pg_result_seek',
'pg_select',
'pg_socket',
'pg_trace',
'pg_update',
'phpcredits',
'phpinfo',
'php_sapi_name',
'popen',
'posix_access',
'posix_getgrgid',
'posix_getgrnam',
'posix_getgroups',
'posix_getlogin',
'posix_getpgid',
'posix_getpwuid',
'posix_getrlimit',
'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
'posix_mknod',
'posix_setegid',
'posix_seteuid',
'posix_setgid',
'posix_setpgid',
'posix_setrlimit',
'posix_setsid',
'posix_setuid',
'posix_times',
'posix_uname',
'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_replace_callback',
'preg_replace_callback_array',
'preg_split',
'proc_close',
'proc_nice',
'proc_open',
'pspell_add_to_personal',
'pspell_add_to_session',
'pspell_clear_session',
'pspell_config_create',
'pspell_config_data_dir',
'pspell_config_dict_dir',
'pspell_config_ignore',
'pspell_config_mode',
'pspell_config_personal',
'pspell_config_repl',
'pspell_config_runtogether',
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
'ps_add_locallink',
'ps_add_note',
'ps_add_pdflink',
'ps_add_weblink',
'ps_arc',
'ps_arcn',
'ps_begin_page',
'ps_begin_pattern',
'ps_begin_template',
'ps_circle',
'ps_clip',
'ps_close',
'ps_closepath',
'ps_closepath_stroke',
'ps_close_image',
'ps_continue_text',
'ps_curveto',
'ps_delete',
'ps_end_page',
'ps_end_pattern',
'ps_end_template',
'ps_fill',
'ps_fill_stroke',
'ps_get_parameter',
'ps_hyphenate',
'ps_include_file',
'ps_lineto',
'ps_moveto',
'ps_new',
'ps_open_file',
'ps_place_image',
'ps_rect',
'ps_restore',
'ps_rotate',
'ps_save',
'ps_scale',
'ps_setcolor',
'ps_setdash',
'ps_setflat',
'ps_setfont',
'ps_setgray',
'ps_setlinecap',
'ps_setlinejoin',
'ps_setlinewidth',
'ps_setmiterlimit',
'ps_setoverprintmode',
'ps_setpolydash',
'ps_set_border_color',
'ps_set_border_dash',
'ps_set_border_style',
'ps_set_info',
'ps_set_parameter',
'ps_set_text_pos',
'ps_set_value',
'ps_shading',
'ps_shading_pattern',
'ps_shfill',
'ps_show',
'ps_show2',
'ps_show_xy',
'ps_show_xy2',
'ps_stroke',
'ps_symbol',
'ps_translate',
'putenv',
'readfile',
'readgzfile',
'readline_add_history',
'readline_callback_handler_install',
'readline_clear_history',
'readline_completion_function',
'readline_read_history',
'readline_write_history',
'readlink',
'realpath',
'register_tick_function',
'rename',
'rewind',
'rmdir',
'rpmaddtag',
'rrd_create',
'rrd_first',
'rrd_graph',
'rrd_info',
'rrd_lastupdate',
'rrd_restore',
'rrd_tune',
'rrd_update',
'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
'sem_get',
'sem_release',
'sem_remove',
'session_abort',
'session_create_id',
'session_decode',
'session_destroy',
'session_encode',
'session_id',
'session_module_name',
'session_name',
'session_regenerate_id',
'session_reset',
'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
'shell_exec',
'shmop_delete',
'shmop_read',
'shm_attach',
'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
'shuffle',
'simplexml_import_dom',
'simplexml_load_file',
'simplexml_load_string',
'sleep',
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
'socket_addrinfo_lookup',
'socket_bind',
'socket_connect',
'socket_create',
'socket_create_listen',
'socket_create_pair',
'socket_export_stream',
'socket_getpeername',
'socket_getsockname',
'socket_get_option',
'socket_import_stream',
'socket_listen',
'socket_read',
'socket_send',
'socket_sendmsg',
'socket_sendto',
'socket_set_block',
'socket_set_nonblock',
'socket_set_option',
'socket_shutdown',
'socket_write',
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify',
'sodium_crypto_box_open',
'sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open',
'sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached',
'solr_get_version',
'spl_autoload_register',
'spl_autoload_unregister',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
'sqlsrv_close',
'sqlsrv_commit',
'sqlsrv_configure',
'sqlsrv_execute',
'sqlsrv_fetch',
'sqlsrv_fetch_array',
'sqlsrv_fetch_object',
'sqlsrv_free_stmt',
'sqlsrv_get_field',
'sqlsrv_next_result',
'sqlsrv_num_fields',
'sqlsrv_num_rows',
'sqlsrv_prepare',
'sqlsrv_query',
'sqlsrv_rollback',
'ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent',
'ssh2_auth_hostbased_file',
'ssh2_auth_password',
'ssh2_auth_pubkey_file',
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
'ssh2_forward_accept',
'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
'ssh2_sftp_rename',
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
'ssh2_shell',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
'stream_filter_prepend',
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
'stream_socket_pair',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
'strftime',
'strptime',
'strtotime',
'swoole_async_dns_lookup',
'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
'swoole_event_del',
'swoole_event_write',
'symlink',
'syslog',
'system',
'sys_getloadavg',
'tempnam',
'timezone_name_from_abbr',
'time_nanosleep',
'time_sleep_until',
'tmpfile',
'touch',
'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
'variant_date_to_timestamp',
'variant_round',
'virtual',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
'xdiff_file_diff_binary',
'xdiff_file_patch_binary',
'xdiff_file_rabdiff',
'xdiff_string_bpatch',
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
'xml_parser_free',
'xml_set_character_data_handler',
'xml_set_default_handler',
'xml_set_element_handler',
'xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler',
'xml_set_object',
'xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
'yaz_ccl_parse',
'yaz_close',
'yaz_connect',
'yaz_database',
'yaz_element',
'yaz_present',
'yaz_search',
'yaz_wait',
'zip_entry_close',
'zip_entry_compressedsize',
'zip_entry_compressionmethod',
'zip_entry_filesize',
'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
];
<?php

namespace Safe;

use Safe\Exceptions\FileinfoException;








function finfo_close(\finfo $finfo): void
{
error_clear_last();
$safeResult = \finfo_close($finfo);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
}
























function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): \finfo
{
error_clear_last();
if ($magic_database !== null) {
$safeResult = \finfo_open($flags, $magic_database);
} else {
$safeResult = \finfo_open($flags);
}
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}












function mime_content_type($filename): string
{
error_clear_last();
$safeResult = \mime_content_type($filename);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/calendar.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/calendar.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/calendar.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/calendar.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/calendar.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/pcntl.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/pcntl.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/pcntl.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/pcntl.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/pcntl.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/iconv.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/iconv.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/iconv.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/iconv.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/iconv.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/info.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/info.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/info.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/info.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/info.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/ibmDb2.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/ibmDb2.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/ibmDb2.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/ibmDb2.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/ibmDb2.php';
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
return require_once __DIR__ . '/8.1/functionsList.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
return require_once __DIR__ . '/8.2/functionsList.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
return require_once __DIR__ . '/8.3/functionsList.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
return require_once __DIR__ . '/8.4/functionsList.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
return require_once __DIR__ . '/8.5/functionsList.php';
}
<?php

namespace Safe;

use Safe\Exceptions\OpensslException;









function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_iv_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_cipher_key_length(string $cipher_algo): int
{
error_clear_last();
$safeResult = \openssl_cipher_key_length($cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
} elseif ($private_key !== null) {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_cms_read(string $input_filename, array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_cms_read($input_filename, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}



















function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, ?array $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_cms_verify(string $input_filename, int $flags = 0, ?string $certificates = null, array $ca_info = [], ?string $untrusted_certificates_filename = null, ?string $content = null, ?string $pk7 = null, ?string $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
{
error_clear_last();
if ($encoding !== OPENSSL_ENCODING_SMIME) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
} elseif ($sigfile !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
} elseif ($pk7 !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
} elseif ($content !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
} elseif ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
} elseif ($ca_info !== []) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
} elseif ($certificates !== null) {
$safeResult = \openssl_cms_verify($input_filename, $flags, $certificates);
} else {
$safeResult = \openssl_cms_verify($input_filename, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_csr_export($csr, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}












function openssl_csr_get_public_key($csr, bool $short_names = true): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_csr_get_public_key($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
$safeResult = \openssl_csr_get_subject($csr, $short_names);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















































































































function openssl_csr_new(array $distinguished_names, \OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null): \OpenSSLCertificateSigningRequest
{
error_clear_last();
if ($extra_attributes !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
} elseif ($options !== null) {
$safeResult = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
$safeResult = \openssl_csr_new($distinguished_names, $private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

























function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, ?array $options = null, int $serial = 0): \OpenSSLCertificate
{
error_clear_last();
if ($serial !== 0) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
} elseif ($options !== null) {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
$safeResult = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}



















function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", ?string $tag = null, string $aad = ""): string
{
error_clear_last();
if ($aad !== "") {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
} elseif ($tag !== null) {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag);
} else {
$safeResult = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}













function openssl_dh_compute_key(string $public_key, \OpenSSLAsymmetricKey $private_key): string
{
error_clear_last();
$safeResult = \openssl_dh_compute_key($public_key, $private_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}














function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_digest($data, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















































function openssl_get_curve_names(): array
{
error_clear_last();
$safeResult = \openssl_get_curve_names();
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




























function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, ?string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
$safeResult = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
$safeResult = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}




































function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




































function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}













function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
$safeResult = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
















function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
if ($private_key !== null) {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
$safeResult = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}
























function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
$safeResult = \openssl_pkcs7_read($data, $certificates);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


























function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, ?string $untrusted_certificates_filename = null): void
{
error_clear_last();
if ($untrusted_certificates_filename !== null) {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
$safeResult = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
{
error_clear_last();
$safeResult = \openssl_pkey_derive($public_key, $private_key, $key_length);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}


















function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
$safeResult = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
$safeResult = \openssl_pkey_export($key, $output, $passphrase);
} else {
$safeResult = \openssl_pkey_export($key, $output);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_pkey_get_private($private_key, ?string $passphrase = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \openssl_pkey_get_private($private_key, $passphrase);
} else {
$safeResult = \openssl_pkey_get_private($private_key);
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_pkey_get_public($public_key): \OpenSSLAsymmetricKey
{
error_clear_last();
$safeResult = \openssl_pkey_get_public($public_key);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}















function openssl_pkey_new(?array $options = null): \OpenSSLAsymmetricKey
{
error_clear_last();
if ($options !== null) {
$safeResult = \openssl_pkey_new($options);
} else {
$safeResult = \openssl_pkey_new();
}
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}






















function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}




















function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}





















function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
$safeResult = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}


















function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null)
{
error_clear_last();
$safeResult = \openssl_random_pseudo_bytes($length, $strong_result);
return $safeResult;
}
































function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
$safeResult = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}





















function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
{
error_clear_last();
$safeResult = \openssl_sign($data, $signature, $private_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}










function openssl_spki_export_challenge(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export_challenge($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}










function openssl_spki_export(string $spki): ?string
{
error_clear_last();
$safeResult = \openssl_spki_export($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
















function openssl_spki_new(\OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
{
error_clear_last();
$safeResult = \openssl_spki_new($private_key, $challenge, $digest_algo);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}









function openssl_spki_verify(string $spki): void
{
error_clear_last();
$safeResult = \openssl_spki_verify($spki);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}























function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
$safeResult = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}































































function openssl_x509_checkpurpose($certificate, int $purpose, array $ca_info = [], ?string $untrusted_certificates_file = null)
{
error_clear_last();
if ($untrusted_certificates_file !== null) {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info, $untrusted_certificates_file);
} else {
$safeResult = \openssl_x509_checkpurpose($certificate, $purpose, $ca_info);
}
if ($safeResult === -1) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}

















function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}

















function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
$safeResult = \openssl_x509_export($certificate, $output, $no_text);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
}















function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
$safeResult = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}












function openssl_x509_read($certificate): \OpenSSLCertificate
{
error_clear_last();
$safeResult = \openssl_x509_read($certificate);
if ($safeResult === false) {
throw OpensslException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ExecException;





























function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \exec($command, $output, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}





















function passthru(string $command, ?int &$result_code = null): void
{
error_clear_last();
$safeResult = \passthru($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}


















function proc_close($process): int
{
error_clear_last();
$safeResult = \proc_close($process);
if ($safeResult === -1) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}






















function proc_nice(int $priority): void
{
error_clear_last();
$safeResult = \proc_nice($priority);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
}

















































































function proc_open(string $command, array $descriptor_spec, ?array &$pipes, ?string $cwd = null, ?array $env_vars = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars, $options);
} elseif ($env_vars !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd, $env_vars);
} elseif ($cwd !== null) {
$safeResult = \proc_open($command, $descriptor_spec, $pipes, $cwd);
} else {
$safeResult = \proc_open($command, $descriptor_spec, $pipes);
}
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}










function shell_exec(string $command): ?string
{
error_clear_last();
$safeResult = \shell_exec($command);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}























function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
$safeResult = \system($command, $result_code);
if ($safeResult === false) {
throw ExecException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LibxmlException;














































function libxml_set_external_entity_loader(callable $resolver_function): void
{
error_clear_last();
$safeResult = \libxml_set_external_entity_loader($resolver_function);
if ($safeResult === false) {
throw LibxmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ClassobjException;












function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
$safeResult = \class_alias($class, $alias, $autoload);
if ($safeResult === false) {
throw ClassobjException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SsdeepException;













function ssdeep_fuzzy_compare(string $signature1, string $signature2): int
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_compare($signature1, $signature2);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}













function ssdeep_fuzzy_hash_filename(string $file_name): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash_filename($file_name);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}












function ssdeep_fuzzy_hash(string $to_hash): string
{
error_clear_last();
$safeResult = \ssdeep_fuzzy_hash($to_hash);
if ($safeResult === false) {
throw SsdeepException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PsException;






















function ps_add_launchlink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename): void
{
error_clear_last();
$safeResult = \ps_add_launchlink($psdoc, $llx, $lly, $urx, $ury, $filename);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}






























function ps_add_locallink($psdoc, float $llx, float $lly, float $urx, float $ury, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_locallink($psdoc, $llx, $lly, $urx, $ury, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}































function ps_add_note($psdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
{
error_clear_last();
$safeResult = \ps_add_note($psdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































function ps_add_pdflink($psdoc, float $llx, float $lly, float $urx, float $ury, string $filename, int $page, string $dest): void
{
error_clear_last();
$safeResult = \ps_add_pdflink($psdoc, $llx, $lly, $urx, $ury, $filename, $page, $dest);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

























function ps_add_weblink($psdoc, float $llx, float $lly, float $urx, float $ury, string $url): void
{
error_clear_last();
$safeResult = \ps_add_weblink($psdoc, $llx, $lly, $urx, $ury, $url);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arc($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arc($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_arcn($psdoc, float $x, float $y, float $radius, float $alpha, float $beta): void
{
error_clear_last();
$safeResult = \ps_arcn($psdoc, $x, $y, $radius, $alpha, $beta);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











































function ps_begin_page($psdoc, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_begin_page($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}





















function ps_begin_pattern($psdoc, float $width, float $height, float $xstep, float $ystep, int $painttype): int
{
error_clear_last();
$safeResult = \ps_begin_pattern($psdoc, $width, $height, $xstep, $ystep, $painttype);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}


















function ps_begin_template($psdoc, float $width, float $height): int
{
error_clear_last();
$safeResult = \ps_begin_template($psdoc, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




















function ps_circle($psdoc, float $x, float $y, float $radius): void
{
error_clear_last();
$safeResult = \ps_circle($psdoc, $x, $y, $radius);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_clip($psdoc): void
{
error_clear_last();
$safeResult = \ps_clip($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_close_image($psdoc, int $imageid): void
{
error_clear_last();
$safeResult = \ps_close_image($psdoc, $imageid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_close($psdoc): void
{
error_clear_last();
$safeResult = \ps_close($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_closepath($psdoc): void
{
error_clear_last();
$safeResult = \ps_closepath($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_continue_text($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_continue_text($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

















function ps_curveto($psdoc, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
{
error_clear_last();
$safeResult = \ps_curveto($psdoc, $x1, $y1, $x2, $y2, $x3, $y3);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_delete($psdoc): void
{
error_clear_last();
$safeResult = \ps_delete($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_end_page($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_page($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_end_pattern($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_pattern($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_end_template($psdoc): void
{
error_clear_last();
$safeResult = \ps_end_template($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_fill($psdoc): void
{
error_clear_last();
$safeResult = \ps_fill($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
































































































































function ps_get_parameter($psdoc, string $name, ?float $modifier = null): string
{
error_clear_last();
if ($modifier !== null) {
$safeResult = \ps_get_parameter($psdoc, $name, $modifier);
} else {
$safeResult = \ps_get_parameter($psdoc, $name);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}























function ps_hyphenate($psdoc, string $text): array
{
error_clear_last();
$safeResult = \ps_hyphenate($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}













function ps_include_file($psdoc, string $file): void
{
error_clear_last();
$safeResult = \ps_include_file($psdoc, $file);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_lineto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_lineto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_moveto($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_moveto($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_new()
{
error_clear_last();
$safeResult = \ps_new();
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}














function ps_open_file($psdoc, ?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \ps_open_file($psdoc, $filename);
} else {
$safeResult = \ps_open_file($psdoc);
}
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}




















function ps_place_image($psdoc, int $imageid, float $x, float $y, float $scale): void
{
error_clear_last();
$safeResult = \ps_place_image($psdoc, $imageid, $x, $y, $scale);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_rect($psdoc, float $x, float $y, float $width, float $height): void
{
error_clear_last();
$safeResult = \ps_rect($psdoc, $x, $y, $width, $height);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_restore($psdoc): void
{
error_clear_last();
$safeResult = \ps_restore($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_rotate($psdoc, float $rot): void
{
error_clear_last();
$safeResult = \ps_rotate($psdoc, $rot);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_save($psdoc): void
{
error_clear_last();
$safeResult = \ps_save($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_scale($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_scale($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_color($psdoc, float $red, float $green, float $blue): void
{
error_clear_last();
$safeResult = \ps_set_border_color($psdoc, $red, $green, $blue);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_dash($psdoc, float $black, float $white): void
{
error_clear_last();
$safeResult = \ps_set_border_dash($psdoc, $black, $white);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}


















function ps_set_border_style($psdoc, string $style, float $width): void
{
error_clear_last();
$safeResult = \ps_set_border_style($psdoc, $style, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}







































function ps_set_info($p, string $key, string $val): void
{
error_clear_last();
$safeResult = \ps_set_info($p, $key, $val);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_set_parameter($psdoc, string $name, string $value): void
{
error_clear_last();
$safeResult = \ps_set_parameter($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_set_text_pos($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_set_text_pos($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}

































































function ps_set_value($psdoc, string $name, float $value): void
{
error_clear_last();
$safeResult = \ps_set_value($psdoc, $name, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



























function ps_setcolor($psdoc, string $type, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
{
error_clear_last();
$safeResult = \ps_setcolor($psdoc, $type, $colorspace, $c1, $c2, $c3, $c4);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_setdash($psdoc, float $on, float $off): void
{
error_clear_last();
$safeResult = \ps_setdash($psdoc, $on, $off);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setflat($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setflat($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setfont($psdoc, int $fontid, float $size): void
{
error_clear_last();
$safeResult = \ps_setfont($psdoc, $fontid, $size);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setgray($psdoc, float $gray): void
{
error_clear_last();
$safeResult = \ps_setgray($psdoc, $gray);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinecap($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinecap($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setlinejoin($psdoc, int $type): void
{
error_clear_last();
$safeResult = \ps_setlinejoin($psdoc, $type);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_setlinewidth($psdoc, float $width): void
{
error_clear_last();
$safeResult = \ps_setlinewidth($psdoc, $width);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_setmiterlimit($psdoc, float $value): void
{
error_clear_last();
$safeResult = \ps_setmiterlimit($psdoc, $value);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_setoverprintmode($psdoc, int $mode): void
{
error_clear_last();
$safeResult = \ps_setoverprintmode($psdoc, $mode);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}














function ps_setpolydash($psdoc, float $arr): void
{
error_clear_last();
$safeResult = \ps_setpolydash($psdoc, $arr);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
















function ps_shading_pattern($psdoc, int $shadingid, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading_pattern($psdoc, $shadingid, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}




































function ps_shading($psdoc, string $type, float $x0, float $y0, float $x1, float $y1, float $c1, float $c2, float $c3, float $c4, string $optlist): int
{
error_clear_last();
$safeResult = \ps_shading($psdoc, $type, $x0, $y0, $x1, $y1, $c1, $c2, $c3, $c4, $optlist);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
return $safeResult;
}















function ps_shfill($psdoc, int $shadingid): void
{
error_clear_last();
$safeResult = \ps_shfill($psdoc, $shadingid);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_show_xy($psdoc, string $text, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_show_xy($psdoc, $text, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}















function ps_show_xy2($psdoc, string $text, int $len, float $xcoor, float $ycoor): void
{
error_clear_last();
$safeResult = \ps_show_xy2($psdoc, $text, $len, $xcoor, $ycoor);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}



















function ps_show($psdoc, string $text): void
{
error_clear_last();
$safeResult = \ps_show($psdoc, $text);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_show2($psdoc, string $text, int $len): void
{
error_clear_last();
$safeResult = \ps_show2($psdoc, $text, $len);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}











function ps_stroke($psdoc): void
{
error_clear_last();
$safeResult = \ps_stroke($psdoc);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}













function ps_symbol($psdoc, int $ord): void
{
error_clear_last();
$safeResult = \ps_symbol($psdoc, $ord);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}












function ps_translate($psdoc, float $x, float $y): void
{
error_clear_last();
$safeResult = \ps_translate($psdoc, $x, $y);
if ($safeResult === false) {
throw PsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\YazException;












































function yaz_ccl_parse($id, string $query, ?array &$result): void
{
error_clear_last();
$safeResult = \yaz_ccl_parse($id, $query, $result);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}









function yaz_close($id): void
{
error_clear_last();
$safeResult = \yaz_close($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}

































































































































































































function yaz_connect(string $zurl, $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \yaz_connect($zurl, $options);
} else {
$safeResult = \yaz_connect($zurl);
}
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}














function yaz_database($id, string $databases): void
{
error_clear_last();
$safeResult = \yaz_database($id, $databases);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}















function yaz_element($id, string $elementset): void
{
error_clear_last();
$safeResult = \yaz_element($id, $elementset);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












function yaz_present($id): void
{
error_clear_last();
$safeResult = \yaz_present($id);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}
































function yaz_search($id, string $type, string $query): void
{
error_clear_last();
$safeResult = \yaz_search($id, $type, $query);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
}












































function yaz_wait(?array &$options = null)
{
error_clear_last();
$safeResult = \yaz_wait($options);
if ($safeResult === false) {
throw YazException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CurlException;










function curl_copy_handle(\CurlHandle $handle): \CurlHandle
{
error_clear_last();
$safeResult = \curl_copy_handle($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}












function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_escape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















function curl_exec(\CurlHandle $handle)
{
error_clear_last();
$safeResult = \curl_exec($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}
















































































































































































































































































































































































































































































function curl_getinfo(\CurlHandle $handle, ?int $option = null)
{
error_clear_last();
if ($option !== null) {
$safeResult = \curl_getinfo($handle, $option);
} else {
$safeResult = \curl_getinfo($handle);
}
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}

















function curl_init(?string $url = null): \CurlHandle
{
error_clear_last();
if ($url !== null) {
$safeResult = \curl_init($url);
} else {
$safeResult = \curl_init();
}
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}















































function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
$safeResult = \curl_multi_info_read($multi_handle, $queued_messages);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
return $safeResult;
}









function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$safeResult = \curl_multi_init();
if ($safeResult === false) {
throw CurlException::createFromPhpError();
}
return $safeResult;
}









































































































































function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_multi_setopt($multi_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($multi_handle);
}
}




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_setopt($handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}











function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
$safeResult = \curl_share_errno($share_handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
return $safeResult;
}




































































function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
$safeResult = \curl_share_setopt($share_handle, $option, $value);
if ($safeResult === false) {
throw CurlException::createFromPhpError($share_handle);
}
}












function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
$safeResult = \curl_unescape($handle, $string);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
return $safeResult;
}


















function curl_upkeep(\CurlHandle $handle): void
{
error_clear_last();
$safeResult = \curl_upkeep($handle);
if ($safeResult === false) {
throw CurlException::createFromPhpError($handle);
}
}
<?php

namespace Safe;

use Safe\Exceptions\SessionException;








function session_abort(): void
{
error_clear_last();
$safeResult = \session_abort();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}



























function session_create_id(string $prefix = ""): string
{
error_clear_last();
$safeResult = \session_create_id($prefix);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}














function session_decode(string $data): void
{
error_clear_last();
$safeResult = \session_decode($data);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}


















function session_destroy(): void
{
error_clear_last();
$safeResult = \session_destroy();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}













function session_encode(): string
{
error_clear_last();
$safeResult = \session_encode();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
























function session_id(?string $id = null): string
{
error_clear_last();
if ($id !== null) {
$safeResult = \session_id($id);
} else {
$safeResult = \session_id();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}
















function session_module_name(?string $module = null): string
{
error_clear_last();
if ($module !== null) {
$safeResult = \session_module_name($module);
} else {
$safeResult = \session_module_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}












































function session_name(?string $name = null): string
{
error_clear_last();
if ($name !== null) {
$safeResult = \session_name($name);
} else {
$safeResult = \session_name();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}

















function session_regenerate_id(bool $delete_old_session = false): void
{
error_clear_last();
$safeResult = \session_regenerate_id($delete_old_session);
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}










function session_reset(): void
{
error_clear_last();
$safeResult = \session_reset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}

























function session_save_path(?string $path = null): string
{
error_clear_last();
if ($path !== null) {
$safeResult = \session_save_path($path);
} else {
$safeResult = \session_save_path();
}
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
return $safeResult;
}









function session_unset(): void
{
error_clear_last();
$safeResult = \session_unset();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
















function session_write_close(): void
{
error_clear_last();
$safeResult = \session_write_close();
if ($safeResult === false) {
throw SessionException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FunchandException;









function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \register_tick_function($callback, ...$args);
} else {
$safeResult = \register_tick_function($callback);
}
if ($safeResult === false) {
throw FunchandException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZlibException;



















function deflate_add(\DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \deflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























































































function deflate_init(int $encoding, array $options = []): \DeflateContext
{
error_clear_last();
$safeResult = \deflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function gzclose($stream): void
{
error_clear_last();
$safeResult = \gzclose($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}




















function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string
{
error_clear_last();
$safeResult = \gzcompress($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}












function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzdecode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}



















function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string
{
error_clear_last();
$safeResult = \gzdeflate($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

























function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
$safeResult = \gzencode($data, $level, $encoding);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzfile(string $filename, int $use_include_path = 0): array
{
error_clear_last();
$safeResult = \gzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}














function gzgets($stream, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzgets($stream, $length);
} else {
$safeResult = \gzgets($stream);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzinflate($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}




























function gzopen(string $filename, string $mode, int $use_include_path = 0)
{
error_clear_last();
$safeResult = \gzopen($filename, $mode, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}













function gzpassthru($stream): int
{
error_clear_last();
$safeResult = \gzpassthru($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzread($stream, int $length): string
{
error_clear_last();
$safeResult = \gzread($stream, $length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function gzrewind($stream): void
{
error_clear_last();
$safeResult = \gzrewind($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
}












function gztell($stream): int
{
error_clear_last();
$safeResult = \gztell($stream);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}















function gzuncompress(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \gzuncompress($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}


















function gzwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \gzwrite($stream, $data, $length);
} else {
$safeResult = \gzwrite($stream, $data);
}
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_read_len(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_read_len($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}










function inflate_get_status(\InflateContext $context): int
{
error_clear_last();
$safeResult = \inflate_get_status($context);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}























function inflate_add(\InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
$safeResult = \inflate_add($context, $data, $flush_mode);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}









































































function inflate_init(int $encoding, array $options = []): \InflateContext
{
error_clear_last();
$safeResult = \inflate_init($encoding, $options);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}

















function readgzfile(string $filename, int $use_include_path = 0): int
{
error_clear_last();
$safeResult = \readgzfile($filename, $use_include_path);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}











function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
$safeResult = \zlib_decode($data, $max_length);
if ($safeResult === false) {
throw ZlibException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MiscException;

























function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
$safeResult = \define($constant_name, $value, $case_insensitive);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}






















function highlight_file(string $filename, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_file($filename, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}














function highlight_string(string $string, bool $return = false)
{
error_clear_last();
$safeResult = \highlight_string($string, $return);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function hrtime(bool $as_number = false)
{
error_clear_last();
$safeResult = \hrtime($as_number);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}


/**
 * Pack given arguments into a binary string according to
 * format.
 *
 * The idea for this function was taken from Perl and all formatting codes
 * work the same as in Perl. However, there are some formatting codes that are
 * missing such as Perl's "u" format code.
 *
 * Note that the distinction between signed and unsigned values only
 * affects the function unpack, where as
 * function pack gives the same result for
 * signed and unsigned format codes.
 *
 * @param string $format The format string consists of format codes
 * followed by an optional repeater argument. The repeater argument can
 * be either an integer value or * for repeating to
 * the end of the input data. For a, A, h, H the repeat count specifies
 * how many characters of one data argument are taken, for @ it is the
 * absolute position where to put the next data, for everything else the
 * repeat count specifies how many data arguments are consumed and packed
 * into the resulting binary string.
 *
 * Currently implemented formats are:
 *
 * pack format characters
 *
 *
 *
 * Code
 * Description
 *
 *
 *
 *
 * a
 * NUL-padded string
 *
 *
 * A
 * SPACE-padded string
 *
 * h
 * Hex string, low nibble first
 *
 * H
 * Hex string, high nibble first
 * csigned char
 *
 * C
 * unsigned char
 *
 * s
 * signed short (always 16 bit, machine byte order)
 *
 *
 * S
 * unsigned short (always 16 bit, machine byte order)
 *
 *
 * n
 * unsigned short (always 16 bit, big endian byte order)
 *
 *
 * v
 * unsigned short (always 16 bit, little endian byte order)
 *
 *
 * i
 * signed integer (machine dependent size and byte order)
 *
 *
 * I
 * unsigned integer (machine dependent size and byte order)
 *
 *
 * l
 * signed long (always 32 bit, machine byte order)
 *
 *
 * L
 * unsigned long (always 32 bit, machine byte order)
 *
 *
 * N
 * unsigned long (always 32 bit, big endian byte order)
 *
 *
 * V
 * unsigned long (always 32 bit, little endian byte order)
 *
 *
 * q
 * signed long long (always 64 bit, machine byte order)
 *
 *
 * Q
 * unsigned long long (always 64 bit, machine byte order)
 *
 *
 * J
 * unsigned long long (always 64 bit, big endian byte order)
 *
 *
 * P
 * unsigned long long (always 64 bit, little endian byte order)
 *
 *
 * f
 * float (machine dependent size and representation)
 *
 *
 * g
 * float (machine dependent size, little endian byte order)
 *
 *
 * G
 * float (machine dependent size, big endian byte order)
 *
 *
 * d
 * double (machine dependent size and representation)
 *
 *
 * e
 * double (machine dependent size, little endian byte order)
 *
 *
 * E
 * double (machine dependent size, big endian byte order)
 *
 *
 * x
 * NUL byte
 *
 *
 * X
 * Back up one byte
 *
 *
 * Z
 * NUL-padded string
 *
 *
 * @
 * NUL-fill to absolute position
 *
 *
 *
 *
 * @param mixed $values
 * @return string Returns a binary string containing data.
 * @throws MiscException
 *
 */
function pack(string $format, ...$values): string
{
error_clear_last();
if ($values !== []) {
$safeResult = \pack($format, ...$values);
} else {
$safeResult = \pack($format);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}















function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): string
{
error_clear_last();
$safeResult = \sapi_windows_cp_conv($in_codepage, $out_codepage, $subject);
if ($safeResult === null) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}









function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
$safeResult = \sapi_windows_cp_set($codepage);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}













function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
{
error_clear_last();
$safeResult = \sapi_windows_generate_ctrl_event($event, $pid);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}

































function sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): void
{
error_clear_last();
$safeResult = \sapi_windows_set_ctrl_handler($handler, $add);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}


















function sapi_windows_vt100_support($stream, ?bool $enable = null): void
{
error_clear_last();
if ($enable !== null) {
$safeResult = \sapi_windows_vt100_support($stream, $enable);
} else {
$safeResult = \sapi_windows_vt100_support($stream);
}
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}
















function sleep(int $seconds)
{
error_clear_last();
$safeResult = \sleep($seconds);
return $safeResult;
}





























function time_nanosleep(int $seconds, int $nanoseconds)
{
error_clear_last();
$safeResult = \time_nanosleep($seconds, $nanoseconds);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}










function time_sleep_until(float $timestamp): void
{
error_clear_last();
$safeResult = \time_sleep_until($timestamp);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
}



































function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
$safeResult = \unpack($format, $string, $offset);
if ($safeResult === false) {
throw MiscException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CubridException;

























































































































function cubrid_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
{
error_clear_last();
$safeResult = \cubrid_col_size($conn_identifier, $oid, $attr_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_names($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_names($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_column_types($req_identifier): array
{
error_clear_last();
$safeResult = \cubrid_column_types($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}


















function cubrid_commit($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_commit($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














































































function cubrid_connect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_connect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



























function cubrid_connect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null, bool $new_link = false)
{
error_clear_last();
if ($new_link !== false) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
} elseif ($passwd !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_connect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_connect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_current_oid($req_identifier): string
{
error_clear_last();
$safeResult = \cubrid_current_oid($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_disconnect($conn_identifier = null): void
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_disconnect($conn_identifier);
} else {
$safeResult = \cubrid_disconnect();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_drop($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_drop($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_free_result($req_identifier): void
{
error_clear_last();
$safeResult = \cubrid_free_result($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_get_charset($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_charset($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_get_class_name($conn_identifier, string $oid): string
{
error_clear_last();
$safeResult = \cubrid_get_class_name($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}









function cubrid_get_client_info(): string
{
error_clear_last();
$safeResult = \cubrid_get_client_info();
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















































































































function cubrid_get_db_parameter($conn_identifier): array
{
error_clear_last();
$safeResult = \cubrid_get_db_parameter($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_get_query_timeout($req_identifier): int
{
error_clear_last();
$safeResult = \cubrid_get_query_timeout($req_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_get_server_info($conn_identifier): string
{
error_clear_last();
$safeResult = \cubrid_get_server_info($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}



















function cubrid_insert_id($conn_identifier = null): string
{
error_clear_last();
if ($conn_identifier !== null) {
$safeResult = \cubrid_insert_id($conn_identifier);
} else {
$safeResult = \cubrid_insert_id();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob_close(array $lob_identifier_array): void
{
error_clear_last();
$safeResult = \cubrid_lob_close($lob_identifier_array);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}












function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
{
error_clear_last();
$safeResult = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob_get($conn_identifier, string $sql): array
{
error_clear_last();
$safeResult = \cubrid_lob_get($conn_identifier, $sql);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}











function cubrid_lob_send($conn_identifier, $lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob_send($conn_identifier, $lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob_size($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}

















function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, ?string $bind_value_type = null): void
{
error_clear_last();
if ($bind_value_type !== null) {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
} else {
$safeResult = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_close($lob_identifier): void
{
error_clear_last();
$safeResult = \cubrid_lob2_close($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_export($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_export($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_lob2_import($lob_identifier, string $file_name): void
{
error_clear_last();
$safeResult = \cubrid_lob2_import($lob_identifier, $file_name);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
{
error_clear_last();
if ($type !== "BLOB") {
$safeResult = \cubrid_lob2_new($conn_identifier, $type);
} elseif ($conn_identifier !== null) {
$safeResult = \cubrid_lob2_new($conn_identifier);
} else {
$safeResult = \cubrid_lob2_new();
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_read($lob_identifier, int $len): string
{
error_clear_last();
$safeResult = \cubrid_lob2_read($lob_identifier, $len);
if ($safeResult === null) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}































function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
{
error_clear_last();
$safeResult = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}










function cubrid_lob2_size($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_size($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_size64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_size64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}










function cubrid_lob2_tell($lob_identifier): int
{
error_clear_last();
$safeResult = \cubrid_lob2_tell($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}













function cubrid_lob2_tell64($lob_identifier): string
{
error_clear_last();
$safeResult = \cubrid_lob2_tell64($lob_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_lob2_write($lob_identifier, string $buf): void
{
error_clear_last();
$safeResult = \cubrid_lob2_write($lob_identifier, $buf);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_read($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_read($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_lock_write($conn_identifier, string $oid): void
{
error_clear_last();
$safeResult = \cubrid_lock_write($conn_identifier, $oid);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}


























function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
{
error_clear_last();
$safeResult = \cubrid_move_cursor($req_identifier, $offset, $origin);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}












function cubrid_next_result($result): void
{
error_clear_last();
$safeResult = \cubrid_next_result($result);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
















































































function cubrid_pconnect_with_url(string $conn_url, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect_with_url($conn_url, $userid);
} else {
$safeResult = \cubrid_pconnect_with_url($conn_url);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}






























function cubrid_pconnect(string $host, int $port, string $dbname, ?string $userid = null, ?string $passwd = null)
{
error_clear_last();
if ($passwd !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
} elseif ($userid !== null) {
$safeResult = \cubrid_pconnect($host, $port, $dbname, $userid);
} else {
$safeResult = \cubrid_pconnect($host, $port, $dbname);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
{
error_clear_last();
$safeResult = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}




















function cubrid_put($conn_identifier, string $oid, ?string $attr = null, $value = null): void
{
error_clear_last();
if ($value !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr, $value);
} elseif ($attr !== null) {
$safeResult = \cubrid_put($conn_identifier, $oid, $attr);
} else {
$safeResult = \cubrid_put($conn_identifier, $oid);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}















function cubrid_rollback($conn_identifier): void
{
error_clear_last();
$safeResult = \cubrid_rollback($conn_identifier);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}







































































































































































































































































































































































































function cubrid_schema($conn_identifier, int $schema_type, ?string $class_name = null, ?string $attr_name = null): array
{
error_clear_last();
if ($attr_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
} elseif ($class_name !== null) {
$safeResult = \cubrid_schema($conn_identifier, $schema_type, $class_name);
} else {
$safeResult = \cubrid_schema($conn_identifier, $schema_type);
}
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
return $safeResult;
}














function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
{
error_clear_last();
$safeResult = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
{
error_clear_last();
$safeResult = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}




















function cubrid_set_autocommit($conn_identifier, bool $mode): void
{
error_clear_last();
$safeResult = \cubrid_set_autocommit($conn_identifier, $mode);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}



















function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_value): void
{
error_clear_last();
$safeResult = \cubrid_set_db_parameter($conn_identifier, $param_type, $param_value);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}














function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
{
error_clear_last();
$safeResult = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}











function cubrid_set_query_timeout($req_identifier, int $timeout): void
{
error_clear_last();
$safeResult = \cubrid_set_query_timeout($req_identifier, $timeout);
if ($safeResult === false) {
throw CubridException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MailparseException;























function mailparse_msg_extract_part_file($mimemail, $filename, ?callable $callbackfunc = null): string
{
error_clear_last();
if ($callbackfunc !== null) {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename, $callbackfunc);
} else {
$safeResult = \mailparse_msg_extract_part_file($mimemail, $filename);
}
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}











function mailparse_msg_free($mimemail): void
{
error_clear_last();
$safeResult = \mailparse_msg_free($mimemail);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}















function mailparse_msg_parse_file(string $filename)
{
error_clear_last();
$safeResult = \mailparse_msg_parse_file($filename);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
return $safeResult;
}














function mailparse_msg_parse($mimemail, string $data): void
{
error_clear_last();
$safeResult = \mailparse_msg_parse($mimemail, $data);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}













function mailparse_stream_encode($sourcefp, $destfp, string $encoding): void
{
error_clear_last();
$safeResult = \mailparse_stream_encode($sourcefp, $destfp, $encoding);
if ($safeResult === false) {
throw MailparseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\LdapException;














function ldap_8859_to_t61(string $value): string
{
error_clear_last();
$safeResult = \ldap_8859_to_t61($value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}





















function ldap_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
if ($password !== null) {
$safeResult = \ldap_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_bind($ldap, $dn);
} else {
$safeResult = \ldap_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_compare(\LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value, $controls);
} else {
$safeResult = \ldap_compare($ldap, $dn, $attribute, $value);
}
if ($safeResult === -1) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_control_paged_result_response($link, $result, ?string &$cookie = null, ?int &$estimated = null): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result_response($link, $result, $cookie, $estimated);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_control_paged_result($link, int $pagesize, bool $iscritical = false, string $cookie = ""): void
{
error_clear_last();
$safeResult = \ldap_control_paged_result($link, $pagesize, $iscritical, $cookie);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}












function ldap_count_entries(\LDAP\Connection $ldap, \LDAP\Result $result): int
{
error_clear_last();
$safeResult = \ldap_count_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_delete(\LDAP\Connection $ldap, string $dn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_delete($ldap, $dn, $controls);
} else {
$safeResult = \ldap_delete($ldap, $dn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}











function ldap_dn2ufn(string $dn): string
{
error_clear_last();
$safeResult = \ldap_dn2ufn($dn);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_exop_passwd(\LDAP\Connection $ldap, string $user = "", string $old_password = "", string $new_password = "", ?array &$controls = null)
{
error_clear_last();
$safeResult = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}










function ldap_exop_whoami(\LDAP\Connection $ldap)
{
error_clear_last();
$safeResult = \ldap_exop_whoami($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}




















function ldap_exop(\LDAP\Connection $ldap, string $request_oid, ?string $request_data = null, ?array $controls = null, ?string &$response_data = null, ?string &$response_oid = null)
{
error_clear_last();
if ($response_oid !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid);
} elseif ($response_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data);
} elseif ($controls !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data, $controls);
} elseif ($request_data !== null) {
$safeResult = \ldap_exop($ldap, $request_oid, $request_data);
} else {
$safeResult = \ldap_exop($ldap, $request_oid);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



















function ldap_explode_dn(string $dn, int $with_attrib): array
{
error_clear_last();
$safeResult = \ldap_explode_dn($dn, $with_attrib);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
















function ldap_first_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_first_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}

















function ldap_first_entry(\LDAP\Connection $ldap, \LDAP\Result $result): \LDAP\ResultEntry
{
error_clear_last();
$safeResult = \ldap_first_entry($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}















function ldap_free_result(\LDAP\Result $result): void
{
error_clear_last();
$safeResult = \ldap_free_result($result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
























function ldap_get_attributes(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): array
{
error_clear_last();
$safeResult = \ldap_get_attributes($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}











function ldap_get_dn(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_get_dn($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}























function ldap_get_entries(\LDAP\Connection $ldap, \LDAP\Result $result): array
{
error_clear_last();
$safeResult = \ldap_get_entries($ldap, $result);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































function ldap_get_option(\LDAP\Connection $ldap, int $option, &$value = null): void
{
error_clear_last();
$safeResult = \ldap_get_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}


















function ldap_get_values_len(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values_len($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}



































function ldap_get_values(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry, string $attribute): array
{
error_clear_last();
$safeResult = \ldap_get_values($ldap, $entry, $attribute);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}













function ldap_mod_add(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_add($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_add($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}














function ldap_mod_del(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_del($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_del($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}













function ldap_mod_replace(\LDAP\Connection $ldap, string $dn, array $entry, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry, $controls);
} else {
$safeResult = \ldap_mod_replace($ldap, $dn, $entry);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}























































































function ldap_modify_batch(\LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
} else {
$safeResult = \ldap_modify_batch($ldap, $dn, $modifications_info);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_next_attribute(\LDAP\Connection $ldap, \LDAP\ResultEntry $entry): string
{
error_clear_last();
$safeResult = \ldap_next_attribute($ldap, $entry);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
return $safeResult;
}












function ldap_parse_exop(\LDAP\Connection $ldap, \LDAP\Result $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
$safeResult = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















function ldap_parse_result(\LDAP\Connection $ldap, \LDAP\Result $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
$safeResult = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}















function ldap_rename(\LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): void
{
error_clear_last();
if ($controls !== null) {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
} else {
$safeResult = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
















function ldap_sasl_bind(\LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): void
{
error_clear_last();
if ($props !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
} elseif ($authz_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
} elseif ($authc_id !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
} elseif ($realm !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
} elseif ($mech !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password, $mech);
} elseif ($password !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn, $password);
} elseif ($dn !== null) {
$safeResult = \ldap_sasl_bind($ldap, $dn);
} else {
$safeResult = \ldap_sasl_bind($ldap);
}
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}




















































































































































































function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
$safeResult = \ldap_set_option($ldap, $option, $value);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}









function ldap_unbind(\LDAP\Connection $ldap): void
{
error_clear_last();
$safeResult = \ldap_unbind($ldap);
if ($safeResult === false) {
throw LdapException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlrpcException;









function xmlrpc_set_type(&$value, string $type): void
{
error_clear_last();
$safeResult = \xmlrpc_set_type($value, $type);
if ($safeResult === false) {
throw XmlrpcException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SqlsrvException;















function sqlsrv_begin_transaction($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_begin_transaction($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}














function sqlsrv_cancel($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_cancel($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}







































function sqlsrv_client_info($conn): array
{
error_clear_last();
$safeResult = \sqlsrv_client_info($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}









function sqlsrv_close($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_close($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
















function sqlsrv_commit($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_commit($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}












































function sqlsrv_configure(string $setting, $value): void
{
error_clear_last();
$safeResult = \sqlsrv_configure($setting, $value);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}











function sqlsrv_execute($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_execute($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}





























function sqlsrv_fetch_array($stmt, ?int $fetchType = null, ?int $row = null, ?int $offset = null): ?array
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType, $row);
} elseif ($fetchType !== null) {
$safeResult = \sqlsrv_fetch_array($stmt, $fetchType);
} else {
$safeResult = \sqlsrv_fetch_array($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}


































function sqlsrv_fetch_object($stmt, ?string $className = null, ?array $ctorParams = null, ?int $row = null, ?int $offset = null): ?object
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams, $row);
} elseif ($ctorParams !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className, $ctorParams);
} elseif ($className !== null) {
$safeResult = \sqlsrv_fetch_object($stmt, $className);
} else {
$safeResult = \sqlsrv_fetch_object($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}




























function sqlsrv_fetch($stmt, ?int $row = null, ?int $offset = null): ?bool
{
error_clear_last();
if ($offset !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row, $offset);
} elseif ($row !== null) {
$safeResult = \sqlsrv_fetch($stmt, $row);
} else {
$safeResult = \sqlsrv_fetch($stmt);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}















function sqlsrv_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \sqlsrv_free_stmt($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}




















function sqlsrv_get_field($stmt, int $fieldIndex, ?int $getAsType = null)
{
error_clear_last();
if ($getAsType !== null) {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex, $getAsType);
} else {
$safeResult = \sqlsrv_get_field($stmt, $fieldIndex);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_next_result($stmt): ?bool
{
error_clear_last();
$safeResult = \sqlsrv_next_result($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}












function sqlsrv_num_fields($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_fields($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}



















function sqlsrv_num_rows($stmt): int
{
error_clear_last();
$safeResult = \sqlsrv_num_rows($stmt);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}























function sqlsrv_prepare($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_prepare($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_prepare($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}






















function sqlsrv_query($conn, string $sql, ?array $params = null, ?array $options = null)
{
error_clear_last();
if ($options !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params, $options);
} elseif ($params !== null) {
$safeResult = \sqlsrv_query($conn, $sql, $params);
} else {
$safeResult = \sqlsrv_query($conn, $sql);
}
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
return $safeResult;
}










function sqlsrv_rollback($conn): void
{
error_clear_last();
$safeResult = \sqlsrv_rollback($conn);
if ($safeResult === false) {
throw SqlsrvException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ShmopException;









function shmop_delete(\Shmop $shmop): void
{
error_clear_last();
$safeResult = \shmop_delete($shmop);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
}














function shmop_read(\Shmop $shmop, int $offset, int $size): string
{
error_clear_last();
$safeResult = \shmop_read($shmop, $offset, $size);
if ($safeResult === false) {
throw ShmopException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DirException;









function chdir(string $directory): void
{
error_clear_last();
$safeResult = \chdir($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}


















function chroot(string $directory): void
{
error_clear_last();
$safeResult = \chroot($directory);
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
}













function dir(string $directory, $context = null): \Directory
{
error_clear_last();
if ($context !== null) {
$safeResult = \dir($directory, $context);
} else {
$safeResult = \dir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function getcwd(): string
{
error_clear_last();
$safeResult = \getcwd();
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}















function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \opendir($directory, $context);
} else {
$safeResult = \opendir($directory);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}





















function scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \scandir($directory, $sorting_order, $context);
} else {
$safeResult = \scandir($directory, $sorting_order);
}
if ($safeResult === false) {
throw DirException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GettextException;













function bindtextdomain(string $domain, string $directory): string
{
error_clear_last();
$safeResult = \bindtextdomain($domain, $directory);
if ($safeResult === false) {
throw GettextException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StreamException;










function stream_context_set_params($context, array $params): void
{
error_clear_last();
$safeResult = \stream_context_set_params($context, $params);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_copy_to_stream($from, $to, ?int $length = null, int $offset = 0): int
{
error_clear_last();
if ($offset !== 0) {
$safeResult = \stream_copy_to_stream($from, $to, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_copy_to_stream($from, $to, $length);
} else {
$safeResult = \stream_copy_to_stream($from, $to);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

































function stream_filter_append($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_append($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_append($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}


































function stream_filter_prepend($stream, string $filtername, ?int $read_write = null, $params = null)
{
error_clear_last();
if ($params !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write, $params);
} elseif ($read_write !== null) {
$safeResult = \stream_filter_prepend($stream, $filtername, $read_write);
} else {
$safeResult = \stream_filter_prepend($stream, $filtername);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
$safeResult = \stream_filter_register($filter_name, $class);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}













function stream_filter_remove($stream_filter): void
{
error_clear_last();
$safeResult = \stream_filter_remove($stream_filter);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}


















function stream_get_contents($stream, ?int $length = null, int $offset = -1): string
{
error_clear_last();
if ($offset !== -1) {
$safeResult = \stream_get_contents($stream, $length, $offset);
} elseif ($length !== null) {
$safeResult = \stream_get_contents($stream, $length);
} else {
$safeResult = \stream_get_contents($stream);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_get_line($stream, int $length, string $ending = ""): string
{
error_clear_last();
$safeResult = \stream_get_line($stream, $length, $ending);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}










function stream_isatty($stream): void
{
error_clear_last();
$safeResult = \stream_isatty($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_resolve_include_path(string $filename): string
{
error_clear_last();
$safeResult = \stream_resolve_include_path($filename);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
$safeResult = \stream_set_blocking($stream, $enable);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}

















function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
{
error_clear_last();
$safeResult = \stream_set_timeout($stream, $seconds, $microseconds);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}



















function stream_socket_accept($socket, ?float $timeout = null, ?string &$peer_name = null)
{
error_clear_last();
if ($peer_name !== null) {
$safeResult = \stream_socket_accept($socket, $timeout, $peer_name);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_accept($socket, $timeout);
} else {
$safeResult = \stream_socket_accept($socket);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}




















































function stream_socket_client(string $address, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags);
} elseif ($timeout !== null) {
$safeResult = \stream_socket_client($address, $error_code, $error_message, $timeout);
} else {
$safeResult = \stream_socket_client($address, $error_code, $error_message);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












function stream_socket_get_name($socket, bool $remote): string
{
error_clear_last();
$safeResult = \stream_socket_get_name($socket, $remote);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}

























function stream_socket_pair(int $domain, int $type, int $protocol): array
{
error_clear_last();
$safeResult = \stream_socket_pair($domain, $type, $protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}






































function stream_socket_recvfrom($socket, int $length, int $flags = 0, ?string &$address = null): string
{
error_clear_last();
$safeResult = \stream_socket_recvfrom($socket, $length, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}































function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int
{
error_clear_last();
$safeResult = \stream_socket_sendto($socket, $data, $flags, $address);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}












































function stream_socket_server(string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags, $context);
} else {
$safeResult = \stream_socket_server($address, $error_code, $error_message, $flags);
}
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
return $safeResult;
}















function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
$safeResult = \stream_socket_shutdown($stream, $mode);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_supports_lock($stream): void
{
error_clear_last();
$safeResult = \stream_supports_lock($stream);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
















function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
$safeResult = \stream_wrapper_register($protocol, $class, $flags);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}










function stream_wrapper_restore(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_restore($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}












function stream_wrapper_unregister(string $protocol): void
{
error_clear_last();
$safeResult = \stream_wrapper_unregister($protocol);
if ($safeResult === false) {
throw StreamException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ComException;











function com_create_guid(): string
{
error_clear_last();
$safeResult = \com_create_guid();
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
























function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
if ($sink_interface !== null) {
$safeResult = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
$safeResult = \com_event_sink($variant, $sink_object);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}






















































function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
$safeResult = \com_load_typelib($typelib, $case_insensitive);
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}

















function com_print_typeinfo(object $variant, ?string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
if ($display_sink !== false) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
} elseif ($dispatch_interface !== null) {
$safeResult = \com_print_typeinfo($variant, $dispatch_interface);
} else {
$safeResult = \com_print_typeinfo($variant);
}
if ($safeResult === false) {
throw ComException::createFromPhpError();
}
}












function variant_date_to_timestamp(object $variant): int
{
error_clear_last();
$safeResult = \variant_date_to_timestamp($variant);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}












function variant_round($value, int $decimals)
{
error_clear_last();
$safeResult = \variant_round($value, $decimals);
if ($safeResult === null) {
throw ComException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\FtpException;












function ftp_alloc(\FTP\Connection $ftp, int $size, ?string &$response = null): void
{
error_clear_last();
$safeResult = \ftp_alloc($ftp, $size, $response);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_append(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
$safeResult = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}









function ftp_cdup(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_cdup($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_chdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_chdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}













function ftp_chmod(\FTP\Connection $ftp, int $permissions, string $filename): int
{
error_clear_last();
$safeResult = \ftp_chmod($ftp, $permissions, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_close(\FTP\Connection $ftp): void
{
error_clear_last();
$safeResult = \ftp_close($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}


















function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_delete(\FTP\Connection $ftp, string $filename): void
{
error_clear_last();
$safeResult = \ftp_delete($ftp, $filename);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fget(\FTP\Connection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_fput(\FTP\Connection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}















function ftp_get(\FTP\Connection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_login(\FTP\Connection $ftp, string $username, string $password): void
{
error_clear_last();
$safeResult = \ftp_login($ftp, $username, $password);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_mkdir(\FTP\Connection $ftp, string $directory): string
{
error_clear_last();
$safeResult = \ftp_mkdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}











function ftp_mlsd(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_mlsd($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}




















function ftp_nb_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
{
error_clear_last();
$safeResult = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}














function ftp_nlist(\FTP\Connection $ftp, string $directory): array
{
error_clear_last();
$safeResult = \ftp_nlist($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
















function ftp_pasv(\FTP\Connection $ftp, bool $enable): void
{
error_clear_last();
$safeResult = \ftp_pasv($ftp, $enable);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}














function ftp_put(\FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
$safeResult = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}










function ftp_pwd(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_pwd($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}













function ftp_raw(\FTP\Connection $ftp, string $command): array
{
error_clear_last();
$safeResult = \ftp_raw($ftp, $command);
if ($safeResult === null) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}












function ftp_rename(\FTP\Connection $ftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ftp_rename($ftp, $from, $to);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}











function ftp_rmdir(\FTP\Connection $ftp, string $directory): void
{
error_clear_last();
$safeResult = \ftp_rmdir($ftp, $directory);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}
















function ftp_site(\FTP\Connection $ftp, string $command): void
{
error_clear_last();
$safeResult = \ftp_site($ftp, $command);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
}












function ftp_size(\FTP\Connection $ftp, string $filename): int
{
error_clear_last();
$safeResult = \ftp_size($ftp, $filename);
if ($safeResult === -1) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}























function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): \FTP\Connection
{
error_clear_last();
$safeResult = \ftp_ssl_connect($hostname, $port, $timeout);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}










function ftp_systype(\FTP\Connection $ftp): string
{
error_clear_last();
$safeResult = \ftp_systype($ftp);
if ($safeResult === false) {
throw FtpException::createFromPhpError();
}
return $safeResult;
}
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;


return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(
RenameFunctionRector::class,
[ 'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_request_headers' => 'Safe\apache_request_headers',
'apache_response_headers' => 'Safe\apache_response_headers',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
'apcu_cas' => 'Safe\apcu_cas',
'apcu_dec' => 'Safe\apcu_dec',
'apcu_fetch' => 'Safe\apcu_fetch',
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'array_walk_recursive' => 'Safe\array_walk_recursive',
'assert_options' => 'Safe\assert_options',
'base64_decode' => 'Safe\base64_decode',
'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzopen' => 'Safe\bzopen',
'bzread' => 'Safe\bzread',
'bzwrite' => 'Safe\bzwrite',
'chdir' => 'Safe\chdir',
'chgrp' => 'Safe\chgrp',
'chmod' => 'Safe\chmod',
'chown' => 'Safe\chown',
'chroot' => 'Safe\chroot',
'class_alias' => 'Safe\class_alias',
'class_implements' => 'Safe\class_implements',
'class_parents' => 'Safe\class_parents',
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'closelog' => 'Safe\closelog',
'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
'copy' => 'Safe\copy',
'cubrid_bind' => 'Safe\cubrid_bind',
'cubrid_column_names' => 'Safe\cubrid_column_names',
'cubrid_column_types' => 'Safe\cubrid_column_types',
'cubrid_col_size' => 'Safe\cubrid_col_size',
'cubrid_commit' => 'Safe\cubrid_commit',
'cubrid_connect' => 'Safe\cubrid_connect',
'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
'cubrid_current_oid' => 'Safe\cubrid_current_oid',
'cubrid_disconnect' => 'Safe\cubrid_disconnect',
'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
'cubrid_lob_close' => 'Safe\cubrid_lob_close',
'cubrid_lob_export' => 'Safe\cubrid_lob_export',
'cubrid_lob_get' => 'Safe\cubrid_lob_get',
'cubrid_lob_send' => 'Safe\cubrid_lob_send',
'cubrid_lob_size' => 'Safe\cubrid_lob_size',
'cubrid_lock_read' => 'Safe\cubrid_lock_read',
'cubrid_lock_write' => 'Safe\cubrid_lock_write',
'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
'cubrid_next_result' => 'Safe\cubrid_next_result',
'cubrid_pconnect' => 'Safe\cubrid_pconnect',
'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
'cubrid_prepare' => 'Safe\cubrid_prepare',
'cubrid_put' => 'Safe\cubrid_put',
'cubrid_rollback' => 'Safe\cubrid_rollback',
'cubrid_schema' => 'Safe\cubrid_schema',
'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
'cubrid_seq_put' => 'Safe\cubrid_seq_put',
'cubrid_set_add' => 'Safe\cubrid_set_add',
'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
'cubrid_set_drop' => 'Safe\cubrid_set_drop',
'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_init' => 'Safe\curl_multi_init',
'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_errno' => 'Safe\curl_share_errno',
'curl_share_setopt' => 'Safe\curl_share_setopt',
'curl_unescape' => 'Safe\curl_unescape',
'curl_upkeep' => 'Safe\curl_upkeep',
'date' => 'Safe\date',
'date_parse' => 'Safe\date_parse',
'date_parse_from_format' => 'Safe\date_parse_from_format',
'date_sunrise' => 'Safe\date_sunrise',
'date_sunset' => 'Safe\date_sunset',
'date_sun_info' => 'Safe\date_sun_info',
'db2_autocommit' => 'Safe\db2_autocommit',
'db2_bind_param' => 'Safe\db2_bind_param',
'db2_client_info' => 'Safe\db2_client_info',
'db2_close' => 'Safe\db2_close',
'db2_commit' => 'Safe\db2_commit',
'db2_execute' => 'Safe\db2_execute',
'db2_free_result' => 'Safe\db2_free_result',
'db2_free_stmt' => 'Safe\db2_free_stmt',
'db2_get_option' => 'Safe\db2_get_option',
'db2_pclose' => 'Safe\db2_pclose',
'db2_rollback' => 'Safe\db2_rollback',
'db2_server_info' => 'Safe\db2_server_info',
'db2_set_option' => 'Safe\db2_set_option',
'define' => 'Safe\define',
'deflate_add' => 'Safe\deflate_add',
'deflate_init' => 'Safe\deflate_init',
'dir' => 'Safe\dir',
'disk_free_space' => 'Safe\disk_free_space',
'disk_total_space' => 'Safe\disk_total_space',
'dl' => 'Safe\dl',
'dns_get_record' => 'Safe\dns_get_record',
'eio_busy' => 'Safe\eio_busy',
'eio_chmod' => 'Safe\eio_chmod',
'eio_chown' => 'Safe\eio_chown',
'eio_close' => 'Safe\eio_close',
'eio_custom' => 'Safe\eio_custom',
'eio_dup2' => 'Safe\eio_dup2',
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
'eio_fsync' => 'Safe\eio_fsync',
'eio_ftruncate' => 'Safe\eio_ftruncate',
'eio_futime' => 'Safe\eio_futime',
'eio_grp' => 'Safe\eio_grp',
'eio_lstat' => 'Safe\eio_lstat',
'eio_mkdir' => 'Safe\eio_mkdir',
'eio_mknod' => 'Safe\eio_mknod',
'eio_nop' => 'Safe\eio_nop',
'eio_readahead' => 'Safe\eio_readahead',
'eio_readdir' => 'Safe\eio_readdir',
'eio_readlink' => 'Safe\eio_readlink',
'eio_rename' => 'Safe\eio_rename',
'eio_rmdir' => 'Safe\eio_rmdir',
'eio_seek' => 'Safe\eio_seek',
'eio_sendfile' => 'Safe\eio_sendfile',
'eio_stat' => 'Safe\eio_stat',
'eio_statvfs' => 'Safe\eio_statvfs',
'eio_symlink' => 'Safe\eio_symlink',
'eio_sync' => 'Safe\eio_sync',
'eio_syncfs' => 'Safe\eio_syncfs',
'eio_sync_file_range' => 'Safe\eio_sync_file_range',
'eio_truncate' => 'Safe\eio_truncate',
'eio_unlink' => 'Safe\eio_unlink',
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'filetype' => 'Safe\filetype',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
'filter_input_array' => 'Safe\filter_input_array',
'filter_var_array' => 'Safe\filter_var_array',
'finfo_close' => 'Safe\finfo_close',
'finfo_open' => 'Safe\finfo_open',
'flock' => 'Safe\flock',
'fopen' => 'Safe\fopen',
'fpm_get_status' => 'Safe\fpm_get_status',
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
'fstat' => 'Safe\fstat',
'fsync' => 'Safe\fsync',
'ftell' => 'Safe\ftell',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
'ftp_chdir' => 'Safe\ftp_chdir',
'ftp_chmod' => 'Safe\ftp_chmod',
'ftp_close' => 'Safe\ftp_close',
'ftp_connect' => 'Safe\ftp_connect',
'ftp_delete' => 'Safe\ftp_delete',
'ftp_fget' => 'Safe\ftp_fget',
'ftp_fput' => 'Safe\ftp_fput',
'ftp_get' => 'Safe\ftp_get',
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
'ftp_raw' => 'Safe\ftp_raw',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
'ftp_size' => 'Safe\ftp_size',
'ftp_ssl_connect' => 'Safe\ftp_ssl_connect',
'ftp_systype' => 'Safe\ftp_systype',
'ftruncate' => 'Safe\ftruncate',
'fwrite' => 'Safe\fwrite',
'getallheaders' => 'Safe\getallheaders',
'getcwd' => 'Safe\getcwd',
'gethostname' => 'Safe\gethostname',
'getimagesize' => 'Safe\getimagesize',
'getlastmod' => 'Safe\getlastmod',
'getmygid' => 'Safe\getmygid',
'getmyinode' => 'Safe\getmyinode',
'getmypid' => 'Safe\getmypid',
'getmyuid' => 'Safe\getmyuid',
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
'getrusage' => 'Safe\getrusage',
'getservbyport' => 'Safe\getservbyport',
'get_cfg_var' => 'Safe\get_cfg_var',
'get_headers' => 'Safe\get_headers',
'get_include_path' => 'Safe\get_include_path',
'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
'gmmktime' => 'Safe\gmmktime',
'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
'gnupg_deletekey' => 'Safe\gnupg_deletekey',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
'gzcompress' => 'Safe\gzcompress',
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzinflate' => 'Safe\gzinflate',
'gzopen' => 'Safe\gzopen',
'gzpassthru' => 'Safe\gzpassthru',
'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gztell' => 'Safe\gztell',
'gzuncompress' => 'Safe\gzuncompress',
'gzwrite' => 'Safe\gzwrite',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'highlight_string' => 'Safe\highlight_string',
'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
'ibase_blob_create' => 'Safe\ibase_blob_create',
'ibase_blob_get' => 'Safe\ibase_blob_get',
'ibase_close' => 'Safe\ibase_close',
'ibase_commit' => 'Safe\ibase_commit',
'ibase_commit_ret' => 'Safe\ibase_commit_ret',
'ibase_connect' => 'Safe\ibase_connect',
'ibase_delete_user' => 'Safe\ibase_delete_user',
'ibase_drop_db' => 'Safe\ibase_drop_db',
'ibase_free_event_handler' => 'Safe\ibase_free_event_handler',
'ibase_free_query' => 'Safe\ibase_free_query',
'ibase_free_result' => 'Safe\ibase_free_result',
'ibase_maintain_db' => 'Safe\ibase_maintain_db',
'ibase_modify_user' => 'Safe\ibase_modify_user',
'ibase_name_result' => 'Safe\ibase_name_result',
'ibase_pconnect' => 'Safe\ibase_pconnect',
'ibase_restore' => 'Safe\ibase_restore',
'ibase_rollback' => 'Safe\ibase_rollback',
'ibase_rollback_ret' => 'Safe\ibase_rollback_ret',
'ibase_service_attach' => 'Safe\ibase_service_attach',
'ibase_service_detach' => 'Safe\ibase_service_detach',
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_mime_decode' => 'Safe\iconv_mime_decode',
'iconv_mime_encode' => 'Safe\iconv_mime_encode',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
'iconv_strlen' => 'Safe\iconv_strlen',
'idate' => 'Safe\idate',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
'imageaffinematrixget' => 'Safe\imageaffinematrixget',
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
'imagecolorset' => 'Safe\imagecolorset',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
'imagecopymergegray' => 'Safe\imagecopymergegray',
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
'imagecreatefromgd2part' => 'Safe\imagecreatefromgd2part',
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
'imagecreatefromstring' => 'Safe\imagecreatefromstring',
'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
'imagecreatefromxpm' => 'Safe\imagecreatefromxpm',
'imagecreatetruecolor' => 'Safe\imagecreatetruecolor',
'imagecrop' => 'Safe\imagecrop',
'imagecropauto' => 'Safe\imagecropauto',
'imagedashedline' => 'Safe\imagedashedline',
'imagedestroy' => 'Safe\imagedestroy',
'imageellipse' => 'Safe\imageellipse',
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
'imageftbbox' => 'Safe\imageftbbox',
'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
'imagegif' => 'Safe\imagegif',
'imagegrabscreen' => 'Safe\imagegrabscreen',
'imagegrabwindow' => 'Safe\imagegrabwindow',
'imagejpeg' => 'Safe\imagejpeg',
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
'imagepng' => 'Safe\imagepng',
'imagerectangle' => 'Safe\imagerectangle',
'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
'imagesetbrush' => 'Safe\imagesetbrush',
'imagesetclip' => 'Safe\imagesetclip',
'imagesetinterpolation' => 'Safe\imagesetinterpolation',
'imagesetpixel' => 'Safe\imagesetpixel',
'imagesetstyle' => 'Safe\imagesetstyle',
'imagesetthickness' => 'Safe\imagesetthickness',
'imagesettile' => 'Safe\imagesettile',
'imagestring' => 'Safe\imagestring',
'imagestringup' => 'Safe\imagestringup',
'imagesx' => 'Safe\imagesx',
'imagesy' => 'Safe\imagesy',
'imagetruecolortopalette' => 'Safe\imagetruecolortopalette',
'imagettfbbox' => 'Safe\imagettfbbox',
'imagettftext' => 'Safe\imagettftext',
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
'image_type_to_extension' => 'Safe\image_type_to_extension',
'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
'imap_base64' => 'Safe\imap_base64',
'imap_binary' => 'Safe\imap_binary',
'imap_body' => 'Safe\imap_body',
'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_clearflag_full' => 'Safe\imap_clearflag_full',
'imap_close' => 'Safe\imap_close',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
'imap_fetchbody' => 'Safe\imap_fetchbody',
'imap_fetchheader' => 'Safe\imap_fetchheader',
'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_gc' => 'Safe\imap_gc',
'imap_getacl' => 'Safe\imap_getacl',
'imap_getmailboxes' => 'Safe\imap_getmailboxes',
'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
'imap_headers' => 'Safe\imap_headers',
'imap_listscan' => 'Safe\imap_listscan',
'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mailboxmsginfo' => 'Safe\imap_mailboxmsginfo',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_setflag_full' => 'Safe\imap_setflag_full',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
'imap_undelete' => 'Safe\imap_undelete',
'imap_unsubscribe' => 'Safe\imap_unsubscribe',
'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7',
'inet_ntop' => 'Safe\inet_ntop',
'inet_pton' => 'Safe\inet_pton',
'inflate_add' => 'Safe\inflate_add',
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_get_status' => 'Safe\inflate_get_status',
'inflate_init' => 'Safe\inflate_init',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
'ldap_bind' => 'Safe\ldap_bind',
'ldap_compare' => 'Safe\ldap_compare',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
'ldap_explode_dn' => 'Safe\ldap_explode_dn',
'ldap_first_attribute' => 'Safe\ldap_first_attribute',
'ldap_first_entry' => 'Safe\ldap_first_entry',
'ldap_free_result' => 'Safe\ldap_free_result',
'ldap_get_attributes' => 'Safe\ldap_get_attributes',
'ldap_get_dn' => 'Safe\ldap_get_dn',
'ldap_get_entries' => 'Safe\ldap_get_entries',
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
'ldap_mod_del' => 'Safe\ldap_mod_del',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
'ldap_rename' => 'Safe\ldap_rename',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
'long2ip' => 'Safe\long2ip',
'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
'mailparse_msg_free' => 'Safe\mailparse_msg_free',
'mailparse_msg_parse' => 'Safe\mailparse_msg_parse',
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_encoding_aliases' => 'Safe\mb_encoding_aliases',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
'mb_ereg_replace' => 'Safe\mb_ereg_replace',
'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback',
'mb_ereg_search_getregs' => 'Safe\mb_ereg_search_getregs',
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
'mb_parse_str' => 'Safe\mb_parse_str',
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
'md5_file' => 'Safe\md5_file',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
'mysql_data_seek' => 'Safe\mysql_data_seek',
'mysql_db_name' => 'Safe\mysql_db_name',
'mysql_db_query' => 'Safe\mysql_db_query',
'mysql_drop_db' => 'Safe\mysql_drop_db',
'mysql_fetch_lengths' => 'Safe\mysql_fetch_lengths',
'mysql_field_flags' => 'Safe\mysql_field_flags',
'mysql_field_len' => 'Safe\mysql_field_len',
'mysql_field_name' => 'Safe\mysql_field_name',
'mysql_field_seek' => 'Safe\mysql_field_seek',
'mysql_free_result' => 'Safe\mysql_free_result',
'mysql_get_host_info' => 'Safe\mysql_get_host_info',
'mysql_get_proto_info' => 'Safe\mysql_get_proto_info',
'mysql_get_server_info' => 'Safe\mysql_get_server_info',
'mysql_info' => 'Safe\mysql_info',
'mysql_list_dbs' => 'Safe\mysql_list_dbs',
'mysql_list_fields' => 'Safe\mysql_list_fields',
'mysql_list_processes' => 'Safe\mysql_list_processes',
'mysql_list_tables' => 'Safe\mysql_list_tables',
'mysql_num_fields' => 'Safe\mysql_num_fields',
'mysql_num_rows' => 'Safe\mysql_num_rows',
'mysql_query' => 'Safe\mysql_query',
'mysql_real_escape_string' => 'Safe\mysql_real_escape_string',
'mysql_result' => 'Safe\mysql_result',
'mysql_select_db' => 'Safe\mysql_select_db',
'mysql_set_charset' => 'Safe\mysql_set_charset',
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
'net_get_interfaces' => 'Safe\net_get_interfaces',
'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
'ob_flush' => 'Safe\ob_flush',
'ob_get_clean' => 'Safe\ob_get_clean',
'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
'oci_field_size' => 'Safe\oci_field_size',
'oci_field_type' => 'Safe\oci_field_type',
'oci_field_type_raw' => 'Safe\oci_field_type_raw',
'oci_free_descriptor' => 'Safe\oci_free_descriptor',
'oci_free_statement' => 'Safe\oci_free_statement',
'oci_new_collection' => 'Safe\oci_new_collection',
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
'oci_set_action' => 'Safe\oci_set_action',
'oci_set_call_timeout' => 'Safe\oci_set_call_timeout',
'oci_set_client_identifier' => 'Safe\oci_set_client_identifier',
'oci_set_client_info' => 'Safe\oci_set_client_info',
'oci_set_db_operation' => 'Safe\oci_set_db_operation',
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
'oci_set_prefetch_lob' => 'Safe\oci_set_prefetch_lob',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
'odbc_binmode' => 'Safe\odbc_binmode',
'odbc_columnprivileges' => 'Safe\odbc_columnprivileges',
'odbc_columns' => 'Safe\odbc_columns',
'odbc_commit' => 'Safe\odbc_commit',
'odbc_connect' => 'Safe\odbc_connect',
'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
'odbc_fetch_into' => 'Safe\odbc_fetch_into',
'odbc_field_len' => 'Safe\odbc_field_len',
'odbc_field_name' => 'Safe\odbc_field_name',
'odbc_field_num' => 'Safe\odbc_field_num',
'odbc_field_scale' => 'Safe\odbc_field_scale',
'odbc_field_type' => 'Safe\odbc_field_type',
'odbc_foreignkeys' => 'Safe\odbc_foreignkeys',
'odbc_gettypeinfo' => 'Safe\odbc_gettypeinfo',
'odbc_longreadlen' => 'Safe\odbc_longreadlen',
'odbc_num_fields' => 'Safe\odbc_num_fields',
'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_primarykeys' => 'Safe\odbc_primarykeys',
'odbc_procedurecolumns' => 'Safe\odbc_procedurecolumns',
'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
'odbc_setoption' => 'Safe\odbc_setoption',
'odbc_specialcolumns' => 'Safe\odbc_specialcolumns',
'odbc_statistics' => 'Safe\odbc_statistics',
'odbc_tableprivileges' => 'Safe\odbc_tableprivileges',
'odbc_tables' => 'Safe\odbc_tables',
'opcache_compile_file' => 'Safe\opcache_compile_file',
'opcache_get_status' => 'Safe\opcache_get_status',
'opendir' => 'Safe\opendir',
'openlog' => 'Safe\openlog',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
'openssl_cipher_key_length' => 'Safe\openssl_cipher_key_length',
'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
'openssl_cms_read' => 'Safe\openssl_cms_read',
'openssl_cms_sign' => 'Safe\openssl_cms_sign',
'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
'openssl_decrypt' => 'Safe\openssl_decrypt',
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt' => 'Safe\openssl_pkcs7_encrypt',
'openssl_pkcs7_read' => 'Safe\openssl_pkcs7_read',
'openssl_pkcs7_sign' => 'Safe\openssl_pkcs7_sign',
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
'openssl_pkey_get_public' => 'Safe\openssl_pkey_get_public',
'openssl_pkey_new' => 'Safe\openssl_pkey_new',
'openssl_private_decrypt' => 'Safe\openssl_private_decrypt',
'openssl_private_encrypt' => 'Safe\openssl_private_encrypt',
'openssl_public_decrypt' => 'Safe\openssl_public_decrypt',
'openssl_public_encrypt' => 'Safe\openssl_public_encrypt',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
'openssl_spki_export' => 'Safe\openssl_spki_export',
'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
'openssl_spki_new' => 'Safe\openssl_spki_new',
'openssl_spki_verify' => 'Safe\openssl_spki_verify',
'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_checkpurpose' => 'Safe\openssl_x509_checkpurpose',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
'openssl_x509_read' => 'Safe\openssl_x509_read',
'output_add_rewrite_var' => 'Safe\output_add_rewrite_var',
'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars',
'pack' => 'Safe\pack',
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
'passthru' => 'Safe\passthru',
'pclose' => 'Safe\pclose',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
'pg_field_num' => 'Safe\pg_field_num',
'pg_field_table' => 'Safe\pg_field_table',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
'pg_query_params' => 'Safe\pg_query_params',
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
'pg_update' => 'Safe\pg_update',
'phpcredits' => 'Safe\phpcredits',
'phpinfo' => 'Safe\phpinfo',
'php_sapi_name' => 'Safe\php_sapi_name',
'popen' => 'Safe\popen',
'posix_access' => 'Safe\posix_access',
'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
'posix_getgroups' => 'Safe\posix_getgroups',
'posix_getlogin' => 'Safe\posix_getlogin',
'posix_getpgid' => 'Safe\posix_getpgid',
'posix_getpwuid' => 'Safe\posix_getpwuid',
'posix_getrlimit' => 'Safe\posix_getrlimit',
'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
'posix_mknod' => 'Safe\posix_mknod',
'posix_setegid' => 'Safe\posix_setegid',
'posix_seteuid' => 'Safe\posix_seteuid',
'posix_setgid' => 'Safe\posix_setgid',
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setsid' => 'Safe\posix_setsid',
'posix_setuid' => 'Safe\posix_setuid',
'posix_times' => 'Safe\posix_times',
'posix_uname' => 'Safe\posix_uname',
'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_replace_callback' => 'Safe\preg_replace_callback',
'preg_replace_callback_array' => 'Safe\preg_replace_callback_array',
'preg_split' => 'Safe\preg_split',
'proc_close' => 'Safe\proc_close',
'proc_nice' => 'Safe\proc_nice',
'proc_open' => 'Safe\proc_open',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
'pspell_clear_session' => 'Safe\pspell_clear_session',
'pspell_config_create' => 'Safe\pspell_config_create',
'pspell_config_data_dir' => 'Safe\pspell_config_data_dir',
'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir',
'pspell_config_ignore' => 'Safe\pspell_config_ignore',
'pspell_config_mode' => 'Safe\pspell_config_mode',
'pspell_config_personal' => 'Safe\pspell_config_personal',
'pspell_config_repl' => 'Safe\pspell_config_repl',
'pspell_config_runtogether' => 'Safe\pspell_config_runtogether',
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
'ps_add_locallink' => 'Safe\ps_add_locallink',
'ps_add_note' => 'Safe\ps_add_note',
'ps_add_pdflink' => 'Safe\ps_add_pdflink',
'ps_add_weblink' => 'Safe\ps_add_weblink',
'ps_arc' => 'Safe\ps_arc',
'ps_arcn' => 'Safe\ps_arcn',
'ps_begin_page' => 'Safe\ps_begin_page',
'ps_begin_pattern' => 'Safe\ps_begin_pattern',
'ps_begin_template' => 'Safe\ps_begin_template',
'ps_circle' => 'Safe\ps_circle',
'ps_clip' => 'Safe\ps_clip',
'ps_close' => 'Safe\ps_close',
'ps_closepath' => 'Safe\ps_closepath',
'ps_closepath_stroke' => 'Safe\ps_closepath_stroke',
'ps_close_image' => 'Safe\ps_close_image',
'ps_continue_text' => 'Safe\ps_continue_text',
'ps_curveto' => 'Safe\ps_curveto',
'ps_delete' => 'Safe\ps_delete',
'ps_end_page' => 'Safe\ps_end_page',
'ps_end_pattern' => 'Safe\ps_end_pattern',
'ps_end_template' => 'Safe\ps_end_template',
'ps_fill' => 'Safe\ps_fill',
'ps_fill_stroke' => 'Safe\ps_fill_stroke',
'ps_get_parameter' => 'Safe\ps_get_parameter',
'ps_hyphenate' => 'Safe\ps_hyphenate',
'ps_include_file' => 'Safe\ps_include_file',
'ps_lineto' => 'Safe\ps_lineto',
'ps_moveto' => 'Safe\ps_moveto',
'ps_new' => 'Safe\ps_new',
'ps_open_file' => 'Safe\ps_open_file',
'ps_place_image' => 'Safe\ps_place_image',
'ps_rect' => 'Safe\ps_rect',
'ps_restore' => 'Safe\ps_restore',
'ps_rotate' => 'Safe\ps_rotate',
'ps_save' => 'Safe\ps_save',
'ps_scale' => 'Safe\ps_scale',
'ps_setcolor' => 'Safe\ps_setcolor',
'ps_setdash' => 'Safe\ps_setdash',
'ps_setflat' => 'Safe\ps_setflat',
'ps_setfont' => 'Safe\ps_setfont',
'ps_setgray' => 'Safe\ps_setgray',
'ps_setlinecap' => 'Safe\ps_setlinecap',
'ps_setlinejoin' => 'Safe\ps_setlinejoin',
'ps_setlinewidth' => 'Safe\ps_setlinewidth',
'ps_setmiterlimit' => 'Safe\ps_setmiterlimit',
'ps_setoverprintmode' => 'Safe\ps_setoverprintmode',
'ps_setpolydash' => 'Safe\ps_setpolydash',
'ps_set_border_color' => 'Safe\ps_set_border_color',
'ps_set_border_dash' => 'Safe\ps_set_border_dash',
'ps_set_border_style' => 'Safe\ps_set_border_style',
'ps_set_info' => 'Safe\ps_set_info',
'ps_set_parameter' => 'Safe\ps_set_parameter',
'ps_set_text_pos' => 'Safe\ps_set_text_pos',
'ps_set_value' => 'Safe\ps_set_value',
'ps_shading' => 'Safe\ps_shading',
'ps_shading_pattern' => 'Safe\ps_shading_pattern',
'ps_shfill' => 'Safe\ps_shfill',
'ps_show' => 'Safe\ps_show',
'ps_show2' => 'Safe\ps_show2',
'ps_show_xy' => 'Safe\ps_show_xy',
'ps_show_xy2' => 'Safe\ps_show_xy2',
'ps_stroke' => 'Safe\ps_stroke',
'ps_symbol' => 'Safe\ps_symbol',
'ps_translate' => 'Safe\ps_translate',
'putenv' => 'Safe\putenv',
'readfile' => 'Safe\readfile',
'readgzfile' => 'Safe\readgzfile',
'readline_add_history' => 'Safe\readline_add_history',
'readline_callback_handler_install' => 'Safe\readline_callback_handler_install',
'readline_clear_history' => 'Safe\readline_clear_history',
'readline_completion_function' => 'Safe\readline_completion_function',
'readline_read_history' => 'Safe\readline_read_history',
'readline_write_history' => 'Safe\readline_write_history',
'readlink' => 'Safe\readlink',
'realpath' => 'Safe\realpath',
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
'rmdir' => 'Safe\rmdir',
'rnp_decrypt' => 'Safe\rnp_decrypt',
'rnp_dump_packets' => 'Safe\rnp_dump_packets',
'rnp_dump_packets_to_json' => 'Safe\rnp_dump_packets_to_json',
'rnp_ffi_create' => 'Safe\rnp_ffi_create',
'rnp_ffi_set_pass_provider' => 'Safe\rnp_ffi_set_pass_provider',
'rnp_import_keys' => 'Safe\rnp_import_keys',
'rnp_import_signatures' => 'Safe\rnp_import_signatures',
'rnp_key_export' => 'Safe\rnp_key_export',
'rnp_key_export_autocrypt' => 'Safe\rnp_key_export_autocrypt',
'rnp_key_export_revocation' => 'Safe\rnp_key_export_revocation',
'rnp_key_get_info' => 'Safe\rnp_key_get_info',
'rnp_key_remove' => 'Safe\rnp_key_remove',
'rnp_key_revoke' => 'Safe\rnp_key_revoke',
'rnp_list_keys' => 'Safe\rnp_list_keys',
'rnp_load_keys' => 'Safe\rnp_load_keys',
'rnp_load_keys_from_path' => 'Safe\rnp_load_keys_from_path',
'rnp_locate_key' => 'Safe\rnp_locate_key',
'rnp_op_encrypt' => 'Safe\rnp_op_encrypt',
'rnp_op_generate_key' => 'Safe\rnp_op_generate_key',
'rnp_op_sign' => 'Safe\rnp_op_sign',
'rnp_op_sign_cleartext' => 'Safe\rnp_op_sign_cleartext',
'rnp_op_sign_detached' => 'Safe\rnp_op_sign_detached',
'rnp_op_verify' => 'Safe\rnp_op_verify',
'rnp_op_verify_detached' => 'Safe\rnp_op_verify_detached',
'rnp_save_keys' => 'Safe\rnp_save_keys',
'rnp_save_keys_to_path' => 'Safe\rnp_save_keys_to_path',
'rnp_supported_features' => 'Safe\rnp_supported_features',
'rpmaddtag' => 'Safe\rpmaddtag',
'rrd_create' => 'Safe\rrd_create',
'rrd_first' => 'Safe\rrd_first',
'rrd_graph' => 'Safe\rrd_graph',
'rrd_info' => 'Safe\rrd_info',
'rrd_lastupdate' => 'Safe\rrd_lastupdate',
'rrd_restore' => 'Safe\rrd_restore',
'rrd_tune' => 'Safe\rrd_tune',
'rrd_update' => 'Safe\rrd_update',
'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
'sem_get' => 'Safe\sem_get',
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
'session_encode' => 'Safe\session_encode',
'session_id' => 'Safe\session_id',
'session_module_name' => 'Safe\session_module_name',
'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shmop_read' => 'Safe\shmop_read',
'shm_attach' => 'Safe\shm_attach',
'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
'shuffle' => 'Safe\shuffle',
'simplexml_import_dom' => 'Safe\simplexml_import_dom',
'simplexml_load_file' => 'Safe\simplexml_load_file',
'simplexml_load_string' => 'Safe\simplexml_load_string',
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
'socket_create_listen' => 'Safe\socket_create_listen',
'socket_create_pair' => 'Safe\socket_create_pair',
'socket_export_stream' => 'Safe\socket_export_stream',
'socket_getpeername' => 'Safe\socket_getpeername',
'socket_getsockname' => 'Safe\socket_getsockname',
'socket_get_option' => 'Safe\socket_get_option',
'socket_import_stream' => 'Safe\socket_import_stream',
'socket_listen' => 'Safe\socket_listen',
'socket_read' => 'Safe\socket_read',
'socket_send' => 'Safe\socket_send',
'socket_sendmsg' => 'Safe\socket_sendmsg',
'socket_sendto' => 'Safe\socket_sendto',
'socket_set_block' => 'Safe\socket_set_block',
'socket_set_nonblock' => 'Safe\socket_set_nonblock',
'socket_set_option' => 'Safe\socket_set_option',
'socket_shutdown' => 'Safe\socket_shutdown',
'socket_write' => 'Safe\socket_write',
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update' => 'Safe\sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic' => 'Safe\sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version' => 'Safe\solr_get_version',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
'sqlsrv_close' => 'Safe\sqlsrv_close',
'sqlsrv_commit' => 'Safe\sqlsrv_commit',
'sqlsrv_configure' => 'Safe\sqlsrv_configure',
'sqlsrv_execute' => 'Safe\sqlsrv_execute',
'sqlsrv_fetch' => 'Safe\sqlsrv_fetch',
'sqlsrv_fetch_array' => 'Safe\sqlsrv_fetch_array',
'sqlsrv_fetch_object' => 'Safe\sqlsrv_fetch_object',
'sqlsrv_free_stmt' => 'Safe\sqlsrv_free_stmt',
'sqlsrv_get_field' => 'Safe\sqlsrv_get_field',
'sqlsrv_next_result' => 'Safe\sqlsrv_next_result',
'sqlsrv_num_fields' => 'Safe\sqlsrv_num_fields',
'sqlsrv_num_rows' => 'Safe\sqlsrv_num_rows',
'sqlsrv_prepare' => 'Safe\sqlsrv_prepare',
'sqlsrv_query' => 'Safe\sqlsrv_query',
'sqlsrv_rollback' => 'Safe\sqlsrv_rollback',
'ssdeep_fuzzy_compare' => 'Safe\ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash' => 'Safe\ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename' => 'Safe\ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent' => 'Safe\ssh2_auth_agent',
'ssh2_auth_hostbased_file' => 'Safe\ssh2_auth_hostbased_file',
'ssh2_auth_password' => 'Safe\ssh2_auth_password',
'ssh2_auth_pubkey_file' => 'Safe\ssh2_auth_pubkey_file',
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
'ssh2_sftp_rename' => 'Safe\ssh2_sftp_rename',
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
'stream_filter_prepend' => 'Safe\stream_filter_prepend',
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
'stream_socket_get_name' => 'Safe\stream_socket_get_name',
'stream_socket_pair' => 'Safe\stream_socket_pair',
'stream_socket_recvfrom' => 'Safe\stream_socket_recvfrom',
'stream_socket_sendto' => 'Safe\stream_socket_sendto',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
'swoole_event_del' => 'Safe\swoole_event_del',
'swoole_event_write' => 'Safe\swoole_event_write',
'symlink' => 'Safe\symlink',
'syslog' => 'Safe\syslog',
'system' => 'Safe\system',
'sys_getloadavg' => 'Safe\sys_getloadavg',
'tempnam' => 'Safe\tempnam',
'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr',
'time_nanosleep' => 'Safe\time_nanosleep',
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
'xdiff_file_diff_binary' => 'Safe\xdiff_file_diff_binary',
'xdiff_file_patch_binary' => 'Safe\xdiff_file_patch_binary',
'xdiff_file_rabdiff' => 'Safe\xdiff_file_rabdiff',
'xdiff_string_bpatch' => 'Safe\xdiff_string_bpatch',
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
'xml_parser_free' => 'Safe\xml_parser_free',
'xml_set_character_data_handler' => 'Safe\xml_set_character_data_handler',
'xml_set_default_handler' => 'Safe\xml_set_default_handler',
'xml_set_element_handler' => 'Safe\xml_set_element_handler',
'xml_set_end_namespace_decl_handler' => 'Safe\xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler' => 'Safe\xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler' => 'Safe\xml_set_notation_decl_handler',
'xml_set_object' => 'Safe\xml_set_object',
'xml_set_processing_instruction_handler' => 'Safe\xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler' => 'Safe\xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler' => 'Safe\xml_set_unparsed_entity_decl_handler',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
'yaz_ccl_parse' => 'Safe\yaz_ccl_parse',
'yaz_close' => 'Safe\yaz_close',
'yaz_connect' => 'Safe\yaz_connect',
'yaz_database' => 'Safe\yaz_database',
'yaz_element' => 'Safe\yaz_element',
'yaz_present' => 'Safe\yaz_present',
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
'zip_entry_filesize' => 'Safe\zip_entry_filesize',
'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
]
);
};
<?php

namespace Safe;

use Safe\Exceptions\JsonException;












































function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
$safeResult = \json_encode($value, $flags, $depth);
if ($safeResult === false) {
throw JsonException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApacheException;








function apache_get_version(): string
{
error_clear_last();
$safeResult = \apache_get_version();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}












function apache_getenv(string $variable, bool $walk_to_top = false): string
{
error_clear_last();
$safeResult = \apache_getenv($variable, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}







































function apache_lookup_uri(string $filename): object
{
error_clear_last();
$safeResult = \apache_lookup_uri($filename);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_request_headers(): array
{
error_clear_last();
$safeResult = \apache_request_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}










function apache_response_headers(): array
{
error_clear_last();
$safeResult = \apache_response_headers();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}













function apache_setenv(string $variable, string $value, bool $walk_to_top = false): void
{
error_clear_last();
$safeResult = \apache_setenv($variable, $value, $walk_to_top);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}













function getallheaders(): array
{
error_clear_last();
$safeResult = \getallheaders();
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
return $safeResult;
}



















function virtual(string $uri): void
{
error_clear_last();
$safeResult = \virtual($uri);
if ($safeResult === false) {
throw ApacheException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\HashException;



























function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = "")
{
error_clear_last();
$safeResult = \hash_hkdf($algo, $key, $length, $info, $salt);
return $safeResult;
}











function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
if ($stream_context !== null) {
$safeResult = \hash_update_file($context, $filename, $stream_context);
} else {
$safeResult = \hash_update_file($context, $filename);
}
if ($safeResult === false) {
throw HashException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SwooleException;











function swoole_async_dns_lookup(string $hostname, callable $callback): void
{
error_clear_last();
$safeResult = \swoole_async_dns_lookup($hostname, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_readfile(string $filename, string $callback): void
{
error_clear_last();
$safeResult = \swoole_async_readfile($filename, $callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_write(string $filename, string $content, ?int $offset = null, ?callable $callback = null): void
{
error_clear_last();
if ($callback !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset, $callback);
} elseif ($offset !== null) {
$safeResult = \swoole_async_write($filename, $content, $offset);
} else {
$safeResult = \swoole_async_write($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}












function swoole_async_writefile(string $filename, string $content, ?callable $callback = null, int $flags = 0): void
{
error_clear_last();
if ($flags !== 0) {
$safeResult = \swoole_async_writefile($filename, $content, $callback, $flags);
} elseif ($callback !== null) {
$safeResult = \swoole_async_writefile($filename, $content, $callback);
} else {
$safeResult = \swoole_async_writefile($filename, $content);
}
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_defer(callable $callback): void
{
error_clear_last();
$safeResult = \swoole_event_defer($callback);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}









function swoole_event_del(int $fd): void
{
error_clear_last();
$safeResult = \swoole_event_del($fd);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}










function swoole_event_write(int $fd, string $data): void
{
error_clear_last();
$safeResult = \swoole_event_write($fd, $data);
if ($safeResult === false) {
throw SwooleException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SodiumException;















function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}














function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
















function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}


















function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}

















function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}















function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
{
error_clear_last();
$safeResult = \sodium_crypto_auth_verify($mac, $message, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
$safeResult = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}










function sodium_crypto_generichash_update(string &$state, string $message): void
{
error_clear_last();
$safeResult = \sodium_crypto_generichash_update($state, $message);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}














function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_open(string $signed_message, string $public_key): string
{
error_clear_last();
$safeResult = \sodium_crypto_sign_open($signed_message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}











function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
{
error_clear_last();
$safeResult = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
}















function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string
{
error_clear_last();
$safeResult = \sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
if ($safeResult === false) {
throw SodiumException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PspellException;









function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_personal($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
$safeResult = \pspell_add_to_session($dictionary, $word);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}









function pspell_clear_session(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_clear_session($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



































function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int
{
error_clear_last();
$safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}












function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_data_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}












function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
$safeResult = \pspell_config_dict_dir($config, $directory);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}










function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
$safeResult = \pspell_config_ignore($config, $min_length);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}






























function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
$safeResult = \pspell_config_mode($config, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}

















function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_personal($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
$safeResult = \pspell_config_repl($config, $filename);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}


















function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
$safeResult = \pspell_config_runtogether($config, $allow);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}



















function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
$safeResult = \pspell_config_save_repl($config, $save);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_new_config(int $config): int
{
error_clear_last();
$safeResult = \pspell_new_config($config);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}





























































function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}
































































function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
$safeResult = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
return $safeResult;
}









function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
$safeResult = \pspell_save_wordlist($dictionary);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}











function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
$safeResult = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($safeResult === false) {
throw PspellException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MysqliException;







function mysqli_get_client_stats()
{
error_clear_last();
$safeResult = \mysqli_get_client_stats();
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\OutcontrolException;














function ob_clean(): void
{
error_clear_last();
$safeResult = \ob_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}

















function ob_end_clean(): void
{
error_clear_last();
$safeResult = \ob_end_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}


















function ob_end_flush(): void
{
error_clear_last();
$safeResult = \ob_end_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}















function ob_flush(): void
{
error_clear_last();
$safeResult = \ob_flush();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function ob_get_clean(): string
{
error_clear_last();
$safeResult = \ob_get_clean();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
return $safeResult;
}

























































































function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
{
error_clear_last();
if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
$safeResult = \ob_start($callback, $chunk_size, $flags);
} elseif ($chunk_size !== 0) {
$safeResult = \ob_start($callback, $chunk_size);
} elseif ($callback !== null) {
$safeResult = \ob_start($callback);
} else {
$safeResult = \ob_start();
}
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}



















function output_add_rewrite_var(string $name, string $value): void
{
error_clear_last();
$safeResult = \output_add_rewrite_var($name, $value);
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}










function output_reset_rewrite_vars(): void
{
error_clear_last();
$safeResult = \output_reset_rewrite_vars();
if ($safeResult === false) {
throw OutcontrolException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\OpcacheException;










function opcache_compile_file(string $filename): void
{
error_clear_last();
$safeResult = \opcache_compile_file($filename);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
}











function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
$safeResult = \opcache_get_status($include_scripts);
if ($safeResult === false) {
throw OpcacheException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\MysqlException;























function mysql_close($link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_close($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}







































function mysql_connect(?string $server = null, ?string $username = null, ?string $password = null, bool $new_link = false, int $client_flags = 0)
{
error_clear_last();
if ($client_flags !== 0) {
$safeResult = \mysql_connect($server, $username, $password, $new_link, $client_flags);
} elseif ($new_link !== false) {
$safeResult = \mysql_connect($server, $username, $password, $new_link);
} elseif ($password !== null) {
$safeResult = \mysql_connect($server, $username, $password);
} elseif ($username !== null) {
$safeResult = \mysql_connect($server, $username);
} elseif ($server !== null) {
$safeResult = \mysql_connect($server);
} else {
$safeResult = \mysql_connect();
}
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_create_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_create_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}























function mysql_data_seek($result, int $row_number): void
{
error_clear_last();
$safeResult = \mysql_data_seek($result, $row_number);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_db_name($result, int $row, $field = null): string
{
error_clear_last();
$safeResult = \mysql_db_name($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}






















function mysql_db_query(string $database, string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_db_query($database, $query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



















function mysql_drop_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_drop_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}





















function mysql_fetch_lengths($result): array
{
error_clear_last();
$safeResult = \mysql_fetch_lengths($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}



























function mysql_field_flags($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_flags($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_len($result, int $field_offset): int
{
error_clear_last();
$safeResult = \mysql_field_len($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_field_name($result, int $field_offset): string
{
error_clear_last();
$safeResult = \mysql_field_name($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_field_seek($result, int $field_offset): void
{
error_clear_last();
$safeResult = \mysql_field_seek($result, $field_offset);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_free_result($result): void
{
error_clear_last();
$safeResult = \mysql_free_result($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}

















function mysql_get_host_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_host_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_proto_info($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_get_proto_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_get_server_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_get_server_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_info($link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_info($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


















function mysql_list_dbs($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_dbs($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


























function mysql_list_fields(string $database_name, string $table_name, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_fields($database_name, $table_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_list_processes($link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_processes($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
























function mysql_list_tables(string $database, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_list_tables($database, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}













function mysql_num_fields($result): int
{
error_clear_last();
$safeResult = \mysql_num_fields($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}















function mysql_num_rows($result): int
{
error_clear_last();
$safeResult = \mysql_num_rows($result);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}









































function mysql_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_real_escape_string(string $unescaped_string, $link_identifier = null): string
{
error_clear_last();
$safeResult = \mysql_real_escape_string($unescaped_string, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}




























function mysql_result($result, int $row, $field = 0): string
{
error_clear_last();
$safeResult = \mysql_result($result, $row, $field);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_select_db(string $database_name, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_select_db($database_name, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}















function mysql_set_charset(string $charset, $link_identifier = null): void
{
error_clear_last();
$safeResult = \mysql_set_charset($charset, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
}




















function mysql_tablename($result, int $i): string
{
error_clear_last();
$safeResult = \mysql_tablename($result, $i);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}

















function mysql_thread_id($link_identifier = null): int
{
error_clear_last();
$safeResult = \mysql_thread_id($link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}


































function mysql_unbuffered_query(string $query, $link_identifier = null)
{
error_clear_last();
$safeResult = \mysql_unbuffered_query($query, $link_identifier);
if ($safeResult === false) {
throw MysqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RrdException;










function rrd_create(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_create($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}











function rrd_first(string $file, int $raaindex = 0): int
{
error_clear_last();
$safeResult = \rrd_first($file, $raaindex);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}















function rrd_graph(string $filename, array $options): array
{
error_clear_last();
$safeResult = \rrd_graph($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}










function rrd_info(string $filename): array
{
error_clear_last();
$safeResult = \rrd_info($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_lastupdate(string $filename): array
{
error_clear_last();
$safeResult = \rrd_lastupdate($filename);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}











function rrd_restore(string $xml_file, string $rrd_file, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rrd_restore($xml_file, $rrd_file, $options);
} else {
$safeResult = \rrd_restore($xml_file, $rrd_file);
}
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_tune(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_tune($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_update(string $filename, array $options): void
{
error_clear_last();
$safeResult = \rrd_update($filename, $options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
}












function rrd_xport(array $options): array
{
error_clear_last();
$safeResult = \rrd_xport($options);
if ($safeResult === false) {
throw RrdException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ErrorfuncException;































































function error_log(string $message, int $message_type = 0, ?string $destination = null, ?string $additional_headers = null): void
{
error_clear_last();
if ($additional_headers !== null) {
$safeResult = \error_log($message, $message_type, $destination, $additional_headers);
} elseif ($destination !== null) {
$safeResult = \error_log($message, $message_type, $destination);
} else {
$safeResult = \error_log($message, $message_type);
}
if ($safeResult === false) {
throw ErrorfuncException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbaseException;









function fbird_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \fbird_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_add_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_add_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_add_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}





























function ibase_backup($service_handle, string $source_db, string $dest_file, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_backup($service_handle, $source_db, $dest_file, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_blob_cancel($blob_handle): void
{
error_clear_last();
$safeResult = \ibase_blob_cancel($blob_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_blob_create($link_identifier = null)
{
error_clear_last();
if ($link_identifier !== null) {
$safeResult = \ibase_blob_create($link_identifier);
} else {
$safeResult = \ibase_blob_create();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}












function ibase_blob_get($blob_handle, int $len): string
{
error_clear_last();
$safeResult = \ibase_blob_get($blob_handle, $len);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}














function ibase_close($connection_id = null): void
{
error_clear_last();
if ($connection_id !== null) {
$safeResult = \ibase_close($connection_id);
} else {
$safeResult = \ibase_close();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}















function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_commit($link_or_trans_identifier);
} else {
$safeResult = \ibase_commit();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}



































function ibase_connect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_connect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_connect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_connect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_connect($database);
} else {
$safeResult = \ibase_connect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}










function ibase_delete_user($service_handle, string $user_name): void
{
error_clear_last();
$safeResult = \ibase_delete_user($service_handle, $user_name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_drop_db($connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \ibase_drop_db($connection);
} else {
$safeResult = \ibase_drop_db();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_free_event_handler($event): void
{
error_clear_last();
$safeResult = \ibase_free_event_handler($event);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}









function ibase_free_query($query): void
{
error_clear_last();
$safeResult = \ibase_free_query($query);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










function ibase_free_result($result_identifier): void
{
error_clear_last();
$safeResult = \ibase_free_result($result_identifier);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}












function ibase_maintain_db($service_handle, string $db, int $action, int $argument = 0): void
{
error_clear_last();
$safeResult = \ibase_maintain_db($service_handle, $db, $action, $argument);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}














function ibase_modify_user($service_handle, string $user_name, string $password, ?string $first_name = null, ?string $middle_name = null, ?string $last_name = null): void
{
error_clear_last();
if ($last_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name, $last_name);
} elseif ($middle_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name, $middle_name);
} elseif ($first_name !== null) {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password, $first_name);
} else {
$safeResult = \ibase_modify_user($service_handle, $user_name, $password);
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}











function ibase_name_result($result, string $name): void
{
error_clear_last();
$safeResult = \ibase_name_result($result, $name);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}










































function ibase_pconnect(?string $database = null, ?string $username = null, ?string $password = null, ?string $charset = null, ?int $buffers = null, ?int $dialect = null, ?string $role = null, ?int $sync = null)
{
error_clear_last();
if ($sync !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role, $sync);
} elseif ($role !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect, $role);
} elseif ($dialect !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers, $dialect);
} elseif ($buffers !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset, $buffers);
} elseif ($charset !== null) {
$safeResult = \ibase_pconnect($database, $username, $password, $charset);
} elseif ($password !== null) {
$safeResult = \ibase_pconnect($database, $username, $password);
} elseif ($username !== null) {
$safeResult = \ibase_pconnect($database, $username);
} elseif ($database !== null) {
$safeResult = \ibase_pconnect($database);
} else {
$safeResult = \ibase_pconnect();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}
































function ibase_restore($service_handle, string $source_file, string $dest_db, int $options = 0, bool $verbose = false)
{
error_clear_last();
$safeResult = \ibase_restore($service_handle, $source_file, $dest_db, $options, $verbose);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}















function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback_ret($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback_ret();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
if ($link_or_trans_identifier !== null) {
$safeResult = \ibase_rollback($link_or_trans_identifier);
} else {
$safeResult = \ibase_rollback();
}
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}













function ibase_service_attach(string $host, string $dba_username, string $dba_password)
{
error_clear_last();
$safeResult = \ibase_service_attach($host, $dba_username, $dba_password);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
return $safeResult;
}









function ibase_service_detach($service_handle): void
{
error_clear_last();
$safeResult = \ibase_service_detach($service_handle);
if ($safeResult === false) {
throw IbaseException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UopzException;









function uopz_extend(string $class, string $parent): void
{
error_clear_last();
$safeResult = \uopz_extend($class, $parent);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}










function uopz_implement(string $class, string $interface): void
{
error_clear_last();
$safeResult = \uopz_implement($class, $interface);
if ($safeResult === false) {
throw UopzException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\MbstringException;
















function mb_chr(int $codepoint, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_chr($codepoint, $encoding);
} else {
$safeResult = \mb_chr($codepoint);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


























function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
{
error_clear_last();
if ($from_encoding !== null) {
$safeResult = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
$safeResult = \mb_convert_encoding($string, $to_encoding);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}































function mb_detect_order($encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_detect_order($encoding);
} else {
$safeResult = \mb_detect_order();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}










function mb_encoding_aliases(string $encoding): array
{
error_clear_last();
$safeResult = \mb_encoding_aliases($encoding);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




































function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
} else {
$safeResult = \mb_ereg_replace_callback($pattern, $callback, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}

















function mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): ?string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_ereg_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_getregs(): array
{
error_clear_last();
$safeResult = \mb_ereg_search_getregs();
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
















function mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_init($string, $pattern);
} else {
$safeResult = \mb_ereg_search_init($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}











function mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$safeResult = \mb_ereg_search_regs($pattern);
} else {
$safeResult = \mb_ereg_search_regs();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}









function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
$safeResult = \mb_ereg_search_setpos($offset);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}















function mb_eregi_replace(string $pattern, string $replacement, string $string, ?string $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string, $options);
} else {
$safeResult = \mb_eregi_replace($pattern, $replacement, $string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}





























function mb_get_info(string $type = "all")
{
error_clear_last();
$safeResult = \mb_get_info($type);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}




















function mb_http_output(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_http_output($encoding);
} else {
$safeResult = \mb_http_output();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}


















function mb_internal_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_internal_encoding($encoding);
} else {
$safeResult = \mb_internal_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_ord(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_ord($string, $encoding);
} else {
$safeResult = \mb_ord($string);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}















function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
$safeResult = \mb_parse_str($string, $result);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_regex_encoding(?string $encoding = null)
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \mb_regex_encoding($encoding);
} else {
$safeResult = \mb_regex_encoding();
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}



























































function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], ?string $additional_params = null): void
{
error_clear_last();
if ($additional_params !== null) {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
} else {
$safeResult = \mb_send_mail($to, $subject, $message, $additional_headers);
}
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
}












function mb_split(string $pattern, string $string, int $limit = -1): array
{
error_clear_last();
$safeResult = \mb_split($pattern, $string, $limit);
if ($safeResult === false) {
throw MbstringException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GnupgException;











function gnupg_adddecryptkey($identifier, string $fingerprint, string $passphrase): void
{
error_clear_last();
$safeResult = \gnupg_adddecryptkey($identifier, $fingerprint, $passphrase);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}











function gnupg_addencryptkey($identifier, string $fingerprint): void
{
error_clear_last();
$safeResult = \gnupg_addencryptkey($identifier, $fingerprint);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_addsignkey($identifier, string $fingerprint, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint, $passphrase);
} else {
$safeResult = \gnupg_addsignkey($identifier, $fingerprint);
}
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_cleardecryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_cleardecryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearencryptkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearencryptkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}










function gnupg_clearsignkeys($identifier): void
{
error_clear_last();
$safeResult = \gnupg_clearsignkeys($identifier);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}












function gnupg_deletekey($identifier, string $key, bool $allow_secret): void
{
error_clear_last();
$safeResult = \gnupg_deletekey($identifier, $key, $allow_secret);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}













function gnupg_setarmor($identifier, int $armor): void
{
error_clear_last();
$safeResult = \gnupg_setarmor($identifier, $armor);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}


















function gnupg_setsignmode($identifier, int $signmode): void
{
error_clear_last();
$safeResult = \gnupg_setsignmode($identifier, $signmode);
if ($safeResult === false) {
throw GnupgException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XmlException;








function xml_parser_free(\XMLParser $parser): void
{
error_clear_last();
$safeResult = \xml_parser_free($parser);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
















































function xml_set_character_data_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_character_data_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


















































function xml_set_default_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_default_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}






























































function xml_set_element_handler(\XMLParser $parser, callable $start_handler, callable $end_handler): void
{
error_clear_last();
$safeResult = \xml_set_element_handler($parser, $start_handler, $end_handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

















































function xml_set_end_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_end_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}




















































































function xml_set_external_entity_ref_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_external_entity_ref_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}

























































































function xml_set_notation_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_notation_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}













function xml_set_object(\XMLParser $parser, object $object): void
{
error_clear_last();
$safeResult = \xml_set_object($parser, $object);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


































































function xml_set_processing_instruction_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_processing_instruction_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}


























































function xml_set_start_namespace_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_start_namespace_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
































































































function xml_set_unparsed_entity_decl_handler(\XMLParser $parser, callable $handler): void
{
error_clear_last();
$safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler);
if ($safeResult === false) {
throw XmlException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SemException;


















function msg_get_queue(int $key, int $permissions = 0666): \SysvMessageQueue
{
error_clear_last();
$safeResult = \msg_get_queue($key, $permissions);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}









function msg_queue_exists(int $key): void
{
error_clear_last();
$safeResult = \msg_queue_exists($key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}









































































function msg_receive(\SysvMessageQueue $queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function msg_remove_queue(\SysvMessageQueue $queue): void
{
error_clear_last();
$safeResult = \msg_remove_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



































function msg_send(\SysvMessageQueue $queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
$safeResult = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}



















function msg_set_queue(\SysvMessageQueue $queue, array $data): void
{
error_clear_last();
$safeResult = \msg_set_queue($queue, $data);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















































































function msg_stat_queue(\SysvMessageQueue $queue): array
{
error_clear_last();
$safeResult = \msg_stat_queue($queue);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}





















function sem_acquire(\SysvSemaphore $semaphore, bool $non_blocking = false): void
{
error_clear_last();
$safeResult = \sem_acquire($semaphore, $non_blocking);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}

























function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true): \SysvSemaphore
{
error_clear_last();
$safeResult = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}















function sem_release(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_release($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}












function sem_remove(\SysvSemaphore $semaphore): void
{
error_clear_last();
$safeResult = \sem_remove($semaphore);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
























function shm_attach(int $key, ?int $size = null, int $permissions = 0666): \SysvSharedMemory
{
error_clear_last();
if ($permissions !== 0666) {
$safeResult = \shm_attach($key, $size, $permissions);
} elseif ($size !== null) {
$safeResult = \shm_attach($key, $size);
} else {
$safeResult = \shm_attach($key);
}
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
return $safeResult;
}












function shm_detach(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_detach($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}





















function shm_put_var(\SysvSharedMemory $shm, int $key, $value): void
{
error_clear_last();
$safeResult = \shm_put_var($shm, $key, $value);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}











function shm_remove_var(\SysvSharedMemory $shm, int $key): void
{
error_clear_last();
$safeResult = \shm_remove_var($shm, $key);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}










function shm_remove(\SysvSharedMemory $shm): void
{
error_clear_last();
$safeResult = \shm_remove($shm);
if ($safeResult === false) {
throw SemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\SplException;











function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_implements($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}












function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_parents($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}













function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
$safeResult = \class_uses($object_or_class, $autoload);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
return $safeResult;
}






























function spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
$safeResult = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
$safeResult = \spl_autoload_register($callback, $throw);
} elseif ($callback !== null) {
$safeResult = \spl_autoload_register($callback);
} else {
$safeResult = \spl_autoload_register();
}
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}














function spl_autoload_unregister($callback): void
{
error_clear_last();
$safeResult = \spl_autoload_unregister($callback);
if ($safeResult === false) {
throw SplException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\XdiffException;













function xdiff_file_bdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}














function xdiff_file_bpatch(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_bpatch($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_diff_binary($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}




















function xdiff_file_diff(string $old_file, string $new_file, string $dest, int $context = 3, bool $minimal = false): void
{
error_clear_last();
$safeResult = \xdiff_file_diff($old_file, $new_file, $dest, $context, $minimal);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}
















function xdiff_file_patch_binary(string $file, string $patch, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_patch_binary($file, $patch, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}



















function xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): void
{
error_clear_last();
$safeResult = \xdiff_file_rabdiff($old_file, $new_file, $dest);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
}













function xdiff_string_bpatch(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_bpatch($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}















function xdiff_string_patch_binary(string $str, string $patch): string
{
error_clear_last();
$safeResult = \xdiff_string_patch_binary($str, $patch);
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
























function xdiff_string_patch(string $str, string $patch, ?int $flags = null, ?string &$error = null): string
{
error_clear_last();
if ($error !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags, $error);
} elseif ($flags !== null) {
$safeResult = \xdiff_string_patch($str, $patch, $flags);
} else {
$safeResult = \xdiff_string_patch($str, $patch);
}
if ($safeResult === false) {
throw XdiffException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\YamlException;




















function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_file($filename, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
























function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse_url($url, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}





















function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \yaml_parse($input, $pos, $ndocs, $callbacks);
} else {
$safeResult = \yaml_parse($input, $pos, $ndocs);
}
if ($safeResult === false) {
throw YamlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SolrException;








function solr_get_version(): string
{
error_clear_last();
$safeResult = \solr_get_version();
if ($safeResult === false) {
throw SolrException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;











































function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse_from_format($format, $datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}































































function date_parse(string $datetime): ?array
{
error_clear_last();
$safeResult = \date_parse($datetime);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}



































































































function date_sun_info(int $timestamp, float $latitude, float $longitude): array
{
error_clear_last();
$safeResult = \date_sun_info($timestamp, $latitude, $longitude);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunrise($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunrise($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}




















































































function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, ?float $latitude = null, ?float $longitude = null, ?float $zenith = null, ?float $utcOffset = null)
{
error_clear_last();
if ($utcOffset !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
} elseif ($longitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude, $longitude);
} elseif ($latitude !== null) {
$safeResult = \date_sunset($timestamp, $returnFormat, $latitude);
} else {
$safeResult = \date_sunset($timestamp, $returnFormat);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}



















function date(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \date($format, $timestamp);
} else {
$safeResult = \date($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}


































function gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null): int
{
error_clear_last();
if ($year !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \gmmktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \gmmktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \gmmktime($hour, $minute);
} else {
$safeResult = \gmmktime($hour);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function gmstrftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \gmstrftime($format, $timestamp);
} else {
$safeResult = \gmstrftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}






















































































































function idate(string $format, ?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \idate($format, $timestamp);
} else {
$safeResult = \idate($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}







































function mktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null)
{
error_clear_last();
if ($year !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day, $year);
} elseif ($day !== null) {
$safeResult = \mktime($hour, $minute, $second, $month, $day);
} elseif ($month !== null) {
$safeResult = \mktime($hour, $minute, $second, $month);
} elseif ($second !== null) {
$safeResult = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$safeResult = \mktime($hour, $minute);
} else {
$safeResult = \mktime($hour);
}
return $safeResult;
}

















































































































































































































































































































function strftime(string $format, ?int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \strftime($format, $timestamp);
} else {
$safeResult = \strftime($format);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}










































































function strptime(string $timestamp, string $format): array
{
error_clear_last();
$safeResult = \strptime($timestamp, $format);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
















function strtotime(string $datetime, ?int $baseTimestamp = null): int
{
error_clear_last();
if ($baseTimestamp !== null) {
$safeResult = \strtotime($datetime, $baseTimestamp);
} else {
$safeResult = \strtotime($datetime);
}
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}























function timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string
{
error_clear_last();
$safeResult = \timezone_name_from_abbr($abbr, $utcOffset, $isDST);
if ($safeResult === false) {
throw DatetimeException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImapException;










function imap_8bit(string $string): string
{
error_clear_last();
$safeResult = \imap_8bit($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



















function imap_append(\IMAP\Connection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): void
{
error_clear_last();
if ($internal_date !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options, $internal_date);
} elseif ($options !== null) {
$safeResult = \imap_append($imap, $folder, $message, $options);
} else {
$safeResult = \imap_append($imap, $folder, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_base64(string $string): string
{
error_clear_last();
$safeResult = \imap_base64($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_binary(string $string): string
{
error_clear_last();
$safeResult = \imap_binary($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}







































function imap_body(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_body($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_bodystruct(\IMAP\Connection $imap, int $message_num, string $section): \stdClass
{
error_clear_last();
$safeResult = \imap_bodystruct($imap, $message_num, $section);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}








































function imap_check(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_check($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_clearflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_clearflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_close(\IMAP\Connection $imap, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_close($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_createmailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_createmailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_deletemailbox(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_deletemailbox($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












































































































function imap_fetch_overview(\IMAP\Connection $imap, string $sequence, int $flags = 0): array
{
error_clear_last();
$safeResult = \imap_fetch_overview($imap, $sequence, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}



































function imap_fetchbody(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchbody($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




































function imap_fetchheader(\IMAP\Connection $imap, int $message_num, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchheader($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_fetchmime(\IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string
{
error_clear_last();
$safeResult = \imap_fetchmime($imap, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










































































































































function imap_fetchstructure(\IMAP\Connection $imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_fetchstructure($imap, $message_num, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_gc(\IMAP\Connection $imap, int $flags): void
{
error_clear_last();
$safeResult = \imap_gc($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_getacl(\IMAP\Connection $imap, string $mailbox): array
{
error_clear_last();
$safeResult = \imap_getacl($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getmailboxes(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getmailboxes($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































function imap_getsubscribed(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_getsubscribed($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
























































































































































































































function imap_headerinfo(\IMAP\Connection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
{
error_clear_last();
$safeResult = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}












function imap_headers(\IMAP\Connection $imap): array
{
error_clear_last();
$safeResult = \imap_headers($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

































function imap_listscan(\IMAP\Connection $imap, string $reference, string $pattern, string $content): array
{
error_clear_last();
$safeResult = \imap_listscan($imap, $reference, $pattern, $content);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


























function imap_lsub(\IMAP\Connection $imap, string $reference, string $pattern): array
{
error_clear_last();
$safeResult = \imap_lsub($imap, $reference, $pattern);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}













































































































function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
$safeResult = \imap_mail_compose($envelope, $bodies);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}





























function imap_mail_copy(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}

























function imap_mail_move(\IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): void
{
error_clear_last();
if ($return_path !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
} elseif ($bcc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
} elseif ($cc !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers, $cc);
} elseif ($additional_headers !== null) {
$safeResult = \imap_mail($to, $subject, $message, $additional_headers);
} else {
$safeResult = \imap_mail($to, $subject, $message);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}






















































function imap_mailboxmsginfo(\IMAP\Connection $imap): \stdClass
{
error_clear_last();
$safeResult = \imap_mailboxmsginfo($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


















function imap_mime_header_decode(string $string): array
{
error_clear_last();
$safeResult = \imap_mime_header_decode($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
$safeResult = \imap_mutf7_to_utf8($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_num_msg(\IMAP\Connection $imap): int
{
error_clear_last();
$safeResult = \imap_num_msg($imap);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














































































































































































































function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): \IMAP\Connection
{
error_clear_last();
$safeResult = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}










function imap_qprint(string $string): string
{
error_clear_last();
$safeResult = \imap_qprint($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}















function imap_renamemailbox(\IMAP\Connection $imap, string $from, string $to): void
{
error_clear_last();
$safeResult = \imap_renamemailbox($imap, $from, $to);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}













function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
$safeResult = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}


































function imap_savebody(\IMAP\Connection $imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}












function imap_set_quota(\IMAP\Connection $imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
$safeResult = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}














function imap_setacl(\IMAP\Connection $imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
$safeResult = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



























function imap_setflag_full(\IMAP\Connection $imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
$safeResult = \imap_setflag_full($imap, $sequence, $flag, $options);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}



































































function imap_sort(\IMAP\Connection $imap, int $criteria, int $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array
{
error_clear_last();
if ($charset !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
} elseif ($search_criteria !== null) {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
} else {
$safeResult = \imap_sort($imap, $criteria, $reverse, $flags);
}
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}

























































function imap_status(\IMAP\Connection $imap, string $mailbox, int $flags): \stdClass
{
error_clear_last();
$safeResult = \imap_status($imap, $mailbox, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}











function imap_subscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_subscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}


























function imap_thread(\IMAP\Connection $imap, int $flags = SE_FREE): array
{
error_clear_last();
$safeResult = \imap_thread($imap, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}




















function imap_timeout(int $timeout_type, int $timeout = -1)
{
error_clear_last();
$safeResult = \imap_timeout($timeout_type, $timeout);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}














function imap_undelete(\IMAP\Connection $imap, string $message_nums, int $flags = 0): void
{
error_clear_last();
$safeResult = \imap_undelete($imap, $message_nums, $flags);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}











function imap_unsubscribe(\IMAP\Connection $imap, string $mailbox): void
{
error_clear_last();
$safeResult = \imap_unsubscribe($imap, $mailbox);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
}










function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
$safeResult = \imap_utf8_to_mutf7($string);
if ($safeResult === false) {
throw ImapException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\NetworkException;








function closelog(): void
{
error_clear_last();
$safeResult = \closelog();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}



































































































































































































































function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
$safeResult = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}



















































function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}











function gethostname(): string
{
error_clear_last();
$safeResult = \gethostname();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobyname(string $protocol): int
{
error_clear_last();
$safeResult = \getprotobyname($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function getprotobynumber(int $protocol): string
{
error_clear_last();
$safeResult = \getprotobynumber($protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function getservbyport(int $port, string $protocol): string
{
error_clear_last();
$safeResult = \getservbyport($port, $protocol);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}














function header_register_callback(callable $callback): void
{
error_clear_last();
$safeResult = \header_register_callback($callback);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}










function inet_ntop(string $ip): string
{
error_clear_last();
$safeResult = \inet_ntop($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}















function inet_pton(string $ip): string
{
error_clear_last();
$safeResult = \inet_pton($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}












function long2ip(int $ip): string
{
error_clear_last();
$safeResult = \long2ip($ip);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}
































































































function net_get_interfaces(): array
{
error_clear_last();
$safeResult = \net_get_interfaces();
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}






































































































































function openlog(string $prefix, int $flags, int $facility): void
{
error_clear_last();
$safeResult = \openlog($prefix, $flags, $facility);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}




















function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, ?float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
$safeResult = \pfsockopen($hostname, $port, $error_code, $error_message);
}
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
return $safeResult;
}
































































function syslog(int $priority, string $message): void
{
error_clear_last();
$safeResult = \syslog($priority, $message);
if ($safeResult === false) {
throw NetworkException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\UrlException;














function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
$safeResult = \base64_decode($string, $strict);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}

















function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \get_headers($url, $associative, $context);
} else {
$safeResult = \get_headers($url, $associative);
}
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}






































function get_meta_tags(string $filename, bool $use_include_path = false): array
{
error_clear_last();
$safeResult = \get_meta_tags($filename, $use_include_path);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}


























































































function parse_url(string $url, int $component = -1)
{
error_clear_last();
$safeResult = \parse_url($url, $component);
if ($safeResult === false) {
throw UrlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PosixException;

















function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
$safeResult = \posix_access($filename, $flags);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























































function posix_getgrgid(int $group_id): array
{
error_clear_last();
$safeResult = \posix_getgrgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}























































function posix_getgrnam(string $name): array
{
error_clear_last();
$safeResult = \posix_getgrnam($name);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_getgroups(): array
{
error_clear_last();
$safeResult = \posix_getgroups();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









function posix_getlogin(): string
{
error_clear_last();
$safeResult = \posix_getlogin();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}



















































































function posix_getpwuid(int $user_id): array
{
error_clear_last();
$safeResult = \posix_getpwuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}





































































































function posix_getrlimit(): array
{
error_clear_last();
$safeResult = \posix_getrlimit();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}














function posix_getsid(int $process_id): int
{
error_clear_last();
$safeResult = \posix_getsid($process_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}










function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
$safeResult = \posix_initgroups($username, $group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
$safeResult = \posix_kill($process_id, $signal);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}
















function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \posix_mkfifo($filename, $permissions);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}

















function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
$safeResult = \posix_mknod($filename, $flags, $major, $minor);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setegid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setegid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_seteuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_seteuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}














function posix_setgid(int $group_id): void
{
error_clear_last();
$safeResult = \posix_setgid($group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}











function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
$safeResult = \posix_setpgid($process_id, $process_group_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}























function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
$safeResult = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}









function posix_setsid(): int
{
error_clear_last();
$safeResult = \posix_setsid();
if ($safeResult === -1) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}











function posix_setuid(int $user_id): void
{
error_clear_last();
$safeResult = \posix_setuid($user_id);
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
}







































function posix_times(): array
{
error_clear_last();
$safeResult = \posix_times();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}









































function posix_uname(): array
{
error_clear_last();
$safeResult = \posix_uname();
if ($safeResult === false) {
throw PosixException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\UodbcException;





















function odbc_autocommit($odbc, bool $enable = false)
{
error_clear_last();
$safeResult = \odbc_autocommit($odbc, $enable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































































































function odbc_binmode(int $statement, int $mode): void
{
error_clear_last();
$safeResult = \odbc_binmode($statement, $mode);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}







































function odbc_columnprivileges($odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
$safeResult = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}















































function odbc_columns($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table, $column);
} elseif ($table !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_columns($odbc, $catalog);
} else {
$safeResult = \odbc_columns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_commit($odbc): void
{
error_clear_last();
$safeResult = \odbc_commit($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}


































function odbc_connect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_connect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_cursor($statement): string
{
error_clear_last();
$safeResult = \odbc_cursor($statement);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

















function odbc_data_source($odbc, int $fetch_type): array
{
error_clear_last();
$safeResult = \odbc_data_source($odbc, $fetch_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_exec($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_exec($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















function odbc_execute($statement, array $params = []): void
{
error_clear_last();
$safeResult = \odbc_execute($statement, $params);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
















function odbc_fetch_into($statement, ?array &$array, int $row = 0): int
{
error_clear_last();
$safeResult = \odbc_fetch_into($statement, $array, $row);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_len($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_len($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_name($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_name($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}













function odbc_field_num($statement, string $field): int
{
error_clear_last();
$safeResult = \odbc_field_num($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_scale($statement, int $field): int
{
error_clear_last();
$safeResult = \odbc_field_scale($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}












function odbc_field_type($statement, int $field): string
{
error_clear_last();
$safeResult = \odbc_field_type($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}






































function odbc_foreignkeys($odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
$safeResult = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_gettypeinfo($odbc, int $data_type = 0)
{
error_clear_last();
$safeResult = \odbc_gettypeinfo($odbc, $data_type);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_longreadlen($statement, int $length): void
{
error_clear_last();
$safeResult = \odbc_longreadlen($statement, $length);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}










function odbc_num_fields($statement): int
{
error_clear_last();
$safeResult = \odbc_num_fields($statement);
if ($safeResult === -1) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}























function odbc_pconnect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
{
error_clear_last();
$safeResult = \odbc_pconnect($dsn, $user, $password, $cursor_option);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}



















function odbc_prepare($odbc, string $query)
{
error_clear_last();
$safeResult = \odbc_prepare($odbc, $query);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


























function odbc_primarykeys($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_primarykeys($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


















































function odbc_procedurecolumns($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null, ?string $column = null)
{
error_clear_last();
if ($column !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
} elseif ($procedure !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedurecolumns($odbc, $catalog);
} else {
$safeResult = \odbc_procedurecolumns($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}


































function odbc_procedures($odbc, ?string $catalog = null, ?string $schema = null, ?string $procedure = null)
{
error_clear_last();
if ($procedure !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema, $procedure);
} elseif ($schema !== null) {
$safeResult = \odbc_procedures($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_procedures($odbc, $catalog);
} else {
$safeResult = \odbc_procedures($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
















function odbc_result_all($statement, string $format = ""): int
{
error_clear_last();
$safeResult = \odbc_result_all($statement, $format);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}














function odbc_result($statement, $field)
{
error_clear_last();
$safeResult = \odbc_result($statement, $field);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}










function odbc_rollback($odbc): void
{
error_clear_last();
$safeResult = \odbc_rollback($odbc);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}
































function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
$safeResult = \odbc_setoption($odbc, $which, $option, $value);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
}



































function odbc_specialcolumns($odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
$safeResult = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}





































function odbc_statistics($odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
$safeResult = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}

































function odbc_tableprivileges($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
$safeResult = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}











































































function odbc_tables($odbc, ?string $catalog = null, ?string $schema = null, ?string $table = null, ?string $types = null)
{
error_clear_last();
if ($types !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table, $types);
} elseif ($table !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
$safeResult = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
$safeResult = \odbc_tables($odbc, $catalog);
} else {
$safeResult = \odbc_tables($odbc);
}
if ($safeResult === false) {
throw UodbcException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\LzfException;










function lzf_compress(string $data): string
{
error_clear_last();
$safeResult = \lzf_compress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}











function lzf_decompress(string $data): string
{
error_clear_last();
$safeResult = \lzf_decompress($data);
if ($safeResult === false) {
throw LzfException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ImageException;































































function getimagesize(string $filename, ?array &$image_info = null): ?array
{
error_clear_last();
$safeResult = \getimagesize($filename, $image_info);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function image_type_to_extension(int $image_type, bool $include_dot = true): string
{
error_clear_last();
$safeResult = \image_type_to_extension($image_type, $include_dot);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imageaffine(\GdImage $image, array $affine, ?array $clip = null): \GdImage
{
error_clear_last();
if ($clip !== null) {
$safeResult = \imageaffine($image, $affine, $clip);
} else {
$safeResult = \imageaffine($image, $affine);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
$safeResult = \imageaffinematrixconcat($matrix1, $matrix2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
$safeResult = \imageaffinematrixget($type, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagealphablending(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagealphablending($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imageantialias(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imageantialias($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagearc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
$safeResult = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
{
error_clear_last();
if ($speed !== -1) {
$safeResult = \imageavif($image, $file, $quality, $speed);
} elseif ($quality !== -1) {
$safeResult = \imageavif($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imageavif($image, $file);
} else {
$safeResult = \imageavif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagebmp(\GdImage $image, $file = null, bool $compressed = true): void
{
error_clear_last();
if ($compressed !== true) {
$safeResult = \imagebmp($image, $file, $compressed);
} elseif ($file !== null) {
$safeResult = \imagebmp($image, $file);
} else {
$safeResult = \imagebmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





















function imagechar(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagechar($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecharup(\GdImage $image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
$safeResult = \imagecharup($image, $font, $x, $y, $char, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagecolorat(\GdImage $image, int $x, int $y): int
{
error_clear_last();
$safeResult = \imagecolorat($image, $x, $y);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagecolordeallocate(\GdImage $image, int $color): void
{
error_clear_last();
$safeResult = \imagecolordeallocate($image, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagecolormatch(\GdImage $image1, \GdImage $image2): void
{
error_clear_last();
$safeResult = \imagecolormatch($image1, $image2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagecolorset(\GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
{
error_clear_last();
$safeResult = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}












function imagecolorsforindex(\GdImage $image, int $color): array
{
error_clear_last();
$safeResult = \imagecolorsforindex($image, $color);
return $safeResult;
}














function imageconvolution(\GdImage $image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
$safeResult = \imageconvolution($image, $matrix, $divisor, $offset);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagecopy(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




























function imagecopymerge(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
































function imagecopymergegray(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
$safeResult = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresampled(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}





































function imagecopyresized(\GdImage $dst_image, \GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
$safeResult = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagecreate(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreate($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromavif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromavif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrombmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrombmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}










function imagecreatefromgd2(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}














function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromgif(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromgif($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromjpeg(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromjpeg($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefrompng(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefrompng($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecreatefromstring(string $data): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromstring($data);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromtga(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromtga($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromwbmp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwbmp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatefromwebp(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromwebp($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxbm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxbm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagecreatefromxpm(string $filename): \GdImage
{
error_clear_last();
$safeResult = \imagecreatefromxpm($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}












function imagecreatetruecolor(int $width, int $height): \GdImage
{
error_clear_last();
$safeResult = \imagecreatetruecolor($width, $height);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagecrop(\GdImage $image, array $rectangle): \GdImage
{
error_clear_last();
$safeResult = \imagecrop($image, $rectangle);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagecropauto(\GdImage $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1): \GdImage
{
error_clear_last();
$safeResult = \imagecropauto($image, $mode, $threshold, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}

















function imagedashedline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagedashedline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagedestroy(\GdImage $image): void
{
error_clear_last();
$safeResult = \imagedestroy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagefill(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagefill($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




































function imagefilledarc(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
$safeResult = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}
















function imagefilledellipse(\GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
$safeResult = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagefilledrectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagefilltoborder(\GdImage $image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
$safeResult = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}










































































































































function imagefilter(\GdImage $image, int $filter, int ...$args): void
{
error_clear_last();
if ($args !== []) {
$safeResult = \imagefilter($image, $filter, ...$args);
} else {
$safeResult = \imagefilter($image, $filter);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











































function imageflip(\GdImage $image, int $mode): void
{
error_clear_last();
$safeResult = \imageflip($image, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















































































function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































































function imagefttext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}













function imagegammacorrect(\GdImage $image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
$safeResult = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagegd(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegd($image, $file);
} else {
$safeResult = \imagegd($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagegd2(\GdImage $image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
if ($mode !== IMG_GD2_RAW) {
$safeResult = \imagegd2($image, $file, $chunk_size, $mode);
} elseif ($chunk_size !== 128) {
$safeResult = \imagegd2($image, $file, $chunk_size);
} elseif ($file !== null) {
$safeResult = \imagegd2($image, $file);
} else {
$safeResult = \imagegd2($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}




















function imagegif(\GdImage $image, $file = null): void
{
error_clear_last();
if ($file !== null) {
$safeResult = \imagegif($image, $file);
} else {
$safeResult = \imagegif($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}









function imagegrabscreen(): \GdImage
{
error_clear_last();
$safeResult = \imagegrabscreen();
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
$safeResult = \imagegrabwindow($handle, $client_area);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagejpeg(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagejpeg($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagejpeg($image, $file);
} else {
$safeResult = \imagejpeg($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























































function imagelayereffect(\GdImage $image, int $effect): void
{
error_clear_last();
$safeResult = \imagelayereffect($image, $effect);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imageline(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imageline($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


























































function imageloadfont(string $filename): int
{
error_clear_last();
$safeResult = \imageloadfont($filename);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
























function imagepng(\GdImage $image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
if ($filters !== -1) {
$safeResult = \imagepng($image, $file, $quality, $filters);
} elseif ($quality !== -1) {
$safeResult = \imagepng($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagepng($image, $file);
} else {
$safeResult = \imagepng($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagerectangle(\GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
$safeResult = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



























function imageresolution(\GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null)
{
error_clear_last();
if ($resolution_y !== null) {
$safeResult = \imageresolution($image, $resolution_x, $resolution_y);
} elseif ($resolution_x !== null) {
$safeResult = \imageresolution($image, $resolution_x);
} else {
$safeResult = \imageresolution($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}



















function imagerotate(\GdImage $image, float $angle, int $background_color, bool $ignore_transparent = false): \GdImage
{
error_clear_last();
$safeResult = \imagerotate($image, $angle, $background_color, $ignore_transparent);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
















function imagesavealpha(\GdImage $image, bool $enable): void
{
error_clear_last();
$safeResult = \imagesavealpha($image, $enable);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

























function imagescale(\GdImage $image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED): \GdImage
{
error_clear_last();
$safeResult = \imagescale($image, $width, $height, $mode);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagesetbrush(\GdImage $image, \GdImage $brush): void
{
error_clear_last();
$safeResult = \imagesetbrush($image, $brush);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}















function imagesetclip(\GdImage $image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
$safeResult = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































































function imagesetinterpolation(\GdImage $image, int $method = IMG_BILINEAR_FIXED): void
{
error_clear_last();
$safeResult = \imagesetinterpolation($image, $method);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}














function imagesetpixel(\GdImage $image, int $x, int $y, int $color): void
{
error_clear_last();
$safeResult = \imagesetpixel($image, $x, $y, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagesetstyle(\GdImage $image, array $style): void
{
error_clear_last();
$safeResult = \imagesetstyle($image, $style);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagesetthickness(\GdImage $image, int $thickness): void
{
error_clear_last();
$safeResult = \imagesetthickness($image, $thickness);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}



















function imagesettile(\GdImage $image, \GdImage $tile): void
{
error_clear_last();
$safeResult = \imagesettile($image, $tile);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}

















function imagestring(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestring($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}


















function imagestringup(\GdImage $image, int $font, int $x, int $y, string $string, int $color): void
{
error_clear_last();
$safeResult = \imagestringup($image, $font, $x, $y, $string, $color);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}











function imagesx(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesx($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function imagesy(\GdImage $image): int
{
error_clear_last();
$safeResult = \imagesy($image);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}





















function imagetruecolortopalette(\GdImage $image, bool $dither, int $num_colors): void
{
error_clear_last();
$safeResult = \imagetruecolortopalette($image, $dither, $num_colors);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}























































































function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
$safeResult = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}




































































function imagettftext(\GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
$safeResult = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}















function imagewbmp(\GdImage $image, $file = null, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagewbmp($image, $file, $foreground_color);
} elseif ($file !== null) {
$safeResult = \imagewbmp($image, $file);
} else {
$safeResult = \imagewbmp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function imagewebp(\GdImage $image, $file = null, int $quality = -1): void
{
error_clear_last();
if ($quality !== -1) {
$safeResult = \imagewebp($image, $file, $quality);
} elseif ($file !== null) {
$safeResult = \imagewebp($image, $file);
} else {
$safeResult = \imagewebp($image);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}






















function imagexbm(\GdImage $image, $filename, ?int $foreground_color = null): void
{
error_clear_last();
if ($foreground_color !== null) {
$safeResult = \imagexbm($image, $filename, $foreground_color);
} else {
$safeResult = \imagexbm($image, $filename);
}
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
}













function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
$safeResult = \iptcembed($iptc_data, $filename, $spool);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}











function iptcparse(string $iptc_block): array
{
error_clear_last();
$safeResult = \iptcparse($iptc_block);
if ($safeResult === false) {
throw ImageException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ReadlineException;








function readline_add_history(string $prompt): void
{
error_clear_last();
$safeResult = \readline_add_history($prompt);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}



















function readline_callback_handler_install(string $prompt, callable $callback): void
{
error_clear_last();
$safeResult = \readline_callback_handler_install($prompt, $callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}








function readline_clear_history(): void
{
error_clear_last();
$safeResult = \readline_clear_history();
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}











function readline_completion_function(callable $callback): void
{
error_clear_last();
$safeResult = \readline_completion_function($callback);
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_read_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_read_history($filename);
} else {
$safeResult = \readline_read_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}









function readline_write_history(?string $filename = null): void
{
error_clear_last();
if ($filename !== null) {
$safeResult = \readline_write_history($filename);
} else {
$safeResult = \readline_write_history();
}
if ($safeResult === false) {
throw ReadlineException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ArrayException;












function array_combine(array $keys, array $values)
{
error_clear_last();
$safeResult = \array_combine($keys, $values);
return $safeResult;
}




















function array_flip(array $array): array
{
error_clear_last();
$safeResult = \array_flip($array);
return $safeResult;
}


























function array_replace_recursive(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace_recursive($array, ...$replacements);
} else {
$safeResult = \array_replace_recursive($array);
}
return $safeResult;
}





















function array_replace(array $array, array ...$replacements): array
{
error_clear_last();
if ($replacements !== []) {
$safeResult = \array_replace($array, ...$replacements);
} else {
$safeResult = \array_replace($array);
}
return $safeResult;
}
























function array_walk_recursive(&$array, callable $callback, $arg = null): void
{
error_clear_last();
if ($arg !== null) {
$safeResult = \array_walk_recursive($array, $callback, $arg);
} else {
$safeResult = \array_walk_recursive($array, $callback);
}
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}









function shuffle(array &$array): void
{
error_clear_last();
$safeResult = \shuffle($array);
if ($safeResult === false) {
throw ArrayException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilesystemException;













function chgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \chgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


































function chmod(string $filename, int $permissions): void
{
error_clear_last();
$safeResult = \chmod($filename, $permissions);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function chown(string $filename, $user): void
{
error_clear_last();
$safeResult = \chown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}



















function copy(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \copy($from, $to, $context);
} else {
$safeResult = \copy($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function disk_free_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_free_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function disk_total_space(string $directory): float
{
error_clear_last();
$safeResult = \disk_total_space($directory);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fclose($stream): void
{
error_clear_last();
$safeResult = \fclose($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fdatasync($stream): void
{
error_clear_last();
$safeResult = \fdatasync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function fflush($stream): void
{
error_clear_last();
$safeResult = \fflush($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}




































function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, ?int $length = null): string
{
error_clear_last();
if ($length !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$safeResult = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
$safeResult = \file_get_contents($filename, $use_include_path, $context);
} else {
$safeResult = \file_get_contents($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































































function file_put_contents(string $filename, $data, int $flags = 0, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \file_put_contents($filename, $data, $flags, $context);
} else {
$safeResult = \file_put_contents($filename, $data, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















































function file(string $filename, int $flags = 0, $context = null): array
{
error_clear_last();
if ($context !== null) {
$safeResult = \file($filename, $flags, $context);
} else {
$safeResult = \file($filename, $flags);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function fileatime(string $filename): int
{
error_clear_last();
$safeResult = \fileatime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filectime(string $filename): int
{
error_clear_last();
$safeResult = \filectime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function fileinode(string $filename): int
{
error_clear_last();
$safeResult = \fileinode($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function filemtime(string $filename): int
{
error_clear_last();
$safeResult = \filemtime($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












function fileowner(string $filename): int
{
error_clear_last();
$safeResult = \fileowner($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
























function fileperms(string $filename): int
{
error_clear_last();
$safeResult = \fileperms($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function filesize(string $filename): int
{
error_clear_last();
$safeResult = \filesize($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function filetype(string $filename): string
{
error_clear_last();
$safeResult = \filetype($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}












































function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
$safeResult = \flock($stream, $operation, $would_block);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}









































































































































































































function fopen(string $filename, string $mode, bool $use_include_path = false, $context = null)
{
error_clear_last();
if ($context !== null) {
$safeResult = \fopen($filename, $mode, $use_include_path, $context);
} else {
$safeResult = \fopen($filename, $mode, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}









































function fread($stream, int $length): string
{
error_clear_last();
$safeResult = \fread($stream, $length);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function fstat($stream): array
{
error_clear_last();
$safeResult = \fstat($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}













function fsync($stream): void
{
error_clear_last();
$safeResult = \fsync($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function ftell($stream): int
{
error_clear_last();
$safeResult = \ftell($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



















function ftruncate($stream, int $size): void
{
error_clear_last();
$safeResult = \ftruncate($stream, $size);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}















function fwrite($stream, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \fwrite($stream, $data, $length);
} else {
$safeResult = \fwrite($stream, $data);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























































































function glob(string $pattern, int $flags = 0): array
{
error_clear_last();
$safeResult = \glob($pattern, $flags);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}















function lchgrp(string $filename, $group): void
{
error_clear_last();
$safeResult = \lchgrp($filename, $group);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function lchown(string $filename, $user): void
{
error_clear_last();
$safeResult = \lchown($filename, $user);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}










function link(string $target, string $link): void
{
error_clear_last();
$safeResult = \link($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}


















function lstat(string $filename): array
{
error_clear_last();
$safeResult = \lstat($filename);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}






























function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \mkdir($directory, $permissions, $recursive, $context);
} else {
$safeResult = \mkdir($directory, $permissions, $recursive);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}































function parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_file($filename, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
$safeResult = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}











function pclose($handle): int
{
error_clear_last();
$safeResult = \pclose($handle);
if ($safeResult === -1) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}




























function popen(string $command, string $mode)
{
error_clear_last();
$safeResult = \popen($command, $mode);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}














function readfile(string $filename, bool $use_include_path = false, $context = null): int
{
error_clear_last();
if ($context !== null) {
$safeResult = \readfile($filename, $use_include_path, $context);
} else {
$safeResult = \readfile($filename, $use_include_path);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}










function readlink(string $path): string
{
error_clear_last();
$safeResult = \readlink($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function realpath(string $path): string
{
error_clear_last();
$safeResult = \realpath($path);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}



























function rename(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rename($from, $to, $context);
} else {
$safeResult = \rename($from, $to);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}











function rewind($stream): void
{
error_clear_last();
$safeResult = \rewind($stream);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}













function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \rmdir($directory, $context);
} else {
$safeResult = \rmdir($directory);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}












function symlink(string $target, string $link): void
{
error_clear_last();
$safeResult = \symlink($target, $link);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}














function tempnam(string $directory, string $prefix): string
{
error_clear_last();
$safeResult = \tempnam($directory, $prefix);
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
















function tmpfile()
{
error_clear_last();
$safeResult = \tmpfile();
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}





















function touch(string $filename, ?int $mtime = null, ?int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
$safeResult = \touch($filename, $mtime, $atime);
} elseif ($mtime !== null) {
$safeResult = \touch($filename, $mtime);
} else {
$safeResult = \touch($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
















function unlink(string $filename, $context = null): void
{
error_clear_last();
if ($context !== null) {
$safeResult = \unlink($filename, $context);
} else {
$safeResult = \unlink($filename);
}
if ($safeResult === false) {
throw FilesystemException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FilterException;

































function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_input_array($type, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}

























function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
$safeResult = \filter_var_array($array, $options, $add_empty);
if ($safeResult === false) {
throw FilterException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\Oci8Exception;


































































































function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
$safeResult = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






































































































































































































function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_cancel($statement): void
{
error_clear_last();
$safeResult = \oci_cancel($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























function oci_commit($connection): void
{
error_clear_last();
$safeResult = \oci_commit($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





































































































function oci_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}




























function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
$safeResult = \oci_define_by_name($statement, $column, $var, $type);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}















































































function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
{
error_clear_last();
$safeResult = \oci_execute($statement, $mode);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_field_name($statement, $column): string
{
error_clear_last();
$safeResult = \oci_field_name($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_precision($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_precision($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}















function oci_field_scale($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_scale($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_size($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_size($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}













function oci_field_type_raw($statement, $column): int
{
error_clear_last();
$safeResult = \oci_field_type_raw($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_field_type($statement, $column)
{
error_clear_last();
$safeResult = \oci_field_type($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}









function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
$safeResult = \oci_free_descriptor($lob);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}











function oci_free_statement($statement): void
{
error_clear_last();
$safeResult = \oci_free_statement($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}














function oci_new_collection($connection, string $type_name, ?string $schema = null)
{
error_clear_last();
if ($schema !== null) {
$safeResult = \oci_new_collection($connection, $type_name, $schema);
} else {
$safeResult = \oci_new_collection($connection, $type_name);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}


























































































function oci_new_connect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_new_connect($username, $password, $connection_string);
} else {
$safeResult = \oci_new_connect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}











function oci_new_cursor($connection)
{
error_clear_last();
$safeResult = \oci_new_cursor($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}














function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$safeResult = \oci_new_descriptor($connection, $type);
if ($safeResult === null) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}










function oci_num_rows($statement): int
{
error_clear_last();
$safeResult = \oci_num_rows($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}
























function oci_parse($connection, string $sql)
{
error_clear_last();
$safeResult = \oci_parse($connection, $sql);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}



























































































function oci_pconnect(string $username, string $password, ?string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
if ($session_mode !== OCI_DEFAULT) {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
} elseif ($encoding !== "") {
$safeResult = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$safeResult = \oci_pconnect($username, $password, $connection_string);
} else {
$safeResult = \oci_pconnect($username, $password);
}
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}






























function oci_register_taf_callback($connection, callable $callback): void
{
error_clear_last();
$safeResult = \oci_register_taf_callback($connection, $callback);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




















function oci_result($statement, $column): string
{
error_clear_last();
$safeResult = \oci_result($statement, $column);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}

























function oci_rollback($connection): void
{
error_clear_last();
$safeResult = \oci_rollback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}










function oci_server_version($connection): string
{
error_clear_last();
$safeResult = \oci_server_version($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}























function oci_set_action($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_action($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


































function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
$safeResult = \oci_set_call_timeout($connection, $timeout);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}



























function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
$safeResult = \oci_set_client_identifier($connection, $client_id);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}





















function oci_set_client_info($connection, string $client_info): void
{
error_clear_last();
$safeResult = \oci_set_client_info($connection, $client_info);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}






















function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
$safeResult = \oci_set_db_operation($connection, $action);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}


























function oci_set_edition(string $edition): void
{
error_clear_last();
$safeResult = \oci_set_edition($edition);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}























function oci_set_module_name($connection, string $name): void
{
error_clear_last();
$safeResult = \oci_set_module_name($connection, $name);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}




























function oci_set_prefetch_lob($statement, int $prefetch_lob_size): void
{
error_clear_last();
$safeResult = \oci_set_prefetch_lob($statement, $prefetch_lob_size);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
























































function oci_set_prefetch($statement, int $rows): void
{
error_clear_last();
$safeResult = \oci_set_prefetch($statement, $rows);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
































































function oci_statement_type($statement): string
{
error_clear_last();
$safeResult = \oci_statement_type($statement);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
return $safeResult;
}












function oci_unregister_taf_callback($connection): void
{
error_clear_last();
$safeResult = \oci_unregister_taf_callback($connection);
if ($safeResult === false) {
throw Oci8Exception::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\PgsqlException;











function pg_cancel_query(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_cancel_query($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















































function pg_connect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_connect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










function pg_connection_reset(\PgSql\Connection $connection): void
{
error_clear_last();
$safeResult = \pg_connection_reset($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






















function pg_convert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
$safeResult = \pg_convert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}




















function pg_copy_from(\PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
$safeResult = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_copy_to(\PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
$safeResult = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





































function pg_delete(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_delete($connection, $table_name, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


















function pg_end_copy(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_end_copy($connection);
} else {
$safeResult = \pg_end_copy();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





































function pg_execute(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_execute($connection, $stmtname, $params);
} elseif ($stmtname !== null) {
$safeResult = \pg_execute($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_execute($connection);
} else {
$safeResult = \pg_execute();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_num(\PgSql\Result $result, string $field): int
{
error_clear_last();
$safeResult = \pg_field_num($result, $field);
if ($safeResult === -1) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_field_table(\PgSql\Result $result, int $field, bool $oid_only = false)
{
error_clear_last();
$safeResult = \pg_field_table($result, $field, $oid_only);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_flush(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_flush($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}















function pg_free_result(\PgSql\Result $result): void
{
error_clear_last();
$safeResult = \pg_free_result($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}

















function pg_host(?\PgSql\Connection $connection = null): string
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_host($connection);
} else {
$safeResult = \pg_host();
}
if ($safeResult === '') {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}







































function pg_insert(\PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_insert($connection, $table_name, $values, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}






























function pg_last_oid(\PgSql\Result $result): string
{
error_clear_last();
$safeResult = \pg_last_oid($result);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}












function pg_lo_close(\PgSql\Lob $lob): void
{
error_clear_last();
$safeResult = \pg_lo_close($lob);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















function pg_lo_export(?\PgSql\Connection $connection = null, ?int $oid = null, ?string $pathname = null): void
{
error_clear_last();
if ($pathname !== null) {
$safeResult = \pg_lo_export($connection, $oid, $pathname);
} elseif ($oid !== null) {
$safeResult = \pg_lo_export($connection, $oid);
} elseif ($connection !== null) {
$safeResult = \pg_lo_export($connection);
} else {
$safeResult = \pg_lo_export();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


























function pg_lo_import(?\PgSql\Connection $connection = null, ?string $pathname = null, $object_id = null): int
{
error_clear_last();
if ($object_id !== null) {
$safeResult = \pg_lo_import($connection, $pathname, $object_id);
} elseif ($pathname !== null) {
$safeResult = \pg_lo_import($connection, $pathname);
} elseif ($connection !== null) {
$safeResult = \pg_lo_import($connection);
} else {
$safeResult = \pg_lo_import();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}





















function pg_lo_open(\PgSql\Connection $connection, int $oid, string $mode): \PgSql\Lob
{
error_clear_last();
$safeResult = \pg_lo_open($connection, $oid, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

















function pg_lo_read(\PgSql\Lob $lob, int $length = 8192): string
{
error_clear_last();
$safeResult = \pg_lo_read($lob, $length);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
















function pg_lo_seek(\PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
$safeResult = \pg_lo_seek($lob, $offset, $whence);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}













function pg_lo_truncate(\PgSql\Lob $lob, int $size): void
{
error_clear_last();
$safeResult = \pg_lo_truncate($lob, $size);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}


















function pg_lo_unlink(\PgSql\Connection $connection, int $oid): void
{
error_clear_last();
$safeResult = \pg_lo_unlink($connection, $oid);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}




















function pg_lo_write(\PgSql\Lob $lob, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \pg_lo_write($lob, $data, $length);
} else {
$safeResult = \pg_lo_write($lob, $data);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_meta_data(\PgSql\Connection $connection, string $table_name, bool $extended = false): array
{
error_clear_last();
$safeResult = \pg_meta_data($connection, $table_name, $extended);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}









































function pg_parameter_status(?\PgSql\Connection $connection = null, ?string $param_name = null): string
{
error_clear_last();
if ($param_name !== null) {
$safeResult = \pg_parameter_status($connection, $param_name);
} elseif ($connection !== null) {
$safeResult = \pg_parameter_status($connection);
} else {
$safeResult = \pg_parameter_status();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














































function pg_pconnect(string $connection_string, int $flags = 0): \PgSql\Connection
{
error_clear_last();
$safeResult = \pg_pconnect($connection_string, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}














function pg_ping(?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_ping($connection);
} else {
$safeResult = \pg_ping();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}






































function pg_prepare(?\PgSql\Connection $connection = null, ?string $stmtname = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_prepare($connection, $stmtname, $query);
} elseif ($stmtname !== null) {
$safeResult = \pg_prepare($connection, $stmtname);
} elseif ($connection !== null) {
$safeResult = \pg_prepare($connection);
} else {
$safeResult = \pg_prepare();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}

























function pg_put_line(?\PgSql\Connection $connection = null, ?string $data = null): void
{
error_clear_last();
if ($data !== null) {
$safeResult = \pg_put_line($connection, $data);
} elseif ($connection !== null) {
$safeResult = \pg_put_line($connection);
} else {
$safeResult = \pg_put_line();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}





















































function pg_query_params(?\PgSql\Connection $connection = null, ?string $query = null, ?array $params = null): \PgSql\Result
{
error_clear_last();
if ($params !== null) {
$safeResult = \pg_query_params($connection, $query, $params);
} elseif ($query !== null) {
$safeResult = \pg_query_params($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query_params($connection);
} else {
$safeResult = \pg_query_params();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}










































function pg_query(?\PgSql\Connection $connection = null, ?string $query = null): \PgSql\Result
{
error_clear_last();
if ($query !== null) {
$safeResult = \pg_query($connection, $query);
} elseif ($connection !== null) {
$safeResult = \pg_query($connection);
} else {
$safeResult = \pg_query();
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}































function pg_result_error_field(\PgSql\Result $result, int $field_code): ?string
{
error_clear_last();
$safeResult = \pg_result_error_field($result, $field_code);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}













function pg_result_seek(\PgSql\Result $result, int $row): void
{
error_clear_last();
$safeResult = \pg_result_seek($result, $row);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}









































function pg_select(\PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
$safeResult = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}











function pg_socket(\PgSql\Connection $connection)
{
error_clear_last();
$safeResult = \pg_socket($connection);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}


























function pg_trace(string $filename, string $mode = "w", ?\PgSql\Connection $connection = null): void
{
error_clear_last();
if ($connection !== null) {
$safeResult = \pg_trace($filename, $mode, $connection);
} else {
$safeResult = \pg_trace($filename, $mode);
}
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
}







































function pg_update(\PgSql\Connection $connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
$safeResult = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($safeResult === false) {
throw PgsqlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\EioException;
















function eio_busy(int $delay, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_busy($delay, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chmod(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chmod($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_chown(string $path, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_chown($path, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_close($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_close($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_custom(callable $execute, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_custom($execute, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_dup2($fd, $fd2, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_dup2($fd, $fd2, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








function eio_event_loop(): void
{
error_clear_last();
$safeResult = \eio_event_loop();
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
}















































function eio_fallocate($fd, int $mode, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fallocate($fd, $mode, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchmod($fd, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fdatasync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fdatasync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstat($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstat($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstat($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_fstatvfs($fd, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_fstatvfs($fd, $pri, $callback, $data);
} else {
$safeResult = \eio_fstatvfs($fd, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_fsync($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_fsync($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_ftruncate($fd, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_ftruncate($fd, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_futime($fd, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_futime($fd, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}



































function eio_grp(callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_grp($callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_lstat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_lstat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_mkdir(string $path, int $mode, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mkdir($path, $mode, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
























































function eio_mknod(string $path, int $mode, int $dev, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_mknod($path, $mode, $dev, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_nop(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_nop($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_readahead($fd, $offset, $length, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































































































































































































































































































function eio_readdir(string $path, int $flags, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readdir($path, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_readlink(string $path, int $pri, callable $callback, ?string $data = null)
{
error_clear_last();
$safeResult = \eio_readlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}








































function eio_rename(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rename($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_rmdir(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_rmdir($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}















































function eio_seek($fd, int $offset, int $whence, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_seek($fd, $offset, $whence, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}











































function eio_sendfile($out_fd, $in_fd, int $offset, int $length, ?int $pri = null, ?callable $callback = null, ?string $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback, $data);
} elseif ($callback !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri, $callback);
} elseif ($pri !== null) {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length, $pri);
} else {
$safeResult = \eio_sendfile($out_fd, $in_fd, $offset, $length);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_stat(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
$safeResult = \eio_stat($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}










































function eio_statvfs(string $path, int $pri, callable $callback, $data = null)
{
error_clear_last();
if ($data !== null) {
$safeResult = \eio_statvfs($path, $pri, $callback, $data);
} else {
$safeResult = \eio_statvfs($path, $pri, $callback);
}
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_symlink(string $path, string $new_path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_symlink($path, $new_path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}


















































function eio_sync_file_range($fd, int $offset, int $nbytes, int $flags, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync_file_range($fd, $offset, $nbytes, $flags, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












function eio_sync(int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_sync($pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_syncfs($fd, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_syncfs($fd, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_truncate(string $path, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_truncate($path, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}







































function eio_unlink(string $path, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_unlink($path, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}









































function eio_utime(string $path, float $atime, float $mtime, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_utime($path, $atime, $mtime, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}












































function eio_write($fd, string $str, int $length = 0, int $offset = 0, int $pri = EIO_PRI_DEFAULT, ?callable $callback = null, $data = null)
{
error_clear_last();
$safeResult = \eio_write($fd, $str, $length, $offset, $pri, $callback, $data);
if ($safeResult === false) {
throw EioException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;































function socket_accept(\Socket $socket): \Socket
{
error_clear_last();
$safeResult = \socket_accept($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_bind(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_bind($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_addrinfo_connect(\AddressInfo $address): \Socket
{
error_clear_last();
$safeResult = \socket_addrinfo_connect($address);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): array
{
error_clear_last();
if ($hints !== []) {
$safeResult = \socket_addrinfo_lookup($host, $service, $hints);
} elseif ($service !== null) {
$safeResult = \socket_addrinfo_lookup($host, $service);
} else {
$safeResult = \socket_addrinfo_lookup($host);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






















function socket_bind(\Socket $socket, string $address, int $port = 0): void
{
error_clear_last();
$safeResult = \socket_bind($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}























function socket_connect(\Socket $socket, string $address, ?int $port = null): void
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_connect($socket, $address, $port);
} else {
$safeResult = \socket_connect($socket, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_create_listen(int $port, int $backlog = 128): \Socket
{
error_clear_last();
$safeResult = \socket_create_listen($port, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}



























function socket_create_pair(int $domain, int $type, int $protocol, ?array &$pair): void
{
error_clear_last();
$safeResult = \socket_create_pair($domain, $type, $protocol, $pair);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

























function socket_create(int $domain, int $type, int $protocol): \Socket
{
error_clear_last();
$safeResult = \socket_create($domain, $type, $protocol);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_export_stream(\Socket $socket)
{
error_clear_last();
$safeResult = \socket_export_stream($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






































function socket_get_option(\Socket $socket, int $level, int $option)
{
error_clear_last();
$safeResult = \socket_get_option($socket, $level, $option);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}

























function socket_getpeername(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getpeername($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






















function socket_getsockname(\Socket $socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$safeResult = \socket_getsockname($socket, $address, $port);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}










function socket_import_stream($stream): \Socket
{
error_clear_last();
$safeResult = \socket_import_stream($stream);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}






























function socket_listen(\Socket $socket, int $backlog = 0): void
{
error_clear_last();
$safeResult = \socket_listen($socket, $backlog);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}






































function socket_read(\Socket $socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
$safeResult = \socket_read($socket, $length, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}




















































function socket_send(\Socket $socket, string $data, int $length, int $flags): int
{
error_clear_last();
$safeResult = \socket_send($socket, $data, $length, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}












function socket_sendmsg(\Socket $socket, array $message, int $flags = 0): int
{
error_clear_last();
$safeResult = \socket_sendmsg($socket, $message, $flags);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
























































function socket_sendto(\Socket $socket, string $data, int $length, int $flags, string $address, ?int $port = null): int
{
error_clear_last();
if ($port !== null) {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address, $port);
} else {
$safeResult = \socket_sendto($socket, $data, $length, $flags, $address);
}
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}
















function socket_set_block(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_block($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}

















function socket_set_nonblock(\Socket $socket): void
{
error_clear_last();
$safeResult = \socket_set_nonblock($socket);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
























function socket_set_option(\Socket $socket, int $level, int $option, $value): void
{
error_clear_last();
$safeResult = \socket_set_option($socket, $level, $option, $value);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}





































function socket_shutdown(\Socket $socket, int $mode = 2): void
{
error_clear_last();
$safeResult = \socket_shutdown($socket, $mode);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}













function socket_wsaprotocol_info_export(\Socket $socket, int $process_id): string
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_export($socket, $process_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}











function socket_wsaprotocol_info_import(string $info_id): \Socket
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_import($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
return $safeResult;
}










function socket_wsaprotocol_info_release(string $info_id): void
{
error_clear_last();
$safeResult = \socket_wsaprotocol_info_release($info_id);
if ($safeResult === false) {
throw SocketsException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Bzip2Exception;









function bzclose($bz): void
{
error_clear_last();
$safeResult = \bzclose($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}












function bzflush($bz): void
{
error_clear_last();
$safeResult = \bzflush($bz);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
}














function bzopen($file, string $mode)
{
error_clear_last();
$safeResult = \bzopen($file, $mode);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}

















function bzread($bz, int $length = 1024): string
{
error_clear_last();
$safeResult = \bzread($bz, $length);
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
















function bzwrite($bz, string $data, ?int $length = null): int
{
error_clear_last();
if ($length !== null) {
$safeResult = \bzwrite($bz, $data, $length);
} else {
$safeResult = \bzwrite($bz, $data);
}
if ($safeResult === false) {
throw Bzip2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\ApcuException;











function apcu_cache_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_cache_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}













function apcu_cas(string $key, int $old, int $new): void
{
error_clear_last();
$safeResult = \apcu_cas($key, $old, $new);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
}














function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_dec($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}














function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$safeResult = \apcu_inc($key, $step, $success, $ttl);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}











function apcu_sma_info(bool $limited = false): array
{
error_clear_last();
$safeResult = \apcu_sma_info($limited);
if ($safeResult === false) {
throw ApcuException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcreException;
















function preg_grep(string $pattern, array $array, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_grep($pattern, $array, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































































































































































































































































































































function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




































































































































































































































function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$safeResult = \preg_match($pattern, $subject, $matches, $flags, $offset);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}




























function preg_replace_callback_array(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}

























































function preg_replace_callback($pattern, callable $callback, $subject, int $limit = -1, ?int &$count = null, int $flags = 0)
{
error_clear_last();
$safeResult = \preg_replace_callback($pattern, $callback, $subject, $limit, $count, $flags);
if ($safeResult === null) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}























































function preg_split(string $pattern, string $subject, ?int $limit = -1, int $flags = 0): array
{
error_clear_last();
$safeResult = \preg_split($pattern, $subject, $limit, $flags);
if ($safeResult === false) {
throw PcreException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\GmpException;















function gmp_random_seed($seed): void
{
error_clear_last();
$safeResult = \gmp_random_seed($seed);
}
<?php

namespace Safe;

use Safe\Exceptions\VarException;















































function settype(&$var, string $type): void
{
error_clear_last();
$safeResult = \settype($var, $type);
if ($safeResult === false) {
throw VarException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\Ssh2Exception;










function ssh2_auth_agent($session, string $username): void
{
error_clear_last();
$safeResult = \ssh2_auth_agent($session, $username);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_auth_hostbased_file($session, string $username, string $hostname, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null, ?string $local_username = null): void
{
error_clear_last();
if ($local_username !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase, $local_username);
} elseif ($passphrase !== null) {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_hostbased_file($session, $username, $hostname, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_auth_password($session, string $username, string $password): void
{
error_clear_last();
$safeResult = \ssh2_auth_password($session, $username, $password);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_auth_pubkey_file($session, string $username, string $pubkeyfile, string $privkeyfile, ?string $passphrase = null): void
{
error_clear_last();
if ($passphrase !== null) {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile, $passphrase);
} else {
$safeResult = \ssh2_auth_pubkey_file($session, $username, $pubkeyfile, $privkeyfile);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}









































































































































































































function ssh2_connect(string $host, int $port = 22, ?array $methods = null, ?array $callbacks = null)
{
error_clear_last();
if ($callbacks !== null) {
$safeResult = \ssh2_connect($host, $port, $methods, $callbacks);
} elseif ($methods !== null) {
$safeResult = \ssh2_connect($host, $port, $methods);
} else {
$safeResult = \ssh2_connect($host, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_disconnect($session): void
{
error_clear_last();
$safeResult = \ssh2_disconnect($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}




















function ssh2_exec($session, string $command, ?string $pty = null, ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_exec($session, $command, $pty, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_exec($session, $command, $pty, $env);
} elseif ($pty !== null) {
$safeResult = \ssh2_exec($session, $command, $pty);
} else {
$safeResult = \ssh2_exec($session, $command);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}










function ssh2_forward_accept($listener)
{
error_clear_last();
$safeResult = \ssh2_forward_accept($listener);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}













function ssh2_forward_listen($session, int $port, ?string $host = null, int $max_connections = 16)
{
error_clear_last();
if ($max_connections !== 16) {
$safeResult = \ssh2_forward_listen($session, $port, $host, $max_connections);
} elseif ($host !== null) {
$safeResult = \ssh2_forward_listen($session, $port, $host);
} else {
$safeResult = \ssh2_forward_listen($session, $port);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}

















function ssh2_publickey_add($pkey, string $algoname, string $blob, bool $overwrite = false, ?array $attributes = null): void
{
error_clear_last();
if ($attributes !== null) {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite, $attributes);
} else {
$safeResult = \ssh2_publickey_add($pkey, $algoname, $blob, $overwrite);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}

















function ssh2_publickey_init($session)
{
error_clear_last();
$safeResult = \ssh2_publickey_init($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}











function ssh2_publickey_remove($pkey, string $algoname, string $blob): void
{
error_clear_last();
$safeResult = \ssh2_publickey_remove($pkey, $algoname, $blob);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_scp_recv($session, string $remote_file, string $local_file): void
{
error_clear_last();
$safeResult = \ssh2_scp_recv($session, $remote_file, $local_file);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}














function ssh2_scp_send($session, string $local_file, string $remote_file, int $create_mode = 0644): void
{
error_clear_last();
$safeResult = \ssh2_scp_send($session, $local_file, $remote_file, $create_mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_send_eof($channel): void
{
error_clear_last();
$safeResult = \ssh2_send_eof($channel);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
{
error_clear_last();
$safeResult = \ssh2_sftp_chmod($sftp, $filename, $mode);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}


















function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool $recursive = false): void
{
error_clear_last();
$safeResult = \ssh2_sftp_mkdir($sftp, $dirname, $mode, $recursive);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}











function ssh2_sftp_rename($sftp, string $from, string $to): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rename($sftp, $from, $to);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp_rmdir($sftp, string $dirname): void
{
error_clear_last();
$safeResult = \ssh2_sftp_rmdir($sftp, $dirname);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}












function ssh2_sftp_symlink($sftp, string $target, string $link): void
{
error_clear_last();
$safeResult = \ssh2_sftp_symlink($sftp, $target, $link);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}










function ssh2_sftp_unlink($sftp, string $filename): void
{
error_clear_last();
$safeResult = \ssh2_sftp_unlink($sftp, $filename);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
}













function ssh2_sftp($session)
{
error_clear_last();
$safeResult = \ssh2_sftp($session);
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}




















function ssh2_shell($session, string $termtype = "vanilla", ?array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
{
error_clear_last();
if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height, $width_height_type);
} elseif ($height !== 25) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width, $height);
} elseif ($width !== 80) {
$safeResult = \ssh2_shell($session, $termtype, $env, $width);
} elseif ($env !== null) {
$safeResult = \ssh2_shell($session, $termtype, $env);
} else {
$safeResult = \ssh2_shell($session, $termtype);
}
if ($safeResult === false) {
throw Ssh2Exception::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RnpException;












function rnp_decrypt(\RnpFFI $ffi, string $input): string
{
error_clear_last();
$safeResult = \rnp_decrypt($ffi, $input);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets_to_json(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets_to_json($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_dump_packets(string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_dump_packets($input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_ffi_create(string $pub_format, string $sec_format): \RnpFFI
{
error_clear_last();
$safeResult = \rnp_ffi_create($pub_format, $sec_format);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

























function rnp_ffi_set_pass_provider(\RnpFFI $ffi, callable $password_callback): void
{
error_clear_last();
$safeResult = \rnp_ffi_set_pass_provider($ffi, $password_callback);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_import_keys(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_keys($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_import_signatures(\RnpFFI $ffi, string $input, int $flags): string
{
error_clear_last();
$safeResult = \rnp_import_signatures($ffi, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}

















function rnp_key_export_autocrypt(\RnpFFI $ffi, string $key_fp, string $subkey_fp, string $uid, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export_autocrypt($ffi, $key_fp, $subkey_fp, $uid, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_key_export_revocation(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_export_revocation($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_key_export(\RnpFFI $ffi, string $key_fp, int $flags): string
{
error_clear_last();
$safeResult = \rnp_key_export($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}











function rnp_key_get_info(\RnpFFI $ffi, string $key_fp): array
{
error_clear_last();
$safeResult = \rnp_key_get_info($ffi, $key_fp);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_key_remove(\RnpFFI $ffi, string $key_fp, int $flags): void
{
error_clear_last();
$safeResult = \rnp_key_remove($ffi, $key_fp, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_key_revoke(\RnpFFI $ffi, string $key_fp, int $flags, ?array $options = null): void
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags, $options);
} else {
$safeResult = \rnp_key_revoke($ffi, $key_fp, $flags);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}











function rnp_list_keys(\RnpFFI $ffi, string $identifier_type): array
{
error_clear_last();
$safeResult = \rnp_list_keys($ffi, $identifier_type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_load_keys_from_path(\RnpFFI $ffi, string $format, string $input_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys_from_path($ffi, $format, $input_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_load_keys(\RnpFFI $ffi, string $format, string $input, int $flags): void
{
error_clear_last();
$safeResult = \rnp_load_keys($ffi, $format, $input, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}













function rnp_locate_key(\RnpFFI $ffi, string $identifier_type, string $identifier): string
{
error_clear_last();
$safeResult = \rnp_locate_key($ffi, $identifier_type, $identifier);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_encrypt(\RnpFFI $ffi, string $message, array $recipient_keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp, $options);
} else {
$safeResult = \rnp_op_encrypt($ffi, $message, $recipient_keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}


















function rnp_op_generate_key(\RnpFFI $ffi, string $userid, string $key_alg, ?string $sub_alg = null, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg, $options);
} elseif ($sub_alg !== null) {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg, $sub_alg);
} else {
$safeResult = \rnp_op_generate_key($ffi, $userid, $key_alg);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}















function rnp_op_sign_cleartext(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_cleartext($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign_detached(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign_detached($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_sign(\RnpFFI $ffi, string $data, array $keys_fp, ?array $options = null): string
{
error_clear_last();
if ($options !== null) {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp, $options);
} else {
$safeResult = \rnp_op_sign($ffi, $data, $keys_fp);
}
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}














function rnp_op_verify_detached(\RnpFFI $ffi, string $data, string $signature): array
{
error_clear_last();
$safeResult = \rnp_op_verify_detached($ffi, $data, $signature);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}













function rnp_op_verify(\RnpFFI $ffi, string $data): array
{
error_clear_last();
$safeResult = \rnp_op_verify($ffi, $data);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}












function rnp_save_keys_to_path(\RnpFFI $ffi, string $format, string $output_path, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys_to_path($ffi, $format, $output_path, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}












function rnp_save_keys(\RnpFFI $ffi, string $format, string &$output, int $flags): void
{
error_clear_last();
$safeResult = \rnp_save_keys($ffi, $format, $output, $flags);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
}










function rnp_supported_features(string $type): string
{
error_clear_last();
$safeResult = \rnp_supported_features($type);
if ($safeResult === false) {
throw RnpException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\RpminfoException;








function rpmaddtag(int $tag): void
{
error_clear_last();
$safeResult = \rpmaddtag($tag);
if ($safeResult === false) {
throw RpminfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\FpmException;









function fastcgi_finish_request(): void
{
error_clear_last();
$safeResult = \fastcgi_finish_request();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
}














function fpm_get_status(): array
{
error_clear_last();
$safeResult = \fpm_get_status();
if ($safeResult === false) {
throw FpmException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InotifyException;









function inotify_init()
{
error_clear_last();
$safeResult = \inotify_init();
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
return $safeResult;
}













function inotify_rm_watch($inotify_instance, int $watch_descriptor): void
{
error_clear_last();
$safeResult = \inotify_rm_watch($inotify_instance, $watch_descriptor);
if ($safeResult === false) {
throw InotifyException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\ZipException;








function zip_entry_close($zip_entry): void
{
error_clear_last();
$safeResult = \zip_entry_close($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}










function zip_entry_compressedsize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_compressedsize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}











function zip_entry_compressionmethod($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_compressionmethod($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_filesize($zip_entry): int
{
error_clear_last();
$safeResult = \zip_entry_filesize($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}










function zip_entry_name($zip_entry): string
{
error_clear_last();
$safeResult = \zip_entry_name($zip_entry);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
















function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
$safeResult = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
}













function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
$safeResult = \zip_entry_read($zip_entry, $len);
if ($safeResult === false) {
throw ZipException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\StringsException;









function convert_uudecode(string $string): string
{
error_clear_last();
$safeResult = \convert_uudecode($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}










function hex2bin(string $string): string
{
error_clear_last();
$safeResult = \hex2bin($string);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
















function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \md5_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}












function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
$safeResult = \sha1_file($filename, $binary);
if ($safeResult === false) {
throw StringsException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\CalendarException;












function unixtojd(?int $timestamp = null): int
{
error_clear_last();
if ($timestamp !== null) {
$safeResult = \unixtojd($timestamp);
} else {
$safeResult = \unixtojd();
}
if ($safeResult === false) {
throw CalendarException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\PcntlException;
















function pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_getpriority($process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_getpriority($process_id);
} else {
$safeResult = \pcntl_getpriority();
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}



















function pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
if ($mode !== PRIO_PROCESS) {
$safeResult = \pcntl_setpriority($priority, $process_id, $mode);
} elseif ($process_id !== null) {
$safeResult = \pcntl_setpriority($priority, $process_id);
} else {
$safeResult = \pcntl_setpriority($priority);
}
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}










function pcntl_signal_dispatch(): void
{
error_clear_last();
$safeResult = \pcntl_signal_dispatch();
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}















































function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
{
error_clear_last();
$safeResult = \pcntl_signal($signal, $handler, $restart_syscalls);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}






















function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
$safeResult = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
}



















function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
{
error_clear_last();
$safeResult = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}














































function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
$safeResult = \pcntl_sigwaitinfo($signals, $info);
if ($safeResult === false) {
throw PcntlException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\IconvException;




















function iconv_get_encoding(string $type = "all")
{
error_clear_last();
$safeResult = \iconv_get_encoding($type);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}





















































function iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_mime_decode($string, $mode, $encoding);
} else {
$safeResult = \iconv_mime_decode($string, $mode);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}












































































































function iconv_mime_encode(string $field_name, string $field_value, array $options = []): string
{
error_clear_last();
$safeResult = \iconv_mime_encode($field_name, $field_value, $options);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
















function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
$safeResult = \iconv_set_encoding($type, $encoding);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
}


















function iconv_strlen(string $string, ?string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
$safeResult = \iconv_strlen($string, $encoding);
} else {
$safeResult = \iconv_strlen($string);
}
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}




























function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
$safeResult = \iconv($from_encoding, $to_encoding, $string);
if ($safeResult === false) {
throw IconvException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\InfoException;







































































































function assert_options(int $what, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \assert_options($what, $value);
} else {
$safeResult = \assert_options($what);
}
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}











function cli_set_process_title(string $title): void
{
error_clear_last();
$safeResult = \cli_set_process_title($title);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
























































function dl(string $extension_filename): void
{
error_clear_last();
$safeResult = \dl($extension_filename);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}


















function get_cfg_var(string $option)
{
error_clear_last();
$safeResult = \get_cfg_var($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function get_include_path(): string
{
error_clear_last();
$safeResult = \get_include_path();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getlastmod(): int
{
error_clear_last();
$safeResult = \getlastmod();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmygid(): int
{
error_clear_last();
$safeResult = \getmygid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyinode(): int
{
error_clear_last();
$safeResult = \getmyinode();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmypid(): int
{
error_clear_last();
$safeResult = \getmypid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}









function getmyuid(): int
{
error_clear_last();
$safeResult = \getmyuid();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
$safeResult = \getopt($short_options, $long_options, $rest_index);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}














function getrusage(int $mode = 0): array
{
error_clear_last();
$safeResult = \getrusage($mode);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}












function ini_get(string $option): string
{
error_clear_last();
$safeResult = \ini_get($option);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}















function ini_set(string $option, string $value): string
{
error_clear_last();
$safeResult = \ini_set($option, $value);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}


















function php_sapi_name(): string
{
error_clear_last();
$safeResult = \php_sapi_name();
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}







































































function phpcredits(int $flags = CREDITS_ALL): void
{
error_clear_last();
$safeResult = \phpcredits($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}






































































































function phpinfo(int $flags = INFO_ALL): void
{
error_clear_last();
$safeResult = \phpinfo($flags);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function putenv(string $assignment): void
{
error_clear_last();
$safeResult = \putenv($assignment);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}












function set_include_path(string $include_path): string
{
error_clear_last();
$safeResult = \set_include_path($include_path);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
return $safeResult;
}



















function set_time_limit(int $seconds): void
{
error_clear_last();
$safeResult = \set_time_limit($seconds);
if ($safeResult === false) {
throw InfoException::createFromPhpError();
}
}
<?php

namespace Safe;

use Safe\Exceptions\IbmDb2Exception;











































function db2_autocommit($connection, $value = null)
{
error_clear_last();
if ($value !== null) {
$safeResult = \db2_autocommit($connection, $value);
} else {
$safeResult = \db2_autocommit($connection);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}





































function db2_bind_param($stmt, int $parameter_number, string $variable_name, ?int $parameter_type = null, int $data_type = 0, int $precision = -1, int $scale = 0): void
{
error_clear_last();
if ($scale !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision, $scale);
} elseif ($precision !== -1) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type, $precision);
} elseif ($data_type !== 0) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type, $data_type);
} elseif ($parameter_type !== null) {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name, $parameter_type);
} else {
$safeResult = \db2_bind_param($stmt, $parameter_number, $variable_name);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}















































































































function db2_client_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_client_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}















function db2_close($connection): void
{
error_clear_last();
$safeResult = \db2_close($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_commit($connection): void
{
error_clear_last();
$safeResult = \db2_commit($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}


























function db2_execute($stmt, ?array $parameters = null): void
{
error_clear_last();
if ($parameters !== null) {
$safeResult = \db2_execute($stmt, $parameters);
} else {
$safeResult = \db2_execute($stmt);
}
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_result($stmt): void
{
error_clear_last();
$safeResult = \db2_free_result($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}












function db2_free_stmt($stmt): void
{
error_clear_last();
$safeResult = \db2_free_stmt($stmt);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
























































































































































function db2_get_option($resource, string $option): string
{
error_clear_last();
$safeResult = \db2_get_option($resource, $option);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}
























function db2_pclose($resource): void
{
error_clear_last();
$safeResult = \db2_pclose($resource);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}













function db2_rollback($connection): void
{
error_clear_last();
$safeResult = \db2_rollback($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}





























































































































































































































































function db2_server_info($connection): \stdClass
{
error_clear_last();
$safeResult = \db2_server_info($connection);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
return $safeResult;
}



























































































































































































































































































































































































function db2_set_option($resource, array $options, int $type): void
{
error_clear_last();
$safeResult = \db2_set_option($resource, $options, $type);
if ($safeResult === false) {
throw IbmDb2Exception::createFromPhpError();
}
}
<?php

return [
'apache_getenv',
'apache_get_version',
'apache_lookup_uri',
'apache_request_headers',
'apache_response_headers',
'apache_setenv',
'apcu_cache_info',
'apcu_cas',
'apcu_dec',
'apcu_fetch',
'apcu_inc',
'apcu_sma_info',
'array_walk_recursive',
'assert_options',
'base64_decode',
'bindtextdomain',
'bzclose',
'bzflush',
'bzopen',
'bzread',
'bzwrite',
'chdir',
'chgrp',
'chmod',
'chown',
'chroot',
'class_alias',
'class_implements',
'class_parents',
'class_uses',
'cli_set_process_title',
'closelog',
'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
'copy',
'cubrid_bind',
'cubrid_column_names',
'cubrid_column_types',
'cubrid_col_size',
'cubrid_commit',
'cubrid_connect',
'cubrid_connect_with_url',
'cubrid_current_oid',
'cubrid_disconnect',
'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
'cubrid_lob2_bind',
'cubrid_lob2_close',
'cubrid_lob2_export',
'cubrid_lob2_import',
'cubrid_lob2_new',
'cubrid_lob2_read',
'cubrid_lob2_seek',
'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
'cubrid_lob2_write',
'cubrid_lob_close',
'cubrid_lob_export',
'cubrid_lob_get',
'cubrid_lob_send',
'cubrid_lob_size',
'cubrid_lock_read',
'cubrid_lock_write',
'cubrid_move_cursor',
'cubrid_next_result',
'cubrid_pconnect',
'cubrid_pconnect_with_url',
'cubrid_prepare',
'cubrid_put',
'cubrid_rollback',
'cubrid_schema',
'cubrid_seq_drop',
'cubrid_seq_insert',
'cubrid_seq_put',
'cubrid_set_add',
'cubrid_set_autocommit',
'cubrid_set_db_parameter',
'cubrid_set_drop',
'cubrid_set_query_timeout',
'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
'curl_multi_info_read',
'curl_multi_init',
'curl_multi_setopt',
'curl_setopt',
'curl_share_errno',
'curl_share_setopt',
'curl_unescape',
'curl_upkeep',
'date',
'date_parse',
'date_parse_from_format',
'date_sunrise',
'date_sunset',
'date_sun_info',
'db2_autocommit',
'db2_bind_param',
'db2_client_info',
'db2_close',
'db2_commit',
'db2_execute',
'db2_free_result',
'db2_free_stmt',
'db2_get_option',
'db2_pclose',
'db2_rollback',
'db2_server_info',
'db2_set_option',
'define',
'deflate_add',
'deflate_init',
'dir',
'disk_free_space',
'disk_total_space',
'dl',
'dns_get_record',
'eio_busy',
'eio_chmod',
'eio_chown',
'eio_close',
'eio_custom',
'eio_dup2',
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
'eio_fsync',
'eio_ftruncate',
'eio_futime',
'eio_grp',
'eio_lstat',
'eio_mkdir',
'eio_mknod',
'eio_nop',
'eio_readahead',
'eio_readdir',
'eio_readlink',
'eio_rename',
'eio_rmdir',
'eio_seek',
'eio_sendfile',
'eio_stat',
'eio_statvfs',
'eio_symlink',
'eio_sync',
'eio_syncfs',
'eio_sync_file_range',
'eio_truncate',
'eio_unlink',
'eio_utime',
'eio_write',
'error_log',
'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
'fdatasync',
'fflush',
'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
'fileperms',
'filesize',
'filetype',
'file_get_contents',
'file_put_contents',
'filter_input_array',
'filter_var_array',
'finfo_close',
'finfo_open',
'flock',
'fopen',
'fpm_get_status',
'fputcsv',
'fread',
'fsockopen',
'fstat',
'fsync',
'ftell',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
'ftp_chdir',
'ftp_chmod',
'ftp_close',
'ftp_connect',
'ftp_delete',
'ftp_fget',
'ftp_fput',
'ftp_get',
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
'ftp_raw',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
'ftp_size',
'ftp_ssl_connect',
'ftp_systype',
'ftruncate',
'fwrite',
'getallheaders',
'getcwd',
'gethostname',
'getimagesize',
'getlastmod',
'getmygid',
'getmyinode',
'getmypid',
'getmyuid',
'getopt',
'getprotobyname',
'getprotobynumber',
'getrusage',
'getservbyport',
'get_cfg_var',
'get_headers',
'get_include_path',
'get_meta_tags',
'glob',
'gmmktime',
'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
'gnupg_deletekey',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
'gzcompress',
'gzdecode',
'gzdeflate',
'gzencode',
'gzfile',
'gzgets',
'gzinflate',
'gzopen',
'gzpassthru',
'gzread',
'gzrewind',
'gztell',
'gzuncompress',
'gzwrite',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'highlight_string',
'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
'ibase_blob_create',
'ibase_blob_get',
'ibase_close',
'ibase_commit',
'ibase_commit_ret',
'ibase_connect',
'ibase_delete_user',
'ibase_drop_db',
'ibase_free_event_handler',
'ibase_free_query',
'ibase_free_result',
'ibase_maintain_db',
'ibase_modify_user',
'ibase_name_result',
'ibase_pconnect',
'ibase_restore',
'ibase_rollback',
'ibase_rollback_ret',
'ibase_service_attach',
'ibase_service_detach',
'iconv',
'iconv_get_encoding',
'iconv_mime_decode',
'iconv_mime_encode',
'iconv_set_encoding',
'iconv_strlen',
'idate',
'imageaffine',
'imageaffinematrixconcat',
'imageaffinematrixget',
'imagealphablending',
'imageantialias',
'imagearc',
'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
'imagecolorset',
'imageconvolution',
'imagecopy',
'imagecopymerge',
'imagecopymergegray',
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
'imagecreatefromgd2part',
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
'imagecreatefromstring',
'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
'imagecreatefromxpm',
'imagecreatetruecolor',
'imagecrop',
'imagecropauto',
'imagedashedline',
'imagedestroy',
'imageellipse',
'imagefill',
'imagefilledarc',
'imagefilledellipse',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
'imageftbbox',
'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
'imagegif',
'imagegrabscreen',
'imagegrabwindow',
'imagejpeg',
'imagelayereffect',
'imageline',
'imageloadfont',
'imagepng',
'imagerectangle',
'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
'imagesetbrush',
'imagesetclip',
'imagesetinterpolation',
'imagesetpixel',
'imagesetstyle',
'imagesetthickness',
'imagesettile',
'imagestring',
'imagestringup',
'imagesx',
'imagesy',
'imagetruecolortopalette',
'imagettfbbox',
'imagettftext',
'imagewbmp',
'imagewebp',
'imagexbm',
'image_type_to_extension',
'imap_8bit',
'imap_append',
'imap_base64',
'imap_binary',
'imap_body',
'imap_bodystruct',
'imap_check',
'imap_clearflag_full',
'imap_close',
'imap_createmailbox',
'imap_deletemailbox',
'imap_fetchbody',
'imap_fetchheader',
'imap_fetchmime',
'imap_fetchstructure',
'imap_fetch_overview',
'imap_gc',
'imap_getacl',
'imap_getmailboxes',
'imap_getsubscribed',
'imap_headerinfo',
'imap_headers',
'imap_listscan',
'imap_lsub',
'imap_mail',
'imap_mailboxmsginfo',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
'imap_qprint',
'imap_renamemailbox',
'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_setflag_full',
'imap_set_quota',
'imap_sort',
'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
'imap_undelete',
'imap_unsubscribe',
'imap_utf8_to_mutf7',
'inet_ntop',
'inet_pton',
'inflate_add',
'inflate_get_read_len',
'inflate_get_status',
'inflate_init',
'ini_get',
'ini_set',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
'json_decode',
'json_encode',
'lchgrp',
'lchown',
'ldap_8859_to_t61',
'ldap_add',
'ldap_bind',
'ldap_compare',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
'ldap_explode_dn',
'ldap_first_attribute',
'ldap_first_entry',
'ldap_free_result',
'ldap_get_attributes',
'ldap_get_dn',
'ldap_get_entries',
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
'ldap_modify_batch',
'ldap_mod_add',
'ldap_mod_del',
'ldap_mod_replace',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
'ldap_rename',
'ldap_sasl_bind',
'ldap_set_option',
'ldap_unbind',
'libxml_set_external_entity_loader',
'link',
'long2ip',
'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
'mailparse_msg_free',
'mailparse_msg_parse',
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
'mb_convert_encoding',
'mb_detect_order',
'mb_encoding_aliases',
'mb_eregi_replace',
'mb_ereg_replace',
'mb_ereg_replace_callback',
'mb_ereg_search_getregs',
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
'mb_parse_str',
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
'md5_file',
'mime_content_type',
'mkdir',
'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
'msg_stat_queue',
'mysql_close',
'mysql_connect',
'mysql_create_db',
'mysql_data_seek',
'mysql_db_name',
'mysql_db_query',
'mysql_drop_db',
'mysql_fetch_lengths',
'mysql_field_flags',
'mysql_field_len',
'mysql_field_name',
'mysql_field_seek',
'mysql_free_result',
'mysql_get_host_info',
'mysql_get_proto_info',
'mysql_get_server_info',
'mysql_info',
'mysql_list_dbs',
'mysql_list_fields',
'mysql_list_processes',
'mysql_list_tables',
'mysql_num_fields',
'mysql_num_rows',
'mysql_query',
'mysql_real_escape_string',
'mysql_result',
'mysql_select_db',
'mysql_set_charset',
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
'net_get_interfaces',
'ob_clean',
'ob_end_clean',
'ob_end_flush',
'ob_flush',
'ob_get_clean',
'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
'oci_field_size',
'oci_field_type',
'oci_field_type_raw',
'oci_free_descriptor',
'oci_free_statement',
'oci_new_collection',
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
'oci_set_action',
'oci_set_call_timeout',
'oci_set_client_identifier',
'oci_set_client_info',
'oci_set_db_operation',
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
'oci_set_prefetch_lob',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
'odbc_binmode',
'odbc_columnprivileges',
'odbc_columns',
'odbc_commit',
'odbc_connect',
'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
'odbc_fetch_into',
'odbc_field_len',
'odbc_field_name',
'odbc_field_num',
'odbc_field_scale',
'odbc_field_type',
'odbc_foreignkeys',
'odbc_gettypeinfo',
'odbc_longreadlen',
'odbc_num_fields',
'odbc_pconnect',
'odbc_prepare',
'odbc_primarykeys',
'odbc_procedurecolumns',
'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
'odbc_setoption',
'odbc_specialcolumns',
'odbc_statistics',
'odbc_tableprivileges',
'odbc_tables',
'opcache_compile_file',
'opcache_get_status',
'opendir',
'openlog',
'openssl_cipher_iv_length',
'openssl_cipher_key_length',
'openssl_cms_decrypt',
'openssl_cms_encrypt',
'openssl_cms_read',
'openssl_cms_sign',
'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
'openssl_decrypt',
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
'openssl_pkcs7_encrypt',
'openssl_pkcs7_read',
'openssl_pkcs7_sign',
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_private',
'openssl_pkey_get_public',
'openssl_pkey_new',
'openssl_private_decrypt',
'openssl_private_encrypt',
'openssl_public_decrypt',
'openssl_public_encrypt',
'openssl_seal',
'openssl_sign',
'openssl_spki_export',
'openssl_spki_export_challenge',
'openssl_spki_new',
'openssl_spki_verify',
'openssl_verify',
'openssl_x509_checkpurpose',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
'openssl_x509_read',
'output_add_rewrite_var',
'output_reset_rewrite_vars',
'pack',
'parse_ini_file',
'parse_ini_string',
'parse_url',
'passthru',
'pclose',
'pcntl_getpriority',
'pcntl_setpriority',
'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
'pcntl_sigtimedwait',
'pcntl_sigwaitinfo',
'pfsockopen',
'pg_cancel_query',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
'pg_delete',
'pg_end_copy',
'pg_execute',
'pg_field_num',
'pg_field_table',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
'pg_prepare',
'pg_put_line',
'pg_query',
'pg_query_params',
'pg_result_error_field',
'pg_result_seek',
'pg_select',
'pg_socket',
'pg_trace',
'pg_update',
'phpcredits',
'phpinfo',
'php_sapi_name',
'popen',
'posix_access',
'posix_getgrgid',
'posix_getgrnam',
'posix_getgroups',
'posix_getlogin',
'posix_getpgid',
'posix_getpwuid',
'posix_getrlimit',
'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
'posix_mknod',
'posix_setegid',
'posix_seteuid',
'posix_setgid',
'posix_setpgid',
'posix_setrlimit',
'posix_setsid',
'posix_setuid',
'posix_times',
'posix_uname',
'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_replace_callback',
'preg_replace_callback_array',
'preg_split',
'proc_close',
'proc_nice',
'proc_open',
'pspell_add_to_personal',
'pspell_add_to_session',
'pspell_clear_session',
'pspell_config_create',
'pspell_config_data_dir',
'pspell_config_dict_dir',
'pspell_config_ignore',
'pspell_config_mode',
'pspell_config_personal',
'pspell_config_repl',
'pspell_config_runtogether',
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
'ps_add_locallink',
'ps_add_note',
'ps_add_pdflink',
'ps_add_weblink',
'ps_arc',
'ps_arcn',
'ps_begin_page',
'ps_begin_pattern',
'ps_begin_template',
'ps_circle',
'ps_clip',
'ps_close',
'ps_closepath',
'ps_closepath_stroke',
'ps_close_image',
'ps_continue_text',
'ps_curveto',
'ps_delete',
'ps_end_page',
'ps_end_pattern',
'ps_end_template',
'ps_fill',
'ps_fill_stroke',
'ps_get_parameter',
'ps_hyphenate',
'ps_include_file',
'ps_lineto',
'ps_moveto',
'ps_new',
'ps_open_file',
'ps_place_image',
'ps_rect',
'ps_restore',
'ps_rotate',
'ps_save',
'ps_scale',
'ps_setcolor',
'ps_setdash',
'ps_setflat',
'ps_setfont',
'ps_setgray',
'ps_setlinecap',
'ps_setlinejoin',
'ps_setlinewidth',
'ps_setmiterlimit',
'ps_setoverprintmode',
'ps_setpolydash',
'ps_set_border_color',
'ps_set_border_dash',
'ps_set_border_style',
'ps_set_info',
'ps_set_parameter',
'ps_set_text_pos',
'ps_set_value',
'ps_shading',
'ps_shading_pattern',
'ps_shfill',
'ps_show',
'ps_show2',
'ps_show_xy',
'ps_show_xy2',
'ps_stroke',
'ps_symbol',
'ps_translate',
'putenv',
'readfile',
'readgzfile',
'readline_add_history',
'readline_callback_handler_install',
'readline_clear_history',
'readline_completion_function',
'readline_read_history',
'readline_write_history',
'readlink',
'realpath',
'register_tick_function',
'rename',
'rewind',
'rmdir',
'rnp_decrypt',
'rnp_dump_packets',
'rnp_dump_packets_to_json',
'rnp_ffi_create',
'rnp_ffi_set_pass_provider',
'rnp_import_keys',
'rnp_import_signatures',
'rnp_key_export',
'rnp_key_export_autocrypt',
'rnp_key_export_revocation',
'rnp_key_get_info',
'rnp_key_remove',
'rnp_key_revoke',
'rnp_list_keys',
'rnp_load_keys',
'rnp_load_keys_from_path',
'rnp_locate_key',
'rnp_op_encrypt',
'rnp_op_generate_key',
'rnp_op_sign',
'rnp_op_sign_cleartext',
'rnp_op_sign_detached',
'rnp_op_verify',
'rnp_op_verify_detached',
'rnp_save_keys',
'rnp_save_keys_to_path',
'rnp_supported_features',
'rpmaddtag',
'rrd_create',
'rrd_first',
'rrd_graph',
'rrd_info',
'rrd_lastupdate',
'rrd_restore',
'rrd_tune',
'rrd_update',
'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
'sem_get',
'sem_release',
'sem_remove',
'session_abort',
'session_create_id',
'session_decode',
'session_destroy',
'session_encode',
'session_id',
'session_module_name',
'session_name',
'session_regenerate_id',
'session_reset',
'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
'shell_exec',
'shmop_delete',
'shmop_read',
'shm_attach',
'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
'shuffle',
'simplexml_import_dom',
'simplexml_load_file',
'simplexml_load_string',
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
'socket_addrinfo_lookup',
'socket_bind',
'socket_connect',
'socket_create',
'socket_create_listen',
'socket_create_pair',
'socket_export_stream',
'socket_getpeername',
'socket_getsockname',
'socket_get_option',
'socket_import_stream',
'socket_listen',
'socket_read',
'socket_send',
'socket_sendmsg',
'socket_sendto',
'socket_set_block',
'socket_set_nonblock',
'socket_set_option',
'socket_shutdown',
'socket_write',
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
'sodium_crypto_aead_aes256gcm_decrypt',
'sodium_crypto_aead_chacha20poly1305_decrypt',
'sodium_crypto_aead_chacha20poly1305_encrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
'sodium_crypto_auth_verify',
'sodium_crypto_box_open',
'sodium_crypto_box_seal_open',
'sodium_crypto_generichash_update',
'sodium_crypto_secretbox_open',
'sodium_crypto_sign_open',
'sodium_crypto_sign_verify_detached',
'sodium_crypto_stream_xchacha20_xor_ic',
'solr_get_version',
'spl_autoload_register',
'spl_autoload_unregister',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
'sqlsrv_close',
'sqlsrv_commit',
'sqlsrv_configure',
'sqlsrv_execute',
'sqlsrv_fetch',
'sqlsrv_fetch_array',
'sqlsrv_fetch_object',
'sqlsrv_free_stmt',
'sqlsrv_get_field',
'sqlsrv_next_result',
'sqlsrv_num_fields',
'sqlsrv_num_rows',
'sqlsrv_prepare',
'sqlsrv_query',
'sqlsrv_rollback',
'ssdeep_fuzzy_compare',
'ssdeep_fuzzy_hash',
'ssdeep_fuzzy_hash_filename',
'ssh2_auth_agent',
'ssh2_auth_hostbased_file',
'ssh2_auth_password',
'ssh2_auth_pubkey_file',
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
'ssh2_forward_accept',
'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
'ssh2_sftp_rename',
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
'ssh2_shell',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
'stream_filter_prepend',
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
'stream_socket_get_name',
'stream_socket_pair',
'stream_socket_recvfrom',
'stream_socket_sendto',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
'strftime',
'strptime',
'strtotime',
'swoole_async_dns_lookup',
'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
'swoole_event_del',
'swoole_event_write',
'symlink',
'syslog',
'system',
'sys_getloadavg',
'tempnam',
'timezone_name_from_abbr',
'time_nanosleep',
'time_sleep_until',
'tmpfile',
'touch',
'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
'variant_date_to_timestamp',
'variant_round',
'virtual',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
'xdiff_file_diff_binary',
'xdiff_file_patch_binary',
'xdiff_file_rabdiff',
'xdiff_string_bpatch',
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
'xml_parser_free',
'xml_set_character_data_handler',
'xml_set_default_handler',
'xml_set_element_handler',
'xml_set_end_namespace_decl_handler',
'xml_set_external_entity_ref_handler',
'xml_set_notation_decl_handler',
'xml_set_object',
'xml_set_processing_instruction_handler',
'xml_set_start_namespace_decl_handler',
'xml_set_unparsed_entity_decl_handler',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
'yaz_ccl_parse',
'yaz_close',
'yaz_connect',
'yaz_database',
'yaz_element',
'yaz_present',
'yaz_search',
'yaz_wait',
'zip_entry_close',
'zip_entry_compressedsize',
'zip_entry_compressionmethod',
'zip_entry_filesize',
'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
];
<?php

namespace Safe;

use Safe\Exceptions\FileinfoException;








function finfo_close(\finfo $finfo): void
{
error_clear_last();
$safeResult = \finfo_close($finfo);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
}
























function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): \finfo
{
error_clear_last();
if ($magic_database !== null) {
$safeResult = \finfo_open($flags, $magic_database);
} else {
$safeResult = \finfo_open($flags);
}
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}












function mime_content_type($filename): string
{
error_clear_last();
$safeResult = \mime_content_type($filename);
if ($safeResult === false) {
throw FileinfoException::createFromPhpError();
}
return $safeResult;
}
<?php

if (str_starts_with(PHP_VERSION, "8.1.")) {
require_once __DIR__ . '/8.1/fileinfo.php';
}
if (str_starts_with(PHP_VERSION, "8.2.")) {
require_once __DIR__ . '/8.2/fileinfo.php';
}
if (str_starts_with(PHP_VERSION, "8.3.")) {
require_once __DIR__ . '/8.3/fileinfo.php';
}
if (str_starts_with(PHP_VERSION, "8.4.")) {
require_once __DIR__ . '/8.4/fileinfo.php';
}
if (str_starts_with(PHP_VERSION, "8.5.")) {
require_once __DIR__ . '/8.5/fileinfo.php';
}
MIT License

Copyright (c) 2018 TheCodingMachine

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.<?php

if (strpos(PHP_VERSION, "8.1.") === 0) {
return require_once __DIR__ . '/generated/8.1/rector-migrate.php';
}
if (strpos(PHP_VERSION, "8.2.") === 0) {
return require_once __DIR__ . '/generated/8.2/rector-migrate.php';
}
if (strpos(PHP_VERSION, "8.3.") === 0) {
return require_once __DIR__ . '/generated/8.3/rector-migrate.php';
}
if (strpos(PHP_VERSION, "8.4.") === 0) {
return require_once __DIR__ . '/generated/8.4/rector-migrate.php';
}
if (strpos(PHP_VERSION, "8.5.") === 0) {
return require_once __DIR__ . '/generated/8.5/rector-migrate.php';
}
<?php







namespace Safe;

use Safe\Exceptions\MiscException;
use Safe\Exceptions\PosixException;
use Safe\Exceptions\SocketsException;
use Safe\Exceptions\ApcuException;
use Safe\Exceptions\JsonException;
use Safe\Exceptions\OpensslException;
use Safe\Exceptions\PcreException;
use Safe\Exceptions\SimplexmlException;
use Safe\Exceptions\FilesystemException;

use const PREG_NO_ERROR;














function json_decode(string $json, bool $associative = false, int $depth = 512, int $flags = 0): mixed
{
$data = \json_decode($json, $associative, $depth, $flags);
if (!($flags & JSON_THROW_ON_ERROR) && JSON_ERROR_NONE !== json_last_error()) {
throw JsonException::createFromPhpError();
}
return $data;
}











function apcu_fetch($key)
{
error_clear_last();
$result = \apcu_fetch($key, $success);
if ($success === false) {
throw ApcuException::createFromPhpError();
}
return $result;
}

/**
@param-out









































































*/
function preg_replace($pattern, $replacement, $subject, int $limit = -1, ?int &$count = null)
{
error_clear_last();
$result = \preg_replace($pattern, $replacement, $subject, $limit, $count);
if (preg_last_error() !== PREG_NO_ERROR || $result === null) {
throw PcreException::createFromPhpError();
}
return $result;
}



















function openssl_encrypt(string $data, string $method, string $key, int $options = 0, string $iv = "", ?string &$tag = "", string $aad = "", int $tag_length = 16): string
{
error_clear_last();

if (func_num_args() <= 5) {
$result = \openssl_encrypt($data, $method, $key, $options, $iv);
} else {
$result = \openssl_encrypt($data, $method, $key, $options, $iv, $tag, $aad, $tag_length);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
}
return $result;
}




















function socket_write(\Socket $socket, string $buffer, int $length = 0): int
{
error_clear_last();
$result = $length === 0 ? \socket_write($socket, $buffer) : \socket_write($socket, $buffer, $length);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
return $result;
}















function simplexml_import_dom(\DOMNode $node, string $class_name = \SimpleXMLElement::class): \SimpleXMLElement
{
error_clear_last();
$result = \simplexml_import_dom($node, $class_name);
if ($result === null) {
throw SimplexmlException::createFromPhpError();
}
return $result;
}



















function simplexml_load_file(string $filename, string $class_name = \SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): \SimpleXMLElement
{
error_clear_last();
$result = \simplexml_load_file($filename, $class_name, $options, $namespace_or_prefix, $is_prefix);
if ($result === false) {
throw SimplexmlException::createFromPhpError();
}
return $result;
}




















function simplexml_load_string(string $data, string $class_name = \SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): \SimpleXMLElement
{
error_clear_last();
$result = \simplexml_load_string($data, $class_name, $options, $namespace_or_prefix, $is_prefix);
if ($result === false) {
throw SimplexmlException::createFromPhpError();
}
return $result;
}











function sys_getloadavg(): array
{
error_clear_last();
$result = \sys_getloadavg();
if ($result === false) {
throw MiscException::createFromPhpError();
}
return $result;
}










function posix_getpgid(int $process_id): int
{
error_clear_last();
$result = \posix_getpgid($process_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
return $result;
}


/**
@phpstan-param(scalar|\Stringable|null)[] $fields





















*/
function fputcsv($stream, array $fields, string $separator = ",", string $enclosure = "\"", string $escape = "\\", string $eol = "\n"): int
{
error_clear_last();
$result = \fputcsv($stream, $fields, $separator, $enclosure, $escape, $eol);

if ($result === false) {
throw FilesystemException::createFromPhpError();
}
return $result;
}


























function fgetcsv($stream, ?int $length = null, string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false
{
error_clear_last();
$safeResult = \fgetcsv($stream, $length, $separator, $enclosure, $escape);
if ($safeResult === false && \feof($stream) === false) {
throw FilesystemException::createFromPhpError();
}
return $safeResult;
}
<?php

namespace Safe;

use Safe\Exceptions\DatetimeException;






class DateTimeImmutable extends \DateTimeImmutable
{



private $innerDateTime;







public function __construct($time = 'now', $timezone = null)
{
parent::__construct($time, $timezone);
$this->innerDateTime = new parent($time, $timezone);
}


public static function createFromRegular(\DateTimeImmutable $datetime): self
{
$safeDatetime = new self($datetime->format('Y-m-d H:i:s.u'), $datetime->getTimezone()); 
$safeDatetime->innerDateTime = $datetime; 
return $safeDatetime;
}


public function getInnerDateTime(): \DateTimeImmutable
{
return $this->innerDateTime;
}










public static function createFromFormat($format, $time, $timezone = null): self
{
$datetime = \DateTimeImmutable::createFromFormat($format, $time, $timezone);
if ($datetime === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($datetime);
}






public function format($format): string
{

$result = $this->innerDateTime->format($format);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}







public function diff($datetime2, $absolute = false): \DateInterval
{

$result = $this->innerDateTime->diff($datetime2, $absolute);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}






public function modify($modify): self
{

$result = $this->innerDateTime->modify($modify);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result); 
}








public function setDate($year, $month, $day): self
{

$result = $this->innerDateTime->setDate($year, $month, $day);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result); 
}








public function setISODate($year, $week, $day = 1): self
{

$result = $this->innerDateTime->setISODate($year, $week, $day);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result); 
}









public function setTime($hour, $minute, $second = 0, $microseconds = 0): self
{

$result = $this->innerDateTime->setTime($hour, $minute, $second, $microseconds);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result);
}






public function setTimestamp($unixtimestamp): self
{

$result = $this->innerDateTime->setTimestamp($unixtimestamp);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result);
}






public function setTimezone($timezone): self
{

$result = $this->innerDateTime->setTimezone($timezone);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result);
}






public function sub($interval): self
{

$result = $this->innerDateTime->sub($interval);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($result);
}




public function getOffset(): int
{

$result = $this->innerDateTime->getOffset();
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}








public function add($interval): self
{
return self::createFromRegular($this->innerDateTime->add($interval));
}





#[\ReturnTypeWillChange]
public static function createFromMutable($dateTime): self
{
$date = \DateTimeImmutable::createFromMutable($dateTime);

return self::createFromRegular($date);
}

public static function createFromInterface(\DateTimeInterface $object): self
{
if ($object instanceof \DateTime) {
$object = self::createFromMutable($object);
} elseif ($object instanceof DateTimeImmutable) {
$object = $object->getInnerDateTime();
}
return self::createFromRegular($object);
}





public static function __set_state($array): self
{
return self::createFromRegular(parent::__set_state($array));
}

public function getTimezone(): \DateTimeZone
{
return $this->innerDateTime->getTimezone();
}

public function getTimestamp(): int
{
return $this->innerDateTime->getTimestamp();
}
}
<?php

namespace Safe;

use DateInterval;
use DateTimeInterface;
use DateTimeZone;
use Safe\Exceptions\DatetimeException;


class DateTime extends \DateTime
{

private static function createFromRegular(\DateTime $datetime): self
{
return new self($datetime->format('Y-m-d H:i:s.u'), $datetime->getTimezone());
}







public static function createFromFormat($format, $time, $timezone = null): self
{
$datetime = \DateTime::createFromFormat($format, $time, $timezone);
if ($datetime === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($datetime);
}







public function diff($datetime2, $absolute = false): DateInterval
{

$result = parent::diff($datetime2, $absolute);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}






public function modify($modify): self
{

$result = parent::modify($modify);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}








public function setDate($year, $month, $day): self
{

$result = parent::setDate($year, $month, $day);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}
}
<?php

namespace Safe\Exceptions;

class PcreException extends \Exception implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$errorMap = [
PREG_INTERNAL_ERROR => 'PREG_INTERNAL_ERROR: Internal error',
PREG_BACKTRACK_LIMIT_ERROR => 'PREG_BACKTRACK_LIMIT_ERROR: Backtrack limit reached',
PREG_RECURSION_LIMIT_ERROR => 'PREG_RECURSION_LIMIT_ERROR: Recursion limit reached',
PREG_BAD_UTF8_ERROR => 'PREG_BAD_UTF8_ERROR: Invalid UTF8 character',
PREG_BAD_UTF8_OFFSET_ERROR => 'PREG_BAD_UTF8_OFFSET_ERROR',
PREG_JIT_STACKLIMIT_ERROR => 'PREG_JIT_STACKLIMIT_ERROR',
];
$errMsg = $errorMap[preg_last_error()] ?? 'Unknown PCRE error: ' . preg_last_error();
return new self($errMsg, \preg_last_error());
}
}
<?php

namespace Safe\Exceptions;

interface SafeExceptionInterface extends \Throwable
{
}
<?php

namespace Safe\Exceptions;

class OpensslException extends \Exception implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
return new self(\openssl_error_string() ?: '', 0);
}
}
<?php

namespace Safe\Exceptions;

class CurlException extends \Exception implements SafeExceptionInterface
{



public static function createFromPhpError($ch = null): self
{
return new self($ch ? \curl_error($ch) : '', $ch ? \curl_errno($ch) : 0);
}
}
<?php

namespace Safe\Exceptions;

class SimplexmlException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
$error = \error_get_last();
return new self($error['message'] ?? 'An error occurred', 0, $error['type'] ?? 1);
}
}
<?php

namespace Safe\Exceptions;

class JsonException extends \JsonException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
return new self(\json_last_error_msg(), \json_last_error());
}
}
Copyright (c) 2015-2016 PHP HTTP Team <team@php-http.org>

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.
<?php

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Client\Common\Plugin\Exception\RewindStreamException;
use Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator;
use Http\Client\Common\Plugin\Cache\Generator\SimpleGenerator;
use Http\Promise\FulfilledPromise;
use Http\Promise\Promise;
use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;








final class CachePlugin implements Plugin
{
use VersionBridgePlugin;




private $pool;




private $streamFactory;




private $config;






private $noCacheFlags = ['no-cache', 'private', 'no-store'];


















public function __construct(CacheItemPoolInterface $pool, StreamFactoryInterface $streamFactory, array $config = [])
{
$this->pool = $pool;
$this->streamFactory = $streamFactory;

if (\array_key_exists('respect_cache_headers', $config) && \array_key_exists('respect_response_cache_directives', $config)) {
throw new \InvalidArgumentException('You can\'t provide config option "respect_cache_headers" and "respect_response_cache_directives". Use "respect_response_cache_directives" instead.');
}

$optionsResolver = new OptionsResolver();
$this->configureOptions($optionsResolver);
$this->config = $optionsResolver->resolve($config);

if (null === $this->config['cache_key_generator']) {
$this->config['cache_key_generator'] = new SimpleGenerator();
}
}









public static function clientCache(CacheItemPoolInterface $pool, StreamFactoryInterface $streamFactory, array $config = [])
{

if (\array_key_exists('respect_response_cache_directives', $config)) {
$config['respect_response_cache_directives'][] = 'no-cache';
$config['respect_response_cache_directives'][] = 'max-age';
$config['respect_response_cache_directives'] = array_unique($config['respect_response_cache_directives']);
} else {
$config['respect_response_cache_directives'] = ['no-cache', 'max-age'];
}

return new self($pool, $streamFactory, $config);
}









public static function serverCache(CacheItemPoolInterface $pool, StreamFactoryInterface $streamFactory, array $config = [])
{
return new self($pool, $streamFactory, $config);
}






protected function doHandleRequest(RequestInterface $request, callable $next, callable $first)
{
$method = strtoupper($request->getMethod());

if (!in_array($method, $this->config['methods'])) {
return $next($request)->then(function (ResponseInterface $response) use ($request) {
$response = $this->handleCacheListeners($request, $response, false, null);

return $response;
});
}


$key = $this->createCacheKey($request);
$cacheItem = $this->pool->getItem($key);

if ($cacheItem->isHit()) {
$data = $cacheItem->get();
if (is_array($data)) {

if (array_key_exists('expiresAt', $data) && (null === $data['expiresAt'] || time() < $data['expiresAt'])) {

$response = $this->createResponseFromCacheItem($cacheItem);
$response = $this->handleCacheListeners($request, $response, true, $cacheItem);

return new FulfilledPromise($response);
}


if ($modifiedSinceValue = $this->getModifiedSinceHeaderValue($cacheItem)) {
$request = $request->withHeader('If-Modified-Since', $modifiedSinceValue);
}

if ($etag = $this->getETag($cacheItem)) {
$request = $request->withHeader('If-None-Match', $etag);
}
}
}

return $next($request)->then(function (ResponseInterface $response) use ($request, $cacheItem) {
if (304 === $response->getStatusCode()) {
if (!$cacheItem->isHit()) {




return $this->handleCacheListeners($request, $response, false, $cacheItem);
}


$data = $cacheItem->get();
$maxAge = $this->getMaxAge($response);
$data['expiresAt'] = $this->calculateResponseExpiresAt($maxAge);
$cacheItem->set($data)->expiresAfter($this->calculateCacheItemExpiresAfter($maxAge));
$this->pool->save($cacheItem);

return $this->handleCacheListeners($request, $this->createResponseFromCacheItem($cacheItem), true, $cacheItem);
}

if ($this->isCacheable($response) && $this->isCacheableRequest($request)) {




$bodyStream = $response->getBody();
$body = $bodyStream->__toString();
$bodyStream->detach();

$maxAge = $this->getMaxAge($response);
$cacheItem
->expiresAfter($this->calculateCacheItemExpiresAfter($maxAge))
->set([
'response' => $response,
'body' => $body,
'expiresAt' => $this->calculateResponseExpiresAt($maxAge),
'createdAt' => time(),
'etag' => $response->getHeader('ETag'),
]);
$this->pool->save($cacheItem);

$bodyStream = $this->streamFactory->createStream($body);
if ($bodyStream->isSeekable()) {
$bodyStream->rewind();
}

$response = $response->withBody($bodyStream);
}

return $this->handleCacheListeners($request, $response, false, $cacheItem);
});
}







private function calculateCacheItemExpiresAfter(?int $maxAge): ?int
{
if (null === $this->config['cache_lifetime'] && null === $maxAge) {
return null;
}

return ($this->config['cache_lifetime'] ?: 0) + ($maxAge ?: 0);
}







private function calculateResponseExpiresAt(?int $maxAge): ?int
{
if (null === $maxAge) {
return null;
}

return time() + $maxAge;
}






protected function isCacheable(ResponseInterface $response)
{
if (!in_array($response->getStatusCode(), [200, 203, 300, 301, 302, 404, 410])) {
return false;
}

$nocacheDirectives = array_intersect($this->config['respect_response_cache_directives'], $this->noCacheFlags);
foreach ($nocacheDirectives as $nocacheDirective) {
if ($this->getCacheControlDirective($response, $nocacheDirective)) {
return false;
}
}

return true;
}




private function isCacheableRequest(RequestInterface $request): bool
{
$uri = $request->getUri()->__toString();
foreach ($this->config['blacklisted_paths'] as $regex) {
if (1 === preg_match($regex, $uri)) {
return false;
}
}

return true;
}








private function getCacheControlDirective(ResponseInterface $response, string $name)
{
$headers = $response->getHeader('Cache-Control');
foreach ($headers as $header) {
if (preg_match(sprintf('|%s=?([0-9]+)?|i', $name), $header, $matches)) {

if (isset($matches[1])) {
return $matches[1];
}

return true;
}
}

return false;
}

private function createCacheKey(RequestInterface $request): string
{
$key = $this->config['cache_key_generator']->generate($request);

return hash($this->config['hash_algo'], $key);
}






private function getMaxAge(ResponseInterface $response): ?int
{
if (!in_array('max-age', $this->config['respect_response_cache_directives'], true)) {
return $this->config['default_ttl'];
}


$maxAge = $this->getCacheControlDirective($response, 'max-age');
if (!is_bool($maxAge)) {
$ageHeaders = $response->getHeader('Age');
foreach ($ageHeaders as $age) {
return ((int) $maxAge) - ((int) $age);
}

return (int) $maxAge;
}


$headers = $response->getHeader('Expires');
foreach ($headers as $header) {
return (new \DateTime($header))->getTimestamp() - (new \DateTime())->getTimestamp();
}

return $this->config['default_ttl'];
}




private function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'cache_lifetime' => 86400 * 30, 
'default_ttl' => 0,

'respect_cache_headers' => null,
'hash_algo' => 'sha1',
'methods' => ['GET', 'HEAD'],
'respect_response_cache_directives' => ['no-cache', 'private', 'max-age', 'no-store'],
'cache_key_generator' => null,
'cache_listeners' => [],
'blacklisted_paths' => [],
]);

$resolver->setAllowedTypes('cache_lifetime', ['int', 'null']);
$resolver->setAllowedTypes('default_ttl', ['int', 'null']);
$resolver->setAllowedTypes('respect_cache_headers', ['bool', 'null']);
$resolver->setAllowedTypes('methods', 'array');
$resolver->setAllowedTypes('cache_key_generator', ['null', CacheKeyGenerator::class]);
$resolver->setAllowedTypes('blacklisted_paths', 'array');
$resolver->setAllowedValues('hash_algo', hash_algos());
$resolver->setAllowedValues('methods', function ($value) {

$matches = preg_grep('/[^A-Z0-9!#$%&\'*+\-.^_`|~]/', $value);

return empty($matches);
});
$resolver->setAllowedTypes('cache_listeners', ['array']);

$resolver->setNormalizer('respect_cache_headers', function (Options $options, $value) {
if (null !== $value) {
@trigger_error('The option "respect_cache_headers" is deprecated since version 1.3 and will be removed in 2.0. Use "respect_response_cache_directives" instead.', E_USER_DEPRECATED);
}

return null === $value ? true : $value;
});

$resolver->setNormalizer('respect_response_cache_directives', function (Options $options, $value) {
if (false === $options['respect_cache_headers']) {
return [];
}

return $value;
});
}

private function createResponseFromCacheItem(CacheItemInterface $cacheItem): ResponseInterface
{
$data = $cacheItem->get();


$response = $data['response'];
$stream = $this->streamFactory->createStream($data['body']);

try {
$stream->rewind();
} catch (\Exception $e) {
throw new RewindStreamException('Cannot rewind stream.', 0, $e);
}

return $response->withBody($stream);
}




private function getModifiedSinceHeaderValue(CacheItemInterface $cacheItem): ?string
{
$data = $cacheItem->get();

if (!isset($data['createdAt'])) {
return null;
}

$modified = new \DateTime('@'.$data['createdAt']);
$modified->setTimezone(new \DateTimeZone('GMT'));

return sprintf('%s GMT', $modified->format('l, d-M-y H:i:s'));
}




private function getETag(CacheItemInterface $cacheItem): ?string
{
$data = $cacheItem->get();

if (!isset($data['etag'])) {
return null;
}

foreach ($data['etag'] as $etag) {
if (!empty($etag)) {
return $etag;
}
}

return null;
}




private function handleCacheListeners(RequestInterface $request, ResponseInterface $response, bool $cacheHit, ?CacheItemInterface $cacheItem): ResponseInterface
{
foreach ($this->config['cache_listeners'] as $cacheListener) {
$response = $cacheListener->onCacheResponse($request, $response, $cacheHit, $cacheItem);
}

return $response;
}
}
<?php

namespace Http\Client\Common\Plugin\Cache\Listener;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Cache\CacheItemInterface;








interface CacheListener
{









public function onCacheResponse(RequestInterface $request, ResponseInterface $response, $fromCache, $cacheItem);
}
<?php

namespace Http\Client\Common\Plugin\Cache\Listener;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Cache\CacheItemInterface;






class AddHeaderCacheListener implements CacheListener
{

private $headerName;




public function __construct($headerName = 'X-Cache')
{
$this->headerName = $headerName;
}










public function onCacheResponse(RequestInterface $request, ResponseInterface $response, $fromCache, $cacheItem)
{
return $response->withHeader($this->headerName, $fromCache ? 'HIT' : 'MISS');
}
}
<?php

namespace Http\Client\Common\Plugin\Cache\Generator;

use Psr\Http\Message\RequestInterface;






class SimpleGenerator implements CacheKeyGenerator
{
public function generate(RequestInterface $request)
{
$body = (string) $request->getBody();
if (!empty($body)) {
$body = ' '.$body;
}

return $request->getMethod().' '.$request->getUri().$body;
}
}
<?php

namespace Http\Client\Common\Plugin\Cache\Generator;

use Psr\Http\Message\RequestInterface;






class HeaderCacheKeyGenerator implements CacheKeyGenerator
{





private $headerNames;




public function __construct(array $headerNames)
{
$this->headerNames = $headerNames;
}

public function generate(RequestInterface $request)
{
$concatenatedHeaders = [];
foreach ($this->headerNames as $headerName) {
$concatenatedHeaders[] = sprintf(' %s:"%s"', $headerName, $request->getHeaderLine($headerName));
}

return $request->getMethod().' '.$request->getUri().implode('', $concatenatedHeaders).' '.$request->getBody();
}
}
<?php

namespace Http\Client\Common\Plugin\Cache\Generator;

use Psr\Http\Message\RequestInterface;






interface CacheKeyGenerator
{





public function generate(RequestInterface $request);
}
<?php

namespace Http\Client\Common\Plugin\Exception;

use Http\Client\Exception;




class RewindStreamException extends \RuntimeException implements Exception
{
}
Copyright (c) 2015 PHP HTTP Team <team@php-http.org>

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.
<?php

namespace Http\Message\MultipartStream;








class ApacheMimetypeHelper implements MimetypeHelper
{





public function getMimetypeFromFilename($filename)
{
return $this->getMimetypeFromExtension(pathinfo($filename, PATHINFO_EXTENSION));
}






public function getMimetypeFromExtension($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',
'webp' => 'image/webp',
'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',


'pkpass' => 'application/vnd.apple.pkpass',
'msg' => 'application/vnd.ms-outlook',
];

$extension = strtolower($extension);

return isset($mimetypes[$extension])
? $mimetypes[$extension]
: null;
}
}
<?php

namespace Http\Message\MultipartStream;




interface MimetypeHelper
{







public function getMimetypeFromFilename($filename);








public function getMimetypeFromExtension($extension);
}
<?php

namespace Http\Message\MultipartStream;






class CustomMimetypeHelper extends ApacheMimetypeHelper
{



private $mimetypes = [];




public function __construct(array $mimetypes = [])
{
$this->mimetypes = $mimetypes;
}







public function addMimetype($extension, $mimetype)
{
$this->mimetypes[$extension] = $mimetype;

return $this;
}






public function getMimetypeFromExtension($extension)
{
$extension = strtolower($extension);

return isset($this->mimetypes[$extension])
? $this->mimetypes[$extension]
: parent::getMimetypeFromExtension($extension);
}
}
<?php

namespace Http\Message\MultipartStream;

use Http\Discovery\Exception\NotFoundException;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\StreamFactoryDiscovery;
use Http\Message\StreamFactory as HttplugStreamFactory;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;








class MultipartStreamBuilder
{



private $streamFactory;




private $mimetypeHelper;




private $boundary;




private $data = [];




public function __construct($streamFactory = null)
{
if ($streamFactory instanceof StreamFactoryInterface || $streamFactory instanceof HttplugStreamFactory) {
$this->streamFactory = $streamFactory;

return;
}

if (null !== $streamFactory) {
throw new \LogicException(sprintf(
'First arguemnt to the constructor of "%s" must be of type "%s", "%s" or null. Got %s',
__CLASS__,
StreamFactoryInterface::class,
HttplugStreamFactory::class,
\is_object($streamFactory) ? \get_class($streamFactory) : \gettype($streamFactory)
));
}


try {
$this->streamFactory = Psr17FactoryDiscovery::findStreamFactory();
} catch (NotFoundException $psr17Exception) {
try {
$this->streamFactory = StreamFactoryDiscovery::find();
} catch (NotFoundException $httplugException) {

throw $psr17Exception;
}
}
}









public function addData($resource, array $headers = [])
{
$stream = $this->createStream($resource);
$this->data[] = ['contents' => $stream, 'headers' => $headers];

return $this;
}














public function addResource($name, $resource, array $options = [])
{
$stream = $this->createStream($resource);


if (!isset($options['headers'])) {
$options['headers'] = [];
}


if (empty($options['filename'])) {
$options['filename'] = null;
$uri = $stream->getMetadata('uri');
if ('php://' !== substr($uri, 0, 6) && 'data://' !== substr($uri, 0, 7)) {
$options['filename'] = $uri;
}
}

$this->prepareHeaders($name, $stream, $options['filename'], $options['headers']);

return $this->addData($stream, $options['headers']);
}






public function build()
{



$buffer = fopen('php://temp', 'r+');
foreach ($this->data as $data) {

fwrite($buffer, "--{$this->getBoundary()}\r\n".
$this->getHeaders($data['headers'])."\r\n");

/**
@@var $contentStream StreamInterface */
$contentStream = $data['contents'];


if ($contentStream->isSeekable()) {
$contentStream->rewind(); 
}
if ($contentStream->isReadable()) {
while (!$contentStream->eof()) {

fwrite($buffer, $contentStream->read(1048576));
}
} else {
fwrite($buffer, $contentStream->__toString());
}
fwrite($buffer, "\r\n");
}


fwrite($buffer, "--{$this->getBoundary()}--\r\n");


fseek($buffer, 0);

return $this->createStream($buffer);
}







private function prepareHeaders($name, StreamInterface $stream, $filename, array &$headers)
{
$hasFilename = '0' === $filename || $filename;


if (!$this->hasHeader($headers, 'content-disposition')) {
$headers['Content-Disposition'] = sprintf('form-data; name="%s"', $name);
if ($hasFilename) {
$headers['Content-Disposition'] .= sprintf('; filename="%s"', $this->basename($filename));
}
}


if (!$this->hasHeader($headers, 'content-type') && $hasFilename) {
if ($type = $this->getMimetypeHelper()->getMimetypeFromFilename($filename)) {
$headers['Content-Type'] = $type;
}
}
}






private function getHeaders(array $headers)
{
$str = '';
foreach ($headers as $key => $value) {
$str .= sprintf("%s: %s\r\n", $key, $value);
}

return $str;
}








private function hasHeader(array $headers, $key)
{
$lowercaseHeader = strtolower($key);
foreach ($headers as $k => $v) {
if (strtolower($k) === $lowercaseHeader) {
return true;
}
}

return false;
}






public function getBoundary()
{
if (null === $this->boundary) {
$this->boundary = uniqid('', true);
}

return $this->boundary;
}






public function setBoundary($boundary)
{
$this->boundary = $boundary;

return $this;
}




private function getMimetypeHelper()
{
if (null === $this->mimetypeHelper) {
$this->mimetypeHelper = new ApacheMimetypeHelper();
}

return $this->mimetypeHelper;
}






public function setMimetypeHelper(MimetypeHelper $mimetypeHelper)
{
$this->mimetypeHelper = $mimetypeHelper;

return $this;
}






public function reset()
{
$this->data = [];
$this->boundary = null;

return $this;
}












private function basename($path)
{
$separators = '/';
if (DIRECTORY_SEPARATOR != '/') {

$separators .= DIRECTORY_SEPARATOR;
}


$path = rtrim($path, $separators);


$filename = preg_match('@[^'.preg_quote($separators, '@').']+$@', $path, $matches) ? $matches[0] : '';

return $filename;
}






private function createStream($resource)
{
if ($resource instanceof StreamInterface) {
return $resource;
}

if ($this->streamFactory instanceof HttplugStreamFactory) {
return $this->streamFactory->createStream($resource);
}


if (\is_string($resource)) {
return $this->streamFactory->createStream($resource);
}

if (\is_resource($resource)) {
return $this->streamFactory->createStreamFromResource($resource);
}

throw new \InvalidArgumentException(sprintf('First argument to "%s::createStream()" must be a string, resource or StreamInterface.', __CLASS__));
}
}
Copyright (c) 2015-2016 PHP HTTP Team <team@php-http.org>

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.
<?php

namespace Http\Promise;












interface Promise
{



const PENDING = 'pending';




const FULFILLED = 'fulfilled';




const REJECTED = 'rejected';












public function then(?callable $onFulfilled = null, ?callable $onRejected = null);






public function getState();
















public function wait($unwrap = true);
}
<?php

namespace Http\Promise;






final class FulfilledPromise implements Promise
{



private $result;




public function __construct($result)
{
$this->result = $result;
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null)
{
if (null === $onFulfilled) {
return $this;
}

try {
return new self($onFulfilled($this->result));
} catch (\Exception $e) {
return new RejectedPromise($e);
}
}

public function getState()
{
return Promise::FULFILLED;
}

public function wait($unwrap = true)
{
if ($unwrap) {
return $this->result;
}

return null;
}
}
<?php

namespace Http\Promise;






final class RejectedPromise implements Promise
{



private $exception;

public function __construct(\Throwable $exception)
{
$this->exception = $exception;
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null)
{
if (null === $onRejected) {
return $this;
}

try {
return new FulfilledPromise($onRejected($this->exception));
} catch (\Exception $e) {
return new self($e);
}
}

public function getState()
{
return Promise::REJECTED;
}

public function wait($unwrap = true)
{
if ($unwrap) {
throw $this->exception;
}

return null;
}
}
Copyright (c) 2015-2016 PHP HTTP Team <team@php-http.org>

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.
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Message\StreamFactory;








final class StreamFactoryDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$streamFactory = static::findOneByType(StreamFactory::class);
} catch (DiscoveryFailedException $e) {
throw new NotFoundException('No stream factories found. To use Guzzle, Diactoros or Slim Framework factories install php-http/message and the chosen message implementation.', 0, $e);
}

return static::instantiateClass($streamFactory);
}
}
<?php

namespace Http\Discovery;

use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UriFactoryInterface;









class Psr18Client extends Psr17Factory implements ClientInterface
{
private $client;

public function __construct(
?ClientInterface $client = null,
?RequestFactoryInterface $requestFactory = null,
?ResponseFactoryInterface $responseFactory = null,
?ServerRequestFactoryInterface $serverRequestFactory = null,
?StreamFactoryInterface $streamFactory = null,
?UploadedFileFactoryInterface $uploadedFileFactory = null,
?UriFactoryInterface $uriFactory = null
) {
$requestFactory ?? $requestFactory = $client instanceof RequestFactoryInterface ? $client : null;
$responseFactory ?? $responseFactory = $client instanceof ResponseFactoryInterface ? $client : null;
$serverRequestFactory ?? $serverRequestFactory = $client instanceof ServerRequestFactoryInterface ? $client : null;
$streamFactory ?? $streamFactory = $client instanceof StreamFactoryInterface ? $client : null;
$uploadedFileFactory ?? $uploadedFileFactory = $client instanceof UploadedFileFactoryInterface ? $client : null;
$uriFactory ?? $uriFactory = $client instanceof UriFactoryInterface ? $client : null;

parent::__construct($requestFactory, $responseFactory, $serverRequestFactory, $streamFactory, $uploadedFileFactory, $uriFactory);

$this->client = $client ?? Psr18ClientDiscovery::find();
}

public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->client->sendRequest($request);
}
}
<?php

namespace Http\Discovery\Strategy;

use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UriFactoryInterface;








final class CommonPsr17ClassesStrategy implements DiscoveryStrategy
{



private static $classes = [
RequestFactoryInterface::class => [
'Phalcon\Http\Message\RequestFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\RequestFactory',
'Http\Factory\Guzzle\RequestFactory',
'Http\Factory\Slim\RequestFactory',
'Laminas\Diactoros\RequestFactory',
'Slim\Psr7\Factory\RequestFactory',
'HttpSoft\Message\RequestFactory',
],
ResponseFactoryInterface::class => [
'Phalcon\Http\Message\ResponseFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\ResponseFactory',
'Http\Factory\Guzzle\ResponseFactory',
'Http\Factory\Slim\ResponseFactory',
'Laminas\Diactoros\ResponseFactory',
'Slim\Psr7\Factory\ResponseFactory',
'HttpSoft\Message\ResponseFactory',
],
ServerRequestFactoryInterface::class => [
'Phalcon\Http\Message\ServerRequestFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\ServerRequestFactory',
'Http\Factory\Guzzle\ServerRequestFactory',
'Http\Factory\Slim\ServerRequestFactory',
'Laminas\Diactoros\ServerRequestFactory',
'Slim\Psr7\Factory\ServerRequestFactory',
'HttpSoft\Message\ServerRequestFactory',
],
StreamFactoryInterface::class => [
'Phalcon\Http\Message\StreamFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\StreamFactory',
'Http\Factory\Guzzle\StreamFactory',
'Http\Factory\Slim\StreamFactory',
'Laminas\Diactoros\StreamFactory',
'Slim\Psr7\Factory\StreamFactory',
'HttpSoft\Message\StreamFactory',
],
UploadedFileFactoryInterface::class => [
'Phalcon\Http\Message\UploadedFileFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\UploadedFileFactory',
'Http\Factory\Guzzle\UploadedFileFactory',
'Http\Factory\Slim\UploadedFileFactory',
'Laminas\Diactoros\UploadedFileFactory',
'Slim\Psr7\Factory\UploadedFileFactory',
'HttpSoft\Message\UploadedFileFactory',
],
UriFactoryInterface::class => [
'Phalcon\Http\Message\UriFactory',
'Nyholm\Psr7\Factory\Psr17Factory',
'GuzzleHttp\Psr7\HttpFactory',
'Http\Factory\Diactoros\UriFactory',
'Http\Factory\Guzzle\UriFactory',
'Http\Factory\Slim\UriFactory',
'Laminas\Diactoros\UriFactory',
'Slim\Psr7\Factory\UriFactory',
'HttpSoft\Message\UriFactory',
],
];

public static function getCandidates($type)
{
$candidates = [];
if (isset(self::$classes[$type])) {
foreach (self::$classes[$type] as $class) {
$candidates[] = ['class' => $class, 'condition' => [$class]];
}
}

return $candidates;
}
}
<?php

namespace Http\Discovery\Strategy;

use Http\Discovery\Exception\StrategyUnavailableException;




interface DiscoveryStrategy
{










public static function getCandidates($type);
}
<?php

namespace Http\Discovery\Strategy;

use Http\Discovery\ClassDiscovery;
use Http\Discovery\Exception\PuliUnavailableException;
use Puli\Discovery\Api\Discovery;
use Puli\GeneratedPuliFactory;











class PuliBetaStrategy implements DiscoveryStrategy
{



protected static $puliFactory;




protected static $puliDiscovery;






private static function getPuliFactory()
{
if (null === self::$puliFactory) {
if (!defined('PULI_FACTORY_CLASS')) {
throw new PuliUnavailableException('Puli Factory is not available');
}

$puliFactoryClass = PULI_FACTORY_CLASS;

if (!ClassDiscovery::safeClassExists($puliFactoryClass)) {
throw new PuliUnavailableException('Puli Factory class does not exist');
}

self::$puliFactory = new $puliFactoryClass();
}

return self::$puliFactory;
}








private static function getPuliDiscovery()
{
if (!isset(self::$puliDiscovery)) {
$factory = self::getPuliFactory();
$repository = $factory->createRepository();

self::$puliDiscovery = $factory->createDiscovery($repository);
}

return self::$puliDiscovery;
}

public static function getCandidates($type)
{
$returnData = [];
$bindings = self::getPuliDiscovery()->findBindings($type);

foreach ($bindings as $binding) {
$condition = true;
if ($binding->hasParameterValue('depends')) {
$condition = $binding->getParameterValue('depends');
}
$returnData[] = ['class' => $binding->getClassName(), 'condition' => $condition];
}

return $returnData;
}
}
<?php

namespace Http\Discovery\Strategy;

use GuzzleHttp\Client as GuzzleHttp;
use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Psr7\Request as GuzzleRequest;
use Http\Adapter\Artax\Client as Artax;
use Http\Adapter\Buzz\Client as Buzz;
use Http\Adapter\Cake\Client as Cake;
use Http\Adapter\Guzzle5\Client as Guzzle5;
use Http\Adapter\Guzzle6\Client as Guzzle6;
use Http\Adapter\Guzzle7\Client as Guzzle7;
use Http\Adapter\React\Client as React;
use Http\Client\Curl\Client as Curl;
use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Http\Client\Socket\Client as Socket;
use Http\Discovery\ClassDiscovery;
use Http\Discovery\Exception\NotFoundException;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Message\MessageFactory;
use Http\Message\MessageFactory\DiactorosMessageFactory;
use Http\Message\MessageFactory\GuzzleMessageFactory;
use Http\Message\MessageFactory\SlimMessageFactory;
use Http\Message\StreamFactory;
use Http\Message\StreamFactory\DiactorosStreamFactory;
use Http\Message\StreamFactory\GuzzleStreamFactory;
use Http\Message\StreamFactory\SlimStreamFactory;
use Http\Message\UriFactory;
use Http\Message\UriFactory\DiactorosUriFactory;
use Http\Message\UriFactory\GuzzleUriFactory;
use Http\Message\UriFactory\SlimUriFactory;
use Laminas\Diactoros\Request as DiactorosRequest;
use Nyholm\Psr7\Factory\HttplugFactory as NyholmHttplugFactory;
use Psr\Http\Client\ClientInterface as Psr18Client;
use Psr\Http\Message\RequestFactoryInterface as Psr17RequestFactory;
use Slim\Http\Request as SlimRequest;
use Symfony\Component\HttpClient\HttplugClient as SymfonyHttplug;
use Symfony\Component\HttpClient\Psr18Client as SymfonyPsr18;








final class CommonClassesStrategy implements DiscoveryStrategy
{



private static $classes = [
MessageFactory::class => [
['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
['class' => GuzzleMessageFactory::class, 'condition' => [GuzzleRequest::class, GuzzleMessageFactory::class]],
['class' => DiactorosMessageFactory::class, 'condition' => [DiactorosRequest::class, DiactorosMessageFactory::class]],
['class' => SlimMessageFactory::class, 'condition' => [SlimRequest::class, SlimMessageFactory::class]],
],
StreamFactory::class => [
['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
['class' => GuzzleStreamFactory::class, 'condition' => [GuzzleRequest::class, GuzzleStreamFactory::class]],
['class' => DiactorosStreamFactory::class, 'condition' => [DiactorosRequest::class, DiactorosStreamFactory::class]],
['class' => SlimStreamFactory::class, 'condition' => [SlimRequest::class, SlimStreamFactory::class]],
],
UriFactory::class => [
['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
['class' => GuzzleUriFactory::class, 'condition' => [GuzzleRequest::class, GuzzleUriFactory::class]],
['class' => DiactorosUriFactory::class, 'condition' => [DiactorosRequest::class, DiactorosUriFactory::class]],
['class' => SlimUriFactory::class, 'condition' => [SlimRequest::class, SlimUriFactory::class]],
],
HttpAsyncClient::class => [
['class' => SymfonyHttplug::class, 'condition' => [SymfonyHttplug::class, Promise::class, [self::class, 'isPsr17FactoryInstalled']]],
['class' => Guzzle7::class, 'condition' => Guzzle7::class],
['class' => Guzzle6::class, 'condition' => Guzzle6::class],
['class' => Curl::class, 'condition' => Curl::class],
['class' => React::class, 'condition' => React::class],
],
HttpClient::class => [
['class' => SymfonyHttplug::class, 'condition' => [SymfonyHttplug::class, [self::class, 'isPsr17FactoryInstalled'], [self::class, 'isSymfonyImplementingHttpClient']]],
['class' => Guzzle7::class, 'condition' => Guzzle7::class],
['class' => Guzzle6::class, 'condition' => Guzzle6::class],
['class' => Guzzle5::class, 'condition' => Guzzle5::class],
['class' => Curl::class, 'condition' => Curl::class],
['class' => Socket::class, 'condition' => Socket::class],
['class' => Buzz::class, 'condition' => Buzz::class],
['class' => React::class, 'condition' => React::class],
['class' => Cake::class, 'condition' => Cake::class],
['class' => Artax::class, 'condition' => Artax::class],
[
'class' => [self::class, 'buzzInstantiate'],
'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
],
],
Psr18Client::class => [
[
'class' => [self::class, 'symfonyPsr18Instantiate'],
'condition' => [SymfonyPsr18::class, Psr17RequestFactory::class],
],
[
'class' => GuzzleHttp::class,
'condition' => [self::class, 'isGuzzleImplementingPsr18'],
],
[
'class' => [self::class, 'buzzInstantiate'],
'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
],
],
];

public static function getCandidates($type)
{
if (Psr18Client::class === $type) {
return self::getPsr18Candidates();
}

return self::$classes[$type] ?? [];
}





private static function getPsr18Candidates()
{
$candidates = self::$classes[Psr18Client::class];


foreach (self::$classes[HttpClient::class] as $c) {
if (!is_string($c['class'])) {
continue;
}
try {
if (ClassDiscovery::safeClassExists($c['class']) && is_subclass_of($c['class'], Psr18Client::class)) {
$candidates[] = $c;
}
} catch (\Throwable $e) {
trigger_error(sprintf('Got exception "%s (%s)" while checking if a PSR-18 Client is available', get_class($e), $e->getMessage()), E_USER_WARNING);
}
}

return $candidates;
}

public static function buzzInstantiate()
{
return new \Buzz\Client\FileGetContents(Psr17FactoryDiscovery::findResponseFactory());
}

public static function symfonyPsr18Instantiate()
{
return new SymfonyPsr18(null, Psr17FactoryDiscovery::findResponseFactory(), Psr17FactoryDiscovery::findStreamFactory());
}

public static function isGuzzleImplementingPsr18()
{
return defined('GuzzleHttp\ClientInterface::MAJOR_VERSION');
}

public static function isSymfonyImplementingHttpClient()
{
return is_subclass_of(SymfonyHttplug::class, HttpClient::class);
}






public static function isPsr17FactoryInstalled()
{
try {
Psr17FactoryDiscovery::findResponseFactory();
} catch (NotFoundException $e) {
return false;
} catch (\Throwable $e) {
trigger_error(sprintf('Got exception "%s (%s)" while checking if a PSR-17 ResponseFactory is available', get_class($e), $e->getMessage()), E_USER_WARNING);

return false;
}

return true;
}
}
<?php

namespace Http\Discovery\Strategy;

use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Http\Mock\Client as Mock;






final class MockClientStrategy implements DiscoveryStrategy
{
public static function getCandidates($type)
{
if (is_a(HttpClient::class, $type, true) || is_a(HttpAsyncClient::class, $type, true)) {
return [['class' => Mock::class, 'condition' => Mock::class]];
}

return [];
}
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Discovery\Exception\NotFoundException as RealNotFoundException;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UriFactoryInterface;






final class Psr17FactoryDiscovery extends ClassDiscovery
{
private static function createException($type, Exception $e)
{
return new RealNotFoundException(
'No PSR-17 '.$type.' found. Install a package from this list: https://packagist.org/providers/psr/http-factory-implementation',
0,
$e
);
}






public static function findRequestFactory()
{
try {
$messageFactory = static::findOneByType(RequestFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('request factory', $e);
}

return static::instantiateClass($messageFactory);
}






public static function findResponseFactory()
{
try {
$messageFactory = static::findOneByType(ResponseFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('response factory', $e);
}

return static::instantiateClass($messageFactory);
}






public static function findServerRequestFactory()
{
try {
$messageFactory = static::findOneByType(ServerRequestFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('server request factory', $e);
}

return static::instantiateClass($messageFactory);
}






public static function findStreamFactory()
{
try {
$messageFactory = static::findOneByType(StreamFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('stream factory', $e);
}

return static::instantiateClass($messageFactory);
}






public static function findUploadedFileFactory()
{
try {
$messageFactory = static::findOneByType(UploadedFileFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('uploaded file factory', $e);
}

return static::instantiateClass($messageFactory);
}






public static function findUriFactory()
{
try {
$messageFactory = static::findOneByType(UriFactoryInterface::class);
} catch (DiscoveryFailedException $e) {
throw self::createException('url factory', $e);
}

return static::instantiateClass($messageFactory);
}








public static function findUrlFactory()
{
return static::findUriFactory();
}
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Discovery\Exception\NotFoundException as RealNotFoundException;
use Psr\Http\Client\ClientInterface;






final class Psr18ClientDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$client = static::findOneByType(ClientInterface::class);
} catch (DiscoveryFailedException $e) {
throw new RealNotFoundException('No PSR-18 clients found. Make sure to install a package providing "psr/http-client-implementation". Example: "php-http/guzzle7-adapter".', 0, $e);
}

return static::instantiateClass($client);
}
}
<?php

namespace Http\Discovery;






interface Exception extends \Throwable
{
}
<?php

namespace Http\Discovery\Composer;

use Composer\Composer;
use Composer\DependencyResolver\Pool;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\Factory;
use Composer\Installer;
use Composer\IO\IOInterface;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Composer\Package\Locker;
use Composer\Package\Version\VersionParser;
use Composer\Package\Version\VersionSelector;
use Composer\Plugin\PluginInterface;
use Composer\Repository\InstalledRepositoryInterface;
use Composer\Repository\RepositorySet;
use Composer\Script\Event;
use Composer\Script\ScriptEvents;
use Composer\Util\Filesystem;
use Http\Discovery\ClassDiscovery;
















class Plugin implements PluginInterface, EventSubscriberInterface
{





private const PROVIDE_RULES = [
'php-http/async-client-implementation' => [
'symfony/http-client:>=6.3' => ['guzzlehttp/promises', 'psr/http-factory-implementation', 'php-http/httplug'],
'symfony/http-client' => ['guzzlehttp/promises', 'php-http/message-factory', 'psr/http-factory-implementation', 'php-http/httplug'],
'php-http/guzzle7-adapter' => [],
'php-http/guzzle6-adapter' => [],
'php-http/curl-client' => [],
'php-http/react-adapter' => [],
],
'php-http/client-implementation' => [
'symfony/http-client:>=6.3' => ['psr/http-factory-implementation', 'php-http/httplug'],
'symfony/http-client' => ['php-http/message-factory', 'psr/http-factory-implementation', 'php-http/httplug'],
'php-http/guzzle7-adapter' => [],
'php-http/guzzle6-adapter' => [],
'php-http/cakephp-adapter' => [],
'php-http/curl-client' => [],
'php-http/react-adapter' => [],
'php-http/buzz-adapter' => [],
'php-http/artax-adapter' => [],
'kriswallsmith/buzz:^1' => [],
],
'psr/http-client-implementation' => [
'symfony/http-client' => ['psr/http-factory-implementation', 'psr/http-client'],
'guzzlehttp/guzzle' => [],
'kriswallsmith/buzz:^1' => [],
],
'psr/http-message-implementation' => [
'php-http/discovery' => ['psr/http-factory-implementation'],
],
'psr/http-factory-implementation' => [
'nyholm/psr7' => [],
'guzzlehttp/psr7:>=2' => [],
'slim/psr7' => [],
'laminas/laminas-diactoros' => [],
'phalcon/cphalcon:^4' => [],
'http-interop/http-factory-guzzle' => [],
'http-interop/http-factory-diactoros' => [],
'http-interop/http-factory-slim' => [],
'httpsoft/http-message' => [],
],
];





private const STICKYNESS_RULES = [
'symfony/http-client' => 'symfony/framework-bundle',
'php-http/guzzle7-adapter' => 'guzzlehttp/guzzle:^7',
'php-http/guzzle6-adapter' => 'guzzlehttp/guzzle:^6',
'php-http/guzzle5-adapter' => 'guzzlehttp/guzzle:^5',
'php-http/cakephp-adapter' => 'cakephp/cakephp',
'php-http/react-adapter' => 'react/event-loop',
'php-http/buzz-adapter' => 'kriswallsmith/buzz:^0.15.1',
'php-http/artax-adapter' => 'amphp/artax:^3',
'http-interop/http-factory-guzzle' => 'guzzlehttp/psr7:^1',
'http-interop/http-factory-slim' => 'slim/slim:^3',
];

private const INTERFACE_MAP = [
'php-http/async-client-implementation' => [
'Http\Client\HttpAsyncClient',
],
'php-http/client-implementation' => [
'Http\Client\HttpClient',
],
'psr/http-client-implementation' => [
'Psr\Http\Client\ClientInterface',
],
'psr/http-factory-implementation' => [
'Psr\Http\Message\RequestFactoryInterface',
'Psr\Http\Message\ResponseFactoryInterface',
'Psr\Http\Message\ServerRequestFactoryInterface',
'Psr\Http\Message\StreamFactoryInterface',
'Psr\Http\Message\UploadedFileFactoryInterface',
'Psr\Http\Message\UriFactoryInterface',
],
];

public static function getSubscribedEvents(): array
{
return [
ScriptEvents::PRE_AUTOLOAD_DUMP => 'preAutoloadDump',
ScriptEvents::POST_UPDATE_CMD => 'postUpdate',
];
}

public function activate(Composer $composer, IOInterface $io): void
{
}

public function deactivate(Composer $composer, IOInterface $io)
{
}

public function uninstall(Composer $composer, IOInterface $io)
{
}

public function postUpdate(Event $event)
{
$composer = $event->getComposer();
$repo = $composer->getRepositoryManager()->getLocalRepository();
$requires = [
$composer->getPackage()->getRequires(),
$composer->getPackage()->getDevRequires(),
];
$pinnedAbstractions = [];
$pinned = $composer->getPackage()->getExtra()['discovery'] ?? [];
foreach (self::INTERFACE_MAP as $abstraction => $interfaces) {
foreach (isset($pinned[$abstraction]) ? [] : $interfaces as $interface) {
if (!isset($pinned[$interface])) {
continue 2;
}
}
$pinnedAbstractions[$abstraction] = true;
}

$missingRequires = $this->getMissingRequires($repo, $requires, 'project' === $composer->getPackage()->getType(), $pinnedAbstractions);
$missingRequires = [
'require' => array_fill_keys(array_merge([], ...array_values($missingRequires[0])), '*'),
'require-dev' => array_fill_keys(array_merge([], ...array_values($missingRequires[1])), '*'),
'remove' => array_fill_keys(array_merge([], ...array_values($missingRequires[2])), '*'),
];

if (!$missingRequires = array_filter($missingRequires)) {
return;
}

$composerJsonContents = file_get_contents(Factory::getComposerFile());
$this->updateComposerJson($missingRequires, $composer->getConfig()->get('sort-packages'));

$installer = null;

foreach (debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT) as $trace) {
if (isset($trace['object']) && $trace['object'] instanceof Installer) {
$installer = $trace['object'];
break;
}
}

if (!$installer) {
return;
}

$event->stopPropagation();

$dispatcher = $composer->getEventDispatcher();
$disableScripts = !method_exists($dispatcher, 'setRunScripts') || !((array) $dispatcher)["\0*\0runScripts"];
$composer = Factory::create($event->getIO(), null, false, $disableScripts);


$installer = clone $installer;
if (method_exists($installer, 'setAudit')) {
$trace['object']->setAudit(false);
}

$installer->__construct(
$event->getIO(),
$composer->getConfig(),
$composer->getPackage(),
$composer->getDownloadManager(),
$composer->getRepositoryManager(),
$composer->getLocker(),
$composer->getInstallationManager(),
$composer->getEventDispatcher(),
$composer->getAutoloadGenerator()
);
if (method_exists($installer, 'setPlatformRequirementFilter')) {
$installer->setPlatformRequirementFilter(((array) $trace['object'])["\0*\0platformRequirementFilter"]);
}

if (0 !== $installer->run()) {
file_put_contents(Factory::getComposerFile(), $composerJsonContents);

return;
}

$versionSelector = new VersionSelector(ClassDiscovery::safeClassExists(RepositorySet::class) ? new RepositorySet() : new Pool());
$updateComposerJson = false;

foreach ($composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) {
foreach (['require', 'require-dev'] as $key) {
if (!isset($missingRequires[$key][$package->getName()])) {
continue;
}
$updateComposerJson = true;
$missingRequires[$key][$package->getName()] = $versionSelector->findRecommendedRequireVersion($package);
}
}

if ($updateComposerJson) {
$this->updateComposerJson($missingRequires, $composer->getConfig()->get('sort-packages'));
$this->updateComposerLock($composer, $event->getIO());
}
}

public function getMissingRequires(InstalledRepositoryInterface $repo, array $requires, bool $isProject, array $pinnedAbstractions): array
{
$allPackages = [];
$devPackages = method_exists($repo, 'getDevPackageNames') ? array_fill_keys($repo->getDevPackageNames(), true) : [];



if (!isset($requires[0]['php-http/discovery'])) {
$requires = [[], []];
}

foreach ($repo->getPackages() as $package) {
$allPackages[$package->getName()] = true;

if (1 < \count($names = $package->getNames(false))) {
$allPackages += array_fill_keys($names, false);

if (isset($devPackages[$package->getName()])) {
$devPackages += $names;
}
}

if (isset($package->getRequires()['php-http/discovery'])) {
$requires[(int) isset($devPackages[$package->getName()])] += $package->getRequires();
}
}

$missingRequires = [[], [], []];
$versionParser = new VersionParser();

if (ClassDiscovery::safeClassExists(\Phalcon\Http\Message\RequestFactory::class, false)) {
$missingRequires[0]['psr/http-factory-implementation'] = [];
$missingRequires[1]['psr/http-factory-implementation'] = [];
}

foreach ($requires as $dev => $rules) {
$abstractions = [];
$rules = array_intersect_key(self::PROVIDE_RULES, $rules);

while ($rules) {
$abstraction = key($rules);

if (isset($pinnedAbstractions[$abstraction])) {
unset($rules[$abstraction]);
continue;
}

$abstractions[] = $abstraction;

foreach (array_shift($rules) as $candidate => $deps) {
[$candidate, $version] = explode(':', $candidate, 2) + [1 => null];

if (!isset($allPackages[$candidate])) {
continue;
}
if (null !== $version && !$repo->findPackage($candidate, $versionParser->parseConstraints($version))) {
continue;
}
if ($isProject && !$dev && isset($devPackages[$candidate])) {
$missingRequires[0][$abstraction] = [$candidate];
$missingRequires[2][$abstraction] = [$candidate];
} else {
$missingRequires[$dev][$abstraction] = [];
}

foreach ($deps as $dep) {
if (isset(self::PROVIDE_RULES[$dep])) {
$rules[$dep] = self::PROVIDE_RULES[$dep];
} elseif (!isset($allPackages[$dep])) {
$missingRequires[$dev][$abstraction][] = $dep;
} elseif ($isProject && !$dev && isset($devPackages[$dep])) {
$missingRequires[0][$abstraction][] = $dep;
$missingRequires[2][$abstraction][] = $dep;
}
}
break;
}
}

while ($abstractions) {
$abstraction = array_shift($abstractions);

if (isset($missingRequires[$dev][$abstraction])) {
continue;
}
$candidates = self::PROVIDE_RULES[$abstraction];

foreach ($candidates as $candidate => $deps) {
[$candidate, $version] = explode(':', $candidate, 2) + [1 => null];

if (null !== $version && !$repo->findPackage($candidate, $versionParser->parseConstraints($version))) {
continue;
}
if (isset($allPackages[$candidate]) && (!$isProject || $dev || !isset($devPackages[$candidate]))) {
continue 2;
}
}

foreach (array_intersect_key(self::STICKYNESS_RULES, $candidates) as $candidate => $stickyRule) {
[$stickyName, $stickyVersion] = explode(':', $stickyRule, 2) + [1 => null];
if (!isset($allPackages[$stickyName]) || ($isProject && !$dev && isset($devPackages[$stickyName]))) {
continue;
}
if (null !== $stickyVersion && !$repo->findPackage($stickyName, $versionParser->parseConstraints($stickyVersion))) {
continue;
}

$candidates = [$candidate => $candidates[$candidate]];
break;
}

$dep = key($candidates);
[$dep] = explode(':', $dep, 2);
$missingRequires[$dev][$abstraction] = [$dep];

if ($isProject && !$dev && isset($devPackages[$dep])) {
$missingRequires[2][$abstraction][] = $dep;
}
}
}

$missingRequires[1] = array_diff_key($missingRequires[1], $missingRequires[0]);

return $missingRequires;
}

public function preAutoloadDump(Event $event)
{
$filesystem = new Filesystem();

$vendorDir = $filesystem->normalizePath(realpath(realpath($event->getComposer()->getConfig()->get('vendor-dir'))));
$filesystem->ensureDirectoryExists($vendorDir.'/composer');
$pinned = $event->getComposer()->getPackage()->getExtra()['discovery'] ?? [];
$candidates = [];

$allInterfaces = array_merge(...array_values(self::INTERFACE_MAP));
foreach ($pinned as $abstraction => $class) {
if (isset(self::INTERFACE_MAP[$abstraction])) {
$interfaces = self::INTERFACE_MAP[$abstraction];
} elseif (false !== $k = array_search($abstraction, $allInterfaces, true)) {
$interfaces = [$allInterfaces[$k]];
} else {
throw new \UnexpectedValueException(sprintf('Invalid "extra.discovery" pinned in composer.json: "%s" is not one of ["%s"].', $abstraction, implode('", "', array_keys(self::INTERFACE_MAP))));
}

foreach ($interfaces as $interface) {
$candidates[] = sprintf("case %s: return [['class' => %s]];\n", var_export($interface, true), var_export($class, true));
}
}

$file = $vendorDir.'/composer/GeneratedDiscoveryStrategy.php';

if (!$candidates) {
if (file_exists($file)) {
unlink($file);
}

return;
}

$candidates = implode('            ', $candidates);
$code = <<<EOPHP
<?php

namespace Http\Discovery\Strategy;

class GeneratedDiscoveryStrategy implements DiscoveryStrategy
{
    public static function getCandidates(\$type)
    {
        switch (\$type) {
            $candidates
            default: return [];
        }
    }
}

EOPHP
;

if (!file_exists($file) || $code !== file_get_contents($file)) {
file_put_contents($file, $code);
}

$rootPackage = $event->getComposer()->getPackage();
$autoload = $rootPackage->getAutoload();
$autoload['classmap'][] = $vendorDir.'/composer/GeneratedDiscoveryStrategy.php';
$rootPackage->setAutoload($autoload);
}

private function updateComposerJson(array $missingRequires, bool $sortPackages)
{
$file = Factory::getComposerFile();
$contents = file_get_contents($file);

$manipulator = new JsonManipulator($contents);

foreach ($missingRequires as $key => $packages) {
foreach ($packages as $package => $constraint) {
if ('remove' === $key) {
$manipulator->removeSubNode('require-dev', $package);
} else {
$manipulator->addLink($key, $package, $constraint, $sortPackages);
}
}
}

file_put_contents($file, $manipulator->getContents());
}

private function updateComposerLock(Composer $composer, IOInterface $io)
{
if (false === $composer->getConfig()->get('lock')) {
return;
}

$lock = substr(Factory::getComposerFile(), 0, -4).'lock';
$composerJson = file_get_contents(Factory::getComposerFile());
$lockFile = new JsonFile($lock, null, $io);
$locker = ClassDiscovery::safeClassExists(RepositorySet::class)
? new Locker($io, $lockFile, $composer->getInstallationManager(), $composerJson)
: new Locker($io, $lockFile, $composer->getRepositoryManager(), $composer->getInstallationManager(), $composerJson);

if (!$locker->isLocked()) {
return;
}

$lockData = $locker->getLockData();
$lockData['content-hash'] = Locker::getContentHash($composerJson);
$lockFile->write($lockData);
}
}
<?php

namespace Http\Discovery;

use Http\Client\HttpAsyncClient;
use Http\Discovery\Exception\DiscoveryFailedException;






final class HttpAsyncClientDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$asyncClient = static::findOneByType(HttpAsyncClient::class);
} catch (DiscoveryFailedException $e) {
throw new NotFoundException('No HTTPlug async clients found. Make sure to install a package providing "php-http/async-client-implementation". Example: "php-http/guzzle6-adapter".', 0, $e);
}

return static::instantiateClass($asyncClient);
}
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Message\MessageFactory;








final class MessageFactoryDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$messageFactory = static::findOneByType(MessageFactory::class);
} catch (DiscoveryFailedException $e) {
throw new NotFoundException('No php-http message factories found. Note that the php-http message factories are deprecated in favor of the PSR-17 message factories. To use the legacy Guzzle, Diactoros or Slim Framework factories of php-http, install php-http/message and php-http/message-factory and the chosen message implementation.', 0, $e);
}

return static::instantiateClass($messageFactory);
}
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\NotFoundException as RealNotFoundException;








final class NotFoundException extends RealNotFoundException
{
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Message\UriFactory;








final class UriFactoryDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$uriFactory = static::findOneByType(UriFactory::class);
} catch (DiscoveryFailedException $e) {
throw new NotFoundException('No uri factories found. To use Guzzle, Diactoros or Slim Framework factories install php-http/message and the chosen message implementation.', 0, $e);
}

return static::instantiateClass($uriFactory);
}
}
<?php

namespace Http\Discovery;

use Http\Discovery\Exception\ClassInstantiationFailedException;
use Http\Discovery\Exception\DiscoveryFailedException;
use Http\Discovery\Exception\NoCandidateFoundException;
use Http\Discovery\Exception\StrategyUnavailableException;
use Http\Discovery\Strategy\DiscoveryStrategy;








abstract class ClassDiscovery
{





private static $strategies = [
Strategy\GeneratedDiscoveryStrategy::class,
Strategy\CommonClassesStrategy::class,
Strategy\CommonPsr17ClassesStrategy::class,
Strategy\PuliBetaStrategy::class,
];

private static $deprecatedStrategies = [
Strategy\PuliBetaStrategy::class => true,
];






private static $cache = [];










protected static function findOneByType($type)
{

if (null !== ($class = self::getFromCache($type))) {
return $class;
}

static $skipStrategy;
$skipStrategy ?? $skipStrategy = self::safeClassExists(Strategy\GeneratedDiscoveryStrategy::class) ? false : Strategy\GeneratedDiscoveryStrategy::class;

$exceptions = [];
foreach (self::$strategies as $strategy) {
if ($skipStrategy === $strategy) {
continue;
}

try {
$candidates = $strategy::getCandidates($type);
} catch (StrategyUnavailableException $e) {
if (!isset(self::$deprecatedStrategies[$strategy])) {
$exceptions[] = $e;
}

continue;
}

foreach ($candidates as $candidate) {
if (isset($candidate['condition'])) {
if (!self::evaluateCondition($candidate['condition'])) {
continue;
}
}


self::storeInCache($type, $candidate);

return $candidate['class'];
}

$exceptions[] = new NoCandidateFoundException($strategy, $candidates);
}

throw DiscoveryFailedException::create($exceptions);
}








private static function getFromCache($type)
{
if (!isset(self::$cache[$type])) {
return;
}

$candidate = self::$cache[$type];
if (isset($candidate['condition'])) {
if (!self::evaluateCondition($candidate['condition'])) {
return;
}
}

return $candidate['class'];
}







private static function storeInCache($type, $class)
{
self::$cache[$type] = $class;
}






public static function setStrategies(array $strategies)
{
self::$strategies = $strategies;
self::clearCache();
}






public static function getStrategies(): iterable
{
return self::$strategies;
}






public static function appendStrategy($strategy)
{
self::$strategies[] = $strategy;
self::clearCache();
}






public static function prependStrategy($strategy)
{
array_unshift(self::$strategies, $strategy);
self::clearCache();
}

public static function clearCache()
{
self::$cache = [];
}






protected static function evaluateCondition($condition)
{
if (is_string($condition)) {

return self::safeClassExists($condition);
}
if (is_callable($condition)) {
return (bool) $condition();
}
if (is_bool($condition)) {
return $condition;
}
if (is_array($condition)) {
foreach ($condition as $c) {
if (false === static::evaluateCondition($c)) {

return false;
}
}

return true;
}

return false;
}










protected static function instantiateClass($class)
{
try {
if (is_string($class)) {
return new $class();
}

if (is_callable($class)) {
return $class();
}
} catch (\Exception $e) {
throw new ClassInstantiationFailedException('Unexpected exception when instantiating class.', 0, $e);
}

throw new ClassInstantiationFailedException('Could not instantiate class because parameter is neither a callable nor a string');
}












public static function safeClassExists($class)
{
try {
return class_exists($class) || interface_exists($class);
} catch (\Exception $e) {
return false;
}
}
}
<?php

namespace Http\Discovery;

use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestFactoryInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UploadedFileFactoryInterface;
use Psr\Http\Message\UploadedFileInterface;
use Psr\Http\Message\UriFactoryInterface;
use Psr\Http\Message\UriInterface;

























class Psr17Factory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface
{
private $requestFactory;
private $responseFactory;
private $serverRequestFactory;
private $streamFactory;
private $uploadedFileFactory;
private $uriFactory;

public function __construct(
?RequestFactoryInterface $requestFactory = null,
?ResponseFactoryInterface $responseFactory = null,
?ServerRequestFactoryInterface $serverRequestFactory = null,
?StreamFactoryInterface $streamFactory = null,
?UploadedFileFactoryInterface $uploadedFileFactory = null,
?UriFactoryInterface $uriFactory = null
) {
$this->requestFactory = $requestFactory;
$this->responseFactory = $responseFactory;
$this->serverRequestFactory = $serverRequestFactory;
$this->streamFactory = $streamFactory;
$this->uploadedFileFactory = $uploadedFileFactory;
$this->uriFactory = $uriFactory;

$this->setFactory($requestFactory);
$this->setFactory($responseFactory);
$this->setFactory($serverRequestFactory);
$this->setFactory($streamFactory);
$this->setFactory($uploadedFileFactory);
$this->setFactory($uriFactory);
}




public function createRequest(string $method, $uri): RequestInterface
{
$factory = $this->requestFactory ?? $this->setFactory(Psr17FactoryDiscovery::findRequestFactory());

return $factory->createRequest(...\func_get_args());
}

public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface
{
$factory = $this->responseFactory ?? $this->setFactory(Psr17FactoryDiscovery::findResponseFactory());

return $factory->createResponse(...\func_get_args());
}




public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface
{
$factory = $this->serverRequestFactory ?? $this->setFactory(Psr17FactoryDiscovery::findServerRequestFactory());

return $factory->createServerRequest(...\func_get_args());
}

public function createServerRequestFromGlobals(?array $server = null, ?array $get = null, ?array $post = null, ?array $cookie = null, ?array $files = null, ?StreamInterface $body = null): ServerRequestInterface
{
$server = $server ?? $_SERVER;
$request = $this->createServerRequest($server['REQUEST_METHOD'] ?? 'GET', $this->createUriFromGlobals($server), $server);

return $this->buildServerRequestFromGlobals($request, $server, $files ?? $_FILES)
->withQueryParams($get ?? $_GET)
->withParsedBody($post ?? $_POST)
->withCookieParams($cookie ?? $_COOKIE)
->withBody($body ?? $this->createStreamFromFile('php://input', 'r+'));
}

public function createStream(string $content = ''): StreamInterface
{
$factory = $this->streamFactory ?? $this->setFactory(Psr17FactoryDiscovery::findStreamFactory());

return $factory->createStream($content);
}

public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface
{
$factory = $this->streamFactory ?? $this->setFactory(Psr17FactoryDiscovery::findStreamFactory());

return $factory->createStreamFromFile($filename, $mode);
}




public function createStreamFromResource($resource): StreamInterface
{
$factory = $this->streamFactory ?? $this->setFactory(Psr17FactoryDiscovery::findStreamFactory());

return $factory->createStreamFromResource($resource);
}

public function createUploadedFile(StreamInterface $stream, ?int $size = null, int $error = \UPLOAD_ERR_OK, ?string $clientFilename = null, ?string $clientMediaType = null): UploadedFileInterface
{
$factory = $this->uploadedFileFactory ?? $this->setFactory(Psr17FactoryDiscovery::findUploadedFileFactory());

return $factory->createUploadedFile(...\func_get_args());
}

public function createUri(string $uri = ''): UriInterface
{
$factory = $this->uriFactory ?? $this->setFactory(Psr17FactoryDiscovery::findUriFactory());

return $factory->createUri(...\func_get_args());
}

public function createUriFromGlobals(?array $server = null): UriInterface
{
return $this->buildUriFromGlobals($this->createUri(''), $server ?? $_SERVER);
}

private function setFactory($factory)
{
if (!$this->requestFactory && $factory instanceof RequestFactoryInterface) {
$this->requestFactory = $factory;
}
if (!$this->responseFactory && $factory instanceof ResponseFactoryInterface) {
$this->responseFactory = $factory;
}
if (!$this->serverRequestFactory && $factory instanceof ServerRequestFactoryInterface) {
$this->serverRequestFactory = $factory;
}
if (!$this->streamFactory && $factory instanceof StreamFactoryInterface) {
$this->streamFactory = $factory;
}
if (!$this->uploadedFileFactory && $factory instanceof UploadedFileFactoryInterface) {
$this->uploadedFileFactory = $factory;
}
if (!$this->uriFactory && $factory instanceof UriFactoryInterface) {
$this->uriFactory = $factory;
}

return $factory;
}

private function buildServerRequestFromGlobals(ServerRequestInterface $request, array $server, array $files): ServerRequestInterface
{
$request = $request
->withProtocolVersion(isset($server['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $server['SERVER_PROTOCOL']) : '1.1')
->withUploadedFiles($this->normalizeFiles($files));

$headers = [];
foreach ($server as $k => $v) {
if (0 === strpos($k, 'HTTP_')) {
$k = substr($k, 5);
} elseif (!\in_array($k, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) {
continue;
}
$k = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $k))));

$headers[$k] = $v;
}

if (!isset($headers['Authorization'])) {
if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
$headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
} elseif (isset($_SERVER['PHP_AUTH_USER'])) {
$headers['Authorization'] = 'Basic '.base64_encode($_SERVER['PHP_AUTH_USER'].':'.($_SERVER['PHP_AUTH_PW'] ?? ''));
} elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {
$headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];
}
}

foreach ($headers as $k => $v) {
try {
$request = $request->withHeader($k, $v);
} catch (\InvalidArgumentException $e) {

}
}

return $request;
}

private function buildUriFromGlobals(UriInterface $uri, array $server): UriInterface
{
$uri = $uri->withScheme(!empty($server['HTTPS']) && 'off' !== strtolower($server['HTTPS']) ? 'https' : 'http');

$hasPort = false;
if (isset($server['HTTP_HOST'])) {
$parts = parse_url('http://'.$server['HTTP_HOST']);

$uri = $uri->withHost($parts['host'] ?? 'localhost');

if ($parts['port'] ?? false) {
$hasPort = true;
$uri = $uri->withPort($parts['port']);
}
} else {
$uri = $uri->withHost($server['SERVER_NAME'] ?? $server['SERVER_ADDR'] ?? 'localhost');
}

if (!$hasPort && isset($server['SERVER_PORT'])) {
$uri = $uri->withPort($server['SERVER_PORT']);
}

$hasQuery = false;
if (isset($server['REQUEST_URI'])) {
$requestUriParts = explode('?', $server['REQUEST_URI'], 2);
$uri = $uri->withPath($requestUriParts[0]);
if (isset($requestUriParts[1])) {
$hasQuery = true;
$uri = $uri->withQuery($requestUriParts[1]);
}
}

if (!$hasQuery && isset($server['QUERY_STRING'])) {
$uri = $uri->withQuery($server['QUERY_STRING']);
}

return $uri;
}

private function normalizeFiles(array $files): array
{
foreach ($files as $k => $v) {
if ($v instanceof UploadedFileInterface) {
continue;
}
if (!\is_array($v)) {
unset($files[$k]);
} elseif (!isset($v['tmp_name'])) {
$files[$k] = $this->normalizeFiles($v);
} else {
$files[$k] = $this->createUploadedFileFromSpec($v);
}
}

return $files;
}








private function createUploadedFileFromSpec(array $value)
{
if (!is_array($tmpName = $value['tmp_name'])) {
$file = is_file($tmpName) ? $this->createStreamFromFile($tmpName, 'r') : $this->createStream();

return $this->createUploadedFile($file, $value['size'], $value['error'], $value['name'], $value['type']);
}

foreach ($tmpName as $k => $v) {
$tmpName[$k] = $this->createUploadedFileFromSpec([
'tmp_name' => $v,
'size' => $value['size'][$k] ?? null,
'error' => $value['error'][$k] ?? null,
'name' => $value['name'][$k] ?? null,
'type' => $value['type'][$k] ?? null,
]);
}

return $tmpName;
}
}
<?php

namespace Http\Discovery\Exception;

use Http\Discovery\Exception;






final class DiscoveryFailedException extends \Exception implements Exception
{



private $exceptions;





public function __construct($message, array $exceptions = [])
{
$this->exceptions = $exceptions;

parent::__construct($message);
}




public static function create($exceptions)
{
$message = 'Could not find resource using any discovery strategy. Find more information at http://docs.php-http.org/en/latest/discovery.html#common-errors';
foreach ($exceptions as $e) {
$message .= "\n - ".$e->getMessage();
}
$message .= "\n\n";

return new self($message, $exceptions);
}




public function getExceptions()
{
return $this->exceptions;
}
}
<?php

namespace Http\Discovery\Exception;

use Http\Discovery\Exception;






final class NoCandidateFoundException extends \Exception implements Exception
{



public function __construct($strategy, array $candidates)
{
$classes = array_map(
function ($a) {
return $a['class'];
},
$candidates
);

$message = sprintf(
'No valid candidate found using strategy "%s". We tested the following candidates: %s.',
$strategy,
implode(', ', array_map([$this, 'stringify'], $classes))
);

parent::__construct($message);
}

private function stringify($mixed)
{
if (is_string($mixed)) {
return $mixed;
}

if (is_array($mixed) && 2 === count($mixed)) {
return sprintf('%s::%s', $this->stringify($mixed[0]), $mixed[1]);
}

return is_object($mixed) ? get_class($mixed) : gettype($mixed);
}
}
<?php

namespace Http\Discovery\Exception;

use Http\Discovery\Exception;








 class NotFoundException extends \RuntimeException implements Exception
{
}
<?php

namespace Http\Discovery\Exception;






final class PuliUnavailableException extends StrategyUnavailableException
{
}
<?php

namespace Http\Discovery\Exception;

use Http\Discovery\Exception;






final class ClassInstantiationFailedException extends \RuntimeException implements Exception
{
}
<?php

namespace Http\Discovery\Exception;

use Http\Discovery\Exception;







class StrategyUnavailableException extends \RuntimeException implements Exception
{
}
<?php

namespace Http\Discovery;

use Http\Client\HttpClient;
use Http\Discovery\Exception\DiscoveryFailedException;








final class HttpClientDiscovery extends ClassDiscovery
{







public static function find()
{
try {
$client = static::findOneByType(HttpClient::class);
} catch (DiscoveryFailedException $e) {
throw new NotFoundException('No HTTPlug clients found. Make sure to install a package providing "php-http/client-implementation". Example: "php-http/guzzle6-adapter".', 0, $e);
}

return static::instantiateClass($client);
}
}
Copyright (c) 2015-2016 PHP HTTP Team <team@php-http.org>

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.
{"version":"1.0","name":"php-http\/message","bindings":{"064d003d-78a1-48c4-8f3b-1f92ff25da69":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\DiactorosMessageFactory","type":"Http\\Message\\MessageFactory","parameters":{"depends":"Zend\\Diactoros\\Request"}},"0836751e-6558-4d1b-8993-4a52012947c3":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\SlimMessageFactory","type":"Http\\Message\\ResponseFactory"},"1d127622-dc61-4bfa-b9da-d221548d72c3":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\SlimMessageFactory","type":"Http\\Message\\RequestFactory"},"2438c2d0-0658-441f-8855-ddaf0f87d54d":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\GuzzleMessageFactory","type":"Http\\Message\\MessageFactory","parameters":{"depends":"GuzzleHttp\\Psr7\\Request"}},"253aa08c-d705-46e7-b1d2-e28c97eef792":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\GuzzleMessageFactory","type":"Http\\Message\\RequestFactory","parameters":{"depends":"GuzzleHttp\\Psr7\\Request"}},"273a34f9-62f4-4ba1-9801-b1284d49ff89":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\StreamFactory\\GuzzleStreamFactory","type":"Http\\Message\\StreamFactory","parameters":{"depends":"GuzzleHttp\\Psr7\\Stream"}},"304b83db-b594-4d83-ae75-1f633adf92f7":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\UriFactory\\GuzzleUriFactory","type":"Http\\Message\\UriFactory","parameters":{"depends":"GuzzleHttp\\Psr7\\Uri"}},"3f4bc1cd-aa95-4702-9fa7-65408e471691":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\UriFactory\\DiactorosUriFactory","type":"Http\\Message\\UriFactory","parameters":{"depends":"Zend\\Diactoros\\Uri"}},"4672a6ee-ad9e-4109-a5d1-b7d46f26c7a1":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\SlimMessageFactory","type":"Http\\Message\\MessageFactory"},"6234e947-d3bd-43eb-97d5-7f9e22e6bb1b":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\DiactorosMessageFactory","type":"Http\\Message\\ResponseFactory","parameters":{"depends":"Zend\\Diactoros\\Response"}},"6a9ad6ce-d82c-470f-8e30-60f21d9d95bf":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\UriFactory\\SlimUriFactory","type":"Http\\Message\\UriFactory"},"72c2afa0-ea56-4d03-adb6-a9f241a8a734":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\StreamFactory\\SlimStreamFactory","type":"Http\\Message\\StreamFactory"},"95c1be8f-39fe-4abd-8351-92cb14379a75":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\StreamFactory\\DiactorosStreamFactory","type":"Http\\Message\\StreamFactory","parameters":{"depends":"Zend\\Diactoros\\Stream"}},"a018af27-7590-4dcf-83a1-497f95604cd6":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\GuzzleMessageFactory","type":"Http\\Message\\ResponseFactory","parameters":{"depends":"GuzzleHttp\\Psr7\\Response"}},"c07955b1-de46-43db-923b-d07fae9382cb":{"_class":"Puli\\Discovery\\Binding\\ClassBinding","class":"Http\\Message\\MessageFactory\\DiactorosMessageFactory","type":"Http\\Message\\RequestFactory","parameters":{"depends":"Zend\\Diactoros\\Request"}}}}<?php

namespace Http\Message;






final class CookieJar implements \Countable, \IteratorAggregate
{



private $cookies;

public function __construct()
{
$this->cookies = new \SplObjectStorage();
}






public function hasCookie(Cookie $cookie)
{
return $this->cookies->contains($cookie);
}




public function addCookie(Cookie $cookie)
{
if (!$this->hasCookie($cookie)) {
$cookies = $this->getMatchingCookies($cookie);

foreach ($cookies as $matchingCookie) {
if ($cookie->getValue() !== $matchingCookie->getValue() || $cookie->getMaxAge() > $matchingCookie->getMaxAge()) {
$this->removeCookie($matchingCookie);

continue;
}
}

if ($cookie->hasValue()) {
$this->cookies->attach($cookie);
}
}
}




public function removeCookie(Cookie $cookie)
{
$this->cookies->detach($cookie);
}






public function getCookies()
{
$match = function ($matchCookie) {
return true;
};

return $this->findMatchingCookies($match);
}






public function getMatchingCookies(Cookie $cookie)
{
$match = function ($matchCookie) use ($cookie) {
return $matchCookie->match($cookie);
};

return $this->findMatchingCookies($match);
}






private function findMatchingCookies(callable $match)
{
$cookies = [];

foreach ($this->cookies as $cookie) {
if ($match($cookie)) {
$cookies[] = $cookie;
}
}

return $cookies;
}






public function hasCookies()
{
return $this->cookies->count() > 0;
}






public function setCookies(array $cookies)
{
$this->clear();
$this->addCookies($cookies);
}






public function addCookies(array $cookies)
{
foreach ($cookies as $cookie) {
$this->addCookie($cookie);
}
}






public function removeCookies(array $cookies)
{
foreach ($cookies as $cookie) {
$this->removeCookie($cookie);
}
}










public function removeMatchingCookies($name = null, $domain = null, $path = null)
{
$match = function ($cookie) use ($name, $domain, $path) {
$match = true;

if (isset($name)) {
$match = $match && ($cookie->getName() === $name);
}

if (isset($domain)) {
$match = $match && $cookie->matchDomain($domain);
}

if (isset($path)) {
$match = $match && $cookie->matchPath($path);
}

return $match;
};

$cookies = $this->findMatchingCookies($match);

$this->removeCookies($cookies);
}




public function clear()
{
$this->cookies = new \SplObjectStorage();
}

#[\ReturnTypeWillChange]
public function count()
{
return $this->cookies->count();
}

#[\ReturnTypeWillChange]
public function getIterator()
{
return clone $this->cookies;
}
}
<?php


if (!array_key_exists('chunk', stream_get_filters())) {
stream_filter_register('chunk', 'Http\Message\Encoding\Filter\Chunk');
}
<?php

namespace Http\Message\StreamFactory;

use Http\Message\StreamFactory;
use Laminas\Diactoros\Stream as LaminasStream;
use Psr\Http\Message\StreamInterface;
use Zend\Diactoros\Stream as ZendStream;

if (!interface_exists(StreamFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\DiactorosStreamFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class DiactorosStreamFactory implements StreamFactory
{
public function createStream($body = null)
{
if ($body instanceof StreamInterface) {
return $body;
}

if (is_resource($body)) {
if (class_exists(LaminasStream::class)) {
return new LaminasStream($body);
}

return new ZendStream($body);
}

if (class_exists(LaminasStream::class)) {
$stream = new LaminasStream('php://memory', 'rw');
} else {
$stream = new ZendStream('php://memory', 'rw');
}

if (null !== $body && '' !== $body) {
$stream->write((string) $body);
}

return $stream;
}
}
<?php

namespace Http\Message\StreamFactory;

use Http\Message\StreamFactory;
use Psr\Http\Message\StreamInterface;
use Slim\Http\Stream;

if (!interface_exists(StreamFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\SlimStreamFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class SlimStreamFactory implements StreamFactory
{
public function createStream($body = null)
{
if ($body instanceof StreamInterface) {
return $body;
}

if (is_resource($body)) {
return new Stream($body);
}

$resource = fopen('php://memory', 'r+');
$stream = new Stream($resource);
if (null !== $body && '' !== $body) {
$stream->write((string) $body);
}

return $stream;
}
}
<?php

namespace Http\Message\StreamFactory;

use GuzzleHttp\Psr7\Utils;
use Http\Message\StreamFactory;

if (!interface_exists(StreamFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\GuzzleStreamFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class GuzzleStreamFactory implements StreamFactory
{
public function createStream($body = null)
{
if (class_exists(Utils::class)) {
return Utils::streamFor($body);
}


return \GuzzleHttp\Psr7\stream_for($body);
}
}
<?php

namespace Http\Message\Builder;

use Psr\Http\Message\ResponseInterface;




class ResponseBuilder
{





protected $response;




public function __construct(ResponseInterface $response)
{
$this->response = $response;
}






public function getResponse()
{
return $this->response;
}











public function setHeadersFromArray(array $headers)
{
$status = array_shift($headers);
$this->setStatus($status);

foreach ($headers as $headerLine) {
$headerLine = trim($headerLine);
if ('' === $headerLine) {
continue;
}

$this->addHeader($headerLine);
}

return $this;
}











public function setHeadersFromString($headers)
{
if (!(is_string($headers)
|| (is_object($headers) && method_exists($headers, '__toString')))
) {
throw new \InvalidArgumentException(
sprintf(
'%s expects parameter 1 to be a string, %s given',
__METHOD__,
is_object($headers) ? get_class($headers) : gettype($headers)
)
);
}

$this->setHeadersFromArray(explode("\r\n", $headers));

return $this;
}










public function setStatus($statusLine)
{
$parts = explode(' ', $statusLine, 3);
if (count($parts) < 2 || 0 !== strpos(strtolower($parts[0]), 'http/')) {
throw new \InvalidArgumentException(
sprintf('"%s" is not a valid HTTP status line', $statusLine)
);
}

$reasonPhrase = count($parts) > 2 ? $parts[2] : '';
$this->response = $this->response
->withStatus((int) $parts[1], $reasonPhrase)
->withProtocolVersion(substr($parts[0], 5));

return $this;
}










public function addHeader($headerLine)
{
$parts = explode(':', $headerLine, 2);
if (2 !== count($parts)) {
throw new \InvalidArgumentException(
sprintf('"%s" is not a valid HTTP header line', $headerLine)
);
}
$name = trim($parts[0]);
$value = trim($parts[1]);
if ($this->response->hasHeader($name)) {
$this->response = $this->response->withAddedHeader($name, $value);
} else {
$this->response = $this->response->withHeader($name, $value);
}

return $this;
}
}
<?php

namespace Http\Message\MessageFactory;

use Http\Message\MessageFactory;
use Http\Message\StreamFactory\DiactorosStreamFactory;
use Laminas\Diactoros\Request as LaminasRequest;
use Laminas\Diactoros\Response as LaminasResponse;
use Zend\Diactoros\Request as ZendRequest;
use Zend\Diactoros\Response as ZendResponse;

if (!interface_exists(MessageFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\DiactorosMessageFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class DiactorosMessageFactory implements MessageFactory
{



private $streamFactory;

public function __construct()
{
$this->streamFactory = new DiactorosStreamFactory();
}

public function createRequest(
$method,
$uri,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
if (class_exists(LaminasRequest::class)) {
return (new LaminasRequest(
$uri,
$method,
$this->streamFactory->createStream($body),
$headers
))->withProtocolVersion($protocolVersion);
}

return (new ZendRequest(
$uri,
$method,
$this->streamFactory->createStream($body),
$headers
))->withProtocolVersion($protocolVersion);
}

public function createResponse(
$statusCode = 200,
$reasonPhrase = null,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
if (class_exists(LaminasResponse::class)) {
return (new LaminasResponse(
$this->streamFactory->createStream($body),
$statusCode,
$headers
))->withProtocolVersion($protocolVersion);
}

return (new ZendResponse(
$this->streamFactory->createStream($body),
$statusCode,
$headers
))->withProtocolVersion($protocolVersion);
}
}
<?php

namespace Http\Message\MessageFactory;

use Http\Message\MessageFactory;
use Http\Message\StreamFactory\SlimStreamFactory;
use Http\Message\UriFactory\SlimUriFactory;
use Slim\Http\Headers;
use Slim\Http\Request;
use Slim\Http\Response;

if (!interface_exists(MessageFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\SlimMessageFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class SlimMessageFactory implements MessageFactory
{



private $streamFactory;




private $uriFactory;

public function __construct()
{
$this->streamFactory = new SlimStreamFactory();
$this->uriFactory = new SlimUriFactory();
}

public function createRequest(
$method,
$uri,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
return (new Request(
$method,
$this->uriFactory->createUri($uri),
new Headers($headers),
[],
[],
$this->streamFactory->createStream($body),
[]
))->withProtocolVersion($protocolVersion);
}

public function createResponse(
$statusCode = 200,
$reasonPhrase = null,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
return (new Response(
$statusCode,
new Headers($headers),
$this->streamFactory->createStream($body)
))->withProtocolVersion($protocolVersion);
}
}
<?php

namespace Http\Message\MessageFactory;

use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use Http\Message\MessageFactory;

if (!interface_exists(MessageFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\GuzzleMessageFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class GuzzleMessageFactory implements MessageFactory
{
public function createRequest(
$method,
$uri,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
return new Request(
$method,
$uri,
$headers,
$body,
$protocolVersion
);
}

public function createResponse(
$statusCode = 200,
$reasonPhrase = null,
array $headers = [],
$body = null,
$protocolVersion = '1.1'
) {
return new Response(
$statusCode,
$headers,
$body,
$protocolVersion,
$reasonPhrase
);
}
}
<?php

namespace Http\Message;

use Http\Message\Exception\UnexpectedValueException;

final class CookieUtil
{






private static $dateFormats = [
'D, d M y H:i:s T',
'D, d M Y H:i:s T',
'D, d-M-y H:i:s T',
'D, d-M-Y H:i:s T',
'D, d-m-y H:i:s T',
'D, d-m-Y H:i:s T',
'D M j G:i:s Y',
'D M d H:i:s Y T',
];










public static function parseDate($dateValue)
{
foreach (self::$dateFormats as $dateFormat) {
if (false !== $date = \DateTime::createFromFormat($dateFormat, $dateValue, new \DateTimeZone('GMT'))) {
return $date;
}
}


if (false !== $date = date_create($dateValue, new \DateTimeZone('GMT'))) {
return $date;
}

throw new UnexpectedValueException(sprintf(
'Unparseable cookie date string "%s"',
$dateValue
));
}
}
<?php

namespace Http\Message\Stream;

use Psr\Http\Message\StreamInterface;









class BufferedStream implements StreamInterface
{

private $resource;


private $size;


private $stream;


private $written = 0;








public function __construct(StreamInterface $stream, $useFileBuffer = true, $memoryBuffer = 2097152)
{
$this->stream = $stream;
$this->size = $stream->getSize();

if ($useFileBuffer) {
$this->resource = fopen('php://temp/maxmemory:'.$memoryBuffer, 'rw+');
} else {
$this->resource = fopen('php://memory', 'rw+');
}

if (false === $this->resource) {
throw new \RuntimeException('Cannot create a resource over temp or memory implementation');
}
}

public function __toString(): string
{
try {
$this->rewind();

return $this->getContents();
} catch (\Throwable $throwable) {
return '';
}
}

public function close(): void
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot close on a detached stream');
}

$this->stream->close();
fclose($this->resource);
}

public function detach()
{
if (null === $this->resource) {
return null;
}


$this->getContents();

$resource = $this->resource;
$this->stream->close();
$this->stream = null;
$this->resource = null;

return $resource;
}

public function getSize(): ?int
{
if (null === $this->resource) {
return null;
}

if (null === $this->size && $this->stream->eof()) {
return $this->written;
}

return $this->size;
}

public function tell(): int
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot tell on a detached stream');
}

$tell = ftell($this->resource);
if (false === $tell) {
throw new \RuntimeException('ftell failed');
}

return $tell;
}

public function eof(): bool
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot call eof on a detached stream');
}


return $this->stream->eof() && (ftell($this->resource) === $this->written);
}

public function isSeekable(): bool
{
return null !== $this->resource;
}

public function seek(int $offset, int $whence = SEEK_SET): void
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot seek on a detached stream');
}

fseek($this->resource, $offset, $whence);
}

public function rewind(): void
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot rewind on a detached stream');
}

rewind($this->resource);
}

public function isWritable(): bool
{
return false;
}

public function write(string $string): int
{
throw new \RuntimeException('Cannot write on this stream');
}

public function isReadable(): bool
{
return null !== $this->resource;
}

public function read(int $length): string
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot read on a detached stream');
}
if ($length < 0) {
throw new \InvalidArgumentException('Can not read a negative amount of bytes');
}
if (0 === $length) {
return '';
}

$read = '';


if (ftell($this->resource) !== $this->written) {
$read = fread($this->resource, $length);
}
if (false === $read) {
throw new \RuntimeException('Failed to read from resource');
}

$bytesRead = strlen($read);

if ($bytesRead < $length) {
$streamRead = $this->stream->read($length - $bytesRead);


$this->written += fwrite($this->resource, $streamRead);
$read .= $streamRead;
}

return $read;
}

public function getContents(): string
{
if (null === $this->resource) {
throw new \RuntimeException('Cannot read on a detached stream');
}

$read = '';

while (!$this->eof()) {
$read .= $this->read(8192);
}

return $read;
}

public function getMetadata(?string $key = null)
{
if (null === $this->resource) {
if (null === $key) {
return [];
}

return null;
}

$metadata = stream_get_meta_data($this->resource);

if (null === $key) {
return $metadata;
}

if (!array_key_exists($key, $metadata)) {
return null;
}

return $metadata[$key];
}
}
<?php

namespace Http\Message;




interface Exception
{
}
<?php

namespace Http\Message\Decorator;

use Psr\Http\Message\StreamInterface;






trait StreamDecorator
{



protected $stream;

public function __toString(): string
{
return $this->stream->__toString();
}

public function close(): void
{
$this->stream->close();
}

public function detach()
{
return $this->stream->detach();
}

public function getSize(): ?int
{
return $this->stream->getSize();
}

public function tell(): int
{
return $this->stream->tell();
}

public function eof(): bool
{
return $this->stream->eof();
}

public function isSeekable(): bool
{
return $this->stream->isSeekable();
}

public function seek(int $offset, int $whence = SEEK_SET): void
{
$this->stream->seek($offset, $whence);
}

public function rewind(): void
{
$this->stream->rewind();
}

public function isWritable(): bool
{
return $this->stream->isWritable();
}

public function write(string $string): int
{
return $this->stream->write($string);
}

public function isReadable(): bool
{
return $this->stream->isReadable();
}

public function read(int $length): string
{
return $this->stream->read($length);
}

public function getContents(): string
{
return $this->stream->getContents();
}

public function getMetadata(?string $key = null)
{
return $this->stream->getMetadata($key);
}
}
<?php

namespace Http\Message\Decorator;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;




trait RequestDecorator
{
use MessageDecorator {
getMessage as getRequest;
}




public function withRequest(RequestInterface $request): RequestInterface
{
$new = clone $this;
$new->message = $request;

return $new;
}

public function getRequestTarget(): string
{
return $this->message->getRequestTarget();
}

public function withRequestTarget(string $requestTarget): RequestInterface
{
$new = clone $this;
$new->message = $this->message->withRequestTarget($requestTarget);

return $new;
}

public function getMethod(): string
{
return $this->message->getMethod();
}

public function withMethod(string $method): RequestInterface
{
$new = clone $this;
$new->message = $this->message->withMethod($method);

return $new;
}

public function getUri(): UriInterface
{
return $this->message->getUri();
}

public function withUri(UriInterface $uri, bool $preserveHost = false): RequestInterface
{
$new = clone $this;
$new->message = $this->message->withUri($uri, $preserveHost);

return $new;
}
}
<?php

namespace Http\Message\Decorator;

use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\StreamInterface;




trait MessageDecorator
{



private $message;







public function getMessage(): MessageInterface
{
return $this->message;
}

public function getProtocolVersion(): string
{
return $this->message->getProtocolVersion();
}

public function withProtocolVersion(string $version): MessageInterface
{
$new = clone $this;
$new->message = $this->message->withProtocolVersion($version);

return $new;
}

public function getHeaders(): array
{
return $this->message->getHeaders();
}

public function hasHeader(string $header): bool
{
return $this->message->hasHeader($header);
}

public function getHeader(string $header): array
{
return $this->message->getHeader($header);
}

public function getHeaderLine(string $header): string
{
return $this->message->getHeaderLine($header);
}

public function withHeader(string $header, $value): MessageInterface
{
$new = clone $this;
$new->message = $this->message->withHeader($header, $value);

return $new;
}

public function withAddedHeader(string $header, $value): MessageInterface
{
$new = clone $this;
$new->message = $this->message->withAddedHeader($header, $value);

return $new;
}

public function withoutHeader(string $header): MessageInterface
{
$new = clone $this;
$new->message = $this->message->withoutHeader($header);

return $new;
}

public function getBody(): StreamInterface
{
return $this->message->getBody();
}

public function withBody(StreamInterface $body): MessageInterface
{
$new = clone $this;
$new->message = $this->message->withBody($body);

return $new;
}
}
<?php

namespace Http\Message\Decorator;

use Psr\Http\Message\ResponseInterface;




trait ResponseDecorator
{
use MessageDecorator {
getMessage as getResponse;
}




public function withResponse(ResponseInterface $response): ResponseInterface
{
$new = clone $this;
$new->message = $response;

return $new;
}

public function getStatusCode(): int
{
return $this->message->getStatusCode();
}

public function withStatus(int $code, string $reasonPhrase = ''): ResponseInterface
{
$new = clone $this;
$new->message = $this->message->withStatus($code, $reasonPhrase);

return $new;
}

public function getReasonPhrase(): string
{
return $this->message->getReasonPhrase();
}
}
<?php

namespace Http\Message;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;











interface Formatter
{





public function formatRequest(RequestInterface $request);








public function formatResponse(ResponseInterface $response);
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class InflateStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
if (!extension_loaded('zlib')) {
throw new \RuntimeException('The zlib extension must be enabled to use this stream');
}

parent::__construct($stream, ['window' => -15]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => -15, 'level' => $level]);
}

protected function readFilter(): string
{
return 'zlib.inflate';
}

protected function writeFilter(): string
{
return 'zlib.deflate';
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class GzipEncodeStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
if (!extension_loaded('zlib')) {
throw new \RuntimeException('The zlib extension must be enabled to use this stream');
}

parent::__construct($stream, ['window' => 31, 'level' => $level]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => 31]);
}

protected function readFilter(): string
{
return 'zlib.deflate';
}

protected function writeFilter(): string
{
return 'zlib.inflate';
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class CompressStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
if (!extension_loaded('zlib')) {
throw new \RuntimeException('The zlib extension must be enabled to use this stream');
}

parent::__construct($stream, ['window' => 15, 'level' => $level]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => 15]);
}

protected function readFilter(): string
{
return 'zlib.deflate';
}

protected function writeFilter(): string
{
return 'zlib.inflate';
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class DecompressStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
if (!extension_loaded('zlib')) {
throw new \RuntimeException('The zlib extension must be enabled to use this stream');
}

parent::__construct($stream, ['window' => 15]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => 15, 'level' => $level]);
}

protected function readFilter(): string
{
return 'zlib.inflate';
}

protected function writeFilter(): string
{
return 'zlib.deflate';
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class DeflateStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
parent::__construct($stream, ['window' => -15, 'level' => $level]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => -15]);
}

protected function readFilter(): string
{
return 'zlib.deflate';
}

protected function writeFilter(): string
{
return 'zlib.inflate';
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Psr\Http\Message\StreamInterface;






class GzipDecodeStream extends FilteredStream
{



public function __construct(StreamInterface $stream, $level = -1)
{
if (!extension_loaded('zlib')) {
throw new \RuntimeException('The zlib extension must be enabled to use this stream');
}

parent::__construct($stream, ['window' => 31]);


$this->writeFilterCallback = Filter\fun($this->writeFilter(), ['window' => 31, 'level' => $level]);
}

protected function readFilter(): string
{
return 'zlib.inflate';
}

protected function writeFilter(): string
{
return 'zlib.deflate';
}
}
<?php

namespace Http\Message\Encoding;








class DechunkStream extends FilteredStream
{
protected function readFilter(): string
{
return 'dechunk';
}

protected function writeFilter(): string
{
return 'chunk';
}
}
<?php

namespace Http\Message\Encoding\Filter;






class Chunk extends \php_user_filter
{
public function filter($in, $out, &$consumed, $closing): int
{
while ($bucket = stream_bucket_make_writeable($in)) {
$lenbucket = stream_bucket_new($this->stream, dechex($bucket->datalen)."\r\n");
stream_bucket_append($out, $lenbucket);

$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);

$lenbucket = stream_bucket_new($this->stream, "\r\n");
stream_bucket_append($out, $lenbucket);
}

return PSFS_PASS_ON;
}
}
<?php

namespace Http\Message\Encoding;






class ChunkStream extends FilteredStream
{
protected function readFilter(): string
{
return 'chunk';
}

protected function writeFilter(): string
{
return 'dechunk';
}

protected function fill(): void
{
parent::fill();

if ($this->stream->eof()) {
$this->buffer .= "0\r\n\r\n";
}
}
}
<?php

namespace Http\Message\Encoding;

use Clue\StreamFilter as Filter;
use Http\Message\Decorator\StreamDecorator;
use Psr\Http\Message\StreamInterface;






abstract class FilteredStream implements StreamInterface
{
use StreamDecorator {
rewind as private doRewind;
seek as private doSeek;
}
public const BUFFER_SIZE = 8192;




protected $readFilterCallback;






protected $readFilter;






protected $writeFilterCallback;






protected $writeFilter;






protected $buffer = '';





public function __construct(StreamInterface $stream, $readFilterOptions = null, $writeFilterOptions = null)
{
if (null !== $readFilterOptions) {
$this->readFilterCallback = Filter\fun($this->readFilter(), $readFilterOptions);
} else {
$this->readFilterCallback = Filter\fun($this->readFilter());
}

if (null !== $writeFilterOptions) {
$this->writeFilterCallback = Filter\fun($this->writeFilter(), $writeFilterOptions);

@trigger_error('The $writeFilterOptions argument is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);
} else {
$this->writeFilterCallback = Filter\fun($this->writeFilter());
}

$this->stream = $stream;
}

public function read(int $length): string
{
if (strlen($this->buffer) >= $length) {
$read = substr($this->buffer, 0, $length);
$this->buffer = substr($this->buffer, $length);

return $read;
}

if ($this->stream->eof()) {
$buffer = $this->buffer;
$this->buffer = '';

return $buffer;
}

$read = $this->buffer;
$this->buffer = '';
$this->fill();

return $read.$this->read($length - strlen($read));
}

public function eof(): bool
{
return $this->stream->eof() && '' === $this->buffer;
}








protected function fill(): void
{
$readFilterCallback = $this->readFilterCallback;
$this->buffer .= $readFilterCallback($this->stream->read(self::BUFFER_SIZE));

if ($this->stream->eof()) {
$this->buffer .= $readFilterCallback();
}
}

public function getContents(): string
{
$buffer = '';

while (!$this->eof()) {
$buf = $this->read(self::BUFFER_SIZE);

if (null == $buf) {
break;
}

$buffer .= $buf;
}

return $buffer;
}




public function getSize(): ?int
{
return null;
}

public function __toString(): string
{
return $this->getContents();
}






public function isSeekable(): bool
{
return false;
}




public function rewind(): void
{
@trigger_error('Filtered streams are not seekable. This method will start raising an exception in the next major version', E_USER_DEPRECATED);
$this->doRewind();
}




public function seek(int $offset, int $whence = SEEK_SET): void
{
@trigger_error('Filtered streams are not seekable. This method will start raising an exception in the next major version', E_USER_DEPRECATED);
$this->doSeek($offset, $whence);
}






public function getReadFilter(): string
{
@trigger_error('The '.__CLASS__.'::'.__METHOD__.' method is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);

return $this->readFilter();
}




abstract protected function readFilter(): string;






public function getWriteFilter(): string
{
@trigger_error('The '.__CLASS__.'::'.__METHOD__.' method is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);

return $this->writeFilter();
}




abstract protected function writeFilter(): string;
}
<?php

namespace Http\Message;

use Psr\Http\Message\RequestInterface;










interface RequestMatcher
{







public function matches(RequestInterface $request);
}
<?php

namespace Http\Message;








final class Cookie
{



private $name;




private $value;




private $maxAge;




private $domain;




private $path;




private $secure;




private $httpOnly;






private $expires;













public function __construct(
$name,
$value = null,
$maxAge = null,
$domain = null,
$path = null,
$secure = false,
$httpOnly = false,
?\DateTime $expires = null
) {
$this->validateName($name);
$this->validateValue($value);
$this->validateMaxAge($maxAge);

$this->name = $name;
$this->value = $value;
$this->maxAge = $maxAge;
$this->expires = $expires;
$this->domain = $this->normalizeDomain($domain);
$this->path = $this->normalizePath($path);
$this->secure = (bool) $secure;
$this->httpOnly = (bool) $httpOnly;
}













public static function createWithoutValidation(
$name,
$value = null,
$maxAge = null,
$domain = null,
$path = null,
$secure = false,
$httpOnly = false,
?\DateTime $expires = null
) {
$cookie = new self('name', null, null, $domain, $path, $secure, $httpOnly, $expires);
$cookie->name = $name;
$cookie->value = $value;
$cookie->maxAge = $maxAge;

return $cookie;
}






public function getName()
{
return $this->name;
}






public function getValue()
{
return $this->value;
}






public function hasValue()
{
return isset($this->value);
}








public function withValue($value)
{
$this->validateValue($value);

$new = clone $this;
$new->value = $value;

return $new;
}






public function getMaxAge()
{
return $this->maxAge;
}






public function hasMaxAge()
{
return isset($this->maxAge);
}








public function withMaxAge($maxAge)
{
$this->validateMaxAge($maxAge);

$new = clone $this;
$new->maxAge = $maxAge;

return $new;
}






public function getExpires()
{
return $this->expires;
}






public function hasExpires()
{
return isset($this->expires);
}






public function withExpires(?\DateTime $expires = null)
{
$new = clone $this;
$new->expires = $expires;

return $new;
}






public function isExpired()
{
return isset($this->expires) and $this->expires < new \DateTime();
}






public function getDomain()
{
return $this->domain;
}






public function hasDomain()
{
return isset($this->domain);
}








public function withDomain($domain)
{
$new = clone $this;
$new->domain = $this->normalizeDomain($domain);

return $new;
}










public function matchDomain($domain)
{

if (!$this->hasDomain() || 0 === strcasecmp($domain, $this->domain)) {
return true;
}


if (filter_var($domain, FILTER_VALIDATE_IP)) {
return false;
}

return (bool) preg_match(sprintf('/\b%s$/i', preg_quote($this->domain)), $domain);
}






public function getPath()
{
return $this->path;
}








public function withPath($path)
{
$new = clone $this;
$new->path = $this->normalizePath($path);

return $new;
}










public function matchPath($path)
{
return $this->path === $path || (0 === strpos($path, rtrim($this->path, '/').'/'));
}






public function isSecure()
{
return $this->secure;
}








public function withSecure($secure)
{
$new = clone $this;
$new->secure = (bool) $secure;

return $new;
}






public function isHttpOnly()
{
return $this->httpOnly;
}








public function withHttpOnly($httpOnly)
{
$new = clone $this;
$new->httpOnly = (bool) $httpOnly;

return $new;
}








public function match(self $cookie)
{
return $this->name === $cookie->name && $this->domain === $cookie->domain and $this->path === $cookie->path;
}






public function isValid()
{
try {
$this->validateName($this->name);
$this->validateValue($this->value);
$this->validateMaxAge($this->maxAge);
} catch (\InvalidArgumentException $e) {
return false;
}

return true;
}










private function validateName($name)
{
if (strlen($name) < 1) {
throw new \InvalidArgumentException('The name cannot be empty');
}


if (preg_match('/[\x00-\x20\x22\x28-\x29\x2C\x2F\x3A-\x40\x5B-\x5D\x7B\x7D\x7F]/', $name)) {
throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name));
}
}










private function validateValue($value)
{
if (isset($value)) {
if (preg_match('/[^\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/', $value)) {
throw new \InvalidArgumentException(sprintf('The cookie value "%s" contains invalid characters.', $value));
}
}
}








private function validateMaxAge($maxAge)
{
if (isset($maxAge)) {
if (!is_int($maxAge)) {
throw new \InvalidArgumentException('Max-Age must be integer');
}
}
}












private function normalizeDomain($domain)
{
if (isset($domain)) {
$domain = ltrim(strtolower($domain), '.');
}

return $domain;
}











private function normalizePath($path)
{
if (null !== $path) {
$path = rtrim($path, '/');
}

if (empty($path) or '/' !== substr($path, 0, 1)) {
$path = '/';
}

return $path;
}
}
<?php

namespace Http\Message\Exception;

use Http\Message\Exception;

final class UnexpectedValueException extends \UnexpectedValueException implements Exception
{
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;






final class Bearer implements Authentication
{



private $token;




public function __construct($token)
{
$this->token = $token;
}

public function authenticate(RequestInterface $request)
{
$header = sprintf('Bearer %s', $this->token);

return $request->withHeader('Authorization', $header);
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Http\Message\RequestMatcher;
use Psr\Http\Message\RequestInterface;






final class RequestConditional implements Authentication
{



private $requestMatcher;




private $authentication;

public function __construct(RequestMatcher $requestMatcher, Authentication $authentication)
{
$this->requestMatcher = $requestMatcher;
$this->authentication = $authentication;
}

public function authenticate(RequestInterface $request)
{
if ($this->requestMatcher->matches($request)) {
return $this->authentication->authenticate($request);
}

return $request;
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;






final class Chain implements Authentication
{



private $authenticationChain = [];




public function __construct(array $authenticationChain = [])
{
foreach ($authenticationChain as $authentication) {
if (!$authentication instanceof Authentication) {
throw new \InvalidArgumentException(
'Members of the authentication chain must be of type Http\Message\Authentication'
);
}
}

$this->authenticationChain = $authenticationChain;
}

public function authenticate(RequestInterface $request)
{
foreach ($this->authenticationChain as $authentication) {
$request = $authentication->authenticate($request);
}

return $request;
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;






final class BasicAuth implements Authentication
{



private $username;




private $password;





public function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}

public function authenticate(RequestInterface $request)
{
$header = sprintf('Basic %s', base64_encode(sprintf('%s:%s', $this->username, $this->password)));

return $request->withHeader('Authorization', $header);
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;









final class QueryParam implements Authentication
{



private $params = [];

public function __construct(array $params)
{
$this->params = $params;
}

public function authenticate(RequestInterface $request)
{
$uri = $request->getUri();
$query = $uri->getQuery();
$params = [];

parse_str($query, $params);

$params = array_merge($params, $this->params);

$query = http_build_query($params, '', '&');

$uri = $uri->withQuery($query);

return $request->withUri($uri);
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;

class Header implements Authentication
{



private $name;




private $value;




public function __construct(string $name, $value)
{
$this->name = $name;
$this->value = $value;
}

public function authenticate(RequestInterface $request)
{
return $request->withHeader($this->name, $this->value);
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Http\Message\RequestMatcher\CallbackRequestMatcher;
use Psr\Http\Message\RequestInterface;

@trigger_error('The '.__NAMESPACE__.'\Matching class is deprecated since version 1.2 and will be removed in 2.0. Use Http\Message\Authentication\RequestConditional instead.', E_USER_DEPRECATED);








final class Matching implements Authentication
{



private $authentication;




private $matcher;

public function __construct(Authentication $authentication, ?callable $matcher = null)
{
if (is_null($matcher)) {
$matcher = function () {
return true;
};
}

$this->authentication = $authentication;
$this->matcher = new CallbackRequestMatcher($matcher);
}

public function authenticate(RequestInterface $request)
{
if ($this->matcher->matches($request)) {
return $this->authentication->authenticate($request);
}

return $request;
}








public static function createUrlMatcher(Authentication $authentication, $url)
{
$matcher = function (RequestInterface $request) use ($url) {
return preg_match($url, $request->getRequestTarget());
};

return new static($authentication, $matcher);
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;






final class AutoBasicAuth implements Authentication
{





private $shouldRemoveUserInfo;




public function __construct($shouldRremoveUserInfo = true)
{
$this->shouldRemoveUserInfo = (bool) $shouldRremoveUserInfo;
}

public function authenticate(RequestInterface $request)
{
$uri = $request->getUri();
$userInfo = $uri->getUserInfo();

if (!empty($userInfo)) {
if ($this->shouldRemoveUserInfo) {
$request = $request->withUri($uri->withUserInfo(''));
}

$request = $request->withHeader('Authorization', sprintf('Basic %s', base64_encode($userInfo)));
}

return $request;
}
}
<?php

namespace Http\Message\Authentication;

use Http\Message\Authentication;
use Psr\Http\Message\RequestInterface;






final class Wsse implements Authentication
{



private $username;




private $password;




private $hashAlgorithm;






public function __construct($username, $password, $hashAlgorithm = 'sha1')
{
$this->username = $username;
$this->password = $password;
if (false === in_array($hashAlgorithm, hash_algos())) {
throw new \InvalidArgumentException(sprintf('Unaccepted hashing algorithm: %s', $hashAlgorithm));
}
$this->hashAlgorithm = $hashAlgorithm;
}

public function authenticate(RequestInterface $request)
{
$nonce = substr(md5(uniqid(uniqid().'_', true)), 0, 16);
$created = date('c');
$digest = base64_encode(hash($this->hashAlgorithm, base64_decode($nonce).$created.$this->password, true));

$wsse = sprintf(
'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"',
$this->username,
$digest,
$nonce,
$created
);

return $request
->withHeader('Authorization', 'WSSE profile="UsernameToken"')
->withHeader('X-WSSE', $wsse)
;
}
}
<?php

namespace Http\Message\UriFactory;

use GuzzleHttp\Psr7\Utils;
use Http\Message\UriFactory;

use function GuzzleHttp\Psr7\uri_for;

if (!interface_exists(UriFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\GuzzleUriFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class GuzzleUriFactory implements UriFactory
{
public function createUri($uri)
{
if (class_exists(Utils::class)) {
return Utils::uriFor($uri);
}

return uri_for($uri);
}
}
<?php

namespace Http\Message\UriFactory;

use Http\Message\UriFactory;
use Psr\Http\Message\UriInterface;
use Slim\Http\Uri;

if (!interface_exists(UriFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\SlimUriFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class SlimUriFactory implements UriFactory
{
public function createUri($uri)
{
if ($uri instanceof UriInterface) {
return $uri;
}

if (is_string($uri)) {
return Uri::createFromString($uri);
}

throw new \InvalidArgumentException('URI must be a string or UriInterface');
}
}
<?php

namespace Http\Message\UriFactory;

use Http\Message\UriFactory;
use Laminas\Diactoros\Uri as LaminasUri;
use Psr\Http\Message\UriInterface;
use Zend\Diactoros\Uri as ZendUri;

if (!interface_exists(UriFactory::class)) {
throw new \LogicException('You cannot use "Http\Message\MessageFactory\DiactorosUriFactory" as the "php-http/message-factory" package is not installed. Try running "composer require php-http/message-factory". Note that this package is deprecated, use "psr/http-factory" instead');
}








final class DiactorosUriFactory implements UriFactory
{
public function createUri($uri)
{
if ($uri instanceof UriInterface) {
return $uri;
} elseif (is_string($uri)) {
if (class_exists(LaminasUri::class)) {
return new LaminasUri($uri);
}

return new ZendUri($uri);
}

throw new \InvalidArgumentException('URI must be a string or UriInterface');
}
}
<?php

namespace Http\Message\Formatter;

use Http\Message\Formatter;
use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






class FullHttpMessageFormatter implements Formatter
{





private $maxBodyLength;




private $binaryDetectionRegex;





public function __construct($maxBodyLength = 1000, string $binaryDetectionRegex = '/([\x00-\x09\x0C\x0E-\x1F\x7F])/')
{
$this->maxBodyLength = $maxBodyLength;
$this->binaryDetectionRegex = $binaryDetectionRegex;
}

public function formatRequest(RequestInterface $request)
{
$message = sprintf(
"%s %s HTTP/%s\n",
$request->getMethod(),
$request->getRequestTarget(),
$request->getProtocolVersion()
);

foreach ($request->getHeaders() as $name => $values) {
$message .= $name.': '.implode(', ', $values)."\n";
}

return $this->addBody($request, $message);
}

public function formatResponse(ResponseInterface $response)
{
$message = sprintf(
"HTTP/%s %s %s\n",
$response->getProtocolVersion(),
$response->getStatusCode(),
$response->getReasonPhrase()
);

foreach ($response->getHeaders() as $name => $values) {
$message .= $name.': '.implode(', ', $values)."\n";
}

return $this->addBody($response, $message);
}






public function formatResponseForRequest(ResponseInterface $response, RequestInterface $request)
{
return $this->formatResponse($response);
}








private function addBody(MessageInterface $request, $message)
{
$message .= "\n";
$stream = $request->getBody();
if (!$stream->isSeekable() || 0 === $this->maxBodyLength) {

return $message;
}

$data = $stream->__toString();
$stream->rewind();

if (preg_match($this->binaryDetectionRegex, $data)) {
return $message.'[binary stream omitted]';
}

if (null === $this->maxBodyLength) {
return $message.$data;
}

return $message.mb_substr($data, 0, $this->maxBodyLength);
}
}
<?php

namespace Http\Message\Formatter;

use Http\Message\Formatter;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;







class SimpleFormatter implements Formatter
{
public function formatRequest(RequestInterface $request)
{
return sprintf(
'%s %s %s',
$request->getMethod(),
$request->getUri()->__toString(),
$request->getProtocolVersion()
);
}

public function formatResponse(ResponseInterface $response)
{
return sprintf(
'%s %s %s',
$response->getStatusCode(),
$response->getReasonPhrase(),
$response->getProtocolVersion()
);
}






public function formatResponseForRequest(ResponseInterface $response, RequestInterface $request)
{
return $this->formatResponse($response);
}
}
<?php

namespace Http\Message\Formatter;

use Http\Message\Formatter;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






class CurlCommandFormatter implements Formatter
{
public function formatRequest(RequestInterface $request)
{
$command = sprintf('curl %s', escapeshellarg((string) $request->getUri()->withFragment('')));
if ('1.0' === $request->getProtocolVersion()) {
$command .= ' --http1.0';
} elseif ('2.0' === $request->getProtocolVersion()) {
$command .= ' --http2';
}

$method = strtoupper($request->getMethod());
if ('HEAD' === $method) {
$command .= ' --head';
} elseif ('GET' !== $method) {
$command .= ' --request '.$method;
}

$command .= $this->getHeadersAsCommandOptions($request);

$body = $request->getBody();
if ($body->getSize() > 0) {

if ($body->getSize() > 8192) {
$data = '[too long stream omitted]';
} elseif ($body->isSeekable()) {
$data = $body->__toString();
$body->rewind();

if (preg_match('/([\x00-\x09\x0C\x0E-\x1F\x7F])/', $data)) {
$data = '[binary stream omitted]';
}
} else {
$data = '[non-seekable stream omitted]';
}
$escapedData = @escapeshellarg($data);
if (empty($escapedData)) {
$escapedData = 'We couldn\'t not escape the data properly';
}

$command .= sprintf(' --data %s', $escapedData);
}

return $command;
}

public function formatResponse(ResponseInterface $response)
{
return '';
}






public function formatResponseForRequest(ResponseInterface $response, RequestInterface $request)
{
return $this->formatResponse($response);
}




private function getHeadersAsCommandOptions(RequestInterface $request)
{
$command = '';
foreach ($request->getHeaders() as $name => $values) {
if ('host' === strtolower($name) && $values[0] === $request->getUri()->getHost()) {
continue;
}

if ('user-agent' === strtolower($name)) {
$command .= sprintf(' -A %s', escapeshellarg($values[0]));

continue;
}

$command .= sprintf(' -H %s', escapeshellarg($name.': '.$request->getHeaderLine($name)));
}

return $command;
}
}
<?php

namespace Http\Message;

use Psr\Http\Message\RequestInterface;






interface Authentication
{










public function authenticate(RequestInterface $request);
}
<?php

namespace Http\Message\RequestMatcher;

use Http\Message\RequestMatcher;
use Psr\Http\Message\RequestInterface;

@trigger_error('The '.__NAMESPACE__.'\RegexRequestMatcher class is deprecated since version 1.2 and will be removed in 2.0. Use Http\Message\RequestMatcher\RequestMatcher instead.', E_USER_DEPRECATED);








final class RegexRequestMatcher implements RequestMatcher
{





private $regex;




public function __construct($regex)
{
$this->regex = $regex;
}

public function matches(RequestInterface $request)
{
return (bool) preg_match($this->regex, (string) $request->getUri());
}
}
<?php

namespace Http\Message\RequestMatcher;

use Http\Message\RequestMatcher as RequestMatcherInterface;
use Psr\Http\Message\RequestInterface;







final class RequestMatcher implements RequestMatcherInterface
{



private $path;




private $host;




private $methods = [];




private $schemes = [];










public function __construct($path = null, $host = null, $methods = [], $schemes = [])
{
$this->path = $path;
$this->host = $host;
$this->methods = array_map('strtoupper', (array) $methods);
$this->schemes = array_map('strtolower', (array) $schemes);
}




public function matches(RequestInterface $request)
{
if ($this->schemes && !in_array($request->getUri()->getScheme(), $this->schemes)) {
return false;
}

if ($this->methods && !in_array($request->getMethod(), $this->methods)) {
return false;
}

if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getUri()->getPath()))) {
return false;
}

if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getUri()->getHost())) {
return false;
}

return true;
}
}
<?php

namespace Http\Message\RequestMatcher;

use Http\Message\RequestMatcher;
use Psr\Http\Message\RequestInterface;






final class CallbackRequestMatcher implements RequestMatcher
{



private $callback;

public function __construct(callable $callback)
{
$this->callback = $callback;
}

public function matches(RequestInterface $request)
{
return (bool) call_user_func($this->callback, $request);
}
}
source:
    - src/

destination: build/api/

templateTheme: bootstrap
Copyright (c) 2015-2016 PHP HTTP Team <team@php-http.org>

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.
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;







trait VersionBridgeClient
{
abstract protected function doSendRequest(RequestInterface $request);

public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->doSendRequest($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






trait HttpClientDecorator
{



protected $httpClient;




public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->httpClient->sendRequest($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Psr\Http\Client\ClientInterface;






final class PluginClientBuilder
{

private $plugins = [];


private $options = [];




public function addPlugin(Plugin $plugin, int $priority = 0): self
{
$this->plugins[$priority][] = $plugin;

return $this;
}




public function setOption(string $name, $value): self
{
$this->options[$name] = $value;

return $this;
}

public function removeOption(string $name): self
{
unset($this->options[$name]);

return $this;
}




public function createClient($client): PluginClient
{
if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::createClient(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

$plugins = $this->plugins;

if (0 === count($plugins)) {
$plugins[] = [];
}

krsort($plugins);
$plugins = array_merge(...$plugins);

return new PluginClient(
$client,
array_values($plugins),
$this->options
);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Psr\Http\Client\ClientInterface;







final class PluginClientFactory
{



private static $factory;












public static function setFactory(callable $factory): void
{
static::$factory = $factory;
}












public function createClient($client, array $plugins = [], array $options = []): PluginClient
{
if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::createClient(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

if (static::$factory) {
$factory = static::$factory;

return $factory($client, $plugins, $options);
}

unset($options['client_name']);

return new PluginClient($client, $plugins, $options);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\HttpClientPool;

use Http\Client\Common\Exception\HttpClientNotFoundException;






final class RandomClientPool extends HttpClientPool
{
protected function chooseHttpClient(): HttpClientPoolItem
{
$clientPool = array_filter($this->clientPool, function (HttpClientPoolItem $clientPoolItem) {
return !$clientPoolItem->isDisabled();
});

if (0 === count($clientPool)) {
throw new HttpClientNotFoundException('Cannot choose a http client as there is no one present in the pool');
}

return $clientPool[array_rand($clientPool)];
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\HttpClientPool;

use Http\Client\Common\Exception\HttpClientNotFoundException;








final class LeastUsedClientPool extends HttpClientPool
{
protected function chooseHttpClient(): HttpClientPoolItem
{
$clientPool = array_filter($this->clientPool, function (HttpClientPoolItem $clientPoolItem) {
return !$clientPoolItem->isDisabled();
});

if (0 === count($clientPool)) {
throw new HttpClientNotFoundException('Cannot choose a http client as there is no one present in the pool');
}

usort($clientPool, function (HttpClientPoolItem $clientA, HttpClientPoolItem $clientB) {
if ($clientA->getSendingRequestCount() === $clientB->getSendingRequestCount()) {
return 0;
}

if ($clientA->getSendingRequestCount() < $clientB->getSendingRequestCount()) {
return -1;
}

return 1;
});

return reset($clientPool);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\HttpClientPool;

use Http\Client\Common\Exception\HttpClientNotFoundException;






final class RoundRobinClientPool extends HttpClientPool
{
protected function chooseHttpClient(): HttpClientPoolItem
{
$last = current($this->clientPool);

do {
$client = next($this->clientPool);

if (false === $client) {
$client = reset($this->clientPool);

if (false === $client) {
throw new HttpClientNotFoundException('Cannot choose a http client as there is no one present in the pool');
}
}


if ($last === $client && $client->isDisabled()) {
throw new HttpClientNotFoundException('Cannot choose a http client as there is no one enabled in the pool');
}
} while ($client->isDisabled());

return $client;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\HttpClientPool;

use Http\Client\Common\FlexibleHttpClient;
use Http\Client\Exception;
use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
















class HttpClientPoolItem implements HttpClient, HttpAsyncClient
{



private $sendingRequestCount = 0;




private $disabledAt;








private $reenableAfter;




private $client;





public function __construct($client, ?int $reenableAfter = null)
{
if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::__construct(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

$this->client = new FlexibleHttpClient($client);
$this->reenableAfter = $reenableAfter;
}

public function sendRequest(RequestInterface $request): ResponseInterface
{
if ($this->isDisabled()) {
throw new Exception\RequestException('Cannot send the request as this client has been disabled', $request);
}

try {
$this->incrementRequestCount();
$response = $this->client->sendRequest($request);
$this->decrementRequestCount();
} catch (Exception $e) {
$this->disable();
$this->decrementRequestCount();

throw $e;
}

return $response;
}

public function sendAsyncRequest(RequestInterface $request)
{
if ($this->isDisabled()) {
throw new Exception\RequestException('Cannot send the request as this client has been disabled', $request);
}

$this->incrementRequestCount();

return $this->client->sendAsyncRequest($request)->then(function ($response) {
$this->decrementRequestCount();

return $response;
}, function ($exception) {
$this->disable();
$this->decrementRequestCount();

throw $exception;
});
}







public function isDisabled(): bool
{
if (null !== $this->reenableAfter && null !== $this->disabledAt) {

$now = new \DateTime();

if (($now->getTimestamp() - $this->disabledAt->getTimestamp()) >= $this->reenableAfter) {
$this->enable();

return false;
}

return true;
}

return null !== $this->disabledAt;
}




public function getSendingRequestCount(): int
{
return $this->sendingRequestCount;
}




private function incrementRequestCount(): void
{
++$this->sendingRequestCount;
}




private function decrementRequestCount(): void
{
--$this->sendingRequestCount;
}




private function enable(): void
{
$this->disabledAt = null;
}




private function disable(): void
{
$this->disabledAt = new \DateTime('now');
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\HttpClientPool;

use Http\Client\Common\Exception\HttpClientNotFoundException;
use Http\Client\Common\HttpClientPool as HttpClientPoolInterface;
use Http\Client\HttpAsyncClient;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;





abstract class HttpClientPool implements HttpClientPoolInterface
{



protected $clientPool = [];






public function addHttpClient($client): void
{

if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::addHttpClient(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

if (!$client instanceof HttpClientPoolItem) {
$client = new HttpClientPoolItem($client);
}

$this->clientPool[] = $client;
}








abstract protected function chooseHttpClient(): HttpClientPoolItem;

public function sendAsyncRequest(RequestInterface $request)
{
return $this->chooseHttpClient()->sendAsyncRequest($request);
}

public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->chooseHttpClient()->sendRequest($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






trait HttpClientEmulator
{



public function sendRequest(RequestInterface $request): ResponseInterface
{
$promise = $this->sendAsyncRequest($request);

return $promise->wait();
}




abstract public function sendAsyncRequest(RequestInterface $request);
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Message\RequestFactory;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;

final class HttpMethodsClient implements HttpMethodsClientInterface
{



private $httpClient;




private $requestFactory;




private $streamFactory;




public function __construct(ClientInterface $httpClient, $requestFactory, ?StreamFactoryInterface $streamFactory = null)
{
if (!$requestFactory instanceof RequestFactory && !$requestFactory instanceof RequestFactoryInterface) {
throw new \TypeError(
sprintf('%s::__construct(): Argument #2 ($requestFactory) must be of type %s|%s, %s given', self::class, RequestFactory::class, RequestFactoryInterface::class, get_debug_type($requestFactory))
);
}

if (!$requestFactory instanceof RequestFactory && null === $streamFactory) {
@trigger_error(sprintf('Passing a %s without a %s to %s::__construct() is deprecated as of version 2.3 and will be disallowed in version 3.0. A stream factory is required to create a request with a non-empty string body.', RequestFactoryInterface::class, StreamFactoryInterface::class, self::class));
}

$this->httpClient = $httpClient;
$this->requestFactory = $requestFactory;
$this->streamFactory = $streamFactory;
}

public function get($uri, array $headers = []): ResponseInterface
{
return $this->send('GET', $uri, $headers, null);
}

public function head($uri, array $headers = []): ResponseInterface
{
return $this->send('HEAD', $uri, $headers, null);
}

public function trace($uri, array $headers = []): ResponseInterface
{
return $this->send('TRACE', $uri, $headers, null);
}

public function post($uri, array $headers = [], $body = null): ResponseInterface
{
return $this->send('POST', $uri, $headers, $body);
}

public function put($uri, array $headers = [], $body = null): ResponseInterface
{
return $this->send('PUT', $uri, $headers, $body);
}

public function patch($uri, array $headers = [], $body = null): ResponseInterface
{
return $this->send('PATCH', $uri, $headers, $body);
}

public function delete($uri, array $headers = [], $body = null): ResponseInterface
{
return $this->send('DELETE', $uri, $headers, $body);
}

public function options($uri, array $headers = [], $body = null): ResponseInterface
{
return $this->send('OPTIONS', $uri, $headers, $body);
}

public function send(string $method, $uri, array $headers = [], $body = null): ResponseInterface
{
if (!is_string($uri) && !$uri instanceof UriInterface) {
throw new \TypeError(
sprintf('%s::send(): Argument #2 ($uri) must be of type string|%s, %s given', self::class, UriInterface::class, get_debug_type($uri))
);
}

if (!is_string($body) && !$body instanceof StreamInterface && null !== $body) {
throw new \TypeError(
sprintf('%s::send(): Argument #4 ($body) must be of type string|%s|null, %s given', self::class, StreamInterface::class, get_debug_type($body))
);
}

return $this->sendRequest(
self::createRequest($method, $uri, $headers, $body)
);
}





private function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
{
if ($this->requestFactory instanceof RequestFactory) {
return $this->requestFactory->createRequest(
$method,
$uri,
$headers,
$body
);
}

$request = $this->requestFactory->createRequest($method, $uri);

foreach ($headers as $key => $value) {
$request = $request->withHeader($key, $value);
}

if (null !== $body && '' !== $body) {
if (null === $this->streamFactory) {
throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
}

$request = $request->withBody(
is_string($body) ? $this->streamFactory->createStream($body) : $body
);
}

return $request;
}

public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->httpClient->sendRequest($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Promise\Promise;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\ResponseInterface;




final class Deferred implements Promise
{



private $value;




private $failure;




private $state;




private $waitCallback;




private $onFulfilledCallbacks;




private $onRejectedCallbacks;

public function __construct(callable $waitCallback)
{
$this->waitCallback = $waitCallback;
$this->state = Promise::PENDING;
$this->onFulfilledCallbacks = [];
$this->onRejectedCallbacks = [];
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null): Promise
{
$deferred = new self($this->waitCallback);

$this->onFulfilledCallbacks[] = function (ResponseInterface $response) use ($onFulfilled, $deferred) {
try {
if (null !== $onFulfilled) {
$response = $onFulfilled($response);
}
$deferred->resolve($response);
} catch (ClientExceptionInterface $exception) {
$deferred->reject($exception);
}
};

$this->onRejectedCallbacks[] = function (ClientExceptionInterface $exception) use ($onRejected, $deferred) {
try {
if (null !== $onRejected) {
$response = $onRejected($exception);
$deferred->resolve($response);

return;
}
$deferred->reject($exception);
} catch (ClientExceptionInterface $newException) {
$deferred->reject($newException);
}
};

return $deferred;
}

public function getState(): string
{
return $this->state;
}




public function resolve(ResponseInterface $response): void
{
if (Promise::PENDING !== $this->state) {
return;
}

$this->value = $response;
$this->state = Promise::FULFILLED;

foreach ($this->onFulfilledCallbacks as $onFulfilledCallback) {
$onFulfilledCallback($response);
}
}




public function reject(ClientExceptionInterface $exception): void
{
if (Promise::PENDING !== $this->state) {
return;
}

$this->failure = $exception;
$this->state = Promise::REJECTED;

foreach ($this->onRejectedCallbacks as $onRejectedCallback) {
$onRejectedCallback($exception);
}
}

public function wait($unwrap = true)
{
if (Promise::PENDING === $this->state) {
$callback = $this->waitCallback;
$callback();
}

if (!$unwrap) {
return null;
}

if (Promise::FULFILLED === $this->state) {
return $this->value;
}

if (null === $this->failure) {
throw new \RuntimeException('Internal Error: Promise is not fulfilled but has no exception stored');
}

throw $this->failure;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Common\Exception\BatchException;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Client\ClientInterface;

final class BatchClient implements BatchClientInterface
{



private $client;

public function __construct(ClientInterface $client)
{
$this->client = $client;
}

public function sendRequests(array $requests): BatchResult
{
$batchResult = new BatchResult();

foreach ($requests as $request) {
try {
$response = $this->client->sendRequest($request);
$batchResult = $batchResult->addResponse($request, $response);
} catch (ClientExceptionInterface $e) {
$batchResult = $batchResult->addException($request, $e);
}
}

if ($batchResult->hasExceptions()) {
throw new BatchException($batchResult);
}

return $batchResult;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Http\Message\RequestMatcher;
use Psr\Http\Client\ClientInterface;








interface HttpClientRouterInterface extends HttpClient, HttpAsyncClient
{





public function addClient($client, RequestMatcher $requestMatcher): void;
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Psr\Http\Client\ClientInterface;







final class FlexibleHttpClient implements HttpClient, HttpAsyncClient
{
use HttpClientDecorator;
use HttpAsyncClientDecorator;




public function __construct($client)
{
if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::__construct(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

$this->httpClient = $client instanceof ClientInterface ? $client : new EmulatedHttpClient($client);
$this->httpAsyncClient = $client instanceof HttpAsyncClient ? $client : new EmulatedHttpAsyncClient($client);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Exception;
use Http\Client\HttpClient;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;















interface HttpMethodsClientInterface extends HttpClient
{







public function get($uri, array $headers = []): ResponseInterface;








public function head($uri, array $headers = []): ResponseInterface;








public function trace($uri, array $headers = []): ResponseInterface;









public function post($uri, array $headers = [], $body = null): ResponseInterface;









public function put($uri, array $headers = [], $body = null): ResponseInterface;









public function patch($uri, array $headers = [], $body = null): ResponseInterface;









public function delete($uri, array $headers = [], $body = null): ResponseInterface;









public function options($uri, array $headers = [], $body = null): ResponseInterface;










public function send(string $method, $uri, array $headers = [], $body = null): ResponseInterface;
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






final class BatchResult
{



private $responses;




private $exceptions;

public function __construct()
{
$this->responses = new \SplObjectStorage();
$this->exceptions = new \SplObjectStorage();
}




public function hasResponses(): bool
{
return $this->responses->count() > 0;
}






public function getResponses(): array
{
$responses = [];

foreach ($this->responses as $request) {
$responses[] = $this->responses[$request];
}

return $responses;
}




public function isSuccessful(RequestInterface $request): bool
{
return $this->responses->contains($request);
}






public function getResponseFor(RequestInterface $request): ResponseInterface
{
try {
return $this->responses[$request];
} catch (\UnexpectedValueException $e) {
throw new \UnexpectedValueException('Request not found', $e->getCode(), $e);
}
}






public function addResponse(RequestInterface $request, ResponseInterface $response): self
{
$new = clone $this;
$new->responses->attach($request, $response);

return $new;
}




public function hasExceptions(): bool
{
return $this->exceptions->count() > 0;
}






public function getExceptions(): array
{
$exceptions = [];

foreach ($this->exceptions as $request) {
$exceptions[] = $this->exceptions[$request];
}

return $exceptions;
}




public function isFailed(RequestInterface $request): bool
{
return $this->exceptions->contains($request);
}






public function getExceptionFor(RequestInterface $request): ClientExceptionInterface
{
try {
return $this->exceptions[$request];
} catch (\UnexpectedValueException $e) {
throw new \UnexpectedValueException('Request not found', $e->getCode(), $e);
}
}






public function addException(RequestInterface $request, ClientExceptionInterface $exception): self
{
$new = clone $this;
$new->exceptions->attach($request, $exception);

return $new;
}

public function __clone()
{
$this->responses = clone $this->responses;
$this->exceptions = clone $this->exceptions;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






final class HeaderRemovePlugin implements Plugin
{



private $headers = [];




public function __construct(array $headers)
{
$this->headers = $headers;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
foreach ($this->headers as $header) {
if ($request->hasHeader($header)) {
$request = $request->withoutHeader($header);
}
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Message\Encoding;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;










final class DecoderPlugin implements Plugin
{





private $useContentEncoding;







public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'use_content_encoding' => true,
]);
$resolver->setAllowedTypes('use_content_encoding', 'bool');
$options = $resolver->resolve($config);

$this->useContentEncoding = $options['use_content_encoding'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$encodings = extension_loaded('zlib') ? ['gzip', 'deflate'] : ['identity'];

if ($this->useContentEncoding) {
$request = $request->withHeader('Accept-Encoding', $encodings);
}
$encodings[] = 'chunked';
$request = $request->withHeader('TE', $encodings);

return $next($request)->then(function (ResponseInterface $response) {
return $this->decodeResponse($response);
});
}




private function decodeResponse(ResponseInterface $response): ResponseInterface
{
$response = $this->decodeOnEncodingHeader('Transfer-Encoding', $response);

if ($this->useContentEncoding) {
$response = $this->decodeOnEncodingHeader('Content-Encoding', $response);
}

return $response;
}




private function decodeOnEncodingHeader(string $headerName, ResponseInterface $response): ResponseInterface
{
if ($response->hasHeader($headerName)) {
$encodings = $response->getHeader($headerName);
$newEncodings = [];

while ($encoding = array_pop($encodings)) {
$stream = $this->decorateStream($encoding, $response->getBody());

if (false === $stream) {
array_unshift($newEncodings, $encoding);

continue;
}

$response = $response->withBody($stream);
}

if (\count($newEncodings) > 0) {
$response = $response->withHeader($headerName, $newEncodings);
} else {
$response = $response->withoutHeader($headerName);
}
}

return $response;
}






private function decorateStream(string $encoding, StreamInterface $stream)
{
if ('chunked' === strtolower($encoding)) {
return new Encoding\DechunkStream($stream);
}

if ('deflate' === strtolower($encoding)) {
return new Encoding\DecompressStream($stream);
}

if ('gzip' === strtolower($encoding)) {
return new Encoding\GzipDecodeStream($stream);
}

return false;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;






final class AddPathPlugin implements Plugin
{



private $uri;

public function __construct(UriInterface $uri)
{
if ('' === $uri->getPath()) {
throw new \LogicException('URI path cannot be empty');
}

if ('/' === substr($uri->getPath(), -1)) {
$uri = $uri->withPath(rtrim($uri->getPath(), '/'));
}

$this->uri = $uri;
}





























public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$prepend = $this->uri->getPath();
$path = $request->getUri()->getPath();

if (substr($path, 0, strlen($prepend)) !== $prepend) {
$request = $request->withUri($request->getUri()
->withPath($prepend.$path)
);
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;








final class HeaderSetPlugin implements Plugin
{



private $headers;




public function __construct(array $headers)
{
$this->headers = $headers;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
foreach ($this->headers as $header => $headerValue) {
$request = $request->withHeader($header, $headerValue);
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;












final class HeaderAppendPlugin implements Plugin
{



private $headers;




public function __construct(array $headers)
{
$this->headers = $headers;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
foreach ($this->headers as $header => $headerValue) {
$request = $request->withAddedHeader($header, $headerValue);
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






interface Journal
{






public function addSuccess(RequestInterface $request, ResponseInterface $response);







public function addFailure(RequestInterface $request, ClientExceptionInterface $exception);
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;








final class QueryDefaultsPlugin implements Plugin
{



private $queryParams = [];





public function __construct(array $queryParams)
{
$this->queryParams = $queryParams;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$uri = $request->getUri();

parse_str($uri->getQuery(), $query);
$query += $this->queryParams;

$request = $request->withUri(
$uri->withQuery(http_build_query($query))
);

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;







trait VersionBridgePlugin
{
abstract protected function doHandleRequest(RequestInterface $request, callable $next, callable $first);

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
return $this->doHandleRequest($request, $next, $first);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Message\Authentication;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






final class AuthenticationPlugin implements Plugin
{



private $authentication;

public function __construct(Authentication $authentication)
{
$this->authentication = $authentication;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$request = $this->authentication->authenticate($request);

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Exception\ClientErrorException;
use Http\Client\Common\Exception\ServerErrorException;
use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
















final class ErrorPlugin implements Plugin
{





private $onlyServerException;







public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'only_server_exception' => false,
]);
$resolver->setAllowedTypes('only_server_exception', 'bool');
$options = $resolver->resolve($config);

$this->onlyServerException = $options['only_server_exception'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$promise = $next($request);

return $promise->then(function (ResponseInterface $response) use ($request) {
return $this->transformResponseToException($request, $response);
});
}












private function transformResponseToException(RequestInterface $request, ResponseInterface $response): ResponseInterface
{
if (!$this->onlyServerException && $response->getStatusCode() >= 400 && $response->getStatusCode() < 500) {
throw new ClientErrorException($response->getReasonPhrase(), $request, $response);
}

if ($response->getStatusCode() >= 500 && $response->getStatusCode() < 600) {
throw new ServerErrorException($response->getReasonPhrase(), $request, $response);
}

return $response;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;






final class BaseUriPlugin implements Plugin
{



private $addHostPlugin;




private $addPathPlugin;





public function __construct(UriInterface $uri, array $hostConfig = [])
{
$this->addHostPlugin = new AddHostPlugin($uri, $hostConfig);

if (rtrim($uri->getPath(), '/')) {
$this->addPathPlugin = new AddPathPlugin($uri);
}
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$addHostNext = function (RequestInterface $request) use ($next, $first) {
return $this->addHostPlugin->handleRequest($request, $next, $first);
};

if ($this->addPathPlugin) {
return $this->addPathPlugin->handleRequest($request, $addHostNext, $first);
}

return $addHostNext($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;






final class AddHostPlugin implements Plugin
{



private $host;




private $replace;







public function __construct(UriInterface $host, array $config = [])
{
if ('' === $host->getHost()) {
throw new \LogicException('Host can not be empty');
}

$this->host = $host;

$resolver = new OptionsResolver();
$this->configureOptions($resolver);
$options = $resolver->resolve($config);

$this->replace = $options['replace'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
if ($this->replace || '' === $request->getUri()->getHost()) {
$uri = $request->getUri()
->withHost($this->host->getHost())
->withScheme($this->host->getScheme())
->withPort($this->host->getPort())
;

$request = $request->withUri($uri);
}

return $next($request);
}

private function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'replace' => false,
]);
$resolver->setAllowedTypes('replace', 'bool');
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Client\Exception\HttpException;
use Http\Promise\Promise;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;








final class RetryPlugin implements Plugin
{





private $retry;




private $errorResponseDelay;




private $errorResponseDecider;




private $exceptionDecider;




private $exceptionDelay;






private $retryStorage = [];











public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'retries' => 1,
'error_response_decider' => function (RequestInterface $request, ResponseInterface $response) {

return $response->getStatusCode() >= 500 && $response->getStatusCode() < 600;
},
'exception_decider' => function (RequestInterface $request, ClientExceptionInterface $e) {

return !$e instanceof HttpException || $e->getCode() >= 500 && $e->getCode() < 600;
},
'error_response_delay' => __CLASS__.'::defaultErrorResponseDelay',
'exception_delay' => __CLASS__.'::defaultExceptionDelay',
]);

$resolver->setAllowedTypes('retries', 'int');
$resolver->setAllowedTypes('error_response_decider', 'callable');
$resolver->setAllowedTypes('exception_decider', 'callable');
$resolver->setAllowedTypes('error_response_delay', 'callable');
$resolver->setAllowedTypes('exception_delay', 'callable');
$options = $resolver->resolve($config);

$this->retry = $options['retries'];
$this->errorResponseDecider = $options['error_response_decider'];
$this->errorResponseDelay = $options['error_response_delay'];
$this->exceptionDecider = $options['exception_decider'];
$this->exceptionDelay = $options['exception_delay'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$chainIdentifier = spl_object_hash((object) $first);

return $next($request)->then(function (ResponseInterface $response) use ($request, $next, $first, $chainIdentifier) {
if (!array_key_exists($chainIdentifier, $this->retryStorage)) {
$this->retryStorage[$chainIdentifier] = 0;
}

if ($this->retryStorage[$chainIdentifier] >= $this->retry) {
unset($this->retryStorage[$chainIdentifier]);

return $response;
}

if (call_user_func($this->errorResponseDecider, $request, $response)) {

$time = call_user_func($this->errorResponseDelay, $request, $response, $this->retryStorage[$chainIdentifier]);
$response = $this->retry($request, $next, $first, $chainIdentifier, $time);
}

if (array_key_exists($chainIdentifier, $this->retryStorage)) {
unset($this->retryStorage[$chainIdentifier]);
}

return $response;
}, function (ClientExceptionInterface $exception) use ($request, $next, $first, $chainIdentifier) {
if (!array_key_exists($chainIdentifier, $this->retryStorage)) {
$this->retryStorage[$chainIdentifier] = 0;
}

if ($this->retryStorage[$chainIdentifier] >= $this->retry) {
unset($this->retryStorage[$chainIdentifier]);

throw $exception;
}

if (!call_user_func($this->exceptionDecider, $request, $exception)) {
throw $exception;
}


$time = call_user_func($this->exceptionDelay, $request, $exception, $this->retryStorage[$chainIdentifier]);

return $this->retry($request, $next, $first, $chainIdentifier, $time);
});
}




public static function defaultErrorResponseDelay(RequestInterface $request, ResponseInterface $response, int $retries): int
{
return pow(2, $retries) * 500000;
}




public static function defaultExceptionDelay(RequestInterface $request, ClientExceptionInterface $e, int $retries): int
{
return pow(2, $retries) * 500000;
}




private function retry(RequestInterface $request, callable $next, callable $first, string $chainIdentifier, int $delay): ResponseInterface
{
usleep($delay);


++$this->retryStorage[$chainIdentifier];
$promise = $this->handleRequest($request, $next, $first);

return $promise->wait();
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Client\Exception\TransferException;
use Http\Message\Cookie;
use Http\Message\CookieJar;
use Http\Message\CookieUtil;
use Http\Message\Exception\UnexpectedValueException;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






final class CookiePlugin implements Plugin
{





private $cookieJar;

public function __construct(CookieJar $cookieJar)
{
$this->cookieJar = $cookieJar;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$cookies = [];
foreach ($this->cookieJar->getCookies() as $cookie) {
if ($cookie->isExpired()) {
continue;
}

if (!$cookie->matchDomain($request->getUri()->getHost())) {
continue;
}

if (!$cookie->matchPath($request->getUri()->getPath())) {
continue;
}

if ($cookie->isSecure() && ('https' !== $request->getUri()->getScheme())) {
continue;
}

$cookies[] = sprintf('%s=%s', $cookie->getName(), $cookie->getValue());
}

if (!empty($cookies)) {
$request = $request->withAddedHeader('Cookie', implode('; ', array_unique($cookies)));
}

return $next($request)->then(function (ResponseInterface $response) use ($request) {
if ($response->hasHeader('Set-Cookie')) {
$setCookies = $response->getHeader('Set-Cookie');

foreach ($setCookies as $setCookie) {
$cookie = $this->createCookie($request, $setCookie);


if (null === $cookie) {
continue;
}


if (!preg_match("/\.{$cookie->getDomain()}$/", '.'.$request->getUri()->getHost())) {
continue;
}

$this->cookieJar->addCookie($cookie);
}
}

return $response;
});
}






private function createCookie(RequestInterface $request, string $setCookieHeader): ?Cookie
{
$parts = array_map('trim', explode(';', $setCookieHeader));

if ('' === $parts[0] || false === strpos($parts[0], '=')) {
return null;
}

list($name, $cookieValue) = $this->createValueKey(array_shift($parts));

$maxAge = null;
$expires = null;
$domain = $request->getUri()->getHost();
$path = $request->getUri()->getPath();
$secure = false;
$httpOnly = false;


foreach ($parts as $part) {
list($key, $value) = $this->createValueKey($part);

switch (strtolower($key)) {
case 'expires':
try {
$expires = CookieUtil::parseDate((string) $value);
} catch (UnexpectedValueException $e) {
throw new TransferException(
sprintf(
'Cookie header `%s` expires value `%s` could not be converted to date',
$name,
$value
),
0,
$e
);
}

break;

case 'max-age':
$maxAge = (int) $value;

break;

case 'domain':
$domain = $value;

break;

case 'path':
$path = $value;

break;

case 'secure':
$secure = true;

break;

case 'httponly':
$httpOnly = true;

break;
}
}

return new Cookie($name, $cookieValue, $maxAge, $domain, $path, $secure, $httpOnly, $expires);
}








private function createValueKey(string $part): array
{
$parts = explode('=', $part, 2);
$key = trim($parts[0]);
$value = isset($parts[1]) ? trim($parts[1]) : null;

return [$key, $value];
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use GuzzleHttp\Psr7\Utils;
use Http\Client\Common\Exception\CircularRedirectionException;
use Http\Client\Common\Exception\MultipleRedirectionException;
use Http\Client\Common\Plugin;
use Http\Client\Exception\HttpException;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Promise\Promise;
use Nyholm\Psr7\Factory\Psr17Factory;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use Psr\Http\Message\UriInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;






final class RedirectPlugin implements Plugin
{





private $redirectCodes = [
300 => [
'switch' => [
'unless' => ['GET', 'HEAD'],
'to' => 'GET',
],
'multiple' => true,
'permanent' => false,
],
301 => [
'switch' => [
'unless' => ['GET', 'HEAD'],
'to' => 'GET',
],
'multiple' => false,
'permanent' => true,
],
302 => [
'switch' => [
'unless' => ['GET', 'HEAD'],
'to' => 'GET',
],
'multiple' => false,
'permanent' => false,
],
303 => [
'switch' => [
'unless' => ['GET', 'HEAD'],
'to' => 'GET',
],
'multiple' => false,
'permanent' => false,
],
307 => [
'switch' => false,
'multiple' => false,
'permanent' => false,
],
308 => [
'switch' => false,
'multiple' => false,
'permanent' => true,
],
];










private $preserveHeader;






private $redirectStorage = [];






private $useDefaultForMultiple;




private $circularDetection = [];




private $streamFactory;










public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'preserve_header' => true,
'use_default_for_multiple' => true,
'strict' => false,
'stream_factory' => null,
]);
$resolver->setAllowedTypes('preserve_header', ['bool', 'array']);
$resolver->setAllowedTypes('use_default_for_multiple', 'bool');
$resolver->setAllowedTypes('strict', 'bool');
$resolver->setAllowedTypes('stream_factory', [StreamFactoryInterface::class, 'null']);
$resolver->setNormalizer('preserve_header', function (OptionsResolver $resolver, $value) {
if (is_bool($value) && false === $value) {
return [];
}

return $value;
});
$resolver->setDefault('stream_factory', function (Options $options): ?StreamFactoryInterface {
return $this->guessStreamFactory();
});
$options = $resolver->resolve($config);

$this->preserveHeader = $options['preserve_header'];
$this->useDefaultForMultiple = $options['use_default_for_multiple'];

if ($options['strict']) {
$this->redirectCodes[300]['switch'] = false;
$this->redirectCodes[301]['switch'] = false;
$this->redirectCodes[302]['switch'] = false;
}

$this->streamFactory = $options['stream_factory'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{

if (array_key_exists((string) $request->getUri(), $this->redirectStorage)) {
$uri = $this->redirectStorage[(string) $request->getUri()]['uri'];
$statusCode = $this->redirectStorage[(string) $request->getUri()]['status'];
$redirectRequest = $this->buildRedirectRequest($request, $uri, $statusCode);

return $first($redirectRequest);
}

return $next($request)->then(function (ResponseInterface $response) use ($request, $first): ResponseInterface {
$statusCode = $response->getStatusCode();

if (!array_key_exists($statusCode, $this->redirectCodes)) {
return $response;
}

$uri = $this->createUri($response, $request);
$redirectRequest = $this->buildRedirectRequest($request, $uri, $statusCode);
$chainIdentifier = spl_object_hash((object) $first);

if (!array_key_exists($chainIdentifier, $this->circularDetection)) {
$this->circularDetection[$chainIdentifier] = [];
}

$this->circularDetection[$chainIdentifier][] = (string) $request->getUri();

if (in_array((string) $redirectRequest->getUri(), $this->circularDetection[$chainIdentifier], true)) {
throw new CircularRedirectionException('Circular redirection detected', $request, $response);
}

if ($this->redirectCodes[$statusCode]['permanent']) {
$this->redirectStorage[(string) $request->getUri()] = [
'uri' => $uri,
'status' => $statusCode,
];
}


return $first($redirectRequest)->wait();
});
}




public function guessStreamFactory(): ?StreamFactoryInterface
{
if (class_exists(Psr17FactoryDiscovery::class)) {
try {
return Psr17FactoryDiscovery::findStreamFactory();
} catch (\Throwable $t) {

}
}
if (class_exists(Psr17Factory::class)) {
return new Psr17Factory();
}
if (class_exists(Utils::class)) {
return new class implements StreamFactoryInterface {
public function createStream(string $content = ''): StreamInterface
{
return Utils::streamFor($content);
}

public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface
{
throw new \RuntimeException('Internal error: this method should not be needed');
}

public function createStreamFromResource($resource): StreamInterface
{
throw new \RuntimeException('Internal error: this method should not be needed');
}
};
}

return null;
}

private function buildRedirectRequest(RequestInterface $originalRequest, UriInterface $targetUri, int $statusCode): RequestInterface
{
$originalRequest = $originalRequest->withUri($targetUri);

if (false !== $this->redirectCodes[$statusCode]['switch'] && !in_array($originalRequest->getMethod(), $this->redirectCodes[$statusCode]['switch']['unless'], true)) {
$originalRequest = $originalRequest->withMethod($this->redirectCodes[$statusCode]['switch']['to']);
if ('GET' === $this->redirectCodes[$statusCode]['switch']['to'] && $this->streamFactory) {

$originalRequest = $originalRequest->withoutHeader('content-type');
$originalRequest = $originalRequest->withoutHeader('content-length');
$originalRequest = $originalRequest->withBody($this->streamFactory->createStream());
}
}

if (is_array($this->preserveHeader)) {
$headers = array_keys($originalRequest->getHeaders());

foreach ($headers as $name) {
if (!in_array($name, $this->preserveHeader, true)) {
$originalRequest = $originalRequest->withoutHeader($name);
}
}
}

return $originalRequest;
}







private function createUri(ResponseInterface $redirectResponse, RequestInterface $originalRequest): UriInterface
{
if ($this->redirectCodes[$redirectResponse->getStatusCode()]['multiple'] && (!$this->useDefaultForMultiple || !$redirectResponse->hasHeader('Location'))) {
throw new MultipleRedirectionException('Cannot choose a redirection', $originalRequest, $redirectResponse);
}

if (!$redirectResponse->hasHeader('Location')) {
throw new HttpException('Redirect status code, but no location header present in the response', $originalRequest, $redirectResponse);
}

$location = $redirectResponse->getHeaderLine('Location');
$parsedLocation = parse_url($location);

if (false === $parsedLocation || '' === $location) {
throw new HttpException(sprintf('Location "%s" could not be parsed', $location), $originalRequest, $redirectResponse);
}

$uri = $originalRequest->getUri();




$path = array_key_exists('path', $parsedLocation) ? $parsedLocation['path'] : '';
if (!array_key_exists('host', $parsedLocation) && '/' !== $location[0]) {

$originalPath = $uri->getPath();
if ('' === $path) {
$path = $originalPath;
} elseif (($pos = strrpos($originalPath, '/')) !== false) {
$path = substr($originalPath, 0, $pos + 1).$path;
} else {
$path = '/'.$path;
}

$re = ['#(/\./)#', '#/(?!\.\.)[^/]+/\.\./#'];
for ($n = 1; $n > 0; $path = preg_replace($re, '/', $path, -1, $n)) {
if (null === $path) {
throw new HttpException(sprintf('Failed to resolve Location %s', $location), $originalRequest, $redirectResponse);
}
}
}
if (null === $path) {
throw new HttpException(sprintf('Failed to resolve Location %s', $location), $originalRequest, $redirectResponse);
}
$uri = $uri
->withPath($path)
->withQuery(array_key_exists('query', $parsedLocation) ? $parsedLocation['query'] : '')
->withFragment(array_key_exists('fragment', $parsedLocation) ? $parsedLocation['fragment'] : '')
;

if (array_key_exists('scheme', $parsedLocation)) {
$uri = $uri->withScheme($parsedLocation['scheme']);
}

if (array_key_exists('host', $parsedLocation)) {
$uri = $uri->withHost($parsedLocation['host']);
}

if (array_key_exists('port', $parsedLocation)) {
$uri = $uri->withPort($parsedLocation['port']);
} elseif (array_key_exists('host', $parsedLocation)) {
$uri = $uri->withPort(null);
}

return $uri;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\StreamInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;






final class ContentTypePlugin implements Plugin
{








private $skipDetection;






private $sizeLimit;








public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'skip_detection' => false,
'size_limit' => 16000000,
]);
$resolver->setAllowedTypes('skip_detection', 'bool');
$resolver->setAllowedTypes('size_limit', 'int');

$options = $resolver->resolve($config);

$this->skipDetection = $options['skip_detection'];
$this->sizeLimit = $options['size_limit'];
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
if (!$request->hasHeader('Content-Type')) {
$stream = $request->getBody();
$streamSize = $stream->getSize();

if (!$stream->isSeekable()) {
return $next($request);
}

if (0 === $streamSize) {
return $next($request);
}

if ($this->skipDetection && (null === $streamSize || $streamSize >= $this->sizeLimit)) {
return $next($request);
}

if ($this->isJson($stream)) {
$request = $request->withHeader('Content-Type', 'application/json');

return $next($request);
}

if ($this->isXml($stream)) {
$request = $request->withHeader('Content-Type', 'application/xml');

return $next($request);
}
}

return $next($request);
}

private function isJson(StreamInterface $stream): bool
{
if (!function_exists('json_decode')) {
return false;
}
$stream->rewind();

json_decode($stream->getContents());

return JSON_ERROR_NONE === json_last_error();
}

private function isXml(StreamInterface $stream): bool
{
if (!function_exists('simplexml_load_string')) {
return false;
}
$stream->rewind();

$previousValue = libxml_use_internal_errors(true);
$isXml = simplexml_load_string($stream->getContents());
libxml_use_internal_errors($previousValue);

return false !== $isXml;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Symfony\Component\OptionsResolver\OptionsResolver;




abstract class SeekableBodyPlugin implements Plugin
{



protected $useFileBuffer;




protected $memoryBufferSize;








public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'use_file_buffer' => true,
'memory_buffer_size' => 2097152,
]);
$resolver->setAllowedTypes('use_file_buffer', 'bool');
$resolver->setAllowedTypes('memory_buffer_size', 'int');

$options = $resolver->resolve($config);

$this->useFileBuffer = $options['use_file_buffer'];
$this->memoryBufferSize = $options['memory_buffer_size'];
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Message\Encoding\ChunkStream;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






final class ContentLengthPlugin implements Plugin
{
public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
if (!$request->hasHeader('Content-Length')) {
$stream = $request->getBody();


if (null === $stream->getSize()) {
$stream = new ChunkStream($stream);
$request = $request->withBody($stream);
$request = $request->withAddedHeader('Transfer-Encoding', 'chunked');
} else {
$request = $request->withHeader('Content-Length', (string) $stream->getSize());
}
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Message\RequestMatcher;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






final class RequestMatcherPlugin implements Plugin
{



private $requestMatcher;




private $successPlugin;




private $failurePlugin;

public function __construct(RequestMatcher $requestMatcher, ?Plugin $delegateOnMatch, ?Plugin $delegateOnNoMatch = null)
{
$this->requestMatcher = $requestMatcher;
$this->successPlugin = $delegateOnMatch;
$this->failurePlugin = $delegateOnNoMatch;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
if ($this->requestMatcher->matches($request)) {
if (null !== $this->successPlugin) {
return $this->successPlugin->handleRequest($request, $next, $first);
}
} elseif (null !== $this->failurePlugin) {
return $this->failurePlugin->handleRequest($request, $next, $first);
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






final class HistoryPlugin implements Plugin
{





private $journal;

public function __construct(Journal $journal)
{
$this->journal = $journal;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$journal = $this->journal;

return $next($request)->then(function (ResponseInterface $response) use ($request, $journal) {
$journal->addSuccess($request, $response);

return $response;
}, function (ClientExceptionInterface $exception) use ($request, $journal) {
$journal->addFailure($request, $exception);

throw $exception;
});
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Message\Stream\BufferedStream;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






final class ResponseSeekableBodyPlugin extends SeekableBodyPlugin
{
public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
return $next($request)->then(function (ResponseInterface $response) {
if ($response->getBody()->isSeekable()) {
return $response;
}

return $response->withBody(new BufferedStream($response->getBody(), $this->useFileBuffer, $this->memoryBufferSize));
});
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Message\Stream\BufferedStream;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






final class RequestSeekableBodyPlugin extends SeekableBodyPlugin
{
public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
if (!$request->getBody()->isSeekable()) {
$request = $request->withBody(new BufferedStream($request->getBody(), $this->useFileBuffer, $this->memoryBufferSize));
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Plugin;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;








final class HeaderDefaultsPlugin implements Plugin
{



private $headers = [];




public function __construct(array $headers)
{
$this->headers = $headers;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
foreach ($this->headers as $header => $headerValue) {
if (!$request->hasHeader($header)) {
$request = $request->withHeader($header, $headerValue);
}
}

return $next($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Psr\Http\Client\ClientInterface;






final class EmulatedHttpAsyncClient implements HttpClient, HttpAsyncClient
{
use HttpAsyncClientEmulator;
use HttpClientDecorator;

public function __construct(ClientInterface $httpClient)
{
$this->httpClient = $httpClient;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Common\BatchResult;
use Http\Client\Exception\TransferException;








final class BatchException extends TransferException
{



private $result;

public function __construct(BatchResult $result)
{
$this->result = $result;
parent::__construct();
}




public function getResult(): BatchResult
{
return $this->result;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\HttpException;






final class CircularRedirectionException extends HttpException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\RequestException;






final class LoopException extends RequestException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\TransferException;






final class HttpClientNotFoundException extends TransferException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\HttpException;






final class ClientErrorException extends HttpException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\TransferException;
use Psr\Http\Message\RequestInterface;






final class HttpClientNoMatchException extends TransferException
{



private $request;

public function __construct(string $message, RequestInterface $request, ?\Exception $previous = null)
{
$this->request = $request;

parent::__construct($message, 0, $previous);
}

public function getRequest(): RequestInterface
{
return $this->request;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\HttpException;






final class MultipleRedirectionException extends HttpException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common\Exception;

use Http\Client\Exception\HttpException;






final class ServerErrorException extends HttpException
{
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Common\Exception\LoopException;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;

final class PluginChain
{

private $plugins;


private $clientCallable;


private $maxRestarts;


private $restarts = 0;






public function __construct(array $plugins, callable $clientCallable, array $options = [])
{
$this->plugins = $plugins;
$this->clientCallable = $clientCallable;
$this->maxRestarts = (int) ($options['max_restarts'] ?? 0);
}

private function createChain(): callable
{
$lastCallable = $this->clientCallable;
$reversedPlugins = \array_reverse($this->plugins);

foreach ($reversedPlugins as $plugin) {
$lastCallable = function (RequestInterface $request) use ($plugin, $lastCallable) {
return $plugin->handleRequest($request, $lastCallable, $this);
};
}

return $lastCallable;
}

public function __invoke(RequestInterface $request): Promise
{
if ($this->restarts > $this->maxRestarts) {
throw new LoopException('Too many restarts in plugin client', $request);
}

++$this->restarts;

return $this->createChain()($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Exception;
use Http\Client\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;






trait HttpAsyncClientEmulator
{



abstract public function sendRequest(RequestInterface $request): ResponseInterface;




public function sendAsyncRequest(RequestInterface $request)
{
try {
return new Promise\HttpFulfilledPromise($this->sendRequest($request));
} catch (Exception $e) {
return new Promise\HttpRejectedPromise($e);
}
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;






final class EmulatedHttpClient implements HttpClient, HttpAsyncClient
{
use HttpAsyncClientDecorator;
use HttpClientEmulator;

public function __construct(HttpAsyncClient $httpAsyncClient)
{
$this->httpAsyncClient = $httpAsyncClient;
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Exception as HttplugException;
use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Http\Client\Promise\HttpFulfilledPromise;
use Http\Client\Promise\HttpRejectedPromise;
use Http\Promise\Promise;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;






final class PluginClient implements HttpClient, HttpAsyncClient
{





private $client;






private $plugins;






private $options;






public function __construct($client, array $plugins = [], array $options = [])
{
if ($client instanceof HttpAsyncClient) {
$this->client = $client;
} elseif ($client instanceof ClientInterface) {
$this->client = new EmulatedHttpAsyncClient($client);
} else {
throw new \TypeError(
sprintf('%s::__construct(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

$this->plugins = $plugins;
$this->options = $this->configure($options);
}

public function sendRequest(RequestInterface $request): ResponseInterface
{

if (!$this->client instanceof ClientInterface) {
return $this->sendAsyncRequest($request)->wait();
}



$pluginChain = $this->createPluginChain($this->plugins, function (RequestInterface $request) {
try {
return new HttpFulfilledPromise($this->client->sendRequest($request));
} catch (HttplugException $exception) {
return new HttpRejectedPromise($exception);
}
});

return $pluginChain($request)->wait();
}

public function sendAsyncRequest(RequestInterface $request)
{
$pluginChain = $this->createPluginChain($this->plugins, function (RequestInterface $request) {
return $this->client->sendAsyncRequest($request);
});

return $pluginChain($request);
}




private function configure(array $options = []): array
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'max_restarts' => 10,
]);

$resolver->setAllowedTypes('max_restarts', 'int');

return $resolver->resolve($options);
}









private function createPluginChain(array $plugins, callable $clientCallable): callable
{
return new PluginChain($plugins, $clientCallable, $this->options);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Common\HttpClientPool\HttpClientPoolItem;
use Http\Client\HttpAsyncClient;
use Http\Client\HttpClient;
use Psr\Http\Client\ClientInterface;





interface HttpClientPool extends HttpAsyncClient, HttpClient
{





public function addHttpClient($client): void;
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\HttpAsyncClient;
use Psr\Http\Message\RequestInterface;






trait HttpAsyncClientDecorator
{



protected $httpAsyncClient;




public function sendAsyncRequest(RequestInterface $request)
{
return $this->httpAsyncClient->sendAsyncRequest($request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;











interface Plugin
{










public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise;
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Common\Exception\HttpClientNoMatchException;
use Http\Client\HttpAsyncClient;
use Http\Message\RequestMatcher;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;




final class HttpClientRouter implements HttpClientRouterInterface
{



private $clients = [];

public function sendRequest(RequestInterface $request): ResponseInterface
{
return $this->chooseHttpClient($request)->sendRequest($request);
}

public function sendAsyncRequest(RequestInterface $request)
{
return $this->chooseHttpClient($request)->sendAsyncRequest($request);
}






public function addClient($client, RequestMatcher $requestMatcher): void
{
if (!$client instanceof ClientInterface && !$client instanceof HttpAsyncClient) {
throw new \TypeError(
sprintf('%s::addClient(): Argument #1 ($client) must be of type %s|%s, %s given', self::class, ClientInterface::class, HttpAsyncClient::class, get_debug_type($client))
);
}

$this->clients[] = [
'matcher' => $requestMatcher,
'client' => new FlexibleHttpClient($client),
];
}




private function chooseHttpClient(RequestInterface $request): FlexibleHttpClient
{
foreach ($this->clients as $client) {
if ($client['matcher']->matches($request)) {
return $client['client'];
}
}

throw new HttpClientNoMatchException('No client found for the specified request', $request);
}
}
<?php

declare(strict_types=1);

namespace Http\Client\Common;

use Http\Client\Common\Exception\BatchException;
use Psr\Http\Message\RequestInterface;








interface BatchClientInterface
{














public function sendRequests(array $requests): BatchResult;
}
Copyright (c) 2014 Eric GELOEN <geloen.eric@gmail.com>
Copyright (c) 2015 PHP HTTP Team <team@php-http.org>

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.
{"version":"1.0","name":"php-http\/httplug","binding-types":{"Http\\Client\\HttpAsyncClient":{"description":"Async HTTP Client"},"Http\\Client\\HttpClient":{"description":"HTTP Client"}}}<?php

namespace Http\Client;

use Psr\Http\Client\ClientInterface;









interface HttpClient extends ClientInterface
{
}
<?php

namespace Http\Client;

use Psr\Http\Client\ClientExceptionInterface as PsrClientException;






interface Exception extends PsrClientException
{
}
<?php

namespace Http\Client\Exception;

use Psr\Http\Client\NetworkExceptionInterface as PsrNetworkException;
use Psr\Http\Message\RequestInterface;








class NetworkException extends TransferException implements PsrNetworkException
{
use RequestAwareTrait;




public function __construct($message, RequestInterface $request, ?\Exception $previous = null)
{
$this->setRequest($request);

parent::__construct($message, 0, $previous);
}
}
<?php

namespace Http\Client\Exception;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;








class HttpException extends RequestException
{



protected $response;




public function __construct(
$message,
RequestInterface $request,
ResponseInterface $response,
?\Exception $previous = null
) {
parent::__construct($message, $request, $previous);

$this->response = $response;
$this->code = $response->getStatusCode();
}






public function getResponse()
{
return $this->response;
}




public static function create(
RequestInterface $request,
ResponseInterface $response,
?\Exception $previous = null
) {
$message = sprintf(
'[url] %s [http method] %s [status code] %s [reason phrase] %s',
$request->getRequestTarget(),
$request->getMethod(),
$response->getStatusCode(),
$response->getReasonPhrase()
);

return new static($message, $request, $response, $previous);
}
}
<?php

namespace Http\Client\Exception;

use Psr\Http\Client\RequestExceptionInterface as PsrRequestException;
use Psr\Http\Message\RequestInterface;









class RequestException extends TransferException implements PsrRequestException
{
use RequestAwareTrait;




public function __construct($message, RequestInterface $request, ?\Exception $previous = null)
{
$this->setRequest($request);

parent::__construct($message, 0, $previous);
}
}
<?php

namespace Http\Client\Exception;

use Psr\Http\Message\RequestInterface;

trait RequestAwareTrait
{



private $request;

private function setRequest(RequestInterface $request)
{
$this->request = $request;
}

public function getRequest(): RequestInterface
{
return $this->request;
}
}
<?php

namespace Http\Client\Exception;

use Http\Client\Exception;






class TransferException extends \RuntimeException implements Exception
{
}
<?php

namespace Http\Client;

use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;






interface HttpAsyncClient
{









public function sendAsyncRequest(RequestInterface $request);
}
<?php

namespace Http\Client\Promise;

use Http\Client\Exception;
use Http\Promise\Promise;
use Psr\Http\Message\ResponseInterface;

final class HttpFulfilledPromise implements Promise
{



private $response;

public function __construct(ResponseInterface $response)
{
$this->response = $response;
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null)
{
if (null === $onFulfilled) {
return $this;
}

try {
return new self($onFulfilled($this->response));
} catch (Exception $e) {
return new HttpRejectedPromise($e);
}
}

public function getState()
{
return Promise::FULFILLED;
}

public function wait($unwrap = true)
{
if ($unwrap) {
return $this->response;
}
}
}
<?php

namespace Http\Client\Promise;

use Http\Client\Exception;
use Http\Promise\Promise;

final class HttpRejectedPromise implements Promise
{



private $exception;

public function __construct(Exception $exception)
{
$this->exception = $exception;
}

public function then(?callable $onFulfilled = null, ?callable $onRejected = null)
{
if (null === $onRejected) {
return $this;
}

try {
$result = $onRejected($this->exception);
if ($result instanceof Promise) {
return $result;
}

return new HttpFulfilledPromise($result);
} catch (Exception $e) {
return new self($e);
}
}

public function getState()
{
return Promise::REJECTED;
}

public function wait($unwrap = true)
{
if ($unwrap) {
throw $this->exception;
}
}
}
BSD 3-Clause License

Copyright (c) 2014, Graham Campbell.
Copyright (c) 2013, Vance Lucas.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<?php

declare(strict_types=1);

namespace Dotenv\Util;

use GrahamCampbell\ResultType\Error;
use GrahamCampbell\ResultType\Success;




final class Regex
{







private function __construct()
{

}









public static function matches(string $pattern, string $subject)
{
return self::pregAndWrap(static function (string $subject) use ($pattern) {
return @\preg_match($pattern, $subject) === 1;
}, $subject);
}









public static function occurrences(string $pattern, string $subject)
{
return self::pregAndWrap(static function (string $subject) use ($pattern) {
return (int) @\preg_match_all($pattern, $subject);
}, $subject);
}











public static function replaceCallback(string $pattern, callable $callback, string $subject, ?int $limit = null)
{
return self::pregAndWrap(static function (string $subject) use ($pattern, $callback, $limit) {
return (string) @\preg_replace_callback($pattern, $callback, $subject, $limit ?? -1);
}, $subject);
}









public static function split(string $pattern, string $subject)
{
return self::pregAndWrap(static function (string $subject) use ($pattern) {

return (array) @\preg_split($pattern, $subject);
}, $subject);
}

/**
@template







*/
private static function pregAndWrap(callable $operation, string $subject)
{
$result = $operation($subject);

if (\preg_last_error() !== \PREG_NO_ERROR) {

return Error::create(\preg_last_error_msg());
}


return Success::create($result);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Util;

use GrahamCampbell\ResultType\Error;
use GrahamCampbell\ResultType\Success;
use PhpOption\Option;




final class Str
{







private function __construct()
{

}









public static function utf8(string $input, ?string $encoding = null)
{
if ($encoding !== null && !\in_array($encoding, \mb_list_encodings(), true)) {

return Error::create(
\sprintf('Illegal character encoding [%s] specified.', $encoding)
);
}

$converted = $encoding === null ?
@\mb_convert_encoding($input, 'UTF-8') :
@\mb_convert_encoding($input, 'UTF-8', $encoding);

if (!is_string($converted)) {

return Error::create(
\sprintf('Conversion from encoding [%s] failed.', $encoding ?? 'NULL')
);
}






if (\substr($converted, 0, 3) == "\xEF\xBB\xBF") {
$converted = \substr($converted, 3);
}


return Success::create($converted);
}









public static function pos(string $haystack, string $needle)
{

return Option::fromValue(\mb_strpos($haystack, $needle, 0, 'UTF-8'), false);
}










public static function substr(string $input, int $start, ?int $length = null)
{
return \mb_substr($input, $start, $length, 'UTF-8');
}








public static function len(string $input)
{
return \mb_strlen($input, 'UTF-8');
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Store;

final class StringStore implements StoreInterface
{





private $content;








public function __construct(string $content)
{
$this->content = $content;
}






public function read()
{
return $this->content;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Store\File;




final class Paths
{







private function __construct()
{

}









public static function filePaths(array $paths, array $names)
{
$files = [];

foreach ($paths as $path) {
foreach ($names as $name) {
$files[] = \rtrim($path, \DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR.$name;
}
}

return $files;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Store\File;

use Dotenv\Exception\InvalidEncodingException;
use Dotenv\Util\Str;
use PhpOption\Option;




final class Reader
{







private function __construct()
{

}
















public static function read(array $filePaths, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$output = [];

foreach ($filePaths as $filePath) {
$content = self::readFromFile($filePath, $fileEncoding);
if ($content->isDefined()) {
$output[$filePath] = $content->get();
if ($shortCircuit) {
break;
}
}
}

return $output;
}











private static function readFromFile(string $path, ?string $encoding = null)
{

$content = Option::fromValue(@\file_get_contents($path), false);

return $content->flatMap(static function (string $content) use ($encoding) {
return Str::utf8($content, $encoding)->mapError(static function (string $error) {
throw new InvalidEncodingException($error);
})->success();
});
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Store;

use Dotenv\Exception\InvalidPathException;
use Dotenv\Store\File\Reader;

final class FileStore implements StoreInterface
{





private $filePaths;






private $shortCircuit;






private $fileEncoding;










public function __construct(array $filePaths, bool $shortCircuit, ?string $fileEncoding = null)
{
$this->filePaths = $filePaths;
$this->shortCircuit = $shortCircuit;
$this->fileEncoding = $fileEncoding;
}








public function read()
{
if ($this->filePaths === []) {
throw new InvalidPathException('At least one environment file path must be provided.');
}

$contents = Reader::read($this->filePaths, $this->shortCircuit, $this->fileEncoding);

if (\count($contents) > 0) {
return \implode("\n", $contents);
}

throw new InvalidPathException(
\sprintf('Unable to read any of the environment file(s) at [%s].', \implode(', ', $this->filePaths))
);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Store;

interface StoreInterface
{







public function read();
}
<?php

declare(strict_types=1);

namespace Dotenv\Store;

use Dotenv\Store\File\Paths;

final class StoreBuilder
{



private const DEFAULT_NAME = '.env';






private $paths;






private $names;






private $shortCircuit;






private $fileEncoding;











private function __construct(array $paths = [], array $names = [], bool $shortCircuit = false, ?string $fileEncoding = null)
{
$this->paths = $paths;
$this->names = $names;
$this->shortCircuit = $shortCircuit;
$this->fileEncoding = $fileEncoding;
}






public static function createWithNoNames()
{
return new self();
}






public static function createWithDefaultName()
{
return new self([], [self::DEFAULT_NAME]);
}








public function addPath(string $path)
{
return new self(\array_merge($this->paths, [$path]), $this->names, $this->shortCircuit, $this->fileEncoding);
}








public function addName(string $name)
{
return new self($this->paths, \array_merge($this->names, [$name]), $this->shortCircuit, $this->fileEncoding);
}






public function shortCircuit()
{
return new self($this->paths, $this->names, true, $this->fileEncoding);
}








public function fileEncoding(?string $fileEncoding = null)
{
return new self($this->paths, $this->names, $this->shortCircuit, $fileEncoding);
}






public function make()
{
return new FileStore(
Paths::filePaths($this->paths, $this->names),
$this->shortCircuit,
$this->fileEncoding
);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

final class Lexer
{



private const PATTERNS = [
'[\r\n]{1,1000}', '[^\S\r\n]{1,1000}', '\\\\', '\'', '"', '\\#', '\\$', '([^(\s\\\\\'"\\#\\$)]|\\(|\\)){1,1000}',
];








private function __construct()
{

}











public static function lex(string $content)
{
static $regex;

if ($regex === null) {
$regex = '(('.\implode(')|(', self::PATTERNS).'))A';
}

$offset = 0;

while (isset($content[$offset])) {
if (!\preg_match($regex, $content, $matches, 0, $offset)) {
throw new \Error(\sprintf('Lexer encountered unexpected character [%s].', $content[$offset]));
}

$offset += \strlen($matches[0]);

yield $matches[0];
}
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

interface ParserInterface
{









public function parse(string $content);
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

use Dotenv\Util\Str;

final class Value
{





private $chars;






private $vars;









private function __construct(string $chars, array $vars)
{
$this->chars = $chars;
$this->vars = $vars;
}






public static function blank()
{
return new self('', []);
}









public function append(string $chars, bool $var)
{
return new self(
$this->chars.$chars,
$var ? \array_merge($this->vars, [Str::len($this->chars)]) : $this->vars
);
}






public function getChars()
{
return $this->chars;
}






public function getVars()
{
$vars = $this->vars;

\rsort($vars);

return $vars;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

use PhpOption\Option;

final class Entry
{





private $name;






private $value;









public function __construct(string $name, ?Value $value = null)
{
$this->name = $name;
$this->value = $value;
}






public function getName()
{
return $this->name;
}






public function getValue()
{

return Option::fromValue($this->value);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

use Dotenv\Exception\InvalidFileException;
use Dotenv\Util\Regex;
use GrahamCampbell\ResultType\Result;
use GrahamCampbell\ResultType\Success;

final class Parser implements ParserInterface
{









public function parse(string $content)
{
return Regex::split("/(\r\n|\n|\r)/", $content)->mapError(static function () {
return 'Could not split into separate lines.';
})->flatMap(static function (array $lines) {
return self::process(Lines::process($lines));
})->mapError(static function (string $error) {
throw new InvalidFileException(\sprintf('Failed to parse dotenv file. %s', $error));
})->success()->get();
}








private static function process(array $entries)
{

return \array_reduce($entries, static function (Result $result, string $raw) {
return $result->flatMap(static function (array $entries) use ($raw) {
return EntryParser::parse($raw)->map(static function (Entry $entry) use ($entries) {

return \array_merge($entries, [$entry]);
});
});
}, Success::create([]));
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

use Dotenv\Util\Regex;
use Dotenv\Util\Str;
use GrahamCampbell\ResultType\Error;
use GrahamCampbell\ResultType\Result;
use GrahamCampbell\ResultType\Success;

final class EntryParser
{
private const INITIAL_STATE = 0;
private const UNQUOTED_STATE = 1;
private const SINGLE_QUOTED_STATE = 2;
private const DOUBLE_QUOTED_STATE = 3;
private const ESCAPE_SEQUENCE_STATE = 4;
private const WHITESPACE_STATE = 5;
private const COMMENT_STATE = 6;
private const REJECT_STATES = [self::SINGLE_QUOTED_STATE, self::DOUBLE_QUOTED_STATE, self::ESCAPE_SEQUENCE_STATE];








private function __construct()
{

}











public static function parse(string $entry)
{
return self::splitStringIntoParts($entry)->flatMap(static function (array $parts) {
[$name, $value] = $parts;

return self::parseName($name)->flatMap(static function (string $name) use ($value) {

$parsedValue = $value === null ? Success::create(null) : self::parseValue($value);

return $parsedValue->map(static function (?Value $value) use ($name) {
return new Entry($name, $value);
});
});
});
}








private static function splitStringIntoParts(string $line)
{

$result = Str::pos($line, '=')->map(static function () use ($line) {
return \array_map('trim', \explode('=', $line, 2));
})->getOrElse([$line, null]);

if ($result[0] === '') {

return Error::create(self::getErrorMessage('an unexpected equals', $line));
}


return Success::create($result);
}











private static function parseName(string $name)
{
if (Str::len($name) > 8 && Str::substr($name, 0, 6) === 'export' && \ctype_space(Str::substr($name, 6, 1))) {
$name = \ltrim(Str::substr($name, 6));
}

if (self::isQuotedName($name)) {
$name = Str::substr($name, 1, -1);
}

if (!self::isValidName($name)) {

return Error::create(self::getErrorMessage('an invalid name', $name));
}


return Success::create($name);
}








private static function isQuotedName(string $name)
{
if (Str::len($name) < 3) {
return false;
}

$first = Str::substr($name, 0, 1);
$last = Str::substr($name, -1, 1);

return ($first === '"' && $last === '"') || ($first === '\'' && $last === '\'');
}








private static function isValidName(string $name)
{
return Regex::matches('~(*UTF8)\A[\p{Ll}\p{Lu}\p{M}\p{N}_.]+\z~', $name)->success()->getOrElse(false);
}













private static function parseValue(string $value)
{
if (\trim($value) === '') {

return Success::create(Value::blank());
}

return \array_reduce(\iterator_to_array(Lexer::lex($value)), static function (Result $data, string $token) {
return $data->flatMap(static function (array $data) use ($token) {
return self::processToken($data[1], $token)->map(static function (array $val) use ($data) {
return [$data[0]->append($val[0], $val[1]), $val[2]];
});
});
}, Success::create([Value::blank(), self::INITIAL_STATE]))->flatMap(static function (array $result) {
/**
@psalm-suppress */
if (in_array($result[1], self::REJECT_STATES, true)) {

return Error::create('a missing closing quote');
}


return Success::create($result[0]);
})->mapError(static function (string $err) use ($value) {
return self::getErrorMessage($err, $value);
});
}









private static function processToken(int $state, string $token)
{
switch ($state) {
case self::INITIAL_STATE:
if ($token === '\'') {

return Success::create(['', false, self::SINGLE_QUOTED_STATE]);
} elseif ($token === '"') {

return Success::create(['', false, self::DOUBLE_QUOTED_STATE]);
} elseif ($token === '#') {

return Success::create(['', false, self::COMMENT_STATE]);
} elseif ($token === '$') {

return Success::create([$token, true, self::UNQUOTED_STATE]);
} else {

return Success::create([$token, false, self::UNQUOTED_STATE]);
}
case self::UNQUOTED_STATE:
if ($token === '#') {

return Success::create(['', false, self::COMMENT_STATE]);
} elseif (\ctype_space($token)) {

return Success::create(['', false, self::WHITESPACE_STATE]);
} elseif ($token === '$') {

return Success::create([$token, true, self::UNQUOTED_STATE]);
} else {

return Success::create([$token, false, self::UNQUOTED_STATE]);
}
case self::SINGLE_QUOTED_STATE:
if ($token === '\'') {

return Success::create(['', false, self::WHITESPACE_STATE]);
} else {

return Success::create([$token, false, self::SINGLE_QUOTED_STATE]);
}
case self::DOUBLE_QUOTED_STATE:
if ($token === '"') {

return Success::create(['', false, self::WHITESPACE_STATE]);
} elseif ($token === '\\') {

return Success::create(['', false, self::ESCAPE_SEQUENCE_STATE]);
} elseif ($token === '$') {

return Success::create([$token, true, self::DOUBLE_QUOTED_STATE]);
} else {

return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]);
}
case self::ESCAPE_SEQUENCE_STATE:
if ($token === '"' || $token === '\\') {

return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]);
} elseif ($token === '$') {

return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]);
} else {
$first = Str::substr($token, 0, 1);
if (\in_array($first, ['f', 'n', 'r', 't', 'v'], true)) {

return Success::create([\stripcslashes('\\'.$first).Str::substr($token, 1), false, self::DOUBLE_QUOTED_STATE]);
} else {

return Error::create('an unexpected escape sequence');
}
}
case self::WHITESPACE_STATE:
if ($token === '#') {

return Success::create(['', false, self::COMMENT_STATE]);
} elseif (!\ctype_space($token)) {

return Error::create('unexpected whitespace');
} else {

return Success::create(['', false, self::WHITESPACE_STATE]);
}
case self::COMMENT_STATE:

return Success::create(['', false, self::COMMENT_STATE]);
default:
throw new \Error('Parser entered invalid state.');
}
}









private static function getErrorMessage(string $cause, string $subject)
{
return \sprintf(
'Encountered %s at [%s].',
$cause,
\strtok($subject, "\n")
);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Parser;

use Dotenv\Util\Regex;
use Dotenv\Util\Str;

final class Lines
{







private function __construct()
{

}










public static function process(array $lines)
{
$output = [];
$multiline = false;
$multilineBuffer = [];

foreach ($lines as $line) {
[$multiline, $line, $multilineBuffer] = self::multilineProcess($multiline, $line, $multilineBuffer);

if (!$multiline && !self::isCommentOrWhitespace($line)) {
$output[] = $line;
}
}

return $output;
}










private static function multilineProcess(bool $multiline, string $line, array $buffer)
{
$startsOnCurrentLine = $multiline ? false : self::looksLikeMultilineStart($line);


if ($startsOnCurrentLine) {
$multiline = true;
}

if ($multiline) {
\array_push($buffer, $line);

if (self::looksLikeMultilineStop($line, $startsOnCurrentLine)) {
$multiline = false;
$line = \implode("\n", $buffer);
$buffer = [];
}
}

return [$multiline, $line, $buffer];
}








private static function looksLikeMultilineStart(string $line)
{
return Str::pos($line, '="')->map(static function () use ($line) {
return self::looksLikeMultilineStop($line, true) === false;
})->getOrElse(false);
}









private static function looksLikeMultilineStop(string $line, bool $started)
{
if ($line === '"') {
return true;
}

return Regex::occurrences('/(?=([^\\\\]"))/', \str_replace('\\\\', '', $line))->map(static function (int $count) use ($started) {
return $started ? $count > 1 : $count >= 1;
})->success()->getOrElse(false);
}








private static function isCommentOrWhitespace(string $line)
{
$line = \trim($line);

return $line === '' || (isset($line[0]) && $line[0] === '#');
}
}
<?php

declare(strict_types=1);

namespace Dotenv;

use Dotenv\Exception\ValidationException;
use Dotenv\Repository\RepositoryInterface;
use Dotenv\Util\Regex;
use Dotenv\Util\Str;

class Validator
{





private $repository;






private $variables;









public function __construct(RepositoryInterface $repository, array $variables)
{
$this->repository = $repository;
$this->variables = $variables;
}








public function required()
{
return $this->assert(
static function (?string $value) {
return $value !== null;
},
'is missing'
);
}








public function notEmpty()
{
return $this->assertNullable(
static function (string $value) {
return Str::len(\trim($value)) > 0;
},
'is empty'
);
}








public function isInteger()
{
return $this->assertNullable(
static function (string $value) {
return \ctype_digit($value);
},
'is not an integer'
);
}








public function isBoolean()
{
return $this->assertNullable(
static function (string $value) {
if ($value === '') {
return false;
}

return \filter_var($value, \FILTER_VALIDATE_BOOLEAN, \FILTER_NULL_ON_FAILURE) !== null;
},
'is not a boolean'
);
}










public function allowedValues(array $choices)
{
return $this->assertNullable(
static function (string $value) use ($choices) {
return \in_array($value, $choices, true);
},
\sprintf('is not one of [%s]', \implode(', ', $choices))
);
}










public function allowedRegexValues(string $regex)
{
return $this->assertNullable(
static function (string $value) use ($regex) {
return Regex::matches($regex, $value)->success()->getOrElse(false);
},
\sprintf('does not match "%s"', $regex)
);
}











public function assert(callable $callback, string $message)
{
$failing = [];

foreach ($this->variables as $variable) {
if ($callback($this->repository->get($variable)) === false) {
$failing[] = \sprintf('%s %s', $variable, $message);
}
}

if (\count($failing) > 0) {
throw new ValidationException(\sprintf(
'One or more environment variables failed assertions: %s.',
\implode(', ', $failing)
));
}

return $this;
}













public function assertNullable(callable $callback, string $message)
{
return $this->assert(
static function (?string $value) use ($callback) {
if ($value === null) {
return true;
}

return $callback($value);
},
$message
);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Exception;

use RuntimeException;

final class ValidationException extends RuntimeException implements ExceptionInterface
{

}
<?php

declare(strict_types=1);

namespace Dotenv\Exception;

use InvalidArgumentException;

final class InvalidEncodingException extends InvalidArgumentException implements ExceptionInterface
{

}
<?php

declare(strict_types=1);

namespace Dotenv\Exception;

use Throwable;

interface ExceptionInterface extends Throwable
{

}
<?php

declare(strict_types=1);

namespace Dotenv\Exception;

use InvalidArgumentException;

final class InvalidPathException extends InvalidArgumentException implements ExceptionInterface
{

}
<?php

declare(strict_types=1);

namespace Dotenv\Exception;

use InvalidArgumentException;

final class InvalidFileException extends InvalidArgumentException implements ExceptionInterface
{

}
<?php

declare(strict_types=1);

namespace Dotenv\Repository;

interface RepositoryInterface
{







public function has(string $name);










public function get(string $name);











public function set(string $name, string $value);










public function clear(string $name);
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository;

use Dotenv\Repository\Adapter\AdapterInterface;
use Dotenv\Repository\Adapter\EnvConstAdapter;
use Dotenv\Repository\Adapter\GuardedWriter;
use Dotenv\Repository\Adapter\ImmutableWriter;
use Dotenv\Repository\Adapter\MultiReader;
use Dotenv\Repository\Adapter\MultiWriter;
use Dotenv\Repository\Adapter\ReaderInterface;
use Dotenv\Repository\Adapter\ServerConstAdapter;
use Dotenv\Repository\Adapter\WriterInterface;
use InvalidArgumentException;
use PhpOption\Some;
use ReflectionClass;

final class RepositoryBuilder
{



private const DEFAULT_ADAPTERS = [
ServerConstAdapter::class,
EnvConstAdapter::class,
];






private $readers;






private $writers;






private $immutable;






private $allowList;











private function __construct(array $readers = [], array $writers = [], bool $immutable = false, ?array $allowList = null)
{
$this->readers = $readers;
$this->writers = $writers;
$this->immutable = $immutable;
$this->allowList = $allowList;
}






public static function createWithNoAdapters()
{
return new self();
}






public static function createWithDefaultAdapters()
{
$adapters = \iterator_to_array(self::defaultAdapters());

return new self($adapters, $adapters);
}






private static function defaultAdapters()
{
foreach (self::DEFAULT_ADAPTERS as $adapter) {
$instance = $adapter::create();
if ($instance->isDefined()) {
yield $instance->get();
}
}
}








private static function isAnAdapterClass(string $name)
{
if (!\class_exists($name)) {
return false;
}

return (new ReflectionClass($name))->implementsInterface(AdapterInterface::class);
}













public function addReader($reader)
{
if (!(\is_string($reader) && self::isAnAdapterClass($reader)) && !($reader instanceof ReaderInterface)) {
throw new InvalidArgumentException(
\sprintf(
'Expected either an instance of %s or a class-string implementing %s',
ReaderInterface::class,
AdapterInterface::class
)
);
}

$optional = Some::create($reader)->flatMap(static function ($reader) {
return \is_string($reader) ? $reader::create() : Some::create($reader);
});

$readers = \array_merge($this->readers, \iterator_to_array($optional));

return new self($readers, $this->writers, $this->immutable, $this->allowList);
}













public function addWriter($writer)
{
if (!(\is_string($writer) && self::isAnAdapterClass($writer)) && !($writer instanceof WriterInterface)) {
throw new InvalidArgumentException(
\sprintf(
'Expected either an instance of %s or a class-string implementing %s',
WriterInterface::class,
AdapterInterface::class
)
);
}

$optional = Some::create($writer)->flatMap(static function ($writer) {
return \is_string($writer) ? $writer::create() : Some::create($writer);
});

$writers = \array_merge($this->writers, \iterator_to_array($optional));

return new self($this->readers, $writers, $this->immutable, $this->allowList);
}














public function addAdapter($adapter)
{
if (!(\is_string($adapter) && self::isAnAdapterClass($adapter)) && !($adapter instanceof AdapterInterface)) {
throw new InvalidArgumentException(
\sprintf(
'Expected either an instance of %s or a class-string implementing %s',
WriterInterface::class,
AdapterInterface::class
)
);
}

$optional = Some::create($adapter)->flatMap(static function ($adapter) {
return \is_string($adapter) ? $adapter::create() : Some::create($adapter);
});

$readers = \array_merge($this->readers, \iterator_to_array($optional));
$writers = \array_merge($this->writers, \iterator_to_array($optional));

return new self($readers, $writers, $this->immutable, $this->allowList);
}






public function immutable()
{
return new self($this->readers, $this->writers, true, $this->allowList);
}








public function allowList(?array $allowList = null)
{
return new self($this->readers, $this->writers, $this->immutable, $allowList);
}






public function make()
{
$reader = new MultiReader($this->readers);
$writer = new MultiWriter($this->writers);

if ($this->immutable) {
$writer = new ImmutableWriter($writer, $reader);
}

if ($this->allowList !== null) {
$writer = new GuardedWriter($writer, $this->allowList);
}

return new AdapterRepository($reader, $writer);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository;

use Dotenv\Repository\Adapter\ReaderInterface;
use Dotenv\Repository\Adapter\WriterInterface;
use InvalidArgumentException;

final class AdapterRepository implements RepositoryInterface
{





private $reader;






private $writer;









public function __construct(ReaderInterface $reader, WriterInterface $writer)
{
$this->reader = $reader;
$this->writer = $writer;
}








public function has(string $name)
{
return '' !== $name && $this->reader->read($name)->isDefined();
}










public function get(string $name)
{
if ('' === $name) {
throw new InvalidArgumentException('Expected name to be a non-empty string.');
}

return $this->reader->read($name)->getOrElse(null);
}











public function set(string $name, string $value)
{
if ('' === $name) {
throw new InvalidArgumentException('Expected name to be a non-empty string.');
}

return $this->writer->write($name, $value);
}










public function clear(string $name)
{
if ('' === $name) {
throw new InvalidArgumentException('Expected name to be a non-empty string.');
}

return $this->writer->delete($name);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

final class GuardedWriter implements WriterInterface
{





private $writer;






private $allowList;









public function __construct(WriterInterface $writer, array $allowList)
{
$this->writer = $writer;
$this->allowList = $allowList;
}









public function write(string $name, string $value)
{

if (!$this->isAllowed($name)) {
return false;
}


return $this->writer->write($name, $value);
}








public function delete(string $name)
{

if (!$this->isAllowed($name)) {
return false;
}


return $this->writer->delete($name);
}








private function isAllowed(string $name)
{
return \in_array($name, $this->allowList, true);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\Option;
use PhpOption\Some;

final class ServerConstAdapter implements AdapterInterface
{





private function __construct()
{

}






public static function create()
{

return Some::create(new self());
}








public function read(string $name)
{

return Option::fromArraysValue($_SERVER, $name)
->filter(static function ($value) {
return \is_scalar($value);
})
->map(static function ($value) {
if ($value === false) {
return 'false';
}

if ($value === true) {
return 'true';
}

/**
@psalm-suppress */
return (string) $value;
});
}









public function write(string $name, string $value)
{
$_SERVER[$name] = $value;

return true;
}








public function delete(string $name)
{
unset($_SERVER[$name]);

return true;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

final class ReplacingWriter implements WriterInterface
{





private $writer;






private $reader;






private $seen;









public function __construct(WriterInterface $writer, ReaderInterface $reader)
{
$this->writer = $writer;
$this->reader = $reader;
$this->seen = [];
}









public function write(string $name, string $value)
{
if ($this->exists($name)) {
return $this->writer->write($name, $value);
}


return true;
}








public function delete(string $name)
{
if ($this->exists($name)) {
return $this->writer->delete($name);
}


return true;
}











private function exists(string $name)
{
if (isset($this->seen[$name])) {
return true;
}

if ($this->reader->read($name)->isDefined()) {
$this->seen[$name] = '';

return true;
}

return false;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\Option;
use PhpOption\Some;

final class ArrayAdapter implements AdapterInterface
{





private $variables;






private function __construct()
{
$this->variables = [];
}






public static function create()
{

return Some::create(new self());
}








public function read(string $name)
{
return Option::fromArraysValue($this->variables, $name);
}









public function write(string $name, string $value)
{
$this->variables[$name] = $value;

return true;
}








public function delete(string $name)
{
unset($this->variables[$name]);

return true;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\Option;
use PhpOption\Some;

final class EnvConstAdapter implements AdapterInterface
{





private function __construct()
{

}






public static function create()
{

return Some::create(new self());
}








public function read(string $name)
{

return Option::fromArraysValue($_ENV, $name)
->filter(static function ($value) {
return \is_scalar($value);
})
->map(static function ($value) {
if ($value === false) {
return 'false';
}

if ($value === true) {
return 'true';
}

/**
@psalm-suppress */
return (string) $value;
});
}









public function write(string $name, string $value)
{
$_ENV[$name] = $value;

return true;
}








public function delete(string $name)
{
unset($_ENV[$name]);

return true;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\None;
use PhpOption\Option;
use PhpOption\Some;

final class PutenvAdapter implements AdapterInterface
{





private function __construct()
{

}






public static function create()
{
if (self::isSupported()) {

return Some::create(new self());
}

return None::create();
}






private static function isSupported()
{
return \function_exists('getenv') && \function_exists('putenv');
}








public function read(string $name)
{

return Option::fromValue(\getenv($name), false)->filter(static function ($value) {
return \is_string($value);
});
}









public function write(string $name, string $value)
{
\putenv("$name=$value");

return true;
}








public function delete(string $name)
{
\putenv($name);

return true;
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\None;

final class MultiReader implements ReaderInterface
{





private $readers;








public function __construct(array $readers)
{
$this->readers = $readers;
}








public function read(string $name)
{
foreach ($this->readers as $reader) {
$result = $reader->read($name);
if ($result->isDefined()) {
return $result;
}
}

return None::create();
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

interface AdapterInterface extends ReaderInterface, WriterInterface
{





public static function create();
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

interface ReaderInterface
{







public function read(string $name);
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

final class ImmutableWriter implements WriterInterface
{





private $writer;






private $reader;






private $loaded;









public function __construct(WriterInterface $writer, ReaderInterface $reader)
{
$this->writer = $writer;
$this->reader = $reader;
$this->loaded = [];
}









public function write(string $name, string $value)
{


if ($this->isExternallyDefined($name)) {
return false;
}


if (!$this->writer->write($name, $value)) {
return false;
}


$this->loaded[$name] = '';

return true;
}








public function delete(string $name)
{

if ($this->isExternallyDefined($name)) {
return false;
}


if (!$this->writer->delete($name)) {
return false;
}


unset($this->loaded[$name]);

return true;
}










private function isExternallyDefined(string $name)
{
return $this->reader->read($name)->isDefined() && !isset($this->loaded[$name]);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

interface WriterInterface
{








public function write(string $name, string $value);








public function delete(string $name);
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

use PhpOption\None;
use PhpOption\Option;
use PhpOption\Some;

final class ApacheAdapter implements AdapterInterface
{





private function __construct()
{

}






public static function create()
{
if (self::isSupported()) {

return Some::create(new self());
}

return None::create();
}








private static function isSupported()
{
return \function_exists('apache_getenv') && \function_exists('apache_setenv');
}








public function read(string $name)
{

return Option::fromValue(apache_getenv($name))->filter(static function ($value) {
return \is_string($value) && $value !== '';
});
}









public function write(string $name, string $value)
{
return apache_setenv($name, $value);
}








public function delete(string $name)
{
return apache_setenv($name, '');
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Repository\Adapter;

final class MultiWriter implements WriterInterface
{





private $writers;








public function __construct(array $writers)
{
$this->writers = $writers;
}









public function write(string $name, string $value)
{
foreach ($this->writers as $writers) {
if (!$writers->write($name, $value)) {
return false;
}
}

return true;
}








public function delete(string $name)
{
foreach ($this->writers as $writers) {
if (!$writers->delete($name)) {
return false;
}
}

return true;
}
}
<?php

declare(strict_types=1);

namespace Dotenv;

use Dotenv\Exception\InvalidPathException;
use Dotenv\Loader\Loader;
use Dotenv\Loader\LoaderInterface;
use Dotenv\Parser\Parser;
use Dotenv\Parser\ParserInterface;
use Dotenv\Repository\Adapter\ArrayAdapter;
use Dotenv\Repository\Adapter\PutenvAdapter;
use Dotenv\Repository\RepositoryBuilder;
use Dotenv\Repository\RepositoryInterface;
use Dotenv\Store\StoreBuilder;
use Dotenv\Store\StoreInterface;
use Dotenv\Store\StringStore;

class Dotenv
{





private $store;






private $parser;






private $loader;






private $repository;











public function __construct(
StoreInterface $store,
ParserInterface $parser,
LoaderInterface $loader,
RepositoryInterface $repository
) {
$this->store = $store;
$this->parser = $parser;
$this->loader = $loader;
$this->repository = $repository;
}












public static function create(RepositoryInterface $repository, $paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$builder = $names === null ? StoreBuilder::createWithDefaultName() : StoreBuilder::createWithNoNames();

foreach ((array) $paths as $path) {
$builder = $builder->addPath($path);
}

foreach ((array) $names as $name) {
$builder = $builder->addName($name);
}

if ($shortCircuit) {
$builder = $builder->shortCircuit();
}

return new self($builder->fileEncoding($fileEncoding)->make(), new Parser(), new Loader(), $repository);
}











public static function createMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$repository = RepositoryBuilder::createWithDefaultAdapters()->make();

return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
}











public static function createUnsafeMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$repository = RepositoryBuilder::createWithDefaultAdapters()
->addAdapter(PutenvAdapter::class)
->make();

return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
}











public static function createImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$repository = RepositoryBuilder::createWithDefaultAdapters()->immutable()->make();

return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
}











public static function createUnsafeImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$repository = RepositoryBuilder::createWithDefaultAdapters()
->addAdapter(PutenvAdapter::class)
->immutable()
->make();

return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
}











public static function createArrayBacked($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null)
{
$repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make();

return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
}













public static function parse(string $content)
{
$repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make();

$phpdotenv = new self(new StringStore($content), new Parser(), new Loader(), $repository);

return $phpdotenv->load();
}








public function load()
{
$entries = $this->parser->parse($this->store->read());

return $this->loader->load($this->repository, $entries);
}








public function safeLoad()
{
try {
return $this->load();
} catch (InvalidPathException $e) {

return [];
}
}








public function required($variables)
{
return (new Validator($this->repository, (array) $variables))->required();
}








public function ifPresent($variables)
{
return new Validator($this->repository, (array) $variables);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Loader;

use Dotenv\Parser\Value;
use Dotenv\Repository\RepositoryInterface;
use Dotenv\Util\Regex;
use Dotenv\Util\Str;
use PhpOption\Option;

final class Resolver
{







private function __construct()
{

}












public static function resolve(RepositoryInterface $repository, Value $value)
{
return \array_reduce($value->getVars(), static function (string $s, int $i) use ($repository) {
return Str::substr($s, 0, $i).self::resolveVariable($repository, Str::substr($s, $i));
}, $value->getChars());
}









private static function resolveVariable(RepositoryInterface $repository, string $str)
{
return Regex::replaceCallback(
'/\A\${([a-zA-Z0-9_.]+)}/',
static function (array $matches) use ($repository) {

return Option::fromValue($repository->get($matches[1]))->getOrElse($matches[0]);
},
$str,
1
)->success()->getOrElse($str);
}
}
<?php

declare(strict_types=1);

namespace Dotenv\Loader;

use Dotenv\Repository\RepositoryInterface;

interface LoaderInterface
{








public function load(RepositoryInterface $repository, array $entries);
}
<?php

declare(strict_types=1);

namespace Dotenv\Loader;

use Dotenv\Parser\Entry;
use Dotenv\Parser\Value;
use Dotenv\Repository\RepositoryInterface;

final class Loader implements LoaderInterface
{











public function load(RepositoryInterface $repository, array $entries)
{

return \array_reduce($entries, static function (array $vars, Entry $entry) use ($repository) {
$name = $entry->getName();

$value = $entry->getValue()->map(static function (Value $value) use ($repository) {
return Resolver::resolve($repository, $value);
});

if ($value->isDefined()) {
$inner = $value->get();
if ($repository->set($name, $inner)) {
return \array_merge($vars, [$name => $inner]);
}
} else {
if ($repository->clear($name)) {
return \array_merge($vars, [$name => null]);
}
}

return $vars;
}, []);
}
}
MIT License

Copyright (c) 2012-2018 Matt Humphrey <matth@windsor-telecom.co.uk>
Copyright (c) 2018-2025 Graham Campbell <hello@gjcampbell.co.uk>

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.
<?php

declare(strict_types=1);











namespace Gitlab;

use Gitlab\Api\DeployKeys;
use Gitlab\Api\Deployments;
use Gitlab\Api\Environments;
use Gitlab\Api\Events;
use Gitlab\Api\Groups;
use Gitlab\Api\GroupsBoards;
use Gitlab\Api\GroupsEpics;
use Gitlab\Api\GroupsMilestones;
use Gitlab\Api\IssueBoards;
use Gitlab\Api\IssueLinks;
use Gitlab\Api\Issues;
use Gitlab\Api\IssuesStatistics;
use Gitlab\Api\Jobs;
use Gitlab\Api\Keys;
use Gitlab\Api\MergeRequests;
use Gitlab\Api\Milestones;
use Gitlab\Api\ProjectNamespaces;
use Gitlab\Api\Projects;
use Gitlab\Api\Repositories;
use Gitlab\Api\RepositoryFiles;
use Gitlab\Api\ResourceIterationEvents;
use Gitlab\Api\ResourceLabelEvents;
use Gitlab\Api\ResourceMilestoneEvents;
use Gitlab\Api\ResourceStateEvents;
use Gitlab\Api\ResourceWeightEvents;
use Gitlab\Api\Schedules;
use Gitlab\Api\Search;
use Gitlab\Api\Snippets;
use Gitlab\Api\SystemHooks;
use Gitlab\Api\Tags;
use Gitlab\Api\Users;
use Gitlab\Api\Version;
use Gitlab\Api\Wiki;
use Gitlab\HttpClient\Builder;
use Gitlab\HttpClient\Plugin\Authentication;
use Gitlab\HttpClient\Plugin\ExceptionThrower;
use Gitlab\HttpClient\Plugin\History;
use Http\Client\Common\HttpMethodsClientInterface;
use Http\Client\Common\Plugin\AddHostPlugin;
use Http\Client\Common\Plugin\HeaderDefaultsPlugin;
use Http\Client\Common\Plugin\HistoryPlugin;
use Http\Client\Common\Plugin\RedirectPlugin;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamFactoryInterface;






class Client
{





public const AUTH_HTTP_TOKEN = 'http_token';






public const AUTH_HTTP_JOB_TOKEN = 'http_job_token';






public const AUTH_OAUTH_TOKEN = 'oauth_token';






private const BASE_URL = 'https://gitlab.com';






private const USER_AGENT = 'gitlab-php-api-client/12.0';

private readonly Builder $httpClientBuilder;
private readonly History $responseHistory;

public function __construct(?Builder $httpClientBuilder = null)
{
$this->httpClientBuilder = $builder = $httpClientBuilder ?? new Builder();
$this->responseHistory = new History();

$builder->addPlugin(new ExceptionThrower());
$builder->addPlugin(new HistoryPlugin($this->responseHistory));
$builder->addPlugin(new HeaderDefaultsPlugin([
'User-Agent' => self::USER_AGENT,
]));
$builder->addPlugin(new RedirectPlugin());

$this->setUrl(self::BASE_URL);
}




public static function createWithHttpClient(ClientInterface $httpClient): self
{
$builder = new Builder($httpClient);

return new self($builder);
}

public function deployKeys(): DeployKeys
{
return new DeployKeys($this);
}

public function deployments(): Deployments
{
return new Deployments($this);
}

public function environments(): Environments
{
return new Environments($this);
}

public function events(): Events
{
return new Events($this);
}

public function groups(): Groups
{
return new Groups($this);
}

public function groupsBoards(): GroupsBoards
{
return new GroupsBoards($this);
}

public function groupsEpics(): GroupsEpics
{
return new GroupsEpics($this);
}

public function groupsMilestones(): GroupsMilestones
{
return new GroupsMilestones($this);
}

public function issueBoards(): IssueBoards
{
return new IssueBoards($this);
}

public function issueLinks(): IssueLinks
{
return new IssueLinks($this);
}

public function issues(): Issues
{
return new Issues($this);
}

public function resourceIterationEvents(): ResourceIterationEvents
{
return new ResourceIterationEvents($this);
}

public function resourceLabelEvents(): ResourceLabelEvents
{
return new ResourceLabelEvents($this);
}

public function resourceMilestoneEvents(): ResourceMilestoneEvents
{
return new ResourceMilestoneEvents($this);
}

public function resourceStateEvents(): ResourceStateEvents
{
return new ResourceStateEvents($this);
}

public function resourceWeightEvents(): ResourceWeightEvents
{
return new ResourceWeightEvents($this);
}

public function issuesStatistics(): IssuesStatistics
{
return new IssuesStatistics($this);
}

public function jobs(): Jobs
{
return new Jobs($this);
}

public function keys(): Keys
{
return new Keys($this);
}

public function mergeRequests(): MergeRequests
{
return new MergeRequests($this);
}

public function milestones(): Milestones
{
return new Milestones($this);
}

public function namespaces(): ProjectNamespaces
{
return new ProjectNamespaces($this);
}

public function projects(): Projects
{
return new Projects($this);
}

public function repositories(): Repositories
{
return new Repositories($this);
}

public function repositoryFiles(): RepositoryFiles
{
return new RepositoryFiles($this);
}

public function search(): Search
{
return new Search($this);
}

public function schedules(): Schedules
{
return new Schedules($this);
}

public function snippets(): Snippets
{
return new Snippets($this);
}

public function systemHooks(): SystemHooks
{
return new SystemHooks($this);
}

public function tags(): Tags
{
return new Tags($this);
}

public function users(): Users
{
return new Users($this);
}

public function version(): Version
{
return new Version($this);
}

public function wiki(): Wiki
{
return new Wiki($this);
}







public function authenticate(string $token, string $authMethod, ?string $sudo = null): void
{
$this->getHttpClientBuilder()->removePlugin(Authentication::class);
$this->getHttpClientBuilder()->addPlugin(new Authentication($authMethod, $token, $sudo));
}

public function setUrl(string $url): void
{
$uri = $this->getHttpClientBuilder()->getUriFactory()->createUri($url);

$this->getHttpClientBuilder()->removePlugin(AddHostPlugin::class);
$this->getHttpClientBuilder()->addPlugin(new AddHostPlugin($uri));
}




public function getLastResponse(): ?ResponseInterface
{
return $this->responseHistory->getLastResponse();
}




public function getHttpClient(): HttpMethodsClientInterface
{
return $this->getHttpClientBuilder()->getHttpClient();
}




public function getStreamFactory(): StreamFactoryInterface
{
return $this->getHttpClientBuilder()->getStreamFactory();
}




protected function getHttpClientBuilder(): Builder
{
return $this->httpClientBuilder;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\OptionsResolver;

class RepositoryFiles extends AbstractApi
{
public function getFile(int|string $project_id, string $file_path, string $ref): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/files/'.self::encodePath($file_path)), [
'ref' => $ref,
]);
}

public function getRawFile(int|string $project_id, string $file_path, string $ref): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/files/'.self::encodePath($file_path).'/raw'), [
'ref' => $ref,
]);
}














public function createFile(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setRequired('file_path');
$resolver->setRequired('branch');
$resolver->setDefined('start_branch');
$resolver->setDefined('encoding')
->setAllowedValues('encoding', ['text', 'base64'])
;
$resolver->setDefined('author_email');
$resolver->setDefined('author_name');
$resolver->setRequired('content');
$resolver->setRequired('commit_message');

$resolved = $resolver->resolve($parameters);

return $this->post($this->getProjectPath($project_id, 'repository/files/'.self::encodePath($resolved['file_path'])), $resolved);
}















public function updateFile(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setRequired('file_path');
$resolver->setRequired('branch');
$resolver->setDefined('start_branch');
$resolver->setDefined('encoding')
->setAllowedValues('encoding', ['text', 'base64'])
;
$resolver->setDefined('author_email');
$resolver->setDefined('author_name');
$resolver->setRequired('content');
$resolver->setRequired('commit_message');
$resolver->setDefined('last_commit_id');

$resolved = $resolver->resolve($parameters);

return $this->put($this->getProjectPath($project_id, 'repository/files/'.self::encodePath($resolved['file_path'])), $resolved);
}












public function deleteFile(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setRequired('file_path');
$resolver->setRequired('branch');
$resolver->setDefined('start_branch');
$resolver->setDefined('author_email');
$resolver->setDefined('author_name');
$resolver->setRequired('commit_message');

$resolved = $resolver->resolve($parameters);

return $this->delete($this->getProjectPath($project_id, 'repository/files/'.self::encodePath($resolved['file_path'])), $resolved);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\OptionsResolver;

class Environments extends AbstractApi
{
public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('name')
->setAllowedTypes('name', 'string');
$resolver->setDefined('search')
->setAllowedTypes('search', 'string');
$resolver->setDefined('states')
->setAllowedTypes('states', 'string')
->setAllowedValues('states', ['available', 'stopped']);

return $this->get($this->getProjectPath($project_id, 'environments'), $resolver->resolve($parameters));
}









public function create(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setDefined('name')
->setRequired('name')
->setAllowedTypes('name', 'string');
$resolver->setDefined('external_url')
->setAllowedTypes('external_url', 'string');
$resolver->setDefined('tier')
->setAllowedValues('tier', ['production', 'staging', 'testing', 'development', 'other']);

return $this->post($this->getProjectPath($project_id, 'environments'), $resolver->resolve($parameters));
}

public function remove(int|string $project_id, int $environment_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'environments/'.$environment_id));
}

public function stop(int|string $project_id, int $environment_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'environments/'.self::encodePath($environment_id).'/stop'));
}

public function show(int|string $project_id, int $environment_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'environments/'.self::encodePath($environment_id)));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class IssueBoards extends AbstractApi
{
public function all(int|string|null $project_id = null, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$path = null === $project_id ? 'boards' : $this->getProjectPath($project_id, 'boards');

return $this->get($path, $resolver->resolve($parameters));
}

public function show(int|string $project_id, int $board_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id)));
}

public function create(int|string $project_id, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'boards'), $params);
}

public function update(int|string $project_id, int $board_id, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id)), $params);
}

public function remove(int|string $project_id, int $board_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id)));
}

public function allLists(int|string $project_id, int $board_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id).'/lists'));
}

public function showList(int|string $project_id, int $board_id, int $list_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id)));
}

public function createList(int|string $project_id, int $board_id, int $label_id): mixed
{
$params = [
'label_id' => $label_id,
];

return $this->post($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id).'/lists'), $params);
}

public function updateList(int|string $project_id, int $board_id, int $list_id, int $position): mixed
{
$params = [
'position' => $position,
];

return $this->put($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id)), $params);
}

public function deleteList(int|string $project_id, int $board_id, int $list_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id)));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Issues extends AbstractApi
{



public const STATE_OPENED = 'opened';




public const STATE_CLOSED = 'closed';




















public function all(int|string|null $project_id = null, array $parameters = []): mixed
{
$path = null === $project_id ? 'issues' : $this->getProjectPath($project_id, 'issues');

return $this->get($path, $this->createOptionsResolver()->resolve($parameters));
}

public function group(int|string $group_id, array $parameters = []): mixed
{
return $this->get(
'groups/'.self::encodePath($group_id).'/issues',
$this->createOptionsResolver()->resolve($parameters)
);
}

public function show(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)));
}

public function create(int|string $project_id, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues'), $params);
}

public function update(int|string $project_id, int $issue_iid, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)), $params);
}

public function reorder(int|string $project_id, int $issue_iid, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/reorder', $params);
}

public function move(int|string $project_id, int $issue_iid, int|string $to_project_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/move', [
'to_project_id' => $to_project_id,
]);
}

public function remove(int|string $project_id, int $issue_iid): mixed
{
return $this->delete($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)));
}

public function showNotes(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/notes'));
}

public function showNote(int|string $project_id, int $issue_iid, int $note_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/notes/'.self::encodePath($note_id)));
}

public function addNote(int|string $project_id, int $issue_iid, string $body, array $params = []): mixed
{
$params['body'] = $body;

return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/notes'), $params);
}

public function updateNote(int|string $project_id, int $issue_iid, int $note_id, string $body, array $params = []): mixed
{
$params['body'] = $body;

return $this->put($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/notes/'.self::encodePath($note_id)), $params);
}

public function removeNote(int|string $project_id, int $issue_iid, int $note_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/notes/'.self::encodePath($note_id)));
}

public function showDiscussions(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/discussions');
}

public function showDiscussion(int|string $project_id, int $issue_iid, string $discussion_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/discussions/'.self::encodePath($discussion_id));
}

public function addDiscussion(int|string $project_id, int $issue_iid, string $body): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/discussions'), ['body' => $body]);
}

public function addDiscussionNote(int|string $project_id, int $issue_iid, string $discussion_id, string $body): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/discussions/'.self::encodePath($discussion_id).'/notes'), ['body' => $body]);
}

public function updateDiscussionNote(int|string $project_id, int $issue_iid, string $discussion_id, int $note_id, string $body): mixed
{
return $this->put($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/discussions/'.self::encodePath($discussion_id).'/notes/'.self::encodePath($note_id)), [
'body' => $body,
]);
}

public function removeDiscussionNote(int|string $project_id, int $issue_iid, string $discussion_id, int $note_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/discussions/'.self::encodePath($discussion_id).'/notes/'.self::encodePath($note_id)));
}

public function setTimeEstimate(int|string $project_id, int $issue_iid, string $duration): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/time_estimate'), ['duration' => $duration]);
}

public function resetTimeEstimate(int|string $project_id, int $issue_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/reset_time_estimate'));
}

public function addSpentTime(int|string $project_id, int $issue_iid, string $duration): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/add_spent_time'), ['duration' => $duration]);
}

public function resetSpentTime(int|string $project_id, int $issue_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/reset_spent_time'));
}

public function getTimeStats(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/time_stats'));
}










public function subscribe(int|string $project_id, int $issue_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/subscribe'));
}










public function unsubscribe(int|string $project_id, int $issue_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/unsubscribe'));
}

public function awardEmoji(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/award_emoji'));
}

public function removeAwardEmoji(int|string $project_id, int $issue_iid, int $award_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/award_emoji/'.self::encodePath($award_id)));
}

public function closedByMergeRequests(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/closed_by');
}

public function relatedMergeRequests(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/related_merge_requests'));
}

public function showParticipants(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/participants');
}

public function showResourceLabelEvents(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/resource_label_events');
}

public function showResourceLabelEvent(int|string $project_id, int $issue_iid, int $resource_label_event_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/resource_label_events/'.self::encodePath($resource_label_event_id));
}

protected function createOptionsResolver(): OptionsResolver
{
$resolver = parent::createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_OPENED, self::STATE_CLOSED])
;
$resolver->setDefined('labels');
$resolver->setDefined('milestone');
$resolver->setDefined('milestone_id')
->setAllowedTypes('milestone_id', 'integer');
$resolver->setDefined('with_labels_details')
->setAllowedTypes('with_labels_details', 'bool')
->setNormalizer('with_labels_details', $booleanNormalizer)
;
$resolver->setDefined('iids')
->setAllowedTypes('iids', 'array')
->setAllowedValues('iids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('scope')
->setAllowedValues('scope', ['created-by-me', 'assigned-to-me', 'all'])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'updated_at', 'priority', 'due_date', 'relative_position', 'label_priority', 'milestone_due', 'popularity', 'weight'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('confidential')
->setAllowedValues('confidential', [false, true])
;
$resolver->setDefined('search');
$resolver->setDefined('created_after');
$resolver->setDefined('created_before');
$resolver->setDefined('updated_after');
$resolver->setDefined('updated_before');
$resolver->setDefined('author_id')
->setAllowedTypes('author_id', 'integer')
;
$resolver->setDefined('assignee_id')
->setAllowedTypes('assignee_id', 'integer')
;
$resolver->setDefined('iteration_id')
->setAllowedTypes('iteration_id', 'integer')
;
$resolver->setDefined('iteration_title')
->setAllowedTypes('iteration_title', 'string')
;
$resolver->setDefined('weight')
->setAllowedTypes('weight', 'integer')
;

return $resolver;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ResourceStateEvents extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_state_events';

return $this->get($this->getProjectPath($project_id, $path));
}

public function show(int|string $project_id, int $issue_iid, int $resource_label_event_id): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_state_events/';
$path .= self::encodePath($resource_label_event_id);

return $this->get($this->getProjectPath($project_id, $path));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class IssueLinks extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/links');
}







public function create(int|string $project_id, int $issue_iid, int|string $target_project_id, int $target_issue_iid, array $parameters = []): mixed
{
$parameters['target_project_id'] = $target_project_id;
$parameters['target_issue_iid'] = $target_issue_iid;

return $this->post($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid).'/links'), $parameters);
}







public function remove(int|string $project_id, int $issue_iid, int|string $issue_link_id, array $parameters = []): mixed
{
return $this->delete($this->getProjectPath($project_id, 'issues/'.self::encodePath($issue_iid)).'/links/'.self::encodePath($issue_link_id), $parameters);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SystemHooks extends AbstractApi
{
public function all(): mixed
{
return $this->get('hooks');
}












public function create(string $url, array $parameters = []): mixed
{
$parameters = $this->createOptionsResolver()->resolve($parameters);

$parameters['url'] = $url;

return $this->post('hooks', $parameters);
}

public function test(int $id): mixed
{
return $this->get('hooks/'.self::encodePath($id));
}

public function remove(int $id): mixed
{
return $this->delete('hooks/'.self::encodePath($id));
}

protected function createOptionsResolver(): OptionsResolver
{
$resolver = new OptionsResolver();

$resolver->setDefined('token');

$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('push_events')
->setAllowedTypes('push_events', 'bool')
->setNormalizer('push_events', $booleanNormalizer)
;

$resolver->setDefined('tag_push_events')
->setAllowedTypes('tag_push_events', 'bool')
->setNormalizer('tag_push_events', $booleanNormalizer)
;

$resolver->setDefined('merge_requests_events')
->setAllowedTypes('merge_requests_events', 'bool')
->setNormalizer('merge_requests_events', $booleanNormalizer)
;

$resolver->setDefined('repository_update_events')
->setAllowedTypes('repository_update_events', 'bool')
->setNormalizer('repository_update_events', $booleanNormalizer)
;

$resolver->setDefined('enable_ssl_verification')
->setAllowedTypes('enable_ssl_verification', 'bool')
->setNormalizer('enable_ssl_verification', $booleanNormalizer)
;

return $resolver;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Psr\Http\Message\StreamInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Jobs extends AbstractApi
{



public const SCOPE_CREATED = 'created';




public const SCOPE_PENDING = 'pending';




public const SCOPE_RUNNING = 'running';




public const SCOPE_FAILED = 'failed';




public const SCOPE_SUCCESS = 'success';




public const SCOPE_CANCELED = 'canceled';




public const SCOPE_SKIPPED = 'skipped';




public const SCOPE_MANUAL = 'manual';








public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get('projects/'.self::encodePath($project_id).'/jobs', $resolver->resolve($parameters));
}








public function pipelineJobs(int|string $project_id, int $pipeline_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get(
$this->getProjectPath($project_id, 'pipelines/').self::encodePath($pipeline_id).'/jobs',
$resolver->resolve($parameters)
);
}









public function pipelineBridges(int|string $project_id, int $pipeline_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get(
$this->getProjectPath($project_id, 'pipelines/').self::encodePath($pipeline_id).'/bridges',
$resolver->resolve($parameters)
);
}

public function show(int|string $project_id, int $job_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id));
}

public function artifacts(int|string $project_id, int $job_id): StreamInterface
{
return $this->getAsResponse('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/artifacts')->getBody();
}

public function artifactsByRefName(int|string $project_id, string $ref_name, string $job_name): StreamInterface
{
return $this->getAsResponse('projects/'.self::encodePath($project_id).'/jobs/artifacts/'.self::encodePath($ref_name).'/download', [
'job' => $job_name,
])->getBody();
}

public function artifactByRefName(int|string $project_id, string $ref_name, string $job_name, string $artifact_path): StreamInterface
{
return $this->getAsResponse('projects/'.self::encodePath($project_id).'/jobs/artifacts/'.self::encodePath($ref_name).'/raw/'.self::encodePath($artifact_path), [
'job' => $job_name,
])->getBody();
}

public function artifactByJobId(int|string $project_id, int $job_id, string $artifact_path): StreamInterface
{
return $this->getAsResponse('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/artifacts/'.self::encodePath($artifact_path))->getBody();
}

public function trace(int|string $project_id, int $job_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/trace');
}

public function cancel(int|string $project_id, int $job_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/cancel');
}

public function retry(int|string $project_id, int $job_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/retry');
}

public function erase(int|string $project_id, int $job_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/erase');
}

public function keepArtifacts(int|string $project_id, int $job_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/artifacts/keep');
}

public function play(int|string $project_id, int $job_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/jobs/'.self::encodePath($job_id).'/play');
}

protected function createOptionsResolver(): OptionsResolver
{
$allowedScopeValues = [
self::SCOPE_CANCELED,
self::SCOPE_CREATED,
self::SCOPE_FAILED,
self::SCOPE_MANUAL,
self::SCOPE_PENDING,
self::SCOPE_RUNNING,
self::SCOPE_SKIPPED,
self::SCOPE_SUCCESS,
];

$resolver = parent::createOptionsResolver();
$resolver->setDefined('scope')
->setAllowedTypes('scope', ['string', 'array'])
->setAllowedValues('scope', $allowedScopeValues)
->addAllowedValues('scope', function ($value) use ($allowedScopeValues) {
return \is_array($value) && 0 === \count(\array_diff($value, $allowedScopeValues));
})
->setNormalizer('scope', function (OptionsResolver $resolver, $value) {
return (array) $value;
})
;

$resolver->setDefined('include_retried')
->setAllowedTypes('include_retried', ['bool']);

return $resolver;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Projects extends AbstractApi
{


































public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};
$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$orderBy = [
'id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at',
'repository_size', 'storage_size', 'packages_size', 'wiki_size',
];
$resolver->setDefined('order_by')
->setAllowedValues('order_by', $orderBy)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('search_namespaces')
->setAllowedTypes('search_namespaces', 'bool')
->setNormalizer('search_namespaces', $booleanNormalizer)
;
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('membership')
->setAllowedTypes('membership', 'bool')
->setNormalizer('membership', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;
$resolver->setDefined('id_after')
->setAllowedTypes('id_after', 'integer')
;
$resolver->setDefined('id_before')
->setAllowedTypes('id_before', 'integer')
;
$resolver->setDefined('last_activity_after')
->setAllowedTypes('last_activity_after', \DateTimeInterface::class)
->setNormalizer('last_activity_after', $datetimeNormalizer)
;
$resolver->setDefined('last_activity_before')
->setAllowedTypes('last_activity_before', \DateTimeInterface::class)
->setNormalizer('last_activity_before', $datetimeNormalizer)
;
$resolver->setDefined('repository_checksum_failed')
->setAllowedTypes('repository_checksum_failed', 'bool')
->setNormalizer('repository_checksum_failed', $booleanNormalizer)
;
$resolver->setDefined('repository_storage');
$resolver->setDefined('wiki_checksum_failed')
->setAllowedTypes('wiki_checksum_failed', 'bool')
->setNormalizer('wiki_checksum_failed', $booleanNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;
$resolver->setDefined('with_programming_language');
$resolver->setDefined('topic');

return $this->get('projects', $resolver->resolve($parameters));
}








public function show(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): bool {
return (bool) $value;
};
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;

return $this->get('projects/'.self::encodePath($project_id), $resolver->resolve($parameters));
}

public function create(string $name, array $parameters = []): mixed
{
$parameters['name'] = $name;

return $this->post('projects', $parameters);
}

public function createForUser(int $user_id, string $name, array $parameters = []): mixed
{
$parameters['name'] = $name;

return $this->post('projects/user/'.self::encodePath($user_id), $parameters);
}

public function update(int|string $project_id, array $parameters): mixed
{
return $this->put('projects/'.self::encodePath($project_id), $parameters);
}

public function remove(int|string $project_id): mixed
{
return $this->delete('projects/'.self::encodePath($project_id));
}

public function archive(int|string $project_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/archive');
}

public function unarchive(int|string $project_id): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/unarchive');
}

public function triggers(int|string $project_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/triggers');
}

public function trigger(int|string $project_id, int $trigger_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'triggers/'.self::encodePath($trigger_id)));
}

public function createTrigger(int|string $project_id, string $description): mixed
{
return $this->post($this->getProjectPath($project_id, 'triggers'), [
'description' => $description,
]);
}

public function removeTrigger(int|string $project_id, int $trigger_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'triggers/'.self::encodePath($trigger_id)));
}

public function triggerPipeline(int|string $project_id, string $ref, string $token, array $variables = []): mixed
{
return $this->post($this->getProjectPath($project_id, 'trigger/pipeline'), [
'ref' => $ref,
'token' => $token,
'variables' => $variables,
]);
}

public function disableRunner(int $project_id, int $runner_id): mixed
{
return $this->delete('projects/'.self::encodePath($project_id).'/runners/'.self::encodePath($runner_id));
}

public function enableRunner(int $project_id, int $runner_id): mixed
{
$parameters = [
'runner_id' => $runner_id,
];

return $this->post('projects/'.self::encodePath($project_id).'/runners', $parameters);
}
















public function pipelines(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->setDefined('scope')
->setAllowedValues('scope', ['running', 'pending', 'finished', 'branches', 'tags'])
;
$resolver->setDefined('status')
->setAllowedValues('status', ['running', 'pending', 'success', 'failed', 'canceled', 'skipped'])
;
$resolver->setDefined('ref');
$resolver->setDefined('sha');
$resolver->setDefined('yaml_errors')
->setAllowedTypes('yaml_errors', 'bool')
->setNormalizer('yaml_errors', $booleanNormalizer)
;
$resolver->setDefined('name');
$resolver->setDefined('username');
$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['id', 'status', 'ref', 'updated_at', 'user_id'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('source')
->setAllowedValues('source', ['push', 'web', 'trigger', 'schedule', 'api', 'external', 'pipeline', 'chat', 'webide', 'merge_request_event', 'external_pull_request_event', 'parent_pipeline', 'ondemand_dast_scan', 'ondemand_dast_validation'])
;

return $this->get($this->getProjectPath($project_id, 'pipelines'), $resolver->resolve($parameters));
}

public function pipeline(int|string $project_id, int $pipeline_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)));
}

public function pipelineJobs(int|string $project_id, int $pipeline_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/jobs'));
}

public function pipelineVariables(int|string $project_id, int $pipeline_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/variables'));
}

public function pipelineTestReport(int|string $project_id, int $pipeline_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/test_report'));
}

public function pipelineTestReportSummary(int|string $project_id, int $pipeline_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/test_report_summary'));
}









public function createPipeline(int|string $project_id, string $commit_ref, ?array $variables = null): mixed
{
$parameters = [];

if (null !== $variables) {
$parameters['variables'] = $variables;
}

return $this->post($this->getProjectPath($project_id, 'pipeline'), $parameters, [], [], [
'ref' => $commit_ref,
]);
}

public function retryPipeline(int|string $project_id, int $pipeline_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)).'/retry');
}

public function cancelPipeline(int|string $project_id, int $pipeline_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)).'/cancel');
}

public function deletePipeline(int|string $project_id, int $pipeline_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)));
}

public function allMembers(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('query');
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;

return $this->get('projects/'.self::encodePath($project_id).'/members/all', $resolver->resolve($parameters));
}







public function members(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$resolver->setDefined('query')
->setAllowedTypes('query', 'string')
;
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;

return $this->get($this->getProjectPath($project_id, 'members'), $resolver->resolve($parameters));
}

public function member(int|string $project_id, int $user_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)));
}

public function allMember(int|string $project_id, int $user_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'members/all/'.self::encodePath($user_id)));
}

public function addMember(int|string $project_id, int $user_id, int $access_level, ?string $expires_at = null): mixed
{
$params = [
'user_id' => $user_id,
'access_level' => $access_level,
];
if (null !== $expires_at) {
$params['expires_at'] = $expires_at;
}

return $this->post($this->getProjectPath($project_id, 'members'), $params);
}

public function saveMember(int|string $project_id, int $user_id, int $access_level, ?string $expires_at = null): mixed
{
$params = [
'access_level' => $access_level,
];
if (null !== $expires_at) {
$params['expires_at'] = $expires_at;
}

return $this->put($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)), $params);
}

public function removeMember(int|string $project_id, int $user_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)));
}

public function hooks(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get($this->getProjectPath($project_id, 'hooks'), $resolver->resolve($parameters));
}

public function hook(int|string $project_id, int $hook_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)));
}






public function users(int|string $project_id, array $parameters = []): mixed
{
return $this->get($this->getProjectPath($project_id, 'users'), $parameters);
}






public function issues(int|string $project_id, array $parameters = []): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues'), $parameters);
}






public function boards(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'boards'));
}










public function iterations(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'upcoming', 'current', 'current (previously started)', 'closed', 'all'])
;
$resolver->setDefined('include_ancestors')
->setAllowedTypes('include_ancestors', 'bool')
->setNormalizer('include_ancestors', $booleanNormalizer)
->setDefault('include_ancestors', true)
;

return $this->get('projects/'.self::encodePath($project_id).'/iterations', $resolver->resolve($parameters));
}










public function getRepositoryCommitDiscussions(int|string $project_id, string $commit_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($commit_id)).'/discussions');
}

public function addHook(int|string $project_id, string $url, array $parameters = []): mixed
{
if (0 === \count($parameters)) {
$parameters = ['push_events' => true];
}

$parameters['url'] = $url;

return $this->post($this->getProjectPath($project_id, 'hooks'), $parameters);
}

public function updateHook(int|string $project_id, int $hook_id, array $parameters): mixed
{
return $this->put($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)), $parameters);
}

public function removeHook(int|string $project_id, int $hook_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)));
}

public function transfer(int|string $project_id, mixed $namespace): mixed
{
return $this->put($this->getProjectPath($project_id, 'transfer'), ['namespace' => $namespace]);
}

public function deployKeys(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'deploy_keys'));
}

public function deployKey(int|string $project_id, int $key_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id)));
}

public function addDeployKey(int|string $project_id, string $title, string $key, bool $canPush = false): mixed
{
return $this->post($this->getProjectPath($project_id, 'deploy_keys'), [
'title' => $title,
'key' => $key,
'can_push' => $canPush,
]);
}

public function deleteDeployKey(int|string $project_id, int $key_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id)));
}

public function enableDeployKey(int|string $project_id, int $key_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id).'/enable'));
}

public function deployTokens(int|string $project_id, ?bool $active = null): mixed
{
return $this->get($this->getProjectPath($project_id, 'deploy_tokens'), (null !== $active) ? ['active' => $active] : []);
}










public function createDeployToken(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->define('name')
->required()
;

$resolver->define('scopes')
->required()
->allowedTypes('array')
->allowedValues(function ($scopes) {
$allowed = ['read_repository', 'read_registry', 'write_registry', 'read_package_registry', 'write_package_registry'];
foreach ($scopes as $scope) {
if (!\in_array($scope, $allowed, true)) {
return false;
}
}

return true;
})
;
$resolver->setDefined('username')
->setAllowedTypes('username', 'string')
;

$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;

return $this->post($this->getProjectPath($project_id, 'deploy_tokens'), $resolver->resolve($parameters));
}

public function deleteDeployToken(int|string $project_id, int $token_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'deploy_tokens/'.self::encodePath($token_id)));
}











public function events(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->setDefined('action')
->setAllowedValues('action', ['created', 'updated', 'closed', 'reopened', 'pushed', 'commented', 'merged', 'joined', 'left', 'destroyed', 'expired', 'approved'])
;
$resolver->setDefined('target_type')
->setAllowedValues('target_type', ['issue', 'milestone', 'merge_request', 'note', 'project', 'snippet', 'user'])
;
$resolver->setDefined('before')
->setAllowedTypes('before', \DateTimeInterface::class)
->setNormalizer('before', $datetimeNormalizer);
$resolver->setDefined('after')
->setAllowedTypes('after', \DateTimeInterface::class)
->setNormalizer('after', $datetimeNormalizer)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;

return $this->get($this->getProjectPath($project_id, 'events'), $resolver->resolve($parameters));
}









public function labels(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$resolver->setDefined('with_counts')
->setAllowedTypes('with_counts', 'bool');

$resolver->setDefined('include_ancestor_groups')
->setAllowedTypes('include_ancestor_groups', 'bool');

$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

return $this->get($this->getProjectPath($project_id, 'labels'), $resolver->resolve($parameters));
}

public function addLabel(int|string $project_id, array $parameters): mixed
{
return $this->post($this->getProjectPath($project_id, 'labels'), $parameters);
}

public function updateLabel(int|string $project_id, int $label_id, array $parameters): mixed
{
return $this->put($this->getProjectPath($project_id, 'labels/'.self::encodePath($label_id)), $parameters);
}

public function removeLabel(int|string $project_id, int $label_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'labels/'.self::encodePath($label_id)));
}




public function languages(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'languages'));
}
























public function forks(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};
$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$orderBy = [
'id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at',
'repository_size', 'storage_size', 'packages_size', 'wiki_size',
];
$resolver->setDefined('order_by')
->setAllowedValues('order_by', $orderBy)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('membership')
->setAllowedTypes('membership', 'bool')
->setNormalizer('membership', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;
$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;

return $this->get($this->getProjectPath($project_id, 'forks'), $resolver->resolve($parameters));
}









public function fork(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setDefined(['namespace', 'path', 'name']);

$resolved = $resolver->resolve($parameters);

return $this->post($this->getProjectPath($project_id, 'fork'), $resolved);
}

public function createForkRelation(int|string $project_id, int|string $forked_project_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'fork/'.self::encodePath($forked_project_id)));
}

public function removeForkRelation(int|string $project_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'fork'));
}

public function setService(int|string $project_id, string $service_name, array $parameters = []): mixed
{
return $this->put($this->getProjectPath($project_id, 'services/'.self::encodePath($service_name)), $parameters);
}

public function removeService(int|string $project_id, string $service_name): mixed
{
return $this->delete($this->getProjectPath($project_id, 'services/'.self::encodePath($service_name)));
}

public function variables(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get($this->getProjectPath($project_id, 'variables'), $resolver->resolve($parameters));
}

public function variable(int|string $project_id, string $key, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('filter')
->setAllowedTypes('filter', 'array');

return $this->get($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)), $resolver->resolve($parameters));
}







public function addVariable(int|string $project_id, string $key, string $value, ?bool $protected = null, ?string $environment_scope = null, array $parameters = []): mixed
{
$payload = [
'key' => $key,
'value' => $value,
];

if ($protected) {
$payload['protected'] = $protected;
}

if ($environment_scope) {
$payload['environment_scope'] = $environment_scope;
}

$payload = \array_merge($parameters, $payload);

return $this->post($this->getProjectPath($project_id, 'variables'), $payload);
}







public function updateVariable(int|string $project_id, string $key, string $value, ?bool $protected = null, ?string $environment_scope = null, array $parameters = []): mixed
{
$payload = [
'value' => $value,
];

if ($protected) {
$payload['protected'] = $protected;
}

if ($environment_scope) {
$payload['environment_scope'] = $environment_scope;
}

$payload = \array_merge($parameters, $payload);

return $this->put($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)), $payload);
}









public function removeVariable(int|string $project_id, string $key, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setDefined('filter')
->setAllowedTypes('filter', 'array');

return $this->delete($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)), $resolver->resolve($parameters));
}

public function uploadFile(int|string $project_id, string $file): mixed
{
return $this->post($this->getProjectPath($project_id, 'uploads'), [], [], ['file' => $file]);
}

public function uploadAvatar(int|string $project_id, string $file): mixed
{
return $this->put('projects/'.self::encodePath($project_id), [], [], ['avatar' => $file]);
}




public function deployments(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->setDefined('order_by')
->setAllowedTypes('order_by', 'string')
->setAllowedValues('order_by', ['id', 'iid', 'created_at', 'updated_at', 'finished_at', 'ref'])
;

$resolver->setDefined('sort')
->setAllowedTypes('sort', 'string')
->setAllowedValues('sort', ['asc', 'desc'])
;

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;

$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;

$resolver->setDefined('finished_after')
->setAllowedTypes('finished_after', \DateTimeInterface::class)
->setNormalizer('finished_after', $datetimeNormalizer)
;

$resolver->setDefined('finished_before')
->setAllowedTypes('finished_before', \DateTimeInterface::class)
->setNormalizer('finished_before', $datetimeNormalizer)
;

$resolver->setDefined('environment')
->setAllowedTypes('environment', 'string')
;

$resolver->setDefined('status')
->setAllowedTypes('status', 'string')
->setAllowedValues('status', ['created', 'running', 'success', 'failed', 'canceled', 'blocked'])
;

return $this->get($this->getProjectPath($project_id, 'deployments'), $resolver->resolve($parameters));
}

public function deployment(int|string $project_id, int $deployment_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'deployments/'.self::encodePath($deployment_id)));
}

public function addShare(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$datetimeNormalizer = function (OptionsResolver $optionsResolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->setRequired('group_id')
->setAllowedTypes('group_id', 'int');

$resolver->setRequired('group_access')
->setAllowedTypes('group_access', 'int')
->setAllowedValues('group_access', self::ACCESS_LEVELS);

$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;

return $this->post($this->getProjectPath($project_id, 'share'), $resolver->resolve($parameters));
}

public function removeShare(int|string $project_id, int|string $group_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'share/'.$group_id));
}

public function badges(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'badges'));
}

public function badge(int|string $project_id, int $badge_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)));
}

public function addBadge(int|string $project_id, array $parameters = []): mixed
{
return $this->post($this->getProjectPath($project_id, 'badges'), $parameters);
}

public function removeBadge(int|string $project_id, int $badge_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)));
}

public function updateBadge(int|string $project_id, int $badge_id, array $parameters = []): mixed
{
return $this->put($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)), $parameters);
}

public function protectedBranches(int|string $project_id, array $parameters = []): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_branches');
}

public function addProtectedBranch(int|string $project_id, array $parameters = []): mixed
{
return $this->post($this->getProjectPath($project_id, 'protected_branches'), $parameters);
}

public function deleteProtectedBranch(int|string $project_id, string $branch_name): mixed
{
return $this->delete($this->getProjectPath($project_id, 'protected_branches/'.self::encodePath($branch_name)));
}

public function updateProtectedBranch(int|string $project_id, string $branch_name, array $parameters = []): mixed
{
return $this->patch($this->getProjectPath($project_id, 'protected_branches/'.self::encodePath($branch_name)), $parameters);
}

public function approvalsConfiguration(int|string $project_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/approvals');
}

public function updateApprovalsConfiguration(int|string $project_id, array $parameters = []): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/approvals', $parameters);
}

public function approvalsRules(int|string $project_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/approval_rules');
}

public function createApprovalsRule(int|string $project_id, array $parameters = []): mixed
{
return $this->post('projects/'.self::encodePath($project_id).'/approval_rules/', $parameters);
}

public function updateApprovalsRule(int|string $project_id, int $approval_rule_id, array $parameters = []): mixed
{
return $this->put('projects/'.self::encodePath($project_id).'/approval_rules/'.self::encodePath($approval_rule_id), $parameters);
}

public function deleteApprovalsRule(int|string $project_id, int $approval_rule_id): mixed
{
return $this->delete('projects/'.self::encodePath($project_id).'/approval_rules/'.self::encodePath($approval_rule_id));
}

public function deleteAllMergedBranches(int|string $project_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'repository/merged_branches'));
}

public function projectAccessTokens(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'access_tokens'));
}

public function projectAccessToken(int|string $project_id, int|string $token_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'access_tokens/'.self::encodePath($token_id)));
}










public function createProjectAccessToken(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->define('name')
->required()
;

$resolver->define('scopes')
->required()
->allowedTypes('array')
->allowedValues(function ($scopes) {
$allowed = ['api', 'read_api', 'read_registry', 'write_registry', 'read_repository', 'write_repository'];
foreach ($scopes as $scope) {
if (!\in_array($scope, $allowed, true)) {
return false;
}
}

return true;
})
;

$resolver->setDefined('access_level')
->setAllowedTypes('access_level', 'int')
->setAllowedValues('access_level', [10, 20, 30, 40, 50])
;

$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;

return $this->post($this->getProjectPath($project_id, 'access_tokens'), $resolver->resolve($parameters));
}

public function deleteProjectAccessToken(int|string $project_id, int|string $token_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'access_tokens/'.$token_id));
}

public function protectedTags(int|string $project_id): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_tags');
}

public function protectedTag(int|string $project_id, string $tag_name): mixed
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_tags/'.self::encodePath($tag_name));
}

public function addProtectedTag(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setDefined('name')
->setAllowedTypes('name', 'string')
->setRequired('name')
;
$resolver->setDefined('create_access_level')
->setAllowedTypes('create_access_level', 'int')
->setAllowedValues('create_access_level', [0, 30, 40])
;
$resolver->setDefined('allowed_to_create')
->setAllowedTypes('allowed_to_create', 'array')
->setAllowedValues('allowed_to_create', function (array $value) {
$keys = \array_keys((array) \call_user_func_array('array_merge', $value));
$diff = \array_diff($keys, ['user_id', 'group_id', 'access_level']);
$values = \array_map(function ($item) {
return \array_values($item)[0] ?? '';
}, $value);
$integer = \count($values) === \count(\array_filter($values, 'is_int'));

return \count($value) > 0 && 0 === \count($diff) && $integer;
})
;

return $this->post($this->getProjectPath($project_id, 'protected_tags'), $resolver->resolve($parameters));
}

public function deleteProtectedTag(int|string $project_id, string $tag_name): mixed
{
return $this->delete($this->getProjectPath($project_id, 'protected_tags/'.self::encodePath($tag_name)));
}
















public function search(int|string $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);
$scope = [
'blobs',
'commits',
'issues',
'merge_requests',
'milestones',
'notes',
'users',
'wiki_blobs',
];
$resolver->setRequired('scope')
->setAllowedValues('scope', $scope);
$resolver->setRequired('search');
$resolver->setDefined('ref')
->setAllowedTypes('ref', 'string');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'closed']);

return $this->get('projects/'.self::encodePath($id).'/search', $resolver->resolve($parameters));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;

class Packages extends AbstractApi
{















public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'name', 'version', 'type'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('package_type')
->setAllowedValues('package_type', ['conan', 'maven', 'npm', 'pypi', 'composer', 'nuget', 'golang'])
;
$resolver->setDefined('package_name');
$resolver->setDefined('include_versionless')
->setAllowedTypes('include_versionless', 'bool')
->setNormalizer('include_versionless', function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
})
;
$resolver->setDefined('status')
->setAllowedValues('status', ['default', 'hidden', 'processing'])
;

return $this->get($this->getProjectPath($project_id, 'packages'), $resolver->resolve($parameters));
}

public function show(int|string $project_id, int $package_id): mixed
{
return $this->get($this->getPackagePath($project_id, $package_id));
}

public function allFiles(int|string $project_id, int $package_id): mixed
{
return $this->get($this->getPackagePath($project_id, $package_id).'/package_files');
}

public function remove(int|string $project_id, int $package_id): mixed
{
return $this->delete($this->getPackagePath($project_id, $package_id));
}

public function removeFile(int|string $project_id, int $package_id, int $package_file_id): mixed
{
return $this->delete(
$this->getPackagePath($project_id, $package_id).'/package_files/'.self::encodePath($package_file_id)
);
}

public function addGenericFile(int|string $project_id, string $package_name, string $package_version, string $file, string $status = 'default'): mixed
{
return $this->putFile(
$this->getProjectPath(
$project_id,
'packages/generic/'.self::encodePath($package_name).'/'.self::encodePath($package_version).'/'.self::encodePath(\basename($file))
),
$file,
[],
['status' => $status]
);
}

private function getPackagePath(int|string $project_id, int $package_id): string
{
return $this->getProjectPath($project_id, 'packages/'.self::encodePath($package_id));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;

class Users extends AbstractApi
{














public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->setDefined('search');
$resolver->setDefined('username');
$resolver->setDefined('external')
->setAllowedTypes('external', 'bool')
;
$resolver->setDefined('extern_uid');
$resolver->setDefined('provider');
$resolver->setDefined('created_before')
->setAllowedTypes('created_before', \DateTimeInterface::class)
->setNormalizer('created_before', $datetimeNormalizer)
;
$resolver->setDefined('created_after')
->setAllowedTypes('created_after', \DateTimeInterface::class)
->setNormalizer('created_after', $datetimeNormalizer)
;
$resolver->setDefined('active')
->setAllowedTypes('active', 'bool')
->setAllowedValues('active', true)
;
$resolver->setDefined('blocked')
->setAllowedTypes('blocked', 'bool')
->setAllowedValues('blocked', true)
;

return $this->get('users', $resolver->resolve($parameters));
}

public function show(int $id): mixed
{
return $this->get('users/'.self::encodePath($id));
}







public function usersMemberships(int $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('type')
->setAllowedValues('type', ['Project', 'Namespace'])
;

return $this->get('users/'.self::encodePath($id).'/memberships', $resolver->resolve($parameters));
}




















public function usersProjects(int $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('membership')
->setAllowedTypes('membership', 'bool')
->setNormalizer('membership', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;

return $this->get('users/'.self::encodePath($id).'/projects', $resolver->resolve($parameters));
}





















public function usersStarredProjects(int $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('membership')
->setAllowedTypes('membership', 'bool')
->setNormalizer('membership', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;

return $this->get('users/'.self::encodePath($id).'/starred_projects', $resolver->resolve($parameters));
}

public function user(): mixed
{
return $this->get('user');
}

public function create(string $email, string $password, array $params = []): mixed
{
$params['email'] = $email;
$params['password'] = $password;

return $this->post('users', $params);
}

public function update(int $id, array $params, array $files = []): mixed
{
return $this->put('users/'.self::encodePath($id), $params, [], $files);
}








public function remove(int $id, array $params = []): mixed
{
return $this->delete('users/'.self::encodePath($id), $params);
}

public function block(int $id): mixed
{
return $this->post('users/'.self::encodePath($id).'/block');
}

public function unblock(int $id): mixed
{
return $this->post('users/'.self::encodePath($id).'/unblock');
}

public function activate(int $id): mixed
{
return $this->post('users/'.self::encodePath($id).'/activate');
}

public function deactivate(int $id): mixed
{
return $this->post('users/'.self::encodePath($id).'/deactivate');
}

public function me(): mixed
{
return $this->get('user');
}

public function keys(): mixed
{
return $this->get('user/keys');
}

public function key(int $id): mixed
{
return $this->get('user/keys/'.self::encodePath($id));
}

public function createKey(string $title, string $key): mixed
{
return $this->post('user/keys', [
'title' => $title,
'key' => $key,
]);
}

public function removeKey(int $id): mixed
{
return $this->delete('user/keys/'.self::encodePath($id));
}

public function userKeys(int $user_id): mixed
{
return $this->get('users/'.self::encodePath($user_id).'/keys');
}

public function userKey(int $user_id, int $key_id): mixed
{
return $this->get('users/'.self::encodePath($user_id).'/keys/'.self::encodePath($key_id));
}

public function createKeyForUser(int $user_id, string $title, string $key): mixed
{
return $this->post('users/'.self::encodePath($user_id).'/keys', [
'title' => $title,
'key' => $key,
]);
}

public function removeUserKey(int $user_id, int $key_id): mixed
{
return $this->delete('users/'.self::encodePath($user_id).'/keys/'.self::encodePath($key_id));
}

public function emails(): mixed
{
return $this->get('user/emails');
}

public function email(int $id): mixed
{
return $this->get('user/emails/'.self::encodePath($id));
}

public function userEmails(int $user_id): mixed
{
return $this->get('users/'.self::encodePath($user_id).'/emails');
}

public function createEmailForUser(int $user_id, string $email, bool $skip_confirmation = false): mixed
{
return $this->post('users/'.self::encodePath($user_id).'/emails', [
'email' => $email,
'skip_confirmation' => $skip_confirmation,
]);
}

public function removeUserEmail(int $user_id, int $email_id): mixed
{
return $this->delete('users/'.self::encodePath($user_id).'/emails/'.self::encodePath($email_id));
}

public function userImpersonationTokens(int $user_id, array $params = []): mixed
{
$resolver = $this->createOptionsResolver();

$resolver->setDefined('state')
->setAllowedValues('state', ['all', 'active', 'inactive'])
;

return $this->get('users/'.self::encodePath($user_id).'/impersonation_tokens', $resolver->resolve($params));
}

public function userImpersonationToken(int $user_id, int $impersonation_token_id): mixed
{
return $this->get('users/'.self::encodePath($user_id).'/impersonation_tokens/'.self::encodePath($impersonation_token_id));
}

public function createImpersonationToken(int $user_id, string $name, array $scopes, ?string $expires_at = null): mixed
{
return $this->post('users/'.self::encodePath($user_id).'/impersonation_tokens', [
'name' => $name,
'scopes' => $scopes,
'expires_at' => $expires_at,
]);
}

public function removeImpersonationToken(int $user_id, int $impersonation_token_id): mixed
{
return $this->delete('users/'.self::encodePath($user_id).'/impersonation_tokens/'.self::encodePath($impersonation_token_id));
}











public function events(int $user_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->setDefined('action')
->setAllowedValues('action', ['created', 'updated', 'closed', 'reopened', 'pushed', 'commented', 'merged', 'joined', 'left', 'destroyed', 'expired'])
;
$resolver->setDefined('target_type')
->setAllowedValues('target_type', ['issue', 'milestone', 'merge_request', 'note', 'project', 'snippet', 'user'])
;
$resolver->setDefined('before')
->setAllowedTypes('before', \DateTimeInterface::class)
->setNormalizer('before', $datetimeNormalizer);
$resolver->setDefined('after')
->setAllowedTypes('after', \DateTimeInterface::class)
->setNormalizer('after', $datetimeNormalizer)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;

return $this->get('users/'.self::encodePath($user_id).'/events', $resolver->resolve($parameters));
}




public function removeUserIdentity(int $user_id, string $provider): mixed
{
return $this->delete('users/'.self::encodePath($user_id).'/identities/'.self::encodePath($provider));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class IssuesStatistics extends AbstractApi
{
public function all(array $parameters): mixed
{
return $this->get('issues_statistics', $this->createOptionsResolver()->resolve($parameters));
}

public function project(int|string $project_id, array $parameters): mixed
{
return $this->get($this->getProjectPath($project_id, 'issues_statistics'), $this->createOptionsResolver()->resolve($parameters));
}

public function group(int|string $group_id, array $parameters): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/issues_statistics', $this->createOptionsResolver()->resolve($parameters));
}

protected function createOptionsResolver(): OptionsResolver
{
$resolver = new OptionsResolver();

$resolver->setDefined('milestone')
->setAllowedTypes('milestone', 'string');

$resolver->setDefined('labels')
->setAllowedTypes('labels', 'string');

$resolver->setDefined('scope')
->setAllowedValues('scope', ['created-by-me', 'assigned-to-me', 'all']);

$resolver->setDefined('author_id')
->setAllowedTypes('author_id', 'integer');

$resolver->setDefined('author_username')
->setAllowedTypes('author_username', 'string');

$resolver->setDefined('assignee_id')
->setAllowedTypes('assignee_id', 'integer');

$resolver->setDefined('assignee_username')
->setAllowedTypes('assignee_username', 'string');

$resolver->setDefined('my_reaction_emoji')
->setAllowedTypes('my_reaction_emoji', 'string');

$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->setDefined('created_after')
->setAllowedTypes('created_after', \DateTimeInterface::class)
->setNormalizer('created_after', $datetimeNormalizer);

$resolver->setDefined('created_before')
->setAllowedTypes('created_before', \DateTimeInterface::class)
->setNormalizer('created_before', $datetimeNormalizer);

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer);

$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer);

$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);

return $resolver;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Milestones extends AbstractApi
{



public const STATE_ACTIVE = 'active';




public const STATE_CLOSED = 'closed';









public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('iids')
->setAllowedTypes('iids', 'array')
->setAllowedValues('iids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ACTIVE, self::STATE_CLOSED])
;
$resolver->setDefined('search');

return $this->get($this->getProjectPath($project_id, 'milestones'), $resolver->resolve($parameters));
}

public function show(int|string $project_id, int $milestone_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'milestones/'.self::encodePath($milestone_id)));
}

public function create(int|string $project_id, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'milestones'), $params);
}

public function update(int|string $project_id, int $milestone_id, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'milestones/'.self::encodePath($milestone_id)), $params);
}

public function remove(int|string $project_id, int $milestone_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'milestones/'.self::encodePath($milestone_id)));
}

public function issues(int|string $project_id, int $milestone_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'milestones/'.self::encodePath($milestone_id).'/issues'));
}

public function mergeRequests(int|string $project_id, int $milestone_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'milestones/'.self::encodePath($milestone_id).'/merge_requests'));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Wiki extends AbstractApi
{



public function create(int|string $project_id, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'wikis'), $params);
}

public function show(int|string $project_id, string $wiki_slug): mixed
{
return $this->get($this->getProjectPath($project_id, 'wikis/'.self::encodePath($wiki_slug)));
}







public function showAll(int|string $project_id, array $params): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('with_content')
->setAllowedTypes('with_content', 'bool');

return $this->get($this->getProjectPath($project_id, 'wikis'), $resolver->resolve($params));
}




public function update(int|string $project_id, string $wiki_slug, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'wikis/'.self::encodePath($wiki_slug)), $params);
}

public function remove(int|string $project_id, string $wiki_slug): mixed
{
return $this->delete($this->getProjectPath($project_id, 'wikis/'.self::encodePath($wiki_slug)));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ResourceMilestoneEvents extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_milestone_events';

return $this->get($this->getProjectPath($project_id, $path));
}

public function show(int|string $project_id, int $issue_iid, int $resource_milestone_event_id): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_milestone_events/';
$path .= self::encodePath($resource_milestone_event_id);

return $this->get($this->getProjectPath($project_id, $path));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Version extends AbstractApi
{
public function show(): mixed
{
return $this->get('version');
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Gitlab\Client;
use Gitlab\Exception\RuntimeException;
use Gitlab\HttpClient\Message\ResponseMediator;
use Gitlab\HttpClient\Util\JsonArray;
use Gitlab\HttpClient\Util\QueryStringBuilder;
use Http\Message\MultipartStream\MultipartStreamBuilder;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;






abstract class AbstractApi
{





private const URI_PREFIX = '/api/v4/';









protected const ACCESS_LEVELS = [0, 10, 20, 30, 40, 50];

private readonly Client $client;

private ?int $perPage;

public function __construct(Client $client)
{
$this->client = $client;
$this->perPage = null;
}








protected function getAsResponse(string $uri, array $params = [], array $headers = []): ResponseInterface
{
if (null !== $this->perPage && !isset($params['per_page'])) {
$params['per_page'] = $this->perPage;
}

return $this->client->getHttpClient()->get(self::prepareUri($uri, $params), $headers);
}





protected function get(string $uri, array $params = [], array $headers = []): mixed
{
$response = $this->getAsResponse($uri, $params, $headers);

return ResponseMediator::getContent($response);
}







protected function post(string $uri, array $params = [], array $headers = [], array $files = [], array $uriParams = []): mixed
{
if (0 < \count($files)) {
$builder = $this->createMultipartStreamBuilder($params, $files);
$body = self::prepareMultipartBody($builder);
$headers = self::addMultipartContentType($headers, $builder);
} else {
$body = self::prepareJsonBody($params);

if (null !== $body) {
$headers = self::addJsonContentType($headers);
}
}

$response = $this->client->getHttpClient()->post(self::prepareUri($uri, $uriParams), $headers, $body);

return ResponseMediator::getContent($response);
}






protected function put(string $uri, array $params = [], array $headers = [], array $files = []): mixed
{
if (0 < \count($files)) {
$builder = $this->createMultipartStreamBuilder($params, $files);
$body = self::prepareMultipartBody($builder);
$headers = self::addMultipartContentType($headers, $builder);
} else {
$body = self::prepareJsonBody($params);

if (null !== $body) {
$headers = self::addJsonContentType($headers);
}
}

$response = $this->client->getHttpClient()->put(self::prepareUri($uri), $headers, $body ?? '');

return ResponseMediator::getContent($response);
}






protected function patch(string $uri, array $params = [], array $headers = [], array $files = []): mixed
{
if (0 < \count($files)) {
$builder = $this->createMultipartStreamBuilder($params, $files);
$body = self::prepareMultipartBody($builder);
$headers = self::addMultipartContentType($headers, $builder);
} else {
$body = self::prepareJsonBody($params);

if (null !== $body) {
$headers = self::addJsonContentType($headers);
}
}

$response = $this->client->getHttpClient()->patch(self::prepareUri($uri), $headers, $body ?? '');

return ResponseMediator::getContent($response);
}





protected function putFile(string $uri, string $file, array $headers = [], array $uriParams = []): mixed
{
$resource = self::tryFopen($file, 'r');
$body = $this->client->getStreamFactory()->createStreamFromResource($resource);

if ($body->isReadable()) {
$headers = \array_merge([ResponseMediator::CONTENT_TYPE_HEADER => self::guessFileContentType($file)], $headers);
}

$response = $this->client->getHttpClient()->put(self::prepareUri($uri, $uriParams), $headers, $body);

return ResponseMediator::getContent($response);
}





protected function delete(string $uri, array $params = [], array $headers = []): mixed
{
$body = self::prepareJsonBody($params);

if (null !== $body) {
$headers = self::addJsonContentType($headers);
}

$response = $this->client->getHttpClient()->delete(self::prepareUri($uri), $headers, $body ?? '');

return ResponseMediator::getContent($response);
}

protected static function encodePath(int|string $uri): string
{
return \rawurlencode((string) $uri);
}

protected function getProjectPath(int|string $id, string $uri): string
{
return 'projects/'.self::encodePath($id).'/'.$uri;
}




protected function createOptionsResolver(): OptionsResolver
{
$resolver = new OptionsResolver();
$resolver->setDefined('page')
->setAllowedTypes('page', 'int')
->setAllowedValues('page', function ($value): bool {
return $value > 0;
})
;
$resolver->setDefined('per_page')
->setAllowedTypes('per_page', 'int')
->setAllowedValues('per_page', function ($value): bool {
return $value > 0 && $value <= 100;
})
;

return $resolver;
}




private static function prepareUri(string $uri, array $query = []): string
{
$query = \array_filter($query, function ($value): bool {
return null !== $value;
});

return \sprintf('%s%s%s', self::URI_PREFIX, $uri, QueryStringBuilder::build($query));
}







private function createMultipartStreamBuilder(array $params = [], array $files = []): MultipartStreamBuilder
{
$builder = new MultipartStreamBuilder($this->client->getStreamFactory());

foreach ($params as $name => $value) {
$builder->addResource($name, $value);
}

foreach ($files as $name => $file) {
$builder->addResource($name, self::tryFopen($file, 'r'), [
'headers' => [
ResponseMediator::CONTENT_TYPE_HEADER => self::guessFileContentType($file),
],
'filename' => \basename($file),
]);
}

return $builder;
}




private static function prepareMultipartBody(MultipartStreamBuilder $builder): StreamInterface
{
return $builder->build();
}








private static function addMultipartContentType(array $headers, MultipartStreamBuilder $builder): array
{
$contentType = \sprintf('%s; boundary=%s', ResponseMediator::MULTIPART_CONTENT_TYPE, $builder->getBoundary());

return \array_merge([ResponseMediator::CONTENT_TYPE_HEADER => $contentType], $headers);
}






private static function prepareJsonBody(array $params): ?string
{
$params = \array_filter($params, function ($value): bool {
return null !== $value;
});

if (0 === \count($params)) {
return null;
}

return JsonArray::encode($params);
}








private static function addJsonContentType(array $headers): array
{
return \array_merge([ResponseMediator::CONTENT_TYPE_HEADER => ResponseMediator::JSON_CONTENT_TYPE], $headers);
}
















private static function tryFopen(string $filename, string $mode)
{
$ex = null;
\set_error_handler(function () use ($filename, $mode, &$ex): void {
$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 (null !== $ex) {
throw $ex;
}


return $handle;
}




private static function guessFileContentType(string $file): string
{
if (!\class_exists(\finfo::class, false)) {
return ResponseMediator::STREAM_CONTENT_TYPE;
}

$finfo = new \finfo(\FILEINFO_MIME_TYPE);
$type = $finfo->file($file);

return false !== $type ? $type : ResponseMediator::STREAM_CONTENT_TYPE;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ResourceIterationEvents extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_iteration_events';

return $this->get($this->getProjectPath($project_id, $path));
}

public function show(int|string $project_id, int $issue_iid, int $resource_iteration_event_id): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_iteration_events/';
$path .= self::encodePath($resource_iteration_event_id);

return $this->get($this->getProjectPath($project_id, $path));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\Options;

class Search extends AbstractApi
{














public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);
$scope = [
'projects',
'issues',
'merge_requests',
'milestones',
'snippet_titles',
'wiki_blobs',
'commits',
'blobs',
'notes',
'users',
];
$resolver->setRequired('scope')
->setAllowedValues('scope', $scope);
$resolver->setRequired('search');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'closed']);

return $this->get('search', $resolver->resolve($parameters));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Tags extends AbstractApi
{









public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['name', 'updated', 'version']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('search');

return $this->get($this->getProjectPath($project_id, 'repository/tags'), $resolver->resolve($parameters));
}

public function show(int|string $project_id, string $tag_name): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/tags/'.self::encodePath($tag_name)));
}

public function create(int|string $project_id, array $params = []): mixed
{
return $this->post($this->getProjectPath($project_id, 'repository/tags'), $params);
}

public function remove(int|string $project_id, string $tag_name): mixed
{
return $this->delete($this->getProjectPath($project_id, 'repository/tags/'.self::encodePath($tag_name)));
}

public function createRelease(int|string $project_id, string $tag_name, array $params = []): mixed
{
return $this->post($this->getProjectPath($project_id, 'repository/tags/'.self::encodePath($tag_name).'/release'), $params);
}

public function updateRelease(int|string $project_id, string $tag_name, array $params = []): mixed
{
return $this->put($this->getProjectPath($project_id, 'repository/tags/'.self::encodePath($tag_name).'/release'), $params);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class GroupsEpics extends AbstractApi
{



public const STATE_ALL = 'all';




public const STATE_OPENED = 'opened';




public const STATE_CLOSED = 'closed';









public function all(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('iids')
->setAllowedTypes('iids', 'array')
->setAllowedValues('iids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ALL, self::STATE_OPENED, self::STATE_CLOSED])
;
$resolver->setDefined('search');

return $this->get('groups/'.self::encodePath($group_id).'/epics', $resolver->resolve($parameters));
}

public function show(int|string $group_id, int $epic_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/epics/'.self::encodePath($epic_id));
}

public function create(int|string $group_id, array $params): mixed
{
return $this->post('groups/'.self::encodePath($group_id).'/epics', $params);
}

public function update(int|string $group_id, int $epic_id, array $params): mixed
{
return $this->put('groups/'.self::encodePath($group_id).'/epics/'.self::encodePath($epic_id), $params);
}

public function remove(int|string $group_id, int $epic_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/epics/'.self::encodePath($epic_id));
}

public function issues(int|string $group_id, int $epic_iid): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/epics/'.self::encodePath($epic_iid).'/issues');
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;

class GroupsMilestones extends AbstractApi
{



public const STATE_ACTIVE = 'active';




public const STATE_CLOSED = 'closed';











public function all(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
$utc = (new \DateTimeImmutable($value->format(\DateTimeImmutable::RFC3339_EXTENDED)))->setTimezone(new \DateTimeZone('UTC'));

return $utc->format('Y-m-d\TH:i:s.v\Z');
};
$resolver->setDefined('iids')
->setAllowedTypes('iids', 'array')
->setAllowedValues('iids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ACTIVE, self::STATE_CLOSED])
;
$resolver->setDefined('search');

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer);
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer);

return $this->get('groups/'.self::encodePath($group_id).'/milestones', $resolver->resolve($parameters));
}

public function show(int|string $group_id, int $milestone_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/milestones/'.self::encodePath($milestone_id));
}

public function create(int|string $group_id, array $params): mixed
{
return $this->post('groups/'.self::encodePath($group_id).'/milestones', $params);
}

public function update(int|string $group_id, int $milestone_id, array $params): mixed
{
return $this->put('groups/'.self::encodePath($group_id).'/milestones/'.self::encodePath($milestone_id), $params);
}

public function remove(int|string $group_id, int $milestone_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/milestones/'.self::encodePath($milestone_id));
}

public function issues(int|string $group_id, int $milestone_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/milestones/'.self::encodePath($milestone_id).'/issues');
}

public function mergeRequests(int|string $group_id, int $milestone_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/milestones/'.self::encodePath($milestone_id).'/merge_requests');
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Repositories extends AbstractApi
{



public const TYPE_BRANCH = 'branch';




public const TYPE_TAG = 'tag';







public function branches(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

return $this->get($this->getProjectPath($project_id, 'repository/branches'), $resolver->resolve($parameters));
}

public function branch(int|string $project_id, string $branch): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/branches/'.self::encodePath($branch)));
}

public function createBranch(int|string $project_id, string $branch, string $ref): mixed
{
return $this->post($this->getProjectPath($project_id, 'repository/branches'), [
'branch' => $branch,
'ref' => $ref,
]);
}

public function deleteBranch(int|string $project_id, string $branch): mixed
{
return $this->delete($this->getProjectPath($project_id, 'repository/branches/'.self::encodePath($branch)));
}

public function protectBranch(int|string $project_id, string $branch, bool $devPush = false, bool $devMerge = false): mixed
{
return $this->put($this->getProjectPath($project_id, 'repository/branches/'.self::encodePath($branch).'/protect'), [
'developers_can_push' => $devPush,
'developers_can_merge' => $devMerge,
]);
}

public function unprotectBranch(int|string $project_id, string $branch): mixed
{
return $this->put($this->getProjectPath($project_id, 'repository/branches/'.self::encodePath($branch).'/unprotect'));
}

public function tags(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

return $this->get($this->getProjectPath($project_id, 'repository/tags'), $resolver->resolve($parameters));
}

public function createTag(int|string $project_id, string $name, string $ref, ?string $message = null): mixed
{
return $this->post($this->getProjectPath($project_id, 'repository/tags'), [
'tag_name' => $name,
'ref' => $ref,
'message' => $message,
]);
}

public function createRelease(int|string $project_id, string $tag_name, string $description, ?string $name = null): mixed
{
return $this->post($this->getProjectPath($project_id, 'releases'), \array_filter([
'id' => $project_id,
'tag_name' => $tag_name,
'description' => $description,
'name' => $name,
], fn ($v) => null !== $v));
}

public function updateRelease(int|string $project_id, string $tag_name, string $description, ?string $name = null): mixed
{
return $this->put($this->getProjectPath($project_id, 'releases/'.self::encodePath($tag_name)), \array_filter([
'id' => $project_id,
'tag_name' => $tag_name,
'description' => $description,
'name' => $name,
], fn ($v) => null !== $v));
}

public function releases(int|string $project_id): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get($this->getProjectPath($project_id, 'releases'));
}











public function commits(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $options, \DateTimeInterface $value): string {
return $value->format('c');
};
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('path');
$resolver->setDefined('ref_name');
$resolver->setDefined('author');
$resolver->setDefined('since')
->setAllowedTypes('since', \DateTimeInterface::class)
->setNormalizer('since', $datetimeNormalizer)
;
$resolver->setDefined('until')
->setAllowedTypes('until', \DateTimeInterface::class)
->setNormalizer('until', $datetimeNormalizer)
;
$resolver->setDefined('all')
->setAllowedTypes('all', 'bool')
->setNormalizer('all', $booleanNormalizer)
;
$resolver->setDefined('with_stats')
->setAllowedTypes('with_stats', 'bool')
->setNormalizer('with_stats', $booleanNormalizer)
;
$resolver->setDefined('first_parent')
->setAllowedTypes('first_parent', 'bool')
->setNormalizer('first_parent', $booleanNormalizer)
;
$resolver->setDefined('order')
->setAllowedValues('order', ['default', 'topo'])
;

return $this->get($this->getProjectPath($project_id, 'repository/commits'), $resolver->resolve($parameters));
}

public function commit(int|string $project_id, string $sha): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha)));
}

public function commitRefs(int|string $project_id, string $sha, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get(
$this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/refs'),
$resolver->resolve($parameters)
);
}


















public function createCommit(int|string $project_id, array $parameters = []): mixed
{
$resolver = new OptionsResolver();
$resolver->setDefined('branch')
->setRequired('branch')
;
$resolver->setDefined('commit_message')
->setRequired('commit_message')
;
$resolver->setDefined('start_branch');
$resolver->setDefined('actions')
->setRequired('actions')
->setAllowedTypes('actions', 'array')
->setAllowedValues('actions', function (array $actions) {
return 0 < \count($actions);
})
->setNormalizer('actions', function (Options $resolver, array $actions) {
$actionsOptionsResolver = new OptionsResolver();
$actionsOptionsResolver->setDefined('action')
->setRequired('action')
->setAllowedValues('action', ['create', 'delete', 'move', 'update', 'chmod'])
;
$actionsOptionsResolver->setDefined('file_path')
->setRequired('file_path')
;
$actionsOptionsResolver->setDefined('previous_path');
$actionsOptionsResolver->setDefined('content');
$actionsOptionsResolver->setDefined('encoding')
->setAllowedValues('encoding', ['text', 'base64'])
;
$actionsOptionsResolver->setDefined('execute_filemode')
->setAllowedValues('execute_filemode', [true, false])
;

return \array_map(function ($action) use ($actionsOptionsResolver) {
return $actionsOptionsResolver->resolve($action);
}, $actions);
})
;
$resolver->setDefined('author_email');
$resolver->setDefined('author_name');

return $this->post($this->getProjectPath($project_id, 'repository/commits'), $resolver->resolve($parameters));
}

public function revertCommit(int|string $project_id, string $branch, string $sha): mixed
{
return $this->post($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/revert'), [
'branch' => $branch,
]);
}

public function commitComments(int|string $project_id, string $sha, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get(
$this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/comments'),
$resolver->resolve($parameters)
);
}

public function createCommitComment(int|string $project_id, string $sha, string $note, array $params = []): mixed
{
$params['note'] = $note;

return $this->post($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/comments'), $params);
}

public function getCommitBuildStatus(int|string $project_id, string $sha, array $params = []): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/statuses'), $params);
}

public function postCommitBuildStatus(int|string $project_id, string $sha, string $state, array $params = []): mixed
{
$params['state'] = $state;

return $this->post($this->getProjectPath($project_id, 'statuses/'.self::encodePath($sha)), $params);
}

public function compare(int|string $project_id, string $fromShaOrMaster, string $toShaOrMaster, bool $straight = false, ?string $fromProjectId = null): mixed
{
$params = [
'from' => $fromShaOrMaster,
'to' => $toShaOrMaster,
'straight' => $straight ? 'true' : 'false',
];

if (null !== $fromProjectId) {
$params['from_project_id'] = self::encodePath($fromProjectId);
}

return $this->get($this->getProjectPath($project_id, 'repository/compare'), $params);
}

public function diff(int|string $project_id, string $sha): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/diff'));
}

public function tree(int|string $project_id, array $params = []): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/tree'), $params);
}

public function contributors(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/contributors'));
}




public function archive(int|string $project_id, array $params = [], string $format = 'tar.gz'): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/archive.'.$format), $params);
}

public function mergeBase(int|string $project_id, array $refs): mixed
{
return $this->get($this->getProjectPath($project_id, 'repository/merge_base'), ['refs' => $refs]);
}

public function cherryPick(int|string $project_id, string $sha, array $params = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('branch')
->setRequired('branch');

$resolver->setDefined('dry_run')
->setAllowedTypes('dry_run', 'bool')
->setNormalizer('dry_run', $booleanNormalizer);

return $this->post($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($sha).'/cherry_pick'), $params);
}

protected function createOptionsResolver(): OptionsResolver
{
$allowedTypeValues = [
self::TYPE_BRANCH,
self::TYPE_TAG,
];

$resolver = parent::createOptionsResolver();
$resolver->setDefined('type')
->setAllowedTypes('type', 'string')
->setAllowedValues('type', $allowedTypeValues);

return $resolver;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Keys extends AbstractApi
{
public function show(int $id): mixed
{
return $this->get('keys/'.self::encodePath($id));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\Options;

class MergeRequests extends AbstractApi
{



public const STATE_ALL = 'all';




public const STATE_MERGED = 'merged';




public const STATE_OPENED = 'opened';




public const STATE_CLOSED = 'closed';




public const STATE_LOCKED = 'locked';























public function all(int|string|null $project_id = null, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
$utc = (new \DateTimeImmutable($value->format(\DateTimeImmutable::RFC3339_EXTENDED)))->setTimezone(new \DateTimeZone('UTC'));

return $utc->format('Y-m-d\TH:i:s.v\Z');
};
$resolver->setDefined('iids')
->setAllowedTypes('iids', 'array')
->setAllowedValues('iids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ALL, self::STATE_MERGED, self::STATE_OPENED, self::STATE_CLOSED, self::STATE_LOCKED])
;
$resolver->setDefined('scope')
->setAllowedValues('scope', ['created-by-me', 'assigned-to-me', 'all'])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'updated_at'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('milestone');
$resolver->setDefined('view')
->setAllowedValues('view', ['simple'])
;
$resolver->setDefined('labels');
$resolver->setDefined('created_after')
->setAllowedTypes('created_after', \DateTimeInterface::class)
->setNormalizer('created_after', $datetimeNormalizer)
;
$resolver->setDefined('created_before')
->setAllowedTypes('created_before', \DateTimeInterface::class)
->setNormalizer('created_before', $datetimeNormalizer)
;

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;

$resolver->setDefined('scope')
->setAllowedValues('scope', ['created_by_me', 'assigned_to_me', 'all'])
;
$resolver->setDefined('author_id')
->setAllowedTypes('author_id', 'integer');

$resolver->setDefined('assignee_id')
->setAllowedTypes('assignee_id', 'integer');

$resolver->setDefined('search');
$resolver->setDefined('source_branch');
$resolver->setDefined('target_branch');
$resolver->setDefined('with_merge_status_recheck')
->setAllowedTypes('with_merge_status_recheck', 'bool')
;
$resolver->setDefined('approved_by_ids')
->setAllowedTypes('approved_by_ids', 'array')
->setAllowedValues('approved_by_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('reviewer_id')
->setAllowedTypes('reviewer_id', 'integer');
$resolver->setDefined('wip')
->setAllowedTypes('wip', 'boolean')
->addNormalizer('wip', static function ($resolver, $wip) {
return $wip ? 'yes' : 'no';
});

$path = null === $project_id ? 'merge_requests' : $this->getProjectPath($project_id, 'merge_requests');

return $this->get($path, $resolver->resolve($parameters));
}








public function show(int|string $project_id, int $mr_iid, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('include_diverged_commits_count')
->setAllowedTypes('include_diverged_commits_count', 'bool')
;
$resolver->setDefined('include_rebase_in_progress')
->setAllowedTypes('include_rebase_in_progress', 'bool')
;

return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)), $resolver->resolve($parameters));
}









public function create(int|string $project_id, string $source, string $target, string $title, array $parameters = []): mixed
{
$baseParams = [
'source_branch' => $source,
'target_branch' => $target,
'title' => $title,
];

return $this->post(
$this->getProjectPath($project_id, 'merge_requests'),
\array_merge($baseParams, $parameters)
);
}

public function update(int|string $project_id, int $mr_iid, array $parameters): mixed
{
return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)), $parameters);
}

public function merge(int|string $project_id, int $mr_iid, array $parameters = []): mixed
{
return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/merge'), $parameters);
}

public function showNotes(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/notes'));
}

public function showNote(int|string $project_id, int $mr_iid, int $note_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/notes/'.self::encodePath($note_id)));
}

public function addNote(int|string $project_id, int $mr_iid, string $body, array $params = []): mixed
{
$params['body'] = $body;

return $this->post($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/notes'), $params);
}

public function updateNote(int|string $project_id, int $mr_iid, int $note_id, string $body): mixed
{
return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/notes/'.self::encodePath($note_id)), [
'body' => $body,
]);
}

public function removeNote(int|string $project_id, int $mr_iid, int $note_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/notes/'.self::encodePath($note_id)));
}

public function showDiscussions(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)).'/discussions');
}

public function showDiscussion(int|string $project_id, int $mr_iid, string $discussion_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)).'/discussions/'.self::encodePath($discussion_id));
}

public function addDiscussion(int|string $project_id, int $mr_iid, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/discussions'), $params);
}

public function resolveDiscussion(int|string $project_id, int $mr_iid, string $discussion_id, bool $resolved = true): mixed
{
return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/discussions/'.self::encodePath($discussion_id)), [
'resolved' => $resolved,
]);
}

public function addDiscussionNote(int|string $project_id, int $mr_iid, string $discussion_id, string $body): mixed
{
return $this->post($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/discussions/'.self::encodePath($discussion_id).'/notes'), ['body' => $body]);
}

public function updateDiscussionNote(int|string $project_id, int $mr_iid, string $discussion_id, int $note_id, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/discussions/'.self::encodePath($discussion_id).'/notes/'.self::encodePath($note_id)), $params);
}

public function removeDiscussionNote(int|string $project_id, int $mr_iid, string $discussion_id, int $note_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/discussions/'.self::encodePath($discussion_id).'/notes/'.self::encodePath($note_id)));
}

public function showParticipants(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)).'/participants');
}

public function changes(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/changes'));
}

public function commits(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/commits'));
}

public function closesIssues(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/closes_issues'));
}

public function approvals(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approvals'));
}

public function approve(int|string $project_id, int $mr_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approve'));
}

public function unapprove(int|string $project_id, int $mr_iid): mixed
{
return $this->post($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/unapprove'));
}

public function awardEmoji(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/award_emoji'));
}

public function removeAwardEmoji(int|string $project_id, int $mr_iid, int $award_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/award_emoji/'.self::encodePath($award_id)));
}

public function rebase(int|string $project_id, int $mr_iid, array $params = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('skip_ci')
->setAllowedTypes('skip_ci', 'bool');

return $this->put($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid)).'/rebase', $resolver->resolve($params));
}

public function approvalState(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approval_state'));
}

public function levelRules(int|string $project_id, int $mr_iid): mixed
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approval_rules'));
}




public function createLevelRule(int|string $project_id, int $mr_iid, string $name, int $approvals_required, array $parameters = []): mixed
{
$baseParam = [
'name' => $name,
'approvals_required' => $approvals_required,
];

return $this->post(
$this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approval_rules'),
\array_merge($baseParam, $parameters)
);
}




public function updateLevelRule(int|string $project_id, int $mr_iid, int $approval_rule_id, string $name, int $approvals_required, array $parameters = []): mixed
{
$baseParam = [
'name' => $name,
'approvals_required' => $approvals_required,
];

return $this->put(
$this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approval_rules/'.self::encodePath($approval_rule_id)),
\array_merge($baseParam, $parameters)
);
}

public function deleteLevelRule(int|string $project_id, int $mr_iid, int $approval_rule_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'merge_requests/'.self::encodePath($mr_iid).'/approval_rules/'.self::encodePath($approval_rule_id)));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ProjectNamespaces extends AbstractApi
{






public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('search');

return $this->get('namespaces', $resolver->resolve($parameters));
}

public function show(int|string $namespace_id): mixed
{
return $this->get('namespaces/'.self::encodePath($namespace_id));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ResourceWeightEvents extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_weight_events';

return $this->get($this->getProjectPath($project_id, $path));
}

public function show(int|string $project_id, int $issue_iid, int $resource_label_event_id): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_weight_events/';
$path .= self::encodePath($resource_label_event_id);

return $this->get($this->getProjectPath($project_id, $path));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Deployments extends AbstractApi
{












public function all(int|string $project_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('order_by')
->setAllowedTypes('order_by', 'string')
->setAllowedValues('order_by', ['id', 'iid', 'created_at', 'updated_at', 'ref']);
$resolver->setDefined('sort')
->setAllowedTypes('sort', 'string')
->setAllowedValues('sort', ['desc', 'asc']);
$resolver->setDefined('status')
->setAllowedTypes('status', 'string')
->setAllowedValues('status', ['created', 'running', 'success', 'failed', 'canceled', 'blocked']);
$resolver->setDefined('environment')
->setAllowedTypes('environment', 'string');

return $this->get($this->getProjectPath($project_id, 'deployments'), $resolver->resolve($parameters));
}

public function show(int|string $project_id, int $deployment_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'deployments/'.$deployment_id));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class ResourceLabelEvents extends AbstractApi
{
public function all(int|string $project_id, int $issue_iid): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_label_events';

return $this->get($this->getProjectPath($project_id, $path));
}

public function show(int|string $project_id, int $issue_iid, int $resource_label_event_id): mixed
{
$path = 'issues/'.self::encodePath($issue_iid).'/resource_label_events/';
$path .= self::encodePath($resource_label_event_id);

return $this->get($this->getProjectPath($project_id, $path));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Snippets extends AbstractApi
{
public function all(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets'));
}

public function show(int|string $project_id, int $snippet_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id)));
}

public function create(int|string $project_id, string $title, string $filename, string $code, string $visibility): mixed
{
return $this->post($this->getProjectPath($project_id, 'snippets'), [
'title' => $title,
'file_name' => $filename,
'code' => $code,
'visibility' => $visibility,
]);
}

public function update(int|string $project_id, int $snippet_id, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id)), $params);
}

public function content(int|string $project_id, int $snippet_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/raw'));
}

public function remove(int|string $project_id, int $snippet_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id)));
}

public function showNotes(int|string $project_id, int $snippet_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/notes'));
}

public function showNote(int|string $project_id, int $snippet_id, int $note_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/notes/'.self::encodePath($note_id)));
}

public function addNote(int|string $project_id, int $snippet_id, string $body, array $params = []): mixed
{
$params['body'] = $body;

return $this->post($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/notes'), $params);
}

public function updateNote(int|string $project_id, int $snippet_id, int $note_id, string $body): mixed
{
return $this->put($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/notes/'.self::encodePath($note_id)), [
'body' => $body,
]);
}

public function removeNote(int|string $project_id, int $snippet_id, int $note_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/notes/'.self::encodePath($note_id)));
}

public function awardEmoji(int|string $project_id, int $snippet_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/award_emoji'));
}

public function removeAwardEmoji(int|string $project_id, int $snippet_id, int $award_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'snippets/'.self::encodePath($snippet_id).'/award_emoji/'.self::encodePath($award_id)));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class Schedules extends AbstractApi
{
public function create(int|string $project_id, array $params): mixed
{
return $this->post($this->getProjectPath($project_id, 'pipeline_schedules'), $params);
}

public function show(int|string $project_id, int $schedule_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipeline_schedules/'.self::encodePath($schedule_id)));
}

public function showAll(int|string $project_id): mixed
{
return $this->get($this->getProjectPath($project_id, 'pipeline_schedules'));
}

public function update(int|string $project_id, int $schedule_id, array $params): mixed
{
return $this->put($this->getProjectPath($project_id, 'pipeline_schedules/'.self::encodePath($schedule_id)), $params);
}

public function remove(int|string $project_id, int $schedule_id): mixed
{
return $this->delete($this->getProjectPath($project_id, 'pipeline_schedules/'.self::encodePath($schedule_id)));
}

public function addVariable(int|string $project_id, int $schedule_id, array $params): mixed
{
$path = 'pipeline_schedules/'.self::encodePath($schedule_id).'/variables';

return $this->post($this->getProjectPath($project_id, $path), $params);
}

public function updateVariable(int|string $project_id, int $schedule_id, string $variable_key, array $params): mixed
{
$path = 'pipeline_schedules/'.self::encodePath($schedule_id).'/variables/'.self::encodePath($variable_key);

return $this->put($this->getProjectPath($project_id, $path), $params);
}

public function removeVariable(int|string $project_id, int $schedule_id, string $variable_key): mixed
{
$path = 'pipeline_schedules/'.self::encodePath($schedule_id).'/variables/'.self::encodePath($variable_key);

return $this->delete($this->getProjectPath($project_id, $path));
}

public function takeOwnership(int|string $project_id, int $schedule_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'pipeline_schedules/'.self::encodePath($schedule_id)).'/take_ownership');
}

public function play(int|string $project_id, int $schedule_id): mixed
{
return $this->post($this->getProjectPath($project_id, 'pipeline_schedules/'.self::encodePath($schedule_id)).'/play');
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Groups extends AbstractApi
{



public const STATE_ALL = 'all';




public const STATE_MERGED = 'merged';




public const STATE_OPENED = 'opened';




public const STATE_CLOSED = 'closed';




public const STATE_LOCKED = 'locked';















public function all(array $parameters = []): mixed
{
$resolver = $this->getGroupSearchResolver();

return $this->get('groups', $resolver->resolve($parameters));
}

public function show(int|string $id): mixed
{
return $this->get('groups/'.self::encodePath($id));
}

public function create(string $name, string $path, ?string $description = null, string $visibility = 'private', ?bool $lfs_enabled = null, ?bool $request_access_enabled = null, ?int $parent_id = null, ?int $shared_runners_minutes_limit = null): mixed
{
$params = [
'name' => $name,
'path' => $path,
'description' => $description,
'visibility' => $visibility,
'lfs_enabled' => $lfs_enabled,
'request_access_enabled' => $request_access_enabled,
'parent_id' => $parent_id,
'shared_runners_minutes_limit' => $shared_runners_minutes_limit,
];

return $this->post('groups', \array_filter($params, function ($value) {
return null !== $value && (!\is_string($value) || '' !== $value);
}));
}

public function update(int|string $id, array $params): mixed
{
return $this->put('groups/'.self::encodePath($id), $params);
}

public function remove(int|string $group_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id));
}

public function transfer(int|string $group_id, int|string $project_id): mixed
{
return $this->post('groups/'.self::encodePath($group_id).'/projects/'.self::encodePath($project_id));
}

public function allMembers(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('query');
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;

return $this->get('groups/'.self::encodePath($group_id).'/members/all', $resolver->resolve($parameters));
}







public function members(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('query');
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;

return $this->get('groups/'.self::encodePath($group_id).'/members', $resolver->resolve($parameters));
}

public function member(int|string $group_id, int $user_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/members/'.self::encodePath($user_id));
}

public function allMember(int|string $group_id, int $user_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/members/all/'.self::encodePath($user_id));
}

public function addMember(int|string $group_id, int $user_id, int $access_level, array $parameters = []): mixed
{
$dateNormalizer = function (OptionsResolver $optionsResolver, \DateTimeInterface $date): string {
return $date->format('Y-m-d');
};

$resolver = $this->createOptionsResolver()
->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $dateNormalizer)
;

$parameters = \array_merge([
'user_id' => $user_id,
'access_level' => $access_level,
], $resolver->resolve($parameters));

return $this->post('groups/'.self::encodePath($group_id).'/members', $parameters);
}

public function saveMember(int|string $group_id, int $user_id, int $access_level): mixed
{
return $this->put('groups/'.self::encodePath($group_id).'/members/'.self::encodePath($user_id), [
'access_level' => $access_level,
]);
}








public function addShare(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$datetimeNormalizer = function (OptionsResolver $optionsResolver, \DateTimeInterface $value) {
return $value->format('Y-m-d');
};

$resolver->setRequired('group_id')
->setAllowedTypes('group_id', 'int');

$resolver->setRequired('group_access')
->setAllowedTypes('group_access', 'int')
->setAllowedValues('group_access', [0, 10, 20, 30, 40, 50]);

$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;

return $this->post('groups/'.self::encodePath($group_id).'/share', $resolver->resolve($parameters));
}

public function removeMember(int|string $group_id, int $user_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/members/'.self::encodePath($user_id));
}




















public function projects(int|string $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_shared')
->setAllowedTypes('with_shared', 'bool')
->setNormalizer('with_shared', $booleanNormalizer)
;
$resolver->setDefined('include_subgroups')
->setAllowedTypes('include_subgroups', 'bool')
->setNormalizer('include_subgroups', $booleanNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;

return $this->get('groups/'.self::encodePath($id).'/projects', $resolver->resolve($parameters));
}













public function subgroups(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->getSubgroupSearchResolver();

return $this->get('groups/'.self::encodePath($group_id).'/subgroups', $resolver->resolve($parameters));
}
































public function issues(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->setDefined('assignee_id');
$resolver->setDefined('assignee_username')
->setAllowedTypes('assignee_username', 'string');

$resolver->setDefined('author_id');
$resolver->setDefined('author_username')
->setAllowedTypes('author_username', 'string');

$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);

$resolver->setDefined('created_after')
->setAllowedTypes('created_after', \DateTimeInterface::class)
->setNormalizer('created_after', $datetimeNormalizer);
$resolver->setDefined('created_before')
->setAllowedTypes('created_before', \DateTimeInterface::class)
->setNormalizer('created_before', $datetimeNormalizer);

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer);
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer);

$resolver->setDefined('iteration_id');
$resolver->setDefined('iteration_title')
->setAllowedTypes('iteration_title', 'string');

$resolver->setDefined('labels')
->setAllowedTypes('labels', 'string');

$resolver->setDefined('milestone')
->setAllowedTypes('milestone', 'string');

$resolver->setDefined('my_reaction_emoji')
->setAllowedTypes('my_reaction_emoji', 'string');

$resolver->setDefined('non_archived')
->setAllowedTypes('non_archived', 'bool')
->setNormalizer('non_archived', $booleanNormalizer);

$resolver->setDefined('not')
->setAllowedTypes('not', 'string');

$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'updated_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);

$resolver->setDefined('scope')
->setAllowedTypes('scope', 'string');

$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ALL, self::STATE_OPENED, self::STATE_CLOSED]);

$resolver->setDefined('weight');

$resolver->setDefined('with_labels_details')
->setAllowedTypes('with_labels_details', 'bool')
->setNormalizer('with_labels_details', $booleanNormalizer);

return $this->get('groups/'.self::encodePath($group_id).'/issues', $resolver->resolve($parameters));
}











public function labels(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$resolver->setDefined('with_counts')
->setAllowedTypes('with_counts', 'bool');

$resolver->setDefined('include_ancestor_groups')
->setAllowedTypes('include_ancestor_groups', 'bool');

$resolver->setDefined('include_descendant_groups')
->setAllowedTypes('include_descendant_groups', 'bool');

$resolver->setDefined('only_group_labels')
->setAllowedTypes('only_group_labels', 'bool');

$resolver->setDefined('search')
->setAllowedTypes('search', 'string');

return $this->get('groups/'.self::encodePath($group_id).'/labels', $resolver->resolve($parameters));
}

public function addLabel(int|string $group_id, array $params): mixed
{
return $this->post('groups/'.self::encodePath($group_id).'/labels', $params);
}

public function updateLabel(int|string $group_id, int $label_id, array $params): mixed
{
return $this->put('groups/'.self::encodePath($group_id).'/labels/'.self::encodePath($label_id), $params);
}

public function removeLabel(int|string $group_id, int $label_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/labels/'.self::encodePath($label_id));
}

public function variables(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get('groups/'.self::encodePath($group_id).'/variables', $resolver->resolve($parameters));
}

public function variable(int|string $group_id, string $key): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/variables/'.self::encodePath($key));
}








public function addVariable(int|string $group_id, string $key, string $value, ?bool $protected = null, array $parameters = []): mixed
{
$payload = [
'key' => $key,
'value' => $value,
];

if ($protected) {
$payload['protected'] = $protected;
}

if (isset($parameters['masked'])) {
$payload['masked'] = $parameters['masked'];
}

if (isset($parameters['variable_type'])) {
$payload['variable_type'] = $parameters['variable_type'];
}

return $this->post('groups/'.self::encodePath($group_id).'/variables', $payload);
}

public function updateVariable(int|string $group_id, string $key, string $value, ?bool $protected = null): mixed
{
$payload = [
'value' => $value,
];

if ($protected) {
$payload['protected'] = $protected;
}

return $this->put('groups/'.self::encodePath($group_id).'/variables/'.self::encodePath($key), $payload);
}

public function removeVariable(int|string $group_id, string $key): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/variables/'.self::encodePath($key));
}


















public function mergeRequests(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};
$resolver->setDefined('state')
->setAllowedValues('state', [self::STATE_ALL, self::STATE_MERGED, self::STATE_OPENED, self::STATE_CLOSED])
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'updated_at'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('milestone');
$resolver->setDefined('view')
->setAllowedValues('view', ['simple'])
;
$resolver->setDefined('labels');
$resolver->setDefined('with_labels_details')
->setAllowedTypes('with_labels_details', 'bool')
;

$resolver->setDefined('created_after')
->setAllowedTypes('created_after', \DateTimeInterface::class)
->setNormalizer('created_after', $datetimeNormalizer)
;
$resolver->setDefined('created_before')
->setAllowedTypes('created_before', \DateTimeInterface::class)
->setNormalizer('created_before', $datetimeNormalizer)
;

$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;

$resolver->setDefined('scope')
->setAllowedValues('scope', ['created_by_me', 'assigned_to_me', 'all'])
;
$resolver->setDefined('author_id')
->setAllowedTypes('author_id', 'integer');
$resolver->setDefined('author_username');

$resolver->setDefined('assignee_id')
->setAllowedTypes('assignee_id', 'integer');

$resolver->setDefined('approver_ids')
->setAllowedTypes('approver_ids', 'array')
->setAllowedValues('approver_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('non_archived')
->setAllowedTypes('non_archived', 'bool')
;
$resolver->setDefined('reviewer_id')
->setAllowedTypes('reviewer_id', 'integer');
$resolver->setDefined('reviewer_username');
$resolver->setDefined('my_reaction_emoji');

$resolver->setDefined('search');
$resolver->setDefined('source_branch');
$resolver->setDefined('target_branch');
$resolver->setDefined('with_merge_status_recheck')
->setAllowedTypes('with_merge_status_recheck', 'bool')
;
$resolver->setDefined('approved_by_ids')
->setAllowedTypes('approved_by_ids', 'array')
->setAllowedValues('approved_by_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;

return $this->get('groups/'.self::encodePath($group_id).'/merge_requests', $resolver->resolve($parameters));
}










public function iterations(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'upcoming', 'current', 'current (previously started)', 'closed', 'all'])
;
$resolver->setDefined('include_ancestors')
->setAllowedTypes('include_ancestors', 'bool')
->setNormalizer('include_ancestors', $booleanNormalizer)
->setDefault('include_ancestors', true)
;

return $this->get('groups/'.self::encodePath($group_id).'/iterations', $resolver->resolve($parameters));
}


















public function packages(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('exclude_subgroups')
->setAllowedTypes('exclude_subgroups', 'bool')
->setNormalizer('exclude_subgroups', $booleanNormalizer)
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at', 'name', 'version', 'type'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('package_type')
->setAllowedValues('package_type', ['conan', 'maven', 'npm', 'pypi', 'composer', 'nuget', 'golang'])
;
$resolver->setDefined('package_name');
$resolver->setDefined('include_versionless')
->setAllowedTypes('include_versionless', 'bool')
->setNormalizer('include_versionless', $booleanNormalizer)
;
$resolver->setDefined('status')
->setAllowedValues('status', ['default', 'hidden', 'processing'])
;

return $this->get('groups/'.self::encodePath($group_id).'/packages', $resolver->resolve($parameters));
}

private function getGroupSearchResolver(): OptionsResolver
{
$resolver = $this->getSubgroupSearchResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('top_level_only')
->setAllowedTypes('top_level_only', 'bool')
->setNormalizer('top_level_only', $booleanNormalizer)
;

return $resolver;
}

private function getSubgroupSearchResolver(): OptionsResolver
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};

$resolver->setDefined('skip_groups')
->setAllowedTypes('skip_groups', 'array')
->setAllowedValues('skip_groups', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
$resolver->setDefined('all_available')
->setAllowedTypes('all_available', 'bool')
->setNormalizer('all_available', $booleanNormalizer)
;
$resolver->setDefined('search');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['name', 'path'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;

return $resolver;
}

public function deployTokens(int|string $group_id, ?bool $active = null): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/deploy_tokens', (null !== $active) ? ['active' => $active] : []);
}










public function createDeployToken(int|string $group_id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};

$resolver->define('name')
->required()
;

$resolver->define('scopes')
->required()
->allowedTypes('array')
->allowedValues(function ($scopes) {
$allowed = ['read_repository', 'read_registry', 'write_registry', 'read_package_registry', 'write_package_registry'];
foreach ($scopes as $scope) {
if (!\in_array($scope, $allowed, true)) {
return false;
}
}

return true;
})
;
$resolver->setDefined('username')
->setAllowedTypes('username', 'string')
;

$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;

return $this->post('groups/'.self::encodePath($group_id).'/deploy_tokens', $resolver->resolve($parameters));
}

public function deleteDeployToken(int|string $group_id, int $token_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/deploy_tokens/'.self::encodePath($token_id));
}















public function search(int|string $id, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('confidential')
->setAllowedTypes('confidential', 'bool')
->setNormalizer('confidential', $booleanNormalizer);
$scope = [
'issues',
'merge_requests',
'milestones',
'projects',
'users',
'blobs',
'commits',
'notes',
'wiki_blobs',
];
$resolver->setRequired('scope')
->setAllowedValues('scope', $scope);
$resolver->setRequired('search');
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['created_at']);
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc']);
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'closed']);

return $this->get('groups/'.self::encodePath($id).'/search', $resolver->resolve($parameters));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class GroupsBoards extends AbstractApi
{
public function all(int|string|null $group_id = null, array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

$path = null === $group_id ? 'boards' : 'groups/'.self::encodePath($group_id).'/boards';

return $this->get($path, $resolver->resolve($parameters));
}

public function show(int|string $group_id, int $board_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id));
}

public function create(int|string $group_id, array $params): mixed
{
return $this->post('groups/'.self::encodePath($group_id).'/boards', $params);
}

public function update(int|string $group_id, int $board_id, array $params): mixed
{
return $this->put('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id), $params);
}

public function remove(int|string $group_id, int $board_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id));
}

public function allLists(int|string $group_id, int $board_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id).'/lists');
}

public function showList(int|string $group_id, int $board_id, int $list_id): mixed
{
return $this->get('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id));
}

public function createList(int|string $group_id, int $board_id, int $label_id): mixed
{
$params = [
'label_id' => $label_id,
];

return $this->post('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id).'/lists', $params);
}

public function updateList(int|string $group_id, int $board_id, int $list_id, int $position): mixed
{
$params = [
'position' => $position,
];

return $this->put('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id), $params);
}

public function deleteList(int|string $group_id, int $board_id, int $list_id): mixed
{
return $this->delete('groups/'.self::encodePath($group_id).'/boards/'.self::encodePath($board_id).'/lists/'.self::encodePath($list_id));
}
}
<?php

declare(strict_types=1);










namespace Gitlab\Api;

use Symfony\Component\OptionsResolver\Options;

class Events extends AbstractApi
{












public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};

$resolver->setDefined('action');
$resolver->setDefined('target_type');
$resolver->setDefined('before')
->setAllowedTypes('before', \DateTimeInterface::class)
->setNormalizer('before', $datetimeNormalizer)
;
$resolver->setDefined('after')
->setAllowedTypes('after', \DateTimeInterface::class)
->setNormalizer('after', $datetimeNormalizer)
;
$resolver->setDefined('scope');
$resolver->setDefined('sort');

return $this->get('events', $resolver->resolve($parameters));
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Api;

class DeployKeys extends AbstractApi
{
public function all(array $parameters = []): mixed
{
$resolver = $this->createOptionsResolver();

return $this->get('deploy_keys', $resolver->resolve($parameters));
}
}
<?php

declare(strict_types=1);











namespace Gitlab;

use Closure;
use Generator;
use Gitlab\Api\AbstractApi;
use Gitlab\Exception\RuntimeException;
use Gitlab\HttpClient\Message\ResponseMediator;
use ValueError;








final class ResultPager implements ResultPagerInterface
{





private const PER_PAGE = 50;

private readonly Client $client;

private readonly int $perPage;




private array $pagination;

public function __construct(Client $client, ?int $perPage = null)
{
if (null !== $perPage && ($perPage < 1 || $perPage > 100)) {
throw new ValueError(\sprintf('%s::__construct(): Argument #2 ($perPage) must be between 1 and 100, or null', self::class));
}

$this->client = $client;
$this->perPage = $perPage ?? self::PER_PAGE;
$this->pagination = [];
}






public function fetch(AbstractApi $api, string $method, array $parameters = []): array
{
$result = self::bindPerPage($api, $this->perPage)->$method(...$parameters);

if (!\is_array($result)) {
throw new RuntimeException('Pagination of this endpoint is not supported.');
}

$this->postFetch();

return $result;
}






public function fetchAll(AbstractApi $api, string $method, array $parameters = []): array
{
return \iterator_to_array($this->fetchAllLazy($api, $method, $parameters));
}






public function fetchAllLazy(AbstractApi $api, string $method, array $parameters = []): Generator
{

foreach ($this->fetch($api, $method, $parameters) as $value) {
yield $value;
}

while ($this->hasNext()) {

foreach ($this->fetchNext() as $value) {
yield $value;
}
}
}




public function hasNext(): bool
{
return isset($this->pagination['next']);
}






public function fetchNext(): array
{
return $this->get('next');
}




public function hasPrevious(): bool
{
return isset($this->pagination['prev']);
}






public function fetchPrevious(): array
{
return $this->get('prev');
}






public function fetchFirst(): array
{
return $this->get('first');
}






public function fetchLast(): array
{
return $this->get('last');
}




private function postFetch(): void
{
$response = $this->client->getLastResponse();

$this->pagination = null === $response ? [] : ResponseMediator::getPagination($response);
}




private function get(string $key): array
{
$pagination = $this->pagination[$key] ?? null;

if (null === $pagination) {
return [];
}

$result = $this->client->getHttpClient()->get($pagination);

$content = ResponseMediator::getContent($result);

if (!\is_array($content)) {
throw new RuntimeException('Pagination of this endpoint is not supported.');
}

$this->postFetch();

return $content;
}

private static function bindPerPage(AbstractApi $api, int $perPage): AbstractApi
{

$closure = Closure::bind(static function (AbstractApi $api) use ($perPage): AbstractApi {
$clone = clone $api;

$clone->perPage = $perPage;

return $clone;
}, null, AbstractApi::class);

return $closure($api);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\Exception;




class ValidationFailedException extends ErrorException
{
}
<?php

declare(strict_types=1);











namespace Gitlab\Exception;




class ApiLimitExceededException extends RuntimeException
{
}
<?php

declare(strict_types=1);











namespace Gitlab\Exception;




class ErrorException extends \ErrorException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);











namespace Gitlab\Exception;

use Http\Client\Exception;




interface ExceptionInterface extends Exception
{
}
<?php

declare(strict_types=1);











namespace Gitlab\Exception;




class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
<?php

declare(strict_types=1);











namespace Gitlab;

use Generator;
use Gitlab\Api\AbstractApi;








interface ResultPagerInterface
{





public function fetch(AbstractApi $api, string $method, array $parameters = []): array;






public function fetchAll(AbstractApi $api, string $method, array $parameters = []): array;






public function fetchAllLazy(AbstractApi $api, string $method, array $parameters = []): Generator;




public function hasNext(): bool;






public function fetchNext(): array;




public function hasPrevious(): bool;






public function fetchPrevious(): array;






public function fetchFirst(): array;






public function fetchLast(): array;
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient;

use Http\Client\Common\HttpMethodsClient;
use Http\Client\Common\HttpMethodsClientInterface;
use Http\Client\Common\Plugin;
use Http\Client\Common\Plugin\Cache\Generator\HeaderCacheKeyGenerator;
use Http\Client\Common\Plugin\CachePlugin;
use Http\Client\Common\PluginClientFactory;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\Psr18ClientDiscovery;
use Psr\Cache\CacheItemPoolInterface;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\UriFactoryInterface;









final class Builder
{
private readonly ClientInterface $httpClient;
private readonly RequestFactoryInterface $requestFactory;
private readonly StreamFactoryInterface $streamFactory;
private readonly UriFactoryInterface $uriFactory;




private array $plugins = [];

private ?CachePlugin $cachePlugin;

private ?HttpMethodsClientInterface $pluginClient;

public function __construct(
?ClientInterface $httpClient = null,
?RequestFactoryInterface $requestFactory = null,
?StreamFactoryInterface $streamFactory = null,
?UriFactoryInterface $uriFactory = null
) {
$this->httpClient = $httpClient ?? Psr18ClientDiscovery::find();
$this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
$this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
$this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();

$this->plugins = [];
$this->cachePlugin = null;
$this->pluginClient = null;
}

public function getHttpClient(): HttpMethodsClientInterface
{
if (null === $this->pluginClient) {
$plugins = $this->plugins;
if (null !== $this->cachePlugin) {
$plugins[] = $this->cachePlugin;
}

$this->pluginClient = new HttpMethodsClient(
(new PluginClientFactory())->createClient($this->httpClient, $plugins),
$this->requestFactory,
$this->streamFactory
);
}

return $this->pluginClient;
}




public function getRequestFactory(): RequestFactoryInterface
{
return $this->requestFactory;
}




public function getStreamFactory(): StreamFactoryInterface
{
return $this->streamFactory;
}




public function getUriFactory(): UriFactoryInterface
{
return $this->uriFactory;
}




public function addPlugin(Plugin $plugin): void
{
$this->plugins[] = $plugin;
$this->pluginClient = null;
}




public function removePlugin(string $fqcn): void
{
foreach ($this->plugins as $idx => $plugin) {
if ($plugin instanceof $fqcn) {
unset($this->plugins[$idx]);
$this->pluginClient = null;
}
}
}




public function addCache(CacheItemPoolInterface $cachePool, array $config = []): void
{
if (!isset($config['cache_key_generator'])) {
$config['cache_key_generator'] = new HeaderCacheKeyGenerator(['Authorization', 'Cookie', 'Accept', 'Content-type']);
}

$this->cachePlugin = CachePlugin::clientCache($cachePool, $this->streamFactory, $config);
$this->pluginClient = null;
}




public function removeCache(): void
{
$this->cachePlugin = null;
$this->pluginClient = null;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Util;

use Gitlab\Exception\RuntimeException;




final class JsonArray
{





public static function decode(string $json): array
{

$data = \json_decode($json, true);

if (\JSON_ERROR_NONE !== \json_last_error()) {
throw new RuntimeException(\sprintf('json_decode error: %s', \json_last_error_msg()));
}

if (!\is_array($data)) {
throw new RuntimeException(\sprintf('json_decode error: Expected JSON of type array, %s given.', \get_debug_type($data)));
}

return $data;
}






public static function encode(array $value): string
{
$json = \json_encode($value);

if (\JSON_ERROR_NONE !== \json_last_error()) {
throw new RuntimeException(\sprintf('json_encode error: %s', \json_last_error_msg()));
}


return $json;
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Util;




final class QueryStringBuilder
{






public static function build(array $query): string
{
return \sprintf('?%s', \implode('&', \array_map(function ($value, $key): string {
return self::encode($value, $key);
}, $query, \array_keys($query))));
}




private static function encode(mixed $query, int|string $prefix): string
{
if (!\is_array($query)) {
return self::rawurlencode($prefix).'='.self::rawurlencode($query);
}

$isList = self::isList($query);

return \implode('&', \array_map(function ($value, $key) use ($prefix, $isList): string {
$prefix = $isList ? $prefix.'[]' : $prefix.'['.$key.']';

return self::encode($value, $prefix);
}, $query, \array_keys($query)));
}




private static function isList(array $query): bool
{
if (0 === \count($query) || !isset($query[0])) {
return false;
}

return \array_keys($query) === \range(0, \count($query) - 1);
}




private static function rawurlencode(mixed $value): string
{
if (false === $value) {
return '0';
}

return \rawurlencode((string) $value);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Message;

use Gitlab\Exception\RuntimeException;
use Gitlab\HttpClient\Util\JsonArray;
use Psr\Http\Message\ResponseInterface;




final class ResponseMediator
{





public const CONTENT_TYPE_HEADER = 'Content-Type';






public const JSON_CONTENT_TYPE = 'application/json';






public const STREAM_CONTENT_TYPE = 'application/octet-stream';






public const MULTIPART_CONTENT_TYPE = 'multipart/form-data';




public static function getContent(ResponseInterface $response): array|string
{
$body = (string) $response->getBody();

if (!\in_array($body, ['', 'null', 'true', 'false'], true) && 0 === \strpos($response->getHeaderLine(self::CONTENT_TYPE_HEADER), self::JSON_CONTENT_TYPE)) {
return JsonArray::decode($body);
}

return $body;
}






public static function getPagination(ResponseInterface $response): array
{
$header = self::getHeader($response, 'Link');

if (null === $header) {
return [];
}

$pagination = [];
foreach (\explode(',', $header) as $link) {
\preg_match('/<(.*)>; rel="(.*)"/i', \trim($link, ','), $match);


if (3 === \count($match)) {
$pagination[$match[2]] = $match[1];
}
}

return $pagination;
}




private static function getHeader(ResponseInterface $response, string $name): ?string
{
$headers = $response->getHeader($name);

return \array_shift($headers);
}




public static function getErrorMessage(ResponseInterface $response): ?string
{
try {
$content = self::getContent($response);
} catch (RuntimeException $e) {
return null;
}

if (!\is_array($content)) {
return null;
}

if (isset($content['message'])) {
$message = $content['message'];

if (\is_string($message)) {
return $message;
}

if (\is_array($message)) {
return self::getMessageAsString($content['message']);
}
}

if (isset($content['error_description'])) {
$error = $content['error_description'];

if (\is_string($error)) {
return $error;
}
}

if (isset($content['error'])) {
$error = $content['error'];

if (\is_string($error)) {
return $error;
}
}

return null;
}

private static function getMessageAsString(array $message): string
{
$format = '"%s" %s';
$errors = [];

foreach ($message as $field => $messages) {
if (\is_array($messages)) {
$messages = \array_unique($messages);
foreach ($messages as $error) {
$errors[] = \sprintf($format, $field, $error);
}
} elseif (\is_int($field)) {
$errors[] = $messages;
} else {
$errors[] = \sprintf($format, $field, $messages);
}
}

return \implode(', ', $errors);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Plugin;

use Http\Client\Common\Plugin\Journal;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;








final class History implements Journal
{
private ?ResponseInterface $lastResponse;

public function __construct()
{
$this->lastResponse = null;
}




public function getLastResponse(): ?ResponseInterface
{
return $this->lastResponse;
}




public function addSuccess(RequestInterface $request, ResponseInterface $response): void
{
$this->lastResponse = $response;
}




public function addFailure(RequestInterface $request, ClientExceptionInterface $exception): void
{
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Plugin;

use Gitlab\Exception\ApiLimitExceededException;
use Gitlab\Exception\ErrorException;
use Gitlab\Exception\ExceptionInterface;
use Gitlab\Exception\RuntimeException;
use Gitlab\Exception\ValidationFailedException;
use Gitlab\HttpClient\Message\ResponseMediator;
use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;









final class ExceptionThrower implements Plugin
{





public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
return $next($request)->then(function (ResponseInterface $response): ResponseInterface {
$status = $response->getStatusCode();

if ($status >= 400 && $status < 600) {
throw self::createException($status, ResponseMediator::getErrorMessage($response) ?? $response->getReasonPhrase());
}

return $response;
});
}






private static function createException(int $status, string $message): ExceptionInterface
{
if (400 === $status || 422 === $status) {
return new ValidationFailedException($message, $status);
}

if (429 === $status) {
return new ApiLimitExceededException($message, $status);
}

return new RuntimeException($message, $status);
}
}
<?php

declare(strict_types=1);











namespace Gitlab\HttpClient\Plugin;

use Gitlab\Client;
use Gitlab\Exception\RuntimeException;
use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;









final class Authentication implements Plugin
{



private readonly array $headers;

public function __construct(string $method, string $token, ?string $sudo = null)
{
$this->headers = self::buildHeaders($method, $token, $sudo);
}






public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
foreach ($this->headers as $header => $value) {
$request = $request->withHeader($header, $value);
}

return $next($request);
}








private static function buildHeaders(string $method, string $token, ?string $sudo = null): array
{
$headers = [];

switch ($method) {
case Client::AUTH_HTTP_TOKEN:
$headers['PRIVATE-TOKEN'] = $token;

break;
case Client::AUTH_HTTP_JOB_TOKEN:
$headers['JOB-TOKEN'] = $token;

break;
case Client::AUTH_OAUTH_TOKEN:
$headers['Authorization'] = \sprintf('Bearer %s', $token);

break;
default:
throw new RuntimeException(\sprintf('Authentication method "%s" not implemented.', $method));
}

if (null !== $sudo) {
$headers['SUDO'] = $sudo;
}

return $headers;
}
}
#!/bin/sh

rm -rf build vendor composer.lock
composer install -o -n --prefer-dist
php -d phar.readonly=false packager.php
<?php

namespace Bugsnag;

use InvalidArgumentException;
use RuntimeException;
use SplFileObject;

class Stacktrace
{





const NUM_LINES = 7;






const MAX_LENGTH = 200;






protected $config;






protected $frames = [];








public static function generate(Configuration $config)
{

$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS & ~DEBUG_BACKTRACE_PROVIDE_OBJECT);

return static::fromBacktrace($config, $backtrace, '[generator]', 0);
}










public static function fromFrame(Configuration $config, $file, $line)
{

$stacktrace = new static($config);
$stacktrace->addFrame($file, $line, '[unknown]');

return $stacktrace;
}











public static function fromBacktrace(Configuration $config, array $backtrace, $topFile, $topLine)
{

$stacktrace = new static($config);


foreach ($backtrace as $frame) {
if (!static::frameInsideBugsnag($frame)) {
$stacktrace->addFrame(
$topFile,
$topLine,
isset($frame['function']) ? $frame['function'] : null,
isset($frame['class']) ? $frame['class'] : null
);
}

if (isset($frame['file']) && isset($frame['line'])) {
$topFile = $frame['file'];
$topLine = $frame['line'];
} else {
$topFile = '[internal]';
$topLine = 0;
}
}


$stacktrace->addFrame($topFile, $topLine, '[main]');

return $stacktrace;
}








public static function frameInsideBugsnag(array $frame)
{
return isset($frame['class']) && strpos($frame['class'], 'Bugsnag\\') === 0 && substr_count($frame['class'], '\\') === 1;
}








public function __construct(Configuration $config)
{
$this->config = $config;
}






public function &toArray()
{
return $this->frames;
}








public function &getFrames()
{
return $this->frames;
}











public function addFrame($file, $line, $method, $class = null)
{

$matches = [];
if (preg_match("/^(.*?)\((\d+)\) : (?:eval\(\)'d code|runtime-created function)$/", $file, $matches)) {
$file = $matches[1];
$line = $matches[2];
}


$frame = [
'lineNumber' => (int) $line,
'method' => $class ? "$class::$method" : $method,
];


if ($this->config->shouldSendCode()) {
$frame['code'] = $this->getCode($file, $line, static::NUM_LINES);
}


$frame['inProject'] = $this->config->isInProject($file);


$frame['file'] = $this->config->getStrippedFilePath($file);

$this->frames[] = $frame;
}










public function removeFrame($index)
{
if (!isset($this->frames[$index])) {
throw new InvalidArgumentException('Invalid frame index to remove.');
}

array_splice($this->frames, $index, 1);
}










protected function getCode($path, $line, $numLines)
{
if (empty($path) || empty($line) || !file_exists($path)) {
return null;
}

try {
$file = new SplFileObject($path);
$file->seek(PHP_INT_MAX);

$bounds = static::getBounds($line, $numLines, $file->key() + 1);

$code = [];

$file->seek($bounds[0] - 1);
while ($file->key() < $bounds[1]) {
$code[$file->key() + 1] = rtrim(substr($file->current(), 0, static::MAX_LENGTH));
$file->next();
}

return $code;
} catch (RuntimeException $ex) {
return null;
}
}










protected static function getBounds($line, $num, $max)
{
$start = max($line - floor($num / 2), 1);

$end = $start + ($num - 1);

if ($end > $max) {
$end = $max;
$start = max($end - ($num - 1), 1);
}

return [$start, $end];
}
}
<?php

namespace Bugsnag;

use Normalizer;

class Utils
{







public static function functionAvailable($func)
{
$disabled = explode(',', ini_get('disable_functions'));

return function_exists($func) && !in_array($func, $disabled);
}






public static function getBuilderName()
{
$builderName = null;
if (self::functionAvailable('exec')) {
$output = [];
$success = 0;
exec('whoami', $output, $success);
if ($success == 0) {
$builderName = $output[0];
}
}
if (is_null($builderName)) {
$builderName = get_current_user();
}

return $builderName;
}









public static function stringCaseEquals($a, $b)
{

if (strcasecmp($a, $b) === 0) {
return true;
}






if (function_exists('normalizer_is_normalized')
&& function_exists('normalizer_normalize')
) {
$form = Normalizer::NFD;

if (!normalizer_is_normalized($a, $form)) {
$a = normalizer_normalize($a, $form);
}

if (!normalizer_is_normalized($b, $form)) {
$b = normalizer_normalize($b, $form);
}
}

if (function_exists('mb_stripos') && function_exists('mb_strlen')) {


return mb_strlen($a) === mb_strlen($b) && mb_stripos($a, $b) === 0;
}




return strcasecmp($a, $b) === 0;
}
}
<?php

namespace Bugsnag;

use Bugsnag\DateTime\Date;
use Bugsnag\Internal\GuzzleCompat;
use Exception;
use GuzzleHttp\ClientInterface;
use RuntimeException;

class HttpClient
{



protected $config;




protected $guzzle;






protected $queue = [];






private $jsonEncodeFlags = 0;






const MAX_SIZE = 1048576;




const NOTIFY_PAYLOAD_VERSION = '4.0';




const SESSION_PAYLOAD_VERSION = '1.0';






const PAYLOAD_VERSION = self::NOTIFY_PAYLOAD_VERSION;





public function __construct(Configuration $config, ClientInterface $guzzle)
{
$this->config = $config;
$this->guzzle = $guzzle;


if (defined('JSON_INVALID_UTF8_SUBSTITUTE')) {
$this->jsonEncodeFlags |= JSON_INVALID_UTF8_SUBSTITUTE;
}
}








public function queue(Report $report)
{
$this->queue[] = $report;
}










public function deploy(array $data)
{
$app = $this->config->getAppData();

$data['releaseStage'] = $app['releaseStage'];

if (isset($app['version'])) {
$data['appVersion'] = $app['version'];
}

$data['apiKey'] = $this->config->getApiKey();

$uri = rtrim($this->config->getNotifyEndpoint(), '/').'/deploy';

$this->post($uri, ['json' => $data]);
}








public function sendBuildReport(array $buildInfo)
{
$app = $this->config->getAppData();

if (!isset($app['version'])) {
error_log('Bugsnag Warning: App version is not set. Unable to send build report.');

return;
}

$data = ['appVersion' => $app['version']];

$sourceControl = [];

if (isset($buildInfo['repository'])) {
$sourceControl['repository'] = $buildInfo['repository'];
}

if (isset($buildInfo['provider'])) {
$sourceControl['provider'] = $buildInfo['provider'];
}

if (isset($buildInfo['revision'])) {
$sourceControl['revision'] = $buildInfo['revision'];
}

if (!empty($sourceControl)) {
$data['sourceControl'] = $sourceControl;
}

if (isset($buildInfo['builder'])) {
$data['builderName'] = $buildInfo['builder'];
} else {
$data['builderName'] = Utils::getBuilderName();
}

if (isset($buildInfo['buildTool'])) {
$data['buildTool'] = $buildInfo['buildTool'];
} else {
$data['buildTool'] = 'bugsnag-php';
}

$data['releaseStage'] = $app['releaseStage'];
$data['apiKey'] = $this->config->getApiKey();

$this->post($this->config->getBuildEndpoint(), ['json' => $data]);
}








public function send()
{
$this->sendEvents();
}






public function sendEvents()
{
if (!$this->queue) {
return;
}

$this->deliverEvents(
$this->config->getNotifyEndpoint(),
$this->getEventPayload()
);

$this->queue = [];
}








protected function build()
{
return $this->getEventPayload();
}






protected function getEventPayload()
{
$events = [];

foreach ($this->queue as $report) {
$event = $report->toArray();

if ($event) {
$events[] = $event;
}
}

return [
'apiKey' => $this->config->getApiKey(),
'notifier' => $this->config->getNotifier(),
'events' => $events,
];
}








public function sendSessions(array $payload)
{
$this->post(
$this->config->getSessionEndpoint(),
[
'json' => $payload,
'headers' => $this->getHeaders(self::SESSION_PAYLOAD_VERSION),
]
);
}











protected function getHeaders($version = self::NOTIFY_PAYLOAD_VERSION)
{
return [
'Bugsnag-Api-Key' => $this->config->getApiKey(),
'Bugsnag-Sent-At' => Date::now(),
'Bugsnag-Payload-Version' => $version,
'Content-Type' => 'application/json',
];
}









protected function post($uri, array $options = [])
{
if (GuzzleCompat::isUsingGuzzle5()) {


$this->guzzle->post($uri, $options);
} else {
$this->guzzle->request('POST', $uri, $options);
}
}











protected function postJson($uri, array $data)
{
$this->deliverEvents($uri, $data);
}









protected function deliverEvents($uri, array $data)
{





try {
$normalized = $this->normalize($data);
} catch (RuntimeException $e) {
if (count($data['events']) > 1) {
$event = array_shift($data['events']);

$this->deliverEvents($uri, array_merge($data, ['events' => [$event]]));
$this->deliverEvents($uri, $data);
} else {
error_log('Bugsnag Warning: '.$e->getMessage());
}

return;
}

try {
$this->post(
$uri,
[
'body' => $normalized,
'headers' => $this->getHeaders(self::NOTIFY_PAYLOAD_VERSION),
]
);
} catch (Exception $e) {
error_log('Bugsnag Warning: Couldn\'t notify. '.$e->getMessage());
}
}










protected function normalize(array $data)
{
$body = json_encode($data, $this->jsonEncodeFlags);

if ($this->length($body) <= static::MAX_SIZE) {
return $body;
}

unset($data['events'][0]['metaData']);

$body = json_encode($data, $this->jsonEncodeFlags);

if ($this->length($body) > static::MAX_SIZE) {
throw new RuntimeException('Payload too large');
}

return $body;
}








protected function length($str)
{
return function_exists('mb_strlen') ? mb_strlen($str, '8bit') : strlen($str);
}
}
<?php

namespace Bugsnag\Internal;

use GuzzleHttp;




final class GuzzleCompat
{



public static function isUsingGuzzle5()
{
if (defined(GuzzleHttp\ClientInterface::class.'::VERSION')) {
$version = constant(GuzzleHttp\ClientInterface::class.'::VERSION');

return version_compare($version, '5.0.0', '>=')
&& version_compare($version, '6.0.0', '<');
}

return false;
}






public static function getBaseUriOptionName()
{
return self::isUsingGuzzle5() ? 'base_url' : 'base_uri';
}








public static function getBaseUri(GuzzleHttp\ClientInterface $guzzle)
{

return self::isUsingGuzzle5()
? $guzzle->getBaseUrl() 
: $guzzle->getConfig(self::getBaseUriOptionName());
}














public static function applyRequestOptions(array $options, array $requestOptions)
{
if (self::isUsingGuzzle5()) {
if (!isset($options['defaults'])) {
$options['defaults'] = [];
}

foreach ($requestOptions as $key => $value) {
if (!isset($options['defaults'][$key])) {
$options['defaults'][$key] = $value;
}
}

return $options;
}

foreach ($requestOptions as $key => $value) {
if (!isset($options[$key])) {
$options[$key] = $value;
}
}

return $options;
}
}
<?php

namespace Bugsnag\Internal;

use Bugsnag\FeatureFlag;




final class FeatureFlagDelegate
{
/**
@phpstan-var

*/
private $storage = [];







public function add($name, $variant)
{

$this->remove($name);

$this->storage[] = new FeatureFlag($name, $variant);
}

/**
@phpstan-param



*/
public function merge(array $featureFlags)
{
foreach ($featureFlags as $flag) {
if ($flag instanceof FeatureFlag) {
$this->remove($flag->getName());

$this->storage[] = $flag;
}
}
}






public function remove($name)
{
foreach ($this->storage as $index => $flag) {
if ($flag->getName() === $name) {
unset($this->storage[$index]);


$this->storage = array_values($this->storage);

break;
}
}
}




public function clear()
{
$this->storage = [];
}






public function toArray()
{
return $this->storage;
}
}
<?php

namespace Bugsnag;

use Bugsnag\Internal\FeatureFlagDelegate;
use InvalidArgumentException;

class Configuration implements FeatureDataStore
{



const NOTIFY_ENDPOINT = 'https://notify.bugsnag.com';




const SESSION_ENDPOINT = 'https://sessions.bugsnag.com';




const BUILD_ENDPOINT = 'https://build.bugsnag.com';




const HUB_NOTIFY_ENDPOINT = 'https://notify.insighthub.smartbear.com';




const HUB_SESSION_ENDPOINT = 'https://sessions.insighthub.smartbear.com';




const HUB_BUILD_ENDPOINT = 'https://build.insighthub.smartbear.com';




protected $apiKey;






protected $batchSending = true;






protected $notifyReleaseStages;








protected $filters = [
'password',
'cookie',
'authorization',
'php-auth-user',
'php-auth-pw',
'php-auth-digest',
];






protected $projectRootRegex;






protected $stripPathRegex;






protected $sendCode = true;






protected $notifier = [
'name' => 'Bugsnag PHP (Official)',
'version' => '3.30.0',
'url' => 'https://bugsnag.com',
];






protected $fallbackType;






protected $appData = [];






protected $deviceData = [];






protected $metaData = [];






private $featureFlags;






protected $errorReportingLevel;






protected $autoCaptureSessions = false;








protected $sessionClient;




protected $notifyEndpoint;




protected $sessionEndpoint;




protected $buildEndpoint;








protected $memoryLimitIncrease = 5242880;








protected $discardClasses = [];






protected $redactedKeys = [];










public function __construct($apiKey)
{
if (!is_string($apiKey)) {
throw new InvalidArgumentException('Invalid API key');
}
$this->apiKey = $apiKey;

if ($this->isHubApiKey()) {
$this->notifyEndpoint = self::HUB_NOTIFY_ENDPOINT;
$this->sessionEndpoint = self::HUB_SESSION_ENDPOINT;
$this->buildEndpoint = self::HUB_BUILD_ENDPOINT;
} else {
$this->notifyEndpoint = self::NOTIFY_ENDPOINT;
$this->sessionEndpoint = self::SESSION_ENDPOINT;
$this->buildEndpoint = self::BUILD_ENDPOINT;
}

$this->fallbackType = php_sapi_name();
$this->featureFlags = new FeatureFlagDelegate();


$this->mergeDeviceData(['runtimeVersions' => ['php' => phpversion()]]);
}






public function isHubApiKey()
{

return strpos($this->apiKey, '00000') === 0;
}






public function getApiKey()
{
return $this->apiKey;
}








public function setBatchSending($batchSending)
{
$this->batchSending = $batchSending;

return $this;
}






public function isBatchSending()
{
return $this->batchSending;
}










public function setNotifyReleaseStages($notifyReleaseStages = null)
{
$this->notifyReleaseStages = $notifyReleaseStages;

return $this;
}






public function shouldNotify()
{
if (!$this->notifyReleaseStages) {
return true;
}

return in_array($this->getAppData()['releaseStage'], $this->notifyReleaseStages, true);
}












public function setFilters(array $filters)
{
$this->filters = $filters;

return $this;
}








public function getFilters()
{
return $this->filters;
}








public function setProjectRoot($projectRoot)
{
$projectRootRegex = $projectRoot ? '/^' . preg_quote($projectRoot, '/') . '[\\/]?/i' : null;
$this->setProjectRootRegex($projectRootRegex);
}








public function setProjectRootRegex($projectRootRegex)
{
if ($projectRootRegex && @preg_match($projectRootRegex, '') === false) {
throw new InvalidArgumentException('Invalid project root regex: ' . $projectRootRegex);
}

$this->projectRootRegex = $projectRootRegex;
$this->setStripPathRegex($projectRootRegex);
}








public function isInProject($file)
{
return $this->projectRootRegex && preg_match($this->projectRootRegex, $file);
}








public function setStripPath($stripPath)
{
$stripPathRegex = $stripPath ? '/^' . preg_quote($stripPath, '/') . '[\\/]?/i' : null;
$this->setStripPathRegex($stripPathRegex);
}








public function setStripPathRegex($stripPathRegex)
{
if ($stripPathRegex && @preg_match($stripPathRegex, '') === false) {
throw new InvalidArgumentException('Invalid strip path regex: ' . $stripPathRegex);
}

$this->stripPathRegex = $stripPathRegex;
}








public function getStrippedFilePath($file)
{
return $this->stripPathRegex ? preg_replace($this->stripPathRegex, '', $file) : $file;
}










public function setSendCode($sendCode)
{
$this->sendCode = $sendCode;

return $this;
}






public function shouldSendCode()
{
return $this->sendCode;
}










public function setNotifier(array $notifier)
{
$this->notifier = $notifier;

return $this;
}






public function getNotifier()
{
return $this->notifier;
}








public function setAppVersion($appVersion)
{
$this->appData['version'] = $appVersion;

return $this;
}








public function setReleaseStage($releaseStage)
{
$this->appData['releaseStage'] = $releaseStage;

return $this;
}












public function setAppType($type)
{
$this->appData['type'] = $type;

return $this;
}










public function setFallbackType($type)
{
$this->fallbackType = $type;

return $this;
}






public function getAppData()
{
return array_merge(array_filter(['type' => $this->fallbackType, 'releaseStage' => 'production']), array_filter($this->appData));
}








public function setHostname($hostname)
{
$this->deviceData['hostname'] = $hostname;

return $this;
}








public function mergeDeviceData($data)
{
$this->deviceData = array_merge_recursive($this->deviceData, $data);

return $this;
}






public function getDeviceData()
{
return array_merge($this->getHostname(), array_filter($this->deviceData));
}






protected function getHostname()
{
$disabled = explode(',', ini_get('disable_functions'));

if (function_exists('php_uname') && !in_array('php_uname', $disabled, true)) {
return ['hostname' => php_uname('n')];
}

if (function_exists('gethostname') && !in_array('gethostname', $disabled, true)) {
return ['hostname' => gethostname()];
}

return [];
}












public function setMetaData(array $metaData, $merge = true)
{
$this->metaData = $merge ? array_merge_recursive($this->metaData, $metaData) : $metaData;

return $this;
}






public function getMetaData()
{
return $this->metaData;
}









public function addFeatureFlag($name, $variant = null)
{
$this->featureFlags->add($name, $variant);
}

/**
@phpstan-param





*/
public function addFeatureFlags(array $featureFlags)
{
$this->featureFlags->merge($featureFlags);
}








public function clearFeatureFlag($name)
{
$this->featureFlags->remove($name);
}






public function clearFeatureFlags()
{
$this->featureFlags->clear();
}






public function getFeatureFlagsCopy()
{
return clone $this->featureFlags;
}











public function setErrorReportingLevel($errorReportingLevel)
{
if (!$this->isSubsetOfErrorReporting($errorReportingLevel)) {
$missingLevels = implode(', ', $this->getMissingErrorLevelNames($errorReportingLevel));
$message =
'Bugsnag Warning: errorReportingLevel cannot contain values that are not in error_reporting. ' .
"Any errors of these levels will be ignored: {$missingLevels}.";

error_log($message);
}

$this->errorReportingLevel = $errorReportingLevel;

return $this;
}










private function isSubsetOfErrorReporting($level)
{
if (!is_int($level)) {
return true;
}

$errorReporting = error_reporting();




return ($errorReporting | $level) === $errorReporting;
}











private function getMissingErrorLevelNames($level)
{
$missingLevels = [];
$errorReporting = error_reporting();

foreach (ErrorTypes::getAllCodes() as $code) {

if (($code & $level) && !($code & $errorReporting)) {
$missingLevels[] = ErrorTypes::codeToString($code);
}
}

return $missingLevels;
}








public function shouldIgnoreErrorCode($code)
{


if (!(error_reporting() & $code)) {
return true;
}



if (isset($this->errorReportingLevel)) {
return !($this->errorReportingLevel & $code);
}

return false;
}








public function setNotifyEndpoint($endpoint)
{
$this->notifyEndpoint = $endpoint;

return $this;
}






public function getNotifyEndpoint()
{
return $this->notifyEndpoint;
}








public function setSessionEndpoint($endpoint)
{
$this->sessionEndpoint = $endpoint;

return $this;
}






public function getSessionEndpoint()
{
return $this->sessionEndpoint;
}








public function setBuildEndpoint($endpoint)
{
$this->buildEndpoint = $endpoint;

return $this;
}






public function getBuildEndpoint()
{
return $this->buildEndpoint;
}








public function setAutoCaptureSessions($track)
{
$this->autoCaptureSessions = $track;

return $this;
}






public function shouldCaptureSessions()
{
return $this->autoCaptureSessions;
}








public function getSessionClient()
{
if (is_null($this->sessionClient)) {
$this->sessionClient = Client::makeGuzzle($this->sessionEndpoint);
}

return $this->sessionClient;
}










public function setMemoryLimitIncrease($value)
{
$this->memoryLimitIncrease = $value;

return $this;
}








public function getMemoryLimitIncrease()
{
return $this->memoryLimitIncrease;
}








public function setDiscardClasses(array $discardClasses)
{
$this->discardClasses = $discardClasses;

return $this;
}








public function getDiscardClasses()
{
return $this->discardClasses;
}








public function setRedactedKeys(array $redactedKeys)
{
$this->redactedKeys = $redactedKeys;

return $this;
}






public function getRedactedKeys()
{
return $this->redactedKeys;
}
}
<?php

namespace Bugsnag;

final class FeatureFlag
{





private $name;






private $variant;





public function __construct($name, $variant = null)
{
$this->name = $name;



if ($variant !== null && !is_string($variant)) {
$json = json_encode($variant);


$variant = $json === false ? null : $json;
}

$this->variant = $variant;
}






public function getName()
{
return $this->name;
}






public function getVariant()
{
return $this->variant;
}

/**
@phpstan-return









*/
public function toArray()
{
if (is_string($this->variant)) {
return ['featureFlag' => $this->name, 'variant' => $this->variant];
}

return ['featureFlag' => $this->name];
}
}
<?php

namespace Bugsnag;

use BackedEnum;
use Bugsnag\Breadcrumbs\Breadcrumb;
use Bugsnag\DateTime\Date;
use Bugsnag\Internal\FeatureFlagDelegate;
use Exception;
use InvalidArgumentException;
use Throwable;
use UnitEnum;

class Report implements FeatureDataStore
{





const PAYLOAD_VERSION = HttpClient::NOTIFY_PAYLOAD_VERSION;






protected $config;






protected $originalError;






protected $stacktrace;






protected $previous;






protected $name;






protected $message;






protected $severity;






protected $context;






protected $groupingHash;






protected $metaData = [];






private $featureFlags;






protected $user = [];






protected $breadcrumbs = [];






protected $time;






protected $unhandled = false;






protected $severityReason = [];






protected $session;













public static function fromPHPError(Configuration $config, $code, $message, $file, $line, $fatal = false)
{

$report = new static($config);

$report->setPHPError($code, $message, $file, $line, $fatal)
->setUnhandled(false)
->setSeverityReason(['type' => 'handledError']);

return $report;
}









public static function fromPHPThrowable(Configuration $config, $throwable)
{

$report = new static($config);

$report->setPHPThrowable($throwable)
->setUnhandled(false)
->setSeverityReason(['type' => 'handledException']);

return $report;
}










public static function fromNamedError(Configuration $config, $name, $message = null)
{

$report = new static($config);

$report->setName($name)
->setMessage($message)
->setStacktrace(Stacktrace::generate($config))
->setUnhandled(false)
->setSeverityReason(['type' => 'handledError']);

return $report;
}










protected function __construct(Configuration $config)
{
$this->config = $config;
$this->time = Date::now();
$this->featureFlags = $config->getFeatureFlagsCopy();
}






public function getOriginalError()
{
return $this->originalError;
}










public function setPHPThrowable($throwable)
{



if (!$throwable instanceof Throwable && !$throwable instanceof Exception) {
throw new InvalidArgumentException('The throwable must implement Throwable or extend Exception.');
}

$this->originalError = $throwable;

$this->setName(get_class($throwable))
->setMessage($throwable->getMessage())
->setStacktrace(Stacktrace::fromBacktrace($this->config, $throwable->getTrace(), $throwable->getFile(), $throwable->getLine()));

if (method_exists($throwable, 'getPrevious')) {
$this->setPrevious($throwable->getPrevious());
}

return $this;
}












public function setPHPError($code, $message, $file, $line, $fatal = false)
{
$this->originalError = [
'code' => $code,
'message' => $message,
'file' => $file,
'line' => $line,
'fatal' => $fatal,
];

if ($fatal) {






$stacktrace = Stacktrace::fromFrame($this->config, $file, $line);
} else {
$stacktrace = Stacktrace::generate($this->config);
}

$this->setName(ErrorTypes::getName($code))
->setMessage($message)
->setSeverity(ErrorTypes::getSeverity($code))
->setStacktrace($stacktrace);

return $this;
}








protected function setStacktrace(Stacktrace $stacktrace)
{
$this->stacktrace = $stacktrace;

return $this;
}






public function getSeverityReason()
{
if (!array_key_exists('type', $this->severityReason)) {
syslog(LOG_WARNING, 'Severity reason should always have a "type" set');
$this->severityReason['type'] = 'userSpecifiedSeverity';
}

return $this->severityReason;
}






public function setSeverityReason(array $severityReason)
{
$this->severityReason = $severityReason;

return $this;
}








public function setUnhandled($unhandled)
{
$this->unhandled = $unhandled;

return $this;
}






public function getUnhandled()
{
return $this->unhandled;
}






public function getStacktrace()
{
return $this->stacktrace;
}








protected function setPrevious($throwable)
{
if ($throwable) {
$this->previous = static::fromPHPThrowable($this->config, $throwable);
}

return $this;
}










public function setName($name)
{
if (is_scalar($name) || (is_object($name) && method_exists($name, '__toString'))) {
$this->name = (string) $name;
} else {
throw new InvalidArgumentException('The name must be a string.');
}

if ($this->name === '') {
$this->name = 'Error';
}

return $this;
}






public function getName()
{
return $this->name;
}










public function setMessage($message)
{
if ($message === null) {
$this->message = null;
} elseif (
is_scalar($message)
|| (is_object($message) && method_exists($message, '__toString'))
) {
$this->message = (string) $message;
} else {
throw new InvalidArgumentException('The message must be a string.');
}

return $this;
}






public function getMessage()
{
return $this->message;
}










public function setSeverity($severity)
{
if (in_array($severity, ['error', 'warning', 'info', null], true)) {
$this->severity = $severity;
} else {
throw new InvalidArgumentException('The severity must be either "error", "warning", or "info".');
}

return $this;
}






public function getSeverity()
{
return $this->severity ?: 'warning';
}








public function setContext($context)
{
$this->context = $context;

return $this;
}






public function getContext()
{
return $this->context;
}








public function setGroupingHash($groupingHash)
{
$this->groupingHash = $groupingHash;

return $this;
}






public function getGroupingHash()
{
return $this->groupingHash;
}









public function setMetaData(array $metaData, $merge = true)
{
$this->metaData = $merge ? array_merge_recursive($this->metaData, $metaData) : $metaData;

return $this;
}










public function addMetaData(array $metadata)
{
$this->metaData = array_replace_recursive($this->metaData, $metadata);
$this->metaData = $this->removeNullElements($this->metaData);

return $this;
}






public function getMetaData()
{
return $this->metaData;
}









public function addFeatureFlag($name, $variant = null)
{
$this->featureFlags->add($name, $variant);
}

/**
@phpstan-param





*/
public function addFeatureFlags(array $featureFlags)
{
$this->featureFlags->merge($featureFlags);
}








public function clearFeatureFlag($name)
{
$this->featureFlags->remove($name);
}






public function clearFeatureFlags()
{
$this->featureFlags->clear();
}






public function getFeatureFlags()
{
return $this->featureFlags->toArray();
}








public function setUser(array $user)
{
$this->user = $user;

return $this;
}






public function getUser()
{
return $this->user;
}








public function addBreadcrumb(Breadcrumb $breadcrumb)
{
$data = $breadcrumb->toArray();

if ($metaData = $this->cleanupObj($breadcrumb->getMetaData(), true)) {
$data['metaData'] = $metaData;

if (strlen(json_encode($data)) > Breadcrumb::MAX_SIZE) {
unset($data['metaData']);
}
}

$this->breadcrumbs[] = $data;
}






public function getSummary()
{
$summary = [];

$name = $this->getName();
$message = $this->getMessage();

if ($name !== $message) {
$summary['name'] = $name;
}

$summary['message'] = $message;

$summary['severity'] = $this->getSeverity();

return array_filter($summary);
}






public function setSessionData(array $session)
{
$this->session = $session;
}









public function getErrors()
{
$errors = [$this->toError()];
$previous = $this->previous;

while ($previous) {
$errors[] = $previous->toError();
$previous = $previous->previous;
}

return $errors;
}




private function toError()
{
return [
'errorClass' => $this->name,
'errorMessage' => $this->message,
'type' => 'php',
];
}






public function toArray()
{
$event = [
'app' => $this->config->getAppData(),
'device' => array_merge(['time' => $this->time], $this->config->getDeviceData()),
'user' => $this->cleanupObj($this->getUser(), true),
'context' => $this->getContext(),
'payloadVersion' => HttpClient::NOTIFY_PAYLOAD_VERSION,
'severity' => $this->getSeverity(),
'exceptions' => $this->exceptionArray(),
'breadcrumbs' => $this->breadcrumbs,
'metaData' => $this->cleanupObj($this->getMetaData(), true),
'unhandled' => $this->getUnhandled(),
'severityReason' => $this->getSeverityReason(),
'featureFlags' => array_map(
function (FeatureFlag $flag) {
return $flag->toArray();
},
$this->featureFlags->toArray()
),
];

if ($hash = $this->getGroupingHash()) {
$event['groupingHash'] = $hash;
}

if (isset($this->session)) {
$event['session'] = $this->session;
}

return $event;
}






protected function exceptionArray()
{
$exceptionArray = [$this->exceptionObject()];
$previous = $this->previous;
while ($previous) {
$exceptionArray[] = $previous->exceptionObject();
$previous = $previous->previous;
}

return $this->cleanupObj($exceptionArray, false);
}






protected function exceptionObject()
{
return [
'errorClass' => $this->name,
'message' => $this->message,
'stacktrace' => $this->stacktrace->toArray(),
];
}









protected function cleanupObj($obj, $isMetaData)
{
if (is_null($obj)) {
return null;
}

if (is_array($obj)) {
$clean = [];

foreach ($obj as $key => $value) {
$clean[$key] = $this->shouldFilter($key, $isMetaData) ? '[FILTERED]' : $this->cleanupObj($value, $isMetaData);
}

return $clean;
}

if (is_string($obj)) {








if (version_compare(PHP_VERSION, '7.2', '>=')) {
return $obj;
}



if (function_exists('mb_check_encoding') && !mb_check_encoding($obj, 'UTF-8')) {
return mb_convert_encoding($obj, 'UTF-8', mb_list_encodings());
}

return $obj;
}

if (is_object($obj)) {
if ($obj instanceof UnitEnum) {
return $this->enumToString($obj);
}

return $this->cleanupObj(json_decode(json_encode($obj), true), $isMetaData);
}

return $obj;
}









protected function shouldFilter($key, $isMetaData)
{
if (!$isMetaData) {
return false;
}

foreach ($this->config->getFilters() as $filter) {
if (stripos($key, $filter) !== false) {
return true;
}
}

foreach ($this->config->getRedactedKeys() as $redactedKey) {
if (@preg_match($redactedKey, $key) === 1) {
return true;
} elseif (Utils::stringCaseEquals($redactedKey, $key)) {
return true;
}
}

return false;
}








protected function removeNullElements($array)
{
foreach ($array as $key => $val) {
if (is_array($val)) {
$array[$key] = $this->removeNullElements($val);
} elseif (is_null($val)) {
unset($array[$key]);
}
}

return $array;
}








private function enumToString(UnitEnum $enum)
{

$string = sprintf('%s::%s', get_class($enum), $enum->name);


if ($enum instanceof BackedEnum) {
$string .= sprintf(' (%s)', $enum->value);
}

return $string;
}
}
<?php

namespace Bugsnag;

use Bugsnag\Breadcrumbs\Breadcrumb;
use Bugsnag\Breadcrumbs\Recorder;
use Bugsnag\Callbacks\GlobalMetaData;
use Bugsnag\Callbacks\RequestContext;
use Bugsnag\Callbacks\RequestMetaData;
use Bugsnag\Callbacks\RequestSession;
use Bugsnag\Callbacks\RequestUser;
use Bugsnag\Internal\GuzzleCompat;
use Bugsnag\Middleware\BreadcrumbData;
use Bugsnag\Middleware\CallbackBridge;
use Bugsnag\Middleware\DiscardClasses;
use Bugsnag\Middleware\NotificationSkipper;
use Bugsnag\Middleware\SessionData;
use Bugsnag\Request\BasicResolver;
use Bugsnag\Request\ResolverInterface;
use Bugsnag\Shutdown\PhpShutdownStrategy;
use Bugsnag\Shutdown\ShutdownStrategyInterface;
use Composer\CaBundle\CaBundle;
use GuzzleHttp;

class Client implements FeatureDataStore
{







const ENDPOINT = Configuration::NOTIFY_ENDPOINT;






protected $config;






protected $resolver;






protected $recorder;






protected $pipeline;






protected $http;






protected $sessionTracker;








const DEFAULT_TIMEOUT_S = 15.0;












public static function make(
$apiKey = null,
$notifyEndpoint = null,
$defaults = true
) {
$env = new Env();

$config = new Configuration($apiKey ?: $env->get('BUGSNAG_API_KEY'));
$guzzle = static::makeGuzzle($notifyEndpoint ?: $env->get('BUGSNAG_ENDPOINT'));


$client = new static($config, null, $guzzle);

if ($defaults) {
$client->registerDefaultCallbacks();
}

return $client;
}







public function __construct(
Configuration $config,
$resolver = null,
$guzzle = null,
$shutdownStrategy = null
) {
$guzzle = $guzzle ?: self::makeGuzzle();

$this->syncNotifyEndpointWithGuzzleBaseUri($config, $guzzle);

$this->config = $config;
$this->resolver = $resolver ?: new BasicResolver();
$this->recorder = new Recorder();
$this->pipeline = new Pipeline();
$this->http = new HttpClient($config, $guzzle);
$this->sessionTracker = new SessionTracker($config, $this->http);

$this->registerMiddleware(new NotificationSkipper($config));
$this->registerMiddleware(new DiscardClasses($config));
$this->registerMiddleware(new BreadcrumbData($this->recorder));
$this->registerMiddleware(new SessionData($this));


$shutdownStrategy = $shutdownStrategy ?: new PhpShutdownStrategy();
$shutdownStrategy->registerShutdownStrategy($this);
}









public static function makeGuzzle($base = null, array $options = [])
{
$options = self::resolveGuzzleOptions($base, $options);

return new GuzzleHttp\Client($options);
}







private static function resolveGuzzleOptions($base, array $options)
{
$key = GuzzleCompat::getBaseUriOptionName();
$options[$key] = $base ?: Configuration::NOTIFY_ENDPOINT;

$path = static::getCaBundlePath();

if ($path) {
$options['verify'] = $path;
}

return GuzzleCompat::applyRequestOptions(
$options,
[
'timeout' => self::DEFAULT_TIMEOUT_S,
'connect_timeout' => self::DEFAULT_TIMEOUT_S,
]
);
}









private function syncNotifyEndpointWithGuzzleBaseUri(
Configuration $configuration,
GuzzleHttp\ClientInterface $guzzle
) {



if ($configuration->getNotifyEndpoint() !== Configuration::NOTIFY_ENDPOINT) {
return;
}

$base = GuzzleCompat::getBaseUri($guzzle);

if (is_string($base) || (is_object($base) && method_exists($base, '__toString'))) {
$configuration->setNotifyEndpoint((string) $base);
}
}






protected static function getCaBundlePath()
{
if (version_compare(PHP_VERSION, '5.6.0') >= 0 || !class_exists(CaBundle::class)) {
return false;
}

return realpath(CaBundle::getSystemCaRootBundlePath());
}






public function getConfig()
{
return $this->config;
}






public function getPipeline()
{
return $this->pipeline;
}








public function registerCallback(callable $callback)
{
$this->registerMiddleware(new CallbackBridge($callback));

return $this;
}






public function registerDefaultCallbacks()
{
$this->registerCallback(new GlobalMetaData($this->config))
->registerCallback(new RequestMetaData($this->resolver))
->registerCallback(new RequestSession($this->resolver))
->registerCallback(new RequestUser($this->resolver))
->registerCallback(new RequestContext($this->resolver));

return $this;
}








public function registerMiddleware(callable $middleware)
{
$this->pipeline->pipe($middleware);

return $this;
}










public function leaveBreadcrumb($name, $type = null, array $metaData = [])
{
$type = in_array($type, Breadcrumb::getTypes(), true) ? $type : Breadcrumb::MANUAL_TYPE;

$this->recorder->record(new Breadcrumb($name, $type, $metaData));
}






public function clearBreadcrumbs()
{
$this->recorder->clear();
}









public function notifyException($throwable, $callback = null)
{
$report = Report::fromPHPThrowable($this->config, $throwable);

$this->notify($report, $callback);
}










public function notifyError($name, $message, $callback = null)
{
$report = Report::fromNamedError($this->config, $name, $message);

$this->notify($report, $callback);
}











public function notify(Report $report, $callback = null)
{
$this->pipeline->execute($report, function ($report) use ($callback) {
if ($callback) {
$resolvedReport = null;

$bridge = new CallbackBridge($callback);
$bridge($report, function ($report) use (&$resolvedReport) {
$resolvedReport = $report;
});
if ($resolvedReport) {
$report = $resolvedReport;
} else {
return;
}
}

$this->http->queue($report);
});

$this->leaveBreadcrumb($report->getName(), Breadcrumb::ERROR_TYPE, $report->getSummary());

if (!$this->config->isBatchSending()) {
$this->flush();
}
}












public function deploy($repository = null, $branch = null, $revision = null)
{
$this->build($repository, $revision);
}











public function build($repository = null, $revision = null, $provider = null, $builderName = null)
{
$data = [];

if ($repository) {
$data['repository'] = $repository;
}

if ($revision) {
$data['revision'] = $revision;
}

if ($provider) {
$data['provider'] = $provider;
}

if ($builderName) {
$data['builder'] = $builderName;
}

$this->http->sendBuildReport($data);
}






public function flush()
{
$this->http->sendEvents();
}






public function startSession()
{
$this->sessionTracker->startSession();
}






public function getSessionTracker()
{
return $this->sessionTracker;
}








public function getApiKey()
{
return $this->config->getApiKey();
}








public function setBatchSending($batchSending)
{
$this->config->setBatchSending($batchSending);

return $this;
}






public function isBatchSending()
{
return $this->config->isBatchSending();
}










public function setNotifyReleaseStages($notifyReleaseStages = null)
{
$this->config->setNotifyReleaseStages($notifyReleaseStages);

return $this;
}






public function shouldNotify()
{
return $this->config->shouldNotify();
}












public function setFilters(array $filters)
{
$this->config->setFilters($filters);

return $this;
}








public function getFilters()
{
return $this->config->getFilters();
}








public function setProjectRoot($projectRoot)
{
$this->config->setProjectRoot($projectRoot);
}








public function setProjectRootRegex($projectRootRegex)
{
$this->config->setProjectRootRegex($projectRootRegex);
}








public function isInProject($file)
{
return $this->config->isInProject($file);
}








public function setStripPath($stripPath)
{
$this->config->setStripPath($stripPath);
}








public function setStripPathRegex($stripPathRegex)
{
$this->config->setStripPathRegex($stripPathRegex);
}








public function getStrippedFilePath($file)
{
return $this->config->getStrippedFilePath($file);
}










public function setSendCode($sendCode)
{
$this->config->setSendCode($sendCode);

return $this;
}






public function shouldSendCode()
{
return $this->config->shouldSendCode();
}










public function setNotifier(array $notifier)
{
$this->config->setNotifier($notifier);

return $this;
}






public function getNotifier()
{
return $this->config->getNotifier();
}








public function setAppVersion($appVersion)
{
$this->config->setAppVersion($appVersion);

return $this;
}








public function setReleaseStage($releaseStage)
{
$this->config->setReleaseStage($releaseStage);

return $this;
}












public function setAppType($type)
{
$this->config->setAppType($type);

return $this;
}










public function setFallbackType($type)
{
$this->config->setFallbackType($type);

return $this;
}






public function getAppData()
{
return $this->config->getAppData();
}








public function setHostname($hostname)
{
$this->config->setHostname($hostname);

return $this;
}






public function getDeviceData()
{
return $this->config->getDeviceData();
}












public function setMetaData(array $metaData, $merge = true)
{
$this->config->setMetaData($metaData, $merge);

return $this;
}






public function getMetaData()
{
return $this->config->getMetaData();
}









public function addFeatureFlag($name, $variant = null)
{
$this->config->addFeatureFlag($name, $variant);
}

/**
@phpstan-param





*/
public function addFeatureFlags(array $featureFlags)
{
$this->config->addFeatureFlags($featureFlags);
}








public function clearFeatureFlag($name)
{
$this->config->clearFeatureFlag($name);
}






public function clearFeatureFlags()
{
$this->config->clearFeatureFlags();
}











public function setErrorReportingLevel($errorReportingLevel)
{
$this->config->setErrorReportingLevel($errorReportingLevel);

return $this;
}








public function shouldIgnoreErrorCode($code)
{
return $this->config->shouldIgnoreErrorCode($code);
}








public function setNotifyEndpoint($endpoint)
{
$this->config->setNotifyEndpoint($endpoint);

return $this;
}






public function getNotifyEndpoint()
{
return $this->config->getNotifyEndpoint();
}








public function setSessionEndpoint($endpoint)
{
$this->config->setSessionEndpoint($endpoint);

return $this;
}






public function getSessionEndpoint()
{
return $this->config->getSessionEndpoint();
}








public function setBuildEndpoint($endpoint)
{
$this->config->setBuildEndpoint($endpoint);

return $this;
}






public function getBuildEndpoint()
{
return $this->config->getBuildEndpoint();
}








public function setAutoCaptureSessions($track)
{
$this->config->setAutoCaptureSessions($track);

return $this;
}






public function shouldCaptureSessions()
{
return $this->config->shouldCaptureSessions();
}








public function getSessionClient()
{
return $this->config->getSessionClient();
}










public function setMemoryLimitIncrease($value)
{
return $this->config->setMemoryLimitIncrease($value);
}








public function getMemoryLimitIncrease()
{
return $this->config->getMemoryLimitIncrease();
}








public function setDiscardClasses(array $discardClasses)
{
$this->config->setDiscardClasses($discardClasses);

return $this;
}








public function getDiscardClasses()
{
return $this->config->getDiscardClasses();
}








public function setRedactedKeys(array $redactedKeys)
{
$this->config->setRedactedKeys($redactedKeys);

return $this;
}






public function getRedactedKeys()
{
return $this->config->getRedactedKeys();
}






public function setMaxBreadcrumbs($maxBreadcrumbs)
{
$this->recorder->setMaxBreadcrumbs($maxBreadcrumbs);

return $this;
}




public function getMaxBreadcrumbs()
{
return $this->recorder->getMaxBreadcrumbs();
}
}
<?php

namespace Bugsnag\Breadcrumbs;

use Bugsnag\DateTime\Date;
use InvalidArgumentException;

class Breadcrumb
{





const NAVIGATION_TYPE = 'navigation';






const REQUEST_TYPE = 'request';






const PROCESS_TYPE = 'process';






const LOG_TYPE = 'log';






const USER_TYPE = 'user';






const STATE_TYPE = 'state';






const ERROR_TYPE = 'error';






const MANUAL_TYPE = 'manual';






const MAX_SIZE = 4096;






protected $timestamp;






protected $name;






protected $type;






protected $metaData;












public function __construct($name, $type, array $metaData = [])
{
if (!is_string($name)) {
if (is_null($name)) {
$metaData['BreadcrumbError'] = 'NULL provided as the breadcrumb name';
$name = '<no name>';
} else {
$metaData['BreadcrumbError'] = 'Breadcrumb name must be a string - '.gettype($name).' provided instead';
$name = '<no name>';
}
} elseif ($name === '') {
$metaData['BreadcrumbError'] = 'Empty string provided as the breadcrumb name';
$name = '<no name>';
}

$types = static::getTypes();

if (!in_array($type, $types, true)) {
throw new InvalidArgumentException(sprintf('The breadcrumb type must be one of the set of %d standard types.', count($types)));
}

$this->timestamp = Date::now();
$this->name = $name;
$this->type = $type;
$this->metaData = $metaData;
}








public function toArray()
{
return [
'timestamp' => $this->timestamp,
'name' => $this->name,
'type' => $this->type,
];
}








public function getMetaData()
{
return $this->metaData;
}






public static function getTypes()
{
return [
static::NAVIGATION_TYPE,
static::REQUEST_TYPE,
static::PROCESS_TYPE,
static::LOG_TYPE,
static::USER_TYPE,
static::STATE_TYPE,
static::ERROR_TYPE,
static::MANUAL_TYPE,
];
}
}
<?php

namespace Bugsnag\Breadcrumbs;

use Countable;
use Iterator;

/**
@implements
*/
class Recorder implements Countable, Iterator
{





private $maxBreadcrumbs = 50;






private $breadcrumbs = [];






private $position = 0;








public function record(Breadcrumb $breadcrumb)
{
$this->breadcrumbs[] = $breadcrumb;


if ($this->count() > $this->maxBreadcrumbs) {
array_shift($this->breadcrumbs);
}
}






public function clear()
{
$this->position = 0;
$this->breadcrumbs = [];
}










public function setMaxBreadcrumbs($maxBreadcrumbs)
{
if (!is_int($maxBreadcrumbs) || $maxBreadcrumbs < 0 || $maxBreadcrumbs > 100) {
error_log(
'Bugsnag Warning: maxBreadcrumbs should be an integer between 0 and 100 (inclusive)'
);

return;
}

$this->maxBreadcrumbs = $maxBreadcrumbs;


if ($this->count() > $this->maxBreadcrumbs) {
$this->breadcrumbs = array_slice(
$this->breadcrumbs,
$this->count() - $this->maxBreadcrumbs
);
}
}






public function getMaxBreadcrumbs()
{
return $this->maxBreadcrumbs;
}






#[\ReturnTypeWillChange]
public function count()
{
return count($this->breadcrumbs);
}






#[\ReturnTypeWillChange]
public function current()
{
return $this->breadcrumbs[$this->position];
}






#[\ReturnTypeWillChange]
public function key()
{
return $this->position;
}






#[\ReturnTypeWillChange]
public function next()
{
$this->position++;
}






#[\ReturnTypeWillChange]
public function rewind()
{
$this->position = 0;
}






#[\ReturnTypeWillChange]
public function valid()
{
return $this->position < $this->count();
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Bugsnag\Request\ResolverInterface;

class RequestUser
{





protected $resolver;








public function __construct(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
if ($id = $this->resolver->resolve()->getUserId()) {
$report->setUser(['id' => $id]);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Exception;

class CustomUser
{





protected $resolver;








public function __construct(callable $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
$resolver = $this->resolver;

try {
if ($user = $resolver()) {
$report->setUser($user);
}
} catch (Exception $e) {

}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Bugsnag\Request\ResolverInterface;

class RequestSession
{





protected $resolver;








public function __construct(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
if ($data = $this->resolver->resolve()->getSession()) {
$report->setMetaData(['session' => $data]);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Bugsnag\Request\ResolverInterface;

class RequestMetaData
{





protected $resolver;








public function __construct(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
if ($data = $this->resolver->resolve()->getMetaData()) {
$report->setMetaData($data);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Configuration;
use Bugsnag\Report;

class GlobalMetaData
{





protected $config;








public function __construct(Configuration $config)
{
$this->config = $config;
}








public function __invoke(Report $report)
{
if ($data = $this->config->getMetaData()) {
$report->setMetaData($data);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Bugsnag\Request\ResolverInterface;

class RequestContext
{





protected $resolver;








public function __construct(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
if ($context = $this->resolver->resolve()->getContext()) {
$report->setContext($context);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;
use Bugsnag\Request\ResolverInterface;

class RequestCookies
{





protected $resolver;








public function __construct(ResolverInterface $resolver)
{
$this->resolver = $resolver;
}








public function __invoke(Report $report)
{
if ($data = $this->resolver->resolve()->getCookies()) {
$report->setMetaData(['cookies' => $data]);
}
}
}
<?php

namespace Bugsnag\Callbacks;

use Bugsnag\Report;

class EnvironmentData
{







public function __invoke(Report $report)
{
if (!empty($_ENV)) {
$report->setMetaData(['Environment' => $_ENV]);
}
}
}
<?php

namespace Bugsnag;

interface FeatureDataStore
{








public function addFeatureFlag($name, $variant = null);

/**
@phpstan-param








*/
public function addFeatureFlags(array $featureFlags);








public function clearFeatureFlag($name);






public function clearFeatureFlags();
}
<?php

namespace Bugsnag\Shutdown;

use Bugsnag\Client;










interface ShutdownStrategyInterface
{











public function registerShutdownStrategy(Client $client);
}
<?php

namespace Bugsnag\Shutdown;

use Bugsnag\Client;






class PhpShutdownStrategy implements ShutdownStrategyInterface
{





public function registerShutdownStrategy(Client $client)
{
register_shutdown_function([$client, 'flush']);
}
}
<?php

namespace Bugsnag;

use Exception;
use InvalidArgumentException;

class SessionTracker
{







protected static $SESSION_PAYLOAD_VERSION = HttpClient::SESSION_PAYLOAD_VERSION;






protected static $DELIVERY_INTERVAL = 30;






protected static $MAX_SESSION_COUNT = 50;






protected static $SESSION_COUNTS_KEY = 'bugsnag-session-counts';






protected static $SESSIONS_LAST_SENT_KEY = 'bugsnag-sessions-last-sent';




protected $config;




protected $http;






protected $sessionCounts = [];






protected $lockFunction = null;






protected $unlockFunction = null;






protected $retryFunction = null;






protected $storageFunction = null;






protected $sessionFunction = null;






protected $lastSent = 0;






protected $currentSession = [];







public function __construct(Configuration $config, $http = null)
{
$this->config = $config;
$this->http = $http === null
? new HttpClient($config, $config->getSessionClient())
: $http;
}








public function setConfig(Configuration $config)
{
$this->config = $config;
}




public function startSession()
{
$currentTime = date('Y-m-d\TH:i:00');

$session = [
'id' => uniqid('', true),
'startedAt' => $currentTime,
'events' => [
'handled' => 0,
'unhandled' => 0,
],
];

$this->setCurrentSession($session);
$this->incrementSessions($currentTime);
}






public function setCurrentSession(array $session)
{
if (is_callable($this->sessionFunction)) {
call_user_func($this->sessionFunction, $session);
} else {
$this->currentSession = $session;
}
}




public function getCurrentSession()
{
if (is_callable($this->sessionFunction)) {
$currentSession = call_user_func($this->sessionFunction);

if (is_array($currentSession)) {
return $currentSession;
}

return [];
}

return $this->currentSession;
}




public function sendSessions()
{
$locked = false;
if (is_callable($this->lockFunction) && is_callable($this->unlockFunction)) {
call_user_func($this->lockFunction);
$locked = true;
}

try {
$this->deliverSessions();
} finally {
if ($locked) {
call_user_func($this->unlockFunction);
}
}
}







public function setLockFunctions($lock, $unlock)
{
if (!is_callable($lock) || !is_callable($unlock)) {
throw new InvalidArgumentException('Both lock and unlock functions must be callable');
}

$this->lockFunction = $lock;
$this->unlockFunction = $unlock;
}






public function setRetryFunction($function)
{
if (!is_callable($function)) {
throw new InvalidArgumentException('The retry function must be callable');
}

$this->retryFunction = $function;
}






public function setStorageFunction($function)
{
if (!is_callable($function)) {
throw new InvalidArgumentException('Storage function must be callable');
}

$this->storageFunction = $function;
}






public function setSessionFunction($function)
{
if (!is_callable($function)) {
throw new InvalidArgumentException('Session function must be callable');
}

$this->sessionFunction = $function;
}








protected function incrementSessions($minute, $count = 1, $deliver = true)
{
$locked = false;

if (is_callable($this->lockFunction) && is_callable($this->unlockFunction)) {
call_user_func($this->lockFunction);
$locked = true;
}

try {
$sessionCounts = $this->getSessionCounts();

if (array_key_exists($minute, $sessionCounts)) {
$sessionCounts[$minute] += $count;
} else {
$sessionCounts[$minute] = $count;
}

$this->setSessionCounts($sessionCounts);

if (count($sessionCounts) > self::$MAX_SESSION_COUNT) {
$this->trimOldestSessions();
}

$lastSent = $this->getLastSent();

if ($deliver && ((time() - $lastSent) > self::$DELIVERY_INTERVAL)) {
$this->deliverSessions();
}
} finally {
if ($locked) {
call_user_func($this->unlockFunction);
}
}
}




protected function getSessionCounts()
{
if (is_callable($this->storageFunction)) {
$sessionCounts = call_user_func($this->storageFunction, self::$SESSION_COUNTS_KEY);

if (is_array($sessionCounts)) {
return $sessionCounts;
}

return [];
}

return $this->sessionCounts;
}






protected function setSessionCounts(array $sessionCounts)
{
if (is_callable($this->storageFunction)) {
call_user_func($this->storageFunction, self::$SESSION_COUNTS_KEY, $sessionCounts);
}

$this->sessionCounts = $sessionCounts;
}




protected function trimOldestSessions()
{
$sessions = $this->getSessionCounts();



uksort($sessions, function ($a, $b) {
return strtotime($b) - strtotime($a);
});

$sessionCounts = array_slice($sessions, 0, self::$MAX_SESSION_COUNT);

$this->setSessionCounts($sessionCounts);
}






protected function constructPayload(array $sessions)
{
$formattedSessions = [];
foreach ($sessions as $minute => $count) {
$formattedSessions[] = ['startedAt' => $minute, 'sessionsStarted' => $count];
}

return [
'notifier' => $this->config->getNotifier(),
'device' => $this->config->getDeviceData(),
'app' => $this->config->getAppData(),
'sessionCounts' => $formattedSessions,
];
}




protected function deliverSessions()
{
$sessions = $this->getSessionCounts();

$this->setSessionCounts([]);

if (count($sessions) === 0) {
return;
}

if (!$this->config->shouldNotify()) {
return;
}

$payload = $this->constructPayload($sessions);

$this->setLastSent();

try {
$this->http->sendSessions($payload);
} catch (Exception $e) {
error_log('Bugsnag Warning: Couldn\'t notify. ' . $e->getMessage());

if (is_callable($this->retryFunction)) {
call_user_func($this->retryFunction, $sessions);
} else {
foreach ($sessions as $minute => $count) {
$this->incrementSessions($minute, $count, false);
}
}
}
}




protected function setLastSent()
{
$time = time();

if (is_callable($this->storageFunction)) {
call_user_func($this->storageFunction, self::$SESSIONS_LAST_SENT_KEY, $time);
} else {
$this->lastSent = $time;
}
}




protected function getLastSent()
{
if (is_callable($this->storageFunction)) {
$lastSent = call_user_func($this->storageFunction, self::$SESSIONS_LAST_SENT_KEY);





if (is_numeric($lastSent)) {
return (int) $lastSent;
}

return 0;
}

return $this->lastSent;
}
}
<?php

namespace Bugsnag\DateTime;

use DateTimeImmutable;

final class Clock implements ClockInterface
{



public function now()
{
return new DateTimeImmutable();
}
}
<?php

namespace Bugsnag\DateTime;

use DateTimeImmutable;

final class Date
{





public static function now($clock = null)
{
if ($clock === null) {
$clock = new Clock();
}

$date = $clock->now();

return self::format($date);
}






private static function format(DateTimeImmutable $date)
{
$dateTime = $date->format('Y-m-d\TH:i:s');



$microseconds = $date->format('u');
$milliseconds = substr($microseconds, 0, 3);

$offset = $date->format('P');

return "{$dateTime}.{$milliseconds}{$offset}";
}
}
<?php

namespace Bugsnag\DateTime;

use DateTimeImmutable;

interface ClockInterface
{



public function now();
}
<?php

namespace Bugsnag;

class Env
{












public function get($name)
{
switch (true) {
case array_key_exists($name, $_ENV):
return $_ENV[$name];

case array_key_exists($name, $_SERVER):
return $_SERVER[$name];

default:
$value = getenv($name);

return $value === false ? null : $value; 
}
}
}




































<?php

namespace Bugsnag\Middleware;

use Bugsnag\Client;
use Bugsnag\Report;
use Bugsnag\SessionTracker;

class SessionData
{






protected $client;




private $sessionTracker;




public function __construct(Client $client)
{
$this->client = $client;
$this->sessionTracker = $client->getSessionTracker();
}














public function __invoke(Report $report, callable $next)
{
$session = $this->sessionTracker->getCurrentSession();

if (isset($session['events'])) {
if ($report->getUnhandled()) {
$session['events']['unhandled'] += 1;
} else {
$session['events']['handled'] += 1;
}

$report->setSessionData($session);
$this->sessionTracker->setCurrentSession($session);
}

$next($report);
}
}
<?php

namespace Bugsnag\Middleware;

use Bugsnag\Configuration;
use Bugsnag\Report;

class DiscardClasses
{



protected $config;




public function __construct(Configuration $config)
{
$this->config = $config;
}







public function __invoke(Report $report, callable $next)
{
$errors = $report->getErrors();

foreach ($this->config->getDiscardClasses() as $discardClass) {
foreach ($errors as $error) {
if ($error['errorClass'] === $discardClass
|| @preg_match($discardClass, $error['errorClass']) === 1
) {
syslog(LOG_INFO, sprintf(
'Discarding event because error class "%s" matched discardClasses configuration',
$error['errorClass']
));

return;
}
}
}

$next($report);
}
}
<?php

namespace Bugsnag\Middleware;

use Bugsnag\Configuration;
use Bugsnag\Report;

class NotificationSkipper
{





protected $config;








public function __construct(Configuration $config)
{
$this->config = $config;
}









public function __invoke(Report $report, callable $next)
{
if (!$this->config->shouldNotify()) {
return;
}

$next($report);
}
}
<?php

namespace Bugsnag\Middleware;

use Bugsnag\Report;

class CallbackBridge
{





protected $callback;








public function __construct(callable $callback)
{
$this->callback = $callback;
}









public function __invoke(Report $report, callable $next)
{
$initialUnhandled = $report->getUnhandled();
$initialSeverity = $report->getSeverity();
$initialReason = $report->getSeverityReason();

$callback = $this->callback;

if ($callback($report) !== false) {
$report->setUnhandled($initialUnhandled);
if ($report->getSeverity() != $initialSeverity) {

$report->setSeverityReason([
'type' => 'userCallbackSetSeverity',
]);
} else {

$report->setSeverityReason($initialReason);
}

$next($report);
}
}
}
<?php

namespace Bugsnag\Middleware;

use Bugsnag\Breadcrumbs\Recorder;
use Bugsnag\Report;

class BreadcrumbData
{





protected $recorder;








public function __construct(Recorder $recorder)
{
$this->recorder = $recorder;
}









public function __invoke(Report $report, callable $next)
{
foreach ($this->recorder as $breadcrumb) {
$report->addBreadcrumb($breadcrumb);
}

$next($report);
}
}
<?php

namespace Bugsnag;

class ErrorTypes
{





protected static $ERROR_TYPES;






protected static function initializeErrorTypes()
{
static::$ERROR_TYPES = [
E_ERROR => [
'name' => 'PHP Fatal Error',
'severity' => 'error',
],

E_WARNING => [
'name' => 'PHP Warning',
'severity' => 'warning',
],

E_PARSE => [
'name' => 'PHP Parse Error',
'severity' => 'error',
],

E_NOTICE => [
'name' => 'PHP Notice',
'severity' => 'info',
],

E_CORE_ERROR => [
'name' => 'PHP Core Error',
'severity' => 'error',
],

E_CORE_WARNING => [
'name' => 'PHP Core Warning',
'severity' => 'warning',
],

E_COMPILE_ERROR => [
'name' => 'PHP Compile Error',
'severity' => 'error',
],

E_COMPILE_WARNING => [
'name' => 'PHP Compile Warning',
'severity' => 'warning',
],

E_USER_ERROR => [
'name' => 'User Error',
'severity' => 'error',
],

E_USER_WARNING => [
'name' => 'User Warning',
'severity' => 'warning',
],

E_USER_NOTICE => [
'name' => 'User Notice',
'severity' => 'info',
],

E_RECOVERABLE_ERROR => [
'name' => 'PHP Recoverable Error',
'severity' => 'error',
],

E_DEPRECATED => [
'name' => 'PHP Deprecated',
'severity' => 'info',
],

E_USER_DEPRECATED => [
'name' => 'User Deprecated',
'severity' => 'info',
],
];



if (PHP_VERSION_ID < 80400) {
static::$ERROR_TYPES[E_STRICT] = [
'name' => 'PHP Strict',
'severity' => 'info',
];
}
}






protected static function getErrorTypes()
{
if (static::$ERROR_TYPES === null)
static::initializeErrorTypes();
return static::$ERROR_TYPES;
}








public static function isFatal($code)
{
return static::getSeverity($code) === 'error';
}








public static function getName($code)
{
$errorTypes = static::getErrorTypes();

if (array_key_exists($code, $errorTypes)) {
return $errorTypes[$code]['name'];
}

return 'Unknown';
}








public static function getSeverity($code)
{
$errorTypes = static::getErrorTypes();

if (array_key_exists($code, $errorTypes)) {
return $errorTypes[$code]['severity'];
}

return 'error';
}








public static function getLevelsForSeverity($severity)
{
$levels = 0;
$errorTypes = static::getErrorTypes();

foreach ($errorTypes as $level => $info) {
if ($info['severity'] == $severity) {
$levels |= $level;
}
}

return $levels;
}






public static function getAllCodes()
{
return array_keys(static::getErrorTypes());
}










public static function codeToString($code)
{
$map = [
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_CORE_ERROR => 'E_CORE_ERROR',
E_CORE_WARNING => 'E_CORE_WARNING',
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
E_DEPRECATED => 'E_DEPRECATED',
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
];



if (PHP_VERSION_ID < 80400) {
$map[E_STRICT] = 'E_STRICT';
}

return isset($map[$code]) ? $map[$code] : 'Unknown';
}
}
<?php

namespace Bugsnag\Request;

class NullRequest implements RequestInterface
{





public function isRequest()
{
return false;
}






public function getSession()
{
return [];
}






public function getCookies()
{
return [];
}






public function getMetaData()
{
return [];
}






public function getContext()
{
return null;
}






public function getUserId()
{
return null;
}
}
<?php

namespace Bugsnag\Request;

class ConsoleRequest implements RequestInterface
{





protected $command;








public function __construct(array $command)
{
$this->command = $command;
}






public function isRequest()
{
return false;
}






public function getSession()
{
return [];
}






public function getCookies()
{
return [];
}






public function getMetaData()
{
if (count($this->command) == 0) {
return ['console' => [
'Command' => 'Command could not be retrieved', ],
];
}
$commandString = implode(' ', $this->command);
$primaryCommand = $this->command[0];
$arguments = [];
$options = [];
foreach (array_slice($this->command, 1) as $arg) {
if (isset($arg[0]) && $arg[0] === '-') {
$options[] = $arg;
} else {
$arguments[] = $arg;
}
}
$data = [
'Input' => $commandString,
'Command' => $primaryCommand,
'Arguments' => $arguments,
'Options' => $options,
];

return ['console' => $data];
}






public function getContext()
{
return implode(' ', array_slice($this->command, 0, 4));
}






public function getUserId()
{
return null;
}
}
<?php

namespace Bugsnag\Request;

class BasicResolver implements ResolverInterface
{





public function resolve()
{
if (isset($_SERVER['REQUEST_METHOD'])) {
if (strtoupper($_SERVER['REQUEST_METHOD']) === 'GET') {
$params = static::getInputParams($_SERVER, $_GET, false);
} else {
$params = static::getInputParams($_SERVER, $_POST, true);
}

return new PhpRequest(
$_SERVER,
empty($_SESSION) ? [] : $_SESSION,
empty($_COOKIE) ? [] : $_COOKIE,
static::getRequestHeaders($_SERVER),
$params
);
}

if (PHP_SAPI === 'cli' && isset($_SERVER['argv'])) {
return new ConsoleRequest($_SERVER['argv']);
}

return new NullRequest();
}















protected static function getRequestHeaders(array $server)
{
static $headers;

if ($headers !== null) {
return $headers;
}

if (function_exists('getallheaders')) {
return getallheaders();
}

$headers = [];

foreach ($server as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
} elseif ($name === 'CONTENT_TYPE') {
$headers['Content-Type'] = $value;
} elseif ($name === 'CONTENT_LENGTH') {
$headers['Content-Length'] = $value;
}
}

return $headers;
}


















protected static function getInputParams(array $server, array $params, $fallbackToInput = false)
{
static $result;

if ($result !== null) {
return $result ?: null;
}

$result = $params;

if ($fallbackToInput === true) {
$result = $result ?: static::parseInput($server, static::readInput());
}

return $result ?: null;
}






protected static function readInput()
{
return file_get_contents('php://input') ?: false;
}









protected static function parseInput(array $server, $input)
{
if (!$input) {
return null;
}

if (isset($server['CONTENT_TYPE']) && stripos($server['CONTENT_TYPE'], 'application/json') === 0) {
return (array) json_decode($input, true) ?: null;
}

if (strtoupper($server['REQUEST_METHOD']) === 'PUT') {
parse_str($input, $params);

return (array) $params ?: null;
}

return null;
}
}
<?php

namespace Bugsnag\Request;

class PhpRequest implements RequestInterface
{





protected $server;






protected $session;






protected $cookies;






protected $headers;






protected $input;












public function __construct(array $server, array $session, array $cookies, array $headers, $input = null)
{
$this->server = $server;
$this->session = $session;
$this->cookies = $cookies;
$this->headers = $headers;
$this->input = $input;
}






public function isRequest()
{
return true;
}






public function getSession()
{
return $this->session;
}






public function getCookies()
{
return $this->cookies;
}






public function getMetaData()
{
$data = [];

$data['url'] = $this->getCurrentUrl();

if (isset($this->server['REQUEST_METHOD'])) {
$data['httpMethod'] = $this->server['REQUEST_METHOD'];
}

$data['params'] = $this->input;

$data['clientIp'] = $this->getRequestIp();

if (isset($this->server['HTTP_USER_AGENT'])) {
$data['userAgent'] = $this->server['HTTP_USER_AGENT'];
}

if ($this->headers) {
$data['headers'] = $this->headers;
}

return ['request' => $data];
}






public function getContext()
{
if (isset($this->server['REQUEST_METHOD']) && isset($this->server['REQUEST_URI'])) {
return $this->server['REQUEST_METHOD'] . ' ' . strtok($this->server['REQUEST_URI'], '?');
}

return null;
}






public function getUserId()
{
return $this->getRequestIp();
}






protected function getCurrentUrl()
{
$schema = ((!empty($this->server['HTTPS']) && $this->server['HTTPS'] !== 'off') || (!empty($this->server['SERVER_PORT']) && $this->server['SERVER_PORT'] == 443)) ? 'https://' : 'http://';

$host = isset($this->server['HTTP_HOST']) ? $this->server['HTTP_HOST'] : 'localhost';

return $schema . $host . $this->server['REQUEST_URI'];
}






protected function getRequestIp()
{
if (isset($this->server['HTTP_X_FORWARDED_FOR'])) {
return $this->server['HTTP_X_FORWARDED_FOR'];
}

if (isset($this->server['REMOTE_ADDR'])) {
return $this->server['REMOTE_ADDR'];
}

return null;
}
}
<?php

namespace Bugsnag\Request;

interface ResolverInterface
{





public function resolve();
}
<?php

namespace Bugsnag\Request;

interface RequestInterface
{





public function isRequest();






public function getSession();






public function getCookies();






public function getMetaData();






public function getContext();






public function getUserId();
}
<?php

namespace Bugsnag;

class Pipeline
{





protected $pipes;








public function __construct(array $pipes = [])
{
$this->pipes = $pipes;
}








public function pipe(callable $pipe)
{
$this->pipes[] = $pipe;

return $this;
}









public function insertBefore(callable $pipe, $beforeClass)
{
$beforePosition = null;
foreach ($this->pipes as $index => $callable) {
$class = get_class($callable);
if ($class === $beforeClass) {
$beforePosition = $index;
break;
}
}
if ($beforePosition === null) {
$this->pipes[] = $pipe;
} else {
array_splice($this->pipes, $beforePosition, 0, [$pipe]);
}

return $this;
}









public function execute($passable, callable $destination)
{
$first = function ($passable) use ($destination) {
return call_user_func($destination, $passable);
};

$pipes = array_reverse($this->pipes);

return call_user_func(array_reduce($pipes, $this->getSlice(), $first), $passable);
}






protected function getSlice()
{
return function ($stack, $pipe) {
return function ($passable) use ($stack, $pipe) {
return call_user_func($pipe, $passable, $stack);
};
};
}
}
<?php

namespace Bugsnag;

use Exception;
use Throwable;

class Handler
{





protected $client;






protected $previousErrorHandler;






protected $previousExceptionHandler;











private $reservedMemory;






private $oomRegex = '/^Allowed memory size of (\d+) bytes exhausted \(tried to allocate \d+ bytes\)/';









private static $enableShutdownHandler = true;








public static function register($client = null)
{
if (!$client instanceof Client) {
$client = Client::make($client);
}


$handler = new static($client);
$handler->registerBugsnagHandlers(true);

return $handler;
}










public static function registerWithPrevious($client = null)
{
return self::register($client);
}








protected function registerBugsnagHandlers($callPrevious)
{
$this->registerErrorHandler($callPrevious);
$this->registerExceptionHandler($callPrevious);
$this->registerShutdownHandler();
}








public function registerErrorHandler($callPrevious)
{
$previous = set_error_handler([$this, 'errorHandler']);

if ($callPrevious) {
$this->previousErrorHandler = $previous;
}
}








public function registerExceptionHandler($callPrevious)
{
$previous = set_exception_handler([$this, 'exceptionHandler']);

if (!$callPrevious) {
return;
}



if (!is_callable($previous)) {
$previous = static function ($throwable) {
throw $throwable;
};
}

$this->previousExceptionHandler = $previous;
}








public function registerShutdownHandler()
{

$this->reservedMemory = str_repeat(' ', 1024 * 32);

register_shutdown_function([$this, 'shutdownHandler']);
}








public function __construct(Client $client)
{
$this->client = $client;
}








public function exceptionHandler($throwable)
{
$this->notifyThrowable($throwable);


if (!$this->previousExceptionHandler) {
return;
}



try {
call_user_func($this->previousExceptionHandler, $throwable);

return;
} catch (Throwable $exceptionFromPreviousHandler) {



} catch (Exception $exceptionFromPreviousHandler) {
}





if ($throwable === $exceptionFromPreviousHandler) {
self::$enableShutdownHandler = false;

throw $throwable;
}




$this->notifyThrowable($exceptionFromPreviousHandler);
}








private function notifyThrowable($throwable)
{
$report = Report::fromPHPThrowable(
$this->client->getConfig(),
$throwable
);

$report->setSeverity('error');
$report->setUnhandled(true);
$report->setSeverityReason(['type' => 'unhandledException']);

$this->client->notify($report);
}











public function errorHandler($errno, $errstr, $errfile = '', $errline = 0)
{
if (!$this->client->getConfig()->shouldIgnoreErrorCode($errno)) {
$report = Report::fromPHPError(
$this->client->getConfig(),
$errno,
$errstr,
$errfile,
$errline,
false
);

$report->setUnhandled(true);
$report->setSeverityReason([
'type' => 'unhandledError',
'attributes' => [
'errorType' => ErrorTypes::getName($errno),
],
]);

$this->client->notify($report);
}

if ($this->previousErrorHandler) {
return call_user_func(
$this->previousErrorHandler,
$errno,
$errstr,
$errfile,
$errline
);
}

return false;
}






public function shutdownHandler()
{

$this->reservedMemory = null;



if (!self::$enableShutdownHandler) {
return;
}

$lastError = error_get_last();



if ($lastError !== null
&& $this->client->getMemoryLimitIncrease() !== null
&& preg_match($this->oomRegex, $lastError['message'], $matches) === 1
) {
$currentMemoryLimit = (int) $matches[1];
$newMemoryLimit = $currentMemoryLimit + $this->client->getMemoryLimitIncrease();

ini_set('memory_limit', (string) $newMemoryLimit);
}


if (!is_null($lastError) && ErrorTypes::isFatal($lastError['type']) && !$this->client->getConfig()->shouldIgnoreErrorCode($lastError['type'])) {
$report = Report::fromPHPError(
$this->client->getConfig(),
$lastError['type'],
$lastError['message'],
$lastError['file'],
$lastError['line'],
true
);

$report->setSeverity('error');
$report->setUnhandled(true);
$report->setSeverityReason([
'type' => 'unhandledException',
]);

$this->client->notify($report);
}


$this->client->flush();
}
}
Copyright (c) 2013 Bugsnag

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.
<?php

require_once 'vendor/autoload.php';

register_shutdown_function(function () {
$lastError = error_get_last();

if (!is_null($lastError)) {
$client = Bugsnag\Client::make(getenv('BUGSNAG_API_KEY'));
if ($client->shouldIgnoreErrorCode($lastError['type'])) {
return;
}
$report = Bugsnag\Report::fromPHPError(
$client->getConfig(),
$lastError['type'],
$lastError['message'],
$lastError['file'],
$lastError['line'],
true
);
$report->setSeverity('error');
$report->setUnhandled(true);
$report->setSeverityReason([
'type' => 'unhandledException',
]);
$client->notify($report);
$client->flush();
}
});
Copyright (c) 2014 Chris Boden

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.
<?php

if (!function_exists('Ratchet\Client\connect')) {
require __DIR__ . '/functions.php';
}<?php
namespace Ratchet\Client;
use React\EventLoop\LoopInterface;








function connect($url, array $subProtocols = [], $headers = [], ?LoopInterface $loop = null) {
$connector = new Connector($loop);
$connection = $connector($url, $subProtocols, $headers);

return $connection;
}
<?php
namespace Ratchet\Client;
use Evenement\EventEmitterTrait;
use Evenement\EventEmitterInterface;
use React\Socket\ConnectionInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Ratchet\RFC6455\Messaging\MessageBuffer;
use Ratchet\RFC6455\Messaging\CloseFrameChecker;
use Ratchet\RFC6455\Messaging\MessageInterface;
use Ratchet\RFC6455\Messaging\FrameInterface;
use Ratchet\RFC6455\Messaging\Frame;

class WebSocket implements EventEmitterInterface {
use EventEmitterTrait;





public $request;





public $response;




protected $_stream;




protected $_close;

/**
@event
@event
@event
@event
@event




*/
public function __construct(ConnectionInterface $stream, ResponseInterface $response, RequestInterface $request) {
$this->_stream = $stream;
$this->response = $response;
$this->request = $request;

$self = $this;
$this->_close = function($code = null, $reason = null) use ($self) {
static $sent = false;

if ($sent) {
return;
}
$sent = true;

$self->emit('close', [$code, $reason, $self]);
};

$reusableUAException = new \UnderflowException;

$streamer = new MessageBuffer(
new CloseFrameChecker,
function(MessageInterface $msg) {
$this->emit('message', [$msg, $this]);
},
function(FrameInterface $frame) use (&$streamer) {
switch ($frame->getOpcode()) {
case Frame::OP_CLOSE:
$frameContents = $frame->getPayload();

$reason = '';
$code = unpack('n', substr($frameContents, 0, 2));
$code = reset($code);

if (($frameLen = strlen($frameContents)) > 2) {
$reason = substr($frameContents, 2, $frameLen);
}

$closeFn = $this->_close;
$closeFn($code, $reason);

return $this->_stream->end($streamer->newFrame($frame->getPayload(), true, Frame::OP_CLOSE)->maskPayload()->getContents());
case Frame::OP_PING:
$this->emit('ping', [$frame, $this]);
return $this->send($streamer->newFrame($frame->getPayload(), true, Frame::OP_PONG));
case Frame::OP_PONG:
return $this->emit('pong', [$frame, $this]);
default:
return $this->close(Frame::CLOSE_PROTOCOL);
}
},
false,
function() use ($reusableUAException) {
return $reusableUAException;
}
);

$stream->on('data', [$streamer, 'onData']);

$stream->on('close', function () {
$close = $this->_close;
$close(Frame::CLOSE_ABNORMAL, 'Underlying connection closed');
});

$stream->on('error', function($error) {
$this->emit('error', [$error, $this]);
});

$stream->on('drain', function () {
$this->emit('drain');
});
}

public function send($msg) {
if ($msg instanceof MessageInterface) {
foreach ($msg as $frame) {
$frame->maskPayload();
}
} else {
if (!($msg instanceof Frame)) {
$msg = new Frame($msg);
}
$msg->maskPayload();
}

return $this->_stream->write($msg->getContents());
}

public function close($code = 1000, $reason = '') {
$frame = new Frame(pack('n', $code) . $reason, true, Frame::OP_CLOSE);
$frame->maskPayload();
$this->_stream->write($frame->getContents());

$closeFn = $this->_close;
$closeFn($code, $reason);

$this->_stream->end();
}

public function pause()
{
$this->_stream->pause();
}

public function resume()
{
$this->_stream->resume();
}
}
<?php
namespace Ratchet\Client;
use Ratchet\RFC6455\Handshake\ClientNegotiator;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Socket\ConnectionInterface;
use React\Socket\ConnectorInterface;
use React\Promise\Deferred;
use function React\Promise\reject;
use Psr\Http\Message\RequestInterface;
use GuzzleHttp\Psr7 as gPsr;

class Connector {
protected $_loop;
protected $_connector;
protected $_negotiator;

public function __construct(?LoopInterface $loop = null, ?ConnectorInterface $connector = null) {
$this->_loop = $loop ?: Loop::get();

if (null === $connector) {
$connector = new \React\Socket\Connector([
'timeout' => 20
], $this->_loop);
}

$this->_connector = $connector;
$this->_negotiator = new ClientNegotiator(new gPsr\HttpFactory());
}







public function __invoke($url, array $subProtocols = [], array $headers = []) {
try {
$request = $this->generateRequest($url, $subProtocols, $headers);
$uri = $request->getUri();
} catch (\Exception $e) {
return reject($e);
}
$secure = 'wss' === substr($url, 0, 3);
$connector = $this->_connector;

$port = $uri->getPort() ?: ($secure ? 443 : 80);

$scheme = $secure ? 'tls' : 'tcp';

$uriString = $scheme . '://' . $uri->getHost() . ':' . $port;

$connecting = $connector->connect($uriString);

$futureWsConn = new Deferred(function ($_, $reject) use ($url, $connecting) {
$reject(new \RuntimeException(
'Connection to ' . $url . ' cancelled during handshake'
));


$connecting->then(function (ConnectionInterface $connection) {
$connection->close();
});
$connecting->cancel();
});

$connecting->then(function(ConnectionInterface $conn) use ($request, $subProtocols, $futureWsConn) {
$earlyClose = function() use ($futureWsConn) {
$futureWsConn->reject(new \RuntimeException('Connection closed before handshake'));
};

$stream = $conn;

$stream->on('close', $earlyClose);
$futureWsConn->promise()->then(function() use ($stream, $earlyClose) {
$stream->removeListener('close', $earlyClose);
}, function (\Exception $exception) use ($futureWsConn) {
$futureWsConn->reject($exception);
});

$buffer = '';
$headerParser = function($data) use ($stream, &$headerParser, &$buffer, $futureWsConn, $request, $subProtocols) {
$buffer .= $data;
if (false == strpos($buffer, "\r\n\r\n")) {
return;
}

$stream->removeListener('data', $headerParser);

$response = gPsr\Message::parseResponse($buffer);

if (!$this->_negotiator->validateResponse($request, $response)) {
$futureWsConn->reject(new \DomainException(gPsr\Message::toString($response)));
$stream->close();

return;
}

$acceptedProtocol = $response->getHeader('Sec-WebSocket-Protocol');
if ((count($subProtocols) > 0) && 1 !== count(array_intersect($subProtocols, $acceptedProtocol))) {
$futureWsConn->reject(new \DomainException('Server did not respond with an expected Sec-WebSocket-Protocol'));
$stream->close();

return;
}

$futureWsConn->resolve(new WebSocket($stream, $response, $request));

$futureWsConn->promise()->then(function(WebSocket $conn) use ($stream) {
$stream->emit('data', [$conn->response->getBody()->getContents(), $stream]);
});
};

$stream->on('data', $headerParser);
$stream->write(gPsr\Message::toString($request));
}, array($futureWsConn, 'reject'));

return $futureWsConn->promise();
}








protected function generateRequest($url, array $subProtocols, array $headers) {
$uri = gPsr\Utils::uriFor($url);

$scheme = $uri->getScheme();

if (!in_array($scheme, ['ws', 'wss'])) {
throw new \InvalidArgumentException(sprintf('Cannot connect to invalid URL (%s)', $url));
}

$uri = $uri->withScheme('wss' === $scheme ? 'HTTPS' : 'HTTP');

$headers += ['User-Agent' => 'Ratchet-Pawl/0.4.1'];

$request = array_reduce(array_keys($headers), function(RequestInterface $request, $header) use ($headers) {
return $request->withHeader($header, $headers[$header]);
}, $this->_negotiator->generateRequest($uri));

if (!$request->getHeader('Origin')) {
$request = $request->withHeader('Origin', str_replace('ws', 'http', $scheme) . '://' . $uri->getHost());
}

if (count($subProtocols) > 0) {
$protocols = implode(',', $subProtocols);
if ($protocols != "") {
$request = $request->withHeader('Sec-WebSocket-Protocol', $protocols);
}
}

return $request;
}
}
Copyright (c) 2011 Chris Boden

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.
<?php
namespace Ratchet\RFC6455\Handshake;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Psr\Http\Message\RequestFactoryInterface;

class ClientNegotiator {
private ResponseVerifier $verifier;

private RequestInterface $defaultHeader;

private RequestFactoryInterface $requestFactory;

public function __construct(
RequestFactoryInterface $requestFactory,
?PermessageDeflateOptions $perMessageDeflateOptions = null
) {
$this->verifier = new ResponseVerifier;
$this->requestFactory = $requestFactory;

$this->defaultHeader = $this->requestFactory
->createRequest('GET', '')
->withHeader('Connection' , 'Upgrade')
->withHeader('Upgrade' , 'websocket')
->withHeader('Sec-WebSocket-Version', $this->getVersion())
->withHeader('User-Agent' , 'Ratchet');

$perMessageDeflateOptions ??= PermessageDeflateOptions::createDisabled();



if ($perMessageDeflateOptions->isEnabled() && !PermessageDeflateOptions::permessageDeflateSupported()) {
trigger_error('permessage-deflate is being disabled because it is not supported by your PHP version.', E_USER_NOTICE);
$perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
}
if ($perMessageDeflateOptions->isEnabled() && !function_exists('deflate_add')) {
trigger_error('permessage-deflate is being disabled because you do not have the zlib extension.', E_USER_NOTICE);
$perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
}

$this->defaultHeader = $perMessageDeflateOptions->addHeaderToRequest($this->defaultHeader);
}

public function generateRequest(UriInterface $uri): RequestInterface {
return $this->defaultHeader->withUri($uri)
->withHeader('Sec-WebSocket-Key', $this->generateKey());
}

public function validateResponse(RequestInterface $request, ResponseInterface $response): bool {
return $this->verifier->verifyAll($request, $response);
}

public function generateKey(): string {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwzyz1234567890+/=';
$charRange = strlen($chars) - 1;
$key = '';
for ($i = 0; $i < 16; $i++) {
$key .= $chars[mt_rand(0, $charRange)];
}

return base64_encode($key);
}

public function getVersion(): int {
return 13;
}
}
<?php
namespace Ratchet\RFC6455\Handshake;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class ResponseVerifier {
public function verifyAll(RequestInterface $request, ResponseInterface $response): bool {
$passes = 0;

$passes += (int)$this->verifyStatus($response->getStatusCode());
$passes += (int)$this->verifyUpgrade($response->getHeader('Upgrade'));
$passes += (int)$this->verifyConnection($response->getHeader('Connection'));
$passes += (int)$this->verifySecWebSocketAccept(
$response->getHeader('Sec-WebSocket-Accept')
, $request->getHeader('Sec-WebSocket-Key')
);
$passes += (int)$this->verifySubProtocol(
$request->getHeader('Sec-WebSocket-Protocol')
, $response->getHeader('Sec-WebSocket-Protocol')
);
$passes += (int)$this->verifyExtensions(
$request->getHeader('Sec-WebSocket-Extensions')
, $response->getHeader('Sec-WebSocket-Extensions')
);

return (6 === $passes);
}

public function verifyStatus(int $status): bool {
return $status === 101;
}

public function verifyUpgrade(array $upgrade): bool {
return in_array('websocket', array_map('strtolower', $upgrade));
}

public function verifyConnection(array $connection): bool {
return in_array('upgrade', array_map('strtolower', $connection));
}

public function verifySecWebSocketAccept(array $swa, array $key): bool {
return
1 === count($swa) &&
1 === count($key) &&
$swa[0] === $this->sign($key[0])
;
}

public function sign(string $key): string {
return base64_encode(sha1($key . NegotiatorInterface::GUID, true));
}

public function verifySubProtocol(array $requestHeader, array $responseHeader): bool {
if (0 === count($responseHeader)) {
return true;
}

$requestedProtocols = array_map('trim', explode(',', implode(',', $requestHeader)));

return count($responseHeader) === 1 && count(array_intersect($responseHeader, $requestedProtocols)) === 1;
}

public function verifyExtensions(array $requestHeader, array $responseHeader): int {
if (in_array('permessage-deflate', $responseHeader)) {
return strpos(implode(',', $requestHeader), 'permessage-deflate') !== false ? 1 : 0;
}

return 1;
}
}
<?php
namespace Ratchet\RFC6455\Handshake;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;





class ServerNegotiator implements NegotiatorInterface {
private RequestVerifier $verifier;

private ResponseFactoryInterface $responseFactory;

private array $_supportedSubProtocols = [];

private bool $_strictSubProtocols = false;

private bool $enablePerMessageDeflate = false;

public function __construct(
RequestVerifier $requestVerifier,
ResponseFactoryInterface $responseFactory,
$enablePerMessageDeflate = false
) {
$this->verifier = $requestVerifier;
$this->responseFactory = $responseFactory;



$supported = PermessageDeflateOptions::permessageDeflateSupported();
if ($enablePerMessageDeflate && !$supported) {
throw new \Exception('permessage-deflate is not supported by your PHP version (need >=7.1.4 or >=7.0.18).');
}
if ($enablePerMessageDeflate && !function_exists('deflate_add')) {
throw new \Exception('permessage-deflate is not supported because you do not have the zlib extension.');
}

$this->enablePerMessageDeflate = $enablePerMessageDeflate;
}




public function isProtocol(RequestInterface $request): bool {
return $this->verifier->verifyVersion($request->getHeader('Sec-WebSocket-Version'));
}




public function getVersionNumber(): int {
return RequestVerifier::VERSION;
}




public function handshake(RequestInterface $request): ResponseInterface {
$response = $this->responseFactory->createResponse();
if (true !== $this->verifier->verifyMethod($request->getMethod())) {
return $response->withHeader('Allow', 'GET')->withStatus(405);
}

if (true !== $this->verifier->verifyHTTPVersion($request->getProtocolVersion())) {
return $response->withStatus(505);
}

if (true !== $this->verifier->verifyRequestURI($request->getUri()->getPath())) {
return $response->withStatus(400);
}

if (true !== $this->verifier->verifyHost($request->getHeader('Host'))) {
return $response->withStatus(400);
}

$upgradeResponse = $response
->withHeader('Connection' , 'Upgrade')
->withHeader('Upgrade' , 'websocket')
->withHeader('Sec-WebSocket-Version', $this->getVersionNumber());

if (count($this->_supportedSubProtocols) > 0) {
$upgradeResponse = $upgradeResponse->withHeader(
'Sec-WebSocket-Protocol', implode(', ', array_keys($this->_supportedSubProtocols))
);
}
if (true !== $this->verifier->verifyUpgradeRequest($request->getHeader('Upgrade'))) {
return $upgradeResponse->withStatus(426, 'Upgrade header MUST be provided');
}

if (true !== $this->verifier->verifyConnection($request->getHeader('Connection'))) {
return $response->withStatus(400, 'Connection Upgrade MUST be requested');
}

if (true !== $this->verifier->verifyKey($request->getHeader('Sec-WebSocket-Key'))) {
return $response->withStatus(400, 'Invalid Sec-WebSocket-Key');
}

if (true !== $this->verifier->verifyVersion($request->getHeader('Sec-WebSocket-Version'))) {
return $upgradeResponse->withStatus(426);
}

$subProtocols = $request->getHeader('Sec-WebSocket-Protocol');
if (count($subProtocols) > 0 || (count($this->_supportedSubProtocols) > 0 && $this->_strictSubProtocols)) {
$subProtocols = array_map('trim', explode(',', implode(',', $subProtocols)));

$match = array_reduce($subProtocols, fn ($accumulator, $protocol) => $accumulator ?: (isset($this->_supportedSubProtocols[$protocol]) ? $protocol : null), null);

if ($this->_strictSubProtocols && null === $match) {
return $upgradeResponse->withStatus(426, 'No Sec-WebSocket-Protocols requested supported');
}

if (null !== $match) {
$response = $response->withHeader('Sec-WebSocket-Protocol', $match);
}
}

$response = $response
->withStatus(101)
->withHeader('Upgrade' , 'websocket')
->withHeader('Connection' , 'Upgrade')
->withHeader('Sec-WebSocket-Accept', $this->sign((string)$request->getHeader('Sec-WebSocket-Key')[0]))
->withHeader('X-Powered-By' , 'Ratchet');

try {
$perMessageDeflateRequest = PermessageDeflateOptions::fromRequestOrResponse($request)[0];
} catch (InvalidPermessageDeflateOptionsException $e) {
return new Response(400, [], null, '1.1', $e->getMessage());
}

if ($this->enablePerMessageDeflate && $perMessageDeflateRequest->isEnabled()) {
$response = $perMessageDeflateRequest->addHeaderToResponse($response);
}

return $response;
}







public function sign(string $key): string {
return base64_encode(sha1($key . static::GUID, true));
}




public function setSupportedSubProtocols(array $protocols): void {
$this->_supportedSubProtocols = array_flip($protocols);
}









public function setStrictSubProtocolCheck(bool $enable): void {
$this->_strictSubProtocols = $enable;
}
}
<?php
namespace Ratchet\RFC6455\Handshake;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;





interface NegotiatorInterface {
const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';






public function isProtocol(RequestInterface $request): bool;





public function getVersionNumber(): int;






public function handshake(RequestInterface $request): ResponseInterface;





public function setSupportedSubProtocols(array $protocols): void;









public function setStrictSubProtocolCheck(bool $enable): void;
}
<?php
namespace Ratchet\RFC6455\Handshake;
use Psr\Http\Message\RequestInterface;






class RequestVerifier {
public const VERSION = 13;






public function verifyAll(RequestInterface $request): bool {
$passes = 0;

$passes += (int)$this->verifyMethod($request->getMethod());
$passes += (int)$this->verifyHTTPVersion($request->getProtocolVersion());
$passes += (int)$this->verifyRequestURI($request->getUri()->getPath());
$passes += (int)$this->verifyHost($request->getHeader('Host'));
$passes += (int)$this->verifyUpgradeRequest($request->getHeader('Upgrade'));
$passes += (int)$this->verifyConnection($request->getHeader('Connection'));
$passes += (int)$this->verifyKey($request->getHeader('Sec-WebSocket-Key'));
$passes += (int)$this->verifyVersion($request->getHeader('Sec-WebSocket-Version'));

return 8 === $passes;
}






public function verifyMethod(string $val): bool {
return 'get' === strtolower($val);
}






public function verifyHTTPVersion($val): bool {
return 1.1 <= (double)$val;
}





public function verifyRequestURI(string $val): bool {
if ($val[0] !== '/') {
return false;
}

if (false !== strstr($val, '#')) {
return false;
}

if (!extension_loaded('mbstring')) {
return true;
}

return mb_check_encoding($val, 'US-ASCII');
}






public function verifyHost(array $hostHeader): bool {
return 1 === count($hostHeader);
}






public function verifyUpgradeRequest(array $upgradeHeader): bool {
return 1 === count($upgradeHeader) && 'websocket' === strtolower($upgradeHeader[0]);
}






public function verifyConnection(array $connectionHeader): bool {
foreach ($connectionHeader as $l) {
$upgrades = array_filter(
array_map('trim', array_map('strtolower', explode(',', $l))),
static fn (string $x) => 'upgrade' === $x
);
if (count($upgrades) > 0) {
return true;
}
}
return false;
}








public function verifyKey(array $keyHeader): bool {
return 1 === count($keyHeader) && 16 === strlen(base64_decode($keyHeader[0]));
}






public function verifyVersion(array $versionHeader): bool {
return 1 === count($versionHeader) && static::VERSION === (int)$versionHeader[0];
}




public function verifyProtocol($val): bool {
return true;
}




public function verifyExtensions($val): bool {
return true;
}

public function getPermessageDeflateOptions(array $requestHeader, array $responseHeader): array {
$headerChecker = static fn (string $val) => 'permessage-deflate' === substr($val, 0, strlen('permessage-deflate'));

$deflate = true;
if (!isset($requestHeader['Sec-WebSocket-Extensions']) || count(array_filter($requestHeader['Sec-WebSocket-Extensions'], $headerChecker)) === 0) {
$deflate = false;
}

if (!isset($responseHeader['Sec-WebSocket-Extensions']) || count(array_filter($responseHeader['Sec-WebSocket-Extensions'], $headerChecker)) === 0) {
$deflate = false;
}

return [
'deflate' => $deflate,
'no_context_takeover' => false,
'max_window_bits' => null,
'request_no_context_takeover' => false,
'request_max_window_bits' => null
];
}
}
<?php

namespace Ratchet\RFC6455\Handshake;

use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

final class PermessageDeflateOptions
{
public const MAX_WINDOW_BITS = 15;

private const VALID_BITS = [8, 9, 10, 11, 12, 13, 14, 15];

private bool $deflateEnabled = false;

private ?bool $server_no_context_takeover = null;
private ?bool $client_no_context_takeover = null;
private ?int $server_max_window_bits = null;
private ?int $client_max_window_bits = null;

private function __construct() { }

public static function createEnabled() {
$new = new self();
$new->deflateEnabled = true;
$new->client_max_window_bits = self::MAX_WINDOW_BITS;
$new->client_no_context_takeover = false;
$new->server_max_window_bits = self::MAX_WINDOW_BITS;
$new->server_no_context_takeover = false;

return $new;
}

public static function createDisabled() {
return new self();
}

public function withClientNoContextTakeover(): self {
$new = clone $this;
$new->client_no_context_takeover = true;
return $new;
}

public function withoutClientNoContextTakeover(): self {
$new = clone $this;
$new->client_no_context_takeover = false;
return $new;
}

public function withServerNoContextTakeover(): self {
$new = clone $this;
$new->server_no_context_takeover = true;
return $new;
}

public function withoutServerNoContextTakeover(): self {
$new = clone $this;
$new->server_no_context_takeover = false;
return $new;
}

public function withServerMaxWindowBits(int $bits = self::MAX_WINDOW_BITS): self {
if (!in_array($bits, self::VALID_BITS)) {
throw new \Exception('server_max_window_bits must have a value between 8 and 15.');
}
$new = clone $this;
$new->server_max_window_bits = $bits;
return $new;
}

public function withClientMaxWindowBits(int $bits = self::MAX_WINDOW_BITS): self {
if (!in_array($bits, self::VALID_BITS)) {
throw new \Exception('client_max_window_bits must have a value between 8 and 15.');
}
$new = clone $this;
$new->client_max_window_bits = $bits;
return $new;
}









public static function fromRequestOrResponse(MessageInterface $requestOrResponse): array {
$optionSets = [];

$extHeader = preg_replace('/\s+/', '', join(', ', $requestOrResponse->getHeader('Sec-Websocket-Extensions')));

$configurationRequests = explode(',', $extHeader);
foreach ($configurationRequests as $configurationRequest) {
$parts = explode(';', $configurationRequest);
if (count($parts) == 0) {
continue;
}

if ($parts[0] !== 'permessage-deflate') {
continue;
}

array_shift($parts);
$options = new self();
$options->deflateEnabled = true;
foreach ($parts as $part) {
$kv = explode('=', $part);
$key = $kv[0];
$value = count($kv) > 1 ? $kv[1] : null;

switch ($key) {
case "server_no_context_takeover":
case "client_no_context_takeover":
if ($value !== null) {
throw new InvalidPermessageDeflateOptionsException($key . ' must not have a value.');
}
$value = true;
break;
case "server_max_window_bits":
$value = (int) $value;
if (!in_array($value, self::VALID_BITS)) {
throw new InvalidPermessageDeflateOptionsException($key . ' must have a value between 8 and 15.');
}
break;
case "client_max_window_bits":
if ($value === null) {
$value = 15;
} else {
$value = (int) $value;
}
if (!in_array($value, self::VALID_BITS)) {
throw new InvalidPermessageDeflateOptionsException($key . ' must have no value or a value between 8 and 15.');
}
break;
default:
throw new InvalidPermessageDeflateOptionsException('Option "' . $key . '"is not valid for permessage deflate');
}

if ($options->$key !== null) {
throw new InvalidPermessageDeflateOptionsException($key . ' specified more than once. Connection must be declined.');
}

$options->$key = $value;
}

if ($options->getClientMaxWindowBits() === null) {
$options->client_max_window_bits = 15;
}

if ($options->getServerMaxWindowBits() === null) {
$options->server_max_window_bits = 15;
}

$optionSets[] = $options;
}


$optionSets[] = new self();

return $optionSets;
}




public function getServerNoContextTakeover(): ?bool
{
return $this->server_no_context_takeover;
}




public function getClientNoContextTakeover(): ?bool
{
return $this->client_no_context_takeover;
}




public function getServerMaxWindowBits(): ?int
{
return $this->server_max_window_bits;
}




public function getClientMaxWindowBits(): ?int
{
return $this->client_max_window_bits;
}




public function isEnabled(): bool
{
return $this->deflateEnabled;
}





public function addHeaderToResponse(ResponseInterface $response): ResponseInterface
{
if (!$this->deflateEnabled) {
return $response;
}

$header = 'permessage-deflate';
if ($this->client_max_window_bits != 15) {
$header .= '; client_max_window_bits='. $this->client_max_window_bits;
}
if ($this->client_no_context_takeover) {
$header .= '; client_no_context_takeover';
}
if ($this->server_max_window_bits != 15) {
$header .= '; server_max_window_bits=' . $this->server_max_window_bits;
}
if ($this->server_no_context_takeover) {
$header .= '; server_no_context_takeover';
}

return $response->withAddedHeader('Sec-Websocket-Extensions', $header);
}

public function addHeaderToRequest(RequestInterface $request): RequestInterface {
if (!$this->deflateEnabled) {
return $request;
}

$header = 'permessage-deflate';
if ($this->server_no_context_takeover) {
$header .= '; server_no_context_takeover';
}
if ($this->client_no_context_takeover) {
$header .= '; client_no_context_takeover';
}
if ($this->server_max_window_bits != 15) {
$header .= '; server_max_window_bits=' . $this->server_max_window_bits;
}
$header .= '; client_max_window_bits';
if ($this->client_max_window_bits != 15) {
$header .= '='. $this->client_max_window_bits;
}

return $request->withAddedHeader('Sec-Websocket-Extensions', $header);
}

public static function permessageDeflateSupported(string $version = PHP_VERSION): bool {
if (!function_exists('deflate_init')) {
return false;
}
if (version_compare($version, '7.1.3', '>')) {
return true;
}
if (version_compare($version, '7.0.18', '>=')
&& version_compare($version, '7.1.0', '<')) {
return true;
}

return false;
}
}
<?php

namespace Ratchet\RFC6455\Handshake;

class InvalidPermessageDeflateOptionsException extends \Exception
{
}<?php
namespace Ratchet\RFC6455\Messaging;

interface DataInterface extends \Stringable {




public function isCoalesced(): bool;





public function getPayloadLength(): int;





public function getPayload(): string;





public function getContents(): string;
}
<?php
namespace Ratchet\RFC6455\Messaging;

use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;

class MessageBuffer {
private CloseFrameChecker $closeFrameChecker;




private $exceptionFactory;

private ?MessageInterface $messageBuffer = null;

private ?FrameInterface $frameBuffer = null;




private $onMessage;




private $onControl;

private bool $checkForMask;




private $sender;

private string $leftovers = '';

private int $streamingMessageOpCode = -1;

private PermessageDeflateOptions $permessageDeflateOptions;

private bool $deflateEnabled;

private int $maxMessagePayloadSize;

private int $maxFramePayloadSize;

private bool $compressedMessage = false;




private $inflator = null;




private $deflator = null;

public function __construct(
CloseFrameChecker $frameChecker,
callable $onMessage,
?callable $onControl = null,
bool $expectMask = true,
?callable $exceptionFactory = null,
?int $maxMessagePayloadSize = null, 
?int $maxFramePayloadSize = null, 
?callable $sender = null,
?PermessageDeflateOptions $permessageDeflateOptions = null
) {
$this->closeFrameChecker = $frameChecker;
$this->checkForMask = $expectMask;

$this->exceptionFactory = $exceptionFactory ?: static fn (string $msg) => new \UnderflowException($msg);

$this->onMessage = $onMessage;
$this->onControl = $onControl ?: static function (): void {};

$this->sender = $sender;

$this->permessageDeflateOptions = $permessageDeflateOptions ?: PermessageDeflateOptions::createDisabled();

$this->deflateEnabled = $this->permessageDeflateOptions->isEnabled();

if ($this->deflateEnabled && !is_callable($this->sender)) {
throw new \InvalidArgumentException('sender must be set when deflate is enabled');
}

$memory_limit_bytes = static::getMemoryLimit();

if ($maxMessagePayloadSize === null) {
$maxMessagePayloadSize = (int)($memory_limit_bytes / 4);
}
if ($maxFramePayloadSize === null) {
$maxFramePayloadSize = (int)($memory_limit_bytes / 4);
}

if ($maxFramePayloadSize > 0x7FFFFFFFFFFFFFFF || $maxFramePayloadSize < 0) { 
throw new \InvalidArgumentException($maxFramePayloadSize . ' is not a valid maxFramePayloadSize');
}
$this->maxFramePayloadSize = $maxFramePayloadSize;

if ($maxMessagePayloadSize > 0x7FFFFFFFFFFFFFFF || $maxMessagePayloadSize < 0) {
throw new \InvalidArgumentException($maxMessagePayloadSize . 'is not a valid maxMessagePayloadSize');
}
$this->maxMessagePayloadSize = $maxMessagePayloadSize;
}

public function onData(string $data): void {
$data = $this->leftovers . $data;
$dataLen = strlen($data);

if ($dataLen < 2) {
$this->leftovers = $data;

return;
}

$frameStart = 0;
while ($frameStart + 2 <= $dataLen) {
$headerSize = 2;
$payload_length = unpack('C', $data[$frameStart + 1] & "\x7f")[1];
$isMasked = ($data[$frameStart + 1] & "\x80") === "\x80";
$headerSize += $isMasked ? 4 : 0;
$payloadLenOver2GB = false;
if ($payload_length > 125 && ($dataLen - $frameStart < $headerSize + 125)) {

break;
}
if ($payload_length > 125) {
$payloadLenBytes = $payload_length === 126 ? 2 : 8;
$headerSize += $payloadLenBytes;
$bytesToUpack = substr($data, $frameStart + 2, $payloadLenBytes);

if ($payload_length === 126){
$payload_length = unpack('n', $bytesToUpack)[1];
} else {
$payloadLenOver2GB = unpack('N', $bytesToUpack)[1] > 0; 
if (PHP_INT_SIZE == 4) { 
$bytesToUpack = substr($bytesToUpack, 4); 
$payload_length = unpack('N', $bytesToUpack)[1];
} else {
$payload_length = unpack('J', $bytesToUpack)[1];
}
}
}

$closeFrame = null;

if ($payload_length < 0) {

$closeFrame = $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Invalid frame length');
}

if (!$closeFrame && PHP_INT_SIZE == 4 && $payloadLenOver2GB) {
$closeFrame = $this->newCloseFrame(Frame::CLOSE_TOO_BIG, 'Frame over 2GB can\'t be handled on 32bits PHP');
}

if (!$closeFrame && $this->maxFramePayloadSize > 1 && $payload_length > $this->maxFramePayloadSize) {
$closeFrame = $this->newCloseFrame(Frame::CLOSE_TOO_BIG, 'Maximum frame size exceeded');
}

if (!$closeFrame && $this->maxMessagePayloadSize > 0
&& $payload_length + ($this->messageBuffer ? $this->messageBuffer->getPayloadLength() : 0) > $this->maxMessagePayloadSize) {
$closeFrame = $this->newCloseFrame(Frame::CLOSE_TOO_BIG, 'Maximum message size exceeded');
}

if ($closeFrame !== null) {
$onControl = $this->onControl;
$onControl($closeFrame);
$this->leftovers = '';

return;
}

$isCoalesced = $dataLen - $frameStart >= $payload_length + $headerSize;
if (!$isCoalesced) {
break;
}
$this->processData(substr($data, $frameStart, $payload_length + $headerSize));
$frameStart = $frameStart + $payload_length + $headerSize;
}

$this->leftovers = substr($data, $frameStart);
}





private function processData(string $data): void {
$this->messageBuffer ?: $this->messageBuffer = $this->newMessage();
$this->frameBuffer ?: $this->frameBuffer = $this->newFrame();

$this->frameBuffer->addBuffer($data);

$onMessage = $this->onMessage;
$onControl = $this->onControl;

$this->frameBuffer = $this->frameCheck($this->frameBuffer);

$this->frameBuffer->unMaskPayload();

$opcode = $this->frameBuffer->getOpcode();

if ($opcode > 2) {
$onControl($this->frameBuffer, $this);

if (Frame::OP_CLOSE === $opcode) {
return;
}
} else {
if ($this->messageBuffer->count() === 0 && $this->frameBuffer->getRsv1()) {
$this->compressedMessage = true;
}
if ($this->compressedMessage) {
$this->frameBuffer = $this->inflateFrame($this->frameBuffer);
}

$this->messageBuffer->addFrame($this->frameBuffer);
}

$this->frameBuffer = null;

if ($this->messageBuffer->isCoalesced()) {
$msgCheck = $this->checkMessage($this->messageBuffer);

$msgBuffer = $this->messageBuffer;
$this->messageBuffer = null;

if (true !== $msgCheck) {
$onControl($this->newCloseFrame($msgCheck, 'Ratchet detected an invalid UTF-8 payload'), $this);
} else {
$onMessage($msgBuffer, $this);
}

$this->messageBuffer = null;
$this->compressedMessage = false;

if ($this->permessageDeflateOptions->getServerNoContextTakeover()) {
$this->inflator = null;
}
}
}






public function frameCheck(FrameInterface $frame): FrameInterface {
if ((false !== $frame->getRsv1() && !$this->deflateEnabled) ||
false !== $frame->getRsv2() ||
false !== $frame->getRsv3()
) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected an invalid reserve code');
}

if ($this->checkForMask && !$frame->isMasked()) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected an incorrect frame mask');
}

$opcode = $frame->getOpcode();

if ($opcode > 2) {
if ($frame->getPayloadLength() > 125 || !$frame->isFinal()) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected a mismatch between final bit and indicated payload length');
}

switch ($opcode) {
case Frame::OP_CLOSE:
$closeCode = 0;

$bin = $frame->getPayload();

if (empty($bin)) {
return $this->newCloseFrame(Frame::CLOSE_NORMAL);
}

if (strlen($bin) === 1) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected an invalid close code');
}

if (strlen($bin) >= 2) {
list($closeCode) = array_merge(unpack('n*', substr($bin, 0, 2)));
}

$checker = $this->closeFrameChecker;
if (!$checker($closeCode)) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected an invalid close code');
}

if (!$this->checkUtf8(substr($bin, 2))) {
return $this->newCloseFrame(Frame::CLOSE_BAD_PAYLOAD, 'Ratchet detected an invalid UTF-8 payload in the close reason');
}

return $frame;
case Frame::OP_PING:
case Frame::OP_PONG:
break;
default:
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected an invalid OP code');
}

return $frame;
}

if (Frame::OP_CONTINUE === $frame->getOpcode() && 0 === count($this->messageBuffer)) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected the first frame of a message was a continue');
}

if (count($this->messageBuffer) > 0 && Frame::OP_CONTINUE !== $frame->getOpcode()) {
return $this->newCloseFrame(Frame::CLOSE_PROTOCOL, 'Ratchet detected invalid OP code when expecting continue frame');
}

return $frame;
}






public function checkMessage(MessageInterface $message) {
if (!$message->isBinary()) {
if (!$this->checkUtf8($message->getPayload())) {
return Frame::CLOSE_BAD_PAYLOAD;
}
}

return true;
}

private function checkUtf8(string $string): bool {
if (extension_loaded('mbstring')) {
return mb_check_encoding($string, 'UTF-8');
}

return preg_match('//u', $string);
}




public function newMessage(): MessageInterface {
return new Message;
}







public function newFrame(?string $payload = null, bool $final = true, int $opcode = Frame::OP_TEXT): FrameInterface {
return new Frame($payload, $final, $opcode, $this->exceptionFactory);
}

public function newCloseFrame(int $code, string $reason = ''): FrameInterface {
return $this->newFrame(pack('n', $code) . $reason, true, Frame::OP_CLOSE);
}

public function sendFrame(FrameInterface $frame): void {
if ($this->sender === null) {
throw new \Exception('To send frames using the MessageBuffer, sender must be set.');
}

if ($this->deflateEnabled &&
($frame->getOpcode() === Frame::OP_TEXT || $frame->getOpcode() === Frame::OP_BINARY)) {
$frame = $this->deflateFrame($frame);
}

if (!$this->checkForMask) {
$frame->maskPayload();
}

$sender = $this->sender;
$sender($frame->getContents());
}

public function sendMessage(string $messagePayload, bool $final = true, bool $isBinary = false): void {
$opCode = $isBinary ? Frame::OP_BINARY : Frame::OP_TEXT;
if ($this->streamingMessageOpCode === -1) {
$this->streamingMessageOpCode = $opCode;
}

if ($this->streamingMessageOpCode !== $opCode) {
throw new \Exception('Binary and text message parts cannot be streamed together.');
}

$frame = $this->newFrame($messagePayload, $final, $opCode);

$this->sendFrame($frame);

if ($final) {

if ($this->getDeflateNoContextTakeover()) {
$this->deflator = null;
}
$this->streamingMessageOpCode = -1;
}
}

private function getDeflateNoContextTakeover(): ?bool {
return $this->checkForMask ?
$this->permessageDeflateOptions->getServerNoContextTakeover() :
$this->permessageDeflateOptions->getClientNoContextTakeover();
}

private function getDeflateWindowBits(): int {
return $this->checkForMask ? $this->permessageDeflateOptions->getServerMaxWindowBits() : $this->permessageDeflateOptions->getClientMaxWindowBits();
}

private function getInflateNoContextTakeover(): ?bool {
return $this->checkForMask ?
$this->permessageDeflateOptions->getClientNoContextTakeover() :
$this->permessageDeflateOptions->getServerNoContextTakeover();
}

private function getInflateWindowBits(): int {
return $this->checkForMask ? $this->permessageDeflateOptions->getClientMaxWindowBits() : $this->permessageDeflateOptions->getServerMaxWindowBits();
}

private function inflateFrame(FrameInterface $frame): Frame {
if ($this->inflator === null) {
$this->inflator = inflate_init(
ZLIB_ENCODING_RAW,
[
'level' => -1,
'memory' => 8,
'window' => $this->getInflateWindowBits(),
'strategy' => ZLIB_DEFAULT_STRATEGY
]
);
}

$terminator = '';
if ($frame->isFinal()) {
$terminator = "\x00\x00\xff\xff";
}

gc_collect_cycles(); 

return new Frame(
inflate_add($this->inflator, $frame->getPayload() . $terminator),
$frame->isFinal(),
$frame->getOpcode()
);
}

private function deflateFrame(FrameInterface $frame): FrameInterface
{
if ($frame->getRsv1()) {
return $frame; 
}

if ($this->deflator === null) {
$bits = $this->getDeflateWindowBits();
if ($bits === 8) {
$bits = 9;
}
$this->deflator = deflate_init(
ZLIB_ENCODING_RAW,
[
'level' => -1,
'memory' => 8,
'window' => $bits,
'strategy' => ZLIB_DEFAULT_STRATEGY
]
);
}



















$payload = deflate_add(
$this->deflator,
$frame->getPayload(),
ZLIB_SYNC_FLUSH
);


$deflatedFrame = new Frame(
substr($payload, 0, $frame->isFinal() ? -4 : strlen($payload)),
$frame->isFinal(),
$frame->getOpcode()
);

if ($frame->isFinal()) {
$deflatedFrame->setRsv1();
}

return $deflatedFrame;
}








private static function getMemoryLimit(?string $memory_limit = null): int {
$memory_limit = $memory_limit === null ? \trim(\ini_get('memory_limit')) : $memory_limit;
$memory_limit_bytes = 0;
if ($memory_limit !== '') {
$shifty = ['k' => 0, 'm' => 10, 'g' => 20];
$multiplier = strlen($memory_limit) > 1 ? substr(strtolower($memory_limit), -1) : '';
$memory_limit = (int)$memory_limit;
$memory_limit_bytes = in_array($multiplier, array_keys($shifty), true) ? $memory_limit * 1024 << $shifty[$multiplier] : $memory_limit;
}

return $memory_limit_bytes < 0 ? 0 : $memory_limit_bytes;
}
}
<?php
namespace Ratchet\RFC6455\Messaging;

class Frame implements FrameInterface {
const OP_CONTINUE = 0;
const OP_TEXT = 1;
const OP_BINARY = 2;
const OP_CLOSE = 8;
const OP_PING = 9;
const OP_PONG = 10;

const CLOSE_NORMAL = 1000;
const CLOSE_GOING_AWAY = 1001;
const CLOSE_PROTOCOL = 1002;
const CLOSE_BAD_DATA = 1003;
const CLOSE_NO_STATUS = 1005;
const CLOSE_ABNORMAL = 1006;
const CLOSE_BAD_PAYLOAD = 1007;
const CLOSE_POLICY = 1008;
const CLOSE_TOO_BIG = 1009;
const CLOSE_MAND_EXT = 1010;
const CLOSE_SRV_ERR = 1011;
const CLOSE_TLS = 1015;

const MASK_LENGTH = 4;




protected string $data = '';




public int $bytesRecvd = 0;




protected int $defPayLen = -1;





private bool $isCoalesced = false;




protected int $firstByte = -1;




protected int $secondByte = -1;

/**
@returns

*/
private $ufeg;







public function __construct(?string $payload = null, bool $final = true, int $opcode = 1, ?callable $ufExceptionFactory = null) {
$this->ufeg = $ufExceptionFactory ?: static fn (string $msg = '') => new \UnderflowException($msg);

if (null === $payload) {
return;
}

$this->defPayLen = strlen($payload);
$this->firstByte = ($final ? 128 : 0) + $opcode;
$this->secondByte = $this->defPayLen;
$this->isCoalesced = true;

$ext = '';
if ($this->defPayLen > 65535) {
$ext = pack('NN', 0, $this->defPayLen);
$this->secondByte = 127;
} elseif ($this->defPayLen > 125) {
$ext = pack('n', $this->defPayLen);
$this->secondByte = 126;
}

$this->data = chr($this->firstByte) . chr($this->secondByte) . $ext . $payload;
$this->bytesRecvd = 2 + strlen($ext) + $this->defPayLen;
}




public function isCoalesced(): bool {
if (true === $this->isCoalesced) {
return true;
}

try {
$payload_length = $this->getPayloadLength();
$payload_start = $this->getPayloadStartingByte();
} catch (\UnderflowException $e) {
return false;
}

$this->isCoalesced = $this->bytesRecvd >= $payload_length + $payload_start;

return $this->isCoalesced;
}




public function addBuffer(string $buf): void {
$len = strlen($buf);

$this->data .= $buf;
$this->bytesRecvd += $len;

if ($this->firstByte === -1 && $this->bytesRecvd !== 0) {
$this->firstByte = ord($this->data[0]);
}

if ($this->secondByte === -1 && $this->bytesRecvd >= 2) {
$this->secondByte = ord($this->data[1]);
}
}




public function isFinal(): bool {
if (-1 === $this->firstByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received to determine if this is the final frame in message');
}

return 128 === ($this->firstByte & 128);
}

public function setRsv1(bool $value = true): self {
if (strlen($this->data) == 0) {
throw new \UnderflowException("Cannot set Rsv1 because there is no data.");
}

$this->firstByte =
($this->isFinal() ? 128 : 0)
+ $this->getOpcode()
+ ($value ? 64 : 0)
+ ($this->getRsv2() ? 32 : 0)
+ ($this->getRsv3() ? 16 : 0)
;

$this->data[0] = chr($this->firstByte);
return $this;
}





public function getRsv1(): bool {
if (-1 === $this->firstByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received to determine reserved bit');
}

return 64 === ($this->firstByte & 64);
}





public function getRsv2(): bool {
if (-1 === $this->firstByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received to determine reserved bit');
}

return 32 === ($this->firstByte & 32);
}





public function getRsv3(): bool {
if (-1 === $this->firstByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received to determine reserved bit');
}

return 16 === ($this->firstByte & 16);
}




public function isMasked(): bool {
if (-1 === $this->secondByte) {
throw call_user_func($this->ufeg, "Not enough bytes received ({$this->bytesRecvd}) to determine if mask is set");
}

return 128 === ($this->secondByte & 128);
}




public function getMaskingKey(): string {
if (!$this->isMasked()) {
return '';
}

$start = 1 + $this->getNumPayloadBytes();

if ($this->bytesRecvd < $start + static::MASK_LENGTH) {
throw call_user_func($this->ufeg, 'Not enough data buffered to calculate the masking key');
}

return substr($this->data, $start, static::MASK_LENGTH);
}





public function generateMaskingKey(): string {
$mask = '';

for ($i = 1; $i <= static::MASK_LENGTH; $i++) {
$mask .= chr(rand(32, 126));
}

return $mask;
}








public function maskPayload(?string $maskingKey = null): self {
if (null === $maskingKey) {
$maskingKey = $this->generateMaskingKey();
}

if (static::MASK_LENGTH !== strlen($maskingKey)) {
throw new \InvalidArgumentException("Masking key must be " . static::MASK_LENGTH ." characters");
}

if (extension_loaded('mbstring') && true !== mb_check_encoding($maskingKey, 'US-ASCII')) {
throw new \OutOfBoundsException("Masking key MUST be ASCII");
}

$this->unMaskPayload();

$this->secondByte = $this->secondByte | 128;
$this->data[1] = chr($this->secondByte);

$this->data = substr_replace($this->data, $maskingKey, $this->getNumPayloadBytes() + 1, 0);

$this->bytesRecvd += static::MASK_LENGTH;
$this->data = substr_replace($this->data, $this->applyMask($maskingKey), $this->getPayloadStartingByte(), $this->getPayloadLength());

return $this;
}






public function unMaskPayload(): self {
if (!$this->isCoalesced()) {
throw call_user_func($this->ufeg, 'Frame must be coalesced before applying mask');
}

if (!$this->isMasked()) {
return $this;
}

$maskingKey = $this->getMaskingKey();

$this->secondByte = $this->secondByte & ~128;
$this->data[1] = chr($this->secondByte);

$this->data = substr_replace($this->data, '', $this->getNumPayloadBytes() + 1, static::MASK_LENGTH);

$this->bytesRecvd -= static::MASK_LENGTH;
$this->data = substr_replace($this->data, $this->applyMask($maskingKey), $this->getPayloadStartingByte(), $this->getPayloadLength());

return $this;
}








public function applyMask(string $maskingKey, ?string $payload = null): string {
if (null === $payload) {
if (!$this->isCoalesced()) {
throw call_user_func($this->ufeg, 'Frame must be coalesced to apply a mask');
}

$payload = substr($this->data, $this->getPayloadStartingByte(), $this->getPayloadLength());
}

$len = strlen($payload);

if (0 === $len) {
return '';
}

return $payload ^ str_pad('', $len, $maskingKey, STR_PAD_RIGHT);
}




public function getOpcode(): int {
if (-1 === $this->firstByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received to determine opcode');
}

return ($this->firstByte & ~240);
}






protected function getFirstPayloadVal(): int {
if (-1 === $this->secondByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received');
}

return $this->secondByte & 127;
}





protected function getNumPayloadBits(): int {
if (-1 === $this->secondByte) {
throw call_user_func($this->ufeg, 'Not enough bytes received');
}



$bits = 7;


$check = $this->getFirstPayloadVal();


if ($check >= 126) {
$bits += 16;
}



if ($check === 127) {
$bits += 48;
}

return $bits;
}





protected function getNumPayloadBytes(): int {
return (1 + $this->getNumPayloadBits()) / 8;
}




public function getPayloadLength(): int {
if ($this->defPayLen !== -1) {
return $this->defPayLen;
}

$this->defPayLen = $this->getFirstPayloadVal();
if ($this->defPayLen <= 125) {
return $this->getPayloadLength();
}

$byte_length = $this->getNumPayloadBytes();
if ($this->bytesRecvd < 1 + $byte_length) {
$this->defPayLen = -1;
throw call_user_func($this->ufeg, 'Not enough data buffered to determine payload length');
}

$len = 0;
for ($i = 2; $i <= $byte_length; $i++) {
$len <<= 8;
$len += ord($this->data[$i]);
}

$this->defPayLen = $len;

return $this->getPayloadLength();
}




public function getPayloadStartingByte(): int {
return 1 + $this->getNumPayloadBytes() + ($this->isMasked() ? static::MASK_LENGTH : 0);
}





public function getPayload(): string {
if (!$this->isCoalesced()) {
throw call_user_func($this->ufeg, 'Can not return partial message');
}

return $this->__toString();
}





public function getContents(): string {
return substr($this->data, 0, $this->getPayloadStartingByte() + $this->getPayloadLength());
}

public function __toString(): string {
$payload = (string)substr($this->data, $this->getPayloadStartingByte(), $this->getPayloadLength());

if ($this->isMasked()) {
$payload = $this->applyMask($this->getMaskingKey(), $payload);
}

return $payload;
}






public function extractOverflow(): string {
if ($this->isCoalesced()) {
$endPoint = $this->getPayloadLength();
$endPoint += $this->getPayloadStartingByte();

if ($this->bytesRecvd > $endPoint) {
$overflow = substr($this->data, $endPoint);
$this->data = substr($this->data, 0, $endPoint);

return $overflow;
}
}

return '';
}
}
<?php
namespace Ratchet\RFC6455\Messaging;

class Message implements \IteratorAggregate, MessageInterface {
private \SplDoublyLinkedList $_frames;

private int $len;

public function __construct() {
$this->_frames = new \SplDoublyLinkedList;
$this->len = 0;
}

public function getIterator(): \Traversable {
return $this->_frames;
}




public function count(): int {
return count($this->_frames);
}




public function isCoalesced(): bool {
if (count($this->_frames) == 0) {
return false;
}

$last = $this->_frames->top();

return $last->isCoalesced() && $last->isFinal();
}




public function addFrame(FrameInterface $fragment): MessageInterface {
$this->len += $fragment->getPayloadLength();
$this->_frames->push($fragment);

return $this;
}




public function getOpcode(): int {
if (count($this->_frames) == 0) {
throw new \UnderflowException('No frames have been added to this message');
}

return $this->_frames->bottom()->getOpcode();
}




public function getPayloadLength(): int {
return $this->len;
}




public function getPayload(): string {
if (!$this->isCoalesced()) {
throw new \UnderflowException('Message has not been put back together yet');
}

return $this->__toString();
}




public function getContents(): string {
if (!$this->isCoalesced()) {
throw new \UnderflowException("Message has not been put back together yet");
}

$buffer = '';

foreach ($this->_frames as $frame) {
$buffer .= $frame->getContents();
}

return $buffer;
}

public function __toString(): string {
$buffer = '';

foreach ($this->_frames as $frame) {
$buffer .= $frame->getPayload();
}

return $buffer;
}




public function isBinary(): bool {
if ($this->_frames->isEmpty()) {
throw new \UnderflowException('Not enough data has been received to determine if message is binary');
}

return Frame::OP_BINARY === $this->_frames->bottom()->getOpcode();
}




public function getRsv1(): bool {
if ($this->_frames->isEmpty()) {
return false;

}

return $this->_frames->bottom()->getRsv1();
}
}
<?php
namespace Ratchet\RFC6455\Messaging;

class CloseFrameChecker {
private array $validCloseCodes = [
Frame::CLOSE_NORMAL,
Frame::CLOSE_GOING_AWAY,
Frame::CLOSE_PROTOCOL,
Frame::CLOSE_BAD_DATA,
Frame::CLOSE_BAD_PAYLOAD,
Frame::CLOSE_POLICY,
Frame::CLOSE_TOO_BIG,
Frame::CLOSE_MAND_EXT,
Frame::CLOSE_SRV_ERR,
];

public function __invoke(int $val): bool {
return ($val >= 3000 && $val <= 4999) || in_array($val, $this->validCloseCodes);
}
}
<?php
namespace Ratchet\RFC6455\Messaging;

interface FrameInterface extends DataInterface {




public function addBuffer(string $buf): void;





public function isFinal(): bool;





public function isMasked(): bool;




public function getOpcode(): int;










public function getMaskingKey(): string;
}
<?php
namespace Ratchet\RFC6455\Messaging;

interface MessageInterface extends DataInterface, \Traversable, \Countable {




public function addFrame(FrameInterface $fragment): self;




public function getOpcode(): int;




public function isBinary(): bool;
}
<?php

// autoload.php @generated by Composer

if (PHP_VERSION_ID < 50600) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, $err);
        } elseif (!headers_sent()) {
            echo $err;
        }
    }
    throw new RuntimeException($err);
}

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit8b629a15c689375da27d72358027e768::getLoader();
<?php

// This file has been auto-generated by the Symfony Cache Component.

return [[

'acsf-spec.json' => 0,
'acsf-spec.json.checksum' => 1,

], [

0 => [
    'openapi' => '3.0.0',
    'info' => [
        'title' => 'Acquia Site Factory REST API',
        'version' => '1.0.0',
        'description' => 'OpenAPI 3.0 specification for Acquia Site Factory REST API',
    ],
    'paths' => [
        '/api/v1/users/all/api-keys' => [
            'delete' => [
                'summary' => 'Regenerate ALL users API keys',
                'description' => 'Regenerate ALL users API keys.',
                'x-cli-name' => 'api:regenerate-all-keys',
                'operationId' => 'delete_ApiKey_resetKeys',
                'responses' => [
                    200 => [
                        'description' => 'ApiKey_resetKeys response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/ApiKey_resetKeysResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/users/{user_id}/api-keys' => [
            'delete' => [
                'summary' => 'Regenerate a user\'s API key',
                'description' => 'Regenerate a user\'s API key.',
                'x-cli-name' => 'api:regenerate-key',
                'operationId' => 'delete_ApiKey_resetUserKeys',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'user_id',
                        'description' => 'The user ID of the user.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'ApiKey_resetUserKeys response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/ApiKey_resetUserKeysResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/audit' => [
            'get' => [
                'summary' => 'List audit events',
                'description' => 'Gets a list of audit events.',
                'x-cli-name' => 'info:audit-events-find',
                'operationId' => 'get_AuditEvent_getAuditEvents',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'order',
                        'description' => 'Either "ASC" or "DESC".',
                        'schema' => [
                            'type' => 'string',
                            'pattern' => '^(ASC|DESC)$',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'source',
                        'description' => 'The source of the event.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'module',
                        'description' => 'The system name of the module.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'scope',
                        'description' => 'The general scope of the changes.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'type',
                        'description' => 'The specific type of changes.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'nid',
                        'description' => 'An associated node ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'uid',
                        'description' => 'The user who made the change.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'AuditEvent_getAuditEvents response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/AuditEvent_getAuditEventsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/backup-expiration' => [
            'put' => [
                'summary' => 'Configure the backup expiration and automatic deletion.',
                'description' => 'Configure the backup expiration and automatic deletion setting.',
                'x-cli-name' => 'sites:backup-set-expiration',
                'operationId' => 'put_BackupExpirationManagement_setBackupExpirationSettings',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'expiration_days' => [
                                        'description' => 'Number of days (between 1 and 365) after which backups get automatically deleted.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'expiration_days',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'BackupExpirationManagement_setBackupExpirationSettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/BackupExpirationManagement_setBackupExpirationSettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get the current backup expiration and automatic deletion setting.',
                'description' => 'Get the current backup expiration and automatic deletion setting.',
                'x-cli-name' => 'sites:backup-get-expiration',
                'operationId' => 'get_BackupExpirationManagement_getBackupExpirationSettings',
                'responses' => [
                    200 => [
                        'description' => 'BackupExpirationManagement_getBackupExpirationSettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/BackupExpirationManagement_getBackupExpirationSettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/centralized-role-management' => [
            'get' => [
                'summary' => 'Get current centralized role management settings.',
                'description' => 'Get current centralized role management settings.',
                'x-cli-name' => 'roles:get-mgr',
                'operationId' => 'get_CentralizedRoleManagement_executeGetActions',
                'responses' => [
                    200 => [
                        'description' => 'CentralizedRoleManagement_executeGetActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CentralizedRoleManagement_executeGetActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/centralized-role-management/{factory_role}' => [
            'put' => [
                'summary' => 'Set the centralized role management settings for a given role.',
                'description' => 'Set the centralized role management settings for a given role.',
                'x-cli-name' => 'roles:set-mgr',
                'operationId' => 'put_CentralizedRoleManagement_executePutActions',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'factory_role',
                        'description' => 'The site factory role. Currently the only supported ones are "content_editor", "platform_admin" and "site_builder".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_role' => [
                                        'description' => 'The corresponding role on the site.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'site_role',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CentralizedRoleManagement_executePutActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CentralizedRoleManagement_executePutActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Disable the centralized role management settings for a given role.',
                'description' => 'Disable the centralized role management settings for a given role.',
                'x-cli-name' => 'roles:disable-mgr',
                'operationId' => 'delete_CentralizedRoleManagement_executeDeleteActions',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'factory_role',
                        'description' => 'The site factory role. Currently the only supported ones are "content_editor", "platform_admin" and "site_builder".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CentralizedRoleManagement_executeDeleteActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CentralizedRoleManagement_executeDeleteActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/stacks' => [
            'get' => [
                'summary' => 'Get list of available stacks.',
                'description' => 'Fetches the list of available stacks.',
                'x-cli-name' => 'info:stacks-find',
                'operationId' => 'get_CodeBases_getCodeBaseNames',
                'responses' => [
                    200 => [
                        'description' => 'CodeBases_getCodeBaseNames response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CodeBases_getCodeBaseNamesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/stacks/{codebase_id}' => [
            'put' => [
                'summary' => 'Edit stack information.',
                'description' => 'Edit stack information.',
                'x-cli-name' => 'stacks:edit',
                'operationId' => 'put_CodeBases_editCodebaseName',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'codebase_id',
                        'description' => 'Id of stack whose details are to be changed.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'New stack name to be updated.',
                                        'type' => 'string',
                                    ],
                                    'description' => [
                                        'description' => 'Stack description to be updated.',
                                        'type' => 'string',
                                    ],
                                    'tangle_alias' => [
                                        'description' => 'New tangle alias name for tangle associated with that stack.',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CodeBases_editCodebaseName response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CodeBases_editCodebaseNameResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/stacks/details' => [
            'get' => [
                'summary' => 'Get details of available stacks.',
                'description' => 'Fetches the details of available stacks.',
                'x-cli-name' => 'stacks:find-details',
                'operationId' => 'get_CodeBases_getCodeBaseDetails',
                'responses' => [
                    200 => [
                        'description' => 'CodeBases_getCodeBaseDetails response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CodeBases_getCodeBaseDetailsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/cronjobs' => [
            'post' => [
                'summary' => 'Create a new cron job.',
                'description' => 'Create a new cron job.',
                'x-cli-name' => 'crons:create',
                'operationId' => 'post_CronJobs_createCronJob',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The cron job name.',
                                        'type' => 'string',
                                    ],
                                    'command' => [
                                        'description' => 'The command that should be executed.',
                                        'type' => 'string',
                                    ],
                                    'interval' => [
                                        'description' => 'A unix cron expression.',
                                        'type' => 'string',
                                    ],
                                    'sites_affected' => [
                                        'description' => 'Possible values: dev-sites - sites without custom domains, prod-sites - sites with custom domains, all',
                                        'type' => 'string',
                                    ],
                                    'enabled' => [
                                        'description' => 'If the cron should be enabled.',
                                        'type' => 'integer',
                                    ],
                                    'thread_percentage' => [
                                        'description' => 'The percentage of cron threads that should be used for this cron. Value has to be an integer between 0 and 100.',
                                        'type' => 'integer',
                                    ],
                                    'stacks' => [
                                        'description' => 'An array of stack ids for which the cron should be enabled.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'name',
                                    'command',
                                    'interval',
                                    'sites_affected',
                                    'enabled',
                                    'thread_percentage',
                                    'stacks',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CronJobs_createCronJob response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CronJobs_createCronJobResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get cron jobs. sites_affected: dev-sites(without custom domains)|prod-sites(with custom domains)|all',
                'description' => 'Get all cron jobs (paged).',
                'x-cli-name' => 'cron:find-jobs',
                'operationId' => 'get_CronJobs_getCronJobs',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 20).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 20,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CronJobs_getCronJobs response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CronJobs_getCronJobsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/cronjobs/{job_id}' => [
            'put' => [
                'summary' => 'Edit a cron job.',
                'description' => 'Edit a cron job.',
                'x-cli-name' => 'crons:edit',
                'operationId' => 'put_CronJobs_editCronJob',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'job_id',
                        'description' => 'Cron job id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The cron job name.',
                                        'type' => 'string',
                                    ],
                                    'command' => [
                                        'description' => 'The command that should be executed.',
                                        'type' => 'string',
                                    ],
                                    'interval' => [
                                        'description' => 'A unix cron expression.',
                                        'type' => 'string',
                                    ],
                                    'sites_affected' => [
                                        'description' => 'Possible values: dev-sites - sites without custom domains, prod-sites - sites with custom domains, all',
                                        'type' => 'string',
                                    ],
                                    'enabled' => [
                                        'description' => 'If the cron should be enabled.',
                                        'type' => 'integer',
                                    ],
                                    'thread_percentage' => [
                                        'description' => 'The percentage of cron threads that should be used for this cron. Value has to be an integer between 0 and 100.',
                                        'type' => 'integer',
                                    ],
                                    'stacks' => [
                                        'description' => 'An array of stack ids for which the cron should be enabled.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'name',
                                    'command',
                                    'interval',
                                    'sites_affected',
                                    'enabled',
                                    'thread_percentage',
                                    'stacks',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CronJobs_editCronJob response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CronJobs_editCronJobResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a cron job.',
                'description' => 'Delete a cron job.',
                'x-cli-name' => 'crons:delete',
                'operationId' => 'delete_CronJobs_deleteCronJob',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'job_id',
                        'description' => 'Cron job id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CronJobs_deleteCronJob response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CronJobs_deleteCronJobResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get cron job',
                'description' => 'Get cron job by its id.',
                'x-cli-name' => 'cron:get-job',
                'operationId' => 'get_CronJobs_getCronJob',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'job_id',
                        'description' => 'Cron job id',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'CronJobs_getCronJob response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/CronJobs_getCronJobResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/domains' => [
            'get' => [
                'summary' => 'Get all domains.',
                'description' => 'Get all domains known to Site Factory.'."\n"
                    ."\n"
                    .' Possible domain types:'."\n"
                    .'   simple|collectionLive|collectionInternal|factoryStandard.',
                'x-cli-name' => 'domains:get-all',
                'operationId' => 'get_Domains_getAllDomains',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 1000).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 1000,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Domains_getAllDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Domains_getAllDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/domains/{node_id}' => [
            'get' => [
                'summary' => 'Get domains',
                'description' => 'Get domains by node ID.',
                'x-cli-name' => 'domains:get',
                'operationId' => 'get_Domains_getDomains',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'node_id',
                        'description' => 'Site node id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Domains_getDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Domains_getDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/domains/status/{domain_name}' => [
            'get' => [
                'summary' => 'Get domain status',
                'description' => 'Get domain status.',
                'x-cli-name' => 'domains:get-status',
                'operationId' => 'get_Domains_getDomainStatus',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'domain_name',
                        'description' => 'The domain name.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Domains_getDomainStatus response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Domains_getDomainStatusResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/domains/{node_id}/add' => [
            'post' => [
                'summary' => 'Add domain',
                'description' => 'Adds a domain.',
                'x-cli-name' => 'domains:add',
                'operationId' => 'post_Domains_addDomain',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'node_id',
                        'description' => 'Site node id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'domain_name' => [
                                        'description' => 'The domain name to add.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'domain_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Domains_addDomain response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Domains_addDomainResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/domains/{node_id}/remove' => [
            'post' => [
                'summary' => 'Remove domain',
                'description' => 'Removes a domain.',
                'x-cli-name' => 'domains:remove',
                'operationId' => 'post_Domains_removeDomain',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'node_id',
                        'description' => 'Site node id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'domain_name' => [
                                        'description' => 'The domain name to remove.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'domain_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Domains_removeDomain response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Domains_removeDomainResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/factory-standard-domains' => [
            'post' => [
                'summary' => 'Backfill the current factory standard domain templates.',
                'description' => 'Backfill the current factory standard domain templates.',
                'x-cli-name' => 'domains:backfill-std',
                'operationId' => 'post_FactoryStandardDomains_backfillFactoryStandardDomains',
                'responses' => [
                    200 => [
                        'description' => 'FactoryStandardDomains_backfillFactoryStandardDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/FactoryStandardDomains_backfillFactoryStandardDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get the current factory standard domain templates.',
                'description' => 'Get the current factory standard domain templates.',
                'x-cli-name' => 'domains:get-std-templates',
                'operationId' => 'get_FactoryStandardDomains_getFactoryStandardDomains',
                'responses' => [
                    200 => [
                        'description' => 'FactoryStandardDomains_getFactoryStandardDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/FactoryStandardDomains_getFactoryStandardDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/factory-standard-domains/{template_name}' => [
            'put' => [
                'summary' => 'Set the factory standard domain template.',
                'description' => 'Set the factory standard domain template.',
                'x-cli-name' => 'domains:set-std-templates',
                'operationId' => 'put_FactoryStandardDomains_setFactoryStandardDomains',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'template_name',
                        'description' => 'The template name to change. Currently the only supported ones are "site_prod", "site_nonprod", "collection_prod" and "collection_nonprod".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'new_template' => [
                                        'description' => 'The new template.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'new_template',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'FactoryStandardDomains_setFactoryStandardDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/FactoryStandardDomains_setFactoryStandardDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Remove the factory standard domain template.',
                'description' => 'Remove the factory standard domain template.',
                'x-cli-name' => 'domains:remove-std-templates',
                'operationId' => 'delete_FactoryStandardDomains_removeFactoryStandardDomains',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'template_name',
                        'description' => 'The template name to remove. Currently the only supported ones are "site_prod", "site_nonprod", "collection_prod" and "collection_nonprod".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'FactoryStandardDomains_removeFactoryStandardDomains response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/FactoryStandardDomains_removeFactoryStandardDomainsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups/{group_id}/members' => [
            'get' => [
                'summary' => 'List group members',
                'description' => 'Get the members of a group.',
                'x-cli-name' => 'groups:find-members',
                'operationId' => 'get_Groups_getMembers',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 1000).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 1000,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_getMembers response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_getMembersResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Add members to a group',
                'description' => 'Add members to a group.',
                'x-cli-name' => 'groups:add-members',
                'operationId' => 'post_Groups_addMembers',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'uids' => [
                                        'description' => 'A single user ID, or an array of user IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'uids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_addMembers response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_addMembersResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Remove members from a group',
                'description' => 'Remove members from a group.',
                'x-cli-name' => 'groups:remove-members',
                'operationId' => 'delete_Groups_removeMembers',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'uids' => [
                                        'description' => 'A single user ID, or an array of user IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'uids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_removeMembers response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_removeMembersResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups/{group_id}' => [
            'get' => [
                'summary' => 'Get a group',
                'description' => 'Get a group by group ID.',
                'x-cli-name' => 'groups:get',
                'operationId' => 'get_Groups_getGroupById',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_getGroupById response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_getGroupByIdResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a group',
                'description' => 'Delete a site group.',
                'x-cli-name' => 'groups:delete',
                'operationId' => 'delete_Groups_deleteGroup',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_deleteGroup response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_deleteGroupResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups' => [
            'get' => [
                'summary' => 'List groups',
                'description' => 'Get a list of groups.',
                'x-cli-name' => 'groups:find',
                'operationId' => 'get_Groups_getGroups',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer not higher than 100.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_getGroups response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_getGroupsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Create a group',
                'description' => 'Create a site group.',
                'x-cli-name' => 'groups:create',
                'operationId' => 'post_Groups_createGroup',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'group_name' => [
                                        'description' => 'The name of the site group to create.',
                                        'type' => 'string',
                                    ],
                                    'parent_id' => [
                                        'description' => 'The parent group ID, if applicable.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'group_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_createGroup response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_createGroupResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups/{group_id}/update' => [
            'put' => [
                'summary' => 'Edit a group',
                'description' => 'Edit a group.',
                'x-cli-name' => 'groups:edit',
                'operationId' => 'put_Groups_editGroup',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'group_name' => [
                                        'description' => 'New name for the group.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'group_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_editGroup response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_editGroupResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups/{group_id}/admins' => [
            'post' => [
                'summary' => 'Make members group admin',
                'description' => 'Make members group admin.',
                'x-cli-name' => 'groups:make-members-admins',
                'operationId' => 'post_Groups_addAdmins',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'uids' => [
                                        'description' => 'A single user ID, or an array of user IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'uids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_addAdmins response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_addAdminsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Remove group admin from members',
                'description' => 'Remove group admin from members.',
                'x-cli-name' => 'groups:remove-admins',
                'operationId' => 'delete_Groups_removeAdmins',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'uids' => [
                                        'description' => 'A single user ID, or an array of user IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'uids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_removeAdmins response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_removeAdminsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/groups/{group_id}/sites' => [
            'post' => [
                'summary' => 'Add site(s) to a site group.',
                'description' => 'Add site(s) to a site group.',
                'x-cli-name' => 'groups:add-sites',
                'operationId' => 'post_Groups_addSites',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_ids' => [
                                        'description' => 'Either a single site ID, or an array of site IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'site_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_addSites response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_addSitesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Remove site(s) from a site group.',
                'description' => 'Remove site(s) from a site group.',
                'x-cli-name' => 'groups:remove-sites',
                'operationId' => 'delete_Groups_removeSites',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_ids' => [
                                        'description' => 'Either a single site ID, or an array of site IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'site_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_removeSites response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_removeSitesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'List sites in a group.',
                'description' => 'Get the sites of a group.',
                'x-cli-name' => 'groups:find-sites',
                'operationId' => 'get_Groups_getSites',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'group_id',
                        'description' => 'Group id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 1000).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 1000,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Groups_getSites response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Groups_getSitesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/profiles' => [
            'get' => [
                'summary' => 'List installation profiles.',
                'description' => 'List installation profiles.',
                'x-cli-name' => 'install-profiles:find',
                'operationId' => 'get_InstallationProfiles_getInstallationProfiles',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'Get only the profiles on the given stack.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'is_enabled',
                        'description' => 'Get only the enabled/disabled profiles.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'InstallationProfiles_getInstallationProfiles response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/InstallationProfiles_getInstallationProfilesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/profiles/{profile_name}/enable' => [
            'post' => [
                'summary' => 'Enable installation profile.',
                'description' => 'Enable installation profile.',
                'x-cli-name' => 'install-profiles:enable',
                'operationId' => 'post_InstallationProfiles_enableProfile',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'profile_name',
                        'description' => 'The installation profile name.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The installation profile\'s stack.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'InstallationProfiles_enableProfile response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/InstallationProfiles_enableProfileResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/profiles/{profile_name}/disable' => [
            'post' => [
                'summary' => 'Disable installation profile.',
                'description' => 'Disable installation profile.',
                'x-cli-name' => 'install-profiles:disable',
                'operationId' => 'post_InstallationProfiles_disableProfile',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'profile_name',
                        'description' => 'The installation profile name.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The installation profile\'s stack.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'InstallationProfiles_disableProfile response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/InstallationProfiles_disableProfileResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/profiles/{profile_name}/set_default' => [
            'post' => [
                'summary' => 'Sets the installation profile as default.',
                'description' => 'Sets the installation profile as default.',
                'x-cli-name' => 'install-profiles:set-default',
                'operationId' => 'post_InstallationProfiles_setDefault',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'profile_name',
                        'description' => 'The installation profile name.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The installation profile\'s stack.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'InstallationProfiles_setDefault response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/InstallationProfiles_setDefaultResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/dynamic-requests/monthly' => [
            'get' => [
                'summary' => 'List monthly aggregated dynamic request statistics.',
                'description' => 'Gets the monthly aggregated dynamic request statistics.',
                'x-cli-name' => 'page-views:aggregated',
                'operationId' => 'get_PageView_getPageViewDataMonthly',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The stack id for which to fetch the dynamic request statistics. If there is only one stack, this parameter can be omitted.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'start_from',
                        'description' => 'The first date from which to start showing the statistics in the format of YYYY-MM.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'sort_order',
                        'description' => 'The sort order direction. Either asc or desc.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'The number of months to be listed. Maximum value is 120.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 120,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'The page number to show in the list.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'PageView_getPageViewDataMonthly response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/dynamic-requests/monthly/domains' => [
            'get' => [
                'summary' => 'List monthly dynamic request statistics by domain.',
                'description' => 'Gets the monthly dynamic request statistics by domain.',
                'x-cli-name' => 'page-views:by-domain',
                'operationId' => 'get_PageView_getPageViewDataMonthlyPerDomain',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The stack id for which to fetch the dynamic request statistics. If there is only one stack, this parameter can be omitted.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'date',
                        'description' => 'The month in the format of YYYY-MM.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'domain_name',
                        'description' => 'Full domain name or a prefix for filtering the results.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'sort_order',
                        'description' => 'The sort order direction. Either asc or desc.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'The number of domains to be listed. (max 100)',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'The page number to show in the list.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'PageView_getPageViewDataMonthlyPerDomain response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyPerDomainResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/pause' => [
            'post' => [
                'summary' => 'Pause/resume task processing',
                'description' => 'Pause or resume task processing.',
                'x-cli-name' => 'tasks:pause-all',
                'operationId' => 'post_Pause_pause',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'paused' => [
                                        'description' => 'Pauses/resumes the WIP task processing.',
                                        'type' => 'boolean',
                                    ],
                                    'reason' => [
                                        'description' => 'Brief explanation for pausing workers.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'paused',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Pause_pause response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Pause_pauseResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/pause/{task_id}' => [
            'post' => [
                'summary' => 'Pause/resume task processing for a specific task',
                'description' => 'Pause or resume task processing.',
                'x-cli-name' => 'tasks:pause',
                'operationId' => 'post_Pause_pauseTask',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'task_id',
                        'description' => 'TaskID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'paused' => [
                                        'description' => 'Leave the task in paused or unpaused state.',
                                        'type' => 'boolean',
                                    ],
                                    'level' => [
                                        'description' => 'Pause/unpause just the specified task or all its children (task|family).',
                                        'type' => 'string',
                                        'pattern' => '^(task|family)$',
                                    ],
                                ],
                                'required' => [
                                    'paused',
                                    'level',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Pause_pauseTask response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Pause_pauseTaskResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/ping' => [
            'get' => [
                'summary' => 'Check service response',
                'description' => 'Checks whether the API is responding.',
                'x-cli-name' => 'api:ping',
                'operationId' => 'get_Ping_ping',
                'responses' => [
                    200 => [
                        'description' => 'Ping_ping response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Ping_pingResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/roles' => [
            'get' => [
                'summary' => 'List roles',
                'description' => 'Gets a list of roles.',
                'x-cli-name' => 'roles:find',
                'operationId' => 'get_Role_getRoles',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'order',
                        'description' => 'Either "ASC" or "DESC".',
                        'schema' => [
                            'type' => 'string',
                            'pattern' => '^(ASC|DESC)$',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Role_getRoles response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Role_getRolesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Create a role',
                'description' => 'Create a role.',
                'x-cli-name' => 'roles:create',
                'operationId' => 'post_Role_createRole',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The name of the role.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Role_createRole response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Role_createRoleResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/roles/{role_id}' => [
            'get' => [
                'summary' => 'Retrieve a role',
                'description' => 'Retrieve a role by role ID.',
                'x-cli-name' => 'roles:get',
                'operationId' => 'get_Role_getRole',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'role_id',
                        'description' => 'The role ID of the user role.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Role_getRole response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Role_getRoleResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a role',
                'description' => 'Delete a role.',
                'x-cli-name' => 'roles:delete',
                'operationId' => 'delete_Role_deleteRole',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'role_id',
                        'description' => 'The role ID of the user role.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Role_deleteRole response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Role_deleteRoleResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/roles/{role_id}/update' => [
            'put' => [
                'summary' => 'Update (rename) a role',
                'description' => 'Update (rename) a role.',
                'x-cli-name' => 'roles:update',
                'operationId' => 'put_Role_updateRole',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'role_id',
                        'description' => 'The role ID of the user role.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'new_name' => [
                                        'description' => 'The new name for the user role.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'new_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Role_updateRole response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Role_updateRoleResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/security' => [
            'get' => [
                'summary' => 'Get current security settings.',
                'description' => 'Get current security settings.',
                'x-cli-name' => 'security:get-security-settings',
                'operationId' => 'get_Security_getSecuritySettings',
                'responses' => [
                    200 => [
                        'description' => 'Security_getSecuritySettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Security_getSecuritySettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Set the security settings.',
                'description' => 'Set the security settings.',
                'x-cli-name' => 'security:set-security-settings',
                'operationId' => 'put_Security_updateSecuritySettings',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'minimum_password_length' => [
                                        'description' => 'Sets the minimum password length required for customers.',
                                        'type' => 'integer',
                                        'minimum' => 0,
                                        'maximum' => 29,
                                    ],
                                    'minimum_required_password_strength' => [
                                        'description' => 'Sets the password strength required for customers.',
                                        'type' => 'string',
                                        'pattern' => '^(disabled|weak|good|strong|very strong)$',
                                    ],
                                    'two_step_verification' => [
                                        'description' => 'Sets if tfa required for customers.',
                                        'type' => 'boolean',
                                    ],
                                    'sign_out_inactive_user_accounts' => [
                                        'description' => 'Automatically sign out inactive account.',
                                        'type' => 'boolean',
                                    ],
                                    'sign_out_inactivity_time' => [
                                        'description' => 'Automatically sign out of the account after seconds, required when sign_out_inactive_user_accounts is set.',
                                        'type' => 'integer',
                                        'minimum' => 60,
                                    ],
                                    'automatically_disable_accounts' => [
                                        'description' => 'Automatically disable inactive account.',
                                        'type' => 'boolean',
                                    ],
                                    'automatically_disable_accounts_after_days' => [
                                        'description' => 'Number of days after which an account will be disabled, required when automatically_disable_accounts is set.',
                                        'type' => 'integer',
                                        'minimum' => 1,
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Security_updateSecuritySettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Security_updateSecuritySettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete the security settings.',
                'description' => 'Delete the security settings.',
                'x-cli-name' => 'security:reset-security-settings',
                'operationId' => 'delete_Security_resetSecuritySettings',
                'responses' => [
                    200 => [
                        'description' => 'Security_resetSecuritySettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Security_resetSecuritySettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sf-info' => [
            'get' => [
                'summary' => 'Get the version of the Site Factory',
                'description' => 'Gets the (release) version the Site Factory is on.',
                'x-cli-name' => 'api:factory-version',
                'operationId' => 'get_SfInfo_getSfVersion',
                'responses' => [
                    200 => [
                        'description' => 'SfInfo_getSfVersion response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SfInfo_getSfVersionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/collections' => [
            'get' => [
                'summary' => 'List site collections',
                'description' => 'Gets a list of site collections.',
                'operationId' => 'get_SiteCollections_getCollections',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'remove_empty',
                        'description' => 'True to only return collections containing active sites.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_getCollections response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_getCollectionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Create a site collection',
                'description' => 'Create a new site collection.',
                'operationId' => 'post_SiteCollections_createCollection',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The name of the new site collection.',
                                        'type' => 'string',
                                    ],
                                    'site_ids' => [
                                        'description' => 'Either a single site ID, or an array of site IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'group_ids' => [
                                        'description' => 'Either a single group ID, or an array of group IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'internal_domain_prefix' => [
                                        'description' => 'The site collection\'s internal domain prefix. Uses the "name" parameter\'s value if not set.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'name',
                                    'site_ids',
                                    'group_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_createCollection response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_createCollectionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/collections/{collection_id}' => [
            'get' => [
                'summary' => 'Site collection details',
                'description' => 'Get detailed information about a site collection.',
                'operationId' => 'get_SiteCollections_getCollection',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'collection_id',
                        'description' => 'Collection ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_getCollection response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_getCollectionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a site collection',
                'description' => 'Delete a site collection.',
                'operationId' => 'delete_SiteCollections_deleteCollection',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'collection_id',
                        'description' => 'Collection ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_deleteCollection response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_deleteCollectionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/collections/{collection_id}/add' => [
            'post' => [
                'summary' => 'Add site(s) to a site collection.',
                'description' => 'Add site(s) to a site collection.',
                'operationId' => 'post_SiteCollections_addSiteToCollection',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'collection_id',
                        'description' => 'Collection ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_ids' => [
                                        'description' => 'A site ID or an array of site IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'site_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_addSiteToCollection response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_addSiteToCollectionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/collections/{collection_id}/remove' => [
            'post' => [
                'summary' => 'Remove site(s) from a site collection.',
                'description' => 'Remove site(s) from a site collection.',
                'operationId' => 'post_SiteCollections_removeSiteFromCollection',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'collection_id',
                        'description' => 'Collection ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_ids' => [
                                        'description' => 'A site ID, or an array of site IDs.',
                                        'oneOf' => [
                                            [
                                                'type' => 'integer',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'integer',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'site_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_removeSiteFromCollection response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_removeSiteFromCollectionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/collections/{collection_id}/set-primary' => [
            'post' => [
                'summary' => 'Set the primary site of a site collection.',
                'description' => 'Set the primary site of a site collection.',
                'operationId' => 'post_SiteCollections_setPrimarySite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'collection_id',
                        'description' => 'Collection ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_id' => [
                                        'description' => 'A single site ID.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'site_id',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteCollections_setPrimarySite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteCollections_setPrimarySiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-guard' => [
            'get' => [
                'summary' => 'Get current site guard config.',
                'description' => 'Get current site guard config.',
                'operationId' => 'get_SiteGuardConfig_getSiteGuardConfig',
                'responses' => [
                    200 => [
                        'description' => 'SiteGuardConfig_getSiteGuardConfig response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteGuardConfig_getSiteGuardConfigResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Enable and set the site guard settings.',
                'description' => 'Enable the site guard config.',
                'operationId' => 'put_SiteGuardConfig_setSiteGuardConfig',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'message' => [
                                        'description' => 'The message which the site guard should output.',
                                        'type' => 'string',
                                    ],
                                    'username' => [
                                        'description' => 'The username for the site guard.',
                                        'type' => 'string',
                                    ],
                                    'password' => [
                                        'description' => 'The password for the site guard.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'message',
                                    'username',
                                    'password',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteGuardConfig_setSiteGuardConfig response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteGuardConfig_setSiteGuardConfigResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Disable the site guard config.',
                'description' => 'Disable the site guard config.',
                'operationId' => 'delete_SiteGuardConfig_removeSiteGuardConfig',
                'responses' => [
                    200 => [
                        'description' => 'SiteGuardConfig_removeSiteGuardConfig response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteGuardConfig_removeSiteGuardConfigResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-ownership' => [
            'get' => [
                'summary' => 'Get current site ownership settings.',
                'description' => 'Get current site ownership settings.',
                'x-cli-name' => 'site-owner:get',
                'operationId' => 'get_SiteOwnership_executeGetActions',
                'responses' => [
                    200 => [
                        'description' => 'SiteOwnership_executeGetActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteOwnership_executeGetActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Set the site ownership settings.',
                'description' => 'Set the site ownership settings.',
                'x-cli-name' => 'site-owner:set',
                'operationId' => 'put_SiteOwnership_executePutActions',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'username' => [
                                        'description' => 'The default owner username. The user has to have the "Platform admin" role.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'username',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteOwnership_executePutActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteOwnership_executePutActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete the site ownership settings.',
                'description' => 'Delete the site ownership settings.',
                'x-cli-name' => 'site-owner:delete',
                'operationId' => 'delete_SiteOwnership_executeDeleteActions',
                'responses' => [
                    200 => [
                        'description' => 'SiteOwnership_executeDeleteActions response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteOwnership_executeDeleteActionsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-update-priority' => [
            'get' => [
                'summary' => 'Get current site update priority.',
                'description' => 'Get current site update priority.',
                'operationId' => 'get_SiteUpdatePriority_getSiteUpdatePriority',
                'responses' => [
                    200 => [
                        'description' => 'SiteUpdatePriority_getSiteUpdatePriority response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteUpdatePriority_getSiteUpdatePriorityResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Set the site update priority.',
                'description' => 'Set the site update priority.',
                'operationId' => 'put_SiteUpdatePriority_setSiteUpdatePriority',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'priority' => [
                                        'description' => 'An array of site node ids in the desired update order.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'priority',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteUpdatePriority_setSiteUpdatePriority response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteUpdatePriority_setSiteUpdatePriorityResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Reset the site update priority.',
                'description' => 'Reset the site update priority.',
                'operationId' => 'delete_SiteUpdatePriority_resetSiteUpdatePriority',
                'responses' => [
                    200 => [
                        'description' => 'SiteUpdatePriority_resetSiteUpdatePriority response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteUpdatePriority_resetSiteUpdatePriorityResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-variables' => [
            'post' => [
                'summary' => 'Trigger the site variables set up on the sites.',
                'description' => 'Trigger the site variables set up on the sites.',
                'x-cli-name' => 'sites:distribute-site-variables',
                'operationId' => 'post_SiteVariables_triggerSiteVariablesDistribution',
                'responses' => [
                    200 => [
                        'description' => 'SiteVariables_triggerSiteVariablesDistribution response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteVariables_triggerSiteVariablesDistributionResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-variables/{site_id}' => [
            'get' => [
                'summary' => 'Get the site variables for a given site.',
                'description' => 'Get the site variables for a given site.',
                'x-cli-name' => 'sites:get-site-variables',
                'operationId' => 'get_SiteVariables_getSiteVariables',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteVariables_getSiteVariables response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteVariables_getSiteVariablesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Change a site variable for a given site.',
                'description' => 'Change a site variable for a given site.',
                'x-cli-name' => 'sites:set-site-variable',
                'operationId' => 'put_SiteVariables_changeSiteVariables',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'variable_key' => [
                                        'description' => 'The variable key.',
                                        'type' => 'string',
                                    ],
                                    'variable_value' => [
                                        'description' => 'The variable value.',
                                        'type' => 'string',
                                    ],
                                    'variable_scrub' => [
                                        'description' => 'If the variable should be removed during staging.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'variable_key',
                                    'variable_value',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteVariables_changeSiteVariables response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteVariables_changeSiteVariablesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Clear all site variables for a given site.',
                'description' => 'Clear all site variables for a given site.',
                'x-cli-name' => 'sites:clear-site-variables',
                'operationId' => 'delete_SiteVariables_removeSiteVariables',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteVariables_removeSiteVariables response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteVariables_removeSiteVariablesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-variables/{site_id}/{variable_key}' => [
            'delete' => [
                'summary' => 'Remove a site variable for a given site.',
                'description' => 'Remove a site variable for a given site.',
                'x-cli-name' => 'sites:remove-site-variable',
                'operationId' => 'delete_SiteVariables_removeSiteVariable',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'path',
                        'name' => 'variable_key',
                        'description' => 'The variable key.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'SiteVariables_removeSiteVariable response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/SiteVariables_removeSiteVariableResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites' => [
            'get' => [
                'summary' => 'List sites',
                'description' => 'Gets a list of sites.',
                'x-cli-name' => 'sites:find',
                'operationId' => 'get_Sites_getSites',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 1000).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 1000,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'canary',
                        'description' => 'No value necessary.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'show_incomplete',
                        'description' => 'Show sites that are incomplete.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'Show sites on a specific stack.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'domain_contains',
                        'description' => 'Show sites whose domain contains this value.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'domain_not_contains',
                        'description' => 'Show sites whose domain does not contain this value.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'has_custom_domain',
                        'description' => 'Whether to only show sites with custom domains.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'site_owner',
                        'description' => 'Either a user id or a comma separated list of user ids.',
                        'schema' => [
                            'type' => 'array',
                            'items' => [
                                'type' => 'integer',
                            ],
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'show_custom_domain',
                        'description' => 'Return the first custom domain if the site has one instead of the internal one.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_getSites response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_getSitesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Create a site',
                'description' => 'Create a new site.',
                'x-cli-name' => 'sites:create',
                'operationId' => 'post_Sites_createSite',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_name' => [
                                        'description' => 'The new site name.',
                                        'type' => 'string',
                                    ],
                                    'group_ids' => [
                                        'description' => 'Either a single group ID, or an array of group IDs.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                    'install_profile' => [
                                        'description' => 'The install profile to be used to install the site.',
                                        'type' => 'string',
                                    ],
                                    'stack_id' => [
                                        'description' => 'The stack id where the site should go.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'site_name',
                                    'group_ids',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_createSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_createSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}' => [
            'get' => [
                'summary' => 'Site details',
                'description' => 'Get detailed information about a site.',
                'x-cli-name' => 'sites:get',
                'operationId' => 'get_Sites_getSite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_getSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_getSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Site delete',
                'description' => 'Delete a site.',
                'x-cli-name' => 'sites:delete',
                'operationId' => 'delete_Sites_deleteSite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_deleteSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_deleteSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/duplicate' => [
            'post' => [
                'summary' => 'Duplicate a site',
                'description' => 'Duplicate a site.',
                'x-cli-name' => 'sites:duplicate',
                'operationId' => 'post_Sites_duplicateSite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_name' => [
                                        'description' => 'The new site name.',
                                        'type' => 'string',
                                    ],
                                    'group_ids' => [
                                        'description' => 'Either a single group ID, or an array of group IDs.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                    'exact_copy' => [
                                        'description' => 'A boolean indicating whether or not to create an exact copy.',
                                        'type' => 'boolean',
                                    ],
                                ],
                                'required' => [
                                    'site_name',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_duplicateSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_duplicateSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/backup' => [
            'post' => [
                'summary' => 'Create a site backup',
                'description' => 'Create a site backup.',
                'x-cli-name' => 'sites:backup',
                'operationId' => 'post_Sites_backupSite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'description' => 'The human-readable description of this backup.',
                                        'type' => 'string',
                                    ],
                                    'callback_url' => [
                                        'description' => 'The callback URL, which is invoked upon completion.',
                                        'type' => 'string',
                                    ],
                                    'callback_method' => [
                                        'description' => 'The callback method, "GET", or "POST". Uses "POST" if empty.',
                                        'type' => 'string',
                                    ],
                                    'caller_data' => [
                                        'description' => 'Data that should be included in the callback, json encoded.',
                                        'type' => 'string',
                                    ],
                                    'components' => [
                                        'description' => 'Array of components to be included in the backup. The following component names are accepted: codebase, database, public files, private files, themes. When omitting this parameter it will default to a backup with every component.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_backupSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_backupSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/backups' => [
            'get' => [
                'summary' => 'List site backups',
                'description' => 'List site backups.'."\n"
                    ."\n"
                    .' Note that the results are sorted from newest backup to oldest.',
                'x-cli-name' => 'sites:find-backups',
                'operationId' => 'get_Sites_getSiteBackups',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_getSiteBackups response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_getSiteBackupsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/backups/{backup_id}/url' => [
            'get' => [
                'summary' => 'Get a temporary site backup URL',
                'description' => 'Get temporary site backup URL.',
                'x-cli-name' => 'sites:backup-url',
                'operationId' => 'get_Sites_getSiteBackupUrl',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'path',
                        'name' => 'backup_id',
                        'description' => 'Backup ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'lifetime',
                        'description' => 'The number of seconds the temporary URL is good for.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_getSiteBackupUrl response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_getSiteBackupUrlResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/backups/{backup_id}' => [
            'delete' => [
                'summary' => 'Delete a site backup',
                'description' => 'Delete a site backup.',
                'x-cli-name' => 'sites:delete-backup',
                'operationId' => 'delete_Sites_deleteSiteBackup',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'path',
                        'name' => 'backup_id',
                        'description' => 'Backup ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'callback_url' => [
                                        'description' => 'The callback URL, which is invoked upon completion.',
                                        'type' => 'string',
                                    ],
                                    'callback_method' => [
                                        'description' => 'The callback method, "GET", or "POST". Uses "POST" if empty.',
                                        'type' => 'string',
                                    ],
                                    'caller_data' => [
                                        'description' => 'Data that should be included in the callback, json encoded.',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_deleteSiteBackup response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_deleteSiteBackupResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/restore' => [
            'post' => [
                'summary' => 'Restore a site backup',
                'description' => 'Restore a site backup.',
                'x-cli-name' => 'sites:restore-backup',
                'operationId' => 'post_Sites_restoreSite',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'target_site_id' => [
                                        'description' => 'ID of the site to restore the backup onto.',
                                        'type' => 'integer',
                                    ],
                                    'backup_id' => [
                                        'description' => 'ID of the backup to restore defaults to the most recent.',
                                        'type' => 'integer',
                                    ],
                                    'callback_url' => [
                                        'description' => 'The callback URL, which is invoked upon completion.',
                                        'type' => 'string',
                                    ],
                                    'callback_method' => [
                                        'description' => 'The callback method, "GET", or "POST". Uses "POST" if empty.',
                                        'type' => 'string',
                                    ],
                                    'caller_data' => [
                                        'description' => 'Data that should be included in the callback, json encoded.',
                                        'type' => 'string',
                                    ],
                                    'components' => [
                                        'description' => 'Array of components to be restored from the backup. The following component names are accepted: database, public files, private files, themes. When omitting this parameter it will default to the backup\'s every component.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_restoreSite response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_restoreSiteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/cache-clear' => [
            'post' => [
                'summary' => 'Clear a site\'s caches',
                'description' => 'Clear Drupal and Varnish caches for a site.',
                'x-cli-name' => 'sites:clear-cache',
                'operationId' => 'post_Sites_clearCaches',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Sites_clearCaches response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Sites_clearCachesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v2/stage' => [
            'get' => [
                'summary' => 'Retrieve available environments',
                'description' => 'Retrieves available environments user can stage to.',
                'x-cli-name' => 'stage-v2:find-envs',
                'operationId' => 'get_StageV2_stagingEnvironments',
                'responses' => [
                    200 => [
                        'description' => 'StageV2_stagingEnvironments response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/StageV2_stagingEnvironmentsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Start staging process',
                'description' => 'Starts the staging process.',
                'x-cli-name' => 'stage-v2:start',
                'operationId' => 'post_StageV2_stage',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'to_env' => [
                                        'description' => 'Environment to deploy to.',
                                        'type' => 'string',
                                    ],
                                    'sites' => [
                                        'description' => 'Node IDs of sites to deploy.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                    'wipe_target_environment' => [
                                        'description' => 'Use this option to wipe the management console and all stacks on the selected environment before deploying sites.',
                                        'type' => 'boolean',
                                    ],
                                    'wipe_stacks' => [
                                        'description' => 'Stack ids to wipe. It will be ignored if wipe_target_environment is true.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'integer',
                                        ],
                                    ],
                                    'synchronize_all_users' => [
                                        'description' => 'Use this parameter to only stage the user accounts that are required for the provided sites and the related site collections and site groups.',
                                        'type' => 'boolean',
                                    ],
                                    'detailed_status' => [
                                        'description' => 'Provide a status email for each site as it completes.',
                                        'type' => 'boolean',
                                    ],
                                    'skip_site_files' => [
                                        'description' => 'Skip copying the staged down sites\' files.',
                                        'type' => 'boolean',
                                    ],
                                    'skip_site_files_overwrite' => [
                                        'description' => 'File patterns to skip copying during the stage down process. Ignored if skip_site_files is false.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                    'force_psu_hook' => [
                                        'description' => 'Force post-staging-update hook to run even if VCS paths are the same on prod and non-prod.',
                                        'type' => 'boolean',
                                    ],
                                ],
                                'required' => [
                                    'to_env',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'StageV2_stage response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/StageV2_stageResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/status' => [
            'get' => [
                'summary' => 'Get service status information',
                'description' => 'Get a service status report.',
                'x-cli-name' => 'service-status:get',
                'operationId' => 'get_Status_getStatus',
                'responses' => [
                    200 => [
                        'description' => 'Status_getStatus response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Status_getStatusResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Modify service status',
                'description' => 'Modify the status of the services.',
                'x-cli-name' => 'service-status:modify',
                'operationId' => 'put_Status_setStatus',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'all' => [
                                        'description' => 'on, off, or something strtotime accepts',
                                        'type' => 'string',
                                    ],
                                    'site_creation' => [
                                        'description' => 'on, off, or something strtotime accepts',
                                        'type' => 'string',
                                    ],
                                    'site_duplication' => [
                                        'description' => 'on, off, or something strtotime accepts',
                                        'type' => 'string',
                                    ],
                                    'domain_management' => [
                                        'description' => 'on, off, or something strtotime accepts',
                                        'type' => 'string',
                                    ],
                                    'bulk_operations' => [
                                        'description' => 'on, off, or something strtotime accepts',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Status_setStatus response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Status_setStatusResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/classes/{type}' => [
            'get' => [
                'summary' => '(Internal use only) Get Task class information.',
                'description' => 'Return data about WIP classes',
                'x-cli-name' => 'tasks:find-wip-classes',
                'x-internal' => true,
                'operationId' => 'get_Task_classes',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'type',
                        'description' => 'Either "softpaused" or "softpause-for-update"',
                        'schema' => [
                            'type' => 'string',
                            'pattern' => '^(softpaused|softpause-for-update)$',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Task_classes response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Task_classesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/tasks' => [
            'get' => [
                'summary' => '(Internal use only) Get Task information.',
                'description' => 'Returns data about WIP tasks.',
                'x-cli-name' => 'tasks:get',
                'x-internal' => true,
                'operationId' => 'get_Task_tasks',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'status',
                        'description' => 'processing, error or not-started',
                        'schema' => [
                            'type' => 'string',
                            'pattern' => '^(processing|error|not-started)$',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'class',
                        'description' => 'A WIP class name to filter on.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'group',
                        'description' => 'A WIP group name to filter on.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Task_tasks response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Task_tasksResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/tasks/{task_id}/logs' => [
            'get' => [
                'summary' => '(Internal use only) Get Task log information.',
                'description' => 'Returns log entries about WIP tasks.',
                'x-cli-name' => 'tasks:log',
                'x-internal' => true,
                'operationId' => 'get_Task_logs',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'task_id',
                        'description' => 'Task ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'level',
                        'description' => 'The minimum status level to display',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'descendants',
                        'description' => 'Include the logs of all descendant tasks.',
                        'schema' => [
                            'type' => 'boolean',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Task_logs response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Task_logsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/tasks/{task_id}' => [
            'delete' => [
                'summary' => 'Delete tasks from the work pool.',
                'description' => 'Delete a task and its descendants.',
                'x-cli-name' => 'tasks:delete',
                'operationId' => 'delete_Task_delete',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'task_id',
                        'description' => 'Task ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Task_delete response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Task_deleteResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/tasks/{task_id}/terminate' => [
            'put' => [
                'summary' => 'Terminate tasks in the work pool.',
                'description' => 'Terminate a task and its descendants.',
                'x-cli-name' => 'tasks:terminate',
                'operationId' => 'put_Task_terminate',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'task_id',
                        'description' => 'Task ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Task_terminate response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Task_terminateResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/task-log-settings' => [
            'get' => [
                'summary' => 'Get current task log settings.',
                'description' => 'Get current task log settings.',
                'x-cli-name' => 'tasks:get-task-log-settings',
                'operationId' => 'get_TaskLogSettings_getTaskLogSettings',
                'responses' => [
                    200 => [
                        'description' => 'TaskLogSettings_getTaskLogSettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/TaskLogSettings_getTaskLogSettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Edit current task log settings.',
                'description' => 'Edit task log settings.',
                'x-cli-name' => 'tasks:set-task-log-settings',
                'operationId' => 'put_TaskLogSettings_editTaskLogSettings',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'wip_log_level' => [
                                        'description' => 'Level of Wip log messages to keep on successful completion.',
                                        'type' => 'string',
                                    ],
                                    'wip_log_maximum_level' => [
                                        'description' => 'The maximum log level that will be written to the log.',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'TaskLogSettings_editTaskLogSettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/TaskLogSettings_editTaskLogSettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Reset task log settings.',
                'description' => 'Reset task log settings.',
                'x-cli-name' => 'tasks:reset-task-log-settings',
                'operationId' => 'delete_TaskLogSettings_resetTaskLogSettings',
                'responses' => [
                    200 => [
                        'description' => 'TaskLogSettings_resetTaskLogSettings response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/TaskLogSettings_resetTaskLogSettingsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/theme/deploy-key' => [
            'get' => [
                'summary' => 'External theme repository deploy key',
                'description' => 'Gets the deploy key that needs to be added to external theme repositories.'."\n"
                    ."\n"
                    .' Add this deploy key to your theme repositories, so that the Acquia Cloud'."\n"
                    .' Site Factory platform gets access to your repository and is able to deploy'."\n"
                    .' updated themes to your sites.',
                'x-cli-name' => 'themes:key',
                'operationId' => 'get_Theme_getThemePublicKey',
                'responses' => [
                    200 => [
                        'description' => 'Theme_getThemePublicKey response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Theme_getThemePublicKeyResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/theme/process' => [
            'post' => [
                'summary' => 'Process theme modifications',
                'description' => 'Processes the stored theme change notifications.',
                'x-cli-name' => 'themes:process-notifications',
                'operationId' => 'post_Theme_processThemes',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'sitegroup_id' => [
                                        'description' => 'The ID of a specific sitegroup to process e.g. "tangle001".',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Theme_processThemes response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Theme_processThemesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/external-theme-refresh' => [
            'post' => [
                'summary' => 'Site external theme refresh',
                'description' => 'Refreshes the site\'s themes from the external theme repository.',
                'x-cli-name' => 'themes:refresh',
                'operationId' => 'post_Theme_refreshSiteExternalThemes',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Theme_refreshSiteExternalThemes response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Theme_refreshSiteExternalThemesResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/sites/{site_id}/external-theme' => [
            'put' => [
                'summary' => 'Set site external theme',
                'description' => 'Sets the site\'s external theme data.',
                'x-cli-name' => 'themes:link-vcs',
                'operationId' => 'put_Theme_setSiteExternalTheme',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'vcs_url' => [
                                        'description' => 'The external theme repository\'s url.',
                                        'type' => 'string',
                                    ],
                                    'vcs_path' => [
                                        'description' => 'The VCS path to use.',
                                        'type' => 'string',
                                    ],
                                ],
                                'required' => [
                                    'vcs_path',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Theme_setSiteExternalTheme response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Theme_setSiteExternalThemeResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete site external theme',
                'description' => 'Deletes the site\'s external theme data.',
                'x-cli-name' => 'themes:unlink-vcs',
                'operationId' => 'delete_Theme_deleteSiteExternalTheme',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Theme_deleteSiteExternalTheme response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Theme_deleteSiteExternalThemeResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/theme/notification' => [
            'post' => [
                'summary' => 'Send a theme notification',
                'description' => 'Sends a theme event notification.',
                'x-cli-name' => 'themes:send-notification',
                'operationId' => 'post_ThemeNotification_handleNotification',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'scope' => [
                                        'description' => 'The scope. Either "theme", "site", "group", or "global".',
                                        'type' => 'string',
                                        'pattern' => '^(theme|site|group|global)$',
                                    ],
                                    'event' => [
                                        'description' => 'The type of theme event. Either "create", "modify", or "delete".',
                                        'type' => 'string',
                                        'pattern' => '^(create|modify|delete)$',
                                    ],
                                    'nid' => [
                                        'description' => 'The node ID of the related entity (site or group). Not relevant for the "global" scope.',
                                        'type' => 'integer',
                                    ],
                                    'theme' => [
                                        'description' => 'The system name of the theme. Only relevant for "theme" scope notifications.',
                                        'type' => 'string',
                                    ],
                                    'uid' => [
                                        'description' => 'The user id owning the notification and who should get notified if an error occurs during processing.',
                                        'type' => 'integer',
                                    ],
                                ],
                                'required' => [
                                    'scope',
                                    'event',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'ThemeNotification_handleNotification response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/ThemeNotification_handleNotificationResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/site-ownership/{site_id}' => [
            'post' => [
                'summary' => 'Transfer the site ownership.',
                'description' => 'Transfer the site ownership.',
                'x-cli-name' => 'site-owner:transfer',
                'operationId' => 'post_TransferSiteOwnership_transferSiteOwner',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'site_id',
                        'description' => 'Site ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'username' => [
                                        'description' => 'New owner username to which site needs to be transferred (either username or email field is required).',
                                        'type' => 'string',
                                    ],
                                    'email' => [
                                        'description' => 'New owner email id to which site needs to be transferred.',
                                        'type' => 'string',
                                    ],
                                    'force_transfer' => [
                                        'description' => 'Transfer site ownership without mail confirmation from owner and recipient.',
                                        'type' => 'boolean',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'TransferSiteOwnership_transferSiteOwner response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/TransferSiteOwnership_transferSiteOwnerResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/update' => [
            'post' => [
                'summary' => 'Start an update',
                'description' => 'Start the update process.',
                'x-cli-name' => 'updates:start',
                'operationId' => 'post_Update_update',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'scope' => [
                                        'description' => 'Either "sites", "factory", or "both".',
                                        'type' => 'string',
                                    ],
                                    'start_time' => [
                                        'description' => 'A start time string, parseable by strtotime(). Interpreted as UTC if no timezone is specified.',
                                        'type' => 'string',
                                    ],
                                    'sites_ref' => [
                                        'description' => 'A VCS ref to deploy to the sites.',
                                        'type' => 'string',
                                    ],
                                    'factory_ref' => [
                                        'description' => 'A VCS ref to deploy to the Factory.',
                                        'type' => 'string',
                                    ],
                                    'sites_type' => [
                                        'description' => 'Either "code", "code, db", or "code, db, registry"',
                                        'type' => 'string',
                                    ],
                                    'factory_type' => [
                                        'description' => 'Either "code" or "code, db"',
                                        'type' => 'string',
                                    ],
                                    'stack_id' => [
                                        'description' => 'The stack id to release to.',
                                        'type' => 'integer',
                                    ],
                                    'site_update_fail_action' => [
                                        'description' => 'Action to be performed on sites when updates fail. Either "online" or "offline"',
                                        'type' => 'string',
                                    ],
                                    'db_update_arguments' => [
                                        'description' => 'Custom arguments to supply to the db-update hooks. Space separated alphanumeric characters only.',
                                        'type' => 'string',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Update_update response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_updateResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'get' => [
                'summary' => 'List updates',
                'description' => '',
                'x-cli-name' => 'updates:find',
                'operationId' => 'get_Update_updateList',
                'responses' => [
                    200 => [
                        'description' => 'Update_updateList response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_updateListResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/update/{update_id}/status' => [
            'get' => [
                'summary' => 'Get update progress',
                'description' => 'Gets the status of a running update process.',
                'x-cli-name' => 'updates:status',
                'operationId' => 'get_Update_status',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'update_id',
                        'description' => 'Either int value or \'last\'.',
                        'schema' => [
                            'oneOf' => [
                                [
                                    'type' => 'integer',
                                ],
                                [
                                    'type' => 'string',
                                ],
                            ],
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Update_status response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_statusResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/update/pause' => [
            'post' => [
                'summary' => 'Pause an update',
                'description' => 'Pause a running update process.',
                'x-cli-name' => 'updates:pause',
                'operationId' => 'post_Update_pauseUpdate',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'pause' => [
                                        'description' => 'leave the task in paused or unpaused state.',
                                        'type' => 'boolean',
                                    ],
                                ],
                                'required' => [
                                    'pause',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Update_pauseUpdate response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_pauseUpdateResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/update/change_time' => [
            'post' => [
                'summary' => 'Change the start time of an update process',
                'description' => '',
                'x-cli-name' => 'update:change-time',
                'operationId' => 'post_Update_changeUpdaterStartTime',
                'responses' => [
                    200 => [
                        'description' => 'Update_changeUpdaterStartTime response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_changeUpdaterStartTimeResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/update/{update_id}' => [
            'delete' => [
                'summary' => 'Terminate an update process',
                'description' => 'Terminate an update process.',
                'x-cli-name' => 'update:terminate',
                'operationId' => 'delete_Update_terminateUpdater',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'update_id',
                        'description' => 'The updater id.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Update_terminateUpdater response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Update_terminateUpdaterResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/users' => [
            'get' => [
                'summary' => 'List users',
                'description' => 'Gets a list of users.',
                'x-cli-name' => 'users:find',
                'operationId' => 'get_User_getUsers',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'limit',
                        'description' => 'A positive integer (max 100).',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                            'maximum' => 100,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'page',
                        'description' => 'A positive integer.',
                        'schema' => [
                            'type' => 'integer',
                            'minimum' => 1,
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'order',
                        'description' => 'Either "ASC" or "DESC".',
                        'schema' => [
                            'type' => 'string',
                            'pattern' => '^(ASC|DESC)$',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'ids',
                        'description' => 'A comma-separated list of user IDs.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'role_ids',
                        'description' => 'A comma-separated list of role IDs.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'status',
                        'description' => 'Either "active" or "blocked".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'uid_min',
                        'description' => 'First uid value to start with.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'uid_max',
                        'description' => 'Last uid value to fetch.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'created_min',
                        'description' => 'Lowest \'created\' value (timestamp).',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'created_max',
                        'description' => 'Highest \'created\' value (timestamp).',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'login_min',
                        'description' => 'Lowest \'login\' value (timestamp).',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'login_max',
                        'description' => 'Highest \'login\' value (timestamp).',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'tfa_status',
                        'description' => 'Either "active" or "disabled".',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'fields',
                        'description' => 'A comma-separated list of Drupal user fields.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'User_getUsers response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/User_getUsersResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'post' => [
                'summary' => 'Create a user',
                'description' => 'Create a user.',
                'x-cli-name' => 'users:create',
                'operationId' => 'post_User_createUser',
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The name of the user.',
                                        'type' => 'string',
                                    ],
                                    'mail' => [
                                        'description' => 'The email address of the user.',
                                        'type' => 'string',
                                    ],
                                    'pass' => [
                                        'description' => 'The user\'s password. (Included in the response, if not provided.)',
                                        'type' => 'string',
                                    ],
                                    'status' => [
                                        'description' => 'The user\'s status, either 0 or 1.',
                                        'type' => 'integer',
                                    ],
                                    'roles' => [
                                        'description' => 'Either a single role name, or an array of role names.',
                                        'oneOf' => [
                                            [
                                                'type' => 'string',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'string',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'name',
                                    'mail',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'User_createUser response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/User_createUserResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/users/{user_id}' => [
            'get' => [
                'summary' => 'Retrieve a user',
                'description' => 'Retrieve a user by user ID.',
                'x-cli-name' => 'users:get',
                'operationId' => 'get_User_getUser',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'user_id',
                        'description' => 'The user ID of the user.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'fields',
                        'description' => 'A comma-separated list of fields to retrieve.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'User_getUser response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/User_getUserResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a user',
                'description' => 'Delete a user.',
                'x-cli-name' => 'users:delete',
                'operationId' => 'delete_User_deleteUser',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'user_id',
                        'description' => 'The user ID of the user.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'User_deleteUser response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/User_deleteUserResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/users/{user_id}/update' => [
            'put' => [
                'summary' => 'Update a user',
                'description' => 'Update a user.',
                'x-cli-name' => 'users:update',
                'operationId' => 'put_User_updateUser',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'user_id',
                        'description' => 'The user ID of the user.',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The name of the user.',
                                        'type' => 'string',
                                    ],
                                    'mail' => [
                                        'description' => 'The email address of the user.',
                                        'type' => 'string',
                                    ],
                                    'pass' => [
                                        'description' => 'The user\'s password.',
                                        'type' => 'string',
                                    ],
                                    'status' => [
                                        'description' => 'The user\'s status, either 0 or 1.',
                                        'type' => 'integer',
                                        'minimum' => 0,
                                        'maximum' => 1,
                                    ],
                                    'roles' => [
                                        'description' => 'Single role name, or an array of them.',
                                        'oneOf' => [
                                            [
                                                'type' => 'string',
                                            ],
                                            [
                                                'type' => 'array',
                                                'items' => [
                                                    'type' => 'string',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'tfa_status' => [
                                        'description' => 'The user\'s TFA status, either 0 or 1.',
                                        'type' => 'integer',
                                        'minimum' => 0,
                                        'maximum' => 1,
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'User_updateUser response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/User_updateUserResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/vcs' => [
            'get' => [
                'summary' => 'List deployable refs',
                'description' => 'Get a list of VCS refs.',
                'x-cli-name' => 'info:vcs-find',
                'operationId' => 'get_Vcs_getRefs',
                'parameters' => [
                    [
                        'in' => 'query',
                        'name' => 'type',
                        'description' => 'Either "sites" or "factory". (Note: "factory" is restricted to Acquia employees.)',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => true,
                    ],
                    [
                        'in' => 'query',
                        'name' => 'stack_id',
                        'description' => 'The stack id.',
                        'schema' => [
                            'type' => 'string',
                        ],
                        'required' => false,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Vcs_getRefs response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Vcs_getRefsResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
        '/api/v1/wip/task/{task_id}/status' => [
            'get' => [
                'summary' => 'Wip task status',
                'description' => 'Gets the status of a Wip task.',
                'x-cli-name' => 'tasks:status',
                'operationId' => 'get_WipTaskStatus_getWipTaskStatus',
                'parameters' => [
                    [
                        'in' => 'path',
                        'name' => 'task_id',
                        'description' => 'The Wip task ID',
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'required' => true,
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'WipTaskStatus_getWipTaskStatus response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/WipTaskStatus_getWipTaskStatusResponse',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'bad input parameter',
                    ],
                ],
            ],
        ],
    ],
    'components' => [
        'schemas' => [
            'ApiKey_resetKeysResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'API keys will be regenerated in a few minutes',
                    ],
                    'server_time' => [
                        'type' => 'string',
                        'example' => '2014-02-16T20:04:12-06:00',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                ],
            ],
            'ApiKey_resetUserKeysResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The API key for user 32 was regenerated.',
                    ],
                    'server_time' => [
                        'type' => 'string',
                        'example' => '2014-02-16T20:04:12-06:00',
                    ],
                ],
            ],
            'AuditEvent_getAuditEventsResponse_changes' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Thing changed from @before to @after.',
                    ],
                    'before' => [
                        'type' => 'string',
                        'example' => 'before_data',
                    ],
                    'after' => [
                        'type' => 'string',
                        'example' => 'after_data',
                    ],
                    'type' => [
                        'type' => 'string',
                        'example' => 'field_name',
                    ],
                    'scope' => [
                        'type' => 'string',
                        'example' => 'context_name',
                    ],
                    'module' => [
                        'type' => 'string',
                        'example' => 'system',
                    ],
                    'source' => [
                        'type' => 'string',
                        'example' => 'Factory UI',
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'uid' => [
                        'type' => 'integer',
                        'example' => 456,
                    ],
                    'timestamp' => [
                        'type' => 'integer',
                        'example' => 1403742194,
                    ],
                ],
            ],
            'AuditEvent_getAuditEventsResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'changes' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/AuditEvent_getAuditEventsResponse_changes',
                        ],
                    ],
                ],
            ],
            'BackupExpirationManagement_setBackupExpirationSettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-11-10T08:38:09+00:00',
                    ],
                ],
            ],
            'BackupExpirationManagement_getBackupExpirationSettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'expiration_days' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-02-16T08:38:09+00:00',
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeGetActionsResponse_content_editor' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeGetActionsResponse_platform_admin' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'site maintainer',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeGetActionsResponse_site_builder' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeGetActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'content editor' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeGetActionsResponse_content_editor',
                    ],
                    'platform admin' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeGetActionsResponse_platform_admin',
                    ],
                    'site builder' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeGetActionsResponse_site_builder',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'CentralizedRoleManagement_executePutActionsResponse_content_editor' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'newrole',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executePutActionsResponse_platform_admin' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'site maintainer',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executePutActionsResponse_site_builder' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executePutActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'content editor' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executePutActionsResponse_content_editor',
                    ],
                    'platform admin' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executePutActionsResponse_platform_admin',
                    ],
                    'site builder' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executePutActionsResponse_site_builder',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeDeleteActionsResponse_content_editor' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'newrole',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeDeleteActionsResponse_platform_admin' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'site maintainer',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeDeleteActionsResponse_site_builder' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'site_roles' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'CentralizedRoleManagement_executeDeleteActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'content editor' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeDeleteActionsResponse_content_editor',
                    ],
                    'platform admin' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeDeleteActionsResponse_platform_admin',
                    ],
                    'site builder' => [
                        '$ref' => '#/components/schemas/CentralizedRoleManagement_executeDeleteActionsResponse_site_builder',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'CodeBases_getCodeBaseNamesResponse' => [
                'type' => 'object',
                'properties' => [
                    'stacks' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'CodeBases_editCodebaseNameResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Stack details are updated successfully.',
                    ],
                ],
            ],
            'CodeBases_getCodeBaseDetailsResponse_1' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'abcd',
                    ],
                    'description' => [
                        'type' => 'string',
                        'example' => 'stack description',
                    ],
                    'tangle_alias' => [
                        'type' => 'string',
                        'example' => 'tangle1',
                    ],
                ],
            ],
            'CodeBases_getCodeBaseDetailsResponse_2' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'fghj',
                    ],
                    'description' => [
                        'type' => 'string',
                        'example' => 'stack description 2',
                    ],
                    'tangle_alias' => [
                        'type' => 'string',
                        'example' => 'tangle2',
                    ],
                ],
            ],
            'CodeBases_getCodeBaseDetailsResponse' => [
                'type' => 'object',
                'properties' => [
                    1 => [
                        '$ref' => '#/components/schemas/CodeBases_getCodeBaseDetailsResponse_1',
                    ],
                    [
                        '$ref' => '#/components/schemas/CodeBases_getCodeBaseDetailsResponse_2',
                    ],
                ],
            ],
            'CronJobs_createCronJobResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2021-11-25T13:18:44+00:00',
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'The cron job has been created',
                    ],
                ],
            ],
            'CronJobs_editCronJobResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2021-11-25T13:18:44+00:00',
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'The cron job has been saved',
                    ],
                ],
            ],
            'CronJobs_deleteCronJobResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2021-11-25T13:18:44+00:00',
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'The cron job has been deleted',
                    ],
                ],
            ],
            'CronJobs_getCronJobsResponse_cronjobs' => [
                'type' => 'object',
                'properties' => [
                    'nid' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'cron job 1',
                    ],
                    'stacks' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 1,
                        ],
                    ],
                    'sites_affected' => [
                        'type' => 'string',
                        'example' => 'dev-sites',
                    ],
                    'interval' => [
                        'type' => 'string',
                        'example' => '14 0,12 * * *',
                    ],
                    'drush_command' => [
                        'type' => 'string',
                        'example' => 'cron',
                    ],
                    'thread_percentage' => [
                        'type' => 'integer',
                        'example' => 60,
                    ],
                ],
            ],
            'CronJobs_getCronJobsResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2021-11-25T13:18:44+00:00',
                    ],
                    'count' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    'cronjobs' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/CronJobs_getCronJobsResponse_cronjobs',
                        ],
                    ],
                ],
            ],
            'CronJobs_getCronJobResponse' => [
                'type' => 'object',
                'properties' => [
                    'nid' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'cron job 1',
                    ],
                    'stacks' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 1,
                        ],
                    ],
                    'sites_affected' => [
                        'type' => 'string',
                        'example' => 'dev-sites',
                    ],
                    'interval' => [
                        'type' => 'string',
                        'example' => '14 0,12 * * *',
                    ],
                    'drush_command' => [
                        'type' => 'string',
                        'example' => 'cron',
                    ],
                    'thread_percentage' => [
                        'type' => 'integer',
                        'example' => 60,
                    ],
                ],
            ],
            'Domains_getAllDomainsResponse_domains' => [
                'type' => 'object',
                'properties' => [
                    'nid' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    'domain' => [
                        'type' => 'string',
                        'example' => 'foobar.com',
                    ],
                    'type' => [
                        'type' => 'string',
                        'example' => 'simple',
                    ],
                    'readonly' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Domains_getAllDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 111,
                    ],
                    'domains' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Domains_getAllDomainsResponse_domains',
                        ],
                    ],
                ],
            ],
            'Domains_getDomainsResponse_domains' => [
                'type' => 'object',
                'properties' => [
                    'protected_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'site.example.sfdev.acquia-test.co',
                        ],
                    ],
                    'custom_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'www.abc.com/def',
                        ],
                    ],
                ],
            ],
            'Domains_getDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'node_id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'node_type' => [
                        'type' => 'string',
                        'example' => 'site collection',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-10-28T09:25:26+00:00',
                    ],
                    'domains' => [
                        '$ref' => '#/components/schemas/Domains_getDomainsResponse_domains',
                    ],
                ],
            ],
            'Domains_getDomainStatusResponse' => [
                'type' => 'object',
                'properties' => [
                    'domain_name' => [
                        'type' => 'string',
                        'example' => 'www.example.com',
                    ],
                    'associated_status' => [
                        'type' => 'string',
                        'example' => 'registered|registered_unstable|unregistered|unregistered_unstable',
                    ],
                    'node_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'node_type' => [
                        'type' => 'string',
                        'example' => 'site',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-10-28T09:25:26+00:00',
                    ],
                ],
            ],
            'Domains_addDomainResponse' => [
                'type' => 'object',
                'properties' => [
                    'node_id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'node_type' => [
                        'type' => 'string',
                        'example' => 'site collection',
                    ],
                    'domain' => [
                        'type' => 'string',
                        'example' => 'www.domaintoadd.com',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-10-28T09:25:26+00:00',
                    ],
                    'added' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'messages' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'Your domain name was successfully added to the site collection.',
                        ],
                    ],
                ],
            ],
            'Domains_removeDomainResponse' => [
                'type' => 'object',
                'properties' => [
                    'node_id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'node_type' => [
                        'type' => 'string',
                        'example' => 'site collection',
                    ],
                    'domain' => [
                        'type' => 'string',
                        'example' => 'www.domaintoremove.com',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-10-28T09:25:26+00:00',
                    ],
                    'removed' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Your domain name has been successfully removed from &lt;site collection name&gt;.',
                    ],
                ],
            ],
            'FactoryStandardDomains_backfillFactoryStandardDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Task has been queued.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-02-16T08:38:09+00:00',
                    ],
                ],
            ],
            'FactoryStandardDomains_getFactoryStandardDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'site_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename].example.com',
                        ],
                    ],
                    'site_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-[environment].example.com',
                        ],
                    ],
                    'collection_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-collection.example.com',
                        ],
                    ],
                    'collection_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-[environment]-collection.example.com',
                        ],
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-02-16T08:38:09+00:00',
                    ],
                ],
            ],
            'FactoryStandardDomains_setFactoryStandardDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'site_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename].example.com',
                        ],
                    ],
                    'site_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template3-[sitename]-[environment].example.com',
                        ],
                    ],
                    'collection_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-collection.example.com',
                        ],
                    ],
                    'collection_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-[environment]-collection.example.com',
                        ],
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-02-16T08:38:09+00:00',
                    ],
                ],
            ],
            'FactoryStandardDomains_removeFactoryStandardDomainsResponse' => [
                'type' => 'object',
                'properties' => [
                    'site_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename].example.com',
                        ],
                    ],
                    'site_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template3-[sitename]-[environment].example.com',
                        ],
                    ],
                    'collection_prod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'collection_nonprod' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'template1-[sitename]-[environment]-collection.example.com',
                        ],
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-02-16T08:38:09+00:00',
                    ],
                ],
            ],
            'Groups_getMembersResponse_members' => [
                'type' => 'object',
                'properties' => [
                    'uid' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'group owner' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'group administrator' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Groups_getMembersResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'count' => [
                        'type' => 'integer',
                        'example' => 3,
                    ],
                    'members' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Groups_getMembersResponse_members',
                        ],
                    ],
                ],
            ],
            'Groups_getGroupByIdResponse' => [
                'type' => 'object',
                'properties' => [
                    'created' => [
                        'type' => 'integer',
                        'example' => 1399421609,
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'group_name' => [
                        'type' => 'string',
                        'example' => 'mygroup',
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'user_name',
                    ],
                    'owner_id' => [
                        'type' => 'integer',
                        'example' => 456,
                    ],
                    'parent_id' => [
                        'type' => 'integer',
                        'example' => 789,
                    ],
                    'parent_name' => [
                        'type' => 'string',
                        'example' => 'parentgroup',
                    ],
                    'live_site_count' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_site_count' => [
                        'type' => 'integer',
                        'example' => 3,
                    ],
                    'status' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                ],
            ],
            'Groups_getGroupsResponse_groups' => [
                'type' => 'object',
                'properties' => [
                    'group_name' => [
                        'type' => 'string',
                        'example' => 'test',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 10002246,
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'user_name',
                    ],
                    'owner_id' => [
                        'type' => 'integer',
                        'example' => 10000461,
                    ],
                    'parent_name' => [
                        'type' => 'string',
                        'example' => 'foo',
                    ],
                    'parent_id' => [
                        'type' => 'integer',
                        'example' => 4242,
                    ],
                    'status' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'created' => [
                        'type' => 'integer',
                        'example' => 1473142941,
                    ],
                    'live_site_count' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_site_count' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                ],
            ],
            'Groups_getGroupsResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Groups_getGroupsResponse_groups',
                        ],
                    ],
                ],
            ],
            'Groups_createGroupResponse' => [
                'type' => 'object',
                'properties' => [
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'group_name' => [
                        'type' => 'string',
                        'example' => 'mygroup',
                    ],
                ],
            ],
            'Groups_editGroupResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'Groups_deleteGroupResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'Groups_addMembersResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'uids_added' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 66,
                        ],
                    ],
                ],
            ],
            'Groups_addAdminsResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'uids_promoted' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 66,
                        ],
                    ],
                ],
            ],
            'Groups_addSitesResponse' => [
                'type' => 'object',
                'properties' => [
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'foobargroup',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2020-04-20T10:58:18+00:00',
                    ],
                    'site_ids_added' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 121,
                        ],
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'One site was successfully added to the site group.',
                    ],
                    'site_ids_skipped' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 101,
                        ],
                    ],
                ],
            ],
            'Groups_removeMembersResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'uids_removed' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 66,
                        ],
                    ],
                ],
            ],
            'Groups_removeAdminsResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'uids_demoted' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 66,
                        ],
                    ],
                ],
            ],
            'Groups_removeSitesResponse' => [
                'type' => 'object',
                'properties' => [
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'foobargroup',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2020-04-20T10:58:18+00:00',
                    ],
                    'site_ids_removed' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 121,
                        ],
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'One site was successfully removed from the site group.',
                    ],
                    'site_ids_skipped' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 101,
                        ],
                    ],
                ],
            ],
            'Groups_getSitesResponse_sites' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 151,
                    ],
                    'db_name' => [
                        'type' => 'string',
                        'example' => 'iade151',
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'site1',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'domain' => [
                        'type' => 'string',
                        'example' => '{base_url}',
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 91,
                        ],
                    ],
                    'site_collection' => [
                        'type' => 'integer',
                        'example' => 5,
                    ],
                    'is_primary' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Groups_getSitesResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2021-02-19T12:54:23+00:00',
                    ],
                    'group_id' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'count' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    'sites' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Groups_getSitesResponse_sites',
                        ],
                    ],
                ],
            ],
            'InstallationProfiles_getInstallationProfilesResponse_profiles' => [
                'type' => 'object',
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'example' => 'acquia_acms',
                    ],
                    'caption' => [
                        'type' => 'string',
                        'example' => 'Acquia CMS',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'rest_api_default' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'description' => [
                        'type' => 'string',
                        'example' => 'Ready-to-use solution designed to help create and publish websites more easily',
                    ],
                ],
            ],
            'InstallationProfiles_getInstallationProfilesResponse' => [
                'type' => 'object',
                'properties' => [
                    'profiles' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/InstallationProfiles_getInstallationProfilesResponse_profiles',
                        ],
                    ],
                    'count' => [
                        'type' => 'integer',
                        'example' => 4,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T01:02:03+00:00',
                    ],
                ],
            ],
            'InstallationProfiles_enableProfileResponse' => [
                'type' => 'object',
                'properties' => [
                    'updated' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Profile enabled successfully.',
                    ],
                    'profile_name' => [
                        'type' => 'string',
                        'example' => 'standard',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'rest_api_default' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T01:02:03+00:00',
                    ],
                ],
            ],
            'InstallationProfiles_disableProfileResponse' => [
                'type' => 'object',
                'properties' => [
                    'updated' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Profile disabled successfully.',
                    ],
                    'profile_name' => [
                        'type' => 'string',
                        'example' => 'standard',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'rest_api_default' => [
                        'type' => 'boolean',
                        'example' => false,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T01:02:03+00:00',
                    ],
                ],
            ],
            'InstallationProfiles_setDefaultResponse' => [
                'type' => 'object',
                'properties' => [
                    'updated' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Profile set as default successfully.',
                    ],
                    'profile_name' => [
                        'type' => 'string',
                        'example' => 'standard',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'rest_api_default' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T01:02:03+00:00',
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyResponse_dynamic_requests_2016-10' => [
                'type' => 'object',
                'properties' => [
                    'date' => [
                        'type' => 'string',
                        'example' => '2016-10',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 106,
                    ],
                    '2xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    '3xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 3,
                    ],
                    '4xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    '5xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_runtime' => [
                        'type' => 'number',
                        'example' => 101.4,
                    ],
                    '2xx_runtime' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    '3xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.9,
                    ],
                    '4xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.4,
                    ],
                    '5xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.1,
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyResponse_dynamic_requests' => [
                'type' => 'object',
                'properties' => [
                    '2016-10' => [
                        '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyResponse_dynamic_requests_2016-10',
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'most_recent_data' => [
                        'type' => 'string',
                        'example' => '2016-11-23',
                    ],
                    'dynamic_requests' => [
                        '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyResponse_dynamic_requests',
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyPerDomainResponse_dynamic_requests_domain1.example.com' => [
                'type' => 'object',
                'properties' => [
                    'date' => [
                        'type' => 'string',
                        'example' => '2016-11',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 106,
                    ],
                    '2xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    '3xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 3,
                    ],
                    '4xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    '5xx_dynamic_requests' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'total_runtime' => [
                        'type' => 'number',
                        'example' => 101.4,
                    ],
                    '2xx_runtime' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    '3xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.9,
                    ],
                    '4xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.4,
                    ],
                    '5xx_runtime' => [
                        'type' => 'number',
                        'example' => 0.1,
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyPerDomainResponse_dynamic_requests' => [
                'type' => 'object',
                'properties' => [
                    'domain1.example.com' => [
                        '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyPerDomainResponse_dynamic_requests_domain1.example.com',
                    ],
                ],
            ],
            'PageView_getPageViewDataMonthlyPerDomainResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'most_recent_data' => [
                        'type' => 'string',
                        'example' => '2016-11-23',
                    ],
                    'dynamic_requests' => [
                        '$ref' => '#/components/schemas/PageView_getPageViewDataMonthlyPerDomainResponse_dynamic_requests',
                    ],
                ],
            ],
            'Pause_pauseResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Task processing has been paused.',
                    ],
                ],
            ],
            'Pause_pauseTaskResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Task processing has been paused.',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'level' => [
                        'type' => 'string',
                        'example' => 'family',
                    ],
                ],
            ],
            'Ping_pingResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'pong',
                    ],
                    'server_time' => [
                        'type' => 'string',
                        'example' => '2014-02-16T20:04:12-06:00',
                    ],
                ],
            ],
            'Role_getRolesResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 4,
                    ],
                    'roles' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Role_getRoleResponse' => [
                'type' => 'object',
                'properties' => [
                    'rid' => [
                        'type' => 'integer',
                        'example' => 32,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'platform admin',
                    ],
                ],
            ],
            'Role_createRoleResponse' => [
                'type' => 'object',
                'properties' => [
                    'role_id' => [
                        'type' => 'integer',
                        'example' => 16,
                    ],
                    'role_name' => [
                        'type' => 'string',
                        'example' => 'content editor',
                    ],
                ],
            ],
            'Role_updateRoleResponse' => [
                'type' => 'object',
                'properties' => [
                    'role_id' => [
                        'type' => 'integer',
                        'example' => 32,
                    ],
                    'updated' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Role_deleteRoleResponse' => [
                'type' => 'object',
                'properties' => [
                    'role_id' => [
                        'type' => 'integer',
                        'example' => 76,
                    ],
                    'deleted' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Security_getSecuritySettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'minimum_password_length' => [
                        'type' => 'string',
                        'example' => '7',
                    ],
                    'minimum_required_password_strength' => [
                        'type' => 'string',
                        'example' => 'disabled|weak|good|strong|very strong',
                    ],
                    'two_step_verification' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'sign_out_inactive_user_accounts' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'sign_out_inactivity_time' => [
                        'type' => 'string',
                        'example' => '18000',
                    ],
                    'automatically_disable_accounts' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'automatically_disable_accounts_after_days' => [
                        'type' => 'string',
                        'example' => '90',
                    ],
                ],
            ],
            'Security_updateSecuritySettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Security settings have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'Security_resetSecuritySettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Security settings have been reset to their default values.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SfInfo_getSfVersionResponse' => [
                'type' => 'object',
                'properties' => [
                    'factory_version' => [
                        'type' => 'string',
                        'example' => '2.59.0',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2017-05-11T18:15:19+00:00',
                    ],
                ],
            ],
            'SiteCollections_getCollectionsResponse_collections' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 196,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'collection2',
                    ],
                    'internal_domain' => [
                        'type' => 'string',
                        'example' => 'domain1.site-factory.com',
                    ],
                    'primary_site' => [
                        'type' => 'integer',
                        'example' => 220,
                    ],
                    'site_count' => [
                        'type' => 'integer',
                        'example' => 2,
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 91,
                        ],
                    ],
                    'customer_standard_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'collection2-coll.example.com',
                        ],
                    ],
                    'external_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'external1-coll.example.com',
                        ],
                    ],
                ],
            ],
            'SiteCollections_getCollectionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 111,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'collections' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/SiteCollections_getCollectionsResponse_collections',
                        ],
                    ],
                ],
            ],
            'SiteCollections_getCollectionResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 261,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'created' => [
                        'type' => 'integer',
                        'example' => 1489075420,
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'admin',
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'collection1',
                    ],
                    'internal_domain' => [
                        'type' => 'string',
                        'example' => 'collection1.site-factory.com',
                    ],
                    'external_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'domain1.site-factory.com',
                        ],
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 91,
                        ],
                    ],
                    'sites' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 236,
                        ],
                    ],
                    'primary_site' => [
                        'type' => 'integer',
                        'example' => 236,
                    ],
                ],
            ],
            'SiteCollections_createCollectionResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'mycollection',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-11-25T13:18:44+00:00',
                    ],
                    'internal_domain' => [
                        'type' => 'string',
                        'example' => 'mycollecton.site-factory.com',
                    ],
                ],
            ],
            'SiteCollections_deleteCollectionResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2016-10-28T09:25:26+00:00',
                    ],
                    'deleted' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Your site collection was successfully deleted.',
                    ],
                ],
            ],
            'SiteCollections_addSiteToCollectionResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'foobarcollection',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2017-04-20T10:58:18+00:00',
                    ],
                    'site_ids_added' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 121,
                        ],
                    ],
                    'added' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'One site was successfully added to the site collection.',
                    ],
                    'warning' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'The site aabbcc (site ID: 101) is already part of the current site collection.; The site ddeeff (site ID: 126) is already part of the current site collection.',
                        ],
                    ],
                    'site_ids_skipped' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 101,
                        ],
                    ],
                ],
            ],
            'SiteCollections_removeSiteFromCollectionResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'foobarcollection',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2017-04-20T10:58:18+00:00',
                    ],
                    'site_ids_removed' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 121,
                        ],
                    ],
                    'removed' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'One site was successfully removed from the site collection.',
                    ],
                ],
            ],
            'SiteCollections_setPrimarySiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'foobarcollection',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2017-04-20T10:58:18+00:00',
                    ],
                    'primary_site_id' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'switched' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'It can take a few minutes to switch over to the new primary site.',
                    ],
                ],
            ],
            'SiteGuardConfig_getSiteGuardConfigResponse' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Please log in',
                    ],
                    'password' => [
                        'type' => 'string',
                        'example' => 'password1',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-03-28T08:46:11+00:00',
                    ],
                    'username' => [
                        'type' => 'string',
                        'example' => 'test',
                    ],
                ],
            ],
            'SiteGuardConfig_setSiteGuardConfigResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteGuardConfig_removeSiteGuardConfigResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteOwnership_executeGetActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'uid' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                    'username' => [
                        'type' => 'string',
                        'example' => 'john.doe',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteOwnership_executePutActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteOwnership_executeDeleteActionsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Site ownership assignment feature has been disabled.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteUpdatePriority_getSiteUpdatePriorityResponse_priority' => [
                'type' => 'object',
                'properties' => [
                    371 => [
                        'type' => 'integer',
                        'example' => 3,
                    ],
                    416 => [
                        'type' => 'integer',
                        'example' => 4,
                    ],
                    421 => [
                        'type' => 'integer',
                        'example' => 5,
                    ],
                ],
            ],
            'SiteUpdatePriority_getSiteUpdatePriorityResponse' => [
                'type' => 'object',
                'properties' => [
                    'priority' => [
                        '$ref' => '#/components/schemas/SiteUpdatePriority_getSiteUpdatePriorityResponse_priority',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-03-16T10:03:26+00:00',
                    ],
                ],
            ],
            'SiteUpdatePriority_setSiteUpdatePriorityResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteUpdatePriority_resetSiteUpdatePriorityResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Site update priority has been removed.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteVariables_triggerSiteVariablesDistributionResponse_task_ids' => [
                'type' => 'object',
                'properties' => [
                    'glitch.01live.01update' => [
                        'type' => 'string',
                        'example' => '1901',
                    ],
                    'glitch2.01live.01liveup' => [
                        'type' => 'string',
                        'example' => '1906',
                    ],
                ],
            ],
            'SiteVariables_triggerSiteVariablesDistributionResponse' => [
                'type' => 'object',
                'properties' => [
                    'task_ids' => [
                        '$ref' => '#/components/schemas/SiteVariables_triggerSiteVariablesDistributionResponse_task_ids',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-11-23T12:49:57+00:00',
                    ],
                ],
            ],
            'SiteVariables_getSiteVariablesResponse_vars_external_service_api_key' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'scrub_during_stage' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'variable_key' => [
                        'type' => 'string',
                        'example' => 'external_service_api_key',
                    ],
                    'variable_value' => [
                        'type' => 'string',
                        'example' => 'apikey-value2',
                    ],
                ],
            ],
            'SiteVariables_getSiteVariablesResponse_vars_external_service_api_key_non-secret' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 11,
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 101,
                    ],
                    'scrub_during_stage' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                    'variable_key' => [
                        'type' => 'string',
                        'example' => 'external_service_api_key_non-secret',
                    ],
                    'variable_value' => [
                        'type' => 'string',
                        'example' => 'apikey-value xx1234',
                    ],
                ],
            ],
            'SiteVariables_getSiteVariablesResponse_vars' => [
                'type' => 'object',
                'properties' => [
                    'external_service_api_key' => [
                        '$ref' => '#/components/schemas/SiteVariables_getSiteVariablesResponse_vars_external_service_api_key',
                    ],
                    'external_service_api_key_non-secret' => [
                        '$ref' => '#/components/schemas/SiteVariables_getSiteVariablesResponse_vars_external_service_api_key_non-secret',
                    ],
                ],
            ],
            'SiteVariables_getSiteVariablesResponse' => [
                'type' => 'object',
                'properties' => [
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-11-23T12:38:06+00:00',
                    ],
                    'vars' => [
                        '$ref' => '#/components/schemas/SiteVariables_getSiteVariablesResponse_vars',
                    ],
                ],
            ],
            'SiteVariables_changeSiteVariablesResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteVariables_removeSiteVariablesResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'SiteVariables_removeSiteVariableResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'Sites_getSitesResponse_sites' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'created' => [
                        'type' => 'integer',
                        'example' => 1616611353,
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'John Drupal',
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'site1',
                    ],
                    'db_name' => [
                        'type' => 'string',
                        'example' => 'bdpref191',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'domain' => [
                        'type' => 'string',
                        'example' => 'domain1.site-factory.com',
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 91,
                        ],
                    ],
                    'site_collection' => [
                        'oneOf' => [
                            [
                                'type' => 'integer',
                            ],
                            [
                                'type' => 'boolean',
                            ],
                        ],
                    ],
                    'is_primary' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Sites_getSitesResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 111,
                    ],
                    'sites' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Sites_getSitesResponse_sites',
                        ],
                    ],
                ],
            ],
            'Sites_getSiteResponse_external_theme' => [
                'type' => 'object',
                'properties' => [
                    'vcs_url' => [
                        'type' => 'string',
                        'example' => 'git@github.com:username/drupal-theme-repo.git',
                    ],
                    'vcs_path' => [
                        'type' => 'string',
                        'example' => 'master',
                    ],
                ],
            ],
            'Sites_getSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'created' => [
                        'type' => 'integer',
                        'example' => 1397483647,
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'John Drupal',
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'site1',
                    ],
                    'stack_id' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'db_name' => [
                        'type' => 'string',
                        'example' => 'bdpref196',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'domain1.site-factory.com',
                        ],
                    ],
                    'groups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'integer',
                            'example' => 91,
                        ],
                    ],
                    'part_of_collection' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'is_primary' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'collection_id' => [
                        'type' => 'integer',
                        'example' => 241,
                    ],
                    'collection_domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'domain241.example.com',
                        ],
                    ],
                    'external_theme' => [
                        '$ref' => '#/components/schemas/Sites_getSiteResponse_external_theme',
                    ],
                ],
            ],
            'Sites_createSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 191,
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'site1',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'mysite.site-factory.com',
                        ],
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 12345,
                    ],
                ],
            ],
            'Sites_deleteSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'owner' => [
                        'type' => 'string',
                        'example' => 'johnsmith',
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'unicorns',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T01:02:03+00:00',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 16,
                    ],
                ],
            ],
            'Sites_duplicateSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 183,
                    ],
                    'site' => [
                        'type' => 'string',
                        'example' => 'mysite2',
                    ],
                ],
            ],
            'Sites_backupSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 183,
                    ],
                ],
            ],
            'Sites_getSiteBackupsResponse_backups' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 6,
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'status' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'uid' => [
                        'type' => 'integer',
                        'example' => 16,
                    ],
                    'timestamp' => [
                        'type' => 'integer',
                        'example' => 1415044083,
                    ],
                    'bucket' => [
                        'type' => 'string',
                        'example' => 'sitefactorybackups',
                    ],
                    'directory' => [
                        'type' => 'string',
                        'example' => 'oldschool',
                    ],
                    'file' => [
                        'type' => 'string',
                        'example' => 'oldschool_91_1415044083.tar.gz',
                    ],
                    'label' => [
                        'type' => 'string',
                        'example' => 'Weekly',
                    ],
                    'componentList' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'codebase',
                        ],
                    ],
                    'complete' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Sites_getSiteBackupsResponse' => [
                'type' => 'object',
                'properties' => [
                    'backups' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Sites_getSiteBackupsResponse_backups',
                        ],
                    ],
                ],
            ],
            'Sites_getSiteBackupUrlResponse' => [
                'type' => 'object',
                'properties' => [
                    'url' => [
                        'type' => 'string',
                        'example' => 'https://s3.amazonaws.com/sitefactorybackups/site/backup1_101_1415643727.tar.gz?AWSAccessKeyId=AKIAINAAC2EGOVCRW4WA&Expires=1415713064&Signature=pWucd8b6T%2FqzoNewXH6EuTyIr1g%3D',
                    ],
                    'lifetime' => [
                        'type' => 'integer',
                        'example' => 300,
                    ],
                ],
            ],
            'Sites_deleteSiteBackupResponse' => [
                'type' => 'object',
                'properties' => [
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 16,
                    ],
                ],
            ],
            'Sites_restoreSiteResponse' => [
                'type' => 'object',
                'properties' => [
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 1024,
                    ],
                ],
            ],
            'Sites_clearCachesResponse_task_ids' => [
                'type' => 'object',
                'properties' => [
                    'drupal_cache_clear' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                    'varnish_cache_clear' => [
                        'type' => 'integer',
                        'example' => 1234,
                    ],
                ],
            ],
            'Sites_clearCachesResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2017-05-04T09:25:26+00:00',
                    ],
                    'task_ids' => [
                        '$ref' => '#/components/schemas/Sites_clearCachesResponse_task_ids',
                    ],
                ],
            ],
            'StageV2_stagingEnvironmentsResponse_environments' => [
                'type' => 'object',
                'properties' => [
                    'test' => [
                        'type' => 'string',
                        'example' => 'test',
                    ],
                ],
            ],
            'StageV2_stagingEnvironmentsResponse' => [
                'type' => 'object',
                'properties' => [
                    'environments' => [
                        '$ref' => '#/components/schemas/StageV2_stagingEnvironmentsResponse_environments',
                    ],
                ],
            ],
            'StageV2_stageResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Staging deployment has been initiated - WIP123.',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'Status_getStatusResponse' => [
                'type' => 'object',
                'properties' => [
                    'site_creation' => [
                        'type' => 'string',
                        'example' => 'Disabled',
                    ],
                    'site_duplication' => [
                        'type' => 'string',
                        'example' => 'Enabled',
                    ],
                    'domain_management' => [
                        'type' => 'string',
                        'example' => 'Disabled until 2014-02-14T11:52:17-05:00',
                    ],
                    'bulk_operations' => [
                        'type' => 'string',
                        'example' => 'Disabled until 2014-02-14T11:52:17-05:00',
                    ],
                ],
            ],
            'Status_setStatusResponse' => [
                'type' => 'object',
                'properties' => [
                    'site_creation' => [
                        'type' => 'string',
                        'example' => '',
                    ],
                    'site_duplication' => [
                        'type' => 'string',
                        'example' => '2022-02-17T05:06:55-08:00',
                    ],
                    'domain_management' => [
                        'type' => 'string',
                        'example' => '',
                    ],
                    'bulk_operations' => [
                        'type' => 'string',
                        'example' => '2022-02-17T05:06:55-08:00',
                    ],
                ],
            ],
            'Task_classesResponse' => [
                'type' => 'array',
                'items' => [
                    'type' => 'string',
                    'example' => 'Acquia\\SfSite\\SiteInstall',
                ],
            ],
            'Task_tasksResponse_item' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'example' => '7726',
                    ],
                    'parent' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'CronController 151',
                    ],
                    'group_name' => [
                        'type' => 'string',
                        'example' => 'CronController',
                    ],
                    'priority' => [
                        'type' => 'string',
                        'example' => '2',
                    ],
                    'object_id' => [
                        'type' => 'string',
                        'example' => '7726',
                    ],
                    'status' => [
                        'type' => 'string',
                        'example' => '8',
                    ],
                    'wake' => [
                        'type' => 'string',
                        'example' => '1645143240',
                    ],
                    'added' => [
                        'type' => 'string',
                        'example' => '1645103709',
                    ],
                    'started' => [
                        'type' => 'string',
                        'example' => '1645103715',
                    ],
                    'completed' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'taken' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'lease' => [
                        'type' => 'string',
                        'example' => '301',
                    ],
                    'max_run_time' => [
                        'type' => 'string',
                        'example' => '300',
                    ],
                    'paused' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'concurrency_exceeded' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'error_message' => [
                        'type' => 'string',
                        'example' => '',
                    ],
                    'nid' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'uid' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'class' => [
                        'type' => 'string',
                        'example' => 'Acquia\\SfCron\\CronController',
                    ],
                ],
            ],
            'Task_tasksResponse' => [
                'type' => 'array',
                'items' => [
                    '$ref' => '#/components/schemas/Task_tasksResponse_item',
                ],
            ],
            'Task_logsResponse_item' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'example' => '755096',
                    ],
                    'timestamp' => [
                        'type' => 'string',
                        'example' => '1643297111',
                    ],
                    'object_id' => [
                        'type' => 'string',
                        'example' => '5566',
                    ],
                    'action' => [
                        'type' => 'string',
                        'example' => '',
                    ],
                    'level' => [
                        'type' => 'string',
                        'example' => '7',
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => '[ded-11|7376] - Task added for object id 5566.',
                    ],
                    'readable' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                ],
            ],
            'Task_logsResponse' => [
                'type' => 'array',
                'items' => [
                    '$ref' => '#/components/schemas/Task_logsResponse_item',
                ],
            ],
            'Task_deleteResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Task 123 has been deleted.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T00:00:00+00:00',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'Task_terminateResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Task 123 has been queued for termination.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '1970-01-01T00:00:00+00:00',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'TaskLogSettings_getTaskLogSettingsResponse_wip_log_maximum_level' => [
                'type' => 'object',
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'example' => 'Overall tasks logging level',
                    ],
                    'value' => [
                        'type' => 'string',
                        'example' => 'trace',
                    ],
                ],
            ],
            'TaskLogSettings_getTaskLogSettingsResponse_wip_log_level' => [
                'type' => 'object',
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'example' => 'Successful tasks logging level',
                    ],
                    'value' => [
                        'type' => 'string',
                        'example' => 'warn',
                    ],
                ],
            ],
            'TaskLogSettings_getTaskLogSettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'wip_log_maximum_level' => [
                        '$ref' => '#/components/schemas/TaskLogSettings_getTaskLogSettingsResponse_wip_log_maximum_level',
                    ],
                    'wip_log_level' => [
                        '$ref' => '#/components/schemas/TaskLogSettings_getTaskLogSettingsResponse_wip_log_level',
                    ],
                ],
            ],
            'TaskLogSettings_editTaskLogSettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been saved.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'TaskLogSettings_resetTaskLogSettingsResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The configuration options have been reset to their default values.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2022-01-19T08:38:09+00:00',
                    ],
                ],
            ],
            'Theme_getThemePublicKeyResponse' => [
                'type' => 'object',
                'properties' => [
                    'deploy_key' => [
                        'type' => 'string',
                        'example' => 'ssh-rsa...== id_rsa_external_theme',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2034-05-11T18:15:19+00:00',
                    ],
                ],
            ],
            'Theme_processThemesResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The request to process theme notification has been accepted.',
                    ],
                    'sitegroups' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'tangle001',
                        ],
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2014-05-02T16:21:25+00:00',
                    ],
                ],
            ],
            'Theme_refreshSiteExternalThemesResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'accepted' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2024-05-11T18:15:19+00:00',
                    ],
                ],
            ],
            'Theme_setSiteExternalThemeResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'vcs_url' => [
                        'type' => 'string',
                        'example' => 'git@github.com:user/repo.git',
                    ],
                    'vcs_path' => [
                        'type' => 'string',
                        'example' => 'master',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2020-01-09T15:57:24+00:00',
                    ],
                ],
            ],
            'Theme_deleteSiteExternalThemeResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'example' => 121,
                    ],
                    'accepted' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2024-05-11T18:15:19+00:00',
                    ],
                ],
            ],
            'ThemeNotification_handleNotificationResponse_notification' => [
                'type' => 'object',
                'properties' => [
                    'scope' => [
                        'type' => 'string',
                        'example' => 'site',
                    ],
                    'event' => [
                        'type' => 'string',
                        'example' => 'modify',
                    ],
                    'nid' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'ThemeNotification_handleNotificationResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'The site.modify notification has been received.',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2014-02-16T20:04:12-06:00',
                    ],
                    'notification' => [
                        '$ref' => '#/components/schemas/ThemeNotification_handleNotificationResponse_notification',
                    ],
                ],
            ],
            'TransferSiteOwnership_transferSiteOwnerResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'To transfer your site, please follow the instructions in the e-mail that was sent to site-owner@email.com',
                    ],
                ],
            ],
            'Update_updateResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Update initiated.',
                    ],
                    'task_id' => [
                        'type' => 'integer',
                        'example' => 123,
                    ],
                ],
            ],
            'Update_statusResponse_statuses' => [
                'type' => 'object',
                'properties' => [
                    'not-started' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                    'in-progress' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                    'completed' => [
                        'type' => 'string',
                        'example' => '30',
                    ],
                    'warning' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                    'error' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                ],
            ],
            'Update_statusResponse_docroot_pairs_environment' => [
                'type' => 'object',
                'properties' => [
                    'site' => [
                        'type' => 'string',
                        'example' => 'test',
                    ],
                    'env' => [
                        'type' => 'string',
                        'example' => 'prod',
                    ],
                    'tangle' => [
                        'type' => 'string',
                        'example' => 'tangle_test',
                    ],
                    'type' => [
                        'type' => 'string',
                        'example' => 'live_env',
                    ],
                ],
            ],
            'Update_statusResponse_docroot_pairs' => [
                'type' => 'object',
                'properties' => [
                    'environment' => [
                        '$ref' => '#/components/schemas/Update_statusResponse_docroot_pairs_environment',
                    ],
                    'total' => [
                        'type' => 'integer',
                        'example' => 30,
                    ],
                    'error_percentage' => [
                        'type' => 'integer',
                        'example' => 0,
                    ],
                    'completed_percentage' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                ],
            ],
            'Update_statusResponse' => [
                'type' => 'object',
                'properties' => [
                    'statuses' => [
                        '$ref' => '#/components/schemas/Update_statusResponse_statuses',
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'Update complete',
                    ],
                    'percentage' => [
                        'type' => 'integer',
                        'example' => 100,
                    ],
                    'start_time' => [
                        'type' => 'integer',
                        'example' => 1423862773,
                    ],
                    'end_time' => [
                        'type' => 'integer',
                        'example' => 1423865337,
                    ],
                    'id' => [
                        'type' => 'integer',
                        'example' => 4726,
                    ],
                    'docroot_pairs' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Update_statusResponse_docroot_pairs',
                        ],
                    ],
                ],
            ],
            'Update_updateListResponse' => [
                'type' => 'object',
                'additionalProperties' => [
                    '$ref' => '#/components/schemas/Update_updateListResponse_item',
                ],
            ],
            'Update_updateListResponse_item' => [
                'type' => 'object',
                'properties' => [
                    'added' => [
                        'type' => 'string',
                        'example' => '1423762615',
                    ],
                    'status' => [
                        'type' => 'string',
                        'example' => '16',
                    ],
                ],
            ],
            'Update_pauseUpdateResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Site update processing has been paused.',
                    ],
                ],
            ],
            'Update_changeUpdaterStartTimeResponse' => [
                'type' => 'object',
                'properties' => [
                    'success' => [
                        'type' => 'integer',
                        'example' => 1,
                    ],
                    'message' => [
                        'type' => 'string',
                        'example' => 'The updater start time has been changed.',
                    ],
                ],
            ],
            'Update_terminateUpdaterResponse' => [
                'type' => 'object',
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'example' => 'Initiated termination of task 123.',
                    ],
                ],
            ],
            'User_getUsersResponse_users' => [
                'type' => 'object',
                'properties' => [
                    'uid' => [
                        'type' => 'string',
                        'example' => '1',
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'admin',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'example' => 'admin@example.com',
                    ],
                    'created' => [
                        'type' => 'string',
                        'example' => '1431525207',
                    ],
                    'access' => [
                        'type' => 'string',
                        'example' => '1431525447',
                    ],
                    'status' => [
                        'type' => 'string',
                        'example' => 'blocked',
                    ],
                    'tfa_status' => [
                        'type' => 'string',
                        'example' => 'not available',
                    ],
                    'roles' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'User_getUsersResponse' => [
                'type' => 'object',
                'properties' => [
                    'count' => [
                        'type' => 'integer',
                        'example' => 6,
                    ],
                    'users' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/User_getUsersResponse_users',
                        ],
                    ],
                ],
            ],
            'User_getUserResponse' => [
                'type' => 'object',
                'properties' => [
                    'uid' => [
                        'type' => 'string',
                        'example' => '32',
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'Mark',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'example' => 'mark@example.com',
                    ],
                    'created' => [
                        'type' => 'string',
                        'example' => '1449070860',
                    ],
                    'login' => [
                        'type' => 'string',
                        'example' => '1449071036',
                    ],
                    'status' => [
                        'type' => 'string',
                        'example' => '1',
                    ],
                    'roles' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                    'tfa_status' => [
                        'type' => 'string',
                        'example' => 'active',
                    ],
                ],
            ],
            'User_createUserResponse' => [
                'type' => 'object',
                'properties' => [
                    'user_id' => [
                        'type' => 'integer',
                        'example' => 16,
                    ],
                    'user_name' => [
                        'type' => 'string',
                        'example' => 'Mark',
                    ],
                    'user_mail' => [
                        'type' => 'string',
                        'example' => 'mark@example.com',
                    ],
                    'user_status' => [
                        'type' => 'string',
                        'example' => 'active',
                    ],
                ],
            ],
            'User_updateUserResponse' => [
                'type' => 'object',
                'properties' => [
                    'user_id' => [
                        'type' => 'integer',
                        'example' => 85,
                    ],
                    'updated' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'User_deleteUserResponse' => [
                'type' => 'object',
                'properties' => [
                    'user_id' => [
                        'type' => 'integer',
                        'example' => 76,
                    ],
                    'deleted' => [
                        'type' => 'boolean',
                        'example' => true,
                    ],
                ],
            ],
            'Vcs_getRefsResponse' => [
                'type' => 'object',
                'properties' => [
                    'available' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'example' => 'dev-branch',
                        ],
                    ],
                    'current' => [
                        'type' => 'string',
                        'example' => 'tags/2.85.0.3085',
                    ],
                ],
            ],
            'WipTaskStatus_getWipTaskStatusResponse_wip_task' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'example' => '476',
                    ],
                    'parent' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'name' => [
                        'type' => 'string',
                        'example' => 'SiteArchive 111',
                    ],
                    'group_name' => [
                        'type' => 'string',
                        'example' => 'SiteArchive customerstack1_01',
                    ],
                    'status' => [
                        'type' => 'string',
                        'example' => '16',
                    ],
                    'status_string' => [
                        'type' => 'string',
                        'example' => 'Completed',
                    ],
                    'added' => [
                        'type' => 'string',
                        'example' => '1475051666',
                    ],
                    'started' => [
                        'type' => 'string',
                        'example' => '1475051667',
                    ],
                    'completed' => [
                        'type' => 'string',
                        'example' => '1475051765',
                    ],
                    'paused' => [
                        'type' => 'string',
                        'example' => '0',
                    ],
                    'error_message' => [
                        'type' => 'string',
                        'example' => '',
                    ],
                    'nid' => [
                        'type' => 'string',
                        'example' => '111',
                    ],
                    'uid' => [
                        'type' => 'string',
                        'example' => '21',
                    ],
                ],
            ],
            'WipTaskStatus_getWipTaskStatusResponse' => [
                'type' => 'object',
                'properties' => [
                    'wip_task' => [
                        '$ref' => '#/components/schemas/WipTaskStatus_getWipTaskStatusResponse_wip_task',
                    ],
                    'time' => [
                        'type' => 'string',
                        'example' => '2014-05-02T16:21:25+00:00',
                    ],
                ],
            ],
        ],
    ],
],
1 => '984c374a4176e65500e75ee729159cc2',

]];
a:122:{i:0;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:" Symfony\Component\Config\Resource\FileResource resource";s:56:"/home/runner/work/cli/cli/vendor/composer/installed.json";}i:1;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:" Symfony\Component\Config\Resource\FileResource resource";s:40:"/home/runner/work/cli/cli/src/Kernel.php";}i:2;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:" Symfony\Component\Config\Resource\FileResource resource";s:50:"/home/runner/work/cli/cli/config/prod/services.yml";}i:3;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:52:"/home/runner/work/cli/cli/src/AcsfApi/AcsfClient.php";N;}s:9:"className";s:29:"Acquia\Cli\AcsfApi\AcsfClient";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f6adbe3f4c081ea38e1f1522b4466b7e";}i:4;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:59:"/home/runner/work/cli/cli/src/AcsfApi/AcsfClientService.php";N;s:56:"/home/runner/work/cli/cli/src/CloudApi/ClientService.php";N;}s:9:"className";s:36:"Acquia\Cli\AcsfApi\AcsfClientService";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"37ed9a9d8ebbb142bbec4a7b7d6c0bb5";}i:5;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:55:"/home/runner/work/cli/cli/src/AcsfApi/AcsfConnector.php";N;}s:9:"className";s:32:"Acquia\Cli\AcsfApi\AcsfConnector";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"396aff1e13b58dfb15f6c797d0fc0003";}i:6;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:59:"/home/runner/work/cli/cli/src/ConnectorFactoryInterface.php";N;s:62:"/home/runner/work/cli/cli/src/AcsfApi/AcsfConnectorFactory.php";N;}s:9:"className";s:39:"Acquia\Cli\AcsfApi\AcsfConnectorFactory";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"2d56991a4e1e095122c870cbb1c8a48c";}i:7;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:57:"/home/runner/work/cli/cli/src/ApiCredentialsInterface.php";N;s:57:"/home/runner/work/cli/cli/src/AcsfApi/AcsfCredentials.php";N;}s:9:"className";s:34:"Acquia\Cli\AcsfApi\AcsfCredentials";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"b2d000cb8d9b676c750409f5a6c3874f";}i:8;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:57:"/home/runner/work/cli/cli/src/ApiCredentialsInterface.php";N;}s:9:"className";s:34:"Acquia\Cli\ApiCredentialsInterface";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"6acefc626527da646cb8f34d64dff6b9";}i:9;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:45:"/home/runner/work/cli/cli/src/Application.php";N;}s:9:"className";s:22:"Acquia\Cli\Application";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ca0285f26fbbb28a552d5bec49b9bd53";}i:10;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:55:"/home/runner/work/cli/cli/src/Attribute/RequireAuth.php";N;}s:9:"className";s:32:"Acquia\Cli\Attribute\RequireAuth";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"81b6bc11b36289c407536f83c08e9f99";}i:11;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:58:"/home/runner/work/cli/cli/src/Attribute/RequireLocalDb.php";N;}s:9:"className";s:35:"Acquia\Cli\Attribute\RequireLocalDb";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"6a1b3e552937da7b36b0277266f06114";}i:12;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:59:"/home/runner/work/cli/cli/src/Attribute/RequireRemoteDb.php";N;}s:9:"className";s:36:"Acquia\Cli\Attribute\RequireRemoteDb";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"276229f7724ded6591e4e577e4ddfc7f";}i:13;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:56:"/home/runner/work/cli/cli/src/CloudApi/ClientService.php";N;}s:9:"className";s:33:"Acquia\Cli\CloudApi\ClientService";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"2dd492287a7ea067051b9c1fdba283ca";}i:14;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:57:"/home/runner/work/cli/cli/src/ApiCredentialsInterface.php";N;s:59:"/home/runner/work/cli/cli/src/CloudApi/CloudCredentials.php";N;}s:9:"className";s:36:"Acquia\Cli\CloudApi\CloudCredentials";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3f4bc8ccf55d0228d2c9857dc756590f";}i:15;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:59:"/home/runner/work/cli/cli/src/ConnectorFactoryInterface.php";N;s:59:"/home/runner/work/cli/cli/src/CloudApi/ConnectorFactory.php";N;}s:9:"className";s:36:"Acquia\Cli\CloudApi\ConnectorFactory";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d928df7745f8cc15c2e0c756c7cf04a1";}i:16;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:57:"/home/runner/work/cli/cli/src/CommandFactoryInterface.php";N;s:65:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfCommandFactory.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Acsf\AcsfCommandFactory";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"606df148e12eb4126d2159a60bba4801";}i:17;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:62:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfListCommand.php";N;s:66:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfListCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Acsf\AcsfListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"1ae5cb00bad4bd1643d622002b7f0df4";}i:18;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:66:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfListCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Acsf\AcsfListCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"1f774c4ce5abc0f8bf645d61ad80005a";}i:19;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:60:"/home/runner/work/cli/cli/src/Command/Api/ApiBaseCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Api\ApiBaseCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"85399e46ad1de4efa0fe1dcbbb3620b8";}i:20;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:57:"/home/runner/work/cli/cli/src/CommandFactoryInterface.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Api/ApiCommandFactory.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Api\ApiCommandFactory";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"392111bb1185adacc276e5c01d557263";}i:21;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:62:"/home/runner/work/cli/cli/src/Command/Api/ApiCommandHelper.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Api\ApiCommandHelper";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"14745ecd956bc28ac949be3e868855d0";}i:22;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:60:"/home/runner/work/cli/cli/src/Command/Api/ApiListCommand.php";N;s:64:"/home/runner/work/cli/cli/src/Command/Api/ApiListCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Api\ApiListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"6b7067b844b43a0f4120174559bf1bc8";}i:23;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:64:"/home/runner/work/cli/cli/src/Command/Api/ApiListCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:41:"Acquia\Cli\Command\Api\ApiListCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c6e75d14ab525e89ff45d3e17a3361c3";}i:24;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:60:"/home/runner/work/cli/cli/src/Command/App/AppOpenCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\App\AppOpenCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ccc73e96097d66e7d0d8639e792a0fdc";}i:25;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:56:"/home/runner/work/cli/cli/src/Command/App/AppVcsInfo.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:33:"Acquia\Cli\Command\App\AppVcsInfo";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"06525b280dd61b31ef710b60735beb5b";}i:26;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:57:"/home/runner/work/cli/cli/src/Command/App/LinkCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:34:"Acquia\Cli\Command\App\LinkCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"0c7ae83b0eb427046e826aeccd670aeb";}i:27;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:60:"/home/runner/work/cli/cli/src/Command/App/LogTailCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\App\LogTailCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d9a74defb471c57b0e44c16c7d45b206";}i:28;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:56:"/home/runner/work/cli/cli/src/Command/App/NewCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:33:"Acquia\Cli\Command\App\NewCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f8f5be45cde1dab4736ec325fcf9dcc1";}i:29;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:67:"/home/runner/work/cli/cli/src/Command/App/NewFromDrupal7Command.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:44:"Acquia\Cli\Command\App\NewFromDrupal7Command";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"b003f1d7e6fe4dcf4130c8fa61d8485a";}i:30;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:61:"/home/runner/work/cli/cli/src/Command/App/TaskWaitCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:38:"Acquia\Cli\Command\App\TaskWaitCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"aa7969150edbaca46f7e229ad74258a5";}i:31;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:59:"/home/runner/work/cli/cli/src/Command/App/UnlinkCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:36:"Acquia\Cli\Command\App\UnlinkCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"fd5f95b6caf87831251135e2519408fc";}i:32;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:70:"/home/runner/work/cli/cli/src/Command/Archive/ArchiveExportCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:47:"Acquia\Cli\Command\Archive\ArchiveExportCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f141c525cc343b1d6ea61842c68c28e8";}i:33;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:67:"/home/runner/work/cli/cli/src/Command/Auth/AuthAcsfLoginCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:44:"Acquia\Cli\Command\Auth\AuthAcsfLoginCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c5040baa0be0ecbd481782c4f1d74ac8";}i:34;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:68:"/home/runner/work/cli/cli/src/Command/Auth/AuthAcsfLogoutCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:45:"Acquia\Cli\Command\Auth\AuthAcsfLogoutCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"bf9a3d9ccd18169e6a71130f9e95ebab";}i:35;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:63:"/home/runner/work/cli/cli/src/Command/Auth/AuthLoginCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Auth\AuthLoginCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c7fef108e01c11ab0b185b8a89896e34";}i:36;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:64:"/home/runner/work/cli/cli/src/Command/Auth/AuthLogoutCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:41:"Acquia\Cli\Command\Auth\AuthLogoutCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"b7163f0e7fcd2b93ecacfac5784b1844";}i:37;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:76:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioCiCdVariables.php";N;}s:9:"className";s:53:"Acquia\Cli\Command\CodeStudio\CodeStudioCiCdVariables";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"1d136aa1c4cc84431fbedbf4e7819b04";}i:38;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:75:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioCommandTrait.php";N;}s:9:"className";s:52:"Acquia\Cli\Command\CodeStudio\CodeStudioCommandTrait";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"a31a046e5d032a3b10d9a6cad3ed21d1";}i:39;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:80:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioPhpVersionCommand.php";N;s:75:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:57:"Acquia\Cli\Command\CodeStudio\CodeStudioPhpVersionCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c7ddd2f30f8e40abe8678db9d5e8eaca";}i:40;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:86:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioPipelinesMigrateCommand.php";N;s:75:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:63:"Acquia\Cli\Command\CodeStudio\CodeStudioPipelinesMigrateCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c2269690192d2784083bb684cd81656d";}i:41;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:6:{s:76:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioWizardCommand.php";N;s:75:"/home/runner/work/cli/cli/src/Command/CodeStudio/CodeStudioCommandTrait.php";N;s:59:"/home/runner/work/cli/cli/src/Command/WizardCommandBase.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:53:"Acquia\Cli\Command\CodeStudio\CodeStudioWizardCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"2c250b650bf977e94e3422c51cb23b60";}i:42;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:63:"/home/runner/work/cli/cli/src/Command/CodeStudio/EntityType.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\CodeStudio\EntityType";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3d61c4858287fe948f82315dbe1ec5e2";}i:43;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:30:"Acquia\Cli\Command\CommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"60511e2d8293dfa7dd1f8c35414e7265";}i:44;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:53:"/home/runner/work/cli/cli/src/Command/DocsCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:30:"Acquia\Cli\Command\DocsCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"08719e9d9386fedfc99b0347f54db13c";}i:45;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:66:"/home/runner/work/cli/cli/src/Command/Env/EnvCertCreateCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Env\EnvCertCreateCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c6a4867e2d6e4ba7ada9ac5c11993584";}i:46;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:64:"/home/runner/work/cli/cli/src/Command/Env/EnvCopyCronCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:41:"Acquia\Cli\Command\Env\EnvCopyCronCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"8cb6e2a4eef16b719c4ea99b48811af2";}i:47;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Env/EnvCreateCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Env\EnvCreateCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f71181eb4dafd2196c5df64177d70f00";}i:48;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Env/EnvDeleteCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Env\EnvDeleteCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"78f43255092b186346889902fc6e848e";}i:49;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Env/EnvMirrorCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Env\EnvMirrorCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"fbabc80a7539862965017bc37f45e51d";}i:50;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:59:"/home/runner/work/cli/cli/src/Command/HelloWorldCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:36:"Acquia\Cli\Command\HelloWorldCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"fe1adfadc4fd7ee52eaa6dc43c7958c3";}i:51;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Ide\IdeCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d5e0d2458c7fcb47122a484678311dd0";}i:52;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:62:"/home/runner/work/cli/cli/src/Command/Ide/IdeCreateCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Ide\IdeCreateCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"83f5c8c8f48b0909fb7d78b0277adaea";}i:53;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:5:{s:62:"/home/runner/work/cli/cli/src/Command/Ide/IdeDeleteCommand.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Ide\IdeDeleteCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"9c8ad5a35583c1a7b229c17ff568a502";}i:54;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeInfoCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Ide\IdeInfoCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"0817680b5468fb5cf03bd0704f84c137";}i:55;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeListCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Ide\IdeListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"63bffef032abdadfe1294f2e674a5d3d";}i:56;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:64:"/home/runner/work/cli/cli/src/Command/Ide/IdeListMineCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:41:"Acquia\Cli\Command\Ide\IdeListMineCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"037aaeaaffb6c0cc41cdd15173e3bc90";}i:57;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeOpenCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:37:"Acquia\Cli\Command\Ide\IdeOpenCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"028fa3aa818f0af5b34c7f71a5b7f715";}i:58;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:66:"/home/runner/work/cli/cli/src/Command/Ide/IdePhpVersionCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Ide\IdePhpVersionCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"26998016d8a87a88869f23aeced5b47a";}i:59;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:70:"/home/runner/work/cli/cli/src/Command/Ide/IdeServiceRestartCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:47:"Acquia\Cli\Command\Ide\IdeServiceRestartCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"9b30cddd0078a79448d539666a69383a";}i:60;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:68:"/home/runner/work/cli/cli/src/Command/Ide/IdeServiceStartCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:45:"Acquia\Cli\Command\Ide\IdeServiceStartCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"7b9aef3cb14c21d00e6b30d613211de0";}i:61;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:67:"/home/runner/work/cli/cli/src/Command/Ide/IdeServiceStopCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:44:"Acquia\Cli\Command\Ide\IdeServiceStopCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"34baf2661b6583cbf3798c7ac95e62a5";}i:62;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:61:"/home/runner/work/cli/cli/src/Command/Ide/IdeShareCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:38:"Acquia\Cli\Command\Ide\IdeShareCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"351ea6f63aba5db63ee535c7917e8089";}i:63;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:68:"/home/runner/work/cli/cli/src/Command/Ide/IdeXdebugToggleCommand.php";N;s:60:"/home/runner/work/cli/cli/src/Command/Ide/IdeCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:45:"Acquia\Cli\Command\Ide\IdeXdebugToggleCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ceee13bf6fb84ab094f9811ca844b9c2";}i:64;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:5:{s:73:"/home/runner/work/cli/cli/src/Command/Ide/Wizard/IdeWizardCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:59:"/home/runner/work/cli/cli/src/Command/WizardCommandBase.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:50:"Acquia\Cli\Command\Ide\Wizard\IdeWizardCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"221239d7645edd018b6af8abbbdcecd3";}i:65;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:6:{s:81:"/home/runner/work/cli/cli/src/Command/Ide/Wizard/IdeWizardCreateSshKeyCommand.php";N;s:73:"/home/runner/work/cli/cli/src/Command/Ide/Wizard/IdeWizardCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:59:"/home/runner/work/cli/cli/src/Command/WizardCommandBase.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:58:"Acquia\Cli\Command\Ide\Wizard\IdeWizardCreateSshKeyCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"96eeb64b2d6388f977099d46867dcbfc";}i:66;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:6:{s:81:"/home/runner/work/cli/cli/src/Command/Ide/Wizard/IdeWizardDeleteSshKeyCommand.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:73:"/home/runner/work/cli/cli/src/Command/Ide/Wizard/IdeWizardCommandBase.php";N;s:59:"/home/runner/work/cli/cli/src/Command/WizardCommandBase.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:58:"Acquia\Cli\Command\Ide\Wizard\IdeWizardDeleteSshKeyCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ff3e08ff50898d40f1d2b5332ae53813";}i:67;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCodeCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Pull\PullCodeCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"e415e90c7946cd8ae6f72b3bb41917e0";}i:68;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:58:"/home/runner/work/cli/cli/src/Command/Pull/PullCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:35:"Acquia\Cli\Command\Pull\PullCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d57b943d27963e9530a62dfb716ceeed";}i:69;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Pull\PullCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"af85c3ddf4bfd661caf55f8504622338";}i:70;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:66:"/home/runner/work/cli/cli/src/Command/Pull/PullDatabaseCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Pull\PullDatabaseCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"a94367149b7efc1373bf9c3919220f05";}i:71;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:63:"/home/runner/work/cli/cli/src/Command/Pull/PullFilesCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Pull/PullCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Pull\PullFilesCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"0241d184be65aa7708d5e2b2c48e4857";}i:72;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:65:"/home/runner/work/cli/cli/src/Command/Pull/PullScriptsCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Pull\PullScriptsCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"0e66ea351e69ee206482b197b0de9c73";}i:73;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:66:"/home/runner/work/cli/cli/src/Command/Push/PushArtifactCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Push\PushArtifactCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c207a00c995891ddbaed3f1fc4b17d04";}i:74;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:62:"/home/runner/work/cli/cli/src/Command/Push/PushCodeCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Push/PushCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Push\PushCodeCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"1fc187e97591bf6c0969f93c7f3ecc19";}i:75;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Push/PushCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Push\PushCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"cb48d747f710e15e8b5846a6cfb45725";}i:76;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:66:"/home/runner/work/cli/cli/src/Command/Push/PushDatabaseCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Push/PushCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:43:"Acquia\Cli\Command\Push\PushDatabaseCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"dfce58b3d3889e0fa4233bb96dc1cf14";}i:77;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:63:"/home/runner/work/cli/cli/src/Command/Push/PushFilesCommand.php";N;s:62:"/home/runner/work/cli/cli/src/Command/Push/PushCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Push\PushFilesCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f497e50157d7422ac2a8dd0c71975d6b";}i:78;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:65:"/home/runner/work/cli/cli/src/Command/Remote/AliasListCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Remote\AliasListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"91fb6b0fe0b5a93397cf75ee10df4d17";}i:79;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:71:"/home/runner/work/cli/cli/src/Command/Remote/AliasesDownloadCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Remote/SshBaseCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:48:"Acquia\Cli\Command\Remote\AliasesDownloadCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"0ed1ca8be3ba44cf34fcf0b8d208e8b2";}i:80;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:61:"/home/runner/work/cli/cli/src/Command/Remote/DrushCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Remote/SshBaseCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:38:"Acquia\Cli\Command\Remote\DrushCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"24730e4063f984923fe2260af560ab0a";}i:81;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:63:"/home/runner/work/cli/cli/src/Command/Remote/SshBaseCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Remote\SshBaseCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3b4813b4e0a3392ef43f19be41a89018";}i:82;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:59:"/home/runner/work/cli/cli/src/Command/Remote/SshCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Remote/SshBaseCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:36:"Acquia\Cli\Command\Remote\SshCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f95400a0e45cf414b52ca1e77f57684e";}i:83;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:64:"/home/runner/work/cli/cli/src/Command/Self/ClearCacheCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:41:"Acquia\Cli\Command\Self\ClearCacheCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"2019767a1f8a76fdb46a5ca7c3e0e1f1";}i:84;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:58:"/home/runner/work/cli/cli/src/Command/Self/ListCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:35:"Acquia\Cli\Command\Self\ListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d66f9b8bd03c35ecac3197d1c48f3ba5";}i:85;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Self/MakeDocsCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Self\MakeDocsCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c1994c2dde23d752d4a24c0b7d77229b";}i:86;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:62:"/home/runner/work/cli/cli/src/Command/Self/SelfInfoCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:39:"Acquia\Cli\Command\Self\SelfInfoCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ed5241f336754c61c7ef89633879d6ab";}i:87;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:63:"/home/runner/work/cli/cli/src/Command/Self/TelemetryCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Self\TelemetryCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f605bd86061e4bdd25c9ebc5204ef6df";}i:88;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:70:"/home/runner/work/cli/cli/src/Command/Self/TelemetryDisableCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:47:"Acquia\Cli\Command\Self\TelemetryDisableCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"7eddbf0aa68bfeca7978a61e5b0b2a4a";}i:89;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:2:{s:69:"/home/runner/work/cli/cli/src/Command/Self/TelemetryEnableCommand.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:46:"Acquia\Cli\Command\Self\TelemetryEnableCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"4777b4bea75f6e6c176eb9b5fd6ec9a3";}i:90;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:3:{s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Ssh\SshKeyCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"4248799d163f27fa9dfd461bac43db93";}i:91;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:65:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCreateCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Ssh\SshKeyCreateCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"04d33f9718a1459f67f0e56e72447e97";}i:92;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:71:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCreateUploadCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:48:"Acquia\Cli\Command\Ssh\SshKeyCreateUploadCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"5b17d9c2f3fe4836d66f35d579162058";}i:93;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:65:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyDeleteCommand.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Ssh\SshKeyDeleteCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"6dab36803acdb36b8b05c4ea49eb607e";}i:94;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyInfoCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Ssh\SshKeyInfoCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"1ed038c5ec7404e284adda6aaffa637a";}i:95;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyListCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:40:"Acquia\Cli\Command\Ssh\SshKeyListCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ceeec0f77bbf7bc0b84a3fb8bf56d84d";}i:96;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:65:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyUploadCommand.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:42:"Acquia\Cli\Command\Ssh\SshKeyUploadCommand";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"beab48592951971c7d0fbc2bbf0b6c47";}i:97;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:59:"/home/runner/work/cli/cli/src/Command/WizardCommandBase.php";N;s:63:"/home/runner/work/cli/cli/src/Command/Ssh/SshKeyCommandBase.php";N;s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";N;}s:9:"className";s:36:"Acquia\Cli\Command\WizardCommandBase";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"7c41f1c68b1053415d81d937f699f190";}i:98;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:57:"/home/runner/work/cli/cli/src/CommandFactoryInterface.php";N;}s:9:"className";s:34:"Acquia\Cli\CommandFactoryInterface";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"4f24a6abd4c25b52881b90dabd4f7f3b";}i:99;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:56:"/home/runner/work/cli/cli/src/Config/AcquiaCliConfig.php";N;}s:9:"className";s:33:"Acquia\Cli\Config\AcquiaCliConfig";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3f2e47a8b38304f223760b99aff3b4f3";}i:100;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:56:"/home/runner/work/cli/cli/src/Config/CloudDataConfig.php";N;}s:9:"className";s:33:"Acquia\Cli\Config\CloudDataConfig";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3f2e47a8b38304f223760b99aff3b4f3";}i:101;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:59:"/home/runner/work/cli/cli/src/ConnectorFactoryInterface.php";N;}s:9:"className";s:36:"Acquia\Cli\ConnectorFactoryInterface";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"39040971c967f4b8fe3d311c9bf799ef";}i:102;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:62:"/home/runner/work/cli/cli/src/DataStore/DataStoreInterface.php";N;s:62:"/home/runner/work/cli/cli/src/DataStore/AcquiaCliDatastore.php";N;s:53:"/home/runner/work/cli/cli/src/DataStore/YamlStore.php";N;s:53:"/home/runner/work/cli/cli/src/DataStore/Datastore.php";N;}s:9:"className";s:39:"Acquia\Cli\DataStore\AcquiaCliDatastore";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"33d024e640a2f4f5a907fded3cfdcc8a";}i:103;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:4:{s:62:"/home/runner/work/cli/cli/src/DataStore/DataStoreInterface.php";N;s:58:"/home/runner/work/cli/cli/src/DataStore/CloudDataStore.php";N;s:57:"/home/runner/work/cli/cli/src/DataStore/JsonDataStore.php";N;s:53:"/home/runner/work/cli/cli/src/DataStore/Datastore.php";N;}s:9:"className";s:35:"Acquia\Cli\DataStore\CloudDataStore";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"682a03d25232f44cbcc857b152407fa2";}i:104;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:62:"/home/runner/work/cli/cli/src/DataStore/DataStoreInterface.php";N;}s:9:"className";s:39:"Acquia\Cli\DataStore\DataStoreInterface";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"27ef4209f4dddeecd2d77b1c852321e0";}i:105;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:71:"/home/runner/work/cli/cli/src/EventListener/ComposerScriptsListener.php";N;}s:9:"className";s:48:"Acquia\Cli\EventListener\ComposerScriptsListener";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"c4e531c1ee86b48241b9cdb67cb5e0a2";}i:106;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:65:"/home/runner/work/cli/cli/src/EventListener/ExceptionListener.php";N;}s:9:"className";s:42:"Acquia\Cli\EventListener\ExceptionListener";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"e533391f28cf350b941e919881d3b0b8";}i:107;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:62:"/home/runner/work/cli/cli/src/Exception/AcquiaCliException.php";N;}s:9:"className";s:39:"Acquia\Cli\Exception\AcquiaCliException";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"d2af9ade12fc85c34913da230488d87d";}i:108;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:52:"/home/runner/work/cli/cli/src/Helpers/AliasCache.php";N;}s:9:"className";s:29:"Acquia\Cli\Helpers\AliasCache";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"7b16d2068bdb2ccbde6831814c3e1d1a";}i:109;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:59:"/home/runner/work/cli/cli/src/Helpers/DataStoreContract.php";N;}s:9:"className";s:36:"Acquia\Cli\Helpers\DataStoreContract";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3a0c2ef89054a64990ed90116e272891";}i:110;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:57:"/home/runner/work/cli/cli/src/Helpers/IdeCommandTrait.php";N;}s:9:"className";s:34:"Acquia\Cli\Helpers\IdeCommandTrait";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"f4aa14ae631604a82bb6fe55ac29504f";}i:111;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:60:"/home/runner/work/cli/cli/src/Helpers/LocalMachineHelper.php";N;}s:9:"className";s:37:"Acquia\Cli\Helpers\LocalMachineHelper";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"8acc02b6a5a40cf24939d5bf246f7780";}i:112;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:52:"/home/runner/work/cli/cli/src/Helpers/LoopHelper.php";N;}s:9:"className";s:29:"Acquia\Cli\Helpers\LoopHelper";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"e177897f7e1e9c1fdaa3cc96e2f36ce2";}i:113;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:57:"/home/runner/work/cli/cli/src/Helpers/SshCommandTrait.php";N;}s:9:"className";s:34:"Acquia\Cli\Helpers\SshCommandTrait";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"3f4ae3992883519c147de5b9bbd57524";}i:114;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:51:"/home/runner/work/cli/cli/src/Helpers/SshHelper.php";N;}s:9:"className";s:28:"Acquia\Cli\Helpers\SshHelper";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"6e0c43223ccaa49afcb65bd0e1b4c924";}i:115;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:57:"/home/runner/work/cli/cli/src/Helpers/TelemetryHelper.php";N;}s:9:"className";s:34:"Acquia\Cli\Helpers\TelemetryHelper";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"fe9c698a586c25ff25129cb1344915fb";}i:116;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:50:"/home/runner/work/cli/cli/src/Output/Checklist.php";N;}s:9:"className";s:27:"Acquia\Cli\Output\Checklist";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"21b0e3ad3cdd130a9b63fb5949f4f9d1";}i:117;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:56:"/home/runner/work/cli/cli/src/Output/Spinner/Spinner.php";N;}s:9:"className";s:33:"Acquia\Cli\Output\Spinner\Spinner";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"4699109f0133ec08a699bd9c4dae5fb9";}i:118;O:57:"Symfony\Component\Config\Resource\ReflectionClassResource":4:{s:5:"files";a:1:{s:68:"/home/runner/work/cli/cli/src/Transformer/EnvironmentTransformer.php";N;}s:9:"className";s:45:"Acquia\Cli\Transformer\EnvironmentTransformer";s:15:"excludedVendors";a:1:{i:0;s:32:"/home/runner/work/cli/cli/vendor";}s:4:"hash";s:32:"ad48c7e064d601cd30ae3bf786dda390";}i:119;O:46:"Symfony\Component\Config\Resource\GlobResource":6:{s:6:"prefix";s:29:"/home/runner/work/cli/cli/src";s:7:"pattern";s:0:"";s:9:"recursive";b:1;s:4:"hash";s:32:"e38c01f5083c512a63633a1bb1fb2282";s:12:"forExclusion";b:0;s:16:"excludedPrefixes";a:11:{s:63:"/home/runner/work/cli/cli/src/CloudApi/AccessTokenConnector.php";b:1;s:55:"/home/runner/work/cli/cli/src/Command/App/From/Composer";b:1;s:64:"/home/runner/work/cli/cli/src/Command/App/From/Configuration.php";b:1;s:74:"/home/runner/work/cli/cli/src/Command/App/From/JsonResourceParserTrait.php";b:1;s:61:"/home/runner/work/cli/cli/src/Command/App/From/Recommendation";b:1;s:53:"/home/runner/work/cli/cli/src/Command/App/From/Safety";b:1;s:57:"/home/runner/work/cli/cli/src/Command/App/From/SourceSite";b:1;s:53:"/home/runner/work/cli/cli/src/DataStore/Datastore.php";b:1;s:57:"/home/runner/work/cli/cli/src/DataStore/JsonDataStore.php";b:1;s:53:"/home/runner/work/cli/cli/src/DataStore/YamlStore.php";b:1;s:40:"/home/runner/work/cli/cli/src/Kernel.php";b:1;}}i:120;O:46:"Symfony\Component\Config\Resource\GlobResource":6:{s:6:"prefix";s:37:"/home/runner/work/cli/cli/src/Command";s:7:"pattern";s:0:"";s:9:"recursive";b:1;s:4:"hash";s:32:"a57d0ed28c1fef773eed612119ffca06";s:12:"forExclusion";b:0;s:16:"excludedPrefixes";a:12:{s:62:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfListCommand.php";b:1;s:66:"/home/runner/work/cli/cli/src/Command/Acsf/AcsfListCommandBase.php";b:1;s:60:"/home/runner/work/cli/cli/src/Command/Api/ApiBaseCommand.php";b:1;s:60:"/home/runner/work/cli/cli/src/Command/Api/ApiListCommand.php";b:1;s:64:"/home/runner/work/cli/cli/src/Command/Api/ApiListCommandBase.php";b:1;s:55:"/home/runner/work/cli/cli/src/Command/App/From/Composer";b:1;s:64:"/home/runner/work/cli/cli/src/Command/App/From/Configuration.php";b:1;s:74:"/home/runner/work/cli/cli/src/Command/App/From/JsonResourceParserTrait.php";b:1;s:61:"/home/runner/work/cli/cli/src/Command/App/From/Recommendation";b:1;s:53:"/home/runner/work/cli/cli/src/Command/App/From/Safety";b:1;s:57:"/home/runner/work/cli/cli/src/Command/App/From/SourceSite";b:1;s:53:"/home/runner/work/cli/cli/src/Command/CommandBase.php";b:1;}}i:121;O:56:"Symfony\Component\Config\Resource\ClassExistenceResource":2:{s:8:"resource";s:42:"Acquia\Cli\Command\Acsf\AcsfApiBaseCommand";s:6:"exists";a:2:{i:0;b:0;i:1;N;}}}<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getNewFromDrupal7CommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'])) {
return $container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'])) {
return $container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'];
}

return $container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'] = new \Acquia\Cli\Command\App\NewFromDrupal7Command(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getRequireRemoteDbService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Attribute\\RequireRemoteDb'] = new \Acquia\Cli\Attribute\RequireRemoteDb();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getConsoleLoggerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] = new \Symfony\Component\Console\Logger\ConsoleLogger(($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getExceptionListenerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\EventListener\\ExceptionListener'] = new \Acquia\Cli\EventListener\ExceptionListener();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyInfoCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyInfoCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvMirrorCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'] = new \Acquia\Cli\Command\Env\EnvMirrorCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeXdebugToggleCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'] = new \Acquia\Cli\Command\Ide\IdeXdebugToggleCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPushArtifactCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'] = new \Acquia\Cli\Command\Push\PushArtifactCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAliasCacheService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Helpers\\AliasCache'] = new \Acquia\Cli\Helpers\AliasCache();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfConnectorFactoryService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory'] = new \Acquia\Cli\AcsfApi\AcsfConnectorFactory(['key' => ($container->services['acsf.credentials'] ?? $container->load('getAcsf_CredentialsService'))->getCloudKey(), 'secret' => ($container->services['acsf.credentials'] ?? $container->load('getAcsf_CredentialsService'))->getCloudSecret()], ($container->services['acsf.credentials'] ?? $container->load('getAcsf_CredentialsService'))->getBaseUri());
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAuthLogoutCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'] = new \Acquia\Cli\Command\Auth\AuthLogoutCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getConnectorFactoryService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\CloudApi\\ConnectorFactory'] = new \Acquia\Cli\CloudApi\ConnectorFactory(['key' => ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getCloudKey(), 'secret' => ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getCloudSecret(), 'accessToken' => ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getCloudAccessToken(), 'accessTokenExpiry' => ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getCloudAccessTokenExpiry()], ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getBaseUri(), ($container->services['cloud.credentials'] ?? $container->load('getCloud_CredentialsService'))->getAccountsUri());
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getLocalMachineHelperService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] = new \Acquia\Cli\Helpers\LocalMachineHelper(($container->services['Symfony\\Component\\Console\\Input\\ArgvInput'] ??= new \Symfony\Component\Console\Input\ArgvInput()), ($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()), ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSelfUpdateManagerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['SelfUpdate\\SelfUpdateManager'] = new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli');
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApiCommandHelperService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Command\\Api\\ApiCommandHelper'] = new \Acquia\Cli\Command\Api\ApiCommandHelper(($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeListMineCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'] = new \Acquia\Cli\Command\Ide\IdeListMineCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getLogTailCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'] = new \Acquia\Cli\Command\App\LogTailCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['AcquiaLogstream\\LogstreamManager'] ?? $container->load('getLogstreamManagerService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeServiceStopCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'] = new \Acquia\Cli\Command\Ide\IdeServiceStopCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getClearCacheCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'] = new \Acquia\Cli\Command\Self\ClearCacheCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeWizardDeleteSshKeyCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'] = new \Acquia\Cli\Command\Ide\Wizard\IdeWizardDeleteSshKeyCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAliasListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'] = new \Acquia\Cli\Command\Remote\AliasListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getClientServiceService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Application'] ?? $container->load('getApplicationService'));

if (isset($container->services['Acquia\\Cli\\CloudApi\\ClientService'])) {
return $container->services['Acquia\\Cli\\CloudApi\\ClientService'];
}

return $container->services['Acquia\\Cli\\CloudApi\\ClientService'] = new \Acquia\Cli\CloudApi\ClientService(($container->services['Acquia\\Cli\\CloudApi\\ConnectorFactory'] ?? $container->load('getConnectorFactoryService')), $a, ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCodeStudioCiCdVariablesService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCiCdVariables'] = new \Acquia\Cli\Command\CodeStudio\CodeStudioCiCdVariables();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeOpenCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'] = new \Acquia\Cli\Command\Ide\IdeOpenCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPullDatabaseCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'] = new \Acquia\Cli\Command\Pull\PullDatabaseCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['GuzzleHttp\\Client'] ??= new \GuzzleHttp\Client()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvDeleteCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'] = new \Acquia\Cli\Command\Env\EnvDeleteCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvCopyCronCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'] = new \Acquia\Cli\Command\Env\EnvCopyCronCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getComposerScriptsListenerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\EventListener\\ComposerScriptsListener'] = new \Acquia\Cli\EventListener\ComposerScriptsListener();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyCreateUploadCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyCreateUploadCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAliasesDownloadCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'] = new \Acquia\Cli\Command\Remote\AliasesDownloadCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;




class Acquia_Cli_KernelProdContainer extends Container
{
protected $targetDir;
protected $parameters = [];

public function __construct(private array $buildParameters = [], protected string $containerDir = __DIR__)
{
$this->targetDir = \dirname($containerDir);
$this->parameters = $this->getDefaultParameters();

$this->services = $this->privates = [];
$this->fileMap = [
'AcquiaCloudApi\\Connector\\Client' => 'getClientService',
'AcquiaLogstream\\LogstreamManager' => 'getLogstreamManagerService',
'Acquia\\Cli\\AcsfApi\\AcsfClient' => 'getAcsfClientService',
'Acquia\\Cli\\AcsfApi\\AcsfClientService' => 'getAcsfClientServiceService',
'Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory' => 'getAcsfConnectorFactoryService',
'Acquia\\Cli\\AcsfApi\\AcsfCredentials' => 'getAcsfCredentialsService',
'Acquia\\Cli\\Application' => 'getApplicationService',
'Acquia\\Cli\\Attribute\\RequireAuth' => 'getRequireAuthService',
'Acquia\\Cli\\Attribute\\RequireLocalDb' => 'getRequireLocalDbService',
'Acquia\\Cli\\Attribute\\RequireRemoteDb' => 'getRequireRemoteDbService',
'Acquia\\Cli\\CloudApi\\ClientService' => 'getClientServiceService',
'Acquia\\Cli\\CloudApi\\CloudCredentials' => 'getCloudCredentialsService',
'Acquia\\Cli\\CloudApi\\ConnectorFactory' => 'getConnectorFactoryService',
'Acquia\\Cli\\Command\\Acsf\\AcsfApiBaseCommand' => 'getAcsfApiBaseCommandService',
'Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory' => 'getAcsfCommandFactoryService',
'Acquia\\Cli\\Command\\Acsf\\AcsfListCommand' => 'getAcsfListCommandService',
'Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase' => 'getAcsfListCommandBaseService',
'Acquia\\Cli\\Command\\Api\\ApiBaseCommand' => 'getApiBaseCommandService',
'Acquia\\Cli\\Command\\Api\\ApiCommandFactory' => 'getApiCommandFactoryService',
'Acquia\\Cli\\Command\\Api\\ApiCommandHelper' => 'getApiCommandHelperService',
'Acquia\\Cli\\Command\\Api\\ApiListCommand' => 'getApiListCommandService',
'Acquia\\Cli\\Command\\Api\\ApiListCommandBase' => 'getApiListCommandBaseService',
'Acquia\\Cli\\Command\\App\\AppOpenCommand' => 'getAppOpenCommandService',
'Acquia\\Cli\\Command\\App\\AppVcsInfo' => 'getAppVcsInfoService',
'Acquia\\Cli\\Command\\App\\LinkCommand' => 'getLinkCommandService',
'Acquia\\Cli\\Command\\App\\LogTailCommand' => 'getLogTailCommandService',
'Acquia\\Cli\\Command\\App\\NewCommand' => 'getNewCommandService',
'Acquia\\Cli\\Command\\App\\NewFromDrupal7Command' => 'getNewFromDrupal7CommandService',
'Acquia\\Cli\\Command\\App\\TaskWaitCommand' => 'getTaskWaitCommandService',
'Acquia\\Cli\\Command\\App\\UnlinkCommand' => 'getUnlinkCommandService',
'Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand' => 'getArchiveExportCommandService',
'Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand' => 'getAuthAcsfLoginCommandService',
'Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand' => 'getAuthAcsfLogoutCommandService',
'Acquia\\Cli\\Command\\Auth\\AuthLoginCommand' => 'getAuthLoginCommandService',
'Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand' => 'getAuthLogoutCommandService',
'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioCiCdVariables' => 'getCodeStudioCiCdVariablesService',
'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand' => 'getCodeStudioPhpVersionCommandService',
'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand' => 'getCodeStudioPipelinesMigrateCommandService',
'Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand' => 'getCodeStudioWizardCommandService',
'Acquia\\Cli\\Command\\DocsCommand' => 'getDocsCommandService',
'Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand' => 'getEnvCertCreateCommandService',
'Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand' => 'getEnvCopyCronCommandService',
'Acquia\\Cli\\Command\\Env\\EnvCreateCommand' => 'getEnvCreateCommandService',
'Acquia\\Cli\\Command\\Env\\EnvDeleteCommand' => 'getEnvDeleteCommandService',
'Acquia\\Cli\\Command\\Env\\EnvMirrorCommand' => 'getEnvMirrorCommandService',
'Acquia\\Cli\\Command\\HelloWorldCommand' => 'getHelloWorldCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeCreateCommand' => 'getIdeCreateCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand' => 'getIdeDeleteCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeInfoCommand' => 'getIdeInfoCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeListCommand' => 'getIdeListCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeListMineCommand' => 'getIdeListMineCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeOpenCommand' => 'getIdeOpenCommandService',
'Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand' => 'getIdePhpVersionCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand' => 'getIdeServiceRestartCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand' => 'getIdeServiceStartCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand' => 'getIdeServiceStopCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeShareCommand' => 'getIdeShareCommandService',
'Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand' => 'getIdeXdebugToggleCommandService',
'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand' => 'getIdeWizardCreateSshKeyCommandService',
'Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand' => 'getIdeWizardDeleteSshKeyCommandService',
'Acquia\\Cli\\Command\\Pull\\PullCodeCommand' => 'getPullCodeCommandService',
'Acquia\\Cli\\Command\\Pull\\PullCommand' => 'getPullCommandService',
'Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand' => 'getPullDatabaseCommandService',
'Acquia\\Cli\\Command\\Pull\\PullFilesCommand' => 'getPullFilesCommandService',
'Acquia\\Cli\\Command\\Pull\\PullScriptsCommand' => 'getPullScriptsCommandService',
'Acquia\\Cli\\Command\\Push\\PushArtifactCommand' => 'getPushArtifactCommandService',
'Acquia\\Cli\\Command\\Push\\PushCodeCommand' => 'getPushCodeCommandService',
'Acquia\\Cli\\Command\\Push\\PushDatabaseCommand' => 'getPushDatabaseCommandService',
'Acquia\\Cli\\Command\\Push\\PushFilesCommand' => 'getPushFilesCommandService',
'Acquia\\Cli\\Command\\Remote\\AliasListCommand' => 'getAliasListCommandService',
'Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand' => 'getAliasesDownloadCommandService',
'Acquia\\Cli\\Command\\Remote\\DrushCommand' => 'getDrushCommandService',
'Acquia\\Cli\\Command\\Remote\\SshCommand' => 'getSshCommandService',
'Acquia\\Cli\\Command\\Self\\ClearCacheCommand' => 'getClearCacheCommandService',
'Acquia\\Cli\\Command\\Self\\ListCommand' => 'getListCommandService',
'Acquia\\Cli\\Command\\Self\\MakeDocsCommand' => 'getMakeDocsCommandService',
'Acquia\\Cli\\Command\\Self\\SelfInfoCommand' => 'getSelfInfoCommandService',
'Acquia\\Cli\\Command\\Self\\TelemetryCommand' => 'getTelemetryCommandService',
'Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand' => 'getTelemetryDisableCommandService',
'Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand' => 'getTelemetryEnableCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand' => 'getSshKeyCreateCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand' => 'getSshKeyCreateUploadCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand' => 'getSshKeyDeleteCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand' => 'getSshKeyInfoCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand' => 'getSshKeyListCommandService',
'Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand' => 'getSshKeyUploadCommandService',
'Acquia\\Cli\\Config\\AcquiaCliConfig' => 'getAcquiaCliConfigService',
'Acquia\\Cli\\Config\\CloudDataConfig' => 'getCloudDataConfigService',
'Acquia\\Cli\\DataStore\\AcquiaCliDatastore' => 'getAcquiaCliDatastoreService',
'Acquia\\Cli\\DataStore\\CloudDataStore' => 'getCloudDataStoreService',
'Acquia\\Cli\\EventListener\\ComposerScriptsListener' => 'getComposerScriptsListenerService',
'Acquia\\Cli\\EventListener\\ExceptionListener' => 'getExceptionListenerService',
'Acquia\\Cli\\Exception\\AcquiaCliException' => 'getAcquiaCliExceptionService',
'Acquia\\Cli\\Helpers\\AliasCache' => 'getAliasCacheService',
'Acquia\\Cli\\Helpers\\DataStoreContract' => 'getDataStoreContractService',
'Acquia\\Cli\\Helpers\\LocalMachineHelper' => 'getLocalMachineHelperService',
'Acquia\\Cli\\Helpers\\LoopHelper' => 'getLoopHelperService',
'Acquia\\Cli\\Helpers\\SshHelper' => 'getSshHelperService',
'Acquia\\Cli\\Helpers\\TelemetryHelper' => 'getTelemetryHelperService',
'Acquia\\Cli\\Output\\Checklist' => 'getChecklistService',
'Acquia\\Cli\\Output\\Spinner\\Spinner' => 'getSpinnerService',
'Acquia\\Cli\\Transformer\\EnvironmentTransformer' => 'getEnvironmentTransformerService',
'GuzzleHttp\\Client' => 'getClient2Service',
'SelfUpdate\\SelfUpdateManager' => 'getSelfUpdateManagerService',
'Symfony\\Component\\Console\\Input\\ArgvInput' => 'getArgvInputService',
'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => 'getConsoleLoggerService',
'Symfony\\Component\\Console\\Output\\ConsoleOutput' => 'getConsoleOutputService',
'Symfony\\Component\\EventDispatcher\\EventDispatcher' => 'getEventDispatcherService',
'Zumba\\Amplitude\\Amplitude' => 'getAmplitudeService',
'acsf.credentials' => 'getAcsf_CredentialsService',
'cloud.credentials' => 'getCloud_CredentialsService',
];
$this->aliases = [
'AcquiaCloudApi\\Connector\\Connector' => 'Acquia\\Cli\\CloudApi\\ConnectorFactory',
'AcquiaCloudApi\\Connector\\ConnectorInterface' => 'Acquia\\Cli\\CloudApi\\ConnectorFactory',
'Acquia\\Cli\\AcsfApi\\AcsfConnector' => 'Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory',
'Acquia\\Cli\\ApiCredentialsInterface' => 'Acquia\\Cli\\CloudApi\\CloudCredentials',
'Acquia\\Cli\\ClientServiceInterface' => 'Acquia\\Cli\\CloudApi\\ClientService',
'Acquia\\Cli\\ConnectorFactoryInterface' => 'Acquia\\Cli\\CloudApi\\ConnectorFactory',
'Psr\\Log\\LoggerInterface' => 'Symfony\\Component\\Console\\Logger\\ConsoleLogger',
'Symfony\\Component\\Console\\Input\\InputInterface' => 'Symfony\\Component\\Console\\Input\\ArgvInput',
'Symfony\\Component\\Console\\Output\\OutputInterface' => 'Symfony\\Component\\Console\\Output\\ConsoleOutput',
];
}

public function compile(): void
{
throw new LogicException('You cannot compile a dumped container that was already compiled.');
}

public function isCompiled(): bool
{
return true;
}

public function getRemovedIds(): array
{
return require $this->containerDir.\DIRECTORY_SEPARATOR.'removed-ids.php';
}

protected function load($file, $lazyLoad = true): mixed
{
if (class_exists($class = __NAMESPACE__.'\\'.$file, false)) {
return $class::do($this, $lazyLoad);
}

if ('.' === $file[-4]) {
$class = substr($class, 0, -4);
} else {
$file .= '.php';
}

$service = require $this->containerDir.\DIRECTORY_SEPARATOR.$file;

return class_exists($class, false) ? $class::do($this, $lazyLoad) : $service;
}

public function getParameter(string $name): array|bool|string|int|float|\UnitEnum|null
{
if (isset($this->buildParameters[$name])) {
return $this->buildParameters[$name];
}

if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters))) {
throw new ParameterNotFoundException($name);
}
if (isset($this->loadedDynamicParameters[$name])) {
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
}

return $this->parameters[$name];
}

public function hasParameter(string $name): bool
{
if (isset($this->buildParameters[$name])) {
return true;
}

return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters);
}

public function setParameter(string $name, $value): void
{
throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
}

public function getParameterBag(): ParameterBagInterface
{
if (!isset($this->parameterBag)) {
$parameters = $this->parameters;
foreach ($this->loadedDynamicParameters as $name => $loaded) {
$parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
}
foreach ($this->buildParameters as $name => $value) {
$parameters[$name] = $value;
}
$this->parameterBag = new FrozenParameterBag($parameters);
}

return $this->parameterBag;
}

private $loadedDynamicParameters = [
'kernel.runtime_environment' => false,
'kernel.runtime_mode' => false,
'kernel.runtime_mode.web' => false,
'kernel.runtime_mode.cli' => false,
'kernel.runtime_mode.worker' => false,
'kernel.build_dir' => false,
'kernel.cache_dir' => false,
'app.version' => false,
'app.data_dir' => false,
'app.project_dir' => false,
'app.ssh_dir' => false,
'app.acli_config_filepath' => false,
'app.cloud_config_filepath' => false,
];
private $dynamicParameters = [];

private function getDynamicParameter(string $name)
{
$container = $this;
$value = match ($name) {
'kernel.runtime_environment' => $container->getEnv('default:kernel.environment:APP_RUNTIME_ENV'),
'kernel.runtime_mode' => $container->getEnv('query_string:default:container.runtime_mode:APP_RUNTIME_MODE'),
'kernel.runtime_mode.web' => $container->getEnv('bool:default::key:web:default:kernel.runtime_mode:'),
'kernel.runtime_mode.cli' => $container->getEnv('not:default:kernel.runtime_mode.web:'),
'kernel.runtime_mode.worker' => $container->getEnv('bool:default::key:worker:default:kernel.runtime_mode:'),
'kernel.build_dir' => $container->targetDir.'',
'kernel.cache_dir' => $container->targetDir.'',
'app.version' => $container->getEnv('ACLI_VERSION'),
'app.data_dir' => $container->getEnv('ACLI_HOME'),
'app.project_dir' => $container->getEnv('ACLI_REPO_ROOT'),
'app.ssh_dir' => $container->getEnv('string:HOME').'/.ssh',
'app.acli_config_filepath' => $container->getEnv('string:ACLI_REPO_ROOT').'/.acquia-cli.yml',
'app.cloud_config_filepath' => $container->getEnv('string:ACLI_HOME').'/cloud_api.conf',
default => throw new ParameterNotFoundException($name),
};
$this->loadedDynamicParameters[$name] = true;

return $this->dynamicParameters[$name] = $value;
}

protected function getDefaultParameters(): array
{
return [
'kernel.project_dir' => \dirname(__DIR__, 4),
'kernel.environment' => 'prod',
'kernel.debug' => false,
'kernel.logs_dir' => (\dirname(__DIR__, 3).'/log'),
'kernel.bundles' => [

],
'kernel.bundles_metadata' => [

],
'kernel.charset' => 'UTF-8',
'kernel.container_class' => 'Acquia_Cli_KernelProdContainer',
'env(ACLI_REPO_ROOT)' => \dirname(__DIR__, 4),
'app.name' => 'Acquia CLI',
'app.acli_config_filename' => '.acquia-cli.yml',
'app.cloud_config_filename' => 'cloud_api.conf',
];
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCodeStudioPhpVersionCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'];
}

return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'] = new \Acquia\Cli\Command\CodeStudio\CodeStudioPhpVersionCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\ListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\ListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\ListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\ListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\ListCommand'] = new \Acquia\Cli\Command\Self\ListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvCertCreateCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'] = new \Acquia\Cli\Command\Env\EnvCertCreateCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdePhpVersionCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'] = new \Acquia\Cli\Command\Ide\IdePhpVersionCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getRequireAuthService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Attribute\\RequireAuth'] = new \Acquia\Cli\Attribute\RequireAuth();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getTelemetryEnableCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'] = new \Acquia\Cli\Command\Self\TelemetryEnableCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvCreateCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'] = new \Acquia\Cli\Command\Env\EnvCreateCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApplicationService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$container->services['Acquia\\Cli\\Application'] = $instance = new \Acquia\Cli\Application('Acquia CLI', $container->getEnv('ACLI_VERSION'));

$a = new \Symfony\Component\EventDispatcher\EventDispatcher();
$a->addListener('console.terminate', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ComposerScriptsListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ComposerScriptsListener'] ??= new \Acquia\Cli\EventListener\ComposerScriptsListener()), 'onConsoleTerminate']);
$a->addListener('console.command', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ComposerScriptsListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ComposerScriptsListener'] ??= new \Acquia\Cli\EventListener\ComposerScriptsListener()), 'onConsoleCommand']);
$a->addListener('console.error', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ExceptionListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ExceptionListener'] ??= new \Acquia\Cli\EventListener\ExceptionListener()), 'onConsoleError']);

$instance->add(($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'] ?? $container->load('getAcsfListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase'] ?? $container->load('getAcsfListCommandBaseService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Api\\ApiBaseCommand'] ?? $container->load('getApiBaseCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'] ?? $container->load('getApiListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Api\\ApiListCommandBase'] ?? $container->load('getApiListCommandBaseService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'] ?? $container->load('getAppOpenCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'] ?? $container->load('getAppVcsInfoService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\LinkCommand'] ?? $container->load('getLinkCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\LogTailCommand'] ?? $container->load('getLogTailCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\NewCommand'] ?? $container->load('getNewCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\NewFromDrupal7Command'] ?? $container->load('getNewFromDrupal7CommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'] ?? $container->load('getTaskWaitCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'] ?? $container->load('getUnlinkCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'] ?? $container->load('getArchiveExportCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'] ?? $container->load('getAuthAcsfLoginCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'] ?? $container->load('getAuthAcsfLogoutCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'] ?? $container->load('getAuthLoginCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Auth\\AuthLogoutCommand'] ?? $container->load('getAuthLogoutCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPhpVersionCommand'] ?? $container->load('getCodeStudioPhpVersionCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'] ?? $container->load('getCodeStudioPipelinesMigrateCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'] ?? $container->load('getCodeStudioWizardCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\DocsCommand'] ?? $container->load('getDocsCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Env\\EnvCertCreateCommand'] ?? $container->load('getEnvCertCreateCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Env\\EnvCopyCronCommand'] ?? $container->load('getEnvCopyCronCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Env\\EnvCreateCommand'] ?? $container->load('getEnvCreateCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Env\\EnvDeleteCommand'] ?? $container->load('getEnvDeleteCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Env\\EnvMirrorCommand'] ?? $container->load('getEnvMirrorCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\HelloWorldCommand'] ?? $container->load('getHelloWorldCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'] ?? $container->load('getIdeCreateCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'] ?? $container->load('getIdeDeleteCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'] ?? $container->load('getIdeInfoCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'] ?? $container->load('getIdeListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeListMineCommand'] ?? $container->load('getIdeListMineCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeOpenCommand'] ?? $container->load('getIdeOpenCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdePhpVersionCommand'] ?? $container->load('getIdePhpVersionCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'] ?? $container->load('getIdeServiceRestartCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'] ?? $container->load('getIdeServiceStartCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStopCommand'] ?? $container->load('getIdeServiceStopCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'] ?? $container->load('getIdeShareCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\IdeXdebugToggleCommand'] ?? $container->load('getIdeXdebugToggleCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'] ?? $container->load('getIdeWizardCreateSshKeyCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardDeleteSshKeyCommand'] ?? $container->load('getIdeWizardDeleteSshKeyCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'] ?? $container->load('getPullCodeCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'] ?? $container->load('getPullCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Pull\\PullDatabaseCommand'] ?? $container->load('getPullDatabaseCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'] ?? $container->load('getPullFilesCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'] ?? $container->load('getPullScriptsCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Push\\PushArtifactCommand'] ?? $container->load('getPushArtifactCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'] ?? $container->load('getPushCodeCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'] ?? $container->load('getPushDatabaseCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'] ?? $container->load('getPushFilesCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Remote\\AliasListCommand'] ?? $container->load('getAliasListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Remote\\AliasesDownloadCommand'] ?? $container->load('getAliasesDownloadCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'] ?? $container->load('getDrushCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'] ?? $container->load('getSshCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\ClearCacheCommand'] ?? $container->load('getClearCacheCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\ListCommand'] ?? $container->load('getListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'] ?? $container->load('getMakeDocsCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'] ?? $container->load('getSelfInfoCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'] ?? $container->load('getTelemetryCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'] ?? $container->load('getTelemetryDisableCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Self\\TelemetryEnableCommand'] ?? $container->load('getTelemetryEnableCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'] ?? $container->load('getSshKeyCreateCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateUploadCommand'] ?? $container->load('getSshKeyCreateUploadCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'] ?? $container->load('getSshKeyDeleteCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyInfoCommand'] ?? $container->load('getSshKeyInfoCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'] ?? $container->load('getSshKeyListCommandService')));
$instance->add(($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'] ?? $container->load('getSshKeyUploadCommandService')));
$instance->setDispatcher($a);

return $instance;
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPushDatabaseCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Push\\PushDatabaseCommand'] = new \Acquia\Cli\Command\Push\PushDatabaseCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getChecklistService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Output\\Checklist'] = new \Acquia\Cli\Output\Checklist(($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getConsoleOutputService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] = new \Symfony\Component\Console\Output\ConsoleOutput();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAuthAcsfLoginCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLoginCommand'] = new \Acquia\Cli\Command\Auth\AuthAcsfLoginCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['acsf.credentials'] ?? $container->load('getAcsf_CredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyDeleteCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyDeleteCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyDeleteCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfCommandFactoryService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'])) {
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'];
}
$b = ($container->services['Acquia\\Cli\\AcsfApi\\AcsfClientService'] ?? $container->load('getAcsfClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'])) {
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'];
}

return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'] = new \Acquia\Cli\Command\Acsf\AcsfCommandFactory(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\AcsfApi\\AcsfCredentials'] ?? $container->load('getAcsfCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeListCommand'] = new \Acquia\Cli\Command\Ide\IdeListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPushFilesCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Push\\PushFilesCommand'] = new \Acquia\Cli\Command\Push\PushFilesCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcquiaCliDatastoreService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] = new \Acquia\Cli\DataStore\AcquiaCliDatastore(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\Config\\AcquiaCliConfig'] ??= new \Acquia\Cli\Config\AcquiaCliConfig()), $container->getEnv('string:ACLI_REPO_ROOT').'/.acquia-cli.yml');
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPullScriptsCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Pull\\PullScriptsCommand'] = new \Acquia\Cli\Command\Pull\PullScriptsCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getTelemetryDisableCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryDisableCommand'] = new \Acquia\Cli\Command\Self\TelemetryDisableCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApiCommandFactoryService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'];
}

return $container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'] = new \Acquia\Cli\Command\Api\ApiCommandFactory(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPullCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Pull\\PullCommand'] = new \Acquia\Cli\Command\Pull\PullCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['GuzzleHttp\\Client'] ??= new \GuzzleHttp\Client()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsf_CredentialsService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['acsf.credentials'] = new \Acquia\Cli\AcsfApi\AcsfCredentials(($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfCredentialsService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\AcsfApi\\AcsfCredentials'] = new \Acquia\Cli\AcsfApi\AcsfCredentials(($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfClientServiceService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Application'] ?? $container->load('getApplicationService'));

if (isset($container->services['Acquia\\Cli\\AcsfApi\\AcsfClientService'])) {
return $container->services['Acquia\\Cli\\AcsfApi\\AcsfClientService'];
}

return $container->services['Acquia\\Cli\\AcsfApi\\AcsfClientService'] = new \Acquia\Cli\AcsfApi\AcsfClientService(($container->services['Acquia\\Cli\\AcsfApi\\AcsfConnectorFactory'] ?? $container->load('getAcsfConnectorFactoryService')), $a, ($container->services['Acquia\\Cli\\AcsfApi\\AcsfCredentials'] ?? $container->load('getAcsfCredentialsService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeServiceStartCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceStartCommand'] = new \Acquia\Cli\Command\Ide\IdeServiceStartCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAuthLoginCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Auth\\AuthLoginCommand'] = new \Acquia\Cli\Command\Auth\AuthLoginCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Remote\\SshCommand'] = new \Acquia\Cli\Command\Remote\SshCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getArgvInputService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Symfony\\Component\\Console\\Input\\ArgvInput'] = new \Symfony\Component\Console\Input\ArgvInput();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSelfInfoCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\SelfInfoCommand'] = new \Acquia\Cli\Command\Self\SelfInfoCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getDrushCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Remote\\DrushCommand'] = new \Acquia\Cli\Command\Remote\DrushCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfListCommandBaseService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'] ?? $container->load('getAcsfCommandFactoryService'));

if (isset($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase'])) {
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase'];
}

return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommandBase'] = $a->createListCommand();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeInfoCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeInfoCommand'] = new \Acquia\Cli\Command\Ide\IdeInfoCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAppOpenCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\AppOpenCommand'] = new \Acquia\Cli\Command\App\AppOpenCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCodeStudioPipelinesMigrateCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'];
}

return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioPipelinesMigrateCommand'] = new \Acquia\Cli\Command\CodeStudio\CodeStudioPipelinesMigrateCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApiListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Api\\ApiListCommand'] = new \Acquia\Cli\Command\Api\ApiListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getDocsCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\DocsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\DocsCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\DocsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\DocsCommand'];
}

return $container->services['Acquia\\Cli\\Command\\DocsCommand'] = new \Acquia\Cli\Command\DocsCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApiBaseCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'] ?? $container->load('getApiCommandFactoryService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiBaseCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiBaseCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Api\\ApiBaseCommand'] = $a->createCommand();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getLogstreamManagerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['AcquiaLogstream\\LogstreamManager'] = new \AcquiaLogstream\LogstreamManager(($container->services['Symfony\\Component\\Console\\Input\\ArgvInput'] ??= new \Symfony\Component\Console\Input\ArgvInput()), ($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshHelperService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Helpers\\SshHelper'] = new \Acquia\Cli\Helpers\SshHelper(($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()), ($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyUploadCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyUploadCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyUploadCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCloudDataConfigService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Config\\CloudDataConfig'] = new \Acquia\Cli\Config\CloudDataConfig();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getTelemetryCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\TelemetryCommand'] = new \Acquia\Cli\Command\Self\TelemetryCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEnvironmentTransformerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Transformer\\EnvironmentTransformer'] = new \Acquia\Cli\Transformer\EnvironmentTransformer();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyListCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCodeStudioWizardCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'])) {
return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'];
}

return $container->services['Acquia\\Cli\\Command\\CodeStudio\\CodeStudioWizardCommand'] = new \Acquia\Cli\Command\CodeStudio\CodeStudioWizardCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

return [
'Acquia\\Cli\\CloudApi\\AccessTokenConnector' => true,
'Acquia\\Cli\\Command\\App\\From\\Composer' => true,
'Acquia\\Cli\\Command\\App\\From\\Configuration' => true,
'Acquia\\Cli\\Command\\App\\From\\JsonResourceParserTrait' => true,
'Acquia\\Cli\\Command\\App\\From\\Recommendation' => true,
'Acquia\\Cli\\Command\\App\\From\\Safety' => true,
'Acquia\\Cli\\Command\\App\\From\\SourceSite' => true,
'Acquia\\Cli\\Command\\CommandBase' => true,
'Acquia\\Cli\\DataStore\\Datastore' => true,
'Acquia\\Cli\\DataStore\\JsonDataStore' => true,
'Acquia\\Cli\\DataStore\\YamlStore' => true,
'Acquia\\Cli\\Kernel' => true,
];
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getLinkCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\LinkCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\LinkCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\LinkCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\LinkCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\LinkCommand'] = new \Acquia\Cli\Command\App\LinkCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcquiaCliExceptionService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Exception\\AcquiaCliException'] = new \Acquia\Cli\Exception\AcquiaCliException();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getHelloWorldCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\HelloWorldCommand'])) {
return $container->services['Acquia\\Cli\\Command\\HelloWorldCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\HelloWorldCommand'])) {
return $container->services['Acquia\\Cli\\Command\\HelloWorldCommand'];
}

return $container->services['Acquia\\Cli\\Command\\HelloWorldCommand'] = new \Acquia\Cli\Command\HelloWorldCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getClient2Service extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['GuzzleHttp\\Client'] = new \GuzzleHttp\Client();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAmplitudeService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Zumba\\Amplitude\\Amplitude'] = new \Zumba\Amplitude\Amplitude();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfListCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfListCommand'] = new \Acquia\Cli\Command\Acsf\AcsfListCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeShareCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeShareCommand'] = new \Acquia\Cli\Command\Ide\IdeShareCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSpinnerService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Output\\Spinner\\Spinner'] = new \Acquia\Cli\Output\Spinner\Spinner(($container->services['Symfony\\Component\\Console\\Output\\ConsoleOutput'] ??= new \Symfony\Component\Console\Output\ConsoleOutput()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcquiaCliConfigService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Config\\AcquiaCliConfig'] = new \Acquia\Cli\Config\AcquiaCliConfig();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfApiBaseCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Command\\Acsf\\AcsfApiBaseCommand'] = ($container->services['Acquia\\Cli\\Command\\Acsf\\AcsfCommandFactory'] ?? $container->load('getAcsfCommandFactoryService'))->createCommand();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPullCodeCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Pull\\PullCodeCommand'] = new \Acquia\Cli\Command\Pull\PullCodeCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['GuzzleHttp\\Client'] ??= new \GuzzleHttp\Client()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPushCodeCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Push\\PushCodeCommand'] = new \Acquia\Cli\Command\Push\PushCodeCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCloudDataStoreService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] = new \Acquia\Cli\DataStore\CloudDataStore(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\Config\\CloudDataConfig'] ??= new \Acquia\Cli\Config\CloudDataConfig()), $container->getEnv('string:ACLI_HOME').'/cloud_api.conf');
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCloud_CredentialsService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['cloud.credentials'] = new \Acquia\Cli\CloudApi\CloudCredentials(($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeDeleteCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeDeleteCommand'] = new \Acquia\Cli\Command\Ide\IdeDeleteCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getDataStoreContractService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Helpers\\DataStoreContract'] = new \Acquia\Cli\Helpers\DataStoreContract();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getLoopHelperService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Helpers\\LoopHelper'] = new \Acquia\Cli\Helpers\LoopHelper();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getSshKeyCreateCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ssh\\SshKeyCreateCommand'] = new \Acquia\Cli\Command\Ssh\SshKeyCreateCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeServiceRestartCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeServiceRestartCommand'] = new \Acquia\Cli\Command\Ide\IdeServiceRestartCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getApiListCommandBaseService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Command\\Api\\ApiCommandFactory'] ?? $container->load('getApiCommandFactoryService'));

if (isset($container->services['Acquia\\Cli\\Command\\Api\\ApiListCommandBase'])) {
return $container->services['Acquia\\Cli\\Command\\Api\\ApiListCommandBase'];
}

return $container->services['Acquia\\Cli\\Command\\Api\\ApiListCommandBase'] = $a->createListCommand();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getRequireLocalDbService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\Attribute\\RequireLocalDb'] = new \Acquia\Cli\Attribute\RequireLocalDb();
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getClientService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['AcquiaCloudApi\\Connector\\Client'] = new \AcquiaCloudApi\Connector\Client(($container->services['Acquia\\Cli\\CloudApi\\ConnectorFactory'] ?? $container->load('getConnectorFactoryService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getTaskWaitCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\TaskWaitCommand'] = new \Acquia\Cli\Command\App\TaskWaitCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAcsfClientService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\AcsfApi\\AcsfClient'] = new \Acquia\Cli\AcsfApi\AcsfClient(($container->services['Acquia\\Cli\\CloudApi\\ConnectorFactory'] ?? $container->load('getConnectorFactoryService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getCloudCredentialsService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
return $container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] = new \Acquia\Cli\CloudApi\CloudCredentials(($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAuthAcsfLogoutCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Auth\\AuthAcsfLogoutCommand'] = new \Acquia\Cli\Command\Auth\AuthAcsfLogoutCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['acsf.credentials'] ?? $container->load('getAcsf_CredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getPullFilesCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Pull\\PullFilesCommand'] = new \Acquia\Cli\Command\Pull\PullFilesCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['GuzzleHttp\\Client'] ??= new \GuzzleHttp\Client()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeCreateCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\IdeCreateCommand'] = new \Acquia\Cli\Command\Ide\IdeCreateCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')), ($container->services['GuzzleHttp\\Client'] ??= new \GuzzleHttp\Client()));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getUnlinkCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\UnlinkCommand'] = new \Acquia\Cli\Command\App\UnlinkCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getAppVcsInfoService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'])) {
return $container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'])) {
return $container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'];
}

return $container->services['Acquia\\Cli\\Command\\App\\AppVcsInfo'] = new \Acquia\Cli\Command\App\AppVcsInfo(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getEventDispatcherService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$container->services['Symfony\\Component\\EventDispatcher\\EventDispatcher'] = $instance = new \Symfony\Component\EventDispatcher\EventDispatcher();

$instance->addListener('console.terminate', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ComposerScriptsListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ComposerScriptsListener'] ??= new \Acquia\Cli\EventListener\ComposerScriptsListener()), 'onConsoleTerminate']);
$instance->addListener('console.command', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ComposerScriptsListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ComposerScriptsListener'] ??= new \Acquia\Cli\EventListener\ComposerScriptsListener()), 'onConsoleCommand']);
$instance->addListener('console.error', [#[\Closure(name: 'Acquia\\Cli\\EventListener\\ExceptionListener')] fn () => ($container->services['Acquia\\Cli\\EventListener\\ExceptionListener'] ??= new \Acquia\Cli\EventListener\ExceptionListener()), 'onConsoleError']);

return $instance;
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getArchiveExportCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Archive\\ArchiveExportCommand'] = new \Acquia\Cli\Command\Archive\ArchiveExportCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getNewCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\NewCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\NewCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\App\\NewCommand'])) {
return $container->services['Acquia\\Cli\\Command\\App\\NewCommand'];
}

return $container->services['Acquia\\Cli\\Command\\App\\NewCommand'] = new \Acquia\Cli\Command\App\NewCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getTelemetryHelperService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'])) {
return $container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'];
}
$b = ($container->services['Acquia\\Cli\\Application'] ?? $container->load('getApplicationService'));

if (isset($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'])) {
return $container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'];
}

return $container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] = new \Acquia\Cli\Helpers\TelemetryHelper($a, ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), $b, $container->getEnv('AMPLITUDE_KEY'), $container->getEnv('BUGSNAG_KEY'));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getIdeWizardCreateSshKeyCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Ide\\Wizard\\IdeWizardCreateSshKeyCommand'] = new \Acquia\Cli\Command\Ide\Wizard\IdeWizardCreateSshKeyCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php

namespace Container9ITmE6s;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;




class getMakeDocsCommandService extends Acquia_Cli_KernelProdContainer
{





public static function do($container, $lazyLoad = true)
{
$a = ($container->services['Acquia\\Cli\\Helpers\\TelemetryHelper'] ?? $container->load('getTelemetryHelperService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'];
}
$b = ($container->services['Acquia\\Cli\\CloudApi\\ClientService'] ?? $container->load('getClientServiceService'));

if (isset($container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'])) {
return $container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'];
}

return $container->services['Acquia\\Cli\\Command\\Self\\MakeDocsCommand'] = new \Acquia\Cli\Command\Self\MakeDocsCommand(($container->services['Acquia\\Cli\\Helpers\\LocalMachineHelper'] ?? $container->load('getLocalMachineHelperService')), ($container->services['Acquia\\Cli\\DataStore\\CloudDataStore'] ?? $container->load('getCloudDataStoreService')), ($container->services['Acquia\\Cli\\DataStore\\AcquiaCliDatastore'] ?? $container->load('getAcquiaCliDatastoreService')), ($container->services['Acquia\\Cli\\CloudApi\\CloudCredentials'] ?? $container->load('getCloudCredentialsService')), $a, $container->getEnv('ACLI_REPO_ROOT'), $b, ($container->services['Acquia\\Cli\\Helpers\\SshHelper'] ?? $container->load('getSshHelperService')), $container->getEnv('string:HOME').'/.ssh', ($container->services['Symfony\\Component\\Console\\Logger\\ConsoleLogger'] ?? $container->load('getConsoleLoggerService')), ($container->services['SelfUpdate\\SelfUpdateManager'] ??= new \SelfUpdate\SelfUpdateManager('Acquia CLI', $container->getEnv('ACLI_VERSION'), 'acquia/cli')));
}
}
<?php




use Symfony\Component\DependencyInjection\Dumper\Preloader;

if (in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
return;
}

require dirname(__DIR__, 3).'/vendor/autoload.php';
(require __DIR__.'/Acquia_Cli_KernelProdContainer.php')->set(\Container9ITmE6s\Acquia_Cli_KernelProdContainer::class, null);
require __DIR__.'/Container9ITmE6s/getCloud_CredentialsService.php';
require __DIR__.'/Container9ITmE6s/getAcsf_CredentialsService.php';
require __DIR__.'/Container9ITmE6s/getAmplitudeService.php';
require __DIR__.'/Container9ITmE6s/getEventDispatcherService.php';
require __DIR__.'/Container9ITmE6s/getConsoleOutputService.php';
require __DIR__.'/Container9ITmE6s/getConsoleLoggerService.php';
require __DIR__.'/Container9ITmE6s/getArgvInputService.php';
require __DIR__.'/Container9ITmE6s/getSelfUpdateManagerService.php';
require __DIR__.'/Container9ITmE6s/getClient2Service.php';
require __DIR__.'/Container9ITmE6s/getEnvironmentTransformerService.php';
require __DIR__.'/Container9ITmE6s/getSpinnerService.php';
require __DIR__.'/Container9ITmE6s/getChecklistService.php';
require __DIR__.'/Container9ITmE6s/getTelemetryHelperService.php';
require __DIR__.'/Container9ITmE6s/getSshHelperService.php';
require __DIR__.'/Container9ITmE6s/getLoopHelperService.php';
require __DIR__.'/Container9ITmE6s/getLocalMachineHelperService.php';
require __DIR__.'/Container9ITmE6s/getDataStoreContractService.php';
require __DIR__.'/Container9ITmE6s/getAliasCacheService.php';
require __DIR__.'/Container9ITmE6s/getAcquiaCliExceptionService.php';
require __DIR__.'/Container9ITmE6s/getExceptionListenerService.php';
require __DIR__.'/Container9ITmE6s/getComposerScriptsListenerService.php';
require __DIR__.'/Container9ITmE6s/getCloudDataStoreService.php';
require __DIR__.'/Container9ITmE6s/getAcquiaCliDatastoreService.php';
require __DIR__.'/Container9ITmE6s/getCloudDataConfigService.php';
require __DIR__.'/Container9ITmE6s/getAcquiaCliConfigService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyUploadCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyListCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyInfoCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyDeleteCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyCreateUploadCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshKeyCreateCommandService.php';
require __DIR__.'/Container9ITmE6s/getTelemetryEnableCommandService.php';
require __DIR__.'/Container9ITmE6s/getTelemetryDisableCommandService.php';
require __DIR__.'/Container9ITmE6s/getTelemetryCommandService.php';
require __DIR__.'/Container9ITmE6s/getSelfInfoCommandService.php';
require __DIR__.'/Container9ITmE6s/getMakeDocsCommandService.php';
require __DIR__.'/Container9ITmE6s/getListCommandService.php';
require __DIR__.'/Container9ITmE6s/getClearCacheCommandService.php';
require __DIR__.'/Container9ITmE6s/getSshCommandService.php';
require __DIR__.'/Container9ITmE6s/getDrushCommandService.php';
require __DIR__.'/Container9ITmE6s/getAliasesDownloadCommandService.php';
require __DIR__.'/Container9ITmE6s/getAliasListCommandService.php';
require __DIR__.'/Container9ITmE6s/getPushFilesCommandService.php';
require __DIR__.'/Container9ITmE6s/getPushDatabaseCommandService.php';
require __DIR__.'/Container9ITmE6s/getPushCodeCommandService.php';
require __DIR__.'/Container9ITmE6s/getPushArtifactCommandService.php';
require __DIR__.'/Container9ITmE6s/getPullScriptsCommandService.php';
require __DIR__.'/Container9ITmE6s/getPullFilesCommandService.php';
require __DIR__.'/Container9ITmE6s/getPullDatabaseCommandService.php';
require __DIR__.'/Container9ITmE6s/getPullCommandService.php';
require __DIR__.'/Container9ITmE6s/getPullCodeCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeWizardDeleteSshKeyCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeWizardCreateSshKeyCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeXdebugToggleCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeShareCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeServiceStopCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeServiceStartCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeServiceRestartCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdePhpVersionCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeOpenCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeListMineCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeListCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeInfoCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeDeleteCommandService.php';
require __DIR__.'/Container9ITmE6s/getIdeCreateCommandService.php';
require __DIR__.'/Container9ITmE6s/getHelloWorldCommandService.php';
require __DIR__.'/Container9ITmE6s/getEnvMirrorCommandService.php';
require __DIR__.'/Container9ITmE6s/getEnvDeleteCommandService.php';
require __DIR__.'/Container9ITmE6s/getEnvCreateCommandService.php';
require __DIR__.'/Container9ITmE6s/getEnvCopyCronCommandService.php';
require __DIR__.'/Container9ITmE6s/getEnvCertCreateCommandService.php';
require __DIR__.'/Container9ITmE6s/getDocsCommandService.php';
require __DIR__.'/Container9ITmE6s/getCodeStudioWizardCommandService.php';
require __DIR__.'/Container9ITmE6s/getCodeStudioPipelinesMigrateCommandService.php';
require __DIR__.'/Container9ITmE6s/getCodeStudioPhpVersionCommandService.php';
require __DIR__.'/Container9ITmE6s/getCodeStudioCiCdVariablesService.php';
require __DIR__.'/Container9ITmE6s/getAuthLogoutCommandService.php';
require __DIR__.'/Container9ITmE6s/getAuthLoginCommandService.php';
require __DIR__.'/Container9ITmE6s/getAuthAcsfLogoutCommandService.php';
require __DIR__.'/Container9ITmE6s/getAuthAcsfLoginCommandService.php';
require __DIR__.'/Container9ITmE6s/getArchiveExportCommandService.php';
require __DIR__.'/Container9ITmE6s/getUnlinkCommandService.php';
require __DIR__.'/Container9ITmE6s/getTaskWaitCommandService.php';
require __DIR__.'/Container9ITmE6s/getNewFromDrupal7CommandService.php';
require __DIR__.'/Container9ITmE6s/getNewCommandService.php';
require __DIR__.'/Container9ITmE6s/getLogTailCommandService.php';
require __DIR__.'/Container9ITmE6s/getLinkCommandService.php';
require __DIR__.'/Container9ITmE6s/getAppVcsInfoService.php';
require __DIR__.'/Container9ITmE6s/getAppOpenCommandService.php';
require __DIR__.'/Container9ITmE6s/getApiListCommandBaseService.php';
require __DIR__.'/Container9ITmE6s/getApiListCommandService.php';
require __DIR__.'/Container9ITmE6s/getApiCommandHelperService.php';
require __DIR__.'/Container9ITmE6s/getApiCommandFactoryService.php';
require __DIR__.'/Container9ITmE6s/getApiBaseCommandService.php';
require __DIR__.'/Container9ITmE6s/getAcsfListCommandBaseService.php';
require __DIR__.'/Container9ITmE6s/getAcsfListCommandService.php';
require __DIR__.'/Container9ITmE6s/getAcsfCommandFactoryService.php';
require __DIR__.'/Container9ITmE6s/getAcsfApiBaseCommandService.php';
require __DIR__.'/Container9ITmE6s/getConnectorFactoryService.php';
require __DIR__.'/Container9ITmE6s/getCloudCredentialsService.php';
require __DIR__.'/Container9ITmE6s/getClientServiceService.php';
require __DIR__.'/Container9ITmE6s/getRequireRemoteDbService.php';
require __DIR__.'/Container9ITmE6s/getRequireLocalDbService.php';
require __DIR__.'/Container9ITmE6s/getRequireAuthService.php';
require __DIR__.'/Container9ITmE6s/getApplicationService.php';
require __DIR__.'/Container9ITmE6s/getAcsfCredentialsService.php';
require __DIR__.'/Container9ITmE6s/getAcsfConnectorFactoryService.php';
require __DIR__.'/Container9ITmE6s/getAcsfClientServiceService.php';
require __DIR__.'/Container9ITmE6s/getAcsfClientService.php';
require __DIR__.'/Container9ITmE6s/getLogstreamManagerService.php';
require __DIR__.'/Container9ITmE6s/getClientService.php';

$classes = [];
$classes[] = 'AcquiaCloudApi\Connector\Client';
$classes[] = 'AcquiaLogstream\LogstreamManager';
$classes[] = 'Acquia\Cli\AcsfApi\AcsfClient';
$classes[] = 'Acquia\Cli\AcsfApi\AcsfClientService';
$classes[] = 'Acquia\Cli\AcsfApi\AcsfConnectorFactory';
$classes[] = 'Acquia\Cli\AcsfApi\AcsfCredentials';
$classes[] = 'Acquia\Cli\Application';
$classes[] = 'Symfony\Component\EventDispatcher\EventDispatcher';
$classes[] = 'Acquia\Cli\Attribute\RequireAuth';
$classes[] = 'Acquia\Cli\Attribute\RequireLocalDb';
$classes[] = 'Acquia\Cli\Attribute\RequireRemoteDb';
$classes[] = 'Acquia\Cli\CloudApi\ClientService';
$classes[] = 'Acquia\Cli\CloudApi\CloudCredentials';
$classes[] = 'Acquia\Cli\CloudApi\ConnectorFactory';
$classes[] = 'Acquia\Cli\Command\Acsf\AcsfApiBaseCommand';
$classes[] = 'Acquia\Cli\Command\Acsf\AcsfCommandFactory';
$classes[] = 'Acquia\Cli\Command\Acsf\AcsfListCommand';
$classes[] = 'Acquia\Cli\Command\Acsf\AcsfListCommandBase';
$classes[] = 'Acquia\Cli\Command\Api\ApiBaseCommand';
$classes[] = 'Acquia\Cli\Command\Api\ApiCommandFactory';
$classes[] = 'Acquia\Cli\Command\Api\ApiCommandHelper';
$classes[] = 'Acquia\Cli\Command\Api\ApiListCommand';
$classes[] = 'Acquia\Cli\Command\Api\ApiListCommandBase';
$classes[] = 'Acquia\Cli\Command\App\AppOpenCommand';
$classes[] = 'Acquia\Cli\Command\App\AppVcsInfo';
$classes[] = 'Acquia\Cli\Command\App\LinkCommand';
$classes[] = 'Acquia\Cli\Command\App\LogTailCommand';
$classes[] = 'Acquia\Cli\Command\App\NewCommand';
$classes[] = 'Acquia\Cli\Command\App\NewFromDrupal7Command';
$classes[] = 'Acquia\Cli\Command\App\TaskWaitCommand';
$classes[] = 'Acquia\Cli\Command\App\UnlinkCommand';
$classes[] = 'Acquia\Cli\Command\Archive\ArchiveExportCommand';
$classes[] = 'Acquia\Cli\Command\Auth\AuthAcsfLoginCommand';
$classes[] = 'Acquia\Cli\Command\Auth\AuthAcsfLogoutCommand';
$classes[] = 'Acquia\Cli\Command\Auth\AuthLoginCommand';
$classes[] = 'Acquia\Cli\Command\Auth\AuthLogoutCommand';
$classes[] = 'Acquia\Cli\Command\CodeStudio\CodeStudioCiCdVariables';
$classes[] = 'Acquia\Cli\Command\CodeStudio\CodeStudioPhpVersionCommand';
$classes[] = 'Acquia\Cli\Command\CodeStudio\CodeStudioPipelinesMigrateCommand';
$classes[] = 'Acquia\Cli\Command\CodeStudio\CodeStudioWizardCommand';
$classes[] = 'Acquia\Cli\Command\DocsCommand';
$classes[] = 'Acquia\Cli\Command\Env\EnvCertCreateCommand';
$classes[] = 'Acquia\Cli\Command\Env\EnvCopyCronCommand';
$classes[] = 'Acquia\Cli\Command\Env\EnvCreateCommand';
$classes[] = 'Acquia\Cli\Command\Env\EnvDeleteCommand';
$classes[] = 'Acquia\Cli\Command\Env\EnvMirrorCommand';
$classes[] = 'Acquia\Cli\Command\HelloWorldCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeCreateCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeDeleteCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeInfoCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeListCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeListMineCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeOpenCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdePhpVersionCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeServiceRestartCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeServiceStartCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeServiceStopCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeShareCommand';
$classes[] = 'Acquia\Cli\Command\Ide\IdeXdebugToggleCommand';
$classes[] = 'Acquia\Cli\Command\Ide\Wizard\IdeWizardCreateSshKeyCommand';
$classes[] = 'Acquia\Cli\Command\Ide\Wizard\IdeWizardDeleteSshKeyCommand';
$classes[] = 'Acquia\Cli\Command\Pull\PullCodeCommand';
$classes[] = 'Acquia\Cli\Command\Pull\PullCommand';
$classes[] = 'Acquia\Cli\Command\Pull\PullDatabaseCommand';
$classes[] = 'Acquia\Cli\Command\Pull\PullFilesCommand';
$classes[] = 'Acquia\Cli\Command\Pull\PullScriptsCommand';
$classes[] = 'Acquia\Cli\Command\Push\PushArtifactCommand';
$classes[] = 'Acquia\Cli\Command\Push\PushCodeCommand';
$classes[] = 'Acquia\Cli\Command\Push\PushDatabaseCommand';
$classes[] = 'Acquia\Cli\Command\Push\PushFilesCommand';
$classes[] = 'Acquia\Cli\Command\Remote\AliasListCommand';
$classes[] = 'Acquia\Cli\Command\Remote\AliasesDownloadCommand';
$classes[] = 'Acquia\Cli\Command\Remote\DrushCommand';
$classes[] = 'Acquia\Cli\Command\Remote\SshCommand';
$classes[] = 'Acquia\Cli\Command\Self\ClearCacheCommand';
$classes[] = 'Acquia\Cli\Command\Self\ListCommand';
$classes[] = 'Acquia\Cli\Command\Self\MakeDocsCommand';
$classes[] = 'Acquia\Cli\Command\Self\SelfInfoCommand';
$classes[] = 'Acquia\Cli\Command\Self\TelemetryCommand';
$classes[] = 'Acquia\Cli\Command\Self\TelemetryDisableCommand';
$classes[] = 'Acquia\Cli\Command\Self\TelemetryEnableCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyCreateCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyCreateUploadCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyDeleteCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyInfoCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyListCommand';
$classes[] = 'Acquia\Cli\Command\Ssh\SshKeyUploadCommand';
$classes[] = 'Acquia\Cli\Config\AcquiaCliConfig';
$classes[] = 'Acquia\Cli\Config\CloudDataConfig';
$classes[] = 'Acquia\Cli\DataStore\AcquiaCliDatastore';
$classes[] = 'Acquia\Cli\DataStore\CloudDataStore';
$classes[] = 'Acquia\Cli\EventListener\ComposerScriptsListener';
$classes[] = 'Acquia\Cli\EventListener\ExceptionListener';
$classes[] = 'Acquia\Cli\Exception\AcquiaCliException';
$classes[] = 'Acquia\Cli\Helpers\AliasCache';
$classes[] = 'Acquia\Cli\Helpers\DataStoreContract';
$classes[] = 'Acquia\Cli\Helpers\LocalMachineHelper';
$classes[] = 'Acquia\Cli\Helpers\LoopHelper';
$classes[] = 'Acquia\Cli\Helpers\SshHelper';
$classes[] = 'Acquia\Cli\Helpers\TelemetryHelper';
$classes[] = 'Acquia\Cli\Output\Checklist';
$classes[] = 'Acquia\Cli\Output\Spinner\Spinner';
$classes[] = 'Acquia\Cli\Transformer\EnvironmentTransformer';
$classes[] = 'GuzzleHttp\Client';
$classes[] = 'SelfUpdate\SelfUpdateManager';
$classes[] = 'Symfony\Component\Console\Input\ArgvInput';
$classes[] = 'Symfony\Component\Console\Logger\ConsoleLogger';
$classes[] = 'Symfony\Component\Console\Output\ConsoleOutput';
$classes[] = 'Zumba\Amplitude\Amplitude';
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';

$preloaded = Preloader::preload($classes);
<?php



if (\class_exists(\Container9ITmE6s\Acquia_Cli_KernelProdContainer::class, false)) {

} elseif (!include __DIR__.'/Container9ITmE6s/Acquia_Cli_KernelProdContainer.php') {
touch(__DIR__.'/Container9ITmE6s.legacy');

return;
}

if (!\class_exists(Acquia_Cli_KernelProdContainer::class, false)) {
\class_alias(\Container9ITmE6s\Acquia_Cli_KernelProdContainer::class, Acquia_Cli_KernelProdContainer::class, false);
}

return new \Container9ITmE6s\Acquia_Cli_KernelProdContainer([
'container.build_hash' => '9ITmE6s',
'container.build_id' => 'ef7b0289',
'container.build_time' => 1763993203,
'container.runtime_mode' => \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'web=0' : 'web=1',
], __DIR__.\DIRECTORY_SEPARATOR.'Container9ITmE6s');
<?php return array (
);<?php

// This file has been auto-generated by the Symfony Cache Component.

return [[

'acquia-spec.json' => 0,
'acquia-spec.json.checksum' => 1,

], [

0 => [
    'openapi' => '3.0.0',
    'info' => [
        'title' => 'Acquia Cloud API Documentation',
        'x-logo' => [
            'url' => 'assets/cloud-platform.svg',
            'backgroundColor' => '#FFFFFF',
            'altText' => 'Acquia Cloud',
        ],
        'description' => 'Acquia Cloud API'."\n"
            ."\n"
            .'# Compatibility'."\n"
            ."\n"
            .'## Stability'."\n"
            ."\n"
            .'The response for all resource endpoints includes an `X-CloudAPI-Stability` header that indicates what changes, if any, Acquia will make to the resource and how changes will be communicated.'."\n"
            ."\n"
            .'There are three levels of stability:'."\n"
            ."\n"
            .'* `prototype`: A prototype resource is experimental and major changes are likely. A prototype resource may not reach production.'."\n"
            .'    * Compatible and emergency changes may be made with no advance notice'."\n"
            .'    * Disruptive changes may be made with one week notice'."\n"
            .'    * Deprecated resources will remain available for at least one month after deprecation'."\n"
            .'* `development`: A resource that is unlikely to change, but is still being worked on, will be marked as in development. These resources are very likely to reach production.'."\n"
            .'    * Compatible and emergency changes may be made with no advance notice'."\n"
            .'    * Disruptive changes may be made with one month notice'."\n"
            .'    * Deprecated resources will remain available for at least six months after deprecation'."\n"
            .'* `production`: A production resource will not introduce breaking changes within a version, and any breaking changes between versions will be communicated ahead of time.'."\n"
            ."\n"
            .'## Deprecation'."\n"
            ."\n"
            .'Over time, endpoints may become obsolete and will be removed in the future. These endpoints will be marked with an `X-CloudAPI-Deprecated` header indicating the version in which they were deprecated and the reason for the deprecation. Deprecated endpoints may be removed in the next version of the resource.'."\n"
            ."\n"
            .'## Versioning'."\n"
            ."\n"
            .'All resource endpoints are versioned within the API. Endpoints that have reached production will not introduce breaking changes between versions. Non-production endpoints will not version for changes.'."\n"
            ."\n"
            .'A specific version of an endpoint can be requested via the `Accept` header:'."\n"
            ."\n"
            .'    Accept: application/hal+json, version=2'."\n"
            ."\n"
            .'If the version is not specified, the latest version of the endpoint will be used.'."\n"
            ."\n"
            .'Starting with version 3, we will support the current version of an endpoint and the previous version. Version 1 of the API is [provided elsewhere](https://cloudapi.acquia.com/).'."\n"
            ."\n"
            .'## Errors'."\n"
            ."\n"
            .'Some endpoints will return a 503 status when dependent services are unavailable:'."\n"
            ."\n"
            .'    application/hal+json'."\n"
            .'    {'."\n"
            .'        "error": "system",'."\n"
            .'        "message": "This action is currently unavailable. Please try again later."'."\n"
            .'    }'."\n"
            ."\n"
            .'## Authentication'."\n"
            ."\n"
            .'All Acquia Cloud API calls require authentication to work properly.'."\n"
            ."\n"
            .'Learn more: <a href=\'https://docs.acquia.com/acquia-cloud/develop/api/auth/\' target=\'_blank\'>https://docs.acquia.com/acquia-cloud/develop/api/auth/</a>'."\n"
            ."\n"
            .'### Example implementation'."\n"
            ."\n"
            .'An example PHP script for making authenticated API requests can be found <a href=\'https://docs.acquia.com/_downloads/9d4e27bf51dfa0d208e97e0ffcb119c9/api-v2-auth.php\' target=\'_blank\'>here</a>. This script uses the <a href=\'https://oauth2-client.thephpleague.com/\' target=\'_blank\'>League/oauth2-client</a> library, installed via Composer.'."\n",
        'version' => '2.0.0',
        'contact' => [
            'name' => 'Customer Experience Engineering (CXE)',
            'url' => 'https://www.acquia.com',
        ],
    ],
    'servers' => [
        [
            'url' => 'https://cloud.acquia.com/api',
            'description' => 'Cloud API',
        ],
        [
            'url' => '/',
            'description' => '',
        ],
    ],
    'tags' => [
        [
            'name' => 'Current system health',
            'x-displayName' => 'Current system health',
        ],
        [
            'name' => 'Account',
            'x-displayName' => 'Account',
        ],
        [
            'name' => 'Agreements',
            'x-displayName' => 'Agreements',
        ],
        [
            'name' => 'Applications',
            'x-displayName' => 'Applications',
        ],
        [
            'name' => 'Distributions',
            'x-displayName' => 'Distributions',
        ],
        [
            'name' => 'Environments',
            'x-displayName' => 'Environments',
        ],
        [
            'name' => 'Email',
            'x-displayName' => 'Email',
        ],
        [
            'name' => 'Application Performance Monitoring Services',
            'x-displayName' => 'Application Performance Monitoring Services',
        ],
        [
            'name' => 'Cloud IDE',
            'x-displayName' => 'Cloud IDE',
        ],
        [
            'name' => 'Identity Providers',
            'x-displayName' => 'Identity Providers',
        ],
        [
            'name' => 'Invite',
            'x-displayName' => 'Invite',
        ],
        [
            'name' => 'Messages',
            'x-displayName' => 'Messages',
        ],
        [
            'name' => 'Notifications',
            'x-displayName' => 'Notifications',
        ],
        [
            'name' => 'Options',
            'x-displayName' => 'Options',
        ],
        [
            'name' => 'Organizations',
            'x-displayName' => 'Organizations',
        ],
        [
            'name' => 'Teams and Permissions',
            'x-displayName' => 'Teams and Permissions',
        ],
        [
            'name' => 'Subscriptions',
            'x-displayName' => 'Subscriptions',
        ],
        [
            'name' => 'Codebases',
            'x-displayName' => 'Codebases',
        ],
        [
            'name' => 'Private Networks',
            'description' => 'Private Network Service API',
            'x-displayName' => 'Private Networks',
        ],
    ],
    'paths' => [
        '/' => [
            'get' => [
                'tags' => [
                    'Current system health',
                ],
                'summary' => 'Return the current system health status.',
                'description' => 'Returns status checks for system database, configuration and registry.',
                'operationId' => 'getSystemHealthStatus',
                'x-cli-name' => 'system-health-status',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_root',
                                ],
                                'example' => [
                                    'status' => [
                                        'configuration' => true,
                                        'registry' => true,
                                        'acp_provisioning_enabled' => true,
                                        'acf_provisioning_enabled' => true,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                        'account' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/applications',
                                        ],
                                        'distributions' => [
                                            'href' => 'https://cloud.acquia.com/api/distributions',
                                        ],
                                        'identity-providers' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'organizations' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations',
                                        ],
                                        'subscriptions' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions',
                                        ],
                                        'teams' => [
                                            'href' => 'https://cloud.acquia.com/api/teams',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns details about your account.',
                'description' => 'Returns details about your account.',
                'operationId' => 'getAccount',
                'x-cli-name' => 'accounts:find',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user',
                                ],
                                'example' => [
                                    'id' => 1234567,
                                    'uuid' => '82cff7ec-2f09-11e9-b210-d663bd873d93',
                                    'name' => 'jane.doe',
                                    'first_name' => 'Jane',
                                    'last_name' => 'Doe',
                                    'last_login_at' => '2017-03-28T13:07:54-0500',
                                    'created_at' => '2016-07-17T20:35:25.000Z',
                                    'mail' => 'jane.doe@example.com',
                                    'phone' => [
                                        'office' => null,
                                        'mobile' => '5555555555',
                                        'tfa' => '5555555555',
                                    ],
                                    'job_title' => '',
                                    'job_function' => 'IT Executive',
                                    'company' => 'Acquia, Inc.',
                                    'country' => 'United States',
                                    'state' => 'Massachusetts',
                                    'timezone' => 'America/New_York',
                                    'picture_url' => 'https://accounts.acquia.com/images/users/82cff7ec-2f09-11e9-b210-d663bd873d93/style/avatar',
                                    'features' => [
                                        'ci-pipelines',
                                        'on-demand-environments',
                                    ],
                                    'metadata' => [
                                        'applications' => [
                                            'recent' => [
                                                [
                                                    'uuid' => '8b83a104-2f09-11e9-b210-d663bd873d93',
                                                    'recent_at' => '2016-03-04T13:07:54-0500',
                                                ],
                                                [
                                                    'uuid' => '8b83a104-2f09-11e9-b210-d663bd873d93',
                                                    'recent_at' => '2016-03-04T12:01:07-0500',
                                                ],
                                                [
                                                    'uuid' => '8b83a104-2f09-11e9-b210-d663bd873d93',
                                                    'recent_at' => '2016-03-04T12:01:05-0500',
                                                ],
                                            ],
                                            'starred' => [
                                                '987c5c48-2f09-11e9-b210-d663bd873d93',
                                                '9b684e30-2f09-11e9-b210-d663bd873d93',
                                            ],
                                        ],
                                    ],
                                    'flags' => [
                                        'active' => true,
                                        'tfa' => true,
                                        'support' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                        'invites' => [
                                            'href' => 'https://cloud.acquia.com/api/account/invites',
                                        ],
                                        'messages' => [
                                            'href' => 'https://cloud.acquia.com/api/account/messages',
                                        ],
                                        'tokens' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/has-permission' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account has access to a specific application permission.',
                'description' => 'Returns whether your account has access to a specific application permission.',
                'operationId' => 'getAccountApplicationHasPermission',
                'x-cli-name' => 'accounts:application-has-permission',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_permission',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_has-permission',
                                ],
                                'example' => [
                                    'access' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/applications/27a861f0-2fdc-11e9-b210-d663bd873d93/has-permission?permission=deploy%20to%20prod',
                                        ],
                                        'application' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/27a861f0-2fdc-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have the \'example permission\' permission for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Permission not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The permission you are trying to look up does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/is-admin' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is an administrator for an application.',
                'description' => 'Returns whether your account is an administrator for an application.',
                'operationId' => 'getAccountApplicationIsAdministrator',
                'x-cli-name' => 'accounts:is-application-admin',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-administrator',
                                ],
                                'example' => [
                                    'admin' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/applications/27a861f0-2fdc-11e9-b210-d663bd873d93/is-admin',
                                        ],
                                        'application' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/27a861f0-2fdc-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to administer this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/is-owner' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is the owner for an application.',
                'description' => 'Returns whether your account is the owner for an application.',
                'operationId' => 'getAccountApplicationIsOwner',
                'x-cli-name' => 'accounts:is-application-owner',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-owner',
                                ],
                                'example' => [
                                    'owner' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/applications/27a861f0-2fdc-11e9-b210-d663bd873d93/is-owner',
                                        ],
                                        'application' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/27a861f0-2fdc-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/actions/mark-recent' => [
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Marks an application as recently viewed.',
                'description' => 'Marks an application as recently viewed. UUIDs and timestamps of recent applications are present in the "account" endpoint.',
                'operationId' => 'postAccountApplicationMarkRecent',
                'x-cli-name' => 'accounts:application-mark-recent',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Marked as recently viewed' => [
                                        'value' => [
                                            'message' => 'The application has been marked as recently viewed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already on the recently viewed list' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Unable to add an application to the recently viewed list.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/actions/star' => [
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Stars an application.',
                'description' => 'Stars an application. UUIDs of starred applications are present in the "account" endpoint.',
                'operationId' => 'postAccountApplicationStar',
                'x-cli-name' => 'accounts:application-star',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Starred' => [
                                        'value' => [
                                            'message' => 'The application has been starred.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'User does not have access' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not have access to this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Unable to add' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The application has already been starred by this user.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/applications/{applicationUuid}/actions/unstar' => [
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Removes an application from the user\'s starred list.',
                'description' => 'Removes an application from the user\'s starred list. UUIDs of starred applications are present in the "account" endpoint.',
                'operationId' => 'postAccountApplicationUnstar',
                'x-cli-name' => 'accounts:application-unstar',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Starred' => [
                                        'value' => [
                                            'message' => 'The application has been unstarred.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'User does not have access' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not have access to this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Unable to add' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The application is not currently starred by this user.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/drush-aliases/download' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns the drush aliases as a compressed archive download.',
                'description' => 'Returns the drush aliases as a compressed archive download.',
                'operationId' => 'getAccountDrushAliasesDownload',
                'x-cli-name' => 'accounts:drush-aliases',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_drush-version',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/gzip' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Version not supported' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Only Drush 8 and 9 are supported.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No Cloud API key found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'No Cloud API key found for user with email address test@example.com.',
                                        ],
                                    ],
                                    'No applications found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'No hosted applications found for user with email address test@example.com.',
                                        ],
                                    ],
                                    'No aliases found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'No Drush aliases found for user with email address test@example.com.',
                                        ],
                                    ],
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/ides' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns a list of Cloud IDEs associated with the current user.',
                'description' => 'Returns a list of Cloud IDEs associated with the current user.',
                'operationId' => 'getAccountIdes',
                'x-cli-name' => 'accounts:ide-list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ides',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ides',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                'label' => 'IDE Label 1',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.ide.ahdev.cloud',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                'label' => 'IDE Label 2',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.ide.ahdev.cloud',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/cc26f963-6e9e-49df-a159-230f75e455aa',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/invites' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Gets a list of all organization admin and team invites that are pending for the current user.',
                'description' => 'Gets a list of all organization admin and team invites that are pending for the current user.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `mail`'."\n"
                    .'* `token`'."\n"
                    .'* `author`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `mail`'."\n"
                    .'* `token`'."\n"
                    .'* `author`'."\n",
                'operationId' => 'getAccountInvites',
                'x-cli-name' => 'accounts:invites-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_account-invites',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/invites',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'applications' => [
                                                    [
                                                        'uuid' => 'a6a494aa-1316-4867-b681-95e3d77a6b34',
                                                        'name' => 'Example application',
                                                    ],
                                                ],
                                                'author' => [
                                                    'uuid' => '0f1915e8-cd84-4386-94b8-21926fc376f5',
                                                    'username' => 'jane.doe',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'jane.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                                ],
                                                'organization' => [
                                                    'name' => 'Organization Name',
                                                    'uuid' => 'e83c3532-2fe0-11e9-b210-d663bd873d93',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'fe79cb7a-2fe0-11e9-b210-d663bd873d93',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                ],
                                                'team' => [
                                                    'uuid' => '01d73cf8-2fe1-11e9-b210-d663bd873d93',
                                                    'name' => 'Team Name',
                                                ],
                                                'uuid' => 'eb947b2c-2fe0-11e9-b210-d663bd873d93',
                                                'email' => 'invitee@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ec',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/eb947b2c-2fe0-11e9-b210-d663bd873d93',
                                                    ],
                                                    'organization' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/e83c3532-2fe0-11e9-b210-d663bd873d93',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'organization' => [
                                                    'name' => 'Organization Name',
                                                    'uuid' => 'e83c3532-2fe0-11e9-b210-d663bd873d93',
                                                ],
                                                'author' => [
                                                    'uuid' => '0f1915e8-cd84-4386-94b8-21926fc376f5',
                                                    'username' => 'jane.doe',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'jane.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                                ],
                                                'uuid' => '0540f4ba-2fe1-11e9-b210-d663bd873d93',
                                                'email' => 'invitee@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ec',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/0540f4ba-2fe1-11e9-b210-d663bd873d93',
                                                    ],
                                                    'organization' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/e83c3532-2fe0-11e9-b210-d663bd873d93',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/messages' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns a list of messages associated with the current user.',
                'description' => 'Returns a list of messages associated with the current user.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `title`'."\n"
                    .'* `message_type`'."\n"
                    .'* `display_mode`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `title`'."\n"
                    .'* `message_type`'."\n"
                    .'* `display_mode`'."\n",
                'operationId' => 'getAccountMessages',
                'x-cli-name' => 'accounts:messages-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-messages',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/messages',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/messages{?filter}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/messages{?sort}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/messages{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/messages{?offset}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 883581,
                                                'uuid' => '17ff551f-a037-4c0a-a0cb-ad6616ab3aa3',
                                                'title' => 'Example title',
                                                'body' => null,
                                                'url' => null,
                                                'filters' => [
                                                    'type' => 'alert',
                                                    'display_mode' => 'bar',
                                                    'paths' => [],
                                                ],
                                                'flags' => [
                                                    'dismissed' => false,
                                                    'dismissible' => true,
                                                    'active' => true,
                                                ],
                                                'weight' => -1,
                                                'start_at' => '2019-07-07T13:45:00.000Z',
                                                'expire_at' => '2019-07-15T13:45:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2',
                                                    ],
                                                    'dismiss' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2/actions/dismiss',
                                                    ],
                                                    'follow' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2/actions/follow',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 883581,
                                                'uuid' => '17ff551f-a037-4c0a-a0cb-ad6616ab3aa3',
                                                'title' => 'Another example title',
                                                'body' => null,
                                                'url' => null,
                                                'filters' => [
                                                    'type' => 'alert',
                                                    'display_mode' => 'bar',
                                                    'paths' => [],
                                                ],
                                                'flags' => [
                                                    'dismissed' => false,
                                                    'dismissible' => true,
                                                    'active' => true,
                                                ],
                                                'weight' => -1,
                                                'start_at' => '2019-07-07T13:45:00.000Z',
                                                'expire_at' => '2019-07-15T13:45:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2',
                                                    ],
                                                    'dismiss' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2/actions/dismiss',
                                                    ],
                                                    'follow' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/17ff551f-a037-4c0a-a0cb-ad6616ab3aa2/actions/follow',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Messages not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The messages you are trying to view do not exist, or you do not have permission to access them.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/organizations/{organizationUuid}/is-admin' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is an administrator for an organization.',
                'description' => 'Returns whether your account is an administrator for an organization.',
                'operationId' => 'getAccountOrganizationIsAdministrator',
                'x-cli-name' => 'accounts:is-organization-admin',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-administrator',
                                ],
                                'example' => [
                                    'admin' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/organizations/2026962e-2fe4-11e9-b210-d663bd873d93/is-admin',
                                        ],
                                        'organization' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2026962e-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to administer this organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/organizations/{organizationUuid}/is-owner' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is the owner for an organization.',
                'description' => 'Returns whether your account is the owner for an organization.',
                'operationId' => 'getAccountOrganizationIsOwner',
                'x-cli-name' => 'accounts:is-organization-owner',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-owner',
                                ],
                                'example' => [
                                    'owner' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/organizations/2026962e-2fe4-11e9-b210-d663bd873d93/is-owner',
                                        ],
                                        'organization' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2026962e-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/password' => [
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Verifies that the supplied password matches the current user\'s password.',
                'description' => 'Verifies that the supplied password matches the current user\'s password.',
                'operationId' => 'postAccountPassword',
                'x-cli-name' => 'accounts:password-check',
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_password',
                            ],
                            'example' => [
                                'password' => 'mysupersecretpassword',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_password',
                            ],
                            'example' => [
                                'password' => 'mysupersecretpassword',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_password-validation',
                                ],
                                'example' => [
                                    'valid' => true,
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/ssh-keys' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Gets a list of SSH keys associated with the current user.',
                'description' => 'Gets a list of SSH keys associated with the current user.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `label`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `label`'."\n",
                'operationId' => 'getAccountSshKeys',
                'x-cli-name' => 'accounts:ssh-keys-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-keys',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '02905393-65d7-4bef-873b-24593f73d273',
                                                'label' => 'PC Home',
                                                'fingerprint' => '5d:23:fb:45:70:df:ef:ad:ca:bf:81:93:cd:50:26:28',
                                                'created_at' => '2017-05-09T20:30:35.000Z',
                                                'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EADHrfHY17SbrmAAABIwAAAQEAklOUpkTIpNLTGK9Tjom/BWDSUGPl+nafzlZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5HDTYW7hdI4yQVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== example@example.com',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/account/ssh-keys/02905393-65d7-4bef-873b-24593f73d273',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'd40833b3-6ea4-4339-9e2c-4b78e700258b',
                                                'label' => 'Laptop Work',
                                                'fingerprint' => '5b:18:fb:50:55:df:cf:d5:bf:ea:81:23:ef:55:22:29',
                                                'created_at' => '2017-05-09T20:30:35.000Z',
                                                'public_key' => 'ssh-rsa 1yc2EAAAABIwbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDAAAQEAklOUpkDHrfHY17STYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4pSwg0cda3PbAAAAB3NzaCv7kOdJ/MTyBlWXFCRh9lFX5QVkbPp+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== example@example.com',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/account/ssh-keys/d40833b3-6ea4-4339-9e2c-4b78e700258b',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'c40ee264-0023-4f60-815b-d20b44740746',
                                                'label' => 'PC Work',
                                                'fingerprint' => '7c:s3:ab:30:40:da:cf:c5:bf:ca:31:33:ed:58:23:21',
                                                'created_at' => '2017-05-09T20:30:35.000Z',
                                                'public_key' => 'ssh-rsa A1yc2EAAAlOUpkDHrfHY17SbrmTIAAAB3NzaCom/BWDSUGPl+nafzlHDTYW7hdI4yQVkbPppSwg0cda3ABIwAAAQEAkPZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5bv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== example@example.com',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/account/ssh-keys/c40ee264-0023-4f60-815b-d20b44740746',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Installs a new SSH key for the current user.',
                'description' => 'Installs a new SSH key for the current user.',
                'operationId' => 'postAccountSshKeys',
                'x-cli-name' => 'accounts:ssh-key-create',
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key-request',
                            ],
                            'example' => [
                                'label' => 'mykey',
                                'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChwPHzTTDKDpSbpa2+d22LcbQmsw92eLsUK3Fmei1fiGDkd34NsYCN8m7lsi3NbvdMS83CtPQPWiCveYPzFs1/hHc4PYj8opD2CNnr5iWVVbyaulCYHCgVv4aB/ojcexg8q483A4xJeF15TiCr/gu34rK6ucTvC/tn/rCwJBudczvEwt0klqYwv8Cl/ytaQboSuem5KgSjO3lMrb6CWtfSNhE43ZOw+UBFBqxIninN868vGMkIv9VY34Pwj54rPn/ItQd6Ef4B0KHHaGmzK0vfP+AK7FxNMoHnj3iYT33KZNqtDozdn5tYyH/bThPebEtgqUn+/w5l6wZIC/8zzvls/127ngHk+jNa0PlNyS2TxhPUK4NaPHIEnnrlp07JEYC4ImcBjaYCWAdcTcUkcJjwZQkN4bGmyO9cjICH98SdLD/HxqzTHeaYDbAX/Hu9HfaBb5dXLWsjw3Xc6hoVnUUZbMQyfgb0KgxDLh92eNGxJkpZiL0VDNOWCxDWsNpzwhLNkLqCvI6lyxiLaUzvJAk6dPaRhExmCbU1lDO2eR0FdSwC1TEhJOT9eDIK1r2hztZKs2oa5FNFfB/IFHVWasVFC9N2h/r/egB5zsRxC9MqBLRBq95NBxaRSFng6ML5WZSw41Qi4C/JWVm89rdj2WqScDHYyAdwyyppWU4T5c9Fmw== example@example.com',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key-request',
                            ],
                            'example' => [
                                'label' => 'mykey',
                                'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChwPHzTTDKDpSbpa2+d22LcbQmsw92eLsUK3Fmei1fiGDkd34NsYCN8m7lsi3NbvdMS83CtPQPWiCveYPzFs1/hHc4PYj8opD2CNnr5iWVVbyaulCYHCgVv4aB/ojcexg8q483A4xJeF15TiCr/gu34rK6ucTvC/tn/rCwJBudczvEwt0klqYwv8Cl/ytaQboSuem5KgSjO3lMrb6CWtfSNhE43ZOw+UBFBqxIninN868vGMkIv9VY34Pwj54rPn/ItQd6Ef4B0KHHaGmzK0vfP+AK7FxNMoHnj3iYT33KZNqtDozdn5tYyH/bThPebEtgqUn+/w5l6wZIC/8zzvls/127ngHk+jNa0PlNyS2TxhPUK4NaPHIEnnrlp07JEYC4ImcBjaYCWAdcTcUkcJjwZQkN4bGmyO9cjICH98SdLD/HxqzTHeaYDbAX/Hu9HfaBb5dXLWsjw3Xc6hoVnUUZbMQyfgb0KgxDLh92eNGxJkpZiL0VDNOWCxDWsNpzwhLNkLqCvI6lyxiLaUzvJAk6dPaRhExmCbU1lDO2eR0FdSwC1TEhJOT9eDIK1r2hztZKs2oa5FNFfB/IFHVWasVFC9N2h/r/egB5zsRxC9MqBLRBq95NBxaRSFng6ML5WZSw41Qi4C/JWVm89rdj2WqScDHYyAdwyyppWU4T5c9Fmw== example@example.com',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Adding SSH key.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/5fef247f-3c99-42a2-bb3c-69b32a06e7e9',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Label is invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'public_key' => 'The supplied label is invalid: it may only contain letters, numbers and underscores.',
                                            ],
                                        ],
                                    ],
                                    'Public key must be RSA' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'public_key' => 'The supplied public key type is unsupported: it must be RSA (ssh-rsa).',
                                            ],
                                        ],
                                    ],
                                    'Public key is invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'public_key' => 'The supplied public key is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Public key too short' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'public_key' => 'The supplied public key type is too short: it must be at least 4096 bits long.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Key with label already exists' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'An SSH key with this label already exists for this user.',
                                        ],
                                    ],
                                    'Key with public key already exists' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'An SSH key with this public key already exists for this user.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/ssh-keys/{sshKeyUuid}' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Get an SSH key associated with the currently-logged in user.',
                'description' => 'Get an SSH key associated with the currently-logged in user.',
                'operationId' => 'getAccountSshKey',
                'x-cli-name' => 'accounts:ssh-key-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ssh-key-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key',
                                ],
                                'example' => [
                                    'uuid' => 'b2a53dfb-f4e2-4543-814d-7a9aa3793746',
                                    'label' => 'PC Home',
                                    'fingerprint' => '8d:13:fb:50:50:da:cf:c5:bf:ca:31:33:ed:51:27:24',
                                    'created_at' => '2017-05-09T20:30:35.000Z',
                                    'public_key' => 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChwPHzTTDKDpSbpa2+d22LcbQmsw92eLsUK3Fmei1fiGDkd34NsYCN8m7lsi3NbvdMS83CtPQPWiCveYPzFs1/hHc4PYj8opD2CNnr5iWVVbyaulCYHCgVv4aB/ojcexg8q483A4xJeF15TiCr/gu34rK6ucTvC/tn/rCwJBudczvEwt0klqYwv8Cl/ytaQboSuem5KgSjO3lMrb6CWtfSNhE43ZOw+UBFBqxIninN868vGMkIv9VY34Pwj54rPn/ItQd6Ef4B0KHHaGmzK0vfP+AK7FxNMoHnj3iYT33KZNqtDozdn5tYyH/bThPebEtgqUn+/w5l6wZIC/8zzvls/127ngHk+jNa0PlNyS2TxhPUK4NaPHIEnnrlp07JEYC4ImcBjaYCWAdcTcUkcJjwZQkN4bGmyO9cjICH98SdLD/HxqzTHeaYDbAX/Hu9HfaBb5dXLWsjw3Xc6hoVnUUZbMQyfgb0KgxDLh92eNGxJkpZiL0VDNOWCxDWsNpzwhLNkLqCvI6lyxiLaUzvJAk6dPaRhExmCbU1lDO2eR0FdSwC1TEhJOT9eDIK1r2hztZKs2oa5FNFfB/IFHVWasVFC9N2h/r/egB5zsRxC9MqBLRBq95NBxaRSFng6ML5WZSw41Qi4C/JWVm89rdj2WqScDHYyAdwyyppWU4T5c9Fmw== example@example.com',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys/b2a53dfb-f4e2-4543-814d-7a9aa3793746',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account/ssh-keys',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'SSH key missing' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The SSH key does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'SSH key not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The SSH key you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Deletes an SSH key.',
                'description' => 'Deletes an SSH key.',
                'operationId' => 'deleteAccountSshKey',
                'x-cli-name' => 'accounts:ssh-key-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ssh-key-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Removed key' => [
                                        'value' => [
                                            'message' => 'Removed SSH key.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/account/ssh-keys/1acbb1a5-e864-4b8e-a3f9-b1ed462afd25',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/account/ssh-keys',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/519caf5f-007a-4562-a726-37624cff7fd8',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'SSH key missing' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The SSH key does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'SSH key does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'An SSH key with UUID 1df4cb00-2fe9-11e9-b210-d663bd873d93 does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/subscriptions/{subscriptionUuid}/is-admin' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is an administrator for a subscription.',
                'description' => 'Returns whether your account is an administrator for a subscription.',
                'operationId' => 'getAccountSubscriptionIsAdministrator',
                'x-cli-name' => 'accounts:is-subscription-admin',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-administrator',
                                ],
                                'example' => [
                                    'admin' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/subscriptions/b7ff7510-2fe4-11e9-b210-d663bd873d93/is-admin',
                                        ],
                                        'subscription' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/b7ff7510-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to administer this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/subscriptions/{subscriptionUuid}/is-owner' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is the owner for a subscription.',
                'description' => 'Returns whether your account is the owner for a subscription.',
                'operationId' => 'getAccountSubscriptionIsOwner',
                'x-cli-name' => 'accounts:is-subscription-owner',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-owner',
                                ],
                                'example' => [
                                    'owner' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/subscriptions/b7ff7510-2fe4-11e9-b210-d663bd873d93/is-owner',
                                        ],
                                        'subscription' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/b7ff7510-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/teams/{teamUuid}/has-permission' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account has access to a specific team permission.',
                'description' => 'Returns whether your account has access to a specific team permission.',
                'operationId' => 'getAccountTeamHasPermission',
                'x-cli-name' => 'accounts:has-team-permission',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_permission',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_has-permission',
                                ],
                                'example' => [
                                    'access' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/teams/e5b32204-2fe4-11e9-b210-d663bd873d93/has-permission?permission=deploy%20to%20prod',
                                        ],
                                        'team' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/e5b32204-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have the \'example permission\' permission for this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Team not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Permission not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The permission you are trying to look up does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/teams/{teamUuid}/is-admin' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is an administrator for a team.',
                'description' => 'Returns whether your account is an administrator for a team.',
                'operationId' => 'getAccountTeamIsAdministrator',
                'x-cli-name' => 'accounts:is-team-admin',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-administrator',
                                ],
                                'example' => [
                                    'admin' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/teams/e5b32204-2fe4-11e9-b210-d663bd873d93/is-admin',
                                        ],
                                        'team' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/e5b32204-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Do not have permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to administer this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/teams/{teamUuid}/is-owner' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns whether your account is the owner for a team.',
                'description' => 'Returns whether your account is the owner for a team.',
                'operationId' => 'getAccountTeamIsOwner',
                'x-cli-name' => 'accounts:is-team-owner',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-owner',
                                ],
                                'example' => [
                                    'owner' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/teams/e5b32204-2fe4-11e9-b210-d663bd873d93/is-owner',
                                        ],
                                        'team' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/e5b32204-2fe4-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/tokens' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Returns a list of metadata for API access tokens tied to your account.',
                'description' => 'Returns a list of metadata for API access tokens tied to your account.',
                'operationId' => 'getAccountTokens',
                'x-cli-name' => 'accounts:tokens-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_tokens',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '17feaf34-5d04-402b-9a67-15d5161d24e1',
                                                'active' => true,
                                                'label' => 'My First App',
                                                'created_at' => '2016-01-22T17:41:57-0500',
                                                'flags' => [
                                                    'active' => true,
                                                ],
                                                'revocation' => null,
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/account/tokens/17feaf34-5d04-402b-9a67-15d5161d24e1',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '81e8965d-0af0-460d-9e46-977dfcc38c29',
                                                'active' => true,
                                                'label' => 'My Second App',
                                                'created_at' => '2016-01-22T17:55:15-0500',
                                                'flags' => [
                                                    'active' => true,
                                                ],
                                                'revocation' => null,
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/account/tokens/81e8965d-0af0-460d-9e46-977dfcc38c29',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Creates an API access token tied to your account.',
                'description' => 'Creates an API access token tied to your account.',
                'operationId' => 'postAccountTokens',
                'x-cli-name' => 'accounts:token-create',
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token-request',
                            ],
                            'example' => [
                                'label' => 'API token for My App',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token-request',
                            ],
                            'example' => [
                                'label' => 'API token for My App',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    201 => [
                        'description' => 'Created',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token-creation',
                                ],
                                'example' => [
                                    'api_key' => '137bd484-dcc8-4950-a784-1f01de7f6378',
                                    'api_secret' => '4DmbUmGiUkafdjcZk2yV6u17jPmmunwt8/47mKdAQIc=',
                                    'client_id' => '137bd484-dcc8-4950-a784-1f01de7f6378',
                                    'client_secret' => '4DmbUmGiUkafdjcZk2yV6u17jPmmunwt8/47mKdAQIc=',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/ab142771-826e-42b0-a53c-e112b70448d2',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user does not exist, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/account/tokens/{tokenUuid}' => [
            'get' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Return details about a specific token.',
                'description' => 'Return details about a specific token.',
                'operationId' => 'getAccountToken',
                'x-cli-name' => 'accounts:token-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token',
                                ],
                                'example' => [
                                    'uuid' => '17feaf34-5d04-402b-9a67-15d5161d24e1',
                                    'active' => true,
                                    'label' => 'My App v1.0',
                                    'created_at' => '2016-01-22T17:41:57-0500',
                                    'revocation' => null,
                                    'flags' => [
                                        'active' => true,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens/17feaf34-5d04-402b-9a67-15d5161d24e1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Token not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The access token does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Account',
                ],
                'summary' => 'Revokes an access token.',
                'description' => 'Revokes an access token. This action will prevent the access token from being able to authorize access to the API in the future.',
                'operationId' => 'deleteAccountToken',
                'x-cli-name' => 'accounts:token-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token-delete-reason',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The access token has been revoked.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens/03c86402-5e3b-4212-b6fd-009d271da1d0',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/account/tokens',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/7815f68b-fc52-4dc8-bdde-04d0960943e9',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The access token does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already revoked' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The access token has already been revoked.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/agreements' => [
            'get' => [
                'tags' => [
                    'Agreements',
                ],
                'summary' => 'Return a list of agreements.',
                'description' => 'Returns a list of agreements you have been invited to accept or decline.',
                'operationId' => 'getAgreements',
                'x-cli-name' => 'agreements:list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_agreements',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'efc62c93-8203-4e8b-a8ff-4d18b780d4ab',
                                                'document_uuid' => 'f25d0284-f25f-4e59-9c48-7c39ae57b400',
                                                'title' => 'Agreement Title',
                                                'body' => '<p>Agreement body and text.</p>',
                                                'status' => 'accepted',
                                                'created_at' => '2017-01-23T12:00:00.000Z',
                                                'updated_at' => '2017-01-27T12:00:00.000Z',
                                                'actioned_by' => [
                                                    'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                    'first_name' => 'James',
                                                    'last_name' => 'Kirk',
                                                    'mail' => 'james.kirk@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/avatars/456def?mail=james.kirk@example.com',
                                                    'username' => 'james.kirk',
                                                ],
                                                'reference' => [
                                                    'uuid' => '9ab09eba-290d-4ed9-be4d-fa194ab92f39',
                                                    'name' => 'Acquia Subscription',
                                                    'type' => 'subscription',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/agreements/efc62c93-8203-4e8b-a8ff-4d18b780d4ab',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'b63fff64-6c18-4899-acba-00ec6c8930e9',
                                                'document_uuid' => '20370a6e-9b82-4580-8769-886f5f6c8693',
                                                'title' => 'Another Agreement',
                                                'body' => '<p>This is the body and text of another agreement.</p>',
                                                'status' => 'declined',
                                                'created_at' => '2017-02-23T12:00:00.000Z',
                                                'updated_at' => '2017-02-27T12:00:00.000Z',
                                                'actioned_by' => [
                                                    'uuid' => '550e8400-e29b-41d4-a716-446655440000',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'jane.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/avatars/123abc?mail=jane.doe@example.com',
                                                    'username' => 'jane.doe',
                                                ],
                                                'reference' => [
                                                    'uuid' => '9ab09eba-290d-4ed9-be4d-fa194ab92f39',
                                                    'name' => 'Acquia Subscription',
                                                    'type' => 'subscription',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/agreements/b63fff64-6c18-4899-acba-00ec6c8930e9',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'a8777880-8924-494a-abe2-62cc092df269',
                                                'document_uuid' => '466c62ef-5ced-400d-b328-d47e745b50a8',
                                                'title' => 'A Third Agreement',
                                                'body' => '<p>This is the body and text of one more agreement.</p>',
                                                'status' => 'pending',
                                                'created_at' => '2017-02-23T12:00:00.000Z',
                                                'updated_at' => null,
                                                'actioned_by' => null,
                                                'reference' => [
                                                    'uuid' => '9ab09eba-290d-4ed9-be4d-fa194ab92f39',
                                                    'name' => 'Acquia Subscription',
                                                    'type' => 'subscription',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/agreements/a8777880-8924-494a-abe2-62cc092df269',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The agreement you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/agreements/{agreementUuid}' => [
            'get' => [
                'tags' => [
                    'Agreements',
                ],
                'summary' => 'Return a specific agreement by a provided UUID.',
                'description' => 'Return a specific agreement.',
                'operationId' => 'getAgreement',
                'x-cli-name' => 'agreements:find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_agreement-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_agreement',
                                ],
                                'example' => [
                                    'uuid' => 'efc62c93-8203-4e8b-a8ff-4d18b780d4ab',
                                    'document_uuid' => 'f25d0284-f25f-4e59-9c48-7c39ae57b400',
                                    'title' => 'Agreement Title',
                                    'body' => '<p>Agreement body and text.</p>',
                                    'status' => 'accepted',
                                    'created_at' => '2017-01-23T12:00:00.000Z',
                                    'updated_at' => '2017-01-27T12:00:00.000Z',
                                    'actioned_by' => [
                                        'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                        'first_name' => 'James',
                                        'last_name' => 'Kirk',
                                        'mail' => 'james.kirk@example.com',
                                        'picture_url' => 'https://accounts.acquia.com/sites/default/avatars/456def?mail=james.kirk@example.com',
                                        'username' => 'james.kirk',
                                    ],
                                    'reference' => [
                                        'uuid' => '9ab09eba-290d-4ed9-be4d-fa194ab92f39',
                                        'name' => 'Acquia Subscription',
                                        'type' => 'subscription',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements/efc62c93-8203-4e8b-a8ff-4d18b780d4ab',
                                        ],
                                        'invitees' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements/efc62c93-8203-4e8b-a8ff-4d18b780d4ab/invitees',
                                        ],
                                        'subscription' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9ab09eba-290d-4ed9-be4d-fa194ab92f39',
                                        ],
                                        'actioned_by' => [
                                            'href' => 'https://cloud.acquia.com/api/users/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The agreement you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/agreements/{agreementUuid}/actions/accept' => [
            'post' => [
                'tags' => [
                    'Agreements',
                ],
                'summary' => 'Accepts a legal agreement by UUID.',
                'description' => 'Accepts a legal agreement.',
                'operationId' => 'postAcceptAgreement',
                'x-cli-name' => 'agreements:accept',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_agreement-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'The agreement has been accepted.',
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The agreement you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already acted upon' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This agreement has already been acted upon.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/agreements/{agreementUuid}/actions/decline' => [
            'post' => [
                'tags' => [
                    'Agreements',
                ],
                'summary' => 'Declines a legal agreement by UUID.',
                'description' => 'Declines a legal agreement.',
                'operationId' => 'postDeclineAgreement',
                'x-cli-name' => 'agreements:decline',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_agreement-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'The agreement has been declined.',
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The agreement you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already acted upon' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This agreement has already been acted upon.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/agreements/{agreementUuid}/invitees' => [
            'get' => [
                'tags' => [
                    'Agreements',
                ],
                'summary' => 'Returns a list of users invited to action this agreement.',
                'description' => 'Returns a list of users invited to action this agreement by UUID.',
                'operationId' => 'getInvitees',
                'x-cli-name' => 'agreements:invitees-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_agreement-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invitees',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements/efc62c93-8203-4e8b-a8ff-4d18b780d4ab/invitees',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/agreements/efc62c93-8203-4e8b-a8ff-4d18b780d4ab',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '6188cbcf-b176-4554-b17e-fbd8119ef46d',
                                                'first_name' => 'User',
                                                'last_name' => 'One',
                                                'mail' => 'user1@example.com',
                                                'username' => 'user.one',
                                                'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                            ],
                                            [
                                                'uuid' => '099a8a59-88d6-48c2-a121-ef29431f4aba',
                                                'first_name' => 'User',
                                                'last_name' => 'Two',
                                                'mail' => 'user2@example.com',
                                                'username' => 'user.two',
                                                'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The agreement you are trying to access does not exist, or you do not have permission to access it.a',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return a list of applications the current user has access to.',
                'operationId' => 'getApplications',
                'x-cli-name' => 'applications:list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Applications contains the code, files, and databases required to run sites. You have access to an application if you are a member of a team that has access to an application, or if you are an administrator or owner of the organization that the application belongs to. A subscription may contain one or more applications.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `label`'."\n"
                    .'* <s>`name`</s> (Deprecated)'."\n"
                    .'* `organization_name`'."\n"
                    .'* <s>`hosting`</s> (Deprecated) Use URL encoded colon (%3A) to separate realm and sitegroup, e.g. network%3An3 instead of network:n3'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `label`'."\n"
                    .'* <s>`name`</s>  (Deprecated)'."\n"
                    .'* `organization_name`'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 10,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications?limit=10',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                                    'name' => 'Sample organization',
                                                ],
                                                'type' => 'node',
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return details about a specific application.',
                'operationId' => 'getApplicationByUuid',
                'x-cli-name' => 'applications:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'A specific application.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application',
                                ],
                                'example' => [
                                    'id' => 2416431,
                                    'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                    'name' => 'Sample application',
                                    'hosting' => [
                                        'type' => 'acp',
                                        'id' => 'devcloud:devcloud2',
                                    ],
                                    'subscription' => [
                                        'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'Sample subscription',
                                    ],
                                    'organization' => [
                                        'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                        'name' => 'Sample organization',
                                    ],
                                    'flags' => [
                                        'remote_admin' => true,
                                    ],
                                    'type' => 'drupal',
                                    'status' => 'normal',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                        'code' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/code',
                                        ],
                                        'databases' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/databases',
                                        ],
                                        'environments' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/environments',
                                        ],
                                        'events' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/events',
                                        ],
                                        'features' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/features',
                                        ],
                                        'ides' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/ides',
                                        ],
                                        'permissions' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/permissions',
                                        ],
                                        'search' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/search',
                                        ],
                                        'settings' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/settings',
                                        ],
                                        'tasks' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tasks',
                                        ],
                                        'teams' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/teams',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'subscription' => [
                                            'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                            'name' => 'Sample subscription',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                            ],
                                        ],
                                        'organization' => [
                                            'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                            'name' => 'Sample organization',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/organizations/6a907396-abfd-4d01-9da6-64c8efc04519',
                                                ],
                                            ],
                                        ],
                                        'tags' => [
                                            [
                                                'name' => 'tag-1',
                                                'color' => 'blue',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'tag-2',
                                                'color' => 'green',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Renames an application.',
                'operationId' => 'putApplicationByUuid',
                'x-cli-name' => 'applications:rename',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Renames a specific application.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the application.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new application name',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the application.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new application name',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Application renamed.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/db1d0e46-6799-4208-9786-c7e64150a7c7',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/27698331-bcf9-48e9-9f12-931ac88f446f',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Name already in use' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'You already have an application with this name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to modify this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application with UUID a47ac10b-58cc-4372-a567-0e02b2c3d470 does not exist.',
                                        ],
                                    ],
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Name in use' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The new application name is the same as the old application name. No action taken.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/artifacts' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return application artifacts.',
                'operationId' => 'getArtifactsByApplicationUuid',
                'x-cli-name' => 'applications:artifact-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Returns a list of this application\'s build artifacts. Only available for Node.js applications.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `created`'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `created`'."\n"
                    .'* `name`'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifacts',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts{?limit}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 1,
                                                'name' => 'master@e5a80b9e0a2bdb1df32c6cdfce54deb70cc20ad2',
                                                'state' => 'ready',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts/1',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 2,
                                                'name' => 'master@a265389db6a6918cf4e51edbe5f06d7e1578175c',
                                                'state' => 'pending-upload',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts/2',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 3,
                                                'name' => 'master@e7157f36e5fb82317ffee2fc2d70302cdad0c60c',
                                                'state' => 'deleted',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts/3',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Application type' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Artifacts are only available for Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/artifacts/{artifactId}' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return details about a specific artifact.',
                'operationId' => 'getArtifactByApplicationUuidAndId',
                'x-cli-name' => 'applications:artifact-find',
                'description' => 'A specific artifact.'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_artifact-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifact',
                                ],
                                'example' => [
                                    'id' => 1,
                                    'name' => 'master@e5a80b9e0a2bdb1df32c6cdfce54deb70cc20ad2',
                                    'state' => 'ready',
                                    'created_at' => '2012-05-15T12:00:00.000Z',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts/1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/artifacts',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application with UUID a47ac10b-58cc-4372-a567-0e02b2c3d470 does not exist.',
                                        ],
                                    ],
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No artifact' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The build artifact you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Application type' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Artifacts are only available for Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/code' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return application branches and release tags.',
                'operationId' => 'getCodeByApplicationUuid',
                'x-cli-name' => 'applications:vcs-info',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Returns a list of branches and release (repository) tags in this application\'s version control system.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code',
                                ],
                                'example' => [
                                    'total' => 4,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/code',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'master',
                                                'flags' => [
                                                    'tag' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'feature-branch',
                                                'flags' => [
                                                    'tag' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'tags/2014-09-03',
                                                'flags' => [
                                                    'tag' => true,
                                                ],
                                            ],
                                            [
                                                'name' => 'tags/2014-09-03.0',
                                                'flags' => [
                                                    'tag' => true,
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No VCS Settings' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'No version control system settings found on non-hosted application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/code-studio' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns details about the Code Studio project for an application.',
                'description' => 'Return details about the Code Studio project for an application.',
                'operationId' => 'getCodeStudioProject',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-project',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/906c1ad5-f367-4127-b529-9dbe29bc5c1c/code-studio',
                                        ],
                                        'application' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/906c1ad5-f367-4127-b529-9dbe29bc5c1c',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/906c1ad5-f367-4127-b529-9dbe29bc5c1c',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/applications',
                                        ],
                                        'code-studio' => [
                                            'href' => 'https://code.acquia.com/path/to/project',
                                        ],
                                        'code-studio-api' => [
                                            'href' => 'https://code.acquia.com/api/v4/path/to/project',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'application' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/906c1ad5-f367-4127-b529-9dbe29bc5c1c',
                                                ],
                                            ],
                                            'uuid' => '906c1ad5-f367-4127-b529-9dbe29bc5c1c',
                                            'name' => 'My Application',
                                        ],
                                    ],
                                    'application_id' => '906c1ad5-f367-4127-b529-9dbe29bc5c1c',
                                    'status' => 'active',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Code Studio not enabled for application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Code Studio is not enabled for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Creates the Code Studio project for an application.',
                'description' => 'Creates the Code Studio project for an application.',
                'operationId' => 'postCodeStudioProject',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/98529a07-5f07-4c4d-836b-03c9226c03fd/code-studio',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/e0c0ec4d-cb4d-4b9a-92ed-503d1e8dae4a',
                                        ],
                                    ],
                                    'message' => 'A Code Studio project is being created for the Application.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to create a Code Studio project for this Application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Removes the Code Studio project from an application.',
                'description' => 'Removes the Code Studio project from an application.',
                'operationId' => 'deleteCodeStudioProject',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/98529a07-5f07-4c4d-836b-03c9226c03fd/code-studio',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/e0c0ec4d-cb4d-4b9a-92ed-503d1e8dae4a',
                                        ],
                                    ],
                                    'message' => 'The Code Studio project is being removed from the Application.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove the Code Studio project from this Application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/databases' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list database names for the application.',
                'description' => 'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getApplicationDatabases',
                'x-cli-name' => 'applications:database-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-databases',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/databases',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/databases{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/databases{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/databases{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'database1',
                                            ],
                                            [
                                                'name' => 'database2',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No data or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on Node.js' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on Node.js applications.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Creates a database.',
                'description' => 'This action will create a new database within each environment of the application.',
                'operationId' => 'postApplicationDatabaseCreate',
                'x-cli-name' => 'applications:database-create',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'description' => 'Application database name.',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The database name.',
                                        'minLength' => 1,
                                        'maxLength' => 63,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'my_db_name',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'description' => 'Application database name.',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The database name.',
                                        'minLength' => 1,
                                        'maxLength' => 63,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'my_db_name',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The database is being created.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/databases',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/6992a41d-a953-4ded-ae99-41d2f4d62f69',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Only available for hosted applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases can only be added on Acquia-hosted applications.',
                                            ],
                                        ],
                                    ],
                                    'Not available on Site Factory applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases cannot be added on Acquia Cloud Site Factory applications.',
                                            ],
                                        ],
                                    ],
                                    'Name cannot be default' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The database name cannot be "default".',
                                            ],
                                        ],
                                    ],
                                    'Name can only be alphanumeric and underscores' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The database name can only contain alphanumeric characters and underscores.',
                                            ],
                                        ],
                                    ],
                                    'Name cannot exceed 63 characters in length' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The database name cannot exceed 63 characters in length.',
                                            ],
                                        ],
                                    ],
                                    'Name already in use' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'A database with that name already exists. Please choose another name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to add a database to this application.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be added to non-hosted applications.',
                                        ],
                                    ],
                                    'ACSF application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be added to Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Node.js application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be added on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/databases/{name}' => [
            'delete' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Drops (deletes) a database.',
                'description' => 'This action will delete the database in ALL environments within this application.',
                'operationId' => 'postApplicationDatabaseDelete',
                'x-cli-name' => 'applications:database-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_name',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The database is being deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/f75e226b-2d8c-48c7-b3a7-614bb440272d/databases/testdatabase',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/a90295b6-f50f-4670-8ca4-bb936a55c3a3',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/f75e226b-2d8c-48c7-b3a7-614bb440272d/databases',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Can only be erased on hosted applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases can only be erased on Acquia-hosted applications.',
                                            ],
                                        ],
                                    ],
                                    'Can only be erased on free tier applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases can only be erased on Acquia Free Tier applications.',
                                            ],
                                        ],
                                    ],
                                    'Does not belong to application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The database does not belong to this application, and cannot be removed.',
                                            ],
                                        ],
                                    ],
                                    'Cannot delete default' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The database is a default database, and cannot be removed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this database.',
                                        ],
                                    ],
                                    'Non hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be deleted on non-hosted applications.',
                                        ],
                                    ],
                                    'ACSF application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be deleted on Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Node.js application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be erased on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/databases/{name}/actions/erase' => [
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Erases (truncates) a database.',
                'description' => 'This action will delete all tables of the database in ALL environments within this application.',
                'operationId' => 'postApplicationDatabaseErase',
                'x-cli-name' => 'applications:database-erase',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_name',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The database is being erased.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/da1c0a8e-ff69-45db-88fc-acd6d2affbb7/databases/test_database/actions/erase',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/a90295b6-f50f-4670-8ca4-bb936a55c3a3',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/da1c0a8e-ff69-45db-88fc-acd6d2affbb7/databases/test_database/actions',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Can only be erased on hosted applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases can only be erased on Acquia-hosted applications.',
                                            ],
                                        ],
                                    ],
                                    'Can only be erased on free tier applications' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Databases can only be erased on Acquia Free Tier applications.',
                                            ],
                                        ],
                                    ],
                                    'Does not belong to application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The database does not belong to this application, and cannot be removed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'ACF only' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Only Acquia Cloud Free subscriptions can erase databases.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to erase this database.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be erased on non-hosted applications.',
                                        ],
                                    ],
                                    'Service Management-enabled application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be erased on Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Node.js application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be erased on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/email/domains' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of email domains associated with the application.',
                'description' => 'Returns a list of email domains associated with the application and domains that have been verified at the subscription level.',
                'operationId' => 'getApplicationEmailDomains',
                'x-cli-name' => 'applications:email-domains-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email-domains',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/email/domains',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/email',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/email/domains{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications123e4567-e89b-12d3-a456-426614174000/email/domains{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/email/domains{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/email/domains{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '123e4567-e89b-12d3-a456-426614174000',
                                                'domain_name' => 'example.com',
                                                'flags' => [
                                                    'associated' => true,
                                                ],
                                                'health' => [
                                                    'code' => '200',
                                                    'details' => '',
                                                    'summary' => 'OK',
                                                ],
                                            ],
                                            [
                                                'uuid' => '123e4567-e89b-12d3-a456-426614174000',
                                                'domain_name' => 'example2.com',
                                                'flags' => [
                                                    'associated' => true,
                                                ],
                                                'health' => [
                                                    'code' => '200',
                                                    'details' => '',
                                                    'summary' => 'OK',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage email domains for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No data or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/email/domains/{domainRegistrationUuid}/actions/associate' => [
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Associates an email domain with an Application.',
                'description' => 'Associates an email domain with an Application.',
                'operationId' => 'postApplicationAssociateEmailDomain',
                'x-cli-name' => 'applications:post-associate-email-domain',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Associate Domain' => [
                                        'value' => [
                                            'message' => 'The domain has been associated with the application.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/domains//123e4567-e89b-12d3-a456-426614174000/actions/associate',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/domains//123e4567-e89b-12d3-a456-426614174000',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/123e4567-e89b-12d3-a456-426614174000',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to associate domains with this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to associate a domain registration with does not exist or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Domain not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to associate does not exist or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform Email is not available for this subscription.',
                                        ],
                                    ],
                                    'Already associated' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The domain example.com is already associated with this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/email/domains/{domainRegistrationUuid}/actions/disassociate' => [
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Disassociates an email domain with an Application.',
                'description' => 'Disassociates an email domain with an Application.',
                'operationId' => 'postApplicationDisassociateEmailDomain',
                'x-cli-name' => 'applications:post-disassociate-email-domains',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Disassociate Domain' => [
                                        'value' => [
                                            'message' => 'The domain has been disassociated from the application.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000/actions/dissasociate',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/123e4567-e89b-12d3-a456-426614174000',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to disassociate domains from this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to disassociate a domain registration from does not exist or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Domain not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to disassociate does not exist or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Domain minimum' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The application must have at least one associated domain while Platform Email is enabled on an environment.',
                                        ],
                                    ],
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform Email is not available for this subscription.',
                                        ],
                                    ],
                                    'Not associated' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The domain example.com is not associated with this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/ides' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of Cloud IDEs associated with this application.',
                'description' => 'Returns a list of Cloud IDEs associated with this application.',
                'operationId' => 'getApplicationIdes',
                'x-cli-name' => 'applications:ide-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ides',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/feea197a-9503-4441-9f49-b4d420b0ecf8/ides',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/feea197a-9503-4441-9f49-b4d420b0ecf8',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                'label' => 'IDE Label 1',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.ides.acquia.com',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'owner' => [
                                                        'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                        'first_name' => 'First',
                                                        'last_name' => 'Last',
                                                        'last_login_at' => '2019-01-31T15:53:11.000Z',
                                                        'created_at' => '2016-08-14T21:38:59.000Z',
                                                        'email' => 'user.name@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                        'username' => 'user.name',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                'label' => 'IDE Label 2',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.ides.acquia.com',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'owner' => [
                                                        'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                        'first_name' => 'First',
                                                        'last_name' => 'Last',
                                                        'last_login_at' => '2019-01-31T15:53:11.000Z',
                                                        'created_at' => '2016-08-14T21:38:59.000Z',
                                                        'email' => 'user.name@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                        'username' => 'user.name',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Creates a new Cloud IDE.',
                'description' => 'Creates a new Cloud IDE.',
                'operationId' => 'postApplicationsIde',
                'x-cli-name' => 'ide:create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The label of the Cloud IDE.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'My new IDE',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The label of the Cloud IDE.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'My new IDE',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'IDE created' => [
                                        'value' => [
                                            'message' => 'The Cloud IDE is being created.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/ides/1792767d-1ee3-4b5f-83a8-334dfdc2b8a3',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/ides',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/e47da6d7-371e-4bb9-a7fe-d9ab8aa899c3',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Bad IDE label' => [
                                        'value' => [
                                            'error' => 'validation_error',
                                            'message' => [
                                                'name' => 'A Cloud IDE labeled My new IDE already exists.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The Application with UUID 3c6a3d3e-c3ee-4fee-97d6-9074971feb76 does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/messages' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of messages associated with this application.',
                'description' => 'Filterable fields:'."\n"
                    .'* `title`'."\n"
                    .'* `message_type`'."\n"
                    .'* `display_mode`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `title`'."\n"
                    .'* `message_type`'."\n"
                    .'* `display_mode`'."\n",
                'operationId' => 'getApplicationMessages',
                'x-cli-name' => 'applications:message-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-messages',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a838f9a8-11e2-c374-6954-6931d150b259/messages',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a838f9a8-11e2-c374-6954-6931d150b259/messages{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a838f9a8-11e2-c374-6954-6931d150b259/messages{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a838f9a8-11e2-c374-6954-6931d150b259/messages{?limit}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 123,
                                                'uuid' => '77fedb64-b8c0-4712-90e3-f39b4716e623',
                                                'title' => 'IPM Title',
                                                'body' => 'This is the body of <strong>the</strong> IPM.',
                                                'url' => 'http://www.acquia.com',
                                                'filters' => [
                                                    'paths' => [
                                                        '/some/random/path',
                                                        '/other/random/path',
                                                    ],
                                                    'display_mode' => 'bar',
                                                    'type' => 'general',
                                                ],
                                                'flags' => [
                                                    'dismissed' => false,
                                                    'dismissible' => true,
                                                    'active' => true,
                                                ],
                                                'weight' => -1,
                                                'start_at' => '2015-11-05T05:30:00.000Z',
                                                'expire_at' => '2015-12-05T18:30:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/77fedb64-b8c0-4712-90e3-f39b4716e623',
                                                    ],
                                                    'dismiss' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/77fedb64-b8c0-4712-90e3-f39b4716e623/actions/dismiss',
                                                    ],
                                                    'follow' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/77fedb64-b8c0-4712-90e3-f39b4716e623/actions/follow',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 234,
                                                'uuid' => 'c5328e00-282a-4bec-a3c8-4322d97545b2',
                                                'title' => 'IPM Message 2',
                                                'body' => 'IPM <strong>Message</strong> 2 body',
                                                'url' => 'http://www.google.ca',
                                                'filters' => [
                                                    'paths' => [],
                                                    'display_mode' => 'bar',
                                                    'type' => 'new',
                                                ],
                                                'flags' => [
                                                    'dismissed' => false,
                                                    'dismissible' => true,
                                                    'active' => true,
                                                ],
                                                'weight' => 0,
                                                'start_at' => '2015-11-07T22:30:00.000Z',
                                                'expire_at' => '2016-11-07T22:30:00.000Z',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/c5328e00-282a-4bec-a3c8-4322d97545b2',
                                                    ],
                                                    'dismiss' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/c5328e00-282a-4bec-a3c8-4322d97545b2/actions/dismiss',
                                                    ],
                                                    'follow' => [
                                                        'href' => 'https://cloud.acquia.com/api/messages/c5328e00-282a-4bec-a3c8-4322d97545b2/actions/follow',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/notifications' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of notifications associated with this application by its UUID.',
                'description' => 'Returns a list of notifications associated with this application. A notification represents an item of work to be done, initiated by someone (typically the current user) associated with the application.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `event`'."\n"
                    .'* `label`'."\n"
                    .'* `description`'."\n"
                    .'* `status`'."\n"
                    .'* `author`'."\n"
                    .'* `created_at`'."\n"
                    .'* `completed_at`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `event`'."\n"
                    .'* `label`'."\n"
                    .'* `description`'."\n"
                    .'* `status`'."\n"
                    .'* `author`'."\n"
                    .'* `created_at`'."\n"
                    .'* `completed_at`'."\n",
                'operationId' => 'getApplicationNotifications',
                'x-cli-name' => 'applications:notification-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-notifications',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'total' => 1,
                                        'limit' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/notifications',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/notifications{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/notifications{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/notifications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a027502b-ad6c-a48e-a7e8-aa0def7d25e1/notifications{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '1bd3487e-71d1-4fca-a2d9-5f969b3d35c1',
                                                'event' => 'ApplicationAddedToRecents',
                                                'label' => 'Application added to recents list',
                                                'description' => '"Canary QA 11 - ACE" was added to your recent applications list.',
                                                'created_at' => '2019-07-29T20:47:13.000Z',
                                                'completed_at' => '2019-07-29T20:47:13.000Z',
                                                'status' => 'completed',
                                                'progress' => 100,
                                                'context' => [
                                                    'author' => [
                                                        'uuid' => '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                                        'actual_uuid' => '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                                    ],
                                                    'user' => [
                                                        'uuids' => [
                                                            '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            'a027502b-ad6c-a48e-a7e8-aa0def7d25e1',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/notifications/1bd3487e-71d1-4fca-a2d9-5f969b3d35c1',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/notifications',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/permissions' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of permissions the user has for this application by its UUID.',
                'description' => 'Returns a list of permissions the user has for this application.',
                'operationId' => 'getApplicationPermissions',
                'x-cli-name' => 'applications:permission-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-permissions',
                                ],
                                'example' => [
                                    'total' => 49,
                                    'flags' => [
                                        'administrator' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/permissions',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'deploy to non-prod',
                                                'label' => 'Pull and deploy code, files, or databases to non-production environments',
                                                'description' => 'Grants the ability to enable or disable live development and non-production work.',
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'deploy to prod',
                                                'label' => 'Deploy code, files, or databases to the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'pull from prod',
                                                'label' => 'Pull files or databases from the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file to non-prod',
                                                'label' => 'Move files to non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file to prod',
                                                'label' => 'Move files to the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file from prod',
                                                'label' => 'Move files from production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file from non-prod',
                                                'label' => 'Move files from non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear varnish on non-prod',
                                                'label' => 'Clear Varnish cache for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => true,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear varnish on prod',
                                                'label' => 'Clear Varnish cache for the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => true,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure prod env',
                                                'label' => 'Configure production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure non-prod env',
                                                'label' => 'Configure non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add an environment',
                                                'label' => 'Add an environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'delete an environment',
                                                'label' => 'Delete an environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer domain non-prod',
                                                'label' => 'Add or remove domains for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer domain prod',
                                                'label' => 'Add or remove domains for the production environment',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer ssl prod',
                                                'label' => 'Add or remove SSL certificates for the production environment',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer ssl non-prod',
                                                'label' => 'Add or remove SSL certificates for the non-production environments',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'reboot server',
                                                'label' => 'Reboot server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'resize server',
                                                'label' => 'Resize server',
                                                'description' => 'Increasing the size of your server costs money.',
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'suspend server',
                                                'label' => 'Suspend server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure server',
                                                'label' => 'Configure server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download logs non-prod',
                                                'label' => 'Download logs for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Logs',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download logs prod',
                                                'label' => 'Download logs for the production environment',
                                                'description' => null,
                                                'group_label' => 'Logs',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add database',
                                                'label' => 'Add a database',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'remove database',
                                                'label' => 'Remove a database',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view database connection',
                                                'label' => 'View database connection details (username, password, or hostname)',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download db backup non-prod',
                                                'label' => 'Download database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download db backup prod',
                                                'label' => 'Download database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create db backup non-prod',
                                                'label' => 'Create database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create db backup prod',
                                                'label' => 'Create database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'restore db backup non-prod',
                                                'label' => 'Restore database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'restore db backup prod',
                                                'label' => 'Restore database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer team',
                                                'label' => 'Add or remove a user of a team',
                                                'description' => 'Granting this permission will give any user with this role full permissions on this team.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'access cloud api',
                                                'label' => 'Access the Cloud API',
                                                'description' => 'Grants the ability to use the API and bypass all other permissions via command line tools.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer cron non-prod',
                                                'label' => 'Modify cron tasks for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Cron',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer cron prod',
                                                'label' => 'Modify cron tasks for the production environment',
                                                'description' => null,
                                                'group_label' => 'Cron',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create support ticket',
                                                'label' => 'Create a support ticket',
                                                'description' => null,
                                                'group_label' => 'Support',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit any support ticket',
                                                'label' => 'View and edit any support tickets for a subscription',
                                                'description' => null,
                                                'group_label' => 'Support',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view build plans',
                                                'label' => 'View Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit build plans',
                                                'label' => 'Edit Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'run build plans',
                                                'label' => 'Run Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to git',
                                                'label' => 'Add SSH key to git repository',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to non-prod',
                                                'label' => 'Add SSH key to non-production environments',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to prod',
                                                'label' => 'Add SSH key to the production environment',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view remote administration',
                                                'label' => 'View Remote Administration',
                                                'description' => 'This permission is only relevant if your subscription has remote administration.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit remote administration',
                                                'label' => 'Edit Remote Administration',
                                                'description' => 'This permission is only relevant if your subscription has remote administration.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear caches on prod',
                                                'label' => 'Clear caches for the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear caches on non-prod',
                                                'label' => 'Clear caches for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/search' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a traversal endpoint for search entities for the application.',
                'description' => 'Does not return any data. Allows traversal to search entity endpoints.',
                'operationId' => 'getApplicationSearchList',
                'x-cli-name' => 'applications:search:list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_search',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                        ],
                                        'config-sets' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Forbidden' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage search for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/search/config-sets' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a collection of search configuration sets for an application',
                'description' => 'A collection of search configuration sets for an application.',
                'operationId' => 'getApplicationSearchConfigurationSets',
                'x-cli-name' => 'applications:search:configuration-set-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-sets',
                                ],
                                'example' => [
                                    'total' => 3,
                                    'pagination' => [
                                        'total' => 3,
                                        'limit' => 3,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 'shared-1234567891011-121',
                                                'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                'label' => 'example-0',
                                                'flags' => [
                                                    'custom' => false,
                                                ],
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/shared-1234567891011-121',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/download',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                'label' => 'example-1',
                                                'flags' => [
                                                    'custom' => true,
                                                ],
                                                'status' => 'pending',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/download',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn79',
                                                'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                'label' => 'example-2',
                                                'flags' => [
                                                    'custom' => true,
                                                ],
                                                'status' => 'pending',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn79',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/download',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to view search configuration sets for this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Creates a search configuration set for an application.',
                'description' => 'Creates a search configuration set for an application.',
                'operationId' => 'postApplicationSearchConfigurationSets',
                'x-cli-name' => 'applications:search:configuration-set-create',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'multipart/form-data' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'archive',
                                ],
                                'description' => 'The archive file binary.',
                                'properties' => [
                                    'archive' => [
                                        'format' => 'binary',
                                        'type' => 'string',
                                        'description' => 'A binary file response',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The search configuration set is being created.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/05fb83f1-59dd-4079-b9f3-ce9243a126ed',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Request missing uploaded file' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The request does not contain an uploaded file.',
                                            ],
                                        ],
                                    ],
                                    'Error during file upload' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'An error occurred during file upload.',
                                            ],
                                        ],
                                    ],
                                    'Uploaded file is not a zip file' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The uploaded file is not a zip file.',
                                            ],
                                        ],
                                    ],
                                    'File exceeds size limit' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The uploaded file size exceeds the 10MB limit.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to create search configuration sets on this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'Acquia Search is not available for this subscription.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/search/config-sets/{configurationSetId}' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a search configuration set for an application',
                'description' => 'A specific search configuration set.',
                'operationId' => 'getApplicationSearchConfigurationSet',
                'x-cli-name' => 'applications:search:configuration-set-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_configuration-set-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-set',
                                ],
                                'example' => [
                                    'id' => 'shared-1234567891011-121',
                                    'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                    'label' => 'example-0',
                                    'flags' => [
                                        'custom' => false,
                                    ],
                                    'health' => [
                                        'code' => 'OK',
                                        'summary' => 'Search index active',
                                        'details' => 'No issues.',
                                    ],
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/shared-1234567891011-121',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                        ],
                                        'download' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/download',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to view search configuration sets for this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No configuration set or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The search configuration set you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Removes and deletes a specific search configuration set from an application.',
                'description' => 'Removes and deletes a specific search configuration set from an application.',
                'operationId' => 'deleteApplicationSearchConfigurationSet',
                'x-cli-name' => 'applications:search:configuration-set-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_configuration-set-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The search configuration set has been deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/41aaeac7-7ead-4f39-b74c-42493e4dc27b',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to delete search configuration sets for this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No configuration set or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The search configuration set you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Search configuration set not available' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The configuration set is not available for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'Acquia Search is not available for this subscription.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/settings' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns available settings for this application.',
                'description' => 'Does not return any data. Allows traversal to settings groups endpoints.',
                'operationId' => 'getApplicationSettings',
                'x-cli-name' => 'applications:settings-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_settings',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings',
                                        ],
                                        'hosting' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/hosting',
                                        ],
                                        'keys' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/keys',
                                        ],
                                        'ra' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/ra',
                                        ],
                                        'security' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/security',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/settings/hosting' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns the hosting settings for this application.',
                'description' => 'Returns the hosting settings for this application.',
                'deprecated' => true,
                'operationId' => 'getApplicationHostingSettings',
                'x-cli-name' => 'applications:hosting-settings-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_hosting-settings',
                                ],
                                'example' => [
                                    'uuid' => 'abcd1234-1111-2222-3333-0e02b2c3d470',
                                    'hosting_id' => 'master:site',
                                    'type' => 'ace',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/hosting',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/settings',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'You do not have permission to access the hosting settings.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/settings/keys' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns the legacy product keys for this application.',
                'description' => 'Returns the legacy product keys for this application.',
                'deprecated' => true,
                'operationId' => 'getApplicationLegacyProductKeysSettings',
                'x-cli-name' => 'applications:legacy-product-key-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_legacy-product-keys-settings',
                                ],
                                'example' => [
                                    'acquia_connector' => [
                                        'identifier' => 'ABCD-12345',
                                        'key' => '12345678f5325ea35d63a6c3debcd225',
                                    ],
                                    'cloud_api' => [
                                        'username' => 'abcd1234-1111-2222-3333-0e02b2c3d470',
                                        'key' => '123456787987a135e2c143601328cbf1',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/keys',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/settings',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to access these product keys.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/settings/ra' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns the remote administration settings for this application.',
                'description' => 'Returns the remote administration settings for this application.',
                'operationId' => 'getApplicationRemoteAdministrationSettings',
                'x-cli-name' => 'applications:ra-settings-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_remote-administration-settings',
                                ],
                                'example' => [
                                    'application_uuid' => 'abcd1234-1111-2222-3333-0e02b2c3d470',
                                    'update_mode' => 'full',
                                    'update_type' => 'core',
                                    'pause_until' => '2016-03-04T12:01:05-0500',
                                    'deploy_at' => '2016-03-04T12:01:05-0500',
                                    'deploy_environment' => 'test',
                                    'source_environment' => 'prod',
                                    'merge_branch' => 'master',
                                    'flags' => [
                                        'copy_files' => true,
                                        'copy_database' => true,
                                        'merge_tag' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/ra',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view the remote administration settings for this application.',
                                        ],
                                    ],
                                    'Does not have remote administration' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This application does not have remote administration.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Modifies the remote administration settings for an application.',
                'description' => 'Modifies the remote administration settings for an application.',
                'operationId' => 'putApplicationRemoteAdministrationSettings',
                'x-cli-name' => 'applications:ra-settings-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_remote-administration',
                            ],
                            'example' => [
                                'update_mode' => 'update',
                                'update_type' => 'core_contrib',
                                'pause_until' => '2021-10-10T13:00:00.000Z',
                                'deploy_at' => '2020-10-13T13:00:00.000Z',
                                'deploy_environment' => 'test',
                                'source_environment' => 'prod',
                                'copy_files' => false,
                                'copy_database' => true,
                                'merge_tag' => false,
                                'merge_branch' => 'master',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_remote-administration',
                            ],
                            'example' => [
                                'update_mode' => 'update',
                                'update_type' => 'core_contrib',
                                'pause_until' => '2021-10-10T13:00:00.000Z',
                                'deploy_at' => '2020-10-13T13:00:00.000Z',
                                'deploy_environment' => 'test',
                                'source_environment' => 'prod',
                                'copy_files' => false,
                                'copy_database' => true,
                                'merge_tag' => false,
                                'merge_branch' => 'master',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'The remote administration settings have been updated',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'No parameters' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'No fields were set to update. No action performed.',
                                            ],
                                        ],
                                    ],
                                    'Remote administration not availble for application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Remote administration is not available for this application.',
                                            ],
                                        ],
                                    ],
                                    'Invalid remote administration mode' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'update_mode' => 'The remote administration mode \'something\' is invalid. Must be one of \'update\', \'inform\', or \'none\'.',
                                            ],
                                        ],
                                    ],
                                    'Invalid remote administration update type' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'update_type' => 'The remote administration update type \'something\' is invalid. Must be one of \'core\' or \'core_contrib\'.',
                                            ],
                                        ],
                                    ],
                                    'Pause until must be in the future' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'pause_until' => 'The pause until timestamp must be in the future.',
                                            ],
                                        ],
                                    ],
                                    'Deploy environment does not belong to application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'deploy_environment' => 'The deploy environment does not belong to this application.',
                                            ],
                                        ],
                                    ],
                                    'Invalid deploy environment' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'deploy_environment' => 'The deploy environment is not valid.',
                                            ],
                                        ],
                                    ],
                                    'Source environment does not belong to application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'deploy_environment' => 'The source environment does not belong to this application.',
                                            ],
                                        ],
                                    ],
                                    'Invalid source environment' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'deploy_environment' => 'The source environment is not valid.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Unsufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to edit the remote administration settings for this application.',
                                        ],
                                    ],
                                    'Does not have remote administration' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This application does not have remote administration.',
                                        ],
                                    ],
                                    'Remote administration not available' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Remote admin is not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/settings/security' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns the security policy settings for this application.',
                'description' => 'Returns the security policy settings for this application.',
                'deprecated' => true,
                'operationId' => 'getApplicationSecuritySettings',
                'x-cli-name' => 'applications:security-settings-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_security-settings',
                                ],
                                'example' => [
                                    'application_uuid' => 'abcd1234-1111-2222-3333-0e02b2c3d470',
                                    'allowed_ips' => [
                                        '127.0.0.1',
                                        '8.8.8.8',
                                    ],
                                    'tfa_required' => true,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings/security',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcd1234-1111-2222-3333-0e02b2c3d470/settings',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Modifies the security policy settings for an application.',
                'description' => 'Modifies the security policy settings for an application.',
                'deprecated' => true,
                'operationId' => 'putApplicationSecuritySettings',
                'x-cli-name' => 'applications:security-settings-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'allowed_ips' => [
                                        'type' => 'array',
                                        'description' => 'The list of IPs to whitelist. Set to `null` to disable IP whitelisting.'."\n",
                                        'nullable' => true,
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'ipv4',
                                        ],
                                    ],
                                    'tfa_required' => [
                                        'type' => 'boolean',
                                        'description' => 'The configuration set to use.Whether TFA is required for application authentication.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'status' => [
                                    '127.0.0.1',
                                    '0.0.0.0',
                                ],
                                'configuration_set' => true,
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'allowed_ips' => [
                                        'type' => 'array',
                                        'description' => 'The list of IPs to whitelist. Set to `null` to disable IP whitelisting.'."\n",
                                        'nullable' => true,
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'ipv4',
                                        ],
                                    ],
                                    'tfa_required' => [
                                        'type' => 'boolean',
                                        'description' => 'The configuration set to use.Whether TFA is required for application authentication.',
                                    ],
                                ],
                                'example' => [
                                    'status' => [
                                        '127.0.0.1',
                                        '0.0.0.0',
                                    ],
                                    'configuration_set' => true,
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'The security policy settings have been updated.',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'No parameters' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'No fields were set to update. No action performed.',
                                            ],
                                        ],
                                    ],
                                    'Invalid IP list' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'allowed_ips' => 'The list of allowed IPs is invalid. Must either be an array of IPs to whitelist, or null to disable IP whitelisting.',
                                            ],
                                        ],
                                    ],
                                    'Invalid IP address in list' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'allowed_ips' => 'The IP address \\"not-a-valid-ip-address\\" is invalid.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to edit the security policy settings for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Action unavailable' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The security policy is already configured to these settings.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/tags' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of application tags associated with this application.',
                'description' => 'Returns a list of application tags associated with this application.',
                'operationId' => 'getApplicationTags',
                'x-cli-name' => 'applications:tag-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tags',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'total' => 1,
                                        'limit' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'Dev',
                                                'color' => 'orange',
                                                'context' => [
                                                    'organization' => [
                                                        'uuids' => [
                                                            '2375e327-3fff-11e3-9170-12313920a02c',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags/Dev',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tags',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Creates a new application tag.',
                'description' => 'Creates a new application tag.',
                'operationId' => 'postApplicationsTags',
                'x-cli-name' => 'applications:tags-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'description' => 'Application tags.',
                                'required' => [
                                    'name',
                                    'color',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The label of the application tag.',
                                        'minLength' => 2,
                                        'maxLength' => 16,
                                    ],
                                    'color' => [
                                        'type' => 'string',
                                        'description' => 'The color name of the application tag found via the GET /api/options/colors endpoint.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'Dev',
                                'color' => 'green',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'description' => 'Application tags.',
                                'required' => [
                                    'name',
                                    'color',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The label of the application tag.',
                                        'minLength' => 2,
                                        'maxLength' => 16,
                                    ],
                                    'color' => [
                                        'type' => 'string',
                                        'description' => 'The color name of the application tag found via the GET /api/options/colors endpoint.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'Dev',
                                'color' => 'green',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The tag has been added to the application.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/0d9fc48f-9871-41d9-8b41-0f815e6039eb/tags',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/0d9fc48f-9871-41d9-8b41-0f815e6039eb',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/773fca86-9d87-45dc-9220-9ba38306bbb1',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The Application with UUID 3c6a3d3e-c3ee-4fee-97d6-9074971feb76 does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/tags/{tagName}' => [
            'delete' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Deletes an application tag.',
                'description' => 'Deletes an application tag.',
                'operationId' => 'deleteApplicationTags',
                'x-cli-name' => 'applications:tags-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_tag-name',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The tag has been removed from the application.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/0d9fc48f-9871-41d9-8b41-0f815e6039eb/tags/test_tag',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/0d9fc48f-9871-41d9-8b41-0f815e6039eb/tags',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/37cdf705-9774-4526-9bf0-9feb279630ee',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The Application with UUID 3c6a3d3e-c3ee-4fee-97d6-9074971feb76 does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/tasks' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of tasks associated with this application by its UUID.',
                'description' => 'Returns a list of tasks associated with this application. A task represents an item of work to be done, initiated by someone (typically the current user) associated with the application.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `title`'."\n"
                    .'* `created`'."\n"
                    .'* `completed`'."\n"
                    .'* `started`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `title`'."\n"
                    .'* `created`'."\n"
                    .'* `completed`'."\n"
                    .'* `started`'."\n",
                'operationId' => 'getApplicationTasks',
                'x-cli-name' => 'applications:task-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-tasks',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tasks',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tasks{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tasks{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/tasks{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'progress' => 100,
                                                'user' => [
                                                    'uuid' => 'd15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a',
                                                    'first_name' => 'Example',
                                                    'last_name' => 'User',
                                                    'last_login_at' => '2019-05-23T20:12:12.000Z',
                                                    'created_at' => '2015-08-14T21:37:21.000Z',
                                                    'mail' => 'example.user@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/images/users/d15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a/style/avatar',
                                                    'username' => 'example.user',
                                                ],
                                                'id' => '8c6dde1f-fd0c-45e3-b6a3-f335397a1a76',
                                                'uuid' => '8c6dde1f-fd0c-45e3-b6a3-f335397a1a76',
                                                'name' => 'ApplicationAddedToTeam',
                                                'title' => 'Application added to team.',
                                                'description' => 'Application Example Application has been added to team Example Team',
                                                'created_at' => '2019-04-16T17:24:55.000Z',
                                                'started_at' => '2019-04-16T17:24:55.000Z',
                                                'completed_at' => '2019-04-16T17:24:55.000Z',
                                                'status' => 'completed',
                                                'type' => 'task',
                                                'metadata' => [
                                                    'created' => 1555435495,
                                                    'author' => [
                                                        'uuid' => 'd15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a',
                                                        'actual_uuid' => 'd15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a',
                                                    ],
                                                    'user' => [
                                                        'uuids' => [
                                                            'd15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        ],
                                                    ],
                                                    'subscription' => [
                                                        'uuids' => [
                                                            'bbb28c3b-5eba-41ce-b54e-798d60f02a14',
                                                        ],
                                                    ],
                                                    'organization' => [
                                                        'uuids' => [
                                                            '1734f8b7-9fd0-4150-92a8-325c52229554',
                                                        ],
                                                    ],
                                                    'team' => [
                                                        'uuids' => [
                                                            'e1cc8591-1f28-44d4-912a-371311ac6095',
                                                        ],
                                                    ],
                                                ],
                                                'labels' => [
                                                    'teams',
                                                ],
                                                'reference_uuid' => 'd15b1bfe-1bf3-47d4-8f3a-fd29a5daea7a',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/notifications/8c6dde1f-fd0c-45e3-b6a3-f335397a1a76',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'progress' => 0,
                                                'user' => [
                                                    'uuid' => '66597696-118c-4e18-b7e8-d027df8d5faa',
                                                    'first_name' => 'Example',
                                                    'last_name' => 'User',
                                                    'last_login_at' => '2019-05-30T22:08:36.000Z',
                                                    'created_at' => '2015-08-13T23:37:00.000Z',
                                                    'mail' => 'example.user.2@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/images/users/66597696-118c-4e18-b7e8-d027df8d5faa/style/avatar',
                                                    'username' => 'example.user.2',
                                                ],
                                                'id' => 'a0b253b7-df89-4b45-950b-f1d1e8873d30',
                                                'uuid' => 'a0b253b7-df89-4b45-950b-f1d1e8873d30',
                                                'name' => 'FilesCopied',
                                                'title' => 'Files copied',
                                                'description' => 'Files copied from &quot;prod&quot; to &quot;dev&quot;.',
                                                'created_at' => '2019-01-25T09:24:32.000Z',
                                                'started_at' => '2019-01-25T09:24:32.000Z',
                                                'completed_at' => '2019-01-25T09:24:46.000Z',
                                                'status' => 'completed',
                                                'type' => 'task',
                                                'metadata' => [
                                                    'created' => 1548408272,
                                                    'environment' => [
                                                        'source' => '925-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        'target' => '927-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        'ids' => [
                                                            '925-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                            '927-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        ],
                                                    ],
                                                    'hosting' => [
                                                        'task' => [
                                                            'id' => '12345678',
                                                            'master' => 'example',
                                                        ],
                                                    ],
                                                    'author' => [
                                                        'uuid' => '66597696-118c-4e18-b7e8-d027df8d5faa',
                                                        'actual_uuid' => '66597696-118c-4e18-b7e8-d027df8d5faa',
                                                    ],
                                                    'user' => [
                                                        'uuids' => [
                                                            '66597696-118c-4e18-b7e8-d027df8d5faa',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        ],
                                                    ],
                                                    'subscription' => [
                                                        'uuids' => [
                                                            'bbb28c3b-5eba-41ce-b54e-798d60f02a14',
                                                        ],
                                                    ],
                                                    'organization' => [
                                                        'uuids' => [
                                                            '1734f8b7-9fd0-4150-92a8-325c52229554',
                                                        ],
                                                    ],
                                                ],
                                                'labels' => [
                                                    'hosting',
                                                ],
                                                'reference_uuid' => 'a0b253b7-df89-4b45-950b-f1d1e8873d30',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/185f07c7-9c4f-407b-8968-67892ebcb38a/notifications/a0b253b7-df89-4b45-950b-f1d1e8873d30',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/teams' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of teams associated with this application.',
                'description' => 'Returns a list of teams associated with this application by its UUID.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getApplicationTeams',
                'x-cli-name' => 'applications:team-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-teams',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcded12-1234-11e1-9eb5-12313928d5b8/teams',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/abcded12-1234-11e1-9eb5-12313928d5b8',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'abcd1234-82b5-11e3-9170-12313920a02c',
                                                'name' => 'Team Name 1',
                                                'created_at' => '2013-10-28T14:16:07-0700',
                                                'updated_at' => '2015-02-19T08:53:10-0800',
                                                'organization' => [
                                                    'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '1234abcd-82b5-11e3-9170-12313920a02c',
                                                'name' => 'Team Name 2',
                                                'created_at' => '2014-05-27T11:55:39-0700',
                                                'updated_at' => '2015-01-30T05:49:16-0800',
                                                'organization' => [
                                                    'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/9ca6ecc0-e5d0-11e3-9eb3-22000b04072f',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves traversal links for detailed metrics on usage (views and visits) of your application.',
                'description' => 'Retrieves traversal links for an application\'s usage data.',
                'operationId' => 'getApplicationsUsageLinks',
                'x-cli-name' => 'applications:usage-links',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_usage',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics',
                                        ],
                                        'data' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data',
                                        ],
                                        'data-by-environment' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data-by-environment',
                                        ],
                                        'views' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                        ],
                                        'views-by-environment' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views-by-environment',
                                        ],
                                        'visits' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                        ],
                                        'visits-by-environment' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits-by-environment',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage/data' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves aggregate usage data for an application, filterable by views or visits and by environment.',
                'description' => 'Filterable fields:'."\n"
                    .'* `metric` - One of: {`views`, `visits`}'."\n"
                    .'* `environment`'."\n",
                'operationId' => 'getApplicationsUsageData',
                'x-cli-name' => 'applications:usage-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage/data-by-environment' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves usage data (views or visits) for an application, broken down by environment.',
                'description' => 'Filterable fields:'."\n"
                    .'* `metric` - One of: {`views`, `visits`}'."\n"
                    .'* `environment`'."\n",
                'operationId' => 'getApplicationsUsageDataByEnvironment',
                'x-cli-name' => 'applications:usage-data-by-environment',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 6,
                                    'pagination' => [
                                        'total' => 6,
                                        'limit' => 6,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data-by-environment',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data-by-environment{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data-by-environment{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data-by-environment{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage/{usageMetric}' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves aggregate usage metric data (views or visits) for an application..',
                'description' => 'Filterable fields:'."\n"
                    .'* `environment`'."\n",
                'operationId' => 'getApplicationsUsageMetricData',
                'x-cli-name' => 'applications:usage-metric-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_usage-metric',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metric',
                                ],
                                'example' => [
                                    'metric' => 'views',
                                    'datapoints' => [
                                        [
                                            '2019-03-13T00:00:00.000Z',
                                            '9',
                                        ],
                                        [
                                            '2019-03-14T00:00:00.000Z',
                                            '1',
                                        ],
                                    ],
                                    'last_data_at' => '2019-03-14T00:00:00.000Z',
                                    'metadata' => [
                                        'subscription' => [
                                            'uuids' => [
                                                '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                            ],
                                        ],
                                        'application' => [
                                            'uuids' => [
                                                '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                            ],
                                        ],
                                        'environment' => [
                                            'ids' => [
                                                '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage/views-by-environment' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves views data for an application, broken down by environment.',
                'description' => 'Filterable fields:'."\n"
                    .'* `environment`'."\n",
                'operationId' => 'getApplicationsUsageViewsDataByEnvironment',
                'x-cli-name' => 'applications:usage-views-data-by-environment',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 3,
                                    'pagination' => [
                                        'total' => 3,
                                        'limit' => 3,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views-by-environment',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views-by-environment{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views-by-environment{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views-by-environment{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/metrics/usage/visits-by-environment' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Retrieves visits data for an application, broken down by environment.',
                'description' => 'Filterable fields:'."\n"
                    .'* `environment`'."\n",
                'operationId' => 'getApplicationsUsageVisitsDataByEnvironment',
                'x-cli-name' => 'applications:usage-visits-data-by-environment',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 3,
                                    'pagination' => [
                                        'total' => 3,
                                        'limit' => 3,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits-by-environment',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits-by-environment{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits-by-environment{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits-by-environment{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [],
                                                'last_data_at' => null,
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/distributions' => [
            'get' => [
                'tags' => [
                    'Distributions',
                ],
                'summary' => 'Return a list of Drupal distributions.',
                'operationId' => 'getDistributions',
                'x-cli-name' => 'distributions:list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Returns a list of Drupal distributions that are available for installation in an Acquia Cloud environment.'."\n",
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_distributions',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/distributions',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'drupal7',
                                                'urls' => [
                                                    'gz' => 'http://www.acquia.com/path/to/archive/drupal7.tar.gz',
                                                    'zip' => 'http://www.acquia.com/path/to/archive/drupal7.zip',
                                                ],
                                                'update_urls' => [
                                                    'gz' => 'http://www.acquia.com/path/to/archive/drupal7-update.tar.gz',
                                                    'zip' => 'http://www.acquia.com/path/to/archive/drupal7-update.zip',
                                                ],
                                                'title' => 'Acquia Drupal',
                                                'version' => '7.38.44-6261',
                                                'drupal_version' => 'Drupal 7',
                                                'description' => 'Acquia Drupal makes building your Drupal website easier by including both the current Drupal core along with a collection of essential modules.',
                                                'image_url' => 'https://www.acquia.com/path/to/img/drupal7.png',
                                                'flags' => [
                                                    'default' => true,
                                                    '$visible' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/distributions/drupal7',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'drupal8',
                                                'urls' => [
                                                    'gz' => 'http://www.acquia.com/path/to/archive/drupal8.tar.gz',
                                                    'zip' => 'http://www.acquia.com/path/to/archive/drupal8.zip',
                                                ],
                                                'update_urls' => [
                                                    'gz' => 'http://www.acquia.com/path/to/archive/drupal8-update.tar.gz',
                                                    'zip' => 'http://www.acquia.com/path/to/archive/drupal8-update.zip',
                                                ],
                                                'title' => 'Acquia Drupal',
                                                'version' => '8.0.0-beta14',
                                                'drupal_version' => 'Drupal 8',
                                                'description' => 'Acquia Drupal makes building your Drupal website easier by including both the current Drupal core along with a collection of essential modules.',
                                                'image_url' => 'https://www.acquia.com/path/to/img/drupal8.png',
                                                'flags' => [
                                                    'default' => false,
                                                    '$visible' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/distributions/drupal8',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/distributions/{name}' => [
            'get' => [
                'tags' => [
                    'Distributions',
                ],
                'summary' => 'Return details about a specific Drupal distribution.',
                'operationId' => 'getDistributionByName',
                'x-cli-name' => 'distributions:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'A specific distribution.'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_name',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_distribution',
                                ],
                                'example' => [
                                    'name' => 'drupal8',
                                    'urls' => [
                                        'gz' => 'http://www.acquia.com/path/to/archive/drupal8.tar.gz',
                                        'zip' => 'http://www.acquia.com/path/to/archive/drupal8.zip',
                                    ],
                                    'update_urls' => [
                                        'gz' => 'http://www.acquia.com/path/to/archive/drupal8-update.tar.gz',
                                        'zip' => 'http://www.acquia.com/path/to/archive/drupal8-update.zip',
                                    ],
                                    'title' => 'Acquia Drupal',
                                    'version' => '8.0.0-beta14',
                                    'drupal_version' => 'Drupal 8',
                                    'description' => 'Acquia Drupal makes building your Drupal website easier by including both the current Drupal core along with a collection of essential modules.',
                                    'image_url' => 'https://www.acquia.com/path/to/img/drupal8.png',
                                    'flags' => [
                                        'default' => false,
                                        '$visible' => true,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/distributions/drupal8',
                                        ],
                                        'gz' => [
                                            'href' => 'http://www.acquia.com/path/to/archive/drupal8.tar.gz',
                                        ],
                                        'zip' => [
                                            'href' => 'http://www.acquia.com/path/to/archive/drupal8.zip',
                                        ],
                                        'update_gz' => [
                                            'href' => 'http://www.acquia.com/path/to/archive/drupal8-update.tar.gz',
                                        ],
                                        'update_zip' => [
                                            'href' => 'http://www.acquia.com/path/to/archive/drupal8-update.zip',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/distributions',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The distribution you are trying to access does not exist.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/environments' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Returns a list of environments within this application by its UUID.',
                'description' => 'Returns a list of environments within this application.',
                'operationId' => 'getApplicationEnvironments',
                'x-cli-name' => 'applications:environment-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environments',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/environments',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/environments{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/environments{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/environments{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'label' => 'Dev',
                                                'name' => 'dev',
                                                'application' => [
                                                    'name' => 'Sample Drupal application',
                                                    'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                                'domains' => [
                                                    'sitedev.hosted.acquia-sites.com',
                                                    'example.com',
                                                ],
                                                'active_domain' => 'example.com',
                                                'default_domain' => 'sitedev.hosted.acquia-sites.com',
                                                'image_url' => null,
                                                'ssh_url' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                                'ips' => [
                                                    '10.0.1.5',
                                                ],
                                                'region' => 'us-east-1',
                                                'balancer' => 'balancers',
                                                'platform' => 'cloud',
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                'size' => 'medium',
                                                'weight' => 0,
                                                'vcs' => [
                                                    'type' => 'git',
                                                    'path' => 'master',
                                                    'url' => 'site@svn-3.hosted.acquia-sites.com:site.git',
                                                ],
                                                'flags' => [
                                                    'cde' => false,
                                                    'cdn' => false,
                                                    'email' => false,
                                                    'hsd' => false,
                                                    'livedev' => false,
                                                    'multicert' => false,
                                                    'multi_region' => false,
                                                    'production' => false,
                                                    'production_mode' => false,
                                                    'remote_admin' => false,
                                                    'varnish' => true,
                                                    'varnish_over_ssl' => false,
                                                ],
                                                'configuration' => [
                                                    'operating_system' => 'precise',
                                                    'php' => [
                                                        'version' => '8.3',
                                                        'memory_limit' => 128,
                                                        'opcache' => 96,
                                                        'apcu' => 32,
                                                        'interned_strings_buffer' => 16,
                                                        'client_max_body_size' => 128,
                                                        'max_execution_time' => 300,
                                                        'max_post_size' => 256,
                                                        'max_input_vars' => 1000,
                                                        'upload_max_filesize' => 256,
                                                        'memcached_limit' => 64,
                                                    ],
                                                ],
                                                'artifact' => null,
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '15-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'label' => 'Production',
                                                'name' => 'prod',
                                                'application' => [
                                                    'name' => 'Sample SiteFactory application',
                                                    'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                                'domains' => [
                                                    'siteprod.hosted.acquia-sites.com',
                                                    'example.com',
                                                ],
                                                'gardener' => [
                                                    'site-update' => 'prod.example.com/admin/gardens/site-update',
                                                    'multi-site' => 'prod.example.com/admin/gardens/staging',
                                                ],
                                                'active_domain' => 'example.com',
                                                'default_domain' => 'siteprod.hosted.acquia-sites.com',
                                                'image_url' => null,
                                                'ssh_url' => 'site.prod@siteprod.ssh.hosted.acquia-sites.com',
                                                'ips' => [
                                                    '10.0.1.1',
                                                    '10.0.1.2',
                                                ],
                                                'region' => 'us-east-1',
                                                'balancer' => 'balancers',
                                                'platform' => 'cloud',
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                'size' => 'medium',
                                                'weight' => 0,
                                                'vcs' => [
                                                    'type' => 'git',
                                                    'path' => 'tags/01-01-2015',
                                                    'url' => 'site@svn-3.hosted.acquia-sites.com:site.git',
                                                ],
                                                'flags' => [
                                                    'cde' => false,
                                                    'cdn' => false,
                                                    'email' => false,
                                                    'hsd' => false,
                                                    'livedev' => false,
                                                    'multicert' => false,
                                                    'multi_region' => false,
                                                    'production' => true,
                                                    'production_mode' => true,
                                                    'remote_admin' => false,
                                                    'varnish' => true,
                                                    'varnish_over_ssl' => false,
                                                ],
                                                'configuration' => null,
                                                'artifact' => null,
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/15-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '32-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'label' => 'Stage',
                                                'name' => 'test',
                                                'application' => [
                                                    'name' => 'Sample Node application',
                                                    'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                                'domains' => [
                                                    'sitetest.hosted.acquia-sites.com',
                                                    'test.example.com',
                                                ],
                                                'active_domain' => 'test.example.com',
                                                'default_domain' => 'sitetest.hosted.acquia-sites.com',
                                                'image_url' => null,
                                                'ssh_url' => 'site.test@sitetest.ssh.hosted.acquia-sites.com',
                                                'ips' => [],
                                                'region' => 'us-east-1',
                                                'balancer' => 'balancers',
                                                'platform' => 'cloud',
                                                'status' => 'normal',
                                                'type' => 'node',
                                                'size' => 'medium',
                                                'weight' => 20,
                                                'vcs' => [
                                                    'type' => 'git',
                                                    'path' => null,
                                                    'url' => 'qa10@svn-3.networkdev.ahserversdev.com:qa10.git',
                                                ],
                                                'flags' => [
                                                    'cde' => false,
                                                    'cdn' => false,
                                                    'email' => false,
                                                    'hsd' => false,
                                                    'livedev' => false,
                                                    'multicert' => false,
                                                    'multi_region' => false,
                                                    'production' => false,
                                                    'production_mode' => false,
                                                    'remote_admin' => false,
                                                    'varnish' => true,
                                                    'varnish_over_ssl' => false,
                                                ],
                                                'configuration' => [
                                                    'operating_system' => 'precise',
                                                    'node' => [
                                                        'version' => '6.11.1',
                                                    ],
                                                ],
                                                'artifact' => [
                                                    'id' => 1,
                                                    'name' => 'Example artifact',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/32-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'No environments exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Add a new continuous delivery environment to an application by the application UUID.',
                'description' => 'Add a new continuous delivery environment.',
                'operationId' => 'postApplicationEnvironments',
                'x-cli-name' => 'applications:environment-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                    'branch',
                                    'databases',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new environment label.',
                                    ],
                                    'branch' => [
                                        'type' => 'string',
                                        'description' => 'The name of the branch or tag that the continuous delivery environment will have.',
                                    ],
                                    'databases' => [
                                        'type' => 'array',
                                        'description' => 'An array containing the names of the databases to add to the continuous delivery environment.',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'CD label',
                                'branch' => 'my-feature-branch',
                                'databases' => [
                                    'database1',
                                    'database2',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                    'branch',
                                    'databases',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new environment label.',
                                    ],
                                    'branch' => [
                                        'type' => 'string',
                                        'description' => 'The name of the branch or tag that the continuous delivery environment will have.',
                                    ],
                                    'databases' => [
                                        'type' => 'array',
                                        'description' => 'The names of the databases to add to the continuous delivery environment.',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                                'example' => [
                                    'label' => 'CD label',
                                    'branch' => 'my-feature-branch',
                                    'databases' => [
                                        'database1',
                                        'database2',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Adding environment' => [
                                        'value' => [
                                            'message' => 'Adding an environment.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/896f142a-2c14-45ff-9b1f-41bcb2b5de8d/environments',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/23d9184d-40b8-4f21-a3d5-416aef9bcd39',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/896f142a-2c14-45ff-9b1f-41bcb2b5de8d/environments',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Application is not hosted by Acquia' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Environments can only be added on Acquia-hosted applications.',
                                            ],
                                        ],
                                    ],
                                    'Label already exists' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'label' => 'Another environment within this application already has this label.',
                                            ],
                                        ],
                                    ],
                                    'Application does not support CD environments' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'This application does not support CD environments.',
                                            ],
                                        ],
                                    ],
                                    'Application is at capacity' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'This application already has the maximum number of CD environments.',
                                            ],
                                        ],
                                    ],
                                    'Databases do not exist' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'One or more of the databases you have specified do not exist in this application.',
                                            ],
                                        ],
                                    ],
                                    'Too many databases provided' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Please specify 3 or fewer databases to provision on your environment.',
                                            ],
                                        ],
                                    ],
                                    'Too many databases exist' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'You cannot provision more than 3 databases on your new environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to add an environment.',
                                        ],
                                    ],
                                    'Application is not hosted by Acquia' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'CD environments cannot be added to non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/applications/{applicationUuid}/features' => [
            'get' => [
                'tags' => [
                    'Applications',
                ],
                'summary' => 'Return application features.',
                'operationId' => 'getApplicationFeatures',
                'x-cli-name' => 'applications:feature-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Returns a list of feature flags for this application.'."\n",
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-features',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470/features',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'feature-name',
                                                'label' => 'Some feature.',
                                                'description' => 'Allows access to Some feature.',
                                            ],
                                            [
                                                'name' => 'example-feature',
                                                'label' => 'Example feature.',
                                                'description' => 'Allows access to Example feature.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific environment.',
                'description' => 'Return details about a specific environment.'."\n"
                    ."\n"
                    .'To find your environment ID via API:'."\n"
                    ."\n"
                    .'1. Make a request to GET `/api/applications/[uuid]/environments`.'."\n"
                    .'2. Find the entry that matches your environment. If you don\'t know the application UUID, first make a request to GET `/api/applications`.'."\n"
                    ."\n"
                    .'To find your environment ID via cloud.acquia.com:'."\n"
                    ."\n"
                    .'1. Open [https://cloud.acquia.com](https://cloud.acquia.com).'."\n"
                    .'2. Navigate to your application.'."\n"
                    .'3. Navigate to the environment.'."\n"
                    .'4. See the environment ID in the browser URL.'."\n"
                    .'For example, in this URL `https://cloud.acquia.com/app/develop/applications/53785bca-1946-4adc-a022-e50d24686c20/environments/289576-53785bca-1946-4adc-a022-e50d24686c20`, the environment id is `289576-53785bca-1946-4adc-a022-e50d24686c20`.'."\n",
                'operationId' => 'getEnvironment',
                'x-cli-name' => 'environments:find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment',
                                ],
                                'example' => [
                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                    'label' => 'Dev',
                                    'name' => 'dev',
                                    'application' => [
                                        'name' => 'Sample application',
                                        'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                    ],
                                    'domains' => [
                                        'sitedev.hosted.acquia-sites.com',
                                        'example.com',
                                    ],
                                    'active_domain' => 'example.com',
                                    'default_domain' => 'sitedev.hosted.acquia-sites.com',
                                    'image_url' => null,
                                    'ssh_url' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                    'ips' => [
                                        '10.0.1.5',
                                    ],
                                    'region' => 'us-east-1',
                                    'balancer' => 'balancers',
                                    'platform' => 'cloud',
                                    'status' => 'normal',
                                    'type' => 'drupal',
                                    'size' => 'medium',
                                    'weight' => 0,
                                    'vcs' => [
                                        'type' => 'git',
                                        'path' => 'master',
                                        'url' => 'site@svn-3.hosted.acquia-sites.com:site.git',
                                    ],
                                    'flags' => [
                                        'cde' => false,
                                        'cdn' => false,
                                        'cloud-actions' => false,
                                        'eips' => false,
                                        'email' => false,
                                        'hsd' => false,
                                        'livedev' => false,
                                        'multicert' => false,
                                        'multi_region' => false,
                                        'production' => false,
                                        'production_mode' => false,
                                        'remote_admin' => false,
                                        'varnish' => true,
                                        'varnish_over_ssl' => false,
                                    ],
                                    'configuration' => [
                                        'operating_system' => 'precise',
                                        'php' => [
                                            'version' => '8.3',
                                            'memory_limit' => 128,
                                            'opcache' => 96,
                                            'apcu' => 64,
                                            'interned_strings_buffer' => 16,
                                            'client_max_body_size' => 128,
                                            'max_execution_time' => 300,
                                            'max_post_size' => 256,
                                            'max_input_vars' => 1000,
                                            'upload_max_filesize' => 128,
                                            'memcached_limit' => 64,
                                        ],
                                    ],
                                    'gardener' => [
                                        'site-update' => 'example.com/admin/gardens/site-update',
                                        'multi-site' => 'example.com/admin/gardens/staging',
                                    ],
                                    'artifact' => null,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments',
                                        ],
                                        'available-runtimes' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/available-runtimes',
                                        ],
                                        'cdn' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/cdn',
                                        ],
                                        'cloud-actions' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/cloud-actions',
                                        ],
                                        'crons' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons',
                                        ],
                                        'databases' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                        ],
                                        'dns' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/dns',
                                        ],
                                        'domains' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/domains',
                                        ],
                                        'eips' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/eips',
                                        ],
                                        'logs' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8-185f07c7-9c4f-407b-8968-67892ebcb38a/logs',
                                        ],
                                        'metrics' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics',
                                        ],
                                        'search' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/search',
                                        ],
                                        'servers' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/servers',
                                        ],
                                        'ssl' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/ssl',
                                        ],
                                        'variables' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/variables',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'application' => [
                                            'name' => 'Sample application',
                                            'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Modifies configuration settings for an environment.',
                'description' => 'Modifies configuration settings for an environment. Note that some settings cannot be configured for certain subscriptions.',
                'operationId' => 'putEnvironment',
                'x-cli-name' => 'environments:update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-configuration',
                            ],
                            'example' => [
                                'version' => '8.3',
                                'max_execution_time' => 10,
                                'memory_limit' => 192,
                                'apcu' => 32,
                                'client_max_body_size' => 192,
                                'max_input_vars' => 1000,
                                'max_post_size' => 256,
                                'memcached_limit' => 128,
                                'upload_max_filesize' => 192,
                                'operating_system' => 'focal',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-configuration',
                            ],
                            'example' => [
                                'version' => '8.3',
                                'max_execution_time' => 10,
                                'memory_limit' => 192,
                                'apcu' => 32,
                                'client_max_body_size' => 192,
                                'max_input_vars' => 1000,
                                'max_post_size' => 256,
                                'memcached_limit' => 128,
                                'upload_max_filesize' => 192,
                                'operating_system' => 'focal',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The environment configuration is being updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/737a97a4-4c02-47e4-9924-d008de1aa7e5',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'No changes requested' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => [
                                                'system' => 'No environment configuration changes are specified.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this environment.',
                                        ],
                                    ],
                                    'Cannot delete CD environments on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'CD environments cannot be deleted on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot delete environments on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Environments cannot be deleted on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available for static applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment configuration cannot be modified for static applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Conflict' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'operating_system cannot be configured on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes a CD environment.',
                'description' => 'Deletes a CD environment.',
                'operationId' => 'deleteEnvironment',
                'x-cli-name' => 'environments:delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'The environment is being deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-a027502b-ad6c-a48e-a7e8-aa0def7d25e1',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/6992a41d-a953-4ded-ae99-41d2f4d62f69',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this environment.',
                                        ],
                                    ],
                                    'Cannot delete CD environments on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'CD environments cannot be deleted on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot delete environments for managed applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Environments cannot be deleted for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Cannot delete environments on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Environments cannot be deleted on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'options' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Displays environment options.',
                'description' => 'Displays environment options.',
                'operationId' => 'optionsEnvironment',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-options',
                                ],
                                'example' => [
                                    'total' => 10,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'apcu',
                                                'minimum' => 32,
                                                'maximum' => 512,
                                                'default' => 32,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'interned_strings_buffer',
                                                'minimum' => 8,
                                                'maximum' => 32,
                                                'default' => 8,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'client_max_body_size',
                                                'minimum' => 0,
                                                'maximum' => 1024,
                                                'default' => 256,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'max_execution_time',
                                                'minimum' => 1,
                                                'maximum' => 300,
                                                'default' => 300,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'max_input_vars',
                                                'minimum' => 500,
                                                'maximum' => 20000,
                                                'default' => 1000,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'max_post_size',
                                                'minimum' => 64,
                                                'maximum' => 1024,
                                                'default' => 256,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'upload_max_filesize',
                                                'minimum' => 0,
                                                'maximum' => 1024,
                                                'default' => 256,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'memory_limit',
                                                'minimum' => 128,
                                                'maximum' => 1024,
                                                'default' => 128,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'memcached_limit',
                                                'minimum' => 0,
                                                'maximum' => 12288,
                                                'default' => 64,
                                                'step' => 64,
                                            ],
                                            [
                                                'name' => 'opcache',
                                                'minimum' => 96,
                                                'maximum' => 512,
                                                'default' => 96,
                                                'step' => 1,
                                            ],
                                            [
                                                'name' => 'operating_system',
                                                'minimum' => null,
                                                'maximum' => null,
                                                'default' => null,
                                                'step' => null,
                                            ],
                                            [
                                                'name' => 'version',
                                                'minimum' => null,
                                                'maximum' => null,
                                                'default' => null,
                                                'step' => null,
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/actions/clear-caches' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Clears the caches for one or more domains attached to this environment.',
                'description' => 'Clear caches for Varnish and Platform CDN (if Platform CDN is enabled).',
                'operationId' => 'postEnvironmentsClearCaches',
                'x-cli-name' => 'environments:clear-caches',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'required' => [
                                    'domains',
                                ],
                                'properties' => [
                                    'domains' => [
                                        'type' => 'array',
                                        'description' => 'A list of domains to clear the caches for.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'hostname',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'domains' => [
                                    'domain1.example.com',
                                    'domain2.example.com',
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Clearing cache' => [
                                        'value' => [
                                            'message' => 'Caches are being cleared.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/actions/clear-caches',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to clear caches on this environment.',
                                        ],
                                    ],
                                    'Can only be cleared on hosting applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Caches cannot be cleared on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be cleared for Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Caches cannot be cleared on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/actions/change-label' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Change the label for an environment.',
                'deprecated' => true,
                'description' => 'Change the label for an environment.',
                'operationId' => 'postChangeEnvironmentLabel',
                'x-cli-name' => 'environments:label-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new environment label.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'New Label',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new environment label.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'New Label',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Changing label' => [
                                        'value' => [
                                            'message' => 'Changing environment label.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Label already used' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'label' => 'Another environment within this application already has this label.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to change the label for this environment.',
                                        ],
                                    ],
                                    'Labels can only be changed on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Environment labels cannot be changed on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/artifacts/actions/switch' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deploys an artifact to this environment.',
                'description' => 'Deploys an artifact to this environment.',
                'operationId' => 'postDeployArtifact',
                'x-cli-name' => 'environments:artifact-deploy',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'artifact_id',
                                ],
                                'properties' => [
                                    'artifact_id' => [
                                        'type' => 'string',
                                        'description' => 'The id of the artifact to deploy.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'artifact_id' => '123',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'artifact_id',
                                ],
                                'properties' => [
                                    'artifact_id' => [
                                        'type' => 'string',
                                        'description' => 'The id of the artifact to deploy.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'artifact_id' => '123',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Deploying artifact' => [
                                        'value' => [
                                            'message' => 'Deploying artifact.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/642-99d416c4-88b5-48c0-ae8e-4719007d7b8d/artifacts/actions/switch',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/737a97a4-4c02-47e4-9924-d008de1aa7e5',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only ready artifacts can be deployed' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'artifact_id' => 'Only artifacts that are in the \'ready\' state can be deployed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to deploy an artifact to this environment.',
                                        ],
                                    ],
                                    'Cannot be deployed on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Artifacts cannot be deployed on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be deployed on managed applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Artifacts cannot be deployed on Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Cannot be deployed on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Artifacts can only be deployed on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The artifact with ID 123 does not belong to this application and cannot be deployed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/operating-systems' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return a list of operating systems.',
                'description' => 'Returns a list of operating systems.',
                'operationId' => 'getOperatingSystems',
                'x-cli-name' => 'environments:operating-systems-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_operating-systems',
                                ],
                                'example' => [
                                    'versions' => [
                                        [
                                            'name' => 'xenial',
                                            'label' => 'Ubuntu 16.04 (Xenial Xerus)',
                                            'version' => '16.0.4',
                                            'available' => true,
                                        ],
                                        [
                                            'name' => 'focal',
                                            'version' => '20.04',
                                            'label' => 'Ubuntu 20.04 (Focal Fossa)',
                                            'available' => true,
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93/operating-systems',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The operating systems you are trying to access do not exist, or you do not have permission to access them.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/available-runtimes' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return a list of runtimes.',
                'description' => 'Returns a list of available runtimes.',
                'operationId' => 'getAvailableRuntimes',
                'x-cli-name' => 'environments:runtime-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_available-runtimes',
                                ],
                                'example' => [
                                    'runtime' => 'php',
                                    'versions' => [
                                        '8.2',
                                        '8.3',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93/available-runtimes',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Available runtimes do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Not found or insufficient permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The available runtimes you are trying to access do not exist, or you do not have permission to access them.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/cdn' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns the CDN status for an environment.',
                'description' => 'Returns the CDN status for an environment. The CDN must be enabled for the status to be displayed.',
                'operationId' => 'getCdnByEnvironmentId',
                'x-cli-name' => 'environments:cdn-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cdn',
                                ],
                                'example' => [
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/cdn',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'CDN not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The CDN you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables a CDN for an environment.',
                'description' => 'Enables a CDN for an environment.',
                'operationId' => 'postCdnByEnvironmentId',
                'x-cli-name' => 'environments:cdn-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Provisioning Platform CDN.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8237-8675-93b8-4f45-cf515fec-e016647b53d4/cdn',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8237-8675-93b8-4f45-cf515fec-e016647b53d4',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/ea01b886-40bb-c028-b3de-4353e25fa462',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have sufficient permission to enable CDN for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This environment does not support Platform CDN.',
                                        ],
                                    ],
                                    'Already enabled' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform CDN is already enabled for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables a CDN for an environment.',
                'description' => 'Disables a CDN for an environment.',
                'operationId' => 'deleteCdnByEnvironmentId',
                'x-cli-name' => 'environments:cdn-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Deprovisioning Platform CDN.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8237-8675-93b8-4f45-cf515fec-e016647b53d4/cdn',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/8237-8675-93b8-4f45-cf515fec-e016647b53d4',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/ea01b886-40bb-c028-b3de-4353e25fa462',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have sufficient permission to disable CDN for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This environment does not support Platform CDN.',
                                        ],
                                    ],
                                    'Not enabled' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform CDN is not enabled for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/cloud-actions' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of Cloud Actions.',
                'description' => 'Returns a list of Cloud Actions on an environment.',
                'operationId' => 'getEnvironmentCloudActions',
                'x-cli-name' => 'environments:cloud-actions-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-actions',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 'f668295f-cbba-472d-8b75-c76ab89e553a',
                                                'label' => 'Backup all databases',
                                                'description' => 'Backs up all environment databases',
                                                'type' => 'pre-deployment',
                                                'flags' => [
                                                    'enabled' => false,
                                                    'default' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/f668295f-cbba-472d-8b75-c76ab89e553a',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 'fb4aa87a-8be2-42c6-bdf0-ef9d09a3de70',
                                                'label' => 'Turn on Drupal maintenance mode',
                                                'description' => 'Turns on maintenance mode on the Drupal site',
                                                'type' => 'pre-deployment',
                                                'flags' => [
                                                    'enabled' => false,
                                                    'default' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/fb4aa87a-8be2-42c6-bdf0-ef9d09a3de70',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '102590e4-382b-4726-8b3f-855d5ca4225d',
                                                'label' => 'Clear all Drupal caches',
                                                'description' => 'Clears all Drupal caches',
                                                'type' => 'pre-deployment',
                                                'flags' => [
                                                    'enabled' => false,
                                                    'default' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/102590e4-382b-4726-8b3f-855d5ca4225d',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage Cloud Actions on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Cloud Actions unavailable' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Cloud Actions are not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Modifies an existing list of Cloud Actions.',
                'description' => 'Modifies an existing list of Cloud Actions on an environment.',
                'operationId' => 'putEnvironmentCloudActions',
                'x-cli-name' => 'environments:cloud-actions-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cloud-actions',
                            ],
                            'example' => [
                                'cloud-actions' => [
                                    'fb4aa87a-8be2-42c6-bdf0-ef9d09a3de70' => true,
                                    '9440be70-c042-47ae-9134-e85acbbd6edf' => false,
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cloud-actions',
                            ],
                            'example' => [
                                'cloud-actions' => [
                                    'fb4aa87a-8be2-42c6-bdf0-ef9d09a3de70' => true,
                                    '9440be70-c042-47ae-9134-e85acbbd6edf' => false,
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Cloud Actions have been updated.',
                                    'notification' => '42047305-e30c-4c7e-931f-5407ce55a9e9',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/42047305-e30c-4c7e-931f-5407ce55a9e9',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage Cloud Actions on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/cloud-actions/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables Cloud Actions.',
                'description' => 'Disables Cloud Actions on an environment.',
                'operationId' => 'postEnvironmentCloudActionsDisable',
                'x-cli-name' => 'environments:cloud-actions-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Cloud Actions have been disabled.',
                                    'notification' => '2d49d11c-f81d-46dd-89f2-fb7f2f54335f',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/2d49d11c-f81d-46dd-89f2-fb7f2f54335f',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage Cloud Actions on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/cloud-actions/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables Cloud Actions.',
                'description' => 'Enables Cloud Actions on an environment.',
                'operationId' => 'postEnvironmentCloudActionsEnable',
                'x-cli-name' => 'environments:cloud-actions-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Cloud Actions have been enabled.',
                                    'notification' => '003e8200-6105-48bc-80a7-6ba378ac8e91',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/actions/enable',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/actions',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/003e8200-6105-48bc-80a7-6ba378ac8e91',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage Cloud Actions on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/cloud-actions/actions/reset' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Resets Cloud Actions.',
                'description' => 'Resets Cloud Actions to the default on an environment.',
                'operationId' => 'postEnvironmentCloudActionsReset',
                'x-cli-name' => 'environments:cloud-actions-reset',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Cloud Actions have been reset to the default.',
                                    'notification' => 'e5a15d33-ee5a-4af1-bfeb-4e76b3d33b4b',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/actions/reset',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/cloud-actions/actions',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/e5a15d33-ee5a-4af1-bfeb-4e76b3d33b4b',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage Cloud Actions on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/code' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deploys code to this environment.',
                'description' => 'Deploys code to this environment.',
                'operationId' => 'postEnvironmentsDeployCode',
                'x-cli-name' => 'environments:code-deploy',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_deploy-code',
                            ],
                            'example' => [
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                                'message' => 'Optional commit message',
                                'cloud-actions' => [],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_deploy-code',
                            ],
                            'example' => [
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                                'message' => 'Optional commit message',
                                'cloud-actions' => [],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Code being deployed' => [
                                        'value' => [
                                            'message' => 'Deploying code.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93/code',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/a49eeebb-0929-444a-972c-07b94ce93ab9',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Can only be deployed to environment within same application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'source' => 'Code can only be deployed from an environment within the same application.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to deploy code to this environment.',
                                        ],
                                    ],
                                    'Cannot deploy code on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code cannot be deployed on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot deploy code on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code cannot be deployed on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot be deployed to itself' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Code cannot be deployed from an environment to itself.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/code/actions/switch' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Switches code on this environment to a different branch or release tag.',
                'description' => 'Switches code on this environment to a different branch or release tag.',
                'operationId' => 'postEnvironmentsSwitchCode',
                'x-cli-name' => 'environments:code-switch',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_switch-code',
                            ],
                            'example' => [
                                'branch' => 'my-feature-branch',
                                'cloud-actions' => [],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_switch-code',
                            ],
                            'example' => [
                                'branch' => 'my-feature-branch',
                                'cloud-actions' => [],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Switching code' => [
                                        'value' => [
                                            'message' => 'Switching code.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/861-ddccebef-eb2f-48ce-a92f-e0a16a3a0b53/code/actions/switch',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/bfd9a39b-a85e-4de3-8a70-042d1c7e607a',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Branch does not exist' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'branch' => 'The branch or tag "my-feature-branch" does not exist within this environment.',
                                            ],
                                        ],
                                    ],
                                    'Invalid branch name' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'branch' => 'The branch name contains invalid characters.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to deploy code to this environment.',
                                        ],
                                    ],
                                    'Cannot deploy code on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code cannot be deployed on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot deploy code on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code cannot be switched on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/code/actions/import' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Imports a site to this environment.',
                'description' => 'Imports a site to this environment.',
                'operationId' => 'postEnvironmentsImportSite',
                'x-cli-name' => 'environments:site-import',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_import-site',
                            ],
                            'example' => [
                                'url' => 'http://www.example.com/path/to/site.tar.gz',
                                'name' => 'Drupal 8',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_import-site',
                            ],
                            'example' => [
                                'url' => 'http://www.example.com/path/to/site.tar.gz',
                                'name' => 'Drupal 8',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Site is being imported' => [
                                        'value' => [
                                            'message' => 'The site is being imported.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/code/actions/import',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/d82a122d-b7b8-46fc-9999-39cb824fac8d',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Invalid URL' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'url' => 'Invalid URL format.',
                                            ],
                                        ],
                                    ],
                                    'Cannot be imported on application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Sites cannot be imported on this application.',
                                            ],
                                        ],
                                    ],
                                    'File format not supported' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The installation file is not supported. It must be a Drush make file (.make) or a Gzip-compressed tar archive (.tar.gz or .tgz).',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to deploy code to this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Sites cannot be imported on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/crons' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return environment cron jobs.',
                'operationId' => 'getCronJobsByEnvironmentId',
                'x-cli-name' => 'environments:cron-job-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Returns a list of the cron jobs on an environment.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_crons',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 'e82b77cc-a9ed-4458-b12c-d87af1a795ad',
                                                'server' => [
                                                    'id' => '18',
                                                    'name' => 'web-18',
                                                ],
                                                'command' => '/usr/local/bin/drush cc all',
                                                'minute' => '25',
                                                'hour' => '7',
                                                'day_month' => '*',
                                                'month' => '*',
                                                'day_week' => '*',
                                                'label' => 'Clear drush caches',
                                                'flags' => [
                                                    'enabled' => true,
                                                    'system' => false,
                                                    'on_any_web' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons/e82b77cc-a9ed-4458-b12c-d87af1a795ad',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '8eea655e-71be-4c71-bf5b-9c5c9a5c5b43',
                                                'server' => [
                                                    'id' => '6',
                                                    'name' => 'web-6',
                                                ],
                                                'command' => '/usr/local/bin/drush -r /var/www/html/qa3/docroot ah-db-backup dbname',
                                                'minute' => '12',
                                                'hour' => '9',
                                                'day_month' => '*',
                                                'month' => '*',
                                                'day_week' => '*',
                                                'label' => 'Run backup',
                                                'flags' => [
                                                    'enabled' => false,
                                                    'system' => true,
                                                    'on_any_web' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons/8eea655e-71be-4c71-bf5b-9c5c9a5c5b43',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Cron jobs do not exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Creates a scheduled job with cron.',
                'description' => 'Creates a scheduled job with cron on an environment.',
                'operationId' => 'postEnvironmentCrons',
                'x-cli-name' => 'environments:cron-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-cron',
                            ],
                            'example' => [
                                'command' => '/usr/local/bin/drush cc all',
                                'frequency' => '*/30 * * * *',
                                'label' => 'My New Cron',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-cron',
                            ],
                            'example' => [
                                'command' => '/usr/local/bin/drush cc all',
                                'frequency' => '*/30 * * * *',
                                'label' => 'My New Cron',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Adding cron' => [
                                        'value' => [
                                            'message' => 'Creating a new cron.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons/936a55fd-29eb-4317-bb6e-ad2a94b24589',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/01fde3bb-b65f-4629-b761-9072a35e8e50',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Label in use' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The label for the cron is already used by another cron. Please choose another label.',
                                            ],
                                        ],
                                    ],
                                    'Invalid frequency' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'frequency' => 'The cron frequency does not appear to be valid.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to create a cron in this environment.',
                                        ],
                                    ],
                                    'Node.js application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs are not available for Node.js applications.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs cannot be created on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Cron not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron does not belong to this environment, and cannot be updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/crons/{cronId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific cron job.',
                'description' => 'Return details about a specific cron job by environment ID and cron job ID.',
                'operationId' => 'getCron',
                'x-cli-name' => 'environments:cron-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cron',
                                ],
                                'example' => [
                                    'id' => 'e82b77cc-a9ed-4458-b12c-d87af1a795ad',
                                    'server' => [
                                        'id' => '18',
                                        'name' => 'web-18',
                                    ],
                                    'command' => '/usr/local/bin/drush cc all',
                                    'minute' => '25',
                                    'hour' => '7',
                                    'day_month' => '*',
                                    'month' => '*',
                                    'day_week' => '*',
                                    'label' => 'Clear drush caches',
                                    'flags' => [
                                        'enabled' => true,
                                        'system' => false,
                                        'on_any_web' => true,
                                    ],
                                    'environment' => [
                                        'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'dev',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons/e82b77cc-a9ed-4458-b12c-d87af1a795ad',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/crons',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Cron jobs do not exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Modify an existing scheduled job.',
                'description' => 'Modify an existing scheduled job on an environment.',
                'operationId' => 'putCron',
                'x-cli-name' => 'environments:cron-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cron',
                            ],
                            'example' => [
                                'command' => '/usr/local/bin/drush7 cc all',
                                'frequency' => '*/5 * * * *',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cron',
                            ],
                            'example' => [
                                'command' => '/usr/local/bin/drush7 cc all',
                                'frequency' => '*/5 * * * *',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Update cron' => [
                                        'value' => [
                                            'message' => 'Updating cron.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons/2582',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/ba232d96-dfe7-4850-9ca7-02e01a04f58d',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify this cron.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs are not available for Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron does not belong to this environment, and cannot be updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Label in use' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => [
                                                'name' => 'The label for the cron is already used by another cron. Please choose another label.',
                                            ],
                                        ],
                                    ],
                                    'Invalid frequency' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'frequency' => 'The cron frequency does not appear to be valid.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes a cron job.',
                'description' => 'Deletes a cron job.',
                'operationId' => 'postEnvironmentCronDelete',
                'x-cli-name' => 'environments:cron-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Deleting cron' => [
                                        'value' => [
                                            'message' => 'Deleting cron.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons/1891',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/767cee8d-05f6-4761-a3dc-755957dfc9e6',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this cron.',
                                        ],
                                    ],
                                    'Non hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs cannot be deleted on non-hosted applications.',
                                        ],
                                    ],
                                    'Node.js application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs are not available for Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron does not belong to this environment, and cannot be removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/crons/{cronId}/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables a cron job.',
                'description' => 'Enables a cron job.',
                'operationId' => 'postEnvironmentCronEnable',
                'x-cli-name' => 'environments:cron-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The cron is being enabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons/1889/actions/enable',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/crons/1889/actions',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/ceda2e82-54b7-4181-ae97-6a3163b187b8',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify this cron.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs cannot be enabled on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No cron or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron does not belong to this environment, and cannot be enabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Action currently unavailable' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The cron is already enabled. No action taken.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/crons/{cronId}/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables a cron job.',
                'description' => 'Disables a cron job.',
                'operationId' => 'postEnvironmentCronDisable',
                'x-cli-name' => 'environments:cron-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The cron is being disabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/crons/1234/actions/disable',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-af127084-204d-430c-a2b7-3a6130269b27/crons/1234/actions',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/7b37b885-8ae4-454b-b8fa-ffaeff54f6a4',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify this cron.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Cron jobs cannot be disabled on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No cron or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The cron does not belong to this environment, and cannot be disabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Action currently unavailable' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The cron is already disabled. No action taken.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of databases.',
                'description' => 'Returns a list of databases.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `id`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `id`'."\n",
                'operationId' => 'getEnvironmentsDatabases',
                'x-cli-name' => 'environments:database-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_databases',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 14,
                                                'name' => 'my_db',
                                                'user_name' => 'my_db_user',
                                                'password' => 'supersecretdbpassword1!',
                                                'url' => 'mysql://my_db_user:supersecretdbpassword1!@dbhost.example.com/my_db',
                                                'db_host' => 'dbhost.example.com',
                                                'ssh_host' => 'sshhost.example.com',
                                                'flags' => [
                                                    'default' => true,
                                                ],
                                                'environment' => [
                                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/14',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 15,
                                                'name' => 'my_db_stage',
                                                'user_name' => 'my_db_user',
                                                'password' => 'supersecretdbpassword1!',
                                                'url' => 'mysql://my_db_user:supersecretdbpassword1!@dbhost.example.com/my_db_stage',
                                                'db_host' => 'dbhost.example.com',
                                                'ssh_host' => 'sshhost.example.com',
                                                'flags' => [
                                                    'default' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '25-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/25-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/15',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Copies a database to this environment.',
                'description' => 'Copies a database to this environment.',
                'operationId' => 'postEnvironmentsDatabases',
                'x-cli-name' => 'environments:database-copy',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'source',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the database to copy to the selected environment.',
                                    ],
                                    'source' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the environment to copy the database from.',
                                        'minLength' => 38,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'db_name',
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'source',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the database to copy to the selected environment.',
                                    ],
                                    'source' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the environment to copy the database from.',
                                        'minLength' => 38,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'db_name',
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Database being copied' => [
                                        'value' => [
                                            'message' => 'The database is being copied',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93/databases',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/a49eeebb-0929-444a-972c-07b94ce93ab9',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-8fc7d3c6-2a53-11e9-b210-d663bd873d93',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Database does not exist in environment' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'database' => 'The database does not exist in this environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to copy this database.',
                                        ],
                                    ],
                                    'Action not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be copied on non-hosted applications.',
                                        ],
                                    ],
                                    'Action not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Databases cannot be copied on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot be copied to itself' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'A database cannot be copied from an environment to itself.',
                                        ],
                                    ],
                                    'Must belong to same application' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The environments do not belong to the same application.',
                                        ],
                                    ],
                                    'Cannot be copied to production' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'A database cannot be copied to an environment that is currently in production mode.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific database.',
                'description' => 'Return details about a specific database.',
                'operationId' => 'getEnvironmentsDatabase',
                'x-cli-name' => 'environments:database-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database',
                                ],
                                'example' => [
                                    'id' => 14,
                                    'name' => 'my_db',
                                    'user_name' => 'my_db_user',
                                    'password' => 'supersecretdbpassword1!',
                                    'url' => 'mysql://my_db_user:supersecretdbpassword1!@dbhost.example.com/my_db',
                                    'db_host' => 'dbhost.example.com',
                                    'ssh_host' => 'sshhost.example.com',
                                    'flags' => [
                                        'default' => true,
                                    ],
                                    'environment' => [
                                        'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'dev',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/14',
                                        ],
                                        'backups' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/14/backups',
                                        ],
                                        'php-config' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/14/php-config',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}/php-config' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns PHP configuration details for this database.',
                'description' => 'Returns PHP configuration details for this database.',
                'operationId' => 'getEnvironmentsDatabasePhpConfig',
                'x-cli-name' => 'environments:database-php-config-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-php-config',
                                ],
                                'example' => [
                                    'drupal' => 'if (file_exists(\'/var/www/site-php\')) {'."\n"
                                        .'	require \'/var/www/site-php/sitegroup/myenv-settings.inc\';'."\n"
                                        .'}',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/databases/mydb/php-config',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/databases/mydb',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}/backups' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of backups.',
                'description' => 'Returns a list of backups.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `type`'."\n"
                    .'* `created` Specifies an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) formatted date.'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `type`'."\n"
                    .'* `created`'."\n",
                'operationId' => 'getEnvironmentsDatabaseBackups',
                'x-cli-name' => 'environments:database-backup-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_deprecated-from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_deprecated-to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backups',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 1,
                                                'database' => [
                                                    'id' => 14,
                                                    'name' => 'db_name',
                                                ],
                                                'type' => 'daily',
                                                'started_at' => '2012-05-15T12:00:00.000Z',
                                                'completed_at' => '2012-05-15T12:00:00.000Z',
                                                'flags' => [
                                                    'deleted' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Production',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/1',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/1/actions/download',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 2,
                                                'database' => [
                                                    'id' => 14,
                                                    'name' => 'db_name',
                                                ],
                                                'type' => 'daily',
                                                'started_at' => '2012-03-28T12:00:00.000Z',
                                                'completed_at' => '2012-03-28T12:00:01.000Z',
                                                'flags' => [
                                                    'deleted' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Production',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/2',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/2/actions/download',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 3,
                                                'database' => [
                                                    'id' => 14,
                                                    'name' => 'db_name',
                                                ],
                                                'type' => 'daily',
                                                'started_at' => '2017-01-08T04:00:00.000Z',
                                                'completed_at' => '2017-01-08T04:00:01.000Z',
                                                'flags' => [
                                                    'deleted' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Production',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/3',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/3/actions/download',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 4,
                                                'database' => [
                                                    'id' => 14,
                                                    'name' => 'db_name',
                                                ],
                                                'type' => 'daily',
                                                'started_at' => '2017-01-08T05:00:02.000Z',
                                                'completed_at' => '2017-01-08T05:00:03.000Z',
                                                'flags' => [
                                                    'deleted' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Production',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/4',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases',
                                                    ],
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name/backups/4/actions/download',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Create a backup.',
                'description' => 'Create a backup.',
                'operationId' => 'postEnvironmentsDatabaseBackups',
                'x-cli-name' => 'environments:database-backup-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Creating backup' => [
                                        'value' => [
                                            'message' => 'Creating the backup.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/databases/my_db/backups/',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/databases/my_db/',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Database does not exist in environment' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'database' => 'The database does not exist in this environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to backup this database.',
                                        ],
                                    ],
                                    'Action not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Action not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups do not exist on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}/backups/{backupId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific backup.',
                'description' => 'Return details about a specific backup.',
                'operationId' => 'getEnvironmentsDatabaseBackup',
                'x-cli-name' => 'environments:database-backup-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_backup-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup',
                                ],
                                'example' => [
                                    'id' => 1,
                                    'database' => [
                                        'id' => 14,
                                        'name' => 'db_name',
                                    ],
                                    'type' => 'daily',
                                    'started_at' => '2012-05-15T12:00:00.000Z',
                                    'completed_at' => '2012-05-15T12:00:00.000Z',
                                    'flags' => [
                                        'deleted' => false,
                                    ],
                                    'environment' => [
                                        'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'Production',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/database-backups/1',
                                        ],
                                        'download' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/database-backups/1/actions/download',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/database-backups',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'environment' => [
                                            'id' => '1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                            'name' => 'Production',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                ],
                                            ],
                                        ],
                                        'database' => [
                                            'id' => 14,
                                            'name' => 'db_name',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/1-a47ac10b-58cc-4372-a567-0e02b2c3d470/databases/db_name',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database backup not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database backup you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases backups do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases backups do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes a database backup.',
                'description' => 'Deletes a database backup.',
                'operationId' => 'deleteEnvironmentsDatabaseBackup',
                'x-cli-name' => 'environments:database-backup-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_backup-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Deleting backup' => [
                                        'value' => [
                                            'message' => 'Deleting the database backup.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/databases/my_db/backups/1',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/databases/my_db/backups',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Database does not exist in environment' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'backup' => 'The database does not exist in this environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this backup.',
                                        ],
                                    ],
                                    'Action not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Action not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups do not exist on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}/backups/{backupId}/actions/download' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Downloads the database backup file.',
                'description' => 'Downloads the database backup file.',
                'operationId' => 'getEnvironmentsDatabaseDownloadBackup',
                'x-cli-name' => 'environments:database-backup-download',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_backup-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/octet-stream' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file',
                                ],
                            ],
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file-download',
                                ],
                                'example' => [
                                    'url' => 'http://example.com/backup.gz',
                                    'expires_at' => '2020-06-16T15:15:05.000Z',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-482e4650-1b74-44db-8d4e-e86a3b1ed908/databases/sitedatabase/backups/4423492/actions/download',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-482e4650-1b74-44db-8d4e-e86a3b1ed908/databases/sitedatabase/backups/4423492/actions',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/8a1c8503-0dae-4b08-a917-d2f01f4971ca',
                                        ],
                                    ],
                                ],
                            ],
                            'text/html' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file-download',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to download this backup.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database backup you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Databases backups do not exist on non-hosted applications.',
                                        ],
                                    ],
                                    'Do not exist on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Databases backups do not exist on Node.js applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/databases/{databaseName}/backups/{backupId}/actions/restore' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Restores this backup to the appropriate environment\'s database.',
                'description' => 'Restores this backup to the appropriate environment\'s database.',
                'operationId' => 'postEnvironmentsDatabaseRestoreBackup',
                'x-cli-name' => 'environments:database-backup-restore',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_backup-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Restoring backup' => [
                                        'value' => [
                                            'message' => 'Restoring the database backup.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/databases/test_database_1/backups/4189098/actions/restore',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/f295cd91-c3c0-422c-a1ab-e91fe972041a',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Does not belong to environment' => [
                                        'value' => [
                                            'error' => 'validation_error',
                                            'message' => [
                                                'backup' => 'The database backup does not belong to this environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to restore a backup to this environment.',
                                        ],
                                    ],
                                    'Action not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups cannot be restored on non-hosted applications.',
                                        ],
                                    ],
                                    'Action not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Database backups cannot be restored on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Database not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The database you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Database not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The database backup has not completed yet, and cannot be restored at this time.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/dns' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns DNS configuration details for an environment.',
                'description' => 'Returns environment DNS configuration information for apex domain and subdomains.',
                'operationId' => 'getEnvironmentsDns',
                'x-cli-name' => 'environments:dns-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns',
                                ],
                                'example' => [
                                    'apex_domain' => [
                                        [
                                            'type' => 'A',
                                            'value' => '192.0.2.1',
                                        ],
                                        [
                                            'type' => 'AAAA',
                                            'value' => '2001:0db8:1729:aa03:80b5:1c65:bea:42ff',
                                        ],
                                    ],
                                    'subdomains' => [
                                        [
                                            'type' => 'CNAME',
                                            'value' => 'subdomain.example.com',
                                        ],
                                    ],
                                    'regional_configuration' => [
                                        'apex_domain' => [
                                            [
                                                'type' => 'A',
                                                'value' => '192.0.2.1',
                                            ],
                                            [
                                                'type' => 'AAAA',
                                                'value' => '2001:0db8:1729:aa03:80b5:1c65:bea:42ff',
                                            ],
                                        ],
                                        'subdomains' => [
                                            [
                                                'type' => 'CNAME',
                                                'value' => 'subdomain.example.com',
                                            ],
                                        ],
                                    ],
                                    'global_configuration' => [
                                        'apex_domain' => [
                                            [
                                                'type' => 'A',
                                                'value' => '192.0.2.3',
                                            ],
                                            [
                                                'type' => 'A',
                                                'value' => '192.0.2.4',
                                            ],
                                            [
                                                'type' => 'AAAA',
                                                'value' => '2001:0db8:1730:aa03:80b5:1c65:bea:42ff',
                                            ],
                                        ],
                                        'subdomains' => [
                                            [
                                                'type' => 'CNAME',
                                                'value' => 'subdomain.example.com',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-47c9ae06-2a57-11e9-b210-d663bd873d93/dns',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-47c9ae06-2a57-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of domains.',
                'description' => 'Returns a list of domains.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `hostname`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `hostname`'."\n",
                'operationId' => 'getEnvironmentsDomains',
                'x-cli-name' => 'environments:domain-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domains',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'hostname' => 'www.example.com',
                                                'cdn' => [
                                                    'status' => 'installing',
                                                ],
                                                'flags' => [
                                                    'default' => true,
                                                    'active' => true,
                                                    'wildcard' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-abcd1234-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains/www.example.com',
                                                    ],
                                                    'status' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains/www.example.com/status',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'hostname' => 'other.example.com',
                                                'cdn' => null,
                                                'flags' => [
                                                    'default' => false,
                                                    'active' => false,
                                                    'wildcard' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-abcd1234-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains/other.example.com',
                                                    ],
                                                    'status' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains/other.example.com/status',
                                                    ],
                                                    'dns' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/dns',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'hostname' => '*.example.com',
                                                'cdn' => [
                                                    'status' => 'active',
                                                ],
                                                'flags' => [
                                                    'default' => false,
                                                    'active' => false,
                                                    'wildcard' => true,
                                                ],
                                                'environment' => [
                                                    'id' => '24-abcd1234-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/domains/*.example.com',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Only available for hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Domain names do not exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Adds a domain to the environment.',
                'description' => 'Adds a domain to the environment.',
                'operationId' => 'postEnvironmentsDomains',
                'x-cli-name' => 'environments:domain-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'hostname' => [
                                        'type' => 'string',
                                        'format' => 'hostname',
                                        'description' => 'The domain name to add.',
                                        'minLength' => 3,
                                        'maxLength' => 253,
                                    ],
                                ],
                            ],
                            'example' => [
                                'hostname' => 'example.com',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'hostname' => [
                                        'type' => 'string',
                                        'description' => 'The domain name to add.',
                                        'minLength' => 3,
                                        'maxLength' => 253,
                                    ],
                                ],
                            ],
                            'example' => [
                                'hostname' => 'example.com',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Adding domain' => [
                                        'value' => [
                                            'message' => 'Adding domain example.com',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/642-99d416c4-88b5-48c0-ae8e-4719007d7b8d/domains',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/737a97a4-4c02-47e4-9924-d008de1aa7e5',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/642-99d416c4-88b5-48c0-ae8e-4719007d7b8d',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to add a domain to this environment.',
                                        ],
                                    ],
                                    'Cannot be added with Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Domains cannot be added on Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'Cannot be added with Acquia Cloud Site Factory' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Domains cannot be added on Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Can only be created on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Domains cannot be created on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot add names to application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You cannot add domain names on this application.',
                                        ],
                                    ],
                                    'Domain name already used' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The domain name cannot be used, as it already exists within this application\'s environments.',
                                        ],
                                    ],
                                    'Error adding domain name' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This domain cannot be added to this environment. For more details, contact Acquia Support.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains/actions/clear-varnish' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Clears the Varnish cache for one or more domains attached to this environment.',
                'deprecated' => true,
                'description' => 'Clears the Varnish cache for one or more domains attached to this environment.',
                'operationId' => 'postEnvironmentsDomainsClearVarnish',
                'x-cli-name' => 'environments:domains-clear-varnish',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'required' => [
                                    'domains',
                                ],
                                'properties' => [
                                    'domains' => [
                                        'type' => 'array',
                                        'description' => 'A list of domains to clear the Varnish cache for.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'hostname',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'domains' => [
                                    'domain1.example.com',
                                    'domain2.example.com',
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Clearing cache' => [
                                        'value' => [
                                            'message' => 'Varnish is being cleared for the selected domains.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/domains/actions/clear-varnish',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to clear Varnish on this environment.',
                                        ],
                                    ],
                                    'Can only be cleared on hosting applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Varnish cannot be cleared on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be cleared for Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Varnish cannot be cleared on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains/{domain}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific domain.',
                'description' => 'Return details about a specific domain.',
                'operationId' => 'getEnvironmentsDomain',
                'x-cli-name' => 'environments:domain-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain',
                                ],
                                'example' => [
                                    'hostname' => 'example.com',
                                    'cdn' => [
                                        'status' => 'active',
                                    ],
                                    'flags' => [
                                        'default' => false,
                                        'active' => true,
                                        'wildcard' => false,
                                    ],
                                    'environment' => [
                                        'id' => '24-47c9ae06-2a57-11e9-b210-d663bd873d93',
                                        'name' => 'dev',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-47c9ae06-2a57-11e9-b210-d663bd873d93/domains/example.com',
                                        ],
                                        'status' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-47c9ae06-2a57-11e9-b210-d663bd873d93/domains/example.com/status',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-47c9ae06-2a57-11e9-b210-d663bd873d93/domains',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Only exist on hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Domain names do not exist on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Removes the domain from this environment.',
                'description' => 'Removes the domain from this environment.',
                'operationId' => 'deleteEnvironmentsDomain',
                'x-cli-name' => 'environments:domain-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Deleting domain' => [
                                        'value' => [
                                            'message' => 'Removing the domain example.com',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/domains/example.com',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/67b7f08f-2dff-4c86-a8a0-35c4196880a3',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/domains',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove domains on this environment.',
                                        ],
                                    ],
                                    'Cannot be removed with Acquia Cloud Site Factory' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Domains cannot be removed on Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Can only be removed on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Domains cannot be removed on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Domain not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain you are trying to delete does not exist, or you do not have permission to modify it.',
                                        ],
                                    ],
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains/{domain}/actions/clear-varnish' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Clears the Varnish cache for the specified domain.',
                'deprecated' => true,
                'description' => 'Clears the Varnish cache for the specified domain.',
                'operationId' => 'postEnvironmentsDomainClearVarnish',
                'x-cli-name' => 'environments:domain-clear-varnish',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Clearing cache' => [
                                        'value' => [
                                            'message' => 'Varnish is being cleared for domain \'example.com\'.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/domains/example.com/actions/clear-varnish',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to clear Varnish on this environment.',
                                        ],
                                    ],
                                    'Can only be cleared on hosting applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Varnish cannot be cleared on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be cleared for Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Varnish cannot be cleared on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains/{domain}/actions/clear-caches' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Clears the caches for the specified domain.',
                'description' => 'Clear caches for Varnish and Platform CDN (if Platform CDN is enabled).',
                'operationId' => 'postEnvironmentsDomainClearCaches',
                'x-cli-name' => 'environments:domain-clear-caches',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Clearing cache' => [
                                        'value' => [
                                            'message' => 'Caches are being cleared.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/domains/example.com/actions/clear-caches',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to clear caches on this environment.',
                                        ],
                                    ],
                                    'Can only be cleared on hosting applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Caches cannot be cleared on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be cleared for Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Caches cannot be cleared on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/domains/{domain}/status' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns details about the domain.',
                'description' => 'Returns details about the domain.',
                'operationId' => 'getEnvironmentsDomainStatus',
                'x-cli-name' => 'environments:domain-status-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-status',
                                ],
                                'example' => [
                                    'hostname' => 'example.com',
                                    'flags' => [
                                        'default' => false,
                                        'active' => true,
                                        'dns_resolves' => true,
                                        'acquia_hosted' => true,
                                    ],
                                    'ip_addresses' => [
                                        '12.23.34.45',
                                    ],
                                    'cnames' => [
                                        'another.example.com',
                                    ],
                                    'environment' => [
                                        'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'dev',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/domains/example.com/status',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/domains/example.com',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Unable to determine status' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Unable to determine status for this domain.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/eips' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return a list of Web EIPs.',
                'description' => 'Returns a list of Web EIPs.',
                'operationId' => 'getEIPs',
                'x-cli-name' => 'environments:eips-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eips',
                                ],
                                'example' => [
                                    'total' => 1,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/eips',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 'f668295f-cbba-472d-8b75-c76ab89e553a',
                                                'status' => 'created',
                                                'ipv4' => '203.0.113.1',
                                                'ipv6' => '0:0:0:0:0:ffff:cb00:7101',
                                                'flags' => [
                                                    'active' => true,
                                                    'legacy' => false,
                                                    'deprecated' => false,
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/email' => [
            'get' => [
                'tags' => [
                    'Email',
                ],
                'summary' => 'Returns the status of Platform Email for an Environment.',
                'description' => 'Returns the status of Platform Email for an Environment.',
                'operationId' => 'getEmailStatus',
                'x-cli-name' => 'environments:email-status',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email',
                                ],
                                'example' => [
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470/email',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-abcd1234-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/files' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Copies files to this environment.',
                'description' => 'Copies files to this environment.',
                'operationId' => 'postEnvironmentsFiles',
                'x-cli-name' => 'environments:file-copy',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'source' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the environment to copy files from.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'source' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the environment to copy files from.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'source' => '14-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Files queued for copying' => [
                                        'value' => [
                                            'message' => 'Copying files.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-482e4650-1b74-44db-8d4e-e86a3b1ed908/files',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/d53fccec-5c1b-4ad4-b431-5cd39ad2b453',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-482e4650-1b74-44db-8d4e-e86a3b1ed908/files',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Must be within same application' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Files can only be copied from an environment within the same application.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to copy files to this environment.',
                                        ],
                                    ],
                                    'Cannot be copied on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Files cannot be copied on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be copied on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Files cannot be copied on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot be copied to itself' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Files cannot be copied from an environment to itself.',
                                        ],
                                    ],
                                    'Cannot be copied to production' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Files cannot be copied to an environment that is currently in production mode.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/logs' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of log files for this environment available for download.',
                'description' => 'Returns a list of log files for this environment available for download.',
                'operationId' => 'getEnvironmentsLogs',
                'x-cli-name' => 'environments:log-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_logs',
                                ],
                                'example' => [
                                    'total' => 6,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'apache-access',
                                                'type' => 'apache-access',
                                                'label' => 'Apache access',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/apache-access',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'apache-error',
                                                'type' => 'apache-error',
                                                'label' => 'Apache error',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/apache-error',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'drupal-request',
                                                'type' => 'drupal-request',
                                                'label' => 'Drupal request',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/drupal-request',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'drupal-watchdog',
                                                'type' => 'drupal-watchdog',
                                                'label' => 'Drupal watchdog',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/drupal-watchdog',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'fpm-access',
                                                'type' => 'fpm-access',
                                                'label' => 'Fpm access',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/fpm-access',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'fpm-error',
                                                'type' => 'fpm-error',
                                                'label' => 'Fpm error',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/fpm-error',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'php-error',
                                                'type' => 'php-error',
                                                'label' => 'PHP error',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/php-error',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'cloud-hook',
                                                'type' => 'cloud-hook',
                                                'label' => 'Cloud hook',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/cloud-hook',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'cronjob',
                                                'type' => 'cronjob',
                                                'label' => 'Cronjob',
                                                'flags' => [
                                                    'available' => false,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/cronjob',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'mysql-slow-query',
                                                'type' => 'mysql-slow-query',
                                                'label' => 'MySQL slow query',
                                                'flags' => [
                                                    'available' => true,
                                                ],
                                                '_links' => [
                                                    'download' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logs/mysql-slow-query',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Logs cannot be accessed on non-hosted environments.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/logs/{logType}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Downloads the log file.',
                'description' => 'Downloads the log file.',
                'operationId' => 'getEnvironmentsLog',
                'x-cli-name' => 'environments:log-download',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-type',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/octet-stream' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file',
                                ],
                            ],
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file-download',
                                ],
                                'examples' => [
                                    'File download' => [
                                        'value' => [
                                            'url' => 'http://appsiteenv.host.site-example.com/AH_DOWNLOAD?d=/mnt/gfs/appsiteenv/logs/log_type_log_appsiteenv_1574901901.sql&t=157492&env=fecac803549db0072661378f0f',
                                            'expires_at' => '2019-11-30T23:21:02.000Z',
                                        ],
                                    ],
                                ],
                            ],
                            'text/html' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file-download',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to download logs for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Cannot be downloaded on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Logs cannot be downloaded on non-hosted environments.',
                                        ],
                                    ],
                                    'Does not exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The file you are trying to access does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Creates a log file snapshot.',
                'description' => 'Creates a log file snapshot.',
                'operationId' => 'postEnvironmentsLog',
                'x-cli-name' => 'environments:log-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-type',
                    ],
                ],
                'requestBody' => [
                    'required' => false,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'from' => [
                                        'type' => 'string',
                                        'description' => 'An ISO-8601 formatted date retrieve results from. Date ranges are only supported on Acquia Cloud Next.',
                                    ],
                                    'to' => [
                                        'type' => 'string',
                                        'description' => 'An ISO-8601 formatted date retrieve results to. Date ranges are only supported on Acquia Cloud Next.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'from' => '2021-01-28T22:45:21.000Z',
                                'to' => '2021-01-29T23:55:21.000Z',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    201 => [
                        'description' => 'Created',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Is being created' => [
                                        'value' => [
                                            'message' => 'The log file is being created.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/logs/apache-access',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/logs',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/8b790313-8830-4810-baef-3b41b3786e9d',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid range' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Log snapshots must cover no more than 24 hours and can only be retrieved up to 30 days in the past.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to download logs for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Cannot be accessed on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Logs cannot be accessed on non-hosted environments.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Date range not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Date ranges for log file snapshots are not supported on this environment.',
                                        ],
                                    ],
                                    'Log snapshot not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Log snapshots are not supported on this environment.',
                                        ],
                                    ],
                                    'Log type not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Log file snapshot for mysql-slow-query is not available on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/logstream' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a logstream url and metadata.',
                'description' => 'Returns a logstream url and metadata.',
                'operationId' => 'getEnvironmentsLogstream',
                'x-cli-name' => 'environments:logstream-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_logstream',
                                ],
                                'example' => [
                                    'logstream' => [
                                        'url' => 'wss://logstream.example.com/ah_websocket/logstream/v1',
                                        'params' => [
                                            't' => 1516990002,
                                            'hmac' => 'd8b940bb5a1865e57b22734d541ed981c89f952e527b0a983d0e457437a43c23',
                                            'environment' => 'prod',
                                            'site' => 'clouduidev:qa4',
                                        ],
                                        'commands' => [
                                            'stream-environment',
                                            'enable',
                                            'disable',
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851/logstream',
                                        ],
                                        'wss' => [
                                            'href' => 'wss://logstream.example.com/ah_websocket/logstream/v1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-0c7e79ab-1c4a-424e-8446-76ae8be7e851',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Do not exist on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Logs cannot be accessed on non-hosted environments.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/livedev/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disable Live Development on this environment.',
                'description' => 'Disable Live Development on this environment.',
                'deprecated' => true,
                'operationId' => 'postEnvironmentsDisableLiveDev',
                'x-cli-name' => 'environments:livedev-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'discard' => [
                                        'type' => 'integer',
                                        'description' => 'Indicates whether uncommitted changes should be discarded or not.',
                                        'minimum' => 0,
                                        'maximum' => 1,
                                    ],
                                ],
                            ],
                            'example' => [
                                'discard' => 1,
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'discard' => [
                                        'type' => 'integer',
                                        'description' => 'Indicates whether uncommitted changes should be discarded or not.',
                                        'minimum' => 0,
                                        'maximum' => 1,
                                    ],
                                ],
                            ],
                            'example' => [
                                'discard' => 1,
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Disabling LiveDev' => [
                                        'value' => [
                                            'message' => 'Disabling LiveDev.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'LiveDev cannot be disabled on production' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'livedev' => 'LiveDev cannot be disabled on a production environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to disable LiveDev for this environment.',
                                        ],
                                    ],
                                    'Only available on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'LiveDev is not available on managed applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev is not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'LiveDev is not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev is not available on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'LiveDev already disabled' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'LiveDev is already disabled on this environment.',
                                        ],
                                    ],
                                    'Cannot be enabled or disabled on production' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'LiveDev cannot be disabled or enabled on a production environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/livedev/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enable Live Development on this environment.',
                'description' => 'Enable Live Development on this environment. Not supported on Acquia Cloud Next.',
                'deprecated' => true,
                'operationId' => 'postEnvironmentsEnableLiveDev',
                'x-cli-name' => 'environments:livedev-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Enabling LiveDev' => [
                                        'value' => [
                                            'message' => 'Enabling LiveDev.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/642-99d416c4-88b5-48c0-ae8e-4719007d7b8d/livedev/actions/enable',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/737a97a4-4c02-47e4-9924-d008de1aa7e5',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Cannot be enabled on production' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'livedev' => 'LiveDev cannot be enabled on a production environment.',
                                            ],
                                        ],
                                    ],
                                    'Cannot be enabled on CDE' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'livedev' => 'LiveDev cannot be enabled on a CD environment.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to enable LiveDev for this environment.',
                                        ],
                                    ],
                                    'Only available on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev cannot be enabled on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot cannot be enabled on managed applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev cannot be enabled for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Cannot cannot be enabled on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'LiveDev cannot be enabled on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'LiveDev already enabled' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'LiveDev is already enabled on this environment.',
                                        ],
                                    ],
                                    'LiveDev not supported' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'LiveDev is not available for Cloud Next environments.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/log-forwarding-destinations' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a collection of log forwarding destinations for this environment.',
                'description' => 'Returns a collection of log forwarding destinations for this environment.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `label`'."\n"
                    .'* `consumer`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `label`'."\n",
                'operationId' => 'getEnvironmentsLogForwardingDestinations',
                'x-cli-name' => 'environments:log-forwarding-destination-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destinations',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-185f07c7-9c4f-407b-8968-67892ebcb38a/log-forwarding-destinations',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'df4c5428-8d2e-453d-9edf-e412647449b1',
                                                'label' => 'Test destination',
                                                'consumer' => 'sumologic',
                                                'address' => 'example.com:1234',
                                                'credentials' => [
                                                    'certificate' => [
                                                        'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                        'expires_at' => '2018-07-16T16:15:33.000Z',
                                                    ],
                                                    'key' => null,
                                                    'token' => '204d892b449026f6e4ded264c8891c400df8fc8905f07beb5f70d706f6d4d5e5',
                                                ],
                                                'sources' => [
                                                    'apache-access',
                                                    'apache-error',
                                                ],
                                                'status' => 'active',
                                                'flags' => [
                                                    'enabled' => true,
                                                    'certificate_expiring' => false,
                                                ],
                                                'health' => [
                                                    'code' => '200',
                                                    'details' => 'Destination OK',
                                                    'summary' => 'OK',
                                                ],
                                                'environment' => [
                                                    'id' => '123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577',
                                                    'name' => 'Test',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b1',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'df4c5428-8d2e-453d-9edf-e412647449b5',
                                                'label' => 'Another test destination',
                                                'consumer' => 'syslog',
                                                'address' => '193.169.2.19:5678',
                                                'credentials' => [
                                                    'certificate' => [
                                                        'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                        'expires_at' => '2018-07-16T16:15:33.000Z',
                                                    ],
                                                    'key' => '1d0789d519c0b943cf38f401d30ffbdcd2e0c4cfb7c32ebc0c872bce62aadd4d',
                                                    'token' => '204d892b449026f6e4ded264c8891c400df8fc8905f07beb5f70d706f6d4d5e5',
                                                ],
                                                'sources' => [
                                                    'drupal-request',
                                                    'drupal-watchdog',
                                                ],
                                                'status' => 'active',
                                                'flags' => [
                                                    'enabled' => false,
                                                    'certificate_expiring' => true,
                                                ],
                                                'health' => [
                                                    'code' => '200',
                                                    'details' => 'Destination OK',
                                                    'summary' => 'OK',
                                                ],
                                                'environment' => [
                                                    'id' => '123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577',
                                                    'name' => 'Test',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b5',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view the log forwarding destinations for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Creates a log forwarding destination.',
                'description' => 'Creates a log forwarding destination.',
                'operationId' => 'postEnvironmentsLogForwardingDestinations',
                'x-cli-name' => 'environments:log-forwarding-destination-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'label',
                                    'sources',
                                    'consumer',
                                    'credentials',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The human-friendly identifier of the destination.',
                                    ],
                                    'sources' => [
                                        'type' => 'array',
                                        'description' => 'The list of log sources to forward.',
                                        'items' => [
                                            'type' => 'string',
                                            'enum' => [
                                                'apache-access',
                                                'apache-error',
                                                'varnish-access',
                                                'drupal-request',
                                                'drupal-watchdog',
                                                'php-error',
                                                'stdout',
                                                'stderr',
                                            ],
                                        ],
                                    ],
                                    'consumer' => [
                                        'type' => 'string',
                                        'description' => 'The application or provider consuming the logs.',
                                        'enum' => [
                                            'loggly',
                                            'splunk',
                                            'sumologic',
                                            'syslog',
                                        ],
                                    ],
                                    'credentials' => [
                                        'type' => 'object',
                                        'description' => 'Credential information.',
                                        'required' => [
                                            'certificate',
                                        ],
                                        'properties' => [
                                            'certificate' => [
                                                'type' => 'string',
                                                'description' => 'A public X.509 certificate in PEM format. Required for Splunk, Sumologic, and Syslog. Not supported by Loggly.',
                                            ],
                                            'key' => [
                                                'type' => 'string',
                                                'description' => 'A certificate private key associated with the consumer. Optional for Splunk, Sumologic, and Syslog.  Not supported by Loggly',
                                            ],
                                            'token' => [
                                                'type' => 'string',
                                                'description' => 'An API token associated with the consumer. Required by Logly and Sumologic. Optional for Syslog. Not supported by Splunk.',
                                            ],
                                        ],
                                    ],
                                    'address' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URL or host name and port of the destination.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'Test destination',
                                'sources' => [
                                    'apache-access',
                                    'apache-error',
                                ],
                                'consumer' => 'syslog',
                                'credentials' => [
                                    'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                ],
                                'address' => 'example.com:1234',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Log forwarding destination for the environment has been created.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/log-forwarding-destinations/95739829-0093-4673-9ee0-5f5bdac04d11',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/log-forwarding-destinations',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/bc17cfd2-487b-4e10-b3cf-9fe1f0c10e3f',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Log Forwarding not enabled' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Destinations can only be added to environments that have log forwarding enabled.',
                                            ],
                                        ],
                                    ],
                                    'At Log Forwarding destination maximum' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Environments may only have 2 log forwarding destinations.',
                                            ],
                                        ],
                                    ],
                                    'Source not supported' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'sources' => '\\"invalid-source\\" is not a supported source.',
                                            ],
                                        ],
                                    ],
                                    'Consumer not supported' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'consumer' => '\\"invalid-consumer\\" is not a supported consumer.',
                                            ],
                                        ],
                                    ],
                                    'Certificate invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Certificate not yet active' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is not yet active.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expired' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expired.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expiring' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expiring. Certificates must be valid for at least 30 days.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support certificate auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Loggly does not support certificate authentication.',
                                            ],
                                        ],
                                    ],
                                    'Loggly requires API token' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'An API token is required for Loggly.',
                                            ],
                                        ],
                                    ],
                                    'Splunk requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Splunk.',
                                            ],
                                        ],
                                    ],
                                    'Splunk does not support token auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Splunk does not support API token authentication.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Sumologic.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic requires token' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'An API token is required for Sumologic.',
                                            ],
                                        ],
                                    ],
                                    'Syslog requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Syslog.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support private key auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Loggly does not support private key authentication.',
                                            ],
                                        ],
                                    ],
                                    'Address invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => '\\"invalid-address\\" is not a valid address.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support custom URLs' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Loggly does not support custom URLs.',
                                            ],
                                        ],
                                    ],
                                    'Splunk only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Splunk only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Sumologic only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                    'Syslog only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Syslog only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to create a log forwarding destinations for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/log-forwarding-destinations/{logForwardingDestinationUuid}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns the specified log forwarding destination.',
                'description' => 'Returns the specified log forwarding destination.',
                'operationId' => 'getEnvironmentsLogForwardingDestination',
                'x-cli-name' => 'environments:log-forwarding-destination-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination',
                                ],
                                'example' => [
                                    'uuid' => 'df4c5428-8d2e-453d-9edf-e412647449b1',
                                    'label' => 'Test destination',
                                    'address' => 'example.com:1234',
                                    'consumer' => 'syslog',
                                    'credentials' => [
                                        'certificate' => [
                                            'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                            'expires_at' => '2018-07-16T16:15:33.000Z',
                                        ],
                                        'key' => '1d0789d519c0b943cf38f401d30ffbdcd2e0c4cfb7c32ebc0c872bce62aadd4d',
                                        'token' => '204d892b449026f6e4ded264c8891c400df8fc8905f07beb5f70d706f6d4d5e5',
                                    ],
                                    'sources' => [
                                        'apache-access',
                                        'apache-error',
                                    ],
                                    'status' => 'active',
                                    'flags' => [
                                        'enabled' => true,
                                        'certificate_expiring' => false,
                                    ],
                                    'health' => [
                                        'code' => '200',
                                        'details' => 'Destination OK',
                                        'summary' => 'OK',
                                    ],
                                    'environment' => [
                                        'id' => '123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577',
                                        'name' => 'Test',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view the log forwarding destination.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Log Forwarding destination not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The log forwarding destination you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Updates an environment\'s log forwarding destination.',
                'description' => 'Updates an environment\'s log forwarding destination.',
                'operationId' => 'putEnvironmentsLogForwardingDestination',
                'x-cli-name' => 'environments:log-forwarding-destination-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'consumer',
                                ],
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The human-friendly identifier of the destination.',
                                    ],
                                    'sources' => [
                                        'type' => 'array',
                                        'description' => 'The list of log sources to forward.',
                                        'items' => [
                                            'type' => 'string',
                                            'enum' => [
                                                'apache-access',
                                                'apache-error',
                                                'varnish-access',
                                                'drupal-request',
                                                'drupal-watchdog',
                                                'php-error',
                                                'stdout',
                                                'stderr',
                                            ],
                                        ],
                                    ],
                                    'consumer' => [
                                        'type' => 'string',
                                        'description' => 'The application or provider consuming the logs.',
                                        'enum' => [
                                            'loggly',
                                            'splunk',
                                            'sumologic',
                                            'syslog',
                                        ],
                                    ],
                                    'credentials' => [
                                        'type' => 'object',
                                        'description' => 'Credential information.',
                                        'required' => [
                                            'certificate',
                                        ],
                                        'properties' => [
                                            'certificate' => [
                                                'type' => 'string',
                                                'description' => 'A public X.509 certificate in PEM format. Required for Splunk, Sumologic, and Syslog. Not supported by Loggly.',
                                            ],
                                            'key' => [
                                                'type' => 'string',
                                                'description' => 'A certificate private key associated with the consumer. Optional for Splunk, Sumologic, and Syslog.  Not supported by Loggly',
                                            ],
                                            'token' => [
                                                'type' => 'string',
                                                'description' => 'An API token associated with the consumer. Required by Logly and Sumologic. Optional for Syslog. Not supported by Splunk.',
                                            ],
                                        ],
                                    ],
                                    'address' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URL or host name and port of the destination.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'Test destination',
                                'sources' => [
                                    'apache-access',
                                    'apache-error',
                                ],
                                'consumer' => 'syslog',
                                'credentials' => [
                                    'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                ],
                                'address' => 'example.com:1234',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Log forwarding destination has been updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/cf4c5328-8d2e-353d-9edf-e412647349b1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/340bf831-5377-49b9-7b26-87014b653346',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Log Forwarding not enabled' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Destinations can only be modified to environments that have log forwarding enabled.',
                                            ],
                                        ],
                                    ],
                                    'At Log Forwarding destination maximum' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Environments may only have 2 log forwarding destinations.',
                                            ],
                                        ],
                                    ],
                                    'Source not supported' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'sources' => '\\"invalid-source\\" is not a supported source.',
                                            ],
                                        ],
                                    ],
                                    'Consumer not supported' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'consumer' => '\\"invalid-consumer\\" is not a supported consumer.',
                                            ],
                                        ],
                                    ],
                                    'Certificate invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Certificate not yet active' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is not yet active.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expired' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expired.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expiring' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expiring. Certificates must be valid for at least 30 days.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support certificate auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Loggly does not support certificate authentication.',
                                            ],
                                        ],
                                    ],
                                    'Loggly requires API token' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'An API token is required for Loggly.',
                                            ],
                                        ],
                                    ],
                                    'Splunk requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Splunk.',
                                            ],
                                        ],
                                    ],
                                    'Splunk does not support token auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Splunk does not support API token authentication.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Sumologic.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic requires token' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'An API token is required for Sumologic.',
                                            ],
                                        ],
                                    ],
                                    'Syslog requires public certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'A public X.509 certificate is required for Syslog.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support private key auth' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'Loggly does not support private key authentication.',
                                            ],
                                        ],
                                    ],
                                    'Address invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => '\\"invalid-address\\" is not a valid address.',
                                            ],
                                        ],
                                    ],
                                    'Loggly does not support custom URLs' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Loggly does not support custom URLs.',
                                            ],
                                        ],
                                    ],
                                    'Splunk only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Splunk only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                    'Sumologic only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Sumologic only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                    'Syslog only accepts socket addresses' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'address' => 'Syslog only accepts socket addresses, consisting of a host and port.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify the log forwarding destination.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Log Forwarding destination not found on Environment' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => 'The environment does not have a log forwarding destination with the UUID 2c15b578-d31a-48ac-ab28-a8ef4c65f02b.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes the specified log forwarding destination.',
                'description' => 'Deletes the specified log forwarding destination.',
                'operationId' => 'deleteEnvironmentsLogForwardingDestination',
                'x-cli-name' => 'environments:log-forwarding-destination-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Log forwarding destination has been deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/dfe6afd7-3619-4ab7-8aef-ab26fb506b3a',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Log Forwarding not enabled' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => [
                                                'general' => 'Destinations can only be removed from environments that have log forwarding enabled.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete the log forwarding destination.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Log Forwarding destination not found on Environment' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => 'The environment does not have a log forwarding destination with the UUID 2c15b578-d31a-48ac-ab28-a8ef4c65f02b.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/log-forwarding-destinations/{logForwardingDestinationUuid}/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables the specified log forwarding destination.',
                'description' => 'Disables the specified log forwarding destination.',
                'operationId' => 'postEnvironmentsDisableLogForwardingDestination',
                'x-cli-name' => 'environments:log-forwarding-destination-disable',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Log forwarding destination has been disabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/d1e9dde1-7a60-4f39-951f-295ee7fe343f',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Log Forwarding not enabled' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => [
                                                'general' => 'Destinations can only be disabled on environments that have log forwarding enabled.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to disable this log forwarding destination.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Log Forwarding destination already disabled' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => 'The destination is already disabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/log-forwarding-destinations/{logForwardingDestinationUuid}/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables the specified log forwarding destination.',
                'description' => 'Enables the specified log forwarding destination.',
                'operationId' => 'postEnvironmentsEnableLogForwardingDestination',
                'x-cli-name' => 'environments:log-forwarding-destination-enable',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Log forwarding destination has been enabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations/df4c5428-8d2e-453d-9edf-e412647449b1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-ea9060c5-1ed8-46ec-87d5-2ce2a0861577/log-forwarding-destinations',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/63a804eb-ad38-4f66-9644-725f0c04e87c',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Log Forwarding not enabled' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => [
                                                'general' => 'Destinations can only be enabled on environments that have log forwarding enabled.',
                                            ],
                                        ],
                                    ],
                                    'Certificate invalid' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Certificate not yet active' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is not yet active.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expired' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expired.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expiring' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expiring. Certificates must be valid for at least 30 days.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to enable this log forwarding destination.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Log Forwarding destination not found on Environment' => [
                                        'value' => [
                                            'error' => 'invalid_operation',
                                            'message' => 'The destination is already enabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Does not return any data. Allows traversal to metrics groups endpoints.',
                'description' => 'Does not return any data. Allows traversal to metrics groups endpoints.',
                'operationId' => 'getEnvironmentsMetrics',
                'x-cli-name' => 'environments:metrics',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_metrics',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics',
                                        ],
                                        'stackmetrics' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics/stackmetrics',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Metrics are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics/stackmetrics' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Does not return any data. Allows traversal to StackMetrics endpoints.',
                'description' => 'Does not return any data. Allows traversal to StackMetrics endpoints.',
                'operationId' => 'getEnvironmentsStackMetrics',
                'x-cli-name' => 'environments:stack-metrics-data-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_metrics',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics/stackmetrics',
                                        ],
                                        'data' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics/stackmetrics/data',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/18-185f07c7-9c4f-407b-8968-67892ebcb38a/metrics',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Metrics are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics/stackmetrics/data' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns StackMetrics data for the metrics specified in the filter paramater (e.g., apache-access, web-cpu).',
                'description' => 'Returns StackMetrics data for the metrics specified by the filter paramater (e.g., apache-access, web-cpu).',
                'operationId' => 'getEnvironmentsStackMetricsData',
                'x-cli-name' => 'environments:stack-metrics-data-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-stack-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from-stack-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to-no-default',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_stack-metrics-data',
                                ],
                                'example' => [
                                    'total' => 4,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/metrics/stackmetrics/data?filter=metric=db-cpu,metric=web-cpu&from=2019-06-20',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'db-cpu',
                                                'datapoints' => [
                                                    [
                                                        '2.5395360194838',
                                                        '1447876380',
                                                    ],
                                                    [
                                                        '3.3012513318685',
                                                        '1447876680',
                                                    ],
                                                    [
                                                        '4.568567607842',
                                                        '1447876980',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-06-19T00:00:00.000Z',
                                                'metadata' => [
                                                    'host' => 'fsdb-1.prod.hosting.acquia.com',
                                                ],
                                            ],
                                            [
                                                'metric' => 'db-cpu',
                                                'datapoints' => [
                                                    [
                                                        '22.1395360194838',
                                                        '1447876380',
                                                    ],
                                                    [
                                                        '23.7012513318685',
                                                        '1447876680',
                                                    ],
                                                    [
                                                        '24.168567607842',
                                                        '1447876980',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-06-19T00:00:00.000Z',
                                                'metadata' => [
                                                    'host' => 'fsdb-2.prod.hosting.acquia.com',
                                                ],
                                            ],
                                            [
                                                'metric' => 'web-cpu',
                                                'datapoints' => [
                                                    [
                                                        '12.1395360194838',
                                                        '1447876380',
                                                    ],
                                                    [
                                                        '12.7012513318685',
                                                        '1447876680',
                                                    ],
                                                    [
                                                        '12.168567607842',
                                                        '1447876980',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-06-19T00:00:00.000Z',
                                                'metadata' => [
                                                    'host' => 'web-1.prod.hosting.acquia.com',
                                                ],
                                            ],
                                            [
                                                'metric' => 'web-cpu',
                                                'datapoints' => [
                                                    [
                                                        '2.1395360194838',
                                                        '1447876380',
                                                    ],
                                                    [
                                                        '2.7012513318685',
                                                        '1447876680',
                                                    ],
                                                    [
                                                        '2.168567607842',
                                                        '1447876980',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-06-19T00:00:00.000Z',
                                                'metadata' => [
                                                    'host' => 'web-2.prod.hosting.acquia.com',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Metrics are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics/usage' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Retrieves traversal links for an environment\'s usage data.',
                'description' => 'Retrieves traversal links for an environment\'s usage data.',
                'operationId' => 'getEnvironmentsUsageLinks',
                'x-cli-name' => 'environments:usage-links',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_usage',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics',
                                        ],
                                        'data' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data',
                                        ],
                                        'views' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                        ],
                                        'visits' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics/usage/data' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Retrieves usage data for an environment.',
                'description' => 'Filterable fields:'."\n"
                    .'* `metric` - One of: {`views`, `visits`}'."\n",
                'operationId' => 'getEnvironmentsUsageData',
                'x-cli-name' => 'environments:usage-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/data{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/metrics/usage/{usageMetric}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Retrieves usage metric data for an environment.',
                'description' => 'Retrieves usage metric data for an environment.',
                'operationId' => 'getEnvironmentsUsageMetricData',
                'x-cli-name' => 'environments:usage-metric-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_usage-metric',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-usage-metric',
                                ],
                                'example' => [
                                    'metric' => 'views',
                                    'datapoints' => [
                                        [
                                            '2019-03-13T00:00:00.000Z',
                                            '9',
                                        ],
                                        [
                                            '2019-03-14T00:00:00.000Z',
                                            '1',
                                        ],
                                    ],
                                    'last_data_at' => '2019-03-14T00:00:00.000Z',
                                    'metadata' => [
                                        'subscription' => [
                                            'uuids' => [
                                                '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                            ],
                                        ],
                                        'application' => [
                                            'uuids' => [
                                                '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                            ],
                                        ],
                                        'environment' => [
                                            'ids' => [
                                                '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view pricing metric data.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Data not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Pricing metric data for the environment with ID @id cannot be found, or you do not have access to it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/mod-proxy' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns the mod proxy status for an Environment.',
                'description' => 'Returns the mod proxy status for an Environment.',
                'operationId' => 'getModProxyStatus',
                'x-cli-name' => 'environments:mod-proxy-status',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_mod-proxy',
                                ],
                                'example' => [
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-eba23ecc-aa7c-41b0-8aa4-9d7ef250357d/mod-proxy',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-eba23ecc-aa7c-41b0-8aa4-9d7ef250357d',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Not available',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Mod proxy configuration is not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/mod-proxy/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables mod proxy for an environment.',
                'description' => 'Disables mod proxy for an environment.',
                'operationId' => 'postDisableModProxy',
                'x-cli-name' => 'environments:mod-proxy-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'OK',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-5ee5d7be-ec42-4ea3-9d98-1363dcfacfd23/mod-proxy/actions/disable',
                                        ],
                                    ],
                                    'message' => 'Mod proxy is being disabled.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to disable mod proxy for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Not available',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Mod proxy configuration is not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/mod-proxy/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables mod proxy for an environment.',
                'description' => 'Enables mod proxy for an environment.',
                'operationId' => 'postEnableModProxy',
                'x-cli-name' => 'environments:mod-proxy-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'OK',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/12-5ee5d7be-ec42-4ea3-9d98-1363dcfacfd23/mod-proxy/actions/enable',
                                        ],
                                    ],
                                    'message' => 'Mod proxy is being enabled.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to enable mod proxy for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Not available',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Mod proxy configuration is not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/production-mode/actions/disable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Disables production mode for an environment.',
                'description' => 'Removes protection from a production environment, taking it out of production mode.',
                'operationId' => 'postEnvironmentsDisableProductionMode',
                'x-cli-name' => 'environments:production-mode-disable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Production mode disabled' => [
                                        'value' => [
                                            'message' => 'Production mode has been disabled for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only production can be unprotected' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'productionmode' => 'Only production environments can be unprotected.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to disable Production mode for this environment.',
                                        ],
                                    ],
                                    'Only available on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Production mode is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot cannot be disabled on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Production mode is not available on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not in production mode' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This environment is not currently in production mode.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/production-mode/actions/enable' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Enables production mode for an environment.',
                'description' => 'Enables production mode for an environment. While production mode is enabled, files and databases cannot be copied to the production environment.',
                'operationId' => 'postEnvironmentsEnableProductionMode',
                'x-cli-name' => 'environments:production-mode-enable',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Production mode enabled' => [
                                        'value' => [
                                            'message' => 'Production mode has been enabled for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only production can be protected' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'productionmode' => 'Only production environments can be protected.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to enable Production mode for this environment.',
                                        ],
                                    ],
                                    'Only available on hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Production mode is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot cannot be enabled on Node.js applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Production mode cannot be enabled on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already in production mode' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This environment is already in production mode.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/search' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a traversal endpoint for search entities for the environment.',
                'description' => 'Does not return any data. Allows traversal to search entity endpoints.',
                'operationId' => 'getEnvironmentSearchList',
                'x-cli-name' => 'environments:search:list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_search',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                        ],
                                        'indexes' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Forbidden' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage search for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/search/indexes' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a collection of search indexes for an environment.',
                'description' => 'A collection of search indexes for an environment.',
                'operationId' => 'getEnvironmentSearchIndexes',
                'x-cli-name' => 'environments:search:indexes-list',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_indexes',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 0,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 'ABCDE-1234.test.example',
                                                'environment_id' => '123-3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                'database_role' => 'example',
                                                'status' => 'active',
                                                'solr_version' => '7',
                                                'url' => 'https://example.com/solr/ABCDE-1234.test.example/',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1234.test.example',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'configuration_set' => [
                                                        'id' => 'shared-1234567891011-121',
                                                        'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                        'label' => 'example-0',
                                                        'flags' => [
                                                            'custom' => false,
                                                        ],
                                                        'status' => 'active',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/shared-1234567891011-121',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 'ABCDE-1235.test.example',
                                                'environment_id' => '123-3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                'config_set_id' => 'ABCD5-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                'database_role' => 'example',
                                                'status' => 'active',
                                                'solr_version' => '7',
                                                'url' => 'https://example.com/solr/ABCDE-1235.test.example/',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1235.test.example',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'configuration_set' => [
                                                        'id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                        'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                                        'label' => 'example-1',
                                                        'flags' => [
                                                            'custom' => true,
                                                        ],
                                                        'status' => 'pending',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to view the search indexes on this environment.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Creates a search index for an environment.',
                'description' => 'Creates a search index for an environment.',
                'operationId' => 'postEnvironmentSearchIndexes',
                'x-cli-name' => 'environments:search:index-create',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'database_role',
                                ],
                                'properties' => [
                                    'config_set_id' => [
                                        'type' => 'string',
                                        'description' => 'A configuration set ID to assign to the index.',
                                    ],
                                    'database_role' => [
                                        'type' => 'string',
                                        'description' => 'The database role for the search index.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                'database_role' => 'example',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'database_role',
                                ],
                                'properties' => [
                                    'config_set_id' => [
                                        'type' => 'string',
                                        'description' => 'A configuration set ID to assign to the index.',
                                    ],
                                    'database_role' => [
                                        'type' => 'string',
                                        'description' => 'The database role for the search index.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                'database_role' => 'example',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The search index for example is being created.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1234.test.example',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/5494cbe6-fe98-4cfa-877b-05bab3be3bf8',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to create search configuration sets on this application.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found or not enough permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Configuration set not found or not enough permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The configuration set you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Search not available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'Acquia Search is not available for this subscription.',
                                        ],
                                    ],
                                    'Search index already available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'The search index is already available for this environment.',
                                        ],
                                    ],
                                    'Database does not exist' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'The database does not exist in this environment.',
                                        ],
                                    ],
                                    'Configuration set not available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'The configuration set is not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/search/indexes/{indexId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a search configuration set for an application',
                'description' => 'A specific search configuration set.',
                'operationId' => 'getEnvironmentSearchIndex',
                'x-cli-name' => 'environments:search:index-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_index-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_index',
                                ],
                                'example' => [
                                    'id' => 'ABCDE-1234.test.example',
                                    'environment_id' => '123-3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                    'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                    'database_role' => 'example',
                                    'status' => 'active',
                                    'health' => [
                                        'code' => 'OK',
                                        'summary' => 'Search index active',
                                        'details' => 'No issues.',
                                    ],
                                    'solr_version' => '7',
                                    'url' => 'https://example.com/solr/ABCDE-1234.test.example/',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1234.test.example',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'configuration_set' => [
                                            'id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                            'application_uuid' => '3f6d06a9-9236-411e-9dcc-44f0003a5905',
                                            'label' => 'example-1',
                                            'flags' => [
                                                'custom' => true,
                                            ],
                                            'status' => 'pending',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets/ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/applications/3f6d06a9-9236-411e-9dcc-44f0003a5905/search/config-sets',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to view the search indexes on this environment.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No index or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The search index you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Updates a search index on an environment.',
                'description' => 'Updates a search index on an environment.',
                'operationId' => 'putEnvironmentSearchIndex',
                'x-cli-name' => 'environments:search:index-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_index-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'config_set_id' => [
                                        'type' => 'string',
                                        'description' => 'The configuration set ID to update to.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'config_set_id' => [
                                        'type' => 'string',
                                        'description' => 'The configuration set ID to update to.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'config_set_id' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The search index ABCDE-1234.test.example is being updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1234.test.example',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/a0733378-eee4-4c29-bc2d-dea85e17b1aa',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to make a change in a search index on this environment.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Search not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Acquia Search is not available for this subscription.',
                                        ],
                                    ],
                                    'Configuration set not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The configuration set is not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Removes and deletes a specific search index from an environment',
                'description' => 'Removes and deletes a specific search index from an environment',
                'operationId' => 'deleteEnvironmentSearchIndex',
                'x-cli-name' => 'environments:search:index-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_index-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The search index has been removed from the environment.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/ABCDE-1234.test.example',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-3f6d06a9-9236-411e-9dcc-44f0003a5905/search/indexes/',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/d64552a2-7e3e-46af-b2a0-b122aae26a7d',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to delete search indexes on this environment.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or not enough permissions' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Search index not available' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The search index is not available to this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'validation_failed',
                                    'message' => 'Acquia Search is not available for this subscription.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of servers.',
                'description' => 'Returns a list of servers.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `region`'."\n"
                    .'* `hostname`'."\n"
                    .'* `ip`'."\n"
                    .'* `status`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `region`'."\n"
                    .'* `hostname`'."\n"
                    .'* `ip`'."\n"
                    .'* `status`'."\n",
                'operationId' => 'getEnvironmentsServers',
                'x-cli-name' => 'environments:servers-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_servers',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/servers',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 6,
                                                'name' => 'ded-6',
                                                'hostname' => 'ded-6.servers.acquia.com',
                                                'ssh_user' => 'user.dev',
                                                'ip' => '10.0.0.1',
                                                'status' => 'normal',
                                                'region' => 'us-west-1',
                                                'roles' => [
                                                    'web',
                                                    'db',
                                                ],
                                                'ami_type' => 'c1.medium',
                                                'operating_system' => 'xenial',
                                                'configuration' => [
                                                    'memcache' => 64,
                                                    'ecu' => 5,
                                                    'memory' => 1.7,
                                                ],
                                                'flags' => [
                                                    'elastic_ip' => false,
                                                    'active_web' => true,
                                                    'active_bal' => false,
                                                    'primary_db' => true,
                                                    'web' => true,
                                                    'database' => true,
                                                    'balancer' => false,
                                                    'fs' => false,
                                                    'memcache' => true,
                                                    'dedicated' => false,
                                                    'self_service' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/servers/6',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 4,
                                                'name' => 'bal-4',
                                                'hostname' => 'bal-4.servers.acquia.com',
                                                'ssh_user' => 'user.dev',
                                                'ip' => '10.0.0.2',
                                                'status' => 'normal',
                                                'region' => 'us-west-1',
                                                'roles' => [
                                                    'bal',
                                                ],
                                                'ami_type' => 'm1.small',
                                                'operating_system' => 'xenial',
                                                'configuration' => [
                                                    'memcache' => null,
                                                    'ecu' => 1,
                                                    'memory' => 1.7,
                                                ],
                                                'flags' => [
                                                    'elastic_ip' => false,
                                                    'active_web' => false,
                                                    'active_bal' => false,
                                                    'primary_db' => true,
                                                    'web' => false,
                                                    'database' => false,
                                                    'balancer' => true,
                                                    'fs' => false,
                                                    'memcache' => false,
                                                    'dedicated' => true,
                                                    'self_service' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'dev',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/servers/4',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Servers are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be viewed for CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed for CD environments.',
                                        ],
                                    ],
                                    'Cannot be viewed for managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Cannot be viewed on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers/{serverId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return details about a specific server.',
                'description' => 'Return details about a specific server.',
                'operationId' => 'getEnvironmentsServer',
                'x-cli-name' => 'environments:server-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server',
                                ],
                                'example' => [
                                    'id' => 6,
                                    'name' => 'ded-6',
                                    'hostname' => 'ded-6.servers.acquia.com',
                                    'ssh_user' => 'user.dev',
                                    'ip' => '10.0.0.1',
                                    'status' => 'normal',
                                    'region' => 'us-west-1',
                                    'roles' => [
                                        'web',
                                        'db',
                                    ],
                                    'ami_type' => 'c1.medium',
                                    'operating_system' => 'xenial',
                                    'configuration' => [
                                        'memcache' => 64,
                                        'ecu' => 5,
                                        'memory' => 1.7,
                                    ],
                                    'flags' => [
                                        'elastic_ip' => false,
                                        'active_web' => true,
                                        'active_bal' => false,
                                        'primary_db' => true,
                                        'web' => true,
                                        'database' => true,
                                        'balancer' => false,
                                        'fs' => false,
                                        'memcache' => true,
                                        'dedicated' => false,
                                        'self_service' => false,
                                    ],
                                    'environment' => [
                                        'id' => '24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        'name' => 'dev',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/servers/6',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Servers are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be viewed for CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed for CD environments.',
                                        ],
                                    ],
                                    'Cannot be viewed for managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Cannot be viewed on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be viewed on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Modifies configuration settings for a server.',
                'description' => 'Modifies configuration settings for a server.',
                'operationId' => 'putEnvironmentsServer',
                'x-cli-name' => 'environments:server-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'memcache' => [
                                        'type' => 'integer',
                                        'description' => 'The size (in MB) of memcache on this server.',
                                        'default' => 64,
                                        'minimum' => 0,
                                    ],
                                ],
                            ],
                            'example' => [
                                'memcache' => 128,
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'memcache' => [
                                        'type' => 'integer',
                                        'description' => 'The size (in MB) of memcache on this server.',
                                        'default' => 64,
                                        'minimum' => 0,
                                    ],
                                ],
                            ],
                            'example' => [
                                'memcache' => 128,
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Server configuration being updated' => [
                                        'value' => [
                                            'message' => 'The server configuration is being updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'No options set to update' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'No configuration options were set to update. No action performed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot be configured for free tier' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Configuration cannot be modified for this application.',
                                        ],
                                    ],
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to configure this server.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Servers are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Cannot be configured on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Server configuration cannot be modified on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Cannot be configured for CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be configured for CD environments.',
                                        ],
                                    ],
                                    'Cannot be configured for managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be configured for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Server not found in application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server with ID 42 does not exist in this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers/{serverId}/actions/reboot' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Reboots a server.',
                'description' => 'Reboots a server. This will cause all applications on this server to be unavailable while the server reboots.',
                'operationId' => 'postEnvironmentsServerReboot',
                'x-cli-name' => 'environments:server-reboot',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Server is being rebooted' => [
                                        'value' => [
                                            'message' => 'The server is being rebooted.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only Acquia Cloud Professional can be rebooted' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Servers belonging to subscriptions that are not Acquia Cloud Professional cannot be manually rebooted.',
                                            ],
                                        ],
                                    ],
                                    'Only self-service can be rebooted' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Only self-service servers can be manually rebooted.',
                                            ],
                                        ],
                                    ],
                                    'CDEs cannot be rebooted' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'CD environments cannot be rebooted.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to reboot this server.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Rebooting a server is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be rebooted for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be rebooted on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Server not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be rebooted for CD environments.',
                                        ],
                                    ],
                                    'Server not found in application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server with ID 42 does not exist in this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers/{serverId}/actions/relaunch' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Relaunches a server.',
                'description' => 'Relaunches a server. This will cause all applications on this server to be unavailable while the server relaunches.',
                'operationId' => 'postEnvironmentsServerRelaunch',
                'x-cli-name' => 'environments:server-relaunch',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Server is being relaunched' => [
                                        'value' => [
                                            'message' => 'The server is being relaunched.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only Acquia Cloud Professional can be relaunched' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Servers belonging to subscriptions that are not Acquia Cloud Professional cannot be manually relaunched.',
                                            ],
                                        ],
                                    ],
                                    'Only self-service can be relaunched' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Only self-service servers can be manually relaunched.',
                                            ],
                                        ],
                                    ],
                                    'CDEs cannot be relaunched' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'CD environments cannot be relaunched.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to relaunch this server.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Relaunching servers is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be relaunched for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be relaunched on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Server not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be relaunched for CD environments.',
                                        ],
                                    ],
                                    'Server not found in application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server with ID 42 does not exist in this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers/{serverId}/actions/suspend' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Suspends a server.',
                'description' => 'Suspends a server. The server will no longer respond to web requests.',
                'operationId' => 'postEnvironmentsServerSuspend',
                'x-cli-name' => 'environments:server-suspend',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Server is being suspended' => [
                                        'value' => [
                                            'message' => 'The server is being suspended.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only Acquia Cloud Professional can be suspended' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Servers belonging to subscriptions that are not Acquia Cloud Professional cannot be manually suspended.',
                                            ],
                                        ],
                                    ],
                                    'Only self-service can be suspended' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Only self-service servers can be manually suspended.',
                                            ],
                                        ],
                                    ],
                                    'CDEs cannot be suspended' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'CD environments cannot be suspended.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to suspend this server.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Suspending servers is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be suspended for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be suspended on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Server not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be suspended for CD environments.',
                                        ],
                                    ],
                                    'Server not found in application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server with ID 42 does not exist in this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/servers/{serverId}/actions/upgrade' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Upgrades a server from "precise" to "xenial".',
                'description' => 'Upgrades a server from "precise" to "xenial".',
                'operationId' => 'postEnvironmentsServerUpgrade',
                'x-cli-name' => 'environments:server-upgrade',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Server is being upgraded' => [
                                        'value' => [
                                            'message' => 'The server is being upgraded.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only Acquia Cloud Professional can be upgraded' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Servers belonging to subscriptions that are not Acquia Cloud Professional cannot be manually upgraded.',
                                            ],
                                        ],
                                    ],
                                    'Only self-service can be upgraded' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Only self-service servers can be manually upgraded.',
                                            ],
                                        ],
                                    ],
                                    'CDEs cannot be upgraded' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'CD environments cannot be upgraded.',
                                            ],
                                        ],
                                    ],
                                    'Can only be upgraded from "precise"' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Only servers running "precise" may be upgraded.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to upgrade this server.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Upgrading servers is not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be upgraded for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Node.js applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be upgraded on Node.js applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Server not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on CDEs' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Servers cannot be upgraded for CD environments.',
                                        ],
                                    ],
                                    'Server not found in application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The server with ID 42 does not exist in this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/settings' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Provides links to environment settings.',
                'description' => 'Provides links to environment settings.',
                'operationId' => 'getEnvironmentsSettings',
                'x-cli-name' => 'environments:settings',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-settings',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-12345678-abcd-4372-a567-0e02b2c3a123/settings',
                                        ],
                                        'apm' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-12345678-abcd-4372-a567-0e02b2c3a123/settings/apm',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-12345678-abcd-4372-a567-0e02b2c3a123',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/settings/apm' => [
            'get' => [
                'tags' => [
                    'Application Performance Monitoring Services',
                ],
                'deprecated' => true,
                'summary' => 'Returns a list of Application Performance Monitoring services associated with the environment.',
                'description' => 'Returns a list of Application Performance Monitoring services associated with the environment.',
                'operationId' => 'getEnvironmentsApmSetting',
                'x-cli-name' => 'environments:apm-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm',
                                ],
                                'example' => [
                                    'type' => 'newrelic',
                                    'key' => '123456789abcdef037dea2e355bc43987a123456',
                                    'name' => 'TestApplication',
                                    'flags' => [
                                        'enabled' => true,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/6-252031e4-59f0-7914-95a5-ff83699fdcde/settings/apm',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'environment' => [
                                            [
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/6-252031e4-59f0-7914-95a5-ff83699fdcde',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'APM settings are not available for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'APM settings are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Application Performance Monitoring Services',
                ],
                'deprecated' => true,
                'summary' => 'Update configuration for an Application Performance Monitoring tool.',
                'description' => 'Update configuration for an Application Performance Monitoring tool.',
                'operationId' => 'putEnvironmentsApmSetting',
                'x-cli-name' => 'environments:apm-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'status' => [
                                        'type' => 'boolean',
                                        'description' => 'Whether the APM tool should be enabled or disabled. If updating an existing install, this value does not need to be provided.',
                                    ],
                                    'type' => [
                                        'type' => 'string',
                                        'description' => 'The APM tool to install. Required if installing or updating a configuration.',
                                        'enum' => [
                                            'newrelic',
                                        ],
                                    ],
                                    'key' => [
                                        'type' => 'string',
                                        'description' => 'The key for the APM tool. Required if installing or updating a configuration. This value should be available from your APM provider.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'type' => 'newrelic',
                                'key' => 'Some New Relic key',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'status' => [
                                        'type' => 'boolean',
                                        'description' => 'Whether the APM tool should be enabled or disabled. If updating an existing install, this value does not need to be provided.',
                                    ],
                                    'type' => [
                                        'type' => 'string',
                                        'description' => 'The APM tool to install. Required if installing or updating a configuration.',
                                        'enum' => [
                                            'newrelic',
                                        ],
                                    ],
                                    'key' => [
                                        'type' => 'string',
                                        'description' => 'The key for the APM tool. Required if installing or updating a configuration. This value should be available from your APM provider.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'type' => 'newrelic',
                                'key' => 'Some New Relic key',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Settings are being updated' => [
                                        'value' => [
                                            'message' => 'APM settings are being updated for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'bad_request',
                                            'message' => 'APM names may only contain alphanumeric, dashes, dots, colons, underscores and space characters.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to adjust APM settings for this environment.',
                                        ],
                                    ],
                                    'Acquia Cloud Free cannot modify' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Acquia Cloud Free accounts are not able to modify APM settings.',
                                        ],
                                    ],
                                    'Not available on non-hosted applications' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'APM settings are not available on non-hosted applications.',
                                        ],
                                    ],
                                    'Hosted on Acquia Cloud Enterprise' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Please contact support to modify APM settings for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns the SSL settings for this environment.',
                'description' => 'Returns the SSL settings for this environment.',
                'operationId' => 'getSsl',
                'x-cli-name' => 'environments:ssl-settings-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssl',
                                ],
                                'example' => [
                                    'balancer' => [
                                        'hostname' => 'example.us-east-1.elb.amazonaws.com',
                                    ],
                                    'ips' => [
                                        '127.0.0.1',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/3-110075c3-126e-6b43-c2ce-30be75fb33c2/ssl',
                                        ],
                                        'certificates' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/3-110075c3-126e-6b43-c2ce-30be75fb33c2/ssl/certificates',
                                        ],
                                        'csrs' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/3-110075c3-126e-6b43-c2ce-30be75fb33c2/ssl/csrs',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/3-110075c3-126e-6b43-c2ce-30be75fb33c2',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available for free tier' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/certificates' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Return a list of SSL certificates.',
                'description' => 'Returns the SSL certificates that are installed on this environment.',
                'operationId' => 'getCertificates',
                'x-cli-name' => 'environments:certificate-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificates',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 7,
                                                'label' => null,
                                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                                'ca' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'flags' => [
                                                    'active' => true,
                                                    'csr' => true,
                                                    'legacy' => true,
                                                ],
                                                'expires_at' => '2022-03-28T00:12:34-0400',
                                                'domains' => [
                                                    'example.com',
                                                    'www.example.com',
                                                ],
                                                'environment' => [
                                                    'id' => '5-a1a10dab-62f4-418c-bc58-ab7742078ba8',
                                                    'name' => 'prod',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates/7',
                                                    ],
                                                    'csr' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/csrs/7',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 3,
                                                'label' => 'Test Certificate 1',
                                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                                'ca' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'flags' => [
                                                    'active' => true,
                                                    'csr' => false,
                                                    'legacy' => false,
                                                ],
                                                'expires_at' => '2021-01-01T00:00:00-0400',
                                                'domains' => [
                                                    'example2.com',
                                                    'www.example2.com',
                                                ],
                                                'environment' => [
                                                    'id' => '5-a1a10dab-62f4-418c-bc58-ab7742078ba8',
                                                    'name' => 'prod',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates/3',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 4,
                                                'label' => 'Test Certificate 2',
                                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                                'ca' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'flags' => [
                                                    'active' => false,
                                                    'csr' => true,
                                                    'legacy' => false,
                                                ],
                                                'expires_at' => '2021-01-01T00:00:00-0400',
                                                'domains' => [
                                                    'example3.com',
                                                    'www.example3.com',
                                                ],
                                                'environment' => [
                                                    'id' => '5-a1a10dab-62f4-418c-bc58-ab7742078ba8',
                                                    'name' => 'prod',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates/4',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'SSL Certificates are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Install an SSL certificate.',
                'description' => 'Install a new SSL certificate on this environment.',
                'operationId' => 'postCertificate',
                'x-cli-name' => 'environments:certificate-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-certificate',
                            ],
                            'example' => [
                                'legacy' => false,
                                'certificate' => '-----BEGIN CERTIFICATE-----abc123....-----END CERTIFICATE-----',
                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----secret....-----END RSA PRIVATE KEY-----',
                                'ca_certificates' => '-----BEGIN CERTIFICATE-----123abc....-----END CERTIFICATE-----',
                                'csr_id' => 123,
                                'label' => 'My New Cert',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-certificate',
                            ],
                            'example' => [
                                'legacy' => false,
                                'certificate' => '-----BEGIN CERTIFICATE-----abc123....-----END CERTIFICATE-----',
                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----secret....-----END RSA PRIVATE KEY-----',
                                'ca_certificates' => '-----BEGIN CERTIFICATE-----123abc....-----END CERTIFICATE-----',
                                'csr_id' => 123,
                                'label' => 'My New Cert',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Site is being imported' => [
                                        'value' => [
                                            'message' => 'Installing the certificate.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-4ba86d4a-e193-4282-8963-d9d24746f444/ssl/certificates',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/8fdacf25-38e4-4621-b5de-e78638fe2ceb',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-4ba86d4a-e193-4282-8963-d9d24746f444/ssl',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Cannot install' => [
                                        'value' => [
                                            'error' => 'system',
                                            'message' => 'Unable to install a certificate on environment ID 5-9d46fd9d-e58b-47a3-8e9e-e8e0c2a854b4. Site certificate CA chain certificates are out of order or contain unused certificates.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates cannot be managed on non-hosted applications.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage SSL certificates on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid country code' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Invalid country code. Country codes should be alphabetic and less than 2 characters long.',
                                            ],
                                        ],
                                    ],
                                    'Invalid domain' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'domain' => 'The domain invalid does not appear to be a valid domain name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/certificates/{certificateId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a specific certificate by certificate id.',
                'description' => 'Returns details about a specific SSL certificate.',
                'operationId' => 'getCertificate',
                'x-cli-name' => 'environments:certificate-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificate',
                                ],
                                'example' => [
                                    'id' => 13,
                                    'label' => 'Test Certificate',
                                    'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                    'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                    'ca' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                    'flags' => [
                                        'active' => true,
                                        'csr' => true,
                                        'legacy' => false,
                                    ],
                                    'expires_at' => '2022-03-28T00:12:34-0400',
                                    'domains' => [
                                        'example.com',
                                        'www.example.com',
                                    ],
                                    'environment' => [
                                        'id' => '5-9d46fd9d-e58b-47a3-8e9e-e8e0c2a854b4',
                                        'name' => 'prod',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-9d46fd9d-e58b-47a3-8e9e-e8e0c2a854b4/ssl/certificates/13',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-9d46fd9d-e58b-47a3-8e9e-e8e0c2a854b4/ssl/certificates',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'SSL certificates are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes a specific certificate by its ID.',
                'description' => 'Deletes a specific certificate by its ID.',
                'operationId' => 'deleteCertificate',
                'x-cli-name' => 'environments:certificate-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Deleting the certificate.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/ssl/certificates/9',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/286-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/ssl/certificates',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/767cee8d-05f6-4761-a3dc-755957dfc9e6',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete SSL certificates on this environment.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Incorrect certificate' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'This certificate does not belong to the environment, and cannot be removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The currently active certificate cannot be removed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/certificates/{certificateId}/actions/activate' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Activates an SSL certificate.',
                'description' => 'Activates an SSL certificate.',
                'operationId' => 'postActivateCertificate',
                'x-cli-name' => 'environments:certificate-activate',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Activating the certificate.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/ssl/certificates/1/actions/activate',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/4ee513c7-13b4-459f-af60-ba50c4f7cb5d',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Only installable on production' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates may only be installed on production environments.',
                                            ],
                                        ],
                                    ],
                                    'Cannot be installed on CD environments' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates cannot be installed on CD environments.',
                                            ],
                                        ],
                                    ],
                                    'Name already exists' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'A certificate with that label already exists. Please choose another label.',
                                            ],
                                        ],
                                    ],
                                    'Legacy cannot be installed using non-legacy' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'csr_id' => 'A legacy certificate cannot be installed using a non-legacy certificate signing request.',
                                            ],
                                        ],
                                    ],
                                    'Non-legacy cannot be installed using legacy' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'csr_id' => 'A certificate cannot be installed using a legacy certificate signing request.',
                                            ],
                                        ],
                                    ],
                                    'Invalid private key' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'private_key' => 'The supplied private key is invalid.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to activate SSL certificates on this environment.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates cannot be activated on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or no permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Incorrect certificate' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This certificate does not belong to the environment, and cannot be set to active.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Legacy certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates cannot be set to active.',
                                            ],
                                        ],
                                    ],
                                    'Already active' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'This certificate is already set as active.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/certificates/{certificateId}/actions/deactivate' => [
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deactivates an active SSL certificate.',
                'description' => 'Deactivates an active SSL certificate.',
                'operationId' => 'postDeactivateCertificate',
                'x-cli-name' => 'environments:certificate-deactivate',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Deactivating the certificate.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-a027502b-ad6c-a48e-a7e8-aa0def7d25e1/ssl/certificates/4547/actions/deactivate',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/cb5de18e-5721-4c26-9f67-1a7d806dd09e',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Legacy certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates cannot be deactivated. In order to deactivate a legacy certificate, the certificate must be removed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to deactivate SSL certificates on this environment.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates cannot be deactivated on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or no permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Incorrect certificate' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This certificate does not belong to the environment, and cannot be deactivated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already active' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'This certificate is already deactivated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/csrs' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns certificate signing requests.',
                'description' => 'Returns the certificate signing requests for this environment.',
                'operationId' => 'getCertificateSigningRequests',
                'x-cli-name' => 'environments:csr-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csrs',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-185f07c7-9c4f-407b-8968-67892ebcb38a/ssl/csrs',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-185f07c7-9c4f-407b-8968-67892ebcb38a/ssl',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 7,
                                                'csr' => '-----BEGIN CERTIFICATE REQUEST-----...-----END CERTIFICATE REQUEST-----',
                                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                                'country' => 'US',
                                                'state' => 'Massachusetts',
                                                'locality' => 'Boston',
                                                'organization' => 'Example Inc.',
                                                'organizational_unit' => 'IT',
                                                'common_name' => 'www.example.com',
                                                'alternate_names' => [
                                                    'site.example.com',
                                                    'other.example.com',
                                                ],
                                                'flags' => [
                                                    'used' => true,
                                                    'legacy' => false,
                                                ],
                                                'environment' => [
                                                    'id' => '5-a1a10dab-62f4-418c-bc58-ab7742078ba8',
                                                    'name' => 'prod',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/csrs/7',
                                                    ],
                                                    'certificate' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates/7',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 8,
                                                'csr' => '-----BEGIN CERTIFICATE REQUEST-----...-----END CERTIFICATE REQUEST-----',
                                                'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                                'country' => 'US',
                                                'state' => 'Massachusetts',
                                                'locality' => 'Boston',
                                                'organization' => 'Example Inc.',
                                                'organizational_unit' => 'IT',
                                                'common_name' => 'www.example.com',
                                                'alternate_names' => [],
                                                'flags' => [
                                                    'used' => false,
                                                    'legacy' => true,
                                                ],
                                                'environment' => [
                                                    'id' => '5-a1a10dab-62f4-418c-bc58-ab7742078ba8',
                                                    'name' => 'prod',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/csrs/8',
                                                    ],
                                                    'certificate' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/5-a1a10dab-62f4-418c-bc58-ab7742078ba8/ssl/certificates/8',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Certificate Signing Requests are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Generates a certificate signing request (CSR) for one or more domains.',
                'description' => 'Generates a CSR for one or more domains.',
                'operationId' => 'postCertificateSigningRequest',
                'x-cli-name' => 'environments:csr-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-csr',
                            ],
                            'example' => [
                                'country' => 'CA',
                                'state' => 'Ontario',
                                'locality' => 'Toronto',
                                'organization' => 'Acquia',
                                'organizational_unit' => 'Networking',
                                'common_name' => 'www.example.com',
                                'alternate_names' => [
                                    'www2.example.com',
                                    'www3.example.com',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-csr',
                            ],
                            'example' => [
                                'country' => 'CA',
                                'state' => 'Ontario',
                                'locality' => 'Toronto',
                                'organization' => 'Acquia',
                                'organizational_unit' => 'Networking',
                                'common_name' => 'www.example.com',
                                'alternate_names' => [
                                    'www2.example.com',
                                    'www3.example.com',
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'A CSR is being generated for the selected domain.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-4ba86d4a-e193-4282-8963-d9d24746f444/ssl/csrs',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/123-4ba86d4a-e193-4282-8963-d9d24746f444/ssl',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/8fdacf25-38e4-4621-b5de-e78638fe2ceb',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates cannot be managed on non-hosted applications.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage SSL certificates on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Incorrect certificate' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'This certificate signing request does not belong to the environment, and cannot be used to install a certificate.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Legacy certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates may only be installed on production environments.',
                                            ],
                                        ],
                                    ],
                                    'CD environments' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Legacy certificates may not be installed on CD environments.',
                                            ],
                                        ],
                                    ],
                                    'Legacy mismatch' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'csr_id' => 'A legacy certificate cannot be installed using a non-legacy certificate signing request.',
                                            ],
                                        ],
                                    ],
                                    'Legacy CSR' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'csr_id' => 'A certificate cannot be installed using a legacy certificate signing request.',
                                            ],
                                        ],
                                    ],
                                    'Duplicate label' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'label' => 'A certificate with that label already exists. Please choose another label.',
                                            ],
                                        ],
                                    ],
                                    'Invalid format' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'certificate' => 'The certificate format is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Invalid public key' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'certificate' => 'The certificate public key is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Certificate unavailable' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'certificate' => 'Certificate CERTIFICATE was issued by UNKNOWN ISSUER for which no certificate is available.',
                                            ],
                                        ],
                                    ],
                                    'Invalid private key' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'private_key' => 'The supplied private key is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Certificate expired' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'certificate' => 'The supplied certificate has expired.',
                                            ],
                                        ],
                                    ],
                                    'Intermediate certificate expired' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'ca_certificates' => 'Intermediate certificate Example Certificate has expired.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/ssl/csrs/{certificateId}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns the certificate signing request for the certificate specified by id.',
                'description' => 'Returns details about a specific certificate signing request.',
                'operationId' => 'getCertificateSigningRequest',
                'x-cli-name' => 'environments:csr-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csr',
                                ],
                                'example' => [
                                    'id' => 7,
                                    'csr' => '-----BEGIN CERTIFICATE REQUEST-----...-----END CERTIFICATE REQUEST-----',
                                    'private_key' => '-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----',
                                    'country' => 'US',
                                    'state' => 'Massachusetts',
                                    'locality' => 'Boston',
                                    'organization' => 'Example Inc.',
                                    'organizational_unit' => 'IT',
                                    'common_name' => 'www.example.com',
                                    'alternate_names' => [
                                        'site.example.com',
                                        'other.example.com',
                                    ],
                                    'flags' => [
                                        'used' => true,
                                        'legacy' => false,
                                    ],
                                    'environment' => [
                                        'id' => '5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5',
                                        'name' => 'prod',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5/ssl/csrs/7',
                                        ],
                                        'certificate' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5/ssl/certificates/7',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5/ssl/csrs',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view Certificate Signing Requests on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No CSR or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The CSR you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Non-hosted application' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Certificate Signing Requests are not available on non-hosted applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Deletes the certificate signing request.',
                'description' => 'Deletes the certificate signing request for the certificate specified by id.',
                'operationId' => 'deleteCertificateSigningRequest',
                'x-cli-name' => 'environments:csr-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'Deleting the certificate signing request.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5/ssl/csrs/7',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/5-aeb8e8a6-0eef-4a1e-8d8d-545e025b12a5/ssl/csrs',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/87c0f979-2f84-4b88-bc5e-8c1670fd2f01',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'This certificate signing request is used for a certificate, and cannot be removed.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not on Acquia Cloud Free' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'SSL certificates are not available to Acquia Cloud Free subscriptions.',
                                        ],
                                    ],
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete Certificate Signing Requests on this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No environment or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to administer does not exist, or you do not have permission to administer it.',
                                        ],
                                    ],
                                    'Incorrect certificate signing request' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'This certificate signing request does not belong to the environment, and cannot be removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/variables' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Returns a list of environment variables associated with this environment.',
                'description' => 'Returns a list of environment variables associated with this environment.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getEnvironmentsVariables',
                'x-cli-name' => 'environments:variable-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-variables',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environment/24-569086da-2b1f-11e9-b210-d663bd873d93/variables',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'variable_one',
                                                'value' => 'Sample Value One',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables/variable_one',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'variable_two',
                                                'value' => 'Sample Value Two',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables/variable_two',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'name' => 'variable_three',
                                                'value' => 'Sample Value Three',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/environments/24-569086da-2b1f-11e9-b210-d663bd873d93/variables/variable_three',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view environment variables for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Acquia Cloud Site Factory' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Not available for static applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for static applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Adds a new environment variable to an environment.',
                'description' => 'Adds a new environment variable to an environment.',
                'operationId' => 'postEnvironmentsVariables',
                'x-cli-name' => 'environments:variable-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the environment variable to add.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                        'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                                    ],
                                    'value' => [
                                        'type' => 'string',
                                        'description' => 'The value of the environment variable to add.',
                                        'minLength' => 0,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'APP_KEY',
                                'value' => 'aaaabbbbccccddddeee',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the environment variable to add.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                        'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                                    ],
                                    'value' => [
                                        'type' => 'string',
                                        'description' => 'The value of the environment variable to add.',
                                        'minLength' => 0,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'APP_KEY',
                                'value' => 'aaaabbbbccccddddeee',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Variable is being added' => [
                                        'value' => [
                                            'message' => 'The environment variable is being added.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-c7056b9e-0fb7-44e9-a434-426a404211c1/variables',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/f3c2bdc1-60c1-48af-8777-996477f901d5',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/123-c7056b9e-0fb7-44e9-a434-426a404211c1',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid variable name' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The environment variable name is invalid. It must contain only letters, numbers, and underscores; it cannot start with a number, AH_, or ACQUIA_; and it must be under 256 characters long.',
                                            ],
                                        ],
                                    ],
                                    'Invalid value' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => [
                                                'value' => 'The environment variable value is invalid: it must be less than 256 characters long.',
                                            ],
                                        ],
                                    ],
                                    'Variable name already exists' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => [
                                                'name' => 'The environment already has an environment variable with that name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to create environment variables for this environment.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on Acquia Cloud Site Factory' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                    'Not available for static applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for static applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Environment variables are not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/variables/{environmentVariableName}' => [
            'get' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Get an environment variable associated with this environment.',
                'description' => 'Get an environment variable associated with this environment.',
                'operationId' => 'getEnvironmentsVariable',
                'x-cli-name' => 'environments:variable-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-variable-name',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-variable',
                                ],
                                'example' => [
                                    'name' => 'variable_one',
                                    'value' => 'Sample Value One',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-734b7960-2b1f-11e9-b210-d663bd873d93/variables/variable_one',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/environments/24-734b7960-2b1f-11e9-b210-d663bd873d93/variables',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view environment variables for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Environment variable not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment variable you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                    'Not available on Acquia Cloud Site Factory' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Acquia Cloud Site Factory applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Removes an environment variable from an environment.',
                'description' => 'Removes an environment variable from an environment.',
                'operationId' => 'deleteEnvironmentsVariable',
                'x-cli-name' => 'environments:variable-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-variable-name',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Variable is being removed' => [
                                        'value' => [
                                            'message' => 'The environment variable is being removed.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/variables/EXAMPLE_VARIABLE_NAME',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/42b56cff-0b55-4bdf-a949-1fd0fca61c6c',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/12-d314739e-296f-11e9-b210-d663bd873d93/variables',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid value' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The environment does not have an environment variable with that name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove environment variables for this environment.',
                                        ],
                                    ],
                                    'Environment variable not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment variable you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Environment variables are not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Environments',
                ],
                'summary' => 'Updates an environment variable on an environment.',
                'description' => 'Updates an environment variable on an environment.',
                'operationId' => 'putEnvironmentsVariable',
                'x-cli-name' => 'environments:variable-update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-variable-name',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'value',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the environment variable to add.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                        'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                                    ],
                                    'value' => [
                                        'type' => 'string',
                                        'description' => 'The value of the environment variable to add.',
                                        'minLength' => 0,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'APP_KEY',
                                'value' => 'aaaabbbbccccddddeee',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'value',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the environment variable to add.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                        'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                                    ],
                                    'value' => [
                                        'type' => 'string',
                                        'description' => 'The value of the environment variable to add.',
                                        'minLength' => 0,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'APP_KEY',
                                'value' => 'aaaabbbbccccddddeee',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'Variable is being updated' => [
                                        'value' => [
                                            'message' => 'The environment variable is being updated.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-734b7960-2b1f-11e9-b210-d663bd873d93/variables/name',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/37c8646c-bbe8-423a-970b-cbeb530b981d',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/environments/24-734b7960-2b1f-11e9-b210-d663bd873d93/variables',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid value' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'value' => 'The environment variable value is invalid: it must be less than 5000 characters long.',
                                            ],
                                        ],
                                    ],
                                    'Variable name already exists' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'The environment already has an environment variable with that name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify environment variables for this environment.',
                                        ],
                                    ],
                                    'Environment variable not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment variable you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Not available on managed applications' => [
                                        'value' => [
                                            'error' => 'not_available',
                                            'message' => 'Environment variables are not available for Service Management-enabled applications.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Environment not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not available' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Environment variables are not available for this environment.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/ides/{ideUuid}' => [
            'get' => [
                'tags' => [
                    'Cloud IDE',
                ],
                'summary' => 'Returns Cloud IDE info.',
                'description' => 'Returns Cloud IDE info.',
                'operationId' => 'getIde',
                'x-cli-name' => 'ide:find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ide-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ide',
                                ],
                                'example' => [
                                    'uuid' => '215824ff-272a-4a8c-9027-df32ed1d68a9',
                                    'label' => 'Example IDE',
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/ides/215824ff-272a-4a8c-9027-df32ed1d68a9',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/ides',
                                        ],
                                        'application' => [
                                            'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                        ],
                                        'web' => [
                                            'href' => 'https://ide-215824ff-272a-4a8c-9027-df32ed1d68a9.prod.acquia-sites.com',
                                        ],
                                        'ide' => [
                                            'href' => 'https://215824ff-272a-4a8c-9027-df32ed1d68a9.ides.acquia.com',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'owner' => [
                                            'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                            'first_name' => 'First',
                                            'last_name' => 'Last',
                                            'last_login_at' => '2019-01-31T15:53:11.000Z',
                                            'created_at' => '2016-08-14T21:38:59.000Z',
                                            'email' => 'user.name@example.com',
                                            'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                            'username' => 'user.name',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The IDE you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Cloud IDE',
                ],
                'summary' => 'De-provisions a specific Cloud IDE.',
                'description' => 'De-provisions a specific Cloud IDE.',
                'operationId' => 'deleteIde',
                'x-cli-name' => 'ide:delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ide-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'De-provisioning IDE' => [
                                        'value' => [
                                            'message' => 'The Cloud IDE is being deleted.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/ides/215824ff-272a-4a8c-9027-df32ed1d68a9',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/ides',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/e98577df-840a-4fef-8775-66cf90b3530e',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The IDE you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/identity-providers' => [
            'get' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Returns a list of identity providers for a user.',
                'description' => 'Returns a list of identity providers you have access to.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `label`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `label`'."\n",
                'operationId' => 'getIdentityProviders',
                'x-cli-name' => 'identity-providers:list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-providers',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers{?filter}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers{?sort}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers{?offset}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '5fa84b25-a269-44bd-a2ae-e76d08ac8245',
                                                'label' => 'Identity provider label',
                                                'idp_entity_id' => 'https://idp.example.com/saml',
                                                'sp_entity_id' => 'https://sp.example.com/saml',
                                                'sso_url' => 'https://example.com/sso',
                                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'status' => 'enabled',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/identity-providers/5fa84b25-a269-44bd-a2ae-e76d08ac8245',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/identity-providers',
                                                    ],
                                                    'acs' => [
                                                        'href' => 'https://accounts.acquia.com/api/auth/saml/acs/5fa84b25-a269-44bd-a2ae-e76d08ac8245',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '908914ec-2354-4fb1-9298-637247eccc3a',
                                                'label' => 'Identity provider label 2',
                                                'idp_entity_id' => 'https://idp2.example.com/saml',
                                                'sp_entity_id' => 'https://sp2.example.com/saml',
                                                'sso_url' => 'https://example.com/sso',
                                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                                                'status' => 'enabled',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/identity-providers/908914ec-2354-4fb1-9298-637247eccc3a',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/identity-providers',
                                                    ],
                                                    'acs' => [
                                                        'href' => 'https://accounts.acquia.com/api/auth/saml/acs/908914ec-2354-4fb1-9298-637247eccc3a',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/identity-providers/{identityProviderUuid}' => [
            'get' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Returns a specific identity provider by UUID.',
                'description' => 'Returns a specific identity provider.',
                'operationId' => 'getIdentityProvider',
                'x-cli-name' => 'identity-providers:find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-provider',
                                ],
                                'example' => [
                                    'uuid' => '1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                    'label' => 'Test identity provider',
                                    'idp_entity_id' => 'https://idp.example.com/saml',
                                    'sp_entity_id' => 'https://sp.example.com/saml',
                                    'sso_url' => 'https://example.com/sso',
                                    'certificate' => '-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----',
                                    'status' => 'enabled',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'acs' => [
                                            'href' => 'https://accounts.acquia.com/api/auth/saml/acs/1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                        ],
                                        'organization' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Modifies an identity provider by its UUID.',
                'description' => 'Modifies an identity provider.',
                'operationId' => 'putIdentityProvider',
                'x-cli-name' => 'identity-providers:update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new identity provider label.',
                                    ],
                                    'entity_id' => [
                                        'type' => 'string',
                                        'description' => 'The entity ID of the identity provider',
                                    ],
                                    'sso_url' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URL of the SSO identity provider.',
                                    ],
                                    'certificate' => [
                                        'type' => 'string',
                                        'description' => 'The PEM-encoded X.509 certificate.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'New label',
                                'entity_id' => 'entity-id',
                                'sso_url' => 'https://idp.example.com',
                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'description' => 'The new identity provider label.',
                                    ],
                                    'entity_id' => [
                                        'type' => 'string',
                                        'description' => 'The entity ID of the identity provider',
                                    ],
                                    'sso_url' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URL of the SSO identity provider.',
                                    ],
                                    'certificate' => [
                                        'type' => 'string',
                                        'description' => 'The PEM-encoded certificate.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'label' => 'New label',
                                'entity_id' => 'entity-id',
                                'sso_url' => 'https://idp.example.com',
                                'certificate' => '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'Identity Provider has been updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/8030f025-47dc-4926-940b-0b04d98d1ea2',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/29dcc1e2-3cfc-447c-9fcb-d51c1c26b4da',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'No Parameters' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'No update executed, as no parameters were provided. Please update at least one property.',
                                            ],
                                        ],
                                    ],
                                    'Invalid Certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is invalid.',
                                            ],
                                        ],
                                    ],
                                    'Inactive Certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is not yet active.',
                                            ],
                                        ],
                                    ],
                                    'Expired Certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expired.',
                                            ],
                                        ],
                                    ],
                                    'Expiring Certificate' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'credentials' => 'The certificate is expiring. Certificates must be valid for at least 90 days.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to edit the identity provider.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found or Does Not Exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Does Not Exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'An identity provider with UUID idp1234-aaaa-1234-abcd-0123456789ab does not exist.',
                                        ],
                                    ],
                                    'No Associated Organization' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'An organization with associated identity provider UUID idp1234-aaaa-1234-abcd-0123456789ab cannot be found.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already Enabled and Active' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Updates cannot be made to identity providers that are enabled and active.',
                                        ],
                                    ],
                                    'Not Registered to Organization' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The organization does not have an identity provider registered with the UUID idp1234-aaaa-1234-abcd-0123456789ab.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Deletes a specific identity provider by its UUID.',
                'description' => 'Deletes a specific identity provider.',
                'operationId' => 'deleteIdentityProvider',
                'x-cli-name' => 'identity-providers:delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Identity provider has been deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/29dcc1e2-3cfc-447c-9fcb-d51c1c26b4da',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to delete the identity provider.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found or Does Not Exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No Associated Organization' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'An organization with associated identity provider UUID da1c0a8e-ff69-45db-88fc-acd6d2affbb7 cannot be found.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/identity-providers/{identityProviderUuid}/actions/enable' => [
            'post' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Enables an identity provider by its UUID.',
                'description' => 'Enables an identity provider.',
                'operationId' => 'postEnableIdentityProvider',
                'x-cli-name' => 'identity-providers:enable',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Identity Provider has been enabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/e1851cef-aa3c-4153-bb81-1c25fcf7dc77',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/31660dfd-def7-49f0-b1f2-847fa267a021',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'You do not have permission to enable this identity provider.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already enabled' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The identity provider is already enabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/identity-providers/{identityProviderUuid}/actions/disable' => [
            'post' => [
                'tags' => [
                    'Identity Providers',
                ],
                'summary' => 'Disables an identity provider by its UUID.',
                'description' => 'Disables an identity provider.',
                'operationId' => 'postDisableIdentityProvider',
                'x-cli-name' => 'identity-providers:disable',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Identity Provider has been disabled.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/e1851cef-aa3c-4153-bb81-1c25fcf7dc77',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/31660dfd-def7-49f0-b1f2-847fa267a021',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'You do not have permission to disable this identity provider.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'conflict',
                                    'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already disabled' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The identity provider is already disabled.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/invites/{token}' => [
            'get' => [
                'tags' => [
                    'Invite',
                ],
                'summary' => 'Returns details about an invitation.',
                'description' => 'Returns details about an invitation.',
                'operationId' => 'getInviteByToken',
                'x-cli-name' => 'invites:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite',
                                ],
                                'example' => [
                                    'applications' => [
                                        [
                                            'uuid' => '7659fe2a-7322-4132-a4b7-0795f1246a54',
                                            'name' => 'App 1',
                                        ],
                                        [
                                            'uuid' => '23a99f37-0eb8-450e-a5bf-e69c48e25e86',
                                            'name' => 'App 2',
                                        ],
                                    ],
                                    'author' => [
                                        'uuid' => '2429bf71-9145-4266-b532-1f4e3beaed55',
                                        'first_name' => 'Joe',
                                        'last_name' => 'Smith',
                                        'last_login_at' => '2019-01-30T13:58:07.000Z',
                                        'created_at' => '2015-08-14T21:37:23.000Z',
                                        'mail' => 'joe.smith@example.com',
                                        'picture_url' => 'https://accounts.acquia.com/images/users/2429bf71-9145-4266-b532-1f4e3beaed55/style/avatar',
                                        'username' => 'joe.smith',
                                    ],
                                    'organization' => [
                                        'uuid' => 'd258dc23-90c5-447c-b550-981b469796d9',
                                        'name' => 'My Organization',
                                    ],
                                    'roles' => [
                                        [
                                            'uuid' => 'd258dc23-90c5-447c-b550-981b469796d9',
                                            'name' => 'My Role',
                                        ],
                                    ],
                                    'team' => [
                                        'uuid' => 'd258dc23-90c5-447c-b550-981b469796d9',
                                        'name' => 'My Team',
                                    ],
                                    'uuid' => 'd258dc23-90c5-447c-b550-981b469796d9',
                                    'email' => 'joe.smith@example.com',
                                    'created_at' => '2019-01-30T14:12:15.000Z',
                                    'token' => '189d2089-c7f1-418c-a437-9676f4edb1b3',
                                    'flags' => [
                                        'declined' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/invites/189d2089-c7f1-418c-a437-9676f4edb1b3',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No invite or permission' => [
                                        'value' => [
                                            'error' => 'unauthorized',
                                            'message' => 'You do not have permission to access this resource.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No invite or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The invite you are trying to view does not exist, or you do not have permission to view it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Invite',
                ],
                'summary' => 'Cancels an invitation.',
                'description' => 'Cancels an invitation.',
                'operationId' => 'postInviteCancel',
                'x-cli-name' => 'invites:cancel',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Cancelled invite' => [
                                        'value' => [
                                            'message' => 'Cancelled invite.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No invite or permission' => [
                                        'value' => [
                                            'error' => 'unauthorized',
                                            'message' => 'You do not have permission to access this resource.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No invite or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The invite you are trying to view does not exist, or you do not have permission to view it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/invites/{token}/actions/accept' => [
            'post' => [
                'tags' => [
                    'Invite',
                ],
                'summary' => 'Accepts an invite.',
                'description' => 'Accepts an invite.',
                'operationId' => 'postInviteAcceptByToken',
                'x-cli-name' => 'invites:accept',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Accepted invite' => [
                                        'value' => [
                                            'message' => 'The invite has been accepted.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The invite you are trying to accept does not exist, or you do not have permission to accept it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already accepted' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This invite has already been accepted.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/invites/{token}/actions/decline' => [
            'post' => [
                'tags' => [
                    'Invite',
                ],
                'summary' => 'Declines an invite.',
                'description' => 'Declines an invite.',
                'operationId' => 'postInviteDecline',
                'x-cli-name' => 'invites:decline',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Declined invite' => [
                                        'value' => [
                                            'message' => 'The invite has been declined.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The invite you are trying to decline does not exist, or you do not have permission to decline it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Already declined' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This invite has already been declined.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/invites/{token}/actions/resend' => [
            'post' => [
                'tags' => [
                    'Invite',
                ],
                'summary' => 'Resend an invite.',
                'description' => 'Resend an invite.',
                'operationId' => 'postInviteResend',
                'x-cli-name' => 'invites:resend',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Declined invite' => [
                                        'value' => [
                                            'message' => 'Resent invitation.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The invite you are trying to resent does not exist, or you do not have permission to resent it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/messages/{messageUuid}/actions/dismiss' => [
            'post' => [
                'tags' => [
                    'Messages',
                ],
                'summary' => 'Dismisses a message.',
                'description' => 'Dismisses a message.',
                'operationId' => 'postDismissMessage',
                'x-cli-name' => 'messages:dismiss',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_message-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Site revoked' => [
                                        'value' => [
                                            'message' => 'Message dismissed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission or message' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The message you are trying to dismiss does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Message already dismissed' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This message has already been dismissed.',
                                        ],
                                    ],
                                    'Message cannot be dismissed' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This message cannot be dismissed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/messages/{messageUuid}/actions/follow' => [
            'get' => [
                'tags' => [
                    'Messages',
                ],
                'summary' => 'Follows an in-product message link.',
                'description' => 'Follows an in-product message link.',
                'operationId' => 'getMessageFollow',
                'x-cli-name' => 'messages:follow',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_message-uuid',
                    ],
                ],
                'responses' => [
                    301 => [
                        'description' => 'Moved Permanently',
                        'headers' => [
                            'Location' => [
                                'schema' => [
                                    'type' => 'string',
                                ],
                                'description' => 'The redirect destination URL.',
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No application or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The message you are trying to follow the link for does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/notifications/{notificationUuid}' => [
            'get' => [
                'tags' => [
                    'Notifications',
                ],
                'summary' => 'Returns a single notification.',
                'description' => 'Returns a single notification.',
                'operationId' => 'getNotificationByUuid',
                'x-cli-name' => 'notifications:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_notification-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-stub',
                                ],
                                'example' => [
                                    'uuid' => '1bd3487e-71d1-4fca-a2d9-5f969b3d35c1',
                                    'event' => 'ApplicationAddedToRecents',
                                    'label' => 'Application added to recents list',
                                    'description' => '"Canary QA 11 - ACE" was added to your recent applications list.',
                                    'created_at' => '2019-07-29T20:47:13.000Z',
                                    'completed_at' => '2019-07-29T20:47:13.000Z',
                                    'status' => 'completed',
                                    'progress' => 100,
                                    'context' => [
                                        'author' => [
                                            'uuid' => '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                            'actual_uuid' => '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                        ],
                                        'user' => [
                                            'uuids' => [
                                                '5391a8a9-d273-4f88-8114-7f884bbfe08b',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/1bd3487e-71d1-4fca-a2d9-5f969b3d35c1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No data or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The data you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Does not return any data. Allows traversal of options groups endpoints.',
                'description' => 'Does not return any data. Allows traversal of options groups endpoints.',
                'operationId' => 'getOptions',
                'x-cli-name' => 'options:list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'properties' => [
                                        '_links' => [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                                        ],
                                    ],
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/options',
                                        ],
                                        'cde-sizes' => [
                                            'href' => 'https://cloud.acquia.com/api/options/cde-sizes',
                                        ],
                                        'log-forwarding' => [
                                            'href' => 'https://cloud.acquia.com/api/options/log-forwarding',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options/cde-sizes' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Displays the various CD Environment size options.',
                'description' => 'Displays the various CD Environment size options.',
                'operationId' => 'getCdeSizes',
                'x-cli-name' => 'options:cde-sizes-list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cde-sizes',
                                ],
                                'example' => [
                                    'total' => 5,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/options/cde-sizes',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/options',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => '1X',
                                                'size' => '1x',
                                                'memory' => 256,
                                                'storage' => 5,
                                                'databases' => 3,
                                                'slots' => 1,
                                            ],
                                            [
                                                'name' => '2X',
                                                'size' => '2x',
                                                'memory' => 512,
                                                'storage' => 10,
                                                'databases' => 6,
                                                'slots' => 2,
                                            ],
                                            [
                                                'name' => '3X',
                                                'size' => '3x',
                                                'memory' => 768,
                                                'storage' => 15,
                                                'databases' => 9,
                                                'slots' => 3,
                                            ],
                                            [
                                                'name' => '4X',
                                                'size' => '4x',
                                                'memory' => 1024,
                                                'storage' => 20,
                                                'databases' => 12,
                                                'slots' => 4,
                                            ],
                                            [
                                                'name' => '8X',
                                                'size' => '8x',
                                                'memory' => 2048,
                                                'storage' => 40,
                                                'databases' => 24,
                                                'slots' => 8,
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options/log-forwarding' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Does not return any data. Allows traversal of options groups endpoints.',
                'description' => 'Does not return any data. Allows traversal of options groups endpoints.',
                'operationId' => 'getLogForwarding',
                'x-cli-name' => 'options:log-forwarding',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'properties' => [
                                        '_links' => [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                                        ],
                                    ],
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/options/log-forwarding',
                                        ],
                                        'sources' => [
                                            'href' => 'https://cloud.acquia.com/api/options/log-forwarding/sources',
                                        ],
                                        'consumers' => [
                                            'href' => 'https://cloud.acquia.com/api/options/log-forwarding/consumers',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options/log-forwarding/sources' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Displays available log forwarding sources.',
                'description' => 'Displays available log forwarding sources.',
                'operationId' => 'getLogForwardingSources',
                'x-cli-name' => 'options:log-forwarding-source-list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-sources',
                                ],
                                'example' => [
                                    'total' => 1,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/log-forwarding/sources',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/log-forwarding',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'apache-access',
                                                'label' => 'Apache access',
                                                'platforms' => [
                                                    'drupal',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options/log-forwarding/consumers' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Displays available log forwarding consumers.',
                'description' => 'Displays available log forwarding consumers.',
                'operationId' => 'getLogForwardingConsumers',
                'x-cli-name' => 'options:log-forwarding-consumer-list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-consumers',
                                ],
                                'example' => [
                                    'total' => 1,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/log-forwarding/consumers',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/log-forwarding',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'sumologic',
                                                'label' => 'Sumologic',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/options/colors' => [
            'get' => [
                'tags' => [
                    'Options',
                ],
                'summary' => 'Displays the various color options.',
                'description' => 'Displays the various color options.',
                'operationId' => 'getColors',
                'x-cli-name' => 'colors:list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_colors',
                                ],
                                'example' => [
                                    'total' => 10,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/options/colors',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/options',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/options/colors{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/options/colors{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/options/colors{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/options/colors{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'color' => 'blue',
                                            ],
                                            [
                                                'color' => 'blush',
                                            ],
                                            [
                                                'color' => 'gray',
                                            ],
                                            [
                                                'color' => 'green',
                                            ],
                                            [
                                                'color' => 'light-blue',
                                            ],
                                            [
                                                'color' => 'orange',
                                            ],
                                            [
                                                'color' => 'pink',
                                            ],
                                            [
                                                'color' => 'purple',
                                            ],
                                            [
                                                'color' => 'teal',
                                            ],
                                            [
                                                'color' => 'yellow',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Return a list of organizations.',
                'description' => 'An organization is a container for some or all of a customer\'s subscriptions. The owner of the organization is the'."\n"
                    .'main billing contact. The owner, along with organization administrators, can set up teams and roles to grant various'."\n"
                    .'permissions to access the applications within each subscription in the organization. Results can be filtered and'."\n"
                    .'sorted by name.'."\n",
                'operationId' => 'getOrganizations',
                'x-cli-name' => 'organizations:list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organizations',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => '6',
                                                'uuid' => 'bfafd31a-83a6-4257-b0ec-afdeff83117a',
                                                'name' => 'Sample organization',
                                                'subscriptions_total' => 115,
                                                'admins_total' => 2,
                                                'users_total' => 82,
                                                'teams_total' => 13,
                                                'roles_total' => 4,
                                                'owner' => [
                                                    'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                    'first_name' => 'First',
                                                    'last_name' => 'Last',
                                                    'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                    'username' => 'user.name',
                                                    'mail' => 'user.name@example.com',
                                                ],
                                                'flags' => [
                                                    'federated_authentication' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/bfafd31a-83a6-4257-b0ec-afdeff83117a',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '4841',
                                                'uuid' => '1992bfe6-c5bf-4a90-810e-a65acab42c6e',
                                                'name' => 'Sample organization 2',
                                                'subscriptions_total' => 4,
                                                'admins_total' => 0,
                                                'users_total' => 0,
                                                'teams_total' => 0,
                                                'roles_total' => 0,
                                                'owner' => [
                                                    'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                    'first_name' => 'First',
                                                    'last_name' => 'Last',
                                                    'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                    'username' => 'user.name',
                                                    'mail' => 'user.name@example.com',
                                                ],
                                                'flags' => [
                                                    'federated_authentication' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/1992bfe6-c5bf-4a90-810e-a65acab42c6e',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => '4841',
                                                'uuid' => '3ff5a541-64cf-4334-acc7-af70b4374373',
                                                'name' => 'Sample organization 3',
                                                'subscriptions_total' => 4,
                                                'admins_total' => 0,
                                                'users_total' => 0,
                                                'teams_total' => 0,
                                                'roles_total' => 0,
                                                'owner' => [
                                                    'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                    'first_name' => 'First',
                                                    'last_name' => 'Last',
                                                    'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                    'username' => 'user.name',
                                                    'mail' => 'user.name@example.com',
                                                ],
                                                'flags' => [
                                                    'federated_authentication' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/3ff5a541-64cf-4334-acc7-af70b4374373',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Return details about a specific organization.',
                'operationId' => 'getOrganizationByUuid',
                'x-cli-name' => 'organizations:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'A specific organization.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization',
                                ],
                                'example' => [
                                    'id' => '6',
                                    'uuid' => 'a81c08c6-a02f-4b57-87e3-c3f395a2bb34',
                                    'name' => 'Sample organization',
                                    'subscriptions_total' => 115,
                                    'admins_total' => 2,
                                    'users_total' => 82,
                                    'teams_total' => 13,
                                    'roles_total' => 4,
                                    'owner' => [
                                        'uuid' => '98d56f28-cff0-421d-9985-58f15cbd6907',
                                        'first_name' => 'First',
                                        'last_name' => 'Last',
                                        'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                        'username' => 'user.name',
                                        'mail' => 'user.name@example.com',
                                    ],
                                    'flags' => [
                                        'federated_authentication' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34',
                                        ],
                                        'admin-invites' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/admin-invites',
                                        ],
                                        'admins' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/admins',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/applications',
                                        ],
                                        'identity-provider' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/identity-provider',
                                        ],
                                        'members' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/members',
                                        ],
                                        'roles' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/roles',
                                        ],
                                        'subscriptions' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/subscriptions',
                                        ],
                                        'team-invites' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/team-invites',
                                        ],
                                        'teams' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/a81c08c6-a02f-4b57-87e3-c3f395a2bb34/teams',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'owner' => [
                                            'uuid' => '98d56f28-cff0-421d-9985-58f15cbd6907',
                                            'first_name' => 'First',
                                            'last_name' => 'Last',
                                            'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                            'username' => 'user.name',
                                            'mail' => 'user.name@example.com',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/users/98d56f28-cff0-421d-9985-58f15cbd6907',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Renames an organization.',
                'description' => 'Renames an organization.',
                'operationId' => 'putOrganization',
                'x-cli-name' => 'organizations:update',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the organization.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My renamed organization',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the organization.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My renamed organization',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Organization renamed' => [
                                        'value' => [
                                            'message' => 'Organization renamed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Name unavailable' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => [
                                                'name' => 'The organization owner already has an organization with this name.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found or Does Not Exist' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Deletes a specific organization by its UUID.',
                'description' => 'Deletes a specific organization.',
                'operationId' => 'deleteOrganization',
                'x-cli-name' => 'organizations:delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Deleted organization' => [
                                        'value' => [
                                            'message' => 'Deleted organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Associated subscriptions' => [
                                        'value' => [
                                            'error' => 'validation_error',
                                            'message' => [
                                                'general' => 'This organization has associated subscriptions and cannot be deleted.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No Permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to delete this organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found or No Permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to delete does not exist, or you do not have permission to delete it.',
                                        ],
                                    ],
                                    'Not Found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization with UUID bfafd31a-83a6-4257-b0ec-afdeff83117a does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/actions/change-owner' => [
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Changes the organization owner.',
                'description' => 'Changes the organization owner.',
                'operationId' => 'postChangeOrganizationOwner',
                'x-cli-name' => 'organizations:owner-change',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'user_uuid',
                                ],
                                'properties' => [
                                    'user_uuid' => [
                                        'type' => 'string',
                                        'description' => 'The uuid of the user you want to make the owner for this organization.',
                                        'format' => 'uuid',
                                    ],
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'user_uuid',
                                ],
                                'properties' => [
                                    'user_uuid' => [
                                        'type' => 'string',
                                        'description' => 'The uuid of the user you want to make the owner for this organization.',
                                        'format' => 'uuid',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Changed owner' => [
                                        'value' => [
                                            'message' => 'Changed organization owner.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to change the organization owner.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No organization or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No organization' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization with UUID 07557159-264f-45eb-8f70-553b8ed21b16 does not exist.',
                                        ],
                                    ],
                                    'No user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user with UUID 3ba405e6-8621-4557-b78a-7d92baa79783 does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'New owner must be administrator' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The new owner must be an existing administrator of the organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/actions/leave' => [
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Removes your account from an organization.',
                'description' => 'Removes your account from an organization.',
                'operationId' => 'postLeaveOrganization',
                'x-cli-name' => 'organizations:leave',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Left organization' => [
                                        'value' => [
                                            'message' => 'Left organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No organization or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No organization' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization with UUID 07557159-264f-45eb-8f70-553b8ed21b16 does not exist.',
                                        ],
                                    ],
                                    'Not a member' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'You are not a member of this organization.',
                                        ],
                                    ],
                                    'No user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user with UUID 3ba405e6-8621-4557-b78a-7d92baa79783 does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Organization owner cannot be removed' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The organization owner cannot be removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/admins' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of organization administrators.',
                'description' => 'Returns a list of organization administrators.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `mail`'."\n"
                    .'* `username`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `mail`'."\n"
                    .'* `username`'."\n",
                'operationId' => 'getOrganizationAdmins',
                'x-cli-name' => 'organizations:admin-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-user-profiles',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/admins',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                'first_name' => 'James',
                                                'last_name' => 'Kirk',
                                                'last_login_at' => '2017-03-28T13:07:54-0500',
                                                'mail' => 'james.kirk@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3/style/avatar',
                                                'username' => 'james.kirk',
                                                'flags' => [
                                                    'owner' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/admins/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '30dacb5e-4122-11e1-9eb5-12313928d3c2',
                                                'first_name' => 'Christopher',
                                                'last_name' => 'Pike',
                                                'last_login_at' => '2016-03-28T13:07:54-0500',
                                                'mail' => 'chris.pike@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/30dacb5e-4122-11e1-9eb5-12313928d3c2/style/avatar',
                                                'username' => 'chris.pike',
                                                'flags' => [
                                                    'owner' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/admins/30dacb5e-4122-11e1-9eb5-12313928d3c2',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                                'first_name' => 'Jonathan',
                                                'last_name' => 'Archer',
                                                'last_login_at' => null,
                                                'mail' => 'jonathan.archer@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52/style/avatar',
                                                'username' => 'jonathan.archer',
                                                'flags' => [
                                                    'owner' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/admins/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/admins/{userUuid}' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns the user profile of this organization administrator.',
                'description' => 'Returns the user profile of this organization administrator.',
                'operationId' => 'getOrganizationAdmin',
                'x-cli-name' => 'organizations:admin-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-user-profile',
                                ],
                                'example' => [
                                    'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                    'first_name' => 'James',
                                    'last_name' => 'Kirk',
                                    'last_login_at' => '2017-03-28T13:07:54-0500',
                                    'mail' => 'james.kirk@example.com',
                                    'picture_url' => 'https://accounts.acquia.com/images/users/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3/style/avatar',
                                    'username' => 'james.kirk',
                                    'flags' => [
                                        'owner' => true,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/admins/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/admins',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view this administrator.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or no permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Removes the user from the list of administrators for the organization.',
                'description' => 'Removes the user from the list of administrators for the organization.',
                'operationId' => 'deleteOrganizationAdmin',
                'x-cli-name' => 'organizations:admin-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Member removed' => [
                                        'value' => [
                                            'message' => 'Organization administrator removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No organization or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to administer does not exist, or you do not have permission to administer it.',
                                        ],
                                    ],
                                    'Organization not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization with UUID 653077de-9349-4822-a104-5e5a8dd2ba05 does not exist.',
                                        ],
                                    ],
                                    'User mismatch' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => 'The user is not an administrator for this organization.',
                                        ],
                                    ],
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user with UUID 5404f30f-465c-4d94-80f1-61f1d35fde0b does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/admin-invites' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Gets a list of invitations of administrators for this organization.',
                'description' => 'Gets a list of invitations of administrators for this organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `permission`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `permission`'."\n",
                'operationId' => 'getOrganizationAdminInvites',
                'x-cli-name' => 'organizations:admin-invite-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-invites',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/admin-invites',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'author' => [
                                                    'uuid' => '0f1915e8-cd84-4386-94b8-21926fc376f5',
                                                    'username' => 'jane.doe',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'jane.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                                ],
                                                'organization' => [
                                                    'name' => 'Organization Name',
                                                    'uuid' => 'a45a99ce-e1ae-47ac-a570-8189bc4d3347',
                                                ],
                                                'uuid' => 'f921fa88-47e3-49df-9dbb-75950aaca428',
                                                'email' => 'invitee@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ec',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ec',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'organization' => [
                                                    'name' => 'Organization Name',
                                                    'uuid' => 'a45a99ce-e1ae-47ac-a570-8189bc4d3347',
                                                ],
                                                'author' => [
                                                    'uuid' => '3f694d6e-3aec-4408-a04f-26ac026118d9',
                                                    'username' => 'john.doe',
                                                    'first_name' => 'John',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'john.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=john.doe@example.com',
                                                ],
                                                'uuid' => '857a8ec9-ac33-428d-8b1c-718d7f6f9aa4',
                                                'email' => 'invitee2@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ed',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ed',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Invites a user to be an administrator in this organization.',
                'description' => 'Invites a user to be an administrator in this organization.',
                'operationId' => 'postOrganizationAdminInvite',
                'x-cli-name' => 'organizations:admin-invite-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'email',
                                ],
                                'properties' => [
                                    'email' => [
                                        'type' => 'string',
                                        'description' => 'The email address of the user to invite as an administrator for this organization.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'email' => 'invitee@example.com',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'email',
                                ],
                                'properties' => [
                                    'email' => [
                                        'type' => 'string',
                                        'description' => 'The email address of the user to invite as an administrator for this organization.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'email' => 'invitee@example.com',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Role created' => [
                                        'value' => [
                                            'message' => 'Invited organization administrator.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to retrieve does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Missing team' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'An invitation to test@example.com has already been sent. It was sent on May 6, 2016 - 7:26pm.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/applications' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of applications that belong to the organization.',
                'description' => 'Returns a list of applications that belong to the organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `organization_name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `organization_name`'."\n",
                'operationId' => 'getOrganizationApplications',
                'x-cli-name' => 'organizations:applications-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 10,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?offset}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/available-tags' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of all available application tags.',
                'description' => 'Returns a list of all available application tags.',
                'operationId' => 'getOrganizationAvailableTags',
                'x-cli-name' => 'organizations:available-tags-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-available-tags',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'total' => 1,
                                        'limit' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/available-tags',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/available-tags{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/available-tags{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/available-tags{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/available-tags{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'Dev',
                                                'color' => 'orange',
                                                'context' => [
                                                    'organization' => [
                                                        'uuids' => [
                                                            '2375e327-3fff-11e3-9170-12313920a02c',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '185f07c7-9c4f-407b-8968-67892ebcb38a',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Adds bulk tags to organization resources.',
                'description' => 'Adds bulk tags to organization resources.',
                'operationId' => 'postOrganizationAvailableTags',
                'x-cli-name' => 'organizations:available-tags-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'tags',
                                    'context',
                                ],
                                'properties' => [
                                    'tags' => [
                                        'type' => 'array',
                                        'description' => 'A list of tags to be added.',
                                        'items' => [
                                            'type' => 'object',
                                            'description' => 'Tag object.',
                                            'required' => [
                                                'name',
                                                'color',
                                            ],
                                            'properties' => [
                                                'name' => [
                                                    'type' => 'string',
                                                    'description' => 'The label of the tag.',
                                                    'minLength' => 2,
                                                    'maxLength' => 16,
                                                ],
                                                'color' => [
                                                    'type' => 'string',
                                                    'description' => 'The color name of the tag found via the GET /api/options/colors endpoint.',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'context' => [
                                        'type' => 'object',
                                        'description' => 'Context resources of tags. Currently supports `application` identifier and `uuids` type.',
                                        'required' => [
                                            'application',
                                        ],
                                        'properties' => [
                                            'application' => [
                                                'type' => 'object',
                                                'description' => 'The resource identifier for applications.',
                                                'required' => [
                                                    'uuids',
                                                ],
                                                'properties' => [
                                                    'uuids' => [
                                                        'type' => 'array',
                                                        'description' => 'A list of application uuids as a resource type.',
                                                        'items' => [
                                                            'type' => 'string',
                                                            'description' => 'An application UUID.',
                                                            'format' => 'uuid',
                                                            'minLength' => 36,
                                                            'maxLength' => 36,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'tags' => [
                                    [
                                        'name' => 'tag-name-1',
                                        'color' => 'green',
                                    ],
                                    [
                                        'name' => 'tag-name-2',
                                        'color' => 'blue',
                                    ],
                                ],
                                'context' => [
                                    'application' => [
                                        'uuids' => [
                                            '96e10bfb-1e4f-41c3-9d07-fffe8aba50d5',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'tags',
                                    'context',
                                ],
                                'properties' => [
                                    'tags' => [
                                        'type' => 'array',
                                        'description' => 'A list of tags to be added.',
                                        'items' => [
                                            'type' => 'object',
                                            'description' => 'Tag object.',
                                            'required' => [
                                                'name',
                                                'color',
                                            ],
                                            'properties' => [
                                                'name' => [
                                                    'type' => 'string',
                                                    'description' => 'The label of the tag.',
                                                    'minLength' => 2,
                                                    'maxLength' => 16,
                                                ],
                                                'color' => [
                                                    'type' => 'string',
                                                    'description' => 'The color name of the tag found via the GET /api/options/colors endpoint.',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'context' => [
                                        'type' => 'object',
                                        'description' => 'Context resources of tags. Currently supports `application` identifier and `uuids` type.',
                                        'required' => [
                                            'application',
                                        ],
                                        'properties' => [
                                            'application' => [
                                                'type' => 'object',
                                                'description' => 'The resource identifier for applications.',
                                                'required' => [
                                                    'uuids',
                                                ],
                                                'properties' => [
                                                    'uuids' => [
                                                        'type' => 'array',
                                                        'description' => 'A list of application uuids as a resource type.',
                                                        'items' => [
                                                            'type' => 'string',
                                                            'description' => 'An application UUID.',
                                                            'format' => 'uuid',
                                                            'minLength' => 36,
                                                            'maxLength' => 36,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'tags' => [
                                    [
                                        'name' => 'tag-name-1',
                                        'color' => 'green',
                                    ],
                                    [
                                        'name' => 'tag-name-2',
                                        'color' => 'blue',
                                    ],
                                ],
                                'context' => [
                                    'application' => [
                                        'uuids' => [
                                            '96e10bfb-1e4f-41c3-9d07-fffe8aba50d5',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    201 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Tags have been updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/87c7be4d-d65d-4a5c-b36b-d921ca86c590/available-tags',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/6992a41d-a953-4ded-ae99-41d2f4d62f69',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/87c7be4d-d65d-4a5c-b36b-d921ca86c590',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Forbidden' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to add tags to one or more of the specified resources.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Deletes bulk tags from organization resources.',
                'description' => 'Deletes bulk tags from organization resources.',
                'operationId' => 'deleteOrganizationAvailableTags',
                'x-cli-name' => 'organizations:available-tags-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'tags',
                                    'context',
                                ],
                                'properties' => [
                                    'tags' => [
                                        'type' => 'array',
                                        'description' => 'A list of tags to be deleted.',
                                        'items' => [
                                            'type' => 'object',
                                            'description' => 'Tag name object.',
                                            'required' => [
                                                'name',
                                            ],
                                            'properties' => [
                                                'name' => [
                                                    'type' => 'string',
                                                    'description' => 'The label of the tag.',
                                                    'minLength' => 2,
                                                    'maxLength' => 16,
                                                ],
                                            ],
                                        ],
                                    ],
                                    'context' => [
                                        'type' => 'object',
                                        'description' => 'Context resources of tags. Currently supports `application` identifier and `uuids` type.',
                                        'required' => [
                                            'application',
                                        ],
                                        'properties' => [
                                            'application' => [
                                                'type' => 'object',
                                                'description' => 'The resource identifier for applications.',
                                                'required' => [
                                                    'uuids',
                                                ],
                                                'properties' => [
                                                    'uuids' => [
                                                        'type' => 'array',
                                                        'description' => 'A list of application uuids as a resource type.',
                                                        'items' => [
                                                            'type' => 'string',
                                                            'description' => 'An application UUID.',
                                                            'format' => 'uuid',
                                                            'minLength' => 36,
                                                            'maxLength' => 36,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'tags' => [
                                    [
                                        'name' => 'tag-name-1',
                                    ],
                                    [
                                        'name' => 'tag-name-2',
                                    ],
                                ],
                                'context' => [
                                    'application' => [
                                        'uuids' => [
                                            '96e10bfb-1e4f-41c3-9d07-fffe8aba50d5',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'tags',
                                    'context',
                                ],
                                'properties' => [
                                    'tags' => [
                                        'type' => 'array',
                                        'description' => 'A list of tags to be deleted.',
                                        'items' => [
                                            'type' => 'object',
                                            'description' => 'Tag object.',
                                            'required' => [
                                                'name',
                                            ],
                                            'properties' => [
                                                'name' => [
                                                    'type' => 'string',
                                                    'description' => 'The label of the tag.',
                                                    'minLength' => 2,
                                                    'maxLength' => 16,
                                                ],
                                            ],
                                        ],
                                    ],
                                    'context' => [
                                        'type' => 'object',
                                        'description' => 'Context resources of tags. Currently supports `application` identifier and `uuids` type.',
                                        'required' => [
                                            'application',
                                        ],
                                        'properties' => [
                                            'application' => [
                                                'type' => 'object',
                                                'description' => 'The resource identifier for applications.',
                                                'required' => [
                                                    'uuids',
                                                ],
                                                'properties' => [
                                                    'uuids' => [
                                                        'type' => 'array',
                                                        'description' => 'A list of application uuids as a resource type.',
                                                        'items' => [
                                                            'type' => 'string',
                                                            'description' => 'An application UUID.',
                                                            'format' => 'uuid',
                                                            'minLength' => 36,
                                                            'maxLength' => 36,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'tags' => [
                                    [
                                        'name' => 'tag-name-1',
                                    ],
                                    [
                                        'name' => 'tag-name-2',
                                    ],
                                ],
                                'context' => [
                                    'application' => [
                                        'uuids' => [
                                            '96e10bfb-1e4f-41c3-9d07-fffe8aba50d5',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Tags have been updated.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/1be8dcdf-e4fd-4a89-9d64-9e4486272c7a/available-tags',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/1be8dcdf-e4fd-4a89-9d64-9e4486272c7a',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/154f88be-b9c0-47c4-b0cb-83eb6aebb7b7',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Forbidden' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove tags from one or more of the specified resources.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not Found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/identity-provider' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns an identity provider for an organization.',
                'description' => 'Returns an identity provider for an organization.',
                'operationId' => 'getOrganizationIdentityProvider',
                'x-cli-name' => 'organizations:identity-provider-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-provider',
                                ],
                                'example' => [
                                    'uuid' => '1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                    'label' => 'Test identity provider',
                                    'idp_entity_id' => 'https://idp.example.com/saml',
                                    'sp_entity_id' => 'https://sp.example.com/saml',
                                    'sso_url' => 'https://example.com/sso',
                                    'certificate' => '-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----',
                                    'status' => 'enabled',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers/1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/identity-providers',
                                        ],
                                        'acs' => [
                                            'href' => 'https://accounts.acquia.com/api/auth/saml/acs/1bc5dbb4-6d59-403b-afc7-777e520aaa40',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The identity provider you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/members' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of all organization members.',
                'description' => 'Returns a list of all organization members, from all teams in this organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `permission`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `permission`'."\n",
                'operationId' => 'getOrganizationMembers',
                'x-cli-name' => 'organizations:members-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-members',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/members',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/members{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/members{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a/members{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3c9ea553-3216-11e3-9170-12313920a23a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                'first_name' => 'James',
                                                'last_name' => 'Kirk',
                                                'last_login_at' => '2017-03-28T13:07:54-0500',
                                                'mail' => 'james.kirk@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3/style/avatar',
                                                'username' => 'james.kirk',
                                                'teams' => [
                                                    [
                                                        'name' => 'Team Name 1',
                                                        'uuid' => '26c4af83-545b-45cb-b165-d537adc9e0b4',
                                                        'roles' => [
                                                            [
                                                                'uuid' => '5f7da0a9-9ff0-4db8-802e-9d2b9969efc2',
                                                                'name' => 'Senior Developer',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '30dacb5e-4122-11e1-9eb5-12313928d3c2',
                                                'first_name' => 'Christopher',
                                                'last_name' => 'Pike',
                                                'mail' => 'chris.pike@example.com',
                                                'last_login_at' => '2018-02-19T13:07:54-0500',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/30dacb5e-4122-11e1-9eb5-12313928d3c2/style/avatar',
                                                'username' => 'chris.pike',
                                                'teams' => [
                                                    [
                                                        'name' => 'Team Name 2',
                                                        'uuid' => 'af55adc6-14d4-4f10-92d7-99c673549935',
                                                        'roles' => [
                                                            [
                                                                'uuid' => 'd33cd9ff-281d-4bcf-9f89-b10b249caa35',
                                                                'name' => 'Developer',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members/30dacb5e-4122-11e1-9eb5-12313928d3c2',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                                'first_name' => 'Jonathan',
                                                'last_name' => 'Archer',
                                                'last_login_at' => null,
                                                'mail' => 'jonathan.archer@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52/style/avatar',
                                                'username' => 'jonathan.archer',
                                                'teams' => [
                                                    [
                                                        'name' => 'Team Name 1',
                                                        'uuid' => '26c4af83-545b-45cb-b165-d537adc9e0b4',
                                                        'roles' => [
                                                            [
                                                                'uuid' => '312c0121-906b-4498-8402-7b479172768c',
                                                                'name' => 'Team Lead',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'Team Name 2',
                                                        'uuid' => 'af55adc6-14d4-4f10-92d7-99c673549935',
                                                        'roles' => [
                                                            [
                                                                'uuid' => 'd33cd9ff-281d-4bcf-9f89-b10b249caa35',
                                                                'name' => 'Developer',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/members/{userUuid}' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'description' => 'Returns the user profile of this organization member.',
                'summary' => 'Returns the user profile of this organization member.',
                'operationId' => 'getOrganizationMember',
                'x-cli-name' => 'organizations:member-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-user-profile',
                                ],
                                'example' => [
                                    'uuid' => '3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                    'first_name' => 'Jonathan',
                                    'last_name' => 'Archer',
                                    'last_login_at' => '2017-03-28T13:07:54-0500',
                                    'mail' => 'jonathan.archer@example.com',
                                    'picture_url' => 'https://accounts.acquia.com/images/users/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52/style/avatar',
                                    'username' => 'jonathan.archer',
                                    'teams' => [
                                        [
                                            'name' => 'Team Name 1',
                                            'uuid' => '7325ba1a-5bfd-4341-9b23-55ffada3c131',
                                            'roles' => [
                                                [
                                                    'uuid' => '312c0121-906b-4498-8402-7b479172768c',
                                                    'name' => 'Team Lead',
                                                ],
                                            ],
                                        ],
                                        [
                                            'name' => 'Team Name 2',
                                            'uuid' => 'bca134fb-55d4-41ec-9558-d14531fa9899',
                                            'roles' => [
                                                [
                                                    'uuid' => 'd33cd9ff-281d-4bcf-9f89-b10b249caa35',
                                                    'name' => 'Developer',
                                                ],
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c/members/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52/applications',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view this member.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No organization or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Removes the member from the organization.',
                'description' => 'Removes the member from the organization.',
                'operationId' => 'postOrganizationMemberDelete',
                'x-cli-name' => 'organizations:member-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Member removed' => [
                                        'value' => [
                                            'message' => 'Organization member removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No organization or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to administer does not exist, or you do not have permission to administer it.',
                                        ],
                                    ],
                                    'Organization not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization with UUID 653077de-9349-4822-a104-5e5a8dd2ba05 does not exist.',
                                        ],
                                    ],
                                    'User not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user with UUID 5404f30f-465c-4d94-80f1-61f1d35fde0b does not exist.',
                                        ],
                                    ],
                                    'User mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user is not a member of this organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application mismatch' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The organization owner cannot be removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/members/{userUuid}/applications' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of applications that an organization member has access to.',
                'description' => 'Returns a list of applications that an organization member has access to.',
                'operationId' => 'getOrganizationMemberApplications',
                'x-cli-name' => 'organizations:member-application-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/members/48b8085f-defd-423b-96ca-0f634bcf07de/applications',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/members/48b8085f-defd-423b-96ca-0f634bcf07de/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/members/48b8085f-defd-423b-96ca-0f634bcf07de/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/members/48b8085f-defd-423b-96ca-0f634bcf07de/applications{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/members/48b8085f-defd-423b-96ca-0f634bcf07de',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found or no permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view the applications this member has access to.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/notifications' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of notifications associated with this organization by its UUID.',
                'description' => 'Returns a list of notifications associated with this organization. A notification represents an item of work to be done, initiated by someone (typically the current user) associated with the organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `event`'."\n"
                    .'* `label`'."\n"
                    .'* `description`'."\n"
                    .'* `status`'."\n"
                    .'* `author`'."\n"
                    .'* `created_at`'."\n"
                    .'* `completed_at`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `event`'."\n"
                    .'* `label`'."\n"
                    .'* `description`'."\n"
                    .'* `status`'."\n"
                    .'* `author`'."\n"
                    .'* `created_at`'."\n"
                    .'* `completed_at`'."\n",
                'operationId' => 'getOrganizationNotifications',
                'x-cli-name' => 'organizations:notification-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'organization/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organizations-notifications',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'total' => 1,
                                        'limit' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d/notifications',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d/notifications{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d/notifications{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d/notifications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d/notifications{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '5c5e848b-296a-4c64-94aa-5a97d99da189',
                                                'event' => 'TeamCreated',
                                                'label' => 'Team created',
                                                'description' => 'Created a new team project anomaly.',
                                                'created_at' => '2022-12-08T15:42:37.000Z',
                                                'completed_at' => '2022-12-08T15:42:37.000Z',
                                                'status' => 'completed',
                                                'progress' => 100,
                                                'context' => [
                                                    'team' => [
                                                        'new_name' => 'project anomaly',
                                                        'uuids' => [
                                                            '4002d7cb-9c89-42f8-8515-4cfc3eb03230',
                                                        ],
                                                    ],
                                                    'author' => [
                                                        'uuid' => '08a44409-568f-46f6-8038-4f30e19e3eb2',
                                                        'actual_uuid' => '08a44409-568f-46f6-8038-4f30e19e3eb2',
                                                    ],
                                                    'user' => [
                                                        'uuids' => [
                                                            '08a44409-568f-46f6-8038-4f30e19e3eb2',
                                                        ],
                                                    ],
                                                    'organization' => [
                                                        'uuids' => [
                                                            '2be7b4e8-6e9b-4314-8ad5-6a0b3f54c38d',
                                                        ],
                                                    ],
                                                    'role' => [
                                                        'uuids' => [
                                                            '8095f9db-5f02-4338-9e90-7772715b5345',
                                                            'b9f366a5-210f-41ad-b99f-feaa61e71394',
                                                            'ddd251c6-5095-4cdb-8902-b3839edfffb4',
                                                            '3c4b2884-60c8-4ca3-9be5-b01c0159658c',
                                                            '3cb1519a-20be-4f69-8a5f-4037dff0acd1',
                                                            '1dd0f44b-6118-4c95-a3a2-a9deea32b2b0',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/notifications/5c5e848b-296a-4c64-94aa-5a97d99da189',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/notifications',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'author' => [
                                                        'uuid' => '08a44409-568f-46f6-8038-4f30e19e3eb2',
                                                        'first_name' => 'Thomas',
                                                        'last_name' => 'Anderson',
                                                        'last_login_at' => '2022-11-30T16:22:48.000Z',
                                                        'created_at' => '2019-10-15T20:22:19.000Z',
                                                        'email' => 'thomas.a.anderson@acquia.com',
                                                        'picture_url' => 'https://accounts.acquia.com/images/users/08a44409-568f-46f6-8038-4f30e19e3eb2/style/avatar',
                                                        'username' => 'thomas.a.anderson@acquia.com',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'organization/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/roles' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of all the canonical roles within the organization.',
                'description' => 'Returns a list of all the canonical roles within the organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `edited_at\''."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n"
                    .'* `edited_at`'."\n",
                'operationId' => 'getOrganizationRoles',
                'x-cli-name' => 'organizations:roles-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_roles',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baede/roles',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baedc/roles{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baedc/roles{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baedc/roles{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baede',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '312c0121-906b-4498-8402-7b479172768c',
                                                'name' => 'Team Lead',
                                                'description' => 'Some details about team lead.',
                                                'permissions' => [
                                                    [
                                                        'name' => 'administer team',
                                                        'label' => 'Add or remove a user of a team',
                                                        'description' => 'Granting this permission will give any user with this role full permissions on this team.',
                                                        'group_label' => 'Administration',
                                                        'flags' => [
                                                            'deprecated' => false,
                                                        ],
                                                    ],
                                                ],
                                                'organization' => [
                                                    'uuid' => '065f4d9e-efbf-4b0e-8cf6-42fa432baede',
                                                    'name' => 'Example Organization',
                                                ],
                                                'last_edited' => [
                                                    'edited_at' => '2011-03-28T17:09:41.000Z',
                                                    'user' => [
                                                        'uuid' => 'aaaa1234-11e2-c374-6954-6931d150b259',
                                                        'first_name' => 'Jane',
                                                        'last_name' => 'Doe',
                                                        'mail' => 'jane.doe@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                                        'username' => 'jane.doe',
                                                    ],
                                                ],
                                                'flags' => [
                                                    'default' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baede/roles/312c0121-906b-4498-8402-7b479172768c',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '5f7da0a9-9ff0-4db8-802e-9d2b9969efc2',
                                                'name' => 'Senior Developer',
                                                'description' => 'Some details about senior developer.',
                                                'permissions' => [
                                                    [
                                                        'name' => 'access cloud api',
                                                        'label' => 'Access the Cloud API',
                                                        'description' => 'Grants the ability to use the API and bypass all other permissions via command line tools.',
                                                        'group_label' => 'Administration',
                                                        'flags' => [
                                                            'deprecated' => false,
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'administer team',
                                                        'label' => 'Add or remove a user of a team',
                                                        'description' => 'Granting this permission will give any user with this role full permissions on this team.',
                                                        'group_label' => 'Administration',
                                                        'flags' => [
                                                            'deprecated' => false,
                                                        ],
                                                    ],
                                                ],
                                                'organization' => [
                                                    'uuid' => '065f4d9e-efbf-4b0e-8cf6-42fa432baede',
                                                    'name' => 'Example Organization',
                                                ],
                                                'last_edited' => [
                                                    'edited_at' => '2011-03-28T17:09:41.000Z',
                                                    'user' => [
                                                        'uuid' => '6661357e-f562-4b77-8de9-60b4bf83e01b',
                                                        'first_name' => 'Acquia',
                                                        'last_name' => 'Support',
                                                        'mail' => 'support@acquia.com',
                                                        'picture_url' => null,
                                                        'username' => 'support.acquia',
                                                    ],
                                                ],
                                                'flags' => [
                                                    'default' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baede/roles/5f7da0a9-9ff0-4db8-802e-9d2b9969efc2',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'd33cd9ff-281d-4bcf-9f89-b10b249caa35',
                                                'name' => 'Developer',
                                                'description' => 'Some details about developer.',
                                                'permissions' => [
                                                    [
                                                        'name' => 'access cloud api',
                                                        'label' => 'Access the Cloud API',
                                                        'description' => 'Grants the ability to use the API and bypass all other permissions via command line tools.',
                                                        'group_label' => 'Administration',
                                                        'flags' => [
                                                            'deprecated' => false,
                                                        ],
                                                    ],
                                                ],
                                                'organization' => [
                                                    'uuid' => '065f4d9e-efbf-4b0e-8cf6-42fa432baede',
                                                    'name' => 'Example Organization',
                                                ],
                                                'last_edited' => [
                                                    'edited_at' => '2011-03-28T17:09:41.000Z',
                                                    'user' => [
                                                        'uuid' => 'bbbb1234-11e2-c374-6954-6931d150b259',
                                                        'first_name' => 'John',
                                                        'last_name' => 'Doe',
                                                        'mail' => 'john.doe@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=john.doe@example.com',
                                                        'username' => 'john.doe',
                                                    ],
                                                ],
                                                'flags' => [
                                                    'default' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/065f4d9e-efbf-4b0e-8cf6-42fa432baede/roles/5f7da0a9-9ff0-4db8-802e-9d2b9969efc2',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Creates a role.',
                'description' => 'Creates a role.',
                'operationId' => 'postOrganizationRoles',
                'x-cli-name' => 'organizations:role-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'permissions',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the new role to create.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'description' => 'The description of the new role.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'permissions' => [
                                        'type' => 'array',
                                        'description' => 'An array of permissions to grant to this role.',
                                        'items' => [
                                            'type' => 'string',
                                            'description' => 'A permission.',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new role',
                                'description' => 'My role description',
                                'permissions' => [
                                    'permission 1',
                                    'permission 2',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                    'permissions',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the new role to create.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'description' => 'The description of the new role.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'permissions' => [
                                        'type' => 'array',
                                        'description' => 'An array of permissions to grant to this role.',
                                        'items' => [
                                            'type' => 'string',
                                            'description' => 'A permission.',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new role',
                                'description' => 'My role description',
                                'permissions' => [
                                    'permission 1',
                                    'permission 2',
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Role created' => [
                                        'value' => [
                                            'message' => 'Role created.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Invalid permission' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'permissions' => 'The permission \'permission 1\' is not a valid permission',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to retrieve does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role already exists' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The name for this role is already being used within this organization.',
                                        ],
                                    ],
                                    'Missing team' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'An organization must have at least one team in order to create new roles.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/subscriptions' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of subscriptions that belong to the organization.',
                'description' => 'Returns a list of subscriptions that belong to the organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getOrganizationSubscriptions',
                'x-cli-name' => 'organizations:subscriptions-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 10,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481/applications{?offset}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d4e44648-8780-4105-905c-43a1eb486481',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'be3a7975-d62b-4e29-b24f-dfb2a43468e6',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd4e44648-8780-4105-905c-43a1eb486481',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                    ],
                                                ],
                                                'tags' => [
                                                    [
                                                        'name' => 'tag-1',
                                                        'color' => 'blue',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-1',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                    [
                                                        'name' => 'tag-2',
                                                        'color' => 'green',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags/tag-2',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/957bec0e-30c1-4971-ae2a-2ec4071cdd4e/tags',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/team-invites' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Gets a list of member invitations for all teams in this organization.',
                'description' => 'Gets a list of member invitations for all teams in this organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getOrganizationTeamInvites',
                'x-cli-name' => 'organizations:team-invite-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-invites',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d72c0cf8-62e2-418d-8530-6e54f122cf96/team-invites',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d72c0cf8-62e2-418d-8530-6e54f122cf96/team-invites{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d72c0cf8-62e2-418d-8530-6e54f122cf96/team-invites{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d72c0cf8-62e2-418d-8530-6e54f122cf96/team-invites{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/d72c0cf8-62e2-418d-8530-6e54f122cf96',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'applications' => [],
                                                'author' => [
                                                    'uuid' => '879fc134-e8d9-49ab-a1a8-ffa33fddf8c9',
                                                    'first_name' => 'Joe',
                                                    'last_name' => 'Smith',
                                                    'last_login_at' => '2019-01-30T13:58:07.000Z',
                                                    'created_at' => '2014-08-14T21:37:23.000Z',
                                                    'mail' => 'joe.smith@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/images/users/879fc134-e8d9-49ab-a1a8-ffa33fddf8c9/style/avatar',
                                                    'username' => 'joe.smith',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd72c0cf8-62e2-418d-8530-6e54f122cf96',
                                                    'name' => 'Organization Name',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'f540b0ba-d32e-4f48-be78-e932ccb8c201',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                ],
                                                'team' => [
                                                    'uuid' => 'c682c830-f67a-4c49-9444-9ef8cec46f43',
                                                    'name' => 'Team Name 1',
                                                ],
                                                'uuid' => 'fd745f4b-178f-4c09-87cc-4061a60eb1c9',
                                                'email' => 'invitee@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ec',
                                                'flags' => [
                                                    'declined' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ec',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'applications' => [],
                                                'author' => [
                                                    'uuid' => '7e181890-bfb9-40d7-874b-ec78912c7525',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Smith',
                                                    'last_login_at' => '2018-01-30T13:58:07.000Z',
                                                    'created_at' => '2017-08-14T21:37:23.000Z',
                                                    'mail' => 'jane.smith@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/images/users/7e181890-bfb9-40d7-874b-ec78912c7525/style/avatar',
                                                    'username' => 'joe.smith',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd72c0cf8-62e2-418d-8530-6e54f122cf96',
                                                    'name' => 'Organization Name',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'f540b0ba-d32e-4f48-be78-e932ccb8c201',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                    [
                                                        'uuid' => '84217d35-78df-4d1b-91b5-de165ce6c2e7',
                                                        'name' => 'Team Lead',
                                                    ],
                                                ],
                                                'team' => [
                                                    'uuid' => 'c682c830-f67a-4c49-9444-9ef8cec46f43',
                                                    'name' => 'Team Name 1',
                                                ],
                                                'uuid' => '036612d0-8879-44a6-b2e2-93e0e30fc7fb',
                                                'email' => 'invitee2@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ed',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ed',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'applications' => [],
                                                'author' => [
                                                    'uuid' => '36dd8434-8eda-4c75-9f80-4f8a76d622b2',
                                                    'first_name' => 'David',
                                                    'last_name' => 'Green',
                                                    'last_login_at' => '2018-03-21T13:48:07.000Z',
                                                    'created_at' => '2016-03-14T21:37:23.000Z',
                                                    'mail' => 'david.green@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/images/users/36dd8434-8eda-4c75-9f80-4f8a76d622b2/style/avatar',
                                                    'username' => 'joe.smith',
                                                ],
                                                'organization' => [
                                                    'uuid' => 'd72c0cf8-62e2-418d-8530-6e54f122cf96',
                                                    'name' => 'Organization Name',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'f540b0ba-d32e-4f48-be78-e932ccb8c201',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                ],
                                                'team' => [
                                                    'uuid' => '16fa24c5-ff65-4e21-902d-58af2aa11b4c',
                                                    'name' => 'Team Name 2',
                                                ],
                                                'uuid' => '24f7baea-5d0c-4860-8838-23130f092c48',
                                                'email' => 'invitee2@example.com',
                                                'created_at' => '2013-05-15T12:00:00.000Z',
                                                'token' => 'aa1ea69fdcb6bee08b31a858b85535ee',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/aa1ea69fdcb6bee08b31a858b85535ee',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/organizations/{organizationUuid}/teams' => [
            'get' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Returns a list of teams associated with the organization.',
                'description' => 'Returns a list of teams associated with the organization.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getOrganizationTeams',
                'x-cli-name' => 'organizations:team-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_teams',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3856ef7d-5c9a-49e2-8fff-649e9a81a3bc/teams',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3856ef7d-5c9a-49e2-8fff-649e9a81a3bc/teams{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3856ef7d-5c9a-49e2-8fff-649e9a81a3bc/teams{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3856ef7d-5c9a-49e2-8fff-649e9a81a3bc/teams{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/organizations/3856ef7d-5c9a-49e2-8fff-649e9a81a3bc',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'e8a29774-8f46-4765-9529-d564c81ba05f',
                                                'name' => 'Team Name 1',
                                                'created_at' => '2013-10-28T14:16:07-0700',
                                                'updated_at' => '2015-02-19T08:53:10-0800',
                                                'organization' => [
                                                    'uuid' => '842da900-3488-4139-9f31-656665857267',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '4b30d7e6-84af-4d80-931a-4172f57fe1b0',
                                                'name' => 'Team Name 2',
                                                'created_at' => '2014-05-27T11:55:39-0700',
                                                'updated_at' => '2015-01-30T05:49:16-0800',
                                                'organization' => [
                                                    'uuid' => '842da900-3488-4139-9f31-656665857267',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/9ca6ecc0-e5d0-11e3-9eb3-22000b04072f',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Organizations',
                ],
                'summary' => 'Creates a team.',
                'description' => 'Creates a team.',
                'operationId' => 'postOrganizationTeams',
                'x-cli-name' => 'organizations:team-create',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the new team to create.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new team',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'name',
                                ],
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The name of the new team to create.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new team',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Invited' => [
                                        'value' => [
                                            'message' => 'Team created.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Created',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team',
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The organization you are trying to retrieve does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Team name already exists' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'A team with this name already exists in this organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/permissions' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Return a list of permissions.',
                'description' => 'Displays a list of all available permissions currently in the system. This will include permissions that the user'."\n"
                    .'may not have access to.'."\n",
                'operationId' => 'getPermissions',
                'x-cli-name' => 'permissions:list',
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permissions',
                                ],
                                'example' => [
                                    'total' => 49,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/permissions',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'deploy to non-prod',
                                                'label' => 'Pull and deploy code, files, or databases to non-production environments',
                                                'description' => 'Grants the ability to enable or disable live development and non-production work.',
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'deploy to prod',
                                                'label' => 'Deploy code, files, or databases to the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'pull from prod',
                                                'label' => 'Pull files or databases from the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file to non-prod',
                                                'label' => 'Move files to non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file to prod',
                                                'label' => 'Move files to the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file from prod',
                                                'label' => 'Move files from production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'move file from non-prod',
                                                'label' => 'Move files from non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear varnish on non-prod',
                                                'label' => 'Clear Varnish cache for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => true,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear varnish on prod',
                                                'label' => 'Clear Varnish cache for the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => true,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure prod env',
                                                'label' => 'Configure production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure non-prod env',
                                                'label' => 'Configure non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add an environment',
                                                'label' => 'Add an environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'delete an environment',
                                                'label' => 'Delete an environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer domain non-prod',
                                                'label' => 'Add or remove domains for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer domain prod',
                                                'label' => 'Add or remove domains for the production environment',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer ssl prod',
                                                'label' => 'Add or remove SSL certificates for the production environment',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer ssl non-prod',
                                                'label' => 'Add or remove SSL certificates for the non-production environments',
                                                'description' => null,
                                                'group_label' => 'Domains',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'reboot server',
                                                'label' => 'Reboot server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'resize server',
                                                'label' => 'Resize server',
                                                'description' => 'Increasing the size of your server costs money.',
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'suspend server',
                                                'label' => 'Suspend server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'configure server',
                                                'label' => 'Configure server',
                                                'description' => null,
                                                'group_label' => 'Server administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download logs non-prod',
                                                'label' => 'Download logs for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Logs',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download logs prod',
                                                'label' => 'Download logs for the production environment',
                                                'description' => null,
                                                'group_label' => 'Logs',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add database',
                                                'label' => 'Add a database',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'remove database',
                                                'label' => 'Remove a database',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view database connection',
                                                'label' => 'View database connection details (username, password, or hostname)',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download db backup non-prod',
                                                'label' => 'Download database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'download db backup prod',
                                                'label' => 'Download database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create db backup non-prod',
                                                'label' => 'Create database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create db backup prod',
                                                'label' => 'Create database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'restore db backup non-prod',
                                                'label' => 'Restore database backups for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'restore db backup prod',
                                                'label' => 'Restore database backups for the production environment',
                                                'description' => null,
                                                'group_label' => 'Databases',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer team',
                                                'label' => 'Add or remove a user of a team',
                                                'description' => 'Granting this permission will give any user with this role full permissions on this team.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'access cloud api',
                                                'label' => 'Access the Cloud API',
                                                'description' => 'Grants the ability to use the API and bypass all other permissions via command line tools.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer cron non-prod',
                                                'label' => 'Modify cron tasks for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Cron',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'administer cron prod',
                                                'label' => 'Modify cron tasks for the production environment',
                                                'description' => null,
                                                'group_label' => 'Cron',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'create support ticket',
                                                'label' => 'Create a support ticket',
                                                'description' => null,
                                                'group_label' => 'Support',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit any support ticket',
                                                'label' => 'View and edit any support tickets for a subscription',
                                                'description' => null,
                                                'group_label' => 'Support',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view build plans',
                                                'label' => 'View Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit build plans',
                                                'label' => 'Edit Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'run build plans',
                                                'label' => 'Run Build plans',
                                                'description' => null,
                                                'group_label' => 'Build',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to git',
                                                'label' => 'Add SSH key to git repository',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to non-prod',
                                                'label' => 'Add SSH key to non-production environments',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'add ssh key to prod',
                                                'label' => 'Add SSH key to the production environment',
                                                'description' => null,
                                                'group_label' => 'SSH keys',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'view remote administration',
                                                'label' => 'View Remote Administration',
                                                'description' => 'This permission is only relevant if your subscription has remote administration.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'edit remote administration',
                                                'label' => 'Edit Remote Administration',
                                                'description' => 'This permission is only relevant if your subscription has remote administration.',
                                                'group_label' => 'Administration',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear caches on prod',
                                                'label' => 'Clear caches for the production environment',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                            [
                                                'name' => 'clear caches on non-prod',
                                                'label' => 'Clear caches for non-production environments',
                                                'description' => null,
                                                'group_label' => 'Workflow',
                                                'flags' => [
                                                    'deprecated' => false,
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/roles/{roleUuid}' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Return details about a specific role.',
                'description' => 'Roles may be assigned to team members, and grant various permissions to the applications that the team is assigned'."\n"
                    .'to. Roles are unique within a organization.'."\n",
                'operationId' => 'getRole',
                'x-cli-name' => 'tps:role-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_role-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role',
                                ],
                                'example' => [
                                    'uuid' => 'c885728d-cbbe-4e54-bf09-19b751b6d0c7',
                                    'name' => 'My Custom Role',
                                    'description' => 'Some details about my custom role.',
                                    'permissions' => [
                                        [
                                            'name' => 'deploy to non-prod',
                                            'label' => 'Pull and deploy code, files, or databases to non-production environments',
                                            'description' => 'Grants the ability to enable or disable live development and non-production work.',
                                            'group_label' => 'Workflow',
                                            'flags' => [
                                                'deprecated' => false,
                                            ],
                                        ],
                                        [
                                            'name' => 'configure non-prod env',
                                            'label' => 'Configure non-production environments',
                                            'description' => null,
                                            'group_label' => 'Workflow',
                                            'flags' => [
                                                'deprecated' => false,
                                            ],
                                        ],
                                        [
                                            'name' => 'download logs non-prod',
                                            'label' => 'Download logs for non-production environments',
                                            'description' => null,
                                            'group_label' => 'Logs',
                                            'flags' => [
                                                'deprecated' => false,
                                            ],
                                        ],
                                        [
                                            'name' => 'view database connection',
                                            'label' => 'View database connection details (username, password, or hostname)',
                                            'description' => null,
                                            'group_label' => 'Databases',
                                            'flags' => [
                                                'deprecated' => false,
                                            ],
                                        ],
                                    ],
                                    'organization' => [
                                        'uuid' => 'd122cc06-35bd-41bf-9baa-5b770c8ca0f1',
                                        'name' => 'My Organization',
                                    ],
                                    'last_edited' => [
                                        'edited_at' => '2011-03-28T17:09:41.000Z',
                                        'user' => [
                                            'uuid' => '590909a0-e819-43e6-a8e3-212dc3e35852',
                                            'first_name' => 'Jane',
                                            'last_name' => 'Doe',
                                            'mail' => 'jane.doe@example.com',
                                            'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                            'username' => 'jane.doe',
                                        ],
                                    ],
                                    'flags' => [
                                        'default' => false,
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The role you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Deletes a specific role by its UUID.',
                'description' => 'Deletes a specific role.',
                'operationId' => 'deleteRole',
                'x-cli-name' => 'tps:roles-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_role-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'Deleted role.',
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The role you are trying to delete does not exist, or you do not have permission to delete it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Updates a role.',
                'operationId' => 'putRoleByUuid',
                'x-cli-name' => 'tps:role-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'description' => 'Modifies a role.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_role-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the role.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'description' => 'The new description of the role.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'permissions' => [
                                        'type' => 'array',
                                        'description' => 'An array of the permissions associated with the role.',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new role name',
                                'description' => 'My new role description.',
                                'permisions' => [
                                    'permission 4',
                                    'permission 5',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'description' => 'The updated name of the role.',
                                        'type' => 'string',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'description' => [
                                        'description' => 'The updated description of the role.',
                                        'type' => 'string',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'permissions' => [
                                        'description' => 'A list of permissions to grant to this role.',
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                        ],
                                    ],
                                ],
                                'example' => [
                                    'name' => 'My new role name',
                                    'description' => 'My new role description.',
                                    'status' => [
                                        'permission 4',
                                        'permission 5',
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new application name',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'example' => [
                                    'message' => 'Updating role.',
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The role you are trying to access does not exist, or you do not have permission to edit it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Return a list of subscription.',
                'description' => 'Filterable fields:'."\n"
                    .'* `from`'."\n"
                    .'* `to`'."\n"
                    .'* `sort`'."\n"
                    .'* `filter`'."\n"
                    .'* `limit`'."\n"
                    .'* `offset`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `from`'."\n"
                    .'* `to`'."\n"
                    .'* `sort`'."\n"
                    .'* `filter`'."\n"
                    .'* `limit`'."\n"
                    .'* `offset`'."\n",
                'operationId' => 'getSubscriptions',
                'x-cli-name' => 'subscriptions:list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscriptions',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 123,
                                                'uuid' => 'faa297f3-f59a-4abc-8d71-904f51bcb1c5',
                                                'name' => 'Acquia Cloud Free Subscription',
                                                'start_at' => '2011-03-28T00:00:00.000Z',
                                                'expire_at' => '2015-11-11T00:00:00.000Z',
                                                'product' => [
                                                    'id' => 1890149,
                                                    'name' => 'Acquia Cloud Free',
                                                    'type' => 'free',
                                                ],
                                                'applications_total' => 3,
                                                'applications_used' => 1,
                                                'organization' => [
                                                    'uuid' => '39f38840-c494-4622-80a5-fc40269cb42d',
                                                    'name' => 'Acquia Inc.',
                                                ],
                                                'flags' => [
                                                    'active' => true,
                                                    'expired' => true,
                                                    'zuora' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/faa297f3-f59a-4abc-8d71-904f51bcb1c5',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'organization' => [
                                                        'uuid' => '39f38840-c494-4622-80a5-fc40269cb42d',
                                                        'name' => 'Acquia Inc.',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations/39f38840-c494-4622-80a5-fc40269cb42d',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 222,
                                                'uuid' => '36496037-6eb5-482d-8549-e45e1718f2b7',
                                                'name' => 'My Acquia Subscription',
                                                'start_at' => '2012-05-15T12:00:00.000Z',
                                                'expire_at' => '2015-05-15T12:00:00.000Z',
                                                'product' => [
                                                    'id' => 8999,
                                                    'name' => 'Enterprise',
                                                    'type' => 'enterprise',
                                                ],
                                                'applications_total' => 5,
                                                'applications_used' => 2,
                                                'organization' => [
                                                    'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                                    'name' => 'My Organization',
                                                ],
                                                'flags' => [
                                                    'active' => true,
                                                    'expired' => true,
                                                    'zuora' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/36496037-6eb5-482d-8549-e45e1718f2b7',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'organization' => [
                                                        'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                                        'name' => 'My Organization',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations/93c97126-2870-47f0-9ffd-9a92033c443e',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 333,
                                                'uuid' => '2d92f652-882c-458a-8183-4d9cef7c2fde',
                                                'name' => 'My Acquia Subscription 2',
                                                'start_at' => '2012-05-15T12:00:00.000Z',
                                                'expire_at' => '2015-05-15T12:00:00.000Z',
                                                'product' => [
                                                    'id' => 8999,
                                                    'name' => 'Enterprise',
                                                    'type' => 'enterprise',
                                                ],
                                                'applications_total' => 5,
                                                'applications_used' => 2,
                                                'organization' => [
                                                    'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                                    'name' => 'My Organization',
                                                ],
                                                'flags' => [
                                                    'active' => true,
                                                    'expired' => true,
                                                    'zuora' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/2d92f652-882c-458a-8183-4d9cef7c2fde',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'organization' => [
                                                        'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                                        'name' => 'My Organization',
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations/93c97126-2870-47f0-9ffd-9a92033c443e',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/organizations',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'You do not have permission to view subscriptions.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Return details about a specific subscription.',
                'description' => 'Return details about a specific subscription.',
                'operationId' => 'getSubscription',
                'x-cli-name' => 'subscriptions:find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription',
                                ],
                                'example' => [
                                    'id' => 329876,
                                    'uuid' => '8533debb-ae4e-427b-aa34-731719b4201a',
                                    'name' => 'My Subscription',
                                    'start_at' => '2015-05-13T00:00:00.000Z',
                                    'expire_at' => '2018-05-12T00:00:00.000Z',
                                    'product' => [
                                        'id' => 8999,
                                        'name' => 'Enterprise',
                                        'type' => 'enterprise',
                                    ],
                                    'applications_total' => 10,
                                    'applications_used' => 0,
                                    'organization' => [
                                        'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                        'name' => 'My Organization',
                                    ],
                                    'flags' => [
                                        'active' => true,
                                        'expired' => true,
                                        'zuora' => false,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/applications',
                                        ],
                                        'entitlements' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/entitlements',
                                        ],
                                        'ides' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/ides',
                                        ],
                                        'shield-acl' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/shield-acl',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'organization' => [
                                            'uuid' => '93c97126-2870-47f0-9ffd-9a92033c443e',
                                            'name' => 'My Organization',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/organizations/93c97126-2870-47f0-9ffd-9a92033c443e',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/organizations',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Modifies a subscription.',
                'description' => 'Modifies a subscription.',
                'operationId' => 'putSubscription',
                'x-cli-name' => 'subscriptions:update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new subscription name.',
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Subscription updated' => [
                                        'value' => [
                                            'message' => 'Subscription updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/apm' => [
            'get' => [
                'tags' => [
                    'Application Performance Monitoring Services',
                ],
                'summary' => 'Returns a list of Application Performance Monitoring services associated with the subscription.',
                'description' => 'Returns a list of Application Performance Monitoring services associated with the subscription.',
                'operationId' => 'getSubscriptionApmTypes',
                'x-cli-name' => 'subscriptions:apm-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm-types',
                                ],
                                'example' => [
                                    'total' => 1,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'type' => 'newrelic',
                                                'flags' => [
                                                    'opted-in' => true,
                                                ],
                                                'key' => '2d1dfa83d5e1494793957e7ce572942b',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm/newrelic',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to access APM summaries for this subscription.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/apm/{apmType}' => [
            'get' => [
                'tags' => [
                    'Application Performance Monitoring Services',
                ],
                'summary' => 'Returns the Application Performance Monitoring service type associated with the subscription.',
                'description' => 'Returns the Application Performance Monitoring service type associated with the subscription.',
                'operationId' => 'getSubscriptionApmType',
                'x-cli-name' => 'subscriptions:apm-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_apm-type',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm-type',
                                ],
                                'example' => [
                                    'type' => 'newrelic',
                                    'flags' => [
                                        'opted-in' => true,
                                    ],
                                    'key' => '2d1dfa83d5e1494793957e7ce572942b',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'forbidden',
                                    'message' => 'You do not have permission to access this APM summary type.',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/apm/{apmType}/actions/opt-in' => [
            'post' => [
                'tags' => [
                    'Application Performance Monitoring Services',
                ],
                'summary' => 'Enables New Relic Pro APM license for all applications on a subscription.',
                'description' => 'Enables New Relic Pro APM license for all applications on a subscription. This authorizes Acquia to create a new user account on the third-party New Relic platform using the name and e-mail address of the organization owner.',
                'operationId' => 'postSubscriptionApmOptIn',
                'x-cli-name' => 'subscriptions:apm-opt-in',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_apm-type',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'examples' => [
                                    'APM Type Enabled' => [
                                        'value' => [
                                            'message' => 'APM type newrelic has been enabled on the example subscription.',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm/newrelic/actions/opt-in',
                                                ],
                                                'parent' => [
                                                    'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/apm/newrelic/actions',
                                                ],
                                                'notification' => [
                                                    'href' => 'https://cloud.acquia.com/api/notifications/7b37b885-8ae4-454b-b8fa-ffaeff54f6a4',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'APM type unavailable' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'New Relic is not available for this subscription.',
                                            ],
                                        ],
                                    ],
                                    'Must be organization owner' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Only the organization owner may opt into data sharing.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to opt-in to APM settings for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/applications' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Provides a list of applications that are a part of the subscription.',
                'description' => 'Filterable fields:'."\n"
                    .'* `from`'."\n"
                    .'* `to`'."\n"
                    .'* `sort`'."\n"
                    .'* `filter`'."\n"
                    .'* `limit`'."\n"
                    .'* `offset`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `from`'."\n"
                    .'* `to`'."\n"
                    .'* `sort`'."\n"
                    .'* `filter`'."\n"
                    .'* `limit`'."\n"
                    .'* `offset`'."\n",
                'operationId' => 'getSubscriptionApplications',
                'x-cli-name' => 'subscriptions:application-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 10,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/applications',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/applications{?limit}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'f47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '6a907396-abfd-4d01-9da6-64c8efc04519',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'example' => [
                                    'error' => 'not_found',
                                    'message' => 'You do not have permission to view applications.',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/code-studio' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves Code Studio metadata for a subscription.',
                'description' => 'Retrieves Code Studio metadata for a subscription.',
                'operationId' => 'getCodeStudioSubscriptionMetadata',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-subscription-metadata',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio',
                                        ],
                                        'subscription' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                        ],
                                        'users' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/applications',
                                        ],
                                        'code-studio' => [
                                            'href' => 'https://code.acquia.com',
                                        ],
                                        'code-studio-api' => [
                                            'href' => 'https://code.acquia.com/api/v4',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'subscription' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                                ],
                                            ],
                                            'uuid' => 'e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                            'name' => 'My Subscription',
                                        ],
                                    ],
                                    'status' => 'active',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'options' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Displays Code Studio options for a subscription.',
                'description' => 'Displays Code Studio options for a subscription.',
                'operationId' => 'optionsCodeStudio',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-options',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                        ],
                                    ],
                                    'roles' => [
                                        'a9bdb481-63f4-4770-93ee-bf6c630238cf' => 'Guest',
                                        'c6c76597-dd30-4149-8a76-3c58d764bc66' => 'Reporter',
                                        '4a996644-5a6e-4403-9306-6c08cb212ee1' => 'Developer',
                                        '90abb6cc-f609-41db-a92d-1900b1c7d93f' => 'Maintainer',
                                        'e62722c0-64dc-4d87-88ac-9f7bef645572' => 'Owner',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/code-studio/actions/enable' => [
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Enables Code Studio for a subscription.',
                'description' => 'Enables and provisions Code Studio at the subscription level.',
                'operationId' => 'postEnableCodeStudio',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/actions/enable',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/34c7ed7e-2db8-433f-b6a8-96bc1080e3c9',
                                        ],
                                    ],
                                    'notification_id' => '34c7ed7e-2db8-433f-b6a8-96bc1080e3c9',
                                    'message' => 'Code Studio has been enabled for the Subscription.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to enable Code Studio for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/code-studio/applications' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves a list of Code Studio enabled applications for a subscription.',
                'description' => 'Retrieves a list of Code Studio enabled applications for a subscription.',
                'operationId' => 'getCodeStudioApplications',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-applications',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'limit' => 10,
                                        'total' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                        ],
                                        'code-studio' => [
                                            'href' => 'https://code.acquia.com',
                                        ],
                                        'code-studio-api' => [
                                            'href' => 'https://code.acquia.com/api/v4',
                                        ],
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/applications?offset=1',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/applications?offset=1{&filter}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/applications?offset=1{&sort}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/b91be25b-8eba-4ff7-94c8-d51637da2343',
                                                    ],
                                                    'project' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/b91be25b-8eba-4ff7-94c8-d51637da2343/code-studio',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'project' => [
                                                        '_links' => [
                                                            'self' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/b91be25b-8eba-4ff7-94c8-d51637da2343/code-studio',
                                                            ],
                                                            'parent' => [
                                                                'href' => 'https://cloud.acquia.com/api/applications/b91be25b-8eba-4ff7-94c8-d51637da2343',
                                                            ],
                                                            'code-studio' => [
                                                                'href' => 'https://code.acquia.com/path/to/project',
                                                            ],
                                                            'code-studio-api' => [
                                                                'href' => 'https://code.acquia.com/api/v4/path/to/project',
                                                            ],
                                                        ],
                                                        'application_id' => 'b91be25b-8eba-4ff7-94c8-d51637da2343',
                                                        'status' => 'active',
                                                    ],
                                                ],
                                                'uuid' => 'b91be25b-8eba-4ff7-94c8-d51637da2343',
                                                'name' => 'My Application',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/code-studio/users' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves a list of users assigned to Code Studio for a subscription.',
                'description' => 'Retrieves a list of users assigned to Code Studio for a subscription.',
                'operationId' => 'getCodeStudioUsers',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-users',
                                ],
                                'example' => [
                                    'total' => 1,
                                    'pagination' => [
                                        'limit' => 10,
                                        'total' => 1,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio',
                                        ],
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                        ],
                                        'code-studio' => [
                                            'href' => 'https://code.acquia.com',
                                        ],
                                        'code-studio-api' => [
                                            'href' => 'https://code.acquia.com/api/v4',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users{?filter}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users{?sort}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users/cc27c5b6-d641-4e72-8897-75874ecf82e6',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                                    ],
                                                    'code-studio' => [
                                                        'href' => 'https://code.acquia.com',
                                                    ],
                                                    'code-studio-api' => [
                                                        'href' => 'https://code.acquia.com/api/v4',
                                                    ],
                                                ],
                                                'uuid' => 'cc27c5b6-d641-4e72-8897-75874ecf82e6',
                                                'first_name' => 'Jane',
                                                'last_name' => 'Doe',
                                                'mail' => 'jane.doe@test.com',
                                                'role' => 'b3d8e9f1-8cb6-43c0-b579-0c465f5fdf49',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Assigns a user to a Code Studio seat for a subscription.',
                'description' => 'Assigns a user to Code Studio seat for a subscription.',
                'operationId' => 'postCodeStudioUsers',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'user_id' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the user to assign.',
                                    ],
                                    'role' => [
                                        'type' => 'string',
                                        'description' => 'The ID of the Code Studio role to assign to the user.',
                                    ],
                                ],
                            ],
                            'example' => [
                                'user_id' => '0b9bea4e-f469-44dd-a4b6-965aad734198',
                                'role' => 'ba8e9a8b-5e98-43b0-a0ec-40b2a813879a',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/4e3cae56-5547-4ac7-b552-5dc87b50a8d3',
                                        ],
                                    ],
                                    'message' => 'A Code Studio user has been added to the Subscription.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to add a Code Studio user to this Subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/code-studio/users/{userUuid}' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves details about a specific Code Studio user.',
                'description' => 'Retrieves details about a specific Code Studio user.',
                'operationId' => 'getCodeStudioUser',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-user',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users/bd06a2fe-a103-400e-b397-b4d27538e1b3',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                        ],
                                        'code-studio' => [
                                            'href' => 'https://code.acquia.com',
                                        ],
                                        'code-studio-api' => [
                                            'href' => 'https://code.acquia.com/api/v4',
                                        ],
                                    ],
                                    'uuid' => 'bd06a2fe-a103-400e-b397-b4d27538e1b3',
                                    'first_name' => 'Jane',
                                    'last_name' => 'Doe',
                                    'mail' => 'jane.doe@test.com',
                                    'role' => '90ad1576-84d9-43e5-b9db-0aad54dd5ade',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'Code Studio is not available for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Code Studio user not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The Code Studio user you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Unassigns a user from a Code Studio seat.',
                'description' => 'Unassigns a user from a Code Studio seat.',
                'operationId' => 'deleteCodeStudioUser',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/e5bfb18f-2c6c-4534-bb9b-15ba73e17342/code-studio/users',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/4e3cae56-5547-4ac7-b552-5dc87b50a8d3',
                                        ],
                                    ],
                                    'message' => 'The Code Studio user is being removed from the Subscription.',
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove the Code Studio user from this Subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/domains' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Returns a list of Domains registered with this subscription.',
                'description' => 'Returns a list of Domains registered with this subscription.',
                'operationId' => 'getSubscriptionDomainRegistrations',
                'x-cli-name' => 'subscriptions:domain-registrations-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registrations',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains{?offset}',
                                            'templated' => true,
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '123e4567-e89b-12d3-a456-426614174000',
                                                'domain_name' => 'example.com',
                                                'health' => [
                                                    'code' => '404',
                                                    'details' => 'Acquia could not verify the presence of the required DKIM/SPF/TXT DNS record.',
                                                    'summary' => 'Missing DNS record',
                                                ],
                                                'dns_records' => [
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => '_amazonses.example.com',
                                                        'value' => 'AB/CD4Hef1+c0D7+wYS2xQ+EBr3HZiXRWDJHrjEWOhs=',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => '_acquiaplatform.example.com',
                                                        'value' => 'aGh54oW35sd5LMGhas1fWrnRrticnsdndf,43=',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'MX',
                                                        'name' => 'mail.example.com',
                                                        'value' => '10 feedback-smtp.us-east-1.amazonses.com',
                                                        'health' => [
                                                            'code' => '202',
                                                            'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                            'summary' => 'Verification pending',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => 'mail.example.com',
                                                        'value' => 'v=spf1 include:amazonses.com ~all',
                                                        'health' => [
                                                            'code' => '202',
                                                            'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                            'summary' => 'Verification pending',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '123e4567-e89b-12d3-a456-426614174000',
                                                'domain_name' => 'example2.com',
                                                'health' => [
                                                    'code' => '404',
                                                    'details' => 'Acquia could not verify the presence of the required DKIM/SPF/TXT DNS record.',
                                                    'summary' => 'Missing DNS record',
                                                ],
                                                'dns_records' => [
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => '_amazonses.example2.com',
                                                        'value' => 'AB/CD4Hef1+c0D7+wYS2xQ+EBr3HZiXRWDJHrjEWOhs=',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => '_acquiaplatform.example2.com',
                                                        'value' => 'aGh54oW35sd5LMGhas1fWrnRrticnsdndf,43=',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'MX',
                                                        'name' => 'mail.example2.com',
                                                        'value' => '10 feedback-smtp.us-east-1.amazonses.com',
                                                        'health' => [
                                                            'code' => '202',
                                                            'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                            'summary' => 'Verification pending',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'TXT',
                                                        'name' => 'mail.example2.com',
                                                        'value' => 'v=spf1 include:amazonses.com ~all',
                                                        'health' => [
                                                            'code' => '202',
                                                            'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                            'summary' => 'Verification pending',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example2.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example2.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                    [
                                                        'type' => 'CNAME',
                                                        'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example2.com',
                                                        'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                                        'health' => [
                                                            'code' => '404',
                                                            'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                            'summary' => 'Missing DNS record',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage domain registrations for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Registers a Domain with this subscription.',
                'description' => 'Registers a Domain with this subscription.',
                'operationId' => 'postSubscriptionDomainRegistration',
                'x-cli-name' => 'subscriptions:post-domain-registration',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'domain' => [
                                        'type' => 'string',
                                        'format' => 'hostname',
                                        'description' => 'The domain name to add.',
                                        'minLength' => 3,
                                        'maxLength' => 253,
                                    ],
                                ],
                            ],
                            'example' => [
                                'domain' => 'example.com',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'domain' => [
                                        'type' => 'string',
                                        'description' => 'The domain name to add.',
                                        'minLength' => 3,
                                        'maxLength' => 253,
                                    ],
                                ],
                            ],
                            'example' => [
                                'domain' => 'example.com',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The domain has been registered.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to manage domain registrations for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No domain or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform Email is not available for this subscription.',
                                        ],
                                    ],
                                    'Domain limit' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The maximum number of domains for Platform Email have been registered.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/domains/{domainRegistrationUuid}' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Returns a speicific Domain registered with this subscription.',
                'description' => 'Returns a speicific Domain registered with this subscription.',
                'operationId' => 'getSubscriptionDomainRegistration',
                'x-cli-name' => 'subscriptions:get-domain-registration',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration',
                                ],
                                'example' => [
                                    'uuid' => '123e4567-e89b-12d3-a456-426614174000',
                                    'domain_name' => 'example.com',
                                    'health' => [
                                        'code' => '404',
                                        'details' => 'Acquia could not verify the presence of the required DKIM/SPF/TXT DNS record.',
                                        'summary' => 'Missing DNS record',
                                    ],
                                    'dns_records' => [
                                        [
                                            'type' => 'TXT',
                                            'name' => '_amazonses.example.com',
                                            'value' => 'AB/CD4Hef1+c0D7+wYS2xQ+EBr3HZiXRWDJHrjEWOhs=',
                                            'health' => [
                                                'code' => '404',
                                                'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                'summary' => 'Missing DNS record',
                                            ],
                                        ],
                                        [
                                            'type' => 'TXT',
                                            'name' => '_acquiaplatform.example.com',
                                            'value' => 'aGh54oW35sd5LMGhas1fWrnRrticnsdndf,43=',
                                            'health' => [
                                                'code' => '404',
                                                'details' => 'Acquia could not verify the presence of the required TXT DNS record',
                                                'summary' => 'Missing DNS record',
                                            ],
                                        ],
                                        [
                                            'type' => 'MX',
                                            'name' => 'mail.example.com',
                                            'value' => '10 feedback-smtp.us-east-1.amazonses.com',
                                            'health' => [
                                                'code' => '202',
                                                'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                'summary' => 'Verification pending',
                                            ],
                                        ],
                                        [
                                            'type' => 'TXT',
                                            'name' => 'mail.example.com',
                                            'value' => 'v=spf1 include:amazonses.com ~all',
                                            'health' => [
                                                'code' => '202',
                                                'details' => 'Acquia is in the process of verifying SPF DNS records.',
                                                'summary' => 'Verification pending',
                                            ],
                                        ],
                                        [
                                            'type' => 'CNAME',
                                            'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                            'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                            'health' => [
                                                'code' => '404',
                                                'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                'summary' => 'Missing DNS record',
                                            ],
                                        ],
                                        [
                                            'type' => 'CNAME',
                                            'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                            'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                            'health' => [
                                                'code' => '404',
                                                'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                'summary' => 'Missing DNS record',
                                            ],
                                        ],
                                        [
                                            'type' => 'CNAME',
                                            'name' => 'abcdefgh1ijkl2mnopq34rstuvwxyz._domainkey.example.com',
                                            'value' => 'abcdefgh1ijkl2mnopq34rstuvwxyz.dkim.amazonses.com',
                                            'health' => [
                                                'code' => '404',
                                                'details' => 'Acquia could not verify the presence of the required DKIM DNS record',
                                                'summary' => 'Missing DNS record',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No domain or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Unregisters a Domain registered with this subscription.',
                'description' => 'Unregisters a Domain registered with this subscription.',
                'operationId' => 'deleteSubscriptionDomainRegistration',
                'x-cli-name' => 'subscriptions:delete-domain-registration',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The domain has been unregistered from the subscription.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove domains from this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No domain or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform Email is not available for this subscription.',
                                        ],
                                    ],
                                    'Domain not registered' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'example.com is not registered with this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/domains/{domainRegistrationUuid}/actions/verify' => [
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Triggers re-verification and update to the domain verification status.',
                'description' => 'Triggers re-verification and update to the domain verification status.',
                'operationId' => 'postSubscriptionVerifyDomainRegistration',
                'x-cli-name' => 'subscriptions:post-verify-domain-registration',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'The domain status is being verified.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000/actions/verify',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/domains/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No domain or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription with UUID 123e4567-e89b-12d3-a456-426614174000 does not exist.',
                                        ],
                                    ],
                                    'No domain or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The domain registration you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No entitlement' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'Platform Email is not available for this subscription.',
                                        ],
                                    ],
                                    'Verification already pending' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'This domain cannot be reverified at this time.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/entitlements' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Provides a list of entitlements that are a part of the subscription.',
                'description' => 'Provides a list of entitlements that are a part of the subscription.',
                'operationId' => 'getSubscriptionEntitlements',
                'x-cli-name' => 'subscriptions:entitlements-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlements',
                                ],
                                'example' => [
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'name' => 'cde',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [
                                                    'databases_total' => 3,
                                                    'total' => 10,
                                                    'used' => 1,
                                                ],
                                            ],
                                            [
                                                'name' => 'pipelines',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [],
                                            ],
                                            [
                                                'name' => 'newrelic',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [
                                                    'id' => '03816870a4724c900292bc9f0955a315',
                                                    'level' => 'pro',
                                                ],
                                            ],
                                            [
                                                'name' => 'log-forwarding',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [],
                                            ],
                                            [
                                                'name' => 'shield',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [],
                                            ],
                                            [
                                                'name' => 'consumption-based-pricing',
                                                'offering_ids' => [
                                                    'b2a188df-00b7-47bf-a664-66835cde53b0',
                                                ],
                                                'expires_at' => '2023-05-16T11:15:05.000Z',
                                                'flags' => [
                                                    'trial' => true,
                                                ],
                                                'properties' => [
                                                    'visits' => 10000000,
                                                    'views' => 500000000,
                                                ],
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a/entitlements',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/8533debb-ae4e-427b-aa34-731719b4201a',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/ides' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Returns a list of Cloud IDEs associated with this subscription.',
                'description' => 'Returns a list of Cloud IDEs associated with this subscription.',
                'operationId' => 'getSubscriptionIdes',
                'x-cli-name' => 'subscriptions:ide-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ides',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/5d278c52-4876-4c70-a666-d671f77a602d/ides',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/5d278c52-4876-4c70-a666-d671f77a602d',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                'label' => 'IDE Label 1',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/9a83c081-ef78-4dbd-8852-11cc3eb248f7',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://9a83c081-ef78-4dbd-8852-11cc3eb248f7.ides.acquia.com',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'owner' => [
                                                        'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                        'first_name' => 'First',
                                                        'last_name' => 'Last',
                                                        'last_login_at' => '2019-01-31T15:53:11.000Z',
                                                        'created_at' => '2016-08-14T21:38:59.000Z',
                                                        'email' => 'user.name@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                        'username' => 'user.name',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                'label' => 'IDE Label 2',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/ides/feea197a-9503-4441-9f49-b4d420b0ecf8',
                                                    ],
                                                    'web' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.web.ahdev.cloud',
                                                    ],
                                                    'ide' => [
                                                        'href' => 'https://feea197a-9503-4441-9f49-b4d420b0ecf8.ides.acquia.com',
                                                    ],
                                                    'application' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/461fe350-7988-42b3-a73e-cffcdbb94199',
                                                    ],
                                                ],
                                                '_embedded' => [
                                                    'owner' => [
                                                        'uuid' => '10be1d3e-f2b4-4d34-855d-321df3938ffd',
                                                        'first_name' => 'First',
                                                        'last_name' => 'Last',
                                                        'last_login_at' => '2019-01-31T15:53:11.000Z',
                                                        'created_at' => '2016-08-14T21:38:59.000Z',
                                                        'email' => 'user.name@example.com',
                                                        'picture_url' => 'https://accounts.acquia.com/path/to/image.png',
                                                        'username' => 'user.name',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves traversal links for a subscription\'s usage data.',
                'description' => 'Retrieves traversal links for a subscription\'s usage data.',
                'operationId' => 'getSubscriptionsUsageLinks',
                'x-cli-name' => 'subscriptions:usage-links',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_usage',
                                ],
                                'example' => [
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics',
                                        ],
                                        'data' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data',
                                        ],
                                        'data-by-application' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data-by-application',
                                        ],
                                        'views' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views',
                                        ],
                                        'views-by-application' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views-by-application',
                                        ],
                                        'visits' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits',
                                        ],
                                        'visits-by-application' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits-by-application',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Subscription not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage/data' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves aggregate usage data for a subscription.',
                'description' => 'Filterable fields:'."\n"
                    .'* `metric` - One of: {`views`, `visits`}'."\n"
                    .'* `application`'."\n"
                    .'* `from`'."\n"
                    .'* `to`'."\n",
                'operationId' => 'getSubscriptionsUsageData',
                'x-cli-name' => 'subscriptions:usage-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this subscription.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage/data-by-application' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves usage data for a subscription, broken down by application.',
                'description' => 'Filterable fields:'."\n"
                    .'* `metric` - One of: {`views`, `visits`}'."\n"
                    .'* `application`'."\n",
                'operationId' => 'getSubscriptionsUsageDataByApplication',
                'x-cli-name' => 'subscriptions:usage-data-by-application',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data-by-application',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data-by-application{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data-by-application{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/data-by-application{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage/{usageMetric}' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves aggregate usage metric data for a subscription.',
                'description' => 'Filterable fields:'."\n"
                    .'* `application`'."\n",
                'operationId' => 'getSubscriptionsUsageMetricData',
                'x-cli-name' => 'subscriptions:usage-metric-data',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_usage-metric',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metric',
                                ],
                                'example' => [
                                    'metric' => 'views',
                                    'datapoints' => [
                                        [
                                            '2019-03-13T00:00:00.000Z',
                                            '9',
                                        ],
                                        [
                                            '2019-03-14T00:00:00.000Z',
                                            '1',
                                        ],
                                    ],
                                    'last_data_at' => '2019-03-14T00:00:00.000Z',
                                    'metadata' => [
                                        'subscription' => [
                                            'uuids' => [
                                                '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                            ],
                                        ],
                                        'application' => [
                                            'uuids' => [
                                                '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                            ],
                                        ],
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage/views-by-application' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves views data for a subscription, broken down by application.',
                'description' => 'Filterable fields:'."\n"
                    .'* `application`'."\n",
                'operationId' => 'getSubscriptionsUsageViewsDataByApplication',
                'x-cli-name' => 'subscriptions:usage-views-data-by-application',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views-by-application',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views-by-application{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views-by-application{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/views-by-application{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'views',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '9',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/views',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/metrics/usage/visits-by-application' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Retrieves visits data for a subscription, broken down by application.',
                'description' => 'Filterable fields:'."\n"
                    .'* `application`'."\n",
                'operationId' => 'getSubscriptionsUsageVisitsDataByApplication',
                'x-cli-name' => 'subscriptions:usage-visits-data-by-application',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metrics',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 2,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits-by-application',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage',
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits-by-application{?limit}',
                                            'templated' => true,
                                        ],
                                        'offset' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits-by-application{?offset}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/9567a611-4cdd-4586-8b3f-f3980a87e471/metrics/usage/visits-by-application{?filter}',
                                            'templated' => true,
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'metric' => 'visits',
                                                'datapoints' => [
                                                    [
                                                        '2019-03-13T00:00:00.000Z',
                                                        '3',
                                                    ],
                                                    [
                                                        '2019-03-14T00:00:00.000Z',
                                                        '1',
                                                    ],
                                                ],
                                                'last_data_at' => '2019-03-14T00:00:00.000Z',
                                                'metadata' => [
                                                    'subscription' => [
                                                        'uuids' => [
                                                            '9567a611-4cdd-4586-8b3f-f3980a87e471',
                                                        ],
                                                    ],
                                                    'application' => [
                                                        'uuids' => [
                                                            '1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                    'environment' => [
                                                        'ids' => [
                                                            '123-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '124-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                            '125-1df8bff7-ffda-4571-b64a-f90f60f4dbf8',
                                                        ],
                                                    ],
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage/visits',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/1df8bff7-ffda-4571-b64a-f90f60f4dbf8/metrics/usage',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view usage metrics for this application.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/shield-acl' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Provides a list of Shield ACL rules.',
                'description' => 'Provides a list of Shield ACL rules.',
                'operationId' => 'getShieldAcl',
                'x-cli-name' => 'subscriptions:shield-acl-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_shield-acl-collection',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/abcd1234-58cc-4372-a567-0e02b2c3d470/shield-acl',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/abcd1234-58cc-4372-a567-0e02b2c3d470',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'd5afa695-92a0-401b-b973-1f09992d6ba2',
                                                'subscription' => [
                                                    'uuid' => '720d4df4-7469-47f2-9e42-a6a5152761bf',
                                                    'name' => 'Example Subscription',
                                                ],
                                                'description' => 'My rule 1',
                                                'service' => 'ssh',
                                                'addresses' => [
                                                    '127.0.0.82/32',
                                                    '127.0.0.83/32',
                                                ],
                                                'action' => 'allow',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl/d5afa695-92a0-401b-b973-1f09992d6ba2',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => 'd5afa695-92a0-401b-b973-1f09992d6ba3',
                                                'subscription' => [
                                                    'uuid' => '720d4df4-7469-47f2-9e42-a6a5152761bf',
                                                    'name' => 'Example Subscription',
                                                ],
                                                'description' => 'My rule 2',
                                                'service' => 'ssh',
                                                'addresses' => [
                                                    '192.168.2.2/24',
                                                ],
                                                'action' => 'allow',
                                                'status' => 'active',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl/d5afa695-92a0-401b-b973-1f09992d6ba3',
                                                    ],
                                                    'parent' => [
                                                        'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'You do not have permission to view the Shield ACL rules for subscription d17b25bb-28dd-4a24-8f89-bfe8b1e151e9.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Creates a Shield ACL rule.',
                'description' => 'Creates a Shield ACL rule.',
                'operationId' => 'postShieldAcl',
                'x-cli-name' => 'subscriptions:shield-acl-create',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'description' => [
                                        'type' => 'string',
                                        'description' => 'The description of the new Shield ACL rule.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'addresses' => [
                                        'type' => 'array',
                                        'description' => 'A list of IP addresses and/or CIDRs for this Shield ACL rule.',
                                        'items' => [
                                            'type' => 'string',
                                            'description' => 'An IP address and/or CIDRs for this Shield ACL rule.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Shield ACL rule for subscription has been created.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019/shield-acl/bf8b6858-1e36-4b8e-bb05-35bdd986f5d2',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019/shield-acl',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/fbd0581d-7606-43d0-9d2e-4d9fa6570a0d',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Acquia Shield not available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Shield rules can only be added to subscriptions that have Acquia Shield.',
                                            ],
                                        ],
                                    ],
                                    'Maximum Shield ACL rules' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'You have already used the maximum number of Shield rules for this subscription.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'You do not have permission to create a new Shield ACL rule.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Shield ACL updates in progress' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => [
                                                'general' => 'Shield ACL rules cannot be created while ACL rule updates are in progress.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/shield-acl/{shieldAclUuid}' => [
            'get' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Returns the specified Shield ACL rule.',
                'description' => 'Returns the specified Shield access control list (ACL) rule for a subscription.',
                'operationId' => 'getShieldAclRuleByUuid',
                'x-cli-name' => 'subscriptions:shield-acl-find',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_shield-acl-uuid',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_shield-acl',
                                ],
                                'example' => [
                                    'uuid' => 'd5afa695-92a0-401b-b973-1f09992d6ba2',
                                    'subscription' => [
                                        'uuid' => '720d4df4-7469-47f2-9e42-a6a5152761bf',
                                        'name' => 'Example Subscription',
                                    ],
                                    'description' => 'My rule 1',
                                    'service' => 'ssh',
                                    'addresses' => [
                                        '127.0.0.82/32',
                                        '127.0.0.83/32',
                                    ],
                                    'action' => 'allow',
                                    'status' => 'active',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl/d5afa695-92a0-401b-b973-1f09992d6ba2',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view the Shield ACL rules for subscription 720d4df4-7469-47f2-9e42-a6a5152761bf',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No Shield Acl' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The Shield ACL rule you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No subscription' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Updates a Shield ACL rule.',
                'description' => 'Updates a Shield ACL rule.',
                'operationId' => 'putShieldAcl',
                'x-cli-name' => 'subscriptions:shield-acl-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_shield-acl-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'description' => [
                                        'type' => 'string',
                                        'description' => 'The description of the new Shield ACL rule.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                    'addresses' => [
                                        'type' => 'array',
                                        'description' => 'A list of IP addresses and/or CIDRs for this Shield ACL rule.',
                                        'items' => [
                                            'type' => 'string',
                                            'description' => 'An IP address and/or CIDRs for this Shield ACL rule.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Updated ACL rule for subscription.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019/shield-acl/b23588f8-dbfa-4fb8-92a1-60e0dd08eee9',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019/shield-acl',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/87ae4d57-24d6-4b4b-8552-d9658b4e2dea',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to edit a Shield ACL rule.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Validation failed' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The Shield ACL rule is not active.',
                                        ],
                                    ],
                                    'Same values' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The Shield ACL rule already contains the same values.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Deletes a Shield ACL rule.',
                'description' => 'Deletes a Shield ACL rule.',
                'operationId' => 'deleteShieldAcl',
                'x-cli-name' => 'subscriptions:shield-acl-delete',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_shield-acl-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Deleted ACL rule (UUID: 93136254-7d65-465c-82e9-5e92d74ae6b4) for subscription (UUID: 720d4df4-7469-47f2-9e42-a6a5152761bf).',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl/93136254-7d65-465c-82e9-5e92d74ae6b4',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/720d4df4-7469-47f2-9e42-a6a5152761bf/shield-acl',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/98c1c68d-d33d-4340-8cd2-f32bdbf035f3',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Acquia Shield not available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Shield rules can only be deleted from subscriptions that have Acquia Shield.',
                                            ],
                                        ],
                                    ],
                                    'Shield ACL rule not associated' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'The Shield ACL Rule with UUID 638c13e7-0455-45de-ab63-def9d348d50f does not belong to the subscription with UUID e3959c8a-f53d-49a1-adb7-acdc8e717940.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'unauthorized',
                                            'message' => 'You do not have permission to delete a Shield ACL rule.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No subscription' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription with UUID 720d4df4-7469-47f2-9e42-a6a5152761bf does not exist.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Shield ACL updates in progress' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => [
                                                'general' => 'Shield ACL rules cannot be deleted while ACL rule updates are in progress.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionUuid}/shield-acl/actions/reset' => [
            'post' => [
                'tags' => [
                    'Subscriptions',
                ],
                'summary' => 'Resets Shield ACL rules to default settings.',
                'description' => 'Resets the Shield ACL rules for a subscription to the default settings. This action is irreversible and will remove all custom rules.'."\n"
                    ."\n"
                    .'This operation can only be performed on subscriptions that have Acquia Shield enabled. If there are ongoing updates to the Shield ACL rules, this operation will fail with a conflict error.'."\n",
                'operationId' => 'postResetShieldAcl',
                'x-cli-name' => 'subscriptions:shield-acl-reset',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
                                ],
                                'example' => [
                                    'message' => 'Shield ACL rules reset for subscription with UUID 94afc849-3b5a-49cd-bcae-464333994019.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019/shield-acl',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/subscriptions/94afc849-3b5a-49cd-bcae-464333994019',
                                        ],
                                        'notification' => [
                                            'href' => 'https://cloud.acquia.com/api/notifications/a894467e-8ea2-4b0d-9b03-27909098ee3a',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Acquia Shield not available' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'general' => 'Shield rules can only be reset on subscriptions that have Acquia Shield.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to reset Shield ACL rules.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No subscription or permission' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The subscription you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'No subscription' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'A subscription with UUID 720d4df4-7469-47f2-9e42-a6a5152761bf cannot be found.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Shield ACL updates in progress' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => [
                                                'general' => 'Shield ACL rules cannot be reset while ACL rule updates are in progress.',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Return teams the current user has access to.',
                'description' => 'Returns a list of teams the current user has access to.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getTeams',
                'x-cli-name' => 'tps:teams-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_teams',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/teams',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => 'abcd1234-82b5-11e3-9170-12313920a02c',
                                                'name' => 'Team Name 1',
                                                'created_at' => '2013-10-28T14:16:07-0700',
                                                'updated_at' => '2015-02-19T08:53:10-0800',
                                                'organization' => [
                                                    'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '1234abcd-82b5-11e3-9170-12313920a02c',
                                                'name' => 'Team Name 2',
                                                'created_at' => '2014-05-27T11:55:39-0700',
                                                'updated_at' => '2015-01-30T05:49:16-0800',
                                                'organization' => [
                                                    'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                                    'name' => 'Sample Organization',
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/9ca6ecc0-e5d0-11e3-9eb3-22000b04072f',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view teams.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Return details about a specific team.',
                'description' => 'Return details about a specific team.',
                'operationId' => 'getTeam',
                'x-cli-name' => 'tps:team-find',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team',
                                ],
                                'example' => [
                                    'uuid' => '2c9ea556-4016-11e3-9170-12313920a02c',
                                    'name' => 'Sample Team',
                                    'created_at' => '2013-10-28T14:16:07-0700',
                                    'updated_at' => '2015-02-19T08:53:10-0800',
                                    'organization' => [
                                        'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                        'name' => 'Sample Organization',
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c',
                                        ],
                                        'members' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c/members',
                                        ],
                                        'applications' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c/applications',
                                        ],
                                        'invites' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/2c9ea556-4016-11e3-9170-12313920a02c/invites',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/teams',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'organization' => [
                                            [
                                                'uuid' => '2375e327-3fff-11e3-9170-12313920a02c',
                                                'name' => 'Sample Organization',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/organizations/2375e327-3fff-11e3-9170-12313920a02c',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'put' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Change the name of a team.',
                'description' => 'Change the name of a team.',
                'operationId' => 'putTeamsName',
                'x-cli-name' => 'tps:team-update',
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the team.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new team name',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The new name of the team.',
                                        'minLength' => 1,
                                        'maxLength' => 255,
                                    ],
                                ],
                            ],
                            'example' => [
                                'name' => 'My new team name',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Team renamed' => [
                                        'value' => [
                                            'message' => 'Team renamed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to rename it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Deletes a specific team by its UUID.',
                'description' => 'Deletes a specific team by its UUID.',
                'operationId' => 'deleteTeam',
                'x-cli-name' => 'tps:team-delete',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Removed team' => [
                                        'value' => [
                                            'message' => 'Removed team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Team not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to remove it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/actions/leave' => [
            'post' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Removes the current user from a team.',
                'description' => 'Removes the current user from a team.',
                'operationId' => 'postLeaveTeam',
                'x-cli-name' => 'tps:user-leave',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Left team' => [
                                        'value' => [
                                            'message' => 'You have left the team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Invalid team' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Invalid team supplied. No action performed.',
                                        ],
                                    ],
                                    'Invalid user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Invalid user supplied. No action performed.',
                                        ],
                                    ],
                                    'User not on team' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user is not a member of this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/applications' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Returns a list of applications this team has access to.',
                'description' => 'Returns a list of applications this team has access to.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `name`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `name`'."\n",
                'operationId' => 'getTeamApplications',
                'x-cli-name' => 'tps:team-application-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-applications',
                                ],
                                'example' => [
                                    'total' => 2,
                                    'pagination' => [
                                        'total' => 2,
                                        'limit' => 10,
                                        'offset' => 0,
                                    ],
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/f6c5006c-f670-4778-9ae5-49018475ece5/applications',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/f6c5006c-f670-4778-9ae5-49018475ece5/applications{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/f6c5006c-f670-4778-9ae5-49018475ece5/applications{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/f6c5006c-f670-4778-9ae5-49018475ece5/applications{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/f6c5006c-f670-4778-9ae5-49018475ece5',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'id' => 241643,
                                                'uuid' => '50cf9819-6f99-4ef2-be10-1a85dc354ca1',
                                                'name' => 'Sample application 1',
                                                'hosting' => [
                                                    'type' => 'acp',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'fc04cc3e-8d91-4fb4-a8dd-15dc81df7458',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '434aac3d-bb5f-44d1-bea4-398addbf5a04',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => true,
                                                ],
                                                'status' => 'normal',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/applications/50cf9819-6f99-4ef2-be10-1a85dc354ca1',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'id' => 954291,
                                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d471',
                                                'name' => 'Sample application 2',
                                                'hosting' => [
                                                    'type' => 'free',
                                                    'id' => 'devcloud:devcloud2',
                                                ],
                                                'subscription' => [
                                                    'uuid' => 'fc04cc3e-8d91-4fb4-a8dd-15dc81df7458',
                                                    'name' => 'Sample subscription',
                                                ],
                                                'organization' => [
                                                    'uuid' => '434aac3d-bb5f-44d1-bea4-398addbf5a04',
                                                    'name' => 'Sample organization',
                                                ],
                                                'flags' => [
                                                    'remote_admin' => false,
                                                ],
                                                'status' => 'provisioning',
                                                'type' => 'drupal',
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/teams/a47ac10b-58cc-4372-a567-0e02b2c3d471/applications',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Adds an application to this team.',
                'description' => 'Adds an application to this team.',
                'operationId' => 'postTeamAddApplication',
                'x-cli-name' => 'tps:team-application-add',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'uuid',
                                ],
                                'properties' => [
                                    'uuid' => [
                                        'type' => 'string',
                                        'description' => 'The uuid of the application to add to this team.',
                                        'format' => 'uuid',
                                        'minLength' => 36,
                                        'maxLength' => 36,
                                    ],
                                ],
                            ],
                            'example' => [
                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'uuid',
                                ],
                                'properties' => [
                                    'uuid' => [
                                        'type' => 'string',
                                        'description' => 'The uuid of the application to add to this team.',
                                        'format' => 'uuid',
                                        'minLength' => 36,
                                        'maxLength' => 36,
                                    ],
                                ],
                            ],
                            'example' => [
                                'uuid' => 'a47ac10b-58cc-4372-a567-0e02b2c3d470',
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Added application' => [
                                        'value' => [
                                            'message' => 'Added application to team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Application mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application must belong to the same organization as this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Application already on team' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The application is already on this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/applications/{applicationUuid}' => [
            'delete' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Removes the application from this team.',
                'description' => 'Removes the application from this team. Team members will immediately lose access to this application.',
                'operationId' => 'deleteTeamsRemoveApplication',
                'x-cli-name' => 'tps:team-application-remove',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Removed application' => [
                                        'value' => [
                                            'message' => 'Removed application from team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'The application you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Team not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Application mismatch' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The application is not associated with this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/invites' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Returns a list of invitations to this team.',
                'description' => 'Returns a list of invitations to this team.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `mail`'."\n"
                    .'* `token`'."\n"
                    .'* `author`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `mail`'."\n"
                    .'* `token`'."\n"
                    .'* `author`'."\n",
                'operationId' => 'getTeamInvites',
                'x-cli-name' => 'tps:team-invite-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-invites',
                                ],
                                'example' => [
                                    'total' => 2,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/06adb604-d918-49f0-8ad6-06f037a4c625/invites',
                                        ],
                                        'sort' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/06adb604-d918-49f0-8ad6-06f037a4c625/invites{?sort}',
                                            'templated' => true,
                                        ],
                                        'filter' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/06adb604-d918-49f0-8ad6-06f037a4c625/invites{?filter}',
                                            'templated' => true,
                                        ],
                                        'limit' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/06adb604-d918-49f0-8ad6-06f037a4c625/invites{?limit}',
                                            'templated' => true,
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/06adb604-d918-49f0-8ad6-06f037a4c625',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'applications' => [
                                                    [
                                                        'uuid' => '88dc87db-1169-4908-9384-2328a7bd5cc1',
                                                        'name' => 'Main Application',
                                                    ],
                                                ],
                                                'author' => [
                                                    'uuid' => 'ff4d12d9-1aba-472a-b0d1-ba19342922fa',
                                                    'username' => 'jane.doe',
                                                    'first_name' => 'Jane',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'jane.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=jane.doe@example.com',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'aba649d1-795e-4472-87c8-7b32536c71b3',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                    [
                                                        'uuid' => 'a70a0192-c962-421a-b534-393c245ba142',
                                                        'name' => 'Team Lead',
                                                    ],
                                                ],
                                                'organization' => [
                                                    'uuid' => '3f3fc2da-bb2b-473c-aa5c-8b9d8fa6c7b8',
                                                    'name' => 'Organization Name',
                                                ],
                                                'team' => [
                                                    'uuid' => '9ab05712-29b7-4171-8168-2ed085ea32b2',
                                                    'name' => 'Team Name',
                                                ],
                                                'uuid' => 'f4347e76-bcd7-41f6-91aa-ac6691755f0c',
                                                'email' => 'invitee@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ec',
                                                'flags' => [
                                                    'declined' => true,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ec',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'applications' => [
                                                    [
                                                        'uuid' => '88dc87db-1169-4908-9384-2328a7bd5cc1',
                                                        'name' => 'Main Application',
                                                    ],
                                                    [
                                                        'uuid' => 'a2345672-58cc-4372-a567-0e02b2c3d470',
                                                        'name' => 'Secondary Application',
                                                    ],
                                                ],
                                                'author' => [
                                                    'uuid' => '80363753-76dc-486c-b942-57ff9fc131ee',
                                                    'username' => 'john.doe',
                                                    'first_name' => 'John',
                                                    'last_name' => 'Doe',
                                                    'mail' => 'john.doe@example.com',
                                                    'picture_url' => 'https://accounts.acquia.com/sites/default/files/avatars/123abc?mail=john.doe@example.com',
                                                ],
                                                'roles' => [
                                                    [
                                                        'uuid' => 'aba649d1-795e-4472-87c8-7b32536c71b3',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                ],
                                                'organization' => [
                                                    'uuid' => '3f3fc2da-bb2b-473c-aa5c-8b9d8fa6c7b8',
                                                    'name' => 'Organization Name',
                                                ],
                                                'team' => [
                                                    'uuid' => '9ab05712-29b7-4171-8168-2ed085ea32b2',
                                                    'name' => 'Team Name',
                                                ],
                                                'uuid' => '6bf96944-bb9b-4629-b593-d658e44d8054',
                                                'email' => 'invitee2@example.com',
                                                'created_at' => '2012-05-15T12:00:00.000Z',
                                                'token' => 'dd9ea69fdcb6bee08b31a858b85535ed',
                                                'flags' => [
                                                    'declined' => false,
                                                ],
                                                '_links' => [
                                                    'self' => [
                                                        'href' => 'https://cloud.acquia.com/api/invites/dd9ea69fdcb6bee08b31a858b85535ed',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to view invites for this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'post' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Invites a user to join a team.',
                'description' => 'Invites a user to join a team.',
                'operationId' => 'postTeamsInviteUser',
                'x-cli-name' => 'tps:team-user-invite',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-invite',
                            ],
                            'example' => [
                                'email' => 'person@example.com',
                                'roles' => [
                                    '489efe35-7bb7-48b7-9aa2-f6f8f457c926',
                                    '8025e9a7-781a-4ad1-b7ea-1f1b732944c2',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-invite',
                            ],
                            'example' => [
                                'email' => 'person@example.com',
                                'roles' => [
                                    '489efe35-7bb7-48b7-9aa2-f6f8f457c926',
                                    '8025e9a7-781a-4ad1-b7ea-1f1b732944c2',
                                ],
                            ],
                        ],
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Invited' => [
                                        'value' => [
                                            'message' => 'Invited team member.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Created',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite',
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad Request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
                                ],
                                'examples' => [
                                    'Missing parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Missing required parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                    'Invalid parameter' => [
                                        'value' => [
                                            'error' => 'validation_failed',
                                            'message' => [
                                                'name' => 'Invalid values for parameter(s): example_param',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Insufficient permissions' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to invite users to this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Team not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to modify does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                    'Role not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'One or more of the chosen roles do not belong to this organization.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    409 => [
                        'description' => 'Conflict',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Invitation already sent' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'An invitation to person@example.com has already been sent. It was sent on May 6, 2016 - 7:26pm.',
                                        ],
                                    ],
                                    'User already on team' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'The user you are trying to invite already belongs to the team.',
                                        ],
                                    ],
                                    'Must have at least one role' => [
                                        'value' => [
                                            'error' => 'conflict',
                                            'message' => 'A team member must be invited with at least one role.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/members' => [
            'get' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Returns a list of team members.',
                'description' => 'Returns a list of team members.'."\n"
                    ."\n"
                    .'Filterable fields:'."\n"
                    .'* `permission`'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n"
                    .'* `user`'."\n"
                    ."\n"
                    .'Sortable fields:'."\n"
                    .'* `permission`'."\n"
                    .'* `first_name`'."\n"
                    .'* `last_name`'."\n",
                'operationId' => 'getTeamMembers',
                'x-cli-name' => 'tps:team-member-list',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-members',
                                ],
                                'example' => [
                                    'total' => 3,
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/3c9ea553-3216-11e3-9170-12313920a23a/members',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/teams/3c9ea553-3216-11e3-9170-12313920a23a',
                                        ],
                                    ],
                                    '_embedded' => [
                                        'items' => [
                                            [
                                                'uuid' => '5aa902c5-f1c1-6c94-edfa-86bc58d0dce3',
                                                'first_name' => 'James',
                                                'last_name' => 'Kirk',
                                                'last_login_at' => '2017-03-28T13:07:54-0500',
                                                'mail' => 'james.kirk@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/5aa902c5-f1c1-6c94-edfa-86bc58d0dce3/style/avatar',
                                                'username' => 'james.kirk',
                                                'roles' => [
                                                    [
                                                        'uuid' => '2d988ad3-4016-11e3-9170-12313920a02e',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '30dacb5e-4122-11e1-9eb5-12313928d3c2',
                                                'first_name' => 'Christopher',
                                                'last_name' => 'Pike',
                                                'last_login_at' => '2016-03-28T13:07:54-0500',
                                                'mail' => 'chris.pike@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/30dacb5e-4122-11e1-9eb5-12313928d3c2/style/avatar',
                                                'username' => 'chris.pike',
                                                'roles' => [
                                                    [
                                                        'uuid' => '3c9a1174-4016-11e3-9170-12313920a02d',
                                                        'name' => 'Developer',
                                                    ],
                                                ],
                                            ],
                                            [
                                                'uuid' => '3bcddc3a-52ba-4cce-aaa3-9adf721c1b52',
                                                'first_name' => 'Jonathan',
                                                'last_name' => 'Archer',
                                                'last_login_at' => null,
                                                'mail' => 'jonathan.archer@example.com',
                                                'picture_url' => 'https://accounts.acquia.com/images/users/3bcddc3a-52ba-4cce-aaa3-9adf721c1b52/style/avatar',
                                                'username' => 'jonathan.archer',
                                                'roles' => [
                                                    [
                                                        'uuid' => '2d988ad3-4016-11e3-9170-12313920a02e',
                                                        'name' => 'Senior Developer',
                                                    ],
                                                    [
                                                        'uuid' => '3c9a1174-4016-11e3-9170-12313920a02d',
                                                        'name' => 'Developer',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/teams/{teamUuid}/members/{userUuid}' => [
            'put' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Grant team roles to a member.',
                'description' => 'Grant team roles to a member.',
                'operationId' => 'putTeamsMember',
                'x-cli-name' => 'tps:team-member-add',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'roles',
                                ],
                                'properties' => [
                                    'roles' => [
                                        'type' => 'array',
                                        'description' => 'The role UUIDs to grant to the user.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'minLength' => 36,
                                            'maxLength' => 36,
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'roles' => [
                                    '489efe35-7bb7-48b7-9aa2-f6f8f457c926',
                                    '8025e9a7-781a-4ad1-b7ea-1f1b732944c2',
                                ],
                            ],
                        ],
                        'application/x-www-form-urlencoded' => [
                            'schema' => [
                                'type' => 'object',
                                'required' => [
                                    'roles',
                                ],
                                'properties' => [
                                    'roles' => [
                                        'type' => 'array',
                                        'description' => 'The role UUIDs to grant to the user.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'minLength' => 36,
                                            'maxLength' => 36,
                                        ],
                                    ],
                                ],
                            ],
                            'example' => [
                                'roles' => [
                                    '489efe35-7bb7-48b7-9aa2-f6f8f457c926',
                                    '8025e9a7-781a-4ad1-b7ea-1f1b732944c2',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Modified member roles' => [
                                        'value' => [
                                            'message' => 'Modified member roles.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to modify team member roles.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'delete' => [
                'tags' => [
                    'Teams and Permissions',
                ],
                'summary' => 'Remove a user from a team.',
                'description' => 'Remove a user from a team.',
                'operationId' => 'deleteTeamsRemoveMember',
                'x-cli-name' => 'tps:team-member-remove',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
                    ],
                    [
                        '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
                    ],
                ],
                'security' => [
                    [
                        'Acquia_Cloud_API_Documentation_OAuth2' => [],
                    ],
                ],
                'responses' => [
                    200 => [
                        'description' => 'OK',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
                                ],
                                'examples' => [
                                    'Team member removed' => [
                                        'value' => [
                                            'message' => 'Team member removed.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'No permission' => [
                                        'value' => [
                                            'error' => 'forbidden',
                                            'message' => 'You do not have permission to remove team members.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Not Found',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
                                ],
                                'examples' => [
                                    'Not found' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The team member you are trying to remove does not exist, or you do not have permission to remove them.',
                                        ],
                                    ],
                                    'Invalid team' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Invalid team supplied. No action performed.',
                                        ],
                                    ],
                                    'Invalid user' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'Invalid user supplied. No action performed.',
                                        ],
                                    ],
                                    'User not team member' => [
                                        'value' => [
                                            'error' => 'not_found',
                                            'message' => 'The user is not a member of this team.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/bulk-code-switch' => [
            'get' => [
                'operationId' => 'api_codebases_codebaseIdbulk-code-switch_get_collection',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Retrieves a list of bulk code switches details performed on a codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 0,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'parent' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch/1e6d0ff7-aec7-4ba8-8f67-d0bcdc945705',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => '1e6d0ff7-aec7-4ba8-8f67-d0bcdc945705',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => '0975a7a1-746f-4096-9c22-383f001797b5',
                                                            ],
                                                            'reference' => [
                                                                'type' => 'string',
                                                                'example' => 'v.1.1.1',
                                                            ],
                                                            'created_at' => [
                                                                'type' => 'string',
                                                                'format' => 'date-time',
                                                                'example' => '2024-12-20T06:39:57.000Z',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch?limit=25&offset=0',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch?offset=0{&limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch?limit=25{&offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch?limit=25&offset=0{&filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of bulk code switches details performed on a codebase.',
                'description' => 'Retrieves a list of bulk code switches details performed on a codebase.',
                'x-cli-name' => 'codebases:bulk-code-switch:list',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => '',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
            'post' => [
                'operationId' => 'create_bulk_code_switch_resource',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    202 => [
                        'description' => 'Created a new Bulk Code Switch on a codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'get' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch/867c8d79-9751-4169-8799-18c8d211aec4',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch',
                                                        ],
                                                    ],
                                                ],
                                                'status' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch/867c8d79-9751-4169-8799-18c8d211aec4/status',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Bulk code switch started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Provide at least one valid target for bulk code switch.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Starts a new Bulk Code Switch for a codebase.',
                'description' => 'Starts a new Bulk Code Switch for a codebase.',
                'x-cli-name' => 'codebases:bulk-code-switch:start',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The new BulkCodeSwitch resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'reference' => [
                                        'type' => 'string',
                                        'example' => 'test-branch-ref',
                                    ],
                                    'targets' => [
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'environment_id' => [
                                                    'type' => 'string',
                                                    'format' => 'string',
                                                    'example' => '2345-a0c9dff7-56b6-4c0d-bad0-0e6593f66cd4',
                                                ],
                                                'cloud_actions' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'string',
                                                        'example' => 'some-cloud-action',
                                                    ],
                                                ],
                                            ],
                                            'required' => [
                                                'environment_id',
                                            ],
                                        ],
                                        'minItems' => 1,
                                    ],
                                    'cloud_actions' => [
                                        'type' => 'array',
                                        'items' => [
                                            'type' => 'string',
                                            'example' => 'some-cloud-action',
                                        ],
                                    ],
                                ],
                                'required' => [
                                    'reference',
                                    'targets',
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/bulk-code-switch/{bulkCodeSwitchId}' => [
            'get' => [
                'operationId' => 'get_bulk_code_switch_resource',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Bulk code switch details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'status' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch/1e6d0ff7-aec7-4ba8-8f67-d0bcdc945705/status',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/bulk-code-switch/1e6d0ff7-aec7-4ba8-8f67-d0bcdc945705',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '1e6d0ff7-aec7-4ba8-8f67-d0bcdc945705',
                                        ],
                                        'codebase_id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '0975a7a1-746f-4096-9c22-383f001797b5',
                                        ],
                                        'reference' => [
                                            'type' => 'string',
                                            'example' => 'v.1.1.1',
                                        ],
                                        'created_at' => [
                                            'type' => 'string',
                                            'format' => 'date-time',
                                            'example' => '2024-12-20T06:39:57.000Z',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Bulk Code Switch resource not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The Bulk Code Switch details you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves bulk code switch details by id.',
                'description' => 'Retrieves bulk code switch details by id.',
                'x-cli-name' => 'codebases:bulk-code-switch:get',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'bulkCodeSwitchId',
                        'in' => 'path',
                        'description' => 'The entity\'s universally unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/applications/{applicationId}/codebase' => [
            'get' => [
                'operationId' => 'api_applications_applicationIdcodebase_get',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Codebase details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'applications' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-041c-44c7-a486-7972ed2cafc8/applications',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-041c-44c7-a486-7972ed2cafc8',
                                                        ],
                                                    ],
                                                ],
                                                'subscription' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'subscription' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        '_links' => [
                                                            'type' => 'object',
                                                            'properties' => [
                                                                'self' => [
                                                                    'type' => 'object',
                                                                    'properties' => [
                                                                        'href' => [
                                                                            'type' => 'string',
                                                                            'format' => 'uri',
                                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                        'id' => [
                                                            'type' => 'string',
                                                            'format' => 'uuid',
                                                            'example' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '11111111-041c-44c7-a486-7972ed2cafc8',
                                        ],
                                        'label' => [
                                            'type' => 'string',
                                            'example' => 'Test codebase with attached applications',
                                        ],
                                        'region' => [
                                            'type' => 'string',
                                            'example' => 'us-east-1',
                                        ],
                                        'vcs_url' => [
                                            'type' => 'string',
                                            'format' => 'uri',
                                            'example' => 'ssh://us-east-1.dev.vcs.acquia.io/11111111-041c-44c7-a486-7972ed2cafc8',
                                        ],
                                        'repository_id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => 'f03e15f9-0d97-498d-ba7d-99bd87b1417f',
                                        ],
                                        'created_at' => [
                                            'type' => 'string',
                                            'format' => 'date-time',
                                            'example' => '2024-12-11T04:25:47.000Z',
                                        ],
                                        'updated_at' => [
                                            'type' => 'string',
                                            'format' => 'date-time',
                                            'example' => '2024-12-11T04:25:47.000Z',
                                        ],
                                        'description' => [
                                            'type' => 'string',
                                            'example' => '',
                                        ],
                                        'flags' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'active' => [
                                                    'type' => 'boolean',
                                                    'example' => true,
                                                ],
                                            ],
                                        ],
                                        'hash' => [
                                            'type' => 'string',
                                            'example' => 'pte116m',
                                        ],
                                        'applications_total' => [
                                            'type' => 'integer',
                                            'example' => 2,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a codebase details linked to the specified application.',
                'description' => 'Retrieves a codebase details linked to the specified application.',
                'x-cli-name' => 'codebases:get-by-application',
                'parameters' => [
                    [
                        'name' => 'applicationId',
                        'in' => 'path',
                        'description' => 'The entity\'s universally unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases' => [
            'get' => [
                'operationId' => 'api_codebases_get_collection',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'List of codebases.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 0,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'applications' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/applications',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'subscription' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            '_embedded' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'subscription' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            '_links' => [
                                                                                'type' => 'object',
                                                                                'properties' => [
                                                                                    'self' => [
                                                                                        'type' => 'object',
                                                                                        'properties' => [
                                                                                            'href' => [
                                                                                                'type' => 'string',
                                                                                                'format' => 'uri',
                                                                                                'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                                            ],
                                                                                        ],
                                                                                    ],
                                                                                ],
                                                                            ],
                                                                            'id' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uuid',
                                                                                'example' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => '0975a7a1-746f-4096-9c22-383f001797b5',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'test',
                                                            ],
                                                            'region' => [
                                                                'type' => 'string',
                                                                'example' => 'us-east-1',
                                                            ],
                                                            'vcs_url' => [
                                                                'type' => 'string',
                                                                'format' => 'uri',
                                                                'example' => 'ssh://us-east-1.dev.vcs.acquia.io/0975a7a1-746f-4096-9c22-383f001797b5',
                                                            ],
                                                            'repository_id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => 'a5ef0a9d-44ce-4f06-8d4f-15f24f941a74',
                                                            ],
                                                            'created_at' => [
                                                                'type' => 'string',
                                                                'format' => 'date-time',
                                                                'example' => '2024-12-20T06:39:50.000Z',
                                                            ],
                                                            'updated_at' => [
                                                                'type' => 'string',
                                                                'format' => 'date-time',
                                                                'example' => '2024-12-20T06:39:50.000Z',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => '',
                                                            ],
                                                            'flags' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'active' => [
                                                                        'type' => 'boolean',
                                                                        'example' => true,
                                                                    ],
                                                                ],
                                                            ],
                                                            'hash' => [
                                                                'type' => 'string',
                                                                'example' => 'ryh4smn',
                                                            ],
                                                            'applications_total' => [
                                                                'type' => 'integer',
                                                                'example' => 0,
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'next' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases?offset=25',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of codebases accessible by the user.',
                'description' => 'Retrieves a list of codebases accessible by the user.',
                'x-cli-name' => 'codebases:get-all',
                'parameters' => [],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}' => [
            'get' => [
                'operationId' => 'get_codebase_by_id',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Codebase details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'applications' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-041c-44c7-a486-7972ed2cafc8/applications',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-041c-44c7-a486-7972ed2cafc8',
                                                        ],
                                                    ],
                                                ],
                                                'subscription' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'subscription' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        '_links' => [
                                                            'type' => 'object',
                                                            'properties' => [
                                                                'self' => [
                                                                    'type' => 'object',
                                                                    'properties' => [
                                                                        'href' => [
                                                                            'type' => 'string',
                                                                            'format' => 'uri',
                                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                        'id' => [
                                                            'type' => 'string',
                                                            'format' => 'uuid',
                                                            'example' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '11111111-041c-44c7-a486-7972ed2cafc8',
                                        ],
                                        'label' => [
                                            'type' => 'string',
                                            'example' => 'Test codebase with attached applications',
                                        ],
                                        'region' => [
                                            'type' => 'string',
                                            'example' => 'us-east-1',
                                        ],
                                        'vcs_url' => [
                                            'type' => 'string',
                                            'format' => 'uri',
                                            'example' => 'ssh://us-east-1.dev.vcs.acquia.io/11111111-041c-44c7-a486-7972ed2cafc8',
                                        ],
                                        'repository_id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => 'f03e15f9-0d97-498d-ba7d-99bd87b1417f',
                                        ],
                                        'created_at' => [
                                            'type' => 'string',
                                            'format' => 'date-time',
                                            'example' => '2024-12-11T04:25:47.000Z',
                                        ],
                                        'updated_at' => [
                                            'type' => 'string',
                                            'format' => 'date-time',
                                            'example' => '2024-12-11T04:25:47.000Z',
                                        ],
                                        'description' => [
                                            'type' => 'string',
                                            'example' => '',
                                        ],
                                        'flags' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'active' => [
                                                    'type' => 'boolean',
                                                    'example' => true,
                                                ],
                                            ],
                                        ],
                                        'hash' => [
                                            'type' => 'string',
                                            'example' => 'pte116m',
                                        ],
                                        'applications_total' => [
                                            'type' => 'integer',
                                            'example' => 2,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a codebase details by its ID.',
                'description' => 'Return details about a specific codebase.',
                'x-cli-name' => 'codebases:get',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
            'put' => [
                'operationId' => 'api_codebases_codebaseId_put',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    202 => [
                        'description' => 'Update a codebase details by its ID.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Codebase update started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Update a codebase details by its ID.',
                'description' => 'Update a codebase details by its ID.',
                'x-cli-name' => 'codebases:update',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The updated Codebase resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'example' => 'test-codebase',
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'example' => 'codebase-description',
                                    ],
                                ],
                                'minProperties' => 1,
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
            'delete' => [
                'operationId' => 'api_codebases_codebaseId_delete',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    202 => [
                        'description' => 'Deletes a codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Codebase deletion started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Delete a codebase by its ID.',
                'description' => 'Delete a codebase by its ID.',
                'x-cli-name' => 'codebases:delete',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionId}/codebases' => [
            'get' => [
                'operationId' => 'subscription_codebases',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'List of codebases.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 0,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'applications' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/0975a7a1-746f-4096-9c22-383f001797b5/applications',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'subscription' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            '_embedded' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'subscription' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            '_links' => [
                                                                                'type' => 'object',
                                                                                'properties' => [
                                                                                    'self' => [
                                                                                        'type' => 'object',
                                                                                        'properties' => [
                                                                                            'href' => [
                                                                                                'type' => 'string',
                                                                                                'format' => 'uri',
                                                                                                'example' => 'https://cloud.acquia.com/api/subscriptions/f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                                            ],
                                                                                        ],
                                                                                    ],
                                                                                ],
                                                                            ],
                                                                            'id' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uuid',
                                                                                'example' => 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => '0975a7a1-746f-4096-9c22-383f001797b5',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'test',
                                                            ],
                                                            'region' => [
                                                                'type' => 'string',
                                                                'example' => 'us-east-1',
                                                            ],
                                                            'vcs_url' => [
                                                                'type' => 'string',
                                                                'format' => 'uri',
                                                                'example' => 'ssh://us-east-1.dev.vcs.acquia.io/0975a7a1-746f-4096-9c22-383f001797b5',
                                                            ],
                                                            'repository_id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => 'a5ef0a9d-44ce-4f06-8d4f-15f24f941a74',
                                                            ],
                                                            'created_at' => [
                                                                'type' => 'string',
                                                                'format' => 'date-time',
                                                                'example' => '2024-12-20T06:39:50.000Z',
                                                            ],
                                                            'updated_at' => [
                                                                'type' => 'string',
                                                                'format' => 'date-time',
                                                                'example' => '2024-12-20T06:39:50.000Z',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => '',
                                                            ],
                                                            'flags' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'active' => [
                                                                        'type' => 'boolean',
                                                                        'example' => true,
                                                                    ],
                                                                ],
                                                            ],
                                                            'hash' => [
                                                                'type' => 'string',
                                                                'example' => 'ryh4smn',
                                                            ],
                                                            'applications_total' => [
                                                                'type' => 'integer',
                                                                'example' => 0,
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases{?sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'next' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases?offset=25',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of codebases by subscription ID.',
                'description' => 'Retrieves a list of codebases by subscription ID.',
                'x-cli-name' => 'codebases:get-by-subscription',
                'parameters' => [
                    [
                        'name' => 'subscriptionId',
                        'in' => 'path',
                        'description' => 'The entity\'s universally unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
            'post' => [
                'operationId' => 'api_subscriptions_subscriptionIdcodebases_post',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    201 => [
                        'description' => 'Create a new codebase for a subscription.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123/codebases',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Codebase with label:test-codebase creation started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Incomplete or incorrect request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'label' => [
                                                    'type' => 'string',
                                                    'example' => 'This value should not be null.',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Subscription not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Subscription with id:invalid-sub-9999 could not be found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Create a new codebase for a subscription.',
                'description' => 'Create a new codebase for a subscription.',
                'x-cli-name' => 'codebases:create',
                'parameters' => [
                    [
                        'name' => 'subscriptionId',
                        'in' => 'path',
                        'description' => 'The entity\'s unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The new Codebase resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'codebase_id' => [
                                        'type' => 'string',
                                        'format' => 'uuid',
                                        'example' => 'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd4',
                                    ],
                                    'label' => [
                                        'type' => 'string',
                                        'example' => 'test-codebase',
                                    ],
                                    'region' => [
                                        'type' => 'string',
                                        'example' => 'us-east-1',
                                    ],
                                ],
                                'required' => [
                                    'codebase_id',
                                    'label',
                                    'region',
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
            'options' => [
                'operationId' => 'api_subscriptions_subscriptionIdcodebases_options',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Gets supported regions for a new codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123/codebases',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'regions' => [
                                            'type' => 'array',
                                            'items' => [
                                                'type' => 'string',
                                                'enum' => [
                                                    'us-east-1',
                                                    'eu-west-1',
                                                    'us-west-2',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Gets supported regions for a new codebase.',
                'description' => 'Gets supported regions for a new codebase.',
                'x-cli-name' => 'codebases:get-regions',
                'parameters' => [
                    [
                        'name' => 'subscriptionId',
                        'in' => 'path',
                        'description' => 'The entity\'s universally unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/applications' => [
            'get' => [
                'operationId' => 'codebase_applications',
                'x-prerelease' => true,
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Retrieves a list of applications by codebase ID.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 0,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/applications/App1',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => 'App1',
                                                            ],
                                                            'machine_name' => [
                                                                'type' => 'string',
                                                                'example' => 'APP_NAME',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-9cda-4ca3-af13-7a1c2fc66778',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-9cda-4ca3-af13-7a1c2fc66778/applications',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-9cda-4ca3-af13-7a1c2fc66778/applications{?limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-9cda-4ca3-af13-7a1c2fc66778/applications{?offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/11111111-9cda-4ca3-af13-7a1c2fc66778/applications{?filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of applications by codebase ID.',
                'description' => 'Retrieves the collection of application resources from codebase ID. If the user has admin-level access, no filter is applied. Otherwise, the resources are filtered based on the requesting user\'s permissions.',
                'x-cli-name' => 'codebases:applications:list',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/references' => [
            'get' => [
                'operationId' => 'get_references_by_codebase',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Retrieves a list of git references by codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 0,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'parent' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'uri',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '1234567',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'main',
                                                            ],
                                                            'type' => [
                                                                'type' => 'string',
                                                                'example' => 'BRANCH',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'format' => 'uuid',
                                                                'example' => '47de85b1-14bb-4074-8c1d-f0a2d63db687',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references{?limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references{?offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references{?filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri-template',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references{?sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of git references by codebase.',
                'description' => 'Retrieves a list of git references by codebase.',
                'x-cli-name' => 'codebases:references:list',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/references/{referenceName}' => [
            'get' => [
                'operationId' => 'get_single_reference',
                'tags' => [
                    'Codebases',
                ],
                'responses' => [
                    200 => [
                        'description' => 'Retrieves a single git reference data for the given codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'uri',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/47de85b1-14bb-4074-8c1d-f0a2d63db687/references/main',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'example' => 'RefId99',
                                        ],
                                        'name' => [
                                            'type' => 'string',
                                            'example' => 'main',
                                        ],
                                        'type' => [
                                            'type' => 'string',
                                            'example' => 'BRANCH',
                                        ],
                                        'codebase_id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '47de85b1-14bb-4074-8c1d-f0a2d63db687',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Codebase not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a single git reference data for the given codebase.',
                'description' => 'Retrieves a single git reference data for the given codebase.',
                'x-cli-name' => 'codebases:references:get',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'referenceName',
                        'in' => 'path',
                        'description' => 'The reference name.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Codebase_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/database' => [
            'get' => [
                'operationId' => 'site_instance_database',
                'x-cli-name' => 'site-instances:database',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Database details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'database_host' => [
                                            'type' => 'string',
                                            'example' => 'localhost',
                                        ],
                                        'database_name' => [
                                            'type' => 'string',
                                            'example' => 'example',
                                        ],
                                        'database_role' => [
                                            'type' => 'string',
                                            'example' => 'example',
                                        ],
                                        'database_password' => [
                                            'type' => 'string',
                                            'example' => 'example@123',
                                        ],
                                        'database_user_name' => [
                                            'type' => 'string',
                                            'example' => 'example',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'not found',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieve database info based on the site instance.',
                'description' => 'Retrieve database info based on the site instance.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'post' => [
                'operationId' => 'api_site-instances_siteId._environmentIddatabase_post',
                'x-cli-name' => 'site-instances:database:copy',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Copied database from one environment to another.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Database copy for site id 3e8ecbec-ea7c-4260-8414-ef2938c859bc from e8a2c3c1-baf3-4d9a-9b56-87d8f61ab9f7 to d9a0fe17-cb18-4c21-b8ea-9e3a0b7b4c18 started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site/3e8ecbec-ea7c-4260-8414-ef2938c859bc/databases',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Copy a database from one environment to another.',
                'description' => 'Copy a database from one environment to another.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'Database copy request with source and destination environment ids.',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'source_environment_id' => [
                                        'type' => 'string',
                                        'example' => 'e8a2c3c1-baf3-4d9a-9b56-87d8f61ab9f7',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/database/backups' => [
            'get' => [
                'operationId' => 'get_database_backups',
                'x-cli-name' => 'site-instances:database:backups',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'List Database backups of site instance.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => 'e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                            ],
                                                            'database_id' => [
                                                                'type' => 'string',
                                                                'example' => 'b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                            ],
                                                            'created_at' => [
                                                                'type' => 'string',
                                                                'example' => '2025-04-01T13:01:06.603Z',
                                                            ],
                                                            'type' => [
                                                                'type' => 'string',
                                                                'example' => 'DAILY',
                                                            ],
                                                            '_links' => [
                                                                'type' => 'string',
                                                                'example' => 'www.example.com',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?offset=1{&limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25{&offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1{&filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1{&sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database Backup not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves collection of database backups associated with site(a site-instance).',
                'description' => 'Retrieves collection of database backups associated with site(a site-instance).',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'post' => [
                'operationId' => 'api_site-instances_siteId._environmentIddatabasebackups_post',
                'x-cli-name' => 'site-instances:database:backups:create',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    201 => [
                        'description' => 'Created backup for the site instance Db.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Database backup started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/d9a0fe17-cb18-4c21-b8ea-9e3a0b7b4c18.e8a2c3c1-baf3-4d9a-9b56-87d8f61ab9f7/database/backups',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'not found',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Create a new backup for the site instance Db.',
                'description' => 'Create a new backup for the site instance Db.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/database/backups/{id}' => [
            'get' => [
                'operationId' => 'get_database_backup',
                'x-cli-name' => 'site-instances:database:backups:get',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Database Backup details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/backups/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                        ],
                                                    ],
                                                ],
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/backups',
                                                        ],
                                                    ],
                                                ],
                                                'site-instance' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                                'site' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                                        ],
                                                    ],
                                                ],
                                                'environment' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'example' => 'e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                        ],
                                        'database_id' => [
                                            'type' => 'string',
                                            'example' => 'b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                        ],
                                        'created_at' => [
                                            'type' => 'string',
                                            'example' => '2025-04-01T13:01:06.603Z',
                                        ],
                                        'type' => [
                                            'type' => 'string',
                                            'example' => 'DAILY',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database Backup not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves details about a backup by its id associated with site(a site-instance)',
                'description' => 'Retrieves details about a backup by its id associated with site(a site-instance)',
                'parameters' => [
                    [
                        'name' => 'id',
                        'in' => 'path',
                        'description' => 'Database backup unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'delete' => [
                'operationId' => 'api_site-instances_siteId._environmentIddatabasebackups_id_delete',
                'x-cli-name' => 'site-instances:database:backups:delete',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Delete a site instance database backup',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Database backup deletion started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database Backup not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Delete a site instance database backup',
                'description' => 'Delete a site instance database backup',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'id',
                        'in' => 'path',
                        'description' => 'Backup unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/database/backups/{id}/actions/download' => [
            'get' => [
                'operationId' => 'api_site-instances_siteId._environmentIddatabasebackups_idactionsdownload_get',
                'x-cli-name' => 'site-instances:database:backups:download',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'DatabaseBackup resource',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseBackup.jsonhal',
                                ],
                            ],
                            'application/json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseBackup',
                                ],
                            ],
                            'text/html' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseBackup',
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Download a site instance Db backup',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Database backup download started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database Backup not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Download a site instance Database backup',
                'description' => 'Download a site instance Database backup.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'id',
                        'in' => 'path',
                        'description' => 'Backup unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/database/backups/{id}/actions/restore' => [
            'post' => [
                'operationId' => 'restore_database_backup',
                'x-cli-name' => 'site-instances:database:backups:restore',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Restore database backup',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups/1',
                                                        ],
                                                    ],
                                                ],
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups/1/actions/restore',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Database restore started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Invalid input',
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Database Backup not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Restore a backup for the site instance Db',
                'description' => 'Restore a backup for the site instance Db.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'id',
                        'in' => 'path',
                        'description' => 'Backup unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/domains' => [
            'get' => [
                'operationId' => 'site_instance_domains',
                'x-cli-name' => 'site-instances:domains',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'List of site instance domains.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            'domain' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'name' => [
                                                                        'type' => 'string',
                                                                        'example' => 'example.com',
                                                                    ],
                                                                    'is_managed' => [
                                                                        'type' => 'boolean',
                                                                        'example' => true,
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.3e8ecbec-ea7c-4260-8414-ef2938c859bc/domains?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains?offset=1{&limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains?limit=25{&offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains?limit=25&offset=1{&filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains?limit=25&offset=1{&sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Site instance Domain not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The domains for the site instance with id {site_id}.{environment_id} you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves all site instance domains by environment and site ID.',
                'description' => 'Retrieves all site instance domains by environment and site ID.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/domains/{domainName}' => [
            'get' => [
                'operationId' => 'site_instance_domain',
                'x-cli-name' => 'site-instances:domain',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Domain details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains/example.com',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'domain' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'name' => [
                                                    'type' => 'string',
                                                    'example' => 'example.com',
                                                ],
                                                'is_managed' => [
                                                    'type' => 'boolean',
                                                    'example' => true,
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Domain not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The domain provided does not exist.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves site instance domain details by environment and site ID.',
                'description' => 'Retrieves site instance domain details by environment and site ID.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'domainName',
                        'in' => 'path',
                        'description' => 'Domain Name',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'put' => [
                'operationId' => 'add_domain_to_site',
                'x-cli-name' => 'site-instances:domain:add',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    201 => [
                        'description' => 'Domain updated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/domains/example.com',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'name' => [
                                            'type' => 'string',
                                            'example' => 'example.com',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Invalid input',
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Domain not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The domain provided does not exist.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Associate a site and environment with a domain.',
                'description' => 'Associate a site and environment with a domain.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'domainName',
                        'in' => 'path',
                        'description' => 'Domain Name',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The updated Domain resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'additionalProperties' => false,
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'delete' => [
                'operationId' => 'api_site-instances_siteId._environmentIddomains_domainName_delete',
                'x-cli-name' => 'site-instances:domain:delete',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Dissociate a site and environment from a domain',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'www.example.com domain deletion for site_id:3e8ecbec-ea7c-4260-8414-ef2938c859bc started.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Domain not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Dissociate a site and environment from a domain.',
                'description' => 'Dissociate a site and environment from a domain.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'domainName',
                        'in' => 'path',
                        'description' => 'Domain Name',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/domains/{domainName}/status' => [
            'get' => [
                'operationId' => 'site_instance_domain_status',
                'x-cli-name' => 'site-instances:domain:status',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Domain Status',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.3e8ecbec-ea7c-4260-8414-ef2938c859bc/domains/www.example.com/status',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'site-id' => [
                                            'type' => 'string',
                                            'example' => '3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'environment-id' => [
                                            'type' => 'string',
                                            'example' => '3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'hostname' => [
                                            'type' => 'string',
                                            'example' => 'www.example.com',
                                        ],
                                        'flags' => [
                                            'type' => 'object',
                                            'example' => [
                                                'default' => false,
                                                'active' => true,
                                                'dns_resolves' => true,
                                                'acquia_hosted' => true,
                                            ],
                                        ],
                                        'ip_addresses' => [
                                            'type' => 'array',
                                            'items' => [
                                                'type' => 'string',
                                            ],
                                            'example' => [
                                                '192.0.2.1',
                                            ],
                                        ],
                                        'cnames' => [
                                            'type' => 'array',
                                            'items' => [
                                                'type' => 'string',
                                            ],
                                            'example' => [
                                                'cname1.example.com',
                                                'cname2.example.com',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Domain not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves site instance domain status.',
                'description' => 'Retrieves site instance domain status.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'domainName',
                        'in' => 'path',
                        'description' => 'Domain Name',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/environments' => [
            'get' => [
                'operationId' => 'environments_by_codebase',
                'x-cli-name' => 'codebases:environments-list',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'List of environments.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/environments/1111-1111-1111',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'codebase' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '1111-1111-1111',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'environment_1111-1111-1111',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'Environment 1111-1111-1111',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'Description of1111-1111-1111',
                                                            ],
                                                            'status' => [
                                                                'type' => 'string',
                                                                'example' => 'normal',
                                                            ],
                                                            'flags' => [
                                                                'type' => 'object',
                                                                'example' => [
                                                                    'production' => false,
                                                                ],
                                                            ],
                                                            'properties' => [
                                                                'type' => 'object',
                                                                'example' => [
                                                                    'version' => '8.3',
                                                                    'max_execution_time' => 10,
                                                                    'memory_limit' => 192,
                                                                    'apcu' => 32,
                                                                    'client_max_body_size' => 192,
                                                                    'max_input_vars' => 1000,
                                                                    'max_post_size' => 256,
                                                                    'memcached_limit' => 128,
                                                                    'upload_max_filesize' => 192,
                                                                    'operating_system' => 'focal',
                                                                ],
                                                            ],
                                                            'reference' => [
                                                                'type' => 'string',
                                                                'example' => 'tag/v3.1',
                                                            ],
                                                            'code_switch_status' => [
                                                                'type' => 'string',
                                                                'enum' => [
                                                                    'IDLE',
                                                                    'IN_PROGRESS',
                                                                ],
                                                                'example' => 'IDLE',
                                                                'description' => 'The status of the Switch Code action',
                                                            ],
                                                            'ssh_url' => [
                                                                'type' => 'string',
                                                                'format' => 'string',
                                                                'example' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                                            ],
                                                            '_embedded' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'codebase' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'id' => [
                                                                                'type' => 'string',
                                                                                'example' => '1111-1111-1111',
                                                                            ],
                                                                            '_links' => [
                                                                                'type' => 'object',
                                                                                'properties' => [
                                                                                    'self' => [
                                                                                        'type' => 'object',
                                                                                        'properties' => [
                                                                                            'href' => [
                                                                                                'type' => 'string',
                                                                                                'format' => 'string',
                                                                                                'example' => 'https://cloud.acquia.com/api/codebases/1111-1111-1111',
                                                                                            ],
                                                                                        ],
                                                                                    ],
                                                                                ],
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?offset=1{&limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?limit=25{&offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?limit=25&offset=1{&filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?limit=25&offset=1{&sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc/environments?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Environment not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves all environments by codebase.',
                'description' => 'Retrieves all environments by codebase.',
                'parameters' => [
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page.',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The index of the first item in the page.',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'integer',
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'filter',
                        'in' => 'query',
                        'description' => 'The filters query string parameter restricts the data returned from your request. Filtered queries restrict the rows that do get included in the result by testing each row in the result against the filters. Not all fields are filterable. Current we only support filter by **name**',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                            'example' => 'name=dev',
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'Codebase entity unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/environments/{environmentId}' => [
            'get' => [
                'operationId' => 'environment_by_codebase_id',
                'x-cli-name' => 'codebases:environments-find',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Environment details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                                        ],
                                                    ],
                                                ],
                                                'codebase' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'name' => [
                                            'type' => 'string',
                                            'example' => 'environment_3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'label' => [
                                            'type' => 'string',
                                            'example' => 'Environment_3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'description' => [
                                            'type' => 'string',
                                            'example' => 'Description of 3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'status' => [
                                            'type' => 'string',
                                            'example' => 'normal',
                                        ],
                                        'flags' => [
                                            'type' => 'object',
                                            'example' => [
                                                'production' => false,
                                            ],
                                        ],
                                        'properties' => [
                                            'type' => 'object',
                                            'example' => [
                                                'version' => '8.3',
                                                'max_execution_time' => 10,
                                                'memory_limit' => 192,
                                                'apcu' => 32,
                                                'client_max_body_size' => 192,
                                                'max_input_vars' => 1000,
                                                'max_post_size' => 256,
                                                'memcached_limit' => 128,
                                                'upload_max_filesize' => 192,
                                                'operating_system' => 'focal',
                                            ],
                                        ],
                                        'reference' => [
                                            'type' => 'string',
                                            'example' => 'tag/v3.1',
                                        ],
                                        'code_switch_status' => [
                                            'type' => 'string',
                                            'enum' => [
                                                'IDLE',
                                                'IN_PROGRESS',
                                            ],
                                            'example' => 'IDLE',
                                            'description' => 'The status of the Switch Code action',
                                        ],
                                        'ssh_url' => [
                                            'type' => 'string',
                                            'format' => 'string',
                                            'example' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'codebase' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'id' => [
                                                            'type' => 'string',
                                                            'example' => 'd3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                        '_links' => [
                                                            'type' => 'object',
                                                            'properties' => [
                                                                'self' => [
                                                                    'type' => 'object',
                                                                    'properties' => [
                                                                        'href' => [
                                                                            'type' => 'string',
                                                                            'format' => 'string',
                                                                            'example' => 'https://cloud.acquia.com/api/codebases/d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Environment not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves the details for an environment based on codebase and environment uuid.',
                'description' => 'Retrieves the details for an environment based on codebase and environment uuid.',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'Codebase entity unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/v3/environments/{environmentId}' => [
            'get' => [
                'operationId' => 'environment_by_id',
                'x-cli-name' => 'environments-v3:find',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Environment details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                                        ],
                                                    ],
                                                ],
                                                'codebase' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'example' => '3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'name' => [
                                            'type' => 'string',
                                            'example' => 'environment_3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'label' => [
                                            'type' => 'string',
                                            'example' => 'Environment_3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'description' => [
                                            'type' => 'string',
                                            'example' => 'Description of 3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'status' => [
                                            'type' => 'string',
                                            'example' => 'normal',
                                        ],
                                        'flags' => [
                                            'type' => 'object',
                                            'example' => [
                                                'production' => false,
                                            ],
                                        ],
                                        'properties' => [
                                            'type' => 'object',
                                            'example' => [
                                                'version' => '8.3',
                                                'max_execution_time' => 10,
                                                'memory_limit' => 192,
                                                'apcu' => 32,
                                                'client_max_body_size' => 192,
                                                'max_input_vars' => 1000,
                                                'max_post_size' => 256,
                                                'memcached_limit' => 128,
                                                'upload_max_filesize' => 192,
                                                'operating_system' => 'focal',
                                            ],
                                        ],
                                        'reference' => [
                                            'type' => 'string',
                                            'example' => 'tag/v3.1',
                                        ],
                                        'code_switch_status' => [
                                            'type' => 'string',
                                            'enum' => [
                                                'IDLE',
                                                'IN_PROGRESS',
                                            ],
                                            'example' => 'IDLE',
                                            'description' => 'The status of the Switch Code action',
                                        ],
                                        'ssh_url' => [
                                            'type' => 'string',
                                            'format' => 'string',
                                            'example' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'codebase' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'id' => [
                                                            'type' => 'string',
                                                            'example' => 'd3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                        '_links' => [
                                                            'type' => 'object',
                                                            'properties' => [
                                                                'self' => [
                                                                    'type' => 'object',
                                                                    'properties' => [
                                                                        'href' => [
                                                                            'type' => 'string',
                                                                            'format' => 'string',
                                                                            'example' => 'https://cloud.acquia.com/api/codebases/d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Environment not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves an environment details by its uuid.',
                'description' => 'Retrieves an environment details by its uuid.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'put' => [
                'operationId' => 'update_environment',
                'x-cli-name' => 'environments-v3:update',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Successful start of environment properties update.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Environment update started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Environment not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Modifies properties settings for an environment.',
                'description' => 'Modifies properties settings for an environment. Note that some settings cannot be configured for certain subscriptions.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The updated Environment resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'example' => 'test-environment',
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'example' => 'environment-description',
                                    ],
                                    'properties' => [
                                        'type' => 'object',
                                        'example' => [
                                            'version' => '8.3',
                                            'max_execution_time' => 10,
                                            'memory_limit' => 192,
                                            'apcu' => 32,
                                            'client_max_body_size' => 192,
                                            'max_input_vars' => 1000,
                                            'max_post_size' => 256,
                                            'memcached_limit' => 128,
                                            'upload_max_filesize' => 192,
                                            'operating_system' => 'focal',
                                        ],
                                        'minProperties' => 1,
                                    ],
                                ],
                                'minProperties' => 1,
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/sites/{siteId}/environments' => [
            'get' => [
                'operationId' => 'environments_by_site',
                'x-cli-name' => 'sites:environments-list',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'List of environments.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'site_instance' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/site-instances/site-id.env-id',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/sites/site-id/environments',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'codebase' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'format' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '1111-1111-1111',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'environment_1111-1111-1111',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'Environment 1111-1111-1111',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'Description of 1111-1111-1111',
                                                            ],
                                                            'status' => [
                                                                'type' => 'string',
                                                                'example' => 'normal',
                                                            ],
                                                            'flags' => [
                                                                'type' => 'object',
                                                                'example' => [
                                                                    'production' => false,
                                                                ],
                                                            ],
                                                            'properties' => [
                                                                'type' => 'object',
                                                                'example' => [
                                                                    'version' => '8.3',
                                                                    'max_execution_time' => 10,
                                                                    'memory_limit' => 192,
                                                                    'apcu' => 32,
                                                                    'client_max_body_size' => 192,
                                                                    'max_input_vars' => 1000,
                                                                    'max_post_size' => 256,
                                                                    'memcached_limit' => 128,
                                                                    'upload_max_filesize' => 192,
                                                                    'operating_system' => 'focal',
                                                                ],
                                                            ],
                                                            'reference' => [
                                                                'type' => 'string',
                                                                'example' => 'tag/v3.1',
                                                            ],
                                                            'code_switch_status' => [
                                                                'type' => 'string',
                                                                'enum' => [
                                                                    'IDLE',
                                                                    'IN_PROGRESS',
                                                                ],
                                                                'example' => 'IDLE',
                                                                'description' => 'The status of the Switch Code action',
                                                            ],
                                                            'ssh_url' => [
                                                                'type' => 'string',
                                                                'format' => 'string',
                                                                'example' => 'site.dev@sitedev.ssh.hosted.acquia-sites.com',
                                                            ],
                                                            '_embedded' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'codebase' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'id' => [
                                                                                'type' => 'string',
                                                                                'example' => '1111-1111-1111',
                                                                            ],
                                                                            '_links' => [
                                                                                'type' => 'object',
                                                                                'properties' => [
                                                                                    'self' => [
                                                                                        'type' => 'object',
                                                                                        'properties' => [
                                                                                            'href' => [
                                                                                                'type' => 'string',
                                                                                                'format' => 'string',
                                                                                                'example' => 'https://cloud.acquia.com/api/codebases/1111-1111-1111',
                                                                                            ],
                                                                                        ],
                                                                                    ],
                                                                                ],
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?offset=1{&limit}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?limit=25{&offset}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?limit=25&offset=1{&filter}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?limit=25&offset=1{&sort}',
                                                        ],
                                                        'templated' => [
                                                            'type' => 'boolean',
                                                            'example' => true,
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/site-id/environments?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Environment not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves all environments by site.',
                'description' => 'Retrieves all environments by site.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/site-instances' => [
            'post' => [
                'operationId' => 'api_environments_environmentIdsite-instances_post',
                'x-cli-name' => 'environments:site-instances:create',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    201 => [
                        'description' => 'Site instance creation started.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site instance for site_id:3fa85f64-5717-4562-b3fc-2c963f66afa6 creation started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/d3f7270e-c45f-4801-9308-5e8afe84a323/site-instances',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The site instance already exists.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Associate a site with an environment.',
                'description' => 'Associate a site with an environment.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The new SiteInstance resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_id' => [
                                        'type' => 'string',
                                        'example' => '3fa85f64-5717-4562-b3fc-2c963f66afa6',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}' => [
            'get' => [
                'operationId' => 'site_instance',
                'x-cli-name' => 'site-instances:find',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Site Instance details',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'site_id' => [
                                            'type' => 'string',
                                            'example' => '3e8ecbec-ea7c-4260-8414-ef2938c859bc',
                                        ],
                                        'environment_id' => [
                                            'type' => 'string',
                                            'example' => 'd3f7270e-c45f-4801-9308-5e8afe84a323',
                                        ],
                                        'status' => [
                                            'type' => 'string',
                                            'example' => 'active',
                                        ],
                                        'health_status' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'code' => [
                                                    'type' => 'string',
                                                    'example' => 'OK',
                                                ],
                                                'summary' => [
                                                    'type' => 'string',
                                                    'example' => 'The health status is OK.',
                                                ],
                                                'details' => [
                                                    'type' => 'string',
                                                    'example' => 'The site instance is active',
                                                ],
                                            ],
                                        ],
                                        'domains' => [
                                            'type' => 'array',
                                            'items' => [
                                                'type' => 'string',
                                                'example' => 'example.com',
                                            ],
                                            'example' => [
                                                'example.com',
                                                'example-2.com',
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Site Instance not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves details about an environment association with a site (a site instance).',
                'description' => 'Retrieves details about an environment association with a site (a site instance).',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
            'delete' => [
                'operationId' => 'api_site-instances_siteId._environmentId_delete',
                'x-cli-name' => 'site-instances:delete',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Site Instance deleted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site instance deletion started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/d3f7270e-c45f-4801-9308-5e8afe84a323.e3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Site Instance not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Dissociate a site and environment with no grace period.',
                'description' => 'Dissociate a site and environment with no grace period.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/actions/cancel' => [
            'post' => [
                'operationId' => 'api_site-instances_siteId._environmentIdactionscancel_post',
                'x-cli-name' => 'site-instances:delete',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Site Instance deleted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site instance deletion started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site-instances/d3f7270e-c45f-4801-9308-5e8afe84a323.e3f7270e-c45f-4801-9308-5e8afe84a323',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Invalid input',
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Site Instance not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Dissociate a site and environment.',
                'description' => 'Dissociate a site and environment.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The new SiteInstance resource',
                    'content' => [
                        'application/hal+json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/MEO_Environment_Service_SiteInstance.jsonhal',
                            ],
                        ],
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/MEO_Environment_Service_SiteInstance',
                            ],
                        ],
                        'text/html' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/MEO_Environment_Service_SiteInstance',
                            ],
                        ],
                    ],
                    'required' => true,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/site-instances/{siteId}.{environmentId}/files' => [
            'post' => [
                'operationId' => 'api_site-instances_siteId._environmentIdfiles_post',
                'x-cli-name' => 'site-instances:files:copy',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Copy files from one environment to another',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Files copy for site id 3fa85f64-5717-4562-b3fc-2c9699999999 from 3fa85f64-5717-4562-b3fc-2c963f66afa6 to 4fa85f64-5717-4562-b3fc-2c963f66afa3 started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'format' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/site/3fa85f64-5717-4562-b3fc-2c9699999999/files',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Validation Error in request body.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'validation_failed',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Invalid request body.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 400,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'Authorization required.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'system',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Full authentication is required to access this resource.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 401,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Access Denied',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'forbidden',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Access Denied.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 403,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        'description' => 'not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Not Found.',
                                        ],
                                        'code' => [
                                            'type' => 'integer',
                                            'example' => 404,
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Copy files from one environment to another.',
                'description' => 'Copy files from one environment to another.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The new SiteInstance resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'source_environment_id' => [
                                        'type' => 'string',
                                        'example' => '3fa85f64-5717-4562-b3fc-2c963f66afa6',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'MEO_Environment_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/private-networks' => [
            'post' => [
                'summary' => 'Create a new Private Network',
                'description' => 'Creates a new Private Network with optional subresource configuration.'."\n"
                    ."\n"
                    .'This comprehensive endpoint allows you to create a private network and optionally configure '."\n"
                    .'its subresources (connections, VPNs, VPC peers, ingress, and isolation) during the initial creation.'."\n"
                    ."\n"
                    .'**Subresource Creation:**'."\n"
                    .'- **Connections**: Configure CIDR block and egress access settings'."\n"
                    .'- **VPNs**: Create one or more VPN connections with tunnel configurations'."\n"
                    .'- **VPC Peers**: Create one or more VPC peering connections'."\n"
                    .'- **Ingress**: Configure ingress access rules and privacy settings'."\n"
                    .'- **Isolation**: Configure compute and network isolation flags'."\n"
                    ."\n"
                    .'All subresources are optional. If not specified during creation, they can be configured later'."\n"
                    .'using their respective endpoints.'."\n",
                'tags' => [
                    'Private Networks',
                ],
                'operationId' => 'createPrivateNetwork',
                'x-cli-name' => 'private-networks:create',
                'requestBody' => [
                    '$ref' => '#/components/requestBodies/Private_Network_Service_API_PrivateNetworkCreateRequest',
                ],
                'responses' => [
                    202 => [
                        'description' => 'Request accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network is being created',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Request failed to be validated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_ValidationError',
                                ],
                                'example' => [
                                    'error' => 'validation_failed',
                                    'message' => [
                                        'region' => 'Invalid region specified',
                                        'name' => 'Name is required and must be unique',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}' => [
            'get' => [
                'summary' => 'Retrieve a Private Network by ID',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'operationId' => 'getPrivateNetwork',
                'description' => 'Retrieves a Private Network by its ID.',
                'x-cli-name' => 'private-networks:find',
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_PrivateNetwork',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Update a Private Network',
                'description' => 'Updates an existing Private Network by its ID. Does not allow creation of new Private Networks.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'operationId' => 'updatePrivateNetwork',
                'x-cli-name' => 'private-networks:update',
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_UpdatePrivateNetworkRequestSpec',
                            ],
                            'example' => [
                                'description' => 'Private network for customer',
                                'label' => 'anyLabel',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Private network updated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network update is in progress',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a Private Network',
                'description' => 'Deletes a Private Network by its ID.',
                'operationId' => 'deletePrivateNetwork',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'x-cli-name' => 'private-networks:delete',
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    202 => [
                        'description' => 'Private network deleted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network is being deleted',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionId}/private-networks' => [
            'get' => [
                'summary' => 'List Private Networks for a Subscription',
                'operationId' => 'getPrivateNetworksBySubscription',
                'description' => 'Retrieves a paginated list of Private Networks for a given subscription.',
                'x-cli-name' => 'private-networks:list',
                'tags' => [
                    'Private Networks',
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_SubscriptionId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Filter',
                    ],
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_PrivateNetworkList',
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ValidationError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    403 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ForbiddenError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/connections/vpns' => [
            'post' => [
                'summary' => 'Add a new VPN to an existing private network',
                'operationId' => 'addVpnToPrivateNetwork',
                'description' => 'Adds a new VPN to the connections block of an existing private network',
                'x-cli-name' => 'private-networks:create-vpn',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_VPN',
                            ],
                            'example' => [
                                'name' => 'vpn2',
                                'gateway_ip' => '10.10.20.20',
                                'routes' => [
                                    '192.168.1.0/24',
                                    '192.168.2.0/24',
                                ],
                                'tunnel1' => [
                                    'shared_key' => 'sharedKey3',
                                    'internal_cidr' => '192.2.1.0/24',
                                    'ike_versions' => '1',
                                    'startup_action' => 'start',
                                    'dpd_timeout_action' => 'stop',
                                ],
                                'tunnel2' => [
                                    'shared_key' => 'sharedKey4',
                                    'internal_cidr' => '192.2.2.0/24',
                                    'ike_versions' => '2',
                                    'startup_action' => 'start',
                                    'dpd_timeout_action' => 'stop',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPN request accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'VPN is being created',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpns/2',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpns',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Bad request',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_ValidationError',
                                ],
                                'example' => [
                                    'error' => 'validation_failed',
                                    'message' => [
                                        'gateway_ip' => 'Invalid IP address format',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get VPNs for a Private Network',
                'operationId' => 'getAllVpnsFromPrivateNetwork',
                'description' => 'Retrieves the VPN Connections for a Private Network.',
                'x-cli-name' => 'private-networks:list-vpns',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Filter',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_VPNList',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/connections/vpns/{vpnId}' => [
            'get' => [
                'summary' => 'Retrieve a VPN for a Private Network.',
                'operationId' => 'getVpnFromPrivateNetwork',
                'description' => 'Retrieves a VPN for a Private Network by Private Network ID and VPN ID.',
                'x-cli-name' => 'private-networks:find-vpn',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpnId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_Vpn',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Create or update a VPN for a Private Network.',
                'operationId' => 'updateVpnInPrivateNetwork',
                'description' => 'Creates a new VPN or updates an existing VPN for a Private Network by Private Network ID and VPN ID.',
                'x-cli-name' => 'private-networks:update-vpn',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpnId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_VPN',
                            ],
                            'example' => [
                                'name' => 'vpn1',
                                'gateway_ip' => '10.10.10.11',
                                'routes' => [
                                    '127.0.0.1/32',
                                    '127.0.0.2/32',
                                    '192.168.3.0/24',
                                ],
                                'tunnel1' => [
                                    'shared_key' => 'updatedSharedKey1',
                                    'internal_cidr' => '192.1.1.0/24',
                                    'ike_versions' => '1',
                                    'startup_action' => 'start',
                                    'dpd_timeout_action' => 'stop',
                                ],
                                'tunnel2' => [
                                    'shared_key' => 'updatedSharedKey2',
                                    'internal_cidr' => '192.1.2.0/24',
                                    'ike_versions' => '2',
                                    'startup_action' => 'start',
                                    'dpd_timeout_action' => 'stop',
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPN request accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'examples' => [
                                    'creation' => [
                                        'summary' => 'VPN creation response',
                                        'description' => 'Response when creating a new VPN',
                                        'value' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpns/1',
                                                ],
                                            ],
                                            'message' => 'The VPN is being created.',
                                        ],
                                    ],
                                    'update' => [
                                        'summary' => 'VPN update response',
                                        'description' => 'Response when updating an existing VPN',
                                        'value' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpns/1',
                                                ],
                                            ],
                                            'message' => 'The VPN is being updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a VPN for a Private Network.',
                'operationId' => 'deleteVpnFromPrivateNetwork',
                'description' => 'Deletes a VPN for a Private Network by Private Network ID and VPN ID.',
                'x-cli-name' => 'private-networks:delete-vpn',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpnId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPN removed successfully',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'The VPN is being deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpns/1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/connections/vpc-peers' => [
            'post' => [
                'summary' => 'Add a new VPC Peer to an existing private network',
                'operationId' => 'addVpcPeerToPrivateNetwork',
                'description' => 'Adds a new VPC Peer to the connections block of an existing private network',
                'x-cli-name' => 'private-networks:create-vpc-peer',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_VPCPeers',
                            ],
                            'example' => [
                                'name' => 'vpcPeer2',
                                'aws_account' => '123456789012',
                                'vpc_id' => 'vpc-1234567890abcdef0',
                                'vpc_cidr' => '120.24.16.1/24',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPC Peer request accepted',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'VPC Peer is being created',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpc-peers/2',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpc-peers',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get VPC Peers for a Private Network',
                'operationId' => 'getAllVpcPeersFromPrivateNetwork',
                'description' => 'Retrieves the VPC Peers for a Private Network.',
                'x-cli-name' => 'private-networks:list-vpc-peers',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Limit',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Offset',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Sort',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_Filter',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_VpcPeerList',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/connections/vpc-peers/{vpcPeerId}' => [
            'put' => [
                'summary' => 'Create or update a VPC Peer for a Private Network',
                'operationId' => 'updateVPCPeerByPrivateNetworkIdAndName',
                'x-cli-name' => 'private-networks:update-vpc-peer',
                'description' => 'Creates a new VPC Peer or updates an existing VPC Peer for a Private Network by Private Network ID and VPC Peer name.',
                'tags' => [
                    'Private Networks',
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpcPeerId',
                    ],
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_VPCPeers',
                            ],
                            'example' => [
                                'name' => 'vpcPeer1',
                                'aws_account' => '123456789012',
                                'vpc_id' => 'vpc-1234567890abcdef0',
                                'vpc_cidr' => '120.24.16.1/24',
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPC Peer creation or update initiated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'allOf' => [
                                        [
                                            '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                        ],
                                        [
                                            'type' => 'object',
                                            'properties' => [
                                                'message' => [
                                                    'type' => 'string',
                                                    'description' => 'Confirmation message that varies based on whether the VPC Peer was created or updated',
                                                    'enum' => [
                                                        'The VPC Peer is being created.',
                                                        'The VPC Peer is being updated.',
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                                'examples' => [
                                    'creation' => [
                                        'summary' => 'VPC Peer creation response',
                                        'description' => 'Response when creating a new VPC Peer',
                                        'value' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpc-peers/1',
                                                ],
                                            ],
                                            'message' => 'The VPC Peer is being created.',
                                        ],
                                    ],
                                    'update' => [
                                        'summary' => 'VPC Peer update response',
                                        'description' => 'Response when updating an existing VPC Peer',
                                        'value' => [
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpc-peers/1',
                                                ],
                                            ],
                                            'message' => 'The VPC Peer is being updated.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ValidationError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get a specific VPC Peer from a private network',
                'operationId' => 'getVpcPeerFromPrivateNetwork',
                'description' => 'Retrieves details of a specific VPC Peer from a private network',
                'x-cli-name' => 'private-networks:find-vpc-peer',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpcPeerId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_VpcPeer',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'delete' => [
                'summary' => 'Delete a VPC Peer for a Private Network.',
                'operationId' => 'deleteVpcPeerFromPrivateNetwork',
                'description' => 'Deletes a VPC Peer for a Private Network by Private Network ID and VPC Peer name.',
                'x-cli-name' => 'private-networks:delete-vpc-peer',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_VpcPeerId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    202 => [
                        'description' => 'VPC Peer removed successfully',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'The VPC Peer is being deleted.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpc-peers/1',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/connections' => [
            'put' => [
                'summary' => 'Update Connections for a Private Network.',
                'operationId' => 'updatePrivateNetworkConnections',
                'description' => 'Updates the Connections configuration for a Private Network by Private Network ID.',
                'x-cli-name' => 'private-networks:update-connections',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_UpdateConnectionRequestSpec',
                            ],
                            'example' => [
                                'private_egress_access' => [
                                    'drupal' => true,
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Connections updated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network connections update is in progress',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get Connections for a Private Network.',
                'operationId' => 'getPrivateNetworkConnections',
                'x-cli-name' => 'private-networks:get-connections',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'description' => 'Retrieves the Connections block for a Private Network, including VPNs and VPC Peers.',
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_Connection',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/isolation' => [
            'get' => [
                'summary' => 'Get Isolation for a Private Network.',
                'operationId' => 'getPrivateNetworkIsolation',
                'description' => 'Retrieves the Isolation configuration for a Private Network.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'x-cli-name' => 'private-networks:get-isolation',
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_Isolation',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'put' => [
                'summary' => 'Update isolation settings of a private network',
                'operationId' => 'updatePrivateNetworkIsolation',
                'description' => 'Updates the isolation settings of a private network',
                'tags' => [
                    'Private Networks',
                ],
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'x-cli-name' => 'private-networks:update-isolation',
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_Isolation',
                            ],
                            'example' => [
                                'dedicated_compute' => true,
                                'dedicated_network' => true,
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Isolation settings updated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network isolation settings have been updated successfully.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/isolation',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/private-networks/{privateNetworkId}/ingress' => [
            'put' => [
                'summary' => 'Update Ingress for a Private Network.',
                'operationId' => 'updatePrivateNetworkIngress',
                'x-cli-name' => 'private-networks:update-ingress',
                'description' => 'Updates the Ingress configuration for a Private Network by Private Network ID. Ingress always exists for a Private Network.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                '$ref' => '#/components/schemas/Private_Network_Service_API_Ingress',
                            ],
                            'example' => [
                                'drupal_ssh' => [
                                    'ingress_acls' => [
                                        'test-acls',
                                    ],
                                    'private' => true,
                                ],
                            ],
                        ],
                    ],
                ],
                'responses' => [
                    202 => [
                        'description' => 'Ingress settings updated',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Message',
                                ],
                                'example' => [
                                    'message' => 'Private network ingress settings have been updated successfully.',
                                    '_links' => [
                                        'self' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/ingress',
                                        ],
                                        'parent' => [
                                            'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_BadRequestError',
                    ],
                    [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    409 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_ConflictError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
            'get' => [
                'summary' => 'Get Ingress for a Private Network',
                'operationId' => 'getIngressFromPrivateNetwork',
                'x-cli-name' => 'private-networks:get-ingress',
                'description' => 'Retrieves the Ingress configuration for a Private Network.',
                'parameters' => [
                    [
                        '$ref' => '#/components/parameters/Private_Network_Service_API_PrivateNetworkId',
                    ],
                ],
                'tags' => [
                    'Private Networks',
                ],
                'responses' => [
                    200 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_Ingress',
                    ],
                    401 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_UnauthorizedError',
                    ],
                    404 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_NotFoundError',
                    ],
                    500 => [
                        '$ref' => '#/components/responses/Private_Network_Service_API_InternalServerError',
                    ],
                ],
                'security' => [
                    [
                        'Private_Network_Service_API_BearerAuth' => [],
                        'Private_Network_Service_API_ClientCredentials' => [],
                        'Private_Network_Service_API_OIDC' => [],
                    ],
                ],
            ],
        ],
        '/codebases/{codebaseId}/sites' => [
            'get' => [
                'operationId' => 'api_codebases_codebaseIdsites_get_collection',
                'x-cli-name' => 'codebases:sites-list',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'A list of sites associated with a codebase.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites/8979a8ac-80dc-4df8-b2f0-6be36554a370',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '8979a8ac-80dc-4df8-b2f0-6be36554a370',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'site2',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 2',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 2 description',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'example' => '1234-5678',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?offset=1{&limit}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?limit=25{&offset}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?limit=25&offset=1{&filter}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?limit=25&offset=1{&sort}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/codebases/1234-5678/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Codebase sites not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The codebase you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of sites associated with a codebase.',
                'description' => 'Retrieves a list of site associated with a codebase.',
                'parameters' => [
                    [
                        'name' => 'codebaseId',
                        'in' => 'path',
                        'description' => 'The codebase entity\'s unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/environments/{environmentId}/sites' => [
            'get' => [
                'operationId' => 'api_environments_environmentIdsites_get_collection',
                'x-cli-name' => 'environments:sites-list',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'A list of sites associated with an environment.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                    'site_instance' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/site-instances/0ebce493-9d09-479d-a9a8-138a206fa687.24-a47ac10b-58cc-4372-a567-0e02b2c3d470',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '0ebce493-9d09-479d-a9a8-138a206fa687',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'site1',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1 description',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'example' => '8765-4321',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?offset=1{&limit}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?limit=25{&offset}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?limit=25&offset=1{&filter}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?limit=25&offset=1{&sort}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/environments/24-a47ac10b-58cc-4372-a567-0e02b2c3d470/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                    ],
                    [
                        'description' => 'Environment sites not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The environment you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of sites associated with an environment.',
                'description' => 'Retrieves a list of site associated with an environment.',
                'parameters' => [
                    [
                        'name' => 'environmentId',
                        'in' => 'path',
                        'description' => 'Environment unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/subscriptions/{subscriptionId}/sites' => [
            'get' => [
                'operationId' => 'api_subscriptions_subscriptionIdsites_get_collection',
                'tags' => [],
                'x-cli-name' => 'subscriptions:sites-list',
                'x-prerelease' => true,
                'responses' => [
                    200 => [
                        'description' => 'A list of sites associated with a subscription.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '0ebce493-9d09-479d-a9a8-138a206fa687',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'site1',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1 description',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'example' => '8765-4321',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'first' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'last' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of sites associated with a subscription.',
                'description' => 'Retrieves a list of sites associated with a subscription.',
                'parameters' => [
                    [
                        'name' => 'subscriptionId',
                        'in' => 'path',
                        'description' => 'The entity\'s universally unique identifier.',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/sites' => [
            'get' => [
                'operationId' => 'get_sites',
                'x-cli-name' => 'sites:list',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'A list of sites accessible by the user.',
                        'content' => [
                            'application/hal+json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'count' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'total' => [
                                            'type' => 'integer',
                                            'example' => 1,
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'total' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                                'limit' => [
                                                    'type' => 'integer',
                                                    'example' => 25,
                                                ],
                                                'offset' => [
                                                    'type' => 'integer',
                                                    'example' => 1,
                                                ],
                                            ],
                                        ],
                                        '_embedded' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'items' => [
                                                    'type' => 'array',
                                                    'items' => [
                                                        'type' => 'object',
                                                        'properties' => [
                                                            '_links' => [
                                                                'type' => 'object',
                                                                'properties' => [
                                                                    'self' => [
                                                                        'type' => 'object',
                                                                        'properties' => [
                                                                            'href' => [
                                                                                'type' => 'string',
                                                                                'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                                            ],
                                                                        ],
                                                                    ],
                                                                ],
                                                            ],
                                                            'id' => [
                                                                'type' => 'string',
                                                                'example' => '0ebce493-9d09-479d-a9a8-138a206fa687',
                                                            ],
                                                            'name' => [
                                                                'type' => 'string',
                                                                'example' => 'site1',
                                                            ],
                                                            'label' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1',
                                                            ],
                                                            'description' => [
                                                                'type' => 'string',
                                                                'example' => 'My Site 1 description',
                                                            ],
                                                            'codebase_id' => [
                                                                'type' => 'string',
                                                                'example' => '8765-4321',
                                                            ],
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                                'limit' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?offset=1{&limit}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'offset' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?limit=25{&offset}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'filter' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?limit=25&offset=1{&filter}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'sort' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?limit=25&offset=1{&sort}',
                                                            'format' => 'uri-template',
                                                        ],
                                                    ],
                                                ],
                                                'prev' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites?limit=25&offset=1',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    404 => [
                        'description' => 'Sites not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The sites you are trying to access does not exist, or you do not have permission to access it..',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a list of sites accessible by the user.',
                'description' => 'Retrieves a list of sites accessible by the user.',
                'parameters' => [
                    [
                        'name' => 'offset',
                        'in' => 'query',
                        'description' => 'The collection page number',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 1,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                    [
                        'name' => 'limit',
                        'in' => 'query',
                        'description' => 'The number of items per page',
                        'required' => false,
                        'deprecated' => false,
                        'allowEmptyValue' => true,
                        'schema' => [
                            'type' => 'integer',
                            'default' => 25,
                            'minimum' => 0,
                        ],
                        'style' => 'form',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
            'post' => [
                'operationId' => 'api_sites_post',
                'x-cli-name' => 'sites:create',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    201 => [
                        'description' => 'Site created successfully.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site with label:My Site 1 creation started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                        ],
                                                    ],
                                                ],
                                                'parent' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Invalid input',
                    ],
                    404 => [
                        'description' => 'Site not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The site you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Creates a site for a codebase.',
                'description' => 'Creates a site for a codebase.',
                'parameters' => [],
                'requestBody' => [
                    'description' => 'The new Site resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'site_id' => [
                                        'type' => 'string',
                                        'example' => '0ebce493-9d09-479d-a9a8-138a206fa687',
                                    ],
                                    'name' => [
                                        'type' => 'string',
                                        'example' => 'site1',
                                    ],
                                    'label' => [
                                        'type' => 'string',
                                        'example' => 'My Site 1',
                                    ],
                                    'codebase_id' => [
                                        'type' => 'string',
                                        'example' => '0ebce493-9d09-479d-a9a8-138a206fa999',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
        ],
        '/sites/{siteId}' => [
            'get' => [
                'operationId' => 'get_site_by_id',
                'x-cli-name' => 'sites:find',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    200 => [
                        'description' => 'Details about a particular site.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                        'id' => [
                                            'type' => 'string',
                                            'example' => '0ebce493-9d09-479d-a9a8-138a206fa687',
                                        ],
                                        'name' => [
                                            'type' => 'string',
                                            'example' => 'site1',
                                        ],
                                        'label' => [
                                            'type' => 'string',
                                            'example' => 'My Site 1',
                                        ],
                                        'description' => [
                                            'type' => 'string',
                                            'example' => 'My Site 1 description',
                                        ],
                                        'codebase_id' => [
                                            'type' => 'string',
                                            'example' => '8765-4321',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                    ],
                    [
                        'description' => 'Site not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The site you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Retrieves a site details by its ID.',
                'description' => 'Retrieves a site details by its ID.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
            'put' => [
                'operationId' => 'api_sites_siteId_put',
                'x-cli-name' => 'sites:update',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Site updated successfully.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site update started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    400 => [
                        'description' => 'Invalid input',
                    ],
                    403 => [
                        'description' => 'Forbidden',
                    ],
                    [
                        'description' => 'Site not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The site you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    422 => [
                        'description' => 'Unprocessable entity',
                    ],
                ],
                'summary' => 'Update a site details by its id.',
                'description' => 'Update a site details by its id.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site unique identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'requestBody' => [
                    'description' => 'The updated Site resource',
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'label' => [
                                        'type' => 'string',
                                        'example' => 'My Site 1',
                                    ],
                                    'description' => [
                                        'type' => 'string',
                                        'example' => 'This is a description of my site.',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'required' => false,
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
            'delete' => [
                'operationId' => 'api_sites_siteId_delete',
                'x-cli-name' => 'sites:delete',
                'x-prerelease' => true,
                'tags' => [],
                'responses' => [
                    202 => [
                        'description' => 'Site delete started.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'Site delete started.',
                                        ],
                                        '_links' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'self' => [
                                                    'type' => 'object',
                                                    'properties' => [
                                                        'href' => [
                                                            'type' => 'string',
                                                            'example' => 'https://cloud.acquia.com/api/sites/0ebce493-9d09-479d-a9a8-138a206fa687',
                                                        ],
                                                    ],
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    403 => [
                        'description' => 'Forbidden',
                    ],
                    [
                        'description' => 'Site not found.',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'error' => [
                                            'type' => 'string',
                                            'example' => 'not_found',
                                        ],
                                        'message' => [
                                            'type' => 'string',
                                            'example' => 'The site you are trying to access does not exist, or you do not have permission to access it.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
                'summary' => 'Deletes a site by its ID.',
                'description' => 'Deletes a site by its ID.',
                'parameters' => [
                    [
                        'name' => 'siteId',
                        'in' => 'path',
                        'description' => 'Site identifier',
                        'required' => true,
                        'deprecated' => false,
                        'allowEmptyValue' => false,
                        'schema' => [
                            'type' => 'string',
                        ],
                        'style' => 'simple',
                        'explode' => false,
                        'allowReserved' => false,
                    ],
                ],
                'deprecated' => false,
                'security' => [
                    [
                        'Site_Service_JWT' => [],
                    ],
                ],
            ],
        ],
    ],
    'components' => [
        'parameters' => [
            'Acquia_Cloud_API_Documentation_application-uuid' => [
                'name' => 'applicationUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_permission' => [
                'name' => 'permission',
                'in' => 'query',
                'description' => 'Specifies the permission you wish to check access for.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'deploy to prod',
            ],
            'Acquia_Cloud_API_Documentation_drush-version' => [
                'name' => 'version',
                'in' => 'query',
                'description' => 'Specifies the drush aliases formatting, either 8 (example.aliases.drushrc.php) or 9 (example.site.yaml)',
                'required' => true,
                'schema' => [
                    'type' => 'integer',
                    'enum' => [
                        8,
                        9,
                    ],
                ],
                'example' => 8,
            ],
            'Acquia_Cloud_API_Documentation_from' => [
                'name' => 'from',
                'in' => 'query',
                'description' => 'Specifies absolute time period to retrieve results from. Requires ISO 8601 format.'."\n"
                    ."\n"
                    .'Some examples:'."\n"
                    .'* `2023-09-01`'."\n"
                    .'* `2023-09-01T00%3A00%3A00.000Z` (`2023-09-01T00:00:00.000Z`)'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2023-09-01T00:00:00.000Z',
            ],
            'Acquia_Cloud_API_Documentation_to' => [
                'name' => 'to',
                'in' => 'query',
                'description' => 'Optionally specifies absolute time period to retrieve results until. Requires ISO 8601 format.'."\n"
                    ."\n"
                    .'Some examples:'."\n"
                    .'* `2023-09-29`'."\n"
                    .'* `2023-09-29T00%3A00%3A00.000Z` (`2023-09-29T00:00:00.000Z`)'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2023-09-29T00:00:00.000Z',
            ],
            'Acquia_Cloud_API_Documentation_sort' => [
                'name' => 'sort',
                'in' => 'query',
                'description' => 'A comma-delimited string with fields used for sorting. The order of the fields is significant. A leading - in the field indicates the field should be sorted in a descending order. Not all fields are sortable.'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'minimum' => 1,
                ],
                'example' => 'field1,-field2',
            ],
            'Acquia_Cloud_API_Documentation_filter' => [
                'name' => 'filter',
                'in' => 'query',
                'description' => 'The filters query string parameter restricts the data returned from your request. Filtered queries restrict the rows that do (or do not) get included in the result by testing each row in the result against the filters. Not all fields are filterable.'."\n"
                    ."\n"
                    .'There are eight filter operators that can be used and they must be URL encoded in order to be included. The operators are:'."\n"
                    ."\n"
                    .'* Equals: `= (%3D)`'."\n"
                    .'* Does not equal: `!= (!%3D)`'."\n"
                    .'* Greater than: `> (%3E)`'."\n"
                    .'* Less than: `< (%3C)`'."\n"
                    .'* Greater than or equal to: `>= (%3E%3D)`'."\n"
                    .'* Less than or equal to: `<= (%3C%3D)`'."\n"
                    .'* Contains substring: `=@ (%3D@)`'."\n"
                    .'* Does not contain substring: `!@ (!@)`'."\n"
                    ."\n"
                    .'Filters can be combined using `OR` and `AND` boolean logic. The `OR` operator is defined using a comma (`,`) and the `AND` operator is defined using a semi-colon (`;`).'."\n"
                    ."\n"
                    .'Some examples:'."\n"
                    .'* `filter=field%3Dvalue` (`field` equals `\'value\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch` (`field` ends with `\'partialmatch\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch,field%3Dvalue` (`field` ends with `\'partialmatch\'` OR `field` equals `\'value\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch,field%3Dvalue;field2%3C5` (`field` ends with `\'partialmatch\'` OR `field` equals `\'value\'` AND `field2` > `5`)'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'minimum' => 1,
                ],
            ],
            'Acquia_Cloud_API_Documentation_limit' => [
                'name' => 'limit',
                'in' => 'query',
                'description' => 'The maximum number of items to return.',
                'required' => false,
                'schema' => [
                    'type' => 'integer',
                ],
                'example' => 10,
            ],
            'Acquia_Cloud_API_Documentation_offset' => [
                'name' => 'offset',
                'in' => 'query',
                'description' => 'An integer to signify the offset to paginate from.',
                'required' => false,
                'schema' => [
                    'type' => 'integer',
                ],
                'example' => 10,
            ],
            'Acquia_Cloud_API_Documentation_organization-uuid' => [
                'name' => 'organizationUuid',
                'in' => 'path',
                'description' => 'The organization entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                    'minLength' => 36,
                    'maxLength' => 36,
                    'format' => 'uuid',
                ],
                'example' => '1e7efab9-0fac-4a2c-ad94-61efc78623ba',
            ],
            'Acquia_Cloud_API_Documentation_ssh-key-uuid' => [
                'name' => 'sshKeyUuid',
                'in' => 'path',
                'description' => 'The SSH key entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '981b7910-2fe9-11e9-b210-d663bd873d93',
            ],
            'Acquia_Cloud_API_Documentation_subscription-uuid' => [
                'name' => 'subscriptionUuid',
                'in' => 'path',
                'description' => 'The subscription entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '0f3ad33e-2fe4-11e9-b210-d663bd873d93',
            ],
            'Acquia_Cloud_API_Documentation_team-uuid' => [
                'name' => 'teamUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '3eef5d81-62f4-429c-aa94-e17d05ab4740',
            ],
            'Acquia_Cloud_API_Documentation_token-uuid' => [
                'name' => 'tokenUuid',
                'in' => 'path',
                'description' => 'The token entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '882f3258-2fe9-11e9-b210-d663bd873d93',
            ],
            'Acquia_Cloud_API_Documentation_token-delete-reason' => [
                'name' => 'tokenDeleteReason',
                'in' => 'query',
                'description' => 'Specifies the reason for the token revocation for future reference.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'The quick brown fox jumped over the lazy dog.',
            ],
            'Acquia_Cloud_API_Documentation_agreement-uuid' => [
                'name' => 'agreementUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_artifact-id' => [
                'name' => 'artifactId',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies an artifact.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'drupal8',
            ],
            'Acquia_Cloud_API_Documentation_name' => [
                'name' => 'name',
                'in' => 'path',
                'description' => 'A name that uniquely identifies an entity.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'drupal8',
            ],
            'Acquia_Cloud_API_Documentation_domain-registration-uuid' => [
                'name' => 'domainRegistrationUuid',
                'in' => 'path',
                'description' => 'The Domain Registration universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_configuration-set-id' => [
                'name' => 'configurationSetId',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies a configuration set.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'ABCDE-1234.12345ab6c7e8f90g12i1jk234l56mn78',
            ],
            'Acquia_Cloud_API_Documentation_tag-name' => [
                'name' => 'tagName',
                'in' => 'path',
                'description' => 'The name of the application tag.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'green',
            ],
            'Acquia_Cloud_API_Documentation_filter-usage-metrics' => [
                'name' => 'filter',
                'in' => 'query',
                'description' => 'The filters query string parameter restricts the data returned from your request. Filtered queries restrict the rows that do (or do not) get included in the result by testing each row in the result against the filters. Not all fields are filterable.'."\n"
                    ."\n"
                    .'Filter parameters include:'."\n"
                    .'* `from` - Specifies absolute time period to retrieve results from. Requires ISO 8601 format.'."\n"
                    .'* `to` - Specifies absolute time period to retrieve results until. Requires ISO 8601 format.'."\n"
                    ."\n"
                    .'Formatting examples:'."\n"
                    .'* `2023-09-01`'."\n"
                    .'* `2023-09-01T00%3A00%3A00.000Z` (`2023-09-01T00:00:00.000Z`)'."\n"
                    ."\n"
                    .'Usage examples:'."\n"
                    .'* `{endpoint}?filter=from%3D2025-04-01,to%3D2025-04-30` (`from` is `2025-04-01` and `to` is `2025-04-30`)'."\n"
                    .'* `{endpoint}?filter=from%3D2025-04-01T00:00:00.000Z,to%3D2025-04-30T23:59:59.000Z` (`from` is `2025-04-01T00:00:00.000Z` and `to` is `2025-04-30T23:59:59.000Z`)'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'minimum' => 1,
                ],
            ],
            'Acquia_Cloud_API_Documentation_resolution' => [
                'name' => 'resolution',
                'in' => 'query',
                'description' => 'Specifies the data granularity of the request. Available resolutions: minute, hour, day, week or month.'."\n"
                    ."\n"
                    .'Limits:'."\n"
                    .'- 3 hour limit for “minute” resolution'."\n"
                    .'- 1 week limit for “hour” resolution'."\n"
                    .'- 6 month limit for “day” resolution'."\n"
                    .'- 1 year limit for "week" resolution'."\n"
                    .'- 3 year limit for “month” resolution'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'enum' => [
                        'minute',
                        'hour',
                        'day',
                        'week',
                        'month',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_usage-metric' => [
                'name' => 'usageMetric',
                'in' => 'path',
                'description' => 'A usage data metric type.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'views',
            ],
            'Acquia_Cloud_API_Documentation_environment-id' => [
                'name' => 'environmentId',
                'in' => 'path',
                'description' => 'The environment identifier. The identifier is a compound key consisting of the internal database ID of the environment and the application UUID.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '12-d314739e-296f-11e9-b210-d663bd873d93',
            ],
            'Acquia_Cloud_API_Documentation_cron-id' => [
                'name' => 'cronId',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies a cron job.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'e10a665c-c9ec-4422-a82b-b32c82329f9d',
            ],
            'Acquia_Cloud_API_Documentation_database-name' => [
                'name' => 'databaseName',
                'in' => 'path',
                'required' => true,
                'description' => 'The database name, typically lower snake case.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'my_db',
            ],
            'Acquia_Cloud_API_Documentation_deprecated-from' => [
                'name' => 'from',
                'in' => 'query',
                'description' => '(Use filter `from` instead.) Specifies an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) formatted date. Used in conjunction with `to` query.',
                'deprecated' => true,
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2019-10-01T00:00:00.000Z',
            ],
            'Acquia_Cloud_API_Documentation_deprecated-to' => [
                'name' => 'to',
                'in' => 'query',
                'description' => '(Use filter `to` instead.) Specifies an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) formatted date. Used in conjunction with `from` query.',
                'deprecated' => true,
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2020-01-01T00:00:00.000Z',
            ],
            'Acquia_Cloud_API_Documentation_backup-id' => [
                'name' => 'backupId',
                'in' => 'path',
                'required' => true,
                'description' => 'The database backup identifier.',
                'schema' => [
                    'type' => 'integer',
                ],
                'example' => 1,
            ],
            'Acquia_Cloud_API_Documentation_domain' => [
                'name' => 'domain',
                'in' => 'path',
                'description' => 'A domain name.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'example.com',
            ],
            'Acquia_Cloud_API_Documentation_log-type' => [
                'name' => 'logType',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies a log type.',
                'schema' => [
                    'type' => 'string',
                    'enum' => [
                        'apache-access',
                        'apache-error',
                        'drupal-request',
                        'drupal-watchdog',
                        'fpm-access',
                        'fpm-error',
                        'php-error',
                        'cloud-hook',
                        'cronjob',
                        'mysql-slow-query',
                    ],
                ],
                'example' => 'php-error',
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid' => [
                'name' => 'logForwardingDestinationUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'dbd8a966-2b25-11e9-b210-d663bd873d93',
            ],
            'Acquia_Cloud_API_Documentation_filter-stack-metrics' => [
                'name' => 'filter',
                'in' => 'query',
                'description' => 'The filters query string parameter restricts the data returned from your request. Filtered queries restrict the rows that do (or do not) get included in the result by testing each row in the result against the filters. Not all fields are filterable.'."\n"
                    ."\n"
                    .'There are eight filter operators that can be used and they must be URL encoded in order to be included. The operators are:'."\n"
                    ."\n"
                    .'* Equals: `= (%3D)`'."\n"
                    .'* Does not equal: `!= (!%3D)`'."\n"
                    .'* Greater than: `> (%3E)`'."\n"
                    .'* Less than: `< (%3C)`'."\n"
                    .'* Greater than or equal to: `>= (%3E%3D)`'."\n"
                    .'* Less than or equal to: `<= (%3C%3D)`'."\n"
                    .'* Contains substring: `=@ (%3D@)`'."\n"
                    .'* Does not contain substring: `!@ (!@)`'."\n"
                    ."\n"
                    .'Filters can be combined using `OR` and `AND` boolean logic. The `OR` operator is defined using a comma (`,`) and the `AND` operator is defined using a semi-colon (`;`).'."\n"
                    ."\n"
                    .'Some examples:'."\n"
                    .'* `filter=field%3Dvalue` (`field` equals `\'value\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch` (`field` ends with `\'partialmatch\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch,field%3Dvalue` (`field` ends with `\'partialmatch\'` OR `field` equals `\'value\'`)'."\n"
                    .'* `filter=field%3D@*partialmatch,field%3Dvalue;field2%3C5` (`field` ends with `\'partialmatch\'` OR `field` equals `\'value\'` AND `field2` > `5`)'."\n"
                    ."\n"
                    .'**For this endpoint, the "metric" filter is required. Multiple metrics can be returned in one request. The following metrics are available:**'."\n"
                    ."\n"
                    .'* apache-requests, bal-cpu, bal-memory, cron-memory, db-cpu, db-disk-size, db-disk-usage, db-memory, file-disk-size, file-cpu, file-disk-usage, file-memory, http-2xx, http-3xx, http-4xx, http-5xx, mysql-slow-query-count, nginx-requests, out-of-memory, php-proc-max-reached-site, php-proc-max-reached-total, php-proc-site, php-proc-total, varnish-cache-hit-rate, varnish-requests, web-cpu, web-memory'."\n",
                'required' => true,
                'schema' => [
                    'type' => 'string',
                    'minimum' => 1,
                ],
            ],
            'Acquia_Cloud_API_Documentation_from-stack-metrics' => [
                'name' => 'from',
                'in' => 'query',
                'description' => 'An ISO-8601 formatted date retrieve metrics from.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2021-01-29T22:45:21.000Z',
            ],
            'Acquia_Cloud_API_Documentation_to-no-default' => [
                'name' => 'to',
                'in' => 'query',
                'description' => 'An ISO-8601 formatted date retrieve results to.',
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2021-01-29T23:55:21.000Z',
            ],
            'Acquia_Cloud_API_Documentation_index-id' => [
                'name' => 'indexId',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies an index.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'ABCDE-1234.test.example',
            ],
            'Acquia_Cloud_API_Documentation_server-id' => [
                'name' => 'serverId',
                'in' => 'path',
                'required' => true,
                'description' => 'The internal database identifier of the server.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '42',
            ],
            'Acquia_Cloud_API_Documentation_certificate-id' => [
                'name' => 'certificateId',
                'in' => 'path',
                'required' => true,
                'description' => 'An ID that uniquely identifies a certificate.',
                'schema' => [
                    'type' => 'integer',
                ],
                'example' => 7,
            ],
            'Acquia_Cloud_API_Documentation_environment-variable-name' => [
                'name' => 'environmentVariableName',
                'in' => 'path',
                'description' => 'The environment variable name.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                    'minLength' => 1,
                    'maxLength' => 255,
                    'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                ],
                'example' => 'EXAMPLE_VARIABLE_NAME',
            ],
            'Acquia_Cloud_API_Documentation_ide-uuid' => [
                'name' => 'ideUuid',
                'in' => 'path',
                'description' => 'The Cloud IDE universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_identity-provider-uuid' => [
                'name' => 'identityProviderUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_token' => [
                'name' => 'token',
                'in' => 'path',
                'description' => 'The token identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
            ],
            'Acquia_Cloud_API_Documentation_message-uuid' => [
                'name' => 'messageUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_notification-uuid' => [
                'name' => 'notificationUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                    'format' => 'uuid',
                ],
                'example' => '2343b683-b194-4217-982a-6a95c72ad9a8',
            ],
            'Acquia_Cloud_API_Documentation_user-uuid' => [
                'name' => 'userUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'f2daa9cc-e5a0-4036-a5c8-f96e336c62b5',
            ],
            'Acquia_Cloud_API_Documentation_range' => [
                'name' => 'range',
                'in' => 'query',
                'description' => 'ISO-8601 date/time of invite create date/time.',
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'format' => 'date-time',
                ],
            ],
            'Acquia_Cloud_API_Documentation_role-uuid' => [
                'name' => 'roleUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_apm-type' => [
                'name' => 'apmType',
                'in' => 'path',
                'required' => true,
                'description' => 'The APM type.',
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'newrelic',
            ],
            'Acquia_Cloud_API_Documentation_shield-acl-uuid' => [
                'name' => 'shieldAclUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'a1234567-1234-123a-abc1-12ab345cd678',
            ],
            'Acquia_Cloud_API_Documentation_user-search' => [
                'name' => 'userSearch',
                'in' => 'query',
                'description' => 'The user\'s username, email, name, or token. This can be a partial match.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'john doe',
            ],
            'Acquia_Cloud_API_Documentation_server-type' => [
                'name' => 'serverType',
                'in' => 'query',
                'description' => 'Specifies the type of server metric to retrieve.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                    'enum' => [
                        'web',
                        'bal',
                        'db',
                    ],
                ],
                'example' => 'web',
            ],
            'Acquia_Cloud_API_Documentation_site-id' => [
                'name' => 'siteId',
                'in' => 'path',
                'description' => 'The site id',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '1938d81b-4b14-462d-9871-5f8a32eb59b3',
            ],
            'Acquia_Cloud_API_Documentation_stack-metrics-metric-type' => [
                'name' => 'stackMetricsMetricType',
                'in' => 'path',
                'description' => 'Specifies the type of StackMetrics metric to retrieve.',
                'required' => true,
                'schema' => [
                    'type' => 'array',
                    'items' => [
                        'type' => 'string',
                        'enum' => [
                            'apache-requests',
                            'bal-cpu',
                            'bal-memory',
                            'cron-memory',
                            'db-cpu',
                            'db-disk-size',
                            'db-disk-usage',
                            'db-memory',
                            'file-disk-size',
                            'file-cpu',
                            'file-disk-usage',
                            'file-memory',
                            'http-2xx',
                            'http-3xx',
                            'http-4xx',
                            'http-5xx',
                            'mysql-slow-query-count',
                            'nginx-requests',
                            'out-of-memory',
                            'php-proc-max-reached-site',
                            'php-proc-max-reached-total',
                            'php-proc-site',
                            'php-proc-total',
                            'varnish-cache-hit-rate',
                            'varnish-requests',
                            'web-cpu',
                            'web-memory',
                        ],
                    ],
                ],
                'example' => [
                    'web-cpu',
                    'web-memory',
                ],
            ],
            'Acquia_Cloud_API_Documentation_alert-uuid' => [
                'name' => 'alertUuid',
                'in' => 'path',
                'description' => 'The entity\'s universally unique identifier.',
                'required' => true,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => 'da1c0a8e-ff69-45db-88fc-acd6d2affbb7',
            ],
            'Acquia_Cloud_API_Documentation_from-no-default' => [
                'name' => 'from',
                'in' => 'query',
                'description' => 'An ISO-8601 formatted date retrieve results from.',
                'required' => false,
                'schema' => [
                    'type' => 'string',
                ],
                'example' => '2021-01-29T22:45:21.000Z',
            ],
            'Acquia_Cloud_API_Documentation_ApmType' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_apm-type',
            ],
            'Acquia_Cloud_API_Documentation_ArtifactId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_artifact-id',
            ],
            'Acquia_Cloud_API_Documentation_BackupId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_backup-id',
            ],
            'Acquia_Cloud_API_Documentation_CertificateId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_certificate-id',
            ],
            'Acquia_Cloud_API_Documentation_ConfigurationSetId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_configuration-set-id',
            ],
            'Acquia_Cloud_API_Documentation_CronId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_cron-id',
            ],
            'Acquia_Cloud_API_Documentation_DatabaseName' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_database-name',
            ],
            'Acquia_Cloud_API_Documentation_Domain' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain',
            ],
            'Acquia_Cloud_API_Documentation_DomainRegistrationUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_domain-registration-uuid',
            ],
            'Acquia_Cloud_API_Documentation_DrushVersion' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_drush-version',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-id',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentVariableName' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_environment-variable-name',
            ],
            'Acquia_Cloud_API_Documentation_IndexId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_index-id',
            ],
            'Acquia_Cloud_API_Documentation_LogType' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-type',
            ],
            'Acquia_Cloud_API_Documentation_Name' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_name',
            ],
            'Acquia_Cloud_API_Documentation_Permission' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_permission',
            ],
            'Acquia_Cloud_API_Documentation_ServerId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-id',
            ],
            'Acquia_Cloud_API_Documentation_ServerType' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_server-type',
            ],
            'Acquia_Cloud_API_Documentation_SiteId' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_site-id',
            ],
            'Acquia_Cloud_API_Documentation_StackMetricsMetricType' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_stack-metrics-metric-type',
            ],
            'Acquia_Cloud_API_Documentation_TagName' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_tag-name',
            ],
            'Acquia_Cloud_API_Documentation_TokenDeleteReason' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token-delete-reason',
            ],
            'Acquia_Cloud_API_Documentation_UsageMetric' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_usage-metric',
            ],
            'Acquia_Cloud_API_Documentation_UserSearch' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-search',
            ],
            'Acquia_Cloud_API_Documentation_AgreementUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_agreement-uuid',
            ],
            'Acquia_Cloud_API_Documentation_AlertUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_alert-uuid',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_application-uuid',
            ],
            'Acquia_Cloud_API_Documentation_IdentityProviderUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_identity-provider-uuid',
            ],
            'Acquia_Cloud_API_Documentation_IdeUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ide-uuid',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingDestinationUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_log-forwarding-destination-uuid',
            ],
            'Acquia_Cloud_API_Documentation_MessageUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_message-uuid',
            ],
            'Acquia_Cloud_API_Documentation_NotificationUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_notification-uuid',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_organization-uuid',
            ],
            'Acquia_Cloud_API_Documentation_RoleUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_role-uuid',
            ],
            'Acquia_Cloud_API_Documentation_ShieldAclUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_shield-acl-uuid',
            ],
            'Acquia_Cloud_API_Documentation_SshKeyUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_ssh-key-uuid',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_subscription-uuid',
            ],
            'Acquia_Cloud_API_Documentation_TeamUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_team-uuid',
            ],
            'Acquia_Cloud_API_Documentation_TokenUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token-uuid',
            ],
            'Acquia_Cloud_API_Documentation_UserUuid' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_user-uuid',
            ],
            'Acquia_Cloud_API_Documentation_DeprecatedFrom' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_deprecated-from',
            ],
            'Acquia_Cloud_API_Documentation_DeprecatedTo' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_deprecated-to',
            ],
            'Acquia_Cloud_API_Documentation_From' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from',
            ],
            'Acquia_Cloud_API_Documentation_FromNoDefault' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from-no-default',
            ],
            'Acquia_Cloud_API_Documentation_FromStackMetrics' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_from-stack-metrics',
            ],
            'Acquia_Cloud_API_Documentation_To' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to',
            ],
            'Acquia_Cloud_API_Documentation_ToNoDefault' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_to-no-default',
            ],
            'Acquia_Cloud_API_Documentation_Sort' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_sort',
            ],
            'Acquia_Cloud_API_Documentation_Filter' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter',
            ],
            'Acquia_Cloud_API_Documentation_FilterStackMetrics' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-stack-metrics',
            ],
            'Acquia_Cloud_API_Documentation_FilterUsageMetrics' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_filter-usage-metrics',
            ],
            'Acquia_Cloud_API_Documentation_Limit' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_limit',
            ],
            'Acquia_Cloud_API_Documentation_Offset' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_offset',
            ],
            'Acquia_Cloud_API_Documentation_Range' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_range',
            ],
            'Acquia_Cloud_API_Documentation_Token' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_token',
            ],
            'Acquia_Cloud_API_Documentation_Resolution' => [
                '$ref' => '#/components/parameters/Acquia_Cloud_API_Documentation_resolution',
            ],
            'Private_Network_Service_API_Limit' => [
                'name' => 'limit',
                'in' => 'query',
                'description' => 'The maximum number of items to return per page.',
                'required' => false,
                'schema' => [
                    'type' => 'integer',
                    'minimum' => 1,
                    'example' => 10,
                ],
            ],
            'Private_Network_Service_API_Offset' => [
                'name' => 'offset',
                'in' => 'query',
                'description' => 'The number of items to skip before starting to collect the result set.',
                'required' => false,
                'schema' => [
                    'type' => 'integer',
                    'minimum' => 0,
                    'example' => 20,
                ],
            ],
            'Private_Network_Service_API_Sort' => [
                'name' => 'sort',
                'in' => 'query',
                'description' => 'Sort the result set by one or more fields.'."\n"
                    ."\n"
                    .'**Format:** `field1,field2,-field3`'."\n"
                    ."\n"
                    .'**Sort order:**'."\n"
                    .'- No prefix - Ascending order (default)'."\n"
                    .'- `-` prefix - Descending order'."\n"
                    ."\n"
                    .'**Multiple fields:**'."\n"
                    .'- Fields are processed in the order specified'."\n"
                    .'- First field has highest priority'."\n"
                    .'- Use comma to separate multiple fields'."\n"
                    ."\n"
                    .'**Examples:**'."\n"
                    .'- `name` - Sort by name in ascending order'."\n"
                    .'- `-created_at` - Sort by created_at in descending order'."\n"
                    .'- `name,-created_at` - Sort by name ascending, then created_at descending'."\n"
                    .'- `status,name,-updated_at` - Sort by status ascending, then name ascending, then updated_at descending'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'pattern' => '^(-?[a-zA-Z0-9_]+)(,-?[a-zA-Z0-9_]+)*$',
                ],
                'example' => 'name,-created_at',
            ],
            'Private_Network_Service_API_Filter' => [
                'name' => 'filter',
                'in' => 'query',
                'description' => 'Filter the result set using field-based criteria.'."\n"
                    ."\n"
                    .'**Format:** `field:value` or `field:operator:value`'."\n"
                    ."\n"
                    .'**Logical operators:**'."\n"
                    .'- `,` (comma) - OR logic between filters'."\n"
                    .'- `;` (semicolon) - AND logic between filters'."\n"
                    .'- **Note:** Cannot mix OR and AND operators in the same query'."\n"
                    ."\n"
                    .'**Comparison operators:**'."\n"
                    .'- `=` - Equals (default if no operator specified)'."\n"
                    .'- `!=` - Does not equal'."\n"
                    .'- `>` - Greater than'."\n"
                    .'- `<` - Less than'."\n"
                    .'- `>=` - Greater than or equal to'."\n"
                    .'- `<=` - Less than or equal to'."\n"
                    .'- `=@` - Contains substring'."\n"
                    .'- `!@` - Does not contain substring'."\n"
                    ."\n"
                    .'**Wildcards:**'."\n"
                    .'- `*` - Wildcard character for pattern matching'."\n"
                    ."\n"
                    .'**Examples:**'."\n"
                    .'- `status=active` - Filter by status equals active'."\n"
                    .'- `name=@prod` - Filter by name containing "prod"'."\n"
                    .'- `status=active;type=standard` - Status is active AND type is standard'."\n"
                    .'- `status=active,status=pending` - Status is active OR pending'."\n",
                'required' => false,
                'schema' => [
                    'type' => 'string',
                    'pattern' => '^([a-zA-Z0-9_]+:(?:[a-zA-Z0-9_\\-*]+|[><!@=%3D%3E%3C%3D@!%3D@]+)+)([;,][a-zA-Z0-9_]+:(?:[a-zA-Z0-9_\\-*]+|[><!@=%3D%3E%3C%3D@!%3D@]+)+)*$',
                ],
                'example' => 'status:active;type:standard',
            ],
            'Private_Network_Service_API_PrivateNetworkId' => [
                'name' => 'privateNetworkId',
                'in' => 'path',
                'required' => true,
                'description' => 'ID of the private network',
                'schema' => [
                    'type' => 'string',
                ],
            ],
            'Private_Network_Service_API_VpnId' => [
                'name' => 'vpnId',
                'in' => 'path',
                'required' => true,
                'description' => 'ID of the VPN',
                'schema' => [
                    'type' => 'integer',
                ],
            ],
            'Private_Network_Service_API_VpcPeerId' => [
                'name' => 'vpcPeerId',
                'in' => 'path',
                'required' => true,
                'description' => 'ID of the VPC Peer',
                'schema' => [
                    'type' => 'integer',
                ],
            ],
            'Private_Network_Service_API_SubscriptionId' => [
                'name' => 'subscriptionId',
                'in' => 'path',
                'required' => true,
                'description' => 'ID of the subscription',
                'schema' => [
                    'type' => 'string',
                ],
            ],
        ],
        'schemas' => [
            'Acquia_Cloud_API_Documentation_links' => [
                'type' => 'object',
                'required' => [
                    'self',
                ],
                'description' => 'HAL links about the current resource.',
                'properties' => [
                    'self' => [
                        'type' => 'object',
                        'description' => 'A link to this page.',
                        'required' => [
                            'href',
                        ],
                        'properties' => [
                            'href' => [
                                'type' => 'string',
                                'format' => 'uri',
                                'description' => 'The URI for this page.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_root' => [
                'type' => 'object',
                'required' => [
                    'status',
                    '_links',
                ],
                'properties' => [
                    'status' => [
                        'type' => 'object',
                        'description' => 'The current status of various systems.',
                        'properties' => [
                            'configuration' => [
                                'type' => 'boolean',
                                'description' => 'The current configuration system status.',
                            ],
                            'registry' => [
                                'type' => 'boolean',
                                'description' => 'The current registry system status.',
                            ],
                            'acp_provisioning_enabled' => [
                                'type' => 'boolean',
                                'description' => 'Whether Acquia Cloud Professional provisioning is currently enabled.',
                            ],
                            'acf_provisioning_enabled' => [
                                'type' => 'boolean',
                                'description' => 'Whether Acquia Cloud Free provisioning is currently enabled.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_user-flags' => [
                'type' => 'object',
                'description' => 'The various flags for the user.',
                'properties' => [
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this user is active.',
                    ],
                    'tfa' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this user has TFA enabled.',
                    ],
                    'support' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this user is a member of Acquia support.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_user' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'name',
                    'first_name',
                    'last_name',
                    'last_login_at',
                    'created_at',
                    'mail',
                    'phone',
                    'job_title',
                    'job_function',
                    'company',
                    'country',
                    'timezone',
                    'picture_url',
                    'flags',
                    '_links',
                ],
                'description' => 'The response for a user object.',
                'properties' => [
                    'id' => [
                        'deprecated' => true,
                        'type' => 'integer',
                        'description' => 'The internal database ID (uid) of the user.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID for the user.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The user name.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The first name of the user.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The last name of the user.',
                    ],
                    'last_login_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date/time of the last login for the user.',
                        'nullable' => true,
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date/time when the user was created.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The e-mail address of the user.',
                    ],
                    'phone' => [
                        'type' => 'object',
                        'description' => 'The telephone numbers for the user.',
                        'properties' => [
                            'office' => [
                                'type' => 'string',
                                'description' => 'The office telephone number for the user.',
                                'nullable' => true,
                            ],
                            'tfa' => [
                                'type' => 'string',
                                'description' => 'The tfa backup telephone number for the user.',
                                'nullable' => true,
                            ],
                        ],
                    ],
                    'job_title' => [
                        'type' => 'string',
                        'description' => 'The job title of the user.',
                    ],
                    'job_function' => [
                        'type' => 'string',
                        'description' => 'The job function of the user.',
                        'enum' => [
                            '--',
                            'Business Executive',
                            'IT Executive',
                            'IT Architect or IT Operations',
                            'Product or Digital Marketing',
                            'Website Design or Development',
                        ],
                    ],
                    'company' => [
                        'type' => 'string',
                        'description' => 'The company of the user.',
                    ],
                    'country' => [
                        'type' => 'string',
                        'description' => 'The country of the user.',
                        'enum' => [
                            '--',
                            'United States',
                            'Afghanistan',
                            'Albania',
                            'Algeria',
                            'American Samoa',
                            'Andorra',
                            'Angola',
                            'Anguilla',
                            'Antigua and Barbuda',
                            'Argentina',
                            'Armenia',
                            'Ascension Island',
                            'Australia',
                            'Austria',
                            'Azerbaijan',
                            'Bahamas',
                            'Bahrain',
                            'Bangladesh',
                            'Barbados',
                            'Belarus',
                            'Belgium',
                            'Belize',
                            'Benin',
                            'Bermuda',
                            'Bhutan',
                            'Bolivia',
                            'Bosnia and Herzegovina',
                            'Botswana',
                            'Brazil',
                            'British Indian Ocean Territory',
                            'Brunei Darussalam',
                            'Bulgaria',
                            'Burkina Faso',
                            'Burundi',
                            'Cambodia',
                            'Cameroon',
                            'Canada',
                            'Cape Verde',
                            'Cayman Islands',
                            'Central African Republic',
                            'Chad',
                            'Chile',
                            'China',
                            'Colombia',
                            'Comoros',
                            'Congo',
                            'Cook Islands',
                            'Costa Rica',
                            'Cote D Ivoire',
                            'Croatia',
                            'Cuba',
                            'Cyprus',
                            'Czech Republic',
                            'Denmark',
                            'Djibouti',
                            'Dominica',
                            'Dominican Republic',
                            'Ecuador',
                            'Egypt',
                            'El Salvador',
                            'Equatorial Guinea',
                            'Eritrea',
                            'Estonia',
                            'Ethiopia',
                            'Falkland Islands',
                            'Faroe Islands',
                            'Federated States of Micronesia',
                            'Fiji',
                            'Finland',
                            'France',
                            'French Guiana',
                            'French Polynesia',
                            'Gabon',
                            'Georgia',
                            'Germany',
                            'Ghana',
                            'Greece',
                            'Greenland',
                            'Grenada',
                            'Guadeloupe',
                            'Guatemala',
                            'Guam',
                            'Guinea',
                            'Guinea Bissau',
                            'Guyana',
                            'Haiti',
                            'Holy See (Vatican City)',
                            'Honduras',
                            'Hong Kong',
                            'Hungary',
                            'Iceland',
                            'India',
                            'Indonesia',
                            'Iran',
                            'Ireland',
                            'Isle of Man',
                            'Israel',
                            'Italy',
                            'Jamaica',
                            'Japan',
                            'Jordan',
                            'Kazakhstan',
                            'Kenya',
                            'Kiribati',
                            'Korea',
                            'Kuwait',
                            'Kyrgyzstan',
                            'Laos',
                            'Latvia',
                            'Lebanon',
                            'Lesotho',
                            'Liberia',
                            'Libya',
                            'Liechtenstein',
                            'Lithuania',
                            'Luxembourg',
                            'Macau',
                            'Macedonia',
                            'Madagascar',
                            'Malawi',
                            'Malaysia',
                            'Maldives',
                            'Mali',
                            'Malta',
                            'Marshall Islands',
                            'Martinique',
                            'Mauritius',
                            'Mayotte',
                            'Mexico',
                            'Moldova',
                            'Monaco',
                            'Mongolia',
                            'Montenegro',
                            'Montserrat',
                            'Morocco',
                            'Mozambique',
                            'Myanmar',
                            'Namibia',
                            'Nauru',
                            'Nepal',
                            'Netherlands',
                            'Netherlands Antilles',
                            'New Caledonia',
                            'New Zealand',
                            'Nicaragua',
                            'Niger',
                            'Nigeria',
                            'Niue',
                            'Norfolk Island',
                            'Northern Mariana Islands',
                            'Norway',
                            'Oman',
                            'Pakistan',
                            'Palau',
                            'Palestine',
                            'Panama',
                            'Papua New Guinea',
                            'Paraguay',
                            'Peru',
                            'Philippines',
                            'Pitcairn',
                            'Poland',
                            'Portugal',
                            'Puerto Rico',
                            'Qatar',
                            'Reunion',
                            'Romania',
                            'Russian Federation',
                            'Rwanda',
                            'Saint Vincent and the Grenadines',
                            'San Marino',
                            'Sao Tome and Principe',
                            'Saudi Arabia',
                            'Senegal',
                            'Serbia',
                            'Seychelles',
                            'Sierra Leone',
                            'Singapore',
                            'Slovakia',
                            'Slovenia',
                            'Solomon Islands',
                            'Somalia',
                            'South Africa',
                            'South Georgia',
                            'Spain',
                            'Sri Lanka',
                            'St. Kitts and Nevis',
                            'St. Lucia',
                            'St. Pierre and Miquelon',
                            'Sudan',
                            'Suriname',
                            'Swaziland',
                            'Sweden',
                            'Switzerland',
                            'Syrian Arab Republic',
                            'Taiwan',
                            'Tajikistan',
                            'Tanzania',
                            'Thailand',
                            'The Gambia',
                            'Togo',
                            'Tokelau',
                            'Tonga',
                            'Trinidad and Tobago',
                            'Tunisia',
                            'Turkey',
                            'Turkmenistan',
                            'Turks and Caicos Islands',
                            'Tuvalu',
                            'Uganda',
                            'Ukraine',
                            'United Arab Emirates',
                            'United Kingdom',
                            'Uruguay',
                            'Uzbekistan',
                            'Vanuatu',
                            'Venezuela',
                            'Viet Nam',
                            'Virgin Islands',
                            'Western Samoa',
                            'Yemen',
                            'Yugoslavia',
                            'Zaire',
                            'Zambia',
                            'Zimbabwe',
                        ],
                    ],
                    'state' => [
                        'type' => 'string',
                        'description' => 'The state of the user, if in the United States.',
                        'enum' => [
                            'Alabama',
                            'Alaska',
                            'American Samoa',
                            'Arizona',
                            'Arkansas',
                            'California',
                            'Colorado',
                            'Connecticut',
                            'Delaware',
                            'District of Columbia',
                            'Florida',
                            'Georgia',
                            'Hawaii',
                            'Idaho',
                            'Illinois',
                            'Indiana',
                            'Iowa',
                            'Kansas',
                            'Kentucky',
                            'Louisiana',
                            'Maine',
                            'Maryland',
                            'Massachusetts',
                            'Michigan',
                            'Minnesota',
                            'Mississippi',
                            'Missouri',
                            'Montana',
                            'Nebraska',
                            'Nevada',
                            'New Hampshire',
                            'New Jersey',
                            'New Mexico',
                            'New York',
                            'North Carolina',
                            'North Dakota',
                            'Northern Mariana Islands',
                            'Ohio',
                            'Oklahoma',
                            'Oregon',
                            'Pennsylvania',
                            'Rhode Island',
                            'South Carolina',
                            'South Dakota',
                            'Tennessee',
                            'Texas',
                            'U.S. Virgin Islands',
                            'Utah',
                            'Vermont',
                            'Virginia',
                            'Washington',
                            'West Virginia',
                            'Wisconsin',
                            'Wyoming',
                        ],
                    ],
                    'timezone' => [
                        'type' => 'string',
                        'description' => 'The timezone of the user.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The user\'s picture url.',
                    ],
                    'features' => [
                        'deprecated' => true,
                        'type' => 'array',
                        'description' => 'The various feature flags for the user.',
                        'items' => [
                            'type' => 'string',
                            'enum' => [
                                'ci-pipelines',
                                'n3-disabled',
                                'n3-hybrid-mode',
                                'on-demand-environments',
                                'php7',
                                'php71',
                                'platform',
                            ],
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-flags',
                    ],
                    'metadata' => [
                        'deprecated' => true,
                        'type' => 'object',
                        'description' => 'Metadata related to the user.',
                        'properties' => [
                            'applications' => [
                                'type' => 'object',
                                'description' => 'An array of application metadata for the user.',
                                'properties' => [
                                    'recent' => [
                                        'type' => 'array',
                                        'description' => 'An array containing recent visited application information.',
                                        'items' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'uuid' => [
                                                    'type' => 'string',
                                                    'format' => 'uuid',
                                                    'description' => 'The application UUID.',
                                                ],
                                                'recent_at' => [
                                                    'type' => 'string',
                                                    'format' => 'date-time',
                                                    'description' => 'The date-time when the application was accessed.',
                                                ],
                                            ],
                                        ],
                                    ],
                                    'starred' => [
                                        'type' => 'array',
                                        'description' => 'An array containing starred application UUIDs.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_error' => [
                'type' => 'object',
                'required' => [
                    'error',
                    'message',
                ],
                'properties' => [
                    'error' => [
                        'type' => 'string',
                        'description' => 'The error summary.',
                    ],
                    'message' => [
                        'type' => 'string',
                        'description' => 'The long description for the returned error.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_has-permission' => [
                'type' => 'object',
                'description' => 'Determines if a user account has a specific permission.',
                'required' => [
                    'access',
                    '_links',
                ],
                'properties' => [
                    'access' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not the user account has the specific permission.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_is-administrator' => [
                'type' => 'object',
                'required' => [
                    'admin',
                    '_links',
                ],
                'description' => 'Determines if a user account is an administrator.',
                'properties' => [
                    'admin' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not the user account is an administrator.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_is-owner' => [
                'type' => 'object',
                'required' => [
                    'owner',
                    '_links',
                ],
                'description' => 'Determines if a user account is an owner.',
                'properties' => [
                    'owner' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not the user account is an owner.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_message' => [
                'type' => 'object',
                'required' => [
                    'message',
                ],
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'description' => 'A simple message returned from the response.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_file' => [
                'type' => 'string',
                'description' => 'A binary file response.',
                'format' => 'binary',
            ],
            'Acquia_Cloud_API_Documentation_user-profile' => [
                'type' => 'object',
                'description' => 'A user profile.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'last_login_at',
                    'created_at',
                    'email',
                    'picture_url',
                    'username',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'last_login_at' => [
                        'deprecated' => true,
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date/time of the last login for the user.',
                        'nullable' => true,
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date the user was created.',
                    ],
                    'email' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URL for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ide' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'label',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The unique identifier of the Cloud IDE.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-friendly label of the Cloud IDE.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The current provisioning status of the Cloud IDE.',
                        'enum' => [
                            'active',
                            'provisioning',
                            'deleting',
                            'updating',
                            'provision-failed',
                            'update-failed',
                            'delete-failed',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'properties' => [
                            'owner' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-profile',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ides' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Cloud IDEs matching the request parameters.',
                        'required' => [
                            'items',
                        ],
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ide',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_invite-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags providing more context for the Invite response object.',
                'properties' => [
                    'declined' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_user-stub' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'picture_url',
                    'username',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URI for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-stub' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'name',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The organization\'s UUID.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The human-readable organization name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team-stub' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'name',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The team unique identifier.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The team name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-stub' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'uuid',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the application.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The application UUID.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_role-stub' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'name',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The role unique identifier.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The role name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_invite' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'email',
                    'created_at',
                    'token',
                    'flags',
                    'author',
                    '_links',
                ],
                'description' => 'Details an invite.',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The unique identifier of the Invite.',
                        'format' => 'uuid',
                    ],
                    'email' => [
                        'type' => 'string',
                        'description' => 'The invitee email address.',
                        'format' => 'email',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'description' => 'The invite creation time.',
                        'format' => 'date-time',
                    ],
                    'token' => [
                        'type' => 'string',
                        'description' => 'The invite token.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite-flags',
                    ],
                    'author' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    'team' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-stub',
                    ],
                    'applications' => [
                        'type' => 'array',
                        'description' => 'List of applications the invite will grant the invitee.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-stub',
                        ],
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'List of roles the invite will grant the invitee.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role-stub',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_account-invites' => [
                'type' => 'object',
                'description' => 'A collection of invites.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of invites matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ux-message-filters' => [
                'type' => 'object',
                'description' => 'Defines where a message should appear.',
                'properties' => [
                    'paths' => [
                        'type' => 'array',
                        'description' => 'Collection of paths.',
                        'items' => [
                            'type' => 'string',
                            'description' => 'Paths where a message should appear.',
                        ],
                    ],
                    'display_mode' => [
                        'type' => 'string',
                        'description' => 'How the message should be displayed.',
                        'enum' => [
                            'bar',
                            'list',
                        ],
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The message type.',
                        'enum' => [
                            'alert',
                            'general',
                            'new',
                            'warning',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ux-message-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags associated with a message.',
                'properties' => [
                    'dismissed' => [
                        'type' => 'boolean',
                    ],
                    'dismissible' => [
                        'type' => 'boolean',
                    ],
                    'active' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ux-message' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'uuid',
                    'title',
                    'body',
                    'url',
                    'filters',
                    'flags',
                    'weight',
                    'start_at',
                    'expire_at',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The message identifier.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The message unique identifier.',
                        'format' => 'uuid',
                    ],
                    'title' => [
                        'type' => 'string',
                        'description' => 'The message title.',
                    ],
                    'body' => [
                        'type' => 'string',
                        'description' => 'The message body.',
                        'nullable' => true,
                    ],
                    'url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The message url.',
                        'nullable' => true,
                    ],
                    'filters' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message-filters',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message-flags',
                    ],
                    'weight' => [
                        'type' => 'integer',
                        'description' => 'The message priority weight.',
                    ],
                    'start_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The UTC timestamp of when the message started.',
                    ],
                    'expire_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The UTC timestamp of when the message expires.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ux-messages' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of application messages matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_password' => [
                'type' => 'object',
                'required' => [
                    'password',
                ],
                'description' => 'Describes the request body for a password.',
                'properties' => [
                    'password' => [
                        'type' => 'string',
                        'description' => 'The password to verify.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_password-validation' => [
                'type' => 'object',
                'description' => 'The password validation response.',
                'properties' => [
                    'valid' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not the password is valid.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ssh-key' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'label',
                    'public_key',
                    'fingerprint',
                    'created_at',
                    '_links',
                ],
                'description' => 'Details an SSH key.',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The unique identifier of the SSH key.',
                        'format' => 'uuid',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-readable key label.',
                    ],
                    'public_key' => [
                        'type' => 'string',
                        'description' => 'The public key.',
                        'minLength' => 64,
                    ],
                    'fingerprint' => [
                        'type' => 'string',
                        'description' => 'The public key fingerprint.',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The key creation date.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ssh-keys' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'description' => 'A collection of SSH keys.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of SSH keys matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ssh-key-request' => [
                'type' => 'object',
                'required' => [
                    'label',
                    'public_key',
                ],
                'description' => 'Describes the request body for an SSH key.',
                'properties' => [
                    'label' => [
                        'type' => 'string',
                        'description' => 'The SSH key label.',
                    ],
                    'public_key' => [
                        'type' => 'string',
                        'description' => 'The public key.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_message-with-links' => [
                'type' => 'object',
                'required' => [
                    'message',
                    '_links',
                ],
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'description' => 'The human-friendly confirmation of the creation of the resource.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_validation-error' => [
                'type' => 'object',
                'required' => [
                    'error',
                    'message',
                ],
                'description' => 'A validation error.',
                'properties' => [
                    'error' => [
                        'type' => 'string',
                        'description' => 'The error summary.',
                    ],
                    'message' => [
                        'type' => 'object',
                        'description' => 'The validation error message keyed by its field or group name.',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_token' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'active',
                    'label',
                    'revocation',
                    'flags',
                    'created_at',
                    '_links',
                ],
                'description' => 'Details a token.',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The token UUID.',
                    ],
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this token is active.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-readable name for this token.',
                    ],
                    'revocation' => [
                        'type' => 'string',
                        'description' => 'If set, the reason why this token was revoked.',
                        'nullable' => true,
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Flags detailing the token\'s status.',
                        'properties' => [
                            'active' => [
                                'type' => 'boolean',
                                'description' => 'Whether or not this token is active.',
                            ],
                        ],
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The creation date and time.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_tokens' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'description' => 'A collection of tokens.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of tokens matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_token-request' => [
                'type' => 'object',
                'required' => [
                    'label',
                ],
                'description' => 'Describes the request body for a token.',
                'properties' => [
                    'label' => [
                        'type' => 'string',
                        'description' => 'The label to give to the token for future reference.',
                        'minLength' => 1,
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_token-creation' => [
                'type' => 'object',
                'required' => [
                    'client_id',
                    'client_secret',
                    '_links',
                ],
                'description' => 'Details about a created user access token.',
                'properties' => [
                    'api_key' => [
                        'deprecated' => true,
                        'type' => 'string',
                        'description' => 'The API key.',
                    ],
                    'api_secret' => [
                        'deprecated' => true,
                        'type' => 'string',
                        'description' => 'The API key secret.',
                    ],
                    'client_id' => [
                        'type' => 'string',
                        'description' => 'The API client id.',
                    ],
                    'client_secret' => [
                        'type' => 'string',
                        'description' => 'The API client secret.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_user-stub-nullable' => [
                'type' => 'object',
                'nullable' => true,
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'picture_url',
                    'username',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URI for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_agreement' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'document_uuid',
                    'title',
                    'body',
                    'status',
                    'created_at',
                    'updated_at',
                    'actioned_by',
                    'reference',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The agreement UUID.',
                    ],
                    'document_uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The agreement document UUID.',
                    ],
                    'title' => [
                        'type' => 'string',
                        'description' => 'The name of the agreement.',
                    ],
                    'body' => [
                        'type' => 'string',
                        'description' => 'The formatted agreement content.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the agreement.',
                        'enum' => [
                            'pending',
                            'accepted',
                            'declined',
                        ],
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date the agreement was created.',
                    ],
                    'updated_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date the agreement was last updated.',
                        'nullable' => true,
                    ],
                    'actioned_by' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub-nullable',
                    ],
                    'reference' => [
                        'type' => 'object',
                        'description' => 'A reference to the entity for this agreement.',
                        'properties' => [
                            'uuid' => [
                                'type' => 'string',
                                'format' => 'uuid',
                                'description' => 'The entity UUID.',
                            ],
                            'name' => [
                                'type' => 'string',
                                'description' => 'The entity name.',
                            ],
                            'type' => [
                                'type' => 'string',
                                'description' => 'The entity type.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_agreements' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of agreements matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_agreement',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_invitees' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of invitees matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-stub' => [
                'type' => 'object',
                'description' => 'The subscription this application belongs to.',
                'required' => [
                    'uuid',
                    'name',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the subscription.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the subscription.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with applications.',
                'properties' => [
                    'remote_admin' => [
                        'type' => 'boolean',
                        'description' => 'Whether this application has remote administration enabled.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-no-embedded' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'uuid',
                    'name',
                    'hosting',
                    'subscription',
                    'organization',
                    'flags',
                    'type',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The unique internal ID of the application.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the application.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the application.',
                    ],
                    'hosting' => [
                        'type' => 'object',
                        'description' => 'Hosting details for this application.',
                        'properties' => [
                            'type' => [
                                'type' => 'string',
                                'enum' => [
                                    'ace',
                                    'acp',
                                    'acsf',
                                    'free',
                                    'network',
                                    'search',
                                    'unknown',
                                ],
                                'description' => 'The hosting type.',
                            ],
                            'id' => [
                                'type' => 'string',
                                'description' => 'The hosting ID.',
                            ],
                        ],
                    ],
                    'subscription' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-flags',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'drupal',
                            'node',
                            'ssg',
                        ],
                        'description' => 'The type of application supported.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'normal',
                            'provisioning',
                        ],
                        'description' => 'The current application status.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_applications' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of applications.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-stub-embedded' => [
                'type' => 'object',
                'description' => 'A related subscription.',
                'required' => [
                    'uuid',
                    'name',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the subscription.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the subscription.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-stub-embedded' => [
                'type' => 'object',
                'description' => 'A related organization.',
                'required' => [
                    'uuid',
                    'name',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The organization\'s UUID.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The human-readable organization name.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_resource-tag-embedded' => [
                'type' => 'object',
                'description' => 'An associated tag.',
                'required' => [
                    'name',
                    'color',
                    '_links',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the tag.',
                    ],
                    'color' => [
                        'type' => 'string',
                        'description' => 'The color of the tag.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'uuid',
                    'name',
                    'hosting',
                    'subscription',
                    'organization',
                    'flags',
                    'type',
                    'status',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The unique internal ID of the application.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the application.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the application.',
                    ],
                    'hosting' => [
                        'type' => 'object',
                        'description' => 'Hosting details for this application.',
                        'properties' => [
                            'type' => [
                                'type' => 'string',
                                'enum' => [
                                    'ace',
                                    'acp',
                                    'acsf',
                                    'free',
                                    'network',
                                    'search',
                                    'unknown',
                                ],
                                'description' => 'The hosting type.',
                            ],
                            'id' => [
                                'type' => 'string',
                                'description' => 'The hosting ID.',
                            ],
                        ],
                    ],
                    'subscription' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-flags',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'drupal',
                            'node',
                            'ssg',
                        ],
                        'description' => 'The type of application supported.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'normal',
                            'provisioning',
                        ],
                        'description' => 'The current application status.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Entities related to the application.',
                        'properties' => [
                            'subscription' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub-embedded',
                            ],
                            'organization' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub-embedded',
                            ],
                            'tags' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_artifact' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'name',
                    'state',
                    'created_at',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The unique ID of the artifact.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the artifact.',
                    ],
                    'state' => [
                        'type' => 'string',
                        'enum' => [
                            'delete-failed',
                            'deleted',
                            'pending-delete',
                            'pending-upload',
                            'ready',
                            'upload-failed',
                        ],
                        'description' => 'The state of the artifact.',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time at which the artifact was created.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_artifacts' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of artifacts.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifact',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with code branches and tags on applications.',
                'properties' => [
                    'tag' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of branch and tag information.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    'type' => 'object',
                                    'required' => [
                                        'name',
                                        'flags',
                                    ],
                                    'properties' => [
                                        'name' => [
                                            'type' => 'string',
                                            'description' => 'The name of the branch or tag.',
                                        ],
                                        'flags' => [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-flags',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-project' => [
                'type' => 'object',
                'description' => 'The model for a Code Studio project.',
                'required' => [
                    'application_id',
                    'status',
                    '_embedded',
                    '_links',
                ],
                'properties' => [
                    'application_id' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The associated application id.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the GitLab project',
                        'enum' => [
                            'active',
                            'inactive',
                            'installing',
                            'install-failed',
                            'deleted',
                            'deleting',
                            'delete-failed',
                        ],
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Contains the embedded Acquia Cloud user.',
                        'properties' => [
                            'application' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-stub',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-database-name' => [
                'type' => 'object',
                'description' => 'Application database name.',
                'required' => [
                    'name',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The database name.',
                        'minLength' => 1,
                        'maxLength' => 63,
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-databases' => [
                'type' => 'object',
                'description' => 'Collection of application databases.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of database names matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-database-name',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_pagination' => [
                'type' => 'object',
                'description' => 'A collection of pagination properties.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The total number of objects in the collection.',
                    ],
                    'limit' => [
                        'type' => 'integer',
                        'description' => 'The limit on the number of objects in the collection.',
                    ],
                    'offset' => [
                        'type' => 'integer',
                        'description' => 'The offset on the retrieved objects in the collection.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_health' => [
                'type' => 'object',
                'description' => 'The current health for this resource.',
                'properties' => [
                    'code' => [
                        'type' => 'string',
                        'description' => 'The status code for the current health.',
                    ],
                    'details' => [
                        'type' => 'string',
                        'description' => 'Full details about the current health code.',
                    ],
                    'summary' => [
                        'type' => 'string',
                        'description' => 'A brief summary that explains why the health code is present.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_email-domain' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'domain_name',
                    'flags',
                    'health',
                ],
                'description' => 'The Email Domain',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the email domain.',
                    ],
                    'domain_name' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The domain name.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Additional Email Domain information.',
                        'properties' => [
                            'associated' => [
                                'type' => 'boolean',
                                'description' => 'Whether or not Platform Email has been associated with the application.',
                            ],
                        ],
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_email-domains' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of email domains.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email-domain',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_notification-stub' => [
                'type' => 'object',
                'description' => 'A notification about an event or a task.',
                'required' => [
                    'uuid',
                    'event',
                    'label',
                    'description',
                    'created_at',
                    'completed_at',
                    'status',
                    'progress',
                    'context',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The notification unique identifier.',
                        'format' => 'uuid',
                    ],
                    'event' => [
                        'type' => 'string',
                        'description' => 'The notification event.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human readable notification label.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The notification description.',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time that this notification was created.',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time that the task or event this notification is tracking was completed at.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the notification.',
                        'enum' => [
                            'completed',
                            'in-progress',
                            'failed',
                        ],
                    ],
                    'progress' => [
                        'type' => 'integer',
                        'description' => 'The notification progress.',
                        'minimum' => 0,
                        'maximum' => 100,
                    ],
                    'context' => [
                        'type' => 'object',
                        'description' => 'Contextual data related to the notification.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Data related to the notification, such as the author.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_applications-notifications' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of notifications matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-stub',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_permission-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags regarding the status of the permission.',
                'properties' => [
                    'deprecated' => [
                        'type' => 'boolean',
                        'description' => 'Whether the permission is deprecated or not.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_permission' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'label',
                    'description',
                    'group_label',
                    'flags',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the permission.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human readable label for the permission.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The description of the permission.',
                        'nullable' => true,
                    ],
                    'group_label' => [
                        'type' => 'string',
                        'description' => 'The human readable label for the group.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission-flags',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_applications-permissions' => [
                'type' => 'object',
                'required' => [
                    'total',
                    'flags',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Additional information about the permissions.',
                        'required' => [
                            'administrator',
                        ],
                        'properties' => [
                            'administrator' => [
                                'type' => 'boolean',
                                'description' => 'Whether the current user is able to administrate the application.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of permissions matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_search' => [
                'type' => 'object',
                'description' => 'A collection of links that provides traversal of search endpoints.',
                'required' => [
                    '_links',
                ],
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_configuration-set' => [
                'type' => 'object',
                'description' => 'An Acquia Search configuration set.',
                'required' => [
                    'id',
                    'application_uuid',
                    'label',
                    'flags',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The search configuration set ID.',
                    ],
                    'application_uuid' => [
                        'type' => 'string',
                        'description' => 'The UUID for the application the search configuration belongs to.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-readable search configuration set label.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The collection of flags for the search configuration set.',
                        'properties' => [
                            'custom' => [
                                'type' => 'boolean',
                                'description' => 'Indicates whether the search configuration set is a custom configuration set.',
                            ],
                        ],
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The provisioning status of the search configuration set.',
                        'enum' => [
                            'active',
                            'pending',
                            'failed',
                            'inactive',
                        ],
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_configuration-sets' => [
                'type' => 'object',
                'description' => 'A collection of configuration sets.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of configuration sets.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-set',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_settings' => [
                'type' => 'object',
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_hosting-settings' => [
                'type' => 'object',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The application UUID.',
                    ],
                    'hosting_id' => [
                        'type' => 'string',
                        'description' => 'The application\'s hosting identifier.',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The application\'s hosting type.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_legacy-product-keys-settings' => [
                'type' => 'object',
                'properties' => [
                    'acquia_connector' => [
                        'type' => 'object',
                        'description' => 'Acquia Connector legacy credentials.',
                        'properties' => [
                            'identifier' => [
                                'type' => 'string',
                                'description' => 'The Acquia Connector site identifier.',
                            ],
                            'key' => [
                                'type' => 'string',
                                'description' => 'The Acquia Connector key.',
                            ],
                        ],
                    ],
                    'cloud_api' => [
                        'type' => 'object',
                        'description' => 'Cloud API legacy credentials.',
                        'properties' => [
                            'username' => [
                                'type' => 'string',
                                'format' => 'uuid',
                                'description' => 'The Cloud API username (Subscription UUID).',
                            ],
                            'key' => [
                                'type' => 'string',
                                'description' => 'The Cloud API key.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_remote-administration-settings' => [
                'type' => 'object',
                'properties' => [
                    'application_uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The application UUID.',
                    ],
                    'update_mode' => [
                        'type' => 'string',
                        'description' => 'The remote administration update setting.',
                        'enum' => [
                            'full',
                            'inform',
                            'none',
                        ],
                    ],
                    'update_type' => [
                        'type' => 'string',
                        'description' => 'The remote administration update type (i.e. what to update).',
                        'enum' => [
                            'core',
                            'core_contrib',
                        ],
                    ],
                    'pause_until' => [
                        'type' => 'string',
                        'nullable' => true,
                        'description' => 'The ISO-8601 formatted date/time to pause RA until. Only applicable for \'full\' and \'inform\' update modes and when it is in future.',
                    ],
                    'deploy_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'description' => 'The ISO-8601 formatted date/time to deploy RA at. Only applicable for \'full\' and \'inform\' update modes and when it is in future.',
                    ],
                    'deploy_environment' => [
                        'type' => 'string',
                        'description' => 'The environment to deploy the code and production database to for testing.',
                    ],
                    'source_environment' => [
                        'type' => 'string',
                        'description' => 'The update source environment. Only applicable for \'full\' mode.',
                    ],
                    'merge_branch' => [
                        'type' => 'string',
                        'description' => 'The development branch into which the update tag will be merged.',
                        'nullable' => true,
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Remote administration settings flags.',
                        'properties' => [
                            'copy_files' => [
                                'type' => 'boolean',
                            ],
                            'copy_database' => [
                                'type' => 'boolean',
                            ],
                            'merge_tag' => [
                                'type' => 'boolean',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_remote-administration' => [
                'type' => 'object',
                'required' => [
                    'update_mode',
                ],
                'properties' => [
                    'update_mode' => [
                        'type' => 'string',
                        'description' => 'The update mode to select.',
                        'enum' => [
                            'update',
                            'inform',
                            'none',
                        ],
                    ],
                    'update_type' => [
                        'type' => 'string',
                        'description' => 'What components to update (core only or core and contrib modules).',
                        'enum' => [
                            'core',
                            'core_contrib',
                        ],
                    ],
                    'pause_until' => [
                        'type' => 'string',
                        'nullable' => true,
                        'description' => 'What date/time to pause RA updates until (if applicable).',
                    ],
                    'deploy_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'description' => 'What date/time to deploy RA updates at (if applicable).',
                    ],
                    'deploy_environment' => [
                        'type' => 'string',
                        'description' => 'The environment id of the environment to deploy to.',
                    ],
                    'source_environment' => [
                        'type' => 'string',
                        'description' => 'The environment id of the environment to use as a starting point for testing.',
                    ],
                    'copy_files' => [
                        'type' => 'boolean',
                        'description' => 'Whether to copy files from production to testing environment.',
                    ],
                    'copy_database' => [
                        'type' => 'boolean',
                        'description' => 'Whether to copy database from production to testing environment.',
                    ],
                    'merge_tag' => [
                        'type' => 'boolean',
                        'description' => 'Whether to automatically merge the approved code into your development branch.',
                    ],
                    'merge_branch' => [
                        'type' => 'string',
                        'description' => 'The development branch into which to merge the update tag.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_security-settings' => [
                'type' => 'object',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The application UUID.',
                    ],
                    'allowed_ips' => [
                        'type' => 'array',
                        'description' => 'A list of IPs and CIDR values allowed to access an application. Set to null to disable whitelisting.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'tfa_required' => [
                        'type' => 'boolean',
                        'description' => 'Whether TFA is required for an application.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_resource-tag' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'color',
                    'context',
                    '_links',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the tag.',
                    ],
                    'color' => [
                        'type' => 'string',
                        'description' => 'The color of the tag.',
                    ],
                    'context' => [
                        'type' => 'object',
                        'description' => 'Metadata related to the tag.',
                        'properties' => [
                            'organization' => [
                                'type' => 'object',
                                'description' => 'A collection of organization metadata for the tag.',
                                'properties' => [
                                    'uuids' => [
                                        'type' => 'array',
                                        'description' => 'An array of organization UUIDs.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'description' => 'The organization UUID.',
                                        ],
                                    ],
                                ],
                            ],
                            'application' => [
                                'type' => 'object',
                                'description' => 'A collection of application metadata for the tag.',
                                'properties' => [
                                    'uuids' => [
                                        'type' => 'array',
                                        'description' => 'An array of application UUIDs.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'description' => 'The application UUID.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_resource-tags' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of tags matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_task' => [
                'type' => 'object',
                'required' => [
                    'progress',
                    'user',
                    'uuid',
                    'name',
                    'title',
                    'description',
                    'created_at',
                    'started_at',
                    'status',
                    'type',
                    'metadata',
                    'labels',
                    'reference_uuid',
                    '_links',
                ],
                'properties' => [
                    'progress' => [
                        'type' => 'integer',
                        'description' => 'The progress of the event, from 0 to 100.',
                        'minimum' => 0,
                        'maximum' => 100,
                    ],
                    'user' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the task.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The machine name of the task.',
                    ],
                    'title' => [
                        'type' => 'string',
                        'description' => 'The title of the task.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The description of the task.',
                        'nullable' => true,
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date that this task was created.',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date that the task was started.',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date that the task was completed.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the task.',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of task.',
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'properties' => [
                            'created' => [
                                'type' => 'integer',
                                'description' => 'When the task was created.',
                            ],
                            'author' => [
                                'type' => 'object',
                                'description' => 'The task author.',
                                'properties' => [
                                    'uuid' => [
                                        'type' => 'string',
                                        'description' => 'The task author UUID.',
                                        'format' => 'uuid',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'labels' => [
                        'type' => 'array',
                        'description' => 'Categorization labels associated with the task',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'reference_uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the parent task. If there is no parent, this will be the task UUID.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_applications-tasks' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of tasks matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_task',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'name',
                    'created_at',
                    'updated_at',
                    'organization',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the team.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the team.',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date the team was created.',
                    ],
                    'updated_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The date the team was last updated.',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_applications-teams' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of teams matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_usage' => [
                'type' => 'object',
                'description' => 'A collection of traversal links for an entity.',
                'required' => [
                    '_links',
                ],
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-metadata' => [
                'type' => 'object',
                'description' => 'Environment metadata.',
                'properties' => [
                    'ids' => [
                        'type' => 'array',
                        'description' => 'An array of environment identifiers.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-metadata' => [
                'type' => 'object',
                'description' => 'Application metadata.',
                'properties' => [
                    'uuids' => [
                        'type' => 'array',
                        'description' => 'Collection of application UUIDs.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'uuid',
                            'description' => 'The application UUID.',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-metadata' => [
                'type' => 'object',
                'description' => 'Subscription metadata.',
                'properties' => [
                    'uuids' => [
                        'type' => 'array',
                        'description' => 'An array of subscription unique identifiers.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'uuid',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-usage-metric' => [
                'type' => 'object',
                'description' => 'Provides details about views and visits for an application.',
                'required' => [
                    'metric',
                    'datapoints',
                    'metadata',
                    'last_data_at',
                ],
                'properties' => [
                    'metric' => [
                        'type' => 'string',
                        'description' => 'The type of metric requested.',
                        'enum' => [
                            'views',
                            'visits',
                        ],
                    ],
                    'datapoints' => [
                        'type' => 'array',
                        'description' => 'The data points for the pricing metrics request.',
                        'items' => [
                            'type' => 'array',
                            'description' => 'Each element includes the value for the requested metric and the sampling time.',
                            'items' => [
                                'type' => 'string',
                                'description' => 'The first element is the metric value and the second is the sampling time.',
                            ],
                        ],
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'description' => 'The metadata for the data points being returned.',
                        'properties' => [
                            'environment' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-metadata',
                            ],
                            'application' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-metadata',
                            ],
                            'subscription' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-metadata',
                            ],
                        ],
                    ],
                    'last_data_at' => [
                        'type' => 'string',
                        'description' => 'The last time data was polled for the requested metric.',
                        'format' => 'date-time',
                        'nullable' => true,
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-usage-metrics' => [
                'type' => 'object',
                'description' => 'A collection of application usage metrics.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of application metric items matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metric',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_distribution' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'urls',
                    'update_urls',
                    'title',
                    'version',
                    'drupal_version',
                    'description',
                    'image_url',
                    'flags',
                    '_links',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the distribution.',
                    ],
                    'urls' => [
                        'type' => 'object',
                        'description' => 'The URLs for the distribution.',
                        'properties' => [
                            'gz' => [
                                'type' => 'string',
                                'description' => 'The URI for the gzip compressed distribution.',
                                'format' => 'uri',
                            ],
                            'zip' => [
                                'type' => 'string',
                                'description' => 'The URI for the zip compressed distribution.',
                                'format' => 'uri',
                            ],
                        ],
                    ],
                    'update_urls' => [
                        'type' => 'object',
                        'description' => 'The update URLs for the distribution.',
                        'properties' => [
                            'gz' => [
                                'type' => 'string',
                                'description' => 'The URI for the gzip compressed update.',
                                'format' => 'uri',
                            ],
                            'zip' => [
                                'type' => 'string',
                                'description' => 'The URI for the zip compressed update.',
                                'format' => 'uri',
                            ],
                        ],
                    ],
                    'title' => [
                        'type' => 'string',
                        'description' => 'The title of the distribution.',
                    ],
                    'version' => [
                        'type' => 'string',
                        'description' => 'The full version string of the distribution.',
                    ],
                    'drupal_version' => [
                        'type' => 'string',
                        'description' => 'The Drupal version string of the distribution.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The verbose description of the distribution.',
                    ],
                    'image_url' => [
                        'type' => 'string',
                        'description' => 'The URI for the logo image for this distribution.',
                        'format' => 'uri',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Flags for this distribution.',
                        'properties' => [
                            'default' => [
                                'type' => 'boolean',
                                'description' => 'Whether this distribution is the default.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_distributions' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of distributions.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_distribution',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_vcs' => [
                'type' => 'object',
                'required' => [
                    'type',
                    'path',
                    'url',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of VCS.',
                        'enum' => [
                            'git',
                            'svn',
                        ],
                    ],
                    'path' => [
                        'type' => 'string',
                        'description' => 'The path or branch name.',
                        'nullable' => true,
                    ],
                    'url' => [
                        'type' => 'string',
                        'description' => 'The VCS url.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with the environment.',
                'properties' => [
                    'cde' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment is on-demand.',
                    ],
                    'cdn' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has Platform CDN enabled.',
                    ],
                    'cloud-actions' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has Cloud Actions enabled.',
                    ],
                    'eips' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has Web EIPs enabled.',
                    ],
                    'email' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has Platform Email enabled.',
                    ],
                    'hsd' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment is under high-site density.',
                    ],
                    'livedev' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has live development enabled.',
                    ],
                    'multicert' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has multicert enabled.',
                    ],
                    'multi_region' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not the environment is multi-regioned.',
                    ],
                    'production' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment is production.',
                    ],
                    'production_mode' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has production mode enabled.',
                    ],
                    'remote_admin' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment is a remote administration environment.',
                    ],
                    'varnish' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment has Varnish.',
                    ],
                    'varnish_over_ssl' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the environment is configured for varnish over SSL.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-configuration' => [
                'type' => 'object',
                'description' => 'An array of configuration details for the environment.',
                'properties' => [
                    'version' => [
                        'type' => 'string',
                        'description' => 'The PHP or Node version.',
                    ],
                    'memory_limit' => [
                        'type' => 'integer',
                        'description' => 'Limits PHP request memory usage in megabytes.',
                        'default' => 128,
                        'minimum' => 128,
                        'maximum' => 1024,
                        'nullable' => true,
                    ],
                    'opcache' => [
                        'type' => 'integer',
                        'description' => 'This is the total amount of memory available for caching precompiled script bytecode per PHP/FPM process.',
                        'default' => 96,
                        'minimum' => 96,
                        'maximum' => 512,
                        'nullable' => true,
                    ],
                    'apcu' => [
                        'type' => 'integer',
                        'description' => 'APCu shared memory size per web server.',
                        'default' => 32,
                        'minimum' => 32,
                        'maximum' => 512,
                        'nullable' => true,
                    ],
                    'interned_strings_buffer' => [
                        'type' => 'integer',
                        'description' => 'Sets PHP Opcache key count per server.',
                        'default' => 8,
                        'minimum' => 8,
                        'maximum' => 32,
                        'nullable' => true,
                    ],
                    'client_max_body_size' => [
                        'type' => 'integer',
                        'description' => 'Sets the maximum size of the client request body.',
                        'default' => 256,
                        'minimum' => 0,
                        'maximum' => 1024,
                        'nullable' => true,
                    ],
                    'upload_max_filesize' => [
                        'type' => 'integer',
                        'description' => 'Sets the maximum size of an uploaded file.',
                        'default' => 256,
                        'minimum' => 0,
                        'maximum' => 1024,
                        'nullable' => true,
                    ],
                    'max_execution_time' => [
                        'type' => 'integer',
                        'description' => 'Limits PHP request time in seconds.',
                        'default' => 300,
                        'minimum' => 1,
                        'maximum' => 300,
                        'nullable' => true,
                    ],
                    'max_post_size' => [
                        'type' => 'integer',
                        'description' => 'Sets the PHP limit on POST body size.',
                        'default' => 256,
                        'minimum' => 64,
                        'maximum' => 1024,
                        'nullable' => true,
                    ],
                    'max_input_vars' => [
                        'type' => 'integer',
                        'description' => 'Limits the number of various request items in PHP.',
                        'default' => 1000,
                        'minimum' => 500,
                        'maximum' => 20000,
                        'nullable' => true,
                    ],
                    'memcached_limit' => [
                        'type' => 'integer',
                        'description' => 'Sets the maximum amount of memory in MB that can be allocated to memcached. Only available on Acquia Cloud Next.',
                        'default' => 64,
                        'minimum' => 0,
                        'maximum' => 12288,
                        'nullable' => true,
                    ],
                    'operating_system' => [
                        'type' => 'string',
                        'description' => 'The operating system version.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_artifact-stub' => [
                'type' => 'object',
                'nullable' => true,
                'required' => [
                    'name',
                    'id',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the artifact.',
                    ],
                    'id' => [
                        'type' => 'integer',
                        'format' => 'id',
                        'description' => 'The artifact identifier.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'label',
                    'name',
                    'application',
                    'domains',
                    'active_domain',
                    'default_domain',
                    'image_url',
                    'ssh_url',
                    'ips',
                    'region',
                    'balancer',
                    'platform',
                    'status',
                    'type',
                    'size',
                    'weight',
                    'vcs',
                    'flags',
                    'configuration',
                    'artifact',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The ID of the environment. The ID is a compound key consisting of the internal database ID of the environment and the application UUID.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-readable name of the environment.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The stage name of the environment.',
                    ],
                    'application' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-stub',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'description' => 'An array of domain names attached to this environment.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'hostname',
                        ],
                    ],
                    'active_domain' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The active domain name for this environment.',
                    ],
                    'default_domain' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The default domain name for this environment.',
                    ],
                    'image_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URL to the image for this environment.',
                        'nullable' => true,
                    ],
                    'ssh_url' => [
                        'type' => 'string',
                        'description' => 'The URL used to SSH into the environment.',
                    ],
                    'ips' => [
                        'type' => 'array',
                        'description' => 'An array of IP addresses attached to this environment.',
                        'deprecated' => true,
                        'items' => [
                            'type' => 'string',
                            'format' => 'ipv4',
                        ],
                    ],
                    'region' => [
                        'type' => 'string',
                        'description' => 'The region the environment resides in.',
                    ],
                    'balancer' => [
                        'type' => 'string',
                        'description' => 'The balancer type.'."\n"
                            .'- balancers: The environment is behind a Legacy balancer.'."\n"
                            .'- elb: The environment is behind an ELB balancer.'."\n"
                            .'- cluster: The environment is behind an Edge Cluster balancer.'."\n",
                        'enum' => [
                            'balancers',
                            'elb',
                            'cluster',
                        ],
                    ],
                    'platform' => [
                        'type' => 'string',
                        'description' => 'The platform type.'."\n"
                            .'- cloud: The environment is hosted on a Cloud Classic Platform.'."\n"
                            .'- cloud-next: The environment is hosted on a Cloud Next Platform.'."\n"
                            .'- unknown:  The host information is not available for the environment.'."\n",
                        'enum' => [
                            'cloud',
                            'cloud-next',
                            'unknown',
                        ],
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of this environment.',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of environment.'."\n"
                            .'- node: A NodeJS environment.'."\n"
                            .'- drupal: A Drupal environment.'."\n"
                            .'- ssg: A Static Site Generator environment.'."\n"
                            .'- unknown: We were unable to determine the environment type.'."\n",
                        'enum' => [
                            'node',
                            'drupal',
                            'ssg',
                            'unknown',
                        ],
                    ],
                    'size' => [
                        'type' => 'string',
                        'description' => 'The size of the environment. Will be null if the environment type does not support sizes.',
                        'nullable' => true,
                        'enum' => [
                            'small',
                            'medium',
                            'large',
                            'unknown',
                        ],
                    ],
                    'weight' => [
                        'type' => 'integer',
                        'nullable' => true,
                        'description' => 'The environment weight for display purposes.',
                    ],
                    'vcs' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_vcs',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-flags',
                    ],
                    'configuration' => [
                        'type' => 'object',
                        'description' => 'A collection of environment configuration information.',
                        'nullable' => true,
                        'properties' => [
                            'operating_system' => [
                                'type' => 'string',
                                'description' => 'The environment operation system.',
                            ],
                            'php' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-configuration',
                            ],
                        ],
                    ],
                    'artifact' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifact-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environments' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of environments matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-feature' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'label',
                    'description',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The feature flag machine name.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The feature flag friendly name.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'A description of the feature flag.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_application-features' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of application feature flags.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-feature',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-options' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'An array of environment options.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'name' => [
                                            'type' => 'string',
                                            'description' => 'The environment configuration option name.',
                                            'enum' => [
                                                'apcu',
                                                'interned_strings_buffer',
                                                'client_max_body_size',
                                                'max_execution_time',
                                                'max_input_vars',
                                                'max_post_size',
                                                'upload_max_filesize',
                                                'memory_limit',
                                                'memcached_limit',
                                                'opcache',
                                                'operating_system',
                                                'version',
                                            ],
                                        ],
                                        'minimum' => [
                                            'type' => 'integer',
                                            'nullable' => true,
                                            'description' => 'The lowest value a configuration option can be set.',
                                        ],
                                        'maximum' => [
                                            'type' => 'integer',
                                            'nullable' => true,
                                            'description' => 'The highest value a configuration option can be set.',
                                        ],
                                        'default' => [
                                            'type' => 'integer',
                                            'nullable' => true,
                                            'description' => 'The default value for a configuration option.',
                                        ],
                                        'step' => [
                                            'type' => 'integer',
                                            'nullable' => true,
                                            'description' => 'The step between configuration option values.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_operating-systems' => [
                'type' => 'object',
                'required' => [
                    'versions',
                    '_links',
                ],
                'properties' => [
                    'versions' => [
                        'type' => 'array',
                        'description' => 'The operating systems.',
                        'items' => [
                            'type' => 'object',
                            'properties' => [
                                'name' => [
                                    'description' => 'The codename associated with the version.',
                                    'type' => 'string',
                                ],
                                'label' => [
                                    'description' => 'The label of the version.',
                                    'type' => 'string',
                                ],
                                'version' => [
                                    'description' => 'The numerical representation of the version.',
                                    'type' => 'string',
                                ],
                                'available' => [
                                    'description' => 'Flag to show if the version is available for which to switch.',
                                    'type' => 'boolean',
                                ],
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_available-runtimes' => [
                'type' => 'object',
                'required' => [
                    'runtime',
                    'versions',
                    '_links',
                ],
                'properties' => [
                    'runtime' => [
                        'type' => 'string',
                        'description' => 'The runtime.',
                        'enum' => [
                            'php',
                            'node',
                        ],
                    ],
                    'versions' => [
                        'type' => 'array',
                        'description' => 'The available versions for this runtime.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cdn' => [
                'type' => 'object',
                'required' => [
                    'status',
                ],
                'description' => 'CDN status information.',
                'properties' => [
                    'status' => [
                        'type' => 'string',
                        'description' => 'The CDN status.',
                        'enum' => [
                            'active',
                            'delete-failed',
                            'deleting',
                            'disable-failed',
                            'disabling',
                            'install-failed',
                            'installing',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cloud-actions-flags' => [
                'type' => 'object',
                'description' => 'Various flags for the Cloud Action.',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'description' => 'Indicates whether the Cloud Action is enabled.',
                    ],
                    'default' => [
                        'type' => 'boolean',
                        'description' => 'Indicates whether the Cloud Action is a default action.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cloud-action' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'label',
                    'description',
                    'type',
                    'flags',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The Cloud Action ID.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-readable Cloud Action label.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The description of a Cloud Action.',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of Cloud Action.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-actions-flags',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cloud-actions' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Cloud Actions.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-action',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_put-cloud-actions' => [
                'type' => 'object',
                'description' => 'A Cloud Action or a series of Cloud Actions paired with enable or disable boolean value.',
                'required' => [
                    'cloud-actions',
                ],
                'properties' => [
                    'cloud-actions' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                            'description' => 'Whether this Cloud Action is enabled.',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cloud-action-id' => [
                'type' => 'string',
                'format' => 'uuid',
                'description' => 'A Cloud Action ID.',
            ],
            'Acquia_Cloud_API_Documentation_deploy-code' => [
                'type' => 'object',
                'required' => [
                    'source',
                ],
                'properties' => [
                    'source' => [
                        'type' => 'string',
                        'description' => 'The ID of the environment to deploy code from.',
                    ],
                    'message' => [
                        'type' => 'string',
                        'description' => 'An optional commit message to include when creating a new tag.',
                    ],
                    'cloud-actions' => [
                        'type' => 'array',
                        'description' => 'An optional array of Cloud Actions.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-action-id',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_switch-code' => [
                'type' => 'object',
                'required' => [
                    'branch',
                ],
                'properties' => [
                    'branch' => [
                        'type' => 'string',
                        'description' => 'The name of the branch or tag to switch to. Tags should be prefixed with "tags/".',
                    ],
                    'cloud-actions' => [
                        'type' => 'array',
                        'description' => 'An optional array of Cloud Actions.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-action-id',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_import-site' => [
                'type' => 'object',
                'required' => [
                    'url',
                ],
                'properties' => [
                    'url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URL of the make file or tarball containing the site to import.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the distribution being installed.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_server-stub' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'name',
                ],
                'description' => 'Information about the server this cron job is attached to.',
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The server ID.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The server name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cron-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with cron jobs.',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'description' => 'Whether this this cron is enabled.',
                    ],
                    'system' => [
                        'type' => 'boolean',
                        'description' => 'Whether this is a system cron, which cannot be modified.',
                    ],
                    'on_any_web' => [
                        'type' => 'boolean',
                        'description' => 'Whether this cron will run on the lowest numbered web.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-stub' => [
                'type' => 'object',
                'description' => 'Schema for a stub of information regarding an environment.',
                'required' => [
                    'id',
                    'name',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The ID of the environment. The ID is a compound key consisting of the internal database ID of the environment and the application UUID.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The stage name of the environment.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cron' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'server',
                    'command',
                    'minute',
                    'hour',
                    'day_month',
                    'month',
                    'day_week',
                    'label',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The ID of the cron job.',
                    ],
                    'server' => [
                        'oneOf' => [
                            [
                                'type' => 'array',
                                'items' => [],
                            ],
                            [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-stub',
                            ],
                        ],
                    ],
                    'command' => [
                        'type' => 'string',
                        'description' => 'The cron command.',
                    ],
                    'minute' => [
                        'type' => 'string',
                        'description' => 'The cron expression minute.',
                    ],
                    'hour' => [
                        'type' => 'string',
                        'description' => 'The cron expression hour.',
                    ],
                    'day_month' => [
                        'type' => 'string',
                        'description' => 'The cron expression day of the month.',
                    ],
                    'month' => [
                        'type' => 'string',
                        'description' => 'The cron expression month.',
                    ],
                    'day_week' => [
                        'type' => 'string',
                        'description' => 'The cron expression day of the week.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The label for the cron.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cron-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_crons' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of cron jobs.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cron',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_post-cron' => [
                'type' => 'object',
                'required' => [
                    'command',
                    'frequency',
                    'label',
                ],
                'properties' => [
                    'command' => [
                        'type' => 'string',
                        'description' => 'The command to run.',
                    ],
                    'frequency' => [
                        'type' => 'string',
                        'description' => 'The cron string that describes the frequency the cron will be run at.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The label for this cron.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_put-cron' => [
                'type' => 'object',
                'properties' => [
                    'command' => [
                        'type' => 'string',
                        'description' => 'The command to run.',
                    ],
                    'frequency' => [
                        'type' => 'string',
                        'description' => 'The cron string that describes the frequency the cron will be run at.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The label for this cron.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_database-flags' => [
                'type' => 'object',
                'description' => 'Response schema for database flags.',
                'properties' => [
                    'default' => [
                        'type' => 'boolean',
                        'description' => 'Whether this is the default database.',
                    ],
                    'perform_backup' => [
                        'type' => 'boolean',
                        'description' => 'Whether this database is backed up.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_database' => [
                'type' => 'object',
                'description' => 'Response schema for a database.',
                'required' => [
                    'id',
                    'name',
                    'user_name',
                    'password',
                    'url',
                    'db_host',
                    'ssh_host',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the database.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The database name.',
                    ],
                    'user_name' => [
                        'type' => 'string',
                        'description' => 'The database user name.',
                    ],
                    'password' => [
                        'type' => 'string',
                        'description' => 'The password for the database user.',
                    ],
                    'url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The connection URL.',
                    ],
                    'db_host' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The server the database lives on, relative to the SSH host.',
                    ],
                    'ssh_host' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The server to SSH to, in order to access the database on the CLI.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_databases' => [
                'type' => 'object',
                'description' => 'A collection of databases.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of databases matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_database-php-config' => [
                'type' => 'object',
                'description' => 'Response schema for a database PHP configuration.',
                'required' => [
                    'drupal',
                    '_links',
                ],
                'properties' => [
                    'drupal' => [
                        'type' => 'string',
                        'description' => 'The Drupal PHP configuration settings file content.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_database-stub' => [
                'type' => 'object',
                'description' => 'Schema for a stub of information regarding a database.',
                'required' => [
                    'id',
                    'name',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the database.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The database name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_backup-flags' => [
                'type' => 'object',
                'description' => 'Response schema for database backup flags.',
                'properties' => [
                    'deleted' => [
                        'type' => 'boolean',
                        'description' => 'Whether this database is deleted.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_backup-no-embedded' => [
                'type' => 'object',
                'description' => 'Response schema for a database backup.',
                'required' => [
                    'id',
                    'database',
                    'type',
                    'started_at',
                    'completed_at',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the database backup.',
                    ],
                    'database' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-stub',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of backup this is.',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The ISO-8601 formatted date/time of when the backup process was started.',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The ISO-8601 formatted date/time of when the backup process was completed.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_backups' => [
                'type' => 'object',
                'description' => 'A collection of database backups.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of database backups matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_backup' => [
                'type' => 'object',
                'description' => 'Response schema for a database backup.',
                'required' => [
                    'id',
                    'database',
                    'type',
                    'started_at',
                    'completed_at',
                    'flags',
                    'environment',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the database backup.',
                    ],
                    'database' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-stub',
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of backup this is.',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The ISO-8601 formatted date/time of when the backup process was started.',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The ISO-8601 formatted date/time of when the backup process was completed.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Related entities.',
                        'properties' => [
                            'environment' => [
                                'type' => 'object',
                                'description' => 'The related environment.',
                                'properties' => [
                                    'id' => [
                                        'type' => 'string',
                                        'description' => 'The environment ID.',
                                    ],
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The environment name.',
                                    ],
                                    '_links' => [
                                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                                    ],
                                ],
                            ],
                            'database' => [
                                'type' => 'object',
                                'description' => 'The related database.',
                                'properties' => [
                                    'id' => [
                                        'type' => 'integer',
                                        'description' => 'The database ID.',
                                    ],
                                    'name' => [
                                        'type' => 'string',
                                        'description' => 'The database name.',
                                    ],
                                    '_links' => [
                                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_file-download' => [
                'type' => 'object',
                'description' => 'A JSON response containing the url and url expiration.',
                'required' => [
                    'url',
                    'expires_at',
                ],
                'properties' => [
                    'url' => [
                        'type' => 'string',
                        'description' => 'The url for the download.',
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The expiration for the url.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_dns-record' => [
                'type' => 'object',
                'description' => 'A DNS record.',
                'required' => [
                    'type',
                    'value',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of DNS record.',
                        'enum' => [
                            'A',
                            'AAAA',
                            'CNAME',
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                        'description' => 'The DNS record value.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_dns' => [
                'type' => 'object',
                'description' => 'Response schema for environment DNS configuration.',
                'required' => [
                    'apex_domain',
                    'subdomains',
                    'regional_configuration',
                    'global_configuration',
                    '_links',
                ],
                'properties' => [
                    'apex_domain' => [
                        'deprecated' => true,
                        'type' => 'array',
                        'description' => 'Environment apex domain DNS records.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                        ],
                    ],
                    'subdomains' => [
                        'deprecated' => true,
                        'type' => 'array',
                        'description' => 'Environment subdomain DNS records.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                        ],
                    ],
                    'regional_configuration' => [
                        'type' => 'object',
                        'description' => 'List of regional apex and subdomain DNS records.',
                        'properties' => [
                            'apex_domain' => [
                                'type' => 'array',
                                'description' => 'Environment regional apex domain DNS records.',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                                ],
                            ],
                            'subdomains' => [
                                'type' => 'array',
                                'description' => 'Environment regional subdomain DNS records.',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                                ],
                            ],
                        ],
                    ],
                    'global_configuration' => [
                        'type' => 'object',
                        'description' => 'List of global apex and subdomain DNS records.',
                        'properties' => [
                            'apex_domain' => [
                                'type' => 'array',
                                'description' => 'Environment global apex domain DNS records.',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                                ],
                            ],
                            'subdomains' => [
                                'type' => 'array',
                                'description' => 'Environment global subdomain DNS records.',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
                                ],
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cdn-information' => [
                'type' => 'object',
                'nullable' => true,
                'description' => 'Domain-specific CDN information, if CDN is enabled.',
                'properties' => [
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'active',
                            'installing',
                            'install-failed',
                            'deleting',
                            'delete-failed',
                            'unknown',
                        ],
                        'description' => 'The current provisioning status of CDN for this domain.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-flags' => [
                'type' => 'object',
                'required' => [
                    'default',
                    'active',
                    'wildcard',
                ],
                'description' => 'An array of flags representing features of the domain.',
                'properties' => [
                    'default' => [
                        'type' => 'boolean',
                        'description' => 'If the domain is the default domain of the environment.',
                    ],
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'If the domain is considered to be the main or active domain in this environment.',
                    ],
                    'wildcard' => [
                        'type' => 'boolean',
                        'description' => 'If this is a wildcard domain.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain' => [
                'type' => 'object',
                'description' => 'Response schema for a domain.',
                'required' => [
                    'hostname',
                    'cdn',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'hostname' => [
                        'type' => 'string',
                        'description' => 'The domain\'s hostname.',
                    ],
                    'cdn' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cdn-information',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domains' => [
                'type' => 'object',
                'description' => 'A collection of domains.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of domains matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-status-flags' => [
                'type' => 'object',
                'description' => 'An array of hosting flags for the domain.',
                'properties' => [
                    'default' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this is the default domain.',
                    ],
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this domain is active.',
                    ],
                    'dns_resolves' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this domain resolves in DNS.',
                    ],
                    'acquia_hosted' => [
                        'type' => 'boolean',
                        'description' => 'Whether or not this domain is Acquia-hosted.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-status' => [
                'type' => 'object',
                'required' => [
                    'hostname',
                    'flags',
                    'ip_addresses',
                    'cnames',
                    'environment',
                    '_links',
                ],
                'description' => 'Domain status information.',
                'properties' => [
                    'hostname' => [
                        'type' => 'string',
                        'description' => 'The domain hostname.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-status-flags',
                    ],
                    'ip_addresses' => [
                        'type' => 'array',
                        'description' => 'An array of this domain\'s IP addresses.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'ipv4',
                        ],
                    ],
                    'cnames' => [
                        'type' => 'array',
                        'description' => 'An array of this domain\'s cnames.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_eip-flags' => [
                'type' => 'object',
                'description' => 'Various flags for the Web EIP.',
                'required' => [
                    'active',
                ],
                'properties' => [
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'A flag indicating whether the Web EIP is configured to actively receive traffic.',
                    ],
                    'deprecated' => [
                        'type' => 'boolean',
                        'description' => 'A flag indicating whether the Web EIP is flagged for deprecation.',
                    ],
                    'legacy' => [
                        'type' => 'boolean',
                        'description' => 'A flag indicating whether the Web EIP is associated with ACC infrastructure.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_eip' => [
                'type' => 'object',
                'required' => [
                    'id',
                    'status',
                    'ipv4',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The Web EIP ID.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The provisioning status of the Web EIP.',
                    ],
                    'ipv4' => [
                        'type' => 'string',
                        'description' => 'The IPv4 address.',
                    ],
                    'ipv6' => [
                        'type' => 'string',
                        'description' => 'The IPv6 address.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eip-flags',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_eips' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Web EIPs.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eip',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_email' => [
                'type' => 'object',
                'required' => [
                    'status',
                    '_links',
                ],
                'description' => 'The Email status.',
                'properties' => [
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of Platform Email for the environment',
                        'enum' => [
                            'active',
                            'inactive',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log' => [
                'type' => 'object',
                'description' => 'Details for a log file.',
                'required' => [
                    'type',
                    'label',
                    'flags',
                    '_links',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'The machine name for the type of logfile.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human readable label of the logfile.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'An array of various flags that indicate functionality associated with the log.',
                        'properties' => [
                            'available' => [
                                'type' => 'boolean',
                                'description' => 'Whether or not this log file is available.',
                            ],
                        ],
                    ],
                    '_links' => [
                        'type' => 'object',
                        'description' => 'Links associated with the logfile.',
                        'properties' => [
                            'download' => [
                                'type' => 'object',
                                'description' => 'Download data for the logfile.',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The download link for the logfile.',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_logs' => [
                'type' => 'object',
                'description' => 'A collection of logs.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of logs matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_logstream' => [
                'type' => 'object',
                'description' => 'Connection details for Logstream backend.',
                'required' => [
                    'logstream',
                    '_links',
                ],
                'properties' => [
                    'logstream' => [
                        'type' => 'object',
                        'required' => [
                            'url',
                            'params',
                            'commands',
                        ],
                        'description' => 'Connection details for Logstream backend.',
                        'properties' => [
                            'url' => [
                                'type' => 'string',
                                'format' => 'uri',
                                'description' => 'WebSocket URL.',
                            ],
                            'params' => [
                                'type' => 'object',
                                'description' => 'Connection details such as a timestamp, hmac, site name and environment.',
                            ],
                            'commands' => [
                                'type' => 'array',
                                'description' => 'Commands for the logstream backend.',
                                'items' => [
                                    'type' => 'string',
                                ],
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-destination-credentials' => [
                'type' => 'object',
                'required' => [
                    'certificate',
                ],
                'description' => 'The Log Forwarding destination credentials.',
                'properties' => [
                    'certificate' => [
                        'type' => 'object',
                        'description' => 'A public X.509 certificate in PEM format. Required for Splunk, Sumologic, and Syslog. Not supported by Loggly.',
                        'properties' => [
                            'certificate' => [
                                'type' => 'string',
                                'description' => 'A public X.509 certificate in PEM format.',
                            ],
                            'expires_at' => [
                                'type' => 'string',
                                'format' => 'date-time',
                                'description' => 'The ISO-8601 date the certificate will expire at. Required by Logly and Sumologic. Optional for Syslog. Not supported by Splunk.',
                            ],
                        ],
                    ],
                    'key' => [
                        'type' => 'string',
                        'description' => 'The certificate private key, in PEM format, used to encrypt the log traffic. Optional for Splunk, Sumologic, and Syslog. Not supported by Loggly.',
                        'nullable' => true,
                    ],
                    'token' => [
                        'type' => 'string',
                        'description' => 'An API token associated with the consumer. Required by Logly and Sumologic. Optional for Syslog. Not supported by Splunk.',
                        'nullable' => true,
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-destination-flags' => [
                'type' => 'object',
                'description' => 'Various flags for this log forwarding destination.',
                'properties' => [
                    'enabled' => [
                        'type' => 'boolean',
                        'description' => 'Destination enabled status.',
                    ],
                    'certificate_expiring' => [
                        'type' => 'boolean',
                        'description' => 'Whether the destination certificate is in danger of expiring soon (within 30 days).',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-destination' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'label',
                    'sources',
                    'consumer',
                    'credentials',
                    'address',
                    'status',
                    'flags',
                    'health',
                    'environment',
                    '_links',
                ],
                'description' => 'The Log Forwarding destination.',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The string representation of the unique identifier of the destination.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-friendly identifier of the destination.',
                    ],
                    'sources' => [
                        'type' => 'array',
                        'description' => 'The list of log sources to forward.',
                        'items' => [
                            'type' => 'string',
                            'description' => 'A log source.',
                            'enum' => [
                                'apache-access',
                                'apache-error',
                                'varnish-access',
                                'drupal-request',
                                'drupal-watchdog',
                                'php-error',
                                'stdout',
                                'stderr',
                            ],
                        ],
                    ],
                    'consumer' => [
                        'type' => 'string',
                        'description' => 'The application or provider consuming the logs.',
                        'enum' => [
                            'loggly',
                            'splunk',
                            'sumologic',
                            'syslog',
                        ],
                    ],
                    'credentials' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination-credentials',
                    ],
                    'address' => [
                        'type' => 'string',
                        'description' => 'The URL or host name and port of the destination.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The current status of the destination.',
                        'enum' => [
                            'active',
                            'pending',
                            'installing',
                            'install-failed',
                            'deleting',
                            'delete-failed',
                            'disabling',
                            'disable-failed',
                            'inactive',
                            'failing',
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination-flags',
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-destinations' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'description' => 'A collection of Log Forwarding destinations.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of log forwarding destinations matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_metrics' => [
                'type' => 'object',
                'description' => 'A collection of links that provides traversal of metrics endpoints.',
                'required' => [
                    '_links',
                ],
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_stack-metrics-metric' => [
                'type' => 'object',
                'description' => 'An object containing StackMetrics datapoints.',
                'required' => [
                    'metric',
                    'datapoints',
                    'last_data_at',
                    'metadata',
                ],
                'properties' => [
                    'metric' => [
                        'type' => 'string',
                        'description' => 'The name of the type of StackMetrics metric.',
                        'enum' => [
                            'apache-requests',
                            'bal-cpu',
                            'bal-memory',
                            'cron-memory',
                            'db-cpu',
                            'db-disk-size',
                            'db-disk-usage',
                            'db-memory',
                            'file-disk-size',
                            'file-cpu',
                            'file-disk-usage',
                            'file-memory',
                            'http-2xx',
                            'http-3xx',
                            'http-4xx',
                            'http-5xx',
                            'mysql-slow-query-count',
                            'nginx-requests',
                            'out-of-memory',
                            'php-proc-max-reached-site',
                            'php-proc-max-reached-total',
                            'php-proc-site',
                            'php-proc-total',
                            'varnish-cache-hit-rate',
                            'varnish-requests',
                            'web-cpu',
                            'web-memory',
                        ],
                    ],
                    'datapoints' => [
                        'type' => 'array',
                        'description' => 'The data points for the StackMetrics request.',
                        'items' => [
                            'type' => 'array',
                            'description' => 'Each element includes the value and the sampling time for the requested metric.',
                            'items' => [
                                'type' => 'string',
                                'description' => 'Each datapoint is a tuple consisting of two elements - a value and a Unix timestamp.',
                            ],
                        ],
                    ],
                    'last_data_at' => [
                        'type' => 'string',
                        'description' => 'The ISO-8601 date time when the last datapoint was sampled.',
                        'format' => 'date-time',
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'description' => 'The metadata describing the context for the metric.',
                        'properties' => [
                            'host' => [
                                'type' => 'string',
                                'description' => 'The corresponding hostname for the StackMetrics datapoints.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_stack-metrics-data' => [
                'type' => 'object',
                'description' => 'An object containing StackMetrics metrics.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of StackMetrics items matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_stack-metrics-metric',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-usage-metric' => [
                'type' => 'object',
                'description' => 'Provides details about views and visits for an environment.',
                'required' => [
                    'metric',
                    'datapoints',
                    'metadata',
                    'last_data_at',
                ],
                'properties' => [
                    'metric' => [
                        'type' => 'string',
                        'description' => 'The type of metric requested.',
                        'enum' => [
                            'views',
                            'visits',
                        ],
                    ],
                    'datapoints' => [
                        'type' => 'array',
                        'description' => 'The data points for the pricing metrics request.',
                        'items' => [
                            'type' => 'array',
                            'description' => 'Each element includes the value for the requested metric and the sampling time.',
                            'items' => [
                                'type' => 'string',
                                'description' => 'The first element is the metric value and the second is the sampling time.',
                            ],
                        ],
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'description' => 'The metadata for the data points being returned.',
                        'properties' => [
                            'environment' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-metadata',
                            ],
                            'application' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-metadata',
                            ],
                            'subscription' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-metadata',
                            ],
                        ],
                    ],
                    'last_data_at' => [
                        'type' => 'string',
                        'description' => 'The last time data was polled for the requested metric.',
                        'format' => 'date-time',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-usage-metrics' => [
                'type' => 'object',
                'description' => 'A collection of usage metrics for an environment.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of environment metric items matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-usage-metric',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_mod-proxy' => [
                'type' => 'object',
                'required' => [
                    'status',
                ],
                'properties' => [
                    'status' => [
                        'type' => 'string',
                        'description' => 'The enablement state of Mod Proxy.',
                        'enum' => [
                            'active',
                            'inactive',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_index' => [
                'type' => 'object',
                'description' => 'An Acquia Search index.',
                'required' => [
                    'id',
                    'environment_id',
                    'config_set_id',
                    'database_role',
                    'status',
                    'solr_version',
                    'url',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The index ID.',
                    ],
                    'environment_id' => [
                        'type' => 'string',
                        'description' => 'The ID for the environment the search index belongs to.',
                    ],
                    'config_set_id' => [
                        'type' => 'string',
                        'description' => 'The search configuration set ID.',
                    ],
                    'database_role' => [
                        'type' => 'string',
                        'description' => 'The database role.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The state for the index.',
                        'enum' => [
                            'active',
                            'pending',
                            'failed',
                            'inactive',
                        ],
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                    'solr_version' => [
                        'type' => 'string',
                        'description' => 'The Solr version the index is currently running on.',
                    ],
                    'url' => [
                        'type' => 'string',
                        'description' => 'The index URL.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The configuration set associated with the index.',
                        'properties' => [
                            'configuration_set' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-set',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_indexes' => [
                'type' => 'object',
                'description' => 'A collection of indexes.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of indexes.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_index',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_server-configuration' => [
                'type' => 'object',
                'description' => 'An array of various configuration settings for the server.',
                'properties' => [
                    'ecu' => [
                        'type' => 'integer',
                        'description' => 'The number of EC2 Compute Units (ECU) for this server type.',
                        'nullable' => true,
                    ],
                    'memory' => [
                        'type' => 'number',
                        'description' => 'Returns the memory size (in GB) for this server type.',
                        'nullable' => true,
                    ],
                    'memcache' => [
                        'type' => 'integer',
                        'description' => 'Returns the memcache size (in MB) for this server (if it is a memcache server).',
                        'nullable' => true,
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_server-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality for the server.',
                'properties' => [
                    'elastic_ip' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server has an elastic (static) IP or not.',
                    ],
                    'active_web' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is an active balancer or not.',
                    ],
                    'active_bal' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is an active web server or not.',
                    ],
                    'primary_db' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is the primary database.'."\n"
                            ."\n"
                            .'Note that "false" does not imply that this is the secondary database. The server must be a database, and not primary in order to be the secondary database.'."\n",
                    ],
                    'web' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is a web server.',
                    ],
                    'database' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is a database server.',
                    ],
                    'balancer' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is a balancer.',
                    ],
                    'fs' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is a file server.',
                    ],
                    'memcache' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is a memcache server.',
                    ],
                    'dedicated' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is dedicated or shared.',
                    ],
                    'self_service' => [
                        'type' => 'boolean',
                        'description' => 'Determines if the server is self-service.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_server' => [
                'type' => 'object',
                'description' => 'Server information.',
                'required' => [
                    'id',
                    'name',
                    'hostname',
                    'ssh_user',
                    'ip',
                    'status',
                    'region',
                    'roles',
                    'ami_type',
                    'operating_system',
                    'configuration',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the server.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The machine name of the server.',
                    ],
                    'hostname' => [
                        'type' => 'string',
                        'description' => 'The hostname for the server.',
                    ],
                    'ssh_user' => [
                        'type' => 'string',
                        'description' => 'The name of the SSH user for this environment.',
                    ],
                    'ip' => [
                        'type' => 'string',
                        'format' => 'ipv4',
                        'description' => 'The IP address of the server.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the server.',
                        'enum' => [
                            'normal',
                            'stopped',
                            'launching',
                            'cancelled',
                            'unknown',
                        ],
                    ],
                    'region' => [
                        'type' => 'string',
                        'description' => 'The Amazon region the server is in.',
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'The roles the server has, for its environment.',
                        'items' => [
                            'type' => 'string',
                            'enum' => [
                                'web',
                                'db',
                                'bal',
                            ],
                        ],
                    ],
                    'ami_type' => [
                        'type' => 'string',
                        'description' => 'The Amazon AMI type.',
                    ],
                    'operating_system' => [
                        'type' => 'string',
                        'description' => 'The operating system running on the server.',
                    ],
                    'configuration' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-configuration',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_servers' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'description' => 'A collection of servers.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of servers matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-settings' => [
                'type' => 'object',
                'description' => 'A collection of links to environment settings.',
                'required' => [
                    '_links',
                ],
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_apm' => [
                'type' => 'object',
                'description' => 'Details application performance monitor settings.',
                'required' => [
                    'type',
                    'key',
                    'name',
                    'flags',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'Indicates the APM type.',
                    ],
                    'key' => [
                        'type' => 'string',
                        'description' => 'The APM license key.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The APM application name. New Relic only.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'An array of flags for an APM.',
                        'properties' => [
                            'enabled' => [
                                'type' => 'boolean',
                                'description' => 'Whether or not the APM is enabled.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Entities related to the APM settings.',
                        'properties' => [
                            'environment' => [
                                'type' => 'array',
                                'description' => 'An array of links to related environments.',
                                'items' => [
                                    'type' => 'object',
                                    'properties' => [
                                        '_links' => [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_ssl' => [
                'type' => 'object',
                'description' => 'The SSL settings for an environment.',
                'required' => [
                    'balancer',
                    'ips',
                    '_links',
                ],
                'properties' => [
                    'balancer' => [
                        'type' => 'object',
                        'description' => 'SSL configuration for the load balancer associated with this environment.',
                        'properties' => [
                            'hostname' => [
                                'type' => 'string',
                                'description' => 'The balancer CNAME.',
                                'format' => 'hostname',
                            ],
                        ],
                    ],
                    'ips' => [
                        'type' => 'array',
                        'description' => 'The IP addresses for the environment.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'ipv4',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_certificate-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with the certificate.',
                'properties' => [
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'Whether this certificate is installed/deployed.',
                    ],
                    'csr' => [
                        'type' => 'boolean',
                        'description' => 'Whether this certificate has an associated CSR.',
                    ],
                    'legacy' => [
                        'type' => 'boolean',
                        'description' => 'Whether this is a legacy certificate (ELB).',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_certificate' => [
                'type' => 'object',
                'description' => 'An SSL certificate.',
                'required' => [
                    'id',
                    'certificate',
                    'private_key',
                    'ca',
                    'flags',
                    'expires_at',
                    'domains',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The ID of the certificate.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The certificate label (SNI only).',
                        'nullable' => true,
                    ],
                    'certificate' => [
                        'type' => 'string',
                        'description' => 'Returns the PEM encoded certificate.',
                    ],
                    'private_key' => [
                        'type' => 'string',
                        'description' => 'The PEM encoded private key.',
                    ],
                    'ca' => [
                        'type' => 'string',
                        'description' => 'The CA intermediary chain.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificate-flags',
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The ISO-8601 formatted date/time of the certificates expiration date.',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'description' => 'The domain names that this certificate is covering.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_certificates' => [
                'type' => 'object',
                'description' => 'A collection of certificates.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of certificates.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificate',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_post-certificate' => [
                'type' => 'object',
                'description' => 'Certificate POST schema.',
                'required' => [
                    'certificate',
                    'private_key',
                ],
                'properties' => [
                    'legacy' => [
                        'type' => 'boolean',
                        'description' => 'Must be set to true for legacy certificates.',
                    ],
                    'certificate' => [
                        'type' => 'string',
                        'description' => 'The SSL certificate being installed.',
                    ],
                    'private_key' => [
                        'type' => 'string',
                        'description' => 'The SSL private key.',
                    ],
                    'ca_certificates' => [
                        'type' => 'string',
                        'description' => 'The CA intermediary certificates.',
                    ],
                    'csr_id' => [
                        'type' => 'integer',
                        'description' => 'The CSR (certificate signing request) to associate with this certificate. Optional.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The label for this certificate. Required for standard certificates. Optional for legacy certificates.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_csr-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with the CSR.',
                'properties' => [
                    'used' => [
                        'type' => 'boolean',
                        'description' => 'Whether this CSR has already been used for a certificate.',
                    ],
                    'legacy' => [
                        'type' => 'boolean',
                        'description' => 'Whether this is a legacy CSR (meant for use with ELB certificates).',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_csr' => [
                'type' => 'object',
                'description' => 'A certificate signing request.',
                'required' => [
                    'id',
                    'csr',
                    'private_key',
                    'country',
                    'state',
                    'locality',
                    'organization',
                    'organizational_unit',
                    'common_name',
                    'alternate_names',
                    'flags',
                    'environment',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The hosting ID of the CSR/SSL Certificate (0 for \'elb\' type).',
                    ],
                    'csr' => [
                        'type' => 'string',
                        'description' => 'The PEM encoded string containing the entire CSR.',
                    ],
                    'private_key' => [
                        'type' => 'string',
                        'description' => 'The PEM encoded private key.',
                    ],
                    'country' => [
                        'type' => 'string',
                        'description' => 'The ISO-3166 country code.',
                    ],
                    'state' => [
                        'type' => 'string',
                        'description' => 'The state/province.',
                    ],
                    'locality' => [
                        'type' => 'string',
                        'description' => 'The locality (city/town/township).',
                    ],
                    'organization' => [
                        'type' => 'string',
                        'description' => 'The organization name.',
                    ],
                    'organizational_unit' => [
                        'type' => 'string',
                        'description' => 'The organizational unit (department).',
                    ],
                    'common_name' => [
                        'type' => 'string',
                        'description' => 'The common name (host and domain name).',
                    ],
                    'alternate_names' => [
                        'type' => 'array',
                        'description' => 'The subject alternate names (sni only).',
                        'items' => [
                            'type' => 'string',
                            'format' => 'hostname',
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csr-flags',
                    ],
                    'environment' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_csrs' => [
                'type' => 'object',
                'description' => 'A collection of csrs.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of CSRs.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csr',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_post-csr' => [
                'type' => 'object',
                'description' => 'Certificate signing request POST schema.',
                'required' => [
                    'country',
                    'state',
                    'locality',
                    'organization',
                    'organizational_unit',
                    'common_name',
                ],
                'properties' => [
                    'country' => [
                        'type' => 'string',
                        'description' => 'The ISO-3166 country code for CSR generation.',
                    ],
                    'state' => [
                        'type' => 'string',
                        'description' => 'The state/province for CSR generation.',
                    ],
                    'locality' => [
                        'type' => 'string',
                        'description' => 'The locality (city/town/township) for CSR generation.',
                    ],
                    'organization' => [
                        'type' => 'string',
                        'description' => 'The organization name for CSR generation.',
                    ],
                    'organizational_unit' => [
                        'type' => 'string',
                        'description' => 'The organizational unit (department) for CSR generation.',
                    ],
                    'common_name' => [
                        'type' => 'string',
                        'description' => 'The common name (domain) for CSR generation.',
                    ],
                    'alternate_names' => [
                        'description' => 'The Subject Alternate Names (SNI only) for CSR generation.',
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'format' => 'hostname',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-variable' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'value',
                    '_links',
                ],
                'description' => 'An environment variable key and value.',
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the variable.',
                        'minLength' => 1,
                        'maxLength' => 255,
                        'pattern' => '^(?!(ACQUIA_|AH_))[A-Za-z_][A-Za-z0-9_]*$',
                    ],
                    'value' => [
                        'type' => 'string',
                        'description' => 'The value of the variable.',
                        'minLength' => 0,
                        'maxLength' => 5000,
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_environment-variables' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'description' => 'A collection of environment variables.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of variables matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-variable',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_identity-provider' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'label',
                    'idp_entity_id',
                    'sp_entity_id',
                    'sso_url',
                    'certificate',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The unique identifier of the identity provider.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The human-friendly label of the identity provider.',
                    ],
                    'idp_entity_id' => [
                        'type' => 'string',
                        'description' => 'The SAML entity ID of the identity provider.',
                    ],
                    'sp_entity_id' => [
                        'type' => 'string',
                        'description' => 'The SAML entity ID of the service provider.',
                    ],
                    'sso_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URL of the SAML POST Binding / SP-initiated SSO.',
                    ],
                    'certificate' => [
                        'type' => 'string',
                        'description' => 'The PEM-encoded X.509 certificate used to sign assertions.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The current state of the identity provider.',
                        'enum' => [
                            'enabled',
                            'incomplete',
                            'disabled',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_identity-providers' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of identity providers matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-provider',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_notification-tasks' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of tasks matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_task',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cde-size' => [
                'type' => 'object',
                'description' => 'Response schema for a CDE size.',
                'required' => [
                    'name',
                    'size',
                    'memory',
                    'storage',
                    'databases',
                    'slots',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The CDE size name.',
                    ],
                    'size' => [
                        'type' => 'string',
                        'description' => 'The CDE size.',
                    ],
                    'memory' => [
                        'type' => 'integer',
                        'description' => 'The CDE memory in MB.',
                    ],
                    'storage' => [
                        'type' => 'integer',
                        'description' => 'The CDE storage in GB.',
                    ],
                    'databases' => [
                        'type' => 'integer',
                        'description' => 'Number of databases available.',
                    ],
                    'slots' => [
                        'type' => 'integer',
                        'description' => 'Number of slots available.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_cde-sizes' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of CDE sizes.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cde-size',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-source' => [
                'type' => 'object',
                'description' => 'Response schema for a Log forwarding source.',
                'required' => [
                    'name',
                    'label',
                    'platforms',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The source name.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The source label.',
                    ],
                    'platforms' => [
                        'type' => 'array',
                        'description' => 'List of platforms for which the source is available.',
                        'items' => [
                            'type' => 'string',
                            'description' => 'The platform name.',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-sources' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of Log forwarding sources.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-source',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-consumer' => [
                'type' => 'object',
                'description' => 'Response schema for a Log forwarding consumer.',
                'required' => [
                    'name',
                    'label',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The consumer name.',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'The consumer label.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_log-forwarding-consumers' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of Log forwarding consumers.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-consumer',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_color' => [
                'type' => 'object',
                'description' => 'Response schema for a color.',
                'required' => [
                    'color',
                ],
                'properties' => [
                    'color' => [
                        'type' => 'string',
                        'description' => 'The color name.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_colors' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of colors.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_color',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-no-embedded' => [
                'type' => 'object',
                'description' => 'Organization information.',
                'required' => [
                    'id',
                    'uuid',
                    'name',
                    'subscriptions_total',
                    'admins_total',
                    'users_total',
                    'teams_total',
                    'roles_total',
                    'owner',
                    'flags',
                    '_links',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The internal ID of the organization.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The UUID of the organization.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the organization.',
                    ],
                    'subscriptions_total' => [
                        'type' => 'integer',
                        'description' => 'The number of subscriptions this organization has.',
                    ],
                    'admins_total' => [
                        'type' => 'integer',
                        'description' => 'The number of administrators this organization has.',
                    ],
                    'users_total' => [
                        'type' => 'integer',
                        'description' => 'The number of users this organization has.',
                    ],
                    'teams_total' => [
                        'type' => 'integer',
                        'description' => 'The number of teams this organization has.',
                    ],
                    'roles_total' => [
                        'type' => 'integer',
                        'description' => 'The number of roles this organization has.',
                    ],
                    'owner' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'An array of various flags that indicate functionality for the organization.',
                        'properties' => [
                            'federated_authentication' => [
                                'type' => 'boolean',
                                'description' => 'Indicates whether the organization supports federated authentication.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organizations' => [
                'type' => 'object',
                'description' => 'A collection of all organizations the current user has access to.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of organizations.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_user-stub-embedded' => [
                'type' => 'object',
                'description' => 'A related user.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'picture_url',
                    'username',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URI for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization' => [
                'type' => 'object',
                'description' => 'Organization information.',
                'required' => [
                    'id',
                    'uuid',
                    'name',
                    'subscriptions_total',
                    'admins_total',
                    'users_total',
                    'teams_total',
                    'roles_total',
                    'owner',
                    'flags',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'string',
                        'description' => 'The internal ID of the organization.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The UUID of the organization.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the organization.',
                    ],
                    'subscriptions_total' => [
                        'type' => 'integer',
                        'description' => 'The number of subscriptions this organization has.',
                    ],
                    'admins_total' => [
                        'type' => 'integer',
                        'description' => 'The number of administrators this organization has.',
                    ],
                    'users_total' => [
                        'type' => 'integer',
                        'description' => 'The number of users this organization has.',
                    ],
                    'teams_total' => [
                        'type' => 'integer',
                        'description' => 'The number of teams this organization has.',
                    ],
                    'roles_total' => [
                        'type' => 'integer',
                        'description' => 'The number of roles this organization has.',
                    ],
                    'owner' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'An array of various flags that indicate functionality for the organization.',
                        'properties' => [
                            'federated_authentication' => [
                                'type' => 'boolean',
                                'description' => 'Indicates whether the organization supports federated authentication.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'Entities related to the organization.',
                        'properties' => [
                            'owner' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub-embedded',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-admin-user-profile' => [
                'type' => 'object',
                'description' => 'An organization admin user profile.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'last_login_at',
                    'mail',
                    'picture_url',
                    'username',
                    'flags',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                        'minLength' => 36,
                        'maxLength' => 36,
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'last_login_at' => [
                        'deprecated' => true,
                        'type' => 'string',
                        'description' => 'The ISO-8601 formatted date/time of when the user last logged in.',
                        'nullable' => true,
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URI for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'An array of flags for a user profile.',
                        'properties' => [
                            'owner' => [
                                'type' => 'boolean',
                                'description' => 'Whether or not this user is the organization owner.',
                            ],
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-admin-user-profiles' => [
                'type' => 'object',
                'description' => 'A collection of organization administrator user profiles.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of organization admin user profiles.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-user-profile',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-admin-invite' => [
                'type' => 'object',
                'description' => 'An invitation to become an organization administrator.',
                'required' => [
                    'uuid',
                    'email',
                    'created_at',
                    'token',
                    'flags',
                    'author',
                    'organization',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The unique identifier of the Invite.',
                        'format' => 'uuid',
                    ],
                    'email' => [
                        'type' => 'string',
                        'description' => 'The invitee email address.',
                        'format' => 'email',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'description' => 'The invite creation time.',
                        'format' => 'date-time',
                    ],
                    'token' => [
                        'type' => 'string',
                        'description' => 'The invite token.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite-flags',
                    ],
                    'author' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-admin-invites' => [
                'type' => 'object',
                'description' => 'A collection of invitations to become an organization administrator.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of organization admin invites.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-invite',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-applications' => [
                'type' => 'object',
                'description' => 'A collection of applications associated with an organization.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of applications.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_resource-tag-organization' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'color',
                    'context',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the tag.',
                    ],
                    'color' => [
                        'type' => 'string',
                        'description' => 'The color of the tag.',
                    ],
                    'context' => [
                        'type' => 'object',
                        'description' => 'Metadata related to the tag.',
                        'properties' => [
                            'organization' => [
                                'type' => 'object',
                                'description' => 'A collection of organization metadata for the tag.',
                                'properties' => [
                                    'uuids' => [
                                        'type' => 'array',
                                        'description' => 'An array of organization UUIDs.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'description' => 'The organization UUID.',
                                        ],
                                    ],
                                ],
                            ],
                            'application' => [
                                'type' => 'object',
                                'description' => 'A collection of application metadata for the tag.',
                                'properties' => [
                                    'uuids' => [
                                        'type' => 'array',
                                        'description' => 'An array of application UUIDs.',
                                        'items' => [
                                            'type' => 'string',
                                            'format' => 'uuid',
                                            'description' => 'The application UUID.',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-available-tags' => [
                'type' => 'object',
                'description' => 'A collection of organization members.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of tags associated with the organization.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag-organization',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-team-stub' => [
                'type' => 'object',
                'description' => 'A team within an organization.',
                'required' => [
                    'uuid',
                    'name',
                    'roles',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The team unique identifier.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The team name.',
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'An array of roles that the user has on this team.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role-stub',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-user-profile' => [
                'type' => 'object',
                'description' => 'A user profile for an organization member.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'picture_url',
                    'username',
                    'teams',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URL for the user\'s picture.',
                        'nullable' => true,
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                    'teams' => [
                        'type' => 'array',
                        'description' => 'A collection of teams this user has access to in an organization, and the roles they have on those teams.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-stub',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-members' => [
                'type' => 'object',
                'description' => 'A collection of organization members.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of organization member profiles.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-user-profile',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organizations-notifications' => [
                'type' => 'object',
                'description' => 'A collection of notifications matching the request parameters.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of notifications matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-stub',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_role' => [
                'type' => 'object',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The role unique identifier.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The role name.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'A description of the role.',
                    ],
                    'permissions' => [
                        'type' => 'array',
                        'description' => 'A collection of permissions a user with this role is granted.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission',
                        ],
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    'last_edited' => [
                        'type' => 'object',
                        'description' => 'When the role was last edited, and who edited it.',
                        'properties' => [
                            'edited_at' => [
                                'type' => 'string',
                                'format' => 'date-time',
                                'description' => 'The date the role was edited.',
                            ],
                            'user' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                            ],
                        ],
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Additional role status information.',
                        'properties' => [
                            'default' => [
                                'type' => 'boolean',
                                'description' => 'True if this is a default role, false if it was user created.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_roles' => [
                'type' => 'object',
                'description' => 'Collection of roles.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of roles.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-team-invite' => [
                'type' => 'object',
                'required' => [
                    'applications',
                    'author',
                    'organization',
                    'uuid',
                    'email',
                    'created_at',
                    'token',
                    'flags',
                    'team',
                    'roles',
                    '_links',
                ],
                'properties' => [
                    'applications' => [
                        'type' => 'array',
                        'description' => 'A array of applications this invite is granting access to.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-stub',
                        ],
                    ],
                    'author' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'organization' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The unique identifier of the Invite.',
                        'format' => 'uuid',
                    ],
                    'email' => [
                        'type' => 'string',
                        'description' => 'The invitee email address.',
                        'format' => 'email',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'description' => 'The invite creation time.',
                        'format' => 'date-time',
                    ],
                    'token' => [
                        'type' => 'string',
                        'description' => 'The invite token.',
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite-flags',
                    ],
                    'team' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-stub',
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'List of roles the invite will grant the invitee.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role-stub',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_organization-team-invites' => [
                'type' => 'object',
                'description' => 'A collection of invitations to join a team.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'The collection of organization team invites.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-invite',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_teams' => [
                'type' => 'object',
                'description' => 'A collection of teams.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of teams matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_permissions' => [
                'type' => 'object',
                'description' => 'A collection of all permissions that may be granted.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of permissions.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-flags' => [
                'type' => 'object',
                'description' => 'An array of various flags that indicate functionality associated with subscription.',
                'properties' => [
                    'active' => [
                        'type' => 'boolean',
                        'description' => 'If the subscription is active.',
                    ],
                    'expired' => [
                        'type' => 'boolean',
                        'description' => 'If the subscription is expired.',
                    ],
                    'zuora' => [
                        'type' => 'boolean',
                        'description' => 'If the subscription is online paid.',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription' => [
                'type' => 'object',
                'description' => 'A subscription is the product that allows for applications to be hosted with Acquia.'."\n"
                    .'In addition, a subscription grants access to various additional services.'."\n",
                'required' => [
                    'id',
                    'uuid',
                    'name',
                    'start_at',
                    'expire_at',
                    'product',
                    'applications_total',
                    'applications_used',
                    'organization',
                    'flags',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                        'description' => 'The subscription ID.',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The subscription UUID.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The subscription name.',
                    ],
                    'start_at' => [
                        'type' => 'string',
                        'description' => 'The time when the service defined by the subscription becomes available.',
                    ],
                    'expire_at' => [
                        'type' => 'string',
                        'description' => 'The time when the service expires.',
                    ],
                    'product' => [
                        'type' => 'object',
                        'description' => 'Defines the type of service this subscription is entitled to.',
                        'properties' => [
                            'id' => [
                                'type' => 'integer',
                                'description' => 'The product ID.',
                            ],
                            'name' => [
                                'type' => 'string',
                                'description' => 'The product name.',
                            ],
                            'type' => [
                                'type' => 'string',
                                'description' => 'The product type.',
                            ],
                        ],
                    ],
                    'applications_total' => [
                        'type' => 'integer',
                        'description' => 'The number of applications this subscription is entitled to.',
                    ],
                    'applications_used' => [
                        'type' => 'integer',
                        'description' => 'The number of applications used.',
                    ],
                    'organization' => [
                        'type' => 'object',
                        'deprecated' => true,
                        'required' => [
                            'uuid',
                            'name',
                        ],
                        'properties' => [
                            'uuid' => [
                                'type' => 'string',
                                'format' => 'uuid',
                                'description' => 'The organization\'s UUID.',
                            ],
                            'name' => [
                                'type' => 'string',
                                'description' => 'The human-readable organization name.',
                            ],
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-flags',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of resources related to the subscription.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscriptions' => [
                'type' => 'object',
                'description' => 'Collection of subscriptions.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of subscriptions.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_apm-type' => [
                'type' => 'object',
                'required' => [
                    'type',
                    'flags',
                    'key',
                    '_links',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'The APM type.',
                        'enum' => [
                            'newrelic',
                        ],
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'Additional APM information.',
                        'properties' => [
                            'opted-in' => [
                                'type' => 'boolean',
                                'description' => 'Whether the organization owner has opted into the APM type.',
                            ],
                        ],
                    ],
                    'key' => [
                        'type' => 'string',
                        'description' => 'The APM license key.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_apm-types' => [
                'type' => 'object',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of APM types matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm-type',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-applications' => [
                'type' => 'object',
                'description' => 'A collection of applications associated with a subscription.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of applications.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-subscription-metadata' => [
                'type' => 'object',
                'description' => 'The Code Studio status for a subscription.',
                'required' => [
                    'status',
                ],
                'properties' => [
                    'status' => [
                        'type' => 'string',
                        'description' => 'A status indicating whether Code Studio has been enabled for the subscription.',
                        'enum' => [
                            'active',
                            'installing',
                            'install-failed',
                            'deleted',
                            'deleting',
                            'delete-failed',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-options' => [
                'type' => 'object',
                'description' => 'Code Studio options.',
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    'roles' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-project-no-embedded' => [
                'type' => 'object',
                'description' => 'The model for a Code Studio project.',
                'required' => [
                    'application_id',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'application_id' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The associated application id.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the GitLab project',
                        'enum' => [
                            'active',
                            'inactive',
                            'installing',
                            'install-failed',
                            'deleted',
                            'deleting',
                            'delete-failed',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-application' => [
                'type' => 'object',
                'description' => 'The model for a Code Studio application.',
                'required' => [
                    'uuid',
                    'name',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The unique identifier of the application.',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The application name.',
                    ],
                    '_links' => [
                        'type' => 'object',
                        'description' => 'Links to Code Studio project and API.',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'description' => 'A link to this page.',
                                'required' => [
                                    'href',
                                ],
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URI for this page.',
                                    ],
                                ],
                            ],
                            'project' => [
                                'type' => 'object',
                                'description' => 'A link to code studio project.',
                                'required' => [
                                    'href',
                                ],
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URI for the code studio project.',
                                    ],
                                ],
                            ],
                            'parent' => [
                                'type' => 'object',
                                'description' => 'A link to the parent page.',
                                'required' => [
                                    'href',
                                ],
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'uri',
                                        'description' => 'The URI for the parent page.',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'An associated code studio project.',
                        'properties' => [
                            'project' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-project-no-embedded',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-applications' => [
                'type' => 'object',
                'description' => 'A collection of applications with associated Code Studio projects for a subscription.',
                'required' => [
                    'total',
                    'pagination',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Code Studio enabled applications.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-application',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-user' => [
                'type' => 'object',
                'description' => 'The model for a Code Studio user.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'role',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The Acquia Cloud user UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'role' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The GitLab role for the user.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_code-studio-users' => [
                'type' => 'object',
                'description' => 'A collection of users for a subscription with assigned seats for Code Studio.',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Code Studio enabled users.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-user',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-registration-dns-record' => [
                'type' => 'object',
                'description' => 'A DNS record.',
                'required' => [
                    'type',
                    'value',
                ],
                'properties' => [
                    'type' => [
                        'type' => 'string',
                        'description' => 'The type of DNS record.',
                        'enum' => [
                            'TXT',
                            'MX',
                            'CNAME',
                        ],
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the DNS record',
                    ],
                    'value' => [
                        'type' => 'string',
                        'description' => 'The DNS record value.',
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-registration-dns-records' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of DNS records',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration-dns-record',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-registration' => [
                'type' => 'object',
                'required' => [
                    'uuid',
                    'domain_name',
                    'health',
                    'dns_records',
                    '_links',
                ],
                'description' => 'The Domain Registration.',
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The UUID of the domain registration.',
                    ],
                    'domain_name' => [
                        'type' => 'string',
                        'format' => 'hostname',
                        'description' => 'The domain name.',
                    ],
                    'health' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
                    ],
                    'dns_records' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration-dns-records',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_domain-registrations' => [
                'type' => 'object',
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    'pagination' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of domain registrations.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-pipelines' => [
                'type' => 'object',
                'description' => 'Pipelines entitlement.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-cde' => [
                'type' => 'object',
                'description' => 'Continuous delivery environment entitlement.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                    'properties',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                    'properties' => [
                        'type' => 'object',
                        'description' => 'Entitlement data.',
                        'properties' => [
                            'databases_total' => [
                                'type' => 'integer',
                                'description' => 'The number of on-demand environment databases granted.',
                            ],
                            'total' => [
                                'type' => 'integer',
                                'description' => 'The number of on-demand environments granted.',
                            ],
                            'used' => [
                                'type' => 'integer',
                                'description' => 'The number of on-demand environments used.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-consumption-based-pricing' => [
                'type' => 'object',
                'description' => 'Consumption based pricing entitlement.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                    'properties',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                    'properties' => [
                        'type' => 'object',
                        'description' => 'Entitlement data.',
                        'properties' => [
                            'visits' => [
                                'type' => 'integer',
                                'description' => 'The maximum number of allowed unique visits.',
                            ],
                            'views' => [
                                'type' => 'integer',
                                'description' => 'The maximum number of allowed views.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-log-forwarding' => [
                'type' => 'object',
                'description' => 'Log forwarding entitlement.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-shield' => [
                'type' => 'object',
                'description' => 'Shield entitlement.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlement-default-newrelic' => [
                'type' => 'object',
                'description' => 'Represents the default New Relic account. The default New Relic account is created when a subscription is provisioned.',
                'required' => [
                    'name',
                    'offering_ids',
                    'expires_at',
                    'flags',
                    'properties',
                ],
                'properties' => [
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the entitlement.',
                    ],
                    'offering_ids' => [
                        'type' => 'array',
                        'description' => 'The offering IDs associated with the entitlement.',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'expires_at' => [
                        'type' => 'string',
                        'description' => 'The furthest expiration date.',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'description' => 'The flags associated with the entitlement.',
                        'properties' => [
                            'trial' => [
                                'type' => 'boolean',
                                'description' => 'Determines if the entitlement is a trial.',
                            ],
                        ],
                    ],
                    'properties' => [
                        'type' => 'object',
                        'description' => 'Entitlement data.',
                        'properties' => [
                            'id' => [
                                'type' => 'string',
                                'description' => 'The New Relic account identifier.',
                            ],
                            'level' => [
                                'type' => 'string',
                                'description' => 'The New Relic account level.',
                                'enum' => [
                                    'pro',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_entitlements' => [
                'type' => 'object',
                'description' => 'Entitlements collection.',
                'properties' => [
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of entitlements.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    'anyOf' => [
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-pipelines',
                                        ],
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-cde',
                                        ],
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-consumption-based-pricing',
                                        ],
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-log-forwarding',
                                        ],
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-shield',
                                        ],
                                        [
                                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-default-newrelic',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-usage-metric' => [
                'type' => 'object',
                'description' => 'Provides details about views and visits for a subscription.',
                'required' => [
                    'metric',
                    'datapoints',
                    'metadata',
                    'last_data_at',
                ],
                'properties' => [
                    'metric' => [
                        'type' => 'string',
                        'description' => 'The type of metric requested.',
                        'enum' => [
                            'views',
                            'visits',
                        ],
                    ],
                    'datapoints' => [
                        'type' => 'array',
                        'description' => 'The data points for the pricing metrics request.',
                        'items' => [
                            'type' => 'array',
                            'description' => 'Each element includes the value for the requested metric and the sampling time.',
                            'items' => [
                                'type' => 'string',
                                'description' => 'The first element is the metric value and the second is the sampling time.',
                            ],
                        ],
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'description' => 'The metadata for the data points being returned.',
                        'properties' => [
                            'environment' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-metadata',
                            ],
                            'application' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-metadata',
                            ],
                            'subscription' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-metadata',
                            ],
                        ],
                    ],
                    'last_data_at' => [
                        'type' => 'string',
                        'description' => 'The last time data was polled for the requested metric.',
                        'format' => 'date-time',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_subscription-usage-metrics' => [
                'type' => 'object',
                'description' => 'A collection of usage metrics for a subscription.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of subscription metric items matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metric',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_shield-acl' => [
                'type' => 'object',
                'description' => 'Shield ACL rule.',
                'required' => [
                    'uuid',
                    'subscription',
                    'description',
                    'service',
                    'addresses',
                    'action',
                    'status',
                    '_links',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The unique identifier of the rule.',
                        'format' => 'uuid',
                    ],
                    'subscription' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The rule description.',
                    ],
                    'service' => [
                        'type' => 'string',
                        'description' => 'The service associated with the rule.',
                        'enum' => [
                            'ssh',
                        ],
                    ],
                    'addresses' => [
                        'type' => 'array',
                        'description' => 'The cidrs of the rule.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'cidr | ipv4',
                            'description' => 'The address in cidr or ipv4 format.',
                        ],
                    ],
                    'action' => [
                        'type' => 'string',
                        'description' => 'The action of the rule.',
                        'enum' => [
                            'allow',
                            'deny',
                        ],
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the rule.',
                        'enum' => [
                            'active',
                            'inactive',
                        ],
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_shield-acl-collection' => [
                'type' => 'object',
                'description' => 'Collection of Shield ACL rules.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of Shield ACL rules.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_shield-acl',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team-applications' => [
                'type' => 'object',
                'description' => 'A collection of applications associated with a team.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of applications.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-no-embedded',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team-invites' => [
                'type' => 'object',
                'description' => 'A collection of invites.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of invites matching the request parameters.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_post-invite' => [
                'type' => 'object',
                'required' => [
                    'email',
                    'roles',
                ],
                'properties' => [
                    'email' => [
                        'type' => 'string',
                        'description' => 'The email address of the user to invite to this team.',
                        'format' => 'email',
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'The role UUIDs to grant to the invitee.',
                        'items' => [
                            'type' => 'string',
                            'format' => 'uuid',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team-user-profile' => [
                'type' => 'object',
                'description' => 'A user profile for a team member.',
                'required' => [
                    'uuid',
                    'first_name',
                    'last_name',
                    'mail',
                    'picture_url',
                    'username',
                    'roles',
                ],
                'properties' => [
                    'uuid' => [
                        'type' => 'string',
                        'format' => 'uuid',
                        'description' => 'The user\'s UUID.',
                    ],
                    'first_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s first name.',
                    ],
                    'last_name' => [
                        'type' => 'string',
                        'description' => 'The user\'s last name.',
                    ],
                    'mail' => [
                        'type' => 'string',
                        'format' => 'email',
                        'description' => 'The user\'s email address.',
                    ],
                    'picture_url' => [
                        'type' => 'string',
                        'format' => 'uri',
                        'description' => 'The URI for the user\'s picture.',
                    ],
                    'username' => [
                        'type' => 'string',
                        'description' => 'The user\'s internal user name.',
                    ],
                    'roles' => [
                        'type' => 'array',
                        'description' => 'A collection of roles this user has access to on a team.',
                        'items' => [
                            '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role-stub',
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_team-members' => [
                'type' => 'object',
                'description' => 'A collection of team members.',
                'required' => [
                    'total',
                    '_links',
                    '_embedded',
                ],
                'properties' => [
                    'total' => [
                        'type' => 'integer',
                        'description' => 'The number of items returned in the collection.',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                    '_embedded' => [
                        'type' => 'object',
                        'description' => 'A collection of team member profiles.',
                        'properties' => [
                            'items' => [
                                'type' => 'array',
                                'items' => [
                                    '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-user-profile',
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_notification-labels' => [
                'type' => 'array',
                'description' => 'An array of various labels associated with a notification.',
                'items' => [
                    'type' => 'string',
                    'description' => 'Contextual information regarding the notification.',
                ],
            ],
            'Acquia_Cloud_API_Documentation_notification' => [
                'type' => 'object',
                'description' => 'A notification about an event or a task.',
                'required' => [
                    'progress',
                    'user',
                    'uuid',
                    'name',
                    'title',
                    'description',
                    'created_at',
                    'started_at',
                    'completed_at',
                    'status',
                    'type',
                    'metadata',
                    'labels',
                    '_links',
                ],
                'properties' => [
                    'progress' => [
                        'type' => 'integer',
                        'description' => 'The notification progress.',
                        'minimum' => 0,
                        'maximum' => 100,
                    ],
                    'user' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
                    ],
                    'uuid' => [
                        'type' => 'string',
                        'description' => 'The notification unique identifier.',
                        'format' => 'uuid',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The notification name.',
                    ],
                    'title' => [
                        'type' => 'string',
                        'description' => 'The operation title.',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'The notification description.',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time that this notification was created.',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time that the task or event this notification is tracking was started at.',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'The time that the task or event this notification is tracking was completed at.',
                    ],
                    'status' => [
                        'type' => 'string',
                        'description' => 'The status of the notification.',
                        'enum' => [
                            'completed',
                            'in-progress',
                            'failed',
                        ],
                    ],
                    'type' => [
                        'type' => 'string',
                        'description' => 'The notification type.',
                        'enum' => [
                            'task',
                            'event',
                        ],
                    ],
                    'metadata' => [
                        'type' => 'object',
                        'description' => 'A collection of metadata related to the notification.',
                        'properties' => [
                            'environments' => [
                                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-metadata',
                            ],
                        ],
                    ],
                    'labels' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-labels',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
                    ],
                ],
            ],
            'Acquia_Cloud_API_Documentation_Error' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_error',
            ],
            'Acquia_Cloud_API_Documentation_File' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file',
            ],
            'Acquia_Cloud_API_Documentation_Health' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_health',
            ],
            'Acquia_Cloud_API_Documentation_Links' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_links',
            ],
            'Acquia_Cloud_API_Documentation_Message' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message',
            ],
            'Acquia_Cloud_API_Documentation_MessageWithLinks' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_message-with-links',
            ],
            'Acquia_Cloud_API_Documentation_Pagination' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_pagination',
            ],
            'Acquia_Cloud_API_Documentation_Root' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_root',
            ],
            'Acquia_Cloud_API_Documentation_ValidationError' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_validation-error',
            ],
            'Acquia_Cloud_API_Documentation_AccountInvites' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_account-invites',
            ],
            'Acquia_Cloud_API_Documentation_Agreement' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_agreement',
            ],
            'Acquia_Cloud_API_Documentation_Agreements' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_agreements',
            ],
            'Acquia_Cloud_API_Documentation_Invitees' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invitees',
            ],
            'Acquia_Cloud_API_Documentation_Application' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-flags',
            ],
            'Acquia_Cloud_API_Documentation_Applications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationFeature' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-feature',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationFeatures' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-features',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationMetadata' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-metadata',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationNoEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-no-embedded',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationsNotifications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-notifications',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationsPermissions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-permissions',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-stub',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationsTasks' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-tasks',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationsTeams' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_applications-teams',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationDatabases' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-databases',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationDatabaseName' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-database-name',
            ],
            'Acquia_Cloud_API_Documentation_Artifact' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifact',
            ],
            'Acquia_Cloud_API_Documentation_Artifacts' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifacts',
            ],
            'Acquia_Cloud_API_Documentation_Code' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code',
            ],
            'Acquia_Cloud_API_Documentation_CodeFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-flags',
            ],
            'Acquia_Cloud_API_Documentation_ResourceTag' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag',
            ],
            'Acquia_Cloud_API_Documentation_ResourceTagEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag-embedded',
            ],
            'Acquia_Cloud_API_Documentation_ResourceTagOrganization' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tag-organization',
            ],
            'Acquia_Cloud_API_Documentation_ResourceTags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_resource-tags',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioApplication' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-application',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioApplications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-applications',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioOptions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-options',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioProject' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-project',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioProjectNoEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-project-no-embedded',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioSubscriptionMetadata' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-subscription-metadata',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioUser' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-user',
            ],
            'Acquia_Cloud_API_Documentation_CodeStudioUsers' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_code-studio-users',
            ],
            'Acquia_Cloud_API_Documentation_DomainRegistration' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration',
            ],
            'Acquia_Cloud_API_Documentation_DomainRegistrations' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registrations',
            ],
            'Acquia_Cloud_API_Documentation_DomainRegistrationDnsRecord' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration-dns-record',
            ],
            'Acquia_Cloud_API_Documentation_DomainRegistrationDnsRecords' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-registration-dns-records',
            ],
            'Acquia_Cloud_API_Documentation_Distribution' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_distribution',
            ],
            'Acquia_Cloud_API_Documentation_Distributions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_distributions',
            ],
            'Acquia_Cloud_API_Documentation_Email' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email',
            ],
            'Acquia_Cloud_API_Documentation_EmailDomain' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email-domain',
            ],
            'Acquia_Cloud_API_Documentation_EmailDomains' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_email-domains',
            ],
            'Acquia_Cloud_API_Documentation_Entitlements' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlements',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementPipelines' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-pipelines',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementCde' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-cde',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementConsumptionBasedPricing' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-consumption-based-pricing',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementLogForwarding' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-log-forwarding',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementDefaultNewRelic' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-default-newrelic',
            ],
            'Acquia_Cloud_API_Documentation_EntitlementShield' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_entitlement-shield',
            ],
            'Acquia_Cloud_API_Documentation_Apm' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm',
            ],
            'Acquia_Cloud_API_Documentation_ArtifactStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_artifact-stub',
            ],
            'Acquia_Cloud_API_Documentation_AvailableRuntimes' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_available-runtimes',
            ],
            'Acquia_Cloud_API_Documentation_Backup' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup',
            ],
            'Acquia_Cloud_API_Documentation_BackupNoEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup-no-embedded',
            ],
            'Acquia_Cloud_API_Documentation_Backups' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backups',
            ],
            'Acquia_Cloud_API_Documentation_BackupFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_backup-flags',
            ],
            'Acquia_Cloud_API_Documentation_Cdn' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cdn',
            ],
            'Acquia_Cloud_API_Documentation_CdnInformation' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cdn-information',
            ],
            'Acquia_Cloud_API_Documentation_Certificate' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificate',
            ],
            'Acquia_Cloud_API_Documentation_CertificateFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificate-flags',
            ],
            'Acquia_Cloud_API_Documentation_Certificates' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_certificates',
            ],
            'Acquia_Cloud_API_Documentation_CertificateSigningRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csr',
            ],
            'Acquia_Cloud_API_Documentation_CertificateSigningRequestFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csr-flags',
            ],
            'Acquia_Cloud_API_Documentation_CertificateSigningRequests' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_csrs',
            ],
            'Acquia_Cloud_API_Documentation_CloudAction' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-action',
            ],
            'Acquia_Cloud_API_Documentation_CloudActions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-actions',
            ],
            'Acquia_Cloud_API_Documentation_CloudActionsFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-actions-flags',
            ],
            'Acquia_Cloud_API_Documentation_CloudActionId' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cloud-action-id',
            ],
            'Acquia_Cloud_API_Documentation_Cron' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cron',
            ],
            'Acquia_Cloud_API_Documentation_CronFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cron-flags',
            ],
            'Acquia_Cloud_API_Documentation_Crons' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_crons',
            ],
            'Acquia_Cloud_API_Documentation_Database' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database',
            ],
            'Acquia_Cloud_API_Documentation_Databases' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_databases',
            ],
            'Acquia_Cloud_API_Documentation_DatabaseFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-flags',
            ],
            'Acquia_Cloud_API_Documentation_DatabasePhpConfig' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-php-config',
            ],
            'Acquia_Cloud_API_Documentation_DatabaseStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_database-stub',
            ],
            'Acquia_Cloud_API_Documentation_Dns' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns',
            ],
            'Acquia_Cloud_API_Documentation_DnsRecord' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_dns-record',
            ],
            'Acquia_Cloud_API_Documentation_Domain' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain',
            ],
            'Acquia_Cloud_API_Documentation_Domains' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domains',
            ],
            'Acquia_Cloud_API_Documentation_DomainFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-flags',
            ],
            'Acquia_Cloud_API_Documentation_DomainStatus' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-status',
            ],
            'Acquia_Cloud_API_Documentation_DomainStatusFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_domain-status-flags',
            ],
            'Acquia_Cloud_API_Documentation_EIP' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eip',
            ],
            'Acquia_Cloud_API_Documentation_EIPFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eip-flags',
            ],
            'Acquia_Cloud_API_Documentation_EIPs' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_eips',
            ],
            'Acquia_Cloud_API_Documentation_Environment' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentConfigurations' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-configuration',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-flags',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentMetadata' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-metadata',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentOptions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-options',
            ],
            'Acquia_Cloud_API_Documentation_Environments' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environments',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentSettings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-settings',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-stub',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentVariable' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-variable',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentVariables' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-variables',
            ],
            'Acquia_Cloud_API_Documentation_FileDownload' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_file-download',
            ],
            'Acquia_Cloud_API_Documentation_Log' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log',
            ],
            'Acquia_Cloud_API_Documentation_Logs' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_logs',
            ],
            'Acquia_Cloud_API_Documentation_Logstream' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_logstream',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingDestination' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingDestinations' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destinations',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingDestinationCredentials' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination-credentials',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingDestinationFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-destination-flags',
            ],
            'Acquia_Cloud_API_Documentation_OperatingSystems' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_operating-systems',
            ],
            'Acquia_Cloud_API_Documentation_PostCertificate' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-certificate',
            ],
            'Acquia_Cloud_API_Documentation_PostCron' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-cron',
            ],
            'Acquia_Cloud_API_Documentation_PostCsr' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-csr',
            ],
            'Acquia_Cloud_API_Documentation_PutCloudActions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cloud-actions',
            ],
            'Acquia_Cloud_API_Documentation_PutCron' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_put-cron',
            ],
            'Acquia_Cloud_API_Documentation_RemoteAdministration' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_remote-administration',
            ],
            'Acquia_Cloud_API_Documentation_Ssl' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssl',
            ],
            'Acquia_Cloud_API_Documentation_Vcs' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_vcs',
            ],
            'Acquia_Cloud_API_Documentation_DeployCodeRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_deploy-code',
            ],
            'Acquia_Cloud_API_Documentation_ImportSiteRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_import-site',
            ],
            'Acquia_Cloud_API_Documentation_SwitchCodeRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_switch-code',
            ],
            'Acquia_Cloud_API_Documentation_Ides' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ides',
            ],
            'Acquia_Cloud_API_Documentation_Ide' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ide',
            ],
            'Acquia_Cloud_API_Documentation_IdentityProvider' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-provider',
            ],
            'Acquia_Cloud_API_Documentation_IdentityProviders' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_identity-providers',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationUsageMetric' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metric',
            ],
            'Acquia_Cloud_API_Documentation_ApplicationUsageMetrics' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_application-usage-metrics',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentUsageMetric' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-usage-metric',
            ],
            'Acquia_Cloud_API_Documentation_EnvironmentUsageMetrics' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_environment-usage-metrics',
            ],
            'Acquia_Cloud_API_Documentation_Metrics' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_metrics',
            ],
            'Acquia_Cloud_API_Documentation_StackMetricsData' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_stack-metrics-data',
            ],
            'Acquia_Cloud_API_Documentation_StackMetricsMetric' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_stack-metrics-metric',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionUsageMetric' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metric',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionUsageMetrics' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-usage-metrics',
            ],
            'Acquia_Cloud_API_Documentation_Usage' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_usage',
            ],
            'Acquia_Cloud_API_Documentation_ModProxy' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_mod-proxy',
            ],
            'Acquia_Cloud_API_Documentation_Notification' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification',
            ],
            'Acquia_Cloud_API_Documentation_NotificationLabels' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-labels',
            ],
            'Acquia_Cloud_API_Documentation_NotificationStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-stub',
            ],
            'Acquia_Cloud_API_Documentation_NotificationTasks' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_notification-tasks',
            ],
            'Acquia_Cloud_API_Documentation_Organization' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationAdminInvite' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-invite',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationAdminInvites' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-invites',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationAdminUserProfile' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-user-profile',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationAdminUserProfiles' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-admin-user-profiles',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationApplications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-applications',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationAvailableTags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-available-tags',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationMembers' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-members',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationNoEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-no-embedded',
            ],
            'Acquia_Cloud_API_Documentation_Organizations' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organizations',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationsNotifications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organizations-notifications',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationStubEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-stub-embedded',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationTeamInvite' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-invite',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationTeamInvites' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-invites',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationTeamStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-team-stub',
            ],
            'Acquia_Cloud_API_Documentation_OrganizationUserProfile' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_organization-user-profile',
            ],
            'Acquia_Cloud_API_Documentation_CdeSize' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cde-size',
            ],
            'Acquia_Cloud_API_Documentation_CdeSizes' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_cde-sizes',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingSource' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-source',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingSources' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-sources',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingConsumer' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-consumer',
            ],
            'Acquia_Cloud_API_Documentation_LogForwardingConsumers' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_log-forwarding-consumers',
            ],
            'Acquia_Cloud_API_Documentation_Color' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_color',
            ],
            'Acquia_Cloud_API_Documentation_Colors' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_colors',
            ],
            'Acquia_Cloud_API_Documentation_ConfigurationSet' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-set',
            ],
            'Acquia_Cloud_API_Documentation_ConfigurationSets' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_configuration-sets',
            ],
            'Acquia_Cloud_API_Documentation_Index' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_index',
            ],
            'Acquia_Cloud_API_Documentation_Indexes' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_indexes',
            ],
            'Acquia_Cloud_API_Documentation_Search' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_search',
            ],
            'Acquia_Cloud_API_Documentation_Server' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server',
            ],
            'Acquia_Cloud_API_Documentation_Servers' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_servers',
            ],
            'Acquia_Cloud_API_Documentation_ServerConfiguration' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-configuration',
            ],
            'Acquia_Cloud_API_Documentation_ServerFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-flags',
            ],
            'Acquia_Cloud_API_Documentation_ServerStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_server-stub',
            ],
            'Acquia_Cloud_API_Documentation_Settings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_settings',
            ],
            'Acquia_Cloud_API_Documentation_HostingSettings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_hosting-settings',
            ],
            'Acquia_Cloud_API_Documentation_LegacyProductKeysSettings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_legacy-product-keys-settings',
            ],
            'Acquia_Cloud_API_Documentation_RemoteAdministrationSettings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_remote-administration-settings',
            ],
            'Acquia_Cloud_API_Documentation_SecuritySettings' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_security-settings',
            ],
            'Acquia_Cloud_API_Documentation_ShieldAclCollection' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_shield-acl-collection',
            ],
            'Acquia_Cloud_API_Documentation_ShieldAcl' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_shield-acl',
            ],
            'Acquia_Cloud_API_Documentation_ApmType' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm-type',
            ],
            'Acquia_Cloud_API_Documentation_ApmTypes' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_apm-types',
            ],
            'Acquia_Cloud_API_Documentation_Subscription' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionApplications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-applications',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-flags',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionMetadata' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-metadata',
            ],
            'Acquia_Cloud_API_Documentation_Subscriptions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscriptions',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub',
            ],
            'Acquia_Cloud_API_Documentation_SubscriptionStubEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_subscription-stub-embedded',
            ],
            'Acquia_Cloud_API_Documentation_Task' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_task',
            ],
            'Acquia_Cloud_API_Documentation_Invite' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite',
            ],
            'Acquia_Cloud_API_Documentation_InviteFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_invite-flags',
            ],
            'Acquia_Cloud_API_Documentation_Permission' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission',
            ],
            'Acquia_Cloud_API_Documentation_PermissionFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permission-flags',
            ],
            'Acquia_Cloud_API_Documentation_Permissions' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_permissions',
            ],
            'Acquia_Cloud_API_Documentation_PostInvite' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_post-invite',
            ],
            'Acquia_Cloud_API_Documentation_Role' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role',
            ],
            'Acquia_Cloud_API_Documentation_Roles' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_roles',
            ],
            'Acquia_Cloud_API_Documentation_RoleStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_role-stub',
            ],
            'Acquia_Cloud_API_Documentation_Team' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team',
            ],
            'Acquia_Cloud_API_Documentation_TeamInvites' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-invites',
            ],
            'Acquia_Cloud_API_Documentation_Teams' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_teams',
            ],
            'Acquia_Cloud_API_Documentation_TeamApplications' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-applications',
            ],
            'Acquia_Cloud_API_Documentation_TeamMembers' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-members',
            ],
            'Acquia_Cloud_API_Documentation_TeamStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-stub',
            ],
            'Acquia_Cloud_API_Documentation_TeamUserProfile' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_team-user-profile',
            ],
            'Acquia_Cloud_API_Documentation_HasPermission' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_has-permission',
            ],
            'Acquia_Cloud_API_Documentation_IsAdministrator' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-administrator',
            ],
            'Acquia_Cloud_API_Documentation_IsOwner' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_is-owner',
            ],
            'Acquia_Cloud_API_Documentation_PasswordValidation' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_password-validation',
            ],
            'Acquia_Cloud_API_Documentation_SshKey' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key',
            ],
            'Acquia_Cloud_API_Documentation_SshKeys' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-keys',
            ],
            'Acquia_Cloud_API_Documentation_Token' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token',
            ],
            'Acquia_Cloud_API_Documentation_TokenCreation' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token-creation',
            ],
            'Acquia_Cloud_API_Documentation_Tokens' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_tokens',
            ],
            'Acquia_Cloud_API_Documentation_User' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user',
            ],
            'Acquia_Cloud_API_Documentation_UserFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-flags',
            ],
            'Acquia_Cloud_API_Documentation_UserProfile' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-profile',
            ],
            'Acquia_Cloud_API_Documentation_UserStub' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub',
            ],
            'Acquia_Cloud_API_Documentation_UserStubEmbedded' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub-embedded',
            ],
            'Acquia_Cloud_API_Documentation_UserStubNullable' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_user-stub-nullable',
            ],
            'Acquia_Cloud_API_Documentation_PasswordRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_password',
            ],
            'Acquia_Cloud_API_Documentation_SshKeyRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ssh-key-request',
            ],
            'Acquia_Cloud_API_Documentation_TokenRequest' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_token-request',
            ],
            'Acquia_Cloud_API_Documentation_UxMessages' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-messages',
            ],
            'Acquia_Cloud_API_Documentation_UxMessage' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message',
            ],
            'Acquia_Cloud_API_Documentation_UxMessageFilters' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message-filters',
            ],
            'Acquia_Cloud_API_Documentation_UxMessageFlags' => [
                '$ref' => '#/components/schemas/Acquia_Cloud_API_Documentation_ux-message-flags',
            ],
            'Codebase_Service_Application' => [
                'type' => 'object',
                'description' => 'Gets applications by codebase ID.',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ApplicationId',
                    ],
                    'machine_name' => [
                        'type' => 'string',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_Application.jsonhal' => [
                'type' => 'object',
                'description' => 'Gets applications by codebase ID.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ApplicationId.jsonhal',
                    ],
                    'machine_name' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_ApplicationId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_ApplicationId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitch' => [
                'type' => 'object',
                'description' => 'Gets a Bulk Code Switch resource by its id and codebase.',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_BulkCodeSwitchId',
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId',
                    ],
                    'reference' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceName',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitch.Message' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/Codebase_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitch.Message.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/Codebase_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitch.jsonhal' => [
                'type' => 'object',
                'description' => 'Gets a Bulk Code Switch resource by its id and codebase.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_BulkCodeSwitchId.jsonhal',
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId.jsonhal',
                    ],
                    'reference' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceName.jsonhal',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitchId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitchId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitchTask' => [
                'type' => 'object',
                'description' => 'Gets status of tasks associated with bulk-code-switch id.',
                'deprecated' => false,
                'properties' => [
                    'task_id' => [
                        'type' => 'string',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'status' => [
                        'type' => 'string',
                    ],
                    'logs' => [
                        'type' => 'string',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'format' => 'date-time',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'format' => 'date-time',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_BulkCodeSwitchTask.jsonhal' => [
                'type' => 'object',
                'description' => 'Gets status of tasks associated with bulk-code-switch id.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'task_id' => [
                        'type' => 'string',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'status' => [
                        'type' => 'string',
                    ],
                    'logs' => [
                        'type' => 'string',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'started_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'format' => 'date-time',
                    ],
                    'completed_at' => [
                        'type' => 'string',
                        'nullable' => true,
                        'format' => 'date-time',
                    ],
                ],
            ],
            'Codebase_Service_Codebase' => [
                'type' => 'object',
                'description' => 'Gets a codebase by its ID',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Label',
                    ],
                    'region' => [
                        'type' => 'string',
                        'enum' => [
                            'us-east-1',
                            'eu-west-1',
                            'us-west-2',
                            'ap-northeast-1',
                            'ap-southeast-1',
                            'ap-southeast-2',
                            'ca-central-1',
                            'eu-central-1',
                        ],
                    ],
                    'vcs_url' => [
                        '$ref' => '#/components/schemas/Codebase_Service_VcsUrl',
                    ],
                    'repository_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_VcsRepositoryId',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'updated_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Description',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                    'hash' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseHash',
                    ],
                    'subscription' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Subscription',
                    ],
                    'applications_total' => [
                        'type' => 'integer',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_Codebase.Message' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/Codebase_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_Codebase.Message.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/Codebase_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'Codebase_Service_Codebase.jsonhal' => [
                'type' => 'object',
                'description' => 'Gets a codebase by its ID',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId.jsonhal',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Label.jsonhal',
                    ],
                    'region' => [
                        'type' => 'string',
                        'enum' => [
                            'us-east-1',
                            'eu-west-1',
                            'us-west-2',
                            'ap-northeast-1',
                            'ap-southeast-1',
                            'ap-southeast-2',
                            'ca-central-1',
                            'eu-central-1',
                        ],
                    ],
                    'vcs_url' => [
                        '$ref' => '#/components/schemas/Codebase_Service_VcsUrl.jsonhal',
                    ],
                    'repository_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_VcsRepositoryId.jsonhal',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'updated_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Description.jsonhal',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                    'hash' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseHash.jsonhal',
                    ],
                    'subscription' => [
                        '$ref' => '#/components/schemas/Codebase_Service_Subscription.jsonhal',
                    ],
                    'applications_total' => [
                        'type' => 'integer',
                    ],
                ],
            ],
            'Codebase_Service_CodebaseHash' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_CodebaseHash.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_CodebaseId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_CodebaseId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_Description' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_Description.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_HealthCheck' => [
                'type' => 'object',
                'description' => 'Checks that the service is up.',
                'deprecated' => false,
                'properties' => [
                    'status' => [
                        'type' => 'string',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_HealthCheck.jsonhal' => [
                'type' => 'object',
                'description' => 'Checks that the service is up.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'status' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_Label' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_Label.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_LocalId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_LocalId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_Reference' => [
                'type' => 'object',
                'description' => 'Retrieves a list of git references by codebase.',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceId',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceName',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'BRANCH',
                            'TAG',
                        ],
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_Reference.jsonhal' => [
                'type' => 'object',
                'description' => 'Retrieves a list of git references by codebase.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceId.jsonhal',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/Codebase_Service_ReferenceName.jsonhal',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'BRANCH',
                            'TAG',
                        ],
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_CodebaseId.jsonhal',
                    ],
                ],
            ],
            'Codebase_Service_ReferenceId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_ReferenceId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_ReferenceName' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_ReferenceName.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_Subscription' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_SubscriptionId',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Codebase_Service_Subscription.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Codebase_Service_SubscriptionId.jsonhal',
                    ],
                ],
            ],
            'Codebase_Service_SubscriptionId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_SubscriptionId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_TranslatableMessage' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                        'nullable' => true,
                    ],
                ],
            ],
            'Codebase_Service_TranslatableMessage.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                        'nullable' => true,
                    ],
                ],
            ],
            'Codebase_Service_UriInterface' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'scheme' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the scheme component of the URI.',
                        'type' => 'string',
                    ],
                    'authority' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the authority component of the URI.',
                        'type' => 'string',
                    ],
                    'userInfo' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the user information component of the URI.',
                        'type' => 'string',
                    ],
                    'host' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the host component of the URI.',
                        'type' => 'string',
                    ],
                    'port' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the port component of the URI.',
                        'type' => 'integer',
                        'nullable' => true,
                    ],
                    'path' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the path component of the URI.',
                        'type' => 'string',
                    ],
                    'query' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the query string of the URI.',
                        'type' => 'string',
                    ],
                    'fragment' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the fragment component of the URI.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_UriInterface.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'scheme' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the scheme component of the URI.',
                        'type' => 'string',
                    ],
                    'authority' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the authority component of the URI.',
                        'type' => 'string',
                    ],
                    'userInfo' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the user information component of the URI.',
                        'type' => 'string',
                    ],
                    'host' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the host component of the URI.',
                        'type' => 'string',
                    ],
                    'port' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the port component of the URI.',
                        'type' => 'integer',
                        'nullable' => true,
                    ],
                    'path' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the path component of the URI.',
                        'type' => 'string',
                    ],
                    'query' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the query string of the URI.',
                        'type' => 'string',
                    ],
                    'fragment' => [
                        'readOnly' => true,
                        'description' => 'Retrieve the fragment component of the URI.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Codebase_Service_VcsRepositoryId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_VcsRepositoryId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Codebase_Service_VcsUrl' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'url' => [
                        '$ref' => '#/components/schemas/Codebase_Service_UriInterface',
                    ],
                ],
            ],
            'Codebase_Service_VcsUrl.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'url' => [
                        '$ref' => '#/components/schemas/Codebase_Service_UriInterface.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_ApplicationId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_ApplicationId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_Cname' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Cname.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Codebase' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'array',
                            'items' => [
                                'type' => 'string',
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_CodebaseId',
                    ],
                ],
            ],
            'MEO_Environment_Service_Codebase.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_CodebaseId.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_CodebaseId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_CodebaseId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_Database' => [
                'type' => 'object',
                'description' => 'Retrieve database info based on the site instance.',
                'deprecated' => false,
                'properties' => [
                    'database_host' => [
                        'type' => 'string',
                    ],
                    'database_name' => [
                        'type' => 'string',
                    ],
                    'database_role' => [
                        'type' => 'string',
                    ],
                    'database_password' => [
                        'type' => 'string',
                    ],
                    'database_user_name' => [
                        'type' => 'string',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_Database.Message' => [
                'type' => 'object',
                'description' => 'Create a new backup for the site instance Db.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_Database.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Create a new backup for the site instance Db.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_Database.jsonhal' => [
                'type' => 'object',
                'description' => 'Retrieve database info based on the site instance.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'database_host' => [
                        'type' => 'string',
                    ],
                    'database_name' => [
                        'type' => 'string',
                    ],
                    'database_role' => [
                        'type' => 'string',
                    ],
                    'database_password' => [
                        'type' => 'string',
                    ],
                    'database_user_name' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackup' => [
                'type' => 'object',
                'description' => 'Retrieves details about a backup by its id associated with site(a site-instance).',
                'deprecated' => false,
                'properties' => [
                    'site' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'environment' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseBackupId',
                    ],
                    'database_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseId',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'DAILY',
                            'ON_DEMAND',
                            'INVALID',
                        ],
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackup.Message' => [
                'type' => 'object',
                'description' => 'Restore a backup for the site instance Db.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackup.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Restore a backup for the site instance Db.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackup.jsonhal' => [
                'type' => 'object',
                'description' => 'Retrieves details about a backup by its id associated with site(a site-instance).',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'site' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'environment' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseBackupId.jsonhal',
                    ],
                    'database_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DatabaseId.jsonhal',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                    ],
                    'type' => [
                        'type' => 'string',
                        'enum' => [
                            'DAILY',
                            'ON_DEMAND',
                            'INVALID',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackupId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseBackupId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_DatabaseId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_Description' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Description.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Domain' => [
                'type' => 'object',
                'description' => 'Get a site instance domain.',
                'deprecated' => false,
                'properties' => [
                    'domain' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainInfo',
                    ],
                    'site' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'environment' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'name' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Domain.Message' => [
                'type' => 'object',
                'description' => 'Associate a site and environment with a domain.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_Domain.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Associate a site and environment with a domain.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_Domain.jsonhal' => [
                'type' => 'object',
                'description' => 'Get a site instance domain.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'domain' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainInfo.jsonhal',
                    ],
                    'site' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'environment' => [
                        'type' => 'string',
                        'format' => 'iri-reference',
                        'example' => 'https://example.com/',
                    ],
                    'name' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainInfo' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'name' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainName',
                    ],
                    'is_managed' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainInfo.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainName.jsonhal',
                    ],
                    'is_managed' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainName' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainName.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainStatus' => [
                'type' => 'object',
                'description' => 'Get a site instance domain status.',
                'deprecated' => false,
                'properties' => [
                    'hostname' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainName',
                    ],
                    'site_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_SiteId',
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId',
                    ],
                    'ip_addresses' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_IpAddress',
                        ],
                    ],
                    'cnames' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_Cname',
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Flags',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_DomainStatus.jsonhal' => [
                'type' => 'object',
                'description' => 'Get a site instance domain status.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'hostname' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_DomainName.jsonhal',
                    ],
                    'site_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_SiteId.jsonhal',
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId.jsonhal',
                    ],
                    'ip_addresses' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_IpAddress.jsonhal',
                        ],
                    ],
                    'cnames' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_Cname.jsonhal',
                        ],
                    ],
                    'flags' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Flags.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_Environment' => [
                'type' => 'object',
                'description' => 'Lists all environments for a codebase.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'array',
                            'items' => [
                                'type' => 'string',
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_MachineName',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Label',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Description',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'normal',
                            'allocated',
                            'launching',
                            'killed',
                            'cancelled',
                            'stopped',
                        ],
                    ],
                    'reference' => [
                        'type' => 'string',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                    'properties' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'integer',
                        ],
                    ],
                    'codebase' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Codebase',
                    ],
                    'code_switch_status' => [
                        'type' => 'string',
                        'enum' => [
                            'IDLE',
                            'IN_PROGRESS',
                        ],
                    ],
                    'ssh_url' => [
                        'type' => 'string',
                    ],
                    'application_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_ApplicationId',
                    ],
                ],
            ],
            'MEO_Environment_Service_Environment.Message' => [
                'type' => 'object',
                'description' => 'Updates an environment by ID.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_Environment.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Updates an environment by ID.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_Environment.jsonhal' => [
                'type' => 'object',
                'description' => 'Lists all environments for a codebase.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId.jsonhal',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_MachineName.jsonhal',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Label.jsonhal',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Description.jsonhal',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'normal',
                            'allocated',
                            'launching',
                            'killed',
                            'cancelled',
                            'stopped',
                        ],
                    ],
                    'reference' => [
                        'type' => 'string',
                    ],
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                    'properties' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'integer',
                        ],
                    ],
                    'codebase' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Codebase.jsonhal',
                    ],
                    'code_switch_status' => [
                        'type' => 'string',
                        'enum' => [
                            'IDLE',
                            'IN_PROGRESS',
                        ],
                    ],
                    'ssh_url' => [
                        'type' => 'string',
                    ],
                    'application_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_ApplicationId.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_EnvironmentId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_EnvironmentId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_Flags' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_Flags.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'flags' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'boolean',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_HealthStatus' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'code' => [
                        'type' => 'string',
                    ],
                    'summary' => [
                        'type' => 'string',
                    ],
                    'details' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_HealthStatus.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'code' => [
                        'type' => 'string',
                    ],
                    'summary' => [
                        'type' => 'string',
                    ],
                    'details' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_IpAddress' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_IpAddress.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Label' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_Label.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_LocalId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_LocalId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_MachineName' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_MachineName.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_PrivateNetworkId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_PrivateNetworkId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_PrivateNetworkReference' => [
                'type' => 'object',
                'description' => 'Get the private network associated with an environment',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_PrivateNetworkId',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Label',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_PrivateNetworkReference.jsonhal' => [
                'type' => 'object',
                'description' => 'Get the private network associated with an environment',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_PrivateNetworkId.jsonhal',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_Label.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteInstance' => [
                'type' => 'object',
                'description' => 'Retrieve details about an environment association with a site (a site instance).',
                'deprecated' => false,
                'properties' => [
                    'site_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_SiteId',
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'SITE_INSTANCE_STATUS_UNSPECIFIED',
                            'SITE_INSTANCE_STATUS_PENDING',
                            'SITE_INSTANCE_STATUS_READY',
                            'SITE_INSTANCE_STATUS_FAILED',
                            'SITE_INSTANCE_STATUS_MARKED_FOR_DELETION',
                            'SITE_INSTANCE_STATUS_DELETING',
                            'SITE_INSTANCE_STATUS_DELETED',
                            'SITE_INSTANCE_STATUS_DELETE_FAILED',
                            'SITE_INSTANCE_STATUS_SYNCING',
                            'SITE_INSTANCE_STATUS_FINALIZING',
                            'SITE_INSTANCE_STATUS_DISABLED',
                        ],
                    ],
                    'health_status' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_HealthStatus',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_DomainInfo',
                        ],
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteInstance.Message' => [
                'type' => 'object',
                'description' => 'Dissociate a site and environment with no grace period.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteInstance.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Dissociate a site and environment with no grace period.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_SiteInstance.jsonhal' => [
                'type' => 'object',
                'description' => 'Retrieve details about an environment association with a site (a site instance).',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'site_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_SiteId.jsonhal',
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId.jsonhal',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'SITE_INSTANCE_STATUS_UNSPECIFIED',
                            'SITE_INSTANCE_STATUS_PENDING',
                            'SITE_INSTANCE_STATUS_READY',
                            'SITE_INSTANCE_STATUS_FAILED',
                            'SITE_INSTANCE_STATUS_MARKED_FOR_DELETION',
                            'SITE_INSTANCE_STATUS_DELETING',
                            'SITE_INSTANCE_STATUS_DELETED',
                            'SITE_INSTANCE_STATUS_DELETE_FAILED',
                            'SITE_INSTANCE_STATUS_SYNCING',
                            'SITE_INSTANCE_STATUS_FINALIZING',
                            'SITE_INSTANCE_STATUS_DISABLED',
                        ],
                    ],
                    'health_status' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_HealthStatus.jsonhal',
                    ],
                    'domains' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/MEO_Environment_Service_DomainInfo.jsonhal',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_TranslatableMessage' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_TranslatableMessage.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'MEO_Environment_Service_TrustedProxies' => [
                'type' => 'object',
                'description' => 'Retrieves trusted proxy configuration for an environment.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'array',
                            'items' => [
                                'type' => 'string',
                            ],
                        ],
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId',
                    ],
                    'cidrs_ipv4' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'cidrs_ipv6' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'associated_cdns' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_TrustedProxies.Message' => [
                'type' => 'object',
                'description' => 'Updates trusted proxy configuration for an environment.',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'MEO_Environment_Service_TrustedProxies.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Updates trusted proxy configuration for an environment.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'MEO_Environment_Service_TrustedProxies.jsonhal' => [
                'type' => 'object',
                'description' => 'Retrieves trusted proxy configuration for an environment.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'environment_id' => [
                        '$ref' => '#/components/schemas/MEO_Environment_Service_EnvironmentId.jsonhal',
                    ],
                    'cidrs_ipv4' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'cidrs_ipv6' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'associated_cdns' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_Message' => [
                'type' => 'object',
                'required' => [
                    'message',
                ],
                'properties' => [
                    'message' => [
                        'type' => 'string',
                        'description' => 'Message describing the operation result',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_UpdatePrivateNetworkRequestSpec' => [
                'type' => 'object',
                'properties' => [
                    'description' => [
                        'type' => 'string',
                    ],
                    'label' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Private_Network_Service_API_UpdateConnectionRequestSpec' => [
                'type' => 'object',
                'properties' => [
                    'private_egress_access' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateEgressAccess',
                    ],
                ],
            ],
            'Private_Network_Service_API_Isolation' => [
                'type' => 'object',
                'properties' => [
                    'dedicated_compute' => [
                        'type' => 'boolean',
                    ],
                    'dedicated_network' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'Private_Network_Service_API_IsolationResponse' => [
                'type' => 'object',
                'properties' => [
                    'dedicated_compute' => [
                        'type' => 'boolean',
                    ],
                    'dedicated_network' => [
                        'type' => 'boolean',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_Ingress' => [
                'type' => 'object',
                'properties' => [
                    'drupal_ssh' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_DrupalSSH',
                    ],
                ],
            ],
            'Private_Network_Service_API_IngressResponse' => [
                'type' => 'object',
                'properties' => [
                    'drupal_ssh' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_DrupalSSH',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_DrupalSSH' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'ingress_acls' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'private' => [
                        'type' => 'boolean',
                        'default' => false,
                    ],
                ],
            ],
            'Private_Network_Service_API_PrivateEgressAccess' => [
                'type' => 'object',
                'properties' => [
                    'drupal' => [
                        'type' => 'boolean',
                    ],
                ],
            ],
            'Private_Network_Service_API_ConnectionsResponse' => [
                'type' => 'object',
                'required' => [
                    'cidr',
                ],
                'description' => 'Connections block of a private network',
                'properties' => [
                    'cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                    'private_egress_access' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateEgressAccess',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_Connections' => [
                'type' => 'object',
                'required' => [
                    'cidr',
                ],
                'properties' => [
                    'private_egress_access' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateEgressAccess',
                    ],
                    'cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                    'vpns' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPN',
                        ],
                    ],
                    'vpc_peers' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPCPeers',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_VPN' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'gateway_ip',
                    'routes',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'gateway_ip' => [
                        'type' => 'string',
                        'format' => 'ipv4',
                    ],
                    'routes' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                        ],
                    ],
                    'tunnel1' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_Tunnel',
                    ],
                    'tunnel2' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_Tunnel',
                    ],
                ],
            ],
            'Private_Network_Service_API_VPNResponse' => [
                'type' => 'object',
                'required' => [
                    'name',
                    'gateway_ip',
                    'routes',
                ],
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'gateway_ip' => [
                        'type' => 'string',
                        'format' => 'ipv4',
                    ],
                    'routes' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                            'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                        ],
                    ],
                    'tunnel1' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_TunnelResponse',
                    ],
                    'tunnel2' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_TunnelResponse',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_Tunnel' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'shared_key' => [
                        'type' => 'string',
                    ],
                    'internal_cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                    'ike_versions' => [
                        'type' => 'string',
                    ],
                    'startup_action' => [
                        'type' => 'string',
                    ],
                    'dpd_timeout_action' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Private_Network_Service_API_TunnelResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'shared_key' => [
                        'type' => 'string',
                    ],
                    'internal_cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                    'ike_versions' => [
                        'type' => 'string',
                    ],
                    'startup_action' => [
                        'type' => 'string',
                    ],
                    'dpd_timeout_action' => [
                        'type' => 'string',
                    ],
                    'address' => [
                        'type' => 'string',
                        'format' => 'ipv4',
                    ],
                ],
            ],
            'Private_Network_Service_API_VPCPeers' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'aws_account' => [
                        'type' => 'string',
                    ],
                    'vpc_id' => [
                        'type' => 'string',
                    ],
                    'vpc_cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                ],
            ],
            'Private_Network_Service_API_VPCPeersResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'integer',
                    ],
                    'name' => [
                        'type' => 'string',
                    ],
                    'aws_account' => [
                        'type' => 'string',
                    ],
                    'vpc_id' => [
                        'type' => 'string',
                    ],
                    'vpc_cidr' => [
                        'type' => 'string',
                        'pattern' => '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$',
                    ],
                    'peering_connection_id' => [
                        'type' => 'string',
                        'description' => 'The ID of the peering connection (optional)',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                    ],
                ],
            ],
            'Private_Network_Service_API_HalLink' => [
                'type' => 'object',
                'description' => 'HAL link object',
                'properties' => [
                    'href' => [
                        'type' => 'string',
                        'anyOf' => [
                            [
                                'format' => 'uri',
                            ],
                            [
                                'format' => 'uri-template',
                            ],
                        ],
                        'description' => 'The target URI of the link (can be a URI or URI template)',
                    ],
                ],
                'required' => [
                    'href',
                ],
            ],
            'Private_Network_Service_API_HalItem' => [
                'type' => 'object',
                'properties' => [
                    'self' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'parent' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                ],
                'required' => [
                    'self',
                ],
            ],
            'Private_Network_Service_API_LinkType' => [
                'type' => 'object',
                'required' => [
                    'href',
                ],
                'properties' => [
                    'href' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Private_Network_Service_API_Error' => [
                'type' => 'object',
                'required' => [
                    'message',
                    'error',
                ],
                'properties' => [
                    'error' => [
                        'type' => 'string',
                    ],
                    'message' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Private_Network_Service_API_ValidationError' => [
                'type' => 'object',
                'properties' => [
                    'error' => [
                        'type' => 'string',
                    ],
                    'message' => [
                        'type' => 'object',
                        'additionalProperties' => [
                            'type' => 'string',
                        ],
                        'example' => [
                            'fieldName' => 'This field is required',
                            'another_field' => 'Invalid value provided',
                        ],
                    ],
                ],
                'required' => [
                    'error',
                    'message',
                ],
            ],
            'Private_Network_Service_API_PrivateNetworkResponse' => [
                'type' => 'object',
                'properties' => [
                    'id' => [
                        'type' => 'string',
                    ],
                    'subscription_id' => [
                        'type' => 'string',
                    ],
                    'region' => [
                        'type' => 'string',
                        'description' => 'The region where the private network is deployed',
                    ],
                    'name' => [
                        'type' => 'string',
                        'description' => 'The name of the private network',
                    ],
                    'description' => [
                        'type' => 'string',
                        'description' => 'A brief description of the private network',
                    ],
                    'label' => [
                        'type' => 'string',
                        'description' => 'A label for the private network',
                    ],
                    'status' => [
                        'type' => 'string',
                        'enum' => [
                            'creating',
                            'active',
                            'create-failed',
                            'updating',
                            'update-failed',
                            'deleting',
                            'deleted',
                            'delete-failed',
                        ],
                        'description' => 'The current status of the private network',
                    ],
                    'created_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'Timestamp when the private network was created',
                    ],
                    'updated_at' => [
                        'type' => 'string',
                        'format' => 'date-time',
                        'description' => 'Timestamp when the private network was last updated',
                    ],
                    '_links' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateNetworkHALLinks',
                    ],
                ],
            ],
            'Private_Network_Service_API_PrivateNetworkHALLinks' => [
                'required' => [
                    'self',
                ],
                'properties' => [
                    'self' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'isolation' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'ingress' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'connections' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'vpns' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                    'vpc_peers' => [
                        '$ref' => '#/components/schemas/Private_Network_Service_API_HalLink',
                    ],
                ],
            ],
            'Private_Network_Service_API_EmbeddedPrivateNetworkList' => [
                'type' => 'object',
                'properties' => [
                    'items' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateNetworkResponse',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_EmbeddedVPCPeerList' => [
                'type' => 'object',
                'properties' => [
                    'items' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPCPeersResponse',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_EmbeddedVPNList' => [
                'type' => 'object',
                'properties' => [
                    'items' => [
                        'type' => 'array',
                        'items' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPNResponse',
                        ],
                    ],
                ],
            ],
            'Site_Service_CodebaseId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Site_Service_CodebaseId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Site_Service_Label' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_Label.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_LocalId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_LocalId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'description' => 'Constructor.',
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_Site' => [
                'type' => 'object',
                'description' => 'Get a list of sites accessible by the user.',
                'deprecated' => false,
                'properties' => [
                    'id' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteId',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteName',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/Site_Service_Label',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteDescription',
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Site_Service_CodebaseId',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Site_Service_Site.Message' => [
                'type' => 'object',
                'description' => 'Update a site details',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        '$ref' => '#/components/schemas/Site_Service_TranslatableMessage',
                    ],
                    '_links' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                ],
            ],
            'Site_Service_Site.Message.jsonhal' => [
                'type' => 'object',
                'description' => 'Update a site details',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        '$ref' => '#/components/schemas/Site_Service_TranslatableMessage.jsonhal',
                    ],
                ],
            ],
            'Site_Service_Site.jsonhal' => [
                'type' => 'object',
                'description' => 'Get a list of sites accessible by the user.',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'id' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteId.jsonhal',
                    ],
                    'name' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteName.jsonhal',
                    ],
                    'label' => [
                        '$ref' => '#/components/schemas/Site_Service_Label.jsonhal',
                    ],
                    'description' => [
                        '$ref' => '#/components/schemas/Site_Service_SiteDescription.jsonhal',
                    ],
                    'codebase_id' => [
                        '$ref' => '#/components/schemas/Site_Service_CodebaseId.jsonhal',
                    ],
                ],
            ],
            'Site_Service_SiteDescription' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_SiteDescription.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_SiteId' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Site_Service_SiteId.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'local_id' => [
                        'readOnly' => true,
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                    'urn' => [
                        'readOnly' => true,
                        'type' => 'string',
                    ],
                    'attribute' => [
                        'readOnly' => true,
                        'description' => 'Retrieves the resource ID\'s metadata.',
                    ],
                    'prefix' => [
                        'readOnly' => true,
                    ],
                ],
            ],
            'Site_Service_SiteName' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_SiteName.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'value' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_TranslatableMessage' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                    ],
                ],
            ],
            'Site_Service_TranslatableMessage.jsonhal' => [
                'type' => 'object',
                'description' => '',
                'deprecated' => false,
                'properties' => [
                    '_links' => [
                        'type' => 'object',
                        'properties' => [
                            'self' => [
                                'type' => 'object',
                                'properties' => [
                                    'href' => [
                                        'type' => 'string',
                                        'format' => 'iri-reference',
                                    ],
                                ],
                            ],
                        ],
                    ],
                    'message' => [
                        'type' => 'string',
                    ],
                    'parameters' => [
                        'type' => 'array',
                        'items' => [
                            'type' => 'string',
                        ],
                    ],
                    'domain' => [
                        'type' => 'string',
                    ],
                ],
            ],
        ],
        'securitySchemes' => [
            'Acquia_Cloud_API_Documentation_OAuth2' => [
                'type' => 'oauth2',
                'description' => 'All Cloud API calls need to be authenticated in order to work. You authenticate using a token that you can generate on your Acquia Profile page.'."\n"
                    ."\n"
                    .'### To generate a token:'."\n"
                    ."\n"
                    .'1. Sign in to the [Acquia Cloud](https://cloud.acquia.com/) interface using your email address and Acquia password.'."\n"
                    .'2. Click your user avatar in the upper right corner, and then click **Account Settings**.'."\n"
                    .'3. On the Profile page, click **API Tokens**.'."\n"
                    .'4. Click **Create Token**.'."\n"
                    .'5. In the pop-up that appears, give your token a label so that you can easily find it later. Then click **Create Token**.'."\n"
                    .'6. Copy your API key and API secret. Click **OK**.'."\n",
                'flows' => [
                    'clientCredentials' => [
                        'tokenUrl' => 'https://accounts.acquia.com/api/token',
                        'scopes' => [],
                    ],
                ],
            ],
            'Codebase_Service_JWT' => [
                'type' => 'apiKey',
                'description' => 'Value for the Authorization header parameter.',
                'name' => 'Authorization',
                'in' => 'header',
            ],
            'MEO_Environment_Service_JWT' => [
                'type' => 'apiKey',
                'description' => 'Value for the Authorization header parameter.',
                'name' => 'Authorization',
                'in' => 'header',
            ],
            'Site_Service_JWT' => [
                'type' => 'apiKey',
                'description' => 'Value for the Authorization header parameter.',
                'name' => 'Authorization',
                'in' => 'header',
            ],
        ],
        'responses' => [
            'Private_Network_Service_API_ForbiddenError' => [
                'description' => 'Forbidden',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'forbidden',
                            'message' => 'You do not have permission to perform this action.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_ValidationError' => [
                'description' => 'Validation failed',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_ValidationError',
                        ],
                        'example' => [
                            'error' => 'validation_failed',
                            'message' => [
                                'region' => 'region is required',
                                'another_field' => 'Invalid value provided',
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_NotFoundError' => [
                'description' => 'Resource not found',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'not_found',
                            'message' => 'The requested resource could not be found.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_BadRequestError' => [
                'description' => 'Bad request',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'bad_request',
                            'message' => 'The request was invalid or cannot be served. Check the request parameters and try again.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_UnauthorizedError' => [
                'description' => 'Unauthorized',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'unauthorized',
                            'message' => 'You must be authenticated to access this resource.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_ConflictError' => [
                'description' => 'Conflict',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'conflict',
                            'message' => 'The request could not be completed due to a conflict with the current state of the resource.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_InternalServerError' => [
                'description' => 'Internal server error',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_Error',
                        ],
                        'example' => [
                            'error' => 'system',
                            'message' => 'An unknown error occurred. Please try your request again. If the problem persists, contact Acquia Support. Request ID: abc123-def456-ghi789.',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_PrivateNetwork' => [
                'description' => 'Response for GET /private-networks/{privateNetworkId}',
                'x-go-name' => 'PrivateNetworkGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_PrivateNetworkResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000',
                                ],
                                'isolation' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/isolation',
                                ],
                                'ingress' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/ingress',
                                ],
                                'connections' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections',
                                ],
                                'vpns' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpns',
                                ],
                                'vpc_peers' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpc-peers',
                                ],
                            ],
                            'id' => '123e4567-e89b-12d3-a456-426614174000',
                            'subscription_id' => '123e4567-e89b-12d3-a456-426614174000',
                            'region' => 'us-east-1',
                            'name' => 'ngc-private-network',
                            'description' => 'Private network for NGC',
                            'label' => 'ngc-private',
                            'status' => 'active',
                            'created_at' => '2023-10-01T12:00:00.000Z',
                            'updated_at' => '2023-10-01T12:00:00.000Z',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_Connection' => [
                'description' => 'Response for GET /private-networks/{privateNetworkId}/connections',
                'x-go-name' => 'ConnectionGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_ConnectionsResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections',
                                ],
                                'parent' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                ],
                            ],
                            'cidr' => '1.1.1.1/11',
                            'private_egress_access' => [
                                'drupal' => true,
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_Isolation' => [
                'description' => 'Response for GET /private-networks/{privateNetworkId}/isolation',
                'x-go-name' => 'IsolationGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_IsolationResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/isolation',
                                ],
                                'parent' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                ],
                            ],
                            'dedicated_compute' => true,
                            'dedicated_network' => true,
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_VpcPeer' => [
                'description' => 'VPC Peer details',
                'x-go-name' => 'VpcPeerGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPCPeersResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpc-peers/1',
                                ],
                                'parent' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                ],
                            ],
                            'name' => 'vpcPeer1',
                            'id' => 1,
                            'aws_account' => '123456789012',
                            'vpc_id' => 'vpc-1234567890abcdef0',
                            'vpc_cidr' => '120.24.16.1/24',
                            'peering_connection_id' => 'pcx-1234567890abcdef0',
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_Vpn' => [
                'description' => 'VPN details',
                'x-go-name' => 'VpnGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_VPNResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/connections/vpns/test-vpn',
                                ],
                                'parent' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                ],
                            ],
                            'id' => 1,
                            'name' => 'test-vpn',
                            'gateway_ip' => '192.1.1.0',
                            'routes' => [
                                '192.1.1.0/14',
                                '192.1.2.0/14',
                            ],
                            'tunnel1' => [
                                'shared_key' => 'sharedKey1',
                                'internal_cidr' => '1.1.1.1/24',
                                'ike_versions' => '1',
                                'startup_action' => 'start',
                                'dpd_timeout_action' => 'stop',
                            ],
                            'tunnel2' => [
                                'shared_key' => 'sharedKey2',
                                'internal_cidr' => '1.1.1.1/24',
                                'ike_versions' => '2',
                                'startup_action' => 'start',
                                'dpd_timeout_action' => 'stop',
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_Ingress' => [
                'description' => 'Ingress details',
                'x-go-name' => 'IngressGetResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            '$ref' => '#/components/schemas/Private_Network_Service_API_IngressResponse',
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000/ingress',
                                ],
                                'parent' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                ],
                            ],
                            'drupal_ssh' => [
                                'ingress_acls' => [
                                    'test-acls',
                                ],
                                'private' => false,
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_PrivateNetworkList' => [
                'description' => 'List of private networks',
                'x-go-name' => 'PrivateNetworkListResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            'type' => 'object',
                            'required' => [
                                'count',
                                'total',
                            ],
                            'properties' => [
                                'count' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries in this page',
                                ],
                                'total' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries available',
                                ],
                                '_embedded' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_EmbeddedPrivateNetworkList',
                                ],
                                '_links' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                                ],
                            ],
                            'example' => [
                                '_links' => [
                                    'self' => [
                                        'href' => 'https://cloud.acquia.com/api/subscriptions/123e4567-e89b-12d3-a456-426614174000/private-networks',
                                    ],
                                ],
                                'count' => 2,
                                'total' => 2,
                                '_embedded' => [
                                    'items' => [
                                        [
                                            'subscription_id' => '123e4567-e89b-12d3-a456-426614174000',
                                            'region' => 'us-east-1',
                                            'id' => '456e4567-e89b-11d3-a789-426614174000',
                                            'status' => 'active',
                                            'name' => 'test-private-network-1',
                                            'label' => 'some label',
                                            'description' => 'Private network description',
                                            'created_at' => '2021-01-01T00:00:00.000Z',
                                            'updated_at' => '2021-01-01T00:00:00.000Z',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174000',
                                                ],
                                            ],
                                        ],
                                        [
                                            'subscription_id' => '123e4567-e89b-12d3-a456-426614174000',
                                            'region' => 'us-east-1',
                                            'id' => '456e4567-e89b-11d3-a789-426614174001',
                                            'status' => 'creating',
                                            'name' => 'test-private-network-2',
                                            'label' => 'some label',
                                            'description' => 'Private network description',
                                            'created_at' => '2021-01-01T00:00:00.000Z',
                                            'updated_at' => '2021-01-01T00:00:00.000Z',
                                            '_links' => [
                                                'self' => [
                                                    'href' => 'https://cloud.acquia.com/api/private-networks/456e4567-e89b-11d3-a789-426614174001',
                                                ],
                                            ],
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_VPNList' => [
                'description' => 'List of VPNs in a private network',
                'x-go-name' => 'VpnListResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            'type' => 'object',
                            'required' => [
                                'count',
                                'total',
                            ],
                            'properties' => [
                                'count' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries in this page',
                                ],
                                'total' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries available',
                                ],
                                '_embedded' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_EmbeddedVPNList',
                                ],
                                '_links' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                                ],
                            ],
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpns',
                                ],
                            ],
                            'count' => 1,
                            'total' => 1,
                            '_embedded' => [
                                'items' => [
                                    [
                                        'id' => 1,
                                        'name' => 'vpn1',
                                        'gateway_ip' => '1.1.1.1',
                                        'routes' => [
                                            '1.1.1.1/12',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'Private_Network_Service_API_VpcPeerList' => [
                'description' => 'List of VPC Peers in a private network',
                'x-go-name' => 'VpcPeerListResponse',
                'content' => [
                    'application/hal+json' => [
                        'schema' => [
                            'type' => 'object',
                            'required' => [
                                'count',
                                'total',
                            ],
                            'properties' => [
                                'count' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries in this page',
                                ],
                                'total' => [
                                    'type' => 'integer',
                                    'description' => 'The total number of entries available',
                                ],
                                '_embedded' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_EmbeddedVPCPeerList',
                                ],
                                '_links' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_HalItem',
                                ],
                            ],
                        ],
                        'example' => [
                            '_links' => [
                                'self' => [
                                    'href' => 'https://cloud.acquia.com/api/private-networks/123e4567-e89b-12d3-a456-426614174000/connections/vpc-peers',
                                ],
                            ],
                            'count' => 2,
                            'total' => 2,
                            '_embedded' => [
                                'items' => [
                                    [
                                        'id' => 1,
                                        'name' => 'vpcPeer1',
                                        'aws_account' => '123456789012',
                                        'vpc_id' => 'vpc-1234567890abcdef0',
                                        'vpc_cidr' => '10.0.0.0/16',
                                    ],
                                    [
                                        'id' => 2,
                                        'name' => 'vpcPeer2',
                                        'aws_account' => '123456789012',
                                        'vpc_id' => 'vpc-1234567890abcdef0',
                                        'vpc_cidr' => '10.0.0.0/16',
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        'examples' => [],
        'requestBodies' => [
            'Private_Network_Service_API_PrivateNetworkCreateRequest' => [
                'description' => 'Private Network creation request body',
                'content' => [
                    'application/json' => [
                        'schema' => [
                            'type' => 'object',
                            'required' => [
                                'subscription_id',
                                'region',
                                'name',
                                'connections',
                            ],
                            'properties' => [
                                'subscription_id' => [
                                    'type' => 'string',
                                ],
                                'region' => [
                                    'type' => 'string',
                                ],
                                'name' => [
                                    'type' => 'string',
                                ],
                                'description' => [
                                    'type' => 'string',
                                ],
                                'label' => [
                                    'type' => 'string',
                                ],
                                'isolation' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Isolation',
                                ],
                                'ingress' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Ingress',
                                ],
                                'connections' => [
                                    '$ref' => '#/components/schemas/Private_Network_Service_API_Connections',
                                ],
                            ],
                            'example' => [
                                'subscription_id' => '123e4567-e89b-12d3-a456-426614174000',
                                'region' => 'us-east-1',
                                'name' => 'customer-private-network',
                                'description' => 'Private network for customer',
                                'label' => 'anyLabel',
                                'isolation' => [
                                    'dedicated_compute' => false,
                                    'dedicated_network' => false,
                                ],
                                'ingress' => [
                                    'drupal_ssh' => [
                                        'ingress_acls' => [
                                            'test-acls',
                                        ],
                                    ],
                                ],
                                'connections' => [
                                    'cidr' => '114.7.55.1/16',
                                    'private_egress_access' => [
                                        'drupal' => true,
                                    ],
                                    'vpns' => [
                                        [
                                            'name' => 'vpn1',
                                            'gateway_ip' => '10.10.10.10',
                                            'routes' => [
                                                '127.0.0.1/32',
                                                '127.0.0.2/32',
                                            ],
                                            'tunnel1' => [
                                                'shared_key' => 'sharedKey1',
                                                'internal_cidr' => '192.1.1.0/24',
                                                'ike_versions' => '1',
                                                'startup_action' => 'start',
                                                'dpd_timeout_action' => 'stop',
                                            ],
                                            'tunnel2' => [
                                                'shared_key' => 'sharedKey2',
                                                'internal_cidr' => '192.1.1.0/14',
                                                'ike_versions' => '1',
                                                'startup_action' => 'start',
                                                'dpd_timeout_action' => 'stop',
                                            ],
                                        ],
                                    ],
                                    'vpc_peers' => [
                                        [
                                            'name' => 'vpcPeer1',
                                            'aws_account' => '123456789012',
                                            'vpc_id' => 'vpc-1234567890abcdef0',
                                            'vpc_cidr' => '120.24.16.1/24',
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
        'headers' => [],
    ],
],
1 => 'd603c8185c5e28bb45cfac6caa33ab85',

]];
{"rootPackageDefinition":{"type":"project","description":"Generated by Acquia CLI's app:new:from:drupal7","repositories":[{"type":"composer","url":"https:\/\/packages.drupal.org\/8"}],"require":{"composer\/installers":"^1.9","cweagans\/composer-patches":"^1.7","drupal\/core-composer-scaffold":"9.0.1","drupal\/core-project-message":"9.0.1","drupal\/core-recommended":"9.0.1","drush\/drush":"*"},"config":{"sort-packages":true,"allow-plugins":{"composer\/installers":true,"cweagans\/composer-patches":true,"drupal\/core-composer-scaffold":true,"drupal\/core-project-message":true}},"conflict":{"drupal\/drupal":"*"},"minimum-stability":"dev","prefer-stable":true,"extra":{"enable-patching":true,"patchLevel":{"drupal\/core":"-p2"},"drupal-scaffold":{"locations":{"web-root":"docroot\/"}},"installer-paths":{"docroot\/core":["type:drupal-core"],"docroot\/libraries\/{$name}":["type:drupal-library"],"docroot\/modules\/contrib\/{$name}":["type:drupal-module"],"docroot\/profiles\/contrib\/{$name}":["type:drupal-profile"],"docroot\/themes\/contrib\/{$name}":["type:drupal-theme"],"drush\/Commands\/contrib\/{$name}":["type:drupal-drush"],"docroot\/modules\/custom\/{$name}":["type:drupal-custom-module"],"docroot\/profiles\/custom\/{$name}":["type:drupal-custom-profile"],"docroot\/themes\/custom\/{$name}":["type:drupal-custom-theme"]}}}}{"data":[{"package":null,"note":"Drupal 7's PHP module is not recommended because it poses a severe security risk without very careful configuration and trusted users.","replaces":{"name":"php"},"vetted":true},{"package":null,"note":"Drupal core is now shipped with the JSON:API and REST modules. In most cases, these completely replace the functionality of the services module.","replaces":{"name":"services"},"vetted":true},{"package":null,"note":"The trigger module was removed from Drupal core and does not have a recommended replacement at this time.","replaces":{"name":"trigger"},"vetted":true},{"universal":true,"install":["acquia_migrate"],"package":"acquia\/acquia-migrate-accelerate","constraint":"^1@dev","vetted":true},{"universal":true,"package":"acquia\/memcache-settings","constraint":"^1","replaces":{"name":"memcache"},"vetted":true},{"package":"drupal\/acl","constraint":"1.0.0-beta1","patches":{"Issue #3231034: Use DrupalSqlBase instead of SqlBase class":"https:\/\/www.drupal.org\/files\/issues\/2021-09-02\/drupalsqlbase_instead_of_sqlbase-3231034-2.patch"},"install":["acl"],"replaces":{"name":"acl"},"vetted":true},{"package":"drupal\/acquia_connector","constraint":"^3.0.2","install":["acquia_connector"],"replaces":{"name":"acquia_agent"},"vetted":true},{"package":"drupal\/acquia_connector","constraint":"^3.0.2","install":["acquia_connector"],"replaces":{"name":"acquia_connector"},"vetted":true},{"package":"drupal\/acquia_connector","constraint":"^3.0.2","install":["acquia_connector"],"replaces":{"name":"acquia_spi"},"vetted":true},{"package":"drupal\/acquia_purge","constraint":"^1.2","install":["acquia_purge_geoip"],"replaces":{"name":"acquia_geoip_vary_by_country"},"vetted":true},{"package":"drupal\/acquia_purge","constraint":"^1.2","note":"An automatic migration of settings does not make sense for this module. The Acquia Purge module is mostly 'zero configuration'; the only thing you have to do is add an 'Acquia Cloud' purger in the Purge module. See https:\/\/git.drupalcode.org\/project\/acquia_purge\/raw\/HEAD\/INSTALL.md for detailed instructions.","install":["acquia_purge"],"replaces":{"name":"acquia_purge"},"vetted":true},{"package":"drupal\/acquia_search","constraint":"3.1.0-beta1","patches":{"[AMA_KEEP] Issue #3218089: Could not retrieve data definition for field":"https:\/\/www.drupal.org\/files\/issues\/2021-06-09\/acquia_search-could_not_find_field-3218089-fix-only.patch"},"note":"Acquia Search will migrate configuration and search indexes. User will have to re-index site data once migration is done.  See https:\/\/docs.acquia.com\/acquia-search\/activate\/indexing\/#re-indexing-your-website.","install":["acquia_search"],"replaces":{"name":"acquia_search"},"vetted":true},{"universal":true,"package":"drupal\/core","constraint":"9.3.5","patches":{"Issue #3115073: Convert RDF mapping migration to derived migrations":"https:\/\/www.drupal.org\/files\/issues\/2020-02-24\/core-derived_rdf_mapping_migration-3115073-7.patch","Issue #3122649: Derive path alias migrations per entity type (and bundle)":"https:\/\/www.drupal.org\/files\/issues\/2021-02-24\/core-derive_path_alias_migrations-3122649-41.patch","Issue #3096972: The Drupal 7 ThemeSettings source plugin does not check that the destination site has a valid theme to migrate settings into":"https:\/\/www.drupal.org\/files\/issues\/2020-05-18\/core-theme_settings_migrate_requirement-3096972-36_0.patch","Issue #3204212: Convert remaining widget and formatter type migrations to MigrateField plugins":"https:\/\/www.drupal.org\/files\/issues\/2021-12-27\/3204212-field-migration-widget-formatter-mapping-41--fix-only.patch","Issue #3202462: Provide option for contrib modules to map their D6 \/ D7 field formatter and widget plugin IDs to the equivalent D9 plugin ID":"https:\/\/www.drupal.org\/files\/issues\/2021-04-08\/core-allow_map_formatter_migration-3202462-8--on-top-of-3204212.patch","Issue #3108302: Field formatter & widget settings: fall back to default if missing plugin":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/core-migrate_field_formatter_widget_with_fallback-3108302-45--on-top-of-3202462-8_0.patch","Issue #3097336: Improve the DX for migrating content entities: view modes, fields, formatters, widgets etc should be migrated per entity type + bundle":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/core-derived_field_and_field_display_migrations-3097336-85--compatible-with-3202462-6.patch","Issue #3198732: Migrating reference fields: target_bundles may never be empty array":"https:\/\/www.drupal.org\/files\/issues\/2021-12-27\/3198732-28.patch","Issue #3115938: Derive block migration per theme and per block plugin type":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/core-derived_block_config_migrations-3115938-21.patch","Issue #3123775: Ensure that migrations of entities with file or image fields depend on private\/public files migration":"https:\/\/www.drupal.org\/files\/issues\/2021-12-27\/core-add_file_migration_dependencies-3123775-12--fix-only--do-not-test.patch","Issue #2845340: migrate mapping & messages table names are truncated, can lead to incorrect mapping lookups":"https:\/\/www.drupal.org\/files\/issues\/2020-06-16\/2845340-16.patch","Issue #3151979: System file settings migration (d6_system_file and d7_system_file) assumes that allow_insecure_uploads variable is always set":"https:\/\/www.drupal.org\/files\/issues\/2020-12-07\/3151979-22.patch","Issue #3156083: Route migrate process plugin shouldn't assume that the $options variable is always an array":"https:\/\/www.drupal.org\/files\/issues\/2020-07-01\/core-route_migrate_process_plugin_options-3156083-2--complete.patch","Issue #3051251: Existing menu links show validation issues on migration":"https:\/\/www.drupal.org\/files\/issues\/2022-01-10\/core-derive_menu_link_migrations_per_entity_type-3051251-59.patch","Issue #3154156: Improve migration system performance: statically cache DrupalSqlBase::$systemData":"https:\/\/www.drupal.org\/files\/issues\/2020-06-23\/3154156-2.patch","Issue #3156730: Stubs should only be created if the referenced source row actually exists":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/core-create_stub_only_when_matching_source_row_exists--9.2.x--3156730-41.patch","Issue #3156733: File migration's \"owner\" user reference should use migration_lookup":"https:\/\/www.drupal.org\/files\/issues\/2020-07-03\/3156733-2.patch","Issue #3165813: Undefined index: text_processing in Drupal\\text\\Plugin\\migrate\\field\\d7\\TextField":"https:\/\/www.drupal.org\/files\/issues\/2020-08-18\/3165813-2.patch","Issue #3166930: Migrated filters may have invalid\/incomplete settings applied":"https:\/\/www.drupal.org\/files\/issues\/2020-08-24\/3166930-4.patch","Issue #3167267: MigrateExecutable should catch not only exceptions, but also fatal errors":"https:\/\/www.drupal.org\/files\/issues\/2021-11-04\/drupal-3167267-36.patch","Issue #3186449: ContentEntity source plugin shouldn't throw exception when the bundle key is missing":"https:\/\/www.drupal.org\/files\/issues\/2020-12-08\/core-content_entity_source_exception_when_bundle_is_missing-3186449-2.patch","Issue #3187334: Drupal 7 color settings migration assumes that theme machine names do not contain underscores":"https:\/\/www.drupal.org\/files\/issues\/2020-12-10\/core-fix_d7_color_migration-3187334-7.patch","Issue #3187419: d7\/NodeComplete source plugin adds invalid source \"source_langcode\" for \"content_translation_source\" destination property":"https:\/\/www.drupal.org\/files\/issues\/2020-12-09\/core-nodecomplete_wrong_source_langcode-3187419-2.patch","Issue #3187474: Improve source record count of translation migrate source plugins which use the \"i18n_string\" table":"https:\/\/www.drupal.org\/files\/issues\/2020-12-14\/core-improve_source_record_count_i18n_string-3187474-9.patch","Issue #2985882: Workaround for \"Call to a member function getLabel() after enabling layout_builder\"":"https:\/\/www.drupal.org\/files\/issues\/2020-04-08\/2985882-field-85.patch","Issue #2859314: Highwater condition with unjoined maps skips unprocessed and NEEDS_UPDATE rows":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/2859314-58.patch","Issue #3200949: Unpublished entity revisions get published because EntityContentComplete":"https:\/\/www.drupal.org\/files\/issues\/2021-03-01\/core-allow_migrating_forward_revisions-3200949-9.patch","Issue #3204343: Disabling the default search page can make the entire site inaccessible":"https:\/\/www.drupal.org\/files\/issues\/2021-03-19\/3204343-9.patch","Issue #3118262: Calling EntityConfig::import() with multiple destination IDs fails":"https:\/\/www.drupal.org\/files\/issues\/2021-12-28\/core-fix_entityconfigbase-3118262-52--complete.patch","Issue #3213636: Prevent data loss: migrate text fields with conflicting text_processing setting as formatter text fields":"https:\/\/gist.githubusercontent.com\/zolhorvath\/9b8d28df3dd45e3d8a8234e590016aa7\/raw\/cba7add887d8d20564b1fed45c52ce803575b58d\/core-migrate_conflicting_text_fields-3213636-6--9.1.x--fix-and-db-fixture.patch","Issue #3218294: Allow altering field value query performed by FieldableEntity":"https:\/\/www.drupal.org\/files\/issues\/2021-06-10\/core-allow_altering_migrate_field_value_query-3218294-2.patch","Issue #3219078: Regression: multilingual taxonomy term migrations are failing if user tries to migrate from Drupal 7.81+ and Entity Translation 7.x-1.1":"https:\/\/www.drupal.org\/files\/issues\/2021-11-19\/core-fix_et_mapping_of_taxonomy_terms-3219078-13.patch","Issue #3226744: Derive statistics module migrations per node type":"https:\/\/www.drupal.org\/files\/issues\/2021-10-13\/core-derive_statistics_module_migrations-3226744-22.patch","Issue #3227361: Fix \\Drupal\\migrate\\Plugin\\migrate\\source\\SqlBase::initializeIterator()'s cross-database joining broken when using particular DB\/table names":"https:\/\/www.drupal.org\/files\/issues\/2021-08-11\/3227361-13.patch","Issue #2329253: Allow the ChangedItem to skip updating":"https:\/\/www.drupal.org\/files\/issues\/2021-09-29\/2329253-drupal-allow-changeditem-skipping-78-9.3.patch","Issue #3052115: Mark an entity as 'syncing' during a migration 'update' and possibly test syncing semantics":"https:\/\/www.drupal.org\/files\/issues\/2021-11-18\/core-migrate_sync-3052115--31--content--fix-only.patch","Remove certain default content entity types (node, block_content, taxonomy_term, comment) from Drupal's Standard install profile":"https:\/\/gist.githubusercontent.com\/narendra-drupal\/85ba9ba92816cc53a0cad0caf2bcd079\/raw\/58572a11df2d30425b6ade68fb7c3030574beee3\/standard-remove_default_content_entity_types.patch"},"vetted":true},{"package":"drupal\/core","constraint":"*","install":["media_library"],"universal":true,"vetted":true},{"package":"drupal\/core","constraint":"*","note":"This module overrides 'administrative listing' pages in Drupal 7 site with equivalent Views for superior usability. Drupal core now contains a superset of its functionality.","install":["views"],"replaces":{"name":"admin_views"},"vetted":true},{"package":"drupal\/core","constraint":"*","note":"This module overrides 'administrative listing' pages in Drupal 7 site with equivalent Views for superior usability. Drupal core now contains a superset of its functionality.","install":["views"],"replaces":{"name":"admin_views_system_display"},"vetted":true},{"package":"drupal\/core","constraint":"*","note":"This module is a little helper to maintain an administrator role which has all available permissions for a Drupal 7 site. Drupal core now contains a superset of its functionality.","replaces":{"name":"adminrole"},"vetted":true},{"package":"drupal\/core","constraint":"*","install":["aggregator"],"replaces":{"name":"aggregator"},"vetted":true},{"universal":true,"package":"drupal\/mysql56","constraint":"^1","vetted":true}]}---
parameters:
  env(ACLI_REPO_ROOT): "%kernel.project_dir%"
  app.name: 'Acquia CLI'
  app.version: "%env(ACLI_VERSION)%"
  app.data_dir: "%env(ACLI_HOME)%"
  app.project_dir: "%env(ACLI_REPO_ROOT)%"
  app.ssh_dir: "%env(HOME)%/.ssh"
  app.acli_config_filename: '.acquia-cli.yml'
  app.cloud_config_filename: 'cloud_api.conf'
  app.acli_config_filepath: "%app.project_dir%/%app.acli_config_filename%"
  app.cloud_config_filepath: "%app.data_dir%/%app.cloud_config_filename%"

services:
  _defaults:
    autoconfigure: true
    autowire: true
    bind:
      $cloudConfigFilepath: '%app.cloud_config_filepath%'
      $acliConfigFilepath: '%app.acli_config_filepath%'
      # This should be root directory of the repository where acli is being invoked (not the root of acli itself).
      $projectDir: "%app.project_dir%"
      $sshDir: "%app.ssh_dir%"
      $amplitudeKey: '%env(AMPLITUDE_KEY)%'
      $bugSnagKey: '%env(BUGSNAG_KEY)%'
    public: true

  # Register nearly all Acquia CLI classes as services.
  Acquia\Cli\:
    exclude:
      - ../../src/Kernel.php
      - ../../src/DataStore/Datastore.php
      - ../../src/DataStore/YamlStore.php
      - ../../src/DataStore/JsonDataStore.php
      - ../../src/CloudApi/AccessTokenConnector.php
      - ../../src/Command/App/From/**
    public: true
    resource: ../../src

  Acquia\Cli\Config\AcquiaCliConfig: ~
  Acquia\Cli\Config\CloudDataConfig: ~

  Acquia\Cli\DataStore\AcquiaCliDatastore: ~
  Acquia\Cli\DataStore\CloudDataStore: ~

  # All commands inherit from a common base and use the same DI parameters.
  Acquia\Cli\Command\:
    resource: ../../src/Command
    parent: Acquia\Cli\Command\CommandBase
    exclude:
      - ../../src/Command/CommandBase.php
      - ../../src/Command/Acsf/AcsfListCommand.php
      - ../../src/Command/Acsf/AcsfListCommandBase.php
      - ../../src/Command/Acsf/AcsfApiBaseCommand.php
      - ../../src/Command/Api/ApiBaseCommand.php
      - ../../src/Command/Api/ApiListCommand.php
      - ../../src/Command/Api/ApiListCommandBase.php
      - ../../src/Command/App/From/**
  Acquia\Cli\Command\CommandBase:
    abstract: true

  Acquia\Cli\EventListener\ExceptionListener:
    tags:
      # @see Symfony\Component\Console\ConsoleEvents
      - { name: kernel.event_listener, event: console.error, method: onConsoleError}

  Acquia\Cli\EventListener\ComposerScriptsListener:
    tags:
      # @see Symfony\Component\Console\ConsoleEvents
      - { name: kernel.event_listener, event: console.terminate, method: onConsoleTerminate}
      - { name: kernel.event_listener, event: console.command, method: onConsoleCommand}

  Acquia\Cli\ApiCredentialsInterface:
    alias: Acquia\Cli\CloudApi\CloudCredentials

  cloud.credentials:
    class: Acquia\Cli\CloudApi\CloudCredentials

  acsf.credentials:
    class: Acquia\Cli\AcsfApi\AcsfCredentials

  # AcquiaCloudApi services.
  Acquia\Cli\Command\Api\ApiCommandFactory: ~
  Acquia\Cli\Command\Api\ApiBaseCommand:
    class: Acquia\Cli\Command\Api\ApiBaseCommand
    factory: ['@Acquia\Cli\Command\Api\ApiCommandFactory', 'createCommand']
  Acquia\Cli\Command\Api\ApiListCommandBase:
    class: Acquia\Cli\Command\Api\ApiListCommandBase
    factory: [ '@Acquia\Cli\Command\Api\ApiCommandFactory', 'createListCommand' ]
  AcquiaCloudApi\Connector\Client: ~
  Acquia\Cli\ClientServiceInterface:
      alias: Acquia\Cli\CloudApi\ClientService
  Acquia\Cli\ConnectorFactoryInterface:
    alias: Acquia\Cli\CloudApi\ConnectorFactory
  Acquia\Cli\CloudApi\ConnectorFactory:
    arguments:
      $config:
        # @see https://symfony.com/doc/current/service_container/expression_language.html
        key: '@=service("cloud.credentials").getCloudKey()'
        secret: '@=service("cloud.credentials").getCloudSecret()'
        accessToken: '@=service("cloud.credentials").getCloudAccessToken()'
        accessTokenExpiry: '@=service("cloud.credentials").getCloudAccessTokenExpiry()'
      $baseUri: '@=service("cloud.credentials").getBaseUri()'
      $accountsUri: '@=service("cloud.credentials").getAccountsUri()'
  AcquiaCloudApi\Connector\ConnectorInterface:
    alias: Acquia\Cli\CloudApi\ConnectorFactory
  AcquiaCloudApi\Connector\Connector:
    alias: Acquia\Cli\CloudApi\ConnectorFactory
  AcquiaLogstream\LogstreamManager: ~

  # Acquia Cloud Site Factory Services.
  Acquia\Cli\AcsfApi\AcsfConnectorFactory:
    arguments:
      $config:
        # @see https://symfony.com/doc/current/service_container/expression_language.html
        key: '@=service("acsf.credentials").getCloudKey()'
        secret: '@=service("acsf.credentials").getCloudSecret()'
      $baseUri: '@=service("acsf.credentials").getBaseUri()'
  Acquia\Cli\AcsfApi\AcsfConnector:
    alias: Acquia\Cli\AcsfApi\AcsfConnectorFactory
  Acquia\Cli\Command\Acsf\AcsfCommandFactory: ~
  Acquia\Cli\Command\Acsf\AcsfApiBaseCommand:
    class: Acquia\Cli\Command\Acsf\AcsfApiBaseCommand
    factory: ['@Acquia\Cli\Command\Acsf\AcsfCommandFactory', 'createCommand']
  Acquia\Cli\Command\Acsf\AcsfListCommandBase:
    class: Acquia\Cli\Command\Acsf\AcsfListCommandBase
    factory: [ '@Acquia\Cli\Command\Acsf\AcsfCommandFactory', 'createListCommand' ]
  Acquia\Cli\Command\Auth\AuthAcsfLoginCommand:
    arguments:
      Acquia\Cli\ApiCredentialsInterface: '@acsf.credentials'
  Acquia\Cli\Command\Auth\AuthAcsfLogoutCommand:
    arguments:
      Acquia\Cli\ApiCredentialsInterface: '@acsf.credentials'

  # Symfony services.
  Acquia\Cli\Application:
      arguments:
          $name: '%app.name%'
          $version: '%app.version%'
  Symfony\Component\Console\Input\ArgvInput: ~
  Symfony\Component\Console\Input\InputInterface:
    alias: Symfony\Component\Console\Input\ArgvInput
  Symfony\Component\Console\Output\ConsoleOutput: ~
  Symfony\Component\Console\Output\OutputInterface:
    alias: Symfony\Component\Console\Output\ConsoleOutput
  Symfony\Component\EventDispatcher\EventDispatcher: ~
  Symfony\Component\Console\Logger\ConsoleLogger: ~
  Psr\Log\LoggerInterface:
    alias: Symfony\Component\Console\Logger\ConsoleLogger

  # Amplitude service.
  Zumba\Amplitude\Amplitude: ~

  # Guzzle service.
  GuzzleHttp\Client: ~

  SelfUpdate\SelfUpdateManager:
      arguments:
          $applicationName: '%app.name%'
          $currentVersion: '%app.version%'
          $gitHubRepository: 'acquia/cli'
imports:
  - { resource: '../prod/services.yml' }

services:
  Symfony\Component\Console\Output\BufferedOutput: ~
  Symfony\Component\Console\Output\OutputInterface:
    alias: Symfony\Component\Console\Output\BufferedOutput
    public: true
  Symfony\Component\Console\Input\ArrayInput: ~
  Symfony\Component\Console\Input\InputInterface:
    alias: Symfony\Component\Console\Input\ArrayInput
    public: true
{"_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":"8b629a15c689375da27d72358027e768","packages":[{"name":"acquia\/drupal-environment-detector","version":"1.7.0","source":{"type":"git","url":"https:\/\/github.com\/acquia\/drupal-environment-detector.git","reference":"4666ae67b422d209a8b11c9f886e3ef6d3f16778"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/acquia\/drupal-environment-detector\/zipball\/4666ae67b422d209a8b11c9f886e3ef6d3f16778","reference":"4666ae67b422d209a8b11c9f886e3ef6d3f16778","shasum":""},"conflict":{"acquia\/blt":">=12.0.0 <13.5.2"},"require-dev":{"acquia\/coding-standards":"^3.0.1","dealerdirect\/phpcodesniffer-composer-installer":"^1.0.0"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"},"phpcodesniffer-search-depth":"4"},"autoload":{"psr-4":{"Acquia\\DrupalEnvironmentDetector\\":"src\/","Acquia\\DrupalEnvironmentDetector\\Tests\\":"tests\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["GPL-2.0-or-later"],"authors":[{"name":"Acquia Engineering","homepage":"https:\/\/www.acquia.com","role":"Maintainer"}],"description":"Provides common methods for detecting the current Acquia environment","support":{"issues":"https:\/\/github.com\/acquia\/drupal-environment-detector\/issues","source":"https:\/\/github.com\/acquia\/drupal-environment-detector\/tree\/1.7.0"},"time":"2024-11-26T19:16:45+00:00"},{"name":"brick\/math","version":"0.14.0","source":{"type":"git","url":"https:\/\/github.com\/brick\/math.git","reference":"113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/brick\/math\/zipball\/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2","reference":"113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2","shasum":""},"require":{"php":"^8.2"},"require-dev":{"php-coveralls\/php-coveralls":"^2.2","phpstan\/phpstan":"2.1.22","phpunit\/phpunit":"^11.5"},"type":"library","autoload":{"psr-4":{"Brick\\Math\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Arbitrary-precision arithmetic library","keywords":["Arbitrary-precision","BigInteger","BigRational","arithmetic","bigdecimal","bignum","bignumber","brick","decimal","integer","math","mathematics","rational"],"support":{"issues":"https:\/\/github.com\/brick\/math\/issues","source":"https:\/\/github.com\/brick\/math\/tree\/0.14.0"},"funding":[{"url":"https:\/\/github.com\/BenMorel","type":"github"}],"time":"2025-08-29T12:40:03+00:00"},{"name":"bugsnag\/bugsnag","version":"v3.30.0","source":{"type":"git","url":"https:\/\/github.com\/bugsnag\/bugsnag-php.git","reference":"ea174966d8a09424d7963e1e0fe9d570b63ff98c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/bugsnag\/bugsnag-php\/zipball\/ea174966d8a09424d7963e1e0fe9d570b63ff98c","reference":"ea174966d8a09424d7963e1e0fe9d570b63ff98c","shasum":""},"require":{"composer\/ca-bundle":"^1.0","guzzlehttp\/guzzle":"^5.0|^6.0|^7.0","php":">=5.5"},"require-dev":{"guzzlehttp\/psr7":"^1.3|^2.0","mtdowling\/burgomaster":"dev-master#72151eddf5f0cf101502b94bf5031f9c53501a04","php-mock\/php-mock-phpunit":"^1.1|^2.1","phpunit\/phpunit":"^4.8.36|^7.5.15|^9.3.10","sebastian\/version":">=1.0.3"},"type":"library","extra":{"branch-alias":{"dev-master":"3.20-dev"}},"autoload":{"psr-4":{"Bugsnag\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"James Smith","email":"notifiers@bugsnag.com","homepage":"https:\/\/bugsnag.com"}],"description":"Official Bugsnag notifier for PHP applications.","homepage":"https:\/\/github.com\/bugsnag\/bugsnag-php","keywords":["bugsnag","errors","exceptions","logging","tracking"],"support":{"issues":"https:\/\/github.com\/bugsnag\/bugsnag-php\/issues","source":"https:\/\/github.com\/bugsnag\/bugsnag-php\/tree\/v3.30.0"},"time":"2025-07-08T15:15:58+00:00"},{"name":"clue\/stream-filter","version":"v1.7.0","source":{"type":"git","url":"https:\/\/github.com\/clue\/stream-filter.git","reference":"049509fef80032cb3f051595029ab75b49a3c2f7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/clue\/stream-filter\/zipball\/049509fef80032cb3f051595029ab75b49a3c2f7","reference":"049509fef80032cb3f051595029ab75b49a3c2f7","shasum":""},"require":{"php":">=5.3"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"type":"library","autoload":{"files":["src\/functions_include.php"],"psr-4":{"Clue\\StreamFilter\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering"}],"description":"A simple and modern approach to stream filtering in PHP","homepage":"https:\/\/github.com\/clue\/stream-filter","keywords":["bucket brigade","callback","filter","php_user_filter","stream","stream_filter_append","stream_filter_register"],"support":{"issues":"https:\/\/github.com\/clue\/stream-filter\/issues","source":"https:\/\/github.com\/clue\/stream-filter\/tree\/v1.7.0"},"funding":[{"url":"https:\/\/clue.engineering\/support","type":"custom"},{"url":"https:\/\/github.com\/clue","type":"github"}],"time":"2023-12-20T15:40:13+00:00"},{"name":"composer\/ca-bundle","version":"1.5.8","source":{"type":"git","url":"https:\/\/github.com\/composer\/ca-bundle.git","reference":"719026bb30813accb68271fee7e39552a58e9f65"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/ca-bundle\/zipball\/719026bb30813accb68271fee7e39552a58e9f65","reference":"719026bb30813accb68271fee7e39552a58e9f65","shasum":""},"require":{"ext-openssl":"*","ext-pcre":"*","php":"^7.2 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.10","phpunit\/phpunit":"^8 || ^9","psr\/log":"^1.0 || ^2.0 || ^3.0","symfony\/process":"^4.0 || ^5.0 || ^6.0 || ^7.0"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"autoload":{"psr-4":{"Composer\\CaBundle\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"}],"description":"Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.","keywords":["cabundle","cacert","certificate","ssl","tls"],"support":{"irc":"irc:\/\/irc.freenode.org\/composer","issues":"https:\/\/github.com\/composer\/ca-bundle\/issues","source":"https:\/\/github.com\/composer\/ca-bundle\/tree\/1.5.8"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"time":"2025-08-20T18:49:47+00:00"},{"name":"composer\/semver","version":"3.4.4","source":{"type":"git","url":"https:\/\/github.com\/composer\/semver.git","reference":"198166618906cb2de69b95d7d47e5fa8aa1b2b95"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/semver\/zipball\/198166618906cb2de69b95d7d47e5fa8aa1b2b95","reference":"198166618906cb2de69b95d7d47e5fa8aa1b2b95","shasum":""},"require":{"php":"^5.3.2 || ^7.0 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.11","symfony\/phpunit-bridge":"^3 || ^7"},"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"Composer\\Semver\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nils Adermann","email":"naderman@naderman.de","homepage":"http:\/\/www.naderman.de"},{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"},{"name":"Rob Bast","email":"rob.bast@gmail.com","homepage":"http:\/\/robbast.nl"}],"description":"Semver library that offers utilities, version constraint parsing and validation.","keywords":["semantic","semver","validation","versioning"],"support":{"irc":"ircs:\/\/irc.libera.chat:6697\/composer","issues":"https:\/\/github.com\/composer\/semver\/issues","source":"https:\/\/github.com\/composer\/semver\/tree\/3.4.4"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"time":"2025-08-20T19:15:30+00:00"},{"name":"consolidation\/self-update","version":"3.1.0","source":{"type":"git","url":"https:\/\/github.com\/consolidation\/self-update.git","reference":"3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/consolidation\/self-update\/zipball\/3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc","reference":"3dfcb564cb1d5369ba8fed0ba0b97280e0d206dc","shasum":""},"require":{"composer\/semver":"^3.2","guzzlehttp\/guzzle":"^7.9","kevinrob\/guzzle-cache-middleware":"^5.1 || ^6","php":"^8.1","symfony\/cache":"^5.4 || ^6.4 || ^7","symfony\/console":"^5.4 || ^6.4 || ^7","symfony\/filesystem":"^5.4 || ^6.4 || ^7"},"bin":["scripts\/release"],"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"SelfUpdate\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Alexander Menk","email":"menk@mestrona.net"},{"name":"Greg Anderson","email":"greg.1.anderson@greenknowe.org"}],"description":"Provides a self:update command for Symfony Console applications.","support":{"issues":"https:\/\/github.com\/consolidation\/self-update\/issues","source":"https:\/\/github.com\/consolidation\/self-update\/tree\/3.1.0"},"time":"2025-10-29T01:41:49+00:00"},{"name":"dflydev\/dot-access-data","version":"v3.0.3","source":{"type":"git","url":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data.git","reference":"a23a2bf4f31d3518f3ecb38660c95715dfead60f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/dflydev\/dflydev-dot-access-data\/zipball\/a23a2bf4f31d3518f3ecb38660c95715dfead60f","reference":"a23a2bf4f31d3518f3ecb38660c95715dfead60f","shasum":""},"require":{"php":"^7.1 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^0.12.42","phpunit\/phpunit":"^7.5 || ^8.5 || ^9.3","scrutinizer\/ocular":"1.6.0","squizlabs\/php_codesniffer":"^3.5","vimeo\/psalm":"^4.0.0"},"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"Dflydev\\DotAccessData\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Dragonfly Development Inc.","email":"info@dflydev.com","homepage":"http:\/\/dflydev.com"},{"name":"Beau Simensen","email":"beau@dflydev.com","homepage":"http:\/\/beausimensen.com"},{"name":"Carlos Frutos","email":"carlos@kiwing.it","homepage":"https:\/\/github.com\/cfrutos"},{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com"}],"description":"Given a deep data structure, access data by dot notation.","homepage":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data","keywords":["access","data","dot","notation"],"support":{"issues":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/issues","source":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/tree\/v3.0.3"},"time":"2024-07-08T12:26:09+00:00"},{"name":"evenement\/evenement","version":"v3.0.2","source":{"type":"git","url":"https:\/\/github.com\/igorw\/evenement.git","reference":"0a16b0d71ab13284339abb99d9d2bd813640efbc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/igorw\/evenement\/zipball\/0a16b0d71ab13284339abb99d9d2bd813640efbc","reference":"0a16b0d71ab13284339abb99d9d2bd813640efbc","shasum":""},"require":{"php":">=7.0"},"require-dev":{"phpunit\/phpunit":"^9 || ^6"},"type":"library","autoload":{"psr-4":{"Evenement\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Igor Wiedler","email":"igor@wiedler.ch"}],"description":"\u00c9v\u00e9nement is a very simple event dispatching library for PHP","keywords":["event-dispatcher","event-emitter"],"support":{"issues":"https:\/\/github.com\/igorw\/evenement\/issues","source":"https:\/\/github.com\/igorw\/evenement\/tree\/v3.0.2"},"time":"2023-08-08T05:53:35+00:00"},{"name":"graham-campbell\/result-type","version":"v1.1.3","source":{"type":"git","url":"https:\/\/github.com\/GrahamCampbell\/Result-Type.git","reference":"3ba905c11371512af9d9bdd27d99b782216b6945"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/GrahamCampbell\/Result-Type\/zipball\/3ba905c11371512af9d9bdd27d99b782216b6945","reference":"3ba905c11371512af9d9bdd27d99b782216b6945","shasum":""},"require":{"php":"^7.2.5 || ^8.0","phpoption\/phpoption":"^1.9.3"},"require-dev":{"phpunit\/phpunit":"^8.5.39 || ^9.6.20 || ^10.5.28"},"type":"library","autoload":{"psr-4":{"GrahamCampbell\\ResultType\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"}],"description":"An Implementation Of The Result Type","keywords":["Graham Campbell","GrahamCampbell","Result Type","Result-Type","result"],"support":{"issues":"https:\/\/github.com\/GrahamCampbell\/Result-Type\/issues","source":"https:\/\/github.com\/GrahamCampbell\/Result-Type\/tree\/v1.1.3"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/graham-campbell\/result-type","type":"tidelift"}],"time":"2024-07-20T21:45:45+00:00"},{"name":"grasmash\/expander","version":"3.0.1","source":{"type":"git","url":"https:\/\/github.com\/grasmash\/expander.git","reference":"eea11b9afb0c32483b18b9009f4ca07b770e39f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/grasmash\/expander\/zipball\/eea11b9afb0c32483b18b9009f4ca07b770e39f4","reference":"eea11b9afb0c32483b18b9009f4ca07b770e39f4","shasum":""},"require":{"dflydev\/dot-access-data":"^3.0.0","php":">=8.0","psr\/log":"^2 | ^3"},"require-dev":{"greg-1-anderson\/composer-test-scenarios":"^1","php-coveralls\/php-coveralls":"^2.5","phpunit\/phpunit":"^9","squizlabs\/php_codesniffer":"^3.3"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Grasmash\\Expander\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Matthew Grasmick"}],"description":"Expands internal property references in PHP arrays file.","support":{"issues":"https:\/\/github.com\/grasmash\/expander\/issues","source":"https:\/\/github.com\/grasmash\/expander\/tree\/3.0.1"},"time":"2024-11-25T23:28:05+00:00"},{"name":"guzzlehttp\/guzzle","version":"7.10.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/guzzle.git","reference":"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/guzzle\/zipball\/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4","reference":"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4","shasum":""},"require":{"ext-json":"*","guzzlehttp\/promises":"^2.3","guzzlehttp\/psr7":"^2.8","php":"^7.2.5 || ^8.0","psr\/http-client":"^1.0","symfony\/deprecation-contracts":"^2.2 || ^3.0"},"provide":{"psr\/http-client-implementation":"1.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","ext-curl":"*","guzzle\/client-integration-tests":"3.0.2","php-http\/message-factory":"^1.1","phpunit\/phpunit":"^8.5.39 || ^9.6.20","psr\/log":"^1.1 || ^2.0 || ^3.0"},"suggest":{"ext-curl":"Required for CURL handler support","ext-intl":"Required for Internationalized Domain Name (IDN) support","psr\/log":"Required for using the Log middleware"},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"autoload":{"files":["src\/functions_include.php"],"psr-4":{"GuzzleHttp\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"Jeremy Lindblom","email":"jeremeamia@gmail.com","homepage":"https:\/\/github.com\/jeremeamia"},{"name":"George Mponos","email":"gmponos@gmail.com","homepage":"https:\/\/github.com\/gmponos"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/github.com\/sagikazarmark"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"}],"description":"Guzzle is a PHP HTTP client library","keywords":["client","curl","framework","http","http client","psr-18","psr-7","rest","web service"],"support":{"issues":"https:\/\/github.com\/guzzle\/guzzle\/issues","source":"https:\/\/github.com\/guzzle\/guzzle\/tree\/7.10.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/guzzle","type":"tidelift"}],"time":"2025-08-23T22:36:01+00:00"},{"name":"guzzlehttp\/promises","version":"2.3.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/promises.git","reference":"481557b130ef3790cf82b713667b43030dc9c957"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/promises\/zipball\/481557b130ef3790cf82b713667b43030dc9c957","reference":"481557b130ef3790cf82b713667b43030dc9c957","shasum":""},"require":{"php":"^7.2.5 || ^8.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","phpunit\/phpunit":"^8.5.44 || ^9.6.25"},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"autoload":{"psr-4":{"GuzzleHttp\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"}],"description":"Guzzle promises library","keywords":["promise"],"support":{"issues":"https:\/\/github.com\/guzzle\/promises\/issues","source":"https:\/\/github.com\/guzzle\/promises\/tree\/2.3.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/promises","type":"tidelift"}],"time":"2025-08-22T14:34:08+00:00"},{"name":"guzzlehttp\/psr7","version":"2.8.0","source":{"type":"git","url":"https:\/\/github.com\/guzzle\/psr7.git","reference":"21dc724a0583619cd1652f673303492272778051"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/guzzle\/psr7\/zipball\/21dc724a0583619cd1652f673303492272778051","reference":"21dc724a0583619cd1652f673303492272778051","shasum":""},"require":{"php":"^7.2.5 || ^8.0","psr\/http-factory":"^1.0","psr\/http-message":"^1.1 || ^2.0","ralouphie\/getallheaders":"^3.0"},"provide":{"psr\/http-factory-implementation":"1.0","psr\/http-message-implementation":"1.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","http-interop\/http-factory-tests":"0.9.0","phpunit\/phpunit":"^8.5.44 || ^9.6.25"},"suggest":{"laminas\/laminas-httphandlerrunner":"Emit PSR-7 responses"},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"autoload":{"psr-4":{"GuzzleHttp\\Psr7\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Michael Dowling","email":"mtdowling@gmail.com","homepage":"https:\/\/github.com\/mtdowling"},{"name":"George Mponos","email":"gmponos@gmail.com","homepage":"https:\/\/github.com\/gmponos"},{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com","homepage":"https:\/\/github.com\/Nyholm"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/github.com\/sagikazarmark"},{"name":"Tobias Schultze","email":"webmaster@tubo-world.de","homepage":"https:\/\/github.com\/Tobion"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/sagikazarmark.hu"}],"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\/2.8.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/github.com\/Nyholm","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/guzzlehttp\/psr7","type":"tidelift"}],"time":"2025-08-23T21:21:41+00:00"},{"name":"http-interop\/http-factory-guzzle","version":"1.2.0","source":{"type":"git","url":"https:\/\/github.com\/http-interop\/http-factory-guzzle.git","reference":"8f06e92b95405216b237521cc64c804dd44c4a81"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/http-interop\/http-factory-guzzle\/zipball\/8f06e92b95405216b237521cc64c804dd44c4a81","reference":"8f06e92b95405216b237521cc64c804dd44c4a81","shasum":""},"require":{"guzzlehttp\/psr7":"^1.7||^2.0","php":">=7.3","psr\/http-factory":"^1.0"},"provide":{"psr\/http-factory-implementation":"^1.0"},"require-dev":{"http-interop\/http-factory-tests":"^0.9","phpunit\/phpunit":"^9.5"},"suggest":{"guzzlehttp\/psr7":"Includes an HTTP factory starting in version 2.0"},"type":"library","autoload":{"psr-4":{"Http\\Factory\\Guzzle\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"An HTTP Factory using Guzzle PSR7","keywords":["factory","http","psr-17","psr-7"],"support":{"issues":"https:\/\/github.com\/http-interop\/http-factory-guzzle\/issues","source":"https:\/\/github.com\/http-interop\/http-factory-guzzle\/tree\/1.2.0"},"time":"2021-07-21T13:50:14+00:00"},{"name":"kevinrob\/guzzle-cache-middleware","version":"6.0.0","source":{"type":"git","url":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware.git","reference":"61305ed694e763e887a04f61e71e2292bb4fbad1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Kevinrob\/guzzle-cache-middleware\/zipball\/61305ed694e763e887a04f61e71e2292bb4fbad1","reference":"61305ed694e763e887a04f61e71e2292bb4fbad1","shasum":""},"require":{"guzzlehttp\/guzzle":"^7.9.2","guzzlehttp\/promises":"^2.0.3","guzzlehttp\/psr7":"^2.7.0","php":">=8.1"},"require-dev":{"cache\/array-adapter":"^0.4 || ^0.5 || ^1.0","cache\/simple-cache-bridge":"^0.1 || ^1.0","doctrine\/cache":"^1.10","illuminate\/cache":"^5.0","league\/flysystem":"^2.5","phpunit\/phpunit":"^9.6.21","psr\/cache":"^1.0","symfony\/cache":"^4.4 || ^5.0","symfony\/phpunit-bridge":"^7.1.4"},"suggest":{"doctrine\/cache":"This library has a lot of ready-to-use cache storage (to be used with Kevinrob\\GuzzleCache\\Storage\\DoctrineCacheStorage). Use only versions >=1.4.0 < 2.0.0","guzzlehttp\/guzzle":"For using this library. It was created for Guzzle6 (but you can use it with any PSR-7 HTTP client).","laravel\/framework":"To be used with Kevinrob\\GuzzleCache\\Storage\\LaravelCacheStorage","league\/flysystem":"To be used with Kevinrob\\GuzzleCache\\Storage\\FlysystemStorage","psr\/cache":"To be used with Kevinrob\\GuzzleCache\\Storage\\Psr6CacheStorage","psr\/simple-cache":"To be used with Kevinrob\\GuzzleCache\\Storage\\Psr16CacheStorage"},"type":"library","autoload":{"psr-4":{"Kevinrob\\GuzzleCache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Kevin Robatel","email":"kevinrob2@gmail.com","homepage":"https:\/\/github.com\/Kevinrob"}],"description":"A HTTP\/1.1 Cache for Guzzle 6. It's a simple Middleware to be added in the HandlerStack. (RFC 7234)","homepage":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware","keywords":["Etag","Flysystem","Guzzle","cache","cache-control","doctrine","expiration","guzzle6","handler","http","http 1.1","middleware","performance","php","promise","psr6","psr7","rfc7234","validation"],"support":{"issues":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware\/issues","source":"https:\/\/github.com\/Kevinrob\/guzzle-cache-middleware\/tree\/6.0.0"},"time":"2024-10-17T09:11:54+00:00"},{"name":"laminas\/laminas-servicemanager","version":"3.24.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-servicemanager.git","reference":"b172a0df568bf37ebdfb3658263156eefe3c1e8c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-servicemanager\/zipball\/b172a0df568bf37ebdfb3658263156eefe3c1e8c","reference":"b172a0df568bf37ebdfb3658263156eefe3c1e8c","shasum":""},"require":{"laminas\/laminas-stdlib":"^3.19","php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0","psr\/container":"^1.0"},"conflict":{"ext-psr":"*","laminas\/laminas-code":"<4.10.0","zendframework\/zend-code":"<3.3.1","zendframework\/zend-servicemanager":"*"},"provide":{"psr\/container-implementation":"^1.0"},"replace":{"container-interop\/container-interop":"^1.2.0"},"require-dev":{"composer\/package-versions-deprecated":"^1.11.99.5","friendsofphp\/proxy-manager-lts":"^1.0.18","laminas\/laminas-code":"^4.16.0","laminas\/laminas-coding-standard":"~2.5.0","laminas\/laminas-container-config-test":"^0.8","mikey179\/vfsstream":"^1.6.12","phpbench\/phpbench":"^1.4.1","phpunit\/phpunit":"^10.5.58","psalm\/plugin-phpunit":"^0.18.4","vimeo\/psalm":"^5.26.1"},"suggest":{"friendsofphp\/proxy-manager-lts":"ProxyManager ^2.1.1 to handle lazy initialization of services"},"bin":["bin\/generate-deps-for-config-factory","bin\/generate-factory-for-class"],"type":"library","autoload":{"files":["src\/autoload.php"],"psr-4":{"Laminas\\ServiceManager\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"Factory-Driven Dependency Injection Container","homepage":"https:\/\/laminas.dev","keywords":["PSR-11","dependency-injection","di","dic","laminas","service-manager","servicemanager"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-servicemanager\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-servicemanager\/issues","rss":"https:\/\/github.com\/laminas\/laminas-servicemanager\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-servicemanager"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"time":"2025-10-14T09:03:51+00:00"},{"name":"laminas\/laminas-stdlib","version":"3.21.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-stdlib.git","reference":"b1c81514cfe158aadf724c42b34d3d0a8164c096"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-stdlib\/zipball\/b1c81514cfe158aadf724c42b34d3d0a8164c096","reference":"b1c81514cfe158aadf724c42b34d3d0a8164c096","shasum":""},"require":{"php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0"},"conflict":{"zendframework\/zend-stdlib":"*"},"require-dev":{"laminas\/laminas-coding-standard":"^3.1.0","phpbench\/phpbench":"^1.4.1","phpunit\/phpunit":"^11.5.42","psalm\/plugin-phpunit":"^0.19.5","vimeo\/psalm":"^6.13.1"},"type":"library","autoload":{"psr-4":{"Laminas\\Stdlib\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"SPL extensions, array utilities, error handlers, and more","homepage":"https:\/\/laminas.dev","keywords":["laminas","stdlib"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-stdlib\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-stdlib\/issues","rss":"https:\/\/github.com\/laminas\/laminas-stdlib\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-stdlib"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"time":"2025-10-11T18:13:12+00:00"},{"name":"laminas\/laminas-validator","version":"2.65.0","source":{"type":"git","url":"https:\/\/github.com\/laminas\/laminas-validator.git","reference":"f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laminas\/laminas-validator\/zipball\/f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49","reference":"f0767ca83e0dd91a6f8ccdd4f0887eb132c0ea49","shasum":""},"require":{"laminas\/laminas-servicemanager":"^3.21.0","laminas\/laminas-stdlib":"^3.19","php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0","psr\/http-message":"^1.0.1 || ^2.0.0"},"conflict":{"zendframework\/zend-validator":"*"},"require-dev":{"laminas\/laminas-coding-standard":"^2.5","laminas\/laminas-db":"^2.20","laminas\/laminas-filter":"^2.41.0","laminas\/laminas-i18n":"^2.30.0","laminas\/laminas-session":"^2.25.1","laminas\/laminas-uri":"^2.13.0","phpunit\/phpunit":"^10.5.58","psalm\/plugin-phpunit":"^0.19.0","psr\/http-client":"^1.0.3","psr\/http-factory":"^1.1.0","vimeo\/psalm":"^5.26.1"},"suggest":{"laminas\/laminas-db":"Laminas\\Db component, required by the (No)RecordExists validator","laminas\/laminas-filter":"Laminas\\Filter component, required by the Digits validator","laminas\/laminas-i18n":"Laminas\\I18n component to allow translation of validation error messages","laminas\/laminas-i18n-resources":"Translations of validator messages","laminas\/laminas-servicemanager":"Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains","laminas\/laminas-session":"Laminas\\Session component, ^2.8; required by the Csrf validator","laminas\/laminas-uri":"Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators","psr\/http-message":"psr\/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators"},"type":"library","extra":{"laminas":{"component":"Laminas\\Validator","config-provider":"Laminas\\Validator\\ConfigProvider"}},"autoload":{"psr-4":{"Laminas\\Validator\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria","homepage":"https:\/\/laminas.dev","keywords":["laminas","validator"],"support":{"chat":"https:\/\/laminas.dev\/chat","docs":"https:\/\/docs.laminas.dev\/laminas-validator\/","forum":"https:\/\/discourse.laminas.dev","issues":"https:\/\/github.com\/laminas\/laminas-validator\/issues","rss":"https:\/\/github.com\/laminas\/laminas-validator\/releases.atom","source":"https:\/\/github.com\/laminas\/laminas-validator"},"funding":[{"url":"https:\/\/funding.communitybridge.org\/projects\/laminas-project","type":"community_bridge"}],"time":"2025-10-13T14:40:30+00:00"},{"name":"league\/csv","version":"9.27.1","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/csv.git","reference":"26de738b8fccf785397d05ee2fc07b6cd8749797"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/csv\/zipball\/26de738b8fccf785397d05ee2fc07b6cd8749797","reference":"26de738b8fccf785397d05ee2fc07b6cd8749797","shasum":""},"require":{"ext-filter":"*","php":"^8.1.2"},"require-dev":{"ext-dom":"*","ext-xdebug":"*","friendsofphp\/php-cs-fixer":"^3.75.0","phpbench\/phpbench":"^1.4.1","phpstan\/phpstan":"^1.12.27","phpstan\/phpstan-deprecation-rules":"^1.2.1","phpstan\/phpstan-phpunit":"^1.4.2","phpstan\/phpstan-strict-rules":"^1.6.2","phpunit\/phpunit":"^10.5.16 || ^11.5.22 || ^12.3.6","symfony\/var-dumper":"^6.4.8 || ^7.3.0"},"suggest":{"ext-dom":"Required to use the XMLConverter and the HTMLConverter classes","ext-iconv":"Needed to ease transcoding CSV using iconv stream filters","ext-mbstring":"Needed to ease transcoding CSV using mb stream filters","ext-mysqli":"Requiered to use the package with the MySQLi extension","ext-pdo":"Required to use the package with the PDO extension","ext-pgsql":"Requiered to use the package with the PgSQL extension","ext-sqlite3":"Required to use the package with the SQLite3 extension"},"type":"library","extra":{"branch-alias":{"dev-master":"9.x-dev"}},"autoload":{"files":["src\/functions_include.php"],"psr-4":{"League\\Csv\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/github.com\/nyamsprod\/","role":"Developer"}],"description":"CSV data manipulation made easy in PHP","homepage":"https:\/\/csv.thephpleague.com","keywords":["convert","csv","export","filter","import","read","transform","write"],"support":{"docs":"https:\/\/csv.thephpleague.com","issues":"https:\/\/github.com\/thephpleague\/csv\/issues","rss":"https:\/\/github.com\/thephpleague\/csv\/releases.atom","source":"https:\/\/github.com\/thephpleague\/csv"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"time":"2025-10-25T08:35:20+00:00"},{"name":"league\/oauth2-client","version":"2.8.1","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/oauth2-client.git","reference":"9df2924ca644736c835fc60466a3a60390d334f9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/oauth2-client\/zipball\/9df2924ca644736c835fc60466a3a60390d334f9","reference":"9df2924ca644736c835fc60466a3a60390d334f9","shasum":""},"require":{"ext-json":"*","guzzlehttp\/guzzle":"^6.5.8 || ^7.4.5","php":"^7.1 || >=8.0.0 <8.5.0"},"require-dev":{"mockery\/mockery":"^1.3.5","php-parallel-lint\/php-parallel-lint":"^1.4","phpunit\/phpunit":"^7 || ^8 || ^9 || ^10 || ^11","squizlabs\/php_codesniffer":"^3.11"},"type":"library","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.8.1"},"time":"2025-02-26T04:37:30+00:00"},{"name":"loophp\/phposinfo","version":"1.8.0","source":{"type":"git","url":"https:\/\/github.com\/loophp\/phposinfo.git","reference":"9faccbfbf5364fd34fbc230961fa6fc51cc66b8f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/loophp\/phposinfo\/zipball\/9faccbfbf5364fd34fbc230961fa6fc51cc66b8f","reference":"9faccbfbf5364fd34fbc230961fa6fc51cc66b8f","shasum":""},"require":{"php":"^8"},"require-dev":{"drupol\/php-conventions":"^5.0.0","ext-pcov":"*","friends-of-phpspec\/phpspec-code-coverage":"^6","infection\/infection":"^0.26","infection\/phpspec-adapter":"^0.2.0","phpspec\/phpspec":"^7"},"type":"library","autoload":{"psr-4":{"loophp\\phposinfo\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Pol Dellaiera","email":"pol.dellaiera@protonmail.com"}],"description":"Try to guess the host operating system.","keywords":["operating system detection"],"support":{"issues":"https:\/\/github.com\/loophp\/phposinfo\/issues","source":"https:\/\/github.com\/loophp\/phposinfo"},"funding":[{"url":"https:\/\/github.com\/drupol","type":"github"}],"time":"2022-12-20T20:21:10+00:00"},{"name":"ltd-beget\/ascii-table","version":"1.0.4","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/ascii-table.git","reference":"4020cf9015ceff6405b7204bc14c8d58cf9879dd"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/ascii-table\/zipball\/4020cf9015ceff6405b7204bc14c8d58cf9879dd","reference":"4020cf9015ceff6405b7204bc14c8d58cf9879dd","shasum":""},"require":{"marc-mabe\/php-enum":">=2.2","php":">=7.0"},"type":"library","autoload":{"psr-0":{"LTDBeget\\ascii":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php library with ascii table enum.","keywords":["ascii"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/ascii-table\/issues","source":"https:\/\/github.com\/LTD-Beget\/ascii-table\/tree\/1.0.4"},"time":"2022-01-26T19:08:18+00:00"},{"name":"ltd-beget\/dns-zone-configurator","version":"v1.4.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator.git","reference":"4e163fdead146e3de6ce7938b99d820395782cdc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/dns-zone-configurator\/zipball\/4e163fdead146e3de6ce7938b99d820395782cdc","reference":"4e163fdead146e3de6ce7938b99d820395782cdc","shasum":""},"require":{"laminas\/laminas-validator":"^2.30.1","ltd-beget\/dns-zone-tokenizer":"~0.0.10","marc-mabe\/php-enum":">=2.2","php":">=8.0"},"require-dev":{"phpunit\/phpunit":"~8.5.33","tideways\/profiler":"~2.0"},"type":"library","autoload":{"psr-0":{"LTDBeget\\dns":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php library for parsing and editing dns zones files programmatically with high level abstraction.","keywords":["dns","zone file"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator\/issues","source":"https:\/\/github.com\/LTD-Beget\/dns-zone-configurator\/tree\/v1.4.0"},"time":"2024-12-04T14:34:28+00:00"},{"name":"ltd-beget\/dns-zone-tokenizer","version":"v0.0.11","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer.git","reference":"f57d614a7205a8d4ff0112a4c954a2425c218272"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/dns-zone-tokenizer\/zipball\/f57d614a7205a8d4ff0112a4c954a2425c218272","reference":"f57d614a7205a8d4ff0112a4c954a2425c218272","shasum":""},"require":{"ltd-beget\/stringstream":"^1.0 || ^2.0","php":">=7.1"},"require-dev":{"ext-json":"*","phpunit\/phpunit":"^8.5.1","tideways\/profiler":"^2.0.1"},"type":"library","autoload":{"psr-0":{"LTDBeget\\dns":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"tokenize dns zone files and that's all, folks.","keywords":["dns","dns parser","dns zone"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer\/issues","source":"https:\/\/github.com\/LTD-Beget\/dns-zone-tokenizer\/tree\/v0.0.11"},"time":"2024-12-04T13:57:17+00:00"},{"name":"ltd-beget\/stringstream","version":"v2.0.0","source":{"type":"git","url":"https:\/\/github.com\/LTD-Beget\/stringstream.git","reference":"abd5d4f514a916f11f054bf577491e549ecf61ac"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/LTD-Beget\/stringstream\/zipball\/abd5d4f514a916f11f054bf577491e549ecf61ac","reference":"abd5d4f514a916f11f054bf577491e549ecf61ac","shasum":""},"require":{"ltd-beget\/ascii-table":"1.* || 2.*","php":">=7.4"},"require-dev":{"phpunit\/phpunit":"^9.5.0"},"type":"library","autoload":{"psr-0":{"LTDBeget\\stringstream":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Viskov Sergey","homepage":"https:\/\/github.com\/voksiv"}],"description":"Php Stringstream data structure.","keywords":["stream","stringstream"],"support":{"issues":"https:\/\/github.com\/LTD-Beget\/stringstream\/issues","source":"https:\/\/github.com\/LTD-Beget\/stringstream\/tree\/v2.0.0"},"time":"2022-01-26T16:24:29+00:00"},{"name":"m4tthumphrey\/php-gitlab-api","version":"12.0.0","source":{"type":"git","url":"https:\/\/github.com\/GitLabPHP\/Client.git","reference":"362450ff932296bc15796f97da8cf57941650037"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/GitLabPHP\/Client\/zipball\/362450ff932296bc15796f97da8cf57941650037","reference":"362450ff932296bc15796f97da8cf57941650037","shasum":""},"require":{"ext-json":"*","ext-xml":"*","php":"^8.1","php-http\/cache-plugin":"^2.0.1","php-http\/client-common":"^2.7.2","php-http\/discovery":"^1.20.0","php-http\/httplug":"^2.4.1","php-http\/multipart-stream-builder":"^1.4.2","psr\/cache":"^2.0 || ^3.0","psr\/http-client-implementation":"^1.0","psr\/http-factory-implementation":"^1.0","psr\/http-message":"^1.1 || ^2.0","symfony\/options-resolver":"^5.4 || ^6.0 || ^7.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","guzzlehttp\/guzzle":"^7.9.2"},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false}},"autoload":{"psr-4":{"Gitlab\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Bourigault","email":"bourigaultfabien@gmail.com","homepage":"https:\/\/github.com\/fbourigault"},{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Matt Humphrey","email":"matth@windsor-telecom.co.uk","homepage":"https:\/\/github.com\/m4tthumphrey"},{"name":"Miguel Piedrafita","email":"github@miguelpiedrafita.com","homepage":"https:\/\/github.com\/m1guelpf"}],"description":"GitLab API v4 client for PHP","keywords":["api","gitlab"],"support":{"issues":"https:\/\/github.com\/GitLabPHP\/Client\/issues","source":"https:\/\/github.com\/GitLabPHP\/Client\/tree\/12.0.0"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"}],"time":"2025-02-23T20:36:49+00:00"},{"name":"marc-mabe\/php-enum","version":"v4.7.2","source":{"type":"git","url":"https:\/\/github.com\/marc-mabe\/php-enum.git","reference":"bb426fcdd65c60fb3638ef741e8782508fda7eef"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/marc-mabe\/php-enum\/zipball\/bb426fcdd65c60fb3638ef741e8782508fda7eef","reference":"bb426fcdd65c60fb3638ef741e8782508fda7eef","shasum":""},"require":{"ext-reflection":"*","php":"^7.1 | ^8.0"},"require-dev":{"phpbench\/phpbench":"^0.16.10 || ^1.0.4","phpstan\/phpstan":"^1.3.1","phpunit\/phpunit":"^7.5.20 | ^8.5.22 | ^9.5.11","vimeo\/psalm":"^4.17.0 | ^5.26.1"},"type":"library","extra":{"branch-alias":{"dev-3.x":"3.2-dev","dev-master":"4.7-dev"}},"autoload":{"psr-4":{"MabeEnum\\":"src\/"},"classmap":["stubs\/Stringable.php"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Marc Bennewitz","email":"dev@mabe.berlin","homepage":"https:\/\/mabe.berlin\/","role":"Lead"}],"description":"Simple and fast implementation of enumerations with native PHP","homepage":"https:\/\/github.com\/marc-mabe\/php-enum","keywords":["enum","enum-map","enum-set","enumeration","enumerator","enummap","enumset","map","set","type","type-hint","typehint"],"support":{"issues":"https:\/\/github.com\/marc-mabe\/php-enum\/issues","source":"https:\/\/github.com\/marc-mabe\/php-enum\/tree\/v4.7.2"},"time":"2025-09-14T11:18:39+00:00"},{"name":"php-http\/cache-plugin","version":"2.0.1","source":{"type":"git","url":"https:\/\/github.com\/php-http\/cache-plugin.git","reference":"5c591e9e04602cec12307e3e1be3abefeb005e29"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/cache-plugin\/zipball\/5c591e9e04602cec12307e3e1be3abefeb005e29","reference":"5c591e9e04602cec12307e3e1be3abefeb005e29","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/client-common":"^1.9 || ^2.0","psr\/cache":"^1.0 || ^2.0 || ^3.0","psr\/http-factory-implementation":"^1.0","symfony\/options-resolver":"^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"},"require-dev":{"nyholm\/psr7":"^1.6.1","phpspec\/phpspec":"^5.1 || ^6.0 || ^7.0"},"type":"library","autoload":{"psr-4":{"Http\\Client\\Common\\Plugin\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"PSR-6 Cache plugin for HTTPlug","homepage":"http:\/\/httplug.io","keywords":["cache","http","httplug","plugin"],"support":{"issues":"https:\/\/github.com\/php-http\/cache-plugin\/issues","source":"https:\/\/github.com\/php-http\/cache-plugin\/tree\/2.0.1"},"time":"2024-10-02T11:25:38+00:00"},{"name":"php-http\/client-common","version":"2.7.2","source":{"type":"git","url":"https:\/\/github.com\/php-http\/client-common.git","reference":"0cfe9858ab9d3b213041b947c881d5b19ceeca46"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/client-common\/zipball\/0cfe9858ab9d3b213041b947c881d5b19ceeca46","reference":"0cfe9858ab9d3b213041b947c881d5b19ceeca46","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/httplug":"^2.0","php-http\/message":"^1.6","psr\/http-client":"^1.0","psr\/http-factory":"^1.0","psr\/http-message":"^1.0 || ^2.0","symfony\/options-resolver":"~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0","symfony\/polyfill-php80":"^1.17"},"require-dev":{"doctrine\/instantiator":"^1.1","guzzlehttp\/psr7":"^1.4","nyholm\/psr7":"^1.2","phpspec\/phpspec":"^5.1 || ^6.3 || ^7.1","phpspec\/prophecy":"^1.10.2","phpunit\/phpunit":"^7.5.20 || ^8.5.33 || ^9.6.7"},"suggest":{"ext-json":"To detect JSON responses with the ContentTypePlugin","ext-libxml":"To detect XML responses with the ContentTypePlugin","php-http\/cache-plugin":"PSR-6 Cache plugin","php-http\/logger-plugin":"PSR-3 Logger plugin","php-http\/stopwatch-plugin":"Symfony Stopwatch plugin"},"type":"library","autoload":{"psr-4":{"Http\\Client\\Common\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Common HTTP Client implementations and tools for HTTPlug","homepage":"http:\/\/httplug.io","keywords":["client","common","http","httplug"],"support":{"issues":"https:\/\/github.com\/php-http\/client-common\/issues","source":"https:\/\/github.com\/php-http\/client-common\/tree\/2.7.2"},"time":"2024-09-24T06:21:48+00:00"},{"name":"php-http\/discovery","version":"1.20.0","source":{"type":"git","url":"https:\/\/github.com\/php-http\/discovery.git","reference":"82fe4c73ef3363caed49ff8dd1539ba06044910d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/discovery\/zipball\/82fe4c73ef3363caed49ff8dd1539ba06044910d","reference":"82fe4c73ef3363caed49ff8dd1539ba06044910d","shasum":""},"require":{"composer-plugin-api":"^1.0|^2.0","php":"^7.1 || ^8.0"},"conflict":{"nyholm\/psr7":"<1.0","zendframework\/zend-diactoros":"*"},"provide":{"php-http\/async-client-implementation":"*","php-http\/client-implementation":"*","psr\/http-client-implementation":"*","psr\/http-factory-implementation":"*","psr\/http-message-implementation":"*"},"require-dev":{"composer\/composer":"^1.0.2|^2.0","graham-campbell\/phpspec-skip-example-extension":"^5.0","php-http\/httplug":"^1.0 || ^2.0","php-http\/message-factory":"^1.0","phpspec\/phpspec":"^5.1 || ^6.1 || ^7.3","sebastian\/comparator":"^3.0.5 || ^4.0.8","symfony\/phpunit-bridge":"^6.4.4 || ^7.0.1"},"type":"composer-plugin","extra":{"class":"Http\\Discovery\\Composer\\Plugin","plugin-optional":true},"autoload":{"psr-4":{"Http\\Discovery\\":"src\/"},"exclude-from-classmap":["src\/Composer\/Plugin.php"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations","homepage":"http:\/\/php-http.org","keywords":["adapter","client","discovery","factory","http","message","psr17","psr7"],"support":{"issues":"https:\/\/github.com\/php-http\/discovery\/issues","source":"https:\/\/github.com\/php-http\/discovery\/tree\/1.20.0"},"time":"2024-10-02T11:20:13+00:00"},{"name":"php-http\/httplug","version":"2.4.1","source":{"type":"git","url":"https:\/\/github.com\/php-http\/httplug.git","reference":"5cad731844891a4c282f3f3e1b582c46839d22f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/httplug\/zipball\/5cad731844891a4c282f3f3e1b582c46839d22f4","reference":"5cad731844891a4c282f3f3e1b582c46839d22f4","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/promise":"^1.1","psr\/http-client":"^1.0","psr\/http-message":"^1.0 || ^2.0"},"require-dev":{"friends-of-phpspec\/phpspec-code-coverage":"^4.1 || ^5.0 || ^6.0","phpspec\/phpspec":"^5.1 || ^6.0 || ^7.0"},"type":"library","autoload":{"psr-4":{"Http\\Client\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Eric GELOEN","email":"geloen.eric@gmail.com"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com","homepage":"https:\/\/sagikazarmark.hu"}],"description":"HTTPlug, the HTTP client abstraction for PHP","homepage":"http:\/\/httplug.io","keywords":["client","http"],"support":{"issues":"https:\/\/github.com\/php-http\/httplug\/issues","source":"https:\/\/github.com\/php-http\/httplug\/tree\/2.4.1"},"time":"2024-09-23T11:39:58+00:00"},{"name":"php-http\/message","version":"1.16.2","source":{"type":"git","url":"https:\/\/github.com\/php-http\/message.git","reference":"06dd5e8562f84e641bf929bfe699ee0f5ce8080a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/message\/zipball\/06dd5e8562f84e641bf929bfe699ee0f5ce8080a","reference":"06dd5e8562f84e641bf929bfe699ee0f5ce8080a","shasum":""},"require":{"clue\/stream-filter":"^1.5","php":"^7.2 || ^8.0","psr\/http-message":"^1.1 || ^2.0"},"provide":{"php-http\/message-factory-implementation":"1.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.6","ext-zlib":"*","guzzlehttp\/psr7":"^1.0 || ^2.0","laminas\/laminas-diactoros":"^2.0 || ^3.0","php-http\/message-factory":"^1.0.2","phpspec\/phpspec":"^5.1 || ^6.3 || ^7.1","slim\/slim":"^3.0"},"suggest":{"ext-zlib":"Used with compressor\/decompressor streams","guzzlehttp\/psr7":"Used with Guzzle PSR-7 Factories","laminas\/laminas-diactoros":"Used with Diactoros Factories","slim\/slim":"Used with Slim Framework PSR-7 implementation"},"type":"library","autoload":{"files":["src\/filters.php"],"psr-4":{"Http\\Message\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"HTTP Message related tools","homepage":"http:\/\/php-http.org","keywords":["http","message","psr-7"],"support":{"issues":"https:\/\/github.com\/php-http\/message\/issues","source":"https:\/\/github.com\/php-http\/message\/tree\/1.16.2"},"time":"2024-10-02T11:34:13+00:00"},{"name":"php-http\/multipart-stream-builder","version":"1.4.2","source":{"type":"git","url":"https:\/\/github.com\/php-http\/multipart-stream-builder.git","reference":"10086e6de6f53489cca5ecc45b6f468604d3460e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/multipart-stream-builder\/zipball\/10086e6de6f53489cca5ecc45b6f468604d3460e","reference":"10086e6de6f53489cca5ecc45b6f468604d3460e","shasum":""},"require":{"php":"^7.1 || ^8.0","php-http\/discovery":"^1.15","psr\/http-factory-implementation":"^1.0"},"require-dev":{"nyholm\/psr7":"^1.0","php-http\/message":"^1.5","php-http\/message-factory":"^1.0.2","phpunit\/phpunit":"^7.5.15 || ^8.5 || ^9.3"},"type":"library","autoload":{"psr-4":{"Http\\Message\\MultipartStream\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Tobias Nyholm","email":"tobias.nyholm@gmail.com"}],"description":"A builder class that help you create a multipart stream","homepage":"http:\/\/php-http.org","keywords":["factory","http","message","multipart stream","stream"],"support":{"issues":"https:\/\/github.com\/php-http\/multipart-stream-builder\/issues","source":"https:\/\/github.com\/php-http\/multipart-stream-builder\/tree\/1.4.2"},"time":"2024-09-04T13:22:54+00:00"},{"name":"php-http\/promise","version":"1.3.1","source":{"type":"git","url":"https:\/\/github.com\/php-http\/promise.git","reference":"fc85b1fba37c169a69a07ef0d5a8075770cc1f83"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-http\/promise\/zipball\/fc85b1fba37c169a69a07ef0d5a8075770cc1f83","reference":"fc85b1fba37c169a69a07ef0d5a8075770cc1f83","shasum":""},"require":{"php":"^7.1 || ^8.0"},"require-dev":{"friends-of-phpspec\/phpspec-code-coverage":"^4.3.2 || ^6.3","phpspec\/phpspec":"^5.1.2 || ^6.2 || ^7.4"},"type":"library","autoload":{"psr-4":{"Http\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Joel Wurtz","email":"joel.wurtz@gmail.com"},{"name":"M\u00e1rk S\u00e1gi-Kaz\u00e1r","email":"mark.sagikazar@gmail.com"}],"description":"Promise used for asynchronous HTTP requests","homepage":"http:\/\/httplug.io","keywords":["promise"],"support":{"issues":"https:\/\/github.com\/php-http\/promise\/issues","source":"https:\/\/github.com\/php-http\/promise\/tree\/1.3.1"},"time":"2024-03-15T13:55:21+00:00"},{"name":"phpoption\/phpoption","version":"1.9.4","source":{"type":"git","url":"https:\/\/github.com\/schmittjoh\/php-option.git","reference":"638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/schmittjoh\/php-option\/zipball\/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d","reference":"638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d","shasum":""},"require":{"php":"^7.2.5 || ^8.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","phpunit\/phpunit":"^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false},"branch-alias":{"dev-master":"1.9-dev"}},"autoload":{"psr-4":{"PhpOption\\":"src\/PhpOption\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["Apache-2.0"],"authors":[{"name":"Johannes M. Schmitt","email":"schmittjoh@gmail.com","homepage":"https:\/\/github.com\/schmittjoh"},{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"}],"description":"Option Type for PHP","keywords":["language","option","php","type"],"support":{"issues":"https:\/\/github.com\/schmittjoh\/php-option\/issues","source":"https:\/\/github.com\/schmittjoh\/php-option\/tree\/1.9.4"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/phpoption\/phpoption","type":"tidelift"}],"time":"2025-08-21T11:53:16+00:00"},{"name":"psr\/cache","version":"3.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/cache.git","reference":"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/cache\/zipball\/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf","reference":"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf","shasum":""},"require":{"php":">=8.0.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Cache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for caching libraries","keywords":["cache","psr","psr-6"],"support":{"source":"https:\/\/github.com\/php-fig\/cache\/tree\/3.0.0"},"time":"2021-02-03T23:26:27+00:00"},{"name":"psr\/container","version":"1.1.2","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/container.git","reference":"513e0666f7216c7459170d56df27dfcefe1689ea"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/container\/zipball\/513e0666f7216c7459170d56df27dfcefe1689ea","reference":"513e0666f7216c7459170d56df27dfcefe1689ea","shasum":""},"require":{"php":">=7.4.0"},"type":"library","autoload":{"psr-4":{"Psr\\Container\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common Container Interface (PHP FIG PSR-11)","homepage":"https:\/\/github.com\/php-fig\/container","keywords":["PSR-11","container","container-interface","container-interop","psr"],"support":{"issues":"https:\/\/github.com\/php-fig\/container\/issues","source":"https:\/\/github.com\/php-fig\/container\/tree\/1.1.2"},"time":"2021-11-05T16:50:12+00:00"},{"name":"psr\/event-dispatcher","version":"1.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/event-dispatcher.git","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/event-dispatcher\/zipball\/dbefd12671e8a14ec7f180cab83036ed26714bb0","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0","shasum":""},"require":{"php":">=7.2.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\EventDispatcher\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"Standard interfaces for event handling.","keywords":["events","psr","psr-14"],"support":{"issues":"https:\/\/github.com\/php-fig\/event-dispatcher\/issues","source":"https:\/\/github.com\/php-fig\/event-dispatcher\/tree\/1.0.0"},"time":"2019-01-08T18:20:26+00:00"},{"name":"psr\/http-client","version":"1.0.3","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-client.git","reference":"bb5906edc1c324c9a05aa0873d40117941e5fa90"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-client\/zipball\/bb5906edc1c324c9a05aa0873d40117941e5fa90","reference":"bb5906edc1c324c9a05aa0873d40117941e5fa90","shasum":""},"require":{"php":"^7.0 || ^8.0","psr\/http-message":"^1.0 || ^2.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Http\\Client\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for HTTP clients","homepage":"https:\/\/github.com\/php-fig\/http-client","keywords":["http","http-client","psr","psr-18"],"support":{"source":"https:\/\/github.com\/php-fig\/http-client"},"time":"2023-09-23T14:17:50+00:00"},{"name":"psr\/http-factory","version":"1.1.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-factory.git","reference":"2b4765fddfe3b508ac62f829e852b1501d3f6e8a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-factory\/zipball\/2b4765fddfe3b508ac62f829e852b1501d3f6e8a","reference":"2b4765fddfe3b508ac62f829e852b1501d3f6e8a","shasum":""},"require":{"php":">=7.1","psr\/http-message":"^1.0 || ^2.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Http\\Message\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"PSR-17: Common interfaces for PSR-7 HTTP message factories","keywords":["factory","http","message","psr","psr-17","psr-7","request","response"],"support":{"source":"https:\/\/github.com\/php-fig\/http-factory"},"time":"2024-04-15T12:06:14+00:00"},{"name":"psr\/http-message","version":"2.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-message.git","reference":"402d35bcb92c70c026d1a6a9883f06b2ead23d71"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-message\/zipball\/402d35bcb92c70c026d1a6a9883f06b2ead23d71","reference":"402d35bcb92c70c026d1a6a9883f06b2ead23d71","shasum":""},"require":{"php":"^7.2 || ^8.0"},"type":"library","extra":{"branch-alias":{"dev-master":"2.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Http\\Message\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/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"],"support":{"source":"https:\/\/github.com\/php-fig\/http-message\/tree\/2.0"},"time":"2023-04-04T09:54:51+00:00"},{"name":"psr\/log","version":"3.0.2","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/log.git","reference":"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/log\/zipball\/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3","reference":"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3","shasum":""},"require":{"php":">=8.0.0"},"type":"library","extra":{"branch-alias":{"dev-master":"3.x-dev"}},"autoload":{"psr-4":{"Psr\\Log\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/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\/3.0.2"},"time":"2024-09-11T13:17:53+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":"ramsey\/collection","version":"2.1.1","source":{"type":"git","url":"https:\/\/github.com\/ramsey\/collection.git","reference":"344572933ad0181accbf4ba763e85a0306a8c5e2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ramsey\/collection\/zipball\/344572933ad0181accbf4ba763e85a0306a8c5e2","reference":"344572933ad0181accbf4ba763e85a0306a8c5e2","shasum":""},"require":{"php":"^8.1"},"require-dev":{"captainhook\/plugin-composer":"^5.3","ergebnis\/composer-normalize":"^2.45","fakerphp\/faker":"^1.24","hamcrest\/hamcrest-php":"^2.0","jangregor\/phpstan-prophecy":"^2.1","mockery\/mockery":"^1.6","php-parallel-lint\/php-console-highlighter":"^1.0","php-parallel-lint\/php-parallel-lint":"^1.4","phpspec\/prophecy-phpunit":"^2.3","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2.1","phpstan\/phpstan-mockery":"^2.0","phpstan\/phpstan-phpunit":"^2.0","phpunit\/phpunit":"^10.5","ramsey\/coding-standard":"^2.3","ramsey\/conventional-commits":"^1.6","roave\/security-advisories":"dev-latest"},"type":"library","extra":{"captainhook":{"force-install":true},"ramsey\/conventional-commits":{"configFile":"conventional-commits.json"}},"autoload":{"psr-4":{"Ramsey\\Collection\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ben Ramsey","email":"ben@benramsey.com","homepage":"https:\/\/benramsey.com"}],"description":"A PHP library for representing and manipulating collections.","keywords":["array","collection","hash","map","queue","set"],"support":{"issues":"https:\/\/github.com\/ramsey\/collection\/issues","source":"https:\/\/github.com\/ramsey\/collection\/tree\/2.1.1"},"time":"2025-03-22T05:38:12+00:00"},{"name":"ramsey\/uuid","version":"4.9.1","source":{"type":"git","url":"https:\/\/github.com\/ramsey\/uuid.git","reference":"81f941f6f729b1e3ceea61d9d014f8b6c6800440"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ramsey\/uuid\/zipball\/81f941f6f729b1e3ceea61d9d014f8b6c6800440","reference":"81f941f6f729b1e3ceea61d9d014f8b6c6800440","shasum":""},"require":{"brick\/math":"^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14","php":"^8.0","ramsey\/collection":"^1.2 || ^2.0"},"replace":{"rhumsaa\/uuid":"self.version"},"require-dev":{"captainhook\/captainhook":"^5.25","captainhook\/plugin-composer":"^5.3","dealerdirect\/phpcodesniffer-composer-installer":"^1.0","ergebnis\/composer-normalize":"^2.47","mockery\/mockery":"^1.6","paragonie\/random-lib":"^2","php-mock\/php-mock":"^2.6","php-mock\/php-mock-mockery":"^1.5","php-parallel-lint\/php-parallel-lint":"^1.4.0","phpbench\/phpbench":"^1.2.14","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2.1","phpstan\/phpstan-mockery":"^2.0","phpstan\/phpstan-phpunit":"^2.0","phpunit\/phpunit":"^9.6","slevomat\/coding-standard":"^8.18","squizlabs\/php_codesniffer":"^3.13"},"suggest":{"ext-bcmath":"Enables faster math with arbitrary-precision integers using BCMath.","ext-gmp":"Enables faster math with arbitrary-precision integers using GMP.","ext-uuid":"Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.","paragonie\/random-lib":"Provides RandomLib for use with the RandomLibAdapter","ramsey\/uuid-doctrine":"Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."},"type":"library","extra":{"captainhook":{"force-install":true}},"autoload":{"files":["src\/functions.php"],"psr-4":{"Ramsey\\Uuid\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"A PHP library for generating and working with universally unique identifiers (UUIDs).","keywords":["guid","identifier","uuid"],"support":{"issues":"https:\/\/github.com\/ramsey\/uuid\/issues","source":"https:\/\/github.com\/ramsey\/uuid\/tree\/4.9.1"},"time":"2025-09-04T20:59:21+00:00"},{"name":"ratchet\/pawl","version":"v0.4.3","source":{"type":"git","url":"https:\/\/github.com\/ratchetphp\/Pawl.git","reference":"2c582373c78271de32cb04c755c4c0db7e09c9c0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ratchetphp\/Pawl\/zipball\/2c582373c78271de32cb04c755c4c0db7e09c9c0","reference":"2c582373c78271de32cb04c755c4c0db7e09c9c0","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0","guzzlehttp\/psr7":"^2.0","php":">=7.4","ratchet\/rfc6455":"^0.3.1 || ^0.4.0","react\/socket":"^1.9"},"require-dev":{"phpunit\/phpunit":"^9.3 || ^5.7 || ^4.8"},"suggest":{"reactivex\/rxphp":"~2.0"},"type":"library","autoload":{"files":["src\/functions_include.php"],"psr-4":{"Ratchet\\Client\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Asynchronous WebSocket client","keywords":["Ratchet","async","client","websocket","websocket client"],"support":{"issues":"https:\/\/github.com\/ratchetphp\/Pawl\/issues","source":"https:\/\/github.com\/ratchetphp\/Pawl\/tree\/v0.4.3"},"time":"2025-03-19T16:47:38+00:00"},{"name":"ratchet\/rfc6455","version":"v0.4.0","source":{"type":"git","url":"https:\/\/github.com\/ratchetphp\/RFC6455.git","reference":"859d95f85dda0912c6d5b936d036d044e3af47ef"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/ratchetphp\/RFC6455\/zipball\/859d95f85dda0912c6d5b936d036d044e3af47ef","reference":"859d95f85dda0912c6d5b936d036d044e3af47ef","shasum":""},"require":{"php":">=7.4","psr\/http-factory-implementation":"^1.0","symfony\/polyfill-php80":"^1.15"},"require-dev":{"guzzlehttp\/psr7":"^2.7","phpunit\/phpunit":"^9.5","react\/socket":"^1.3"},"type":"library","autoload":{"psr-4":{"Ratchet\\RFC6455\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Chris Boden","email":"cboden@gmail.com","role":"Developer"},{"name":"Matt Bonneau","role":"Developer"}],"description":"RFC6455 WebSocket protocol handler","homepage":"http:\/\/socketo.me","keywords":["WebSockets","rfc6455","websocket"],"support":{"chat":"https:\/\/gitter.im\/reactphp\/reactphp","issues":"https:\/\/github.com\/ratchetphp\/RFC6455\/issues","source":"https:\/\/github.com\/ratchetphp\/RFC6455\/tree\/v0.4.0"},"time":"2025-02-24T01:18:22+00:00"},{"name":"react\/cache","version":"v1.2.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/cache.git","reference":"d47c472b64aa5608225f47965a484b75c7817d5b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/cache\/zipball\/d47c472b64aa5608225f47965a484b75c7817d5b","reference":"d47c472b64aa5608225f47965a484b75c7817d5b","shasum":""},"require":{"php":">=5.3.0","react\/promise":"^3.0 || ^2.0 || ^1.1"},"require-dev":{"phpunit\/phpunit":"^9.5 || ^5.7 || ^4.8.35"},"type":"library","autoload":{"psr-4":{"React\\Cache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async, Promise-based cache interface for ReactPHP","keywords":["cache","caching","promise","reactphp"],"support":{"issues":"https:\/\/github.com\/reactphp\/cache\/issues","source":"https:\/\/github.com\/reactphp\/cache\/tree\/v1.2.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2022-11-30T15:59:55+00:00"},{"name":"react\/dns","version":"v1.13.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/dns.git","reference":"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/dns\/zipball\/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5","reference":"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5","shasum":""},"require":{"php":">=5.3.0","react\/cache":"^1.0 || ^0.6 || ^0.5","react\/event-loop":"^1.2","react\/promise":"^3.2 || ^2.7 || ^1.2.1"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36","react\/async":"^4.3 || ^3 || ^2","react\/promise-timer":"^1.11"},"type":"library","autoload":{"psr-4":{"React\\Dns\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async DNS resolver for ReactPHP","keywords":["async","dns","dns-resolver","reactphp"],"support":{"issues":"https:\/\/github.com\/reactphp\/dns\/issues","source":"https:\/\/github.com\/reactphp\/dns\/tree\/v1.13.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2024-06-13T14:18:03+00:00"},{"name":"react\/event-loop","version":"v1.6.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/event-loop.git","reference":"ba276bda6083df7e0050fd9b33f66ad7a4ac747a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/event-loop\/zipball\/ba276bda6083df7e0050fd9b33f66ad7a4ac747a","reference":"ba276bda6083df7e0050fd9b33f66ad7a4ac747a","shasum":""},"require":{"php":">=5.3.0"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"suggest":{"ext-pcntl":"For signal handling support when using the StreamSelectLoop"},"type":"library","autoload":{"psr-4":{"React\\EventLoop\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"ReactPHP's core reactor event loop that libraries can use for evented I\/O.","keywords":["asynchronous","event-loop"],"support":{"issues":"https:\/\/github.com\/reactphp\/event-loop\/issues","source":"https:\/\/github.com\/reactphp\/event-loop\/tree\/v1.6.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2025-11-17T20:46:25+00:00"},{"name":"react\/promise","version":"v3.3.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/promise.git","reference":"23444f53a813a3296c1368bb104793ce8d88f04a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/promise\/zipball\/23444f53a813a3296c1368bb104793ce8d88f04a","reference":"23444f53a813a3296c1368bb104793ce8d88f04a","shasum":""},"require":{"php":">=7.1.0"},"require-dev":{"phpstan\/phpstan":"1.12.28 || 1.4.10","phpunit\/phpunit":"^9.6 || ^7.5"},"type":"library","autoload":{"files":["src\/functions_include.php"],"psr-4":{"React\\Promise\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"A lightweight implementation of CommonJS Promises\/A for PHP","keywords":["promise","promises"],"support":{"issues":"https:\/\/github.com\/reactphp\/promise\/issues","source":"https:\/\/github.com\/reactphp\/promise\/tree\/v3.3.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2025-08-19T18:57:03+00:00"},{"name":"react\/socket","version":"v1.16.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/socket.git","reference":"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/socket\/zipball\/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1","reference":"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0 || ^1.0","php":">=5.3.0","react\/dns":"^1.13","react\/event-loop":"^1.2","react\/promise":"^3.2 || ^2.6 || ^1.2.1","react\/stream":"^1.4"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36","react\/async":"^4.3 || ^3.3 || ^2","react\/promise-stream":"^1.4","react\/promise-timer":"^1.11"},"type":"library","autoload":{"psr-4":{"React\\Socket\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Async, streaming plaintext TCP\/IP and secure TLS socket server and client connections for ReactPHP","keywords":["Connection","Socket","async","reactphp","stream"],"support":{"issues":"https:\/\/github.com\/reactphp\/socket\/issues","source":"https:\/\/github.com\/reactphp\/socket\/tree\/v1.16.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2024-07-26T10:38:09+00:00"},{"name":"react\/stream","version":"v1.4.0","source":{"type":"git","url":"https:\/\/github.com\/reactphp\/stream.git","reference":"1e5b0acb8fe55143b5b426817155190eb6f5b18d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/reactphp\/stream\/zipball\/1e5b0acb8fe55143b5b426817155190eb6f5b18d","reference":"1e5b0acb8fe55143b5b426817155190eb6f5b18d","shasum":""},"require":{"evenement\/evenement":"^3.0 || ^2.0 || ^1.0","php":">=5.3.8","react\/event-loop":"^1.2"},"require-dev":{"clue\/stream-filter":"~1.2","phpunit\/phpunit":"^9.6 || ^5.7 || ^4.8.36"},"type":"library","autoload":{"psr-4":{"React\\Stream\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christian L\u00fcck","email":"christian@clue.engineering","homepage":"https:\/\/clue.engineering\/"},{"name":"Cees-Jan Kiewiet","email":"reactphp@ceesjankiewiet.nl","homepage":"https:\/\/wyrihaximus.net\/"},{"name":"Jan Sorgalla","email":"jsorgalla@gmail.com","homepage":"https:\/\/sorgalla.com\/"},{"name":"Chris Boden","email":"cboden@gmail.com","homepage":"https:\/\/cboden.dev\/"}],"description":"Event-driven readable and writable streams for non-blocking I\/O in ReactPHP","keywords":["event-driven","io","non-blocking","pipe","reactphp","readable","stream","writable"],"support":{"issues":"https:\/\/github.com\/reactphp\/stream\/issues","source":"https:\/\/github.com\/reactphp\/stream\/tree\/v1.4.0"},"funding":[{"url":"https:\/\/opencollective.com\/reactphp","type":"open_collective"}],"time":"2024-06-11T12:45:25+00:00"},{"name":"symfony\/cache","version":"v6.4.27","source":{"type":"git","url":"https:\/\/github.com\/symfony\/cache.git","reference":"3b9cf252b3bb54d5daddea5704b95ea7117b39f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/cache\/zipball\/3b9cf252b3bb54d5daddea5704b95ea7117b39f4","reference":"3b9cf252b3bb54d5daddea5704b95ea7117b39f4","shasum":""},"require":{"php":">=8.1","psr\/cache":"^2.0|^3.0","psr\/log":"^1.1|^2|^3","symfony\/cache-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3","symfony\/var-exporter":"^6.3.6|^7.0"},"conflict":{"doctrine\/dbal":"<2.13.1","symfony\/dependency-injection":"<5.4","symfony\/http-kernel":"<5.4","symfony\/var-dumper":"<5.4"},"provide":{"psr\/cache-implementation":"2.0|3.0","psr\/simple-cache-implementation":"1.0|2.0|3.0","symfony\/cache-implementation":"1.1|2.0|3.0"},"require-dev":{"cache\/integration-tests":"dev-master","doctrine\/dbal":"^2.13.1|^3|^4","predis\/predis":"^1.1|^2.0","psr\/simple-cache":"^1.0|^2.0|^3.0","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/filesystem":"^5.4|^6.0|^7.0","symfony\/http-kernel":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/var-dumper":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Cache\\":""},"classmap":["Traits\/ValueWrapper.php"],"exclude-from-classmap":["\/Tests\/"]},"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":"Provides extended PSR-6, PSR-16 (and tags) implementations","homepage":"https:\/\/symfony.com","keywords":["caching","psr6"],"support":{"source":"https:\/\/github.com\/symfony\/cache\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-10-17T12:08:26+00:00"},{"name":"symfony\/cache-contracts","version":"v3.6.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/cache-contracts.git","reference":"5d68a57d66910405e5c0b63d6f0af941e66fc868"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/cache-contracts\/zipball\/5d68a57d66910405e5c0b63d6f0af941e66fc868","reference":"5d68a57d66910405e5c0b63d6f0af941e66fc868","shasum":""},"require":{"php":">=8.1","psr\/cache":"^3.0"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"autoload":{"psr-4":{"Symfony\\Contracts\\Cache\\":""}},"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":"Generic abstractions related to caching","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/cache-contracts\/tree\/v3.6.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":"2025-03-13T15:25:07+00:00"},{"name":"symfony\/config","version":"v6.4.26","source":{"type":"git","url":"https:\/\/github.com\/symfony\/config.git","reference":"f18dc5926cb203e125956987def795d052ee774e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/config\/zipball\/f18dc5926cb203e125956987def795d052ee774e","reference":"f18dc5926cb203e125956987def795d052ee774e","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/filesystem":"^5.4|^6.0|^7.0","symfony\/polyfill-ctype":"~1.8"},"conflict":{"symfony\/finder":"<5.4","symfony\/service-contracts":"<2.5"},"require-dev":{"symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/service-contracts":"^2.5|^3","symfony\/yaml":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Config\\":""},"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":"Helps you find, load, combine, autofill and validate configuration values of any kind","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/config\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T09:57:09+00:00"},{"name":"symfony\/console","version":"v6.4.27","source":{"type":"git","url":"https:\/\/github.com\/symfony\/console.git","reference":"13d3176cf8ad8ced24202844e9f95af11e2959fc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/13d3176cf8ad8ced24202844e9f95af11e2959fc","reference":"13d3176cf8ad8ced24202844e9f95af11e2959fc","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-mbstring":"~1.0","symfony\/service-contracts":"^2.5|^3","symfony\/string":"^5.4|^6.0|^7.0"},"conflict":{"symfony\/dependency-injection":"<5.4","symfony\/dotenv":"<5.4","symfony\/event-dispatcher":"<5.4","symfony\/lock":"<5.4","symfony\/process":"<5.4"},"provide":{"psr\/log-implementation":"1.0|2.0|3.0"},"require-dev":{"psr\/log":"^1|^2|^3","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/lock":"^5.4|^6.0|^7.0","symfony\/messenger":"^5.4|^6.0|^7.0","symfony\/process":"^5.4|^6.0|^7.0","symfony\/stopwatch":"^5.4|^6.0|^7.0","symfony\/var-dumper":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Console\\":""},"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":"Eases the creation of beautiful and testable command line interfaces","homepage":"https:\/\/symfony.com","keywords":["cli","command-line","console","terminal"],"support":{"source":"https:\/\/github.com\/symfony\/console\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-10-06T10:25:16+00:00"},{"name":"symfony\/dependency-injection","version":"v6.4.26","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dependency-injection.git","reference":"5f311eaf0b321f8ec640f6bae12da43a14026898"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dependency-injection\/zipball\/5f311eaf0b321f8ec640f6bae12da43a14026898","reference":"5f311eaf0b321f8ec640f6bae12da43a14026898","shasum":""},"require":{"php":">=8.1","psr\/container":"^1.1|^2.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3.0","symfony\/var-exporter":"^6.4.20|^7.2.5"},"conflict":{"ext-psr":"<1.1|>=2","symfony\/config":"<6.1","symfony\/finder":"<5.4","symfony\/proxy-manager-bridge":"<6.3","symfony\/yaml":"<5.4"},"provide":{"psr\/container-implementation":"1.1|2.0","symfony\/service-implementation":"1.1|2.0|3.0"},"require-dev":{"symfony\/config":"^6.1|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/yaml":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\DependencyInjection\\":""},"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":"Allows you to standardize and centralize the way objects are constructed in your application","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/dependency-injection\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T09:57:09+00:00"},{"name":"symfony\/deprecation-contracts","version":"v3.6.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/deprecation-contracts.git","reference":"63afe740e99a13ba87ec199bb07bbdee937a5b62"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/63afe740e99a13ba87ec199bb07bbdee937a5b62","reference":"63afe740e99a13ba87ec199bb07bbdee937a5b62","shasum":""},"require":{"php":">=8.1"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"autoload":{"files":["function.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":"A generic function and convention to trigger deprecation notices","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/deprecation-contracts\/tree\/v3.6.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":"2024-09-25T14:21:43+00:00"},{"name":"symfony\/dotenv","version":"v6.4.24","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dotenv.git","reference":"234b6c602f12b00693f4b0d1054386fb30dfc8ff"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dotenv\/zipball\/234b6c602f12b00693f4b0d1054386fb30dfc8ff","reference":"234b6c602f12b00693f4b0d1054386fb30dfc8ff","shasum":""},"require":{"php":">=8.1"},"conflict":{"symfony\/console":"<5.4","symfony\/process":"<5.4"},"require-dev":{"symfony\/console":"^5.4|^6.0|^7.0","symfony\/process":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Dotenv\\":""},"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":"Registers environment variables from a .env file","homepage":"https:\/\/symfony.com","keywords":["dotenv","env","environment"],"support":{"source":"https:\/\/github.com\/symfony\/dotenv\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-07-10T08:14:14+00:00"},{"name":"symfony\/error-handler","version":"v7.3.4","source":{"type":"git","url":"https:\/\/github.com\/symfony\/error-handler.git","reference":"99f81bc944ab8e5dae4f21b4ca9972698bbad0e4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/error-handler\/zipball\/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4","reference":"99f81bc944ab8e5dae4f21b4ca9972698bbad0e4","shasum":""},"require":{"php":">=8.2","psr\/log":"^1|^2|^3","symfony\/var-dumper":"^6.4|^7.0"},"conflict":{"symfony\/deprecation-contracts":"<2.5","symfony\/http-kernel":"<6.4"},"require-dev":{"symfony\/console":"^6.4|^7.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/http-kernel":"^6.4|^7.0","symfony\/serializer":"^6.4|^7.0","symfony\/webpack-encore-bundle":"^1.0|^2.0"},"bin":["Resources\/bin\/patch-type-declarations"],"type":"library","autoload":{"psr-4":{"Symfony\\Component\\ErrorHandler\\":""},"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":"Provides tools to manage errors and ease debugging PHP code","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/error-handler\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T10:12:26+00:00"},{"name":"symfony\/event-dispatcher","version":"v6.4.25","source":{"type":"git","url":"https:\/\/github.com\/symfony\/event-dispatcher.git","reference":"b0cf3162020603587363f0551cd3be43958611ff"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/event-dispatcher\/zipball\/b0cf3162020603587363f0551cd3be43958611ff","reference":"b0cf3162020603587363f0551cd3be43958611ff","shasum":""},"require":{"php":">=8.1","symfony\/event-dispatcher-contracts":"^2.5|^3"},"conflict":{"symfony\/dependency-injection":"<5.4","symfony\/service-contracts":"<2.5"},"provide":{"psr\/event-dispatcher-implementation":"1.0","symfony\/event-dispatcher-implementation":"2.0|3.0"},"require-dev":{"psr\/log":"^1|^2|^3","symfony\/config":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/error-handler":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^5.4|^6.0|^7.0","symfony\/service-contracts":"^2.5|^3","symfony\/stopwatch":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\EventDispatcher\\":""},"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":"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/event-dispatcher\/tree\/v6.4.25"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-08-13T09:41:44+00:00"},{"name":"symfony\/event-dispatcher-contracts","version":"v3.6.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/event-dispatcher-contracts.git","reference":"59eb412e93815df44f05f342958efa9f46b1e586"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/event-dispatcher-contracts\/zipball\/59eb412e93815df44f05f342958efa9f46b1e586","reference":"59eb412e93815df44f05f342958efa9f46b1e586","shasum":""},"require":{"php":">=8.1","psr\/event-dispatcher":"^1"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"autoload":{"psr-4":{"Symfony\\Contracts\\EventDispatcher\\":""}},"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":"Generic abstractions related to dispatching event","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/event-dispatcher-contracts\/tree\/v3.6.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":"2024-09-25T14:21:43+00:00"},{"name":"symfony\/expression-language","version":"v6.4.24","source":{"type":"git","url":"https:\/\/github.com\/symfony\/expression-language.git","reference":"1ea0adaa53539ea7e70821ae9de49ebe03ae7091"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/expression-language\/zipball\/1ea0adaa53539ea7e70821ae9de49ebe03ae7091","reference":"1ea0adaa53539ea7e70821ae9de49ebe03ae7091","shasum":""},"require":{"php":">=8.1","symfony\/cache":"^5.4|^6.0|^7.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/service-contracts":"^2.5|^3"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\ExpressionLanguage\\":""},"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":"Provides an engine that can compile and evaluate expressions","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/expression-language\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-07-10T08:14:14+00:00"},{"name":"symfony\/filesystem","version":"v6.4.24","source":{"type":"git","url":"https:\/\/github.com\/symfony\/filesystem.git","reference":"75ae2edb7cdcc0c53766c30b0a2512b8df574bd8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8","reference":"75ae2edb7cdcc0c53766c30b0a2512b8df574bd8","shasum":""},"require":{"php":">=8.1","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.8"},"require-dev":{"symfony\/process":"^5.4|^6.4|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Filesystem\\":""},"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":"Provides basic utilities for the filesystem","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/filesystem\/tree\/v6.4.24"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-07-10T08:14:14+00:00"},{"name":"symfony\/finder","version":"v6.4.27","source":{"type":"git","url":"https:\/\/github.com\/symfony\/finder.git","reference":"a1b6aa435d2fba50793b994a839c32b6064f063b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/a1b6aa435d2fba50793b994a839c32b6064f063b","reference":"a1b6aa435d2fba50793b994a839c32b6064f063b","shasum":""},"require":{"php":">=8.1"},"require-dev":{"symfony\/filesystem":"^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Finder\\":""},"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":"Finds files and directories via an intuitive fluent interface","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/finder\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-10-15T18:32:00+00:00"},{"name":"symfony\/flex","version":"v2.10.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/flex.git","reference":"9cd384775973eabbf6e8b05784dda279fc67c28d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/flex\/zipball\/9cd384775973eabbf6e8b05784dda279fc67c28d","reference":"9cd384775973eabbf6e8b05784dda279fc67c28d","shasum":""},"require":{"composer-plugin-api":"^2.1","php":">=8.1"},"conflict":{"composer\/semver":"<1.7.2","symfony\/dotenv":"<5.4"},"require-dev":{"composer\/composer":"^2.1","symfony\/dotenv":"^6.4|^7.4|^8.0","symfony\/filesystem":"^6.4|^7.4|^8.0","symfony\/phpunit-bridge":"^6.4|^7.4|^8.0","symfony\/process":"^6.4|^7.4|^8.0"},"type":"composer-plugin","extra":{"class":"Symfony\\Flex\\Flex"},"autoload":{"psr-4":{"Symfony\\Flex\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien.potencier@gmail.com"}],"description":"Composer plugin for Symfony","support":{"issues":"https:\/\/github.com\/symfony\/flex\/issues","source":"https:\/\/github.com\/symfony\/flex\/tree\/v2.10.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-11-16T09:38:19+00:00"},{"name":"symfony\/http-foundation","version":"v7.3.7","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-foundation.git","reference":"db488a62f98f7a81d5746f05eea63a74e55bb7c4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-foundation\/zipball\/db488a62f98f7a81d5746f05eea63a74e55bb7c4","reference":"db488a62f98f7a81d5746f05eea63a74e55bb7c4","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3.0","symfony\/polyfill-mbstring":"~1.1","symfony\/polyfill-php83":"^1.27"},"conflict":{"doctrine\/dbal":"<3.6","symfony\/cache":"<6.4.12|>=7.0,<7.1.5"},"require-dev":{"doctrine\/dbal":"^3.6|^4","predis\/predis":"^1.1|^2.0","symfony\/cache":"^6.4.12|^7.1.5","symfony\/clock":"^6.4|^7.0","symfony\/dependency-injection":"^6.4|^7.0","symfony\/expression-language":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/mime":"^6.4|^7.0","symfony\/rate-limiter":"^6.4|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\HttpFoundation\\":""},"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":"Defines an object-oriented layer for the HTTP specification","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-foundation\/tree\/v7.3.7"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-11-08T16:41:12+00:00"},{"name":"symfony\/http-kernel","version":"v6.4.27","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-kernel.git","reference":"4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-kernel\/zipball\/4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb","reference":"4a4d0f6cafdbc09c9a7940db17c0fc23bb88a2bb","shasum":""},"require":{"php":">=8.1","psr\/log":"^1|^2|^3","symfony\/deprecation-contracts":"^2.5|^3","symfony\/error-handler":"^6.4|^7.0","symfony\/event-dispatcher":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^6.4|^7.0","symfony\/polyfill-ctype":"^1.8"},"conflict":{"symfony\/browser-kit":"<5.4","symfony\/cache":"<5.4","symfony\/config":"<6.1","symfony\/console":"<5.4","symfony\/dependency-injection":"<6.4","symfony\/doctrine-bridge":"<5.4","symfony\/form":"<5.4","symfony\/http-client":"<5.4","symfony\/http-client-contracts":"<2.5","symfony\/mailer":"<5.4","symfony\/messenger":"<5.4","symfony\/translation":"<5.4","symfony\/translation-contracts":"<2.5","symfony\/twig-bridge":"<5.4","symfony\/validator":"<6.4","symfony\/var-dumper":"<6.3","twig\/twig":"<2.13"},"provide":{"psr\/log-implementation":"1.0|2.0|3.0"},"require-dev":{"psr\/cache":"^1.0|^2.0|^3.0","symfony\/browser-kit":"^5.4|^6.0|^7.0","symfony\/clock":"^6.2|^7.0","symfony\/config":"^6.1|^7.0","symfony\/console":"^5.4|^6.0|^7.0","symfony\/css-selector":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^6.4|^7.0","symfony\/dom-crawler":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/http-client-contracts":"^2.5|^3","symfony\/process":"^5.4|^6.0|^7.0","symfony\/property-access":"^5.4.5|^6.0.5|^7.0","symfony\/routing":"^5.4|^6.0|^7.0","symfony\/serializer":"^6.4.4|^7.0.4","symfony\/stopwatch":"^5.4|^6.0|^7.0","symfony\/translation":"^5.4|^6.0|^7.0","symfony\/translation-contracts":"^2.5|^3","symfony\/uid":"^5.4|^6.0|^7.0","symfony\/validator":"^6.4|^7.0","symfony\/var-dumper":"^5.4|^6.4|^7.0","symfony\/var-exporter":"^6.2|^7.0","twig\/twig":"^2.13|^3.0.4"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\HttpKernel\\":""},"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":"Provides a structured process for converting a Request into a Response","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-kernel\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-10-28T10:06:47+00:00"},{"name":"symfony\/options-resolver","version":"v7.3.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/options-resolver.git","reference":"0ff2f5c3df08a395232bbc3c2eb7e84912df911d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/options-resolver\/zipball\/0ff2f5c3df08a395232bbc3c2eb7e84912df911d","reference":"0ff2f5c3df08a395232bbc3c2eb7e84912df911d","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\OptionsResolver\\":""},"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":"Provides an improved replacement for the array_replace PHP function","homepage":"https:\/\/symfony.com","keywords":["config","configuration","options"],"support":{"source":"https:\/\/github.com\/symfony\/options-resolver\/tree\/v7.3.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-08-05T10:16:07+00:00"},{"name":"symfony\/polyfill-ctype","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-ctype.git","reference":"a3cc8b044a6ea513310cbd48ef7333b384945638"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-ctype\/zipball\/a3cc8b044a6ea513310cbd48ef7333b384945638","reference":"a3cc8b044a6ea513310cbd48ef7333b384945638","shasum":""},"require":{"php":">=7.2"},"provide":{"ext-ctype":"*"},"suggest":{"ext-ctype":"For best performance"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Ctype\\":""}},"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.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2024-09-09T11:45:10+00:00"},{"name":"symfony\/polyfill-intl-grapheme","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme.git","reference":"380872130d3a5dd3ace2f4010d95125fde5d5c70"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-grapheme\/zipball\/380872130d3a5dd3ace2f4010d95125fde5d5c70","reference":"380872130d3a5dd3ace2f4010d95125fde5d5c70","shasum":""},"require":{"php":">=7.2"},"suggest":{"ext-intl":"For best performance"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Grapheme\\":""}},"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 grapheme_* functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","grapheme","intl","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-06-27T09:58:17+00:00"},{"name":"symfony\/polyfill-intl-normalizer","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-normalizer.git","reference":"3833d7255cc303546435cb650316bff708a1c75c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/3833d7255cc303546435cb650316bff708a1c75c","reference":"3833d7255cc303546435cb650316bff708a1c75c","shasum":""},"require":{"php":">=7.2"},"suggest":{"ext-intl":"For best performance"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Normalizer\\":""},"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.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2024-09-09T11:45:10+00:00"},{"name":"symfony\/polyfill-mbstring","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-mbstring.git","reference":"6d857f4d76bd4b343eac26d6b539585d2bc56493"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/6d857f4d76bd4b343eac26d6b539585d2bc56493","reference":"6d857f4d76bd4b343eac26d6b539585d2bc56493","shasum":""},"require":{"ext-iconv":"*","php":">=7.2"},"provide":{"ext-mbstring":"*"},"suggest":{"ext-mbstring":"For best performance"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Mbstring\\":""}},"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 the Mbstring extension","homepage":"https:\/\/symfony.com","keywords":["compatibility","mbstring","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2024-12-23T08:48:59+00:00"},{"name":"symfony\/polyfill-php80","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php80.git","reference":"0cc9dd0f17f61d8131e7df6b84bd344899fe2608"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php80\/zipball\/0cc9dd0f17f61d8131e7df6b84bd344899fe2608","reference":"0cc9dd0f17f61d8131e7df6b84bd344899fe2608","shasum":""},"require":{"php":">=7.2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php80\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ion Bazan","email":"ion.bazan@gmail.com"},{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php80\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-01-02T08:10:11+00:00"},{"name":"symfony\/polyfill-php83","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php83.git","reference":"17f6f9a6b1735c0f163024d959f700cfbc5155e5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php83\/zipball\/17f6f9a6b1735c0f163024d959f700cfbc5155e5","reference":"17f6f9a6b1735c0f163024d959f700cfbc5155e5","shasum":""},"require":{"php":">=7.2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php83\\":""},"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 backporting some PHP 8.3+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php83\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-07-08T02:45:35+00:00"},{"name":"symfony\/process","version":"v6.4.26","source":{"type":"git","url":"https:\/\/github.com\/symfony\/process.git","reference":"48bad913268c8cafabbf7034b39c8bb24fbc5ab8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/48bad913268c8cafabbf7034b39c8bb24fbc5ab8","reference":"48bad913268c8cafabbf7034b39c8bb24fbc5ab8","shasum":""},"require":{"php":">=8.1"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Process\\":""},"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":"Executes commands in sub-processes","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/process\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T09:57:09+00:00"},{"name":"symfony\/service-contracts","version":"v3.6.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/service-contracts.git","reference":"f021b05a130d35510bd6b25fe9053c2a8a15d5d4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/f021b05a130d35510bd6b25fe9053c2a8a15d5d4","reference":"f021b05a130d35510bd6b25fe9053c2a8a15d5d4","shasum":""},"require":{"php":">=8.1","psr\/container":"^1.1|^2.0","symfony\/deprecation-contracts":"^2.5|^3"},"conflict":{"ext-psr":"<1.1|>=2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"autoload":{"psr-4":{"Symfony\\Contracts\\Service\\":""},"exclude-from-classmap":["\/Test\/"]},"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":"Generic abstractions related to writing services","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.6.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":"2025-04-25T09:37:31+00:00"},{"name":"symfony\/string","version":"v7.3.4","source":{"type":"git","url":"https:\/\/github.com\/symfony\/string.git","reference":"f96476035142921000338bad71e5247fbc138872"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/string\/zipball\/f96476035142921000338bad71e5247fbc138872","reference":"f96476035142921000338bad71e5247fbc138872","shasum":""},"require":{"php":">=8.2","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-intl-grapheme":"~1.0","symfony\/polyfill-intl-normalizer":"~1.0","symfony\/polyfill-mbstring":"~1.0"},"conflict":{"symfony\/translation-contracts":"<2.5"},"require-dev":{"symfony\/emoji":"^7.1","symfony\/http-client":"^6.4|^7.0","symfony\/intl":"^6.4|^7.0","symfony\/translation-contracts":"^2.5|^3.0","symfony\/var-exporter":"^6.4|^7.0"},"type":"library","autoload":{"files":["Resources\/functions.php"],"psr-4":{"Symfony\\Component\\String\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way","homepage":"https:\/\/symfony.com","keywords":["grapheme","i18n","string","unicode","utf-8","utf8"],"support":{"source":"https:\/\/github.com\/symfony\/string\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T14:36:48+00:00"},{"name":"symfony\/translation-contracts","version":"v3.6.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/translation-contracts.git","reference":"df210c7a2573f1913b2d17cc95f90f53a73d8f7d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/translation-contracts\/zipball\/df210c7a2573f1913b2d17cc95f90f53a73d8f7d","reference":"df210c7a2573f1913b2d17cc95f90f53a73d8f7d","shasum":""},"require":{"php":">=8.1"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/contracts","name":"symfony\/contracts"},"branch-alias":{"dev-main":"3.6-dev"}},"autoload":{"psr-4":{"Symfony\\Contracts\\Translation\\":""},"exclude-from-classmap":["\/Test\/"]},"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":"Generic abstractions related to translation","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/translation-contracts\/tree\/v3.6.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":"2024-09-27T08:32:26+00:00"},{"name":"symfony\/validator","version":"v6.4.27","source":{"type":"git","url":"https:\/\/github.com\/symfony\/validator.git","reference":"60dd71e219cd3d76fde906eb6b6c1271db628f5b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/validator\/zipball\/60dd71e219cd3d76fde906eb6b6c1271db628f5b","reference":"60dd71e219cd3d76fde906eb6b6c1271db628f5b","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php83":"^1.27","symfony\/translation-contracts":"^2.5|^3"},"conflict":{"doctrine\/annotations":"<1.13","doctrine\/lexer":"<1.1","symfony\/dependency-injection":"<5.4","symfony\/expression-language":"<5.4","symfony\/http-kernel":"<5.4","symfony\/intl":"<5.4","symfony\/property-info":"<5.4","symfony\/translation":"<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3","symfony\/yaml":"<5.4"},"require-dev":{"doctrine\/annotations":"^1.13|^2","egulias\/email-validator":"^2.1.10|^3|^4","symfony\/cache":"^5.4|^6.0|^7.0","symfony\/config":"^5.4|^6.0|^7.0","symfony\/console":"^5.4|^6.0|^7.0","symfony\/dependency-injection":"^5.4|^6.0|^7.0","symfony\/expression-language":"^5.4|^6.0|^7.0","symfony\/finder":"^5.4|^6.0|^7.0","symfony\/http-client":"^5.4|^6.0|^7.0","symfony\/http-foundation":"^5.4|^6.0|^7.0","symfony\/http-kernel":"^5.4|^6.0|^7.0","symfony\/intl":"^5.4|^6.0|^7.0","symfony\/mime":"^5.4|^6.0|^7.0","symfony\/property-access":"^5.4|^6.0|^7.0","symfony\/property-info":"^5.4|^6.0|^7.0","symfony\/translation":"^5.4.35|~6.3.12|^6.4.3|^7.0.3","symfony\/yaml":"^5.4|^6.0|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Validator\\":""},"exclude-from-classmap":["\/Tests\/","\/Resources\/bin\/"]},"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":"Provides tools to validate values","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/validator\/tree\/v6.4.27"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-10-23T19:49:35+00:00"},{"name":"symfony\/var-dumper","version":"v7.3.5","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-dumper.git","reference":"476c4ae17f43a9a36650c69879dcf5b1e6ae724d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-dumper\/zipball\/476c4ae17f43a9a36650c69879dcf5b1e6ae724d","reference":"476c4ae17f43a9a36650c69879dcf5b1e6ae724d","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-mbstring":"~1.0"},"conflict":{"symfony\/console":"<6.4"},"require-dev":{"symfony\/console":"^6.4|^7.0","symfony\/http-kernel":"^6.4|^7.0","symfony\/process":"^6.4|^7.0","symfony\/uid":"^6.4|^7.0","twig\/twig":"^3.12"},"bin":["Resources\/bin\/var-dump-server"],"type":"library","autoload":{"files":["Resources\/functions\/dump.php"],"psr-4":{"Symfony\\Component\\VarDumper\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Provides mechanisms for walking through any arbitrary PHP variable","homepage":"https:\/\/symfony.com","keywords":["debug","dump"],"support":{"source":"https:\/\/github.com\/symfony\/var-dumper\/tree\/v7.3.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-27T09:00:46+00:00"},{"name":"symfony\/var-exporter","version":"v7.3.4","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-exporter.git","reference":"0f020b544a30a7fe8ba972e53ee48a74c0bc87f4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-exporter\/zipball\/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4","reference":"0f020b544a30a7fe8ba972e53ee48a74c0bc87f4","shasum":""},"require":{"php":">=8.2","symfony\/deprecation-contracts":"^2.5|^3"},"require-dev":{"symfony\/property-access":"^6.4|^7.0","symfony\/serializer":"^6.4|^7.0","symfony\/var-dumper":"^6.4|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\VarExporter\\":""},"exclude-from-classmap":["\/Tests\/"]},"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":"Allows exporting any serializable PHP data structure to plain PHP code","homepage":"https:\/\/symfony.com","keywords":["clone","construct","export","hydrate","instantiate","lazy-loading","proxy","serialize"],"support":{"source":"https:\/\/github.com\/symfony\/var-exporter\/tree\/v7.3.4"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-11T10:12:26+00:00"},{"name":"symfony\/yaml","version":"v6.4.26","source":{"type":"git","url":"https:\/\/github.com\/symfony\/yaml.git","reference":"0fc8b966fd0dcaab544ae59bfc3a433f048c17b0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/0fc8b966fd0dcaab544ae59bfc3a433f048c17b0","reference":"0fc8b966fd0dcaab544ae59bfc3a433f048c17b0","shasum":""},"require":{"php":">=8.1","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-ctype":"^1.8"},"conflict":{"symfony\/console":"<5.4"},"require-dev":{"symfony\/console":"^5.4|^6.0|^7.0"},"bin":["Resources\/bin\/yaml-lint"],"type":"library","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":"Loads and dumps YAML files","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/yaml\/tree\/v6.4.26"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-09-26T15:07:38+00:00"},{"name":"thecodingmachine\/safe","version":"v3.0.2","source":{"type":"git","url":"https:\/\/github.com\/thecodingmachine\/safe.git","reference":"22ffad3248982a784f9870a37aeb2e522bd19645"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thecodingmachine\/safe\/zipball\/22ffad3248982a784f9870a37aeb2e522bd19645","reference":"22ffad3248982a784f9870a37aeb2e522bd19645","shasum":""},"require":{"php":"^8.1"},"require-dev":{"php-parallel-lint\/php-parallel-lint":"^1.4","phpstan\/phpstan":"^2","phpunit\/phpunit":"^10","squizlabs\/php_codesniffer":"^3.2"},"type":"library","autoload":{"files":["lib\/special_cases.php","generated\/apache.php","generated\/apcu.php","generated\/array.php","generated\/bzip2.php","generated\/calendar.php","generated\/classobj.php","generated\/com.php","generated\/cubrid.php","generated\/curl.php","generated\/datetime.php","generated\/dir.php","generated\/eio.php","generated\/errorfunc.php","generated\/exec.php","generated\/fileinfo.php","generated\/filesystem.php","generated\/filter.php","generated\/fpm.php","generated\/ftp.php","generated\/funchand.php","generated\/gettext.php","generated\/gmp.php","generated\/gnupg.php","generated\/hash.php","generated\/ibase.php","generated\/ibmDb2.php","generated\/iconv.php","generated\/image.php","generated\/imap.php","generated\/info.php","generated\/inotify.php","generated\/json.php","generated\/ldap.php","generated\/libxml.php","generated\/lzf.php","generated\/mailparse.php","generated\/mbstring.php","generated\/misc.php","generated\/mysql.php","generated\/mysqli.php","generated\/network.php","generated\/oci8.php","generated\/opcache.php","generated\/openssl.php","generated\/outcontrol.php","generated\/pcntl.php","generated\/pcre.php","generated\/pgsql.php","generated\/posix.php","generated\/ps.php","generated\/pspell.php","generated\/readline.php","generated\/rnp.php","generated\/rpminfo.php","generated\/rrd.php","generated\/sem.php","generated\/session.php","generated\/shmop.php","generated\/sockets.php","generated\/sodium.php","generated\/solr.php","generated\/spl.php","generated\/sqlsrv.php","generated\/ssdeep.php","generated\/ssh2.php","generated\/stream.php","generated\/strings.php","generated\/swoole.php","generated\/uodbc.php","generated\/uopz.php","generated\/url.php","generated\/var.php","generated\/xdiff.php","generated\/xml.php","generated\/xmlrpc.php","generated\/yaml.php","generated\/yaz.php","generated\/zip.php","generated\/zlib.php"],"classmap":["lib\/DateTime.php","lib\/DateTimeImmutable.php","lib\/Exceptions\/","generated\/Exceptions\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"PHP core functions that throw exceptions instead of returning FALSE on error","support":{"issues":"https:\/\/github.com\/thecodingmachine\/safe\/issues","source":"https:\/\/github.com\/thecodingmachine\/safe\/tree\/v3.0.2"},"funding":[{"url":"https:\/\/github.com\/OskarStark","type":"github"},{"url":"https:\/\/github.com\/shish","type":"github"},{"url":"https:\/\/github.com\/staabm","type":"github"}],"time":"2025-02-19T19:23:00+00:00"},{"name":"typhonius\/acquia-logstream","version":"0.0.15","source":{"type":"git","url":"https:\/\/github.com\/typhonius\/acquia-logstream.git","reference":"79565fbe10cf57f534145572a8614115111552ae"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/typhonius\/acquia-logstream\/zipball\/79565fbe10cf57f534145572a8614115111552ae","reference":"79565fbe10cf57f534145572a8614115111552ae","shasum":""},"require":{"consolidation\/self-update":"^1.2 | ^2.0 | ^3.0","php":"^7.4 | ^8.0.3 | ^8.1","ratchet\/pawl":"~0.4.3","symfony\/console":"^5 | ^6","typhonius\/acquia-php-sdk-v2":"^2 | ^3"},"require-dev":{"php-coveralls\/php-coveralls":"^2.0.0","phpstan\/phpstan":"^2.0.1","phpunit\/phpunit":"^9.4","squizlabs\/php_codesniffer":"^3.1"},"type":"library","autoload":{"psr-4":{"AcquiaLogstream\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Adam Malone","email":"adam@adammalone.net"}],"description":"PHP library to connect to Acquia Logstream service","support":{"issues":"https:\/\/github.com\/typhonius\/acquia-logstream\/issues","source":"https:\/\/github.com\/typhonius\/acquia-logstream\/tree\/0.0.15"},"funding":[{"url":"https:\/\/github.com\/typhonius","type":"github"}],"time":"2025-03-25T16:10:58+00:00"},{"name":"typhonius\/acquia-php-sdk-v2","version":"3.7.3","source":{"type":"git","url":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2.git","reference":"eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/typhonius\/acquia-php-sdk-v2\/zipball\/eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8","reference":"eca4b1d1b250ff7a29f9a2fab9a6fc3d558c22b8","shasum":""},"require":{"guzzlehttp\/guzzle":"^7.2","league\/oauth2-client":"^2.4","php":"^8.0 | ^8.1 | ^8.2","symfony\/cache":"^5 | ^6 | ^7","symfony\/filesystem":"^5.4 | ^6 | ^7"},"require-dev":{"ext-json":"*","overtrue\/phplint":"^9","php-coveralls\/php-coveralls":"^2.0.0","phpstan\/phpstan":"^1.0","phpstan\/phpstan-phpunit":"^1.0","phpunit\/phpunit":"^9","slevomat\/coding-standard":"^8.4","squizlabs\/php_codesniffer":"^3.9.1"},"type":"library","autoload":{"psr-4":{"AcquiaCloudApi\\Response\\":"src\/Response","AcquiaCloudApi\\Connector\\":"src\/Connector","AcquiaCloudApi\\Endpoints\\":"src\/Endpoints","AcquiaCloudApi\\Exception\\":"src\/Exception"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Adam Malone","email":"adam@adammalone.net"}],"description":"A PHP SDK for Acquia CloudAPI v2","support":{"issues":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2\/issues","source":"https:\/\/github.com\/typhonius\/acquia-php-sdk-v2\/tree\/3.7.3"},"funding":[{"url":"https:\/\/github.com\/typhonius","type":"github"}],"time":"2025-09-08T15:28:31+00:00"},{"name":"vlucas\/phpdotenv","version":"v5.6.2","source":{"type":"git","url":"https:\/\/github.com\/vlucas\/phpdotenv.git","reference":"24ac4c74f91ee2c193fa1aaa5c249cb0822809af"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/vlucas\/phpdotenv\/zipball\/24ac4c74f91ee2c193fa1aaa5c249cb0822809af","reference":"24ac4c74f91ee2c193fa1aaa5c249cb0822809af","shasum":""},"require":{"ext-pcre":"*","graham-campbell\/result-type":"^1.1.3","php":"^7.2.5 || ^8.0","phpoption\/phpoption":"^1.9.3","symfony\/polyfill-ctype":"^1.24","symfony\/polyfill-mbstring":"^1.24","symfony\/polyfill-php80":"^1.24"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.8.2","ext-filter":"*","phpunit\/phpunit":"^8.5.34 || ^9.6.13 || ^10.4.2"},"suggest":{"ext-filter":"Required to use the boolean validator."},"type":"library","extra":{"bamarni-bin":{"bin-links":true,"forward-command":false},"branch-alias":{"dev-master":"5.6-dev"}},"autoload":{"psr-4":{"Dotenv\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Vance Lucas","email":"vance@vancelucas.com","homepage":"https:\/\/github.com\/vlucas"}],"description":"Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.","keywords":["dotenv","env","environment"],"support":{"issues":"https:\/\/github.com\/vlucas\/phpdotenv\/issues","source":"https:\/\/github.com\/vlucas\/phpdotenv\/tree\/v5.6.2"},"funding":[{"url":"https:\/\/github.com\/GrahamCampbell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/vlucas\/phpdotenv","type":"tidelift"}],"time":"2025-04-30T23:37:27+00:00"},{"name":"zumba\/amplitude-php","version":"1.0.8","source":{"type":"git","url":"https:\/\/github.com\/zumba\/amplitude-php.git","reference":"5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/zumba\/amplitude-php\/zipball\/5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd","reference":"5288ede9c4bcee3dd4c6e6bb928fc32d489ffddd","shasum":""},"require":{"ext-curl":"*","ext-json":"*","php":">=7.2","psr\/log":"^1.0 | ^2.0 | ^3.0"},"require-dev":{"php-coveralls\/php-coveralls":"^2.4","phpunit\/phpunit":"8.3.* | ^9","squizlabs\/php_codesniffer":"3.4.*"},"type":"library","autoload":{"psr-4":{"Zumba\\Amplitude\\":".\/src\/","Zumba\\Amplitude\\Test\\":".\/test\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Zumba Fitness, LLC","homepage":"https:\/\/tech.zumba.com"},{"name":"Jonathan Foote","email":"jonathan.foote@zumba.com","role":"Developer"}],"description":"PHP SDK for Amplitude","homepage":"https:\/\/github.com\/zumba\/amplitude-php","keywords":["amplitude","analytics","sdk","tracking"],"support":{"issues":"https:\/\/github.com\/zumba\/amplitude-php\/issues","source":"https:\/\/github.com\/zumba\/amplitude-php\/tree\/1.0.8"},"time":"2024-07-11T14:35:33+00:00"}],"packages-dev":[{"name":"acquia\/coding-standards","version":"v3.0.3","source":{"type":"git","url":"https:\/\/github.com\/acquia\/coding-standards-php.git","reference":"3ef01eb98a2f2a3990d9e23affee675d8296282b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/acquia\/coding-standards-php\/zipball\/3ef01eb98a2f2a3990d9e23affee675d8296282b","reference":"3ef01eb98a2f2a3990d9e23affee675d8296282b","shasum":""},"require":{"drupal\/coder":"^8.3","phpcompatibility\/php-compatibility":"^10.0.0-alpha1","slevomat\/coding-standard":"^8.4","squizlabs\/php_codesniffer":"^3.7"},"suggest":{"brainmaestro\/composer-git-hooks":"Easily manage Git hooks in your composer config.","dealerdirect\/phpcodesniffer-composer-installer":"Automatically install PHP_CodeSniffer coding standards (rulesets)."},"type":"phpcodesniffer-standard","extra":{"branch-alias":{"dev-develop":"3.x-dev"}},"autoload":{"psr-4":{"Acquia\\CodingStandards\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["GPL-2.0-or-later"],"authors":[{"name":"Acquia Engineering","homepage":"https:\/\/www.acquia.com","role":"Maintainer"}],"description":"PHP_CodeSniffer rules (sniffs) for Acquia coding standards","keywords":["drupal","phpcs","standards","static analysis"],"support":{"issues":"https:\/\/github.com\/acquia\/coding-standards\/issues","source":"https:\/\/github.com\/acquia\/coding-standards"},"time":"2025-10-30T19:13:23+00:00"},{"name":"amphp\/amp","version":"v3.1.1","source":{"type":"git","url":"https:\/\/github.com\/amphp\/amp.git","reference":"fa0ab33a6f47a82929c38d03ca47ebb71086a93f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/amp\/zipball\/fa0ab33a6f47a82929c38d03ca47ebb71086a93f","reference":"fa0ab33a6f47a82929c38d03ca47ebb71086a93f","shasum":""},"require":{"php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","phpunit\/phpunit":"^9","psalm\/phar":"5.23.1"},"type":"library","autoload":{"files":["src\/functions.php","src\/Future\/functions.php","src\/Internal\/functions.php"],"psr-4":{"Amp\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Bob Weinand","email":"bobwei9@hotmail.com"},{"name":"Niklas Keller","email":"me@kelunik.com"},{"name":"Daniel Lowrey","email":"rdlowrey@php.net"}],"description":"A non-blocking concurrency framework for PHP applications.","homepage":"https:\/\/amphp.org\/amp","keywords":["async","asynchronous","awaitable","concurrency","event","event-loop","future","non-blocking","promise"],"support":{"issues":"https:\/\/github.com\/amphp\/amp\/issues","source":"https:\/\/github.com\/amphp\/amp\/tree\/v3.1.1"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2025-08-27T21:42:00+00:00"},{"name":"amphp\/byte-stream","version":"v2.1.2","source":{"type":"git","url":"https:\/\/github.com\/amphp\/byte-stream.git","reference":"55a6bd071aec26fa2a3e002618c20c35e3df1b46"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/byte-stream\/zipball\/55a6bd071aec26fa2a3e002618c20c35e3df1b46","reference":"55a6bd071aec26fa2a3e002618c20c35e3df1b46","shasum":""},"require":{"amphp\/amp":"^3","amphp\/parser":"^1.1","amphp\/pipeline":"^1","amphp\/serialization":"^1","amphp\/sync":"^2","php":">=8.1","revolt\/event-loop":"^1 || ^0.2.3"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"5.22.1"},"type":"library","autoload":{"files":["src\/functions.php","src\/Internal\/functions.php"],"psr-4":{"Amp\\ByteStream\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"A stream abstraction to make working with non-blocking I\/O simple.","homepage":"https:\/\/amphp.org\/byte-stream","keywords":["amp","amphp","async","io","non-blocking","stream"],"support":{"issues":"https:\/\/github.com\/amphp\/byte-stream\/issues","source":"https:\/\/github.com\/amphp\/byte-stream\/tree\/v2.1.2"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2025-03-16T17:10:27+00:00"},{"name":"amphp\/cache","version":"v2.0.1","source":{"type":"git","url":"https:\/\/github.com\/amphp\/cache.git","reference":"46912e387e6aa94933b61ea1ead9cf7540b7797c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/cache\/zipball\/46912e387e6aa94933b61ea1ead9cf7540b7797c","reference":"46912e387e6aa94933b61ea1ead9cf7540b7797c","shasum":""},"require":{"amphp\/amp":"^3","amphp\/serialization":"^1","amphp\/sync":"^2","php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"^5.4"},"type":"library","autoload":{"psr-4":{"Amp\\Cache\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Niklas Keller","email":"me@kelunik.com"},{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Daniel Lowrey","email":"rdlowrey@php.net"}],"description":"A fiber-aware cache API based on Amp and Revolt.","homepage":"https:\/\/amphp.org\/cache","support":{"issues":"https:\/\/github.com\/amphp\/cache\/issues","source":"https:\/\/github.com\/amphp\/cache\/tree\/v2.0.1"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2024-04-19T03:38:06+00:00"},{"name":"amphp\/dns","version":"v2.4.0","source":{"type":"git","url":"https:\/\/github.com\/amphp\/dns.git","reference":"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/dns\/zipball\/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71","reference":"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71","shasum":""},"require":{"amphp\/amp":"^3","amphp\/byte-stream":"^2","amphp\/cache":"^2","amphp\/parser":"^1","amphp\/process":"^2","daverandom\/libdns":"^2.0.2","ext-filter":"*","ext-json":"*","php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"5.20"},"type":"library","autoload":{"files":["src\/functions.php"],"psr-4":{"Amp\\Dns\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Chris Wright","email":"addr@daverandom.com"},{"name":"Daniel Lowrey","email":"rdlowrey@php.net"},{"name":"Bob Weinand","email":"bobwei9@hotmail.com"},{"name":"Niklas Keller","email":"me@kelunik.com"},{"name":"Aaron Piotrowski","email":"aaron@trowski.com"}],"description":"Async DNS resolution for Amp.","homepage":"https:\/\/github.com\/amphp\/dns","keywords":["amp","amphp","async","client","dns","resolve"],"support":{"issues":"https:\/\/github.com\/amphp\/dns\/issues","source":"https:\/\/github.com\/amphp\/dns\/tree\/v2.4.0"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2025-01-19T15:43:40+00:00"},{"name":"amphp\/parallel","version":"v2.3.2","source":{"type":"git","url":"https:\/\/github.com\/amphp\/parallel.git","reference":"321b45ae771d9c33a068186b24117e3cd1c48dce"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/parallel\/zipball\/321b45ae771d9c33a068186b24117e3cd1c48dce","reference":"321b45ae771d9c33a068186b24117e3cd1c48dce","shasum":""},"require":{"amphp\/amp":"^3","amphp\/byte-stream":"^2","amphp\/cache":"^2","amphp\/parser":"^1","amphp\/pipeline":"^1","amphp\/process":"^2","amphp\/serialization":"^1","amphp\/socket":"^2","amphp\/sync":"^2","php":">=8.1","revolt\/event-loop":"^1"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"^5.18"},"type":"library","autoload":{"files":["src\/Context\/functions.php","src\/Context\/Internal\/functions.php","src\/Ipc\/functions.php","src\/Worker\/functions.php"],"psr-4":{"Amp\\Parallel\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"},{"name":"Stephen Coakley","email":"me@stephencoakley.com"}],"description":"Parallel processing component for Amp.","homepage":"https:\/\/github.com\/amphp\/parallel","keywords":["async","asynchronous","concurrent","multi-processing","multi-threading"],"support":{"issues":"https:\/\/github.com\/amphp\/parallel\/issues","source":"https:\/\/github.com\/amphp\/parallel\/tree\/v2.3.2"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2025-08-27T21:55:40+00:00"},{"name":"amphp\/parser","version":"v1.1.1","source":{"type":"git","url":"https:\/\/github.com\/amphp\/parser.git","reference":"3cf1f8b32a0171d4b1bed93d25617637a77cded7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/parser\/zipball\/3cf1f8b32a0171d4b1bed93d25617637a77cded7","reference":"3cf1f8b32a0171d4b1bed93d25617637a77cded7","shasum":""},"require":{"php":">=7.4"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","phpunit\/phpunit":"^9","psalm\/phar":"^5.4"},"type":"library","autoload":{"psr-4":{"Amp\\Parser\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"A generator parser to make streaming parsers simple.","homepage":"https:\/\/github.com\/amphp\/parser","keywords":["async","non-blocking","parser","stream"],"support":{"issues":"https:\/\/github.com\/amphp\/parser\/issues","source":"https:\/\/github.com\/amphp\/parser\/tree\/v1.1.1"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2024-03-21T19:16:53+00:00"},{"name":"amphp\/pipeline","version":"v1.2.3","source":{"type":"git","url":"https:\/\/github.com\/amphp\/pipeline.git","reference":"7b52598c2e9105ebcddf247fc523161581930367"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/pipeline\/zipball\/7b52598c2e9105ebcddf247fc523161581930367","reference":"7b52598c2e9105ebcddf247fc523161581930367","shasum":""},"require":{"amphp\/amp":"^3","php":">=8.1","revolt\/event-loop":"^1"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"^5.18"},"type":"library","autoload":{"psr-4":{"Amp\\Pipeline\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"Asynchronous iterators and operators.","homepage":"https:\/\/amphp.org\/pipeline","keywords":["amp","amphp","async","io","iterator","non-blocking"],"support":{"issues":"https:\/\/github.com\/amphp\/pipeline\/issues","source":"https:\/\/github.com\/amphp\/pipeline\/tree\/v1.2.3"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2025-03-16T16:33:53+00:00"},{"name":"amphp\/process","version":"v2.0.3","source":{"type":"git","url":"https:\/\/github.com\/amphp\/process.git","reference":"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/process\/zipball\/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d","reference":"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d","shasum":""},"require":{"amphp\/amp":"^3","amphp\/byte-stream":"^2","amphp\/sync":"^2","php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"^5.4"},"type":"library","autoload":{"files":["src\/functions.php"],"psr-4":{"Amp\\Process\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Bob Weinand","email":"bobwei9@hotmail.com"},{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"A fiber-aware process manager based on Amp and Revolt.","homepage":"https:\/\/amphp.org\/process","support":{"issues":"https:\/\/github.com\/amphp\/process\/issues","source":"https:\/\/github.com\/amphp\/process\/tree\/v2.0.3"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2024-04-19T03:13:44+00:00"},{"name":"amphp\/serialization","version":"v1.0.0","source":{"type":"git","url":"https:\/\/github.com\/amphp\/serialization.git","reference":"693e77b2fb0b266c3c7d622317f881de44ae94a1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/serialization\/zipball\/693e77b2fb0b266c3c7d622317f881de44ae94a1","reference":"693e77b2fb0b266c3c7d622317f881de44ae94a1","shasum":""},"require":{"php":">=7.1"},"require-dev":{"amphp\/php-cs-fixer-config":"dev-master","phpunit\/phpunit":"^9 || ^8 || ^7"},"type":"library","autoload":{"files":["src\/functions.php"],"psr-4":{"Amp\\Serialization\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"Serialization tools for IPC and data storage in PHP.","homepage":"https:\/\/github.com\/amphp\/serialization","keywords":["async","asynchronous","serialization","serialize"],"support":{"issues":"https:\/\/github.com\/amphp\/serialization\/issues","source":"https:\/\/github.com\/amphp\/serialization\/tree\/master"},"time":"2020-03-25T21:39:07+00:00"},{"name":"amphp\/socket","version":"v2.3.1","source":{"type":"git","url":"https:\/\/github.com\/amphp\/socket.git","reference":"58e0422221825b79681b72c50c47a930be7bf1e1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/socket\/zipball\/58e0422221825b79681b72c50c47a930be7bf1e1","reference":"58e0422221825b79681b72c50c47a930be7bf1e1","shasum":""},"require":{"amphp\/amp":"^3","amphp\/byte-stream":"^2","amphp\/dns":"^2","ext-openssl":"*","kelunik\/certificate":"^1.1","league\/uri":"^6.5 | ^7","league\/uri-interfaces":"^2.3 | ^7","php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","amphp\/process":"^2","phpunit\/phpunit":"^9","psalm\/phar":"5.20"},"type":"library","autoload":{"files":["src\/functions.php","src\/Internal\/functions.php","src\/SocketAddress\/functions.php"],"psr-4":{"Amp\\Socket\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Daniel Lowrey","email":"rdlowrey@gmail.com"},{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"Non-blocking socket connection \/ server implementations based on Amp and Revolt.","homepage":"https:\/\/github.com\/amphp\/socket","keywords":["amp","async","encryption","non-blocking","sockets","tcp","tls"],"support":{"issues":"https:\/\/github.com\/amphp\/socket\/issues","source":"https:\/\/github.com\/amphp\/socket\/tree\/v2.3.1"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2024-04-21T14:33:03+00:00"},{"name":"amphp\/sync","version":"v2.3.0","source":{"type":"git","url":"https:\/\/github.com\/amphp\/sync.git","reference":"217097b785130d77cfcc58ff583cf26cd1770bf1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/amphp\/sync\/zipball\/217097b785130d77cfcc58ff583cf26cd1770bf1","reference":"217097b785130d77cfcc58ff583cf26cd1770bf1","shasum":""},"require":{"amphp\/amp":"^3","amphp\/pipeline":"^1","amphp\/serialization":"^1","php":">=8.1","revolt\/event-loop":"^1 || ^0.2"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","amphp\/phpunit-util":"^3","phpunit\/phpunit":"^9","psalm\/phar":"5.23"},"type":"library","autoload":{"files":["src\/functions.php"],"psr-4":{"Amp\\Sync\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Niklas Keller","email":"me@kelunik.com"},{"name":"Stephen Coakley","email":"me@stephencoakley.com"}],"description":"Non-blocking synchronization primitives for PHP based on Amp and Revolt.","homepage":"https:\/\/github.com\/amphp\/sync","keywords":["async","asynchronous","mutex","semaphore","synchronization"],"support":{"issues":"https:\/\/github.com\/amphp\/sync\/issues","source":"https:\/\/github.com\/amphp\/sync\/tree\/v2.3.0"},"funding":[{"url":"https:\/\/github.com\/amphp","type":"github"}],"time":"2024-08-03T19:31:26+00:00"},{"name":"brianium\/paratest","version":"v7.8.4","source":{"type":"git","url":"https:\/\/github.com\/paratestphp\/paratest.git","reference":"130a9bf0e269ee5f5b320108f794ad03e275cad4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/paratestphp\/paratest\/zipball\/130a9bf0e269ee5f5b320108f794ad03e275cad4","reference":"130a9bf0e269ee5f5b320108f794ad03e275cad4","shasum":""},"require":{"ext-dom":"*","ext-pcre":"*","ext-reflection":"*","ext-simplexml":"*","fidry\/cpu-core-counter":"^1.2.0","jean85\/pretty-package-versions":"^2.1.1","php":"~8.2.0 || ~8.3.0 || ~8.4.0","phpunit\/php-code-coverage":"^11.0.10","phpunit\/php-file-iterator":"^5.1.0","phpunit\/php-timer":"^7.0.1","phpunit\/phpunit":"^11.5.24","sebastian\/environment":"^7.2.1","symfony\/console":"^6.4.22 || ^7.3.0","symfony\/process":"^6.4.20 || ^7.3.0"},"require-dev":{"doctrine\/coding-standard":"^12.0.0","ext-pcov":"*","ext-posix":"*","phpstan\/phpstan":"^2.1.17","phpstan\/phpstan-deprecation-rules":"^2.0.3","phpstan\/phpstan-phpunit":"^2.0.6","phpstan\/phpstan-strict-rules":"^2.0.4","squizlabs\/php_codesniffer":"^3.13.2","symfony\/filesystem":"^6.4.13 || ^7.3.0"},"bin":["bin\/paratest","bin\/paratest_for_phpstorm"],"type":"library","autoload":{"psr-4":{"ParaTest\\":["src\/"]}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Brian Scaturro","email":"scaturrob@gmail.com","role":"Developer"},{"name":"Filippo Tessarotto","email":"zoeslam@gmail.com","role":"Developer"}],"description":"Parallel testing for PHP","homepage":"https:\/\/github.com\/paratestphp\/paratest","keywords":["concurrent","parallel","phpunit","testing"],"support":{"issues":"https:\/\/github.com\/paratestphp\/paratest\/issues","source":"https:\/\/github.com\/paratestphp\/paratest\/tree\/v7.8.4"},"funding":[{"url":"https:\/\/github.com\/sponsors\/Slamdunk","type":"github"},{"url":"https:\/\/paypal.me\/filippotessarotto","type":"paypal"}],"time":"2025-06-23T06:07:21+00:00"},{"name":"colinodell\/json5","version":"v3.0.0","source":{"type":"git","url":"https:\/\/github.com\/colinodell\/json5.git","reference":"5724d21bc5c910c2560af1b8915f0cc0163579c8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/colinodell\/json5\/zipball\/5724d21bc5c910c2560af1b8915f0cc0163579c8","reference":"5724d21bc5c910c2560af1b8915f0cc0163579c8","shasum":""},"require":{"ext-json":"*","ext-mbstring":"*","php":"^8.0"},"require-dev":{"mikehaertl\/php-shellcommand":"^1.7.0","phpstan\/phpstan":"^1.10.57","scrutinizer\/ocular":"^1.9","squizlabs\/php_codesniffer":"^3.8.1","symfony\/finder":"^6.0|^7.0","symfony\/phpunit-bridge":"^7.0.3"},"bin":["bin\/json5"],"type":"library","extra":{"branch-alias":{"dev-main":"4.0-dev"}},"autoload":{"files":["src\/global.php"],"psr-4":{"ColinODell\\Json5\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com","role":"Developer"}],"description":"UTF-8 compatible JSON5 parser for PHP","homepage":"https:\/\/github.com\/colinodell\/json5","keywords":["JSON5","json","json5_decode","json_decode"],"support":{"issues":"https:\/\/github.com\/colinodell\/json5\/issues","source":"https:\/\/github.com\/colinodell\/json5\/tree\/v3.0.0"},"funding":[{"url":"https:\/\/www.colinodell.com\/sponsor","type":"custom"},{"url":"https:\/\/www.paypal.me\/colinpodell\/10.00","type":"custom"},{"url":"https:\/\/github.com\/colinodell","type":"github"},{"url":"https:\/\/www.patreon.com\/colinodell","type":"patreon"}],"time":"2024-02-09T13:06:12+00:00"},{"name":"composer\/class-map-generator","version":"1.6.2","source":{"type":"git","url":"https:\/\/github.com\/composer\/class-map-generator.git","reference":"ba9f089655d4cdd64e762a6044f411ccdaec0076"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/class-map-generator\/zipball\/ba9f089655d4cdd64e762a6044f411ccdaec0076","reference":"ba9f089655d4cdd64e762a6044f411ccdaec0076","shasum":""},"require":{"composer\/pcre":"^2.1 || ^3.1","php":"^7.2 || ^8.0","symfony\/finder":"^4.4 || ^5.3 || ^6 || ^7"},"require-dev":{"phpstan\/phpstan":"^1.12 || ^2","phpstan\/phpstan-deprecation-rules":"^1 || ^2","phpstan\/phpstan-phpunit":"^1 || ^2","phpstan\/phpstan-strict-rules":"^1.1 || ^2","phpunit\/phpunit":"^8","symfony\/filesystem":"^5.4 || ^6"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"autoload":{"psr-4":{"Composer\\ClassMapGenerator\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"https:\/\/seld.be"}],"description":"Utilities to scan PHP code and generate class maps.","keywords":["classmap"],"support":{"issues":"https:\/\/github.com\/composer\/class-map-generator\/issues","source":"https:\/\/github.com\/composer\/class-map-generator\/tree\/1.6.2"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"time":"2025-08-20T18:52:43+00:00"},{"name":"composer\/composer","version":"2.8.12","source":{"type":"git","url":"https:\/\/github.com\/composer\/composer.git","reference":"3e38919bc9a2c3c026f2151b5e56d04084ce8f0b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/composer\/zipball\/3e38919bc9a2c3c026f2151b5e56d04084ce8f0b","reference":"3e38919bc9a2c3c026f2151b5e56d04084ce8f0b","shasum":""},"require":{"composer\/ca-bundle":"^1.5","composer\/class-map-generator":"^1.4.0","composer\/metadata-minifier":"^1.0","composer\/pcre":"^2.2 || ^3.2","composer\/semver":"^3.3","composer\/spdx-licenses":"^1.5.7","composer\/xdebug-handler":"^2.0.2 || ^3.0.3","justinrainbow\/json-schema":"^6.5.1","php":"^7.2.5 || ^8.0","psr\/log":"^1.0 || ^2.0 || ^3.0","react\/promise":"^3.3","seld\/jsonlint":"^1.4","seld\/phar-utils":"^1.2","seld\/signal-handler":"^2.0","symfony\/console":"^5.4.47 || ^6.4.25 || ^7.1.10","symfony\/filesystem":"^5.4.45 || ^6.4.24 || ^7.1.10","symfony\/finder":"^5.4.45 || ^6.4.24 || ^7.1.10","symfony\/polyfill-php73":"^1.24","symfony\/polyfill-php80":"^1.24","symfony\/polyfill-php81":"^1.24","symfony\/process":"^5.4.47 || ^6.4.25 || ^7.1.10"},"require-dev":{"phpstan\/phpstan":"^1.11.8","phpstan\/phpstan-deprecation-rules":"^1.2.0","phpstan\/phpstan-phpunit":"^1.4.0","phpstan\/phpstan-strict-rules":"^1.6.0","phpstan\/phpstan-symfony":"^1.4.0","symfony\/phpunit-bridge":"^6.4.25 || ^7.3.3"},"suggest":{"ext-openssl":"Enabling the openssl extension allows you to access https URLs for repositories and packages","ext-zip":"Enabling the zip extension allows you to unzip archives","ext-zlib":"Allow gzip compression of HTTP requests"},"bin":["bin\/composer"],"type":"library","extra":{"phpstan":{"includes":["phpstan\/rules.neon"]},"branch-alias":{"dev-main":"2.8-dev"}},"autoload":{"psr-4":{"Composer\\":"src\/Composer\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nils Adermann","email":"naderman@naderman.de","homepage":"https:\/\/www.naderman.de"},{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"https:\/\/seld.be"}],"description":"Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.","homepage":"https:\/\/getcomposer.org\/","keywords":["autoload","dependency","package"],"support":{"irc":"ircs:\/\/irc.libera.chat:6697\/composer","issues":"https:\/\/github.com\/composer\/composer\/issues","security":"https:\/\/github.com\/composer\/composer\/security\/policy","source":"https:\/\/github.com\/composer\/composer\/tree\/2.8.12"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"}],"time":"2025-09-19T11:41:59+00:00"},{"name":"composer\/metadata-minifier","version":"1.0.0","source":{"type":"git","url":"https:\/\/github.com\/composer\/metadata-minifier.git","reference":"c549d23829536f0d0e984aaabbf02af91f443207"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/metadata-minifier\/zipball\/c549d23829536f0d0e984aaabbf02af91f443207","reference":"c549d23829536f0d0e984aaabbf02af91f443207","shasum":""},"require":{"php":"^5.3.2 || ^7.0 || ^8.0"},"require-dev":{"composer\/composer":"^2","phpstan\/phpstan":"^0.12.55","symfony\/phpunit-bridge":"^4.2 || ^5"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"autoload":{"psr-4":{"Composer\\MetadataMinifier\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"}],"description":"Small utility library that handles metadata minification and expansion.","keywords":["composer","compression"],"support":{"issues":"https:\/\/github.com\/composer\/metadata-minifier\/issues","source":"https:\/\/github.com\/composer\/metadata-minifier\/tree\/1.0.0"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/composer\/composer","type":"tidelift"}],"time":"2021-04-07T13:37:33+00:00"},{"name":"composer\/pcre","version":"3.3.2","source":{"type":"git","url":"https:\/\/github.com\/composer\/pcre.git","reference":"b2bed4734f0cc156ee1fe9c0da2550420d99a21e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/pcre\/zipball\/b2bed4734f0cc156ee1fe9c0da2550420d99a21e","reference":"b2bed4734f0cc156ee1fe9c0da2550420d99a21e","shasum":""},"require":{"php":"^7.4 || ^8.0"},"conflict":{"phpstan\/phpstan":"<1.11.10"},"require-dev":{"phpstan\/phpstan":"^1.12 || ^2","phpstan\/phpstan-strict-rules":"^1 || ^2","phpunit\/phpunit":"^8 || ^9"},"type":"library","extra":{"phpstan":{"includes":["extension.neon"]},"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"Composer\\Pcre\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"}],"description":"PCRE wrapping library that offers type-safe preg_* replacements.","keywords":["PCRE","preg","regex","regular expression"],"support":{"issues":"https:\/\/github.com\/composer\/pcre\/issues","source":"https:\/\/github.com\/composer\/pcre\/tree\/3.3.2"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/composer\/composer","type":"tidelift"}],"time":"2024-11-12T16:29:46+00:00"},{"name":"composer\/spdx-licenses","version":"1.5.9","source":{"type":"git","url":"https:\/\/github.com\/composer\/spdx-licenses.git","reference":"edf364cefe8c43501e21e88110aac10b284c3c9f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/spdx-licenses\/zipball\/edf364cefe8c43501e21e88110aac10b284c3c9f","reference":"edf364cefe8c43501e21e88110aac10b284c3c9f","shasum":""},"require":{"php":"^5.3.2 || ^7.0 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.11","symfony\/phpunit-bridge":"^3 || ^7"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"autoload":{"psr-4":{"Composer\\Spdx\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nils Adermann","email":"naderman@naderman.de","homepage":"http:\/\/www.naderman.de"},{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"},{"name":"Rob Bast","email":"rob.bast@gmail.com","homepage":"http:\/\/robbast.nl"}],"description":"SPDX licenses list and validation library.","keywords":["license","spdx","validator"],"support":{"irc":"ircs:\/\/irc.libera.chat:6697\/composer","issues":"https:\/\/github.com\/composer\/spdx-licenses\/issues","source":"https:\/\/github.com\/composer\/spdx-licenses\/tree\/1.5.9"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/composer\/composer","type":"tidelift"}],"time":"2025-05-12T21:07:07+00:00"},{"name":"composer\/xdebug-handler","version":"3.0.5","source":{"type":"git","url":"https:\/\/github.com\/composer\/xdebug-handler.git","reference":"6c1925561632e83d60a44492e0b344cf48ab85ef"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/composer\/xdebug-handler\/zipball\/6c1925561632e83d60a44492e0b344cf48ab85ef","reference":"6c1925561632e83d60a44492e0b344cf48ab85ef","shasum":""},"require":{"composer\/pcre":"^1 || ^2 || ^3","php":"^7.2.5 || ^8.0","psr\/log":"^1 || ^2 || ^3"},"require-dev":{"phpstan\/phpstan":"^1.0","phpstan\/phpstan-strict-rules":"^1.1","phpunit\/phpunit":"^8.5 || ^9.6 || ^10.5"},"type":"library","autoload":{"psr-4":{"Composer\\XdebugHandler\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"John Stevenson","email":"john-stevenson@blueyonder.co.uk"}],"description":"Restarts a process without Xdebug.","keywords":["Xdebug","performance"],"support":{"irc":"ircs:\/\/irc.libera.chat:6697\/composer","issues":"https:\/\/github.com\/composer\/xdebug-handler\/issues","source":"https:\/\/github.com\/composer\/xdebug-handler\/tree\/3.0.5"},"funding":[{"url":"https:\/\/packagist.com","type":"custom"},{"url":"https:\/\/github.com\/composer","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/composer\/composer","type":"tidelift"}],"time":"2024-05-06T16:37:16+00:00"},{"name":"daverandom\/libdns","version":"v2.1.0","source":{"type":"git","url":"https:\/\/github.com\/DaveRandom\/LibDNS.git","reference":"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/DaveRandom\/LibDNS\/zipball\/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a","reference":"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a","shasum":""},"require":{"ext-ctype":"*","php":">=7.1"},"suggest":{"ext-intl":"Required for IDN support"},"type":"library","autoload":{"files":["src\/functions.php"],"psr-4":{"LibDNS\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"DNS protocol implementation written in pure PHP","keywords":["dns"],"support":{"issues":"https:\/\/github.com\/DaveRandom\/LibDNS\/issues","source":"https:\/\/github.com\/DaveRandom\/LibDNS\/tree\/v2.1.0"},"time":"2024-04-12T12:12:48+00:00"},{"name":"dealerdirect\/phpcodesniffer-composer-installer","version":"v1.2.0","source":{"type":"git","url":"https:\/\/github.com\/PHPCSStandards\/composer-installer.git","reference":"845eb62303d2ca9b289ef216356568ccc075ffd1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/PHPCSStandards\/composer-installer\/zipball\/845eb62303d2ca9b289ef216356568ccc075ffd1","reference":"845eb62303d2ca9b289ef216356568ccc075ffd1","shasum":""},"require":{"composer-plugin-api":"^2.2","php":">=5.4","squizlabs\/php_codesniffer":"^3.1.0 || ^4.0"},"require-dev":{"composer\/composer":"^2.2","ext-json":"*","ext-zip":"*","php-parallel-lint\/php-parallel-lint":"^1.4.0","phpcompatibility\/php-compatibility":"^9.0 || ^10.0.0@dev","yoast\/phpunit-polyfills":"^1.0"},"type":"composer-plugin","extra":{"class":"PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"},"autoload":{"psr-4":{"PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Franck Nijhof","email":"opensource@frenck.dev","homepage":"https:\/\/frenck.dev","role":"Open source developer"},{"name":"Contributors","homepage":"https:\/\/github.com\/PHPCSStandards\/composer-installer\/graphs\/contributors"}],"description":"PHP_CodeSniffer Standards Composer Installer Plugin","keywords":["PHPCodeSniffer","PHP_CodeSniffer","code quality","codesniffer","composer","installer","phpcbf","phpcs","plugin","qa","quality","standard","standards","style guide","stylecheck","tests"],"support":{"issues":"https:\/\/github.com\/PHPCSStandards\/composer-installer\/issues","security":"https:\/\/github.com\/PHPCSStandards\/composer-installer\/security\/policy","source":"https:\/\/github.com\/PHPCSStandards\/composer-installer"},"funding":[{"url":"https:\/\/github.com\/PHPCSStandards","type":"github"},{"url":"https:\/\/github.com\/jrfnl","type":"github"},{"url":"https:\/\/opencollective.com\/php_codesniffer","type":"open_collective"},{"url":"https:\/\/thanks.dev\/u\/gh\/phpcsstandards","type":"thanks_dev"}],"time":"2025-11-11T04:32:07+00:00"},{"name":"doctrine\/collections","version":"2.4.0","source":{"type":"git","url":"https:\/\/github.com\/doctrine\/collections.git","reference":"9acfeea2e8666536edff3d77c531261c63680160"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/doctrine\/collections\/zipball\/9acfeea2e8666536edff3d77c531261c63680160","reference":"9acfeea2e8666536edff3d77c531261c63680160","shasum":""},"require":{"doctrine\/deprecations":"^1","php":"^8.1","symfony\/polyfill-php84":"^1.30"},"require-dev":{"doctrine\/coding-standard":"^14","ext-json":"*","phpstan\/phpstan":"^2.1.30","phpstan\/phpstan-phpunit":"^2.0.7","phpunit\/phpunit":"^10.5.58 || ^11.5.42 || ^12.4"},"type":"library","autoload":{"psr-4":{"Doctrine\\Common\\Collections\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Guilherme Blanco","email":"guilhermeblanco@gmail.com"},{"name":"Roman Borschel","email":"roman@code-factory.org"},{"name":"Benjamin Eberlei","email":"kontakt@beberlei.de"},{"name":"Jonathan Wage","email":"jonwage@gmail.com"},{"name":"Johannes Schmitt","email":"schmittjoh@gmail.com"}],"description":"PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.","homepage":"https:\/\/www.doctrine-project.org\/projects\/collections.html","keywords":["array","collections","iterators","php"],"support":{"issues":"https:\/\/github.com\/doctrine\/collections\/issues","source":"https:\/\/github.com\/doctrine\/collections\/tree\/2.4.0"},"funding":[{"url":"https:\/\/www.doctrine-project.org\/sponsorship.html","type":"custom"},{"url":"https:\/\/www.patreon.com\/phpdoctrine","type":"patreon"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/doctrine%2Fcollections","type":"tidelift"}],"time":"2025-10-25T09:18:13+00:00"},{"name":"doctrine\/deprecations","version":"1.1.5","source":{"type":"git","url":"https:\/\/github.com\/doctrine\/deprecations.git","reference":"459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/doctrine\/deprecations\/zipball\/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38","reference":"459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38","shasum":""},"require":{"php":"^7.1 || ^8.0"},"conflict":{"phpunit\/phpunit":"<=7.5 || >=13"},"require-dev":{"doctrine\/coding-standard":"^9 || ^12 || ^13","phpstan\/phpstan":"1.4.10 || 2.1.11","phpstan\/phpstan-phpunit":"^1.0 || ^2","phpunit\/phpunit":"^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12","psr\/log":"^1 || ^2 || ^3"},"suggest":{"psr\/log":"Allows logging deprecations via PSR-3 logger implementation"},"type":"library","autoload":{"psr-4":{"Doctrine\\Deprecations\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.","homepage":"https:\/\/www.doctrine-project.org\/","support":{"issues":"https:\/\/github.com\/doctrine\/deprecations\/issues","source":"https:\/\/github.com\/doctrine\/deprecations\/tree\/1.1.5"},"time":"2025-04-07T20:06:18+00:00"},{"name":"doctrine\/instantiator","version":"2.0.0","source":{"type":"git","url":"https:\/\/github.com\/doctrine\/instantiator.git","reference":"c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/doctrine\/instantiator\/zipball\/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0","reference":"c6222283fa3f4ac679f8b9ced9a4e23f163e80d0","shasum":""},"require":{"php":"^8.1"},"require-dev":{"doctrine\/coding-standard":"^11","ext-pdo":"*","ext-phar":"*","phpbench\/phpbench":"^1.2","phpstan\/phpstan":"^1.9.4","phpstan\/phpstan-phpunit":"^1.3","phpunit\/phpunit":"^9.5.27","vimeo\/psalm":"^5.4"},"type":"library","autoload":{"psr-4":{"Doctrine\\Instantiator\\":"src\/Doctrine\/Instantiator\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Marco Pivetta","email":"ocramius@gmail.com","homepage":"https:\/\/ocramius.github.io\/"}],"description":"A small, lightweight utility to instantiate objects in PHP without invoking their constructors","homepage":"https:\/\/www.doctrine-project.org\/projects\/instantiator.html","keywords":["constructor","instantiate"],"support":{"issues":"https:\/\/github.com\/doctrine\/instantiator\/issues","source":"https:\/\/github.com\/doctrine\/instantiator\/tree\/2.0.0"},"funding":[{"url":"https:\/\/www.doctrine-project.org\/sponsorship.html","type":"custom"},{"url":"https:\/\/www.patreon.com\/phpdoctrine","type":"patreon"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/doctrine%2Finstantiator","type":"tidelift"}],"time":"2022-12-30T00:23:10+00:00"},{"name":"dominikb\/composer-license-checker","version":"2.7.0","source":{"type":"git","url":"https:\/\/github.com\/dominikb\/composer-license-checker.git","reference":"c94bda40a6cf37a98c8bf3494f8f655656724ce8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/dominikb\/composer-license-checker\/zipball\/c94bda40a6cf37a98c8bf3494f8f655656724ce8","reference":"c94bda40a6cf37a98c8bf3494f8f655656724ce8","shasum":""},"require":{"composer\/composer":"~2.2.23 || ^2.7.0","ext-json":"*","guzzlehttp\/guzzle":"^6.5.8 || ^7.4.5","php":"^7.3 || ^8.0","psr\/simple-cache":"^1.0 || ^2.0 || ^3.0","symfony\/cache":"~4.2.12 || ^4.3.8 || ^5.2 || ^6.0 || ^7.0","symfony\/console":"^5.3 || ^6.0 || ^7.0","symfony\/css-selector":"^4.2 || ^5.2 || ^6.0 || ^7.0","symfony\/dom-crawler":"^5.2 || ^6.0 || ^7.0"},"require-dev":{"mockery\/mockery":"^1.3.3","phpunit\/phpunit":"^9.3","symfony\/var-dumper":"^4.2 || ^5.2 || ^6.0 || ^7.0"},"bin":["composer-license-checker"],"type":"library","autoload":{"files":["src\/helpers.php"],"psr-4":{"Dominikb\\ComposerLicenseChecker\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Dominik Bauernfeind","email":"bauernfeind.dominik@gmail.com","role":"Developer"}],"description":"Utility to check for licenses of dependencies and block\/allow them.","homepage":"https:\/\/github.com\/dominikb\/composer-license-checker","keywords":["composer-license-checker","dominikb"],"support":{"issues":"https:\/\/github.com\/dominikb\/composer-license-checker\/issues","source":"https:\/\/github.com\/dominikb\/composer-license-checker\/tree\/2.7.0"},"time":"2025-01-26T20:46:05+00:00"},{"name":"drupal\/coder","version":"8.3.31","source":{"type":"git","url":"https:\/\/github.com\/pfrenssen\/coder.git","reference":"07c14cf2217c2b53cc4469e2ed360141e6bb18ea"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/pfrenssen\/coder\/zipball\/07c14cf2217c2b53cc4469e2ed360141e6bb18ea","reference":"07c14cf2217c2b53cc4469e2ed360141e6bb18ea","shasum":""},"require":{"dealerdirect\/phpcodesniffer-composer-installer":"^0.7.1 || ^1.0.0","ext-mbstring":"*","php":">=7.2","sirbrillig\/phpcs-variable-analysis":"^2.11.7","slevomat\/coding-standard":"^8.11","squizlabs\/php_codesniffer":"^3.13","symfony\/yaml":">=3.4.0"},"require-dev":{"phpstan\/phpstan":"^1.7.12","phpunit\/phpunit":"^8.0"},"type":"phpcodesniffer-standard","autoload":{"psr-4":{"Drupal\\":"coder_sniffer\/Drupal\/","DrupalPractice\\":"coder_sniffer\/DrupalPractice\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["GPL-2.0-or-later"],"description":"Coder is a library to review Drupal code.","homepage":"https:\/\/www.drupal.org\/project\/coder","keywords":["code review","phpcs","standards"],"support":{"issues":"https:\/\/www.drupal.org\/project\/issues\/coder","source":"https:\/\/www.drupal.org\/project\/coder"},"time":"2025-10-16T12:23:49+00:00"},{"name":"fidry\/cpu-core-counter","version":"1.3.0","source":{"type":"git","url":"https:\/\/github.com\/theofidry\/cpu-core-counter.git","reference":"db9508f7b1474469d9d3c53b86f817e344732678"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/theofidry\/cpu-core-counter\/zipball\/db9508f7b1474469d9d3c53b86f817e344732678","reference":"db9508f7b1474469d9d3c53b86f817e344732678","shasum":""},"require":{"php":"^7.2 || ^8.0"},"require-dev":{"fidry\/makefile":"^0.2.0","fidry\/php-cs-fixer-config":"^1.1.2","phpstan\/extension-installer":"^1.2.0","phpstan\/phpstan":"^2.0","phpstan\/phpstan-deprecation-rules":"^2.0.0","phpstan\/phpstan-phpunit":"^2.0","phpstan\/phpstan-strict-rules":"^2.0","phpunit\/phpunit":"^8.5.31 || ^9.5.26","webmozarts\/strict-phpunit":"^7.5"},"type":"library","autoload":{"psr-4":{"Fidry\\CpuCoreCounter\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Th\u00e9o FIDRY","email":"theo.fidry@gmail.com"}],"description":"Tiny utility to get the number of CPU cores.","keywords":["CPU","core"],"support":{"issues":"https:\/\/github.com\/theofidry\/cpu-core-counter\/issues","source":"https:\/\/github.com\/theofidry\/cpu-core-counter\/tree\/1.3.0"},"funding":[{"url":"https:\/\/github.com\/theofidry","type":"github"}],"time":"2025-08-14T07:29:31+00:00"},{"name":"gitonomy\/gitlib","version":"v1.5.0","source":{"type":"git","url":"https:\/\/github.com\/gitonomy\/gitlib.git","reference":"ac17834888bf399a4ecae5e108be52c8c5f93958"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/gitonomy\/gitlib\/zipball\/ac17834888bf399a4ecae5e108be52c8c5f93958","reference":"ac17834888bf399a4ecae5e108be52c8c5f93958","shasum":""},"require":{"ext-pcre":"*","php":"^8.0","symfony\/polyfill-mbstring":"^1.7","symfony\/process":"^5.4 || ^6.0 || ^7.0"},"require-dev":{"ext-fileinfo":"*","phpspec\/prophecy-phpunit":"^2.0","phpunit\/phpunit":"^7.5.20 || ^8.5.20 || ^9.5.9","psr\/log":"^1.0"},"type":"library","autoload":{"psr-4":{"Gitonomy\\Git\\":"src\/Gitonomy\/Git\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Graham Campbell","email":"hello@gjcampbell.co.uk","homepage":"https:\/\/github.com\/GrahamCampbell"},{"name":"Julien Didier","email":"genzo.wm@gmail.com","homepage":"https:\/\/github.com\/juliendidier"},{"name":"Gr\u00e9goire Pineau","email":"lyrixx@lyrixx.info","homepage":"https:\/\/github.com\/lyrixx"},{"name":"Alexandre Salom\u00e9","email":"alexandre.salome@gmail.com","homepage":"https:\/\/github.com\/alexandresalome"}],"description":"Library for accessing git","support":{"issues":"https:\/\/github.com\/gitonomy\/gitlib\/issues","source":"https:\/\/github.com\/gitonomy\/gitlib\/tree\/v1.5.0"},"funding":[{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/gitonomy\/gitlib","type":"tidelift"}],"time":"2024-11-03T15:59:21+00:00"},{"name":"infection\/abstract-testframework-adapter","version":"0.5.0","source":{"type":"git","url":"https:\/\/github.com\/infection\/abstract-testframework-adapter.git","reference":"18925e20d15d1a5995bb85c9dc09e8751e1e069b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/infection\/abstract-testframework-adapter\/zipball\/18925e20d15d1a5995bb85c9dc09e8751e1e069b","reference":"18925e20d15d1a5995bb85c9dc09e8751e1e069b","shasum":""},"require":{"php":"^7.4 || ^8.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.8","friendsofphp\/php-cs-fixer":"^2.17","phpunit\/phpunit":"^9.5"},"type":"library","autoload":{"psr-4":{"Infection\\AbstractTestFramework\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Maks Rafalko","email":"maks.rafalko@gmail.com"}],"description":"Abstract Test Framework Adapter for Infection","support":{"issues":"https:\/\/github.com\/infection\/abstract-testframework-adapter\/issues","source":"https:\/\/github.com\/infection\/abstract-testframework-adapter\/tree\/0.5.0"},"funding":[{"url":"https:\/\/github.com\/infection","type":"github"},{"url":"https:\/\/opencollective.com\/infection","type":"open_collective"}],"time":"2021-08-17T18:49:12+00:00"},{"name":"infection\/extension-installer","version":"0.1.2","source":{"type":"git","url":"https:\/\/github.com\/infection\/extension-installer.git","reference":"9b351d2910b9a23ab4815542e93d541e0ca0cdcf"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/infection\/extension-installer\/zipball\/9b351d2910b9a23ab4815542e93d541e0ca0cdcf","reference":"9b351d2910b9a23ab4815542e93d541e0ca0cdcf","shasum":""},"require":{"composer-plugin-api":"^1.1 || ^2.0"},"require-dev":{"composer\/composer":"^1.9 || ^2.0","friendsofphp\/php-cs-fixer":"^2.18, <2.19","infection\/infection":"^0.15.2","php-coveralls\/php-coveralls":"^2.4","phpstan\/extension-installer":"^1.0","phpstan\/phpstan":"^0.12.10","phpstan\/phpstan-phpunit":"^0.12.6","phpstan\/phpstan-strict-rules":"^0.12.2","phpstan\/phpstan-webmozart-assert":"^0.12.2","phpunit\/phpunit":"^9.5","vimeo\/psalm":"^4.8"},"type":"composer-plugin","extra":{"class":"Infection\\ExtensionInstaller\\Plugin"},"autoload":{"psr-4":{"Infection\\ExtensionInstaller\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Maks Rafalko","email":"maks.rafalko@gmail.com"}],"description":"Infection Extension Installer","support":{"issues":"https:\/\/github.com\/infection\/extension-installer\/issues","source":"https:\/\/github.com\/infection\/extension-installer\/tree\/0.1.2"},"funding":[{"url":"https:\/\/github.com\/infection","type":"github"},{"url":"https:\/\/opencollective.com\/infection","type":"open_collective"}],"time":"2021-10-20T22:08:34+00:00"},{"name":"infection\/include-interceptor","version":"0.2.5","source":{"type":"git","url":"https:\/\/github.com\/infection\/include-interceptor.git","reference":"0cc76d95a79d9832d74e74492b0a30139904bdf7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/infection\/include-interceptor\/zipball\/0cc76d95a79d9832d74e74492b0a30139904bdf7","reference":"0cc76d95a79d9832d74e74492b0a30139904bdf7","shasum":""},"require-dev":{"friendsofphp\/php-cs-fixer":"^2.16","infection\/infection":"^0.15.0","phan\/phan":"^2.4 || ^3","php-coveralls\/php-coveralls":"^2.2","phpstan\/phpstan":"^0.12.8","phpunit\/phpunit":"^8.5","vimeo\/psalm":"^3.8"},"type":"library","autoload":{"psr-4":{"Infection\\StreamWrapper\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Maks Rafalko","email":"maks.rafalko@gmail.com"}],"description":"Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.","support":{"issues":"https:\/\/github.com\/infection\/include-interceptor\/issues","source":"https:\/\/github.com\/infection\/include-interceptor\/tree\/0.2.5"},"funding":[{"url":"https:\/\/github.com\/infection","type":"github"},{"url":"https:\/\/opencollective.com\/infection","type":"open_collective"}],"time":"2021-08-09T10:03:57+00:00"},{"name":"infection\/infection","version":"0.31.9","source":{"type":"git","url":"https:\/\/github.com\/infection\/infection.git","reference":"f9628fcd7f76eadf24726e57a81937c42458232b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/infection\/infection\/zipball\/f9628fcd7f76eadf24726e57a81937c42458232b","reference":"f9628fcd7f76eadf24726e57a81937c42458232b","shasum":""},"require":{"colinodell\/json5":"^3.0","composer-runtime-api":"^2.0","composer\/xdebug-handler":"^3.0","ext-dom":"*","ext-json":"*","ext-libxml":"*","ext-mbstring":"*","fidry\/cpu-core-counter":"^1.0","infection\/abstract-testframework-adapter":"^0.5.0","infection\/extension-installer":"^0.1.0","infection\/include-interceptor":"^0.2.5","infection\/mutator":"^0.4","justinrainbow\/json-schema":"^6.0","nikic\/php-parser":"^5.3","ondram\/ci-detector":"^4.1.0","php":"^8.2","sanmai\/di-container":"^0.1.4","sanmai\/duoclock":"^0.1.0","sanmai\/later":"^0.1.7","sanmai\/pipeline":"^7.0","sebastian\/diff":"^4.0 || ^5.0 || ^6.0 || ^7.0","symfony\/console":"^6.4 || ^7.0","symfony\/filesystem":"^6.4 || ^7.0","symfony\/finder":"^6.4 || ^7.0","symfony\/process":"^6.4 || ^7.0","thecodingmachine\/safe":"^v3.0","webmozart\/assert":"^1.11"},"conflict":{"antecedent\/patchwork":"<2.1.25","dg\/bypass-finals":"<1.4.1"},"require-dev":{"ext-simplexml":"*","fidry\/makefile":"^1.0","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2.1","phpstan\/phpstan-phpunit":"^2.0","phpstan\/phpstan-strict-rules":"^2.0","phpstan\/phpstan-webmozart-assert":"^2.0","phpunit\/phpunit":"^11.5.27","rector\/rector":"^2.0","shipmonk\/dead-code-detector":"^0.12.0","shipmonk\/name-collision-detector":"^2.1","sidz\/phpstan-rules":"^0.5.1","symfony\/yaml":"^6.4 || ^7.0","thecodingmachine\/phpstan-safe-rule":"^1.4"},"bin":["bin\/infection"],"type":"library","autoload":{"psr-4":{"Infection\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Maks Rafalko","email":"maks.rafalko@gmail.com","homepage":"https:\/\/twitter.com\/maks_rafalko"},{"name":"Oleg Zhulnev","homepage":"https:\/\/github.com\/sidz"},{"name":"Gert de Pagter","homepage":"https:\/\/github.com\/BackEndTea"},{"name":"Th\u00e9o FIDRY","email":"theo.fidry@gmail.com","homepage":"https:\/\/twitter.com\/tfidry"},{"name":"Alexey Kopytko","email":"alexey@kopytko.com","homepage":"https:\/\/www.alexeykopytko.com"},{"name":"Andreas M\u00f6ller","email":"am@localheinz.com","homepage":"https:\/\/localheinz.com"}],"description":"Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.","keywords":["coverage","mutant","mutation framework","mutation testing","testing","unit testing"],"support":{"issues":"https:\/\/github.com\/infection\/infection\/issues","source":"https:\/\/github.com\/infection\/infection\/tree\/0.31.9"},"funding":[{"url":"https:\/\/github.com\/infection","type":"github"},{"url":"https:\/\/opencollective.com\/infection","type":"open_collective"}],"time":"2025-10-27T12:00:54+00:00"},{"name":"infection\/mutator","version":"0.4.1","source":{"type":"git","url":"https:\/\/github.com\/infection\/mutator.git","reference":"3c976d721b02b32f851ee4e15d553ef1e9186d1d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/infection\/mutator\/zipball\/3c976d721b02b32f851ee4e15d553ef1e9186d1d","reference":"3c976d721b02b32f851ee4e15d553ef1e9186d1d","shasum":""},"require":{"nikic\/php-parser":"^5.0"},"require-dev":{"phpunit\/phpunit":"^9.6 || ^10"},"type":"library","autoload":{"psr-4":{"Infection\\Mutator\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Maks Rafalko","email":"maks.rafalko@gmail.com"}],"description":"Mutator interface to implement custom mutators (mutation operators) for Infection","support":{"issues":"https:\/\/github.com\/infection\/mutator\/issues","source":"https:\/\/github.com\/infection\/mutator\/tree\/0.4.1"},"funding":[{"url":"https:\/\/github.com\/infection","type":"github"},{"url":"https:\/\/opencollective.com\/infection","type":"open_collective"}],"time":"2025-04-29T08:19:52+00:00"},{"name":"jangregor\/phpstan-prophecy","version":"1.0.2","source":{"type":"git","url":"https:\/\/github.com\/Jan0707\/phpstan-prophecy.git","reference":"5ee56c7db1d58f0578c82a35e3c1befe840e85a9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Jan0707\/phpstan-prophecy\/zipball\/5ee56c7db1d58f0578c82a35e3c1befe840e85a9","reference":"5ee56c7db1d58f0578c82a35e3c1befe840e85a9","shasum":""},"require":{"php":"^7.1 || ^8.0","phpstan\/phpstan":"^1.0.0"},"conflict":{"phpspec\/prophecy":"<1.7.0 || >=2.0.0","phpunit\/phpunit":"<6.0.0 || >=12.0.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.1.1","ergebnis\/license":"^1.0.0","ergebnis\/php-cs-fixer-config":"~2.2.0","phpspec\/prophecy":"^1.7.0","phpunit\/phpunit":"^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"},"type":"phpstan-extension","extra":{"phpstan":{"includes":["extension.neon"]}},"autoload":{"psr-4":{"JanGregor\\Prophecy\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jan Gregor Emge-Triebel","email":"jan@jangregor.me"}],"description":"Provides a phpstan\/phpstan extension for phpspec\/prophecy","support":{"issues":"https:\/\/github.com\/Jan0707\/phpstan-prophecy\/issues","source":"https:\/\/github.com\/Jan0707\/phpstan-prophecy\/tree\/1.0.2"},"time":"2024-04-03T08:15:54+00:00"},{"name":"jean85\/pretty-package-versions","version":"2.1.1","source":{"type":"git","url":"https:\/\/github.com\/Jean85\/pretty-package-versions.git","reference":"4d7aa5dab42e2a76d99559706022885de0e18e1a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Jean85\/pretty-package-versions\/zipball\/4d7aa5dab42e2a76d99559706022885de0e18e1a","reference":"4d7aa5dab42e2a76d99559706022885de0e18e1a","shasum":""},"require":{"composer-runtime-api":"^2.1.0","php":"^7.4|^8.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"^3.2","jean85\/composer-provided-replaced-stub-package":"^1.0","phpstan\/phpstan":"^2.0","phpunit\/phpunit":"^7.5|^8.5|^9.6","rector\/rector":"^2.0","vimeo\/psalm":"^4.3 || ^5.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Jean85\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Alessandro Lai","email":"alessandro.lai85@gmail.com"}],"description":"A library to get pretty versions strings of installed dependencies","keywords":["composer","package","release","versions"],"support":{"issues":"https:\/\/github.com\/Jean85\/pretty-package-versions\/issues","source":"https:\/\/github.com\/Jean85\/pretty-package-versions\/tree\/2.1.1"},"time":"2025-03-19T14:43:43+00:00"},{"name":"justinrainbow\/json-schema","version":"6.6.0","source":{"type":"git","url":"https:\/\/github.com\/jsonrainbow\/json-schema.git","reference":"68ba7677532803cc0c5900dd5a4d730537f2b2f3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/jsonrainbow\/json-schema\/zipball\/68ba7677532803cc0c5900dd5a4d730537f2b2f3","reference":"68ba7677532803cc0c5900dd5a4d730537f2b2f3","shasum":""},"require":{"ext-json":"*","marc-mabe\/php-enum":"^4.0","php":"^7.2 || ^8.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"3.3.0","json-schema\/json-schema-test-suite":"^23.2","marc-mabe\/php-enum-phpstan":"^2.0","phpspec\/prophecy":"^1.19","phpstan\/phpstan":"^1.12","phpunit\/phpunit":"^8.5"},"bin":["bin\/validate-json"],"type":"library","extra":{"branch-alias":{"dev-master":"6.x-dev"}},"autoload":{"psr-4":{"JsonSchema\\":"src\/JsonSchema\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Bruno Prieto Reis","email":"bruno.p.reis@gmail.com"},{"name":"Justin Rainbow","email":"justin.rainbow@gmail.com"},{"name":"Igor Wiedler","email":"igor@wiedler.ch"},{"name":"Robert Sch\u00f6nthal","email":"seroscho@googlemail.com"}],"description":"A library to validate a json schema.","homepage":"https:\/\/github.com\/jsonrainbow\/json-schema","keywords":["json","schema"],"support":{"issues":"https:\/\/github.com\/jsonrainbow\/json-schema\/issues","source":"https:\/\/github.com\/jsonrainbow\/json-schema\/tree\/6.6.0"},"time":"2025-10-10T11:34:09+00:00"},{"name":"kelunik\/certificate","version":"v1.1.3","source":{"type":"git","url":"https:\/\/github.com\/kelunik\/certificate.git","reference":"7e00d498c264d5eb4f78c69f41c8bd6719c0199e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/kelunik\/certificate\/zipball\/7e00d498c264d5eb4f78c69f41c8bd6719c0199e","reference":"7e00d498c264d5eb4f78c69f41c8bd6719c0199e","shasum":""},"require":{"ext-openssl":"*","php":">=7.0"},"require-dev":{"amphp\/php-cs-fixer-config":"^2","phpunit\/phpunit":"^6 | 7 | ^8 | ^9"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Kelunik\\Certificate\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"Access certificate details and transform between different formats.","keywords":["DER","certificate","certificates","openssl","pem","x509"],"support":{"issues":"https:\/\/github.com\/kelunik\/certificate\/issues","source":"https:\/\/github.com\/kelunik\/certificate\/tree\/v1.1.3"},"time":"2023-02-03T21:26:53+00:00"},{"name":"laravel\/serializable-closure","version":"v2.0.6","source":{"type":"git","url":"https:\/\/github.com\/laravel\/serializable-closure.git","reference":"038ce42edee619599a1debb7e81d7b3759492819"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/laravel\/serializable-closure\/zipball\/038ce42edee619599a1debb7e81d7b3759492819","reference":"038ce42edee619599a1debb7e81d7b3759492819","shasum":""},"require":{"php":"^8.1"},"require-dev":{"illuminate\/support":"^10.0|^11.0|^12.0","nesbot\/carbon":"^2.67|^3.0","pestphp\/pest":"^2.36|^3.0","phpstan\/phpstan":"^2.0","symfony\/var-dumper":"^6.2.0|^7.0.0"},"type":"library","extra":{"branch-alias":{"dev-master":"2.x-dev"}},"autoload":{"psr-4":{"Laravel\\SerializableClosure\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Taylor Otwell","email":"taylor@laravel.com"},{"name":"Nuno Maduro","email":"nuno@laravel.com"}],"description":"Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.","keywords":["closure","laravel","serializable"],"support":{"issues":"https:\/\/github.com\/laravel\/serializable-closure\/issues","source":"https:\/\/github.com\/laravel\/serializable-closure"},"time":"2025-10-09T13:42:30+00:00"},{"name":"league\/uri","version":"7.5.1","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/uri.git","reference":"81fb5145d2644324614cc532b28efd0215bda430"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/uri\/zipball\/81fb5145d2644324614cc532b28efd0215bda430","reference":"81fb5145d2644324614cc532b28efd0215bda430","shasum":""},"require":{"league\/uri-interfaces":"^7.5","php":"^8.1"},"conflict":{"league\/uri-schemes":"^1.0"},"suggest":{"ext-bcmath":"to improve IPV4 host parsing","ext-fileinfo":"to create Data URI from file contennts","ext-gmp":"to improve IPV4 host parsing","ext-intl":"to handle IDN host with the best performance","jeremykendall\/php-domain-parser":"to resolve Public Suffix and Top Level Domain","league\/uri-components":"Needed to easily manipulate URI objects components","php-64bit":"to improve IPV4 host parsing","symfony\/polyfill-intl-idn":"to handle IDN host via the Symfony polyfill if ext-intl is not present"},"type":"library","extra":{"branch-alias":{"dev-master":"7.x-dev"}},"autoload":{"psr-4":{"League\\Uri\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/nyamsprod.com"}],"description":"URI manipulation library","homepage":"https:\/\/uri.thephpleague.com","keywords":["data-uri","file-uri","ftp","hostname","http","https","middleware","parse_str","parse_url","psr-7","query-string","querystring","rfc3986","rfc3987","rfc6570","uri","uri-template","url","ws"],"support":{"docs":"https:\/\/uri.thephpleague.com","forum":"https:\/\/thephpleague.slack.com","issues":"https:\/\/github.com\/thephpleague\/uri-src\/issues","source":"https:\/\/github.com\/thephpleague\/uri\/tree\/7.5.1"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"time":"2024-12-08T08:40:02+00:00"},{"name":"league\/uri-interfaces","version":"7.5.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/uri-interfaces.git","reference":"08cfc6c4f3d811584fb09c37e2849e6a7f9b0742"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/uri-interfaces\/zipball\/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742","reference":"08cfc6c4f3d811584fb09c37e2849e6a7f9b0742","shasum":""},"require":{"ext-filter":"*","php":"^8.1","psr\/http-factory":"^1","psr\/http-message":"^1.1 || ^2.0"},"suggest":{"ext-bcmath":"to improve IPV4 host parsing","ext-gmp":"to improve IPV4 host parsing","ext-intl":"to handle IDN host with the best performance","php-64bit":"to improve IPV4 host parsing","symfony\/polyfill-intl-idn":"to handle IDN host via the Symfony polyfill if ext-intl is not present"},"type":"library","extra":{"branch-alias":{"dev-master":"7.x-dev"}},"autoload":{"psr-4":{"League\\Uri\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/nyamsprod.com"}],"description":"Common interfaces and classes for URI representation and interaction","homepage":"https:\/\/uri.thephpleague.com","keywords":["data-uri","file-uri","ftp","hostname","http","https","parse_str","parse_url","psr-7","query-string","querystring","rfc3986","rfc3987","rfc6570","uri","url","ws"],"support":{"docs":"https:\/\/uri.thephpleague.com","forum":"https:\/\/thephpleague.slack.com","issues":"https:\/\/github.com\/thephpleague\/uri-src\/issues","source":"https:\/\/github.com\/thephpleague\/uri-interfaces\/tree\/7.5.0"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"time":"2024-12-08T08:18:47+00:00"},{"name":"masterminds\/html5","version":"2.10.0","source":{"type":"git","url":"https:\/\/github.com\/Masterminds\/html5-php.git","reference":"fcf91eb64359852f00d921887b219479b4f21251"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Masterminds\/html5-php\/zipball\/fcf91eb64359852f00d921887b219479b4f21251","reference":"fcf91eb64359852f00d921887b219479b4f21251","shasum":""},"require":{"ext-dom":"*","php":">=5.3.0"},"require-dev":{"phpunit\/phpunit":"^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"},"type":"library","extra":{"branch-alias":{"dev-master":"2.7-dev"}},"autoload":{"psr-4":{"Masterminds\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Matt Butcher","email":"technosophos@gmail.com"},{"name":"Matt Farina","email":"matt@mattfarina.com"},{"name":"Asmir Mustafic","email":"goetas@gmail.com"}],"description":"An HTML5 parser and serializer.","homepage":"http:\/\/masterminds.github.io\/html5-php","keywords":["HTML5","dom","html","parser","querypath","serializer","xml"],"support":{"issues":"https:\/\/github.com\/Masterminds\/html5-php\/issues","source":"https:\/\/github.com\/Masterminds\/html5-php\/tree\/2.10.0"},"time":"2025-07-25T09:04:22+00:00"},{"name":"mikey179\/vfsstream","version":"v1.6.12","source":{"type":"git","url":"https:\/\/github.com\/bovigo\/vfsStream.git","reference":"fe695ec993e0a55c3abdda10a9364eb31c6f1bf0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/bovigo\/vfsStream\/zipball\/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0","reference":"fe695ec993e0a55c3abdda10a9364eb31c6f1bf0","shasum":""},"require":{"php":">=7.1.0"},"require-dev":{"phpunit\/phpunit":"^7.5||^8.5||^9.6","yoast\/phpunit-polyfills":"^2.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.6.x-dev"}},"autoload":{"psr-0":{"org\\bovigo\\vfs\\":"src\/main\/php"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Frank Kleine","homepage":"http:\/\/frankkleine.de\/","role":"Developer"}],"description":"Virtual file system to mock the real file system in unit tests.","homepage":"http:\/\/vfs.bovigo.org\/","support":{"issues":"https:\/\/github.com\/bovigo\/vfsStream\/issues","source":"https:\/\/github.com\/bovigo\/vfsStream\/tree\/master","wiki":"https:\/\/github.com\/bovigo\/vfsStream\/wiki"},"time":"2024-08-29T18:43:31+00:00"},{"name":"monolog\/monolog","version":"3.9.0","source":{"type":"git","url":"https:\/\/github.com\/Seldaek\/monolog.git","reference":"10d85740180ecba7896c87e06a166e0c95a0e3b6"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Seldaek\/monolog\/zipball\/10d85740180ecba7896c87e06a166e0c95a0e3b6","reference":"10d85740180ecba7896c87e06a166e0c95a0e3b6","shasum":""},"require":{"php":">=8.1","psr\/log":"^2.0 || ^3.0"},"provide":{"psr\/log-implementation":"3.0.0"},"require-dev":{"aws\/aws-sdk-php":"^3.0","doctrine\/couchdb":"~1.0@dev","elasticsearch\/elasticsearch":"^7 || ^8","ext-json":"*","graylog2\/gelf-php":"^1.4.2 || ^2.0","guzzlehttp\/guzzle":"^7.4.5","guzzlehttp\/psr7":"^2.2","mongodb\/mongodb":"^1.8","php-amqplib\/php-amqplib":"~2.4 || ^3","php-console\/php-console":"^3.1.8","phpstan\/phpstan":"^2","phpstan\/phpstan-deprecation-rules":"^2","phpstan\/phpstan-strict-rules":"^2","phpunit\/phpunit":"^10.5.17 || ^11.0.7","predis\/predis":"^1.1 || ^2","rollbar\/rollbar":"^4.0","ruflin\/elastica":"^7 || ^8","symfony\/mailer":"^5.4 || ^6","symfony\/mime":"^5.4 || ^6"},"suggest":{"aws\/aws-sdk-php":"Allow sending log messages to AWS services like DynamoDB","doctrine\/couchdb":"Allow sending log messages to a CouchDB server","elasticsearch\/elasticsearch":"Allow sending log messages to an Elasticsearch server via official client","ext-amqp":"Allow sending log messages to an AMQP server (1.0+ required)","ext-curl":"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler","ext-mbstring":"Allow to work properly with unicode symbols","ext-mongodb":"Allow sending log messages to a MongoDB server (via driver)","ext-openssl":"Required to send log messages using SSL","ext-sockets":"Allow sending log messages to a Syslog server (via UDP driver)","graylog2\/gelf-php":"Allow sending log messages to a GrayLog2 server","mongodb\/mongodb":"Allow sending log messages to a MongoDB server (via library)","php-amqplib\/php-amqplib":"Allow sending log messages to an AMQP server using php-amqplib","rollbar\/rollbar":"Allow sending log messages to Rollbar","ruflin\/elastica":"Allow sending log messages to an Elastic Search server"},"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"Monolog\\":"src\/Monolog"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"https:\/\/seld.be"}],"description":"Sends your logs to files, sockets, inboxes, databases and various web services","homepage":"https:\/\/github.com\/Seldaek\/monolog","keywords":["log","logging","psr-3"],"support":{"issues":"https:\/\/github.com\/Seldaek\/monolog\/issues","source":"https:\/\/github.com\/Seldaek\/monolog\/tree\/3.9.0"},"funding":[{"url":"https:\/\/github.com\/Seldaek","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/monolog\/monolog","type":"tidelift"}],"time":"2025-03-24T10:02:05+00:00"},{"name":"myclabs\/deep-copy","version":"1.13.4","source":{"type":"git","url":"https:\/\/github.com\/myclabs\/DeepCopy.git","reference":"07d290f0c47959fd5eed98c95ee5602db07e0b6a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/myclabs\/DeepCopy\/zipball\/07d290f0c47959fd5eed98c95ee5602db07e0b6a","reference":"07d290f0c47959fd5eed98c95ee5602db07e0b6a","shasum":""},"require":{"php":"^7.1 || ^8.0"},"conflict":{"doctrine\/collections":"<1.6.8","doctrine\/common":"<2.13.3 || >=3 <3.2.2"},"require-dev":{"doctrine\/collections":"^1.6.8","doctrine\/common":"^2.13.3 || ^3.2.2","phpspec\/prophecy":"^1.10","phpunit\/phpunit":"^7.5.20 || ^8.5.23 || ^9.5.13"},"type":"library","autoload":{"files":["src\/DeepCopy\/deep_copy.php"],"psr-4":{"DeepCopy\\":"src\/DeepCopy\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Create deep copies (clones) of your objects","keywords":["clone","copy","duplicate","object","object graph"],"support":{"issues":"https:\/\/github.com\/myclabs\/DeepCopy\/issues","source":"https:\/\/github.com\/myclabs\/DeepCopy\/tree\/1.13.4"},"funding":[{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/myclabs\/deep-copy","type":"tidelift"}],"time":"2025-08-01T08:46:24+00:00"},{"name":"nikic\/php-parser","version":"v5.6.2","source":{"type":"git","url":"https:\/\/github.com\/nikic\/PHP-Parser.git","reference":"3a454ca033b9e06b63282ce19562e892747449bb"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/nikic\/PHP-Parser\/zipball\/3a454ca033b9e06b63282ce19562e892747449bb","reference":"3a454ca033b9e06b63282ce19562e892747449bb","shasum":""},"require":{"ext-ctype":"*","ext-json":"*","ext-tokenizer":"*","php":">=7.4"},"require-dev":{"ircmaxell\/php-yacc":"^0.0.7","phpunit\/phpunit":"^9.0"},"bin":["bin\/php-parse"],"type":"library","extra":{"branch-alias":{"dev-master":"5.x-dev"}},"autoload":{"psr-4":{"PhpParser\\":"lib\/PhpParser"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Nikita Popov"}],"description":"A PHP parser written in PHP","keywords":["parser","php"],"support":{"issues":"https:\/\/github.com\/nikic\/PHP-Parser\/issues","source":"https:\/\/github.com\/nikic\/PHP-Parser\/tree\/v5.6.2"},"time":"2025-10-21T19:32:17+00:00"},{"name":"ondram\/ci-detector","version":"4.2.0","source":{"type":"git","url":"https:\/\/github.com\/OndraM\/ci-detector.git","reference":"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/OndraM\/ci-detector\/zipball\/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8","reference":"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8","shasum":""},"require":{"php":"^7.4 || ^8.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.13.2","lmc\/coding-standard":"^3.0.0","php-parallel-lint\/php-parallel-lint":"^1.2","phpstan\/extension-installer":"^1.1.0","phpstan\/phpstan":"^1.2.0","phpstan\/phpstan-phpunit":"^1.0.0","phpunit\/phpunit":"^9.6.13"},"type":"library","autoload":{"psr-4":{"OndraM\\CiDetector\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ond\u0159ej Machulda","email":"ondrej.machulda@gmail.com"}],"description":"Detect continuous integration environment and provide unified access to properties of current build","keywords":["CircleCI","Codeship","Wercker","adapter","appveyor","aws","aws codebuild","azure","azure devops","azure pipelines","bamboo","bitbucket","buddy","ci-info","codebuild","continuous integration","continuousphp","devops","drone","github","gitlab","interface","jenkins","pipelines","sourcehut","teamcity","travis"],"support":{"issues":"https:\/\/github.com\/OndraM\/ci-detector\/issues","source":"https:\/\/github.com\/OndraM\/ci-detector\/tree\/4.2.0"},"time":"2024-03-12T13:22:30+00:00"},{"name":"overtrue\/phplint","version":"9.6.2","source":{"type":"git","url":"https:\/\/github.com\/overtrue\/phplint.git","reference":"e2ebdbac93fa6ffe45d724e350f77df34c1f8fb4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/overtrue\/phplint\/zipball\/e2ebdbac93fa6ffe45d724e350f77df34c1f8fb4","reference":"e2ebdbac93fa6ffe45d724e350f77df34c1f8fb4","shasum":""},"require":{"composer-runtime-api":"^2.0","ext-dom":"*","ext-json":"*","ext-mbstring":"*","php":"^8.1","symfony\/cache":"^6.4 || ^7.0","symfony\/console":"^6.4 || ^7.0","symfony\/event-dispatcher":"^6.4 || ^7.0","symfony\/finder":"^6.4 || ^7.0","symfony\/options-resolver":"^6.4 || ^7.0","symfony\/process":"^6.4 || ^7.0","symfony\/yaml":"^6.4 || ^7.0"},"require-dev":{"bamarni\/composer-bin-plugin":"^1.4","brainmaestro\/composer-git-hooks":"^3.0.0","jetbrains\/phpstorm-stubs":"^2024.1","php-parallel-lint\/php-console-highlighter":"^1.0"},"bin":["bin\/phplint"],"type":"library","extra":{"hooks":{"pre-commit":["composer style:fix","composer code:check"]},"bamarni-bin":{"bin-links":true,"forward-command":true,"target-directory":"vendor-bin"},"branch-alias":{"dev-main":"9.6.x-dev"}},"autoload":{"psr-4":{"Overtrue\\PHPLint\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"overtrue","email":"anzhengchao@gmail.com"},{"name":"Laurent Laville","homepage":"https:\/\/github.com\/llaville"}],"description":"`phplint` is a tool that can speed up linting of php files by running several lint processes at once.","keywords":["check","lint","phplint","static analysis","syntax"],"support":{"issues":"https:\/\/github.com\/overtrue\/phplint\/issues","source":"https:\/\/github.com\/overtrue\/phplint\/tree\/9.6.2"},"funding":[{"url":"https:\/\/github.com\/overtrue","type":"github"}],"time":"2025-04-10T13:12:51+00:00"},{"name":"phar-io\/manifest","version":"2.0.4","source":{"type":"git","url":"https:\/\/github.com\/phar-io\/manifest.git","reference":"54750ef60c58e43759730615a392c31c80e23176"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phar-io\/manifest\/zipball\/54750ef60c58e43759730615a392c31c80e23176","reference":"54750ef60c58e43759730615a392c31c80e23176","shasum":""},"require":{"ext-dom":"*","ext-libxml":"*","ext-phar":"*","ext-xmlwriter":"*","phar-io\/version":"^3.0.1","php":"^7.2 || ^8.0"},"type":"library","extra":{"branch-alias":{"dev-master":"2.0.x-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Arne Blankerts","email":"arne@blankerts.de","role":"Developer"},{"name":"Sebastian Heuer","email":"sebastian@phpeople.de","role":"Developer"},{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"Developer"}],"description":"Component for reading phar.io manifest information from a PHP Archive (PHAR)","support":{"issues":"https:\/\/github.com\/phar-io\/manifest\/issues","source":"https:\/\/github.com\/phar-io\/manifest\/tree\/2.0.4"},"funding":[{"url":"https:\/\/github.com\/theseer","type":"github"}],"time":"2024-03-03T12:33:53+00:00"},{"name":"phar-io\/version","version":"3.2.1","source":{"type":"git","url":"https:\/\/github.com\/phar-io\/version.git","reference":"4f7fd7836c6f332bb2933569e566a0d6c4cbed74"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phar-io\/version\/zipball\/4f7fd7836c6f332bb2933569e566a0d6c4cbed74","reference":"4f7fd7836c6f332bb2933569e566a0d6c4cbed74","shasum":""},"require":{"php":"^7.2 || ^8.0"},"type":"library","autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Arne Blankerts","email":"arne@blankerts.de","role":"Developer"},{"name":"Sebastian Heuer","email":"sebastian@phpeople.de","role":"Developer"},{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"Developer"}],"description":"Library for handling version information and constraints","support":{"issues":"https:\/\/github.com\/phar-io\/version\/issues","source":"https:\/\/github.com\/phar-io\/version\/tree\/3.2.1"},"time":"2022-02-21T01:04:05+00:00"},{"name":"phpcompatibility\/php-compatibility","version":"10.0.0-alpha1","source":{"type":"git","url":"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility.git","reference":"de29923c98ce1d7d35df862c51d5dc0062c95401"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/PHPCompatibility\/PHPCompatibility\/zipball\/de29923c98ce1d7d35df862c51d5dc0062c95401","reference":"de29923c98ce1d7d35df862c51d5dc0062c95401","shasum":""},"require":{"php":">=5.4","phpcsstandards\/phpcsutils":"^1.1.2","squizlabs\/php_codesniffer":"^3.13.3 || ^4.0"},"replace":{"wimg\/php-compatibility":"*"},"require-dev":{"php-parallel-lint\/php-console-highlighter":"^1.0.0","php-parallel-lint\/php-parallel-lint":"^1.4.0","phpcsstandards\/phpcsdevcs":"^1.1.6","phpcsstandards\/phpcsdevtools":"^1.2.3","phpunit\/phpunit":"^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4 || ^10.5.32 || ^11.3.3","yoast\/phpunit-polyfills":"^1.1.5 || ^2.0.5 || ^3.1.0"},"suggest":{"roave\/security-advisories":"dev-master || Helps prevent installing dependencies with known security issues."},"type":"phpcodesniffer-standard","extra":{"branch-alias":{"dev-master":"9.x-dev","dev-develop":"10.x-dev"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["LGPL-3.0-or-later"],"authors":[{"name":"Wim Godden","homepage":"https:\/\/github.com\/wimg","role":"lead"},{"name":"Juliette Reinders Folmer","homepage":"https:\/\/github.com\/jrfnl","role":"lead"},{"name":"Contributors","homepage":"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility\/graphs\/contributors"}],"description":"A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.","homepage":"https:\/\/techblog.wimgodden.be\/tag\/codesniffer\/","keywords":["compatibility","phpcs","standards","static analysis"],"support":{"issues":"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility\/issues","security":"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility\/security\/policy","source":"https:\/\/github.com\/PHPCompatibility\/PHPCompatibility"},"funding":[{"url":"https:\/\/github.com\/PHPCompatibility","type":"github"},{"url":"https:\/\/github.com\/jrfnl","type":"github"},{"url":"https:\/\/opencollective.com\/php_codesniffer","type":"open_collective"},{"url":"https:\/\/thanks.dev\/u\/gh\/phpcompatibility","type":"thanks_dev"}],"time":"2025-10-20T21:11:54+00:00"},{"name":"phpcsstandards\/phpcsutils","version":"1.1.3","source":{"type":"git","url":"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils.git","reference":"8b8e17615d04f2fc2cd46fc1d2fd888fa21b3cf9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/PHPCSStandards\/PHPCSUtils\/zipball\/8b8e17615d04f2fc2cd46fc1d2fd888fa21b3cf9","reference":"8b8e17615d04f2fc2cd46fc1d2fd888fa21b3cf9","shasum":""},"require":{"dealerdirect\/phpcodesniffer-composer-installer":"^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0","php":">=5.4","squizlabs\/php_codesniffer":"^3.13.3 || ^4.0"},"require-dev":{"ext-filter":"*","php-parallel-lint\/php-console-highlighter":"^1.0","php-parallel-lint\/php-parallel-lint":"^1.4.0","phpcsstandards\/phpcsdevcs":"^1.1.6","yoast\/phpunit-polyfills":"^1.1.0 || ^2.0.0 || ^3.0.0"},"type":"phpcodesniffer-standard","extra":{"branch-alias":{"dev-stable":"1.x-dev","dev-develop":"1.x-dev"}},"autoload":{"classmap":["PHPCSUtils\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["LGPL-3.0-or-later"],"authors":[{"name":"Juliette Reinders Folmer","homepage":"https:\/\/github.com\/jrfnl","role":"lead"},{"name":"Contributors","homepage":"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils\/graphs\/contributors"}],"description":"A suite of utility functions for use with PHP_CodeSniffer","homepage":"https:\/\/phpcsutils.com\/","keywords":["PHP_CodeSniffer","phpcbf","phpcodesniffer-standard","phpcs","phpcs3","phpcs4","standards","static analysis","tokens","utility"],"support":{"docs":"https:\/\/phpcsutils.com\/","issues":"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils\/issues","security":"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils\/security\/policy","source":"https:\/\/github.com\/PHPCSStandards\/PHPCSUtils"},"funding":[{"url":"https:\/\/github.com\/PHPCSStandards","type":"github"},{"url":"https:\/\/github.com\/jrfnl","type":"github"},{"url":"https:\/\/opencollective.com\/php_codesniffer","type":"open_collective"},{"url":"https:\/\/thanks.dev\/u\/gh\/phpcsstandards","type":"thanks_dev"}],"time":"2025-10-16T16:39:32+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-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"],"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":"5.6.4","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock.git","reference":"90a04bcbf03784066f16038e87e23a0a83cee3c2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/ReflectionDocBlock\/zipball\/90a04bcbf03784066f16038e87e23a0a83cee3c2","reference":"90a04bcbf03784066f16038e87e23a0a83cee3c2","shasum":""},"require":{"doctrine\/deprecations":"^1.1","ext-filter":"*","php":"^7.4 || ^8.0","phpdocumentor\/reflection-common":"^2.2","phpdocumentor\/type-resolver":"^1.7","phpstan\/phpdoc-parser":"^1.7|^2.0","webmozart\/assert":"^1.9.1"},"require-dev":{"mockery\/mockery":"~1.3.5 || ~1.6.0","phpstan\/extension-installer":"^1.1","phpstan\/phpstan":"^1.8","phpstan\/phpstan-mockery":"^1.1","phpstan\/phpstan-webmozart-assert":"^1.2","phpunit\/phpunit":"^9.5","psalm\/phar":"^5.26"},"type":"library","extra":{"branch-alias":{"dev-master":"5.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"},{"name":"Jaap van Otterdijk","email":"opensource@ijaap.nl"}],"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\/5.6.4"},"time":"2025-11-17T21:13:10+00:00"},{"name":"phpdocumentor\/type-resolver","version":"1.11.1","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/TypeResolver.git","reference":"f626740b38009078de0dc8b2b9dc4e7f749c6eba"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/TypeResolver\/zipball\/f626740b38009078de0dc8b2b9dc4e7f749c6eba","reference":"f626740b38009078de0dc8b2b9dc4e7f749c6eba","shasum":""},"require":{"doctrine\/deprecations":"^1.0","php":"^7.3 || ^8.0","phpdocumentor\/reflection-common":"^2.0","phpstan\/phpdoc-parser":"^1.18|^2.0"},"require-dev":{"ext-tokenizer":"*","phpbench\/phpbench":"^1.2","phpstan\/extension-installer":"^1.1","phpstan\/phpstan":"^1.8","phpstan\/phpstan-phpunit":"^1.1","phpunit\/phpunit":"^9.5","rector\/rector":"^0.13.9","vimeo\/psalm":"^4.25"},"type":"library","extra":{"branch-alias":{"dev-1.x":"1.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"}],"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.11.1"},"time":"2025-11-21T11:31:57+00:00"},{"name":"phpro\/grumphp","version":"v2.17.0","source":{"type":"git","url":"https:\/\/github.com\/phpro\/grumphp.git","reference":"638bbff4cb196e6e7702a74a4ffe15fed5191264"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpro\/grumphp\/zipball\/638bbff4cb196e6e7702a74a4ffe15fed5191264","reference":"638bbff4cb196e6e7702a74a4ffe15fed5191264","shasum":""},"require":{"amphp\/amp":"^3.0","amphp\/parallel":"^2.1","composer-plugin-api":"^2.0","doctrine\/collections":"^1.6.8 || ^2.0","ext-json":"*","gitonomy\/gitlib":"^1.3","laravel\/serializable-closure":"^2.0","monolog\/monolog":"^2.0 || ^3.0","ondram\/ci-detector":"^4.0","php":"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0","psr\/container":"^1.1 || ^2.0","seld\/jsonlint":"^1.8","symfony\/config":"^5.4 || ^6.0 || ^7.0","symfony\/console":"^5.4 || ^6.0 || ^7.0","symfony\/dependency-injection":"^5.4 || ^6.0 || ^7.0","symfony\/dotenv":"^5.4 || ^6.0 || ^7.0","symfony\/event-dispatcher":"^5.4 || ^6.0 || ^7.0","symfony\/expression-language":"^5.4 || ^6.0 || ^7.0","symfony\/filesystem":"^5.4 || ^6.0 || ^7.0","symfony\/finder":"^5.4 || ^6.0 || ^7.0","symfony\/options-resolver":"^5.4 || ^6.0 || ^7.0","symfony\/process":"^5.4 || ^6.0 || ^7.0","symfony\/yaml":"^5.4 || ^6.0 || ^7.0"},"require-dev":{"brianium\/paratest":"^7.8","composer\/composer":"^2.2.6","nikic\/php-parser":"^5.0","php-cs-fixer\/shim":"^3.88","php-parallel-lint\/php-parallel-lint":"^1.3","phpspec\/phpspec":"^8.0","phpspec\/prophecy":"^1.23","phpspec\/prophecy-phpunit":"^2.4","phpunit\/phpunit":"^11.5"},"suggest":{"atoum\/atoum":"Lets GrumPHP run your unit tests.","behat\/behat":"Lets GrumPHP validate your project features.","brianium\/paratest":"Lets GrumPHP run PHPUnit in parallel.","codeception\/codeception":"Lets GrumPHP run your project's full stack tests","consolidation\/robo":"Lets GrumPHP run your automated PHP tasks.","designsecurity\/progpilot":"Lets GrumPHP be sure that there are no vulnerabilities in your code.","doctrine\/orm":"Lets GrumPHP validate your Doctrine mapping files.","enlightn\/security-checker":"Lets GrumPHP be sure that there are no known security issues.","ergebnis\/composer-normalize":"Lets GrumPHP tidy and normalize your composer.json file.","friendsofphp\/php-cs-fixer":"Lets GrumPHP automatically fix your codestyle.","friendsoftwig\/twigcs":"Lets GrumPHP check Twig coding standard.","infection\/infection":"Lets GrumPHP evaluate the quality your unit tests","maglnet\/composer-require-checker":"Lets GrumPHP analyze composer dependencies.","malukenho\/kawaii-gherkin":"Lets GrumPHP lint your Gherkin files.","nette\/tester":"Lets GrumPHP run your unit tests with nette tester.","nikic\/php-parser":"Lets GrumPHP run static analyses through your PHP files.","pestphp\/pest":"Lets GrumPHP run your unit test with Pest PHP","phan\/phan":"Lets GrumPHP unleash a static analyzer on your code","phing\/phing":"Lets GrumPHP run your automated PHP tasks.","php-parallel-lint\/php-parallel-lint":"Lets GrumPHP quickly lint your entire code base.","phparkitect\/phparkitect":"Let GrumPHP keep your codebase coherent and solid, by permitting to add some architectural constraint check to your workflow.","phpmd\/phpmd":"Lets GrumPHP sort out the mess in your code","phpspec\/phpspec":"Lets GrumPHP spec your code.","phpstan\/phpstan":"Lets GrumPHP discover bugs in your code without running it.","phpunit\/phpunit":"Lets GrumPHP run your unit tests.","povils\/phpmnd":"Lets GrumPHP help you detect magic numbers in PHP code.","rector\/rector ":"Lets GrumPHP instantly upgrade and automatically refactor your PHP code.","roave\/security-advisories":"Lets GrumPHP be sure that there are no known security issues.","sebastian\/phpcpd":"Lets GrumPHP find duplicated code.","squizlabs\/php_codesniffer":"Lets GrumPHP sniff on your code.","sstalle\/php7cc":"Lets GrumPHP check PHP 5.3 - 5.6 code compatibility with PHP 7.","symfony\/phpunit-bridge":"Lets GrumPHP run your unit tests with the phpunit-bridge of Symfony.","symplify\/easy-coding-standard":"Lets GrumPHP check coding standard.","vimeo\/psalm":"Lets GrumPHP discover errors in your code without running it.","vincentlanglet\/twig-cs-fixer":"Lets GrumPHP check and fix twig coding standard."},"bin":["bin\/grumphp"],"type":"composer-plugin","extra":{"class":"GrumPHP\\Composer\\GrumPHPPlugin"},"autoload":{"psr-4":{"GrumPHP\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Toon Verwerft","email":"toon.verwerft@phpro.be"},{"name":"Community","homepage":"https:\/\/github.com\/phpro\/grumphp\/graphs\/contributors"}],"description":"A composer plugin that enables source code quality checks.","support":{"issues":"https:\/\/github.com\/phpro\/grumphp\/issues","source":"https:\/\/github.com\/phpro\/grumphp\/tree\/v2.17.0"},"time":"2025-10-21T07:00:26+00:00"},{"name":"phpspec\/prophecy","version":"v1.24.0","source":{"type":"git","url":"https:\/\/github.com\/phpspec\/prophecy.git","reference":"a24f1bda2d00a03877f7f99d9e6b150baf543f6d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpspec\/prophecy\/zipball\/a24f1bda2d00a03877f7f99d9e6b150baf543f6d","reference":"a24f1bda2d00a03877f7f99d9e6b150baf543f6d","shasum":""},"require":{"doctrine\/instantiator":"^1.2 || ^2.0","php":"8.2.* || 8.3.* || 8.4.* || 8.5.*","phpdocumentor\/reflection-docblock":"^5.2","sebastian\/comparator":"^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0","sebastian\/recursion-context":"^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0","symfony\/deprecation-contracts":"^2.5 || ^3.1"},"require-dev":{"friendsofphp\/php-cs-fixer":"^3.88","phpspec\/phpspec":"^6.0 || ^7.0 || ^8.0","phpstan\/phpstan":"^2.1.13","phpunit\/phpunit":"^11.0 || ^12.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Prophecy\\":"src\/Prophecy"}},"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","dev","fake","mock","spy","stub"],"support":{"issues":"https:\/\/github.com\/phpspec\/prophecy\/issues","source":"https:\/\/github.com\/phpspec\/prophecy\/tree\/v1.24.0"},"time":"2025-11-21T13:10:52+00:00"},{"name":"phpspec\/prophecy-phpunit","version":"v2.4.0","source":{"type":"git","url":"https:\/\/github.com\/phpspec\/prophecy-phpunit.git","reference":"d3c28041d9390c9bca325a08c5b2993ac855bded"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpspec\/prophecy-phpunit\/zipball\/d3c28041d9390c9bca325a08c5b2993ac855bded","reference":"d3c28041d9390c9bca325a08c5b2993ac855bded","shasum":""},"require":{"php":"^7.3 || ^8","phpspec\/prophecy":"^1.18","phpunit\/phpunit":"^9.1 || ^10.1 || ^11.0 || ^12.0"},"require-dev":{"phpstan\/phpstan":"^1.10"},"type":"library","extra":{"branch-alias":{"dev-master":"2.x-dev"}},"autoload":{"psr-4":{"Prophecy\\PhpUnit\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Christophe Coevoet","email":"stof@notk.org"}],"description":"Integrating the Prophecy mocking library in PHPUnit test cases","homepage":"http:\/\/phpspec.net","keywords":["phpunit","prophecy"],"support":{"issues":"https:\/\/github.com\/phpspec\/prophecy-phpunit\/issues","source":"https:\/\/github.com\/phpspec\/prophecy-phpunit\/tree\/v2.4.0"},"time":"2025-05-13T13:52:32+00:00"},{"name":"phpstan\/extension-installer","version":"1.4.3","source":{"type":"git","url":"https:\/\/github.com\/phpstan\/extension-installer.git","reference":"85e90b3942d06b2326fba0403ec24fe912372936"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpstan\/extension-installer\/zipball\/85e90b3942d06b2326fba0403ec24fe912372936","reference":"85e90b3942d06b2326fba0403ec24fe912372936","shasum":""},"require":{"composer-plugin-api":"^2.0","php":"^7.2 || ^8.0","phpstan\/phpstan":"^1.9.0 || ^2.0"},"require-dev":{"composer\/composer":"^2.0","php-parallel-lint\/php-parallel-lint":"^1.2.0","phpstan\/phpstan-strict-rules":"^0.11 || ^0.12 || ^1.0"},"type":"composer-plugin","extra":{"class":"PHPStan\\ExtensionInstaller\\Plugin"},"autoload":{"psr-4":{"PHPStan\\ExtensionInstaller\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Composer plugin for automatic installation of PHPStan extensions","keywords":["dev","static analysis"],"support":{"issues":"https:\/\/github.com\/phpstan\/extension-installer\/issues","source":"https:\/\/github.com\/phpstan\/extension-installer\/tree\/1.4.3"},"time":"2024-09-04T20:21:43+00:00"},{"name":"phpstan\/phpdoc-parser","version":"2.3.0","source":{"type":"git","url":"https:\/\/github.com\/phpstan\/phpdoc-parser.git","reference":"1e0cd5370df5dd2e556a36b9c62f62e555870495"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/1e0cd5370df5dd2e556a36b9c62f62e555870495","reference":"1e0cd5370df5dd2e556a36b9c62f62e555870495","shasum":""},"require":{"php":"^7.4 || ^8.0"},"require-dev":{"doctrine\/annotations":"^2.0","nikic\/php-parser":"^5.3.0","php-parallel-lint\/php-parallel-lint":"^1.2","phpstan\/extension-installer":"^1.0","phpstan\/phpstan":"^2.0","phpstan\/phpstan-phpunit":"^2.0","phpstan\/phpstan-strict-rules":"^2.0","phpunit\/phpunit":"^9.6","symfony\/process":"^5.2"},"type":"library","autoload":{"psr-4":{"PHPStan\\PhpDocParser\\":["src\/"]}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"PHPDoc parser with support for nullable, intersection and generic types","support":{"issues":"https:\/\/github.com\/phpstan\/phpdoc-parser\/issues","source":"https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/2.3.0"},"time":"2025-08-30T15:50:23+00:00"},{"name":"phpstan\/phpstan","version":"1.12.32","dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpstan\/phpstan\/zipball\/2770dcdf5078d0b0d53f94317e06affe88419aa8","reference":"2770dcdf5078d0b0d53f94317e06affe88419aa8","shasum":""},"require":{"php":"^7.2|^8.0"},"conflict":{"phpstan\/phpstan-shim":"*"},"bin":["phpstan","phpstan.phar"],"type":"library","autoload":{"files":["bootstrap.php"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"PHPStan - PHP Static Analysis Tool","keywords":["dev","static analysis"],"support":{"docs":"https:\/\/phpstan.org\/user-guide\/getting-started","forum":"https:\/\/github.com\/phpstan\/phpstan\/discussions","issues":"https:\/\/github.com\/phpstan\/phpstan\/issues","security":"https:\/\/github.com\/phpstan\/phpstan\/security\/policy","source":"https:\/\/github.com\/phpstan\/phpstan-src"},"funding":[{"url":"https:\/\/github.com\/ondrejmirtes","type":"github"},{"url":"https:\/\/github.com\/phpstan","type":"github"}],"time":"2025-09-30T10:16:31+00:00"},{"name":"phpstan\/phpstan-deprecation-rules","version":"1.2.1","source":{"type":"git","url":"https:\/\/github.com\/phpstan\/phpstan-deprecation-rules.git","reference":"f94d246cc143ec5a23da868f8f7e1393b50eaa82"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpstan\/phpstan-deprecation-rules\/zipball\/f94d246cc143ec5a23da868f8f7e1393b50eaa82","reference":"f94d246cc143ec5a23da868f8f7e1393b50eaa82","shasum":""},"require":{"php":"^7.2 || ^8.0","phpstan\/phpstan":"^1.12"},"require-dev":{"php-parallel-lint\/php-parallel-lint":"^1.2","phpstan\/phpstan-phpunit":"^1.0","phpunit\/phpunit":"^9.5"},"type":"phpstan-extension","extra":{"phpstan":{"includes":["rules.neon"]}},"autoload":{"psr-4":{"PHPStan\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.","support":{"issues":"https:\/\/github.com\/phpstan\/phpstan-deprecation-rules\/issues","source":"https:\/\/github.com\/phpstan\/phpstan-deprecation-rules\/tree\/1.2.1"},"time":"2024-09-11T15:52:35+00:00"},{"name":"phpunit\/php-code-coverage","version":"11.0.11","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/php-code-coverage.git","reference":"4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/php-code-coverage\/zipball\/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4","reference":"4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4","shasum":""},"require":{"ext-dom":"*","ext-libxml":"*","ext-xmlwriter":"*","nikic\/php-parser":"^5.4.0","php":">=8.2","phpunit\/php-file-iterator":"^5.1.0","phpunit\/php-text-template":"^4.0.1","sebastian\/code-unit-reverse-lookup":"^4.0.1","sebastian\/complexity":"^4.0.1","sebastian\/environment":"^7.2.0","sebastian\/lines-of-code":"^3.0.1","sebastian\/version":"^5.0.2","theseer\/tokenizer":"^1.2.3"},"require-dev":{"phpunit\/phpunit":"^11.5.2"},"suggest":{"ext-pcov":"PHP extension that provides line coverage","ext-xdebug":"PHP extension that provides line coverage as well as branch and path coverage"},"type":"library","extra":{"branch-alias":{"dev-main":"11.0.x-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Library that provides collection, processing, and rendering functionality for PHP code coverage information.","homepage":"https:\/\/github.com\/sebastianbergmann\/php-code-coverage","keywords":["coverage","testing","xunit"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/php-code-coverage\/issues","security":"https:\/\/github.com\/sebastianbergmann\/php-code-coverage\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/php-code-coverage\/tree\/11.0.11"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/phpunit\/php-code-coverage","type":"tidelift"}],"time":"2025-08-27T14:37:49+00:00"},{"name":"phpunit\/php-file-iterator","version":"5.1.0","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/php-file-iterator.git","reference":"118cfaaa8bc5aef3287bf315b6060b1174754af6"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/php-file-iterator\/zipball\/118cfaaa8bc5aef3287bf315b6060b1174754af6","reference":"118cfaaa8bc5aef3287bf315b6060b1174754af6","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"5.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"FilterIterator implementation that filters files based on a list of suffixes.","homepage":"https:\/\/github.com\/sebastianbergmann\/php-file-iterator\/","keywords":["filesystem","iterator"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/php-file-iterator\/issues","security":"https:\/\/github.com\/sebastianbergmann\/php-file-iterator\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/php-file-iterator\/tree\/5.1.0"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-08-27T05:02:59+00:00"},{"name":"phpunit\/php-invoker","version":"5.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/php-invoker.git","reference":"c1ca3814734c07492b3d4c5f794f4b0995333da2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/php-invoker\/zipball\/c1ca3814734c07492b3d4c5f794f4b0995333da2","reference":"c1ca3814734c07492b3d4c5f794f4b0995333da2","shasum":""},"require":{"php":">=8.2"},"require-dev":{"ext-pcntl":"*","phpunit\/phpunit":"^11.0"},"suggest":{"ext-pcntl":"*"},"type":"library","extra":{"branch-alias":{"dev-main":"5.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Invoke callables with a timeout","homepage":"https:\/\/github.com\/sebastianbergmann\/php-invoker\/","keywords":["process"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/php-invoker\/issues","security":"https:\/\/github.com\/sebastianbergmann\/php-invoker\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/php-invoker\/tree\/5.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T05:07:44+00:00"},{"name":"phpunit\/php-text-template","version":"4.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/php-text-template.git","reference":"3e0404dc6b300e6bf56415467ebcb3fe4f33e964"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/php-text-template\/zipball\/3e0404dc6b300e6bf56415467ebcb3fe4f33e964","reference":"3e0404dc6b300e6bf56415467ebcb3fe4f33e964","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"4.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Simple template engine.","homepage":"https:\/\/github.com\/sebastianbergmann\/php-text-template\/","keywords":["template"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/php-text-template\/issues","security":"https:\/\/github.com\/sebastianbergmann\/php-text-template\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/php-text-template\/tree\/4.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T05:08:43+00:00"},{"name":"phpunit\/php-timer","version":"7.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/php-timer.git","reference":"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/php-timer\/zipball\/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3","reference":"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"7.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Utility class for timing","homepage":"https:\/\/github.com\/sebastianbergmann\/php-timer\/","keywords":["timer"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/php-timer\/issues","security":"https:\/\/github.com\/sebastianbergmann\/php-timer\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/php-timer\/tree\/7.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T05:09:35+00:00"},{"name":"phpunit\/phpunit","version":"11.5.42","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/phpunit.git","reference":"1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/phpunit\/zipball\/1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c","reference":"1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c","shasum":""},"require":{"ext-dom":"*","ext-json":"*","ext-libxml":"*","ext-mbstring":"*","ext-xml":"*","ext-xmlwriter":"*","myclabs\/deep-copy":"^1.13.4","phar-io\/manifest":"^2.0.4","phar-io\/version":"^3.2.1","php":">=8.2","phpunit\/php-code-coverage":"^11.0.11","phpunit\/php-file-iterator":"^5.1.0","phpunit\/php-invoker":"^5.0.1","phpunit\/php-text-template":"^4.0.1","phpunit\/php-timer":"^7.0.1","sebastian\/cli-parser":"^3.0.2","sebastian\/code-unit":"^3.0.3","sebastian\/comparator":"^6.3.2","sebastian\/diff":"^6.0.2","sebastian\/environment":"^7.2.1","sebastian\/exporter":"^6.3.2","sebastian\/global-state":"^7.0.2","sebastian\/object-enumerator":"^6.0.1","sebastian\/type":"^5.1.3","sebastian\/version":"^5.0.2","staabm\/side-effects-detector":"^1.0.5"},"suggest":{"ext-soap":"To be able to generate mocks based on WSDL files"},"bin":["phpunit"],"type":"library","extra":{"branch-alias":{"dev-main":"11.5-dev"}},"autoload":{"files":["src\/Framework\/Assert\/Functions.php"],"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"The PHP Unit Testing framework.","homepage":"https:\/\/phpunit.de\/","keywords":["phpunit","testing","xunit"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/phpunit\/issues","security":"https:\/\/github.com\/sebastianbergmann\/phpunit\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/phpunit\/tree\/11.5.42"},"funding":[{"url":"https:\/\/phpunit.de\/sponsors.html","type":"custom"},{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/phpunit\/phpunit","type":"tidelift"}],"time":"2025-09-28T12:09:13+00:00"},{"name":"psr\/clock","version":"1.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/clock.git","reference":"e41a24703d4560fd0acb709162f73b8adfc3aa0d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/clock\/zipball\/e41a24703d4560fd0acb709162f73b8adfc3aa0d","reference":"e41a24703d4560fd0acb709162f73b8adfc3aa0d","shasum":""},"require":{"php":"^7.0 || ^8.0"},"type":"library","autoload":{"psr-4":{"Psr\\Clock\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for reading the clock.","homepage":"https:\/\/github.com\/php-fig\/clock","keywords":["clock","now","psr","psr-20","time"],"support":{"issues":"https:\/\/github.com\/php-fig\/clock\/issues","source":"https:\/\/github.com\/php-fig\/clock\/tree\/1.0.0"},"time":"2022-11-25T14:36:26+00:00"},{"name":"psr\/simple-cache","version":"3.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/simple-cache.git","reference":"764e0b3939f5ca87cb904f570ef9be2d78a07865"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/simple-cache\/zipball\/764e0b3939f5ca87cb904f570ef9be2d78a07865","reference":"764e0b3939f5ca87cb904f570ef9be2d78a07865","shasum":""},"require":{"php":">=8.0.0"},"type":"library","extra":{"branch-alias":{"dev-master":"3.0.x-dev"}},"autoload":{"psr-4":{"Psr\\SimpleCache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interfaces for simple caching","keywords":["cache","caching","psr","psr-16","simple-cache"],"support":{"source":"https:\/\/github.com\/php-fig\/simple-cache\/tree\/3.0.0"},"time":"2021-10-29T13:26:27+00:00"},{"name":"revolt\/event-loop","version":"v1.0.7","source":{"type":"git","url":"https:\/\/github.com\/revoltphp\/event-loop.git","reference":"09bf1bf7f7f574453efe43044b06fafe12216eb3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/revoltphp\/event-loop\/zipball\/09bf1bf7f7f574453efe43044b06fafe12216eb3","reference":"09bf1bf7f7f574453efe43044b06fafe12216eb3","shasum":""},"require":{"php":">=8.1"},"require-dev":{"ext-json":"*","jetbrains\/phpstorm-stubs":"^2019.3","phpunit\/phpunit":"^9","psalm\/phar":"^5.15"},"type":"library","extra":{"branch-alias":{"dev-main":"1.x-dev"}},"autoload":{"psr-4":{"Revolt\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Aaron Piotrowski","email":"aaron@trowski.com"},{"name":"Cees-Jan Kiewiet","email":"ceesjank@gmail.com"},{"name":"Christian L\u00fcck","email":"christian@clue.engineering"},{"name":"Niklas Keller","email":"me@kelunik.com"}],"description":"Rock-solid event loop for concurrent PHP applications.","keywords":["async","asynchronous","concurrency","event","event-loop","non-blocking","scheduler"],"support":{"issues":"https:\/\/github.com\/revoltphp\/event-loop\/issues","source":"https:\/\/github.com\/revoltphp\/event-loop\/tree\/v1.0.7"},"time":"2025-01-25T19:27:39+00:00"},{"name":"sanmai\/di-container","version":"0.1.5","source":{"type":"git","url":"https:\/\/github.com\/sanmai\/di-container.git","reference":"355534ad7970fc7dab4211ecaf2da5c546855ee8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sanmai\/di-container\/zipball\/355534ad7970fc7dab4211ecaf2da5c546855ee8","reference":"355534ad7970fc7dab4211ecaf2da5c546855ee8","shasum":""},"require":{"php":">=8.2","psr\/container":"^1.1.2 || ^2.0","sanmai\/pipeline":"^6.17 || ^7.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.8","friendsofphp\/php-cs-fixer":"^3.17","infection\/infection":">=0.29","php-coveralls\/php-coveralls":"^2.4.1","phpstan\/extension-installer":"^1.4","phpunit\/phpunit":"^11.5.25","sanmai\/phpstan-rules":"^0.3.10"},"type":"library","extra":{"preferred-install":"dist"},"autoload":{"psr-4":{"DIContainer\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Alexey Kopytko","email":"alexey@kopytko.com","homepage":"https:\/\/github.com\/sanmai"},{"name":"Maks Rafalko","homepage":"https:\/\/twitter.com\/maks_rafalko"},{"name":"Th\u00e9o FIDRY","homepage":"https:\/\/twitter.com\/tfidry"}],"description":"dependency injection container with automatic constructor dependency resolution","keywords":["Autowiring","constructor di","di container","psr 11"],"support":{"issues":"https:\/\/github.com\/sanmai\/di-container\/issues","source":"https:\/\/github.com\/sanmai\/di-container\/tree\/0.1.5"},"funding":[{"url":"https:\/\/github.com\/sanmai","type":"github"}],"time":"2025-08-04T09:43:58+00:00"},{"name":"sanmai\/duoclock","version":"0.1.1","source":{"type":"git","url":"https:\/\/github.com\/sanmai\/DuoClock.git","reference":"30aa40092396dc96b68c8e8d49162619574477e2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sanmai\/DuoClock\/zipball\/30aa40092396dc96b68c8e8d49162619574477e2","reference":"30aa40092396dc96b68c8e8d49162619574477e2","shasum":""},"require":{"php":">=8.2","psr\/clock":"^1.0"},"provide":{"psr\/clock-implementation":"1.0"},"require-dev":{"ergebnis\/composer-normalize":"^2.8","friendsofphp\/php-cs-fixer":"^3.17","infection\/infection":">=0.29","php-coveralls\/php-coveralls":"^2.4.1","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2","phpunit\/phpunit":"^11.5.25","sanmai\/phpstan-rules":"^0.3.1","vimeo\/psalm":"^6.12"},"type":"library","extra":{"preferred-install":"dist"},"autoload":{"psr-4":{"DuoClock\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["Apache-2.0"],"authors":[{"name":"Alexey Kopytko","email":"alexey@kopytko.com"}],"description":"PHP time mocking for tests - PSR-20 clock with mockable sleep(), time(), and TimeSpy for PHPUnit testing","support":{"issues":"https:\/\/github.com\/sanmai\/DuoClock\/issues","source":"https:\/\/github.com\/sanmai\/DuoClock\/tree\/0.1.1"},"funding":[{"url":"https:\/\/github.com\/sanmai","type":"github"}],"time":"2025-07-28T02:17:28+00:00"},{"name":"sanmai\/later","version":"0.1.7","source":{"type":"git","url":"https:\/\/github.com\/sanmai\/later.git","reference":"72a82d783864bca90412d8a26c1878f8981fee97"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sanmai\/later\/zipball\/72a82d783864bca90412d8a26c1878f8981fee97","reference":"72a82d783864bca90412d8a26c1878f8981fee97","shasum":""},"require":{"php":">=8.2"},"require-dev":{"ergebnis\/composer-normalize":"^2.8","friendsofphp\/php-cs-fixer":"^3.35.1","infection\/infection":">=0.27.6","phan\/phan":">=2","php-coveralls\/php-coveralls":"^2.0","phpstan\/phpstan":">=1.4.5","phpunit\/phpunit":">=9.5 <10","vimeo\/psalm":">=2"},"type":"library","extra":{"branch-alias":{"dev-main":"0.1.x-dev"}},"autoload":{"files":["src\/functions.php"],"psr-4":{"Later\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["Apache-2.0"],"authors":[{"name":"Alexey Kopytko","email":"alexey@kopytko.com"}],"description":"Later: deferred wrapper object","support":{"issues":"https:\/\/github.com\/sanmai\/later\/issues","source":"https:\/\/github.com\/sanmai\/later\/tree\/0.1.7"},"funding":[{"url":"https:\/\/github.com\/sanmai","type":"github"}],"time":"2025-05-11T01:48:00+00:00"},{"name":"sanmai\/pipeline","version":"7.4","source":{"type":"git","url":"https:\/\/github.com\/sanmai\/pipeline.git","reference":"6a73545f09b9b475a3735ecdee5e98476a063179"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sanmai\/pipeline\/zipball\/6a73545f09b9b475a3735ecdee5e98476a063179","reference":"6a73545f09b9b475a3735ecdee5e98476a063179","shasum":""},"require":{"php":">=8.2"},"require-dev":{"ergebnis\/composer-normalize":"^2.8","esi\/phpunit-coverage-check":">2","friendsofphp\/php-cs-fixer":"^3.17","infection\/infection":">=0.30.3","league\/pipeline":"^0.3 || ^1.0","php-coveralls\/php-coveralls":"^2.4.1","phpstan\/extension-installer":"^1.4","phpstan\/phpstan":"^2","phpunit\/phpunit":">=9.4 <12","sanmai\/phpstan-rules":"^0.3.11","sanmai\/phpunit-double-colon-syntax":"^0.1.1","vimeo\/psalm":">=2"},"type":"library","extra":{"branch-alias":{"dev-main":"v6.x-dev"}},"autoload":{"files":["src\/functions.php"],"psr-4":{"Pipeline\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["Apache-2.0"],"authors":[{"name":"Alexey Kopytko","email":"alexey@kopytko.com"}],"description":"General-purpose collections pipeline","support":{"issues":"https:\/\/github.com\/sanmai\/pipeline\/issues","source":"https:\/\/github.com\/sanmai\/pipeline\/tree\/7.4"},"funding":[{"url":"https:\/\/github.com\/sanmai","type":"github"}],"time":"2025-10-11T07:22:29+00:00"},{"name":"sebastian\/cli-parser","version":"3.0.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/cli-parser.git","reference":"15c5dd40dc4f38794d383bb95465193f5e0ae180"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/cli-parser\/zipball\/15c5dd40dc4f38794d383bb95465193f5e0ae180","reference":"15c5dd40dc4f38794d383bb95465193f5e0ae180","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"3.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Library for parsing CLI options","homepage":"https:\/\/github.com\/sebastianbergmann\/cli-parser","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/cli-parser\/issues","security":"https:\/\/github.com\/sebastianbergmann\/cli-parser\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/cli-parser\/tree\/3.0.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:41:36+00:00"},{"name":"sebastian\/code-unit","version":"3.0.3","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/code-unit.git","reference":"54391c61e4af8078e5b276ab082b6d3c54c9ad64"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/code-unit\/zipball\/54391c61e4af8078e5b276ab082b6d3c54c9ad64","reference":"54391c61e4af8078e5b276ab082b6d3c54c9ad64","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.5"},"type":"library","extra":{"branch-alias":{"dev-main":"3.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Collection of value objects that represent the PHP code units","homepage":"https:\/\/github.com\/sebastianbergmann\/code-unit","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/code-unit\/issues","security":"https:\/\/github.com\/sebastianbergmann\/code-unit\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/code-unit\/tree\/3.0.3"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2025-03-19T07:56:08+00:00"},{"name":"sebastian\/code-unit-reverse-lookup","version":"4.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/code-unit-reverse-lookup.git","reference":"183a9b2632194febd219bb9246eee421dad8d45e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/code-unit-reverse-lookup\/zipball\/183a9b2632194febd219bb9246eee421dad8d45e","reference":"183a9b2632194febd219bb9246eee421dad8d45e","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"4.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"}],"description":"Looks up which function or method a line of code belongs to","homepage":"https:\/\/github.com\/sebastianbergmann\/code-unit-reverse-lookup\/","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/code-unit-reverse-lookup\/issues","security":"https:\/\/github.com\/sebastianbergmann\/code-unit-reverse-lookup\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/code-unit-reverse-lookup\/tree\/4.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:45:54+00:00"},{"name":"sebastian\/comparator","version":"6.3.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/comparator.git","reference":"85c77556683e6eee4323e4c5468641ca0237e2e8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/comparator\/zipball\/85c77556683e6eee4323e4c5468641ca0237e2e8","reference":"85c77556683e6eee4323e4c5468641ca0237e2e8","shasum":""},"require":{"ext-dom":"*","ext-mbstring":"*","php":">=8.2","sebastian\/diff":"^6.0","sebastian\/exporter":"^6.0"},"require-dev":{"phpunit\/phpunit":"^11.4"},"suggest":{"ext-bcmath":"For comparing BcMath\\Number objects"},"type":"library","extra":{"branch-alias":{"dev-main":"6.3-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"},{"name":"Jeff Welch","email":"whatthejeff@gmail.com"},{"name":"Volker Dusch","email":"github@wallbash.com"},{"name":"Bernhard Schussek","email":"bschussek@2bepublished.at"}],"description":"Provides the functionality to compare PHP values for equality","homepage":"https:\/\/github.com\/sebastianbergmann\/comparator","keywords":["comparator","compare","equality"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/comparator\/issues","security":"https:\/\/github.com\/sebastianbergmann\/comparator\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/comparator\/tree\/6.3.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/sebastian\/comparator","type":"tidelift"}],"time":"2025-08-10T08:07:46+00:00"},{"name":"sebastian\/complexity","version":"4.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/complexity.git","reference":"ee41d384ab1906c68852636b6de493846e13e5a0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/complexity\/zipball\/ee41d384ab1906c68852636b6de493846e13e5a0","reference":"ee41d384ab1906c68852636b6de493846e13e5a0","shasum":""},"require":{"nikic\/php-parser":"^5.0","php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"4.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Library for calculating the complexity of PHP code units","homepage":"https:\/\/github.com\/sebastianbergmann\/complexity","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/complexity\/issues","security":"https:\/\/github.com\/sebastianbergmann\/complexity\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/complexity\/tree\/4.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:49:50+00:00"},{"name":"sebastian\/diff","version":"6.0.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/diff.git","reference":"b4ccd857127db5d41a5b676f24b51371d76d8544"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/diff\/zipball\/b4ccd857127db5d41a5b676f24b51371d76d8544","reference":"b4ccd857127db5d41a5b676f24b51371d76d8544","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0","symfony\/process":"^4.2 || ^5"},"type":"library","extra":{"branch-alias":{"dev-main":"6.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"},{"name":"Kore Nordmann","email":"mail@kore-nordmann.de"}],"description":"Diff implementation","homepage":"https:\/\/github.com\/sebastianbergmann\/diff","keywords":["diff","udiff","unidiff","unified diff"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/diff\/issues","security":"https:\/\/github.com\/sebastianbergmann\/diff\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/diff\/tree\/6.0.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:53:05+00:00"},{"name":"sebastian\/environment","version":"7.2.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/environment.git","reference":"a5c75038693ad2e8d4b6c15ba2403532647830c4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/environment\/zipball\/a5c75038693ad2e8d4b6c15ba2403532647830c4","reference":"a5c75038693ad2e8d4b6c15ba2403532647830c4","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.3"},"suggest":{"ext-posix":"*"},"type":"library","extra":{"branch-alias":{"dev-main":"7.2-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"}],"description":"Provides functionality to handle HHVM\/PHP environments","homepage":"https:\/\/github.com\/sebastianbergmann\/environment","keywords":["Xdebug","environment","hhvm"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/environment\/issues","security":"https:\/\/github.com\/sebastianbergmann\/environment\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/environment\/tree\/7.2.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/sebastian\/environment","type":"tidelift"}],"time":"2025-05-21T11:55:47+00:00"},{"name":"sebastian\/exporter","version":"6.3.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/exporter.git","reference":"70a298763b40b213ec087c51c739efcaa90bcd74"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/exporter\/zipball\/70a298763b40b213ec087c51c739efcaa90bcd74","reference":"70a298763b40b213ec087c51c739efcaa90bcd74","shasum":""},"require":{"ext-mbstring":"*","php":">=8.2","sebastian\/recursion-context":"^6.0"},"require-dev":{"phpunit\/phpunit":"^11.3"},"type":"library","extra":{"branch-alias":{"dev-main":"6.3-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"},{"name":"Jeff Welch","email":"whatthejeff@gmail.com"},{"name":"Volker Dusch","email":"github@wallbash.com"},{"name":"Adam Harvey","email":"aharvey@php.net"},{"name":"Bernhard Schussek","email":"bschussek@gmail.com"}],"description":"Provides the functionality to export PHP variables for visualization","homepage":"https:\/\/www.github.com\/sebastianbergmann\/exporter","keywords":["export","exporter"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/exporter\/issues","security":"https:\/\/github.com\/sebastianbergmann\/exporter\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/exporter\/tree\/6.3.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/sebastian\/exporter","type":"tidelift"}],"time":"2025-09-24T06:12:51+00:00"},{"name":"sebastian\/global-state","version":"7.0.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/global-state.git","reference":"3be331570a721f9a4b5917f4209773de17f747d7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/global-state\/zipball\/3be331570a721f9a4b5917f4209773de17f747d7","reference":"3be331570a721f9a4b5917f4209773de17f747d7","shasum":""},"require":{"php":">=8.2","sebastian\/object-reflector":"^4.0","sebastian\/recursion-context":"^6.0"},"require-dev":{"ext-dom":"*","phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"7.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"}],"description":"Snapshotting of global state","homepage":"https:\/\/www.github.com\/sebastianbergmann\/global-state","keywords":["global state"],"support":{"issues":"https:\/\/github.com\/sebastianbergmann\/global-state\/issues","security":"https:\/\/github.com\/sebastianbergmann\/global-state\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/global-state\/tree\/7.0.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:57:36+00:00"},{"name":"sebastian\/lines-of-code","version":"3.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/lines-of-code.git","reference":"d36ad0d782e5756913e42ad87cb2890f4ffe467a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/lines-of-code\/zipball\/d36ad0d782e5756913e42ad87cb2890f4ffe467a","reference":"d36ad0d782e5756913e42ad87cb2890f4ffe467a","shasum":""},"require":{"nikic\/php-parser":"^5.0","php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"3.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Library for counting the lines of code in PHP source code","homepage":"https:\/\/github.com\/sebastianbergmann\/lines-of-code","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/lines-of-code\/issues","security":"https:\/\/github.com\/sebastianbergmann\/lines-of-code\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/lines-of-code\/tree\/3.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T04:58:38+00:00"},{"name":"sebastian\/object-enumerator","version":"6.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/object-enumerator.git","reference":"f5b498e631a74204185071eb41f33f38d64608aa"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/object-enumerator\/zipball\/f5b498e631a74204185071eb41f33f38d64608aa","reference":"f5b498e631a74204185071eb41f33f38d64608aa","shasum":""},"require":{"php":">=8.2","sebastian\/object-reflector":"^4.0","sebastian\/recursion-context":"^6.0"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"6.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"}],"description":"Traverses array structures and object graphs to enumerate all referenced objects","homepage":"https:\/\/github.com\/sebastianbergmann\/object-enumerator\/","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/object-enumerator\/issues","security":"https:\/\/github.com\/sebastianbergmann\/object-enumerator\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/object-enumerator\/tree\/6.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T05:00:13+00:00"},{"name":"sebastian\/object-reflector","version":"4.0.1","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/object-reflector.git","reference":"6e1a43b411b2ad34146dee7524cb13a068bb35f9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/object-reflector\/zipball\/6e1a43b411b2ad34146dee7524cb13a068bb35f9","reference":"6e1a43b411b2ad34146dee7524cb13a068bb35f9","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.0"},"type":"library","extra":{"branch-alias":{"dev-main":"4.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"}],"description":"Allows reflection of object attributes, including inherited and non-public ones","homepage":"https:\/\/github.com\/sebastianbergmann\/object-reflector\/","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/object-reflector\/issues","security":"https:\/\/github.com\/sebastianbergmann\/object-reflector\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/object-reflector\/tree\/4.0.1"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-07-03T05:01:32+00:00"},{"name":"sebastian\/recursion-context","version":"6.0.3","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/recursion-context.git","reference":"f6458abbf32a6c8174f8f26261475dc133b3d9dc"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/recursion-context\/zipball\/f6458abbf32a6c8174f8f26261475dc133b3d9dc","reference":"f6458abbf32a6c8174f8f26261475dc133b3d9dc","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.3"},"type":"library","extra":{"branch-alias":{"dev-main":"6.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de"},{"name":"Jeff Welch","email":"whatthejeff@gmail.com"},{"name":"Adam Harvey","email":"aharvey@php.net"}],"description":"Provides functionality to recursively process PHP variables","homepage":"https:\/\/github.com\/sebastianbergmann\/recursion-context","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/recursion-context\/issues","security":"https:\/\/github.com\/sebastianbergmann\/recursion-context\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/recursion-context\/tree\/6.0.3"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/sebastian\/recursion-context","type":"tidelift"}],"time":"2025-08-13T04:42:22+00:00"},{"name":"sebastian\/type","version":"5.1.3","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/type.git","reference":"f77d2d4e78738c98d9a68d2596fe5e8fa380f449"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/type\/zipball\/f77d2d4e78738c98d9a68d2596fe5e8fa380f449","reference":"f77d2d4e78738c98d9a68d2596fe5e8fa380f449","shasum":""},"require":{"php":">=8.2"},"require-dev":{"phpunit\/phpunit":"^11.3"},"type":"library","extra":{"branch-alias":{"dev-main":"5.1-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Collection of value objects that represent the types of the PHP type system","homepage":"https:\/\/github.com\/sebastianbergmann\/type","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/type\/issues","security":"https:\/\/github.com\/sebastianbergmann\/type\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/type\/tree\/5.1.3"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"},{"url":"https:\/\/liberapay.com\/sebastianbergmann","type":"liberapay"},{"url":"https:\/\/thanks.dev\/u\/gh\/sebastianbergmann","type":"thanks_dev"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/sebastian\/type","type":"tidelift"}],"time":"2025-08-09T06:55:48+00:00"},{"name":"sebastian\/version","version":"5.0.2","source":{"type":"git","url":"https:\/\/github.com\/sebastianbergmann\/version.git","reference":"c687e3387b99f5b03b6caa64c74b63e2936ff874"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sebastianbergmann\/version\/zipball\/c687e3387b99f5b03b6caa64c74b63e2936ff874","reference":"c687e3387b99f5b03b6caa64c74b63e2936ff874","shasum":""},"require":{"php":">=8.2"},"type":"library","extra":{"branch-alias":{"dev-main":"5.0-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Sebastian Bergmann","email":"sebastian@phpunit.de","role":"lead"}],"description":"Library that helps with managing the version number of Git-hosted PHP projects","homepage":"https:\/\/github.com\/sebastianbergmann\/version","support":{"issues":"https:\/\/github.com\/sebastianbergmann\/version\/issues","security":"https:\/\/github.com\/sebastianbergmann\/version\/security\/policy","source":"https:\/\/github.com\/sebastianbergmann\/version\/tree\/5.0.2"},"funding":[{"url":"https:\/\/github.com\/sebastianbergmann","type":"github"}],"time":"2024-10-09T05:16:32+00:00"},{"name":"seld\/jsonlint","version":"1.11.0","source":{"type":"git","url":"https:\/\/github.com\/Seldaek\/jsonlint.git","reference":"1748aaf847fc731cfad7725aec413ee46f0cc3a2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Seldaek\/jsonlint\/zipball\/1748aaf847fc731cfad7725aec413ee46f0cc3a2","reference":"1748aaf847fc731cfad7725aec413ee46f0cc3a2","shasum":""},"require":{"php":"^5.3 || ^7.0 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^1.11","phpunit\/phpunit":"^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"},"bin":["bin\/jsonlint"],"type":"library","autoload":{"psr-4":{"Seld\\JsonLint\\":"src\/Seld\/JsonLint\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"https:\/\/seld.be"}],"description":"JSON Linter","keywords":["json","linter","parser","validator"],"support":{"issues":"https:\/\/github.com\/Seldaek\/jsonlint\/issues","source":"https:\/\/github.com\/Seldaek\/jsonlint\/tree\/1.11.0"},"funding":[{"url":"https:\/\/github.com\/Seldaek","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/seld\/jsonlint","type":"tidelift"}],"time":"2024-07-11T14:55:45+00:00"},{"name":"seld\/phar-utils","version":"1.2.1","source":{"type":"git","url":"https:\/\/github.com\/Seldaek\/phar-utils.git","reference":"ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Seldaek\/phar-utils\/zipball\/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c","reference":"ea2f4014f163c1be4c601b9b7bd6af81ba8d701c","shasum":""},"require":{"php":">=5.3"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Seld\\PharUtils\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be"}],"description":"PHAR file format utilities, for when PHP phars you up","keywords":["phar"],"support":{"issues":"https:\/\/github.com\/Seldaek\/phar-utils\/issues","source":"https:\/\/github.com\/Seldaek\/phar-utils\/tree\/1.2.1"},"time":"2022-08-31T10:31:18+00:00"},{"name":"seld\/signal-handler","version":"2.0.2","source":{"type":"git","url":"https:\/\/github.com\/Seldaek\/signal-handler.git","reference":"04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Seldaek\/signal-handler\/zipball\/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98","reference":"04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98","shasum":""},"require":{"php":">=7.2.0"},"require-dev":{"phpstan\/phpstan":"^1","phpstan\/phpstan-deprecation-rules":"^1.0","phpstan\/phpstan-phpunit":"^1","phpstan\/phpstan-strict-rules":"^1.3","phpunit\/phpunit":"^7.5.20 || ^8.5.23","psr\/log":"^1 || ^2 || ^3"},"type":"library","extra":{"branch-alias":{"dev-main":"2.x-dev"}},"autoload":{"psr-4":{"Seld\\Signal\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"http:\/\/seld.be"}],"description":"Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development","keywords":["posix","sigint","signal","sigterm","unix"],"support":{"issues":"https:\/\/github.com\/Seldaek\/signal-handler\/issues","source":"https:\/\/github.com\/Seldaek\/signal-handler\/tree\/2.0.2"},"time":"2023-09-03T09:24:00+00:00"},{"name":"sirbrillig\/phpcs-variable-analysis","version":"v2.13.0","source":{"type":"git","url":"https:\/\/github.com\/sirbrillig\/phpcs-variable-analysis.git","reference":"a15e970b8a0bf64cfa5e86d941f5e6b08855f369"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/sirbrillig\/phpcs-variable-analysis\/zipball\/a15e970b8a0bf64cfa5e86d941f5e6b08855f369","reference":"a15e970b8a0bf64cfa5e86d941f5e6b08855f369","shasum":""},"require":{"php":">=5.4.0","squizlabs\/php_codesniffer":"^3.5.7 || ^4.0.0"},"require-dev":{"dealerdirect\/phpcodesniffer-composer-installer":"^0.7 || ^1.0","phpstan\/phpstan":"^1.7 || ^2.0","phpunit\/phpunit":"^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3","vimeo\/psalm":"^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0 || ^6.0 || ^7.0"},"type":"phpcodesniffer-standard","autoload":{"psr-4":{"VariableAnalysis\\":"VariableAnalysis\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-2-Clause"],"authors":[{"name":"Sam Graham","email":"php-codesniffer-variableanalysis@illusori.co.uk"},{"name":"Payton Swick","email":"payton@foolord.com"}],"description":"A PHPCS sniff to detect problems with variables.","keywords":["phpcs","static analysis"],"support":{"issues":"https:\/\/github.com\/sirbrillig\/phpcs-variable-analysis\/issues","source":"https:\/\/github.com\/sirbrillig\/phpcs-variable-analysis","wiki":"https:\/\/github.com\/sirbrillig\/phpcs-variable-analysis\/wiki"},"time":"2025-09-30T22:22:48+00:00"},{"name":"slevomat\/coding-standard","version":"8.22.1","source":{"type":"git","url":"https:\/\/github.com\/slevomat\/coding-standard.git","reference":"1dd80bf3b93692bedb21a6623c496887fad05fec"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/slevomat\/coding-standard\/zipball\/1dd80bf3b93692bedb21a6623c496887fad05fec","reference":"1dd80bf3b93692bedb21a6623c496887fad05fec","shasum":""},"require":{"dealerdirect\/phpcodesniffer-composer-installer":"^0.6.2 || ^0.7 || ^1.1.2","php":"^7.4 || ^8.0","phpstan\/phpdoc-parser":"^2.3.0","squizlabs\/php_codesniffer":"^3.13.4"},"require-dev":{"phing\/phing":"3.0.1|3.1.0","php-parallel-lint\/php-parallel-lint":"1.4.0","phpstan\/phpstan":"2.1.24","phpstan\/phpstan-deprecation-rules":"2.0.3","phpstan\/phpstan-phpunit":"2.0.7","phpstan\/phpstan-strict-rules":"2.0.6","phpunit\/phpunit":"9.6.8|10.5.48|11.4.4|11.5.36|12.3.10"},"type":"phpcodesniffer-standard","extra":{"branch-alias":{"dev-master":"8.x-dev"}},"autoload":{"psr-4":{"SlevomatCodingStandard\\":"SlevomatCodingStandard\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.","keywords":["dev","phpcs"],"support":{"issues":"https:\/\/github.com\/slevomat\/coding-standard\/issues","source":"https:\/\/github.com\/slevomat\/coding-standard\/tree\/8.22.1"},"funding":[{"url":"https:\/\/github.com\/kukulich","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/slevomat\/coding-standard","type":"tidelift"}],"time":"2025-09-13T08:53:30+00:00"},{"name":"squizlabs\/php_codesniffer","version":"3.13.5","source":{"type":"git","url":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer.git","reference":"0ca86845ce43291e8f5692c7356fccf3bcf02bf4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/PHPCSStandards\/PHP_CodeSniffer\/zipball\/0ca86845ce43291e8f5692c7356fccf3bcf02bf4","reference":"0ca86845ce43291e8f5692c7356fccf3bcf02bf4","shasum":""},"require":{"ext-simplexml":"*","ext-tokenizer":"*","ext-xmlwriter":"*","php":">=5.4.0"},"require-dev":{"phpunit\/phpunit":"^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"},"bin":["bin\/phpcbf","bin\/phpcs"],"type":"library","notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Greg Sherwood","role":"Former lead"},{"name":"Juliette Reinders Folmer","role":"Current lead"},{"name":"Contributors","homepage":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\/graphs\/contributors"}],"description":"PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.","homepage":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer","keywords":["phpcs","standards","static analysis"],"support":{"issues":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\/issues","security":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\/security\/policy","source":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer","wiki":"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\/wiki"},"funding":[{"url":"https:\/\/github.com\/PHPCSStandards","type":"github"},{"url":"https:\/\/github.com\/jrfnl","type":"github"},{"url":"https:\/\/opencollective.com\/php_codesniffer","type":"open_collective"},{"url":"https:\/\/thanks.dev\/u\/gh\/phpcsstandards","type":"thanks_dev"}],"time":"2025-11-04T16:30:35+00:00"},{"name":"staabm\/side-effects-detector","version":"1.0.5","source":{"type":"git","url":"https:\/\/github.com\/staabm\/side-effects-detector.git","reference":"d8334211a140ce329c13726d4a715adbddd0a163"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/staabm\/side-effects-detector\/zipball\/d8334211a140ce329c13726d4a715adbddd0a163","reference":"d8334211a140ce329c13726d4a715adbddd0a163","shasum":""},"require":{"ext-tokenizer":"*","php":"^7.4 || ^8.0"},"require-dev":{"phpstan\/extension-installer":"^1.4.3","phpstan\/phpstan":"^1.12.6","phpunit\/phpunit":"^9.6.21","symfony\/var-dumper":"^5.4.43","tomasvotruba\/type-coverage":"1.0.0","tomasvotruba\/unused-public":"1.0.0"},"type":"library","autoload":{"classmap":["lib\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"A static analysis tool to detect side effects in PHP code","keywords":["static analysis"],"support":{"issues":"https:\/\/github.com\/staabm\/side-effects-detector\/issues","source":"https:\/\/github.com\/staabm\/side-effects-detector\/tree\/1.0.5"},"funding":[{"url":"https:\/\/github.com\/staabm","type":"github"}],"time":"2024-10-20T05:08:20+00:00"},{"name":"symfony\/css-selector","version":"v7.3.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/css-selector.git","reference":"601a5ce9aaad7bf10797e3663faefce9e26c24e2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/css-selector\/zipball\/601a5ce9aaad7bf10797e3663faefce9e26c24e2","reference":"601a5ce9aaad7bf10797e3663faefce9e26c24e2","shasum":""},"require":{"php":">=8.2"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\CssSelector\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Jean-Fran\u00e7ois Simon","email":"jeanfrancois.simon@sensiolabs.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Converts CSS selectors to XPath expressions","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/css-selector\/tree\/v7.3.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":"2024-09-25T14:21:43+00:00"},{"name":"symfony\/dom-crawler","version":"v7.3.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dom-crawler.git","reference":"efa076ea0eeff504383ff0dcf827ea5ce15690ba"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dom-crawler\/zipball\/efa076ea0eeff504383ff0dcf827ea5ce15690ba","reference":"efa076ea0eeff504383ff0dcf827ea5ce15690ba","shasum":""},"require":{"masterminds\/html5":"^2.6","php":">=8.2","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.0"},"require-dev":{"symfony\/css-selector":"^6.4|^7.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\DomCrawler\\":""},"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":"Eases DOM navigation for HTML and XML documents","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/dom-crawler\/tree\/v7.3.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-08-06T20:13:54+00:00"},{"name":"symfony\/polyfill-php73","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php73.git","reference":"0f68c03565dcaaf25a890667542e8bd75fe7e5bb"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php73\/zipball\/0f68c03565dcaaf25a890667542e8bd75fe7e5bb","reference":"0f68c03565dcaaf25a890667542e8bd75fe7e5bb","shasum":""},"require":{"php":">=7.2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php73\\":""},"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 backporting some PHP 7.3+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php73\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2024-09-09T11:45:10+00:00"},{"name":"symfony\/polyfill-php81","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php81.git","reference":"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php81\/zipball\/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c","reference":"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c","shasum":""},"require":{"php":">=7.2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php81\\":""},"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 backporting some PHP 8.1+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php81\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2024-09-09T11:45:10+00:00"},{"name":"symfony\/polyfill-php84","version":"v1.33.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php84.git","reference":"d8ced4d875142b6a7426000426b8abc631d6b191"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php84\/zipball\/d8ced4d875142b6a7426000426b8abc631d6b191","reference":"d8ced4d875142b6a7426000426b8abc631d6b191","shasum":""},"require":{"php":">=7.2"},"type":"library","extra":{"thanks":{"url":"https:\/\/github.com\/symfony\/polyfill","name":"symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php84\\":""},"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 backporting some PHP 8.4+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php84\/tree\/v1.33.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/github.com\/nicolas-grekas","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2025-06-24T13:30:11+00:00"},{"name":"theseer\/tokenizer","version":"1.2.3","source":{"type":"git","url":"https:\/\/github.com\/theseer\/tokenizer.git","reference":"737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/theseer\/tokenizer\/zipball\/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2","reference":"737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2","shasum":""},"require":{"ext-dom":"*","ext-tokenizer":"*","ext-xmlwriter":"*","php":"^7.2 || ^8.0"},"type":"library","autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Arne Blankerts","email":"arne@blankerts.de","role":"Developer"}],"description":"A small library for converting tokenized PHP source code into XML and potentially other formats","support":{"issues":"https:\/\/github.com\/theseer\/tokenizer\/issues","source":"https:\/\/github.com\/theseer\/tokenizer\/tree\/1.2.3"},"funding":[{"url":"https:\/\/github.com\/theseer","type":"github"}],"time":"2024-03-03T12:36:25+00:00"},{"name":"twig\/twig","version":"v3.22.0","source":{"type":"git","url":"https:\/\/github.com\/twigphp\/Twig.git","reference":"4509984193026de413baf4ba80f68590a7f2c51d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/twigphp\/Twig\/zipball\/4509984193026de413baf4ba80f68590a7f2c51d","reference":"4509984193026de413baf4ba80f68590a7f2c51d","shasum":""},"require":{"php":">=8.1.0","symfony\/deprecation-contracts":"^2.5|^3","symfony\/polyfill-ctype":"^1.8","symfony\/polyfill-mbstring":"^1.3"},"require-dev":{"phpstan\/phpstan":"^2.0","psr\/container":"^1.0|^2.0","symfony\/phpunit-bridge":"^5.4.9|^6.4|^7.0"},"type":"library","autoload":{"files":["src\/Resources\/core.php","src\/Resources\/debug.php","src\/Resources\/escaper.php","src\/Resources\/string_loader.php"],"psr-4":{"Twig\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com","homepage":"http:\/\/fabien.potencier.org","role":"Lead Developer"},{"name":"Twig Team","role":"Contributors"},{"name":"Armin Ronacher","email":"armin.ronacher@active-4.com","role":"Project Founder"}],"description":"Twig, the flexible, fast, and secure template language for PHP","homepage":"https:\/\/twig.symfony.com","keywords":["templating"],"support":{"issues":"https:\/\/github.com\/twigphp\/Twig\/issues","source":"https:\/\/github.com\/twigphp\/Twig\/tree\/v3.22.0"},"funding":[{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/twig\/twig","type":"tidelift"}],"time":"2025-10-29T15:56:47+00:00"},{"name":"webmozart\/assert","version":"1.12.1","source":{"type":"git","url":"https:\/\/github.com\/webmozarts\/assert.git","reference":"9be6926d8b485f55b9229203f962b51ed377ba68"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/9be6926d8b485f55b9229203f962b51ed377ba68","reference":"9be6926d8b485f55b9229203f962b51ed377ba68","shasum":""},"require":{"ext-ctype":"*","ext-date":"*","ext-filter":"*","php":"^7.2 || ^8.0"},"suggest":{"ext-intl":"","ext-simplexml":"","ext-spl":""},"type":"library","extra":{"branch-alias":{"dev-master":"1.10-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"],"support":{"issues":"https:\/\/github.com\/webmozarts\/assert\/issues","source":"https:\/\/github.com\/webmozarts\/assert\/tree\/1.12.1"},"time":"2025-10-29T15:56:20+00:00"}],"aliases":[{"package":"thecodingmachine\/safe","version":"3.0.2.0","alias":"2.5.0","alias_normalized":"2.5.0.0"}],"minimum-stability":"dev","stability-flags":{},"prefer-stable":true,"prefer-lowest":false,"platform":{"php":"^8.2","ext-json":"*"},"platform-dev":{},"platform-overrides":{"php":"8.2.29"},"plugin-api-version":"2.6.0"}<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInitHumbugBox465
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInitHumbugBox465', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
        spl_autoload_unregister(array('ComposerAutoloaderInitHumbugBox465', 'loadClassLoader'));

        require __DIR__ . '/autoload_static.php';
        call_user_func(\Composer\Autoload\ComposerStaticInitHumbugBox465::getInitializer($loader));

        $loader->setClassMapAuthoritative(true);
        $loader->register(true);

        return $loader;
    }
}
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'HumbugBox465\\KevinGH\\RequirementChecker\\' => array($baseDir . '/src'),
    'HumbugBox465\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'),
);
<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInitHumbugBox465
{
    public static $prefixLengthsPsr4 = array (
        'H' => 
        array (
            'HumbugBox465\\KevinGH\\RequirementChecker\\' => 40,
            'HumbugBox465\\Composer\\Semver\\' => 29,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'HumbugBox465\\KevinGH\\RequirementChecker\\' => 
        array (
            0 => __DIR__ . '/../..' . '/src',
        ),
        'HumbugBox465\\Composer\\Semver\\' => 
        array (
            0 => __DIR__ . '/..' . '/composer/semver/src',
        ),
    );

    public static $classMap = array (
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
        'HumbugBox465\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php',
        'HumbugBox465\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php',
        'HumbugBox465\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php',
        'HumbugBox465\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php',
        'HumbugBox465\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php',
        'HumbugBox465\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php',
        'HumbugBox465\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\Checker' => __DIR__ . '/../..' . '/src/Checker.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\IO' => __DIR__ . '/../..' . '/src/IO.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\IsExtensionConflictFulfilled' => __DIR__ . '/../..' . '/src/IsExtensionConflictFulfilled.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => __DIR__ . '/../..' . '/src/IsExtensionFulfilled.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\IsFulfilled' => __DIR__ . '/../..' . '/src/IsFulfilled.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => __DIR__ . '/../..' . '/src/IsPhpVersionFulfilled.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\Printer' => __DIR__ . '/../..' . '/src/Printer.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\Requirement' => __DIR__ . '/../..' . '/src/Requirement.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\RequirementCollection' => __DIR__ . '/../..' . '/src/RequirementCollection.php',
        'HumbugBox465\\KevinGH\\RequirementChecker\\Terminal' => __DIR__ . '/../..' . '/src/Terminal.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInitHumbugBox465::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInitHumbugBox465::$prefixDirsPsr4;
            $loader->classMap = ComposerStaticInitHumbugBox465::$classMap;

        }, null, ClassLoader::class);
    }
}

Copyright (c) Nils Adermann, Jordi Boggiano

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.

<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var \Closure(string):void */
    private static $includeFile;

    /** @var string|null */
    private $vendorDir;

    // PSR-4
    /**
     * @var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array<string, list<string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var list<string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * List of PSR-0 prefixes
     *
     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
     *
     * @var array<string, array<string, list<string>>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var list<string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var array<string, bool>
     */
    private $missingClasses = array();

    /** @var string|null */
    private $apcuPrefix;

    /**
     * @var array<string, self>
     */
    private static $registeredLoaders = array();

    /**
     * @param string|null $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
        self::initializeIncludeClosure();
    }

    /**
     * @return array<string, list<string>>
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array<string, list<string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return list<string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return list<string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return array<string, string> Array of classname => path
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param array<string, string> $classMap Class to filename map
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string              $prefix  The prefix
     * @param list<string>|string $paths   The PSR-0 root directories
     * @param bool                $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        $paths = (array) $paths;
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string              $prefix  The prefix/namespace, with trailing '\\'
     * @param list<string>|string $paths   The PSR-4 base directories
     * @param bool                $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        $paths = (array) $paths;
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string              $prefix The prefix
     * @param list<string>|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string              $prefix The prefix/namespace, with trailing '\\'
     * @param list<string>|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            $includeFile = self::$includeFile;
            $includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders keyed by their corresponding vendor directories.
     *
     * @return array<string, self>
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }

    /**
     * @return void
     */
    private static function initializeIncludeClosure()
    {
        if (self::$includeFile !== null) {
            return;
        }

        /**
         * Scope isolated include.
         *
         * Prevents access to $this/self from included files.
         *
         * @param  string $file
         * @return void
         */
        self::$includeFile = \Closure::bind(static function($file) {
            include $file;
        }, null, null);
    }
}
<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
);
<?php

namespace HumbugBox465;

return array('root' => array('name' => 'humbug/requirement-checker', 'pretty_version' => '4.x.x-dev', 'version' => '4.9999999.9999999.9999999-dev', 'reference' => null, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \true), 'versions' => array('composer/semver' => array('pretty_version' => '3.4.0', 'version' => '3.4.0.0', 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'ergebnis/composer-normalize' => array('pretty_version' => '2.43.0', 'version' => '2.43.0.0', 'reference' => '4b46330c84bb8f43fac79f5c5a05162fc7c80d75', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../ergebnis/composer-normalize', 'aliases' => array(), 'dev_requirement' => \true), 'ergebnis/json' => array('pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'reference' => 'a457f25a5ba7ea11fc94f84d53678c5211abfce0', 'type' => 'library', 'install_path' => __DIR__ . '/../ergebnis/json', 'aliases' => array(), 'dev_requirement' => \true), 'ergebnis/json-normalizer' => array('pretty_version' => '4.5.0', 'version' => '4.5.0.0', 'reference' => 'f0ee9e70739f121b27fac8b743e4a52b23de2152', 'type' => 'library', 'install_path' => __DIR__ . '/../ergebnis/json-normalizer', 'aliases' => array(), 'dev_requirement' => \true), 'ergebnis/json-pointer' => array('pretty_version' => '3.4.0', 'version' => '3.4.0.0', 'reference' => 'b654757d873050622c2166f55ab25d04685261c5', 'type' => 'library', 'install_path' => __DIR__ . '/../ergebnis/json-pointer', 'aliases' => array(), 'dev_requirement' => \true), 'ergebnis/json-printer' => array('pretty_version' => '3.5.0', 'version' => '3.5.0.0', 'reference' => '549e16fe6de34b8c3aee7b421be12caa552f3ced', 'type' => 'library', 'install_path' => __DIR__ . '/../ergebnis/json-printer', 'aliases' => array(), 'dev_requirement' => \true), 'ergebnis/json-schema-validator' => array('pretty_version' => '4.2.0', 'version' => '4.2.0.0', 'reference' => '10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef', 'type' => 'library', 'install_path' => __DIR__ . '/../ergebnis/json-schema-validator', 'aliases' => array(), 'dev_requirement' => \true), 'fidry/makefile' => array('pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'reference' => 'be5a048dcc5648d04e924facce0f85b406d731e4', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/makefile', 'aliases' => array(), 'dev_requirement' => \true), 'humbug/requirement-checker' => array('pretty_version' => '4.x.x-dev', 'version' => '4.9999999.9999999.9999999-dev', 'reference' => null, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'justinrainbow/json-schema' => array('pretty_version' => 'v5.2.13', 'version' => '5.2.13.0', 'reference' => 'fbbe7e5d79f618997bc3332a6f49246036c45793', 'type' => 'library', 'install_path' => __DIR__ . '/../justinrainbow/json-schema', 'aliases' => array(), 'dev_requirement' => \true), 'localheinz/diff' => array('pretty_version' => '1.1.1', 'version' => '1.1.1.0', 'reference' => '851bb20ea8358c86f677f5f111c4ab031b1c764c', 'type' => 'library', 'install_path' => __DIR__ . '/../localheinz/diff', 'aliases' => array(), 'dev_requirement' => \true), 'myclabs/deep-copy' => array('pretty_version' => '1.12.0', 'version' => '1.12.0.0', 'reference' => '3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'dev_requirement' => \true), 'nikic/php-parser' => array('pretty_version' => 'v5.1.0', 'version' => '5.1.0.0', 'reference' => '683130c2ff8c2739f4822ff7ac5c873ec529abd1', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \true), 'phar-io/manifest' => array('pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => '54750ef60c58e43759730615a392c31c80e23176', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/manifest', 'aliases' => array(), 'dev_requirement' => \true), 'phar-io/version' => array('pretty_version' => '3.2.1', 'version' => '3.2.1.0', 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/version', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-code-coverage' => array('pretty_version' => '10.1.15', 'version' => '10.1.15.0', 'reference' => '5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-file-iterator' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => 'a95037b6d9e608ba092da1b23931e537cadc3c3c', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-invoker' => array('pretty_version' => '4.0.0', 'version' => '4.0.0.0', 'reference' => 'f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-invoker', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-text-template' => array('pretty_version' => '3.0.1', 'version' => '3.0.1.0', 'reference' => '0c7b06ff49e3d5072f057eb1fa59258bf287a748', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-text-template', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-timer' => array('pretty_version' => '6.0.0', 'version' => '6.0.0.0', 'reference' => 'e2a2d67966e740530f4a3343fe2e030ffdc1161d', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-timer', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/phpunit' => array('pretty_version' => '10.5.26', 'version' => '10.5.26.0', 'reference' => '42e2f13ceaa2e34461bc89bea75407550b40b2aa', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/cli-parser' => array('pretty_version' => '2.0.1', 'version' => '2.0.1.0', 'reference' => 'c34583b87e7b7a8055bf6c450c2c77ce32a24084', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/cli-parser', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/code-unit' => array('pretty_version' => '2.0.0', 'version' => '2.0.0.0', 'reference' => 'a81fee9eef0b7a76af11d121767abc44c104e503', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/code-unit-reverse-lookup' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '5e3a687f7d8ae33fb362c5c0743794bbb2420a1d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/comparator' => array('pretty_version' => '5.0.1', 'version' => '5.0.1.0', 'reference' => '2db5010a484d53ebf536087a70b4a5423c102372', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/comparator', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/complexity' => array('pretty_version' => '3.2.0', 'version' => '3.2.0.0', 'reference' => '68ff824baeae169ec9f2137158ee529584553799', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/diff' => array('pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/environment' => array('pretty_version' => '6.1.0', 'version' => '6.1.0.0', 'reference' => '8074dbcd93529b357029f5cc5058fd3e43666984', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/environment', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/exporter' => array('pretty_version' => '5.1.2', 'version' => '5.1.2.0', 'reference' => '955288482d97c19a372d3f31006ab3f37da47adf', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/exporter', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/global-state' => array('pretty_version' => '6.0.2', 'version' => '6.0.2.0', 'reference' => '987bafff24ecc4c9ac418cab1145b96dd6e9cbd9', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/lines-of-code' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => '856e7f6a75a84e339195d48c556f23be2ebf75d0', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/object-enumerator' => array('pretty_version' => '5.0.0', 'version' => '5.0.0.0', 'reference' => '202d0e344a580d7f7d04b3fafce6933e59dae906', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-enumerator', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/object-reflector' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '24ed13d98130f0e7122df55d06c5c4942a577957', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-reflector', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/recursion-context' => array('pretty_version' => '5.0.0', 'version' => '5.0.0.0', 'reference' => '05909fb5bc7df4c52992396d0116aed689f93712', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/recursion-context', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/type' => array('pretty_version' => '4.0.0', 'version' => '4.0.0.0', 'reference' => '462699a16464c3944eefc02ebdd77882bd3925bf', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/type', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/version' => array('pretty_version' => '4.0.1', 'version' => '4.0.1.0', 'reference' => 'c51fa83a5d8f43f1402e3f32a005e6262244ef17', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/version', 'aliases' => array(), 'dev_requirement' => \true), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.5.0', 'version' => '3.5.0.0', 'reference' => '0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \true), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.30.0', 'version' => '1.30.0.0', 'reference' => '0424dff1c58f028c451efff2045f5d92410bd540', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \true), 'symfony/yaml' => array('pretty_version' => 'v6.4.8', 'version' => '6.4.8.0', 'reference' => '52903de178d542850f6f341ba92995d3d63e60c9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \true), 'thecodingmachine/safe' => array('pretty_version' => 'v2.5.0', 'version' => '2.5.0.0', 'reference' => '3115ecd6b4391662b4931daac4eba6b07a2ac1f0', 'type' => 'library', 'install_path' => __DIR__ . '/../thecodingmachine/safe', 'aliases' => array(), 'dev_requirement' => \true), 'theseer/tokenizer' => array('pretty_version' => '1.2.3', 'version' => '1.2.3.0', 'reference' => '737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2', 'type' => 'library', 'install_path' => __DIR__ . '/../theseer/tokenizer', 'aliases' => array(), 'dev_requirement' => \true)));
<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'HumbugBox465\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php',
    'HumbugBox465\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php',
    'HumbugBox465\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php',
    'HumbugBox465\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php',
    'HumbugBox465\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php',
    'HumbugBox465\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php',
    'HumbugBox465\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\Checker' => $baseDir . '/src/Checker.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\IO' => $baseDir . '/src/IO.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\IsExtensionConflictFulfilled' => $baseDir . '/src/IsExtensionConflictFulfilled.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => $baseDir . '/src/IsExtensionFulfilled.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\IsFulfilled' => $baseDir . '/src/IsFulfilled.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => $baseDir . '/src/IsPhpVersionFulfilled.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\Printer' => $baseDir . '/src/Printer.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\Requirement' => $baseDir . '/src/Requirement.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\RequirementCollection' => $baseDir . '/src/RequirementCollection.php',
    'HumbugBox465\\KevinGH\\RequirementChecker\\Terminal' => $baseDir . '/src/Terminal.php',
);
<?php

namespace HumbugBox465\Composer;

use HumbugBox465\Composer\Autoload\ClassLoader;
use HumbugBox465\Composer\Semver\VersionParser;
class InstalledVersions
{
    private static $selfDir = null;
    /**
    @psalm-var
    */
    private static $installed;
    private static $installedIsLocalDir;
    private static $canGetVendors;
    /**
    @psalm-var
    */
    private static $installedByVendor = array();
    /**
    @psalm-return
    */
    public static function getInstalledPackages()
    {
        $packages = array();
        foreach (self::getInstalled() as $installed) {
            $packages[] = array_keys($installed['versions']);
        }
        if (1 === \count($packages)) {
            return $packages[0];
        }
        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
    }
    /**
    @psalm-return
    */
    public static function getInstalledPackagesByType($type)
    {
        $packagesByType = array();
        foreach (self::getInstalled() as $installed) {
            foreach ($installed['versions'] as $name => $package) {
                if (isset($package['type']) && $package['type'] === $type) {
                    $packagesByType[] = $name;
                }
            }
        }
        return $packagesByType;
    }
    public static function isInstalled($packageName, $includeDevRequirements = \true)
    {
        foreach (self::getInstalled() as $installed) {
            if (isset($installed['versions'][$packageName])) {
                return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false;
            }
        }
        return \false;
    }
    public static function satisfies(VersionParser $parser, $packageName, $constraint)
    {
        $constraint = $parser->parseConstraints((string) $constraint);
        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
        return $provided->matches($constraint);
    }
    public static function getVersionRanges($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }
            $ranges = array();
            if (isset($installed['versions'][$packageName]['pretty_version'])) {
                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
            }
            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
            }
            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
            }
            if (array_key_exists('provided', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
            }
            return implode(' || ', $ranges);
        }
        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }
    public static function getVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }
            if (!isset($installed['versions'][$packageName]['version'])) {
                return null;
            }
            return $installed['versions'][$packageName]['version'];
        }
        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }
    public static function getPrettyVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }
            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
                return null;
            }
            return $installed['versions'][$packageName]['pretty_version'];
        }
        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }
    public static function getReference($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }
            if (!isset($installed['versions'][$packageName]['reference'])) {
                return null;
            }
            return $installed['versions'][$packageName]['reference'];
        }
        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }
    public static function getInstallPath($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }
            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
        }
        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }
    /**
    @psalm-return
    */
    public static function getRootPackage()
    {
        $installed = self::getInstalled();
        return $installed[0]['root'];
    }
    /**
    @psalm-return
    */
    public static function getRawData()
    {
        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED);
        if (null === self::$installed) {
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = include __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }
        return self::$installed;
    }
    /**
    @psalm-return
    */
    public static function getAllRawData()
    {
        return self::getInstalled();
    }
    /**
    @psalm-param
    */
    public static function reload($data)
    {
        self::$installed = $data;
        self::$installedByVendor = array();
        self::$installedIsLocalDir = \false;
    }
    private static function getSelfDir()
    {
        if (self::$selfDir === null) {
            self::$selfDir = strtr(__DIR__, '\\', '/');
        }
        return self::$selfDir;
    }
    /**
    @psalm-return
    */
    private static function getInstalled()
    {
        if (null === self::$canGetVendors) {
            self::$canGetVendors = method_exists('HumbugBox465\Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
        }
        $installed = array();
        $copiedLocalDir = \false;
        if (self::$canGetVendors) {
            $selfDir = self::getSelfDir();
            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                $vendorDir = strtr($vendorDir, '\\', '/');
                if (isset(self::$installedByVendor[$vendorDir])) {
                    $installed[] = self::$installedByVendor[$vendorDir];
                } elseif (is_file($vendorDir . '/composer/installed.php')) {
                    $required = require $vendorDir . '/composer/installed.php';
                    self::$installedByVendor[$vendorDir] = $required;
                    $installed[] = $required;
                    if (self::$installed === null && $vendorDir . '/composer' === $selfDir) {
                        self::$installed = $required;
                        self::$installedIsLocalDir = \true;
                    }
                }
                if (self::$installedIsLocalDir && $vendorDir . '/composer' === $selfDir) {
                    $copiedLocalDir = \true;
                }
            }
        }
        if (null === self::$installed) {
            if (substr(__DIR__, -8, 1) !== 'C') {
                $required = require __DIR__ . '/installed.php';
                self::$installed = $required;
            } else {
                self::$installed = array();
            }
        }
        if (self::$installed !== array() && !$copiedLocalDir) {
            $installed[] = self::$installed;
        }
        return $installed;
    }
}
Copyright (C) 2015 Composer

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.
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\Constraint;
class Interval
{
    private $start;
    private $end;
    public function __construct(Constraint $start, Constraint $end)
    {
        $this->start = $start;
        $this->end = $end;
    }
    public function getStart()
    {
        return $this->start;
    }
    public function getEnd()
    {
        return $this->end;
    }
    public static function fromZero()
    {
        static $zero;
        if (null === $zero) {
            $zero = new Constraint('>=', '0.0.0.0-dev');
        }
        return $zero;
    }
    public static function untilPositiveInfinity()
    {
        static $positiveInfinity;
        if (null === $positiveInfinity) {
            $positiveInfinity = new Constraint('<', \PHP_INT_MAX . '.0.0.0');
        }
        return $positiveInfinity;
    }
    public static function any()
    {
        return new self(self::fromZero(), self::untilPositiveInfinity());
    }
    public static function anyDev()
    {
        return array('names' => array(), 'exclude' => \true);
    }
    public static function noDev()
    {
        return array('names' => array(), 'exclude' => \false);
    }
}
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\Constraint;
use HumbugBox465\Composer\Semver\Constraint\ConstraintInterface;
class CompilingMatcher
{
    /**
    @phpstan-var
    */
    private static $compiledCheckerCache = array();
    /**
    @phpstan-var
    */
    private static $resultCache = array();
    private static $enabled;
    /**
    @phpstan-var
    */
    private static $transOpInt = array(Constraint::OP_EQ => Constraint::STR_OP_EQ, Constraint::OP_LT => Constraint::STR_OP_LT, Constraint::OP_LE => Constraint::STR_OP_LE, Constraint::OP_GT => Constraint::STR_OP_GT, Constraint::OP_GE => Constraint::STR_OP_GE, Constraint::OP_NE => Constraint::STR_OP_NE);
    public static function clear()
    {
        self::$resultCache = array();
        self::$compiledCheckerCache = array();
    }
    /**
    @phpstan-param
    */
    public static function match(ConstraintInterface $constraint, $operator, $version)
    {
        $resultCacheKey = $operator . $constraint . ';' . $version;
        if (isset(self::$resultCache[$resultCacheKey])) {
            return self::$resultCache[$resultCacheKey];
        }
        if (self::$enabled === null) {
            self::$enabled = !\in_array('eval', explode(',', (string) ini_get('disable_functions')), \true);
        }
        if (!self::$enabled) {
            return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version));
        }
        $cacheKey = $operator . $constraint;
        if (!isset(self::$compiledCheckerCache[$cacheKey])) {
            $code = $constraint->compile($operator);
            self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return ' . $code . ';};');
        } else {
            $function = self::$compiledCheckerCache[$cacheKey];
        }
        return self::$resultCache[$resultCacheKey] = $function($version, strpos($version, 'dev-') === 0);
    }
}
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\Constraint;
use HumbugBox465\Composer\Semver\Constraint\ConstraintInterface;
use HumbugBox465\Composer\Semver\Constraint\MatchAllConstraint;
use HumbugBox465\Composer\Semver\Constraint\MatchNoneConstraint;
use HumbugBox465\Composer\Semver\Constraint\MultiConstraint;
class Intervals
{
    /**
    @phpstan-var
    */
    private static $intervalsCache = array();
    /**
    @phpstan-var
    */
    private static $opSortOrder = array('>=' => -3, '<' => -2, '>' => 2, '<=' => 3);
    public static function clear()
    {
        self::$intervalsCache = array();
    }
    public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint)
    {
        if ($constraint instanceof MatchAllConstraint) {
            return \true;
        }
        if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) {
            return \false;
        }
        $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), \true));
        $candidateIntervals = self::get($candidate);
        if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) {
            return \false;
        }
        foreach ($intersectionIntervals['numeric'] as $index => $interval) {
            if (!isset($candidateIntervals['numeric'][$index])) {
                return \false;
            }
            if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) {
                return \false;
            }
            if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) {
                return \false;
            }
        }
        if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) {
            return \false;
        }
        if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) {
            return \false;
        }
        foreach ($intersectionIntervals['branches']['names'] as $index => $name) {
            if ($name !== $candidateIntervals['branches']['names'][$index]) {
                return \false;
            }
        }
        return \true;
    }
    public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b)
    {
        if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) {
            return \true;
        }
        if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) {
            return \false;
        }
        $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), \true), \true);
        return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0;
    }
    public static function compactConstraint(ConstraintInterface $constraint)
    {
        if (!$constraint instanceof MultiConstraint) {
            return $constraint;
        }
        $intervals = self::generateIntervals($constraint);
        $constraints = array();
        $hasNumericMatchAll = \false;
        if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) {
            $constraints[] = $intervals['numeric'][0]->getStart();
            $hasNumericMatchAll = \true;
        } else {
            $unEqualConstraints = array();
            for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) {
                $interval = $intervals['numeric'][$i];
                if ($interval->getEnd()->getOperator() === '<' && $i + 1 < $count) {
                    $nextInterval = $intervals['numeric'][$i + 1];
                    if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') {
                        if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) {
                            $unEqualConstraints[] = $interval->getStart();
                        }
                        $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion());
                        continue;
                    }
                }
                if (\count($unEqualConstraints) > 0) {
                    if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) {
                        $unEqualConstraints[] = $interval->getEnd();
                    }
                    if (\count($unEqualConstraints) > 1) {
                        $constraints[] = new MultiConstraint($unEqualConstraints, \true);
                    } else {
                        $constraints[] = $unEqualConstraints[0];
                    }
                    $unEqualConstraints = array();
                    continue;
                }
                if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') {
                    $constraints[] = new Constraint('==', $interval->getStart()->getVersion());
                    continue;
                }
                if ((string) $interval->getStart() === (string) Interval::fromZero()) {
                    $constraints[] = $interval->getEnd();
                } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) {
                    $constraints[] = $interval->getStart();
                } else {
                    $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), \true);
                }
            }
        }
        $devConstraints = array();
        if (0 === \count($intervals['branches']['names'])) {
            if ($intervals['branches']['exclude']) {
                if ($hasNumericMatchAll) {
                    return new MatchAllConstraint();
                }
            }
        } else {
            foreach ($intervals['branches']['names'] as $branchName) {
                if ($intervals['branches']['exclude']) {
                    $devConstraints[] = new Constraint('!=', $branchName);
                } else {
                    $devConstraints[] = new Constraint('==', $branchName);
                }
            }
            if ($intervals['branches']['exclude']) {
                if (\count($constraints) > 1) {
                    return new MultiConstraint(array_merge(array(new MultiConstraint($constraints, \false)), $devConstraints), \true);
                }
                if (\count($constraints) === 1 && (string) $constraints[0] === (string) Interval::fromZero()) {
                    if (\count($devConstraints) > 1) {
                        return new MultiConstraint($devConstraints, \true);
                    }
                    return $devConstraints[0];
                }
                return new MultiConstraint(array_merge($constraints, $devConstraints), \true);
            }
            $constraints = array_merge($constraints, $devConstraints);
        }
        if (\count($constraints) > 1) {
            return new MultiConstraint($constraints, \false);
        }
        if (\count($constraints) === 1) {
            return $constraints[0];
        }
        return new MatchNoneConstraint();
    }
    /**
    @phpstan-return
    */
    public static function get(ConstraintInterface $constraint)
    {
        $key = (string) $constraint;
        if (!isset(self::$intervalsCache[$key])) {
            self::$intervalsCache[$key] = self::generateIntervals($constraint);
        }
        return self::$intervalsCache[$key];
    }
    /**
    @phpstan-return
    */
    private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = \false)
    {
        if ($constraint instanceof MatchAllConstraint) {
            return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev());
        }
        if ($constraint instanceof MatchNoneConstraint) {
            return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => \false));
        }
        if ($constraint instanceof Constraint) {
            return self::generateSingleConstraintIntervals($constraint);
        }
        if (!$constraint instanceof MultiConstraint) {
            throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got ' . \get_class($constraint) . '.');
        }
        $constraints = $constraint->getConstraints();
        $numericGroups = array();
        $constraintBranches = array();
        foreach ($constraints as $c) {
            $res = self::get($c);
            $numericGroups[] = $res['numeric'];
            $constraintBranches[] = $res['branches'];
        }
        if ($constraint->isDisjunctive()) {
            $branches = Interval::noDev();
            foreach ($constraintBranches as $b) {
                if ($b['exclude']) {
                    if ($branches['exclude']) {
                        $branches['names'] = array_intersect($branches['names'], $b['names']);
                    } else {
                        $branches['exclude'] = \true;
                        $branches['names'] = array_diff($b['names'], $branches['names']);
                    }
                } else if ($branches['exclude']) {
                    $branches['names'] = array_diff($branches['names'], $b['names']);
                } else {
                    $branches['names'] = array_merge($branches['names'], $b['names']);
                }
            }
        } else {
            $branches = Interval::anyDev();
            foreach ($constraintBranches as $b) {
                if ($b['exclude']) {
                    if ($branches['exclude']) {
                        $branches['names'] = array_merge($branches['names'], $b['names']);
                    } else {
                        $branches['names'] = array_diff($branches['names'], $b['names']);
                    }
                } else if ($branches['exclude']) {
                    $branches['names'] = array_diff($b['names'], $branches['names']);
                    $branches['exclude'] = \false;
                } else {
                    $branches['names'] = array_intersect($branches['names'], $b['names']);
                }
            }
        }
        $branches['names'] = array_unique($branches['names']);
        if (\count($numericGroups) === 1) {
            return array('numeric' => $numericGroups[0], 'branches' => $branches);
        }
        $borders = array();
        foreach ($numericGroups as $group) {
            foreach ($group as $interval) {
                $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start');
                $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end');
            }
        }
        $opSortOrder = self::$opSortOrder;
        usort($borders, function ($a, $b) use ($opSortOrder) {
            $order = version_compare($a['version'], $b['version']);
            if ($order === 0) {
                return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']];
            }
            return $order;
        });
        $activeIntervals = 0;
        $intervals = array();
        $index = 0;
        $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1;
        $start = null;
        foreach ($borders as $border) {
            if ($border['side'] === 'start') {
                $activeIntervals++;
            } else {
                $activeIntervals--;
            }
            if (!$start && $activeIntervals >= $activationThreshold) {
                $start = new Constraint($border['operator'], $border['version']);
            } elseif ($start && $activeIntervals < $activationThreshold) {
                if (version_compare($start->getVersion(), $border['version'], '=') && ($start->getOperator() === '>' && $border['operator'] === '<=' || $start->getOperator() === '>=' && $border['operator'] === '<')) {
                    unset($intervals[$index]);
                } else {
                    $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version']));
                    $index++;
                    if ($stopOnFirstValidInterval) {
                        break;
                    }
                }
                $start = null;
            }
        }
        return array('numeric' => $intervals, 'branches' => $branches);
    }
    /**
    @phpstan-return
    */
    private static function generateSingleConstraintIntervals(Constraint $constraint)
    {
        $op = $constraint->getOperator();
        if (strpos($constraint->getVersion(), 'dev-') === 0) {
            $intervals = array();
            $branches = array('names' => array(), 'exclude' => \false);
            if ($op === '!=') {
                $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity());
                $branches = array('names' => array($constraint->getVersion()), 'exclude' => \true);
            } elseif ($op === '==') {
                $branches['names'][] = $constraint->getVersion();
            }
            return array('numeric' => $intervals, 'branches' => $branches);
        }
        if ($op[0] === '>') {
            return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev());
        }
        if ($op[0] === '<') {
            return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev());
        }
        if ($op === '!=') {
            return array('numeric' => array(new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev());
        }
        return array('numeric' => array(new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion()))), 'branches' => Interval::noDev());
    }
}
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\ConstraintInterface;
use HumbugBox465\Composer\Semver\Constraint\MatchAllConstraint;
use HumbugBox465\Composer\Semver\Constraint\MultiConstraint;
use HumbugBox465\Composer\Semver\Constraint\Constraint;
class VersionParser
{
    private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?';
    private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev';
    /**
    @phpstan-return
    */
    public static function parseStability($version)
    {
        $version = (string) preg_replace('{#.+$}', '', (string) $version);
        if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) {
            return 'dev';
        }
        preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match);
        if (!empty($match[3])) {
            return 'dev';
        }
        if (!empty($match[1])) {
            if ('beta' === $match[1] || 'b' === $match[1]) {
                return 'beta';
            }
            if ('alpha' === $match[1] || 'a' === $match[1]) {
                return 'alpha';
            }
            if ('rc' === $match[1]) {
                return 'RC';
            }
        }
        return 'stable';
    }
    public static function normalizeStability($stability)
    {
        $stability = strtolower((string) $stability);
        return $stability === 'rc' ? 'RC' : $stability;
    }
    public function normalize($version, $fullVersion = null)
    {
        $version = trim((string) $version);
        $origVersion = $version;
        if (null === $fullVersion) {
            $fullVersion = $version;
        }
        if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) {
            $version = $match[1];
        }
        if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) {
            $version = substr($version, 0, strlen($version) - strlen($match[0]));
        }
        if (\in_array($version, array('master', 'trunk', 'default'), \true)) {
            $version = 'dev-' . $version;
        }
        if (stripos($version, 'dev-') === 0) {
            return 'dev-' . substr($version, 4);
        }
        if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) {
            $version = $match[1];
        }
        if (preg_match('{^v?(\d{1,5}+)(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) {
            $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0');
            $index = 5;
        } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) {
            $version = (string) preg_replace('{\D}', '.', $matches[1]);
            $index = 2;
        }
        if (isset($index)) {
            if (!empty($matches[$index])) {
                if ('stable' === $matches[$index]) {
                    return $version;
                }
                $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : '');
            }
            if (!empty($matches[$index + 2])) {
                $version .= '-dev';
            }
            return $version;
        }
        if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) {
            try {
                $normalized = $this->normalizeBranch($match[1]);
                if (strpos($normalized, 'dev-') === \false) {
                    return $normalized;
                }
            } catch (\Exception $e) {
            }
        }
        $extraMessage = '';
        if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) {
            $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version';
        } elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) {
            $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-';
        }
        throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage);
    }
    public function parseNumericAliasPrefix($branch)
    {
        if (preg_match('{^(?P<version>(\d++\.)*\d++)(?:\.x)?-dev$}i', (string) $branch, $matches)) {
            return $matches['version'] . '.';
        }
        return \false;
    }
    public function normalizeBranch($name)
    {
        $name = trim((string) $name);
        if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) {
            $version = '';
            for ($i = 1; $i < 5; ++$i) {
                $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x';
            }
            return str_replace('x', '9999999', $version) . '-dev';
        }
        return 'dev-' . $name;
    }
    public function normalizeDefaultBranch($name)
    {
        if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') {
            return '9999999-dev';
        }
        return (string) $name;
    }
    public function parseConstraints($constraints)
    {
        $prettyConstraint = (string) $constraints;
        $orConstraints = preg_split('{\s*\|\|?\s*}', trim((string) $constraints));
        if (\false === $orConstraints) {
            throw new \RuntimeException('Failed to preg_split string: ' . $constraints);
        }
        $orGroups = array();
        foreach ($orConstraints as $orConstraint) {
            $andConstraints = preg_split('{(?<!^|as|[=>< ,]) *(?<!-)[, ](?!-) *(?!,|as|$)}', $orConstraint);
            if (\false === $andConstraints) {
                throw new \RuntimeException('Failed to preg_split string: ' . $orConstraint);
            }
            if (\count($andConstraints) > 1) {
                $constraintObjects = array();
                foreach ($andConstraints as $andConstraint) {
                    foreach ($this->parseConstraint($andConstraint) as $parsedAndConstraint) {
                        $constraintObjects[] = $parsedAndConstraint;
                    }
                }
            } else {
                $constraintObjects = $this->parseConstraint($andConstraints[0]);
            }
            if (1 === \count($constraintObjects)) {
                $constraint = $constraintObjects[0];
            } else {
                $constraint = new MultiConstraint($constraintObjects);
            }
            $orGroups[] = $constraint;
        }
        $parsedConstraint = MultiConstraint::create($orGroups, \false);
        $parsedConstraint->setPrettyString($prettyConstraint);
        return $parsedConstraint;
    }
    /**
    @phpstan-return
    */
    private function parseConstraint($constraint)
    {
        if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $constraint, $match)) {
            $constraint = $match[1];
        }
        if (preg_match('{^([^,\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) {
            $constraint = '' !== $match[1] ? $match[1] : '*';
            if ($match[2] !== 'stable') {
                $stabilityModifier = $match[2];
            }
        }
        if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraint, $match)) {
            $constraint = $match[1];
        }
        if (preg_match('{^(v)?[xX*](\.[xX*])*$}i', $constraint, $match)) {
            if (!empty($match[1]) || !empty($match[2])) {
                return array(new Constraint('>=', '0.0.0.0-dev'));
            }
            return array(new MatchAllConstraint());
        }
        $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?(?:' . self::$modifierRegex . '|\.([xX*][.-]?dev))(?:\+[^\s]+)?';
        if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) {
            if (strpos($constraint, '~>') === 0) {
                throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator');
            }
            if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) {
                $position = 4;
            } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) {
                $position = 3;
            } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) {
                $position = 2;
            } else {
                $position = 1;
            }
            if (!empty($matches[8])) {
                $position++;
            }
            $stabilitySuffix = '';
            if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) {
                $stabilitySuffix .= '-dev';
            }
            $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1));
            $lowerBound = new Constraint('>=', $lowVersion);
            $highPosition = max(1, $position - 1);
            $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev';
            $upperBound = new Constraint('<', $highVersion);
            return array($lowerBound, $upperBound);
        }
        if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) {
            if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) {
                $position = 1;
            } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) {
                $position = 2;
            } else {
                $position = 3;
            }
            $stabilitySuffix = '';
            if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) {
                $stabilitySuffix .= '-dev';
            }
            $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1));
            $lowerBound = new Constraint('>=', $lowVersion);
            $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';
            $upperBound = new Constraint('<', $highVersion);
            return array($lowerBound, $upperBound);
        }
        if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) {
            if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) {
                $position = 3;
            } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) {
                $position = 2;
            } else {
                $position = 1;
            }
            $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev';
            $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';
            if ($lowVersion === '0.0.0.0-dev') {
                return array(new Constraint('<', $highVersion));
            }
            return array(new Constraint('>=', $lowVersion), new Constraint('<', $highVersion));
        }
        if (preg_match('{^(?P<from>' . $versionRegex . ') +- +(?P<to>' . $versionRegex . ')($)}i', $constraint, $matches)) {
            $lowStabilitySuffix = '';
            if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) {
                $lowStabilitySuffix = '-dev';
            }
            $lowVersion = $this->normalize($matches['from']);
            $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix);
            $empty = function ($x) {
                return $x === 0 || $x === '0' ? \false : empty($x);
            };
            if (!$empty($matches[12]) && !$empty($matches[13]) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) {
                $highVersion = $this->normalize($matches['to']);
                $upperBound = new Constraint('<=', $highVersion);
            } else {
                $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]);
                $this->normalize($matches['to']);
                $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev';
                $upperBound = new Constraint('<', $highVersion);
            }
            return array($lowerBound, $upperBound);
        }
        if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
            try {
                try {
                    $version = $this->normalize($matches[2]);
                } catch (\UnexpectedValueException $e) {
                    if (substr($matches[2], -4) === '-dev' && preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) {
                        $version = $this->normalize('dev-' . substr($matches[2], 0, -4));
                    } else {
                        throw $e;
                    }
                }
                $op = $matches[1] ?: '=';
                if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') {
                    $version .= '-' . $stabilityModifier;
                } elseif ('<' === $op || '>=' === $op) {
                    if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) {
                        if (strpos($matches[2], 'dev-') !== 0) {
                            $version .= '-dev';
                        }
                    }
                }
                return array(new Constraint($matches[1] ?: '=', $version));
            } catch (\Exception $e) {
            }
        }
        $message = 'Could not parse version constraint ' . $constraint;
        if (isset($e)) {
            $message .= ': ' . $e->getMessage();
        }
        throw new \UnexpectedValueException($message);
    }
    /**
    @phpstan-param
    */
    private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0')
    {
        for ($i = 4; $i > 0; --$i) {
            if ($i > $position) {
                $matches[$i] = $pad;
            } elseif ($i === $position && $increment) {
                $matches[$i] += $increment;
                if ($matches[$i] < 0) {
                    $matches[$i] = $pad;
                    --$position;
                    if ($i === 1) {
                        return null;
                    }
                }
            }
        }
        return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4];
    }
    private function expandStability($stability)
    {
        $stability = strtolower($stability);
        switch ($stability) {
            case 'a':
                return 'alpha';
            case 'b':
                return 'beta';
            case 'p':
            case 'pl':
                return 'patch';
            case 'rc':
                return 'RC';
            default:
                return $stability;
        }
    }
}
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\Constraint;
class Semver
{
    const SORT_ASC = 1;
    const SORT_DESC = -1;
    private static $versionParser;
    public static function satisfies($version, $constraints)
    {
        if (null === self::$versionParser) {
            self::$versionParser = new VersionParser();
        }
        $versionParser = self::$versionParser;
        $provider = new Constraint('==', $versionParser->normalize($version));
        $parsedConstraints = $versionParser->parseConstraints($constraints);
        return $parsedConstraints->matches($provider);
    }
    public static function satisfiedBy(array $versions, $constraints)
    {
        $versions = array_filter($versions, function ($version) use ($constraints) {
            return Semver::satisfies($version, $constraints);
        });
        return array_values($versions);
    }
    public static function sort(array $versions)
    {
        return self::usort($versions, self::SORT_ASC);
    }
    public static function rsort(array $versions)
    {
        return self::usort($versions, self::SORT_DESC);
    }
    private static function usort(array $versions, $direction)
    {
        if (null === self::$versionParser) {
            self::$versionParser = new VersionParser();
        }
        $versionParser = self::$versionParser;
        $normalized = array();
        foreach ($versions as $key => $version) {
            $normalizedVersion = $versionParser->normalize($version);
            $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion);
            $normalized[] = array($normalizedVersion, $key);
        }
        usort($normalized, function (array $left, array $right) use ($direction) {
            if ($left[0] === $right[0]) {
                return 0;
            }
            if (Comparator::lessThan($left[0], $right[0])) {
                return -$direction;
            }
            return $direction;
        });
        $sorted = array();
        foreach ($normalized as $item) {
            $sorted[] = $versions[$item[1]];
        }
        return $sorted;
    }
}
<?php

namespace HumbugBox465\Composer\Semver;

use HumbugBox465\Composer\Semver\Constraint\Constraint;
class Comparator
{
    public static function greaterThan($version1, $version2)
    {
        return self::compare($version1, '>', $version2);
    }
    public static function greaterThanOrEqualTo($version1, $version2)
    {
        return self::compare($version1, '>=', $version2);
    }
    public static function lessThan($version1, $version2)
    {
        return self::compare($version1, '<', $version2);
    }
    public static function lessThanOrEqualTo($version1, $version2)
    {
        return self::compare($version1, '<=', $version2);
    }
    public static function equalTo($version1, $version2)
    {
        return self::compare($version1, '==', $version2);
    }
    public static function notEqualTo($version1, $version2)
    {
        return self::compare($version1, '!=', $version2);
    }
    /**
    @phpstan-param
    */
    public static function compare($version1, $operator, $version2)
    {
        $constraint = new Constraint($operator, $version2);
        return $constraint->matchSpecific(new Constraint('==', $version1), \true);
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

class Constraint implements ConstraintInterface
{
    const OP_EQ = 0;
    const OP_LT = 1;
    const OP_LE = 2;
    const OP_GT = 3;
    const OP_GE = 4;
    const OP_NE = 5;
    const STR_OP_EQ = '==';
    const STR_OP_EQ_ALT = '=';
    const STR_OP_LT = '<';
    const STR_OP_LE = '<=';
    const STR_OP_GT = '>';
    const STR_OP_GE = '>=';
    const STR_OP_NE = '!=';
    const STR_OP_NE_ALT = '<>';
    /**
    @phpstan-var
    */
    private static $transOpStr = array('=' => self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE);
    /**
    @phpstan-var
    */
    private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!=');
    /**
    @phpstan-var
    */
    protected $operator;
    protected $version;
    protected $prettyString;
    protected $lowerBound;
    protected $upperBound;
    /**
    @phpstan-param
    */
    public function __construct($operator, $version)
    {
        if (!isset(self::$transOpStr[$operator])) {
            throw new \InvalidArgumentException(sprintf('Invalid operator "%s" given, expected one of: %s', $operator, implode(', ', self::getSupportedOperators())));
        }
        $this->operator = self::$transOpStr[$operator];
        $this->version = $version;
    }
    public function getVersion()
    {
        return $this->version;
    }
    /**
    @phpstan-return
    */
    public function getOperator()
    {
        return self::$transOpInt[$this->operator];
    }
    public function matches(ConstraintInterface $provider)
    {
        if ($provider instanceof self) {
            return $this->matchSpecific($provider);
        }
        return $provider->matches($this);
    }
    public function setPrettyString($prettyString)
    {
        $this->prettyString = $prettyString;
    }
    public function getPrettyString()
    {
        if ($this->prettyString) {
            return $this->prettyString;
        }
        return $this->__toString();
    }
    /**
    @phpstan-return
    */
    public static function getSupportedOperators()
    {
        return array_keys(self::$transOpStr);
    }
    /**
    @phpstan-param
    @phpstan-return
    */
    public static function getOperatorConstant($operator)
    {
        return self::$transOpStr[$operator];
    }
    /**
    @phpstan-param
    */
    public function versionCompare($a, $b, $operator, $compareBranches = \false)
    {
        if (!isset(self::$transOpStr[$operator])) {
            throw new \InvalidArgumentException(sprintf('Invalid operator "%s" given, expected one of: %s', $operator, implode(', ', self::getSupportedOperators())));
        }
        $aIsBranch = strpos($a, 'dev-') === 0;
        $bIsBranch = strpos($b, 'dev-') === 0;
        if ($operator === '!=' && ($aIsBranch || $bIsBranch)) {
            return $a !== $b;
        }
        if ($aIsBranch && $bIsBranch) {
            return $operator === '==' && $a === $b;
        }
        if (!$compareBranches && ($aIsBranch || $bIsBranch)) {
            return \false;
        }
        return \version_compare($a, $b, $operator);
    }
    public function compile($otherOperator)
    {
        if (strpos($this->version, 'dev-') === 0) {
            if (self::OP_EQ === $this->operator) {
                if (self::OP_EQ === $otherOperator) {
                    return sprintf('$b && $v === %s', \var_export($this->version, \true));
                }
                if (self::OP_NE === $otherOperator) {
                    return sprintf('!$b || $v !== %s', \var_export($this->version, \true));
                }
                return 'false';
            }
            if (self::OP_NE === $this->operator) {
                if (self::OP_EQ === $otherOperator) {
                    return sprintf('!$b || $v !== %s', \var_export($this->version, \true));
                }
                if (self::OP_NE === $otherOperator) {
                    return 'true';
                }
                return '!$b';
            }
            return 'false';
        }
        if (self::OP_EQ === $this->operator) {
            if (self::OP_EQ === $otherOperator) {
                return sprintf('\version_compare($v, %s, \'==\')', \var_export($this->version, \true));
            }
            if (self::OP_NE === $otherOperator) {
                return sprintf('$b || \version_compare($v, %s, \'!=\')', \var_export($this->version, \true));
            }
            return sprintf('!$b && \version_compare(%s, $v, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$otherOperator]);
        }
        if (self::OP_NE === $this->operator) {
            if (self::OP_EQ === $otherOperator) {
                return sprintf('$b || (!$b && \version_compare($v, %s, \'!=\'))', \var_export($this->version, \true));
            }
            if (self::OP_NE === $otherOperator) {
                return 'true';
            }
            return '!$b';
        }
        if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) {
            if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) {
                return '!$b';
            }
        } else if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) {
            return '!$b';
        }
        if (self::OP_NE === $otherOperator) {
            return 'true';
        }
        $codeComparison = sprintf('\version_compare($v, %s, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$this->operator]);
        if ($this->operator === self::OP_LE) {
            if ($otherOperator === self::OP_GT) {
                return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison;
            }
        } elseif ($this->operator === self::OP_GE) {
            if ($otherOperator === self::OP_LT) {
                return sprintf('!$b && \version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison;
            }
        }
        return sprintf('!$b && %s', $codeComparison);
    }
    public function matchSpecific(Constraint $provider, $compareBranches = \false)
    {
        $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]);
        $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]);
        $isEqualOp = self::OP_EQ === $this->operator;
        $isNonEqualOp = self::OP_NE === $this->operator;
        $isProviderEqualOp = self::OP_EQ === $provider->operator;
        $isProviderNonEqualOp = self::OP_NE === $provider->operator;
        if ($isNonEqualOp || $isProviderNonEqualOp) {
            if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && strpos($provider->version, 'dev-') === 0) {
                return \false;
            }
            if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && strpos($this->version, 'dev-') === 0) {
                return \false;
            }
            if (!$isEqualOp && !$isProviderEqualOp) {
                return \true;
            }
            return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches);
        }
        if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) {
            return !(strpos($this->version, 'dev-') === 0 || strpos($provider->version, 'dev-') === 0);
        }
        $version1 = $isEqualOp ? $this->version : $provider->version;
        $version2 = $isEqualOp ? $provider->version : $this->version;
        $operator = $isEqualOp ? $provider->operator : $this->operator;
        if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) {
            return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp && \version_compare($provider->version, $this->version, '=='));
        }
        return \false;
    }
    public function __toString()
    {
        return self::$transOpInt[$this->operator] . ' ' . $this->version;
    }
    public function getLowerBound()
    {
        $this->extractBounds();
        return $this->lowerBound;
    }
    public function getUpperBound()
    {
        $this->extractBounds();
        return $this->upperBound;
    }
    private function extractBounds()
    {
        if (null !== $this->lowerBound) {
            return;
        }
        if (strpos($this->version, 'dev-') === 0) {
            $this->lowerBound = Bound::zero();
            $this->upperBound = Bound::positiveInfinity();
            return;
        }
        switch ($this->operator) {
            case self::OP_EQ:
                $this->lowerBound = new Bound($this->version, \true);
                $this->upperBound = new Bound($this->version, \true);
                break;
            case self::OP_LT:
                $this->lowerBound = Bound::zero();
                $this->upperBound = new Bound($this->version, \false);
                break;
            case self::OP_LE:
                $this->lowerBound = Bound::zero();
                $this->upperBound = new Bound($this->version, \true);
                break;
            case self::OP_GT:
                $this->lowerBound = new Bound($this->version, \false);
                $this->upperBound = Bound::positiveInfinity();
                break;
            case self::OP_GE:
                $this->lowerBound = new Bound($this->version, \true);
                $this->upperBound = Bound::positiveInfinity();
                break;
            case self::OP_NE:
                $this->lowerBound = Bound::zero();
                $this->upperBound = Bound::positiveInfinity();
                break;
        }
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

class Bound
{
    private $version;
    private $isInclusive;
    public function __construct($version, $isInclusive)
    {
        $this->version = $version;
        $this->isInclusive = $isInclusive;
    }
    public function getVersion()
    {
        return $this->version;
    }
    public function isInclusive()
    {
        return $this->isInclusive;
    }
    public function isZero()
    {
        return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive();
    }
    public function isPositiveInfinity()
    {
        return $this->getVersion() === \PHP_INT_MAX . '.0.0.0' && !$this->isInclusive();
    }
    public function compareTo(Bound $other, $operator)
    {
        if (!\in_array($operator, array('<', '>'), \true)) {
            throw new \InvalidArgumentException('Does not support any other operator other than > or <.');
        }
        if ($this == $other) {
            return \false;
        }
        $compareResult = version_compare($this->getVersion(), $other->getVersion());
        if (0 !== $compareResult) {
            return ('>' === $operator ? 1 : -1) === $compareResult;
        }
        return '>' === $operator ? $other->isInclusive() : !$other->isInclusive();
    }
    public function __toString()
    {
        return sprintf('%s [%s]', $this->getVersion(), $this->isInclusive() ? 'inclusive' : 'exclusive');
    }
    public static function zero()
    {
        return new Bound('0.0.0.0-dev', \true);
    }
    public static function positiveInfinity()
    {
        return new Bound(\PHP_INT_MAX . '.0.0.0', \false);
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

class MultiConstraint implements ConstraintInterface
{
    /**
    @phpstan-var
    */
    protected $constraints;
    protected $prettyString;
    protected $string;
    protected $conjunctive;
    protected $lowerBound;
    protected $upperBound;
    public function __construct(array $constraints, $conjunctive = \true)
    {
        if (\count($constraints) < 2) {
            throw new \InvalidArgumentException('Must provide at least two constraints for a MultiConstraint. Use ' . 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use ' . 'MultiConstraint::create() which optimizes and handles those cases automatically.');
        }
        $this->constraints = $constraints;
        $this->conjunctive = $conjunctive;
    }
    public function getConstraints()
    {
        return $this->constraints;
    }
    public function isConjunctive()
    {
        return $this->conjunctive;
    }
    public function isDisjunctive()
    {
        return !$this->conjunctive;
    }
    public function compile($otherOperator)
    {
        $parts = array();
        foreach ($this->constraints as $constraint) {
            $code = $constraint->compile($otherOperator);
            if ($code === 'true') {
                if (!$this->conjunctive) {
                    return 'true';
                }
            } elseif ($code === 'false') {
                if ($this->conjunctive) {
                    return 'false';
                }
            } else {
                $parts[] = '(' . $code . ')';
            }
        }
        if (!$parts) {
            return $this->conjunctive ? 'true' : 'false';
        }
        return $this->conjunctive ? implode('&&', $parts) : implode('||', $parts);
    }
    public function matches(ConstraintInterface $provider)
    {
        if (\false === $this->conjunctive) {
            foreach ($this->constraints as $constraint) {
                if ($provider->matches($constraint)) {
                    return \true;
                }
            }
            return \false;
        }
        if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) {
            return $provider->matches($this);
        }
        foreach ($this->constraints as $constraint) {
            if (!$provider->matches($constraint)) {
                return \false;
            }
        }
        return \true;
    }
    public function setPrettyString($prettyString)
    {
        $this->prettyString = $prettyString;
    }
    public function getPrettyString()
    {
        if ($this->prettyString) {
            return $this->prettyString;
        }
        return (string) $this;
    }
    public function __toString()
    {
        if ($this->string !== null) {
            return $this->string;
        }
        $constraints = array();
        foreach ($this->constraints as $constraint) {
            $constraints[] = (string) $constraint;
        }
        return $this->string = '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']';
    }
    public function getLowerBound()
    {
        $this->extractBounds();
        if (null === $this->lowerBound) {
            throw new \LogicException('extractBounds should have populated the lowerBound property');
        }
        return $this->lowerBound;
    }
    public function getUpperBound()
    {
        $this->extractBounds();
        if (null === $this->upperBound) {
            throw new \LogicException('extractBounds should have populated the upperBound property');
        }
        return $this->upperBound;
    }
    public static function create(array $constraints, $conjunctive = \true)
    {
        if (0 === \count($constraints)) {
            return new MatchAllConstraint();
        }
        if (1 === \count($constraints)) {
            return $constraints[0];
        }
        $optimized = self::optimizeConstraints($constraints, $conjunctive);
        if ($optimized !== null) {
            list($constraints, $conjunctive) = $optimized;
            if (\count($constraints) === 1) {
                return $constraints[0];
            }
        }
        return new self($constraints, $conjunctive);
    }
    /**
    @phpstan-return
    */
    private static function optimizeConstraints(array $constraints, $conjunctive)
    {
        if (!$conjunctive) {
            $left = $constraints[0];
            $mergedConstraints = array();
            $optimized = \false;
            for ($i = 1, $l = \count($constraints); $i < $l; $i++) {
                $right = $constraints[$i];
                if ($left instanceof self && $left->conjunctive && $right instanceof self && $right->conjunctive && \count($left->constraints) === 2 && \count($right->constraints) === 2 && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && substr($left1, 2) === substr($right0, 3)) {
                    $optimized = \true;
                    $left = new MultiConstraint(array($left->constraints[0], $right->constraints[1]), \true);
                } else {
                    $mergedConstraints[] = $left;
                    $left = $right;
                }
            }
            if ($optimized) {
                $mergedConstraints[] = $left;
                return array($mergedConstraints, \false);
            }
        }
        return null;
    }
    private function extractBounds()
    {
        if (null !== $this->lowerBound) {
            return;
        }
        foreach ($this->constraints as $constraint) {
            if (null === $this->lowerBound || null === $this->upperBound) {
                $this->lowerBound = $constraint->getLowerBound();
                $this->upperBound = $constraint->getUpperBound();
                continue;
            }
            if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) {
                $this->lowerBound = $constraint->getLowerBound();
            }
            if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) {
                $this->upperBound = $constraint->getUpperBound();
            }
        }
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

class MatchAllConstraint implements ConstraintInterface
{
    protected $prettyString;
    public function matches(ConstraintInterface $provider)
    {
        return \true;
    }
    public function compile($otherOperator)
    {
        return 'true';
    }
    public function setPrettyString($prettyString)
    {
        $this->prettyString = $prettyString;
    }
    public function getPrettyString()
    {
        if ($this->prettyString) {
            return $this->prettyString;
        }
        return (string) $this;
    }
    public function __toString()
    {
        return '*';
    }
    public function getUpperBound()
    {
        return Bound::positiveInfinity();
    }
    public function getLowerBound()
    {
        return Bound::zero();
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

class MatchNoneConstraint implements ConstraintInterface
{
    protected $prettyString;
    public function matches(ConstraintInterface $provider)
    {
        return \false;
    }
    public function compile($otherOperator)
    {
        return 'false';
    }
    public function setPrettyString($prettyString)
    {
        $this->prettyString = $prettyString;
    }
    public function getPrettyString()
    {
        if ($this->prettyString) {
            return $this->prettyString;
        }
        return (string) $this;
    }
    public function __toString()
    {
        return '[]';
    }
    public function getUpperBound()
    {
        return new Bound('0.0.0.0-dev', \false);
    }
    public function getLowerBound()
    {
        return new Bound('0.0.0.0-dev', \false);
    }
}
<?php

namespace HumbugBox465\Composer\Semver\Constraint;

interface ConstraintInterface
{
    public function matches(ConstraintInterface $provider);
    /**
    @phpstan-param
    */
    public function compile($otherOperator);
    public function getUpperBound();
    public function getLowerBound();
    public function getPrettyString();
    public function setPrettyString($prettyString);
    public function __toString();
}
<?php

// autoload.php @generated by Composer

if (PHP_VERSION_ID < 50600) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, $err);
        } elseif (!headers_sent()) {
            echo $err;
        }
    }
    throw new RuntimeException($err);
}

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInitHumbugBox465::getLoader();
<?php

namespace _HumbugBoxdae3b739090c;

return array (
  0 => 
  array (
    'type' => 'php',
    'condition' => '^8.2',
    'source' => NULL,
    'message' => 'This application requires a PHP version matching "^8.2".',
    'helpMessage' => 'This application requires a PHP version matching "^8.2".',
  ),
  1 => 
  array (
    'type' => 'extension',
    'condition' => 'curl',
    'source' => 'zumba/amplitude-php',
    'message' => 'The package "zumba/amplitude-php" requires the extension "curl".',
    'helpMessage' => 'The package "zumba/amplitude-php" requires the extension "curl". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  2 => 
  array (
    'type' => 'extension',
    'condition' => 'filter',
    'source' => 'league/csv',
    'message' => 'The package "league/csv" requires the extension "filter".',
    'helpMessage' => 'The package "league/csv" requires the extension "filter". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  3 => 
  array (
    'type' => 'extension',
    'condition' => 'iconv',
    'source' => 'symfony/polyfill-mbstring',
    'message' => 'The package "symfony/polyfill-mbstring" requires the extension "iconv".',
    'helpMessage' => 'The package "symfony/polyfill-mbstring" requires the extension "iconv". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  4 => 
  array (
    'type' => 'extension',
    'condition' => 'json',
    'source' => NULL,
    'message' => 'This application requires the extension "json".',
    'helpMessage' => 'This application requires the extension "json". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  5 => 
  array (
    'type' => 'extension',
    'condition' => 'json',
    'source' => 'guzzlehttp/guzzle',
    'message' => 'The package "guzzlehttp/guzzle" requires the extension "json".',
    'helpMessage' => 'The package "guzzlehttp/guzzle" requires the extension "json". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  6 => 
  array (
    'type' => 'extension',
    'condition' => 'json',
    'source' => 'league/oauth2-client',
    'message' => 'The package "league/oauth2-client" requires the extension "json".',
    'helpMessage' => 'The package "league/oauth2-client" requires the extension "json". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  7 => 
  array (
    'type' => 'extension',
    'condition' => 'json',
    'source' => 'm4tthumphrey/php-gitlab-api',
    'message' => 'The package "m4tthumphrey/php-gitlab-api" requires the extension "json".',
    'helpMessage' => 'The package "m4tthumphrey/php-gitlab-api" requires the extension "json". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  8 => 
  array (
    'type' => 'extension',
    'condition' => 'json',
    'source' => 'zumba/amplitude-php',
    'message' => 'The package "zumba/amplitude-php" requires the extension "json".',
    'helpMessage' => 'The package "zumba/amplitude-php" requires the extension "json". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  9 => 
  array (
    'type' => 'extension',
    'condition' => 'openssl',
    'source' => 'composer/ca-bundle',
    'message' => 'The package "composer/ca-bundle" requires the extension "openssl".',
    'helpMessage' => 'The package "composer/ca-bundle" requires the extension "openssl". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  10 => 
  array (
    'type' => 'extension',
    'condition' => 'pcre',
    'source' => 'composer/ca-bundle',
    'message' => 'The package "composer/ca-bundle" requires the extension "pcre".',
    'helpMessage' => 'The package "composer/ca-bundle" requires the extension "pcre". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  11 => 
  array (
    'type' => 'extension',
    'condition' => 'pcre',
    'source' => 'vlucas/phpdotenv',
    'message' => 'The package "vlucas/phpdotenv" requires the extension "pcre".',
    'helpMessage' => 'The package "vlucas/phpdotenv" requires the extension "pcre". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  12 => 
  array (
    'type' => 'extension',
    'condition' => 'reflection',
    'source' => 'marc-mabe/php-enum',
    'message' => 'The package "marc-mabe/php-enum" requires the extension "reflection".',
    'helpMessage' => 'The package "marc-mabe/php-enum" requires the extension "reflection". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  13 => 
  array (
    'type' => 'extension',
    'condition' => 'xml',
    'source' => 'm4tthumphrey/php-gitlab-api',
    'message' => 'The package "m4tthumphrey/php-gitlab-api" requires the extension "xml".',
    'helpMessage' => 'The package "m4tthumphrey/php-gitlab-api" requires the extension "xml". You either need to enable it or request the application to be shipped with a polyfill for this extension.',
  ),
  14 => 
  array (
    'type' => 'extension-conflict',
    'condition' => 'psr',
    'source' => 'laminas/laminas-servicemanager',
    'message' => 'The package "laminas/laminas-servicemanager" conflicts with the extension "psr".',
    'helpMessage' => 'The package "laminas/laminas-servicemanager" conflicts with the extension "psr". You need to disable it in order to run this application.',
  ),
  15 => 
  array (
    'type' => 'extension-conflict',
    'condition' => 'psr',
    'source' => 'symfony/dependency-injection',
    'message' => 'The package "symfony/dependency-injection" conflicts with the extension "psr".',
    'helpMessage' => 'The package "symfony/dependency-injection" conflicts with the extension "psr". You need to disable it in order to run this application.',
  ),
  16 => 
  array (
    'type' => 'extension-conflict',
    'condition' => 'psr',
    'source' => 'symfony/service-contracts',
    'message' => 'The package "symfony/service-contracts" conflicts with the extension "psr".',
    'helpMessage' => 'The package "symfony/service-contracts" conflicts with the extension "psr". You need to disable it in order to run this application.',
  ),
);<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

interface IsFulfilled
{
    public function __invoke(): bool;
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use function array_shift;
use function count;
use function explode;
use function ltrim;
use function min;
use function sprintf;
use function str_pad;
use function str_repeat;
use function strlen;
use function trim;
use function wordwrap;
use const PHP_EOL;
final class Printer
{
    private $styles = ['reset' => "\x1b[0m", 'red' => "\x1b[31m", 'green' => "\x1b[32m", 'yellow' => "\x1b[33m", 'title' => "\x1b[33m", 'error' => "\x1b[37;41m", 'success' => "\x1b[30;42m"];
    private $verbosity;
    private $supportColors;
    private $width;
    public function __construct(int $verbosity, bool $supportColors, ?int $width = null)
    {
        if (null === $width) {
            $terminal = new Terminal();
            $width = $terminal->getWidth();
        }
        $this->verbosity = $verbosity;
        $this->supportColors = $supportColors;
        $this->width = $width ?: 80;
    }
    public function getVerbosity(): int
    {
        return $this->verbosity;
    }
    public function setVerbosity($verbosity): void
    {
        $this->verbosity = $verbosity;
    }
    public function title(string $title, int $verbosity, ?string $style = null): void
    {
        if (null === $style) {
            $style = 'title';
        }
        $this->printvln('', $verbosity, $style);
        $this->printvln($title, $verbosity, $style);
        $this->printvln(str_repeat('=', min(strlen($title), $this->width)), $verbosity, $style);
        $this->printvln('', $verbosity, $style);
    }
    public function getRequirementErrorMessage(Requirement $requirement): ?string
    {
        if ($requirement->isFulfilled()) {
            return null;
        }
        return wordwrap($requirement->getHelpText(), $this->width - 3, PHP_EOL . '   ') . PHP_EOL;
    }
    public function block(string $title, string $message, int $verbosity, ?string $style = null): void
    {
        $prefix = ' [' . $title . '] ';
        $lineLength = $this->width - strlen($prefix) - 1;
        if ($lineLength < 0) {
            $lineLength = 0;
        }
        $message = $prefix . trim($message);
        $lines = [];
        $remainingMessage = $message;
        $wrapped = wordwrap($remainingMessage, $lineLength, '¬');
        $wrapped = explode('¬', $wrapped);
        do {
            $line = array_shift($wrapped);
            if ($lines && $lineLength > 0) {
                $line = str_repeat(' ', strlen($prefix)) . ltrim($line);
            }
            $lines[] = str_pad($line, $this->width, ' ', \STR_PAD_RIGHT);
        } while (count($wrapped));
        $this->printvln('', $verbosity);
        $this->printvln(str_repeat(' ', $this->width), $verbosity, $style);
        foreach ($lines as $line) {
            $this->printvln($line, $verbosity, $style);
        }
        $this->printv(str_repeat(' ', $this->width), $verbosity, $style);
        $this->printvln('', $verbosity);
    }
    public function printvln(string $message, int $verbosity, ?string $style = null): void
    {
        $this->printv($message, $verbosity, $style);
        $this->printv(PHP_EOL, $verbosity, null);
    }
    public function printv(string $message, int $verbosity, ?string $style = null): void
    {
        if ($verbosity > $this->verbosity) {
            return;
        }
        $message = wordwrap($message, $this->width);
        $message = sprintf('%s%s%s', $this->supportColors && isset($this->styles[$style]) ? $this->styles[$style] : '', $message, $this->supportColors ? $this->styles['reset'] : '');
        if ('1' === getenv('BOX_REQUIREMENTS_CHECKER_LOG_TO_STDOUT')) {
            echo $message;
        } else {
            fwrite(\STDERR, $message);
        }
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use function extension_loaded;
final class IsExtensionFulfilled implements IsFulfilled
{
    private $requiredExtension;
    public function __construct(string $requiredExtension)
    {
        $this->requiredExtension = $requiredExtension;
    }
    public function __invoke(): bool
    {
        return extension_loaded($this->requiredExtension);
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use HumbugBox465\Composer\Semver\Semver;
use function sprintf;
use const PHP_MAJOR_VERSION;
use const PHP_MINOR_VERSION;
use const PHP_RELEASE_VERSION;
final class IsPhpVersionFulfilled implements IsFulfilled
{
    private $requiredPhpVersion;
    public function __construct(string $requiredPhpVersion)
    {
        $this->requiredPhpVersion = $requiredPhpVersion;
    }
    public function __invoke(): bool
    {
        return Semver::satisfies(sprintf('%d.%d.%d', PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION), $this->requiredPhpVersion);
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

final class Requirement
{
    private $checkIsFulfilled;
    private $fulfilled;
    private $testMessage;
    private $helpText;
    public function __construct(IsFulfilled $checkIsFulfilled, string $testMessage, string $helpText)
    {
        $this->checkIsFulfilled = $checkIsFulfilled;
        $this->testMessage = $testMessage;
        $this->helpText = $helpText;
    }
    public function isFulfilled(): bool
    {
        if (!isset($this->fulfilled)) {
            $this->fulfilled = $this->checkIsFulfilled->__invoke();
        }
        return $this->fulfilled;
    }
    public function getIsFullfilledChecker(): IsFulfilled
    {
        return $this->checkIsFulfilled;
    }
    public function getTestMessage(): string
    {
        return $this->testMessage;
    }
    public function getHelpText(): string
    {
        return $this->helpText;
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use function extension_loaded;
final class IsExtensionConflictFulfilled implements IsFulfilled
{
    private $conflictingExtension;
    public function __construct(string $requiredExtension)
    {
        $this->conflictingExtension = $requiredExtension;
    }
    public function __invoke(): bool
    {
        return !extension_loaded($this->conflictingExtension);
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use function fstat;
use function function_exists;
use function getenv;
use function implode;
use function posix_isatty;
use function preg_match;
use function preg_quote;
use function sapi_windows_vt100_support;
use function sprintf;
use function str_replace;
use function stream_isatty;
use const DIRECTORY_SEPARATOR;
use const STDOUT;
final class IO
{
    public const VERBOSITY_QUIET = 16;
    public const VERBOSITY_NORMAL = 32;
    public const VERBOSITY_VERBOSE = 64;
    public const VERBOSITY_VERY_VERBOSE = 128;
    public const VERBOSITY_DEBUG = 256;
    private $interactive;
    private $verbosity = self::VERBOSITY_NORMAL;
    private $colorSupport;
    private $options;
    public function __construct()
    {
        $this->options = implode(' ', $_SERVER['argv']);
        $shellVerbosity = $this->configureVerbosity();
        $this->interactive = $this->checkInteractivity($shellVerbosity);
        $this->colorSupport = $this->checkColorSupport();
    }
    public function isInteractive(): bool
    {
        return $this->interactive;
    }
    public function getVerbosity(): int
    {
        return $this->verbosity;
    }
    public function hasColorSupport(): bool
    {
        return $this->colorSupport;
    }
    public function hasParameter($values): bool
    {
        $values = (array) $values;
        foreach ($values as $value) {
            $regexp = sprintf('/\s%s\b/', str_replace(' ', '\s+', preg_quote($value, '/')));
            if (1 === preg_match($regexp, $this->options)) {
                return \true;
            }
        }
        return \false;
    }
    private function checkInteractivity(int $shellVerbosity): bool
    {
        if (-1 === $shellVerbosity) {
            return \false;
        }
        if (\true === $this->hasParameter(['--no-interaction', '-n'])) {
            return \false;
        }
        if (function_exists('posix_isatty') && !@posix_isatty(STDOUT) && \false === getenv('SHELL_INTERACTIVE')) {
            return \false;
        }
        return \true;
    }
    private function configureVerbosity(): int
    {
        switch ($shellVerbosity = (int) getenv('SHELL_VERBOSITY')) {
            case -1:
                $this->verbosity = self::VERBOSITY_QUIET;
                break;
            case 1:
                $this->verbosity = self::VERBOSITY_VERBOSE;
                break;
            case 2:
                $this->verbosity = self::VERBOSITY_VERY_VERBOSE;
                break;
            case 3:
                $this->verbosity = self::VERBOSITY_DEBUG;
                break;
            default:
                $shellVerbosity = 0;
                break;
        }
        if ($this->hasParameter(['--quiet', '-q'])) {
            $this->verbosity = self::VERBOSITY_QUIET;
            $shellVerbosity = -1;
        } elseif ($this->hasParameter(['-vvv', '--verbose=3', '--verbose 3'])) {
            $this->verbosity = self::VERBOSITY_DEBUG;
            $shellVerbosity = 3;
        } elseif ($this->hasParameter(['-vv', '--verbose=2', '--verbose 2'])) {
            $this->verbosity = self::VERBOSITY_VERY_VERBOSE;
            $shellVerbosity = 2;
        } elseif ($this->hasParameter(['-v', '--verbose=1', '--verbose 1', '--verbose'])) {
            $this->verbosity = self::VERBOSITY_VERBOSE;
            $shellVerbosity = 1;
        }
        return $shellVerbosity;
    }
    private function checkColorSupport(): bool
    {
        if ($this->hasParameter(['--ansi'])) {
            return \true;
        }
        if ($this->hasParameter(['--no-ansi'])) {
            return \false;
        }
        if (DIRECTORY_SEPARATOR === '\\') {
            return function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(STDOUT) || \false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM');
        }
        if (function_exists('stream_isatty')) {
            return stream_isatty(STDOUT);
        }
        if (function_exists('posix_isatty')) {
            return posix_isatty(STDOUT);
        }
        $stat = fstat(STDOUT);
        return $stat ? 020000 === ($stat['mode'] & 0170000) : \false;
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use ArrayIterator;
use Countable;
use IteratorAggregate;
use Traversable;
use function count;
use function get_cfg_var;
final class RequirementCollection implements IteratorAggregate, Countable
{
    private $requirements = [];
    private $phpIniPath;
    public function __construct($phpIniPath = null)
    {
        $this->phpIniPath = $phpIniPath ?? get_cfg_var('cfg_file_path');
    }
    public function getIterator(): Traversable
    {
        return new ArrayIterator($this->requirements);
    }
    public function count(): int
    {
        return count($this->requirements);
    }
    public function add(Requirement $requirement): void
    {
        $this->requirements[] = $requirement;
    }
    public function addRequirement(IsFulfilled $checkIsFulfilled, string $testMessage, string $helpText): void
    {
        $this->add(new Requirement($checkIsFulfilled, $testMessage, $helpText));
    }
    public function getRequirements(): array
    {
        return $this->requirements;
    }
    public function getPhpIniPath()
    {
        return $this->phpIniPath;
    }
    public function evaluateRequirements()
    {
        return array_reduce($this->requirements, static function (bool $checkPassed, Requirement $requirement): bool {
            return $checkPassed && $requirement->isFulfilled();
        }, \true);
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use function exec;
use function fclose;
use function fopen;
use function function_exists;
use function getenv;
use function preg_match;
use function proc_close;
use function proc_open;
use function sapi_windows_cp_get;
use function sapi_windows_cp_set;
use function sapi_windows_vt100_support;
use function stream_get_contents;
use function trim;
use const DIRECTORY_SEPARATOR;
class Terminal
{
    private static $width;
    private static $height;
    private static $stty;
    public function getWidth(): int
    {
        $width = getenv('COLUMNS');
        if (\false !== $width) {
            return (int) trim($width);
        }
        if (!isset(self::$width)) {
            self::initDimensions();
        }
        return self::$width ?: 80;
    }
    public function getHeight(): int
    {
        $height = getenv('LINES');
        if (\false !== $height) {
            return (int) trim($height);
        }
        if (!isset(self::$height)) {
            self::initDimensions();
        }
        return self::$height ?: 50;
    }
    public static function hasSttyAvailable(): bool
    {
        if (isset(self::$stty)) {
            return self::$stty;
        }
        if (!function_exists('exec')) {
            return \false;
        }
        exec('stty 2>&1', $output, $exitcode);
        return self::$stty = 0 === $exitcode;
    }
    private static function initDimensions(): void
    {
        if ('\\' === DIRECTORY_SEPARATOR) {
            if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON') ?: ''), $matches)) {
                self::$width = (int) $matches[1];
                self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2];
            } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) {
                self::initDimensionsUsingStty();
            } elseif (null !== $dimensions = self::getConsoleMode()) {
                self::$width = (int) $dimensions[0];
                self::$height = (int) $dimensions[1];
            }
        } else {
            self::initDimensionsUsingStty();
        }
    }
    private static function hasVt100Support(): bool
    {
        return function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(fopen('php://stdout', 'wb'));
    }
    private static function initDimensionsUsingStty(): void
    {
        if ($sttyString = self::getSttyColumns()) {
            if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) {
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            } elseif (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) {
                self::$width = (int) $matches[2];
                self::$height = (int) $matches[1];
            }
        }
    }
    private static function getConsoleMode(): ?array
    {
        $info = self::readFromProcess('mode CON');
        if (null === $info || !preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
            return null;
        }
        return [(int) $matches[2], (int) $matches[1]];
    }
    private static function getSttyColumns(): ?string
    {
        return self::readFromProcess('stty -a | grep columns');
    }
    private static function readFromProcess(string $command): ?string
    {
        if (!function_exists('proc_open')) {
            return null;
        }
        $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']];
        $cp = function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0;
        if (!$process = @proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true])) {
            return null;
        }
        $info = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        fclose($pipes[2]);
        proc_close($process);
        if ($cp) {
            sapi_windows_cp_set($cp);
        }
        return $info;
    }
}
<?php

declare (strict_types=1);
namespace HumbugBox465\KevinGH\RequirementChecker;

use InvalidArgumentException;
use function count;
use function sprintf;
final class Checker
{
    private static $requirementsConfig;
    public static function checkRequirements(): bool
    {
        $requirements = self::retrieveRequirements();
        $checkPassed = $requirements->evaluateRequirements();
        $io = new IO();
        self::printCheck($checkPassed, new Printer($io->getVerbosity(), $io->hasColorSupport()), $requirements);
        return $checkPassed;
    }
    public static function printCheck($checkPassed, Printer $printer, RequirementCollection $requirements): void
    {
        if (\false === $checkPassed && IO::VERBOSITY_VERY_VERBOSE > $printer->getVerbosity()) {
            $printer->setVerbosity(IO::VERBOSITY_VERY_VERBOSE);
        }
        $verbosity = IO::VERBOSITY_VERY_VERBOSE;
        $iniPath = $requirements->getPhpIniPath();
        $printer->title('Box Requirements Checker', $verbosity);
        $printer->printv('> Using PHP ', $verbosity);
        $printer->printvln(\PHP_VERSION, $verbosity, 'green');
        if ($iniPath) {
            $printer->printvln('> PHP is using the following php.ini file:', $verbosity);
            $printer->printvln('  ' . $iniPath, $verbosity, 'green');
        } else {
            $printer->printvln('> PHP is not using any php.ini file.', $verbosity, 'yellow');
        }
        $printer->printvln('', $verbosity);
        if (count($requirements) > 0) {
            $printer->printvln('> Checking Box requirements:', $verbosity);
            $printer->printv('  ', $verbosity);
        } else {
            $printer->printvln('> No requirements found.', $verbosity);
        }
        $errorMessages = [];
        foreach ($requirements->getRequirements() as $requirement) {
            if ($errorMessage = $printer->getRequirementErrorMessage($requirement)) {
                if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) {
                    $printer->printvln('✘ ' . $requirement->getTestMessage(), IO::VERBOSITY_DEBUG, 'red');
                    $printer->printv('  ', IO::VERBOSITY_DEBUG);
                    $errorMessages[] = $errorMessage;
                } else {
                    $printer->printv('E', $verbosity, 'red');
                    $errorMessages[] = $errorMessage;
                }
                continue;
            }
            if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) {
                $printer->printvln('✔ ' . $requirement->getTestMessage(), IO::VERBOSITY_DEBUG, 'green');
                $printer->printv('  ', IO::VERBOSITY_DEBUG);
            } else {
                $printer->printv('.', $verbosity, 'green');
            }
        }
        if (IO::VERBOSITY_DEBUG !== $printer->getVerbosity() && count($requirements) > 0) {
            $printer->printvln('', $verbosity);
        }
        if ($requirements->evaluateRequirements()) {
            $printer->block('OK', 'Your system is ready to run the application.', $verbosity, 'success');
        } else {
            $printer->block('ERROR', 'Your system is not ready to run the application.', $verbosity, 'error');
            $printer->title('Fix the following mandatory requirements:', $verbosity, 'red');
            foreach ($errorMessages as $errorMessage) {
                $printer->printv(' * ' . $errorMessage, $verbosity);
            }
        }
        $printer->printvln('', $verbosity);
    }
    private static function retrieveRequirements(): RequirementCollection
    {
        if (null === self::$requirementsConfig) {
            self::$requirementsConfig = __DIR__ . '/../.requirements.php';
        }
        $config = require self::$requirementsConfig;
        $requirements = new RequirementCollection();
        foreach ($config as $constraint) {
            $requirements->addRequirement(self::createCondition($constraint['type'], $constraint['condition']), $constraint['message'], $constraint['helpMessage']);
        }
        return $requirements;
    }
    private static function createCondition($type, $condition): IsFulfilled
    {
        switch ($type) {
            case 'php':
                return new IsPhpVersionFulfilled($condition);
            case 'extension':
                return new IsExtensionFulfilled($condition);
            case 'extension-conflict':
                return new IsExtensionConflictFulfilled($condition);
            default:
                throw new InvalidArgumentException(sprintf('Unknown requirement type "%s".', $type));
        }
    }
}
<?php

namespace HumbugBox465\KevinGH\RequirementChecker;

if (isset($_SERVER['BOX_REQUIREMENT_CHECKER'])) {
    $enableRequirementChecker = $_SERVER['BOX_REQUIREMENT_CHECKER'];
    if (is_bool($enableRequirementChecker) && !$enableRequirementChecker) {
        return;
    }
    if (is_string($enableRequirementChecker) && in_array(strtolower($enableRequirementChecker), ['false', '0'], \true)) {
        return;
    }
    if (!is_bool($enableRequirementChecker) && !is_string($enableRequirementChecker)) {
        echo \PHP_EOL . 'Unhandled value type for "BOX_REQUIREMENT_CHECKER". Got "' . gettype($enableRequirementChecker) . '". Proceeding with the requirement checks.' . \PHP_EOL;
    }
}
if (\false === in_array(\PHP_SAPI, array('cli', 'phpdbg', 'embed', 'micro'), \true)) {
    echo \PHP_EOL . 'The application may only be invoked from a command line, got "' . \PHP_SAPI . '"' . \PHP_EOL;
    exit(1);
}
require __DIR__ . '/../vendor/autoload.php';
if (!Checker::checkRequirements()) {
    exit(1);
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class RequireAuth
{
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class RequireRemoteDb
{
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Attribute;




#[\Attribute(\Attribute::TARGET_CLASS)]
class RequireLocalDb
{
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Safe\Exceptions\FilesystemException;

trait IdeCommandTrait
{
private string $phpVersionFilePath;

private function getIdePhpVersion(): ?string
{
try {
return trim($this->localMachineHelper->readFile($this->getIdePhpVersionFilePath()));
} catch (FilesystemException) {
return null;
}
}

public function setPhpVersionFilePath(string $path): void
{
$this->phpVersionFilePath = $path;
}

protected function getIdePhpVersionFilePath(): string
{
if (!isset($this->phpVersionFilePath)) {
$this->phpVersionFilePath = '/home/ide/configs/php/.version';
}
return $this->phpVersionFilePath;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use loophp\phposinfo\OsInfo;
use Psr\Http\Message\StreamInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Path;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Process\Process;

use function safe\file_get_contents;





class LocalMachineHelper
{
use LoggerAwareTrait;

private ?bool $isTty;




private array $installedBinaries = [];

private SymfonyStyle $io;

public function __construct(
private readonly InputInterface $input,
private readonly OutputInterface $output,
LoggerInterface $logger
) {
$this->setLogger($logger);
$this->io = new SymfonyStyle($input, $output);
}







public function commandExists(string $command): bool
{
if (array_key_exists($command, $this->installedBinaries)) {
return $this->installedBinaries[$command];
}
$osCommand = OsInfo::isWindows() ? ['where', $command] : [
'which',
$command,
];
$exists = $this->execute($osCommand, null, null, false, null, null, false)
->isSuccessful();
$this->installedBinaries[$command] = $exists;
return $exists;
}

public function checkRequiredBinariesExist(array $binaries = []): void
{
foreach ($binaries as $binary) {
if (!$this->commandExists($binary)) {
throw new AcquiaCliException("The required binary `$binary` does not exist. Install it and ensure it exists in a location listed in your system \$PATH");
}
}
}




public function execute(array $cmd, ?callable $callback = null, ?string $cwd = null, ?bool $printOutput = true, ?float $timeout = null, ?array $env = null, bool $stdin = true): Process
{
$process = new Process($cmd);
$process = $this->configureProcess($process, $cwd, $printOutput, $timeout, $env, $stdin);
return $this->executeProcess($process, $callback, $printOutput, $env);
}












public function executeFromCmd(string $cmd, ?callable $callback = null, ?string $cwd = null, ?bool $printOutput = true, ?int $timeout = null, ?array $env = null): Process
{
$process = Process::fromShellCommandline($cmd);
$process = $this->configureProcess($process, $cwd, $printOutput, $timeout, $env);

return $this->executeProcess($process, $callback, $printOutput, $env);
}




private function configureProcess(Process $process, ?string $cwd = null, ?bool $printOutput = true, ?float $timeout = null, ?array $env = null, bool $stdin = true): Process
{
if (function_exists('posix_isatty') && $stdin && !@posix_isatty(STDIN)) {
$process->setInput(STDIN);
}
if ($cwd) {
$process->setWorkingDirectory($cwd);
}
if ($printOutput) {
$process->setTty($this->useTty());
}

$process->setTimeout($timeout);

return $process;
}

private function executeProcess(Process $process, ?callable $callback = null, ?bool $printOutput = true, ?array $env = null): Process
{
if ($callback === null && $printOutput !== false) {
$callback = function (mixed $type, mixed $buffer): void {
$this->output->write($buffer);
};
}

$process->start($callback, $env ?? []);
$process->wait($callback);

$this->logger->notice('Command: {command} [Exit: {exit}]', [
'command' => $process->getCommandLine(),
'exit' => $process->getExitCode(),
]);

return $process;
}




public function getFilesystem(): Filesystem
{
return new Filesystem();
}




public function getFinder(): Finder
{
return new Finder();
}




public function readFile(string $filename): string
{


return @file_get_contents($this->getLocalFilepath($filename));
}

public function getLocalFilepath(string $filepath): string
{
return $this->fixFilename($filepath);
}




public function useTty(): bool
{
if (isset($this->isTty)) {
return $this->isTty;
}


if (!$this->input->isInteractive()) {
return false;
}





if (function_exists('posix_isatty')) {
return (posix_isatty(STDOUT) && @posix_isatty(STDIN));
}

return false;
}

public function setIsTty(?bool $isTty): void
{
$this->isTty = $isTty;
}




public function writeFile(string $filename, string|StreamInterface $content): void
{
$this->getFilesystem()
->dumpFile($this->getLocalFilepath($filename), $content);
}




private function fixFilename(string $filename): string
{


return preg_replace('/^~/', self::getHomeDir(), $filename);
}






public static function getHomeDir(): string
{
$home = getenv('HOME');
if (!$home) {
$system = '';
if (getenv('MSYSTEM')) {
$system = strtoupper(substr(getenv('MSYSTEM'), 0, 4));
}
if ($system !== 'MING') {
$home = getenv('HOMEPATH');
}
}

if (!$home) {
throw new AcquiaCliException('Could not determine $HOME directory. Ensure $HOME is set in your shell.');
}

return $home;
}

public static function getConfigDir(): string
{
$home = self::getHomeDir();
$legacyDir = Path::join($home, '.acquia');
if (file_exists($legacyDir)) {
return $legacyDir;
}
if ($xdgHome = getenv('XDG_CONFIG_HOME')) {
return Path::join($xdgHome, 'acquia');
}
return Path::join($home, '.config', 'acquia');
}












public static function getProjectDir(): ?string
{
$possibleProjectRoots = [
getcwd(),
];

if (getenv('PWD') && !in_array(getenv('PWD'), $possibleProjectRoots, true)) {
array_unshift($possibleProjectRoots, getenv('PWD'));
}
foreach ($possibleProjectRoots as $possibleProjectRoot) {
if ($projectRoot = self::findDirectoryContainingFiles($possibleProjectRoot, ['docroot'])) {
return realpath($projectRoot);
}
}

return null;
}











private static function findDirectoryContainingFiles(string $workingDirectory, array $files, int $maxHeight = 10): bool|string
{
$filePath = $workingDirectory;
for ($i = 0; $i <= $maxHeight; $i++) {
if (self::filesExist($filePath, $files)) {
return $filePath;
}

$filePath = dirname($filePath);
}

return false;
}




private static function filesExist(string $dir, array $files): bool
{
foreach ($files as $file) {
if (file_exists(Path::join($dir, $file))) {
return true;
}
}

return false;
}




public function isBrowserAvailable(): bool
{
if (AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
return false;
}
if (getenv('DISPLAY')) {
return true;
}
if (OsInfo::isWindows() || OsInfo::isApple()) {
return true;
}

return false;
}

/**
@infection-ignore-all











*/
public function startBrowser(?string $uri = null, ?string $browser = null): bool
{


if (!$this->isBrowserAvailable()) {
$this->logger->info('No graphical display appears to be available, not starting browser.');
return false;
}
$host = parse_url($uri, PHP_URL_HOST);



$hostError = (gethostbynamel($host) === false);
$ipError = (ip2long($host) && gethostbyaddr($host) === $host);
if ($hostError || $ipError) {
$this->logger->warning(
'!host does not appear to be a resolvable hostname or IP, not starting browser.',
['!host' => $host]
);

return false;
}
if ($browser === null) {

if ($this->commandExists('xdg-open')) {

$browser = 'xdg-open';
} elseif ($this->commandExists('open')) {

$browser = 'open';
} elseif (OsInfo::isWindows()) {
$browser = 'start';
} else {
$this->logger->warning('Could not find a browser on your local machine. Check that one of <options=bold>xdg-open</>, <options=bold>open</>, or <options=bold>start</> are installed.');
return false;
}
}
if ($browser) {
$this->io->info("Opening $uri");
$this->executeFromCmd("$browser $uri");

return true;
}
return false;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\SshKeys;
use Symfony\Component\Console\Style\SymfonyStyle;
use Zumba\Amplitude\Amplitude;

trait SshCommandTrait
{
private function deleteSshKeyFromCloud(mixed $output, mixed $cloudKey = null): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$sshKeys = new SshKeys($acquiaCloudClient);


$cloudKey = !empty($cloudKey) && is_string($cloudKey) ? $sshKeys->get($cloudKey) : $this->determineCloudKey($acquiaCloudClient);

$sshKeys->delete($cloudKey->uuid);
$output->writeln("<info>Successfully deleted SSH key <options=bold>$cloudKey->label</> from the Cloud Platform.</info>");
$localKeys = $this->findLocalSshKeys();
foreach ($localKeys as $localFile) {
if (trim($localFile->getContents()) === trim($cloudKey->public_key) && $localFile->getRealPath()) {
$privateKeyPath = str_replace('.pub', '', $localFile->getRealPath());
$publicKeyPath = $localFile->getRealPath();
$answer = $this->io->confirm("Do you also want to delete the corresponding local key files {$localFile->getRealPath()} and $privateKeyPath ?", false);
if ($answer) {
$this->localMachineHelper->getFilesystem()->remove([
$localFile->getRealPath(),
$privateKeyPath,
]);
$this->io->success("Deleted $publicKeyPath and $privateKeyPath");
return 0;
}
}
}
return 0;
}

private function determineCloudKey(Client $acquiaCloudClient): object|array|null
{
$sshKeys = new SshKeys($acquiaCloudClient);
$cloudKeys = $sshKeys->getAll();
if (!$cloudKeys->count()) {
throw new AcquiaCliException('There are no SSH keys associated with your account.');
}
return $this->promptChooseFromObjectsOrArrays(
$cloudKeys,
'uuid',
'label',
'Choose an SSH key to delete from the Cloud Platform'
);
}




protected function findLocalSshKeys(): array
{
$finder = $this->localMachineHelper->getFinder();
$finder->files()
->in($this->sshDir)
->name('*.pub')
->ignoreUnreadableDirs();

$validKeys = [];
$pattern = '/^(ssh-(rsa|ed25519)|ecdsa-sha2-nistp(256|384|521)) [A-Za-z0-9+\/=]+(?: .*)?$/';
foreach ($finder as $file) {
$contents = trim($file->getContents() ?? '');
if (preg_match($pattern, $contents)) {
$fingerprint = \Acquia\Cli\Command\Ssh\SshKeyCommandBase::getFingerprint($contents);
if (!empty($fingerprint)) {
$validKeys[] = $file;
}
}
}
return $validKeys;
}

protected function promptWaitForSsh(SymfonyStyle $io): bool
{
$io->note("It may take an hour or more before the SSH key is installed on all of your application's servers. Create a Support ticket for further assistance.");
$wait = $io->confirm("Would you like to wait until your key is installed on all of your application's servers?");
Amplitude::getInstance()
->queueEvent('User waited for SSH key upload', ['wait' => $wait]);
return $wait;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Acquia\Cli\Application;
use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use AcquiaCloudApi\Endpoints\Account;
use Bugsnag\Client;
use Bugsnag\Handler;
use Bugsnag\Report;
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use loophp\phposinfo\OsInfo;
use Symfony\Component\Filesystem\Path;
use Zumba\Amplitude\Amplitude;

class TelemetryHelper
{
public function __construct(
private readonly ClientService $cloudApiClientService,
private readonly CloudDataStore $datastoreCloud,
private readonly Application $application,
private readonly ?string $amplitudeKey = '',
private readonly ?string $bugSnagKey = ''
) {
}

public function initialize(): void
{
$this->initializeAmplitude();
$this->initializeBugsnag();
}

public function initializeBugsnag(): void
{
if (empty($this->bugSnagKey)) {
return;
}
if (!$this->telemetryEnabled()) {
return;
}


$bugsnag = Client::make($this->bugSnagKey);
$bugsnag->setAppVersion($this->application->getVersion());
$bugsnag->setProjectRoot(Path::join(__DIR__, '..'));
$bugsnag->registerCallback(function (Report $report): bool {

switch (true) {

case str_starts_with($report->getContext(), 'GET'):

case str_starts_with($report->getMessage(), 'Allowed memory size'):

case str_starts_with($report->getMessage(), 'fgets'):

case str_starts_with($report->getMessage(), 'fwrite'):

case str_starts_with($report->getMessage(), 'fread'):
return false;
}

$userId = $this->getUserId();
if (isset($userId)) {
$report->setUser([
'id' => $userId,
]);
}
$context = $report->getContext();

if (str_contains($context, 'acli ')) {
$context = substr($context, strpos($context, 'acli ') + 5);
}

if (str_contains($context, "--password")) {
$context = substr($context, 0, strpos($context, "--password") + 10) . 'REDACTED';
}
$report->setContext($context);
return true;
});
Handler::register($bugsnag);
}




public function initializeAmplitude(): void
{
if (empty($this->amplitudeKey)) {
return;
}
$amplitude = Amplitude::getInstance();
$amplitude->setOptOut(!$this->telemetryEnabled());

if (!$this->telemetryEnabled()) {
return;
}
try {
$amplitude->init($this->amplitudeKey);


$amplitude->setDeviceId(OsInfo::uuid());
$amplitude->setUserProperties($this->getTelemetryUserData());
$amplitude->setUserId($this->getUserId());
$amplitude->logQueuedEvents();
} catch (IdentityProviderException $e) {

}
}

public function telemetryEnabled(): bool
{
return (bool) $this->datastoreCloud->get(DataStoreContract::SEND_TELEMETRY);
}







public static function normalizeAhEnv(string $ah_env): string
{
if (AcquiaDrupalEnvironmentDetector::isAhProdEnv($ah_env)) {
return 'prod';
}
if (AcquiaDrupalEnvironmentDetector::isAhStageEnv($ah_env)) {
return 'stage';
}
if (AcquiaDrupalEnvironmentDetector::isAhDevEnv($ah_env)) {
return 'dev';
}
if (AcquiaDrupalEnvironmentDetector::isAhOdeEnv($ah_env)) {
return 'ode';
}
if (AcquiaDrupalEnvironmentDetector::isAhIdeEnv($ah_env)) {
return 'ide';
}
return $ah_env;
}






public function getTelemetryUserData(): array
{
$data = [
'ah_app_uuid' => getenv('AH_APPLICATION_UUID'),
'ah_env' => $this->normalizeAhEnv(AcquiaDrupalEnvironmentDetector::getAhEnv()),
'ah_group' => AcquiaDrupalEnvironmentDetector::getAhGroup(),
'ah_non_production' => getenv('AH_NON_PRODUCTION'),
'ah_realm' => getenv('AH_REALM'),
'CI' => getenv('CI'),
'env_provider' => $this->getEnvironmentProvider(),
'php_version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION,
];
try {
$user = $this->getUserData();
if (isset($user['is_acquian'])) {
$data['is_acquian'] = $user['is_acquian'];
}
} catch (IdentityProviderException $e) {

}
return $data;
}

public static function getEnvironmentProvider(): ?string
{
$providers = self::getProviders();


foreach ($providers as $provider => $vars) {
foreach ($vars as $var) {
if (getenv($var) !== false) {
return $provider;
}
}
}

return null;
}

public function getUserId(): ?string
{
$user = $this->getUserData();
if ($user && isset($user['uuid'])) {
return $user['uuid'];
}

return null;
}






private function getUserData(): ?array
{
$user = $this->datastoreCloud->get(DataStoreContract::USER);
if (!$user && $this->cloudApiClientService->isMachineAuthenticated()) {
$this->setDefaultUserData();
$user = $this->datastoreCloud->get(DataStoreContract::USER);
}

return $user;
}




private function setDefaultUserData(): void
{
$user = $this->getDefaultUserData();
$this->datastoreCloud->set(DataStoreContract::USER, $user);
}






private function getDefaultUserData(): array
{

$account = new Account($this->cloudApiClientService->getClient());
return [
'is_acquian' => str_ends_with($account->get()->mail, 'acquia.com'),
'uuid' => $account->get()->uuid,
];
}

/**
@infection-ignore-all





*/
public static function getProviders(): array
{


return [
'lando' => ['LANDO'],
'ddev' => ['IS_DDEV_PROJECT'],

'acquia' => ['AH_SITE_ENVIRONMENT'],
'bamboo' => ['BAMBOO_BUILDNUMBER'],
'beanstalk' => ['BEANSTALK_ENVIRONMENT'],
'bitbucket' => ['BITBUCKET_BUILD_NUMBER'],
'bitrise' => ['BITRISE_IO'],
'buddy' => ['BUDDY_WORKSPACE_ID'],
'circleci' => ['CIRCLECI'],
'codebuild' => ['CODEBUILD_BUILD_ID'],
'docksal' => ['DOCKSAL_VERSION'],
'drone' => ['DRONE'],
'github' => ['GITHUB_ACTIONS'],
'gitlab' => ['GITLAB_CI'],
'heroku' => ['HEROKU_TEST_RUN_ID'],
'jenkins' => ['JENKINS_URL'],
'pantheon' => ['PANTHEON_ENVIRONMENT'],
'pipelines' => ['PIPELINE_ENV'],
'platformsh' => ['PLATFORM_ENVIRONMENT'],
'teamcity' => ['TEAMCITY_VERSION'],
'travis' => ['TRAVIS'],
];
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Symfony\Component\Cache\Adapter\FilesystemAdapter;

class AliasCache extends FilesystemAdapter
{
public function get(string $key, callable $callback, ?float $beta = null, ?array &$metadata = null): mixed
{

$key = str_replace(':', '.', $key);
return parent::get($key, $callback, $beta, $metadata);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Acquia\Cli\Exception\AcquiaCliException;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Process\Process;

class SshHelper implements LoggerAwareInterface
{
use LoggerAwareTrait;




public function __construct(
private readonly OutputInterface $output,
private readonly LocalMachineHelper $localMachineHelper,
LoggerInterface $logger
) {
$this->setLogger($logger);
}




public function executeCommand(string $sshUrl, array $commandArgs, bool $printOutput = true, ?int $timeout = null, ?array $env = null): Process
{
$commandSummary = $this->getCommandSummary($commandArgs);


unset($commandArgs['alias']);
$process = $this->sendCommand($sshUrl, $commandArgs, $printOutput, $timeout, $env);

$this->logger->debug('Command: {command} [Exit: {exit}]', [
'command' => $commandSummary,
'env' => $sshUrl,
'exit' => $process->getExitCode(),
]);

if (!$process->isSuccessful() && $process->getExitCode() === 255) {
throw new AcquiaCliException($process->getOutput() . $process->getErrorOutput());
}

return $process;
}

private function sendCommand(string $url, array $command, bool $printOutput, ?int $timeout = null, ?array $env = null): Process
{
$command = array_values($this->getSshCommand($url, $command));
$this->localMachineHelper->checkRequiredBinariesExist(['ssh']);

return $this->localMachineHelper->execute($command, $this->getOutputCallback(), null, $printOutput, $timeout, $env);
}




private function firstArguments(array $commandArgs): string
{
$result = '';
while (!empty($commandArgs)) {
$first = array_shift($commandArgs);
if ($first !== '' && $first[0] === '-') {
return $result;
}
$result .= " $first";
}

return $result;
}

private function getOutputCallback(): callable
{
if ($this->localMachineHelper->useTty() === false) {
$output = $this->output;

return static function (mixed $type, mixed $buffer) use ($output): void {
$output->write($buffer);
};
}

return static function (mixed $type, mixed $buffer): void {
};
}






private function getCommandSummary(array $commandArgs): string
{
return $this->firstArguments($commandArgs);
}




private function getConnectionArgs(string $url): array
{
return [
'ssh',
$url,
'-t',
'-o StrictHostKeyChecking=no',
'-o AddressFamily inet',
'-o LogLevel=ERROR',
];
}




private function getSshCommand(string $url, array $command): array
{
return array_merge($this->getConnectionArgs($url), $command);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

use Acquia\Cli\Output\Spinner\Spinner;
use React\EventLoop\Loop;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class LoopHelper
{




public static function getLoopy(OutputInterface $output, SymfonyStyle $io, string $spinnerMessage, callable $statusCallback, callable $doneCallback): void
{
$timers = [];
$spinner = new Spinner($output, 4);
$spinner->setMessage($spinnerMessage);
$spinner->start();

$cancelTimers = static function () use (&$timers, $spinner): void {

array_map('\React\EventLoop\Loop::cancelTimer', $timers);
$timers = [];
$spinner->finish();
};
$periodicCallback = static function () use ($statusCallback, $doneCallback, $cancelTimers): void {

if ($statusCallback()) {
$cancelTimers();
$doneCallback();
}
};


$timers[] = Loop::addPeriodicTimer(
$spinner->interval(),
static function () use ($spinner): void {
$spinner->advance();
}
);


$timers[] = Loop::addPeriodicTimer(5, $periodicCallback);

$timers[] = Loop::addTimer(0.1, $periodicCallback);


$timers[] = Loop::addTimer(45 * 60, static function () use ($io, $doneCallback, $cancelTimers): void {
$cancelTimers();
$io->error("Timed out after 45 minutes!");
$doneCallback();
});




Loop::run();
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Helpers;

class DataStoreContract
{
public const SEND_TELEMETRY = 'send_telemetry';

public const USER = 'user';
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\EventListener;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;

class ComposerScriptsListener
{




public function onConsoleCommand(ConsoleCommandEvent $event): void
{
$this->executeComposerScripts($event, 'pre');
}





public function onConsoleTerminate(ConsoleTerminateEvent $event): void
{
if ($event->getExitCode() === 0) {
$this->executeComposerScripts($event, 'post');
}
}





private function executeComposerScripts(ConsoleCommandEvent|ConsoleTerminateEvent $event, string $prefix): void
{

$command = $event->getCommand();
if (
$event->getInput()->hasOption('no-scripts') && $event->getInput()
->getOption('no-scripts')
) {
return;
}

if (is_a($command, CommandBase::class)) {
$composerJsonFilepath = Path::join($command->getProjectDir(), 'composer.json');
if (file_exists($composerJsonFilepath)) {
$composerJson = json_decode($command->localMachineHelper->readFile($composerJsonFilepath), true, 512, JSON_THROW_ON_ERROR);
$commandName = $command->getName();

$scriptName = $prefix . '-acli-' . str_replace(':', '-', $commandName);
if (array_key_exists('scripts', $composerJson) && array_key_exists($scriptName, $composerJson['scripts'])) {
$event->getOutput()
->writeln("Executing composer script `$scriptName` defined in `$composerJsonFilepath`", OutputInterface::VERBOSITY_VERBOSE);
$event->getOutput()->writeln($scriptName);
$command->localMachineHelper->execute([
'composer',
'run-script',
$scriptName,
]);
} else {
$event->getOutput()
->writeln("Notice: Composer script `$scriptName` does not exist in `$composerJsonFilepath`, skipping. This is not an error.", OutputInterface::VERBOSITY_VERBOSE);
}
}
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\EventListener;

use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Exception\ApiErrorException;
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Exception\RuntimeException;







class ExceptionListener
{
private string $messagesBgColor = 'blue';

private string $messagesFgColor = 'white';




private array $helpMessages = [];

public function onConsoleError(ConsoleErrorEvent $event): void
{
$exitCode = $event->getExitCode();
$error = $event->getError();
$errorMessage = $error->getMessage();

if ($error instanceof IdentityProviderException && $error->getMessage() === 'invalid_client') {
$newErrorMessage = 'Your Cloud Platform API credentials are invalid.';
$this->helpMessages[] = "Run <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>acli auth:login</> to reset your API credentials.";
}

if ($error instanceof RuntimeException) {
switch ($errorMessage) {
case 'Not enough arguments (missing: "environmentId").':
case 'Not enough arguments (missing: "environmentUuid").':
$this->writeSiteAliasHelp();
break;
}
}

if ($error instanceof AcquiaCliException) {
switch ($error->getRawMessage()) {
case 'No applications match the alias {applicationAlias}':
case 'Multiple applications match the alias {applicationAlias}':
$this->writeApplicationAliasHelp();
break;
case '{environmentId} must be a valid UUID or site alias.':
case '{environmentUuid} must be a valid UUID or site alias.':
$this->writeSiteAliasHelp();
break;
case 'Access token file not found at {file}':
case 'Access token expiry file not found at {file}':
$this->helpMessages[] = 'Get help for this error at https://docs.acquia.com/ide/known-issues/#the-automated-cloud-platform-api-authentication-might-fail';
break;
case 'This machine is not yet authenticated with the Cloud Platform.':
$this->helpMessages[] = 'Run `acli auth:login` to re-authenticated with the Cloud Platform.';
break;
case 'This machine is not yet authenticated with Site Factory.':
$this->helpMessages[] = 'Run `acli auth:acsf-login` to re-authenticate with Site Factory.';
break;
case 'Could not extract aliases to {destination}':
$this->helpMessages[] = 'Check that you have write access to the directory';
break;
case 'Unable to import local database. {message}':
$this->helpMessages[] = 'Check for MySQL warnings above or in the server log (/var/log/mysql/error.log)';
$this->helpMessages[] = 'Frequently, `MySQL server has gone away` messages are caused by max_allowed_packet being exceeded.';
break;
case 'Database connection details missing':
$this->helpMessages[] = 'Check that you have the \'View database connection details\' permission';
break;
case 'No environments found for this application':
$this->helpMessages[] = 'Check that the application has finished provisioning';
break;
}
}

if ($error instanceof ApiErrorException) {
if (($command = $event->getCommand()) && $error->getResponseBody()->error === 'not_found' && $command->getName() === 'api:environments:log-download') {
$this->helpMessages[] = "You must create logs (api:environments:log-create) prior to downloading them";
}
switch ($errorMessage) {
case "There are no available Cloud IDEs for this application.\n":
$this->helpMessages[] = "Delete an existing IDE via <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>acli ide:delete</> or contact your Account Manager or Acquia Sales to purchase additional IDEs.";
break;
case "This resource requires additional authentication.":
$this->helpMessages[] = "This is likely because you have Federated Authentication required for your organization.";
$this->helpMessages[] = "Run `acli login` to authenticate via API token and then try again.";
break;
default:
$newErrorMessage = 'Cloud Platform API returned an error: ' . $errorMessage;
$this->helpMessages[] = "You can learn more about Cloud Platform API at https://docs.acquia.com/cloud-platform/develop/api/";
}
}

if (!empty($this->helpMessages)) {
$this->helpMessages[0] = '<options=bold>How to fix it:</> ' . $this->helpMessages[0];
}
$this->helpMessages[] = "You can find Acquia CLI documentation at https://docs.acquia.com/acquia-cli/";
$this->writeUpdateHelp($event);
$this->writeSupportTicketHelp($event);

if ($command = $event->getCommand()) {

$application = $command->getApplication();
$application->setHelpMessages($this->helpMessages);
}

if (isset($newErrorMessage)) {
$event->setError(new AcquiaCliException($newErrorMessage, [], $exitCode));
}
}

private function writeApplicationAliasHelp(): void
{
$this->helpMessages[] = "The <bg=$this->messagesBgColor;options=bold>applicationUuid</> argument must be a valid UUID or unique application alias accessible to your Cloud Platform user." . PHP_EOL . PHP_EOL
. "An alias consists of an application name optionally prefixed with a hosting realm, e.g. <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>myapp</> or <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>prod.myapp</>." . PHP_EOL . PHP_EOL
. "Run <bg=$this->messagesBgColor;options=bold>acli remote:aliases:list</> to see a list of all available aliases.";
}

private function writeSiteAliasHelp(): void
{
$this->helpMessages[] = "<bg=$this->messagesBgColor;options=bold>environmentId</> can also be a site alias. E.g. <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>myapp.dev</>." . PHP_EOL
. "Run <bg=$this->messagesBgColor;options=bold>acli remote:aliases:list</> to see a list of all available aliases.";
}

private function writeSupportTicketHelp(ConsoleErrorEvent $event): void
{
$message = "You can submit a support ticket at https://support-acquia.force.com/s/contactsupport";
if (!$event->getOutput()->isVeryVerbose()) {
$message .= PHP_EOL . "Re-run the command with the <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>-vvv</> flag and include the full command output in your support ticket.";
}
$this->helpMessages[] = $message;
}

private function writeUpdateHelp(ConsoleErrorEvent $event): void
{
try {
$command = $event->getCommand();
if (
$command
&& method_exists($command, 'checkForNewVersion')
&& $latest = $command->checkForNewVersion()
) {
$message = "Acquia CLI $latest is available. Try updating via <bg=$this->messagesBgColor;fg=$this->messagesFgColor;options=bold>acli self-update</> and then run the command again.";
$this->helpMessages[] = $message;
}

} catch (CommandNotFoundException) {
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\AcsfApi;

use Acquia\Cli\ConnectorFactoryInterface;

class AcsfConnectorFactory implements ConnectorFactoryInterface
{



public function __construct(protected array $config, protected ?string $baseUri = null)
{
}

public function createConnector(): AcsfConnector
{
return new AcsfConnector($this->config, $this->baseUri);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\AcsfApi;

use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Exception\ApiErrorException;
use Psr\Http\Message\ResponseInterface;

class AcsfClient extends Client
{
public function processResponse(ResponseInterface $response): mixed
{
$bodyJson = $response->getBody();
$body = json_decode((string) $bodyJson, false, 512, JSON_THROW_ON_ERROR);


if (is_array($body)) {
return $body;
}

if (property_exists($body, '_embedded') && property_exists($body->_embedded, 'items')) {
return $body->_embedded->items;
}

if (property_exists($body, 'error') && property_exists($body, 'message')) {
throw new ApiErrorException($body);
}

if (
property_exists($body, 'message') && in_array(substr((string) $response->getStatusCode(), 0, 1), [
'4',
'5',
], true)
) {
$body->error = $response->getStatusCode();
throw new ApiErrorException($body);
}

return $body;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\AcsfApi;

use AcquiaCloudApi\Connector\Connector;
use GuzzleHttp\Client as GuzzleClient;
use Psr\Http\Message\ResponseInterface;

class AcsfConnector extends Connector
{



public function __construct(array $config, ?string $baseUri = null, ?string $urlAccessToken = null)
{
parent::__construct($config, $baseUri, $urlAccessToken);

$this->client = new GuzzleClient([
'auth' => [
$config['key'],
$config['secret'],
],
'base_uri' => $this->getBaseUri(),
]);
}




public function sendRequest(string $verb, string $path, array $options): ResponseInterface
{
return $this->client->request($verb, $path, $options);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\AcsfApi;

use Acquia\Cli\Application;
use Acquia\Cli\CloudApi\ClientService;

class AcsfClientService extends ClientService
{
public function __construct(AcsfConnectorFactory $connectorFactory, Application $application, AcsfCredentials $cloudCredentials)
{
parent::__construct($connectorFactory, $application, $cloudCredentials);
}

public function getClient(): AcsfClient
{
$client = AcsfClient::factory($this->connector);
$this->configureClient($client);

return $client;
}

protected function checkAuthentication(): bool
{
return ($this->credentials->getCloudKey() && $this->credentials->getCloudSecret());
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\AcsfApi;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\DataStore\CloudDataStore;

class AcsfCredentials implements ApiCredentialsInterface
{



public function __construct(private CloudDataStore $datastoreCloud)
{
}

public function getCloudKey(): ?string
{
if (getenv('ACSF_USERNAME')) {
return getenv('ACSF_USERNAME');
}

if (($currentFactory = $this->getCurrentFactory()) && $activeUser = $this->getFactoryActiveUser($currentFactory)) {
return $activeUser['username'];
}

return null;
}




public function getFactoryActiveUser(array $factory): mixed
{
if (array_key_exists('active_user', $factory)) {
$activeUser = $factory['active_user'];
if (array_key_exists($activeUser, $factory['users'])) {
return $factory['users'][$activeUser];
}
}

return null;
}

private function getCurrentFactory(): mixed
{
if (($factory = $this->datastoreCloud->get('acsf_active_factory')) && ($acsfFactories = $this->datastoreCloud->get('acsf_factories')) && array_key_exists($factory, $acsfFactories)) {
return $acsfFactories[$factory];
}
return null;
}

public function getCloudSecret(): ?string
{
if (getenv('ACSF_KEY')) {
return getenv('ACSF_KEY');
}

if (($currentFactory = $this->getCurrentFactory()) && $activeUser = $this->getFactoryActiveUser($currentFactory)) {
return $activeUser['key'];
}

return null;
}

public function getBaseUri(): ?string
{
if (getenv('ACSF_FACTORY_URI')) {
return getenv('ACSF_FACTORY_URI');
}
if ($factory = $this->datastoreCloud->get('acsf_active_factory')) {
return $factory;
}

return null;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Config;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class CloudDataConfig implements ConfigurationInterface
{
public function getName(): string
{
return 'cloud_api';
}

public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('cloud_api');
$rootNode = $treeBuilder->getRootNode();
$rootNode
->children()




->scalarNode('send_telemetry')->end()
->scalarNode('acli_key')->end()
->arrayNode('keys')
->useAttributeAsKey('uuid')
->normalizeKeys(false)
->arrayPrototype()
->children()
->scalarNode('label')->end()
->scalarNode('uuid')->end()
->scalarNode('secret')->isRequired()->end()
->end()
->end()
->end()
->arrayNode('user')
->children()
->scalarNode('uuid')->end()
->booleanNode('is_acquian')
->defaultValue(false)
->end()
->end()
->end()
->arrayNode('acsf_factories')
->useAttributeAsKey('url')
->normalizeKeys(false)
->arrayPrototype()
->children()
->arrayNode('users')
->arrayPrototype()
->children()
->scalarNode('username')->end()
->scalarNode('key')->end()
->end()
->end()
->end()
->scalarNode('url')->end()
->scalarNode('active_user')->end()
->end()
->end()
->end()
->scalarNode('acsf_active_factory')->end()
->end()
->validate()
->ifTrue(function ($config) {
return !empty($config['acli_key']) && (!is_array($config['keys']) || empty($config['keys']) || !array_key_exists($config['acli_key'], $config['keys']));
})
->thenInvalid('acli_key must exist in keys');
return $treeBuilder;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Config;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class AcquiaCliConfig implements ConfigurationInterface
{
public function getName(): string
{
return 'acquia_cli';
}

public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('acquia_cli');
$treeBuilder
->getRootNode()
->children()
->scalarNode('cloud_app_uuid')->end()
->arrayNode('push')
->children()
->arrayNode('artifact')
->children()
->arrayNode('destination_git_urls')
->scalarPrototype()->end()
->end()
->end()
->end()
->end()
->end()
->end();
return $treeBuilder;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli;

use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;




class Kernel extends BaseKernel
{



public function registerBundles(): iterable
{
return [];
}

public function registerContainerConfiguration(LoaderInterface $loader): void
{
$loader->load($this->getProjectDir() . '/config/' . $this->getEnvironment() . '/services.yml');
}

/**
@infection-ignore-all */
public function getCacheDir(): string
{
$testToken = getenv('TEST_TOKEN') ?? '';
return parent::getCacheDir() . $testToken;
}

protected function build(ContainerBuilder $containerBuilder): void
{
$containerBuilder->addCompilerPass($this->createCollectingCompilerPass());
}




private function createCollectingCompilerPass(): CompilerPassInterface
{
return new class implements CompilerPassInterface {
public function process(ContainerBuilder $containerBuilder): void
{
$appDefinition = $containerBuilder->findDefinition(Application::class);
$dispatcherDefinition = $containerBuilder->findDefinition(EventDispatcher::class);

foreach ($containerBuilder->getDefinitions() as $definition) {

if ($definition->hasTag('kernel.event_listener')) {
foreach ($definition->getTag('kernel.event_listener') as $tag) {
$dispatcherDefinition->addMethodCall('addListener', [
$tag['event'],
[
new ServiceClosureArgument(new Reference($definition->getClass())),
$tag['method'],
],
]);
}
}


if (!is_a($definition->getClass(), Command::class, true)) {
continue;
}


if ($definition->isAbstract()) {
continue;
}

$appDefinition->addMethodCall('add', [
new Reference($definition->getClass()),
]);
}

$appDefinition->addMethodCall('setDispatcher', [
$dispatcherDefinition,
]);
}
};
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Yaml\Yaml;

class YamlStore extends Datastore
{



public function __construct(string $path, ?ConfigurationInterface $configDefinition = null)
{
parent::__construct($path);
if ($this->fileSystem->exists($path)) {
$array = Yaml::parseFile($path);
$array = $this->expander->expandArrayProperties($array);
if ($configDefinition) {
$array = $this->processConfig($array, $configDefinition, $path);
}
$this->data->import($array);
}
}

public function dump(): void
{
$this->fileSystem->dumpFile($this->filepath, Yaml::dump($this->data->export()));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

use Symfony\Component\Config\Definition\ConfigurationInterface;

class JsonDataStore extends Datastore
{



public function __construct(string $path, ?ConfigurationInterface $configDefinition = null)
{
parent::__construct($path);
if ($this->fileSystem->exists($path)) {
$array = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
$array = $this->expander->expandArrayProperties($array);
$cleaned = $this->cleanLegacyConfig($array);

if ($configDefinition) {
$array = $this->processConfig($array, $configDefinition, $path);
}
$this->data->import($array);


if ($cleaned) {
$this->dump();
}
}
}

public function dump(): void
{
$this->fileSystem->dumpFile($this->filepath, json_encode($this->data->export(), JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT));
}

protected function cleanLegacyConfig(array &$array): bool
{

$dump = false;
if (array_key_exists('key', $array) || array_key_exists('secret', $array)) {
unset($array['key'], $array['secret']);
$dump = true;
}
return $dump;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

use Acquia\Cli\Exception\AcquiaCliException;
use Dflydev\DotAccessData\Data;
use Dflydev\DotAccessData\Exception\MissingPathException;
use Grasmash\Expander\Expander;
use Grasmash\Expander\Stringifier;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Filesystem\Filesystem;

abstract class Datastore implements DataStoreInterface
{
protected Data $data;

protected Filesystem $fileSystem;

public string $filepath;

protected Expander $expander;

public function __construct(string $path)
{
$this->fileSystem = new Filesystem();
$this->filepath = $path;
$this->expander = new Expander();
$this->expander->setStringifier(new Stringifier());
$this->data = new Data();
}

public function set(string $key, mixed $value): void
{
$this->data->set($key, $value);
$this->dump();
}

public function get(string $key): mixed
{
try {
return $this->data->get($key);
} catch (MissingPathException) {
return null;
}
}

public function remove(string $key): void
{
$this->data->remove($key);
$this->dump();
}

public function exists(string $key): bool
{
return $this->data->has($key);
}





protected function processConfig(array $config, ConfigurationInterface $definition, string $path): array
{
try {
return (new Processor())->processConfiguration(
$definition,
[$definition->getName() => $config],
);
} catch (InvalidConfigurationException $e) {
throw new AcquiaCliException(
'Configuration file at the following path contains invalid keys: {path} {error}',
['path' => $path, 'error' => $e->getMessage()]
);
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

interface DataStoreInterface
{
public function set(string $key, mixed $value): void;

public function get(string $key): mixed;

public function dump(): void;

public function remove(string $key): void;

public function exists(string $key): bool;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

use Acquia\Cli\Config\CloudDataConfig;
use Acquia\Cli\Helpers\LocalMachineHelper;

class CloudDataStore extends JsonDataStore
{



protected array $config;

public function __construct(
protected LocalMachineHelper $localMachineHelper,
CloudDataConfig $cloudDataConfig,
string $cloudConfigFilepath
) {
parent::__construct($cloudConfigFilepath, $cloudDataConfig);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\DataStore;

use Acquia\Cli\Config\AcquiaCliConfig;
use Acquia\Cli\Helpers\LocalMachineHelper;

class AcquiaCliDatastore extends YamlStore
{



protected array $config;

public function __construct(
protected LocalMachineHelper $localMachineHelper,
AcquiaCliConfig $configDefinition,
string $acliConfigFilepath
) {
$filePath = $localMachineHelper->getLocalFilepath($acliConfigFilepath);
parent::__construct($filePath, $configDefinition);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli;

interface ApiCredentialsInterface
{
public function getBaseUri(): ?string;

public function getCloudKey(): ?string;

public function getCloudSecret(): ?string;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Output\Spinner;

use Symfony\Component\Console\Helper\Helper;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Terminal;

class Spinner
{
private const CHARS = ['⠏', '⠛', '⠹', '⢸', '⣰', '⣤', '⣆', '⡇'];

private const COLORS = [
196,
196,
202,
202,
208,
208,
214,
214,
220,
220,
226,
226,
190,
190,
154,
154,
118,
118,
82,
82,
46,
46,
47,
47,
48,
48,
49,
49,
50,
50,
51,
51,
45,
45,
39,
39,
33,
33,
27,
27,
56,
56,
57,
57,
93,
93,
129,
129,
165,
165,
201,
201,
200,
200,
199,
199,
198,
198,
197,
197,
];

private int $currentCharIdx = 0;

private int $currentColorIdx = 0;

private ?int $colorCount;

private ProgressBar $progressBar;

private ConsoleSectionOutput $section;

public function __construct(private OutputInterface $output, private int $indentLength = 0)
{
$indentString = str_repeat(' ', $indentLength);

if (!$this->spinnerIsSupported()) {
return;
}
$this->section = $output->section();
$this->colorCount = count(self::COLORS);


$this->progressBar = new ProgressBar($this->section);
$this->progressBar->setBarCharacter('<info>✔</info>');
$this->progressBar->setProgressCharacter('⌛');
$this->progressBar->setEmptyBarCharacter('⌛');
$this->progressBar->setFormat($indentString . "%bar% %message%\n%detail%");
$this->progressBar->setBarWidth(1);
$this->progressBar->setMessage(' ', 'detail');
$this->progressBar->setOverwrite($output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE);
}

public function start(): void
{
if (!$this->spinnerIsSupported()) {
return;
}
$this->progressBar->start();
}

public function advance(): void
{
if (!$this->spinnerIsSupported() || $this->progressBar->getProgressPercent() === 1.0) {
return;
}

++$this->currentCharIdx;
++$this->currentColorIdx;
$char = $this->getSpinnerCharacter();
$this->progressBar->setProgressCharacter($char);
$this->progressBar->advance();
}

private function getSpinnerCharacter(): string
{
if ($this->currentColorIdx === $this->colorCount) {
$this->currentColorIdx = 0;
}
$char = self::CHARS[$this->currentCharIdx % 8];
$color = self::COLORS[$this->currentColorIdx];
return "\033[38;5;{$color}m$char\033[0m";
}

public function setMessage(string $message, string $name = 'message'): void
{
if (!$this->spinnerIsSupported()) {
return;
}
if ($name === 'detail') {
$terminalWidth = (new Terminal())->getWidth();
$messageLength = Helper::length($message) + ($this->indentLength * 2);
if ($messageLength > $terminalWidth) {
$suffix = '...';
$newMessageLen = ($terminalWidth - ($this->indentLength * 2) - strlen($suffix));
$message = Helper::substr($message, 0, $newMessageLen);
$message .= $suffix;
}
}
$this->progressBar->setMessage($message, $name);
}

public function finish(): void
{
if (!$this->spinnerIsSupported()) {
return;
}
$this->progressBar->finish();

$this->section->clear(1);
}

public function fail(): void
{
if (!$this->spinnerIsSupported()) {
return;
}
$this->progressBar->finish();

$this->section->clear(1);
}




public function interval(): float
{
return 0.1;
}

private function spinnerIsSupported(): bool
{
return $this->output instanceof ConsoleOutput
&& (getenv('CI') !== 'true' || getenv('PHPUNIT_RUNNING'));
}

public function getProgressBar(): ProgressBar
{
return $this->progressBar;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Output;

use Acquia\Cli\Output\Spinner\Spinner;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;

class Checklist
{



private array $items = [];

private int $indentLength = 4;




public function __construct(private OutputInterface $output)
{
}

public function addItem(string $message): void
{
$item = ['message' => $message];

if ($this->useSpinner()) {
$spinner = new Spinner($this->output, $this->indentLength);
$spinner->setMessage($message . '...');
$spinner->start();
$item['spinner'] = $spinner;
}

$this->items[] = $item;
}

public function completePreviousItem(): void
{
if ($this->useSpinner()) {
$item = $this->getLastItem();

$spinner = $item['spinner'];
$spinner->setMessage(' ', 'detail');
$spinner->setMessage($item['message']);
$spinner->advance();
$spinner->finish();
}
}

private function getLastItem(): mixed
{
return end($this->items);
}

public function updateProgressBar(string $updateMessage): void
{
$item = $this->getLastItem();
if (!$item) {
return;
}
if ($this->useSpinner()) {

$spinner = $item['spinner'];
}

$messageLines = explode(PHP_EOL, $updateMessage);
foreach ($messageLines as $line) {
if (isset($spinner) && $item['spinner']) {
if (trim($line)) {
$spinner->setMessage(str_repeat(' ', $this->indentLength * 2) . $line, 'detail');
}
$spinner->advance();
}
}


if (isset($spinner) && $item['spinner']) {
$spinner->getProgressBar()->display();
}
}

private function useSpinner(): bool
{
return $this->output instanceof ConsoleOutput
&& (getenv('CI') !== 'true' || getenv('PHPUNIT_RUNNING'));
}




public function getItems(): array
{
return $this->items;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli;

use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Throwable;

class Application extends \Symfony\Component\Console\Application
{



protected array $helpMessages = [];




private function getHelpMessages(): array
{
return $this->helpMessages;
}

public function setHelpMessages(array $helpMessages): void
{
$this->helpMessages = $helpMessages;
}

public function renderThrowable(
Throwable $e,
OutputInterface $output
): void {
parent::renderThrowable($e, $output);

if ($this->getHelpMessages()) {
$io = new SymfonyStyle(new ArrayInput([]), $output);
$outputStyle = new OutputFormatterStyle('white', 'blue');
$output->getFormatter()->setStyle('help', $outputStyle);
$io->block($this->getHelpMessages(), 'help', 'help', ' ', true, false);
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Exception;

use Exception;
use Zumba\Amplitude\Amplitude;

class AcquiaCliException extends Exception
{






public function __construct(
private ?string $rawMessage = null,
array $replacements = [],
int $code = 0
) {
$eventProperties = [
'code' => $code,
'message' => $rawMessage,
];
Amplitude::getInstance()
->queueEvent('Threw exception', $eventProperties);

parent::__construct($this->interpolateString($rawMessage, $replacements), $code);
}






public function getRawMessage(): string
{
return $this->rawMessage;
}







protected function interpolateString(string $message, array $replacements): string
{
$tr = [];
foreach ($replacements as $key => $val) {
$tr['{' . $key . '}'] = $val;
}

return strtr($message, $tr);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli;

use Acquia\Cli\Command\Acsf\AcsfListCommand;
use Acquia\Cli\Command\Api\ApiBaseCommand;
use Acquia\Cli\Command\Api\ApiListCommand;

interface CommandFactoryInterface
{

public function createCommand(): ApiBaseCommand;

public function createListCommand(): ApiListCommand|AcsfListCommand;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli;

use Acquia\Cli\CloudApi\AccessTokenConnector;
use AcquiaCloudApi\Connector\Connector;

interface ConnectorFactoryInterface
{
public function createConnector(): Connector|AccessTokenConnector;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Transformer;

use AcquiaCloudApi\Response\BackupResponse;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use stdClass;

class EnvironmentTransformer
{



public static function transform(mixed $codebaseEnv): EnvironmentResponse
{
$env = new \stdClass();

$env->id = $codebaseEnv->id;
$env->uuid = $codebaseEnv->id;
$env->name = $codebaseEnv->name;
$env->label = $codebaseEnv->label;
$env->status = $codebaseEnv->status;
$env->ssh_url = $codebaseEnv->ssh_url;

if (isset($codebaseEnv->properties) && is_object($codebaseEnv->properties)) {
$codebaseEnv->properties = (array)$codebaseEnv->properties;
}

$env->active_domain = $codebaseEnv->properties['active_domain'] ?? '';
$env->default_domain = $codebaseEnv->properties['default_domain'] ?? '';
$env->image_url = $codebaseEnv->properties['image_url'] ?? null;
$env->ips = $codebaseEnv->properties['ips'] ?? [];
$env->domains = $codebaseEnv->properties['domains'] ?? [];
$env->region = $codebaseEnv->properties['region'] ?? null;
$env->platform = $codebaseEnv->properties['platform'] ?? 'MEO';
$env->balancer = $codebaseEnv->properties['balancer'] ?? '';
$env->artifact = (object)($codebaseEnv->properties['artifact'] ?? null);
$env->gardener = (object)($codebaseEnv->properties['gardener'] ?? null);


$env->application = (object) [];


$branch = $codebaseEnv->reference ?? 'master';
$vcsUrl = '';
if (
isset($codebaseEnv->codebase) &&
is_object($codebaseEnv->codebase) &&
property_exists($codebaseEnv->codebase, 'vcs_url')
) {
$vcsUrl = $codebaseEnv->codebase->vcs_url;
}
$env->vcs = (object) [
'branch' => $branch,
'path' => $branch,
'url' => $vcsUrl,
];


$env->configuration = (object) [];
$env->configuration->php = (object) ($codebaseEnv->properties ?? []);


$env->flags = (object) ($codebaseEnv->flags ?? []);
$env->_links = (object) ($codebaseEnv->links ?? []);
$env->type = $codebaseEnv->properties['type'] ?? '';

return new EnvironmentResponse($env);
}




public static function transformSiteInstanceDatabase(mixed $siteInstanceDb): DatabaseResponse
{
$db = new \stdClass();
$db->id = $siteInstanceDb->databaseName;
$db->name = $siteInstanceDb->databaseName;
$db->user_name = $siteInstanceDb->databaseUserName;
$db->password = $siteInstanceDb->databasePassword;
$db->url = null;
$db->db_host = $siteInstanceDb->databaseHost;
$db->ssh_host = null;
$db->flags = (object) ['role' => $siteInstanceDb->databaseRole, 'default' => false];
$db->environment = new stdClass();
return new DatabaseResponse($db);
}



public static function transformSiteInstanceDatabaseBackup(mixed $data): BackupResponse
{
$backup = new \stdClass();
$backup->id = (int) $data->id;
$backup->database_id = $data->database_id;
$backup->created_at = $data->created_at;
$backup->started_at = $data->created_at;
$backup->completed_at = $data->created_at;
$backup->_links = $data->links;
$backup->type = "daily";
$backup->database = (object) [
'id' => $data->database_id,
'_links' => $data->links,
];
$backup->flags = (object) [
'deleted' => false,
];

$environmentId = null;
if (isset($data->_links->environment->href)) {
$environmentId = basename($data->_links->environment->href);
}
$backup->environment = (object) [
'id' => $environmentId,
];

return new BackupResponse($backup);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\Ssh\SshKeyCommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Endpoints\SshKeys;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

abstract class WizardCommandBase extends SshKeyCommandBase
{
abstract protected function validateEnvironment(): void;

protected function initialize(InputInterface $input, OutputInterface $output): void
{
if ((new \ReflectionClass(static::class))->getAttributes(RequireAuth::class) && !$this->cloudApiClientService->isMachineAuthenticated()) {
$commandName = 'auth:login';
$command = $this->getApplication()->find($commandName);
$arguments = ['command' => $commandName];
$createInput = new ArrayInput($arguments);
$exitCode = $command->run($createInput, $output);
if ($exitCode !== 0) {
throw new AcquiaCliException("Unable to authenticate with the Cloud Platform.");
}
}
$this->validateEnvironment();

parent::initialize($input, $output);
}

protected function deleteLocalSshKey(): void
{
$this->localMachineHelper->getFilesystem()->remove([
$this->publicSshKeyFilepath,
$this->privateSshKeyFilepath,
]);
}

protected function savePassPhraseToFile(string $passphrase): bool|int
{
return file_put_contents($this->passphraseFilepath, $passphrase);
}

protected function getPassPhraseFromFile(): string
{
return file_get_contents($this->passphraseFilepath);
}





protected function userHasUploadedThisKeyToCloud(string $label): bool
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$sshKeys = new SshKeys($acquiaCloudClient);
$cloudKeys = $sshKeys->getAll();

foreach ($cloudKeys as $index => $cloudKey) {
if (
$cloudKey->label === $label

&& $this->localSshKeyExists()

&& $this->normalizePublicSshKey($cloudKey->public_key) === $this->normalizePublicSshKey(file_get_contents($this->publicSshKeyFilepath))
) {
return true;
}
}
return false;
}

protected function passPhraseFileExists(): bool
{
return file_exists($this->passphraseFilepath);
}

protected function localSshKeyExists(): bool
{
return file_exists($this->publicSshKeyFilepath) && file_exists($this->privateSshKeyFilepath);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command;

use Acquia\Cli\AcsfApi\AcsfClientService;
use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Acquia\Cli\Attribute\RequireRemoteDb;
use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\Command\Ssh\SshKeyCommandBase;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\AliasCache;
use Acquia\Cli\Helpers\DataStoreContract;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\LoopHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use Acquia\Cli\Output\Checklist;
use Acquia\Cli\Transformer\EnvironmentTransformer;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Connector\Connector;
use AcquiaCloudApi\Endpoints\Account;
use AcquiaCloudApi\Endpoints\Applications;
use AcquiaCloudApi\Endpoints\CodebaseEnvironments;
use AcquiaCloudApi\Endpoints\Codebases;
use AcquiaCloudApi\Endpoints\Databases;
use AcquiaCloudApi\Endpoints\Environments;
use AcquiaCloudApi\Endpoints\Notifications;
use AcquiaCloudApi\Endpoints\Organizations;
use AcquiaCloudApi\Endpoints\SiteInstances;
use AcquiaCloudApi\Endpoints\Sites;
use AcquiaCloudApi\Endpoints\Subscriptions;
use AcquiaCloudApi\Response\AccountResponse;
use AcquiaCloudApi\Response\ApplicationResponse;
use AcquiaCloudApi\Response\CodebaseEnvironmentResponse;
use AcquiaCloudApi\Response\CodebaseResponse;
use AcquiaCloudApi\Response\CodebasesResponse;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\DatabasesResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\EnvironmentsResponse;
use AcquiaCloudApi\Response\NotificationResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
use AcquiaCloudApi\Response\SiteInstanceResponse;
use AcquiaCloudApi\Response\SiteResponse;
use AcquiaCloudApi\Response\SubscriptionResponse;
use AcquiaLogstream\LogstreamManager;
use ArrayObject;
use Closure;
use Exception;
use JsonException;
use loophp\phposinfo\OsInfo;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use ReflectionClass;
use Safe\Exceptions\FilesystemException;
use SelfUpdate\SelfUpdateManager;
use stdClass;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Console\Terminal;
use Symfony\Component\Filesystem\Path;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Yaml\Yaml;
use Zumba\Amplitude\Amplitude;

abstract class CommandBase extends Command implements LoggerAwareInterface
{
use LoggerAwareTrait;

protected InputInterface $input;

protected OutputInterface $output;

protected SymfonyStyle $io;

protected FormatterHelper $formatter;

private ApplicationResponse $cloudApplication;

protected string $siteId = "";

protected string $dir;

protected string $localDbUser = 'drupal';

protected string $localDbPassword = 'drupal';

protected string $localDbName = 'drupal';

protected string $localDbHost = 'localhost';

protected bool $drushHasActiveDatabaseConnection;

public function __construct(
public LocalMachineHelper $localMachineHelper,
protected CloudDataStore $datastoreCloud,
protected AcquiaCliDatastore $datastoreAcli,
protected ApiCredentialsInterface $cloudCredentials,
protected TelemetryHelper $telemetryHelper,
protected string $projectDir,
protected ClientService $cloudApiClientService,
public SshHelper $sshHelper,
protected string $sshDir,
LoggerInterface $logger,
public selfUpdateManager $selfUpdateManager,
) {
$this->logger = $logger;
$this->setLocalDbPassword();
$this->setLocalDbUser();
$this->setLocalDbName();
$this->setLocalDbHost();
parent::__construct();
if ((new ReflectionClass(static::class))->getAttributes(RequireAuth::class)) {
$this->appendHelp('This command requires authentication via the Cloud Platform API.');
}
if ((new ReflectionClass(static::class))->getAttributes(RequireLocalDb::class)) {
$this->appendHelp('This command requires an active database connection. Set the following environment variables prior to running this command: '
. 'ACLI_DB_HOST, ACLI_DB_NAME, ACLI_DB_USER, ACLI_DB_PASSWORD');
}
if ((new ReflectionClass(static::class))->getAttributes(RequireRemoteDb::class)) {
$this->appendHelp('This command requires the \'View database connection details\' permission.');
}
}

public function appendHelp(string $helpText): void
{
$currentHelp = $this->getHelp();
$helpText = $currentHelp ? $currentHelp . "\n" . $helpText : $currentHelp . $helpText;
$this->setHelp($helpText);
}

protected static function getUuidRegexConstraint(): Regex
{
return new Regex([
'message' => 'This is not a valid UUID.',
'pattern' => '/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i',
]);
}

public function setProjectDir(string $projectDir): void
{
$this->projectDir = $projectDir;
}

public function getProjectDir(): string
{
return $this->projectDir;
}

private function setLocalDbUser(): void
{
if (getenv('ACLI_DB_USER')) {
$this->localDbUser = getenv('ACLI_DB_USER');
}
}

public function getLocalDbUser(): string
{
return $this->localDbUser;
}

private function setLocalDbPassword(): void
{
if (getenv('ACLI_DB_PASSWORD')) {
$this->localDbPassword = getenv('ACLI_DB_PASSWORD');
}
}

public function getLocalDbPassword(): string
{
return $this->localDbPassword;
}

private function setLocalDbName(): void
{
if (getenv('ACLI_DB_NAME')) {
$this->localDbName = getenv('ACLI_DB_NAME');
}
}

public function getLocalDbName(): string
{
return $this->localDbName;
}

private function setLocalDbHost(): void
{
if (getenv('ACLI_DB_HOST')) {
$this->localDbHost = getenv('ACLI_DB_HOST');
}
}

public function getLocalDbHost(): string
{
return $this->localDbHost;
}






protected function initialize(InputInterface $input, OutputInterface $output): void
{
$this->input = $input;
$this->output = $output;
$this->io = new SymfonyStyle($input, $output);

ProgressBar::setFormatDefinition(
'message',
"%current%/%max% [%bar%] <info>%percent:3s%%</info> -- %elapsed:6s%/%estimated:-6s%\n %message%"
);
$this->formatter = $this->getHelper('formatter');

$this->output->writeln('Acquia CLI version: ' . $this->getApplication()
->getVersion(), OutputInterface::VERBOSITY_DEBUG);
if (getenv('ACLI_NO_TELEMETRY') !== 'true') {
$this->checkAndPromptTelemetryPreference();
$this->telemetryHelper->initialize();
}
$this->checkAuthentication();

$this->fillMissingRequiredApplicationUuid($input, $output);
$this->convertApplicationAliasToUuid($input);
$this->convertUserAliasToUuid($input, 'userUuid', 'organizationUuid');
$this->convertEnvironmentAliasToUuid($input, 'environmentId');
$this->convertEnvironmentAliasToUuid($input, 'source-environment');
$this->convertEnvironmentAliasToUuid($input, 'destination-environment');
$this->convertEnvironmentAliasToUuid($input, 'source');
$this->convertNotificationToUuid($input, 'notificationUuid');
$this->convertNotificationToUuid($input, 'notification-uuid');

if ($latest = $this->checkForNewVersion()) {
$this->output->writeln("Acquia CLI $latest is available. Run <options=bold>acli self-update</> to update.");
}
}




public function checkAndPromptTelemetryPreference(): void
{
$sendTelemetry = $this->datastoreCloud->get(DataStoreContract::SEND_TELEMETRY);
if (!isset($sendTelemetry) && $this->getName() !== 'telemetry' && $this->input->isInteractive()) {
$this->output->writeln('We strive to give you the best tools for development.');
$this->output->writeln('You can really help us improve by sharing anonymous performance and usage data.');
$style = new SymfonyStyle($this->input, $this->output);
$pref = $style->confirm('Would you like to share anonymous performance usage and data?');
$this->datastoreCloud->set(DataStoreContract::SEND_TELEMETRY, $pref);
if ($pref) {
$this->output->writeln('Awesome! Thank you for helping!');
} else {

$this->output->writeln('Ok, no data will be collected and shared with us.');
$this->output->writeln('We take privacy seriously.');
$this->output->writeln('If you change your mind, run <options=bold>acli telemetry</>.');
}
}
}

public function run(InputInterface $input, OutputInterface $output): int
{
$exitCode = parent::run($input, $output);
if (
$exitCode === 0 && in_array($input->getFirstArgument(), [
'self-update',
'update',
])
) {


return $exitCode;
}
$eventProperties = [
'app_version' => $this->getApplication()->getVersion(),
'arguments' => $input->getArguments(),
'exit_code' => $exitCode,
'options' => $input->getOptions(),
'os_name' => OsInfo::os(),
'os_version' => OsInfo::version(),
'platform' => OsInfo::family(),
];
Amplitude::getInstance()->queueEvent('Ran command', $eventProperties);

return $exitCode;
}




protected function acceptApplicationUuid(): static
{
$this->addArgument('applicationUuid', InputArgument::OPTIONAL, 'The Cloud Platform application UUID or alias (i.e. an application name optionally prefixed with the realm)')
->addUsage('[<applicationAlias>]')
->addUsage('myapp')
->addUsage('prod:myapp')
->addUsage('abcd1234-1111-2222-3333-0e02b2c3d470');

return $this;
}




protected function acceptCodebaseId(): static
{
$this->addArgument('codebaseId', InputArgument::OPTIONAL, 'The Cloud Platform codebase ID')
->addUsage('abcd1234-1111-2222-3333-0e02b2c3d470');

return $this;
}



protected function acceptEnvironmentId(): static
{
$this->addArgument('environmentId', InputArgument::OPTIONAL, 'The Cloud Platform environment ID or alias (i.e. an application and environment name optionally prefixed with the realm)')
->addUsage('[<environmentAlias>]')
->addUsage('myapp.dev')
->addUsage('prod:myapp.dev')
->addUsage('12345-abcd1234-1111-2222-3333-0e02b2c3d470');

return $this;
}




protected function acceptSiteInstanceId(): static
{
$this->addOption('siteInstanceId', null, InputOption::VALUE_OPTIONAL, 'The Site Instance ID (SITEID.EnvironmentID)')
->addUsage('3e8ecbec-ea7c-4260-8414-ef2938c859bc.abcd1234-1111-2222-3333-0e02b2c3d470');

return $this;
}









protected function acceptSite(): self
{

$this->addArgument('site', InputArgument::OPTIONAL, 'For a multisite application, the directory name of the site')
->addUsage('myapp.dev default');

return $this;
}







private function promptChooseSubscription(
Client $acquiaCloudClient
): ?SubscriptionResponse {
$subscriptionsResource = new Subscriptions($acquiaCloudClient);
$customerSubscriptions = $subscriptionsResource->getAll();

if (!$customerSubscriptions->count()) {
throw new AcquiaCliException("You have no Cloud subscriptions.");
}
return $this->promptChooseFromObjectsOrArrays(
$customerSubscriptions,
'uuid',
'name',
'Select a Cloud Platform subscription:'
);
}







private function promptChooseApplication(
Client $acquiaCloudClient
): object|array|null {
$applicationsResource = new Applications($acquiaCloudClient);
$customerApplications = $applicationsResource->getAll();

if (!$customerApplications->count()) {
throw new AcquiaCliException("You have no Cloud applications.");
}
return $this->promptChooseFromObjectsOrArrays(
$customerApplications,
'uuid',
'name',
'Select a Cloud Platform application:'
);
}







private function promptChooseEnvironment(
Client $acquiaCloudClient,
string $applicationUuid
): object|array|null {
$environmentResource = new Environments($acquiaCloudClient);
$environments = $environmentResource->getAll($applicationUuid);
if (!$environments->count()) {
throw new AcquiaCliException('There are no environments associated with this application.');
}
return $this->promptChooseFromObjectsOrArrays(
$environments,
'uuid',
'name',
'Select a Cloud Platform environment:'
);
}





protected function promptChooseLogs(): object|array|null
{
$logs = array_map(static function (mixed $logType, mixed $logLabel): array {
return [
'label' => $logLabel,
'type' => $logType,
];
}, array_keys(LogstreamManager::AVAILABLE_TYPES), LogstreamManager::AVAILABLE_TYPES);
return $this->promptChooseFromObjectsOrArrays(
$logs,
'type',
'label',
'Select one or more logs as a comma-separated list:',
true
);
}












protected function promptChooseFromObjectsOrArrays(array|ArrayObject $items, string $uniqueProperty, string $labelProperty, string $questionText, bool $multiselect = false): object|array|null
{
$list = [];
foreach ($items as $item) {
if (is_array($item)) {
$list[$item[$uniqueProperty]] = trim($item[$labelProperty]);
} else {
$list[$item->$uniqueProperty] = trim($item->$labelProperty);
}
}
$labels = array_values($list);
$default = $multiselect ? 0 : $labels[0];
$question = new ChoiceQuestion($questionText, $labels, $default);
$question->setMultiselect($multiselect);
$choiceId = $this->io->askQuestion($question);
if (!$multiselect) {
$identifier = array_search($choiceId, $list, true);
foreach ($items as $item) {
if (is_array($item)) {
if ($item[$uniqueProperty] === $identifier) {
return $item;
}
} elseif ($item->$uniqueProperty === $identifier) {
return $item;
}
}
} else {
$chosen = [];
foreach ($choiceId as $choice) {
$identifier = array_search($choice, $list, true);
foreach ($items as $item) {
if (is_array($item)) {
if ($item[$uniqueProperty] === $identifier) {
$chosen[] = $item;
}
} elseif ($item->$uniqueProperty === $identifier) {
$chosen[] = $item;
}
}
}
return $chosen;
}

return null;
}

protected function getHostFromDatabaseResponse(mixed $environment, DatabaseResponse $database): string
{
if ($this->isAcsfEnv($environment)) {
return $database->db_host . '.enterprise-g1.hosting.acquia.com';
}

return $database->db_host;
}




protected function rsyncFiles(string $sourceDir, string $destinationDir, ?callable $outputCallback): void
{
$this->localMachineHelper->checkRequiredBinariesExist(['rsync']);
$command = [
'rsync',






'-avPhze',
'ssh -o StrictHostKeyChecking=no',
$sourceDir . '/',
$destinationDir,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to sync files. {message}', ['message' => $process->getErrorOutput()]);
}
}

protected function getCloudFilesDir(EnvironmentResponse $chosenEnvironment, string $site): string
{
$sitegroup = self::getSitegroup($chosenEnvironment);
$envAlias = self::getEnvironmentAlias($chosenEnvironment);
if ($this->isAcsfEnv($chosenEnvironment)) {
return "/mnt/files/$envAlias/sites/g/files/$site/files";
}
return $this->getCloudSitesPath($chosenEnvironment, $sitegroup) . "/$site/files";
}

protected function getLocalFilesDir(string $site): string
{
return $this->dir . '/docroot/sites/' . $site . '/files';
}




protected function determineCloudDatabases(Client $acquiaCloudClient, EnvironmentResponse $chosenEnvironment, ?string $site = null, bool $multipleDbs = false): array
{
$codebaseUuid = self::getCodebaseUuid();
if ($codebaseUuid && $this->siteId) {
$database = EnvironmentTransformer::transformSiteInstanceDatabase($this->getSiteInstanceDatabase($this->siteId, $chosenEnvironment->uuid));
if ($database) {
return [$database];
}
}
$databasesRequest = new Databases($acquiaCloudClient);
$databases = $databasesRequest->getAll($chosenEnvironment->uuid);

if (count($databases) === 1) {
$this->logger->debug('Only a single database detected on Cloud');
return [$databases[0]];
}
$this->logger->debug('Multiple databases detected on Cloud');
if ($site && !$multipleDbs) {
if ($site === 'default') {
$this->logger->debug('Site is set to default. Assuming default database');
$site = self::getSitegroup($chosenEnvironment);
}
$databaseNames = array_column((array) $databases, 'name');
$databaseKey = array_search($site, $databaseNames, true);
if ($databaseKey !== false) {
return [$databases[$databaseKey]];
}
}
return $this->promptChooseDatabases($chosenEnvironment, $databases, $multipleDbs);
}






private function promptChooseDatabases(
EnvironmentResponse $cloudEnvironment,
DatabasesResponse $environmentDatabases,
bool $multipleDbs
): array {
$choices = [];
if ($multipleDbs) {
$choices['all'] = 'All';
}
$defaultDatabaseIndex = 0;
if ($this->isAcsfEnv($cloudEnvironment)) {
$acsfSites = $this->getAcsfSites($cloudEnvironment);
}
foreach ($environmentDatabases as $index => $database) {
$suffix = '';
if (isset($acsfSites)) {
foreach ($acsfSites['sites'] as $domain => $acsfSite) {
if ($acsfSite['conf']['gardens_db_name'] === $database->name) {
$suffix .= ' (' . $domain . ')';
break;
}
}
}
if ($database->flags->default) {
$defaultDatabaseIndex = $index;
$suffix .= ' (default)';
}
$choices[] = $database->name . $suffix;
}

$question = new ChoiceQuestion(
$multipleDbs ? 'Choose databases. You may choose multiple. Use commas to separate choices.' : 'Choose a database.',
$choices,
$defaultDatabaseIndex
);
$question->setMultiselect($multipleDbs);
if ($multipleDbs) {
$chosenDatabaseKeys = $this->io->askQuestion($question);
$chosenDatabases = [];
if (count($chosenDatabaseKeys) === 1 && $chosenDatabaseKeys[0] === 'all') {
if (count($environmentDatabases) > 10) {
$this->io->warning('You have chosen to pull down more than 10 databases. This could exhaust your disk space.');
}
return (array) $environmentDatabases;
}
foreach ($chosenDatabaseKeys as $chosenDatabaseKey) {
$chosenDatabases[] = $environmentDatabases[$chosenDatabaseKey];
}

return $chosenDatabases;
}

$chosenDatabaseLabel = $this->io->choice('Choose a database', $choices, $defaultDatabaseIndex);
$chosenDatabaseIndex = array_search($chosenDatabaseLabel, $choices, true);
return [$environmentDatabases[$chosenDatabaseIndex]];
}




protected function determineEnvironment(InputInterface $input, OutputInterface $output, bool $allowProduction = false, bool $allowNode = false): array|string|EnvironmentResponse
{
if ($input->hasOption('siteInstanceId') && $input->getOption('siteInstanceId')) {
$siteInstance = $this->determineSiteInstance($input);
$chosenEnvironment = EnvironmentTransformer::transform($siteInstance->environment);
$chosenEnvironment->vcs->url = $siteInstance->environment->codebase->vcs_url ?? '';
} elseif ($input->getArgument('environmentId')) {
$environmentId = $input->getArgument('environmentId');
$chosenEnvironment = $this->getCloudEnvironment($environmentId);
} else {
$chosenEnvironment = $this->determineCodebaseEnvironment($input, $output);
if (!$chosenEnvironment) {
$cloudApplicationUuid = $this->determineCloudApplication();
$cloudApplication = $this->getCloudApplication($cloudApplicationUuid);
$output->writeln(sprintf('Using Cloud Application <options=bold>%s</>', $cloudApplication->name));
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$chosenEnvironment = $this->promptChooseEnvironmentConsiderProd($acquiaCloudClient, $cloudApplicationUuid, $allowProduction, $allowNode);
}
}
$this->logger->debug("Using environment $chosenEnvironment->label $chosenEnvironment->uuid");

return $chosenEnvironment;
}






private function determineCodebaseEnvironment(InputInterface $input, OutputInterface $output): ?EnvironmentResponse
{


$codebaseUuid = self::getCodebaseUuid();

if (!$codebaseUuid) {
return null;
}
$output->writeln(sprintf(
'Detected Codebase UUID: <options=bold>%s</>',
$codebaseUuid
));


$codebase = $this->getCodebase($codebaseUuid);
$output->writeln(sprintf(
'Using codebase: <options=bold>%s</>',
$codebase->label
));


$environments = $this->getEnvironmentsByCodebase($codebase);

if (empty($environments)) {
throw new AcquiaCliException('No environments found for this codebase.');
}


$chosenEnvironment = $this->promptChooseCodebaseEnvironment($environments);

return $chosenEnvironment;
}










private function getEnvironmentsByCodebase(CodebaseResponse $codebase): array
{
try {

$codebaseEnvironmentResource = new CodebaseEnvironments($this->cloudApiClientService->getClient());
$codebaseEnvironments = $codebaseEnvironmentResource->getAll($codebase->id);

$environments = [];
foreach ($codebaseEnvironments as $codebaseEnv) {
$codebaseEnv->codebase = $codebase;
$environments[] = EnvironmentTransformer::transform($codebaseEnv);
}

return $environments;
} catch (Exception $e) {
throw new AcquiaCliException('Failed to fetch environments for codebase: ' . $e->getMessage());
}
}






private function promptChooseCodebaseEnvironment(array $environments): EnvironmentResponse
{
if (count($environments) === 1) {
return reset($environments);
}

$choices = [];
foreach ($environments as $environment) {
$choices[] = "$environment->label, $environment->name (branch: {$environment->vcs->branch})";
}

$chosenEnvironmentLabel = $this->io->choice('Choose a Cloud Platform environment', $choices, $choices[0]);
$chosenEnvironmentIndex = array_search($chosenEnvironmentLabel, $choices, true);
return $environments[$chosenEnvironmentIndex];
}









private function getSitesByCodebase(string $codebaseUuid): array
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$response = $acquiaCloudClient->request('get', "/codebases/$codebaseUuid/sites");

if (!isset($response->_embedded->items)) {
return (array) $response;
}

return (array) $response->_embedded->items;
}






protected function determineSiteInstanceFromCodebaseUuid(EnvironmentResponse $environment, InputInterface $input, OutputInterface $output): ?string
{

$codebaseUuid = self::getCodebaseUuid();
if (!$codebaseUuid) {
return null;
}


$sites = $this->getSitesByCodebase($codebaseUuid);

if (empty($sites)) {
$output->writeln('<comment>No sites found for this codebase.</comment>');
return null;
}


$siteInstances = [];
foreach ($sites as $site) {
$siteInstance = $this->getSiteInstance($site->id, $environment->uuid);
if ($siteInstance) {
$siteInstanceObj = new stdClass();
$siteInstanceObj->name = $site->name;
$siteInstanceObj->siteInstanceId = $site->id . '.' . $environment->uuid;
$siteInstances[] = $siteInstanceObj;
}
}

if (count($siteInstances) === 1) {
$selectedInstance = reset($siteInstances);
return $selectedInstance->siteInstanceId;
}

if (count($siteInstances) === 0) {
return null;
}


$choices = array_map(function ($instance) {
return $instance->name;
}, $siteInstances);

$chosenSiteLabel = $this->io->choice('Choose a site instance', $choices, $choices[0]);
$chosenSiteIndex = array_search($chosenSiteLabel, $choices, true);

$selectedInstance = $siteInstances[$chosenSiteIndex];
return $selectedInstance->siteInstanceId;
}









protected function determineSiteInstance(InputInterface $input): ?SiteInstanceResponse
{
$siteInstanceId = $input->getOption('siteInstanceId');
if ($siteInstanceId) {
$siteEnvParts = explode('.', $siteInstanceId);
if (count($siteEnvParts) !== 2) {
throw new AcquiaCliException('Site instance ID must be in the format <siteId>.<environmentId>');
}
[$siteId, $environmentId] = $siteEnvParts;
$environment = $this->getCodebaseEnvironment($environmentId);
if (!$environment) {
throw new AcquiaCliException("Environment with ID $environmentId not found.");
}
$site = $this->getSite($siteId);
if (!$site) {
throw new AcquiaCliException("Site with ID $siteId not found.");
}
$siteInstance = $this->getSiteInstance($siteId, $environmentId);
$siteInstance->site = $site;
$environment->codebase = $this->getCodebase($environment->codebase_uuid);
$siteInstance->environment = $environment;
return $siteInstance;
}
return null;
}



private function promptChooseEnvironmentConsiderProd(Client $acquiaCloudClient, string $applicationUuid, bool $allowProduction, bool $allowNode): EnvironmentResponse
{
$environmentResource = new Environments($acquiaCloudClient);
$applicationEnvironments = iterator_to_array($environmentResource->getAll($applicationUuid));
$choices = [];
foreach ($applicationEnvironments as $key => $environment) {
$productionNotAllowed = !$allowProduction && $environment->flags->production;
$nodeNotAllowed = !$allowNode && $environment->type === 'node';
if ($productionNotAllowed || $nodeNotAllowed) {
unset($applicationEnvironments[$key]);

$applicationEnvironments = array_values($applicationEnvironments);
continue;
}
$choices[] = "$environment->label, $environment->name (vcs: {$environment->vcs->path})";
}
if (count($choices) === 0) {
throw new AcquiaCliException('No compatible environments found');
}
$chosenEnvironmentLabel = $this->io->choice('Choose a Cloud Platform environment', $choices, $choices[0]);
$chosenEnvironmentIndex = array_search($chosenEnvironmentLabel, $choices, true);

return $applicationEnvironments[$chosenEnvironmentIndex];
}




protected function isLocalGitRepoDirty(): bool
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$process = $this->localMachineHelper->executeFromCmd(


'git add . && git diff-index --cached --quiet HEAD',
null,
$this->dir,
false
);

return !$process->isSuccessful();
}




protected function getLocalGitCommitHash(): string
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$process = $this->localMachineHelper->execute([
'git',
'rev-parse',
'HEAD',
], null, $this->dir, false);

if (!$process->isSuccessful()) {
throw new AcquiaCliException("Unable to determine Git commit hash.");
}

return trim($process->getOutput());
}








private function getGitConfig(): array
{
$filePath = $this->projectDir . '/.git/config';
return @\Safe\parse_ini_file($filePath, true);
}








private function getGitRemotes(array $gitConfig): array
{
$localVcsRemotes = [];
foreach ($gitConfig as $sectionName => $section) {
if (
array_key_exists('url', $section) &&
str_contains($sectionName, 'remote ') &&
(strpos($section['url'], 'acquia.com') || strpos($section['url'], 'acquia-sites.com'))
) {
$localVcsRemotes[] = $section['url'];
}
}

return $localVcsRemotes;
}

private function findCloudApplicationByGitUrl(
Client $acquiaCloudClient,
array $localGitRemotes
): ?ApplicationResponse {


$applicationsResource = new Applications($acquiaCloudClient);
$customerApplications = $applicationsResource->getAll();
$environmentsResource = new Environments($acquiaCloudClient);


$count = count($customerApplications);
$progressBar = new ProgressBar($this->output, $count);
$progressBar->setFormat('message');
$progressBar->setMessage("Searching <options=bold>$count applications</> on the Cloud Platform...");
$progressBar->start();


$terminalWidth = (new Terminal())->getWidth();
foreach ($customerApplications as $application) {

$message = "Searching <options=bold>$application->name</> for matching git URLs";
$suffixLength = $terminalWidth - strlen($message) - 17;
$suffix = $suffixLength > 0 ? str_repeat(' ', $suffixLength) : '';
$progressBar->setMessage($message . $suffix);
$applicationEnvironments = $environmentsResource->getAll($application->uuid);
if (
$application = $this->searchApplicationEnvironmentsForGitUrl(
$application,
$applicationEnvironments,
$localGitRemotes
)
) {
$progressBar->finish();
$progressBar->clear();

return $application;
}
$progressBar->advance();
}
$progressBar->finish();
$progressBar->clear();

return null;
}

protected function createTable(OutputInterface $output, string $title, array $headers, ?array $widths = null): Table
{
$terminalWidth = (new Terminal())->getWidth();
$terminalWidth *= .90;
$table = new Table($output);
$table->setHeaders($headers);
$table->setHeaderTitle($title);
if ($widths !== null) {
$setWidths = static function (float $width) use ($terminalWidth) {
return (int) ($terminalWidth * $width);
};
$table->setColumnWidths(array_map($setWidths, $widths));
}
return $table;
}

private function searchApplicationEnvironmentsForGitUrl(
ApplicationResponse $application,
EnvironmentsResponse $applicationEnvironments,
array $localGitRemotes
): ?ApplicationResponse {
foreach ($applicationEnvironments as $environment) {
if ($environment->flags->production && in_array($environment->vcs->url, $localGitRemotes, true)) {
$this->logger->debug("Found matching Cloud application! $application->name with uuid $application->uuid matches local git URL {$environment->vcs->url}");

return $application;
}
}

return null;
}










protected function inferCloudAppFromLocalGitConfig(
Client $acquiaCloudClient
): ?ApplicationResponse {
if ($this->projectDir && $this->input->isInteractive()) {
$this->output->writeln("There is no Cloud Platform application linked to <options=bold>$this->projectDir/.git</>.");
$answer = $this->io->confirm('Would you like Acquia CLI to search for a Cloud application that matches your local git config?');
if ($answer) {
$this->output->writeln('Searching for a matching Cloud application...');
try {
$gitConfig = $this->getGitConfig();
$localGitRemotes = $this->getGitRemotes($gitConfig);
if (
$cloudApplication = $this->findCloudApplicationByGitUrl(
$acquiaCloudClient,
$localGitRemotes
)
) {
$this->output->writeln('<info>Found a matching application!</info>');
return $cloudApplication;
}

$this->output->writeln('<comment>Could not find a matching Cloud application.</comment>');
return null;
} catch (FilesystemException $e) {
throw new AcquiaCliException($e->getMessage());
}
}
}

return null;
}





protected function getSubscriptionApplications(Client $client, SubscriptionResponse $subscription): array
{
$applicationsResource = new Applications($client);
$applications = $applicationsResource->getAll();
$subscriptionApplications = [];

foreach ($applications as $application) {
if ($application->subscription->uuid === $subscription->uuid) {
$subscriptionApplications[] = $application;
}
}
if (count($subscriptionApplications) === 0) {
throw new AcquiaCliException("You do not have access to any applications on the $subscription->name subscription");
}
return $subscriptionApplications;
}




protected function determineCloudSubscription(): SubscriptionResponse
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();

if ($this->input->hasArgument('subscriptionUuid') && $this->input->getArgument('subscriptionUuid')) {
$cloudSubscriptionUuid = $this->input->getArgument('subscriptionUuid');
self::validateUuid($cloudSubscriptionUuid);
return (new Subscriptions($acquiaCloudClient))->get($cloudSubscriptionUuid);
}


if ($this->input->isInteractive() && $subscription = $this->promptChooseSubscription($acquiaCloudClient)) {
return $subscription;
}

throw new AcquiaCliException("Could not determine Cloud subscription. Run this command interactively or use the `subscriptionUuid` argument.");
}






protected function determineCloudApplication(bool $promptLinkApp = false): ?string
{
$applicationUuid = $this->doDetermineCloudApplication();
if (!isset($applicationUuid)) {
throw new AcquiaCliException("Could not determine Cloud Application. Run this command interactively or use `acli link` to link a Cloud Application before running non-interactively.");
}


if (!empty($this->projectDir) && !$this->getCloudUuidFromDatastore()) {
if ($promptLinkApp) {
$application = $this->getCloudApplication($applicationUuid);
$this->saveCloudUuidToDatastore($application);
} elseif (!AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && !$this->getCloudApplicationUuidFromBltYaml()) {
$application = $this->getCloudApplication($applicationUuid);
$this->promptLinkApplication($application);
}
}

return $applicationUuid;
}




protected function doDetermineCloudApplication(): ?string
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();

if ($this->input->hasArgument('applicationUuid') && $this->input->getArgument('applicationUuid')) {
$cloudApplicationUuid = $this->input->getArgument('applicationUuid');
return self::validateUuid($cloudApplicationUuid);
}

if ($this->input->hasArgument('environmentId') && $this->input->getArgument('environmentId')) {
$environmentId = $this->input->getArgument('environmentId');
$environment = $this->getCloudEnvironment($environmentId);
return $environment->application->uuid;
}


if ($applicationUuid = $this->getCloudUuidFromDatastore()) {
$this->logger->debug("Using Cloud application UUID: $applicationUuid from {$this->datastoreAcli->filepath}");
return $applicationUuid;
}

if ($applicationUuid = $this->getCloudApplicationUuidFromBltYaml()) {
$this->logger->debug("Using Cloud application UUID $applicationUuid from blt/blt.yml");
return $applicationUuid;
}


if ($applicationUuid = self::getCloudAppUuid()) {
return $applicationUuid;
}


if ($cloudApplication = $this->inferCloudAppFromLocalGitConfig($acquiaCloudClient)) {
return $cloudApplication->uuid;
}

if ($this->input->isInteractive()) {

$application = $this->promptChooseApplication($acquiaCloudClient);
if ($application) {
return $application->uuid;
}
}

return null;
}






protected function determineCloudCodebase(): ?string
{
$codebaseUuid = $this->doDetermineCloudCodebase();
if (!isset($codebaseUuid)) {
throw new AcquiaCliException("Could not determine Cloud Codebase");
}

return $codebaseUuid;
}




protected function doDetermineCloudCodebase(): ?string
{
if ($this->input->hasArgument('codebaseId') && $this->input->getArgument('codebaseId')) {
$cloudCodebaseId = $this->input->getArgument('codebaseId');
return self::validateUuid($cloudCodebaseId);
}

if ($this->input->isInteractive()) {

$codebase = $this->promptChooseCodebase();
if ($codebase != null) {
return $codebase->id;
}
}

return null;
}







protected function promptChooseCodebase(): object|array|null
{
$customerCodebases = $this->getCloudCodebases();
if (!$customerCodebases->count()) {
throw new AcquiaCliException("You have no Cloud codebases.");
}
return $this->promptChooseFromObjectsOrArrays(
$customerCodebases,
'id',
'label',
'Select a Cloud Platform codebase:'
);
}

protected function getCloudApplicationUuidFromBltYaml(): ?string
{
$bltYamlFilePath = Path::join($this->projectDir, 'blt', 'blt.yml');
if (file_exists($bltYamlFilePath)) {
$contents = Yaml::parseFile($bltYamlFilePath);
if (array_key_exists('cloud', $contents) && array_key_exists('appId', $contents['cloud'])) {
return $contents['cloud']['appId'];
}
}

return null;
}

public static function validateUuid(string $uuid): string
{
$violations = Validation::createValidator()->validate($uuid, [
new Length([
'value' => 36,
]),
self::getUuidRegexConstraint(),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}

return $uuid;
}

private static function validateLegacyEnvironmentId(string $environmentId): string
{

$uuidParts = explode('-', $environmentId);
unset($uuidParts[0]);
$applicationUuid = implode('-', $uuidParts);
self::validateUuid($applicationUuid);
return $environmentId;
}

private function saveCloudUuidToDatastore(ApplicationResponse $application): bool
{
$this->datastoreAcli->set('cloud_app_uuid', $application->uuid);
$this->io->success("The Cloud application $application->name has been linked to this repository by writing to {$this->datastoreAcli->filepath}");

return true;
}
protected function getCloudUuidFromDatastore(): ?string
{
return $this->datastoreAcli->get('cloud_app_uuid');
}

private function promptLinkApplication(
ApplicationResponse $cloudApplication
): bool {
$answer = $this->io->confirm("Would you like to link the Cloud application <bg=cyan;options=bold>$cloudApplication->name</> to this repository?");
if ($answer) {
return $this->saveCloudUuidToDatastore($cloudApplication);
}
return false;
}




protected function validateCwdIsValidDrupalProject(): void
{
if (!$this->projectDir) {
throw new AcquiaCliException('Could not find a local Drupal project. Looked for `docroot/index.php` in current and parent directories. Execute this command from within a Drupal project directory.');
}
}






public static function isAcquiaCloudIde(): bool
{
return AcquiaDrupalEnvironmentDetector::isAhIdeEnv();
}






protected static function getCloudAppUuid(): false|string
{
return getenv('ACQUIA_APPLICATION_UUID');
}






protected static function getCodebaseUuid(): false|string
{
return getenv('AH_CODEBASE_UUID');
}





protected static function getThisCloudIdeUuid(): false|string
{
return getenv('REMOTEIDE_UUID');
}

protected static function getThisCloudIdeLabel(): false|string
{
return getenv('REMOTEIDE_LABEL');
}

protected static function getThisCloudIdeWebUrl(): false|string
{
return getenv('REMOTEIDE_WEB_HOST');
}

protected function getCloudApplication(string $applicationUuid): ApplicationResponse
{
$applicationsResource = new Applications($this->cloudApiClientService->getClient());
return $applicationsResource->get($applicationUuid);
}

protected function getCloudCodebase(string $codebaseUuid): CodebaseResponse
{
$codebasesResource = new Codebases($this->cloudApiClientService->getClient());
return $codebasesResource->get($codebaseUuid);
}

protected function getCloudCodebases(): CodebasesResponse
{
$codebasesResource = new Codebases($this->cloudApiClientService->getClient());
return $codebasesResource->getAll();
}

protected function getCloudEnvironment(string $environmentId): EnvironmentResponse
{
$environmentResource = new Environments($this->cloudApiClientService->getClient());

return $environmentResource->get($environmentId);
}
protected function getCodebaseEnvironment(string $environmentId): CodebaseEnvironmentResponse
{
$environmentResource = new CodebaseEnvironments($this->cloudApiClientService->getClient());
$codebaseEnvironment = $environmentResource->getById($environmentId);
return $codebaseEnvironment;
}




protected function getCodebase(string $codebaseId): CodebaseResponse
{
$codebaseResource = new Codebases($this->cloudApiClientService->getClient());
$codebase = $codebaseResource->get($codebaseId);

return $codebase;
}
protected function getSite(string $siteId): SiteResponse
{
$siteResource = new Sites($this->cloudApiClientService->getClient());
$site = $siteResource->get($siteId);
return $site;
}



protected function getSiteInstance(string $siteId, string $environmentId): ?SiteInstanceResponse
{
try {
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$siteInstancesResource = new SiteInstances($acquiaCloudClient);
$siteInstance = $siteInstancesResource->get($siteId, $environmentId);
return $siteInstance;
} catch (\Exception $e) {
$this->logger->debug("Site instance with ID $siteId.$environmentId not found." . $e->getMessage());
return null;
}
}






private function getSiteInstanceDatabase(string $siteUuid, string $environmentUuid): ?SiteInstanceDatabaseResponse
{
try {
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$siteInstancesResource = new SiteInstances($acquiaCloudClient);
$siteInstanceDatabase = $siteInstancesResource->getDatabase($siteUuid, $environmentUuid);
return $siteInstanceDatabase;
} catch (\Exception $e) {
$this->logger->debug('Could not get site instance database: ' . $e->getMessage());
}
return null;
}

public static function validateEnvironmentAlias(string $alias): string
{
$violations = Validation::createValidator()->validate($alias, [
new Length(['min' => 5]),
new NotBlank(),
new Regex([
'message' => 'You must enter either an environment ID or alias. Environment aliases must match the pattern [app-name].[env]',
'pattern' => '/.+\..+/',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}

return $alias;
}

protected function normalizeAlias(string $alias): string
{
return str_replace('@', '', $alias);
}




protected function getEnvironmentFromAliasArg(string $alias): EnvironmentResponse
{
return $this->getEnvFromAlias($alias);
}




private function getEnvFromAlias(string $alias): EnvironmentResponse
{
return self::getAliasCache()
->get($alias, function () use ($alias): EnvironmentResponse {
return $this->doGetEnvFromAlias($alias);
});
}




private function doGetEnvFromAlias(string $alias): EnvironmentResponse
{
$siteEnvParts = explode('.', $alias);
[$applicationAlias, $environmentAlias] = $siteEnvParts;
$this->logger->debug("Searching for an environment matching alias $applicationAlias.$environmentAlias.");
$customerApplication = $this->getApplicationFromAlias($applicationAlias);
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environmentsResource = new Environments($acquiaCloudClient);
$environments = $environmentsResource->getAll($customerApplication->uuid);
foreach ($environments as $environment) {
if ($environment->name === $environmentAlias) {
$this->logger->debug("Found environment $environment->uuid matching $environmentAlias.");

return $environment;
}
}

throw new AcquiaCliException("Environment not found matching the alias {alias}", ['alias' => "$applicationAlias.$environmentAlias"]);
}




private function getApplicationFromAlias(string $applicationAlias): mixed
{
return self::getAliasCache()
->get($applicationAlias, function () use ($applicationAlias) {
return $this->doGetApplicationFromAlias($applicationAlias);
});
}




public static function getAliasCache(): AliasCache
{
return new AliasCache('acli_aliases');
}




private function doGetApplicationFromAlias(string $applicationAlias): mixed
{
if (!strpos($applicationAlias, ':')) {
$applicationAlias = '*:' . $applicationAlias;
}
$acquiaCloudClient = $this->cloudApiClientService->getClient();

$acquiaCloudClient->addQuery('filter', 'hosting=@' . $applicationAlias);


$accountResource = new Account($acquiaCloudClient);
$account = $accountResource->get();
if ($account->flags->support) {
$acquiaCloudClient->addQuery('all', 'true');
}
$applicationsResource = new Applications($acquiaCloudClient);
$customerApplications = $applicationsResource->getAll();
if (count($customerApplications) === 0) {
throw new AcquiaCliException("No applications match the alias {applicationAlias}", ['applicationAlias' => $applicationAlias]);
}
if (count($customerApplications) > 1) {
$callback = static function (mixed $element) {
return $element->hosting->id;
};
$aliases = array_map($callback, (array) $customerApplications);
$this->io->error(sprintf("Use a unique application alias: %s", implode(', ', $aliases)));
throw new AcquiaCliException("Multiple applications match the alias {applicationAlias}", ['applicationAlias' => $applicationAlias]);
}

$customerApplication = $customerApplications[0];

$this->logger->debug("Found application $customerApplication->uuid matching alias $applicationAlias.");

return $customerApplication;
}




protected function requireCloudIdeEnvironment(): void
{
if (!self::isAcquiaCloudIde() || !self::getThisCloudIdeUuid()) {
throw new AcquiaCliException('This command can only be run inside of an Acquia Cloud IDE');
}
}





protected function findIdeSshKeyOnCloud(string $ideLabel, string $ideUuid): ?stdClass
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$cloudKeys = $acquiaCloudClient->request('get', '/account/ssh-keys');
$sshKeyLabel = SshKeyCommandBase::getIdeSshKeyLabel($ideLabel, $ideUuid);
foreach ($cloudKeys as $cloudKey) {
if ($cloudKey->label === $sshKeyLabel) {
return $cloudKey;
}
}
return null;
}




public function checkForNewVersion(): bool|string
{

if (!isset($this->input)) {
return false;
}

if (
str_contains($this->input->getArgument('command'), 'api:')
|| str_contains($this->input->getArgument('command'), 'acsf:')
) {
return false;
}

if (AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
return false;
}
if ($this->getApplication()->getVersion() === 'dev-unknown') {
return false;
}
try {
if (!$this->selfUpdateManager->isUpToDate()) {
return $this->selfUpdateManager->getLatestReleaseFromGithub()['tag_name'];
}
} catch (Exception) {
$this->logger->debug("Could not determine if Acquia CLI has a new version available.");
}
return false;
}




protected function fillMissingRequiredApplicationUuid(InputInterface $input, OutputInterface $output): void
{
if (
$input->hasArgument('applicationUuid') && !$input->getArgument('applicationUuid') && $this->getDefinition()
->getArgument('applicationUuid')
->isRequired()
) {
$output->writeln('Inferring Cloud Application UUID for this command since none was provided...', OutputInterface::VERBOSITY_VERBOSE);
if ($applicationUuid = $this->determineCloudApplication()) {
$output->writeln("Set application uuid to <options=bold>$applicationUuid</>", OutputInterface::VERBOSITY_VERBOSE);
$input->setArgument('applicationUuid', $applicationUuid);
}
}
}




private function convertUserAliasToUuid(InputInterface $input, string $userUuidArgument, string $orgUuidArgument): void
{
if (
$input->hasArgument($userUuidArgument)
&& $input->getArgument($userUuidArgument)
&& $input->hasArgument($orgUuidArgument)
&& $input->getArgument($orgUuidArgument)
) {
$userUuID = $input->getArgument($userUuidArgument);
$orgUuid = $input->getArgument($orgUuidArgument);
$userUuid = $this->validateUserUuid($userUuID, $orgUuid);
$input->setArgument($userUuidArgument, $userUuid);
}
}







private function validateUserUuid(string $userUuidArgument, string $orgUuidArgument): string
{
try {
self::validateUuid($userUuidArgument);
} catch (ValidatorException) {

return $this->getUserUuidFromUserAlias($userUuidArgument, $orgUuidArgument);
}

return $userUuidArgument;
}




private static function getNotificationUuid(string $notification): string
{

try {
self::validateUuid($notification);
return $notification;
} catch (ValidatorException) {
}


try {
$json = json_decode($notification, null, 4, JSON_THROW_ON_ERROR);
if (is_object($json)) {
return self::getNotificationUuidFromResponse($json);
}
if (is_string($json)) {

self::validateUuid($json);
return $json;
}
} catch (JsonException | AcquiaCliException | ValidatorException) {
}


try {
return self::getNotificationUuidFromUrl($notification);
} catch (ValidatorException | AcquiaCliException) {
}


throw new AcquiaCliException('Notification format is not one of UUID, JSON response, or URL');
}







private function getUserUuidFromUserAlias(string $userAlias, string $orgUuidArgument): string
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$organizationResource = new Organizations($acquiaCloudClient);
$orgMembers = $organizationResource->getMembers($orgUuidArgument);


if (count($orgMembers) === 0) {
throw new AcquiaCliException('Organization has no members');
}

foreach ($orgMembers as $member) {

if ($member->mail === $userAlias) {
return $member->uuid;
}
}

throw new AcquiaCliException('No matching user found in this organization');
}

protected function convertApplicationAliasToUuid(InputInterface $input): void
{
if ($input->hasArgument('applicationUuid') && $input->getArgument('applicationUuid')) {
$applicationUuidArgument = $input->getArgument('applicationUuid');
$applicationUuid = $this->validateApplicationUuid($applicationUuidArgument);
$input->setArgument('applicationUuid', $applicationUuid);
}
}





protected function convertEnvironmentAliasToUuid(InputInterface $input, string $argumentName): void
{
if ($input->hasArgument($argumentName) && $input->getArgument($argumentName)) {
$envUuidArgument = $input->getArgument($argumentName);
$environmentUuid = $this->validateEnvironmentUuid($envUuidArgument, $argumentName);
$input->setArgument($argumentName, $environmentUuid);
}
}




protected function convertNotificationToUuid(InputInterface $input, string $argumentName): void
{
if ($input->hasArgument($argumentName) && $input->getArgument($argumentName)) {
$notificationArgument = $input->getArgument($argumentName);
$notificationUuid = self::getNotificationUuid($notificationArgument);
$input->setArgument($argumentName, $notificationUuid);
}
}

public static function getSitegroup(EnvironmentResponse $environment): string
{
$sshUrlParts = explode('.', $environment->sshUrl);
return reset($sshUrlParts);
}

public static function getEnvironmentAlias(EnvironmentResponse $environment): string
{
$sshUrlParts = explode('@', $environment->sshUrl);
return reset($sshUrlParts);
}

protected function isAcsfEnv(mixed $cloudEnvironment): bool
{
if ($cloudEnvironment->sshUrl !== null && str_contains($cloudEnvironment->sshUrl, 'enterprise-g1')) {
return true;
}
foreach ($cloudEnvironment->domains as $domain) {
if (str_contains($domain, 'acsitefactory')) {
return true;
}
}

return false;
}





private function getAcsfSites(EnvironmentResponse $cloudEnvironment): array
{
$envAlias = self::getEnvironmentAlias($cloudEnvironment);
$command = ['cat', "/var/www/site-php/$envAlias/multisite-config.json"];
$process = $this->sshHelper->executeCommand($cloudEnvironment->sshUrl, $command, false);
if ($process->isSuccessful()) {
return json_decode($process->getOutput(), true, 512, JSON_THROW_ON_ERROR);
}
throw new AcquiaCliException("Could not get ACSF sites");
}





private function getCloudSites(EnvironmentResponse $cloudEnvironment): array
{
$sitegroup = self::getSitegroup($cloudEnvironment);
$command = [
'ls',
$this->getCloudSitesPath($cloudEnvironment, $sitegroup),
];
$process = $this->sshHelper->executeCommand($cloudEnvironment->sshUrl, $command, false);
$sites = array_filter(explode("\n", trim($process->getOutput())));
if ($sites && $process->isSuccessful()) {
if ($key = array_search('default', $sites, true)) {
unset($sites[$key]);
array_unshift($sites, 'default');
}
return $sites;
}

throw new AcquiaCliException("Could not get Cloud sites for " . $cloudEnvironment->name);
}

private function getCloudSitesPath(mixed $cloudEnvironment, mixed $sitegroup): string
{
if ($cloudEnvironment->platform === 'cloud-next') {
$path = "/home/clouduser/$cloudEnvironment->name/sites";
} elseif ($cloudEnvironment->platform === 'MEO') {
$path = "/mnt/files/$cloudEnvironment->name/sites";
} else {
$path = "/mnt/files/$sitegroup.$cloudEnvironment->name/sites";
}
return $path;
}





private function promptChooseAcsfSite(EnvironmentResponse $cloudEnvironment): mixed
{
$choices = [];
$acsfSites = $this->getAcsfSites($cloudEnvironment);
foreach ($acsfSites['sites'] as $domain => $acsfSite) {
$choices[] = "{$acsfSite['name']} ($domain)";
}
if (!count($choices)) {
throw new AcquiaCliException('No sites found in this environment');
}
$choice = $this->io->choice('Choose a site', $choices, $choices[0]);
$key = array_search($choice, $choices, true);
$sites = array_values($acsfSites['sites']);
$site = $sites[$key];

return $site['name'];
}




protected function promptChooseCloudSite(EnvironmentResponse $cloudEnvironment): mixed
{
$sites = $this->getCloudSites($cloudEnvironment);
if (count($sites) === 1) {
$site = reset($sites);
$this->logger->debug("Only a single Cloud site was detected. Assuming site is $site");
return $site;
}
$this->logger->debug("Multisite detected");
$this->warnMultisite();
return $this->io->choice('Choose a site', $sites, $sites[0]);
}

protected static function isLandoEnv(): bool
{
return AcquiaDrupalEnvironmentDetector::isLandoEnv();
}

protected function reAuthenticate(string $apiKey, string $apiSecret, ?string $baseUri, ?string $accountsUri): void
{



$this->cloudApiClientService->setConnector(new Connector([
'key' => $apiKey,
'secret' => $apiSecret,
], $baseUri, $accountsUri));
}

private function warnMultisite(): void
{
$this->io->note("This is a multisite application. Drupal will load the default site unless you've configured sites.php for this environment: https://docs.acquia.com/cloud-platform/develop/drupal/multisite/");
}




protected function setDirAndRequireProjectCwd(InputInterface $input): void
{
$this->determineDir($input);
if ($this->dir !== '/home/ide/project' && AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
throw new AcquiaCliException('Run this command from the {dir} directory', ['dir' => '/home/ide/project']);
}
}

protected function determineDir(InputInterface $input): void
{
if (isset($this->dir)) {
return;
}

if ($input->hasOption('dir') && $dir = $input->getOption('dir')) {
$this->dir = $dir;
} elseif ($this->projectDir) {
$this->dir = $this->projectDir;
} else {
$this->dir = getcwd();
}
}

protected function getOutputCallback(OutputInterface $output, Checklist $checklist): Closure
{
return static function (mixed $type, mixed $buffer) use ($checklist, $output): void {
if (!$output->isVerbose() && $checklist->getItems()) {
$checklist->updateProgressBar($buffer);
}
$output->writeln($buffer, OutputInterface::VERBOSITY_VERY_VERBOSE);
};
}




protected function executeAllScripts(Closure $outputCallback, Checklist $checklist): void
{
$this->runComposerScripts($outputCallback, $checklist);
$this->runDrushCacheClear($outputCallback, $checklist);
$this->runDrushSqlSanitize($outputCallback, $checklist);
}




protected function runComposerScripts(callable $outputCallback, Checklist $checklist): void
{
if (!file_exists(Path::join($this->dir, 'composer.json'))) {
$this->io->note('composer.json file not found. Skipping composer install.');
return;
}
if (!$this->localMachineHelper->commandExists('composer')) {
$this->io->note('Composer not found. Skipping composer install.');
return;
}
if (file_exists(Path::join($this->dir, 'vendor'))) {
$this->io->note('Composer dependencies already installed. Skipping composer install.');
return;
}
$checklist->addItem("Installing Composer dependencies");
$this->composerInstall($outputCallback);
$checklist->completePreviousItem();
}




protected function runDrushCacheClear(Closure $outputCallback, Checklist $checklist): void
{
if ($this->getDrushDatabaseConnectionStatus()) {
$checklist->addItem('Clearing Drupal caches via Drush');

$process = $this->localMachineHelper->execute([
'drush',
'cache:rebuild',
'--yes',
'--no-interaction',
'--verbose',
], $outputCallback, $this->dir, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to rebuild Drupal caches via Drush. {message}', ['message' => $process->getErrorOutput()]);
}
$checklist->completePreviousItem();
} else {
$this->logger->notice('Drush does not have an active database connection. Skipping cache:rebuild');
}
}




protected function runDrushSqlSanitize(Closure $outputCallback, Checklist $checklist): void
{
if ($this->getDrushDatabaseConnectionStatus()) {
$checklist->addItem('Sanitizing database via Drush');
$process = $this->localMachineHelper->execute([
'drush',
'sql:sanitize',
'--yes',
'--no-interaction',
'--verbose',
], $outputCallback, $this->dir, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to sanitize Drupal database via Drush. {message}', ['message' => $process->getErrorOutput()]);
}
$checklist->completePreviousItem();
$this->io->newLine();
$this->io->text('Your database was sanitized via <options=bold>drush sql:sanitize</>. This has changed all user passwords to randomly generated strings. To log in to your Drupal site, use <options=bold>drush uli</>');
} else {
$this->logger->notice('Drush does not have an active database connection. Skipping sql:sanitize.');
}
}




private function composerInstall(?callable $outputCallback): void
{
$process = $this->localMachineHelper->execute([
'composer',
'install',
'--no-interaction',
], $outputCallback, $this->dir, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException(
'Unable to install Drupal dependencies via Composer. {message}',
['message' => $process->getErrorOutput()]
);
}
}

protected function getDrushDatabaseConnectionStatus(?Closure $outputCallback = null): bool
{
if (isset($this->drushHasActiveDatabaseConnection)) {
return $this->drushHasActiveDatabaseConnection;
}
if ($this->localMachineHelper->commandExists('drush')) {
$process = $this->localMachineHelper->execute([
'drush',
'status',
'--fields=db-status,drush-version',
'--format=json',
'--no-interaction',
], $outputCallback, $this->dir, false);
if ($process->isSuccessful()) {
$drushStatusReturnOutput = json_decode($process->getOutput(), true);
if (is_array($drushStatusReturnOutput) && array_key_exists('db-status', $drushStatusReturnOutput) && $drushStatusReturnOutput['db-status'] === 'Connected') {
$this->drushHasActiveDatabaseConnection = true;
return $this->drushHasActiveDatabaseConnection;
}
}
}

$this->drushHasActiveDatabaseConnection = false;

return $this->drushHasActiveDatabaseConnection;
}




protected function createMySqlDumpOnLocal(string $dbHost, string $dbUser, string $dbName, string $dbPassword, ?Closure $outputCallback = null): string
{
$this->localMachineHelper->checkRequiredBinariesExist([
'mysqldump',
'gzip',
]);
$filename = "acli-mysql-dump-$dbName.sql.gz";
$localTempDir = sys_get_temp_dir();
$localFilepath = $localTempDir . '/' . $filename;
$this->logger->debug("Dumping MySQL database to $localFilepath on this machine");
$this->localMachineHelper->checkRequiredBinariesExist([
'mysqldump',
'gzip',
]);
if ($outputCallback) {
$outputCallback('out', "Dumping MySQL database to $localFilepath on this machine");
}
if ($this->localMachineHelper->commandExists('pv')) {
$command = 'bash -c "set -o pipefail; MYSQL_PWD="${:MYSQL_PASSWORD}" mysqldump --host="${:MYSQL_HOST}" --user="${:MYSQL_USER}" "${:MYSQL_DATABASE}" | pv --rate --bytes | gzip -9 > "${:LOCAL_FILEPATH}""';
} else {
$this->io->warning('Install `pv` to see progress bar');
$command = 'bash -c "set -o pipefail; MYSQL_PWD="${:MYSQL_PASSWORD}" mysqldump --host="${:MYSQL_HOST}" --user="${:MYSQL_USER}" "${:MYSQL_DATABASE}" | gzip -9 > "${:LOCAL_FILEPATH}""';
}

$env = [
'LOCAL_FILEPATH' => $localFilepath,
'MYSQL_DATABASE' => $dbName,
'MYSQL_HOST' => $dbHost,
'MYSQL_PASSWORD' => $dbPassword,
'MYSQL_USER' => $dbUser,
];
$process = $this->localMachineHelper->executeFromCmd($command, $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL), null, $env);
if (!$process->isSuccessful() || $process->getOutput()) {
throw new AcquiaCliException('Unable to create a dump of the local database. {message}', ['message' => $process->getErrorOutput()]);
}

return $localFilepath;
}

/**
@infection-ignore-all */
protected function promptOpenBrowserToCreateToken(
InputInterface $input
): void {
if (!$input->getOption('key') || !$input->getOption('secret')) {
$tokenUrl = 'https://cloud.acquia.com/a/profile/tokens';
$this->output->writeln("You will need a Cloud Platform API token from <href=$tokenUrl>$tokenUrl</>");

if (!AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && $this->io->confirm('Do you want to open this page to generate a token now?')) {
$this->localMachineHelper->startBrowser($tokenUrl);
}
}
}




protected function determineApiKey(): string
{
return $this->determineOption('key', false, $this->validateApiKey(...));
}

protected static function validateApiKey(mixed $key): string
{
$violations = Validation::createValidator()->validate($key, [
new Length(['min' => 10]),
new NotBlank(),
new Regex([
'message' => 'The value may not contain spaces',
'pattern' => '/^\S*$/',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
return $key;
}

protected static function validateUrl(?string $url): string
{
$violations = Validation::createValidator()->validate($url, [
new NotBlank(),
new Url(),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
return $url;
}




protected function determineApiSecret(): string
{
return $this->determineOption('secret', true, $this->validateApiKey(...));
}









protected function determineOption(string $optionName, bool $hidden = false, ?Closure $validator = null, ?Closure $normalizer = null, string|bool|null $default = null): string|int|bool|null
{
if ($optionValue = $this->input->getOption($optionName)) {
if (isset($normalizer)) {
$optionValue = $normalizer($optionValue);
}
if (isset($validator)) {
$validator($optionValue);
}
return $optionValue;
}
$option = $this->getDefinition()->getOption($optionName);
if ($option->isNegatable() && $this->input->getOption("no-$optionName")) {
return false;
}
$optionShortcut = $option->getShortcut();
$description = lcfirst($option->getDescription());
if ($optionShortcut) {
$optionString = "option <options=bold>-$optionShortcut</>, <options=bold>--$optionName</>";
} else {
$optionString = "option <options=bold>--$optionName</>";
}
if ($option->acceptValue()) {
$message = "Enter $description ($optionString)";
} else {
$message = "Do you want to $description ($optionString)?";
}
$optional = $option->isValueOptional();
$message .= $optional ? ' (optional)' : '';
$message .= $hidden ? ' (input will be hidden)' : '';
if ($option->acceptValue()) {
$question = new Question($message, $default);
} else {
$question = new ConfirmationQuestion($message, $default);
}
$question->setHidden($this->localMachineHelper->useTty() && $hidden);
$question->setHiddenFallback($hidden);
if (isset($normalizer)) {
$question->setNormalizer($normalizer);
}
if (isset($validator)) {
$question->setValidator($validator);
}
$optionValue = $this->io->askQuestion($question);

if (!$optional && is_null($optionValue)) {
throw new AcquiaCliException($message);
}
return $optionValue;
}





private function getAnyAhEnvironment(string $cloudAppUuid, callable $filter): EnvironmentResponse|false
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environmentResource = new Environments($acquiaCloudClient);

$applicationEnvironments = iterator_to_array($environmentResource->getAll($cloudAppUuid));
$candidates = array_filter($applicationEnvironments, $filter);
return reset($candidates);
}




protected function getAnyNonProdAhEnvironment(string $cloudAppUuid): EnvironmentResponse|false
{
return $this->getAnyAhEnvironment($cloudAppUuid, function (EnvironmentResponse $environment) {
return !$environment->flags->production && $environment->type === 'drupal';
});
}




protected function getAnyProdAhEnvironment(string $cloudAppUuid): EnvironmentResponse|false
{
return $this->getAnyAhEnvironment($cloudAppUuid, function (EnvironmentResponse $environment) {
return $environment->flags->production && $environment->type === 'drupal';
});
}
protected function determineVcsUrl(InputInterface $input, OutputInterface $output, string $applicationUuid): array|false
{
if ($input->hasOption('siteInstanceId') && $input->getOption('siteInstanceId')) {
$siteInstance = $this->determineSiteInstance($input);
$vcsUrl = $siteInstance->environment->codebase->vcs_url ?? $this->getAnyVcsUrl($applicationUuid);
return [$vcsUrl];
} elseif ($vcsUrl = $this->getAnyVcsUrl($applicationUuid)) {
return [$vcsUrl];
}
$output->writeln('No VCS URL found for this application. Please provide one with the --vcs-url option.');
return false;
}



protected function getAnyVcsUrl(string $cloudAppUuid): string|false
{
$environment = $this->getAnyAhEnvironment($cloudAppUuid, function (): bool {
return true;
});
return $environment ? $environment->vcs->url : false;
}

protected function validateApplicationUuid(string $applicationUuidArgument): mixed
{
try {
self::validateUuid($applicationUuidArgument);
} catch (ValidatorException) {

$alias = $this->normalizeAlias($applicationUuidArgument);
return $this->getApplicationFromAlias($alias)->uuid;
}
return $applicationUuidArgument;
}





protected function validateEnvironmentUuid(mixed $envUuidArgument, mixed $argumentName): string
{
if (is_null($envUuidArgument)) {
throw new AcquiaCliException("{{$argumentName}} must not be null");
}

try {
return self::validateUuid($envUuidArgument);
} catch (ValidatorException) {
}

try {
return self::validateLegacyEnvironmentId($envUuidArgument);
} catch (ValidatorException) {
}

$alias = $envUuidArgument;
$alias = $this->normalizeAlias($alias);
$alias = self::validateEnvironmentAlias($alias);
return $this->getEnvironmentFromAliasArg($alias)->uuid;
}




protected function checkAuthentication(): void
{
if ((new ReflectionClass(static::class))->getAttributes(RequireAuth::class) && !$this->cloudApiClientService->isMachineAuthenticated()) {
if ($this->cloudApiClientService instanceof AcsfClientService) {
throw new AcquiaCliException('This machine is not yet authenticated with Site Factory.');
}
throw new AcquiaCliException('This machine is not yet authenticated with the Cloud Platform.');
}
}

protected function waitForNotificationToComplete(Client $acquiaCloudClient, string $uuid, string $message, ?callable $success = null): bool
{
$notificationsResource = new Notifications($acquiaCloudClient);
$notification = null;
$checkNotificationStatus = static function () use ($notificationsResource, &$notification, $uuid): bool {
$notification = $notificationsResource->get($uuid);

return $notification->status !== 'in-progress';
};
if ($success === null) {
$success = function () use (&$notification): void {
$this->writeCompletedMessage($notification);
};
}
LoopHelper::getLoopy($this->output, $this->io, $message, $checkNotificationStatus, $success);
return $notification->status === 'completed';
}




private function writeCompletedMessage(NotificationResponse $notification): void
{
if ($notification->status === 'completed') {
$this->io->success("The task with notification uuid $notification->uuid completed");
} elseif ($notification->status === 'failed') {
$this->io->error("The task with notification uuid $notification->uuid failed");
} else {
throw new AcquiaCliException("Unknown task status: $notification->status");
}
$duration = strtotime($notification->completed_at) - strtotime($notification->created_at);
$completedAt = date("D M j G:i:s T Y", strtotime($notification->completed_at));
$this->io->writeln("Progress: $notification->progress");
$this->io->writeln("Completed: $completedAt");
$this->io->writeln("Task type: $notification->label");
$this->io->writeln("Duration: $duration seconds");
}




protected static function getNotificationUuidFromResponse(object $response): string
{
if (property_exists($response, 'links')) {
$links = $response->links;
} elseif (property_exists($response, '_links')) {
$links = $response->_links;
} else {
throw new AcquiaCliException('JSON object must contain the _links.notification.href property');
}
if (property_exists($links, 'notification') && property_exists($links->notification, 'href')) {
return self::getNotificationUuidFromUrl($links->notification->href);
}
throw new AcquiaCliException('JSON object must contain the _links.notification.href property');
}




private static function getNotificationUuidFromUrl(string $notificationUrl): string
{
$notificationUrlPattern = '/^https:\/\/cloud.acquia.com\/api\/notifications\/([\w-]*)$/';
if (preg_match($notificationUrlPattern, $notificationUrl, $matches)) {
self::validateUuid($matches[1]);
return $matches[1];
}
throw new AcquiaCliException('Notification UUID not found in URL');
}





protected function validateRequiredCloudPermissions(Client $acquiaCloudClient, ?string $cloudApplicationUuid, AccountResponse $account, array $requiredPermissions): void
{
$permissions = $acquiaCloudClient->request('get', "/applications/$cloudApplicationUuid/permissions");
$keyedPermissions = [];
foreach ($permissions as $permission) {
$keyedPermissions[$permission->name] = $permission;
}
foreach ($requiredPermissions as $name) {
if (!array_key_exists($name, $keyedPermissions)) {
throw new AcquiaCliException("The Acquia Cloud Platform account {account} does not have the required '{name}' permission. Add the permissions to this user or use an API Token belonging to a different Acquia Cloud Platform user.", [
'account' => $account->mail,
'name' => $name,
]);
}
}
}

protected function validatePhpVersion(string $version): string
{
$violations = Validation::createValidator()->validate($version, [
new Length(['min' => 3]),
new NotBlank(),
new Regex([
'message' => 'The value may not contain spaces',
'pattern' => '/^\S*$/',
]),
new Regex([
'message' => 'The value must be in the format "x.y"',
'pattern' => '/[0-9]{1}\.[0-9]{1}/',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}

return $version;
}





protected function promptChooseDrupalSite(EnvironmentResponse $environment): string
{
if ($this->isAcsfEnv($environment)) {
return $this->promptChooseAcsfSite($environment);
}

return $this->promptChooseCloudSite($environment);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Acsf;

use Acquia\Cli\AcsfApi\AcsfClientService;
use Acquia\Cli\AcsfApi\AcsfCredentials;
use Acquia\Cli\Command\Api\ApiBaseCommand;
use Acquia\Cli\CommandFactoryInterface;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use Psr\Log\LoggerInterface;
use SelfUpdate\SelfUpdateManager;

class AcsfCommandFactory implements CommandFactoryInterface
{
public function __construct(
private LocalMachineHelper $localMachineHelper,
private CloudDataStore $datastoreCloud,
private AcquiaCliDatastore $datastoreAcli,
private AcsfCredentials $cloudCredentials,
private TelemetryHelper $telemetryHelper,
private string $projectDir,
private AcsfClientService $cloudApiClientService,
private SshHelper $sshHelper,
private string $sshDir,
private LoggerInterface $logger,
private SelfUpdateManager $selfUpdateManager,
) {
}

public function createCommand(): ApiBaseCommand
{
return new ApiBaseCommand(
$this->localMachineHelper,
$this->datastoreCloud,
$this->datastoreAcli,
$this->cloudCredentials,
$this->telemetryHelper,
$this->projectDir,
$this->cloudApiClientService,
$this->sshHelper,
$this->sshDir,
$this->logger,
$this->selfUpdateManager,
);
}

public function createListCommand(): AcsfListCommand
{
return new AcsfListCommand(
$this->localMachineHelper,
$this->datastoreCloud,
$this->datastoreAcli,
$this->cloudCredentials,
$this->telemetryHelper,
$this->projectDir,
$this->cloudApiClientService,
$this->sshHelper,
$this->sshDir,
$this->logger,
$this->selfUpdateManager,
);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Acsf;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class AcsfListCommandBase extends CommandBase
{
protected string $namespace;

public function setNamespace(string $namespace): void
{
$this->namespace = $namespace;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$command = $this->getApplication()->find('list');
$arguments = [
'command' => 'list',
'namespace' => 'acsf',
];
$listInput = new ArrayInput($arguments);

return $command->run($listInput, $output);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Acsf;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;

#[RequireAuth]
#[AsCommand(name: 'acsf:list', description: 'List all Acquia Cloud Site Factory commands', aliases: ['acsf'])]
final class AcsfListCommand extends AcsfListCommandBase
{
protected string $namespace = 'acsf';
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Remote;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;




#[RequireAuth]
#[AsCommand(name: 'remote:drush', description: 'Run a Drush command remotely on a Cloud Platform environment', aliases: [
'drush',
'dr',
])]
final class DrushCommand extends SshBaseCommand
{
protected function configure(): void
{
$this
->setHelp('<fg=black;bg=cyan>Pay close attention to the argument syntax! Note the usage of <options=bold;bg=cyan>--</> to separate the drush command arguments and options.</>')
->acceptEnvironmentId()
->addArgument('drush_command', InputArgument::IS_ARRAY, 'Drush command')
->addUsage('<app>.<env> -- <command>')
->addUsage('myapp.dev -- uli 1')
->addUsage('myapp.dev -- status --fields=db-status');
}




protected function execute(InputInterface $input, OutputInterface $output): ?int
{
$environment = $this->determineEnvironment($input, $output, true);
$alias = self::getEnvironmentAlias($environment);
$acliArguments = $input->getArguments();
$drushArguments = (array) $acliArguments['drush_command'];

if (!empty($environment->default_domain)) {

array_unshift($drushArguments, "--uri=http://$environment->default_domain");
}
$drushCommandArguments = [
"cd /var/www/html/$alias/docroot; ",
'drush',
implode(' ', $drushArguments),
];

return $this->sshHelper->executeCommand($environment->sshUrl, $drushCommandArguments)
->getExitCode();
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Remote;

use Acquia\Cli\Command\CommandBase;




abstract class SshBaseCommand extends CommandBase
{
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Remote;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use AcquiaCloudApi\Endpoints\Applications;
use AcquiaCloudApi\Endpoints\Environments;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'remote:aliases:list', description: 'List all aliases for the Cloud Platform environments', aliases: [
'aliases',
'sa',
])]
final class AliasListCommand extends CommandBase
{
protected function configure(): void
{
$this->acceptApplicationUuid();
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$applicationsResource = new Applications($acquiaCloudClient);
$cloudApplicationUuid = $this->determineCloudApplication();
$customerApplication = $applicationsResource->get($cloudApplicationUuid);
$environmentsResource = new Environments($acquiaCloudClient);

$table = new Table($this->output);
$table->setHeaderTitle('Environments for ' . $customerApplication->name);
$table->setHeaders([
'Alias',
'UUID',
'SSH URL',
]);

$siteId = $customerApplication->hosting->id;
$parts = explode(':', $siteId);
$sitePrefix = $parts[1];
$environments = $environmentsResource->getAll($customerApplication->uuid);

foreach ($environments as $environment) {
$alias = $sitePrefix . '.' . $environment->name;
$table->addRow([
$alias,
$environment->uuid,
$environment->sshUrl,
]);
}

$table->render();

$output->writeln('<info>Run <options=bold>acli api:environments:find <alias></> to get more information about a specific environment.</info>');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Remote;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\Account;
use PharData;
use Psr\Http\Message\StreamInterface;
use RecursiveIteratorIterator;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;




#[RequireAuth]
#[AsCommand(name: 'remote:aliases:download', description: 'Download Drush aliases for the Cloud Platform')]
final class AliasesDownloadCommand extends SshBaseCommand
{
private string $drushArchiveFilepath;

protected function configure(): void
{
$this
->addOption('destination-dir', null, InputOption::VALUE_REQUIRED, 'The directory to which aliases will be downloaded')
->addOption('all', null, InputOption::VALUE_NONE, 'Download the aliases for all applications that you have access to, not just the current one.');
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$aliasVersion = $this->promptChooseDrushAliasVersion();
$drushArchiveTempFilepath = $this->getDrushArchiveTempFilepath();
$drushAliasesDir = $this->getDrushAliasesDir($aliasVersion);
$this->localMachineHelper->getFilesystem()->mkdir($drushAliasesDir);
$this->localMachineHelper->getFilesystem()
->chmod($drushAliasesDir, 0700);

if ($aliasVersion === '9') {
$this->downloadDrush9Aliases($input, $aliasVersion, $drushArchiveTempFilepath, $drushAliasesDir);
} else {
$this->downloadDrush8Aliases($aliasVersion, $drushArchiveTempFilepath, $drushAliasesDir);
}

$this->output->writeln(sprintf(
'Cloud Platform Drush aliases installed into <options=bold>%s</>',
$drushAliasesDir
));
unlink($drushArchiveTempFilepath);

return Command::SUCCESS;
}




protected function promptChooseDrushAliasVersion(): string
{
$this->io->writeln('Drush changed how aliases are defined in Drush 9. Drush 8 aliases are PHP-based and stored in your home directory, while Drush 9+ aliases are YAML-based and stored with your project.');
$question = 'Choose your preferred alias compatibility:';
$choices = [
'8' => 'Drush 8 / Drupal 7 (PHP)',
'9' => 'Drush 9+ / Drupal 8+ (YAML)',
];
return (string) array_search($this->io->choice($question, $choices, '9'), $choices, true);
}

public function getDrushArchiveTempFilepath(): string
{
if (!isset($this->drushArchiveFilepath)) {
$this->drushArchiveFilepath = tempnam(
sys_get_temp_dir(),
'AcquiaDrushAliases'
) . '.tar.gz';
}

return $this->drushArchiveFilepath;
}

protected function getDrushAliasesDir(string $version): string
{
if ($this->input->getOption('destination-dir')) {
return $this->input->getOption('destination-dir');
}
return match ($version) {
'8' => Path::join($this->localMachineHelper::getHomeDir(), '.drush'),
'9' => Path::join($this->getProjectDir(), 'drush'),
default => throw new AcquiaCliException("Unknown Drush version"),
};
}

protected function getAliasesFromCloud(Client $acquiaCloudClient, string $aliasVersion): StreamInterface
{
$acquiaCloudClient->addQuery('version', $aliasVersion);
return (new Account($acquiaCloudClient))->getDrushAliases();
}

protected function getSitePrefix(bool $singleApplication): string
{
$sitePrefix = '';
if ($singleApplication) {
$cloudApplicationUuid = $this->determineCloudApplication();
$cloudApplication = $this->getCloudApplication($cloudApplicationUuid);
$parts = explode(':', $cloudApplication->hosting->id);
$sitePrefix = $parts[1];
}
return $sitePrefix;
}

protected function downloadArchive(string $aliasVersion, string $drushArchiveTempFilepath, string $baseDir): PharData
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$aliases = $this->getAliasesFromCloud($acquiaCloudClient, $aliasVersion);
$this->localMachineHelper->writeFile($drushArchiveTempFilepath, $aliases);
return new PharData($drushArchiveTempFilepath . '/' . $baseDir);
}

protected function downloadDrush9Aliases(InputInterface $input, string $aliasVersion, string $drushArchiveTempFilepath, string $drushAliasesDir): void
{
$this->setDirAndRequireProjectCwd($input);
$all = $input->getOption('all');
$applicationUuidArgument = $input->getArgument('applicationUuid');
$singleApplication = !$all || $applicationUuidArgument;
$sitePrefix = $this->getSitePrefix($singleApplication);
$baseDir = 'sites';
$archive = $this->downloadArchive($aliasVersion, $drushArchiveTempFilepath, $baseDir);
if ($singleApplication) {
$drushFiles = $this->getSingleAliasForSite($archive, $sitePrefix, $baseDir);
} else {
$drushFiles = [];
foreach (new RecursiveIteratorIterator($archive, RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
$drushFiles[] = $baseDir . '/' . $file->getFileName();
}
}
try {

@$archive->extractTo($drushAliasesDir, $drushFiles, true);
} catch (\Exception) {
throw new AcquiaCliException('Could not extract aliases to {destination}', ['destination' => $drushAliasesDir]);
}
}

protected function downloadDrush8Aliases(string $aliasVersion, string $drushArchiveTempFilepath, string $drushAliasesDir): void
{
$baseDir = '.drush';
$archive = $this->downloadArchive($aliasVersion, $drushArchiveTempFilepath, $baseDir);
$drushFiles = [];
foreach (new RecursiveIteratorIterator($archive, RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
$drushFiles[] = $baseDir . '/' . $file->getFileName();
}
$archive->extractTo($drushAliasesDir, $drushFiles, true);
}




protected function getSingleAliasForSite(PharData $archive, string $sitePrefix, string $baseDir): array
{
$drushFiles = [];
foreach (new RecursiveIteratorIterator($archive, RecursiveIteratorIterator::LEAVES_ONLY) as $file) {

if ($file->getFileName() === $sitePrefix . '.site.yml') {
$drushFiles[] = $baseDir . '/' . $file->getFileName();
break;
}
}
if (empty($drushFiles)) {
throw new AcquiaCliException("Could not locate any aliases matching the current site ($sitePrefix)");
}
return $drushFiles;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Remote;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;




#[RequireAuth]
#[AsCommand(name: 'remote:ssh', description: 'Use SSH to open a shell or run a command in a Cloud Platform environment', aliases: ['ssh'])]
final class SshCommand extends SshBaseCommand
{
protected function configure(): void
{
$this
->addArgument('alias', InputArgument::REQUIRED, 'Alias for application & environment in the format `app-name.env`')
->addArgument('ssh_command', InputArgument::IS_ARRAY, 'Command to run via SSH (if not provided, opens a shell in the site directory)')
->addUsage("myapp.dev # open a shell in the myapp.dev environment")
->addUsage("myapp.dev -- ls -al # list files in the myapp.dev environment and return");
}

protected function execute(InputInterface $input, OutputInterface $output): ?int
{
$alias = $input->getArgument('alias');
$alias = $this->normalizeAlias($alias);
$alias = self::validateEnvironmentAlias($alias);
$environment = $this->getEnvironmentFromAliasArg($alias);
if (!isset($environment->sshUrl)) {
throw new AcquiaCliException('Cannot determine environment SSH URL. Check that you have SSH permissions on this environment.');
}
$sshCommand = [
'cd /var/www/html/' . $alias,
];
$arguments = $input->getArguments();
if (empty($arguments['ssh_command'])) {
$sshCommand[] = 'exec $SHELL -l';
} else {
$sshCommand[] = implode(' ', $arguments['ssh_command']);
}
$sshCommand = (array) implode('; ', $sshCommand);
return $this->sshHelper->executeCommand($environment->sshUrl, $sshCommand)
->getExitCode();
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;

#[AsCommand(name: 'docs', description: 'Open Acquia product documentation in a web browser')]
final class DocsCommand extends CommandBase
{
protected function configure(): void
{
$this
->addArgument('product', InputArgument::OPTIONAL, 'Acquia Product Name')
->addUsage('acli');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaProducts = [
'Acquia CLI' => [
'alias' => ['cli', 'acli'],
'url' => 'acquia-cli',
],
'Acquia CMS' => [
'alias' => ['acquia_cms', 'acms'],
'url' => 'acquia-cms',
],
'Acquia DAM Classic' => [
'alias' => [
'dam',
'acquia_dam',
'dam_classic',
'acquiadam',
'damclassic',
],
'url' => 'dam',
],
'Acquia Migrate Accelerate' => [
'alias' => ['acquia-migrate-accelerate', 'ama'],
'url' => 'acquia-migrate-accelerate',
],
'BLT' => [
'alias' => ['blt'],
'url' => 'blt',
],
'Campaign Factory' => [
'alias' => [
'campaign-factory',
'campaign_factory',
'campaignfactory',
],
'url' => 'campaign-factory',
],
'Campaign Studio' => [
'alias' => ['campaign-studio', 'campaignstudio'],
'url' => 'campaign-studio',
],
'Cloud IDE' => [
'alias' => ['ide', 'cloud_ide', 'cloud-ide'],
'url' => 'ide',
],
'Cloud Platform' => [
'alias' => [
'cloud-platform',
'acquiacloud',
'acquia_cloud',
'acquia-cloud',
'cloud',
],
'url' => 'cloud-platform',
],
'Code Studio' => [
'alias' => ['code_studio', 'codestudio', 'cs'],
'url' => 'code-studio',
],
'Content Hub' => [
'alias' => ['contenthub', 'ch'],
'url' => 'contenthub',
],
'Customer Data Platform' => [
'alias' => ['customer-data-platform', 'cdp'],
'url' => 'customer-data-platform',
],
'Edge' => [
'alias' => ['edge', 'cloudedge'],
'url' => 'edge',
],
'Personalization' => [
'alias' => ['personalization'],
'url' => 'personalization',
],
'Search' => [
'alias' => ['search', 'acquia-search'],
'url' => 'acquia-search',
],
'Shield' => [
'alias' => ['shield'],
'url' => 'shield',
],
'Site Factory' => [
'alias' => ['site-factory', 'acsf'],
'url' => 'site-factory',
],
'Site Studio' => [
'alias' => ['site-studio', 'cohesion'],
'url' => 'site-studio',
],
];


if ($acquiaProductName = $input->getArgument('product')) {
$productUrl = null;
foreach ($acquiaProducts as $acquiaProduct) {

if (in_array(strtolower($acquiaProductName), $acquiaProduct['alias'], true)) {
$productUrl = $acquiaProduct['url'];
break;
}
}

if ($productUrl) {
$this->localMachineHelper->startBrowser('https://docs.acquia.com/' . $productUrl . '/');
return Command::SUCCESS;
}
}

$labels = array_keys($acquiaProducts);
$question = new ChoiceQuestion('Select the Acquia Product', $labels, $labels[0]);
$choiceId = $this->io->askQuestion($question);
$this->localMachineHelper->startBrowser('https://docs.acquia.com/' . $acquiaProducts[$choiceId]['url'] . '/');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'hello-world', description: 'Test command used for asserting core functionality', hidden: true)]
final class HelloWorldCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->io->success('Hello world!');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Auth;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'auth:logout', description: 'Remove Cloud Platform API credentials', aliases: ['logout'])]
final class AuthLogoutCommand extends CommandBase
{
protected function configure(): void
{
$this->addOption('delete', null, InputOption::VALUE_NEGATABLE, 'Delete the active Cloud Platform API credentials');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$keys = $this->datastoreCloud->get('keys');
$activeKey = $this->datastoreCloud->get('acli_key');
if (!$activeKey) {
throw new AcquiaCliException('There is no active Cloud Platform API key');
}
$activeKeyLabel = $keys[$activeKey]['label'];
$output->writeln("<info>The key <options=bold>$activeKeyLabel</> will be deactivated on this machine. However, the credentials will remain on disk and can be reactivated by running <options=bold>acli auth:login</> unless you also choose to delete them.</info>");
$delete = $this->determineOption('delete', false, null, null, false);
$this->datastoreCloud->remove('acli_key');
$action = 'deactivated';
if ($delete) {
$this->datastoreCloud->remove("keys.$activeKey");
$action = 'deleted';
}
$output->writeln("<info>The active Cloud Platform API credentials were $action</info>");
$output->writeln('<info>No Cloud Platform API key is active. Run <options=bold>acli auth:login</> to continue using the Cloud Platform API.</info>');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Auth;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'auth:acsf-login', description: 'Register Site Factory API credentials')]
final class AuthAcsfLoginCommand extends CommandBase
{
protected function configure(): void
{
$this
->addOption('username', 'u', InputOption::VALUE_REQUIRED, "Your Site Factory username")
->addOption('key', 'k', InputOption::VALUE_REQUIRED, "Your Site Factory key")
->addOption('factory-url', 'f', InputOption::VALUE_REQUIRED, "Your Site Factory URL (including https://)");
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
if ($input->getOption('factory-url')) {
$factoryUrl = $input->getOption('factory-url');
self::validateUrl($factoryUrl);
} elseif ($input->isInteractive() && $this->datastoreCloud->get('acsf_factories')) {
$factories = $this->datastoreCloud->get('acsf_factories');
$factoryChoices = $factories;
foreach ($factoryChoices as $url => $factoryChoice) {
$factoryChoices[$url]['url'] = $url;
}
$factoryChoices['add_new'] = [
'url' => 'Enter a new factory URL',
];
$factory = $this->promptChooseFromObjectsOrArrays($factoryChoices, 'url', 'url', 'Choose a Factory to login to');
if ($factory['url'] === 'Enter a new factory URL') {
$factoryUrl = $this->determineOption('factory-url', false, $this->validateUrl(...));
$factory = [
'url' => $factoryUrl,
'users' => [],
];
} else {
$factoryUrl = $factory['url'];
}

$users = $factory['users'];
$users['add_new'] = [
'username' => 'Enter a new user',
];
$selectedUser = $this->promptChooseFromObjectsOrArrays($users, 'username', 'username', 'Choose which user to login as');
if ($selectedUser['username'] !== 'Enter a new user') {
$this->datastoreCloud->set('acsf_active_factory', $factoryUrl);
$factories[$factoryUrl]['active_user'] = $selectedUser['username'];
$this->datastoreCloud->set('acsf_factories', $factories);
$output->writeln([
"<info>Acquia CLI is now logged in to <options=bold>{$factory['url']}</> as <options=bold>{$selectedUser['username']}</></info>",
]);
return Command::SUCCESS;
}
} else {
$factoryUrl = $this->determineOption('factory-url', false, $this->validateUrl(...));
}

$username = $this->determineOption('username');
$key = $this->determineOption('key', true, $this->validateApiKey(...));

$this->writeAcsfCredentialsToDisk($factoryUrl, $username, $key);
$output->writeln("<info>Saved credentials</info>");

return Command::SUCCESS;
}

private function writeAcsfCredentialsToDisk(?string $factoryUrl, string $username, string $key): void
{
$keys = $this->datastoreCloud->get('acsf_factories');
$keys[$factoryUrl]['users'][$username] = [
'key' => $key,
'username' => $username,
];
$keys[$factoryUrl]['url'] = $factoryUrl;
$keys[$factoryUrl]['active_user'] = $username;
$this->datastoreCloud->set('acsf_factories', $keys);
$this->datastoreCloud->set('acsf_active_factory', $factoryUrl);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Auth;

use Acquia\Cli\Command\CommandBase;
use AcquiaCloudApi\Endpoints\Account;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'auth:login', description: 'Register Cloud Platform API credentials', aliases: ['login'])]
final class AuthLoginCommand extends CommandBase
{
protected function configure(): void
{
$this
->addOption('key', 'k', InputOption::VALUE_REQUIRED, 'Your Cloud Platform API key')
->addOption('secret', 's', InputOption::VALUE_REQUIRED, 'Your Cloud Platform API secret')
->setHelp('Acquia CLI can store multiple sets of credentials in case you have multiple Cloud Platform accounts. However, only a single account can be active at a time. This command allows you to activate a new or existing set of credentials.');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$keys = $this->datastoreCloud->get('keys');
$activeKey = $this->datastoreCloud->get('acli_key');
if ($activeKey) {
$activeKeyLabel = $keys[$activeKey]['label'];
$output->writeln("The following Cloud Platform API key is active: <options=bold>$activeKeyLabel</>");
} else {
$output->writeln('No Cloud Platform API key is active');
}


if ($keys && $input->isInteractive()) {
foreach ($keys as $uuid => $key) {
$keys[$uuid]['uuid'] = $uuid;
}
$keys['create_new'] = [
'label' => 'Enter a new API key',
'uuid' => 'create_new',
];
$selectedKey = $this->promptChooseFromObjectsOrArrays($keys, 'uuid', 'label', 'Activate a Cloud Platform API key');
if ($selectedKey['uuid'] !== 'create_new') {
$this->datastoreCloud->set('acli_key', $selectedKey['uuid']);
$output->writeln("<info>Acquia CLI will use the API key <options=bold>{$selectedKey['label']}</></info>");
$this->reAuthenticate($this->cloudCredentials->getCloudKey(), $this->cloudCredentials->getCloudSecret(), $this->cloudCredentials->getBaseUri(), $this->cloudCredentials->getAccountsUri());
return Command::SUCCESS;
}
}

$this->promptOpenBrowserToCreateToken($input);
$apiKey = $this->determineApiKey();
$apiSecret = $this->determineApiSecret();
$this->reAuthenticate($apiKey, $apiSecret, $this->cloudCredentials->getBaseUri(), $this->cloudCredentials->getAccountsUri());
$this->writeApiCredentialsToDisk($apiKey, $apiSecret);
$output->writeln("<info>Saved credentials</info>");

return Command::SUCCESS;
}

private function writeApiCredentialsToDisk(string $apiKey, string $apiSecret): void
{
$account = new Account($this->cloudApiClientService->getClient());
$accountInfo = $account->get();
$keys = $this->datastoreCloud->get('keys');
$keys[$apiKey] = [
'label' => $accountInfo->mail,
'secret' => $apiSecret,
'uuid' => $apiKey,
];
$this->datastoreCloud->set('keys', $keys);
$this->datastoreCloud->set('acli_key', $apiKey);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Auth;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'auth:acsf-logout', description: 'Remove Site Factory API credentials')]
final class AuthAcsfLogoutCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$factories = $this->datastoreCloud->get('acsf_factories');
if (empty($factories)) {
$this->io->error(['You are not logged into any factories.']);
return Command::FAILURE;
}
foreach ($factories as $url => $factory) {
$factories[$url]['url'] = $url;
}
$factory = $this->promptChooseFromObjectsOrArrays($factories, 'url', 'url', 'Choose a Factory to logout of');
$factoryUrl = $factory['url'];


$cloudCredentials = $this->cloudCredentials;
$activeUser = $cloudCredentials->getFactoryActiveUser($factory);

if (!$activeUser) {
$this->io->error("You're already logged out of $factoryUrl");
return 1;
}
$answer = $this->io->confirm("Are you sure you'd like to logout the user {$activeUser['username']} from $factoryUrl?");
if (!$answer) {
return Command::SUCCESS;
}
$factories[$factoryUrl]['active_user'] = null;
$this->datastoreCloud->set('acsf_factories', $factories);
$this->datastoreCloud->remove('acsf_active_factory');

$output->writeln("Logged {$activeUser['username']} out of $factoryUrl</info>");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Api;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Exception\ApiErrorException;
use Closure;
use GuzzleHttp\Psr7\Utils;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;

#[RequireAuth]
#[AsCommand(name: 'api:base', hidden: true)]
class ApiBaseCommand extends CommandBase
{
protected string $method;




protected array $responses;




protected array $servers;

protected string $path;




private array $queryParams = [];




private array $postParams = [];




private array $pathParams = [];

protected function interact(InputInterface $input, OutputInterface $output): void
{
$params = array_merge($this->queryParams, $this->postParams, $this->pathParams);
foreach ($this->getDefinition()->getArguments() as $argument) {
if ($argument->isRequired() && !$input->getArgument($argument->getName())) {
$this->io->note([
"{$argument->getName()} is a required argument.",
$argument->getDescription(),
]);

if (
array_key_exists($argument->getName(), $params)
&& array_key_exists('schema', $params[$argument->getName()])
&& array_key_exists('enum', $params[$argument->getName()]['schema'])
) {
$choices = $params[$argument->getName()]['schema']['enum'];
$answer = $this->io->choice("Select a value for {$argument->getName()}", $choices, $argument->getDefault());
} elseif (
array_key_exists($argument->getName(), $params)
&& array_key_exists('type', $params[$argument->getName()])
&& $params[$argument->getName()]['type'] === 'boolean'
) {
$answer = $this->io->choice("Select a value for {$argument->getName()}", [
'false',
'true',
], $argument->getDefault());
$answer = $answer === 'true';
} else {

$answer = $this->askFreeFormQuestion($argument, $params);
}
$input->setArgument($argument->getName(), $answer);
}
}
parent::interact($input, $output);
}






protected function execute(InputInterface $input, OutputInterface $output): int
{
if ($this->getName() === 'api:base') {
throw new AcquiaCliException('api:base is not a valid command');
}

$acquiaCloudClient = $this->cloudApiClientService->getClient();
$this->addQueryParamsToClient($input, $acquiaCloudClient);
$this->addPostParamsToClient($input, $acquiaCloudClient);



$acquiaCloudClient->addOption('headers', [
'Accept' => 'application/hal+json, version=2',
]);

try {
if ($this->output->isVeryVerbose()) {
$acquiaCloudClient->addOption('debug', $this->output);
}
$path = $this->getRequestPath($input);
$response = $acquiaCloudClient->request($this->method, $path);
$exitCode = 0;
} catch (ApiErrorException $exception) {
if ($input->isInteractive()) {
throw $exception;
}
$response = $exception->getResponseBody();
$exitCode = 1;
}

if ($exitCode || !$this->getParamFromInput($input, 'task-wait')) {
$contents = json_encode($response, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT);
$this->output->writeln($contents);
return $exitCode;
}
$notificationUuid = CommandBase::getNotificationUuidFromResponse($response);
$success = $this->waitForNotificationToComplete($this->cloudApiClientService->getClient(), $notificationUuid, "Waiting for task $notificationUuid to complete");
return $success ? Command::SUCCESS : Command::FAILURE;
}

public function setMethod(string $method): void
{
$this->method = $method;
}

public function setResponses(array $responses): void
{
$this->responses = $responses;
}

public function setServers(array $servers): void
{
$this->servers = $servers;
}

public function setPath(string $path): void
{
$this->path = $path;
}

protected function getRequestPath(InputInterface $input): string
{
$path = $this->path;

$arguments = $input->getArguments();

array_shift($arguments);
foreach ($arguments as $key => $value) {
$token = '{' . $key . '}';
if (str_contains($path, $token)) {
$path = str_replace($token, $value, $path);
}
}

return $path;
}

public function getMethod(): string
{
return $this->method;
}

public function addPostParameter(string $paramName, mixed $value): void
{
$this->postParams[$paramName] = $value;
}

public function addQueryParameter(string $paramName, mixed $value): void
{
$this->queryParams[$paramName] = $value;
}

public function getPath(): string
{
return $this->path;
}

public function addPathParameter(string $paramName, mixed $value): void
{
$this->pathParams[$paramName] = $value;
}

private function getParamFromInput(InputInterface $input, string $paramName): array|bool|string|int|null
{
if ($input->hasArgument($paramName)) {
return $input->getArgument($paramName);
}

if ($input->hasParameterOption('--' . $paramName)) {
return $input->getOption($paramName);
}
return null;
}

private function castParamType(array $paramSpec, array|string|bool|int $value): array|bool|int|string|object
{
$oneOf = $this->getParamTypeOneOf($paramSpec);
if (isset($oneOf)) {
$types = [];
foreach ($oneOf as $type) {
if ($type['type'] === 'array' && str_contains($value, ',')) {
return $this->castParamToArray($type, $value);
}
$types[] = $type['type'];
}
if (in_array('integer', $types, true) && ctype_digit($value)) {
return $this->doCastParamType('integer', $value);
}
} elseif ($paramSpec['type'] === 'array') {
if (is_array($value) && count($value) === 1) {
return $this->castParamToArray($paramSpec, $value[0]);
}

return $this->castParamToArray($paramSpec, $value);
}

$type = $this->getParamType($paramSpec);
if (!$type) {
return $value;
}

return $this->doCastParamType($type, $value);
}

private function doCastParamType(string $type, mixed $value): array|bool|int|string|object
{
return match ($type) {
'integer' => (int) $value,
'boolean' => $this->castBool($value),
'array' => $this->parseArrayValue($value),
'string' => (string) $value,
'object' => $this->castObject($value),
};
}






private function parseArrayValue(mixed $value): array
{
if (!is_string($value)) {
return (array) $value;
}

$trimmed = trim($value);
if ($trimmed !== '' && in_array($trimmed[0], ['[', '{'], true)) {
$decoded = json_decode($trimmed, true);
if (is_array($decoded)) {
return $decoded;
}
}

return explode(',', $value);
}
private function castObject(mixed $value): object|string
{
if (is_array($value)) {
return (object)$value;
}
try {
return json_decode($value, false, 512, JSON_THROW_ON_ERROR);
} catch (\JsonException) {
return $value;
}
}

public function castBool(mixed $val): bool
{
return (bool) (is_string($val) ? filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : $val);
}

private function getParamType(array $paramSpec): ?string
{

if (array_key_exists('type', $paramSpec)) {
return $paramSpec['type'];
}

if (array_key_exists('schema', $paramSpec) && array_key_exists('type', $paramSpec['schema'])) {
return $paramSpec['schema']['type'];
}
return null;
}

private function createCallableValidator(InputArgument $argument, array $params): ?callable
{
$validator = null;
if (array_key_exists($argument->getName(), $params)) {
$paramSpec = $params[$argument->getName()];
$constraints = [
new NotBlank(),
];
if ($type = $this->getParamType($paramSpec)) {
if (in_array($type, ['int', 'integer'])) {

$constraints[] = new Type('digit');
} elseif ($type === 'array') {
$constraints[] = new Type('string');
} else {
$constraints[] = new Type($type);
}
}
if (array_key_exists('schema', $paramSpec)) {
$schema = $paramSpec['schema'];
$constraints = $this->createLengthConstraint($schema, $constraints);
$constraints = $this->createRegexConstraint($schema, $constraints);
}
$validator = $this->createValidatorFromConstraints($constraints);
}
return $validator;
}




private function createLengthConstraint(array $schema, array $constraints): array
{
if (array_key_exists('minLength', $schema) || array_key_exists('maxLength', $schema)) {
$lengthOptions = [];
if (array_key_exists('minLength', $schema)) {
$lengthOptions['min'] = $schema['minLength'];
}
if (array_key_exists('maxLength', $schema)) {
$lengthOptions['max'] = $schema['maxLength'];
}
$constraints[] = new Length($lengthOptions);
}
return $constraints;
}




protected function createRegexConstraint(array $schema, array $constraints): array
{
if (array_key_exists('format', $schema)) {
if ($schema['format'] === 'uuid') {
$constraints[] = CommandBase::getUuidRegexConstraint();
}
} elseif (array_key_exists('pattern', $schema)) {
$constraints[] = new Regex([
'message' => 'It must match the pattern ' . $schema['pattern'],
'pattern' => '/' . $schema['pattern'] . '/',
]);
}
return $constraints;
}

private function createValidatorFromConstraints(array $constraints): Closure
{
return static function (mixed $value) use ($constraints) {
$violations = Validation::createValidator()
->validate($value, $constraints);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
return $value;
};
}

protected function addQueryParamsToClient(InputInterface $input, Client $acquiaCloudClient): void
{
if ($this->queryParams) {
foreach ($this->queryParams as $key => $paramSpec) {

if ($input->hasOption($key) && $input->getOption($key) !== null) {
$acquiaCloudClient->addQuery($key, $input->getOption($key));
} elseif ($input->hasArgument($key) && $input->getArgument($key) !== null) {
$acquiaCloudClient->addQuery($key, $input->getArgument($key));
}
}
}
}

private function addPostParamsToClient(InputInterface $input, Client $acquiaCloudClient): void
{
if ($this->postParams) {
foreach ($this->postParams as $paramName => $paramSpec) {
$paramValue = $this->getParamFromInput($input, $paramName);
if (!is_null($paramValue)) {
$this->addPostParamToClient($paramName, $paramSpec, $paramValue, $acquiaCloudClient);
}
}
}
}




private function addPostParamToClient(string $paramName, ?array $paramSpec, mixed $paramValue, Client $acquiaCloudClient): void
{
$paramName = ApiCommandHelper::restoreRenamedParameter($paramName);
if ($paramSpec) {
$paramValue = $this->castParamType($paramSpec, $paramValue);
}
if ($paramSpec && array_key_exists('format', $paramSpec) && $paramSpec["format"] === 'binary') {
$acquiaCloudClient->addOption('multipart', [
[
'contents' => Utils::tryFopen($paramValue, 'r'),
'name' => $paramName,
],
]);
} else {
$acquiaCloudClient->addOption('json', [$paramName => $paramValue]);
}
}

private function askFreeFormQuestion(InputArgument $argument, array $params): mixed
{

$default = $argument->getDefault() ?: null;
$question = new Question("Enter a value for {$argument->getName()}", $default);
switch ($argument->getName()) {
case 'applicationUuid':

$question->setValidator(function (mixed $value) {
return $this->validateApplicationUuid($value);
});
break;
case 'environmentId':

case 'source':
$question->setValidator(function (mixed $value) use ($argument): string {
return $this->validateEnvironmentUuid($value, $argument->getName());
});
break;

default:
$validator = $this->createCallableValidator($argument, $params);
$question->setValidator($validator);
break;
}


$question->setMaxAttempts(null);
return $this->io->askQuestion($question);
}




private function getParamTypeOneOf(array $paramSpec): ?array
{
$oneOf = $paramSpec['oneOf'] ?? null;
if (array_key_exists('schema', $paramSpec) && array_key_exists('oneOf', $paramSpec['schema'])) {
$oneOf = $paramSpec['schema']['oneOf'];
}
return $oneOf;
}

private function castParamToArray(array $paramSpec, array|string $originalValue): string|array|bool|int
{
if (array_key_exists('items', $paramSpec) && array_key_exists('type', $paramSpec['items'])) {
if (!is_array($originalValue)) {
$originalValue = $this->doCastParamType('array', $originalValue);
}
$itemType = $paramSpec['items']['type'];
$array = [];
foreach ($originalValue as $key => $v) {
$array[$key] = $this->doCastParamType($itemType, $v);
}
return $array;
}
return $this->doCastParamType('array', $originalValue);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Api;

use Acquia\Cli\CommandFactoryInterface;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Cache\Adapter\NullAdapter;
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Logger\ConsoleLogger;

class ApiCommandHelper
{
public function __construct(
private ConsoleLogger $logger
) {
}




public function getApiCommands(string $acquiaCloudSpecFilePath, string $commandPrefix, CommandFactoryInterface $commandFactory): array
{
$acquiaCloudSpec = $this->getCloudApiSpec($acquiaCloudSpecFilePath);
$apiCommands = $this->generateApiCommandsFromSpec($acquiaCloudSpec, $commandPrefix, $commandFactory);
$apiListCommands = $this->generateApiListCommands($apiCommands, $commandPrefix, $commandFactory);
return array_merge($apiCommands, $apiListCommands);
}

private function useCloudApiSpecCache(): bool
{
return !(getenv('ACQUIA_CLI_USE_CLOUD_API_SPEC_CACHE') === '0');
}

protected function addArgumentExampleToUsageForGetEndpoint(array $paramDefinition, string $usage): mixed
{
if (array_key_exists('example', $paramDefinition)) {
if (is_array($paramDefinition['example'])) {
$usage = reset($paramDefinition['example']);
} elseif (is_string($paramDefinition['example']) && str_contains($paramDefinition['example'], ' ')) {
$usage .= '"' . $paramDefinition['example'] . '" ';
} else {
$usage .= $paramDefinition['example'] . ' ';
}
}

return $usage;
}

private function addOptionExampleToUsageForGetEndpoint(array $paramDefinition, string $usage): string
{
if (array_key_exists('example', $paramDefinition)) {
$usage .= '--' . $paramDefinition['name'] . '="' . $paramDefinition['example'] . '" ';
}

return $usage;
}

private function addApiCommandParameters(array $schema, array $acquiaCloudSpec, ApiBaseCommand $command): void
{
$inputDefinition = [];
$usage = '';


if (array_key_exists('parameters', $schema)) {
[
$queryInputDefinition,
$queryParamUsageSuffix,
] = $this->addApiCommandParametersForPathAndQuery($schema, $acquiaCloudSpec);

foreach ($queryInputDefinition as $parameterDefinition) {
$parameterSpecification = $this->getParameterDefinitionFromSpec($parameterDefinition->getName(), $acquiaCloudSpec, $schema);
if ($parameterSpecification['in'] === 'query') {
$command->addQueryParameter($parameterDefinition->getName(), $parameterSpecification);
} elseif ($parameterSpecification['in'] === 'path') {
$command->addPathParameter($parameterDefinition->getName(), $parameterSpecification);
}
}
$usage .= $queryParamUsageSuffix;
$inputDefinition = array_merge($inputDefinition, $queryInputDefinition);
}


if (array_key_exists('requestBody', $schema)) {
[
$bodyInputDefinition,
$requestBodyParamUsageSuffix,
] = $this->addApiCommandParametersForRequestBody($schema, $acquiaCloudSpec);
$requestBodySchema = $this->getRequestBodyFromParameterSchema($schema, $acquiaCloudSpec);

foreach ($bodyInputDefinition as $parameterDefinition) {
$parameterSpecification = $this->getPropertySpecFromRequestBodyParam($requestBodySchema, $parameterDefinition);
$command->addPostParameter($parameterDefinition->getName(), $parameterSpecification);
}
$usage .= $requestBodyParamUsageSuffix;
$inputDefinition = array_merge($inputDefinition, $bodyInputDefinition);
}


if (array_key_exists(202, $schema['responses'])) {
$inputDefinition[] = new InputOption('task-wait', null, InputOption::VALUE_NONE, 'Wait for this task to complete');
}

$command->setDefinition(new InputDefinition($inputDefinition));
if ($usage) {
$command->addUsage(rtrim($usage));
}
$this->addAliasUsageExamples($command, $inputDefinition, rtrim($usage));
}




private function addApiCommandParametersForRequestBody(array $schema, array $acquiaCloudSpec): array
{
$usage = '';
$inputDefinition = [];
$requestBodySchema = $this->getRequestBodyFromParameterSchema($schema, $acquiaCloudSpec);

if (!array_key_exists('properties', $requestBodySchema)) {
$requestBodySchema['properties'] = [];
}
foreach ($requestBodySchema['properties'] as $propKey => $paramDefinition) {
$isRequired = array_key_exists('required', $requestBodySchema) && in_array($propKey, $requestBodySchema['required'], true);
$propKey = self::renameParameter($propKey);

if ($isRequired) {
if (array_key_exists('description', $paramDefinition)) {
$description = $paramDefinition['description'];
} elseif (array_key_exists('additionalProperties', $paramDefinition) && array_key_exists('description', $paramDefinition['additionalProperties'])) {
$description = $paramDefinition['additionalProperties']['description'];
} else {
$description = "No description provided for this parameter";
}
$inputDefinition[] = new InputArgument(
$propKey,
array_key_exists('type', $paramDefinition) && $paramDefinition['type'] === 'array' ? InputArgument::IS_ARRAY | InputArgument::REQUIRED : InputArgument::REQUIRED,
$description
);
$usage = $this->addPostArgumentUsageToExample($schema['requestBody'], $propKey, $paramDefinition, 'argument', $usage, $acquiaCloudSpec);
} else {
$inputDefinition[] = new InputOption(
$propKey,
null,
array_key_exists('type', $paramDefinition) && $paramDefinition['type'] === 'array' ? InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED : InputOption::VALUE_REQUIRED,
array_key_exists('description', $paramDefinition) ? $paramDefinition['description'] : $propKey
);
$usage = $this->addPostArgumentUsageToExample($schema["requestBody"], $propKey, $paramDefinition, 'option', $usage, $acquiaCloudSpec);

}
}

foreach ($inputDefinition as $index => $parameterDefinition) {
if ($parameterDefinition->isArray()) {

unset($inputDefinition[$index]);
$inputDefinition[] = $parameterDefinition;
}
}

return [$inputDefinition, $usage];
}

private function addPostArgumentUsageToExample(mixed $requestBody, mixed $propKey, mixed $paramDefinition, string $type, string $usage, array $acquiaCloudSpec): string
{
$requestBodyContent = $this->getRequestBodyContent($requestBody, $acquiaCloudSpec);

if (array_key_exists('example', $requestBodyContent)) {
$example = $requestBodyContent['example'];
$prefix = $type === 'argument' ? '' : "--$propKey=";
if (array_key_exists($propKey, $example)) {
if (!array_key_exists('type', $paramDefinition)) {
return $usage;
}
switch ($paramDefinition['type']) {
case 'object':
$usage .= $prefix . '"' . json_encode($example[$propKey], JSON_THROW_ON_ERROR) . '"" ';
break;

case 'array':
$isMultidimensional = count($example[$propKey]) !== count($example[$propKey], COUNT_RECURSIVE);
if (!$isMultidimensional) {
foreach ($example[$propKey] as $value) {
$usage .= $prefix . "\"$value\" ";
}
} else {



$value = json_encode($example[$propKey], JSON_THROW_ON_ERROR);
$usage .= $prefix . "\"$value\" ";
}
break;

case 'string':
case 'boolean':
case 'integer':
if (is_array($example[$propKey])) {
$value = reset($example[$propKey]);
} else {
$value = $example[$propKey];
}
$usage .= $prefix . "\"$value\" ";
break;
}
}
}
return $usage;
}




private function addApiCommandParametersForPathAndQuery(array $schema, array $acquiaCloudSpec): array
{
$usage = '';
$inputDefinition = [];
if (!array_key_exists('parameters', $schema)) {
return [];
}
foreach ($schema['parameters'] as $parameter) {
if (array_key_exists('$ref', $parameter)) {
$parts = explode('/', $parameter['$ref']);
$paramKey = end($parts);
$paramDefinition = $this->getParameterDefinitionFromSpec($paramKey, $acquiaCloudSpec, $schema);
} else {
$paramDefinition = $parameter;
}

$required = array_key_exists('required', $paramDefinition) && $paramDefinition['required'];
$this->addAliasParameterDescriptions($paramDefinition);
if ($required) {
$inputDefinition[] = new InputArgument(
$paramDefinition['name'],
InputArgument::REQUIRED,
$paramDefinition['description']
);
$usage = $this->addArgumentExampleToUsageForGetEndpoint($paramDefinition, $usage);
} else {
$inputDefinition[] = new InputOption(
$paramDefinition['name'],
null,
InputOption::VALUE_REQUIRED,
$paramDefinition['description']
);
$usage = $this->addOptionExampleToUsageForGetEndpoint($paramDefinition, $usage);
}
}

return [$inputDefinition, $usage];
}











private function getParameterDefinitionFromSpec(string $paramKey, array $acquiaCloudSpec, array $schema): mixed
{

if (
array_key_exists('parameters', $acquiaCloudSpec['components'])
&& array_key_exists($paramKey, $acquiaCloudSpec['components']['parameters'])
) {
return $acquiaCloudSpec['components']['parameters'][$paramKey];
}

foreach ($schema['parameters'] as $parameter) {
if (array_key_exists('name', $parameter) && $parameter['name'] === $paramKey) {
return $parameter;
}
}

if (
array_key_exists('parameters', $acquiaCloudSpec['components'])
) {
foreach ($acquiaCloudSpec['components']['parameters'] as $parameter) {
if (array_key_exists('name', $parameter) && $parameter['name'] === $paramKey) {
return $parameter;
}
}
}
return null;
}

private function getParameterSchemaFromSpec(string $paramKey, array $acquiaCloudSpec): mixed
{
return $acquiaCloudSpec['components']['schemas'][$paramKey];
}


private function isApiSpecChecksumCacheValid(\Symfony\Component\Cache\CacheItem $cacheItem, string $acquiaCloudSpecFileChecksum): bool
{

if (!$acquiaCloudSpecFileChecksum && $cacheItem->isHit()) {
return true;
}

if (!$cacheItem->isHit() || $cacheItem->get() !== $acquiaCloudSpecFileChecksum) {
return false;
}
return true;
}

/**
@infection-ignore-all



*/
private function getCloudApiSpec(string $specFilePath): array
{
$cacheKey = basename($specFilePath);
$cache = new PhpArrayAdapter(__DIR__ . '/../../../var/cache/' . $cacheKey . '.cache', new NullAdapter());
$cacheItemChecksum = $cache->getItem($cacheKey . '.checksum');
$cacheItemSpec = $cache->getItem($cacheKey);


if (!file_exists($specFilePath) && $cacheItemSpec->isHit()) {
return $cacheItemSpec->get();
}


$checksum = md5_file($specFilePath);

if (
$this->useCloudApiSpecCache()
&& $this->isApiSpecChecksumCacheValid($cacheItemChecksum, $checksum) && $cacheItemSpec->isHit()
) {
return $cacheItemSpec->get();
}


$this->logger->debug("Rebuilding caches...");
$spec = json_decode(file_get_contents($specFilePath), true);

$cache->warmUp([
$cacheKey => $spec,
$cacheKey . '.checksum' => $checksum,
]);

return $spec;
}




private function generateApiCommandsFromSpec(array $acquiaCloudSpec, string $commandPrefix, CommandFactoryInterface $commandFactory): array
{
$apiCommands = [];
foreach ($acquiaCloudSpec['paths'] as $path => $endpoint) {
foreach ($endpoint as $method => $schema) {
if (!array_key_exists('x-cli-name', $schema)) {
continue;
}

if (in_array($schema['x-cli-name'], $this->getSkippedApiCommands(), true)) {
continue;
}

$commandName = $commandPrefix . ':' . $schema['x-cli-name'];
$command = $commandFactory->createCommand();
$command->setName($commandName);
$command->setDescription($schema['summary']);
$command->setMethod($method);
$command->setResponses($schema['responses']);
$command->setHidden(array_key_exists('deprecated', $schema) && $schema['deprecated']);
if (array_key_exists('servers', $acquiaCloudSpec)) {
$command->setServers($acquiaCloudSpec['servers']);
}
$command->setPath($path);
$command->setHelp("For more help, see https://cloudapi-docs.acquia.com/ or https://dev.acquia.com/api-documentation/acquia-cloud-site-factory-api for acsf commands.");
$this->addApiCommandParameters($schema, $acquiaCloudSpec, $command);
$apiCommands[] = $command;
}
}

return $apiCommands;
}




protected function getSkippedApiCommands(): array
{
return [


'accounts:drush-aliases',

'ide:create',
'log:tail',
'ssh-key:create',
'ssh-key:create-upload',
'ssh-key:delete',
'ssh-key:list',
'ssh-key:upload',

'environments:stack-metrics-data-metric',
];
}

private function addAliasUsageExamples(ApiBaseCommand $command, array $inputDefinition, string $usage): void
{
foreach ($inputDefinition as $key => $parameter) {
if ($parameter->getName() === 'applicationUuid') {
$usageParts = explode(' ', $usage);
$usageParts[$key] = "myapp";
$usage = implode(' ', $usageParts);
$command->addUsage($usage);
}
if ($parameter->getName() === 'environmentId') {
$usageParts = explode(' ', $usage);
$usageParts[$key] = "myapp.dev";
$usage = implode(' ', $usageParts);
$command->addUsage($usage);
}
}
}

private function addAliasParameterDescriptions(mixed &$paramDefinition): void
{
if ($paramDefinition['name'] === 'applicationUuid') {
$paramDefinition['description'] .= ' You may also use an application alias or omit the argument if you run the command in a linked directory.';
}
if ($paramDefinition['name'] === 'environmentId') {
$paramDefinition['description'] .= " You may also use an environment alias or UUID.";
}
}




private function getRequestBodyFromParameterSchema(array $schema, array $acquiaCloudSpec): array
{
$requestBodyContent = $this->getRequestBodyContent($schema['requestBody'], $acquiaCloudSpec);
$requestBodySchema = $requestBodyContent['schema'];


if (array_key_exists('$ref', $requestBodySchema)) {
$parts = explode('/', $requestBodySchema['$ref']);
$paramKey = end($parts);
$requestBodySchema = $this->getParameterSchemaFromSpec($paramKey, $acquiaCloudSpec);
}

return $requestBodySchema;
}

private function getPropertySpecFromRequestBodyParam(array $requestBodySchema, mixed $parameterDefinition): mixed
{
$name = self::restoreRenamedParameter($parameterDefinition->getName());
return $requestBodySchema['properties'][$name] ?? null;
}




protected static function getParameterRenameMap(): array
{

return [

'command' => 'cron_command',

'version' => 'lang_version',
];
}

private static function renameParameter(string $propKey): string
{
$parameterRenameMap = self::getParameterRenameMap();
if (array_key_exists($propKey, $parameterRenameMap)) {
$propKey = $parameterRenameMap[$propKey];
}
return $propKey;
}

public static function restoreRenamedParameter(string $propKey): string
{
$parameterRenameMap = array_flip(self::getParameterRenameMap());
if (array_key_exists($propKey, $parameterRenameMap)) {
$propKey = $parameterRenameMap[$propKey];
}
return $propKey;
}




private function generateApiListCommands(array $apiCommands, string $commandPrefix, CommandFactoryInterface $commandFactory): array
{
$apiListCommands = [];
foreach ($apiCommands as $apiCommand) {
$commandNameParts = explode(':', $apiCommand->getName());
if (count($commandNameParts) < 3) {
continue;
}
$namespace = $commandNameParts[1];
if (!array_key_exists($namespace, $apiListCommands)) {

$command = $commandFactory->createListCommand();
$name = $commandPrefix . ':' . $namespace;
$command->setName($name);
$command->setNamespace($name);
$command->setAliases([]);
$command->setDescription("List all API commands for the $namespace resource");
$apiListCommands[$name] = $command;
}
}
return $apiListCommands;
}





private function getRequestBodyContent(array $requestBody, array $acquiaCloudSpec): array
{
if (array_key_exists('$ref', $requestBody)) {
$parts = explode('/', $requestBody['$ref']);
$paramKey = end($parts);
$requestBody = $acquiaCloudSpec['components']['requestBodies'][$paramKey];
}
$content = $requestBody['content'];
$knownContentTypes = [
'application/hal+json',
'application/json',
'application/x-www-form-urlencoded',
'multipart/form-data',
];
foreach ($knownContentTypes as $contentType) {
if (array_key_exists($contentType, $content)) {
return $content[$contentType];
}
}
throw new AcquiaCliException("requestBody content doesn't match any known schema");
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Api;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;

#[RequireAuth]
#[AsCommand(name: 'api:list', description: 'List all API commands', aliases: ['api'])]
final class ApiListCommand extends ApiListCommandBase
{
protected string $namespace = 'api';
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Api;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class ApiListCommandBase extends CommandBase
{
protected string $namespace;

public function setNamespace(string $namespace): void
{
$this->namespace = $namespace;
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
$command = $this->getApplication()->find('list');
$arguments = [
'command' => 'list',
'namespace' => 'api',
];
$listInput = new ArrayInput($arguments);

return $command->run($listInput, $output);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Api;

use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\CloudApi\CloudCredentials;
use Acquia\Cli\CommandFactoryInterface;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use Psr\Log\LoggerInterface;
use SelfUpdate\SelfUpdateManager;

class ApiCommandFactory implements CommandFactoryInterface
{
public function __construct(
private LocalMachineHelper $localMachineHelper,
private CloudDataStore $datastoreCloud,
private AcquiaCliDatastore $datastoreAcli,
private CloudCredentials $cloudCredentials,
private TelemetryHelper $telemetryHelper,
private string $projectDir,
private ClientService $cloudApiClientService,
private SshHelper $sshHelper,
private string $sshDir,
private LoggerInterface $logger,
private SelfUpdateManager $selfUpdateManager,
) {
}

public function createCommand(): ApiBaseCommand
{
return new ApiBaseCommand(
$this->localMachineHelper,
$this->datastoreCloud,
$this->datastoreAcli,
$this->cloudCredentials,
$this->telemetryHelper,
$this->projectDir,
$this->cloudApiClientService,
$this->sshHelper,
$this->sshDir,
$this->logger,
$this->selfUpdateManager,
);
}

public function createListCommand(): ApiListCommand
{
return new ApiListCommand(
$this->localMachineHelper,
$this->datastoreCloud,
$this->datastoreAcli,
$this->cloudCredentials,
$this->telemetryHelper,
$this->projectDir,
$this->cloudApiClientService,
$this->sshHelper,
$this->sshDir,
$this->logger,
$this->selfUpdateManager,
);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Command\CommandBase;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Ramsey\Uuid\Uuid;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'ide:share', description: 'Get the share URL for a Cloud IDE')]
final class IdeShareCommand extends CommandBase
{



private array $shareCodeFilepaths;

protected function configure(): void
{
$this
->addOption('regenerate', '', InputOption::VALUE_NONE, 'regenerate the share code')
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();

if ($input->getOption('regenerate')) {
$this->regenerateShareCode();
}

$shareUuid = $this->localMachineHelper->readFile($this->getShareCodeFilepaths()[0]);
$webUrl = self::getThisCloudIdeWebUrl();

$this->output->writeln('');
$this->output->writeln("<comment>Your IDE Share URL:</comment> <href=https://$webUrl>https://$webUrl?share=$shareUuid</>");

return Command::SUCCESS;
}

public function setShareCodeFilepaths(array $filePath): void
{
$this->shareCodeFilepaths = $filePath;
}




private function getShareCodeFilepaths(): array
{
if (!isset($this->shareCodeFilepaths)) {
$this->shareCodeFilepaths = [
'/usr/local/share/ide/.sharecode',
'/home/ide/.sharecode',
];
}
return $this->shareCodeFilepaths;
}

private function regenerateShareCode(): void
{
$newShareCode = (string) Uuid::uuid4();
foreach ($this->getShareCodeFilepaths() as $path) {
$this->localMachineHelper->writeFile($path, $newShareCode);
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Constraints\Choice;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;

#[AsCommand(name: 'ide:service-restart', description: 'Restart a service in the Cloud IDE')]
final class IdeServiceRestartCommand extends IdeCommandBase
{
protected function configure(): void
{
$this
->addArgument('service', InputArgument::REQUIRED, 'The name of the service to restart')
->addUsage('php')
->addUsage('apache')
->addUsage('mysql')
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();
$service = $input->getArgument('service');
$this->validateService($service);

$serviceNameMap = [
'apache' => 'apache2',
'apache2' => 'apache2',
'mysql' => 'mysqld',
'mysqld' => 'mysqld',
'php' => 'php-fpm',
'php-fpm' => 'php-fpm',
];
$output->writeln("Restarting <options=bold>$service</>...");
$serviceName = $serviceNameMap[$service];
$this->restartService($serviceName);
$output->writeln("<info>Restarted <options=bold>$service</></info>");

return Command::SUCCESS;
}

private function validateService(string $service): void
{
$violations = Validation::createValidator()->validate($service, [
new Choice([
'choices' => [
'php',
'php-fpm',
'apache',
'apache2',
'mysql',
'mysqld',
],
'message' => 'Specify a valid service name: php, apache, or mysql',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'ide:php-version', description: 'Change the PHP version in the current IDE')]
final class IdePhpVersionCommand extends IdeCommandBase
{
private string $idePhpFilePathPrefix;

protected function configure(): void
{
$this
->addArgument('version', InputArgument::REQUIRED, 'The PHP version')
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();
$version = $input->getArgument('version');
$this->validatePhpVersion($version);
$this->localMachineHelper->getFilesystem()
->dumpFile($this->getIdePhpVersionFilePath(), $version);
$this->restartService('php-fpm');

return Command::SUCCESS;
}

private function getIdePhpFilePathPrefix(): string
{
if (!isset($this->idePhpFilePathPrefix)) {
$this->idePhpFilePathPrefix = '/usr/local/php';
}
return $this->idePhpFilePathPrefix;
}

public function setIdePhpFilePathPrefix(string $path): void
{
$this->idePhpFilePathPrefix = $path;
}

protected function validatePhpVersion(string $version): string
{
parent::validatePhpVersion($version);
$phpFilepath = $this->getIdePhpFilePathPrefix() . $version;
if (!$this->localMachineHelper->getFilesystem()->exists($phpFilepath)) {
throw new AcquiaCliException('The specified PHP version does not exist on this machine.');
}

return $version;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'ide:xdebug-toggle', description: 'Toggle Xdebug on or off in the current IDE', aliases: ['xdebug'])]
final class IdeXdebugToggleCommand extends IdeCommandBase
{
private ?bool $xDebugEnabled;

protected function configure(): void
{
$this
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();
$iniFile = $this->getXdebugIniFilePath();
$contents = file_get_contents($iniFile);
$this->setXDebugStatus($contents);

if ($this->getXDebugStatus() === false) {
$this->enableXDebug($iniFile, $contents);
} elseif ($this->getXDebugStatus() === true) {
$this->disableXDebug($iniFile, $contents);
} else {
throw new AcquiaCliException("Could not find xdebug zend extension in $iniFile!");
}
$this->restartService('php-fpm');

return Command::SUCCESS;
}






private function setXDebugStatus(string $contents): void
{
if (str_contains($contents, ';zend_extension=xdebug.so')) {
$this->xDebugEnabled = false;
} elseif (str_contains($contents, 'zend_extension=xdebug.so')) {
$this->xDebugEnabled = true;
} else {
$this->xDebugEnabled = null;
}
}

private function getXDebugStatus(): ?bool
{
return $this->xDebugEnabled;
}






private function enableXDebug(string $destinationFile, string $contents): void
{
$this->logger->notice("Enabling Xdebug PHP extension in $destinationFile...");


$newContents = preg_replace('/(;)+(zend_extension=xdebug\.so)/', '$2', $contents);
file_put_contents($destinationFile, $newContents);
$this->output->writeln("<info>Xdebug PHP extension enabled.</info>");
$this->output->writeln("You must also enable Xdebug listening in your code editor to begin a debugging session.");
}






private function disableXDebug(string $destinationFile, string $contents): void
{
$this->logger->notice("Disabling Xdebug PHP extension in $destinationFile...");
$newContents = preg_replace('/(;)*(zend_extension=xdebug\.so)/', ';$2', $contents);
file_put_contents($destinationFile, $newContents);
$this->output->writeln("<info>Xdebug PHP extension disabled.</info>");
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\LoopHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Endpoints\Account;
use AcquiaCloudApi\Endpoints\Ides;
use AcquiaCloudApi\Response\IdeResponse;
use AcquiaCloudApi\Response\OperationResponse;
use GuzzleHttp\Client;
use Psr\Log\LoggerInterface;
use SelfUpdate\SelfUpdateManager;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;

#[RequireAuth]
#[AsCommand(name: 'ide:create', description: 'Create a Cloud IDE')]
final class IdeCreateCommand extends IdeCommandBase
{
private IdeResponse $ide;

public function __construct(
public LocalMachineHelper $localMachineHelper,
protected CloudDataStore $datastoreCloud,
protected AcquiaCliDatastore $datastoreAcli,
protected ApiCredentialsInterface $cloudCredentials,
protected TelemetryHelper $telemetryHelper,
protected string $projectDir,
protected ClientService $cloudApiClientService,
public SshHelper $sshHelper,
protected string $sshDir,
LoggerInterface $logger,
public selfUpdateManager $selfUpdateManager,
protected Client $httpClient
) {
parent::__construct($this->localMachineHelper, $this->datastoreCloud, $this->datastoreAcli, $this->cloudCredentials, $this->telemetryHelper, $this->projectDir, $this->cloudApiClientService, $this->sshHelper, $this->sshDir, $logger, $this->selfUpdateManager);
}

protected function configure(): void
{
$this->acceptApplicationUuid();
$this->addOption('label', null, InputOption::VALUE_REQUIRED, 'The label for the IDE');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$cloudApplicationUuid = $this->determineCloudApplication();
$checklist = new Checklist($output);
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$accountResource = new Account($acquiaCloudClient);
$account = $accountResource->get();
$default = "$account->first_name $account->last_name's IDE";
$ideLabel = $this->determineOption('label', false, $this->validateIdeLabel(...), null, $default);


$checklist->addItem('Creating your Cloud IDE');
$idesResource = new Ides($acquiaCloudClient);
$response = $idesResource->create($cloudApplicationUuid, $ideLabel);
$checklist->completePreviousItem();


$checklist->addItem('Getting IDE information');
$this->ide = $this->getIdeFromResponse($response, $acquiaCloudClient);
$ideUrl = $this->ide->links->ide->href;
$checklist->completePreviousItem();


return $this->waitForDnsPropagation($ideUrl);
}








public function validateIdeLabel(string $label): string
{
$violations = Validation::createValidator()->validate($label, [
new Regex([
'message' => 'Use only letters, numbers, and spaces',
'pattern' => '/^[\w\' ]+$/',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
return $label;
}

private function waitForDnsPropagation(string $ideUrl): int
{
$ideCreated = false;
$checkIdeStatus = function () use (&$ideCreated, $ideUrl) {


$response = $this->httpClient->request('GET', "$ideUrl/health", ['http_errors' => false]);


if ($response->getStatusCode() === 200) {
$ideCreated = true;
}
return $ideCreated;
};
$doneCallback = function () use (&$ideCreated): void {
if ($ideCreated) {
$this->output->writeln('');
$this->output->writeln('<info>Your IDE is ready!</info>');
}
$this->writeIdeLinksToScreen();
};
$spinnerMessage = 'Waiting for the IDE to be ready. This usually takes 2 - 15 minutes.';
LoopHelper::getLoopy($this->output, $this->io, $spinnerMessage, $checkIdeStatus, $doneCallback);

return Command::SUCCESS;
}




private function writeIdeLinksToScreen(): void
{
$this->output->writeln('');
$this->output->writeln("<comment>Your IDE URL:</comment> <href={$this->ide->links->ide->href}>{$this->ide->links->ide->href}</>");
$this->output->writeln("<comment>Your Drupal Site URL:</comment> <href={$this->ide->links->web->href}>{$this->ide->links->web->href}</>");

}

private function getIdeFromResponse(
OperationResponse $response,
\AcquiaCloudApi\Connector\Client $acquiaCloudClient
): IdeResponse {
$cloudApiIdeUrl = $response->links->self->href;
$urlParts = explode('/', $cloudApiIdeUrl);
$ideUuid = end($urlParts);
return (new Ides($acquiaCloudClient))->get($ideUuid);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Attribute\RequireAuth;
use AcquiaCloudApi\Endpoints\Ides;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:info', description: 'Print information about a Cloud IDE')]
final class IdeInfoCommand extends IdeCommandBase
{
protected function configure(): void
{
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$applicationUuid = $this->determineCloudApplication();

$acquiaCloudClient = $this->cloudApiClientService->getClient();
$idesResource = new Ides($acquiaCloudClient);

$ide = $this->promptIdeChoice("Select an IDE to get more information:", $idesResource, $applicationUuid);
$response = $idesResource->get($ide->uuid);
$this->io->definitionList(
['IDE property' => 'IDE value'],
new TableSeparator(),
['UUID' => $response->uuid],
['Label' => $response->label],
['Owner name' => $response->owner->first_name . ' ' . $response->owner->last_name],
['Owner username' => $response->owner->username],
['Owner email' => $response->owner->mail],
['Cloud application' => $response->links->application->href],
['IDE URL' => $response->links->ide->href],
['Web URL' => $response->links->web->href]
);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Helpers\SshCommandTrait;
use AcquiaCloudApi\Endpoints\Ides;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:delete', description: 'Delete a Cloud IDE')]
final class IdeDeleteCommand extends IdeCommandBase
{
use SshCommandTrait;

protected function configure(): void
{
$this->acceptApplicationUuid();

$this->addOption('uuid', null, InputOption::VALUE_OPTIONAL, 'UUID of the IDE to delete');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$idesResource = new Ides($acquiaCloudClient);

$ideUuid = $input->getOption('uuid');
if ($ideUuid) {
$ide = $idesResource->get($ideUuid);
} else {
$cloudApplicationUuid = $this->determineCloudApplication();
$ide = $this->promptIdeChoice("Select the IDE you'd like to delete:", $idesResource, $cloudApplicationUuid);
$answer = $this->io->confirm("Are you sure you want to delete <options=bold>$ide->label</>");
if (!$answer) {
$this->io->writeln('Ok, never mind.');
return Command::FAILURE;
}
}
$response = $idesResource->delete($ide->uuid);
$this->io->writeln($response->message);


$cloudKey = $this->findIdeSshKeyOnCloud($ide->label, $ide->uuid);
if ($cloudKey) {
$answer = $this->io->confirm('Would you like to delete the SSH key associated with this IDE from your Cloud Platform account?');
if ($answer) {
$this->deleteSshKeyFromCloud($output, $cloudKey);
}
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\IdeCommandTrait;
use AcquiaCloudApi\Endpoints\Ides;
use AcquiaCloudApi\Response\IdeResponse;

abstract class IdeCommandBase extends CommandBase
{
use IdeCommandTrait;

private string $xdebugIniFilepath = '/home/ide/configs/php/xdebug.ini';

protected function promptIdeChoice(
string $questionText,
Ides $idesResource,
string $cloudApplicationUuid
): IdeResponse {
$ides = iterator_to_array($idesResource->getAll($cloudApplicationUuid));
if (empty($ides)) {
throw new AcquiaCliException('No IDEs exist for this application.');
}

$choices = [];
foreach ($ides as $ide) {
$choices[] = "$ide->label ($ide->uuid)";
}
$choice = $this->io->choice($questionText, $choices, $choices[0]);
$chosenEnvironmentIndex = array_search($choice, $choices, true);

return $ides[$chosenEnvironmentIndex];
}




protected function startService(string $service): void
{
$process = $this->localMachineHelper->execute([
'supervisorctl',
'start',
$service,
], null, null, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to start ' . $service . ' in the IDE: {error}', ['error' => $process->getErrorOutput()]);
}
}




protected function stopService(string $service): void
{
$process = $this->localMachineHelper->execute([
'supervisorctl',
'stop',
$service,
], null, null, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to stop ' . $service . ' in the IDE: {error}', ['error' => $process->getErrorOutput()]);
}
}




protected function restartService(string $service): void
{
$process = $this->localMachineHelper->execute([
'supervisorctl',
'restart',
$service,
], null, null, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to restart ' . $service . ' in the IDE: {error}', ['error' => $process->getErrorOutput()]);
}
}

public function setXdebugIniFilepath(string $filePath): void
{
$this->xdebugIniFilepath = $filePath;
}

protected function getXdebugIniFilePath(): string
{
return $this->xdebugIniFilepath;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide\Wizard;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Endpoints\Account;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:wizard:ssh-key:create-upload', description: 'Wizard to perform first time setup tasks within an IDE', aliases: ['ide:wizard'])]
final class IdeWizardCreateSshKeyCommand extends IdeWizardCommandBase
{
protected function configure(): void
{
$this
->setHidden(!CommandBase::isAcquiaCloudIde());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$checklist = new Checklist($output);


$acquiaCloudClient = $this->cloudApiClientService->getClient();
$accountAdapter = new Account($acquiaCloudClient);
$account = $accountAdapter->get();
$this->validateRequiredCloudPermissions(
$acquiaCloudClient,
self::getCloudAppUuid(),
$account,
[

"add ssh key to git",

"add ssh key to non-prod",
]
);

$keyWasUploaded = false;

if (!$this->localSshKeyExists() || !$this->passPhraseFileExists()) {

$this->deleteLocalSshKey();

$this->deleteThisSshKeyFromCloud($output);

$checklist->addItem('Creating a local SSH key');


$password = md5(random_bytes(10));
$this->savePassPhraseToFile($password);
$this->createSshKey($this->privateSshKeyFilename, $password);

$checklist->completePreviousItem();
$keyWasUploaded = true;
} else {
$checklist->addItem('Already created a local key');
$checklist->completePreviousItem();
}


if (!$this->userHasUploadedThisKeyToCloud($this->getSshKeyLabel())) {
$checklist->addItem('Uploading the local key to the Cloud Platform');



$this->deleteThisSshKeyFromCloud($output);
$publicKey = $this->localMachineHelper->readFile($this->publicSshKeyFilepath);
$this->uploadSshKey($this->getSshKeyLabel(), $publicKey);

$checklist->completePreviousItem();
$keyWasUploaded = true;
} else {
$checklist->addItem('Already uploaded the local key to the Cloud Platform');
$checklist->completePreviousItem();
}


if (!$this->sshKeyIsAddedToKeychain()) {
$checklist->addItem('Adding the SSH key to local keychain');
$this->addSshKeyToAgent($this->publicSshKeyFilepath, $this->getPassPhraseFromFile());
} else {
$checklist->addItem('Already added the SSH key to local keychain');
}
$checklist->completePreviousItem();


if ($keyWasUploaded) {
if ($this->getCodebaseUuid()) {
$output->writeln('<info>Your SSH key has been successfully uploaded to the Cloud Platform.</info>');
$this->io->note("It may take an hour or more before the SSH key is installed on all of your servers. Create a Support ticket for further assistance.");
return Command::SUCCESS;
}
if ($this->input->isInteractive() && !$this->promptWaitForSsh($this->io)) {
$this->io->success('Your SSH key has been successfully uploaded to the Cloud Platform.');
return Command::SUCCESS;
}


$this->pollAcquiaCloudUntilSshSuccess($output);
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide\Wizard;

use Acquia\Cli\Command\WizardCommandBase;
use Acquia\Cli\Helpers\SshCommandTrait;
use AcquiaCloudApi\Response\IdeResponse;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

abstract class IdeWizardCommandBase extends WizardCommandBase
{
use SshCommandTrait;

protected string|false $ideUuid;

protected IdeResponse $ide;




protected function initialize(InputInterface $input, OutputInterface $output): void
{
parent::initialize($input, $output);

$this->setSshKeyFilepath(self::getSshKeyFilename($this::getThisCloudIdeUuid()));
$this->passphraseFilepath = $this->localMachineHelper->getLocalFilepath('~/.passphrase');
}

public static function getSshKeyFilename(mixed $ideUuid): string
{
return 'id_rsa_acquia_ide_' . $ideUuid;
}

protected function validateEnvironment(): void
{
$this->requireCloudIdeEnvironment();
}

protected function getSshKeyLabel(): string
{
return $this::getIdeSshKeyLabel(self::getThisCloudIdeLabel(), self::getThisCloudIdeUuid());
}

protected function deleteThisSshKeyFromCloud(mixed $output): void
{
if ($cloudKey = $this->findIdeSshKeyOnCloud($this::getThisCloudIdeLabel(), $this::getThisCloudIdeUuid())) {
$this->deleteSshKeyFromCloud($output, $cloudKey);
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide\Wizard;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\SshCommandTrait;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:wizard:ssh-key:delete', description: 'Wizard to delete SSH key for IDE from Cloud')]
final class IdeWizardDeleteSshKeyCommand extends IdeWizardCommandBase
{
use SshCommandTrait;

protected function configure(): void
{
$this
->setHidden(!CommandBase::isAcquiaCloudIde());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();

$cloudKey = $this->findIdeSshKeyOnCloud($this::getThisCloudIdeLabel(), $this::getThisCloudIdeUuid());
if (!$cloudKey) {
throw new AcquiaCliException('Could not find an SSH key on the Cloud Platform matching any local key in this IDE.');
}

$this->deleteSshKeyFromCloud($output, $cloudKey);
$this->deleteLocalSshKey();

$this->output->writeln("<info>Deleted local files <options=bold>$this->publicSshKeyFilepath</> and <options=bold>$this->privateSshKeyFilepath</>");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Attribute\RequireAuth;
use AcquiaCloudApi\Endpoints\Ides;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:list:app', description: 'List available Cloud IDEs belonging to a given application', aliases: ['ide:list'])]
final class IdeListCommand extends IdeCommandBase
{
protected function configure(): void
{
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$applicationUuid = $this->determineCloudApplication();

$acquiaCloudClient = $this->cloudApiClientService->getClient();
$idesResource = new Ides($acquiaCloudClient);
$applicationIdes = $idesResource->getAll($applicationUuid);

if ($applicationIdes->count()) {
$table = new Table($output);
$table->setStyle('borderless');
$table->setHeaders(['IDEs']);
foreach ($applicationIdes as $ide) {
$table->addRows([
["<comment>$ide->label ({$ide->owner->mail})</comment>"],
["IDE URL: <href={$ide->links->ide->href}>{$ide->links->ide->href}</>"],
["Web URL: <href={$ide->links->web->href}>{$ide->links->web->href}</>"],
new TableSeparator(),
]);
}
$table->render();
} else {
$output->writeln('No IDE exists for this application.');
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Constraints\Choice;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;

#[AsCommand(name: 'ide:service-start', description: 'Start a service in the Cloud IDE')]
final class IdeServiceStartCommand extends IdeCommandBase
{
protected function configure(): void
{
$this
->addArgument('service', InputArgument::REQUIRED, 'The name of the service to start')
->addUsage('php')
->addUsage('apache')
->addUsage('mysql')
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();
$service = $input->getArgument('service');
$this->validateService($service);

$serviceNameMap = [
'apache' => 'apache2',
'apache2' => 'apache2',
'mysql' => 'mysqld',
'mysqld' => 'mysqld',
'php' => 'php-fpm',
'php-fpm' => 'php-fpm',
];
$output->writeln("Starting <options=bold>$service</>...");
$serviceName = $serviceNameMap[$service];
$this->startService($serviceName);
$output->writeln("<info>Started <options=bold>$service</></info>");

return Command::SUCCESS;
}

private function validateService(string $service): void
{
$violations = Validation::createValidator()->validate($service, [
new Choice([
'choices' => [
'php',
'php-fpm',
'apache',
'apache2',
'mysql',
'mysqld',
],
'message' => 'Specify a valid service name: php, apache, or mysql',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use AcquiaCloudApi\Endpoints\Ides;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:open', description: 'Open a Cloud IDE in your browser')]
final class IdeOpenCommand extends IdeCommandBase
{
protected function configure(): void
{
$this
->setHidden(AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
$this->acceptApplicationUuid();

}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$cloudApplicationUuid = $this->determineCloudApplication();
$idesResource = new Ides($acquiaCloudClient);
$ide = $this->promptIdeChoice("Select the IDE you'd like to open:", $idesResource, $cloudApplicationUuid);

$this->output->writeln('');
$this->output->writeln("<comment>Your IDE URL:</comment> <href={$ide->links->ide->href}>{$ide->links->ide->href}</>");
$this->output->writeln("<comment>Your Drupal Site URL:</comment> <href={$ide->links->web->href}>{$ide->links->web->href}</>");
$this->output->writeln('Opening your IDE in browser...');

$this->localMachineHelper->startBrowser($ide->links->ide->href);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Constraints\Choice;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;

#[AsCommand(name: 'ide:service-stop', description: 'Stop a service in the Cloud IDE')]
final class IdeServiceStopCommand extends IdeCommandBase
{
protected function configure(): void
{
$this
->addArgument('service', InputArgument::REQUIRED, 'The name of the service to stop')
->addUsage('php')
->addUsage('apache')
->addUsage('mysql')
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->requireCloudIdeEnvironment();
$service = $input->getArgument('service');
$this->validateService($service);

$serviceNameMap = [
'apache' => 'apache2',
'apache2' => 'apache2',
'mysql' => 'mysqld',
'mysqld' => 'mysqld',
'php' => 'php-fpm',
'php-fpm' => 'php-fpm',
];
$output->writeln("Stopping <options=bold>$service</>...");
$serviceName = $serviceNameMap[$service];
$this->stopService($serviceName);
$output->writeln("<info>Stopped <options=bold>$service</></info>");

return Command::SUCCESS;
}

private function validateService(string $service): void
{
$violations = Validation::createValidator()->validate($service, [
new Choice([
'choices' => [
'php',
'php-fpm',
'apache',
'apache2',
'mysql',
'mysqld',
],
'message' => 'Specify a valid service name: php, apache, or mysql',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ide;

use Acquia\Cli\Attribute\RequireAuth;
use AcquiaCloudApi\Endpoints\Applications;
use AcquiaCloudApi\Endpoints\Ides;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ide:list:mine', description: 'List Cloud IDEs belonging to you')]
final class IdeListMineCommand extends IdeCommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$ides = new Ides($acquiaCloudClient);
$accountIdes = $ides->getMine();
$applicationResource = new Applications($acquiaCloudClient);

if (count($accountIdes)) {
$table = new Table($output);
$table->setStyle('borderless');
$table->setHeaders(['IDEs']);
foreach ($accountIdes as $ide) {
$appUrlParts = explode('/', $ide->links->application->href);
$appUuid = end($appUrlParts);
$application = $applicationResource->get($appUuid);
$applicationUrl = str_replace('/api', '/a', $application->links->self->href);

$table->addRows([
["<comment>$ide->label</comment>"],
["UUID: $ide->uuid"],
["Application: <href=$applicationUrl>$application->name</>"],
["Subscription: {$application->subscription->name}"],
["IDE URL: <href={$ide->links->ide->href}>{$ide->links->ide->href}</>"],
["Web URL: <href={$ide->links->web->href}>{$ide->links->web->href}</>"],
new TableSeparator(),
]);
}
$table->render();
} else {
$output->writeln('No IDE exists for your account.');
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Archive;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Output\Checklist;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Closure;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Path;

#[RequireAuth]
#[RequireLocalDb]
#[AsCommand(name: 'archive:export', description: 'Export an archive of the Drupal application including code, files, and database')]
final class ArchiveExportCommand extends CommandBase
{
protected Checklist $checklist;

private Filesystem $fs;




private string|array|bool|null $destinationDir;

private const PUBLIC_FILES_DIR = '/docroot/sites/default/files';

protected function configure(): void
{
$this
->addArgument('destination-dir', InputArgument::REQUIRED, 'The destination directory for the archive file')
->addOption('source-dir', 'dir', InputOption::VALUE_REQUIRED, 'The directory containing the Drupal project to be pushed')
->addOption('no-files', null, InputOption::VALUE_NONE, 'Exclude public files directory from archive')
->addOption('no-database', 'no-db', InputOption::VALUE_NONE, 'Exclude database dump from archive');
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
parent::initialize($input, $output);
$this->fs = $this->localMachineHelper->getFilesystem();
$this->checklist = new Checklist($output);
$this->setDirAndRequireProjectCwd($input);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->determineDestinationDir($input);
$outputCallback = $this->getOutputCallback($output, $this->checklist);

$randomString = (string) random_int(10000, 100000);
$tempDirName = 'acli-archive-' . basename($this->dir) . '-' . time() . '-' . $randomString;
$archiveTempDir = Path::join(sys_get_temp_dir(), $tempDirName);
$this->io->confirm("This will generate a new archive in <options=bold>$this->destinationDir</> containing the contents of your Drupal application at <options=bold>$this->dir</>.\n Do you want to continue?");

$this->checklist->addItem('Removing temporary artifact directory');
$this->checklist->updateProgressBar("Removing $archiveTempDir");
$this->fs->remove($archiveTempDir);
$this->fs->mkdir([$archiveTempDir, $archiveTempDir . '/repository']);
$this->checklist->completePreviousItem();

$this->checklist->addItem('Generating temporary archive directory');
$this->createArchiveDirectory($archiveTempDir . '/repository');
$this->checklist->completePreviousItem();

if (!$input->getOption('no-database')) {
$this->checklist->addItem('Dumping MySQL database');
$this->exportDatabaseToArchiveDir($outputCallback, $archiveTempDir);
$this->checklist->completePreviousItem();
}

$this->checklist->addItem('Compressing archive into a tarball');
$destinationFilepath = $this->compressArchiveDirectory($archiveTempDir, $this->destinationDir, $outputCallback);
$outputCallback('out', "Removing $archiveTempDir");
$this->fs->remove($archiveTempDir);
$this->checklist->completePreviousItem();

$this->io->newLine();
$this->io->success("An archive of your Drupal application was created at $destinationFilepath");
if (AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
$this->io->note('You can download the archive through the Cloud IDE user interface by right-clicking the file in your IDE workspace file browser and selecting "Download."');
}

return Command::SUCCESS;
}

private function determineDestinationDir(InputInterface $input): void
{
$this->destinationDir = $input->getArgument('destination-dir');
if (!$this->fs->exists($this->destinationDir)) {
throw new AcquiaCliException("The destination directory $this->destinationDir does not exist!");
}
}




private function createArchiveDirectory(string $artifactDir): void
{
$this->checklist->updateProgressBar("Mirroring source files from $this->dir to $artifactDir");
$originFinder = $this->localMachineHelper->getFinder();
$originFinder->files()->in($this->dir)

->ignoreDotFiles(false)

->ignoreVCSIgnored(file_exists(Path::join($this->dir, '.gitignore')));
if ($this->input->getOption('no-files')) {
$this->checklist->updateProgressBar('Skipping ' . self::PUBLIC_FILES_DIR);
$originFinder->exclude([self::PUBLIC_FILES_DIR]);
}
$targetFinder = $this->localMachineHelper->getFinder();
$targetFinder->files()->in($artifactDir)->ignoreDotFiles(false);
$this->localMachineHelper->getFilesystem()->remove($targetFinder);
$this->localMachineHelper->getFilesystem()
->mirror($this->dir, $artifactDir, $originFinder, [
'delete' => true,
'override' => true,
]);
}

private function exportDatabaseToArchiveDir(
Closure $outputCallback,
string $archiveTempDir
): void {
if (!$this->getDrushDatabaseConnectionStatus($outputCallback)) {
throw new AcquiaCliException("Could not connect to local database.");
}
$dumpTempFilepath = $this->createMySqlDumpOnLocal(
$this->getLocalDbHost(),
$this->getLocalDbUser(),
$this->getLocalDbName(),
$this->getLocalDbPassword(),
$outputCallback
);
$dumpFilepath = Path::join($archiveTempDir, basename($dumpTempFilepath));
$this->checklist->updateProgressBar("Moving MySQL dump to $dumpFilepath");
$this->fs->rename($dumpTempFilepath, $dumpFilepath);
}

private function compressArchiveDirectory(string $archiveDir, string|bool|array|null $destinationDir, ?Closure $outputCallback = null): string
{
$destinationFilename = basename($archiveDir) . '.tar.gz';
$destinationFilepath = Path::join($destinationDir, $destinationFilename);
$this->localMachineHelper->checkRequiredBinariesExist(['tar']);
$process = $this->localMachineHelper->execute([
'tar',
'-zcvf',
$destinationFilepath,
'--directory',
$archiveDir,
'.',
], $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to create tarball: {message}', ['message' => $process->getErrorOutput()]);
}
return $destinationFilepath;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Push;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Output\Checklist;

abstract class PushCommandBase extends CommandBase
{
protected Checklist $checklist;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Push;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Acquia\Cli\Attribute\RequireRemoteDb;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[RequireLocalDb]
#[RequireRemoteDb]
#[AsCommand(name: 'push:database', description: 'Push a database from your local environment to a Cloud Platform environment', aliases: ['push:db'])]
final class PushDatabaseCommand extends PushCommandBase
{
protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId();
}




protected function execute(InputInterface $input, OutputInterface $output): int
{

$destinationEnvironment = $this->determineEnvironment($input, $output);

$acquiaCloudClient = $this->cloudApiClientService->getClient();
$databases = $this->determineCloudDatabases($acquiaCloudClient, $destinationEnvironment, $input->getArgument('site'));

$database = $databases[0];
if ($database->user_name === null) {
throw new AcquiaCliException('Database connection details missing');
}
$answer = $this->io->confirm("Overwrite the <bg=cyan;options=bold>$database->name</> database on <bg=cyan;options=bold>$destinationEnvironment->name</> with a copy of the database from the current machine?");
if (!$answer) {
return Command::SUCCESS;
}

$this->checklist = new Checklist($output);
$outputCallback = $this->getOutputCallback($output, $this->checklist);

$this->checklist->addItem('Creating local database dump');
$localDumpFilepath = $this->createMySqlDumpOnLocal($this->getLocalDbHost(), $this->getLocalDbUser(), $this->getLocalDbName(), $this->getLocalDbPassword(), $outputCallback);
$this->checklist->completePreviousItem();

$this->checklist->addItem('Uploading database dump to remote machine');
$remoteDumpFilepath = $this->uploadDatabaseDump($destinationEnvironment, $localDumpFilepath, $outputCallback);
$this->checklist->completePreviousItem();

$this->checklist->addItem('Importing database dump into MySQL on remote machine');
$this->importDatabaseDumpOnRemote($destinationEnvironment, $remoteDumpFilepath, $database);
$this->checklist->completePreviousItem();

return Command::SUCCESS;
}

private function uploadDatabaseDump(
EnvironmentResponse $environment,
string $localFilepath,
callable $outputCallback
): string {
$envAlias = self::getEnvironmentAlias($environment);
$remoteFilepath = "/mnt/tmp/$envAlias/" . basename($localFilepath);
$this->logger->debug("Uploading database dump to $remoteFilepath on remote machine");
$this->localMachineHelper->checkRequiredBinariesExist(['rsync']);
$command = [
'rsync',
'-tDvPhe',
'ssh -o StrictHostKeyChecking=no',
$localFilepath,
$environment->sshUrl . ':' . $remoteFilepath,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException(
'Could not upload local database dump: {message}',
['message' => $process->getOutput()]
);
}

return $remoteFilepath;
}

private function importDatabaseDumpOnRemote(EnvironmentResponse $environment, string $remoteDumpFilepath, DatabaseResponse $database): void
{
$this->logger->debug("Importing $remoteDumpFilepath to MySQL on remote machine");
$command = "pv $remoteDumpFilepath --bytes --rate | gunzip | MYSQL_PWD=$database->password mysql --host={$this->getHostFromDatabaseResponse($environment, $database)} --user=$database->user_name {$this->getNameFromDatabaseResponse($database)}";
$process = $this->sshHelper->executeCommand($environment->sshUrl, [$command], ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to import database on remote machine. {message}', ['message' => $process->getErrorOutput()]);
}
}

private function getNameFromDatabaseResponse(DatabaseResponse $database): string
{
$dbUrlParts = explode('/', $database->url);
return end($dbUrlParts);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Push;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'push:code', description: 'Push code from your IDE to a Cloud Platform environment')]
final class PushCodeCommand extends PushCommandBase
{
protected function configure(): void
{
$this
->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && !self::isLandoEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln("Use <options=bold>git</> to push code changes upstream.");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Push;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Output\Checklist;
use Closure;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;

#[AsCommand(name: 'push:artifact', description: 'Build and push a code artifact to a Cloud Platform environment')]
final class PushArtifactCommand extends CommandBase
{





protected array $vendorDirs;






protected array $scaffoldFiles;

private string $composerJsonPath;

private string $docrootPath;

private string $destinationGitRef;

protected Checklist $checklist;

protected function configure(): void
{
$this
->addOption('dir', null, InputArgument::OPTIONAL, 'The directory containing the Drupal project to be pushed')
->addOption('no-sanitize', null, InputOption::VALUE_NONE, 'Do not sanitize the build artifact')
->addOption('dry-run', null, InputOption::VALUE_NONE, 'Deprecated: Use no-push instead')
->addOption('no-push', null, InputOption::VALUE_NONE, 'Do not push changes to Acquia Cloud')
->addOption('no-commit', null, InputOption::VALUE_NONE, 'Do not commit changes. Implies no-push')
->addOption('no-clone', null, InputOption::VALUE_NONE, 'Do not clone repository. Implies no-commit and no-push')
->addOption('destination-git-urls', 'u', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'The URL of your git repository to which the artifact branch will be pushed. Use multiple times for multiple URLs.')
->addOption('destination-git-branch', 'b', InputOption::VALUE_REQUIRED, 'The destination branch to push the artifact to')
->addOption('destination-git-tag', 't', InputOption::VALUE_REQUIRED, 'The destination tag to push the artifact to. Using this option requires also using the --destination-git-branch option')
->addOption('source-git-tag', 's', InputOption::VALUE_REQUIRED, 'Deprecated: Use destination-git-branch instead')
->acceptEnvironmentId()
->acceptSiteInstanceId()
->setHelp('This command builds a sanitized deploy artifact by running <options=bold>composer install</>, removing sensitive files, and committing vendor directories.' . PHP_EOL . PHP_EOL
. 'Vendor directories and scaffold files are committed to the build artifact even if they are ignored in the source repository.' . PHP_EOL . PHP_EOL
. 'To run additional build or sanitization steps (e.g. <options=bold>npm install</>), add a <options=bold>post-install-cmd</> script to your <options=bold>composer.json</> file: https://getcomposer.org/doc/articles/scripts.md#command-events' . PHP_EOL . PHP_EOL
. 'This command is designed for a specific scenario in which there are two branches or repositories involved: a source branch without vendor files committed, and an artifact branch with them. If both your source and destination branches are the same, you should simply use git push instead.')
->addUsage('--destination-git-branch=main-build')
->addUsage('--source-git-tag=foo-build --destination-git-tag=1.0.0')
->addUsage('--destination-git-urls=example@svn-1.prod.hosting.acquia.com:example.git --destination-git-urls=example@svn-2.prod.hosting.acquia.com:example.git --destination-git-branch=main-build');
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
parent::initialize($input, $output);
$this->checklist = new Checklist($output);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);
if ($input->getOption('no-clone')) {
$input->setOption('no-commit', true);
}
if ($input->getOption('no-commit')) {
$input->setOption('no-push', true);
}
$artifactDir = Path::join(sys_get_temp_dir(), 'acli-push-artifact');
$this->composerJsonPath = Path::join($this->dir, 'composer.json');
$this->docrootPath = Path::join($this->dir, 'docroot');
$this->validateSourceCode();

$isDirty = $this->isLocalGitRepoDirty();
$commitHash = $this->getLocalGitCommitHash();
if ($isDirty) {
throw new AcquiaCliException('Pushing code was aborted because your local Git repository has uncommitted changes. Either commit, reset, or stash your changes via git.');
}
$this->checklist = new Checklist($output);
$outputCallback = $this->getOutputCallback($output, $this->checklist);

$destinationGitUrls = [];
$destinationGitRef = '';
if (!$input->getOption('no-clone')) {
$destinationGitUrls = $this->determineDestinationGitUrls();
$destinationGitRef = $this->determineDestinationGitRef();
$sourceGitBranch = $this->determineSourceGitRef();
$destinationGitUrlsString = implode(',', $destinationGitUrls);
$refType = $this->input->getOption('destination-git-tag') ? 'tag' : 'branch';
$this->io->note([
"Acquia CLI will:",
"- git clone $sourceGitBranch from $destinationGitUrls[0]",
"- Compile the contents of $this->dir into an artifact in a temporary directory",
"- Copy the artifact files into the checked out copy of $sourceGitBranch",
"- Commit changes and push the $destinationGitRef $refType to the following git remote(s):",
"  $destinationGitUrlsString",
]);

$this->checklist->addItem('Preparing artifact directory');
$this->cloneSourceBranch($outputCallback, $artifactDir, $destinationGitUrls[0], $sourceGitBranch);
$this->checklist->completePreviousItem();
}

$this->checklist->addItem('Generating build artifact');
$this->buildArtifact($outputCallback, $artifactDir);
$this->checklist->completePreviousItem();

if (!$input->getOption('no-sanitize')) {
$this->checklist->addItem('Sanitizing build artifact');
$this->sanitizeArtifact($outputCallback, $artifactDir);
$this->checklist->completePreviousItem();
}

if (!$input->getOption('no-commit')) {
$this->checklist->addItem("Committing changes (commit hash: $commitHash)");
$this->commit($outputCallback, $artifactDir, $commitHash);
$this->checklist->completePreviousItem();
}

if (!$input->getOption('dry-run') && !$input->getOption('no-push')) {
if ($tagName = $input->getOption('destination-git-tag')) {
$this->checklist->addItem("Creating <options=bold>$tagName</> tag.");
$this->createTag($tagName, $outputCallback, $artifactDir);
$this->checklist->completePreviousItem();
$this->checklist->addItem("Pushing changes to <options=bold>$tagName</> tag.");
$this->pushArtifact($outputCallback, $artifactDir, $destinationGitUrls, $tagName);
} else {
$this->checklist->addItem("Pushing changes to <options=bold>$destinationGitRef</> branch.");
$this->pushArtifact($outputCallback, $artifactDir, $destinationGitUrls, $destinationGitRef . ':' . $destinationGitRef);
}
$this->checklist->completePreviousItem();
} else {
$this->logger->warning("The <options=bold>--dry-run</> (deprecated) or <options=bold>--no-push</> option prevented changes from being pushed to Acquia Cloud. The artifact has been built at <options=bold>$artifactDir</>");
}

return Command::SUCCESS;
}





private function determineDestinationGitUrls(): array
{
if ($this->input->getOption('destination-git-urls')) {
return $this->input->getOption('destination-git-urls');
}
if ($envVar = getenv('ACLI_PUSH_ARTIFACT_DESTINATION_GIT_URLS')) {
return explode(',', $envVar);
}
if ($this->datastoreAcli->get('push.artifact.destination_git_urls')) {
return $this->datastoreAcli->get('push.artifact.destination_git_urls');
}

$applicationUuid = $this->determineCloudApplication();

return $this->determineVcsUrl($this->input, $this->output, $applicationUuid);

throw new AcquiaCliException('No environments found for this application');
}




private function cloneSourceBranch(Closure $outputCallback, string $artifactDir, string $vcsUrl, string $vcsPath): void
{
$fs = $this->localMachineHelper->getFilesystem();

$outputCallback('out', "Removing $artifactDir if it exists");
$fs->remove($artifactDir);

$outputCallback('out', "Initializing Git in $artifactDir");
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$process = $this->localMachineHelper->execute([
'git',
'clone',
'--depth=1',
$vcsUrl,
$artifactDir,
], $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Failed to clone repository from the Cloud Platform: {message}', ['message' => $process->getErrorOutput()]);
}
$process = $this->localMachineHelper->execute([
'git',
'fetch',
'--depth=1',
'--update-head-ok',
$vcsUrl,
$vcsPath . ':' . $vcsPath,
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {


$process = $this->localMachineHelper->execute([
'git',
'checkout',
'-b',
$vcsPath,
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
} else {
$process = $this->localMachineHelper->execute([
'git',
'checkout',
$vcsPath,
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
}
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Could not checkout $vcsPath branch locally: {message}", ['message' => $process->getErrorOutput() . $process->getOutput()]);
}

$outputCallback('out', 'Global .gitignore file is temporarily disabled during artifact builds.');
$this->localMachineHelper->execute([
'git',
'config',
'--local',
'core.excludesFile',
'false',
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
$this->localMachineHelper->execute([
'git',
'config',
'--local',
'core.fileMode',
'true',
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));


$outputCallback('out', 'Removing vendor directories');
foreach ($this->vendorDirs() as $vendorDirectory) {
$fs->remove(Path::join($artifactDir, $vendorDirectory));
}
}




private function buildArtifact(Closure $outputCallback, string $artifactDir): void
{


$outputCallback('out', "Mirroring source files from $this->dir to $artifactDir");
$originFinder = $this->localMachineHelper->getFinder();
$originFinder->in($this->dir)

->ignoreDotFiles(false)

->ignoreVCSIgnored(true);
$targetFinder = $this->localMachineHelper->getFinder();
$targetFinder->in($artifactDir)->ignoreDotFiles(false);
$this->localMachineHelper->getFilesystem()->remove($targetFinder);
$this->localMachineHelper->getFilesystem()
->mirror($this->dir, $artifactDir, $originFinder, ['override' => true]);

$this->localMachineHelper->checkRequiredBinariesExist(['composer']);
$outputCallback('out', 'Installing Composer production dependencies');
$process = $this->localMachineHelper->execute([
'composer',
'install',
'--no-dev',
'--no-interaction',
'--optimize-autoloader',
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Unable to install composer dependencies: {message}", ['message' => $process->getOutput() . $process->getErrorOutput()]);
}
}




private function sanitizeArtifact(Closure $outputCallback, string $artifactDir): void
{
$outputCallback('out', 'Finding Drupal core text files');
$sanitizeFinder = $this->localMachineHelper->getFinder()
->files()
->name('*.txt')
->notName('LICENSE.txt')
->in("$artifactDir/docroot/core");

$outputCallback('out', 'Finding VCS directories');
$vcsFinder = $this->localMachineHelper->getFinder()
->ignoreDotFiles(false)
->ignoreVCS(false)
->directories()
->in([
"$artifactDir/docroot",
"$artifactDir/vendor",
])
->name('.git');
$drushDir = "$artifactDir/drush";
if (file_exists($drushDir)) {
$vcsFinder->in($drushDir);
}
if ($vcsFinder->hasResults()) {
$sanitizeFinder->append($vcsFinder);
}

$outputCallback('out', 'Finding INSTALL database text files');
$dbInstallFinder = $this->localMachineHelper->getFinder()
->files()
->in([$artifactDir])
->name('/INSTALL\.[a-z]+\.(md|txt)$/');
if ($dbInstallFinder->hasResults()) {
$sanitizeFinder->append($dbInstallFinder);
}

$outputCallback('out', 'Finding other common text files');
$filenames = [
'AUTHORS',
'CHANGELOG',
'CONDUCT',
'CONTRIBUTING',
'INSTALL',
'MAINTAINERS',
'PATCHES',
'TESTING',
'UPDATE',
];
$textFileFinder = $this->localMachineHelper->getFinder()
->files()
->in(["$artifactDir/docroot"])
->name('/(' . implode('|', $filenames) . ')\.(md|txt)$/');
if ($textFileFinder->hasResults()) {
$sanitizeFinder->append($textFileFinder);
}

$outputCallback('out', "Removing sensitive files from build");
$this->localMachineHelper->getFilesystem()->remove($sanitizeFinder);
}




private function commit(Closure $outputCallback, string $artifactDir, string $commitHash): void
{
$outputCallback('out', 'Adding and committing changed files');
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$process = $this->localMachineHelper->execute([
'git',
'add',
'-A',
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Could not add files to artifact via git: {message}", ['message' => $process->getErrorOutput() . $process->getOutput()]);
}
foreach (array_merge($this->vendorDirs(), $this->scaffoldFiles($artifactDir)) as $file) {
$this->logger->debug("Forcibly adding $file");
$this->localMachineHelper->execute([
'git',
'add',
'-f',
$file,
], null, $artifactDir, false);
if (!$process->isSuccessful()) {

$this->io->warning("Unable to forcibly add $file to new branch");
}
}
$commitMessage = $this->generateCommitMessage($commitHash);
$process = $this->localMachineHelper->execute([
'git',
'commit',
'-m',
$commitMessage,
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Could not commit via git: {message}", ['message' => $process->getErrorOutput() . $process->getOutput()]);
}
}

private function generateCommitMessage(string $commitHash): array|string
{
if ($envVar = getenv('ACLI_PUSH_ARTIFACT_COMMIT_MSG')) {
return $envVar;
}

return "Automated commit by Acquia CLI (source commit: $commitHash)";
}




private function pushArtifact(Closure $outputCallback, string $artifactDir, array $vcsUrls, string $destGitBranch): void
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
foreach ($vcsUrls as $vcsUrl) {
$outputCallback('out', "Pushing changes to Acquia Git ($vcsUrl)");
$args = [
'git',
'push',
$vcsUrl,
$destGitBranch,
];
$process = $this->localMachineHelper->execute($args, $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Unable to push artifact: {message}", ['message' => $process->getOutput() . $process->getErrorOutput()]);
}
}
}






private function vendorDirs(): array
{
if (!empty($this->vendorDirs)) {
return $this->vendorDirs;
}

$this->vendorDirs = [
'vendor',
];
if (file_exists($this->composerJsonPath)) {
$composerJson = json_decode($this->localMachineHelper->readFile($this->composerJsonPath), true, 512, JSON_THROW_ON_ERROR);

foreach ($composerJson['extra']['installer-paths'] as $path => $type) {
$this->vendorDirs[] = str_replace('/{$name}', '', $path);
}
return $this->vendorDirs;
}
return [];
}






private function scaffoldFiles(string $artifactDir): array
{
if (!empty($this->scaffoldFiles)) {
return $this->scaffoldFiles;
}

$this->scaffoldFiles = [];
$composerJson = json_decode($this->localMachineHelper->readFile(Path::join($artifactDir, 'docroot', 'core', 'composer.json')), true, 512, JSON_THROW_ON_ERROR);
foreach ($composerJson['extra']['drupal-scaffold']['file-mapping'] as $file => $assetPath) {
if (str_starts_with($file, '[web-root]')) {
$this->scaffoldFiles[] = str_replace('[web-root]', 'docroot', $file);
}
}
$this->scaffoldFiles[] = 'docroot/autoload.php';

return $this->scaffoldFiles;
}

private function validateSourceCode(): void
{
$requiredPaths = [
$this->composerJsonPath,
$this->docrootPath,
];
foreach ($requiredPaths as $requiredPath) {
if (!file_exists($requiredPath)) {
throw new AcquiaCliException("Your current directory does not look like a valid Drupal application. $requiredPath is missing.");
}
}
}

private function determineSourceGitRef(): string
{
if ($this->input->getOption('source-git-tag')) {
return $this->input->getOption('source-git-tag');
}
if ($envVar = getenv('ACLI_PUSH_ARTIFACT_SOURCE_GIT_TAG')) {
return $envVar;
}
if ($this->input->getOption('destination-git-branch')) {
return $this->input->getOption('destination-git-branch');
}
if ($this->input->getOption('destination-git-tag')) {
throw new AcquiaCliException('You must also set the --source-git-tag option when setting the --destination-git-tag option.');
}


return $this->destinationGitRef;
}

private function determineDestinationGitRef(): string
{
if ($this->input->getOption('destination-git-tag')) {
$this->destinationGitRef = $this->input->getOption('destination-git-tag');
return $this->destinationGitRef;
}
if ($envVar = getenv('ACLI_PUSH_ARTIFACT_DESTINATION_GIT_TAG')) {
$this->destinationGitRef = $envVar;
return $this->destinationGitRef;
}
if ($this->input->getOption('destination-git-branch')) {
$this->destinationGitRef = $this->input->getOption('destination-git-branch');
return $this->destinationGitRef;
}
if ($envVar = getenv('ACLI_PUSH_ARTIFACT_DESTINATION_GIT_BRANCH')) {
$this->destinationGitRef = $envVar;
return $this->destinationGitRef;
}

$environment = $this->determineEnvironment($this->input, $this->output);
if (str_starts_with($environment->vcs->path, 'tags')) {
throw new AcquiaCliException("You cannot push to an environment that has a git tag deployed to it. Environment $environment->name has {$environment->vcs->path} deployed. Select a different environment.");
}

$this->destinationGitRef = $environment->vcs->path;

return $this->destinationGitRef;
}

private function createTag(mixed $tagName, Closure $outputCallback, string $artifactDir): void
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$process = $this->localMachineHelper->execute([
'git',
'tag',
$tagName,
], $outputCallback, $artifactDir, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL));
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Failed to create Git tag: {message}', ['message' => $process->getErrorOutput()]);
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Push;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Response\EnvironmentResponse;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'push:files', description: 'Copy Drupal public files from your local environment to a Cloud Platform environment')]
final class PushFilesCommand extends PushCommandBase
{
protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);

$destinationEnvironment = $this->determineEnvironment($input, $output);
$chosenSite = $input->getArgument('site');
if (!$chosenSite) {
$chosenSite = $this->promptChooseDrupalSite($destinationEnvironment);
}
$answer = $this->io->confirm("Overwrite the public files directory on <bg=cyan;options=bold>$destinationEnvironment->name</> with a copy of the files from the current machine?");
if (!$answer) {
return Command::SUCCESS;
}

$this->checklist = new Checklist($output);
$this->checklist->addItem('Pushing public files directory to remote machine');
$this->rsyncFilesToCloud($destinationEnvironment, $this->getOutputCallback($output, $this->checklist), $chosenSite);
$this->checklist->completePreviousItem();

return Command::SUCCESS;
}

private function rsyncFilesToCloud(EnvironmentResponse $chosenEnvironment, ?callable $outputCallback = null, ?string $site = null): void
{
$sourceDir = $this->getLocalFilesDir($site);
$destinationDir = $chosenEnvironment->sshUrl . ':' . $this->getCloudFilesDir($chosenEnvironment, $site);

$this->rsyncFiles($sourceDir, $destinationDir, $outputCallback);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:create-upload', description: 'Create an SSH key on your local machine and upload it to the Cloud Platform')]
final class SshKeyCreateUploadCommand extends SshKeyCommandBase
{
protected function configure(): void
{
$this
->addOption('filename', null, InputOption::VALUE_REQUIRED, 'The filename of the SSH key')
->addOption('password', null, InputOption::VALUE_REQUIRED, 'The password for the SSH key')
->addOption('label', null, InputOption::VALUE_REQUIRED, 'The SSH key label to be used with the Cloud Platform')
->addOption('no-wait', null, InputOption::VALUE_NONE, "Don't wait for the SSH key to be uploaded to the Cloud Platform");
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$filename = $this->determineFilename();
$password = $this->determinePassword();
$this->createSshKey($filename, $password);
$publicKey = $this->localMachineHelper->readFile($this->publicSshKeyFilepath);
$chosenLocalKey = basename($this->privateSshKeyFilepath);
$label = $this->determineSshKeyLabel();
$this->uploadSshKey($label, $publicKey);
$this->io->success("Uploaded $chosenLocalKey to the Cloud Platform with label $label");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:create', description: 'Create an SSH key on your local machine')]
final class SshKeyCreateCommand extends SshKeyCommandBase
{
protected function configure(): void
{
$this
->addOption('filename', null, InputOption::VALUE_REQUIRED, 'The filename of the SSH key')
->addOption('password', null, InputOption::VALUE_REQUIRED, 'The password for the SSH key');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$filename = $this->determineFilename();
$password = $this->determinePassword();
$this->createSshKey($filename, $password);
$output->writeln('<info>Created new SSH key.</info> ' . $this->publicSshKeyFilepath);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:upload', description: 'Upload a local SSH key to the Cloud Platform')]
final class SshKeyUploadCommand extends SshKeyCommandBase
{
protected function configure(): void
{
$this
->addOption('filepath', null, InputOption::VALUE_REQUIRED, 'The filepath of the public SSH key to upload')
->addOption('label', null, InputOption::VALUE_REQUIRED, 'The SSH key label to be used with the Cloud Platform')
->addOption('no-wait', null, InputOption::VALUE_NONE, "Don't wait for the SSH key to be uploaded to the Cloud Platform");
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
[$chosenLocalKey, $publicKey] = $this->determinePublicSshKey();
$label = $this->determineSshKeyLabel();
$this->uploadSshKey($label, $publicKey);
$this->io->success("Uploaded $chosenLocalKey to the Cloud Platform with label $label");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Endpoints\SshKeys;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\TableSeparator;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:info', description: 'Print information about an SSH key')]
final class SshKeyInfoCommand extends SshKeyCommandBase
{
protected function configure(): void
{
$this
->addOption('fingerprint', null, InputOption::VALUE_REQUIRED, 'sha256 fingerprint')
->addUsage('--fingerprint=pyarUa1mt2ln4fmrp7alWKpv1IPneqFwE+ErTC71IvY=');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$key = $this->determineSshKey($acquiaCloudClient);
if (empty($key)) {
throw new AcquiaCliException('No valid SSH key found.');
}
$location = 'Local';
if (array_key_exists('cloud', $key)) {
$location = array_key_exists('local', $key) ? 'Local + Cloud' : 'Cloud';
}
$this->io->definitionList(
['SSH key property' => 'SSH key value'],
new TableSeparator(),
['Location' => $location],
['Fingerprint (sha256)' => $key['fingerprint']],
['Fingerprint (md5)' => array_key_exists('cloud', $key) ? $key['cloud']['fingerprint'] : 'n/a'],
['UUID' => array_key_exists('cloud', $key) ? $key['cloud']['uuid'] : 'n/a'],
['Label' => array_key_exists('cloud', $key) ? $key['cloud']['label'] : $key['local']['filename']],
['Created at' => array_key_exists('cloud', $key) ? $key['cloud']['created_at'] : 'n/a'],
);

$this->io->writeln("Public key\n----------");
$this->io->writeln($key['public_key']);
return Command::SUCCESS;
}




private function determineSshKey(mixed $acquiaCloudClient): array
{
$cloudKeysResponse = new SshKeys($acquiaCloudClient);
$cloudKeys = $cloudKeysResponse->getAll();
$localKeys = $this->findLocalSshKeys();
$keys = [];

foreach ($cloudKeys as $key) {
$fingerprint = self::getFingerprint($key->public_key);
if (!empty($fingerprint)) {
$keys[$fingerprint]['fingerprint'] = $fingerprint;
$keys[$fingerprint]['public_key'] = $key->public_key;
$keys[$fingerprint]['cloud'] = [
'created_at' => $key->created_at,
'fingerprint' => $key->fingerprint,
'label' => $key->label,
'uuid' => $key->uuid,
];
}
}
foreach ($localKeys as $key) {
$fingerprint = self::getFingerprint($key->getContents());
if (!empty($fingerprint)) {
$keys[$fingerprint]['fingerprint'] = $fingerprint;
$keys[$fingerprint]['public_key'] = $key->getContents();
$keys[$fingerprint]['local'] = [
'filename' => $key->getFilename(),
];
}
}
if ($fingerprint = $this->input->getOption('fingerprint')) {
if (!array_key_exists($fingerprint, $keys)) {
throw new AcquiaCliException('No key exists matching provided fingerprint');
}
return $keys[$fingerprint];
}
if (count($keys) > 0) {
return $this->promptChooseFromObjectsOrArrays(
$keys,
'fingerprint',
'fingerprint',
'Choose an SSH key to view'
);
} else {
return [];
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Helpers\SshCommandTrait;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:delete', description: 'Delete an SSH key')]
final class SshKeyDeleteCommand extends SshKeyCommandBase
{
use SshCommandTrait;

protected function configure(): void
{
$this
->addOption('cloud-key-uuid', 'uuid', InputOption::VALUE_REQUIRED);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
return $this->deleteSshKeyFromCloud($output, $input->getOption('cloud-key-uuid'));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Attribute\RequireAuth;
use AcquiaCloudApi\Endpoints\SshKeys;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'ssh-key:list', description: 'List your local and remote SSH keys')]
final class SshKeyListCommand extends SshKeyCommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$sshKeys = new SshKeys($acquiaCloudClient);
$cloudKeys = $sshKeys->getAll();
$localKeys = $this->findLocalSshKeys();
$table = $this->createSshKeyTable($output, 'Cloud Platform keys with matching local keys');
foreach ($localKeys as $localIndex => $localFile) {

foreach ($cloudKeys as $index => $cloudKey) {
if (trim($localFile->getContents()) === trim($cloudKey->public_key)) {
$hash = self::getFingerprint($cloudKey->public_key);
$table->addRow([
$cloudKey->label,
$localFile->getFilename(),
$hash,
]);
unset($cloudKeys[$index], $localKeys[$localIndex]);
break;
}
}
}
$table->render();
$this->io->newLine();

$table = $this->createSshKeyTable($output, 'Cloud Platform keys with no matching local keys');
foreach ($cloudKeys as $cloudKey) {
$hash = self::getFingerprint($cloudKey->public_key);
$table->addRow([
$cloudKey->label,
'none',
$hash,
]);
}
$table->render();
$this->io->newLine();

$table = $this->createSshKeyTable($output, 'Local keys with no matching Cloud Platform keys');
foreach ($localKeys as $localFile) {
$hash = self::getFingerprint($localFile->getContents());
$table->addRow([
'none',
$localFile->getFilename(),
$hash,
]);
}
$table->render();

return Command::SUCCESS;
}

private function createSshKeyTable(OutputInterface $output, string $title): Table
{
$headers = [
'Cloud Platform label',
'Local filename',
'Fingerprint (sha256)',
];
$widths = [.4, .2, .2];
return $this->createTable($output, $title, $headers, $widths);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Ssh;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\SshCommandTrait;
use Acquia\Cli\Output\Spinner\Spinner;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\SshKeys;
use React\EventLoop\Loop;
use RuntimeException;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Validation;
use Zumba\Amplitude\Amplitude;

abstract class SshKeyCommandBase extends CommandBase
{
use SshCommandTrait;

protected string $passphraseFilepath;

protected string $privateSshKeyFilename;

protected string $privateSshKeyFilepath;

protected string $publicSshKeyFilepath;

protected function setSshKeyFilepath(string $privateSshKeyFilename): void
{
$this->privateSshKeyFilename = $privateSshKeyFilename;
$this->privateSshKeyFilepath = $this->sshDir . '/' . $this->privateSshKeyFilename;
$this->publicSshKeyFilepath = $this->privateSshKeyFilepath . '.pub';
}

protected static function getIdeSshKeyLabel(string $ideLabel, string $ideUuid): string
{
return self::normalizeSshKeyLabel('IDE_' . $ideLabel . '_' . $ideUuid);
}

private static function normalizeSshKeyLabel(?string $label): string|null
{
if (is_null($label)) {
throw new RuntimeException('The label cannot be empty');
}

return preg_replace('/\W/', '', $label);
}





protected function normalizePublicSshKey(string $publicKey): string
{
$parts = explode('== ', $publicKey);
$key = $parts[0];

return trim($key);
}




protected function sshKeyIsAddedToKeychain(): bool
{
$process = $this->localMachineHelper->execute([
'ssh-add',
'-L',
], null, null, false);

if ($process->isSuccessful()) {
$keyContents = $this->normalizePublicSshKey($this->localMachineHelper->readFile($this->publicSshKeyFilepath));
return str_contains($process->getOutput(), $keyContents);
}
return false;
}






protected function addSshKeyToAgent(string $filepath, string $password): void
{


$tempFilepath = $this->localMachineHelper->getFilesystem()
->tempnam(sys_get_temp_dir(), 'acli');
$this->localMachineHelper->writeFile($tempFilepath, <<<'EOT'
#!/usr/bin/env bash
echo $SSH_PASS
EOT
);
$this->localMachineHelper->getFilesystem()->chmod($tempFilepath, 0755);
$privateKeyFilepath = str_replace('.pub', '', $filepath);
$command = 'SSH_PASS="${:SSH_PASS}" DISPLAY=1 SSH_ASKPASS="${:SSH_ASKPASS}" ssh-add "${:PRIVATE_KEY_FILEPATH}"';
$env = [
'PRIVATE_KEY_FILEPATH' => $privateKeyFilepath,
'SSH_ASKPASS' => $tempFilepath,
'SSH_PASS' => $password,
];
$process = $this->localMachineHelper->executeFromCmd($command, null, null, false, null, $env);
$this->localMachineHelper->getFilesystem()->remove($tempFilepath);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to add the SSH key to local SSH agent:' . $process->getOutput() . $process->getErrorOutput());
}
}

/**
@infection-ignore-all



*/
protected function pollAcquiaCloudUntilSshSuccess(
OutputInterface $output
): void {

$timers = [];
$startTime = time();
$cloudAppUuid = $this->determineCloudApplication(true);
$permissions = $this->cloudApiClientService->getClient()
->request('get', "/applications/$cloudAppUuid/permissions");
$perms = array_column($permissions, 'name');
$mappings = $this->checkPermissions($perms, $cloudAppUuid, $output);
foreach ($mappings as $envName => $config) {
$spinner = new Spinner($output, 4);
$spinner->setMessage("Waiting for the key to become available in Cloud Platform $envName environments");
$spinner->start();
$mappings[$envName]['timer'] = Loop::addPeriodicTimer(
$spinner->interval(),
static function () use ($spinner): void {
$spinner->advance();
}
);
$mappings[$envName]['spinner'] = $spinner;
}
$callback = function () use ($output, &$mappings, &$timers, $startTime): void {
foreach ($mappings as $envName => $config) {
try {
$process = $this->sshHelper->executeCommand($config['ssh_target'], ['ls'], false);
if (($process->getExitCode() === 128 && $envName === 'git') || $process->isSuccessful()) {

$config['spinner']->finish();
Loop::cancelTimer($config['timer']);
unset($mappings[$envName]);
} else {

$this->logger->debug($process->getOutput() . $process->getErrorOutput());
}
} catch (AcquiaCliException $exception) {
$this->logger->debug($exception->getMessage());
}
}
if (empty($mappings)) {

Amplitude::getInstance()
->queueEvent('SSH key upload', [
'duration' => time() - $startTime,
'result' => 'success',
]);
$output->writeln("\n<info>Your SSH key is ready for use!</info>\n");
foreach ($timers as $timer) {
Loop::cancelTimer($timer);
}
$timers = [];
}
};

$timers[] = Loop::addPeriodicTimer(5, $callback);
$timers[] = Loop::addTimer(0.1, $callback);
$timers[] = Loop::addTimer(60 * 60, static function () use ($output, &$timers): void {

$output->writeln("\n<comment>This is taking longer than usual. It will happen eventually!</comment>\n");
Amplitude::getInstance()
->queueEvent('SSH key upload', ['result' => 'timeout']);
foreach ($timers as $timer) {
Loop::cancelTimer($timer);
}
$timers = [];
});
Loop::run();
}




private function checkPermissions(array $userPerms, string $cloudAppUuid, OutputInterface $output): array
{
$mappings = [];
$requiredPerms = [
'add ssh key to git',
'add ssh key to non-prod',
'add ssh key to prod',
];
foreach ($requiredPerms as $index => $requiredPerm) {
if (in_array($requiredPerm, $userPerms, true)) {
switch ($requiredPerm) {
case 'add ssh key to git':
if ($fullUrl = $this->getAnyVcsUrl($cloudAppUuid)) {
$urlParts = explode(':', $fullUrl);
$mappings['git']['ssh_target'] = $urlParts[0];
}
break;
case 'add ssh key to non-prod':
if ($nonProdEnv = $this->getAnyNonProdAhEnvironment($cloudAppUuid)) {
$mappings['nonprod']['ssh_target'] = $nonProdEnv->sshUrl;
}
break;
case 'add ssh key to prod':
if ($prodEnv = $this->getAnyProdAhEnvironment($cloudAppUuid)) {
$mappings['prod']['ssh_target'] = $prodEnv->sshUrl;
}
break;
}
unset($requiredPerms[$index]);
}
}
if (!empty($requiredPerms)) {
$permString = implode(", ", $requiredPerms);
$output->writeln('<comment>You do not have access to some environments on this application.</comment>');
$output->writeln("<comment>Check that you have the following permissions: <options=bold>$permString</></comment>");
}
return $mappings;
}

protected function createSshKey(string $filename, string $password): string
{
$keyFilePath = $this->doCreateSshKey($filename, $password);
$this->setSshKeyFilepath(basename($keyFilePath));
if (!$this->sshKeyIsAddedToKeychain()) {
$this->addSshKeyToAgent($this->publicSshKeyFilepath, $password);
}
return $keyFilePath;
}

private function doCreateSshKey(string $filename, string $password): string
{
$filepath = $this->sshDir . '/' . $filename;
if (file_exists($filepath)) {
throw new AcquiaCliException('An SSH key with the filename {filepath} already exists. Delete it and retry', ['filepath' => $filename]);
}

$this->localMachineHelper->checkRequiredBinariesExist(['ssh-keygen']);
$process = $this->localMachineHelper->execute([
'ssh-keygen',
'-t',
'rsa',
'-b',
'4096',
'-f',
$filepath,
'-N',
$password,
], null, null, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException($process->getOutput() . $process->getErrorOutput());
}

return $filepath;
}

protected function determineFilename(): string
{
return $this->determineOption(
'filename',
false,
$this->validateFilename(...),
static function (mixed $value) {
return $value ? trim($value) : '';
},
'id_rsa_acquia'
);
}

private function validateFilename(string $filename): string
{
$violations = Validation::createValidator()->validate($filename, [
new Length(['min' => 5]),
new NotBlank(),
new Regex([
'message' => 'The value may not contain spaces',
'pattern' => '/^\S*$/',
]),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}

return $filename;
}

protected function determinePassword(): string
{
return $this->determineOption(
'password',
true,
$this->validatePassword(...),
static function (mixed $value) {
return $value ? trim($value) : '';
}
);
}

private function validatePassword(string $password): string
{
$violations = Validation::createValidator()->validate($password, [
new Length(['min' => 5]),
new NotBlank(),
]);
if (count($violations)) {
throw new ValidatorException($violations->get(0)->getMessage());
}

return $password;
}

private function keyHasUploaded(Client $acquiaCloudClient, string $publicKey): bool
{
$sshKeys = new SshKeys($acquiaCloudClient);
foreach ($sshKeys->getAll() as $cloudKey) {
if (trim($cloudKey->public_key) === trim($publicKey)) {
return true;
}
}
return false;
}





protected function determinePublicSshKey(?string $filepath = null): array
{
if ($filepath) {
$filepath = $this->localMachineHelper->getLocalFilepath($filepath);
} elseif ($this->input->hasOption('filepath') && $this->input->getOption('filepath')) {
$filepath = $this->localMachineHelper->getLocalFilepath($this->input->getOption('filepath'));
}

if ($filepath) {
if (
!$this->localMachineHelper->getFilesystem()
->exists($filepath)
) {
throw new AcquiaCliException('The filepath {filepath} is not valid', ['filepath' => $filepath]);
}
if (!str_contains($filepath, '.pub')) {
throw new AcquiaCliException('The filepath {filepath} does not have the .pub extension', ['filepath' => $filepath]);
}
$publicKey = $this->localMachineHelper->readFile($filepath);
$chosenLocalKey = basename($filepath);
} else {

$localKeys = $this->findLocalSshKeys();
$chosenLocalKey = $this->promptChooseLocalSshKey($localKeys);
$publicKey = $this->getLocalSshKeyContents($localKeys, $chosenLocalKey);
}

return [$chosenLocalKey, $publicKey];
}

private function promptChooseLocalSshKey(array $localKeys): string
{
$labels = [];
foreach ($localKeys as $localKey) {
$labels[] = $localKey->getFilename();
}
$question = new ChoiceQuestion(
'Choose a local SSH key to upload to the Cloud Platform',
$labels
);
return $this->io->askQuestion($question);
}

protected function determineSshKeyLabel(): string
{
return $this->determineOption('label', false, $this->validateSshKeyLabel(...), $this->normalizeSshKeyLabel(...));
}

private function validateSshKeyLabel(mixed $label): mixed
{
if (trim($label) === '') {
throw new RuntimeException('The label cannot be empty');
}

return $label;
}

private function getLocalSshKeyContents(array $localKeys, string $chosenLocalKey): string
{
$filepath = '';
foreach ($localKeys as $localKey) {
if ($localKey->getFilename() === $chosenLocalKey) {
$filepath = $localKey->getRealPath();
break;
}
}
return $this->localMachineHelper->readFile($filepath);
}

protected function uploadSshKey(string $label, string $publicKey): void
{

$sshKeys = new SshKeys($this->cloudApiClientService->getClient());
$sshKeys->create($label, $publicKey);


if ($this->input->hasOption('no-wait') && $this->input->getOption('no-wait') === false) {
if ($this->input->isInteractive() && !$this->promptWaitForSsh($this->io)) {
$this->io->success('Your SSH key has been successfully uploaded to the Cloud Platform.');
return;
}

if ($this->keyHasUploaded($this->cloudApiClientService->getClient(), $publicKey)) {
$this->pollAcquiaCloudUntilSshSuccess($this->output);
}
}
}

public static function getFingerprint(mixed $sshPublicKey): string
{
$content = explode(' ', $sshPublicKey, 3);
if (empty($content[1])) {
return '';
}
return base64_encode(hash('sha256', base64_decode($content[1]), true));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

use Acquia\Cli\Command\WizardCommandBase;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\Account;
use AcquiaCloudApi\Response\AccountResponse;
use DateTime;
use Gitlab\Exception\ValidationFailedException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'codestudio:wizard', description: 'Create and/or configure a new Code Studio project for a given Cloud Platform application', aliases: ['cs:wizard'])]
final class CodeStudioWizardCommand extends WizardCommandBase
{
use CodeStudioCommandTrait;

private Checklist $checklist;

protected function configure(): void
{
$this
->addOption('key', null, InputOption::VALUE_REQUIRED, 'The Cloud Platform API token that Code Studio will use')
->addOption('secret', null, InputOption::VALUE_REQUIRED, 'The Cloud Platform API secret that Code Studio will use')
->addOption('gitlab-token', null, InputOption::VALUE_REQUIRED, 'The GitLab personal access token that will be used to communicate with the GitLab instance')
->addOption('gitlab-project-id', null, InputOption::VALUE_REQUIRED, 'The project ID (an integer) of the GitLab project to configure.')
->addOption('gitlab-host-name', null, InputOption::VALUE_REQUIRED, 'The GitLab hostname.');
$this->acceptApplicationUuid();
$this->acceptCodebaseId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->checklist = new Checklist($output);
$this->authenticateWithGitLab();
$this->writeApiTokenMessage($input);
$cloudKey = $this->determineApiKey();
$cloudSecret = $this->determineApiSecret();



$this->reAuthenticate($cloudKey, $cloudSecret, $this->cloudCredentials->getBaseUri(), $this->cloudCredentials->getAccountsUri());
$entityType = EntityType::Application;
$projectSelected = null;
$mysqlVersion = null;
$phpVersion = null;
$nodeVersion = null;
$nodeHostingType = null;
$project = null;

$customerCodebases = $this->getCloudCodebases();
if ($customerCodebases->count() > 0) {
$entityType = $this->promptForEntityType();
}

if ($entityType === EntityType::Application) {
$projectSelected = $this->promptForProjectType();
if ($projectSelected === "Drupal_project") {
$mysqlVersion = $this->promptForMysqlVersions();
$phpVersion = $this->promptForPhpVersions();
} else {
$nodeHostingType = $this->promptForNodeHostingType();
$nodeVersion = $this->promptForNodeVersions();
}
} else {
$this->io->writeln("Selected Drupal project by default for Codebases");
$projectSelected = "Drupal_project";
$mysqlVersion = $this->promptForMysqlVersions();
$phpVersion = $this->promptForPhpVersions();
}

$cloudUuid = null;
$entityName = null;

[$acquiaCloudClient, $account] = $this->getCloudAccount();

if ($entityType == EntityType::Codebase) {
[$cloudUuid, $entityName, $project] = $this->handleCodebaseEntity($entityType);
} else {
[$cloudUuid, $entityName, $project] = $this->handleApplicationEntity($acquiaCloudClient, $account, $entityType);
}

$this->io->writeln([
"\nThis command will configure the Code Studio project <comment>{$project['path_with_namespace']}</comment> for automatic deployment to the",
"Acquia Cloud Platform $entityType->value <comment>$entityName</comment> (<comment>$cloudUuid</comment>)",
"using credentials (API Token and SSH Key) belonging to <comment>$account->mail</comment>.",
"",
"If the <comment>$account->mail</comment> Cloud account is deleted in the future, this Code Studio project will need to be re-configured.",
]);
$answer = $this->io->confirm('Do you want to continue?');
if (!$answer) {
return Command::SUCCESS;
}

$projectAccessTokenName = 'acquia-codestudio';
$projectAccessToken = $this->createProjectAccessToken($project, $projectAccessTokenName);
$this->updateGitLabProject($project);
switch ($projectSelected) {
case "Drupal_project":
$this->setGitLabCiCdVariablesForPhpProject($project, $entityType, $cloudUuid, $cloudKey, $cloudSecret, $projectAccessTokenName, $projectAccessToken, $mysqlVersion, $phpVersion);
$this->createScheduledPipeline($project);
break;
case "Node_project":
$parameters = [
'ci_config_path' => 'gitlab-ci/Auto-DevOps.acquia.gitlab-ci.yml@acquia/node-template',
];
$client = $this->getGitLabClient();
$client->projects()->update($project['id'], $parameters);
$this->setGitLabCiCdVariablesForNodeProject($project, $cloudUuid, $cloudKey, $cloudSecret, $projectAccessTokenName, $projectAccessToken, $nodeVersion, $nodeHostingType);
break;
}

$this->io->success([
"Successfully configured the Code Studio project!",
"This project will now use Acquia's Drupal optimized AutoDevOps to build, test, and deploy your code automatically to Acquia Cloud Platform via CI/CD pipelines.",
"You can visit it here:",
$project['web_url'],
"",
"Next, you should use git to push code to your Code Studio project. E.g.,",
"  git remote add codestudio {$project['http_url_to_repo']}",
"  git push codestudio",
]);
$this->io->note(["If the $account->mail Cloud account is deleted in the future, this Code Studio project will need to be re-configured."]);

return Command::SUCCESS;
}




private function getGitLabScheduleByDescription(array $project, string $scheduledPipelineDescription): ?array
{
$existingSchedules = $this->gitLabClient->schedules()
->showAll($project['id']);
foreach ($existingSchedules as $schedule) {
if ($schedule['description'] == $scheduledPipelineDescription) {
return $schedule;
}
}
return null;
}




private function getGitLabProjectAccessTokenByName(array $project, string $name): ?array
{
$existingProjectAccessTokens = $this->gitLabClient->projects()
->projectAccessTokens($project['id']);
foreach ($existingProjectAccessTokens as $key => $token) {
if ($token['name'] == $name) {
return $token;
}
}
return null;
}




private function getListOfProjectType(): array
{
return [
'Drupal_project',
'Node_project',
];
}

private function createProjectAccessToken(array $project, string $projectAccessTokenName): string
{
$this->io->writeln("Creating project access token...");

if ($existingToken = $this->getGitLabProjectAccessTokenByName($project, $projectAccessTokenName)) {
$this->checklist->addItem("Deleting access token named <comment>$projectAccessTokenName</comment>");
$this->gitLabClient->projects()
->deleteProjectAccessToken($project['id'], $existingToken['id']);
$this->checklist->completePreviousItem();
}
$this->checklist->addItem("Creating access token named <comment>$projectAccessTokenName</comment>");
$projectAccessToken = $this->gitLabClient->projects()
->createProjectAccessToken($project['id'], [
'expires_at' => new DateTime('+365 days'),
'name' => $projectAccessTokenName,
'scopes' => ['api', 'write_repository'],
]);
$this->checklist->completePreviousItem();
return $projectAccessToken['token'];
}

private function setGitLabCiCdVariablesForPhpProject(array $project, EntityType $entityType, string $cloudUuid, string $cloudKey, string $cloudSecret, string $projectAccessTokenName, string $projectAccessToken, string $mysqlVersion, string $phpVersion): void
{
$this->io->writeln("Setting GitLab CI/CD variables for {$project['path_with_namespace']}..");
$gitlabCicdVariables = CodeStudioCiCdVariables::getDefaultsForPhp($entityType, $cloudUuid, $cloudKey, $cloudSecret, $projectAccessTokenName, $projectAccessToken, $mysqlVersion, $phpVersion);
$gitlabCicdExistingVariables = $this->gitLabClient->projects()
->variables($project['id']);
$gitlabCicdExistingVariablesKeyed = [];
foreach ($gitlabCicdExistingVariables as $variable) {
$key = $variable['key'];
$gitlabCicdExistingVariablesKeyed[$key] = $variable;
}

foreach ($gitlabCicdVariables as $variable) {
$this->checklist->addItem("Setting GitLab CI/CD variables for <comment>{$variable['key']}</comment>");
if (!array_key_exists($variable['key'], $gitlabCicdExistingVariablesKeyed)) {
$this->gitLabClient->projects()
->addVariable($project['id'], $variable['key'], $variable['value'], $variable['protected'], null, [
'masked' => $variable['masked'],
'variable_type' => $variable['variable_type'],
]);
} else {
$this->gitLabClient->projects()
->updateVariable($project['id'], $variable['key'], $variable['value'], $variable['protected'], null, [
'masked' => $variable['masked'],
'variable_type' => $variable['variable_type'],
]);
}
$this->checklist->completePreviousItem();
}
}

private function setGitLabCiCdVariablesForNodeProject(array $project, string $cloudApplicationUuid, string $cloudKey, string $cloudSecret, string $projectAccessTokenName, string $projectAccessToken, string $nodeVersion, string $nodeHostingType): void
{
$this->io->writeln("Setting GitLab CI/CD variables for {$project['path_with_namespace']}..");
$gitlabCicdVariables = CodeStudioCiCdVariables::getDefaultsForNode($cloudApplicationUuid, $cloudKey, $cloudSecret, $projectAccessTokenName, $projectAccessToken, $nodeVersion, $nodeHostingType);
$gitlabCicdExistingVariables = $this->gitLabClient->projects()
->variables($project['id']);
$gitlabCicdExistingVariablesKeyed = [];
foreach ($gitlabCicdExistingVariables as $variable) {
$key = $variable['key'];
$gitlabCicdExistingVariablesKeyed[$key] = $variable;
}

foreach ($gitlabCicdVariables as $variable) {
$this->checklist->addItem("Setting CI/CD variable <comment>{$variable['key']}</comment>");
if (!array_key_exists($variable['key'], $gitlabCicdExistingVariablesKeyed)) {
$this->gitLabClient->projects()
->addVariable($project['id'], $variable['key'], $variable['value'], $variable['protected'], null, [
'masked' => $variable['masked'],
'variable_type' => $variable['variable_type'],
]);
} else {
$this->gitLabClient->projects()
->updateVariable($project['id'], $variable['key'], $variable['value'], $variable['protected'], null, [
'masked' => $variable['masked'],
'variable_type' => $variable['variable_type'],
]);
}
$this->checklist->completePreviousItem();
}
}

private function createScheduledPipeline(array $project): void
{
$this->io->writeln("Creating scheduled pipeline");
$scheduledPipelineDescription = "Code Studio Automatic Updates";

if (!$this->getGitLabScheduleByDescription($project, $scheduledPipelineDescription)) {
$this->checklist->addItem("Creating scheduled pipeline <comment>$scheduledPipelineDescription</comment>");
$pipeline = $this->gitLabClient->schedules()
->create($project['id'], [

'cron' => '0 0 * * 4',
'description' => $scheduledPipelineDescription,
'ref' => $project['default_branch'],
]);
$this->gitLabClient->schedules()
->addVariable($project['id'], $pipeline['id'], [
'key' => 'ACQUIA_JOBS_DEPRECATED_UPDATE',
'value' => 'true',
]);
$this->gitLabClient->schedules()
->addVariable($project['id'], $pipeline['id'], [
'key' => 'ACQUIA_JOBS_COMPOSER_UPDATE',
'value' => 'true',
]);
} else {
$this->checklist->addItem("Scheduled pipeline named <comment>$scheduledPipelineDescription</comment> already exists");
}
$this->checklist->completePreviousItem();
}

private function updateGitLabProject(array $project): void
{

if ($project['description'] !== $this->gitLabProjectDescription) {
$this->gitLabClient->projects()
->update($project['id'], $this->getGitLabProjectDefaults());
try {
$this->gitLabClient->projects()
->uploadAvatar($project['id'], __DIR__ . '/drupal_icon.png');
} catch (ValidationFailedException) {
$this->io->warning("Failed to upload project avatar");
}
}
}




private function promptForEntityType(): EntityType
{
$entityTypes = EntityType::cases();
$entityTypeChoices = array_map(fn(EntityType $type) => $type->value, $entityTypes);
$selectedChoice = $this->io->choice('Select the type of project you want to create', $entityTypeChoices, EntityType::Application->value);
return EntityType::from($selectedChoice);
}




private function promptForProjectType(): string
{
$projectType = $this->getListOfProjectType();
return $this->io->choice('Select a project type', $projectType, "Drupal_project");
}






private function promptForPhpVersions(): string
{
$phpVersions = [
'PHP_version_8.2' => "8.2",
'PHP_version_8.3' => "8.3",
'PHP_version_8.4' => "8.4",
];
$phpChoice = $this->io->choice('Select a PHP version', array_values($phpVersions), "8.3");
$phpKey = array_search($phpChoice, $phpVersions, true);
return $phpVersions[$phpKey];
}






private function promptForMysqlVersions(): string
{
$mysqlVersions = [
'MYSQL_version_5.7' => "5.7",
'MYSQL_version_8.0' => "8.0",
];
$mysqlChoice = $this->io->choice('Select a MySQL version', array_values($mysqlVersions), "8.0");
$mysqlKey = array_search($mysqlChoice, $mysqlVersions, true);
return $mysqlVersions[$mysqlKey];
}






private function promptForNodeHostingType(): string
{
$nodeHostingTypes = [
'advanced' => "Advanced Frontend Hosting",
'basic' => "Basic Frontend Hosting",
];
$hostingChoice = $this->io->choice('Select a NODE hosting type', array_values($nodeHostingTypes), "Basic Frontend Hosting");
return array_search($hostingChoice, $nodeHostingTypes, true);
}






private function promptForNodeVersions(): string
{
$nodeVersions = [
'NODE_version_20' => "20",
'NODE_version_22' => "22",
];
$nodeChoice = $this->io->choice('Select a NODE version', array_values($nodeVersions), "20");
$nodeKey = array_search($nodeChoice, $nodeVersions, true);
return $nodeVersions[$nodeKey];
}






private function getCloudAccount(): array
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$accountAdapter = new Account($acquiaCloudClient);
return [$acquiaCloudClient, $accountAdapter->get()];
}






private function handleApplicationEntity(Client $acquiaCloudClient, AccountResponse $account, EntityType $entityType): array
{
$cloudUuid = $this->determineCloudApplication();
$this->validateRequiredCloudPermissions(
$acquiaCloudClient,
$cloudUuid,
$account,
self::getRequiredCloudPermissions()
);
$this->setGitLabProjectDescription($entityType, $cloudUuid);
$cloudEntity = $this->getCloudApplication($cloudUuid);
$entityName = $cloudEntity->name;
$project = $this->determineGitLabProject($entityType, $cloudEntity);
return [$cloudUuid, $entityName, $project];
}






private function handleCodebaseEntity(EntityType $entityType): array
{
$cloudUuid = $this->determineCloudCodebase();
$this->setGitLabProjectDescription($entityType, $cloudUuid);
$cloudEntity = $this->getCloudCodebase($cloudUuid);
$entityName = $cloudEntity->label;
$project = $this->determineGitLabProject($entityType, $cloudEntity);
return [$cloudUuid, $entityName, $project];
}






private function getRequiredCloudPermissions(): array
{
return [
'deploy to non-prod',
'add ssh key to git',
'add ssh key to non-prod',
'add an environment',
'delete an environment',
'administer environment variables on non-prod',
];
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

use Acquia\Cli\Exception\AcquiaCliException;
use Gitlab\Client;
use Gitlab\Exception\RuntimeException;
use Gitlab\Exception\ValidationFailedException;
use Gitlab\HttpClient\Builder;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\String\Slugger\AsciiSlugger;

trait CodeStudioCommandTrait
{
protected string $gitLabToken;

protected string $gitLabHost;

protected Client $gitLabClient;




protected array $gitLabAccount;

private string $gitLabProjectDescription;




private function getGitLabToken(string $gitlabHost): string
{
if ($this->input->getOption('gitlab-token')) {
return $this->input->getOption('gitlab-token');
}
if (!$this->localMachineHelper->commandExists('glab')) {
throw new AcquiaCliException("Install glab to continue: https://gitlab.com/gitlab-org/cli#installation");
}
$process = $this->localMachineHelper->execute([
'glab',
'config',
'get',
'token',
'--host=' . $gitlabHost,
], null, null, false);
if ($process->isSuccessful() && trim($process->getOutput())) {
return trim($process->getOutput());
}

$this->io->writeln([
"",
"You must first authenticate with Code Studio by creating a personal access token:",
"* Visit https://$gitlabHost/-/profile/personal_access_tokens",
"* Create a token and grant it both <comment>api</comment> and <comment>write repository</comment> scopes",
"* Copy the token to your clipboard",
"* Run <comment>glab auth login --hostname=$gitlabHost</comment> and paste the token when prompted",
"* Try this command again.",
]);

throw new AcquiaCliException("Could not determine GitLab token");
}




private function getGitLabHost(): string
{

if (
$this->input->hasOption('gitlab-host-name')
&& $this->input->getOption('gitlab-host-name')
) {
return $this->input->getOption('gitlab-host-name');
}
if (!$this->localMachineHelper->commandExists('glab')) {
throw new AcquiaCliException("Install glab to continue: https://gitlab.com/gitlab-org/cli#installation");
}
$process = $this->localMachineHelper->execute([
'glab',
'config',
'get',
'host',
], null, null, false);
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Could not determine GitLab host: {error_message}", ['error_message' => $process->getErrorOutput()]);
}
$output = trim($process->getOutput());
$urlParts = parse_url($output);
if (!array_key_exists('scheme', $urlParts) && !array_key_exists('host', $urlParts)) {

return $output;
}

return $urlParts['host'];
}

private function getGitLabClient(): Client
{
if (!isset($this->gitLabClient)) {
$gitlabClient = new Client(new Builder(new \GuzzleHttp\Client()));
$gitlabClient->setUrl('https://' . $this->gitLabHost);
$gitlabClient->authenticate($this->gitLabToken, Client::AUTH_OAUTH_TOKEN);
$this->setGitLabClient($gitlabClient);
}
return $this->gitLabClient;
}

public function setGitLabClient(Client $client): void
{
$this->gitLabClient = $client;
}

private function writeApiTokenMessage(InputInterface $input): void
{

if (!$input->getOption('key') || !$input->getOption('secret')) {
$tokenUrl = 'https://cloud.acquia.com/a/profile/tokens';
$this->io->writeln([
"",
"This will configure AutoDevOps for a Code Studio project using credentials",
"(an API Token and SSH Key) belonging to your current Acquia Cloud Platform user account.",
"Before continuing, make sure that you're logged into the right Acquia Cloud Platform user account.",
"",
"<comment>Typically this command should only be run once per application</comment>",
"but if your Cloud Platform account is deleted in the future, the Code Studio project will",
"need to be re-configured using a different user account.",
"",
"<options=bold>To begin, visit this URL and create a new API Token for Code Studio to use:</>",
"<href=$tokenUrl>$tokenUrl</>",
]);
}
}

protected function validateEnvironment(): void
{
if (!empty(self::isAcquiaCloudIde()) && !getenv('GITLAB_HOST')) {
throw new AcquiaCliException('The GITLAB_HOST environment variable must be set or the `--gitlab-host-name` option must be passed.');
}
}

private function authenticateWithGitLab(): void
{
$this->validateEnvironment();
$this->gitLabHost = $this->getGitLabHost();
$this->gitLabToken = $this->getGitLabToken($this->gitLabHost);
$this->getGitLabClient();
try {
$this->gitLabAccount = $this->gitLabClient->users()->me();
} catch (RuntimeException $exception) {
$this->io->error([
"Unable to authenticate with Code Studio",
"Did you set a valid token with the <options=bold>api</> and <options=bold>write_repository</> scopes?",
"Try running `glab auth login` to re-authenticate.",
"Alternatively,  pass the <options=bold>--gitlab-token</> option.",
"Then try again.",
]);
throw new AcquiaCliException("Unable to authenticate with Code Studio");
}
}







private function determineGitLabProject(EntityType $entityType, object $cloudEntity): array
{

if ($this->input->getOption('gitlab-project-id')) {
$id = $this->input->getOption('gitlab-project-id');
return $this->gitLabClient->projects()->show($id);
}

$entityName = null;
$entityUuid = null;

if ($entityType == EntityType::Codebase) {
$entityName = $cloudEntity->label;
$entityUuid = $cloudEntity->id;
} else {
$entityName = $cloudEntity->name;
$entityUuid = $cloudEntity->uuid;
}


$projects = $this->gitLabClient->projects()
->all(['search' => $entityUuid]);
if ($projects) {
if (count($projects) == 1) {
return reset($projects);
}

return $this->promptChooseFromObjectsOrArrays(
$projects,
'id',
'path_with_namespace',
"Found multiple projects that could match the $entityName. Choose which one to configure."
);
}

$this->io->writeln([
"\nCould not find any existing Code Studio project for Acquia Cloud Platform $entityType->value <comment>$entityName</comment>.",
"Searched for UUID <comment>$entityUuid</comment> in project descriptions.",
]);
$createProject = $this->io->confirm('Would you like to create a new Code Studio project? If you select "no" you may choose from a full list of existing projects.');
if ($createProject) {
return $this->createGitLabProject($entityType, $cloudEntity);
}

return $this->promptChooseFromObjectsOrArrays(
$this->gitLabClient->projects()->all(),
'id',
'path_with_namespace',
"Choose a Code Studio project to configure for the $entityName"
);
}







private function createGitLabProject(EntityType $entityType, object $cloudEntity): array
{
$userGroups = $this->gitLabClient->groups()->all([
'all_available' => true,
'min_access_level' => 40,
]);
$parameters = $this->getGitLabProjectDefaults();
if ($userGroups) {
$userGroups[] = $this->gitLabClient->namespaces()
->show($this->gitLabAccount['username']);
$projectGroup = $this->promptChooseFromObjectsOrArrays($userGroups, 'id', 'path', 'Choose which group this new project should belong to:');
$parameters['namespace_id'] = $projectGroup['id'];
}

$slugger = new AsciiSlugger();
$entityName = null;
if ($entityType == EntityType::Codebase) {
$entityName = $cloudEntity->label;
} else {
$entityName = $cloudEntity->name;
}
$projectName = (string) $slugger->slug($entityName);
$project = $this->gitLabClient->projects()
->create($projectName, $parameters);
try {
$this->gitLabClient->projects()
->uploadAvatar($project['id'], __DIR__ . '/drupal_icon.png');
} catch (ValidationFailedException) {
$this->io->warning("Failed to upload project avatar");
}
$this->io->success("Created {$project['path_with_namespace']} project in Code Studio.");

return $project;
}

private function setGitLabProjectDescription(EntityType $entityType, mixed $cloudUuid): void
{
$this->gitLabProjectDescription = "Source repository for Acquia Cloud Platform $entityType->value <comment>$cloudUuid</comment>";
}




private function getGitLabProjectDefaults(): array
{
return [
'container_registry_access_level' => 'disabled',
'default_branch' => 'main',
'description' => $this->gitLabProjectDescription,
'initialize_with_readme' => true,
'topics' => 'Acquia Cloud Application',
];
}






private function acceptGitlabOptions(): static
{
$this->addOption('gitlab-token', null, InputOption::VALUE_REQUIRED, 'The GitLab personal access token that will be used to communicate with the GitLab instance')
->addOption('gitlab-project-id', null, InputOption::VALUE_REQUIRED, 'The project ID (an integer) of the GitLab project to configure.')
->addOption('gitlab-host-name', null, InputOption::VALUE_REQUIRED, 'The GitLab hostname.');
return $this;
}
}
PNG

   IHDR         X   	pHYs  !8  !8E1`  iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 7.0-c000 79.dabacbb, 2021/04/14-00:39:44        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmp:CreatorTool="Adobe Photoshop 22.5 (Macintosh)" xmp:CreateDate="2022-02-09T12:28:28-05:00" xmp:ModifyDate="2022-02-09T12:37:12-05:00" xmp:MetadataDate="2022-02-09T12:37:12-05:00" dc:format="image/png" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2.1" xmpMM:InstanceID="xmp.iid:236c3219-5187-49cb-b886-d5e736bec66b" xmpMM:DocumentID="xmp.did:e6a490cd-503f-43be-b0ee-c59ad93db391" xmpMM:OriginalDocumentID="xmp.did:e6a490cd-503f-43be-b0ee-c59ad93db391"> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="created" stEvt:instanceID="xmp.iid:e6a490cd-503f-43be-b0ee-c59ad93db391" stEvt:when="2022-02-09T12:28:28-05:00" stEvt:softwareAgent="Adobe Photoshop 22.5 (Macintosh)"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:236c3219-5187-49cb-b886-d5e736bec66b" stEvt:when="2022-02-09T12:37:12-05:00" stEvt:softwareAgent="Adobe Photoshop 22.5 (Macintosh)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>B  gIDATxuIǿ\RF .?X#ع xFE(P'"-03TuU=??ۨdNx<qjXq\ǩq\ǩq\ǩq\ǩq\ǩq\ǩq\ǩ1`vBP? |)ӳ vX1`D|,wlS\,Q'!]?d ރ蓵{' ރ(R{8mdT=.+QbM<^y`g\X
ЮC ѻ`J!C39 ׇbރ65o65\jWh!VXV&l8pA1X2 oHq@+ 7;.@ n݇VU Lі1SIrvy\Y9n lb;"`[Q[D8B Jӗ@}qII:3tB_JݤE9 {&:=	#.TdܮLF{$c$Rr E>v\%a@r$7₴$"9J\pAZ%.IG\D,GK	Q⒴BBr$-pAjP-P;.IC\(| 4@AW 3 8G3 /uI$ ܔ>.I.	F yD?N穣RSjrrBg P{#6!ɋ[3M%ѣ"G$S(qIKA L-Ie	BUCU=YҐ{%`N I-$3%N{P8MQv@mӋdM$h&ד٧ J<}4۞t"x5I6t~-i'B
m%+8]В|Bq{$)M"C.3Tl;$"@;*$'MV.)+Z?~HJI6wBK|$)AP5&Ud0%'V8@!"@Sto2$Qh;If1dr S$ Dd#B]~GSVVJACftkSBsoۍYi'kf*/NЪ 7HrTW&p3=%d(AuKZ}-
'o"Ή%I 
6qZML̟
ؚ(f=$zIbt[3N3bD%}
@q/E협/5ioT@Shv^$/c>}
|m@|9&bTszL(~6ܓ@ ]&W(utǢ]*IF	D!>u 	K,~&X* TKĲn^rH]VU(	jBBqYA@̷|qd R^d!ӂP7,qb7	@LY~0Zwӂ@X	@($+bb]@L /&	dߦ1Y1Nësط|4dY=0氯hq:&+XA1sxՓ11ٰ,D J E<
qJ D &})M}Ewץ`RZ뮙зϮZ>eR[\&!'	)Z D &V30ǻտ^jBIh=3c/Up9zs1s<6
=274 $xVtsHϑވ2xrKOV'p9O<nE?2ǻgǂEA>0,GAI6X(=s=s< UMw"%^ 9\)${xx,XdoOj|qR0{?@bQr'[ۛTL>Hhۥ'.ݴP)%*kDh.ռV%N@h=$$$2Ƽ7'/ȭO	u4^Ϲy3"yApê/m8a
rBkx }n' -_q3'R8K<~	TA]H`9	}_mERr.k9ihpLlMڼX`5v۔j3c M_Ho5& Sj*13x}p`ۂ7HU9H>5|jئY,
wp^\9URS?<7fl1{Ӻ5(}Uukޙ`NSw ߼
U,&V6'!V7W5t3ƐnQS6 GX*^(nUfSNsC$288e v sg
ű/S<8>ceǆth(`o(0k}:W:GCmubR@6#)FA,w^  @;KXb/ʓE9v-w+Yk'АL;KЪ7 -N{vWXk'PYAg)V	4`@o?`
BF;kҳvװ.Z;:,}F;	\ô ZdZͫv0-N 	Tk'Xیh'1>ȵpXY:Vҝ{"&N)QB6]s0N R,(!2θNcNȴhC4Ч^d5 =!0en
&	vmJi2N{l G4+OhT;?\;.D'1Nx`5N It!JAg<L;Kڏ>S(RbGýH6zD+I%Ad	cT

|8uRBhjSC|'2C./ֆWQQ*BL?CuiӠPHλr@C$rYiА?4>aѣWIB@ξ.HbD);NIFoydjNBWiq/4fkU ]pVws 9IP7h:-$+ 9IB*H\c|nQ6 UGi7|bnݽs vr$B*%huwo&RnH(zу~[CX8 	؄^ %γ$`79 ? } 6"sU] %.C˭8!su3QEN
.9_.֣0)\63$ K..HQ\ v
v@C -3Cb){ 7@+_Sؓť`azɯ¼⟣T*X-ct߲*m'dqAhS%qzuq8N.8N.8N.8N.8N.8N.8N.8N',f    IENDB`PNG

   IHDR         j   	pHYs  !8  !8E1`  iTXtXML:com.adobe.xmp     <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 7.0-c000 79.dabacbb, 2021/04/14-00:39:44        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmp:CreatorTool="Adobe Photoshop 22.5 (Macintosh)" xmp:CreateDate="2022-02-09T12:28:28-05:00" xmp:ModifyDate="2022-02-09T12:33:22-05:00" xmp:MetadataDate="2022-02-09T12:33:22-05:00" dc:format="image/png" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2.1" xmpMM:InstanceID="xmp.iid:a3939d3f-2cf6-431f-b61e-47988386b5af" xmpMM:DocumentID="xmp.did:841805ab-ac39-4260-a524-a6994d9a8d2f" xmpMM:OriginalDocumentID="xmp.did:841805ab-ac39-4260-a524-a6994d9a8d2f"> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="created" stEvt:instanceID="xmp.iid:841805ab-ac39-4260-a524-a6994d9a8d2f" stEvt:when="2022-02-09T12:28:28-05:00" stEvt:softwareAgent="Adobe Photoshop 22.5 (Macintosh)"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:b0782982-3722-445a-8ddb-e202598b1689" stEvt:when="2022-02-09T12:31:20-05:00" stEvt:softwareAgent="Adobe Photoshop 22.5 (Macintosh)" stEvt:changed="/"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:a3939d3f-2cf6-431f-b61e-47988386b5af" stEvt:when="2022-02-09T12:33:22-05:00" stEvt:softwareAgent="Adobe Photoshop 22.5 (Macintosh)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>an  %eIDATxw\ŕOM iF( B!c^u ۻ#~ama1My9HH 4gz:UGYƒfvnSU砎 poñ;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם !@ ,B5B-#rߞsທ	P^'a@VA4%'<\ 45"b8}vgVr\Xu	AƎ%eL#1K	x`OaB @J'2E-ޫf/;KG:S:RK@/\bMV{@ƂON3߳=Hg*m@̦p݋BtX|VX&|gྤE'"BtX:g֏u X1в掐җ5{q0-1ȿ}Z4OuVXy`iS{@_\E $t2FHQް#$qv" դ"u/ mkBvaSI,>/\bQYi=E|[kOSTu/E#./+LBIکpA.nʥxfRJJ>.,J=ZWљ!E|_(3b̌EgdYAGv~	/j|an8nZ1<ẏAFTXW3=ףYP&/̼x0ꂖBɜJXIE$7#?âR\aj~	aFP^ӓX.sxEf}\6z
?!&#hk{i@ޅR0(pǅEFjH$C'ł>.Dqpp~X'4r !( u:z'ֹtLբDsBfw̚00<33.wMB	sZjU{Ri
^;'Gyθ>Zy}1ຏެ9ZDn?١sk61ĸ #bs
u.KH_7+rZe^2?@j1cƸ@ ߓʙ%Iїݛ=|HqD?t$έ("ڋ}! gg̫{HxST֑"jݳ={11lKzo]?sCEExD,aN6Ծ_/YTx"8P [Q3GQ?pBiWE\""D.Ja $i}+1.ni_];IY@~GŇ+2 mP@pjڼ,Uz}OMOa⪗{Au.nzq㱳+k{782eKU bT ޤaھ;nd1⮗{ F>j2F<	Szu8;Ap9q\w{f("jQ(mq~D#):êm1!sOX:!DOK!#bbEk\fQ1#da_PQJY׭j%4Kh@^㉞,J3U-Y5	i/${$çAdo]BAjw'?hzsSE_MԍJwB!cդjS]WN,w9I=榨3	&9fM2Fbifهv&_$u◰$L=AwҤF~n9h˚͉hZuj!Z>5g6}GE͞k]O!
ɂ0!*>̈́ :|OΨcQt|DQR]X̪u	#шG¼bi8ųjyu}ˤU»*'3`X%.ᶅO*\D3\maN$܂`a l}rQu}YӤPc|nRO[PSDn_pQ?mVe
q\8{upFk<BjT=eX"=Ƕ[tDj~
P͘V'R7UVk5YTQ;șliFO	un
/64;R`愗Ox0jOnRS5?kyWe̻ǟܛ'!E0	Y4?rzTI+ȚAV kRefu9l~IxbY4emQ7ywc{gօ$#T% I,aw[7֟ԭI~)8}D?"@P[h/ve.獾,kF+Eu[Tܺ9V.zf@^'m~⹞5=L7xk:VW:tdqZŷkHOr	yt;7xgV7jq'c-zJJunXt^Dq3tz/ͱ$a>{B[iOsg*_kmNR7GUz*QFf/RtjV@IZ|` =w*W2g2[H5ni;S
o/=njὨL+G\-^E@ĺwFt/WwN4zFUOu@EXoRR9*
a5CI-ذbt-
^MHLYVkb#a4IJTKD[نU"s׋B`:Vr5-UP`I aY
ug^\bZEѝ)ם *4	%5(rEu:rb;5fQJ@O
+x]f	yD\X+Kw`2F(ӃpuG;SᗰO*; :-zbra"jF\B|Z	,u+Mnhr_9ݿ9>7ԾtW+U3"tG EG4k^Danv_^0[«]߃Kڗ'G7"F6Ompnv[c/wg3VXe=05tf+mέZ3f#~_!F1hֺFE	%n_@\	<DGsV{@u?8\[" <Y\B3i4g sCXԐIʨS܏^aRNpM=ޕ˚?53X;9"(zꂖ&_eKOHR~>Z=yCgn?!cN**W8-B Gw`QN+&{vv Ɯͭ7~Vih&ɘ7X	~V} )T NjQcKHˠ{>ѓ1?1wfP)Qi'cΏ^:a@V-oYNd<B[4yR仧墆A2Fe p*
C9kYs_~y:QӠ^jQ%Z6|&	4?ӎzkgzf}Z
 VOhJ26ȔE,gtJU{@~VJVɗcu
\# l#IeI5m
)6=6o&LџGa x/YZUwB!m˦^Y?v&?R_ N̕_ɑ-2cUA7Dc/c\(=:7/ mq+կ^l@d޶5kRayaQ't#vL+k>Z{p0eM=/p	8z̓g_V'rݛᅞw&_rd2&@Ơj+nҖ?u;*aԻXb<:S7/"d@ ->qmOgT1ކUЎ~틽z?{}tؤ;(jF%Іeljd[Mǖ2ƦIz(u8|jW6!ru^7z7ΖZVԉj/i/\ vϬHK@X{9;_x}@(\'է~
\)A/gyOO9EcBΤ<ʚW{3fW,UAO\yd9bӲ!?{Z m~iԏ6\wCwBEaAV_nygP- p0eismWOi4
mƶnPn #lJnJrϯ~VG)6 9֐jekДNrV\-r͢qTx&&i~lHڡ{΂­fڙ<6J׾;m^lbSA$ќΟ]1u`NDx&Ț&CױE0#pФV1Psr&;N363y4,+RJu@XY1;*u Nr-@4g|wP4gչZN1osZ<:/a/ۓqc	1>Zr~j3Y@=i=#M^1êe[f;Fwݢ,"7~C=i֤gIӗ@[TGeMn1<'m~rz4 	\-i5Y
 c\/Fdd6N3NKRI?BuS&1,%*dCl֍&Tz!i_QXP5-rtγLBŞP Fߞd.%םPcГ1bǦ #^q5˧39~b?1vfR`C'1Wu= ݀fh^b6t2]9ZJ Zg5x+䵫{ѯ2Fn5DH#d>̋k7Vʘ0/kKf<M{IBŝQeL}67Ć 0B9ƙe0C_s-!@atUч5jݢ̐j
տZoi 	)!m]乸Gh6u}LmÚﰇ̦z7|wHˎrPIW?-"s^[ˤn%c0_'Ģ+"</M2=l~i`(g@Zՙ:OMKbܛN;	 7OOYȸLw֑
)
!,ɍh|u  ªXrK蛆(F3_L򒳛=[ڄ0g-Z<f~9T+hܴv5n^7iP  ͚pY3	໶Ǜ~$T|HԀ|@ތa|ڎ%"bҏ˳J((@WN׼ػsiV{ߒ&AyVMk_~N|-) :zOgۓJ tBdz?'G@X>%Mz֑q	b Iq@Ț'jXU'Qxt1:RW)&+_B+Z
/{]4'ս1\C(d-'y;\TO{̓ϪQ<"	ݛ0UYKK<]fbr׶7ߊ n"=cHݎ݅Z'Oۥ ^qs=,"`\5yŁqP8g&֤<_;Ghpw'{V-o	0Lέ#71q\9k	w3&4"uWN_:>̲<16(f8u=)|&_q	B)	"D\BX\kHŭ-ii%Js$uэC,oTMJe7rNYN%&
\KBЕ6k<--]l[(T뇧'-Q-v CwПz3l
i[dJf#'y;wtk@ ])cie͌3Ʀ537)eiS-⁬侣= == L%|x74_&XFLk,ibSi
 9KOݵ%Dlwst zs{g.n;K\FЛ1x=ǦԱ) gMͤ8)&ƧogY6x	Ɨ4{'WKtˆȵ ])F2P r&q<az$P3Ǿ$ ۶Ķ  an=tʘ#W H8z̰-P4ϴEmTsߎĺWQQ0(%<sAOƚQYVԱ!|U]qǛ Sv݂!r4C˚}%Ϥ%4rfk-5KJ'GTR#,@H(k|#f_U';C交r	z;Z~vplM-OMr֝P)f}mcnQEêu3zm~<]]=TJb1܁ɀ%\4_ƻ-Rz|#״A.wMoqEsǛ>zM+ٛE3)@X_o5Qc#׸N>r߆lo{uKd-#GmMsn`0g`#ѝH$^[?PaGE{ƞ6E% E@^7n1bcS xxw_e,jV%lG)%tϮc_~#FI\\224 =orجbc}I㦵_^3(@y+P  (I|gKw6^j=6?ًݒQWٖؽ pʌMڗfuûA=9
p΢LlWw>53)1\;/ᕮLOer/#tKlÀu}9+3iP~~<T- #Ig=iP4؆{ktFO%
}lO*`Ef+'ۗ2Qp隯><RBнŅ-emS܍	,B
|y5ɁԻCڛ}Yͤ.Tgu8!0-	gLhgji!,g9jwkeDpy'{ǦtCX="L28$Ӷe+GTr!c$yz|TNsEu=x'4e>*#C".P13* NagqR:e9SW:xDp	a]QOloH	H0)+rG ;,9zWGg" 2]#,[7+WP?WPNɘ/4W&t336PF}6{?{\j96 Y3#4oes#'U,f1t]:ɻӗ5Xñڡ 9~K٣-Cn*pCVr4~b+T	z;`\:OB/Ѭ(^֝=b׮pVdI?*0zF=K&}W\ߓ]B(tWDU<'t)Y3kP>3d[|dyKGߝRMZ*;ŤJtQҠ|pGS#ɘd k$'6g;WސQp%Qcڗ yr
{F\'Vj=P оYWNF7k#ޓ6[W=&j͹e9kûS{NP*cQ%8-# $TOħ4d(*V˟-u/!&aռ}aggGnݯҝ-G_[}⼈&hϿ'ٛzWդ;H+wnӉuc,R5j:]񔶼E=\ʦcϪ
-˚&#;nܻ=R2VU6ǬHpcϜҙ?rϾQu	CT@P@n{w-rߎ׾=	mkR}uJ-"@b2F7&>ƗnPed
Re{
 M÷n.Lpv擐TU9!rW}c$@ΚQh\8Uo\;#,Ou 	#lHfzEC[G>7a]UwTS &nyDb#9Gҕg{K@j
Y
^<AΤ)KYfoEsҏIܕ$4!&03At @ R:,/;u^Ǟx΀7'3_Ɗ0M信AqxFP^Pq
m>'t}&Dt edMړ67;a;m
VsŔO>	{%l7t+qGl'&8y{3jFTqX07D@ȇQA@<6uظ
ȸI&AH*g"×f8q\wsם u8;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם u8;Ap9q\wsם ,    IENDB`<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

enum EntityType: string
{
case Application = 'Application';
case Codebase = 'Codebase';
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;
use Symfony\Component\Yaml\Yaml;

#[AsCommand(name: 'codestudio:pipelines-migrate', description: 'Migrate .acquia-pipeline.yml file to .gitlab-ci.yml file for a given Acquia Cloud application', aliases: ['cs:pipelines-migrate'])]
final class CodeStudioPipelinesMigrateCommand extends CommandBase
{
use CodeStudioCommandTrait;

protected function configure(): void
{
$this
->addOption('key', null, InputOption::VALUE_REQUIRED, 'The Cloud Platform API token that Code Studio will use')
->addOption('secret', null, InputOption::VALUE_REQUIRED, 'The Cloud Platform API secret that Code Studio will use')
->addOption('gitlab-token', null, InputOption::VALUE_REQUIRED, 'The GitLab personal access token that will be used to communicate with the GitLab instance')
->addOption('gitlab-project-id', null, InputOption::VALUE_REQUIRED, 'The project ID (an integer) of the GitLab project to configure.');
$this->acceptApplicationUuid();
$this->setHidden(!AcquiaDrupalEnvironmentDetector::isAhIdeEnv());
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->authenticateWithGitLab();
$this->writeApiTokenMessage($input);
$cloudKey = $this->determineApiKey();
$cloudSecret = $this->determineApiSecret();



$this->reAuthenticate($cloudKey, $cloudSecret, $this->cloudCredentials->getBaseUri(), $this->cloudCredentials->getAccountsUri());
$cloudApplicationUuid = $this->determineCloudApplication();

$this->setGitLabProjectDescription(EntityType::Application, $cloudApplicationUuid);


$cloudApplication = $this->getCloudApplication($cloudApplicationUuid);
$project = $this->determineGitLabProject(EntityType::Application, $cloudApplication);


$this->checkGitLabCiCdVariables($project);
$this->validateCwdIsValidDrupalProject();
$acquiaPipelinesFileDetails = $this->getAcquiaPipelinesFileContents($project);
$acquiaPipelinesFileContents = $acquiaPipelinesFileDetails['file_contents'];
$acquiaPipelinesFileName = $acquiaPipelinesFileDetails['filename'];
$gitlabCiFileContents = $this->getGitLabCiFileTemplate();
$this->migrateVariablesSection($acquiaPipelinesFileContents, $gitlabCiFileContents);
$this->migrateEventsSection($acquiaPipelinesFileContents, $gitlabCiFileContents);
$this->removeEmptyScript($gitlabCiFileContents);
$this->createGitLabCiFile($gitlabCiFileContents, $acquiaPipelinesFileName);
$this->io->success([
"",
"Migration completed successfully.",
"Created .gitlab-ci.yml and removed acquia-pipeline.yml file.",
"In order to run Pipeline, push .gitlab-ci.yaml to Main branch of Code Studio project.",
"Check your pipeline is running in Code Studio for your project.",
]);

return Command::SUCCESS;
}





private function checkGitLabCiCdVariables(array $project): void
{
$gitlabCicdVariables = CodeStudioCiCdVariables::getList();
$gitlabCicdExistingVariables = $this->gitLabClient->projects()
->variables($project['id']);
$existingKeys = array_column($gitlabCicdExistingVariables, 'key');
foreach ($gitlabCicdVariables as $gitlabCicdVariable) {
if (!in_array($gitlabCicdVariable, $existingKeys, true)) {
throw new AcquiaCliException("Code Studio CI/CD variable $gitlabCicdVariable is not configured properly");
}
}
}







private function getAcquiaPipelinesFileContents(array $project): array
{
$pipelinesFilepathYml = Path::join($this->projectDir, 'acquia-pipelines.yml');
$pipelinesFilepathYaml = Path::join($this->projectDir, 'acquia-pipelines.yaml');
if (
$this->localMachineHelper->getFilesystem()
->exists($pipelinesFilepathYml) ||
$this->localMachineHelper->getFilesystem()
->exists($pipelinesFilepathYaml)
) {
$this->gitLabClient->projects()
->update($project['id'], ['ci_config_path' => '']);
$pipelinesFilenames = [
'acquia-pipelines.yml',
'acquia-pipelines.yaml',
];
foreach ($pipelinesFilenames as $pipelinesFilename) {
$pipelinesFilepath = Path::join($this->projectDir, $pipelinesFilename);
if (file_exists($pipelinesFilepath)) {
$fileContents = file_get_contents($pipelinesFilepath);
return [
'filename' => $pipelinesFilename,
'file_contents' => Yaml::parse($fileContents, Yaml::PARSE_OBJECT),
];
}
}
}

throw new AcquiaCliException("Missing 'acquia-pipelines.yml' file which is required to migrate the project to Code Studio.");
}






private function getGitLabCiFileTemplate(): array
{
return [
'include' => [
'file' => '/gitlab-ci/Auto-DevOps.acquia.gitlab-ci.yml',
'project' => 'acquia/standard-template',
],
];
}




private function migrateVariablesSection(mixed $acquiaPipelinesFileContents, mixed &$gitlabCiFileContents): void
{
if (array_key_exists('variables', $acquiaPipelinesFileContents)) {
$variablesDump = Yaml::dump(['variables' => $acquiaPipelinesFileContents['variables']]);
$removeGlobal = preg_replace('/global:/', '', $variablesDump);
$variablesParse = Yaml::parse($removeGlobal);
$gitlabCiFileContents = array_merge($gitlabCiFileContents, $variablesParse);
$this->io->success([
"Migrated `variables` section of acquia-pipelines.yml to .gitlab-ci.yml",
]);
} else {
$this->io->info([
"Checked acquia-pipeline.yml file for `variables` section",
]);
}
}

private function getPipelinesSection(array $acquiaPipelinesFileContents, string $eventName): mixed
{
if (!array_key_exists('events', $acquiaPipelinesFileContents)) {
return null;
}
if (array_key_exists('build', $acquiaPipelinesFileContents['events']) && empty($acquiaPipelinesFileContents['events']['build'])) {
return null;
}
if (!array_key_exists($eventName, $acquiaPipelinesFileContents['events'])) {
return null;
}
return $acquiaPipelinesFileContents['events'][$eventName]['steps'] ?? null;
}

private function migrateEventsSection(array $acquiaPipelinesFileContents, array &$gitlabCiFileContents): void
{

$eventsMap = [
'build' => [
'skip' => [
'composer install' => [
'message' => 'Code Studio AutoDevOps will run `composer install` by default. Skipping migration of this command in your acquia-pipelines.yml file:',
'prompt' => false,
],
'${BLT_DIR}' => [
'message' => 'Code Studio AutoDevOps will run BLT commands for you by default. Do you want to migrate the following command?',
'prompt' => true,
],
],
'default_stage' => 'Test Drupal',
'stage' => [
'setup' => 'Build Drupal',
'npm run build' => 'Build Drupal',
'validate' => 'Test Drupal',
'tests' => 'Test Drupal',
'test' => 'Test Drupal',
'npm test' => 'Test Drupal',
'artifact' => 'Deploy Drupal',
'deploy' => 'Deploy Drupal',
],
'needs' => [
'Build Code',
'Manage Secrets',
],
],
'post-deploy' => [
'skip' => [
'launch_ode' => [
'message' => 'Code Studio AutoDevOps will run Launch a new Continuous Delivery Environment (CDE) automatically for new merge requests. Skipping migration of this command in your acquia-pipelines.yml file:',
'prompt' => false,
],
],
'default_stage' => 'Deploy Drupal',
'stage' => [
'launch_ode' => 'Deploy Drupal',
],
'needs' => [
'Create artifact from branch',
],
],
];


$codeStudioJobs = [];
foreach ($eventsMap as $eventName => $eventMap) {
$eventSteps = $this->getPipelinesSection($acquiaPipelinesFileContents, $eventName);
if ($eventSteps) {
foreach ($eventSteps as $step) {
$scriptName = array_keys($step)[0];
if (!array_key_exists('script', $step[$scriptName]) || empty($step[$scriptName]['script'])) {
continue;
}
if ($stage = $this->assignStageFromKeywords($eventMap['stage'], $scriptName)) {
$codeStudioJobs[$scriptName]['stage'] = $stage;
}
foreach ($step[$scriptName]['script'] as $command) {
foreach ($eventMap['skip'] as $needle => $messageConfig) {
if (str_contains($command, $needle)) {
if ($messageConfig['prompt']) {
$answer = $this->io->confirm($messageConfig['message'] . PHP_EOL . $command, false);
if ($answer == 1) {
$codeStudioJobs[$scriptName]['script'][] = $command;
$codeStudioJobs[$scriptName]['script'] = array_values(array_unique($codeStudioJobs[$scriptName]['script']));
} elseif (($key = array_search($command, $codeStudioJobs[$scriptName]['script'], true)) !== false) {
unset($codeStudioJobs[$scriptName]['script'][$key]);
}
} else {
$this->io->note([
$messageConfig['message'],
$command,
]);
}
break;
}

if (array_key_exists($scriptName, $codeStudioJobs) && array_key_exists('script', $codeStudioJobs[$scriptName]) && in_array($command, $codeStudioJobs[$scriptName]['script'], true)) {
break;
}
if (!array_key_exists($scriptName, $eventMap['skip'])) {
$codeStudioJobs[$scriptName]['script'][] = $command;
$codeStudioJobs[$scriptName]['script'] = array_values(array_unique($codeStudioJobs[$scriptName]['script']));
} elseif ($scriptName === 'launch_ode') {
$codeStudioJobs[$scriptName]['script'][] = $command;
}
}
if (
array_key_exists($scriptName, $codeStudioJobs) && !array_key_exists('stage', $codeStudioJobs[$scriptName])
&& $stage = $this->assignStageFromKeywords($eventMap['stage'], $command)
) {
$codeStudioJobs[$scriptName]['stage'] = $stage;
}
}
if (!array_key_exists('stage', $codeStudioJobs[$scriptName])) {
$codeStudioJobs[$scriptName]['stage'] = $eventMap['default_stage'];
}
$codeStudioJobs[$scriptName]['needs'] = $eventMap['needs'];
}
$gitlabCiFileContents = array_merge($gitlabCiFileContents, $codeStudioJobs);
$this->io->success([
"Completed migration of the $eventName step in your acquia-pipelines.yml file",
]);
} else {
$this->io->writeln([
"acquia-pipeline.yml file does not contain $eventName step to migrate",
]);
}
}
}




private function removeEmptyScript(array &$gitlabCiFileContents): void
{
foreach ($gitlabCiFileContents as $key => $value) {
if (array_key_exists('script', $value) && empty($value['script'])) {
unset($gitlabCiFileContents[$key]);
}
}
}




private function createGitLabCiFile(array $contents, string|iterable $acquiaPipelinesFileName): void
{
$gitlabCiFilepath = Path::join($this->projectDir, '.gitlab-ci.yml');
$this->localMachineHelper->getFilesystem()
->dumpFile($gitlabCiFilepath, Yaml::dump($contents, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK));
$this->localMachineHelper->getFilesystem()
->remove($acquiaPipelinesFileName);
}

private function assignStageFromKeywords(array $keywords, string $haystack): ?string
{
foreach ($keywords as $needle => $stage) {
if (str_contains($haystack, $needle)) {
return $stage;
}
}
return null;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Gitlab\Exception\RuntimeException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'codestudio:php-version', description: 'Change the PHP version in Code Studio')]
final class CodeStudioPhpVersionCommand extends CommandBase
{
use CodeStudioCommandTrait;

protected function configure(): void
{
$this
->addArgument('php-version', InputArgument::REQUIRED, 'The PHP version that needs to configured or updated')
->addUsage('8.1 myapp')
->addUsage('8.1 abcd1234-1111-2222-3333-0e02b2c3d470');
$this->acceptApplicationUuid();
$this->acceptGitlabOptions();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$phpVersion = $input->getArgument('php-version');
$this->validatePhpVersion($phpVersion);
$this->authenticateWithGitLab();
$acquiaCloudAppId = $this->determineCloudApplication();


$cloudApplication = $this->getCloudApplication($acquiaCloudAppId);
$project = $this->determineGitLabProject(EntityType::Application, $cloudApplication);


if (empty($project['jobs_enabled'])) {
$this->io->error('CI/CD is not enabled for this application in code studio. Enable it first and then try again.');
return self::FAILURE;
}

try {
$phpVersionAlreadySet = false;

$allProjectVariables = $this->gitLabClient->projects()
->variables($project['id']);
if (!empty($allProjectVariables)) {
$variables = array_column($allProjectVariables, 'value', 'key');
$phpVersionAlreadySet = $variables['PHP_VERSION'] ?? false;
}

if (!$phpVersionAlreadySet) {
$this->gitLabClient->projects()
->addVariable($project['id'], 'PHP_VERSION', $phpVersion);
} else {

$this->gitLabClient->projects()
->updateVariable($project['id'], 'PHP_VERSION', $phpVersion);
}
} catch (RuntimeException) {
$this->io->error("Unable to update the PHP version to $phpVersion");
return self::FAILURE;
}

$this->io->success("PHP version is updated to $phpVersion successfully!");
return self::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\CodeStudio;

class CodeStudioCiCdVariables
{



public static function getList(): array
{

return array_column(self::getDefaultsForPhp(EntityType::Application), 'key');
}




public static function getDefaultsForNode(?string $cloudApplicationUuid = null, ?string $cloudKey = null, ?string $cloudSecret = null, ?string $projectAccessTokenName = null, ?string $projectAccessToken = null, ?string $nodeVersion = null, ?string $nodeHostingType = null): array
{
return [
[
'key' => 'ACQUIA_APPLICATION_UUID',
'masked' => true,
'protected' => false,
'value' => $cloudApplicationUuid,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_CLOUD_API_TOKEN_KEY',
'masked' => true,
'protected' => false,
'value' => $cloudKey,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_CLOUD_API_TOKEN_SECRET',
'masked' => true,
'protected' => false,
'value' => $cloudSecret,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_GLAB_TOKEN_NAME',
'masked' => true,
'protected' => false,
'value' => $projectAccessTokenName,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_GLAB_TOKEN_SECRET',
'masked' => true,
'protected' => false,
'value' => $projectAccessToken,
'variable_type' => 'env_var',
],
[
'key' => 'NODE_VERSION',
'masked' => false,
'protected' => false,
'value' => $nodeVersion,
'variable_type' => 'env_var',
],
[
'key' => 'NODE_HOSTING_TYPE',
'masked' => false,
'protected' => false,
'value' => $nodeHostingType,
'variable_type' => 'env_var',
],
];
}




public static function getDefaultsForPhp(EntityType $entityType, ?string $cloudUuid = null, ?string $cloudKey = null, ?string $cloudSecret = null, ?string $projectAccessTokenName = null, ?string $projectAccessToken = null, ?string $mysqlVersion = null, ?string $phpVersion = null): array
{
$vars = [];

if ($entityType === EntityType::Codebase) {
$vars[] = [
'key' => 'ACQUIA_CODEBASE_UUID',
'masked' => true,
'protected' => false,
'value' => $cloudUuid,
'variable_type' => 'env_var',
];
} else {
$vars[] = [
'key' => 'ACQUIA_APPLICATION_UUID',
'masked' => true,
'protected' => false,
'value' => $cloudUuid,
'variable_type' => 'env_var',
];
}

$vars = array_merge($vars, [
[
'key' => 'ACQUIA_CLOUD_API_TOKEN_KEY',
'masked' => true,
'protected' => false,
'value' => $cloudKey,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_CLOUD_API_TOKEN_SECRET',
'masked' => true,
'protected' => false,
'value' => $cloudSecret,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_GLAB_TOKEN_NAME',
'masked' => true,
'protected' => false,
'value' => $projectAccessTokenName,
'variable_type' => 'env_var',
],
[
'key' => 'ACQUIA_GLAB_TOKEN_SECRET',
'masked' => true,
'protected' => false,
'value' => $projectAccessToken,
'variable_type' => 'env_var',
],
[
'key' => 'MYSQL_VERSION',
'masked' => false,
'protected' => false,
'value' => $mysqlVersion,
'variable_type' => 'env_var',
],
[
'key' => 'PHP_VERSION',
'masked' => false,
'protected' => false,
'value' => $phpVersion,
'variable_type' => 'env_var',
],
]);

return $vars;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Env;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Endpoints\SslCertificates;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'env:certificate-create', description: 'Install an SSL certificate.')]
final class EnvCertCreateCommand extends CommandBase
{
protected function configure(): void
{
$this
->addArgument('certificate', InputArgument::REQUIRED, 'Filename of the SSL certificate being installed')
->addArgument('private-key', InputArgument::REQUIRED, 'Filename of the SSL private key')
->addOption('legacy', '', InputOption::VALUE_OPTIONAL, 'True for legacy certificates', false)
->addOption('ca-certificates', '', InputOption::VALUE_OPTIONAL, 'Filename of the CA intermediary certificates')
->addOption('csr-id', '', InputOption::VALUE_OPTIONAL, 'The CSR (certificate signing request) to associate with this certificate')
->addOption('label', '', InputOption::VALUE_OPTIONAL, 'The label for this certificate. Required for standard certificates. Optional for legacy certificates', 'My certificate')
->acceptEnvironmentId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environment = $this->determineEnvironment($input, $output, true, true);
$certificate = $input->getArgument('certificate');
$privateKey = $input->getArgument('private-key');
$label = $this->determineOption('label');
$caCertificates = $this->determineOption('ca-certificates');
$csrId = (int) $this->determineOption('csr-id');
$legacy = $this->determineOption('legacy', false, null, null, 'false');
$legacy = filter_var($legacy, FILTER_VALIDATE_BOOLEAN);

$sslCertificates = new SslCertificates($acquiaCloudClient);
$response = $sslCertificates->create(
$environment->uuid,
$label,
$this->localMachineHelper->readFile($certificate),
$this->localMachineHelper->readFile($privateKey),
$caCertificates ? $this->localMachineHelper->readFile($caCertificates) : null,
$csrId,
$legacy
);
$notificationUuid = CommandBase::getNotificationUuidFromResponse($response);
$success = $this->waitForNotificationToComplete($acquiaCloudClient, $notificationUuid, 'Installing certificate');
if (!$success) {
throw new AcquiaCliException('Cloud API failed to install certificate');
}
return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Env;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use AcquiaCloudApi\Endpoints\Crons;
use Exception;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'env:cron-copy', description: 'Copy all cron tasks from one Cloud Platform environment to another')]
final class EnvCopyCronCommand extends CommandBase
{
protected function configure(): void
{
$this
->addArgument('source_env', InputArgument::REQUIRED, 'Alias of the source environment in the format `app-name.env` or the environment uuid')
->addArgument('dest_env', InputArgument::REQUIRED, 'Alias of the destination environment in the format `app-name.env` or the environment uuid')
->addUsage('<srcEnvironmentAlias> <destEnvironmentAlias>')
->addUsage('myapp.dev myapp.prod')
->addUsage('abcd1234-1111-2222-3333-0e02b2c3d470 efgh1234-1111-2222-3333-0e02b2c3d470');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{

if ($input->getArgument('source_env') === $input->getArgument('dest_env')) {
$this->io->error('The source and destination environments can not be same.');
return 1;
}


$this->convertEnvironmentAliasToUuid($input, 'source_env');
$sourceEnvId = $input->getArgument('source_env');


$this->convertEnvironmentAliasToUuid($input, 'dest_env');
$destEnvId = $input->getArgument('dest_env');


$cronResource = new Crons($this->cloudApiClientService->getClient());
$sourceEnvCronList = $cronResource->getAll($sourceEnvId);


$answer = $this->io->confirm('Are you sure you\'d like to copy the cron jobs from ' . $sourceEnvId . ' to ' . $destEnvId . '?');
if (!$answer) {
return Command::SUCCESS;
}

$onlySystemCrons = true;
foreach ($sourceEnvCronList as $cron) {
if (!$cron->flags->system) {
$onlySystemCrons = false;
}
}



if ($onlySystemCrons || $sourceEnvCronList->count() === 0) {
$this->io->error('There are no cron jobs in the source environment for copying.');
return 1;
}

foreach ($sourceEnvCronList as $cron) {


if (!$cron->flags->system) {
$cronFrequency = implode(' ', [
$cron->minute,
$cron->hour,
$cron->dayMonth,
$cron->month,
$cron->dayWeek,
]);

$this->io->info('Copying the cron task "' . $cron->label . '" from ' . $sourceEnvId . ' to ' . $destEnvId);
try {

$cronResource->create(
$destEnvId,
$cron->command,
$cronFrequency,
$cron->label,
);
} catch (Exception $e) {
$this->io->error('There was some error while copying the cron task "' . $cron->label . '"');

$this->logger->debug('Error @error while copying the cron task @cron from @source env to @dest env', [
'@cron' => $cron->label,
'@dest' => $destEnvId,
'@error' => $e->getMessage(),
'@source' => $sourceEnvId,
]);
return 1;
}
}
}

$this->io->success('Cron task copy is completed.');
return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Env;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\Databases;
use AcquiaCloudApi\Endpoints\Environments;
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\OperationResponse;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'env:mirror', description: 'Makes one environment identical to another in terms of code, database, files, and configuration.')]
final class EnvMirrorCommand extends CommandBase
{
private Checklist $checklist;

protected function configure(): void
{
$this->addArgument('source-environment', InputArgument::REQUIRED, 'The Cloud Platform source environment ID or alias')
->addUsage('[<environmentAlias>]')
->addUsage('myapp.dev')
->addUsage('12345-abcd1234-1111-2222-3333-0e02b2c3d470');
$this->addArgument('destination-environment', InputArgument::REQUIRED, 'The Cloud Platform destination environment ID or alias')
->addUsage('[<environmentAlias>]')
->addUsage('myapp.dev')
->addUsage('12345-abcd1234-1111-2222-3333-0e02b2c3d470');
$this->addOption('no-code', 'c');
$this->addOption('no-databases', 'd');
$this->addOption('no-files', 'f');
$this->addOption('no-config', 'p');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->checklist = new Checklist($output);
$outputCallback = $this->getOutputCallback($output, $this->checklist);
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environmentsResource = new Environments($acquiaCloudClient);
$sourceEnvironmentUuid = $input->getArgument('source-environment');
$destinationEnvironmentUuid = $input->getArgument('destination-environment');

$this->checklist->addItem("Fetching information about source environment");
$sourceEnvironment = $environmentsResource->get($sourceEnvironmentUuid);
$this->checklist->completePreviousItem();

$this->checklist->addItem("Fetching information about destination environment");
$destinationEnvironment = $environmentsResource->get($destinationEnvironmentUuid);
$this->checklist->completePreviousItem();

$answer = $this->io->confirm("Are you sure that you want to overwrite everything on $destinationEnvironment->label ($destinationEnvironment->name) and replace it with source data from $sourceEnvironment->label ($sourceEnvironment->name)");
if (!$answer) {
return 1;
}

if (!$input->getOption('no-code')) {
$codeCopyResponse = $this->mirrorCode($acquiaCloudClient, $destinationEnvironmentUuid, $sourceEnvironment, $outputCallback);
}

if (!$input->getOption('no-databases')) {
$dbCopyResponse = $this->mirrorDatabase($acquiaCloudClient, $sourceEnvironmentUuid, $destinationEnvironmentUuid, $outputCallback);
}

if (!$input->getOption('no-files')) {
$filesCopyResponse = $this->mirrorFiles($environmentsResource, $sourceEnvironmentUuid, $destinationEnvironmentUuid);
}

if (!$input->getOption('no-config')) {
$configCopyResponse = $this->mirrorConfig($sourceEnvironment, $destinationEnvironment, $environmentsResource, $destinationEnvironmentUuid, $outputCallback);
}

if (isset($codeCopyResponse) && !$this->waitForNotificationToComplete($acquiaCloudClient, CommandBase::getNotificationUuidFromResponse($codeCopyResponse), 'Waiting for code copy to complete')) {
throw new AcquiaCliException('Cloud API failed to copy code');
}
if (isset($dbCopyResponse) && !$this->waitForNotificationToComplete($acquiaCloudClient, CommandBase::getNotificationUuidFromResponse($dbCopyResponse), 'Waiting for database copy to complete')) {
throw new AcquiaCliException('Cloud API failed to copy database');
}
if (isset($filesCopyResponse) && !$this->waitForNotificationToComplete($acquiaCloudClient, CommandBase::getNotificationUuidFromResponse($filesCopyResponse), 'Waiting for files copy to complete')) {
throw new AcquiaCliException('Cloud API failed to copy files');
}
if (isset($configCopyResponse) && !$this->waitForNotificationToComplete($acquiaCloudClient, CommandBase::getNotificationUuidFromResponse($configCopyResponse), 'Waiting for config copy to complete')) {
throw new AcquiaCliException('Cloud API failed to copy config');
}

$this->io->success([
"Done! $destinationEnvironment->label now matches $sourceEnvironment->label",
"You can visit it here:",
"https://" . $destinationEnvironment->domains[0],
]);

return Command::SUCCESS;
}

private function getDefaultDatabase(array $databases): ?object
{
foreach ($databases as $database) {
if ($database->flags->default) {
return $database;
}
}
return null;
}

private function mirrorDatabase(Client $acquiaCloudClient, mixed $sourceEnvironmentUuid, mixed $destinationEnvironmentUuid, callable $outputCallback): OperationResponse
{
$this->checklist->addItem("Initiating database copy");
$outputCallback('out', "Getting a list of databases");
$databasesResource = new Databases($acquiaCloudClient);
$databases = $acquiaCloudClient->request('get', "/environments/$sourceEnvironmentUuid/databases");
$defaultDatabase = $this->getDefaultDatabase($databases);
$outputCallback('out', "Copying $defaultDatabase->name");


$dbCopyResponse = $databasesResource->copy($sourceEnvironmentUuid, $defaultDatabase->name, $destinationEnvironmentUuid);
$this->checklist->completePreviousItem();
return $dbCopyResponse;
}

private function mirrorCode(Client $acquiaCloudClient, mixed $destinationEnvironmentUuid, EnvironmentResponse $sourceEnvironment, callable $outputCallback): mixed
{
$this->checklist->addItem("Initiating code switch");
$outputCallback('out', "Switching to {$sourceEnvironment->vcs->path}");
$codeCopyResponse = $acquiaCloudClient->request('post', "/environments/$destinationEnvironmentUuid/code/actions/switch", [
'form_params' => [
'branch' => $sourceEnvironment->vcs->path,
],
]);
$codeCopyResponse->links = $codeCopyResponse->_links;
$this->checklist->completePreviousItem();
return $codeCopyResponse;
}

private function mirrorFiles(Environments $environmentsResource, mixed $sourceEnvironmentUuid, mixed $destinationEnvironmentUuid): OperationResponse
{
$this->checklist->addItem("Initiating files copy");
$filesCopyResponse = $environmentsResource->copyFiles($sourceEnvironmentUuid, $destinationEnvironmentUuid);
$this->checklist->completePreviousItem();
return $filesCopyResponse;
}

private function mirrorConfig(EnvironmentResponse $sourceEnvironment, EnvironmentResponse $destinationEnvironment, Environments $environmentsResource, mixed $destinationEnvironmentUuid, callable $outputCallback): OperationResponse
{
$this->checklist->addItem("Initiating config copy");
$outputCallback('out', "Copying PHP version, acpu memory limit, etc.");
$config = (array) $sourceEnvironment->configuration->php;
$config['apcu'] = max(32, $sourceEnvironment->configuration->php->apcu);
if ($config['version'] == $destinationEnvironment->configuration->php->version) {
unset($config['version']);
}
unset($config['memcached_limit']);
$configCopyResponse = $environmentsResource->update($destinationEnvironmentUuid, $config);
$this->checklist->completePreviousItem();
return $configCopyResponse;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Env;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Endpoints\Environments;
use AcquiaCloudApi\Response\EnvironmentResponse;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'env:delete', description: 'Delete a Continuous Delivery Environment (CDE)')]
final class EnvDeleteCommand extends CommandBase
{
protected function configure(): void
{
$this->acceptEnvironmentId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->output = $output;
$cloudAppUuid = $this->determineCloudApplication(true);
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environmentsResource = new Environments($acquiaCloudClient);
$environment = $this->determineEnvironmentCde($environmentsResource, $cloudAppUuid);
$environmentsResource->delete($environment->uuid);

$this->io->success([
"The $environment->label environment is being deleted",
]);

return Command::SUCCESS;
}

private function determineEnvironmentCde(Environments $environmentsResource, string $cloudAppUuid): EnvironmentResponse
{
if ($this->input->getArgument('environmentId')) {

$environmentId = $this->input->getArgument('environmentId');
return $environmentsResource->get($environmentId);
}
$environments = $environmentsResource->getAll($cloudAppUuid);
$cdes = [];
foreach ($environments as $environment) {
if ($environment->flags->cde) {
$cdes[] = $environment;
}
}
if (!$cdes) {
throw new AcquiaCliException('There are no existing CDEs for Application ' . $cloudAppUuid);
}
return $this->promptChooseFromObjectsOrArrays($cdes, 'uuid', 'label', "Which Continuous Delivery Environment (CDE) do you want to delete?");
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Env;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Output\Checklist;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\Databases;
use AcquiaCloudApi\Endpoints\Environments;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'env:create', description: 'Create a new Continuous Delivery Environment (CDE)')]
final class EnvCreateCommand extends CommandBase
{
private Checklist $checklist;

protected function configure(): void
{
$this->addArgument('label', InputArgument::REQUIRED, 'The label of the new environment');
$this->addArgument('branch', InputArgument::OPTIONAL, 'The vcs path (git branch name) to deploy to the new environment');
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->output = $output;
$cloudAppUuid = $this->determineCloudApplication(true);
$label = $input->getArgument('label');
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$environmentsResource = new Environments($acquiaCloudClient);
$this->checklist = new Checklist($output);

$this->validateLabel($environmentsResource, $cloudAppUuid, $label);
$branch = $this->getBranch($acquiaCloudClient, $cloudAppUuid, $input);
$databaseNames = $this->getDatabaseNames($acquiaCloudClient, $cloudAppUuid);

$this->checklist->addItem("Initiating environment creation");
$response = $environmentsResource->create($cloudAppUuid, $label, $branch, $databaseNames);
$notificationUuid = CommandBase::getNotificationUuidFromResponse($response);
$this->checklist->completePreviousItem();

$success = function () use ($environmentsResource, $cloudAppUuid, $label): void {
$environments = $environmentsResource->getAll($cloudAppUuid);
foreach ($environments as $environment) {
if ($environment->label === $label) {
break;
}
}
if (isset($environment)) {
$this->output->writeln([
'',
"<comment>Your CDE URL:</comment> <href=https://{$environment->domains[0]}>{$environment->domains[0]}</>",
]);
}
};
$success = $this->waitForNotificationToComplete($acquiaCloudClient, $notificationUuid, "Waiting for the environment to be ready. This usually takes 2 - 15 minutes.", $success);
if (!$success) {
throw new AcquiaCliException('Cloud API failed to create environment');
}

return Command::SUCCESS;
}

private function validateLabel(Environments $environmentsResource, string $cloudAppUuid, string $title): void
{
$this->checklist->addItem("Checking to see that label is unique");

$environments = $environmentsResource->getAll($cloudAppUuid);
foreach ($environments as $environment) {
if ($environment->label === $title) {
throw new AcquiaCliException("An environment named $title already exists.");
}
}
$this->checklist->completePreviousItem();
}





private function getBranch(Client $acquiaCloudClient, ?string $cloudAppUuid, InputInterface $input): string
{
$branchesAndTags = $acquiaCloudClient->request('get', "/applications/$cloudAppUuid/code");
if ($input->getArgument('branch')) {
$branch = $input->getArgument('branch');
if (!in_array($branch, array_column($branchesAndTags, 'name'), true)) {
throw new AcquiaCliException("There is no branch or tag with the name $branch on the remote VCS.",);
}
return $branch;
}
$branchOrTag = $this->promptChooseFromObjectsOrArrays($branchesAndTags, 'name', 'name', "Choose a branch or tag to deploy to the new environment");
return $branchOrTag->name;
}




private function getDatabaseNames(Client $acquiaCloudClient, ?string $cloudAppUuid): array
{
$this->checklist->addItem("Determining default database");
$databasesResource = new Databases($acquiaCloudClient);
$databases = $databasesResource->getNames($cloudAppUuid);
$databaseNames = [];
foreach ($databases as $database) {
$databaseNames[] = $database->name;
}
$this->checklist->completePreviousItem();
return $databaseNames;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;

#[AsCommand(name: 'app:new:local', description: 'Create a new Drupal or Next.js project', aliases: ['new'])]
final class NewCommand extends CommandBase
{



private static array $distros = [
'acquia_drupal_cms' => 'acquia/drupal-cms-project',
'acquia_drupal_recommended' => 'acquia/drupal-recommended-project',
];
protected function configure(): void
{
$this
->addArgument('directory', InputArgument::OPTIONAL, 'The destination directory')
->addOption('template', 't', InputOption::VALUE_OPTIONAL, 'The project template', null, array_keys(self::$distros))
->addUsage('-t acquia_drupal_recommended');
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->output->writeln('Acquia recommends most customers use <options=bold>acquia/drupal-recommended-project</> to setup a Drupal project, which includes useful utilities such as Acquia Connector.');
$this->output->writeln('<options=bold>acquia/drupal-cms-project</> is Drupal CMS scaffolded to work with Acquia hosting.');

if ($input->hasOption('template') && $input->getOption('template')) {
$project = $input->getOption('template');
} else {
$project = $this->io->choice('Choose a starting project', array_values(self::$distros), self::$distros['acquia_drupal_recommended']);
$project = array_search($project, self::$distros, true);
}

if ($input->hasArgument('directory') && $input->getArgument('directory')) {
$dir = Path::canonicalize($input->getArgument('directory'));
$dir = Path::makeAbsolute($dir, getcwd());
} elseif (AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
$dir = '/home/ide/project';
} else {
$dir = Path::makeAbsolute($project, getcwd());
}

$output->writeln('<info>Creating project. This may take a few minutes.</info>');

$successMessage = "<info>New 💧 Drupal project created in $dir. 🎉</info>";
$this->localMachineHelper->checkRequiredBinariesExist(['composer']);
$this->createDrupalProject(self::$distros[$project], $dir);

$this->initializeGitRepository($dir);

$output->writeln('');
$output->writeln($successMessage);

return Command::SUCCESS;
}




private function createDrupalProject(string $project, string $dir): void
{
$process = $this->localMachineHelper->execute([
'composer',
'create-project',
$project,
$dir,
'--no-interaction',
]);
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Unable to create new project.");
}
}




private function initializeGitRepository(string $dir): void
{
if (
$this->localMachineHelper->getFilesystem()
->exists(Path::join($dir, '.git'))
) {
$this->logger->debug('.git directory detected, skipping Git repo initialization');
return;
}
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$this->localMachineHelper->execute([
'git',
'init',
'--initial-branch=main',
], null, $dir);

$this->localMachineHelper->execute([
'git',
'add',
'-A',
], null, $dir);

$this->localMachineHelper->execute([
'git',
'commit',
'--message',
'Initial commit.',
'--quiet',
], null, $dir);

}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'app:unlink', description: 'Remove local association between your project and a Cloud Platform application', aliases: ['unlink'])]
final class UnlinkCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->validateCwdIsValidDrupalProject();

$projectDir = $this->projectDir;
if (!$this->getCloudUuidFromDatastore()) {
throw new AcquiaCliException('There is no Cloud Platform application linked to {projectDir}', ['projectDir' => $projectDir]);
}

$application = $this->getCloudApplication($this->datastoreAcli->get('cloud_app_uuid'));
$this->datastoreAcli->set('cloud_app_uuid', null);
$output->writeln("<info>Unlinked <options=bold>$projectDir</> from Cloud application <options=bold>$application->name</></info>");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From;

use Acquia\Cli\Command\App\From\Safety\ArrayValidationTrait;




final class Configuration
{
use ArrayValidationTrait;
use JsonResourceParserTrait;






protected array $array;







protected function __construct(array $config)
{
$this->array = static::schema([
'rootPackageDefinition' => 'is_array',
])($config);
}












public static function createFromResource($configuration_resource): Configuration
{
return new static(static::parseJsonResource($configuration_resource));
}










public function getRootPackageDefinition(): array
{
return $this->array['rootPackageDefinition'];
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;




final class Drupal7Extension implements ExtensionInterface
{






protected string $type;




protected string $name;




protected bool $enabled;




protected string $humanName;




protected string $version;















protected function __construct(string $type, string $name, bool $enabled, string $human_name, string $version)
{
assert(in_array($type, ['module', 'theme']));
$this->type = $type;
$this->name = $name;
$this->enabled = $enabled;
$this->humanName = !empty($human_name) ? $human_name : $name;
$this->version = $version;
}









public static function createFromStdClass(object $extension): Drupal7Extension
{
return new static(
$extension->type,
$extension->name,
$extension->status,
$extension->humanName ?? $extension->name,
$extension->version ?? 'Unknown',
);
}

public function getName(): string
{
return $this->name;
}

public function getHumanName(): string
{
return $this->humanName;
}

public function getVersion(): string
{
return $this->version;
}

public function isModule(): bool
{
return $this->type === 'module';
}

public function isTheme(): bool
{
return $this->type === 'theme';
}

public function isEnabled(): bool
{
return $this->enabled;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;




interface ExtensionInterface
{






public function getName(): string;







public function getHumanName(): string;







public function getVersion(): string;







public function isModule(): bool;







public function isTheme(): bool;







public function isEnabled(): bool;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;

abstract class SiteInspectorBase implements SiteInspectorInterface
{



public function getExtensions(int $flags): array
{
$state_flags = $flags & (SiteInspectorInterface::FLAG_EXTENSION_ENABLED | SiteInspectorInterface::FLAG_EXTENSION_DISABLED);
$type_flags = $flags & (SiteInspectorInterface::FLAG_EXTENSION_MODULE | SiteInspectorInterface::FLAG_EXTENSION_THEME);
return array_filter($this->readExtensions(), function (ExtensionInterface $extension) use ($state_flags, $type_flags) {

$has = $extension->isEnabled() ? SiteInspectorInterface::FLAG_EXTENSION_ENABLED : SiteInspectorInterface::FLAG_EXTENSION_DISABLED;

$has = $has | ($extension->isModule() ? SiteInspectorInterface::FLAG_EXTENSION_MODULE : 0);
$has = $has | ($extension->isTheme() ? SiteInspectorInterface::FLAG_EXTENSION_THEME : 0);


return ($has & $type_flags) && ($has & $state_flags);
});
}







abstract protected function readExtensions(): array;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;

use Acquia\Cli\Command\App\From\JsonResourceParserTrait;

final class ExportedDrupal7ExtensionsInspector extends SiteInspectorBase
{
use JsonResourceParserTrait;







protected function __construct(
protected array $extensions
) {
}









public static function createFromResource($extensions_resource): static
{
assert(is_resource($extensions_resource));
return new static(static::parseExtensionsFromResource($extensions_resource));
}




protected function readExtensions(): array
{
return $this->extensions;
}

public function getPublicFilePath(): string
{
return 'sites/default/files';
}

public function getPrivateFilePath(): ?string
{
return null;
}









protected static function parseExtensionsFromResource($extensions_resource): array
{
return array_map(function (array $extension) {
$extension['status'] = $extension['enabled'];
return Drupal7Extension::createFromStdClass((object) $extension);
}, static::parseJsonResource($extensions_resource));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;

use Acquia\Cli\Command\App\NewFromDrupal7Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Validator\Exception\ValidatorException;




final class Drupal7SiteInspector extends SiteInspectorBase
{



protected string $root;




public string $uri;










public function __construct(string $drupal_root, string $uri = 'default')
{
$this->root = $drupal_root;
$this->uri = $uri;
}






protected function readExtensions(): array
{
$this->bootstrap();

$enabled = system_list('module_enabled');

unset($enabled['standard']);
$modules = array_values(array_map(function (string $name) use ($enabled) {

return (object) [
'name' => $name,
'status' => true,
'type' => 'module',
'humanName' => $enabled[$name]->info['name'],
'version' => $enabled[$name]->info['version'],
];

}, array_keys($enabled)));
return array_map([
Drupal7Extension::class,
'createFromStdClass',
], $modules);
}

public function getPublicFilePath(): string
{
$this->bootstrap();


return variable_get('file_public_path', conf_path() . '/files');
}

public function getPrivateFilePath(): ?string
{
$this->bootstrap();

return variable_get('file_private_path', null);
}




protected function bootstrap(): void
{
static $bootstrapped;
if ($bootstrapped) {
return;
}
$previous_directory = getcwd();
chdir($this->root);
if (!defined('DRUPAL_ROOT')) {
define('DRUPAL_ROOT', $this->root);
}

$_SERVER['HTTP_HOST'] = $this->uri;
$_SERVER['REQUEST_URI'] = $this->uri . '/';
$_SERVER['PHP_SELF'] = $_SERVER['REQUEST_URI'] . 'index.php';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['SERVER_SOFTWARE'] = null;
$_SERVER['HTTP_USER_AGENT'] = 'console';
$_SERVER['SCRIPT_FILENAME'] = DRUPAL_ROOT . '/index.php';

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
chdir($previous_directory);
$bootstrapped = true;
}









public static function validateDrupal7Root(string $path): string
{
$path = rtrim($path, '/');
if (!file_exists($path)) {
throw new ValidatorException(sprintf("The path '%s' does not exist. Please enter the absolute path to a Drupal 7 application root.", $path));
}
if (!file_exists("$path/index.php")) {
throw new ValidatorException(sprintf("The '%s' directory does not seem to be the root of a Drupal 7 application. It does not contain a index.php file.", $path));
}
if (!file_exists("$path/sites/default/default.settings.php")) {
throw new ValidatorException(sprintf("The '%s' directory does not seem to be the root of a Drupal 7 application. It does not contain a sites/default/default.settings.php.", $path));
}
return $path;
}











public static function getSiteUri(InputInterface $input, string $drupal_root): string
{

$site_dirs = array_map(function ($path) use ($drupal_root) {
return substr($path, strlen("$drupal_root/sites/"), -1 * strlen('/settings.php'));
}, glob("$drupal_root/sites/*/settings.php"));


if ($input->getOption('drupal7-uri') !== null) {
$uri = $input->getOption('drupal7-uri');
$sites_location = "$drupal_root/sites/sites.php";


if (!file_exists($sites_location) && !in_array($uri, $site_dirs, true)) {
throw new \InvalidArgumentException(
sprintf('The given --drupal7-uri value does not correspond to an installed sites directory and a sites.php file could not be located.'),
NewFromDrupal7Command::ERR_UNRECOGNIZED_HOST
);
}

$sites = [];


include $sites_location;


if (!empty($sites)) {



if (isset($sites[$uri])) {
if (!in_array($sites[$uri], $site_dirs, true)) {
throw new \InvalidArgumentException(
sprintf('The given --drupal7-uri value corresponds to a site directory in sites.php, but that directory does not have a settings.php file. This typically means that the site has not been installed.'),
NewFromDrupal7Command::ERR_UNRECOGNIZED_HOST
);
}

return $uri;
}

throw new \InvalidArgumentException(
sprintf('The given --drupal7-uri value does not correspond to any configuration in sites.php.'),
NewFromDrupal7Command::ERR_UNRECOGNIZED_HOST
);
}

if (in_array($uri, $site_dirs, true)) {
return $uri;
}
}



if (count($site_dirs) === 1) {
return current($site_dirs);
} elseif (in_array('default', $site_dirs, true)) {
return 'default';
}


throw new \InvalidArgumentException(
sprintf('A Drupal 7 installation could not be located.'),
NewFromDrupal7Command::ERR_INDETERMINATE_SITE
);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\SourceSite;




interface SiteInspectorInterface
{





public const FLAG_EXTENSION_DISABLED = 1 << 1;






public const FLAG_EXTENSION_THEME = 1 << 3;






public const FLAG_EXTENSION_MODULE = 1 << 2;






public const FLAG_EXTENSION_ENABLED = 1 << 0;


















public function getExtensions(int $flags): array;




public function getPublicFilePath(): string;








public function getPrivateFilePath(): ?string;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Composer;

use Acquia\Cli\Command\App\From\Configuration;
use Acquia\Cli\Command\App\From\Recommendation\AbandonmentRecommendation;
use Acquia\Cli\Command\App\From\Recommendation\NormalizableInterface;
use Acquia\Cli\Command\App\From\Recommendation\RecommendationInterface;
use Acquia\Cli\Command\App\From\Recommendation\Resolver;
use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use Acquia\Cli\Command\App\From\SourceSite\SiteInspectorInterface;




final class ProjectBuilder
{



protected Configuration $configuration;




protected Resolver $resolver;




protected SiteInspectorInterface $siteInspector;











public function __construct(Configuration $configuration, Resolver $recommendation_resolver, SiteInspectorInterface $site_inspector)
{
$this->configuration = $configuration;
$this->resolver = $recommendation_resolver;
$this->siteInspector = $site_inspector;
}












public function buildProject(): array
{
$modules_to_install = [];
$recommendations = [];
$composer_json = $this->configuration->getRootPackageDefinition();


foreach ($this->resolver->getRecommendations() as $recommendation) {
assert($recommendation instanceof RecommendationInterface);
if ($recommendation instanceof NormalizableInterface) {
$recommendations[] = $recommendation->normalize();
}
if ($recommendation instanceof AbandonmentRecommendation) {
continue;
}
$recommended_package_name = $recommendation->getPackageName();



















if ($recommended_package_name === 'drupal/core') {
$core_version_constraint = $recommendation->getVersionConstraint();
if ($core_version_constraint !== '*') {
$composer_json['require']['drupal/core-composer-scaffold'] = $core_version_constraint;
$composer_json['require']['drupal/core-project-message'] = $core_version_constraint;
$composer_json['require']['drupal/core-recommended'] = $core_version_constraint;
}
} else {
$composer_json['require'][$recommended_package_name] = $recommendation->getVersionConstraint();
}
if ($recommendation->hasPatches()) {
$composer_json['extra']['patches'][$recommended_package_name] = $recommendation->getPatches();
}
if ($recommendation->isVetted() && $recommendation->hasModulesToInstall()) {
array_push($modules_to_install, ...$recommendation->getModulesToInstall());
}
}


$modules_to_install = array_unique($modules_to_install);


sort($modules_to_install);
if (isset($composer_json['require'])) {
ksort($composer_json['require']);
}
if (isset($composer_json['extra']['patches'])) {
ksort($composer_json['extra']['patches']);
}

$source_modules = array_values(array_map(function (ExtensionInterface $module) {

return [
'name' => $module->getName(),
'humanName' => $module->getHumanName(),
'version' => $module->getVersion(),
];

}, $this->siteInspector->getExtensions(SiteInspectorInterface::FLAG_EXTENSION_MODULE | SiteInspectorInterface::FLAG_EXTENSION_ENABLED)));
$module_names = array_column($source_modules, 'name');
array_multisort($module_names, SORT_STRING, $source_modules);

$recommendation_ids = array_column($recommendations, 'id');
array_multisort($recommendation_ids, SORT_STRING, $recommendations);


return [
'installModules' => $modules_to_install,
'filePaths' => [
'public' => $this->siteInspector->getPublicFilePath(),
'private' => $this->siteInspector->getPrivateFilePath(),
],
'sourceModules' => $source_modules,
'recommendations' => $recommendations,
'rootPackageDefinition' => $composer_json,
];

}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\Safety\ArrayValidationTrait;
use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use Closure;
use Exception;






class DefinedRecommendation implements RecommendationInterface, NormalizableInterface
{
use ArrayValidationTrait;

/**
@const


*/
protected const NOTE_PLACEHOLDER_STRING = '%note%';





protected \Closure $evaluateExtension;




protected string $packageName;




protected string $versionConstraint;






protected array $install;




protected bool $vetted;




protected string $note;









protected array $patches;






protected array $appliedTo = [];




















protected function __construct(Closure $extension_evaluator, string $package_name, string $version_constraint, array $install, bool $vetted, string $note, array $patches = [])
{
$this->evaluateExtension = $extension_evaluator;
$this->packageName = $package_name;
$this->versionConstraint = $version_constraint;
$this->install = $install;
$this->vetted = $vetted;
$this->note = $note;
$this->patches = $patches;
}












public static function createFromDefinition(mixed $definition): RecommendationInterface
{

$defaults = [
'universal' => false,
'patches' => [],
'install' => [],
'vetted' => false,
'note' => static::NOTE_PLACEHOLDER_STRING,
];
$validate_if_universal_is_false = Closure::fromCallable(function ($context) {
return $context['universal'] === false;
});

if (is_array($definition) && array_key_exists('package', $definition) && is_null($definition['package'])) {
return AbandonmentRecommendation::createFromDefinition($definition);
}

$validator = static::schema([
'universal' => 'is_bool',
'install' => static::listOf('is_string'),
'package' => 'is_string',
'constraint' => 'is_string',
'note' => 'is_string',
'replaces' => static::conditionalSchema([
'name' => 'is_string',
], $validate_if_universal_is_false),
'patches' => static::dictionaryOf('is_string'),
'vetted' => 'is_bool',
], $defaults);

try {
$validated = $validator($definition);
} catch (Exception $e) {




return new NoRecommendation();
}
$package_name = $validated['package'];
$version_constraint = $validated['constraint'];
$install = $validated['install'];
$patches = $validated['patches'];
$vetted = $validated['vetted'];
$note = $validated['note'];
if ($validated['universal']) {
return new UniversalRecommendation($package_name, $version_constraint, $install, $vetted, $note, $patches);
}
return new DefinedRecommendation(Closure::fromCallable(function (ExtensionInterface $extension) use ($validated): bool {
return $extension->getName() === $validated['replaces']['name'];
}), $package_name, $version_constraint, $install, $vetted, $note, $patches);
}

public function applies(ExtensionInterface $extension): bool
{
if (($this->evaluateExtension)($extension)) {
array_push($this->appliedTo, $extension);
return true;
}
return false;
}

public function getPackageName(): string
{
return $this->packageName;
}

public function getVersionConstraint(): string
{
return $this->versionConstraint;
}

public function hasModulesToInstall(): bool
{
return !empty($this->install);
}




public function getModulesToInstall(): array
{
return $this->install;
}

public function isVetted(): bool
{
return $this->vetted;
}

public function hasPatches(): bool
{
return !empty($this->patches);
}




public function getPatches(): array
{
return $this->patches;
}




public function normalize(): array
{

$normalized = [
'type' => 'packageRecommendation',
'id' => "$this->packageName:$this->versionConstraint",
'attributes' => [
'requirePackage' => [
'name' => $this->packageName,
'versionConstraint' => $this->versionConstraint,
],
'installModules' => $this->install,
'vetted' => $this->vetted,
],
];

if (!empty($this->note) && $this->note !== static::NOTE_PLACEHOLDER_STRING) {
$normalized['attributes']['note'] = $this->note;
}

$recommended_for = [
'data' => array_map(function (ExtensionInterface $extension) {
return [
'type' => $extension->isModule() ? 'module' : 'theme',
'id' => $extension->getName(),
];
}, $this->appliedTo),
];

if (!empty($recommended_for['data'])) {
$normalized['relationships']['recommendedFor'] = $recommended_for;
}

$links = array_reduce(array_keys($this->patches), function (array $links, string $patch_description) {
$links['patch-file--' . md5($patch_description)] = [
'href' => $this->patches[$patch_description],
'rel' => 'https://github.com/acquia/acquia_migrate#link-rel-patch-file',
'title' => $patch_description,
];
return $links;
}, []);
if (!empty($links)) {
$normalized['links'] = $links;
}

return $normalized;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use Acquia\Cli\Command\App\From\SourceSite\SiteInspectorInterface;




final class Resolver
{





protected SiteInspectorInterface $inspector;




protected Recommendations $universalRecommendations;




protected Recommendations $conditionalRecommendations;











public function __construct(SiteInspectorInterface $inspector, Recommendations $recommendations)
{
$this->inspector = $inspector;
$this->universalRecommendations = new Recommendations([]);
$this->conditionalRecommendations = new Recommendations([]);
foreach ($recommendations as $recommendation) {
if ($recommendation instanceof UniversalRecommendation) {
$this->universalRecommendations->append($recommendation);
} else {
$this->conditionalRecommendations->append($recommendation);
}
}
}







public function getRecommendations(): Recommendations
{
$enabled_modules = $this->inspector->getExtensions(SiteInspectorInterface::FLAG_EXTENSION_ENABLED | SiteInspectorInterface::FLAG_EXTENSION_MODULE);
return array_reduce($enabled_modules, function (Recommendations $recommendations, ExtensionInterface $extension) {
$resolutions = $this->getRecommendationsForExtension($extension);
foreach ($resolutions as $resolution) {
if (!$resolution instanceof NoRecommendation) {
$recommendations->append($resolution);
}
}
return $recommendations;
}, $this->universalRecommendations);
}










protected function getRecommendationsForExtension(ExtensionInterface $extension): Recommendations
{
$recommendations = new Recommendations();
foreach ($this->conditionalRecommendations as $recommendation) {
if ($recommendation->applies($extension)) {
$recommendations->append($recommendation);
}
}
return $recommendations;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;




interface NormalizableInterface
{






public function normalize(): array;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\Safety\ArrayValidationTrait;
use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use Closure;
use Exception;
use LogicException;




class AbandonmentRecommendation implements RecommendationInterface, NormalizableInterface
{
use ArrayValidationTrait;





protected \Closure $evaluateExtension;






protected array $definition;






protected array $appliedTo = [];










protected function __construct(Closure $extension_evaluator, array $definition)
{
$this->evaluateExtension = $extension_evaluator;
$this->definition = $definition;
}












public static function createFromDefinition(mixed $definition): RecommendationInterface
{

$validator = static::schema([
'package' => 'is_null',
'note' => 'is_string',
'replaces' => static::schema([
'name' => 'is_string',
]),
'vetted' => 'is_bool',
]);

try {
$validated = $validator($definition);
} catch (Exception $e) {




return new NoRecommendation();
}
return new AbandonmentRecommendation(Closure::fromCallable(function (ExtensionInterface $extension) use ($validated): bool {
return $extension->getName() === $validated['replaces']['name'];
}), $validated);
}

public function applies(ExtensionInterface $extension): bool
{
if (($this->evaluateExtension)($extension)) {
array_push($this->appliedTo, $extension);
return true;
}
return false;
}

public function getPackageName(): string
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a % class instance.', __FUNCTION__, __CLASS__));
}

public function getVersionConstraint(): string
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function hasModulesToInstall(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}




public function getModulesToInstall(): array
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function hasPatches(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function isVetted(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}




public function getPatches(): array
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}




public function normalize(): array
{

$normalized = [
'type' => 'abandonmentRecommendation',
'id' => "abandon:{$this->definition['replaces']['name']}",
'attributes' => [
'note' => $this->definition['note'],
],
];

$recommended_for = [
'data' => array_map(function (ExtensionInterface $extension) {
return [
'type' => $extension->isModule() ? 'module' : 'theme',
'id' => $extension->getName(),
];
}, $this->appliedTo),
];

if (!empty($recommended_for['data'])) {
$normalized['relationships']['recommendedFor'] = $recommended_for;
}

return $normalized;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\JsonResourceParserTrait;
use ArrayIterator;
use Exception;




final class Recommendations extends ArrayIterator
{
use JsonResourceParserTrait;










public static function createFromResource($recommendations_resource): Recommendations
{
try {
$parsed = static::parseJsonResource($recommendations_resource);
} catch (Exception $e) {




return new static([]);
}
$config_recommendations = $parsed['data'] ?? [];
if (!is_array($config_recommendations)) {
return new static([]);
}
return new static(array_filter(array_map(function ($config) {
return DefinedRecommendation::createFromDefinition($config);
}, $config_recommendations), function (RecommendationInterface $recommendation) {
return !$recommendation instanceof NoRecommendation;
}));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Closure;
use LogicException;




final class UniversalRecommendation extends DefinedRecommendation
{



protected function __construct(string $package_name, string $version_constraint, array $install, bool $vetted, string $note, array $patches = [])
{
parent::__construct(Closure::fromCallable(function (): void {
throw new LogicException(sprintf('It is nonsensical to call the applies() method on a % class instance.', __CLASS__));
}), $package_name, $version_constraint, $install, $vetted, $note, $patches);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use LogicException;




final class NoRecommendation implements RecommendationInterface
{
public function applies(ExtensionInterface $extension): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function getPackageName(): string
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a % class instance.', __FUNCTION__, __CLASS__));
}

public function getVersionConstraint(): string
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function hasModulesToInstall(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}




public function getModulesToInstall(): array
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function isVetted(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}

public function hasPatches(): bool
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}




public function getPatches(): array
{
throw new LogicException(sprintf('It is nonsensical to call the %s() method on a %s class instance.', __FUNCTION__, __CLASS__));
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Recommendation;

use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;




interface RecommendationInterface
{








public function applies(ExtensionInterface $extension): bool;








public function getPackageName(): string;







public function getVersionConstraint(): string;








public function hasModulesToInstall(): bool;











public function getModulesToInstall(): array;




public function isVetted(): bool;







public function hasPatches(): bool;









public function getPatches(): array;
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Safety;

use Closure;
use DomainException;




trait ArrayValidationTrait
{










protected static function schema(array $schema, array $defaults = []): StructuredArrayValidator
{
return StructuredArrayValidator::create($schema, $defaults);
}















protected static function conditionalSchema(array $schema, callable $conditional, array $defaults = []): StructuredArrayValidator
{
return StructuredArrayValidator::createConditionalValidator($schema, $conditional, $defaults);
}









protected static function listOf(callable $item_validator): Closure
{
return self::arrayOf('is_int', $item_validator);
}










protected static function dictionaryOf(callable $entry_validator): Closure
{
return self::arrayOf('is_string', $entry_validator);
}












private static function arrayOf(callable $key_validator, callable $value_validator): \Closure
{
assert(in_array($key_validator, ['is_int', 'is_string'], true));
return Closure::fromCallable(function ($values) use ($key_validator, $value_validator) {
if (!is_array($values)) {
throw new DomainException('Validated value is not an array.');
}
foreach ($values as $index => $value) {
if (!$key_validator($index)) {
throw new DomainException("The array key `$index` must be an integer or a string.");
} elseif ($value_validator instanceof StructuredArrayValidator || $value_validator instanceof Closure) {
$values[$index] = $value_validator($value);
} elseif (!call_user_func_array($value_validator, [$value])) {
throw new DomainException('Failed to validate value.');
}
}
return $values;
});
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From\Safety;

use Closure;
use DomainException;
use Exception;




final class StructuredArrayValidator
{




protected const KEYS_ARE_STRINGS = __CLASS__ . '%array_keys_are_string%';






protected array $schema;






protected array $defaults;






protected $conditional;











protected function __construct(array $schema, array $defaults, bool|\Closure $conditional)
{
assert(!isset($schema[static::KEYS_ARE_STRINGS]) || empty(array_diff_key($schema, array_flip([static::KEYS_ARE_STRINGS]))), 'A schema must contain either the KEYS_ARE_STRINGS constant or validations for specific array keys, but not both.');
assert($conditional === false || $conditional instanceof Closure);
$this->schema = $schema;
$this->defaults = $defaults;
$this->conditional = $conditional;
}











public static function create(array $schema, array $defaults = []): static
{
return new static($schema, $defaults, false);
}



















public static function createConditionalValidator(array $schema, Closure $conditional, array $defaults = []): static
{
return new static($schema, $defaults, $conditional);
}










public function __invoke(mixed $arr): array
{
if (!is_array($arr)) {
throw new DomainException('Validated value is not an array.');
}
$arr += $this->defaults;

foreach ($this->schema as $schema_key => $validation) {


$should_validate = !$validation instanceof self || !$validation->isConditional() || ($validation->conditional)($arr);
if ($should_validate && !array_key_exists($schema_key, $arr)) {
throw new DomainException("Missing required key: $schema_key");
} else {


if ($validation instanceof self && !$should_validate) {
unset($arr[$schema_key]);
} else {
if ($validation instanceof self || $validation instanceof Closure) {
$arr[$schema_key] = $validation($arr[$schema_key]);
} elseif (!call_user_func_array($validation, [$arr[$schema_key]])) {
throw new DomainException('Failed to validate value.');
}
}
}
}
return array_intersect_key($arr, $this->schema);
}









public function isValid(mixed $arr): bool
{
try {
$this($arr);
} catch (Exception $e) {
return false;
}
return true;
}








public function isConditional(): bool
{
return (bool) $this->conditional;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App\From;




trait JsonResourceParserTrait
{








protected static function parseJsonResource($resource): mixed
{
assert(is_resource($resource));
$json = stream_get_contents($resource);
return json_decode($json, flags: JSON_OBJECT_AS_ARRAY | JSON_THROW_ON_ERROR);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Command\App\From\Composer\ProjectBuilder;
use Acquia\Cli\Command\App\From\Configuration;
use Acquia\Cli\Command\App\From\Recommendation\Recommendations;
use Acquia\Cli\Command\App\From\Recommendation\Resolver;
use Acquia\Cli\Command\App\From\SourceSite\Drupal7SiteInspector;
use Acquia\Cli\Command\App\From\SourceSite\ExportedDrupal7ExtensionsInspector;
use Acquia\Cli\Command\App\From\SourceSite\ExtensionInterface;
use Acquia\Cli\Command\App\From\SourceSite\SiteInspectorInterface;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;
use Symfony\Component\Validator\Exception\ValidatorException;

#[AsCommand(name: 'app:new:from:drupal7', description: 'Generate a new Drupal 9+ project from a Drupal 7 application using the default Acquia Migrate Accelerate recommendations.', aliases: [

'from:d7',

'ama',
])]
final class NewFromDrupal7Command extends CommandBase
{






public const ERR_UNRECOGNIZED_HOST = 3;







public const ERR_INDETERMINATE_SITE = 4;

protected function configure(): void
{
$this
->addOption('drupal7-directory', 'source', InputOption::VALUE_OPTIONAL, 'The root of the Drupal 7 application')
->addOption('drupal7-uri', 'uri', InputOption::VALUE_OPTIONAL, 'Only necessary in case of a multisite. If a single site, this will be computed automatically.')
->addOption('stored-analysis', 'analysis', InputOption::VALUE_OPTIONAL, 'As an alternative to drupal7-directory, it is possible to pass a stored analysis.')
->addOption('recommendations', 'recommendations', InputOption::VALUE_OPTIONAL, 'Overrides the default recommendations.')
->addOption('directory', 'destination', InputOption::VALUE_OPTIONAL, 'The directory where to generate the new application.');
}

private function getInspector(InputInterface $input): SiteInspectorInterface
{
if ($input->getOption('stored-analysis') !== null) {
$analysis_json = $input->getOption('stored-analysis');
$extensions_resource = fopen($analysis_json, 'r');
$inspector = ExportedDrupal7ExtensionsInspector::createFromResource($extensions_resource);
fclose($extensions_resource);
return $inspector;
}


$d7_root = $this->determineOption('drupal7-directory', false, Drupal7SiteInspector::validateDrupal7Root(...), null, '.');


$uri = Drupal7SiteInspector::getSiteUri($input, $d7_root);

return new Drupal7SiteInspector($d7_root, $uri);
}

private function getLocation(string $location, bool $should_exist = true): string
{
if (!str_contains($location, '://')) {
$file_exists = file_exists($location);
if ($file_exists && !$should_exist) {
throw new ValidatorException(sprintf('The %s directory already exists.', $location));
}

if (!$file_exists && $should_exist) {
throw new ValidatorException(sprintf('%s could not be located. Check that the path is correct and try again.', $location));
}
if (str_starts_with($location, '.') || !self::isAbsolutePath($location)) {
$absolute = getcwd() . '/' . $location;
$location = $should_exist ? realpath($absolute) : $absolute;
}
}
return $location;
}

private static function isAbsolutePath(string $path): bool
{

return $path[0] === DIRECTORY_SEPARATOR || preg_match('~\A[A-Z]:(?![^/\\\\])~i', $path) > 0;
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
try {
$inspector = $this->getInspector($input);
} catch (\Exception $e) {
$this->io->error($e->getMessage());


return $e->getCode();
}


$output->writeln('<info>🤖 Scanning Drupal 7 site.</info>');
$extensions = $inspector->getExtensions(SiteInspectorInterface::FLAG_EXTENSION_MODULE | SiteInspectorInterface::FLAG_EXTENSION_ENABLED);
$module_count = count($extensions);
$system_module_version = array_reduce(
array_filter($extensions, fn(ExtensionInterface $extension) => $extension->isModule() && $extension->getName() === 'system'),
fn(mixed $carry, ExtensionInterface $extension) => $extension->getVersion()
);
$site_location = property_exists($inspector, 'uri') ? 'sites/' . $inspector->uri : '<location unknown>';
$output->writeln(sprintf("<info>👍 Found Drupal 7 site (%s to be precise) at %s, with %d modules enabled!</info>", $system_module_version, $site_location, $module_count));


$configuration_location = __DIR__ . '/../../../config/from_d7_config.json';
$config_resource = fopen($configuration_location, 'r');
$configuration = Configuration::createFromResource($config_resource);
fclose($config_resource);


$recommendations_location = "https://git.drupalcode.org/project/acquia_migrate/-/raw/recommendations/recommendations.json";
if ($input->getOption('recommendations') !== null) {
$raw_recommendations_location = $input->getOption('recommendations');
try {
$recommendations_location = $this->getLocation($raw_recommendations_location);
} catch (\InvalidArgumentException $e) {
$this->io->error($e->getMessage());
return Command::FAILURE;
}
}


ini_set('user_agent', 'ACLI');
$recommendations_resource = fopen($recommendations_location, 'r');
$recommendations = Recommendations::createFromResource($recommendations_resource);
fclose($recommendations_resource);



$output->writeln('<info>🤖 Computing recommendations for this Drupal 7 site…</info>');
$project_builder = new ProjectBuilder($configuration, new Resolver($inspector, $recommendations), $inspector);
$results = $project_builder->buildProject();
$unique_patch_count = array_reduce(
$results['rootPackageDefinition']['extra']['patches'],
fn(array $unique_patches, array $patches) => array_unique(array_merge($unique_patches, array_values($patches))),
[]
);
$output->writeln(sprintf(
"<info>🥳 Great news: found %d recommendations that apply to this Drupal 7 site, resulting in a composer.json with:\n\t- %d packages\n\t- %d patches\n\t- %d modules to be installed!</info>",
count($results['recommendations']),
count($results['rootPackageDefinition']['require']),
$unique_patch_count,
count($results['installModules']),
));




if ($input->getOption('directory') === null) {
$answer = $this->io->ask(
'Where should the generated composer.json be written?',
null,
function (mixed $path): string {
if (!is_string($path) || !file_exists($path) || file_exists("$path/composer.json")) {
throw new ValidatorException(sprintf("The '%s' directory either does not exist or it already contains a composer.json file.", $path));
}
return $path;
},
);
$input->setOption('directory', $answer);
}
$dir = $input->getOption('directory');




$data = array_merge(
['generated' => date(DATE_ATOM)],
$project_builder->buildProject()
);
$json_encode_flags = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR;
file_put_contents("$dir/acli-generated-project-metadata.json", json_encode($data, $json_encode_flags));
file_put_contents("$dir/composer.json", json_encode($data['rootPackageDefinition'], $json_encode_flags));
$this->initializeGitRepository($dir);
$output->writeln('<info>🚀 Generated composer.json and committed to a new git repo.</info>');
$output->writeln('');




$output->writeln('<info>⏳ Installing. This may take a few minutes.</info>');
$this->localMachineHelper->checkRequiredBinariesExist(['composer']);
$process = $this->localMachineHelper->execute([
'composer',
'install',
'--working-dir',
$dir,
'--no-interaction',
]);
if (!$process->isSuccessful()) {
throw new AcquiaCliException("Unable to create new project.");
}

$output->writeln('');
$output->writeln("<info>New 💧 Drupal project created in $dir. 🎉</info>");

return Command::SUCCESS;
}

private function initializeGitRepository(string $dir): void
{
if (
$this->localMachineHelper->getFilesystem()
->exists(Path::join($dir, '.git'))
) {
$this->logger->debug('.git directory detected, skipping Git repo initialization');
return;
}
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$this->localMachineHelper->execute([
'git',
'init',
'--initial-branch=main',
'--quiet',
], null, $dir);

$this->localMachineHelper->execute([
'git',
'add',
'-A',
], null, $dir);

$this->localMachineHelper->execute([
'git',
'commit',
'--message',
"Generated by Acquia CLI's app:new:from:drupal7.",
'--quiet',
], null, $dir);

}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Endpoints\Code;
use AcquiaCloudApi\Endpoints\Environments;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'app:vcs:info', description: 'Get all branches and tags of the application with the deployment status')]
class AppVcsInfo extends CommandBase
{
protected function configure(): void
{
$this
->addOption('deployed', null, InputOption::VALUE_OPTIONAL, 'Show only deployed branches and tags')
->addUsage('[<applicationAlias>] --deployed');
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$applicationUuid = $this->determineCloudApplication();

$cloudApiClient = $this->cloudApiClientService->getClient();

$envResource = new Environments($cloudApiClient);
$environments = $envResource->getAll($applicationUuid);

if (!$environments->count()) {
throw new AcquiaCliException('There are no environments available with this application.');
}


$showDeployedVcsOnly = $input->hasParameterOption('--deployed');


$deployedVcs = [];
foreach ($environments as $environment) {
if (isset($environment->vcs->path)) {


$deployedVcs[$environment->label] = $environment->vcs->path;
}
}


if ($showDeployedVcsOnly && empty($deployedVcs)) {
throw new AcquiaCliException('No branch or tag is deployed on any of the environment of this application.');
}

$applicationCodeResource = new Code($cloudApiClient);
$allBranchesAndTags = $applicationCodeResource->getAll($applicationUuid);

if (!$allBranchesAndTags->count()) {
throw new AcquiaCliException('No branch or tag is available with this application.');
}

$nonDeployedVcs = [];

if (!$showDeployedVcsOnly) {

foreach ($allBranchesAndTags as $branchTag) {
if (!in_array($branchTag->name, $deployedVcs, true)) {
$nonDeployedVcs[$branchTag->name] = $branchTag->name;
}
}
}


$allVcs = array_merge($deployedVcs, $nonDeployedVcs);
$headers = ['Branch / Tag Name', 'Deployed', 'Deployed Environment'];
$table = new Table($output);
$table->setHeaders($headers);
$table->setHeaderTitle('Status of Branches and Tags of the Application');
foreach ($allVcs as $vscPath => $env) {

$isDeployed = in_array($vscPath, array_keys($deployedVcs), true);
$table->addRow([
$isDeployed ? $env : $vscPath,

$vscPath !== $env ? 'Yes' : 'No',

$vscPath !== $env ? ($isDeployed ? $vscPath : $env) : 'None',
]);
}

$table->render();
$this->io->newLine();

return self::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'app:link', description: 'Associate your project with a Cloud Platform application', aliases: ['link'])]
final class LinkCommand extends CommandBase
{
protected function configure(): void
{
$this->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->validateCwdIsValidDrupalProject();
if ($cloudApplicationUuid = $this->getCloudUuidFromDatastore()) {
$cloudApplication = $this->getCloudApplication($cloudApplicationUuid);
$output->writeln('This repository is already linked to Cloud application <options=bold>' . $cloudApplication->name . '</>. Run <options=bold>acli unlink</> to unlink it.');
return 1;
}
$this->determineCloudApplication(true);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'app:task-wait', description: 'Wait for a task to complete')]
final class TaskWaitCommand extends CommandBase
{
protected function configure(): void
{
$this
->addArgument('notification-uuid', InputArgument::REQUIRED, 'The task notification UUID or Cloud Platform API response containing a linked notification')
->setHelp('Accepts either a notification UUID or Cloud Platform API response as JSON string. The JSON string must contain the _links->notification->href property.')
->addUsage('"$(acli api:environments:domain-clear-caches [environmentId] [domain])"');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$notificationUuid = $input->getArgument('notification-uuid');
$success = $this->waitForNotificationToComplete($this->cloudApiClientService->getClient(), $notificationUuid, "Waiting for task $notificationUuid to complete");
return $success ? Command::SUCCESS : Command::FAILURE;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use AcquiaCloudApi\Endpoints\Logs;
use AcquiaLogstream\LogstreamManager;
use Psr\Log\LoggerInterface;
use SelfUpdate\SelfUpdateManager;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'app:log:tail', description: 'Tail the logs from your environments', aliases: [
'tail',
'log:tail',
])]
final class LogTailCommand extends CommandBase
{
public function __construct(
public LocalMachineHelper $localMachineHelper,
protected CloudDataStore $datastoreCloud,
protected AcquiaCliDatastore $datastoreAcli,
protected ApiCredentialsInterface $cloudCredentials,
protected TelemetryHelper $telemetryHelper,
protected string $projectDir,
protected ClientService $cloudApiClientService,
public SshHelper $sshHelper,
protected string $sshDir,
LoggerInterface $logger,
public selfUpdateManager $selfUpdateManager,
protected LogstreamManager $logstreamManager,
) {
parent::__construct($this->localMachineHelper, $this->datastoreCloud, $this->datastoreAcli, $this->cloudCredentials, $this->telemetryHelper, $this->projectDir, $this->cloudApiClientService, $this->sshHelper, $this->sshDir, $logger, $this->selfUpdateManager);
}

protected function configure(): void
{
$this
->acceptEnvironmentId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$environment = $this->determineEnvironment($input, $output, true);
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$logs = $this->promptChooseLogs();
$logTypes = array_map(static function (mixed $log) {
return $log['type'];
}, $logs);
$logsResource = new Logs($acquiaCloudClient);
$stream = $logsResource->stream($environment->uuid);
$this->logstreamManager->setParams($stream->logstream->params);
$this->logstreamManager->setColourise(true);
$this->logstreamManager->setLogTypeFilter($logTypes);
$output->writeln('<info>Streaming has started and new logs will appear below. Use Ctrl+C to exit.</info>');
$this->logstreamManager->stream();
return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\App;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Exception\AcquiaCliException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'app:open', description: 'Opens your browser to view a given Cloud application', aliases: [
'open',
'o',
])]
final class AppOpenCommand extends CommandBase
{
protected function configure(): void
{
$this
->acceptApplicationUuid();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
if (!$this->localMachineHelper->isBrowserAvailable()) {
throw new AcquiaCliException('No browser is available on this machine');
}
$applicationUuid = $this->determineCloudApplication();
$this->localMachineHelper->startBrowser('https://cloud.acquia.com/a/applications/' . $applicationUuid);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'self:info', description: 'Print information about the running version of Acquia CLI')]

final class SelfInfoCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$table = $this->createTable($output, 'Acquia CLI information', ['Property', 'Value']);
$table->addRow(['Version', $this->getApplication()->getVersion()]);
$table->addRow(['Cloud datastore', $this->datastoreCloud->filepath]);
$table->addRow(['ACLI datastore', $this->datastoreAcli->filepath]);
$table->addRow(['Telemetry enabled', var_export($this->telemetryHelper->telemetryEnabled(), true)]);
$table->addRow(['User ID', $this->telemetryHelper->getUserId()]);
foreach ($this->telemetryHelper->getTelemetryUserData() as $key => $value) {
$table->addRow([$key, $value]);
}
$table->render();
return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Path;

#[AsCommand(name: 'self:clear-caches', description: 'Clears local Acquia CLI caches', aliases: [
'cc',
'cr',
])]
final class ClearCacheCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
self::clearCaches();
$output->writeln('Acquia CLI caches were cleared.');

return Command::SUCCESS;
}




public static function clearCaches(): void
{
$cache = self::getAliasCache();
$cache->clear();
$systemCacheDir = Path::join(sys_get_temp_dir(), 'symphony-cache');
$fs = new Filesystem();
$fs->remove([$systemCacheDir]);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Helpers\DataStoreContract;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'self:telemetry:toggle', description: 'Toggle anonymous sharing of usage and performance data', aliases: ['telemetry'])]
final class TelemetryCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$datastore = $this->datastoreCloud;
if ($datastore->get(DataStoreContract::SEND_TELEMETRY)) {
$datastore->set(DataStoreContract::SEND_TELEMETRY, false);
$this->io->success('Telemetry has been disabled.');
} else {
$datastore->set(DataStoreContract::SEND_TELEMETRY, true);
$this->io->success('Telemetry has been enabled.');
}
$oppositeVerb = $datastore->get(DataStoreContract::SEND_TELEMETRY) ? 'disable' : 'enable';
$this->io->writeln("Run this command again to $oppositeVerb telemetry");

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\Acsf\AcsfListCommandBase;
use Acquia\Cli\Command\Api\ApiListCommandBase;
use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Descriptor\ApplicationDescription;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'list', description: null, aliases: ['self:list'])]
final class ListCommand extends CommandBase
{
protected function configure(): void
{
$this
->setName('list')
->setDefinition([
new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn() => array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())),
new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn() => (new DescriptorHelper())->getFormats()),
new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments'),
])
->setDescription('List commands')
->setHelp(<<<'EOF'
The <info>%command.name%</info> command lists all commands:

  <info>%command.full_name%</info>

You can also display the commands for a specific namespace:

  <info>%command.full_name% test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>%command.full_name% --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>%command.full_name% --raw</info>
EOF
);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
foreach (['api', 'acsf'] as $prefix) {
if ($input->getArgument('namespace') !== $prefix) {
$allCommands = $this->getApplication()->all();
foreach ($allCommands as $command) {
if (
!is_a($command, ApiListCommandBase::class)
&& !is_a($command, AcsfListCommandBase::class)
&& str_starts_with($command->getName(), $prefix . ':')
) {
$command->setHidden();
}
}
}
}

$helper = new DescriptorHelper();
$helper->describe($output, $this->getApplication(), [
'format' => $input->getOption('format'),
'namespace' => $input->getArgument('namespace'),
'raw_text' => $input->getOption('raw'),
]);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Helpers\DataStoreContract;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'self:telemetry:enable', description: 'Enable anonymous sharing of usage and performance data', aliases: ['telemetry:enable'])]
final class TelemetryEnableCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$datastore = $this->datastoreCloud;
$datastore->set(DataStoreContract::SEND_TELEMETRY, true);
$this->io->success('Telemetry has been enabled.');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'self:make-docs', description: 'Generate documentation for all ACLI commands', hidden: true)]
final class MakeDocsCommand extends CommandBase
{
protected function configure(): void
{
$this->addOption('format', 'f', InputOption::VALUE_OPTIONAL, 'The format to describe the docs in.', 'rst');
$this->addOption('dump', 'd', InputOption::VALUE_OPTIONAL, 'Dump docs to directory (implies JSON format)');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$helper = new DescriptorHelper();

if (!$input->getOption('dump')) {
$helper->describe($output, $this->getApplication(), [
'format' => $input->getOption('format'),
]);
return Command::SUCCESS;
}

$docs_dir = $input->getOption('dump');
$this->localMachineHelper->getFilesystem()->mkdir($docs_dir);
$buffer = new BufferedOutput();
$helper->describe($buffer, $this->getApplication(), [
'format' => 'json',
]);
$commands = json_decode($buffer->fetch(), true);
$index = [];
foreach ($commands['commands'] as $command) {
if ($command['definition']['hidden'] ?? false) {
continue;
}
$filename = $command['name'] . '.json';
$command['help'] = (new OutputFormatter())->format($command['help']);
$index[] = [
'command' => $command['name'],
'help' => $command['help'],
'path' => $filename,
'usage' => $command['usage'][0],
];
file_put_contents("$docs_dir/$filename", json_encode($command));
}
file_put_contents("$docs_dir/index.json", json_encode($index));
return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Self;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Helpers\DataStoreContract;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'self:telemetry:disable', description: 'Disable anonymous sharing of usage and performance data', aliases: ['telemetry:disable'])]
final class TelemetryDisableCommand extends CommandBase
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$datastore = $this->datastoreCloud;
$datastore->set(DataStoreContract::SEND_TELEMETRY, false);
$this->io->success('Telemetry has been disabled.');

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\CloudApi\ClientService;
use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\DataStore\AcquiaCliDatastore;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\IdeCommandTrait;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Helpers\TelemetryHelper;
use Acquia\Cli\Output\Checklist;
use Acquia\Cli\Transformer\EnvironmentTransformer;
use Acquia\DrupalEnvironmentDetector\AcquiaDrupalEnvironmentDetector;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Endpoints\DatabaseBackups;
use AcquiaCloudApi\Endpoints\Domains;
use AcquiaCloudApi\Endpoints\SiteInstances;
use AcquiaCloudApi\Response\BackupResponse;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupsResponse;
use Closure;
use Exception;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\TransferStats;
use Psr\Http\Message\UriInterface;
use Psr\Log\LoggerInterface;
use React\EventLoop\Loop;
use SelfUpdate\SelfUpdateManager;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Path;

abstract class PullCommandBase extends CommandBase
{
use IdeCommandTrait;

protected Checklist $checklist;

private string $site;

private UriInterface $backupDownloadUrl;

public function __construct(
public LocalMachineHelper $localMachineHelper,
protected CloudDataStore $datastoreCloud,
protected AcquiaCliDatastore $datastoreAcli,
protected ApiCredentialsInterface $cloudCredentials,
protected TelemetryHelper $telemetryHelper,
protected string $projectDir,
protected ClientService $cloudApiClientService,
public SshHelper $sshHelper,
protected string $sshDir,
LoggerInterface $logger,
public selfUpdateManager $selfUpdateManager,
protected \GuzzleHttp\Client $httpClient
) {
parent::__construct($this->localMachineHelper, $this->datastoreCloud, $this->datastoreAcli, $this->cloudCredentials, $this->telemetryHelper, $this->projectDir, $this->cloudApiClientService, $this->sshHelper, $this->sshDir, $logger, $this->selfUpdateManager);
}





private function listTables(string $out): array
{
$tables = [];
if ($out = trim($out)) {
$tables = explode(PHP_EOL, $out);
}
return $tables;
}





private function listTablesQuoted(string $out): array
{
$tables = $this->listTables($out);
foreach ($tables as &$table) {
$table = "`$table`";
}
return $tables;
}

public static function getBackupPath(object $environment, DatabaseResponse $database, object $backupResponse): string
{



if ($database->flags->default) {
$dbMachineName = $database->name . $environment->name;
} else {
$dbMachineName = 'db' . $database->id;
}
$filename = implode('-', [
$environment->name,
$database->name,
$dbMachineName,
$backupResponse->completedAt,
]) . '.sql.gz';
return Path::join(sys_get_temp_dir(), $filename);
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
parent::initialize($input, $output);
$this->checklist = new Checklist($output);
}

protected function pullCode(InputInterface $input, OutputInterface $output, bool $clone, EnvironmentResponse $sourceEnvironment): void
{
if ($clone) {
$this->checklist->addItem('Cloning git repository from the Cloud Platform');
$this->cloneFromCloud($sourceEnvironment, $this->getOutputCallback($output, $this->checklist));
} else {
$this->checklist->addItem('Pulling code from the Cloud Platform');
$this->pullCodeFromCloud($sourceEnvironment, $this->getOutputCallback($output, $this->checklist));
}
$this->checklist->completePreviousItem();
}






protected function pullDatabase(InputInterface $input, OutputInterface $output, EnvironmentResponse $sourceEnvironment, bool $onDemand = false, bool $noImport = false, bool $multipleDbs = false): void
{
if (!$noImport) {

$this->connectToLocalDatabase($this->getLocalDbHost(), $this->getLocalDbUser(), $this->getLocalDbName(), $this->getLocalDbPassword(), $this->getOutputCallback($output, $this->checklist));
}
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$site = $this->determineSite($sourceEnvironment, $input);
$databases = $this->determineCloudDatabases($acquiaCloudClient, $sourceEnvironment, $site, $multipleDbs);

foreach ($databases as $database) {
if ($onDemand) {
$this->checklist->addItem("Creating an on-demand database(s) backup on Cloud Platform");
$this->createBackup($sourceEnvironment, $database, $acquiaCloudClient);
$this->checklist->completePreviousItem();
}
$backupResponse = $this->getDatabaseBackup($acquiaCloudClient, $sourceEnvironment, $database);
if (!$onDemand) {
$this->printDatabaseBackupInfo($backupResponse, $sourceEnvironment);
}

$this->checklist->addItem("Downloading $database->name database copy from the Cloud Platform");
$localFilepath = $this->downloadDatabaseBackup($sourceEnvironment, $database, $backupResponse, $this->getOutputCallback($output, $this->checklist));
$this->checklist->completePreviousItem();

if ($noImport) {
$this->io->success("$database->name database backup downloaded to $localFilepath");
} else {
$this->checklist->addItem("Importing $database->name database download");
$this->importRemoteDatabase($database, $localFilepath, $this->getOutputCallback($output, $this->checklist));
$this->checklist->completePreviousItem();
}
}
}

protected function pullFiles(InputInterface $input, OutputInterface $output, EnvironmentResponse $sourceEnvironment): void
{
$this->checklist->addItem('Copying Drupal\'s public files from the Cloud Platform');
$site = $this->determineSite($sourceEnvironment, $input);
$this->rsyncFilesFromCloud($sourceEnvironment, $this->getOutputCallback($output, $this->checklist), $site);
$this->checklist->completePreviousItem();
}

private function pullCodeFromCloud(EnvironmentResponse $chosenEnvironment, ?Closure $outputCallback = null): void
{
$isDirty = $this->isLocalGitRepoDirty();
if ($isDirty) {
throw new AcquiaCliException('Pulling code from your Cloud Platform environment was aborted because your local Git repository has uncommitted changes. Either commit, reset, or stash your changes via git.');
}

$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$this->localMachineHelper->execute([
'git',
'fetch',
'--all',
], $outputCallback, $this->dir, false);
$this->checkoutBranchFromEnv($chosenEnvironment, $outputCallback);
}




private function checkoutBranchFromEnv(EnvironmentResponse $environment, ?Closure $outputCallback = null): void
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$this->localMachineHelper->execute([
'git',
'checkout',
$environment->vcs->path,
], $outputCallback, $this->dir, false);
}

private function doImportRemoteDatabase(
string $databaseHost,
string $databaseUser,
string $databaseName,
string $databasePassword,
string $localFilepath,
?Closure $outputCallback = null
): void {
$this->dropDbTables($databaseHost, $databaseUser, $databaseName, $databasePassword, $outputCallback);
$this->importDatabaseDump($localFilepath, $databaseHost, $databaseUser, $databaseName, $databasePassword, $outputCallback);
$this->localMachineHelper->getFilesystem()->remove($localFilepath);
}

private function downloadDatabaseBackup(
EnvironmentResponse $environment,
DatabaseResponse $database,
BackupResponse $backupResponse,
?callable $outputCallback = null
): string {
if ($outputCallback) {
$outputCallback('out', "Downloading backup $backupResponse->id");
}
$localFilepath = self::getBackupPath($environment, $database, $backupResponse);
if ($this->output instanceof ConsoleOutput) {
$output = $this->output->section();
} else {
$output = $this->output;
}

$acquiaCloudClient = $this->cloudApiClientService->getClient();
$acquiaCloudClient->addOption('sink', $localFilepath);
$acquiaCloudClient->addOption('curl.options', [
'CURLOPT_FILE' => $localFilepath,
'CURLOPT_RETURNTRANSFER' => false,
]);
$acquiaCloudClient->addOption(
'progress',
static function (mixed $totalBytes, mixed $downloadedBytes) use (&$progress, $output): void {
self::displayDownloadProgress($totalBytes, $downloadedBytes, $progress, $output);
}
);


$url = $this->getBackupDownloadUrl();
$acquiaCloudClient->addOption('on_stats', function (TransferStats $stats) use (&$url): void {
$url = $stats->getEffectiveUri();
});

try {
$codebaseUuid = self::getCodebaseUuid();
if ($codebaseUuid) {

$downloadUrl = $backupResponse->links->download->href;
$this->httpClient->request('GET', $downloadUrl, [
'progress' => static function (mixed $totalBytes, mixed $downloadedBytes) use (&$progress, $output): void {
self::displayDownloadProgress($totalBytes, $downloadedBytes, $progress, $output);
},
'sink' => $localFilepath,
]);
return $localFilepath;
}
$acquiaCloudClient->stream(
"get",
"/environments/$environment->uuid/databases/$database->name/backups/$backupResponse->id/actions/download",
$acquiaCloudClient->getOptions()
);
return $localFilepath;
} catch (RequestException $exception) {


if (
in_array($exception->getHandlerContext()['errno'], [
51,
60,
], true)
) {
$outputCallback('out', '<comment>The certificate for ' . $url->getHost() . ' is invalid.</comment>');
assert($url !== null);
$domainsResource = new Domains($this->cloudApiClientService->getClient());
$domains = $domainsResource->getAll($environment->uuid);
foreach ($domains as $domain) {
if ($domain->hostname === $url->getHost()) {
continue;
}
$outputCallback('out', '<comment>Trying alternative host ' . $domain->hostname . ' </comment>');
$downloadUrl = $url->withHost($domain->hostname);
try {
$this->httpClient->request('GET', $downloadUrl, ['sink' => $localFilepath]);
return $localFilepath;
} catch (Exception) {

}
}
}
}


throw new AcquiaCliException('Could not download backup');
}

public function setBackupDownloadUrl(UriInterface $url): void
{
$this->backupDownloadUrl = $url;
}

private function getBackupDownloadUrl(): ?UriInterface
{
return $this->backupDownloadUrl ?? null;
}

public static function displayDownloadProgress(mixed $totalBytes, mixed $downloadedBytes, mixed &$progress, OutputInterface $output): void
{
if ($totalBytes > 0 && is_null($progress)) {
$progress = new ProgressBar($output, $totalBytes);
$progress->setFormat('        %current%/%max% [%bar%] %percent:3s%%');
$progress->setProgressCharacter('💧');
$progress->setOverwrite(true);
$progress->start();
}

if (!is_null($progress)) {
if ($totalBytes === $downloadedBytes && $progress->getProgressPercent() !== 1.0) {
$progress->finish();
if ($output instanceof ConsoleSectionOutput) {
$output->clear();
}
return;
}
$progress->setProgress($downloadedBytes);
}
}




private function createBackup(EnvironmentResponse $environment, DatabaseResponse $database, Client $acquiaCloudClient): void
{

$codebaseUuid = self::getCodebaseUuid();
if ($codebaseUuid) {
$this->createCodeabaseDatabaseBackup($this->siteId, $environment->uuid);
return;
}
$backups = new DatabaseBackups($acquiaCloudClient);
$response = $backups->create($environment->uuid, $database->name);
$urlParts = explode('/', $response->links->notification->href);
$notificationUuid = end($urlParts);
$this->waitForBackup($notificationUuid, $acquiaCloudClient);
}









private function createCodeabaseDatabaseBackup(string $siteId, string $environmentId): array
{
$siteInstanceResource = new SiteInstances($this->cloudApiClientService->getClient());
$response = $siteInstanceResource->createDatabaseBackup($siteId, $environmentId);
return (array)$response;
}








private function getCodeabaseDatabaseBackups(string $siteId, string $environmentId): SiteInstanceDatabaseBackupsResponse
{
$siteInstanceResource = new SiteInstances($this->cloudApiClientService->getClient());
$response = $siteInstanceResource->getDatabaseBackups($siteId, $environmentId);
return $response;
}
/**
@infection-ignore-all



*/
protected function waitForBackup(string $notificationUuid, Client $acquiaCloudClient): void
{
$spinnerMessage = 'Waiting for database backup to complete...';
$successCallback = function (): void {
$this->output->writeln('');
$this->output->writeln('<info>Database backup is ready!</info>');
};
$success = $this->waitForNotificationToComplete($acquiaCloudClient, $notificationUuid, $spinnerMessage, $successCallback);
Loop::run();
if (!$success) {
throw new AcquiaCliException('Cloud API failed to create a backup');
}
}

private function connectToLocalDatabase(string $dbHost, string $dbUser, string $dbName, string $dbPassword, ?callable $outputCallback = null): void
{
if ($outputCallback) {
$outputCallback('out', "Connecting to database $dbName");
}
$this->localMachineHelper->checkRequiredBinariesExist(['mysql']);
$command = [
'mysql',
'--host',
$dbHost,
'--user',
$dbUser,
$dbName,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, false, null, ['MYSQL_PWD' => $dbPassword]);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to connect to local database using credentials mysql://{user}:{password}@{host}/{database}. {message}', [
'database' => $dbName,
'host' => $dbHost,
'message' => $process->getErrorOutput(),
'password' => $dbPassword,
'user' => $dbUser,
]);
}
}

private function dropDbTables(string $dbHost, string $dbUser, string $dbName, string $dbPassword, ?\Closure $outputCallback = null): void
{
if ($outputCallback) {
$outputCallback('out', "Dropping tables from database $dbName");
}
$this->localMachineHelper->checkRequiredBinariesExist(['mysql']);
$command = [
'mysql',
'--host',
$dbHost,
'--user',
$dbUser,
$dbName,
'--silent',
'-e',
'SHOW TABLES;',
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, false, null, ['MYSQL_PWD' => $dbPassword]);
$tables = $this->listTablesQuoted($process->getOutput());
if ($tables) {
$sql = 'DROP TABLE ' . implode(', ', $tables);
$tempnam = $this->localMachineHelper->getFilesystem()
->tempnam(sys_get_temp_dir(), 'acli_drop_table_', '.sql');
$this->localMachineHelper->getFilesystem()
->dumpFile($tempnam, $sql);
$command = [
'mysql',
'--host',
$dbHost,
'--user',
$dbUser,
$dbName,
'-e',
'source ' . $tempnam,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, false, null, ['MYSQL_PWD' => $dbPassword]);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to drop tables from database. {message}', ['message' => $process->getErrorOutput()]);
}
}
}

private function importDatabaseDump(string $localDumpFilepath, string $dbHost, string $dbUser, string $dbName, string $dbPassword, ?Closure $outputCallback = null): void
{
if ($outputCallback) {
$outputCallback('out', "Importing downloaded file to database $dbName");
}
$this->logger->debug("Importing $localDumpFilepath to MySQL on local machine");

$this->localMachineHelper->checkRequiredBinariesExist([
'gunzip',
'mysql',
]);
if ($this->localMachineHelper->commandExists('pv')) {
$command = 'pv "${:LOCAL_DUMP_FILEPATH}" --bytes --rate | gunzip | MYSQL_PWD="${:MYSQL_PASSWORD}" mysql --host="${:MYSQL_HOST}" --user="${:MYSQL_USER}" "${:MYSQL_DATABASE}"';
} else {
$this->io->warning('Install `pv` to see progress bar');
$command = 'gunzip -c "${:LOCAL_DUMP_FILEPATH}" | MYSQL_PWD="${:MYSQL_PASSWORD}" mysql --host="${:MYSQL_HOST}" --user="${:MYSQL_USER}" "${:MYSQL_DATABASE}"';
}

$env = [
'LOCAL_DUMP_FILEPATH' => $localDumpFilepath,
'MYSQL_DATABASE' => $dbName,
'MYSQL_HOST' => $dbHost,
'MYSQL_PASSWORD' => $dbPassword,
'MYSQL_USER' => $dbUser,
];


$process = $this->localMachineHelper->executeFromCmd($command, $outputCallback, null, false, null, $env);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Unable to import local database. {message}', ['message' => $process->getErrorOutput()]);
}
}

private function determineSite(string|EnvironmentResponse|array $environment, InputInterface $input): string
{
if (isset($this->site)) {
return $this->site;
}

if ($input->hasArgument('site') && $input->getArgument('site')) {
return $input->getArgument('site');
}


$siteInstanceId = $this->determineSiteInstanceFromCodebaseUuid($environment, $input, $this->output);
if ($siteInstanceId) {

[$siteId,] = explode('.', $siteInstanceId);
$site = $this->getSite($siteId);
$this->site = $site->name;
$this->siteId = $siteId;
return $this->site;
}
$this->site = $this->promptChooseDrupalSite($environment);

return $this->site;
}

private function rsyncFilesFromCloud(EnvironmentResponse $chosenEnvironment, Closure $outputCallback, string $site): void
{
$sourceDir = $chosenEnvironment->sshUrl . ':' . $this->getCloudFilesDir($chosenEnvironment, $site);
$destinationDir = $this->getLocalFilesDir($site);
$this->localMachineHelper->getFilesystem()->mkdir($destinationDir);

$this->rsyncFiles($sourceDir, $destinationDir, $outputCallback);
}

protected function determineCloneProject(OutputInterface $output): bool
{
$finder = $this->localMachineHelper->getFinder()
->files()
->in($this->dir)
->ignoreDotFiles(false);


if ($this->dir === '/home/ide/project' && AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && !$finder->hasResults()) {
$output->writeln('Cloning into current directory.');
return true;
}


if ($this->projectDir) {
return false;
}


if (file_exists(Path::join($this->dir, '.git'))) {
return false;
}
$output->writeln('Could not find a git repository in the current directory');

if (!$finder->hasResults() && $this->io->confirm('Would you like to clone a project into the current directory?')) {
return true;
}

$output->writeln('Could not clone into the current directory because it is not empty');

throw new AcquiaCliException('Execute this command from within a Drupal project directory or an empty directory');
}

private function cloneFromCloud(EnvironmentResponse $chosenEnvironment, Closure $outputCallback): void
{
$this->localMachineHelper->checkRequiredBinariesExist(['git']);
$command = [
'git',
'clone',
$chosenEnvironment->vcs->url,
$this->dir,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, null, ($this->output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL), null, ['GIT_SSH_COMMAND' => 'ssh -o StrictHostKeyChecking=no']);
$this->checkoutBranchFromEnv($chosenEnvironment, $outputCallback);
if (!$process->isSuccessful()) {
throw new AcquiaCliException('Failed to clone repository from the Cloud Platform: {message}', ['message' => $process->getErrorOutput()]);
}
$this->projectDir = $this->dir;
}

protected function checkEnvironmentPhpVersions(EnvironmentResponse $environment): void
{
$version = $this->getIdePhpVersion();
if (empty($version)) {
$this->io->warning("Could not determine current PHP version. Set it by running acli ide:php-version.");
} elseif (!$this->environmentPhpVersionMatches($environment)) {
$this->io->warning("You are using PHP version $version but the upstream environment $environment->label is using PHP version {$environment->configuration->php->version}");
}
}

protected function matchIdePhpVersion(
OutputInterface $output,
EnvironmentResponse $chosenEnvironment
): void {
if (AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && !$this->environmentPhpVersionMatches($chosenEnvironment)) {
$answer = $this->io->confirm("Would you like to change the PHP version on this IDE to match the PHP version on the <bg=cyan;options=bold>$chosenEnvironment->label ({$chosenEnvironment->configuration->php->version})</> environment?", false);
if ($answer) {
$command = $this->getApplication()->find('ide:php-version');
$command->run(
new ArrayInput([
'command' => 'ide:php-version',
'version' => $chosenEnvironment->configuration->php->version,
]),
$output
);
}
}
}

private function environmentPhpVersionMatches(EnvironmentResponse $environment): bool
{
$currentPhpVersion = $this->getIdePhpVersion();
return $environment->configuration->php->version === $currentPhpVersion;
}

private function getDatabaseBackup(
Client $acquiaCloudClient,
string|EnvironmentResponse|array $environment,
DatabaseResponse $database
): BackupResponse {
$codebaseUuid = self::getCodebaseUuid();
if ($codebaseUuid) {
$databaseBackups = $this->getCodeabaseDatabaseBackups($this->siteId, $environment->uuid);
return EnvironmentTransformer::transformSiteInstanceDatabaseBackup($databaseBackups[0]);
}
$databaseBackups = new DatabaseBackups($acquiaCloudClient);
$backupsResponse = $databaseBackups->getAll($environment->uuid, $database->name);
if (!count($backupsResponse)) {
$this->io->warning('No existing backups found, creating an on-demand backup now. This will take some time depending on the size of the database.');
$this->createBackup($environment, $database, $acquiaCloudClient);
$backupsResponse = $databaseBackups->getAll(
$environment->uuid,
$database->name
);
}
$backupResponse = $backupsResponse[0];
$this->logger->debug('Using database backup (id #' . $backupResponse->id . ') generated at ' . $backupResponse->completedAt);

return $backupResponse;
}




private function printDatabaseBackupInfo(
BackupResponse $backupResponse,
EnvironmentResponse $sourceEnvironment
): void {
$interval = time() - strtotime($backupResponse->completedAt);
$hoursInterval = floor($interval / 60 / 60);
$dateFormatted = date("D M j G:i:s T Y", strtotime($backupResponse->completedAt));
$webLink = "https://cloud.acquia.com/a/environments/$sourceEnvironment->uuid/databases";
$messages = [
"Using a database backup that is $hoursInterval hours old. Backup #$backupResponse->id was created at $dateFormatted.",
"You can view your backups here: $webLink",
"To generate a new backup, re-run this command with the --on-demand option.",
];
if ($hoursInterval > 24) {
$this->io->warning($messages);
} else {
$this->io->info($messages);
}
}

private function importRemoteDatabase(DatabaseResponse $database, string $localFilepath, ?Closure $outputCallback = null): void
{
if ($database->flags->default) {

$this->doImportRemoteDatabase($this->getLocalDbHost(), $this->getLocalDbUser(), $this->getLocalDbName(), $this->getLocalDbPassword(), $localFilepath, $outputCallback);
} elseif (AcquiaDrupalEnvironmentDetector::isAhIdeEnv() && !getenv('IDE_ENABLE_MULTISITE')) {


$this->io->note("Cloud IDE only supports importing into the default Drupal database. Acquia CLI will import the NON-DEFAULT database $database->name into the DEFAULT database {$this->getLocalDbName()}");
$this->doImportRemoteDatabase($this->getLocalDbHost(), $this->getLocalDbUser(), $this->getLocalDbName(), $this->getLocalDbPassword(), $localFilepath, $outputCallback);
} else {

$this->io->note("Acquia CLI assumes that the local name for the $database->name database is also $database->name");
if (AcquiaDrupalEnvironmentDetector::isLandoEnv() || AcquiaDrupalEnvironmentDetector::isAhIdeEnv()) {
$this->doImportRemoteDatabase($this->getLocalDbHost(), 'root', $database->name, '', $localFilepath, $outputCallback);
} else {
$this->doImportRemoteDatabase($this->getLocalDbHost(), $this->getLocalDbUser(), $database->name, $this->getLocalDbPassword(), $localFilepath, $outputCallback);
}
}
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\Command\CommandBase;
use Acquia\Cli\Output\Checklist;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(name: 'pull:run-scripts', description: 'Execute post pull scripts')]
final class PullScriptsCommand extends CommandBase
{
protected Checklist $checklist;

protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId()
->addOption('dir', null, InputArgument::OPTIONAL, 'The directory containing the Drupal project to be refreshed');
}

protected function initialize(InputInterface $input, OutputInterface $output): void
{
parent::initialize($input, $output);
$this->checklist = new Checklist($output);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);
$this->executeAllScripts($this->getOutputCallback($output, $this->checklist), $this->checklist);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[RequireLocalDb]
#[AsCommand(name: 'pull:all', description: 'Copy code, database, and files from a Cloud Platform environment', aliases: [
'refresh',
'pull',
])]
final class PullCommand extends PullCommandBase
{
protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId()
->addOption('dir', null, InputArgument::OPTIONAL, 'The directory containing the Drupal project to be refreshed')
->addOption('no-code', null, InputOption::VALUE_NONE, 'Do not refresh code from remote repository')
->addOption('no-files', null, InputOption::VALUE_NONE, 'Do not refresh files')
->addOption('no-databases', null, InputOption::VALUE_NONE, 'Do not refresh databases')
->addOption(
'no-scripts',
null,
InputOption::VALUE_NONE,
'Do not run any additional scripts after code and database are copied. E.g., composer install , drush cache-rebuild, etc.'
);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);
$clone = $this->determineCloneProject($output);
$sourceEnvironment = $this->determineEnvironment($input, $output, true);

if (!$input->getOption('no-code')) {
$this->pullCode($input, $output, $clone, $sourceEnvironment);
}

if (!$input->getOption('no-files')) {
$this->pullFiles($input, $output, $sourceEnvironment);
}

if (!$input->getOption('no-databases')) {
$this->pullDatabase($input, $output, $sourceEnvironment);
}

if (!$input->getOption('no-scripts')) {
$this->executeAllScripts($this->getOutputCallback($output, $this->checklist), $this->checklist);
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\Attribute\RequireAuth;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[AsCommand(name: 'pull:files', description: 'Copy Drupal public files from a Cloud Platform environment to your local environment')]
final class PullFilesCommand extends PullCommandBase
{
protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId();
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);

$sourceEnvironment = $this->determineEnvironment($input, $output, true);

$this->pullFiles($input, $output, $sourceEnvironment);

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[RequireLocalDb]
#[AsCommand(name: 'pull:code', description: 'Copy code from a Cloud Platform environment')]
final class PullCodeCommand extends PullCommandBase
{
protected function configure(): void
{
$this
->acceptEnvironmentId()
->acceptSiteInstanceId()
->addOption('dir', null, InputOption::VALUE_OPTIONAL, 'The directory containing the Drupal project to be refreshed')
->addOption(
'no-scripts',
null,
InputOption::VALUE_NONE,
'Do not run any additional scripts after code is pulled. E.g., composer install , drush cache-rebuild, etc.'
);
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->setDirAndRequireProjectCwd($input);
$clone = $this->determineCloneProject($output);
$sourceEnvironment = $this->determineEnvironment($input, $output, true);
$this->pullCode($input, $output, $clone, $sourceEnvironment);
$this->checkEnvironmentPhpVersions($sourceEnvironment);
$this->matchIdePhpVersion($output, $sourceEnvironment);
if (!$input->getOption('no-scripts')) {
$outputCallback = $this->getOutputCallback($output, $this->checklist);
$this->runComposerScripts($outputCallback, $this->checklist);
$this->runDrushCacheClear($outputCallback, $this->checklist);
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\Command\Pull;

use Acquia\Cli\Attribute\RequireAuth;
use Acquia\Cli\Attribute\RequireLocalDb;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

#[RequireAuth]
#[RequireLocalDb]
#[AsCommand(name: 'pull:database', description: 'Import database backup from a Cloud Platform environment', aliases: ['pull:db'])]
final class PullDatabaseCommand extends PullCommandBase
{
protected function configure(): void
{
$this
->setHelp('This uses the latest available database backup, which may be up to 24 hours old. If no backup exists, one will be created.')
->acceptEnvironmentId()
->acceptSite()
->acceptSiteInstanceId()
->addOption(
'no-scripts',
null,
InputOption::VALUE_NONE,
'Do not run any additional scripts after the database is pulled. E.g., drush cache-rebuild, drush sql-sanitize, etc.'
)
->addOption(
'on-demand',
null,
InputOption::VALUE_NONE,
'Force creation of an on-demand backup. This takes much longer than using an existing backup (when one is available)'
)
->addOption(
'no-import',
null,
InputOption::VALUE_NONE,
'Download the backup but do not import it (implies --no-scripts)'
)
->addOption(
'multiple-dbs',
null,
InputOption::VALUE_NONE,
'Download multiple dbs. Defaults to FALSE.'
);
}




protected function execute(InputInterface $input, OutputInterface $output): int
{
$noScripts = $input->hasOption('no-scripts') && $input->getOption('no-scripts');
$onDemand = $input->hasOption('on-demand') && $input->getOption('on-demand');
$noImport = $input->hasOption('no-import') && $input->getOption('no-import');
$multipleDbs = $input->hasOption('multiple-dbs') && $input->getOption('multiple-dbs');

$noScripts = $noImport || $noScripts;
$this->setDirAndRequireProjectCwd($input);

$sourceEnvironment = $this->determineEnvironment($input, $output, true);
$this->pullDatabase($input, $output, $sourceEnvironment, $onDemand, $noImport, $multipleDbs);
if (!$noScripts) {
$this->runDrushCacheClear($this->getOutputCallback($output, $this->checklist), $this->checklist);
$this->runDrushSqlSanitize($this->getOutputCallback($output, $this->checklist), $this->checklist);
}

return Command::SUCCESS;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\CloudApi;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\Application;
use Acquia\Cli\ConnectorFactoryInterface;
use AcquiaCloudApi\Connector\Client;
use AcquiaCloudApi\Connector\ConnectorInterface;








class ClientService
{
protected ConnectorInterface $connector;

protected ConnectorFactoryInterface|ConnectorFactory $connectorFactory;

protected Application $application;

protected ?bool $machineIsAuthenticated = null;

public function __construct(ConnectorFactoryInterface $connectorFactory, Application $application, protected ApiCredentialsInterface $credentials)
{
$this->connectorFactory = $connectorFactory;
$this->setConnector($connectorFactory->createConnector());
$this->setApplication($application);
}

public function setConnector(ConnectorInterface $connector): void
{
$this->connector = $connector;
}

private function setApplication(Application $application): void
{
$this->application = $application;
}

public function getClient(): Client
{
$client = Client::factory($this->connector);
$this->configureClient($client);

return $client;
}

protected function configureClient(Client $client): void
{
$userAgent = sprintf("acli/%s", $this->application->getVersion());
$customHeaders = [
'User-Agent' => [$userAgent],
];
if ($uuid = getenv("REMOTEIDE_UUID")) {
$customHeaders['X-Cloud-IDE-UUID'] = $uuid;
}
$client->addOption('headers', $customHeaders);
}

public function isMachineAuthenticated(): bool
{
if ($this->machineIsAuthenticated !== null) {
return $this->machineIsAuthenticated;
}
$this->machineIsAuthenticated = $this->checkAuthentication();
return $this->machineIsAuthenticated;
}

protected function checkAuthentication(): bool
{
return (
$this->credentials->getCloudAccessToken() ||
($this->credentials->getCloudKey() && $this->credentials->getCloudSecret())
);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\CloudApi;

use Acquia\Cli\ApiCredentialsInterface;
use Acquia\Cli\DataStore\CloudDataStore;
use Acquia\Cli\Exception\AcquiaCliException;

class CloudCredentials implements ApiCredentialsInterface
{



public function __construct(private CloudDataStore $datastoreCloud)
{
}

public function getCloudAccessToken(): ?string
{
if ($token = getenv('ACLI_ACCESS_TOKEN')) {
return $token;
}

if ($file = getenv('ACLI_ACCESS_TOKEN_FILE')) {
if (!file_exists($file)) {
throw new AcquiaCliException('Access token file not found at {file}', ['file' => $file]);
}
return trim(file_get_contents($file), "\"\n");
}

return null;
}

public function getCloudAccessTokenExpiry(): ?string
{
if ($token = getenv('ACLI_ACCESS_TOKEN_EXPIRY')) {
return $token;
}

if ($file = getenv('ACLI_ACCESS_TOKEN_EXPIRY_FILE')) {
if (!file_exists($file)) {
throw new AcquiaCliException('Access token expiry file not found at {file}', ['file' => $file]);
}
return trim(file_get_contents($file), "\"\n");
}

return null;
}

public function getCloudKey(): ?string
{
if ($key = getenv('ACLI_KEY')) {
return $key;
}

if ($this->datastoreCloud->get('acli_key')) {
return $this->datastoreCloud->get('acli_key');
}

return null;
}

public function getCloudSecret(): ?string
{
if ($secret = getenv('ACLI_SECRET')) {
return $secret;
}

$acliKey = $this->getCloudKey();
if ($this->datastoreCloud->get('keys')) {
$keys = $this->datastoreCloud->get('keys');
if (is_array($keys) && array_key_exists($acliKey, $keys)) {
return $this->datastoreCloud->get('keys')[$acliKey]['secret'];
}
}

return null;
}

public function getBaseUri(): ?string
{
if ($uri = getenv('ACLI_CLOUD_API_BASE_URI')) {
return $uri;
}
return null;
}

public function getAccountsUri(): ?string
{
if ($uri = getenv('ACLI_CLOUD_API_ACCOUNTS_URI')) {
return $uri;
}
return null;
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\CloudApi;

use Acquia\Cli\ConnectorFactoryInterface;
use AcquiaCloudApi\Connector\Connector;
use League\OAuth2\Client\Token\AccessToken;

class ConnectorFactory implements ConnectorFactoryInterface
{



public function __construct(protected array $config, protected ?string $baseUri = null, protected ?string $accountsUri = null)
{
}




public function createConnector(): Connector|AccessTokenConnector
{

if ($this->config['key'] && $this->config['secret']) {
return new Connector($this->config, $this->baseUri, $this->accountsUri);
}


if ($this->config['accessToken']) {
$accessToken = $this->createAccessToken();
if (!$accessToken->hasExpired()) {

return new AccessTokenConnector([
'access_token' => $accessToken,
'key' => null,
'secret' => null,
], $this->baseUri, $this->accountsUri);
}
}


return new Connector($this->config, $this->baseUri, $this->accountsUri);
}

private function createAccessToken(): AccessToken
{
return new AccessToken([
'access_token' => $this->config['accessToken'],
'expires' => $this->config['accessTokenExpiry'],
]);
}
}
<?php

declare(strict_types=1);

namespace Acquia\Cli\CloudApi;

use Acquia\Cli\Exception\AcquiaCliException;
use AcquiaCloudApi\Connector\Connector;
use League\OAuth2\Client\Provider\AbstractProvider;
use League\OAuth2\Client\Provider\GenericProvider;
use League\OAuth2\Client\Token\AccessToken;
use Psr\Http\Message\RequestInterface;

class AccessTokenConnector extends Connector
{



protected AbstractProvider $provider;




public function __construct(array $config, ?string $baseUri = null, ?string $urlAccessToken = null)
{
$this->accessToken = new AccessToken(['access_token' => $config['access_token']]);
parent::__construct($config, $baseUri, $urlAccessToken);
}

public function createRequest(string $verb, string $path): RequestInterface
{
if ($file = getenv('ACLI_ACCESS_TOKEN_FILE')) {
if (!file_exists($file)) {
throw new AcquiaCliException('Access token file not found at {file}', ['file' => $file]);
}
$this->accessToken = new AccessToken(['access_token' => trim(file_get_contents($file), "\"\n")]);
}
return $this->provider->getAuthenticatedRequest(
$verb,
$this->getBaseUri() . $path,
$this->accessToken
);
}

public function setProvider(
GenericProvider $provider
): void {
$this->provider = $provider;
}

public function getAccessToken(): AccessToken
{
return $this->accessToken;
}
}
BUGSNAG_KEY=
AMPLITUDE_KEY=
ACLI_VERSION=dev-1932/merge-44c7c609b8437330bf5924877e51c0bc10dee646
{"name":"acquia\/cli","description":"Acquia CLI","type":"project","license":"GPL-2.0-only","authors":[{"name":"Acquia Engineering","homepage":"https:\/\/www.acquia.com","role":"Maintainer"}],"minimum-stability":"dev","require":{"php":"^8.2","ext-json":"*","acquia\/drupal-environment-detector":"^1.7.0","bugsnag\/bugsnag":"^3.29","composer\/semver":"^3.3","consolidation\/self-update":"^3.1.0","dflydev\/dot-access-data":"^3","grasmash\/expander":"^3.0.1","guzzlehttp\/guzzle":"^7.4","http-interop\/http-factory-guzzle":"^1.0","laminas\/laminas-validator":"^2.20.0","league\/csv":"^9.8","loophp\/phposinfo":"^1.7.2","ltd-beget\/dns-zone-configurator":"^1.4.0","m4tthumphrey\/php-gitlab-api":"^12","php-http\/cache-plugin":"^2.0","psr\/log":"^3","ramsey\/uuid":"^4.1","react\/event-loop":"^1.1","symfony\/cache":"^6.3","symfony\/config":"^6.3","symfony\/console":"^6.3","symfony\/dependency-injection":"^6.3","symfony\/dotenv":"^6.3","symfony\/event-dispatcher":"^6.3","symfony\/expression-language":"^6.3","symfony\/filesystem":"^6.3","symfony\/finder":"^6.3","symfony\/flex":"^2.2","symfony\/http-kernel":"^6.3","symfony\/process":"^6.3","symfony\/validator":"^6.3","symfony\/yaml":"^6.3","thecodingmachine\/safe":"3.0.2 as 2.5.0","typhonius\/acquia-logstream":"^0.0.15","typhonius\/acquia-php-sdk-v2":"^3.7.3","vlucas\/phpdotenv":"^5.5","zumba\/amplitude-php":"^1.0.4"},"require-dev":{"acquia\/coding-standards":"^3.0.2","brianium\/paratest":"^7","dealerdirect\/phpcodesniffer-composer-installer":"^1.0.0","dominikb\/composer-license-checker":"^2.4","infection\/infection":"^0.31.2","jangregor\/phpstan-prophecy":"^1.0","mikey179\/vfsstream":"^1.6","overtrue\/phplint":"^9.6.2","phpro\/grumphp":"^2.9.0","phpspec\/prophecy":"^1.17","phpspec\/prophecy-phpunit":"^2.0","phpstan\/extension-installer":"^1.1","phpstan\/phpstan":"^1.0","phpstan\/phpstan-deprecation-rules":"^1.0","phpunit\/phpunit":"^11","slevomat\/coding-standard":"^8.10","squizlabs\/php_codesniffer":"^3.5","twig\/twig":"^3.3"},"autoload":{"psr-4":{"Acquia\\Cli\\":"src\/"}},"autoload-dev":{"psr-4":{"Acquia\\Cli\\Tests\\":"tests\/phpunit\/src\/"}},"bin":["bin\/acli"],"config":{"platform":{"php":"8.2.29"},"process-timeout":3600,"optimize-autoloader":true,"preferred-install":"dist","sort-packages":true,"allow-plugins":{"dealerdirect\/phpcodesniffer-composer-installer":true,"phpstan\/extension-installer":true,"phpro\/grumphp":true,"symfony\/flex":true,"infection\/extension-installer":true,"php-http\/discovery":true}},"extra":{"branch-alias":{"dev-main":"2.x-dev"}},"prefer-stable":true,"scripts":{"update-cloud-api-spec":["[ -d var\/cx-api-spec\/.git ] && (cd var\/cx-api-spec && git pull) || git clone git@github.com:acquia\/cx-api-spec.git var\/cx-api-spec","cd var\/cx-api-spec && npm install && make install && make spec","cp var\/cx-api-spec\/dist\/spec\/acquia-spec-prerelease.json assets\/acquia-spec.json","git -C var\/cx-api-spec rev-parse HEAD > assets\/acquia-spec.version"],"update-acsf-api-spec":["rm -rf gardener","git clone --single-branch -b master --depth 1 git@github.com:acquia\/gardener.git","composer install --working-dir=gardener --optimize-autoloader","php gardener\/tools\/openapi_spec_gen.php gen > assets\/acsf-spec.yaml","rm -rf gardener"],"box-install":["curl -f -L https:\/\/github.com\/box-project\/box\/releases\/download\/4.6.7\/box.phar -o var\/box.phar"],"box-compile":["php var\/box.phar compile"],"mutation":["infection --threads=max"],"mutation-diff-lines":["infection --threads=max --git-diff-lines --git-diff-base=origin\/$GITHUB_BASE_REF --min-covered-msi=100 --ignore-msi-with-no-mutations"],"cs":"phpcs","cbf":"phpcbf","unit":["@unit-serial","@unit-parallel"],"unit-serial":"phpunit tests\/phpunit --group serial","unit-parallel":"paratest --exclude-group serial","coverage":"php -d pcov.enabled=1 vendor\/bin\/phpunit tests\/phpunit --coverage-clover var\/logs\/clover.xml","lint":"phplint","test":["@lint","@cs","@stan","@unit"],"stan":["phpstan analyze"]}}<?php

/**
 * @file
 * Acquia CLI command line front file.
 *
 * This is largely based on the default bin/console command that ships with a
 * Symfony app. However, it's been modified to not rely on the Framework Bundle,
 * which spares us from unnecessary dependencies such as the routing layer.
 *
 * ORCA does something similar.
 *
 * @see https://github.com/TravisCarden/stackoverflow-a-50356503
 */

namespace Acquia\Cli;

use Acquia\Cli\Command\Acsf\AcsfCommandFactory;
use Acquia\Cli\Command\Api\ApiCommandFactory;
use Acquia\Cli\Command\Api\ApiCommandHelper;
use Acquia\Cli\Exception\AcquiaCliException;
use Acquia\Cli\Helpers\LocalMachineHelper;
use Dotenv\Dotenv;
use SelfUpdate\SelfUpdateCommand;
use SelfUpdate\SelfUpdateManager;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;

if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed', 'micro'], true)) {
  echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL;
}

set_time_limit(0);

if (isset($_composer_autoload_path)) {
  $loader = require $_composer_autoload_path;
}
else {
  $autoload_locations = [
    dirname(__DIR__) . '/vendor/autoload.php',
    dirname(__DIR__) . '/../../autoload.php',
  ];
  foreach ($autoload_locations as $autoload_location) {
    if (file_exists($autoload_location)) {
      $loader = require $autoload_location;
      break;
    }
  }
}
if (!isset($loader)) {
    throw new AcquiaCliException('Unable to find autoload.php');
}
// We must preload this class to prevent self-update command from breaking.
// @see https://github.com/acquia/cli/issues/234
$loader->loadClass('Symfony\Component\Console\Event\ConsoleTerminateEvent');
$input = new ArgvInput();

// On some environments (looking at you, Windows), HOME may not be set.
if (!getenv('HOME')) {
    putenv('HOME=' . LocalMachineHelper::getHomeDir());
}
if (!getenv('ACLI_HOME')) {
  putenv('ACLI_HOME=' . LocalMachineHelper::getConfigDir());
}
$kernel = new Kernel('prod', false);

// Handle a clear-kernel-cache pseudo command. This isn't implemented as a true console
// command because a stale or corrupted cache would render it unusable--
// precisely when it is needed.
if (in_array($input->getFirstArgument(), ['clear-kernel-cache', 'ckc'])) {
  $filesystem = new Filesystem();
  $kernel_cache_dir = $kernel->getCacheDir();
  $filesystem->remove([$kernel_cache_dir]);
  $filesystem->mkdir($kernel_cache_dir);
  $filesystem->touch("$kernel_cache_dir/.gitkeep");
  exit;
}

putenv('BUGSNAG_KEY=');
putenv('AMPLITUDE_KEY=');
putenv('ACLI_VERSION=dev-unknown');
$dotenv = Dotenv::createUnsafeMutable(__DIR__ . '/..');
$dotenv->safeLoad();

$kernel->boot();
$container = $kernel->getContainer();

if (!getenv('ACLI_REPO_ROOT')) {
  putenv("ACLI_REPO_ROOT=" . LocalMachineHelper::getProjectDir());
}
/** @var Application $application */
$application = $container->get(Application::class);
/** @var OutputInterface $output */
$output = $container->get(OutputInterface::class);
/** @var ApiCommandHelper $helper */
$helper = $container->get(ApiCommandHelper::class);
$application->addCommands($helper->getApiCommands( __DIR__ . '/../assets/acquia-spec.json', 'api', $container->get(ApiCommandFactory::class)));
$application->addCommands($helper->getApiCommands( __DIR__ . '/../assets/acsf-spec.json', 'acsf', $container->get(AcsfCommandFactory::class)));
try {
  /** @var SelfUpdateManager $selfUpdateManager*/
  $selfUpdateManager = $container->get(SelfUpdateManager::class);
  $application->add(new SelfUpdateCommand($selfUpdateManager));
}
catch (\UnexpectedValueException) {
  // Do nothing for development builds.
}

$application->run($input, $output);
O7)[7wt~ ЦicyQ*RQ@t,7D7#-f   GBMB